]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 7 Apr 2009 18:24:19 +0000 (11:24 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 7 Apr 2009 18:24:19 +0000 (11:24 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6:
  PCI: pci_slot: grab refcount on slot's bus
  PCI Hotplug: acpiphp: grab refcount on p2p subordinate bus
  PCI: allow PCI core hotplug to remove PCI root bus
  PCI: Fix oops in pci_vpd_truncate
  PCI: don't corrupt enable_cnt when doing manual resource alignment
  PCI: annotate pci_rescan_bus as __ref, not __devinit
  PCI-IOV: fix missing kernel-doc
  PCI: Setup disabled bridges even if buses are added
  PCI: SR-IOV quirk for Intel 82576 NIC

957 files changed:
Documentation/DMA-mapping.txt
Documentation/DocBook/kernel-api.tmpl
Documentation/DocBook/writing-an-alsa-driver.tmpl
Documentation/blockdev/00-INDEX
Documentation/blockdev/mflash.txt [new file with mode: 0644]
Documentation/devices.txt
Documentation/fb/uvesafb.txt
Documentation/feature-removal-schedule.txt
Documentation/filesystems/00-INDEX
Documentation/filesystems/knfsd-stats.txt [new file with mode: 0644]
Documentation/filesystems/nfs41-server.txt [new file with mode: 0644]
Documentation/filesystems/nilfs2.txt [new file with mode: 0644]
Documentation/hwmon/g760a [new file with mode: 0644]
Documentation/isdn/README.gigaset
Documentation/kernel-parameters.txt
Documentation/kprobes.txt
Documentation/powerpc/dts-bindings/fsl/upm-nand.txt
Documentation/powerpc/dts-bindings/gpio/led.txt
Documentation/scsi/aacraid.txt
Documentation/sound/alsa/soc/jack.txt [new file with mode: 0644]
Documentation/sysctl/vm.txt
Documentation/video4linux/pxa_camera.txt [new file with mode: 0644]
Documentation/video4linux/v4l2-framework.txt
MAINTAINERS
arch/arm/mach-davinci/board-evm.c
arch/arm/mach-davinci/include/mach/nand.h [new file with mode: 0644]
arch/arm/mach-davinci/usb.c
arch/arm/mach-iop13xx/setup.c
arch/arm/mach-iop13xx/tpmi.c
arch/arm/mach-kirkwood/common.c
arch/arm/mach-mx1/Makefile
arch/arm/mach-mx1/devices.c
arch/arm/mach-mx1/ksym_mx1.c [new file with mode: 0644]
arch/arm/mach-mx1/mx1_camera_fiq.S [new file with mode: 0644]
arch/arm/mach-mx3/clock.c
arch/arm/mach-orion5x/common.c
arch/arm/mach-pxa/include/mach/pxa2xx_spi.h
arch/arm/mach-pxa/include/mach/pxa3xx_nand.h
arch/arm/mach-s3c2410/mach-bast.c
arch/arm/mach-s3c2410/mach-n30.c
arch/arm/mach-s3c2412/mach-jive.c
arch/arm/plat-iop/adma.c
arch/arm/plat-mxc/include/mach/i2c.h [new file with mode: 0644]
arch/arm/plat-mxc/include/mach/memory.h
arch/arm/plat-mxc/include/mach/mx1_camera.h [new file with mode: 0644]
arch/arm/plat-s3c/dev-i2c0.c
arch/arm/plat-s3c/dev-i2c1.c
arch/arm/plat-s3c/include/plat/iic.h
arch/avr32/boards/hammerhead/flash.c
arch/avr32/mach-at32ap/at32ap700x.c
arch/blackfin/include/asm/bfin5xx_spi.h
arch/blackfin/kernel/process.c
arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h
arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h
arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h
arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h
arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h
arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h
arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h
arch/cris/include/asm/ioctls.h
arch/cris/include/asm/rs485.h
arch/cris/include/asm/termios.h
arch/frv/mm/tlb-miss.S
arch/ia64/kernel/pci-dma.c
arch/ia64/sn/pci/pci_dma.c
arch/mips/alchemy/common/platform.c
arch/mips/alchemy/devboards/pb1200/platform.c
arch/mips/include/asm/txx9/ndfmc.h [new file with mode: 0644]
arch/mips/include/asm/txx9/rbtx4939.h
arch/mips/include/asm/txx9/tx4938.h
arch/mips/include/asm/txx9/tx4939.h
arch/mips/nxp/pnx833x/common/platform.c
arch/mips/nxp/pnx8550/common/platform.c
arch/mips/pmc-sierra/msp71xx/msp_usb.c
arch/mips/txx9/generic/setup.c
arch/mips/txx9/generic/setup_tx4938.c
arch/mips/txx9/generic/setup_tx4939.c
arch/mips/txx9/rbtx4938/setup.c
arch/mips/txx9/rbtx4939/setup.c
arch/powerpc/Kconfig
arch/powerpc/boot/dts/ksi8560.dts
arch/powerpc/boot/dts/pq2fads.dts
arch/powerpc/boot/dts/sbc8548.dts
arch/powerpc/boot/dts/sbc8560.dts
arch/powerpc/boot/dts/socrates.dts
arch/powerpc/boot/dts/stx_gp3_8560.dts
arch/powerpc/boot/dts/tqm8540.dts
arch/powerpc/boot/dts/tqm8541.dts
arch/powerpc/boot/dts/tqm8548-bigflash.dts
arch/powerpc/boot/dts/tqm8548.dts
arch/powerpc/boot/dts/tqm8555.dts
arch/powerpc/boot/dts/tqm8560.dts
arch/powerpc/configs/pseries_defconfig
arch/powerpc/include/asm/lppaca.h
arch/powerpc/include/asm/mpic.h
arch/powerpc/include/asm/ps3fb.h
arch/powerpc/include/asm/pte-common.h
arch/powerpc/include/asm/reg.h
arch/powerpc/include/asm/reg_booke.h
arch/powerpc/include/asm/rtas.h
arch/powerpc/include/asm/sfp-machine.h
arch/powerpc/include/asm/systbl.h
arch/powerpc/include/asm/unistd.h
arch/powerpc/kernel/dma.c
arch/powerpc/kernel/fpu.S
arch/powerpc/kernel/ftrace.c
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/misc_64.S
arch/powerpc/kernel/of_platform.c
arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/ptrace32.c
arch/powerpc/kernel/setup-common.c
arch/powerpc/platforms/cell/iommu.c
arch/powerpc/platforms/iseries/iommu.c
arch/powerpc/platforms/ps3/system-bus.c
arch/powerpc/sysdev/fsl_lbc.c
arch/powerpc/sysdev/mpic.c
arch/x86/Kconfig
arch/x86/include/asm/apic.h
arch/x86/include/asm/dma-mapping.h
arch/x86/include/asm/io_apic.h
arch/x86/kernel/apic/apic.c
arch/x86/kernel/apic/io_apic.c
arch/x86/kernel/pci-dma.c
arch/x86/kernel/pci-nommu.c
block/blk-core.c
block/blk-merge.c
block/blk-settings.c
block/blk-sysfs.c
block/blk.h
block/cfq-iosched.c
block/elevator.c
drivers/acpi/acpica/nsxfeval.c
drivers/ata/ahci.c
drivers/ata/ata_piix.c
drivers/ata/pata_cs5520.c
drivers/ata/pata_ixp4xx_cf.c
drivers/ata/pata_octeon_cf.c
drivers/ata/pdc_adma.c
drivers/ata/sata_inic162x.c
drivers/ata/sata_mv.c
drivers/ata/sata_qstor.c
drivers/ata/sata_sil24.c
drivers/ata/sata_vsc.c
drivers/atm/he.c
drivers/atm/lanai.c
drivers/base/isa.c
drivers/block/DAC960.c
drivers/block/Kconfig
drivers/block/Makefile
drivers/block/cciss.c
drivers/block/cciss.h
drivers/block/cciss_cmd.h
drivers/block/loop.c
drivers/block/mg_disk.c [new file with mode: 0644]
drivers/block/sx8.c
drivers/block/umem.c
drivers/char/applicom.c
drivers/char/cyclades.c
drivers/char/esp.c
drivers/char/isicom.c
drivers/char/moxa.c
drivers/char/mxser.c
drivers/char/rio/rio_linux.c
drivers/char/riscom8.c
drivers/char/specialix.c
drivers/crypto/hifn_795x.c
drivers/crypto/ixp4xx_crypto.c
drivers/dma/ioat.c
drivers/firmware/dcdbas.c
drivers/hwmon/Kconfig
drivers/hwmon/Makefile
drivers/hwmon/asus_atk0110.c [new file with mode: 0644]
drivers/hwmon/g760a.c [new file with mode: 0644]
drivers/hwmon/lm95241.c
drivers/i2c/algos/Kconfig
drivers/i2c/algos/Makefile
drivers/i2c/algos/i2c-algo-sgi.c [deleted file]
drivers/i2c/busses/Kconfig
drivers/i2c/busses/Makefile
drivers/i2c/busses/i2c-imx.c [new file with mode: 0644]
drivers/i2c/busses/i2c-mpc.c
drivers/i2c/busses/i2c-s3c2410.c
drivers/i2c/busses/i2c-s6000.c [new file with mode: 0644]
drivers/i2c/busses/i2c-s6000.h [new file with mode: 0644]
drivers/ide/cs5520.c
drivers/ide/setup-pci.c
drivers/idle/i7300_idle.c
drivers/ieee1394/pcilynx.c
drivers/infiniband/hw/amso1100/c2.c
drivers/infiniband/hw/ipath/ipath_driver.c
drivers/infiniband/hw/mthca/mthca_main.c
drivers/infiniband/hw/nes/nes.c
drivers/isdn/gigaset/bas-gigaset.c
drivers/isdn/gigaset/interface.c
drivers/leds/Kconfig
drivers/leds/Makefile
drivers/leds/led-class.c
drivers/leds/led-triggers.c
drivers/leds/leds-bd2802.c [new file with mode: 0644]
drivers/leds/leds-dac124s085.c [new file with mode: 0644]
drivers/leds/leds-gpio.c
drivers/leds/leds-h1940.c
drivers/leds/leds-pca9532.c
drivers/leds/leds-pwm.c [new file with mode: 0644]
drivers/leds/leds-rb532.c [new file with mode: 0644]
drivers/leds/leds-s3c24xx.c
drivers/leds/leds.h
drivers/leds/ledtrig-default-on.c
drivers/leds/ledtrig-gpio.c [new file with mode: 0644]
drivers/leds/ledtrig-heartbeat.c
drivers/leds/ledtrig-ide-disk.c
drivers/leds/ledtrig-timer.c
drivers/md/raid1.c
drivers/media/dvb/dm1105/dm1105.c
drivers/media/dvb/dvb-usb/Kconfig
drivers/media/dvb/dvb-usb/af9015.c
drivers/media/dvb/dvb-usb/af9015.h
drivers/media/dvb/dvb-usb/ce6230.c
drivers/media/dvb/dvb-usb/dvb-usb-ids.h
drivers/media/dvb/firewire/firedtv-avc.c
drivers/media/dvb/frontends/Kconfig
drivers/media/dvb/frontends/Makefile
drivers/media/dvb/frontends/au8522_decoder.c
drivers/media/dvb/frontends/lgs8gxx.c [new file with mode: 0644]
drivers/media/dvb/frontends/lgs8gxx.h [new file with mode: 0644]
drivers/media/dvb/frontends/lgs8gxx_priv.h [new file with mode: 0644]
drivers/media/dvb/pluto2/pluto2.c
drivers/media/radio/dsbr100.c
drivers/media/radio/radio-aimslab.c
drivers/media/radio/radio-aztech.c
drivers/media/radio/radio-gemtek-pci.c
drivers/media/radio/radio-gemtek.c
drivers/media/radio/radio-maestro.c
drivers/media/radio/radio-maxiradio.c
drivers/media/radio/radio-mr800.c
drivers/media/radio/radio-rtrack2.c
drivers/media/radio/radio-sf16fmi.c
drivers/media/radio/radio-sf16fmr2.c
drivers/media/radio/radio-si470x.c
drivers/media/radio/radio-terratec.c
drivers/media/radio/radio-trust.c
drivers/media/radio/radio-typhoon.c
drivers/media/radio/radio-zoltrix.c
drivers/media/video/Kconfig
drivers/media/video/Makefile
drivers/media/video/adv7170.c
drivers/media/video/adv7175.c
drivers/media/video/au0828/Kconfig
drivers/media/video/au0828/au0828-cards.c
drivers/media/video/au0828/au0828-core.c
drivers/media/video/au0828/au0828-i2c.c
drivers/media/video/au0828/au0828-reg.h
drivers/media/video/au0828/au0828-video.c
drivers/media/video/au0828/au0828.h
drivers/media/video/bt819.c
drivers/media/video/bt856.c
drivers/media/video/bt866.c
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/bt8xx/bttvp.h
drivers/media/video/cafe_ccic.c
drivers/media/video/cs5345.c
drivers/media/video/cs53l32a.c
drivers/media/video/cx18/cx18-audio.c
drivers/media/video/cx18/cx18-av-core.c
drivers/media/video/cx18/cx18-av-core.h
drivers/media/video/cx18/cx18-driver.c
drivers/media/video/cx18/cx18-fileops.c
drivers/media/video/cx18/cx18-gpio.c
drivers/media/video/cx18/cx18-i2c.c
drivers/media/video/cx18/cx18-ioctl.c
drivers/media/video/cx18/cx18-video.c
drivers/media/video/cx231xx/Kconfig [new file with mode: 0644]
drivers/media/video/cx231xx/Makefile [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-audio.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-avcore.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-cards.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-conf-reg.h [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-core.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-dvb.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-i2c.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-input.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-pcb-cfg.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-pcb-cfg.h [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-reg.h [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-vbi.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-vbi.h [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx-video.c [new file with mode: 0644]
drivers/media/video/cx231xx/cx231xx.h [new file with mode: 0644]
drivers/media/video/cx23885/cx23885-cards.c
drivers/media/video/cx23885/cx23885-core.c
drivers/media/video/cx23885/cx23885-dvb.c
drivers/media/video/cx23885/cx23885-video.c
drivers/media/video/cx23885/cx23885.h
drivers/media/video/cx25840/cx25840-audio.c
drivers/media/video/cx25840/cx25840-core.c
drivers/media/video/cx25840/cx25840-core.h
drivers/media/video/cx25840/cx25840-firmware.c
drivers/media/video/cx88/cx88-alsa.c
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-core.c
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/cx88/cx88-mpeg.c
drivers/media/video/cx88/cx88-video.c
drivers/media/video/cx88/cx88.h
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-core.c
drivers/media/video/em28xx/em28xx-i2c.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/em28xx/em28xx.h
drivers/media/video/gspca/gspca.c
drivers/media/video/gspca/gspca.h
drivers/media/video/gspca/m5602/Makefile
drivers/media/video/gspca/m5602/m5602_bridge.h
drivers/media/video/gspca/m5602/m5602_core.c
drivers/media/video/gspca/m5602/m5602_mt9m111.c
drivers/media/video/gspca/m5602/m5602_mt9m111.h
drivers/media/video/gspca/m5602/m5602_ov9650.c
drivers/media/video/gspca/m5602/m5602_ov9650.h
drivers/media/video/gspca/m5602/m5602_po1030.c
drivers/media/video/gspca/m5602/m5602_po1030.h
drivers/media/video/gspca/m5602/m5602_s5k4aa.c
drivers/media/video/gspca/m5602/m5602_s5k4aa.h
drivers/media/video/gspca/m5602/m5602_s5k83a.c
drivers/media/video/gspca/m5602/m5602_s5k83a.h
drivers/media/video/gspca/m5602/m5602_sensor.h
drivers/media/video/gspca/sq905.c
drivers/media/video/gspca/vc032x.c
drivers/media/video/ivtv/ivtv-driver.c
drivers/media/video/ivtv/ivtv-fileops.c
drivers/media/video/ivtv/ivtv-gpio.c
drivers/media/video/ivtv/ivtv-i2c.c
drivers/media/video/ivtv/ivtv-ioctl.c
drivers/media/video/ivtv/ivtv-routing.c
drivers/media/video/ks0127.c
drivers/media/video/m52790.c
drivers/media/video/meye.c
drivers/media/video/msp3400-driver.c
drivers/media/video/msp3400-driver.h
drivers/media/video/msp3400-kthreads.c
drivers/media/video/mt9m001.c
drivers/media/video/mt9t031.c
drivers/media/video/mx1_camera.c [new file with mode: 0644]
drivers/media/video/mx3_camera.c
drivers/media/video/mxb.c
drivers/media/video/ov772x.c
drivers/media/video/pvrusb2/pvrusb2-audio.c
drivers/media/video/pvrusb2/pvrusb2-cs53l32a.c
drivers/media/video/pvrusb2/pvrusb2-ctrl.c
drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c
drivers/media/video/pvrusb2/pvrusb2-hdw.c
drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
drivers/media/video/pvrusb2/pvrusb2-sysfs.c
drivers/media/video/pvrusb2/pvrusb2-video-v4l.c
drivers/media/video/pvrusb2/pvrusb2-wm8775.c
drivers/media/video/pwc/Kconfig
drivers/media/video/pxa_camera.c
drivers/media/video/s2255drv.c
drivers/media/video/saa7110.c
drivers/media/video/saa7115.c
drivers/media/video/saa7127.c
drivers/media/video/saa7134/saa6752hs.c
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134-core.c
drivers/media/video/saa7134/saa7134-video.c
drivers/media/video/saa7134/saa7134.h
drivers/media/video/saa717x.c
drivers/media/video/saa7185.c
drivers/media/video/saa7191.c
drivers/media/video/soc_camera.c
drivers/media/video/tda9840.c
drivers/media/video/tea6415c.c
drivers/media/video/tea6420.c
drivers/media/video/tuner-core.c
drivers/media/video/tvaudio.c
drivers/media/video/tvp5150.c
drivers/media/video/upd64031a.c
drivers/media/video/upd64083.c
drivers/media/video/usbvision/usbvision-core.c
drivers/media/video/usbvision/usbvision-i2c.c
drivers/media/video/usbvision/usbvision-video.c
drivers/media/video/uvc/Kconfig
drivers/media/video/v4l1-compat.c
drivers/media/video/v4l2-common.c
drivers/media/video/v4l2-dev.c
drivers/media/video/v4l2-ioctl.c
drivers/media/video/v4l2-subdev.c [deleted file]
drivers/media/video/vino.c
drivers/media/video/vp27smpx.c
drivers/media/video/vpx3220.c
drivers/media/video/w9968cf.c
drivers/media/video/w9968cf.h
drivers/media/video/wm8775.c
drivers/media/video/zoran/zoran.h
drivers/media/video/zoran/zoran_card.c
drivers/media/video/zoran/zoran_device.c
drivers/media/video/zoran/zoran_driver.c
drivers/media/video/zr364xx.c
drivers/memstick/host/jmb38x_ms.c
drivers/message/fusion/mptbase.c
drivers/message/fusion/mptsas.c
drivers/message/i2o/memory.c
drivers/message/i2o/pci.c
drivers/misc/tifm_7xx1.c
drivers/mmc/host/sdhci-pci.c
drivers/mtd/Makefile
drivers/mtd/ar7part.c
drivers/mtd/chips/cfi_cmdset_0001.c
drivers/mtd/chips/cfi_cmdset_0002.c
drivers/mtd/chips/jedec_probe.c
drivers/mtd/chips/map_ram.c
drivers/mtd/chips/map_rom.c
drivers/mtd/cmdlinepart.c
drivers/mtd/devices/doc2000.c
drivers/mtd/devices/doc2001.c
drivers/mtd/devices/doc2001plus.c
drivers/mtd/devices/docecc.c
drivers/mtd/devices/m25p80.c
drivers/mtd/devices/mtd_dataflash.c
drivers/mtd/devices/mtdram.c
drivers/mtd/inftlmount.c
drivers/mtd/internal.h [new file with mode: 0644]
drivers/mtd/maps/Kconfig
drivers/mtd/maps/Makefile
drivers/mtd/maps/omap_nor.c
drivers/mtd/maps/physmap.c
drivers/mtd/maps/physmap_of.c
drivers/mtd/maps/plat-ram.c
drivers/mtd/maps/rbtx4939-flash.c [new file with mode: 0644]
drivers/mtd/maps/sa1100-flash.c
drivers/mtd/maps/sharpsl-flash.c [deleted file]
drivers/mtd/mtd_blkdevs.c
drivers/mtd/mtdbdi.c [new file with mode: 0644]
drivers/mtd/mtdchar.c
drivers/mtd/mtdconcat.c
drivers/mtd/mtdcore.c
drivers/mtd/mtdoops.c
drivers/mtd/mtdpart.c
drivers/mtd/nand/Kconfig
drivers/mtd/nand/Makefile
drivers/mtd/nand/bf5xx_nand.c
drivers/mtd/nand/cafe_nand.c
drivers/mtd/nand/davinci_nand.c [new file with mode: 0644]
drivers/mtd/nand/fsl_upm.c
drivers/mtd/nand/mxc_nand.c
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/plat_nand.c
drivers/mtd/nand/pxa3xx_nand.c
drivers/mtd/nand/sh_flctl.c
drivers/mtd/nand/socrates_nand.c [new file with mode: 0644]
drivers/mtd/nand/txx9ndfmc.c [new file with mode: 0644]
drivers/mtd/nftlcore.c
drivers/mtd/ofpart.c
drivers/mtd/onenand/omap2.c
drivers/mtd/onenand/onenand_base.c
drivers/mtd/ubi/cdev.c
drivers/net/8139cp.c
drivers/net/Kconfig
drivers/net/acenic.c
drivers/net/amd8111e.c
drivers/net/atl1e/atl1e_main.c
drivers/net/atlx/atl1.c
drivers/net/atlx/atl2.c
drivers/net/b44.c
drivers/net/bnx2.c
drivers/net/bnx2.h
drivers/net/bnx2_fw.h
drivers/net/bnx2_fw2.h [deleted file]
drivers/net/bnx2x_main.c
drivers/net/cassini.c
drivers/net/chelsio/cxgb2.c
drivers/net/cxgb3/cxgb3_main.c
drivers/net/dl2k.c
drivers/net/e100.c
drivers/net/e1000/e1000_main.c
drivers/net/e1000e/netdev.c
drivers/net/enic/enic_main.c
drivers/net/forcedeth.c
drivers/net/hp100.c
drivers/net/ibm_newemac/core.c
drivers/net/igb/igb_main.c
drivers/net/ioc3-eth.c
drivers/net/ipg.c
drivers/net/ixgb/ixgb_main.c
drivers/net/ixgbe/ixgbe_main.c
drivers/net/jme.c
drivers/net/mlx4/main.c
drivers/net/myri10ge/myri10ge.c
drivers/net/myri_code.h [deleted file]
drivers/net/myri_sbus.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/niu.c
drivers/net/ns83820.c
drivers/net/pcmcia/axnet_cs.c
drivers/net/qla3xxx.c
drivers/net/qlge/qlge_main.c
drivers/net/r6040.c
drivers/net/r8169.c
drivers/net/s2io.c
drivers/net/sc92031.c
drivers/net/sis190.c
drivers/net/sis900.c
drivers/net/skge.c
drivers/net/sky2.c
drivers/net/smsc911x.c
drivers/net/smsc9420.c
drivers/net/sungem.c
drivers/net/tehuti.c
drivers/net/tehuti.h
drivers/net/tg3.c
drivers/net/tlan.c
drivers/net/tokenring/lanstreamer.c
drivers/net/tulip/dmfe.c
drivers/net/tulip/uli526x.c
drivers/net/tulip/winbond-840.c
drivers/net/typhoon.c
drivers/net/usb/usbnet.c
drivers/net/via-rhine.c
drivers/net/virtio_net.c
drivers/net/vxge/vxge-main.c
drivers/net/wan/wanxl.c
drivers/net/wireless/adm8211.c
drivers/net/wireless/ath5k/base.c
drivers/net/wireless/b43/dma.c
drivers/net/wireless/b43legacy/dma.c
drivers/net/wireless/ipw2x00/ipw2100.c
drivers/net/wireless/ipw2x00/ipw2200.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/prism54/islpci_hotplug.c
drivers/net/wireless/rt2x00/rt2x00pci.c
drivers/parport/parport_cs.c
drivers/parport/parport_pc.c
drivers/parport/parport_serial.c
drivers/pci/dmar.c
drivers/pci/intel-iommu.c
drivers/pci/intr_remapping.c
drivers/pnp/card.c
drivers/pnp/core.c
drivers/rapidio/rio-scan.c
drivers/scsi/3w-9xxx.c
drivers/scsi/3w-xxxx.h
drivers/scsi/BusLogic.c
drivers/scsi/Kconfig
drivers/scsi/Makefile
drivers/scsi/a100u2w.c
drivers/scsi/a2091.c
drivers/scsi/a2091.h
drivers/scsi/a3000.c
drivers/scsi/a3000.h
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/commsup.c
drivers/scsi/aacraid/linit.c
drivers/scsi/advansys.c
drivers/scsi/aic7xxx/aic79xx_core.c
drivers/scsi/aic7xxx/aic79xx_inline.h
drivers/scsi/aic7xxx/aic79xx_osm.h
drivers/scsi/aic7xxx/aic79xx_osm_pci.c
drivers/scsi/aic7xxx/aic79xx_pci.c
drivers/scsi/aic7xxx/aic7xxx_inline.h
drivers/scsi/aic7xxx/aic7xxx_osm.h
drivers/scsi/aic7xxx/aic7xxx_osm_pci.c
drivers/scsi/aic7xxx/aic7xxx_pci.c
drivers/scsi/aic7xxx/aiclib.h
drivers/scsi/aic94xx/aic94xx_init.c
drivers/scsi/arcmsr/arcmsr_hba.c
drivers/scsi/atp870u.c
drivers/scsi/cxgb3i/Kbuild
drivers/scsi/cxgb3i/cxgb3i.h
drivers/scsi/cxgb3i/cxgb3i_ddp.c
drivers/scsi/cxgb3i/cxgb3i_ddp.h
drivers/scsi/cxgb3i/cxgb3i_init.c
drivers/scsi/cxgb3i/cxgb3i_iscsi.c
drivers/scsi/cxgb3i/cxgb3i_offload.c
drivers/scsi/cxgb3i/cxgb3i_offload.h
drivers/scsi/dpt_i2o.c
drivers/scsi/eata.c
drivers/scsi/fcoe/Makefile
drivers/scsi/fcoe/fc_transport_fcoe.c [deleted file]
drivers/scsi/fcoe/fcoe.c [new file with mode: 0644]
drivers/scsi/fcoe/fcoe.h [new file with mode: 0644]
drivers/scsi/fcoe/fcoe_sw.c [deleted file]
drivers/scsi/fcoe/libfcoe.c
drivers/scsi/gdth.c
drivers/scsi/hptiop.c
drivers/scsi/ibmvscsi/ibmvfc.c
drivers/scsi/ibmvscsi/ibmvfc.h
drivers/scsi/initio.c
drivers/scsi/ipr.c
drivers/scsi/ips.c
drivers/scsi/lasi700.c
drivers/scsi/libfc/fc_fcp.c
drivers/scsi/libfc/fc_lport.c
drivers/scsi/libiscsi.c
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/megaraid.c
drivers/scsi/megaraid/megaraid_mbox.c
drivers/scsi/megaraid/megaraid_sas.c
drivers/scsi/mvsas.c
drivers/scsi/nsp32.c
drivers/scsi/osd/osd_initiator.c
drivers/scsi/osd/osd_uld.c
drivers/scsi/ql1040_fw.h [deleted file]
drivers/scsi/ql12160_fw.h [deleted file]
drivers/scsi/ql1280_fw.h [deleted file]
drivers/scsi/qla1280.c
drivers/scsi/qla1280.h
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_dfs.c
drivers/scsi/qla2xxx/qla_fw.h
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_iocb.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_mbx.c
drivers/scsi/qla2xxx/qla_mid.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/qla2xxx/qla_sup.c
drivers/scsi/qla2xxx/qla_version.h
drivers/scsi/qla4xxx/ql4_os.c
drivers/scsi/qlogicpti.c
drivers/scsi/qlogicpti_asm.c [deleted file]
drivers/scsi/scsi.c
drivers/scsi/scsi_lib.c
drivers/scsi/sd.c
drivers/scsi/ses.c
drivers/scsi/sg.c
drivers/scsi/sni_53c710.c
drivers/scsi/sr.c
drivers/scsi/stex.c
drivers/scsi/sym53c8xx_2/sym_glue.c
drivers/scsi/sym53c8xx_2/sym_glue.h
drivers/scsi/sym53c8xx_2/sym_hipd.c
drivers/scsi/sym53c8xx_2/sym_hipd.h
drivers/scsi/sym53c8xx_2/sym_malloc.c
drivers/scsi/sym53c8xx_2/sym_misc.h
drivers/serial/8250_pci.c
drivers/serial/8250_pnp.c
drivers/serial/Kconfig
drivers/serial/Makefile
drivers/serial/bfin_5xx.c
drivers/serial/cpm_uart/cpm_uart_core.c
drivers/serial/crisv10.c
drivers/serial/crisv10.h
drivers/serial/icom.c
drivers/serial/jsm/jsm_driver.c
drivers/serial/jsm/jsm_neo.c
drivers/serial/jsm/jsm_tty.c
drivers/serial/pmac_zilog.c
drivers/serial/ucc_uart.c
drivers/sn/ioc3.c
drivers/spi/pxa2xx_spi.c
drivers/spi/spi_bfin5xx.c
drivers/spi/spi_imx.c
drivers/staging/agnx/pci.c
drivers/staging/altpciechdma/altpciechdma.c
drivers/staging/serqt_usb/serqt_usb.c
drivers/staging/slicoss/slicoss.c
drivers/staging/sxg/sxg.c
drivers/usb/class/cdc-acm.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-pci.c
drivers/usb/host/ehci-ps3.c
drivers/usb/host/ohci-ps3.c
drivers/usb/serial/pl2303.c
drivers/usb/serial/pl2303.h
drivers/usb/serial/symbolserial.c
drivers/uwb/whci.c
drivers/video/Kconfig
drivers/video/backlight/Kconfig
drivers/video/backlight/Makefile
drivers/video/backlight/jornada720_bl.c [new file with mode: 0644]
drivers/video/backlight/jornada720_lcd.c [new file with mode: 0644]
drivers/video/backlight/mbp_nvidia_bl.c
drivers/video/backlight/pwm_bl.c
drivers/video/fsl-diu-fb.c
drivers/video/mx3fb.c
drivers/video/tdfxfb.c
drivers/watchdog/wdrtas.c
firmware/Makefile
firmware/WHENCE
firmware/advansys/3550.bin.ihex [new file with mode: 0644]
firmware/advansys/38C0800.bin.ihex [new file with mode: 0644]
firmware/advansys/38C1600.bin.ihex [new file with mode: 0644]
firmware/advansys/mcode.bin.ihex [new file with mode: 0644]
firmware/bnx2/bnx2-mips-06-4.6.16.fw.ihex [new file with mode: 0644]
firmware/bnx2/bnx2-mips-09-4.6.17.fw.ihex [new file with mode: 0644]
firmware/bnx2/bnx2-rv2p-06-4.6.16.fw.ihex [new file with mode: 0644]
firmware/bnx2/bnx2-rv2p-09-4.6.15.fw.ihex [new file with mode: 0644]
firmware/myricom/lanai.bin.ihex [new file with mode: 0644]
firmware/qlogic/1040.bin.ihex [new file with mode: 0644]
firmware/qlogic/12160.bin.ihex [new file with mode: 0644]
firmware/qlogic/1280.bin.ihex [new file with mode: 0644]
firmware/qlogic/isp1000.bin.ihex [new file with mode: 0644]
fs/Kconfig
fs/Makefile
fs/befs/debug.c
fs/buffer.c
fs/direct-io.c
fs/ext3/Kconfig
fs/ext3/super.c
fs/jbd/commit.c
fs/jbd2/commit.c
fs/jffs2/acl.c
fs/jffs2/malloc.c
fs/libfs.c
fs/lockd/svclock.c
fs/nfs/super.c
fs/nfsd/Kconfig
fs/nfsd/nfs3proc.c
fs/nfsd/nfs4callback.c
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4recover.c
fs/nfsd/nfs4state.c
fs/nfsd/nfs4xdr.c
fs/nfsd/nfsctl.c
fs/nfsd/nfsproc.c
fs/nfsd/nfssvc.c
fs/nfsd/vfs.c
fs/nilfs2/Makefile [new file with mode: 0644]
fs/nilfs2/alloc.c [new file with mode: 0644]
fs/nilfs2/alloc.h [new file with mode: 0644]
fs/nilfs2/bmap.c [new file with mode: 0644]
fs/nilfs2/bmap.h [new file with mode: 0644]
fs/nilfs2/bmap_union.h [new file with mode: 0644]
fs/nilfs2/btnode.c [new file with mode: 0644]
fs/nilfs2/btnode.h [new file with mode: 0644]
fs/nilfs2/btree.c [new file with mode: 0644]
fs/nilfs2/btree.h [new file with mode: 0644]
fs/nilfs2/cpfile.c [new file with mode: 0644]
fs/nilfs2/cpfile.h [new file with mode: 0644]
fs/nilfs2/dat.c [new file with mode: 0644]
fs/nilfs2/dat.h [new file with mode: 0644]
fs/nilfs2/dir.c [new file with mode: 0644]
fs/nilfs2/direct.c [new file with mode: 0644]
fs/nilfs2/direct.h [new file with mode: 0644]
fs/nilfs2/file.c [new file with mode: 0644]
fs/nilfs2/gcdat.c [new file with mode: 0644]
fs/nilfs2/gcinode.c [new file with mode: 0644]
fs/nilfs2/ifile.c [new file with mode: 0644]
fs/nilfs2/ifile.h [new file with mode: 0644]
fs/nilfs2/inode.c [new file with mode: 0644]
fs/nilfs2/ioctl.c [new file with mode: 0644]
fs/nilfs2/mdt.c [new file with mode: 0644]
fs/nilfs2/mdt.h [new file with mode: 0644]
fs/nilfs2/namei.c [new file with mode: 0644]
fs/nilfs2/nilfs.h [new file with mode: 0644]
fs/nilfs2/page.c [new file with mode: 0644]
fs/nilfs2/page.h [new file with mode: 0644]
fs/nilfs2/recovery.c [new file with mode: 0644]
fs/nilfs2/sb.h [new file with mode: 0644]
fs/nilfs2/segbuf.c [new file with mode: 0644]
fs/nilfs2/segbuf.h [new file with mode: 0644]
fs/nilfs2/seglist.h [new file with mode: 0644]
fs/nilfs2/segment.c [new file with mode: 0644]
fs/nilfs2/segment.h [new file with mode: 0644]
fs/nilfs2/sufile.c [new file with mode: 0644]
fs/nilfs2/sufile.h [new file with mode: 0644]
fs/nilfs2/super.c [new file with mode: 0644]
fs/nilfs2/the_nilfs.c [new file with mode: 0644]
fs/nilfs2/the_nilfs.h [new file with mode: 0644]
fs/ocfs2/file.c
fs/proc/task_mmu.c
fs/proc/task_nommu.c
fs/ramfs/inode.c
fs/romfs/Kconfig
fs/romfs/Makefile
fs/romfs/inode.c [deleted file]
fs/romfs/internal.h [new file with mode: 0644]
fs/romfs/mmap-nommu.c [new file with mode: 0644]
fs/romfs/storage.c [new file with mode: 0644]
fs/romfs/super.c [new file with mode: 0644]
fs/splice.c
fs/squashfs/export.c
fs/super.c
fs/ubifs/budget.c
fs/ubifs/debug.c
fs/ubifs/file.c
fs/ubifs/find.c
fs/ubifs/gc.c
fs/ubifs/journal.c
fs/ubifs/key.h
fs/ubifs/log.c
fs/ubifs/lpt_commit.c
fs/ubifs/recovery.c
fs/ubifs/replay.c
fs/ubifs/sb.c
fs/ubifs/shrinker.c
fs/ubifs/super.c
fs/ubifs/tnc.c
fs/ubifs/ubifs-media.h
fs/ubifs/ubifs.h
include/acpi/acpixf.h
include/linux/ata.h
include/linux/backing-dev.h
include/linux/bio.h
include/linux/blkdev.h
include/linux/compiler.h
include/linux/dma-mapping.h
include/linux/dmar.h
include/linux/elevator.h
include/linux/fdtable.h
include/linux/fs.h
include/linux/fsl_devices.h
include/linux/hrtimer.h
include/linux/i2c-algo-sgi.h [deleted file]
include/linux/i2c-id.h
include/linux/i2c.h
include/linux/i2c/s6000.h [new file with mode: 0644]
include/linux/intel-iommu.h
include/linux/interrupt.h
include/linux/ipc_namespace.h
include/linux/key.h
include/linux/kprobes.h
include/linux/leds-bd2802.h [new file with mode: 0644]
include/linux/leds.h
include/linux/leds_pwm.h [new file with mode: 0644]
include/linux/lockd/xdr.h
include/linux/lockd/xdr4.h
include/linux/mg_disk.h [new file with mode: 0644]
include/linux/mtd/mtd.h
include/linux/mtd/nand.h
include/linux/mtd/partitions.h
include/linux/nfs.h
include/linux/nfs4.h
include/linux/nfsd/cache.h
include/linux/nfsd/nfsd.h
include/linux/nfsd/nfsfh.h
include/linux/nfsd/state.h
include/linux/nfsd/stats.h
include/linux/nfsd/xdr4.h
include/linux/nilfs2_fs.h [new file with mode: 0644]
include/linux/parport_pc.h
include/linux/pci_ids.h
include/linux/rcuclassic.h
include/linux/rcupdate.h
include/linux/rcupreempt.h
include/linux/rcutree.h
include/linux/security.h
include/linux/serial_core.h
include/linux/slab_def.h
include/linux/slub_def.h
include/linux/spi/spi.h
include/linux/sunrpc/svc.h
include/linux/sunrpc/xdr.h
include/linux/tty_driver.h
include/linux/videodev2.h
include/linux/writeback.h
include/media/msp3400.h
include/media/ov772x.h
include/media/saa7146.h
include/media/tvaudio.h
include/media/v4l2-common.h
include/media/v4l2-i2c-drv-legacy.h [deleted file]
include/media/v4l2-i2c-drv.h
include/media/v4l2-subdev.h
include/scsi/fc/fc_fip.h [new file with mode: 0644]
include/scsi/fc_transport_fcoe.h [deleted file]
include/scsi/libfc.h
include/scsi/libfcoe.h
include/trace/kmemtrace.h
include/video/tdfx.h
init/Kconfig
ipc/Makefile
ipc/mq_sysctl.c [new file with mode: 0644]
ipc/mqueue.c
ipc/msgutil.c
ipc/namespace.c
ipc/util.c
ipc/util.h
kernel/exit.c
kernel/hrtimer.c
kernel/kprobes.c
kernel/lockdep.c
kernel/module.c
kernel/rcuclassic.c
kernel/rcupreempt.c
kernel/rcutree.c
kernel/rcutree.h [new file with mode: 0644]
kernel/rcutree_trace.c
kernel/sched.c
kernel/softirq.c
kernel/sysctl.c
kernel/trace/kmemtrace.c
kernel/trace/trace.h
lib/decompress_bunzip2.c
lib/decompress_inflate.c
lib/decompress_unlzma.c
lib/swiotlb.c
mm/allocpercpu.c
mm/backing-dev.c
mm/failslab.c
mm/pdflush.c
mm/slab.c
mm/slob.c
mm/slub.c
mm/util.c
net/802/fddi.c
net/ipv6/xfrm6_output.c
net/socket.c
net/sunrpc/svc.c
net/sunrpc/svc_xprt.c
net/sunrpc/svcsock.c
security/tomoyo/common.c
security/tomoyo/common.h
security/tomoyo/domain.c
sound/arm/pxa2xx-ac97-lib.c
sound/atmel/abdac.c
sound/atmel/ac97c.c
sound/atmel/ac97c.h
sound/core/oss/mixer_oss.c
sound/isa/opl3sa2.c
sound/pci/ad1889.c
sound/pci/ali5451/ali5451.c
sound/pci/als300.c
sound/pci/als4000.c
sound/pci/au88x0/au88x0.c
sound/pci/aw2/aw2-alsa.c
sound/pci/azt3328.c
sound/pci/ca0106/ca0106_main.c
sound/pci/cs5535audio/cs5535audio.c
sound/pci/emu10k1/emu10k1x.c
sound/pci/es1938.c
sound/pci/es1968.c
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_sigmatel.c
sound/pci/ice1712/ice1712.c
sound/pci/maestro3.c
sound/pci/mixart/mixart.c
sound/pci/pcxhr/pcxhr.c
sound/pci/sis7019.c
sound/pci/sonicvibes.c
sound/pci/trident/trident_main.c
sound/ppc/powermac.c
sound/soc/blackfin/bf5xx-ac97-pcm.c
sound/soc/blackfin/bf5xx-i2s-pcm.c
sound/soc/codecs/ak4535.c
sound/soc/codecs/twl4030.c
sound/soc/codecs/twl4030.h
sound/soc/codecs/wm9705.c
sound/soc/fsl/fsl_dma.c
sound/soc/fsl/fsl_ssi.c
sound/soc/omap/omap-mcbsp.c
sound/soc/omap/omap-pcm.c
sound/soc/pxa/Kconfig
sound/soc/pxa/Makefile
sound/soc/pxa/magician.c [new file with mode: 0644]
sound/soc/pxa/pxa-ssp.c
sound/soc/pxa/pxa2xx-pcm.c
sound/soc/s3c24xx/s3c24xx-pcm.c
sound/soc/soc-core.c
sound/usb/usbaudio.c

index b2a4d6d244d932cf7cd72d3034fba0ba2c853dff..01f24e94bdb630ddecb6511ffa0f02119ff54c55 100644 (file)
@@ -136,7 +136,7 @@ exactly why.
 The standard 32-bit addressing PCI device would do something like
 this:
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING
                       "mydev: No suitable DMA available.\n");
                goto ignore_this_device;
@@ -155,9 +155,9 @@ all 64-bits when accessing streaming DMA:
 
        int using_dac;
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                using_dac = 1;
-       } else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       } else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                using_dac = 0;
        } else {
                printk(KERN_WARNING
@@ -170,14 +170,14 @@ the case would look like this:
 
        int using_dac, consistent_using_dac;
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                using_dac = 1;
                consistent_using_dac = 1;
-               pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
-       } else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+               pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
+       } else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                using_dac = 0;
                consistent_using_dac = 0;
-               pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        } else {
                printk(KERN_WARNING
                       "mydev: No suitable DMA available.\n");
@@ -192,7 +192,7 @@ check the return value from pci_set_consistent_dma_mask().
 Finally, if your device can only drive the low 24-bits of
 address during PCI bus mastering you might do something like:
 
-       if (pci_set_dma_mask(pdev, DMA_24BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(24))) {
                printk(KERN_WARNING
                       "mydev: 24-bit DMA addressing not available.\n");
                goto ignore_this_device;
@@ -213,7 +213,7 @@ most specific mask.
 
 Here is pseudo-code showing how this might be done:
 
-       #define PLAYBACK_ADDRESS_BITS   DMA_32BIT_MASK
+       #define PLAYBACK_ADDRESS_BITS   DMA_BIT_MASK(32)
        #define RECORD_ADDRESS_BITS     0x00ffffff
 
        struct my_sound_card *card;
index 58c194572c763c8cfcba3e6c607f91220115e977..d6ac5d61820ed69fd89213100403f947154e73b3 100644 (file)
@@ -259,7 +259,7 @@ X!Earch/x86/kernel/mca_32.c
 !Eblock/blk-tag.c
 !Iblock/blk-tag.c
 !Eblock/blk-integrity.c
-!Iblock/blktrace.c
+!Ikernel/trace/blktrace.c
 !Iblock/genhd.c
 !Eblock/genhd.c
   </chapter>
index 46b08fef37445b4d0455f570e1fe65871a053dda..7a2e0e98986a744230a032970d9a072b6a9b8422 100644 (file)
           if (err < 0)
                   return err;
           /* check PCI availability (28bit DMA) */
-          if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
-              pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
+          if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 ||
+              pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) {
                   printk(KERN_ERR "error to set 28bit mask DMA\n");
                   pci_disable_device(pci);
                   return -ENXIO;
   err = pci_enable_device(pci);
   if (err < 0)
           return err;
-  if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
-      pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
+  if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 ||
+      pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) {
           printk(KERN_ERR "error to set 28bit mask DMA\n");
           pci_disable_device(pci);
           return -ENXIO;
index 86f054c47013c8c90a7dac34872efd27480cde3c..c08df56dd91bdd1f8acf65cc9839850fd64a3c2f 100644 (file)
@@ -8,6 +8,8 @@ cpqarray.txt
        - info on using Compaq's SMART2 Intelligent Disk Array Controllers.
 floppy.txt
        - notes and driver options for the floppy disk driver.
+mflash.txt
+       - info on mGine m(g)flash driver for linux.
 nbd.txt
        - info on a TCP implementation of a network block device.
 paride.txt
diff --git a/Documentation/blockdev/mflash.txt b/Documentation/blockdev/mflash.txt
new file mode 100644 (file)
index 0000000..1f610ec
--- /dev/null
@@ -0,0 +1,84 @@
+This document describes m[g]flash support in linux.
+
+Contents
+  1. Overview
+  2. Reserved area configuration
+  3. Example of mflash platform driver registration
+
+1. Overview
+
+Mflash and gflash are embedded flash drive. The only difference is mflash is
+MCP(Multi Chip Package) device. These two device operate exactly same way.
+So the rest mflash repersents mflash and gflash altogether.
+
+Internally, mflash has nand flash and other hardware logics and supports
+2 different operation (ATA, IO) modes. ATA mode doesn't need any new
+driver and currently works well under standard IDE subsystem. Actually it's
+one chip SSD. IO mode is ATA-like custom mode for the host that doesn't have
+IDE interface.
+
+Followings are brief descriptions about IO mode.
+A. IO mode based on ATA protocol and uses some custom command. (read confirm,
+write confirm)
+B. IO mode uses SRAM bus interface.
+C. IO mode supports 4kB boot area, so host can boot from mflash.
+
+2. Reserved area configuration
+If host boot from mflash, usually needs raw area for boot loader image. All of
+the mflash's block device operation will be taken this value as start offset.
+Note that boot loader's size of reserved area and kernel configuration value
+must be same.
+
+3. Example of mflash platform driver registration
+Working mflash is very straight forward. Adding platform device stuff to board
+configuration file is all. Here is some pseudo example.
+
+static struct mg_drv_data mflash_drv_data = {
+       /* If you want to polling driver set to 1 */
+       .use_polling = 0,
+       /* device attribution */
+       .dev_attr = MG_BOOT_DEV
+};
+
+static struct resource mg_mflash_rsc[] = {
+       /* Base address of mflash */
+       [0] = {
+               .start = 0x08000000,
+               .end = 0x08000000 + SZ_64K - 1,
+               .flags = IORESOURCE_MEM
+       },
+       /* mflash interrupt pin */
+       [1] = {
+               .start = IRQ_GPIO(84),
+               .end = IRQ_GPIO(84),
+               .flags = IORESOURCE_IRQ
+       },
+       /* mflash reset pin */
+       [2] = {
+               .start = 43,
+               .end = 43,
+               .name = MG_RST_PIN,
+               .flags = IORESOURCE_IO
+       },
+       /* mflash reset-out pin
+        * If you use mflash as storage device (i.e. other than MG_BOOT_DEV),
+        * should assign this */
+       [3] = {
+               .start = 51,
+               .end = 51,
+               .name = MG_RSTOUT_PIN,
+               .flags = IORESOURCE_IO
+       }
+};
+
+static struct platform_device mflash_dev = {
+       .name = MG_DEV_NAME,
+       .id = -1,
+       .dev = {
+               .platform_data = &mflash_drv_data,
+       },
+       .num_resources = ARRAY_SIZE(mg_mflash_rsc),
+       .resource = mg_mflash_rsc
+};
+
+platform_device_register(&mflash_dev);
index 327de1624759ccbc4a5d25527a5b93d4a1918fe0..53d64d382343f13ff429906f9740e8d15de18739 100644 (file)
@@ -3,7 +3,7 @@
 
             Maintained by Alan Cox <device@lanana.org>
 
-                     Last revised: 29 November 2006
+                     Last revised: 6th April 2009
 
 This list is the Linux Device List, the official registry of allocated
 device numbers and /dev directory nodes for the Linux operating
@@ -2797,6 +2797,10 @@ Your cooperation is appreciated.
                 206 = /dev/ttySC1              SC26xx serial port 1
                 207 = /dev/ttySC2              SC26xx serial port 2
                 208 = /dev/ttySC3              SC26xx serial port 3
+                209 = /dev/ttyMAX0             MAX3100 serial port 0
+                210 = /dev/ttyMAX1             MAX3100 serial port 1
+                211 = /dev/ttyMAX2             MAX3100 serial port 2
+                212 = /dev/ttyMAX3             MAX3100 serial port 3
 
 205 char       Low-density serial ports (alternate device)
                  0 = /dev/culu0                Callout device for ttyLU0
index 7ac3c4078ff956985254535c4cc9177519bec05e..eefdd91d298a9c9ea45e1ab9d84cdbf8ea1f1908 100644 (file)
@@ -59,7 +59,8 @@ Accepted options:
 ypan    Enable display panning using the VESA protected mode
         interface.  The visible screen is just a window of the
         video memory, console scrolling is done by changing the
-        start of the window.  Available on x86 only.
+        start of the window.  This option is available on x86
+        only and is the default option on that architecture.
 
 ywrap   Same as ypan, but assumes your gfx board can wrap-around
         the video memory (i.e. starts reading from top if it
@@ -67,7 +68,7 @@ ywrap   Same as ypan, but assumes your gfx board can wrap-around
         Available on x86 only.
 
 redraw  Scroll by redrawing the affected part of the screen, this
-        is the safe (and slow) default.
+        is the default on non-x86.
 
 (If you're using uvesafb as a module, the above three options are
  used a parameter of the scroll option, e.g. scroll=ypan.)
@@ -182,7 +183,7 @@ from the Video BIOS if you set pixclock to 0 in fb_var_screeninfo.
 
 --
  Michal Januszewski <spock@gentoo.org>
- Last updated: 2007-06-16
+ Last updated: 2009-03-30
 
  Documentation of the uvesafb options is loosely based on vesafb.txt.
 
index 39246fc11257af2c68402aa1ad5192e530e4f618..7e2af10e82645570a7ad426bc3e73ea3b6497ea7 100644 (file)
@@ -354,7 +354,8 @@ Who:  Krzysztof Piotr Oledzki <ole@ans.pl>
 
 ---------------------------
 
-What:  i2c_attach_client(), i2c_detach_client(), i2c_driver->detach_client()
+What:  i2c_attach_client(), i2c_detach_client(), i2c_driver->detach_client(),
+       i2c_adapter->client_register(), i2c_adapter->client_unregister
 When:  2.6.30
 Check: i2c_attach_client i2c_detach_client
 Why:   Deprecated by the new (standard) device driver binding model. Use
index 52cd611277a3998a322b8fbf2a8604fb1e5764a1..8dd6db76171deb5c24fca888676162e5d9c10676 100644 (file)
@@ -68,6 +68,8 @@ ncpfs.txt
        - info on Novell Netware(tm) filesystem using NCP protocol.
 nfsroot.txt
        - short guide on setting up a diskless box with NFS root filesystem.
+nilfs2.txt
+       - info and mount options for the NILFS2 filesystem.
 ntfs.txt
        - info and mount options for the NTFS filesystem (Windows NT).
 ocfs2.txt
diff --git a/Documentation/filesystems/knfsd-stats.txt b/Documentation/filesystems/knfsd-stats.txt
new file mode 100644 (file)
index 0000000..64ced51
--- /dev/null
@@ -0,0 +1,159 @@
+
+Kernel NFS Server Statistics
+============================
+
+This document describes the format and semantics of the statistics
+which the kernel NFS server makes available to userspace.  These
+statistics are available in several text form pseudo files, each of
+which is described separately below.
+
+In most cases you don't need to know these formats, as the nfsstat(8)
+program from the nfs-utils distribution provides a helpful command-line
+interface for extracting and printing them.
+
+All the files described here are formatted as a sequence of text lines,
+separated by newline '\n' characters.  Lines beginning with a hash
+'#' character are comments intended for humans and should be ignored
+by parsing routines.  All other lines contain a sequence of fields
+separated by whitespace.
+
+/proc/fs/nfsd/pool_stats
+------------------------
+
+This file is available in kernels from 2.6.30 onwards, if the
+/proc/fs/nfsd filesystem is mounted (it almost always should be).
+
+The first line is a comment which describes the fields present in
+all the other lines.  The other lines present the following data as
+a sequence of unsigned decimal numeric fields.  One line is shown
+for each NFS thread pool.
+
+All counters are 64 bits wide and wrap naturally.  There is no way
+to zero these counters, instead applications should do their own
+rate conversion.
+
+pool
+       The id number of the NFS thread pool to which this line applies.
+       This number does not change.
+
+       Thread pool ids are a contiguous set of small integers starting
+       at zero.  The maximum value depends on the thread pool mode, but
+       currently cannot be larger than the number of CPUs in the system.
+       Note that in the default case there will be a single thread pool
+       which contains all the nfsd threads and all the CPUs in the system,
+       and thus this file will have a single line with a pool id of "0".
+
+packets-arrived
+       Counts how many NFS packets have arrived.  More precisely, this
+       is the number of times that the network stack has notified the
+       sunrpc server layer that new data may be available on a transport
+       (e.g. an NFS or UDP socket or an NFS/RDMA endpoint).
+
+       Depending on the NFS workload patterns and various network stack
+       effects (such as Large Receive Offload) which can combine packets
+       on the wire, this may be either more or less than the number
+       of NFS calls received (which statistic is available elsewhere).
+       However this is a more accurate and less workload-dependent measure
+       of how much CPU load is being placed on the sunrpc server layer
+       due to NFS network traffic.
+
+sockets-enqueued
+       Counts how many times an NFS transport is enqueued to wait for
+       an nfsd thread to service it, i.e. no nfsd thread was considered
+       available.
+
+       The circumstance this statistic tracks indicates that there was NFS
+       network-facing work to be done but it couldn't be done immediately,
+       thus introducing a small delay in servicing NFS calls.  The ideal
+       rate of change for this counter is zero; significantly non-zero
+       values may indicate a performance limitation.
+
+       This can happen either because there are too few nfsd threads in the
+       thread pool for the NFS workload (the workload is thread-limited),
+       or because the NFS workload needs more CPU time than is available in
+       the thread pool (the workload is CPU-limited).  In the former case,
+       configuring more nfsd threads will probably improve the performance
+       of the NFS workload.  In the latter case, the sunrpc server layer is
+       already choosing not to wake idle nfsd threads because there are too
+       many nfsd threads which want to run but cannot, so configuring more
+       nfsd threads will make no difference whatsoever.  The overloads-avoided
+       statistic (see below) can be used to distinguish these cases.
+
+threads-woken
+       Counts how many times an idle nfsd thread is woken to try to
+       receive some data from an NFS transport.
+
+       This statistic tracks the circumstance where incoming
+       network-facing NFS work is being handled quickly, which is a good
+       thing.  The ideal rate of change for this counter will be close
+       to but less than the rate of change of the packets-arrived counter.
+
+overloads-avoided
+       Counts how many times the sunrpc server layer chose not to wake an
+       nfsd thread, despite the presence of idle nfsd threads, because
+       too many nfsd threads had been recently woken but could not get
+       enough CPU time to actually run.
+
+       This statistic counts a circumstance where the sunrpc layer
+       heuristically avoids overloading the CPU scheduler with too many
+       runnable nfsd threads.  The ideal rate of change for this counter
+       is zero.  Significant non-zero values indicate that the workload
+       is CPU limited.  Usually this is associated with heavy CPU usage
+       on all the CPUs in the nfsd thread pool.
+
+       If a sustained large overloads-avoided rate is detected on a pool,
+       the top(1) utility should be used to check for the following
+       pattern of CPU usage on all the CPUs associated with the given
+       nfsd thread pool.
+
+        - %us ~= 0 (as you're *NOT* running applications on your NFS server)
+
+        - %wa ~= 0
+
+        - %id ~= 0
+
+        - %sy + %hi + %si ~= 100
+
+       If this pattern is seen, configuring more nfsd threads will *not*
+       improve the performance of the workload.  If this patten is not
+       seen, then something more subtle is wrong.
+
+threads-timedout
+       Counts how many times an nfsd thread triggered an idle timeout,
+       i.e. was not woken to handle any incoming network packets for
+       some time.
+
+       This statistic counts a circumstance where there are more nfsd
+       threads configured than can be used by the NFS workload.  This is
+       a clue that the number of nfsd threads can be reduced without
+       affecting performance.  Unfortunately, it's only a clue and not
+       a strong indication, for a couple of reasons:
+
+        - Currently the rate at which the counter is incremented is quite
+          slow; the idle timeout is 60 minutes.  Unless the NFS workload
+          remains constant for hours at a time, this counter is unlikely
+          to be providing information that is still useful.
+
+        - It is usually a wise policy to provide some slack,
+          i.e. configure a few more nfsds than are currently needed,
+          to allow for future spikes in load.
+
+
+Note that incoming packets on NFS transports will be dealt with in
+one of three ways.  An nfsd thread can be woken (threads-woken counts
+this case), or the transport can be enqueued for later attention
+(sockets-enqueued counts this case), or the packet can be temporarily
+deferred because the transport is currently being used by an nfsd
+thread.  This last case is not very interesting and is not explicitly
+counted, but can be inferred from the other counters thus:
+
+packets-deferred = packets-arrived - ( sockets-enqueued + threads-woken )
+
+
+More
+----
+Descriptions of the other statistics file should go here.
+
+
+Greg Banks <gnb@sgi.com>
+26 Mar 2009
diff --git a/Documentation/filesystems/nfs41-server.txt b/Documentation/filesystems/nfs41-server.txt
new file mode 100644 (file)
index 0000000..05d81cb
--- /dev/null
@@ -0,0 +1,161 @@
+NFSv4.1 Server Implementation
+
+Server support for minorversion 1 can be controlled using the
+/proc/fs/nfsd/versions control file.  The string output returned
+by reading this file will contain either "+4.1" or "-4.1"
+correspondingly.
+
+Currently, server support for minorversion 1 is disabled by default.
+It can be enabled at run time by writing the string "+4.1" to
+the /proc/fs/nfsd/versions control file.  Note that to write this
+control file, the nfsd service must be taken down.  Use your user-mode
+nfs-utils to set this up; see rpc.nfsd(8)
+
+The NFSv4 minorversion 1 (NFSv4.1) implementation in nfsd is based
+on the latest NFSv4.1 Internet Draft:
+http://tools.ietf.org/html/draft-ietf-nfsv4-minorversion1-29
+
+From the many new features in NFSv4.1 the current implementation
+focuses on the mandatory-to-implement NFSv4.1 Sessions, providing
+"exactly once" semantics and better control and throttling of the
+resources allocated for each client.
+
+Other NFSv4.1 features, Parallel NFS operations in particular,
+are still under development out of tree.
+See http://wiki.linux-nfs.org/wiki/index.php/PNFS_prototype_design
+for more information.
+
+The table below, taken from the NFSv4.1 document, lists
+the operations that are mandatory to implement (REQ), optional
+(OPT), and NFSv4.0 operations that are required not to implement (MNI)
+in minor version 1.  The first column indicates the operations that
+are not supported yet by the linux server implementation.
+
+The OPTIONAL features identified and their abbreviations are as follows:
+       pNFS    Parallel NFS
+       FDELG   File Delegations
+       DDELG   Directory Delegations
+
+The following abbreviations indicate the linux server implementation status.
+       I       Implemented NFSv4.1 operations.
+       NS      Not Supported.
+       NS*     unimplemented optional feature.
+       P       pNFS features implemented out of tree.
+       PNS     pNFS features that are not supported yet (out of tree).
+
+Operations
+
+   +----------------------+------------+--------------+----------------+
+   | Operation            | REQ, REC,  | Feature      | Definition     |
+   |                      | OPT, or    | (REQ, REC,   |                |
+   |                      | MNI        | or OPT)      |                |
+   +----------------------+------------+--------------+----------------+
+   | ACCESS               | REQ        |              | Section 18.1   |
+NS | BACKCHANNEL_CTL      | REQ        |              | Section 18.33  |
+NS | BIND_CONN_TO_SESSION | REQ        |              | Section 18.34  |
+   | CLOSE                | REQ        |              | Section 18.2   |
+   | COMMIT               | REQ        |              | Section 18.3   |
+   | CREATE               | REQ        |              | Section 18.4   |
+I  | CREATE_SESSION       | REQ        |              | Section 18.36  |
+NS*| DELEGPURGE           | OPT        | FDELG (REQ)  | Section 18.5   |
+   | DELEGRETURN          | OPT        | FDELG,       | Section 18.6   |
+   |                      |            | DDELG, pNFS  |                |
+   |                      |            | (REQ)        |                |
+NS | DESTROY_CLIENTID     | REQ        |              | Section 18.50  |
+I  | DESTROY_SESSION      | REQ        |              | Section 18.37  |
+I  | EXCHANGE_ID          | REQ        |              | Section 18.35  |
+NS | FREE_STATEID         | REQ        |              | Section 18.38  |
+   | GETATTR              | REQ        |              | Section 18.7   |
+P  | GETDEVICEINFO        | OPT        | pNFS (REQ)   | Section 18.40  |
+P  | GETDEVICELIST        | OPT        | pNFS (OPT)   | Section 18.41  |
+   | GETFH                | REQ        |              | Section 18.8   |
+NS*| GET_DIR_DELEGATION   | OPT        | DDELG (REQ)  | Section 18.39  |
+P  | LAYOUTCOMMIT         | OPT        | pNFS (REQ)   | Section 18.42  |
+P  | LAYOUTGET            | OPT        | pNFS (REQ)   | Section 18.43  |
+P  | LAYOUTRETURN         | OPT        | pNFS (REQ)   | Section 18.44  |
+   | LINK                 | OPT        |              | Section 18.9   |
+   | LOCK                 | REQ        |              | Section 18.10  |
+   | LOCKT                | REQ        |              | Section 18.11  |
+   | LOCKU                | REQ        |              | Section 18.12  |
+   | LOOKUP               | REQ        |              | Section 18.13  |
+   | LOOKUPP              | REQ        |              | Section 18.14  |
+   | NVERIFY              | REQ        |              | Section 18.15  |
+   | OPEN                 | REQ        |              | Section 18.16  |
+NS*| OPENATTR             | OPT        |              | Section 18.17  |
+   | OPEN_CONFIRM         | MNI        |              | N/A            |
+   | OPEN_DOWNGRADE       | REQ        |              | Section 18.18  |
+   | PUTFH                | REQ        |              | Section 18.19  |
+   | PUTPUBFH             | REQ        |              | Section 18.20  |
+   | PUTROOTFH            | REQ        |              | Section 18.21  |
+   | READ                 | REQ        |              | Section 18.22  |
+   | READDIR              | REQ        |              | Section 18.23  |
+   | READLINK             | OPT        |              | Section 18.24  |
+NS | RECLAIM_COMPLETE     | REQ        |              | Section 18.51  |
+   | RELEASE_LOCKOWNER    | MNI        |              | N/A            |
+   | REMOVE               | REQ        |              | Section 18.25  |
+   | RENAME               | REQ        |              | Section 18.26  |
+   | RENEW                | MNI        |              | N/A            |
+   | RESTOREFH            | REQ        |              | Section 18.27  |
+   | SAVEFH               | REQ        |              | Section 18.28  |
+   | SECINFO              | REQ        |              | Section 18.29  |
+NS | SECINFO_NO_NAME      | REC        | pNFS files   | Section 18.45, |
+   |                      |            | layout (REQ) | Section 13.12  |
+I  | SEQUENCE             | REQ        |              | Section 18.46  |
+   | SETATTR              | REQ        |              | Section 18.30  |
+   | SETCLIENTID          | MNI        |              | N/A            |
+   | SETCLIENTID_CONFIRM  | MNI        |              | N/A            |
+NS | SET_SSV              | REQ        |              | Section 18.47  |
+NS | TEST_STATEID         | REQ        |              | Section 18.48  |
+   | VERIFY               | REQ        |              | Section 18.31  |
+NS*| WANT_DELEGATION      | OPT        | FDELG (OPT)  | Section 18.49  |
+   | WRITE                | REQ        |              | Section 18.32  |
+
+Callback Operations
+
+   +-------------------------+-----------+-------------+---------------+
+   | Operation               | REQ, REC, | Feature     | Definition    |
+   |                         | OPT, or   | (REQ, REC,  |               |
+   |                         | MNI       | or OPT)     |               |
+   +-------------------------+-----------+-------------+---------------+
+   | CB_GETATTR              | OPT       | FDELG (REQ) | Section 20.1  |
+P  | CB_LAYOUTRECALL         | OPT       | pNFS (REQ)  | Section 20.3  |
+NS*| CB_NOTIFY               | OPT       | DDELG (REQ) | Section 20.4  |
+P  | CB_NOTIFY_DEVICEID      | OPT       | pNFS (OPT)  | Section 20.12 |
+NS*| CB_NOTIFY_LOCK          | OPT       |             | Section 20.11 |
+NS*| CB_PUSH_DELEG           | OPT       | FDELG (OPT) | Section 20.5  |
+   | CB_RECALL               | OPT       | FDELG,      | Section 20.2  |
+   |                         |           | DDELG, pNFS |               |
+   |                         |           | (REQ)       |               |
+NS*| CB_RECALL_ANY           | OPT       | FDELG,      | Section 20.6  |
+   |                         |           | DDELG, pNFS |               |
+   |                         |           | (REQ)       |               |
+NS | CB_RECALL_SLOT          | REQ       |             | Section 20.8  |
+NS*| CB_RECALLABLE_OBJ_AVAIL | OPT       | DDELG, pNFS | Section 20.7  |
+   |                         |           | (REQ)       |               |
+I  | CB_SEQUENCE             | OPT       | FDELG,      | Section 20.9  |
+   |                         |           | DDELG, pNFS |               |
+   |                         |           | (REQ)       |               |
+NS*| CB_WANTS_CANCELLED      | OPT       | FDELG,      | Section 20.10 |
+   |                         |           | DDELG, pNFS |               |
+   |                         |           | (REQ)       |               |
+   +-------------------------+-----------+-------------+---------------+
+
+Implementation notes:
+
+EXCHANGE_ID:
+* only SP4_NONE state protection supported
+* implementation ids are ignored
+
+CREATE_SESSION:
+* backchannel attributes are ignored
+* backchannel security parameters are ignored
+
+SEQUENCE:
+* no support for dynamic slot table renegotiation (optional)
+
+nfsv4.1 COMPOUND rules:
+The following cases aren't supported yet:
+* Enforcing of NFS4ERR_NOT_ONLY_OP for: BIND_CONN_TO_SESSION, CREATE_SESSION,
+  DESTROY_CLIENTID, DESTROY_SESSION, EXCHANGE_ID.
+* DESTROY_SESSION MUST be the final operation in the COMPOUND request.
+
diff --git a/Documentation/filesystems/nilfs2.txt b/Documentation/filesystems/nilfs2.txt
new file mode 100644 (file)
index 0000000..55c4300
--- /dev/null
@@ -0,0 +1,200 @@
+NILFS2
+------
+
+NILFS2 is a log-structured file system (LFS) supporting continuous
+snapshotting.  In addition to versioning capability of the entire file
+system, users can even restore files mistakenly overwritten or
+destroyed just a few seconds ago.  Since NILFS2 can keep consistency
+like conventional LFS, it achieves quick recovery after system
+crashes.
+
+NILFS2 creates a number of checkpoints every few seconds or per
+synchronous write basis (unless there is no change).  Users can select
+significant versions among continuously created checkpoints, and can
+change them into snapshots which will be preserved until they are
+changed back to checkpoints.
+
+There is no limit on the number of snapshots until the volume gets
+full.  Each snapshot is mountable as a read-only file system
+concurrently with its writable mount, and this feature is convenient
+for online backup.
+
+The userland tools are included in nilfs-utils package, which is
+available from the following download page.  At least "mkfs.nilfs2",
+"mount.nilfs2", "umount.nilfs2", and "nilfs_cleanerd" (so called
+cleaner or garbage collector) are required.  Details on the tools are
+described in the man pages included in the package.
+
+Project web page:    http://www.nilfs.org/en/
+Download page:       http://www.nilfs.org/en/download.html
+Git tree web page:   http://www.nilfs.org/git/
+NILFS mailing lists: http://www.nilfs.org/mailman/listinfo/users
+
+Caveats
+=======
+
+Features which NILFS2 does not support yet:
+
+       - atime
+       - extended attributes
+       - POSIX ACLs
+       - quotas
+       - writable snapshots
+       - remote backup (CDP)
+       - data integrity
+       - defragmentation
+
+Mount options
+=============
+
+NILFS2 supports the following mount options:
+(*) == default
+
+barrier=on(*)          This enables/disables barriers. barrier=off disables
+                       it, barrier=on enables it.
+errors=continue(*)     Keep going on a filesystem error.
+errors=remount-ro      Remount the filesystem read-only on an error.
+errors=panic           Panic and halt the machine if an error occurs.
+cp=n                   Specify the checkpoint-number of the snapshot to be
+                       mounted.  Checkpoints and snapshots are listed by lscp
+                       user command.  Only the checkpoints marked as snapshot
+                       are mountable with this option.  Snapshot is read-only,
+                       so a read-only mount option must be specified together.
+order=relaxed(*)       Apply relaxed order semantics that allows modified data
+                       blocks to be written to disk without making a
+                       checkpoint if no metadata update is going.  This mode
+                       is equivalent to the ordered data mode of the ext3
+                       filesystem except for the updates on data blocks still
+                       conserve atomicity.  This will improve synchronous
+                       write performance for overwriting.
+order=strict           Apply strict in-order semantics that preserves sequence
+                       of all file operations including overwriting of data
+                       blocks.  That means, it is guaranteed that no
+                       overtaking of events occurs in the recovered file
+                       system after a crash.
+
+NILFS2 usage
+============
+
+To use nilfs2 as a local file system, simply:
+
+ # mkfs -t nilfs2 /dev/block_device
+ # mount -t nilfs2 /dev/block_device /dir
+
+This will also invoke the cleaner through the mount helper program
+(mount.nilfs2).
+
+Checkpoints and snapshots are managed by the following commands.
+Their manpages are included in the nilfs-utils package above.
+
+  lscp     list checkpoints or snapshots.
+  mkcp     make a checkpoint or a snapshot.
+  chcp     change an existing checkpoint to a snapshot or vice versa.
+  rmcp     invalidate specified checkpoint(s).
+
+To mount a snapshot,
+
+ # mount -t nilfs2 -r -o cp=<cno> /dev/block_device /snap_dir
+
+where <cno> is the checkpoint number of the snapshot.
+
+To unmount the NILFS2 mount point or snapshot, simply:
+
+ # umount /dir
+
+Then, the cleaner daemon is automatically shut down by the umount
+helper program (umount.nilfs2).
+
+Disk format
+===========
+
+A nilfs2 volume is equally divided into a number of segments except
+for the super block (SB) and segment #0.  A segment is the container
+of logs.  Each log is composed of summary information blocks, payload
+blocks, and an optional super root block (SR):
+
+   ______________________________________________________
+  | |SB| | Segment | Segment | Segment | ... | Segment | |
+  |_|__|_|____0____|____1____|____2____|_____|____N____|_|
+  0 +1K +4K       +8M       +16M      +24M  +(8MB x N)
+       .             .            (Typical offsets for 4KB-block)
+    .                  .
+  .______________________.
+  | log | log |... | log |
+  |__1__|__2__|____|__m__|
+        .       .
+      .               .
+    .                       .
+  .______________________________.
+  | Summary | Payload blocks  |SR|
+  |_blocks__|_________________|__|
+
+The payload blocks are organized per file, and each file consists of
+data blocks and B-tree node blocks:
+
+    |<---       File-A        --->|<---       File-B        --->|
+   _______________________________________________________________
+    | Data blocks | B-tree blocks | Data blocks | B-tree blocks | ...
+   _|_____________|_______________|_____________|_______________|_
+
+
+Since only the modified blocks are written in the log, it may have
+files without data blocks or B-tree node blocks.
+
+The organization of the blocks is recorded in the summary information
+blocks, which contains a header structure (nilfs_segment_summary), per
+file structures (nilfs_finfo), and per block structures (nilfs_binfo):
+
+  _________________________________________________________________________
+ | Summary | finfo | binfo | ... | binfo | finfo | binfo | ... | binfo |...
+ |_blocks__|___A___|_(A,1)_|_____|(A,Na)_|___B___|_(B,1)_|_____|(B,Nb)_|___
+
+
+The logs include regular files, directory files, symbolic link files
+and several meta data files.  The mata data files are the files used
+to maintain file system meta data.  The current version of NILFS2 uses
+the following meta data files:
+
+ 1) Inode file (ifile)             -- Stores on-disk inodes
+ 2) Checkpoint file (cpfile)       -- Stores checkpoints
+ 3) Segment usage file (sufile)    -- Stores allocation state of segments
+ 4) Data address translation file  -- Maps virtual block numbers to usual
+    (DAT)                             block numbers.  This file serves to
+                                      make on-disk blocks relocatable.
+
+The following figure shows a typical organization of the logs:
+
+  _________________________________________________________________________
+ | Summary | regular file | file  | ... | ifile | cpfile | sufile | DAT |SR|
+ |_blocks__|_or_directory_|_______|_____|_______|________|________|_____|__|
+
+
+To stride over segment boundaries, this sequence of files may be split
+into multiple logs.  The sequence of logs that should be treated as
+logically one log, is delimited with flags marked in the segment
+summary.  The recovery code of nilfs2 looks this boundary information
+to ensure atomicity of updates.
+
+The super root block is inserted for every checkpoints.  It includes
+three special inodes, inodes for the DAT, cpfile, and sufile.  Inodes
+of regular files, directories, symlinks and other special files, are
+included in the ifile.  The inode of ifile itself is included in the
+corresponding checkpoint entry in the cpfile.  Thus, the hierarchy
+among NILFS2 files can be depicted as follows:
+
+  Super block (SB)
+       |
+       v
+  Super root block (the latest cno=xx)
+       |-- DAT
+       |-- sufile
+       `-- cpfile
+              |-- ifile (cno=c1)
+              |-- ifile (cno=c2) ---- file (ino=i1)
+              :        :          |-- file (ino=i2)
+              `-- ifile (cno=xx)  |-- file (ino=i3)
+                                  :        :
+                                  `-- file (ino=yy)
+                                    ( regular file, directory, or symlink )
+
+For detail on the format of each file, please see include/linux/nilfs2_fs.h.
diff --git a/Documentation/hwmon/g760a b/Documentation/hwmon/g760a
new file mode 100644 (file)
index 0000000..e032eeb
--- /dev/null
@@ -0,0 +1,36 @@
+Kernel driver g760a
+===================
+
+Supported chips:
+  * Global Mixed-mode Technology Inc. G760A
+    Prefix: 'g760a'
+    Datasheet: Publicly available at the GMT website
+      http://www.gmt.com.tw/datasheet/g760a.pdf
+
+Author: Herbert Valerio Riedel <hvr@gnu.org>
+
+Description
+-----------
+
+The GMT G760A Fan Speed PWM Controller is connected directly to a fan
+and performs closed-loop control of the fan speed.
+
+The fan speed is programmed by setting the period via 'pwm1' of two
+consecutive speed pulses. The period is defined in terms of clock
+cycle counts of an assumed 32kHz clock source.
+
+Setting a period of 0 stops the fan; setting the period to 255 sets
+fan to maximum speed.
+
+The measured fan rotation speed returned via 'fan1_input' is derived
+from the measured speed pulse period by assuming again a 32kHz clock
+source and a 2 pulse-per-revolution fan.
+
+The 'alarms' file provides access to the two alarm bits provided by
+the G760A chip's status register: Bit 0 is set when the actual fan
+speed differs more than 20% with respect to the programmed fan speed;
+bit 1 is set when fan speed is below 1920 RPM.
+
+The g760a driver will not update its values more frequently than every
+other second; reading them more often will do no harm, but will return
+'old' values.
index 55b2852904a40f7a042c69fd3888423d02eb4d38..02c0e9341dd846975b1c18187deb51c55d379b10 100644 (file)
@@ -61,24 +61,28 @@ GigaSet 307x Device Driver
      ---------------------
 2.1. Modules
      -------
-     To get the device working, you have to load the proper kernel module. You
-     can do this using
-         modprobe modulename
-     where modulename is ser_gigaset (M101), usb_gigaset (M105), or
-     bas_gigaset (direct USB connection to the base).
+     For the devices to work, the proper kernel modules have to be loaded.
+     This normally happens automatically when the system detects the USB
+     device (base, M105) or when the line discipline is attached (M101). It
+     can also be triggered manually using the modprobe(8) command, for example
+     for troubleshooting or to pass module parameters.
 
      The module ser_gigaset provides a serial line discipline N_GIGASET_M101
-     which drives the device through the regular serial line driver. To use it,
-     run the Gigaset M101 daemon "gigasetm101d" (also available from
-     http://sourceforge.net/projects/gigaset307x/) with the device file of the
-     RS232 port to the M101 as an argument, for example:
-        gigasetm101d /dev/ttyS1
-     This will open the device file, set its line discipline to N_GIGASET_M101,
-     and then sleep in the background, keeping the device open so that the
-     line discipline remains active. To deactivate it, kill the daemon, for
-     example with
-        killall gigasetm101d
-     before disconnecting the device.
+     which drives the device through the regular serial line driver. It must
+     be attached to the serial line to which the M101 is connected with the
+     ldattach(8) command (requires util-linux-ng release 2.14 or later), for
+     example:
+        ldattach GIGASET_M101 /dev/ttyS1
+     This will open the device file, attach the line discipline to it, and
+     then sleep in the background, keeping the device open so that the line
+     discipline remains active. To deactivate it, kill the daemon, for example
+     with
+        killall ldattach
+     before disconnecting the device. To have this happen automatically at
+     system startup/shutdown on an LSB compatible system, create and activate
+     an appropriate LSB startup script /etc/init.d/gigaset. (The init name
+     'gigaset' is officially assigned to this project by LANANA.)
+     Alternatively, just add the 'ldattach' command line to /etc/rc.local.
 
 2.2. Device nodes for user space programs
      ------------------------------------
@@ -194,10 +198,11 @@ GigaSet 307x Device Driver
      operation (for wireless access to the base), but are needed for access
      to the M105's own configuration mode (registration to the base, baudrate
      and line format settings, device status queries) via the gigacontr
-     utility. Their use is disabled in the driver by default for safety
-     reasons but can be enabled by setting the kernel configuration option
-     "Support for undocumented USB requests" (GIGASET_UNDOCREQ) to "Y" and
-     recompiling.
+     utility. Their use is controlled by the kernel configuration option
+     "Support for undocumented USB requests" (CONFIG_GIGASET_UNDOCREQ). If you
+     encounter error code -ENOTTY when trying to use some features of the
+     M105, try setting that option to "y" via 'make {x,menu}config' and
+     recompiling the driver.
 
 
 3.   Troubleshooting
@@ -228,6 +233,13 @@ GigaSet 307x Device Driver
      Solution:
         Select Unimodem mode for all DECT data adapters. (see section 2.4.)
 
+     Problem:
+        You want to configure your USB DECT data adapter (M105) but gigacontr
+        reports an error: "/dev/ttyGU0: Inappropriate ioctl for device".
+     Solution:
+        Recompile the usb_gigaset driver with the kernel configuration option
+        CONFIG_GIGASET_UNDOCREQ set to 'y'. (see section 2.6.)
+
 3.2. Telling the driver to provide more information
      ----------------------------------------------
      Building the driver with the "Gigaset debugging" kernel configuration
index 2895ce29dea50b7ce692c78d1681caf9cc7feba8..6172e4360f608d9949d6348dfb13693f410b3662 100644 (file)
@@ -153,60 +153,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        1,0: use 1st APIC table
                        default: 0
 
-       acpi_sleep=     [HW,ACPI] Sleep options
-                       Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig,
-                                 old_ordering, s4_nonvs }
-                       See Documentation/power/video.txt for information on
-                       s3_bios and s3_mode.
-                       s3_beep is for debugging; it makes the PC's speaker beep
-                       as soon as the kernel's real-mode entry point is called.
-                       s4_nohwsig prevents ACPI hardware signature from being
-                       used during resume from hibernation.
-                       old_ordering causes the ACPI 1.0 ordering of the _PTS
-                       control method, with respect to putting devices into
-                       low power states, to be enforced (the ACPI 2.0 ordering
-                       of _PTS is used by default).
-                       s4_nonvs prevents the kernel from saving/restoring the
-                       ACPI NVS memory during hibernation.
-
-       acpi_sci=       [HW,ACPI] ACPI System Control Interrupt trigger mode
-                       Format: { level | edge | high | low }
-
-       acpi_irq_balance [HW,ACPI]
-                       ACPI will balance active IRQs
-                       default in APIC mode
-
-       acpi_irq_nobalance [HW,ACPI]
-                       ACPI will not move active IRQs (default)
-                       default in PIC mode
-
-       acpi_irq_pci=   [HW,ACPI] If irq_balance, clear listed IRQs for
-                       use by PCI
-                       Format: <irq>,<irq>...
-
-       acpi_irq_isa=   [HW,ACPI] If irq_balance, mark listed IRQs used by ISA
-                       Format: <irq>,<irq>...
-
-       acpi_no_auto_ssdt       [HW,ACPI] Disable automatic loading of SSDT
-
-       acpi_os_name=   [HW,ACPI] Tell ACPI BIOS the name of the OS
-                       Format: To spoof as Windows 98: ="Microsoft Windows"
-
-       acpi_osi=       [HW,ACPI] Modify list of supported OS interface strings
-                       acpi_osi="string1"      # add string1 -- only one string
-                       acpi_osi="!string2"     # remove built-in string2
-                       acpi_osi=               # disable all strings
-
-       acpi_serialize  [HW,ACPI] force serialization of AML methods
-
-       acpi_skip_timer_override [HW,ACPI]
-                       Recognize and ignore IRQ0/pin2 Interrupt Override.
-                       For broken nForce2 BIOS resulting in XT-PIC timer.
-       acpi_use_timer_override [HW,ACPI]
-                       Use timer override. For some broken Nvidia NF5 boards
-                       that require a timer override, but don't have
-                       HPET
-
        acpi_backlight= [HW,ACPI]
                        acpi_backlight=vendor
                        acpi_backlight=video
@@ -214,11 +160,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        (e.g. thinkpad_acpi, sony_acpi, etc.) instead
                        of the ACPI video.ko driver.
 
-       acpi_display_output=    [HW,ACPI]
-                       acpi_display_output=vendor
-                       acpi_display_output=video
-                       See above.
-
        acpi.debug_layer=       [HW,ACPI,ACPI_DEBUG]
        acpi.debug_level=       [HW,ACPI,ACPI_DEBUG]
                        Format: <int>
@@ -247,6 +188,41 @@ and is between 256 and 4096 characters. It is defined in the file
                        unusable.  The "log_buf_len" parameter may be useful
                        if you need to capture more output.
 
+       acpi_display_output=    [HW,ACPI]
+                       acpi_display_output=vendor
+                       acpi_display_output=video
+                       See above.
+
+       acpi_irq_balance [HW,ACPI]
+                       ACPI will balance active IRQs
+                       default in APIC mode
+
+       acpi_irq_nobalance [HW,ACPI]
+                       ACPI will not move active IRQs (default)
+                       default in PIC mode
+
+       acpi_irq_isa=   [HW,ACPI] If irq_balance, mark listed IRQs used by ISA
+                       Format: <irq>,<irq>...
+
+       acpi_irq_pci=   [HW,ACPI] If irq_balance, clear listed IRQs for
+                       use by PCI
+                       Format: <irq>,<irq>...
+
+       acpi_no_auto_ssdt       [HW,ACPI] Disable automatic loading of SSDT
+
+       acpi_os_name=   [HW,ACPI] Tell ACPI BIOS the name of the OS
+                       Format: To spoof as Windows 98: ="Microsoft Windows"
+
+       acpi_osi=       [HW,ACPI] Modify list of supported OS interface strings
+                       acpi_osi="string1"      # add string1 -- only one string
+                       acpi_osi="!string2"     # remove built-in string2
+                       acpi_osi=               # disable all strings
+
+       acpi_pm_good    [X86-32,X86-64]
+                       Override the pmtimer bug detection: force the kernel
+                       to assume that this machine's pmtimer latches its value
+                       and always returns good values.
+
        acpi.power_nocheck=     [HW,ACPI]
                        Format: 1/0 enable/disable the check of power state.
                        On some bogus BIOS the _PSC object/_STA object of
@@ -255,11 +231,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        power state again in power transition.
                        1 : disable the power state check
 
-       acpi_pm_good    [X86-32,X86-64]
-                       Override the pmtimer bug detection: force the kernel
-                       to assume that this machine's pmtimer latches its value
-                       and always returns good values.
-
        acpi_enforce_resources= [ACPI]
                        { strict | lax | no }
                        Check for resource conflicts between native drivers
@@ -276,22 +247,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        no: ACPI OperationRegions are not marked as reserved,
                        no further checks are performed.
 
-       agp=            [AGP]
-                       { off | try_unsupported }
-                       off: disable AGP support
-                       try_unsupported: try to drive unsupported chipsets
-                               (may crash computer or cause data corruption)
-
-       enable_timer_pin_1 [i386,x86-64]
-                       Enable PIN 1 of APIC timer
-                       Can be useful to work around chipset bugs
-                       (in particular on some ATI chipsets).
-                       The kernel tries to set a reasonable default.
-
-       disable_timer_pin_1 [i386,x86-64]
-                       Disable PIN 1 of APIC timer
-                       Can be useful to work around chipset bugs.
-
        ad1848=         [HW,OSS]
                        Format: <io>,<irq>,<dma>,<dma2>,<type>
 
@@ -305,6 +260,12 @@ and is between 256 and 4096 characters. It is defined in the file
                        Format: <io>,<irq>,<dma>,<mss_io>,<mpu_io>,<mpu_irq>
                        See also header of sound/oss/aedsp16.c.
 
+       agp=            [AGP]
+                       { off | try_unsupported }
+                       off: disable AGP support
+                       try_unsupported: try to drive unsupported chipsets
+                               (may crash computer or cause data corruption)
+
        aha152x=        [HW,SCSI]
                        See Documentation/scsi/aha152x.txt.
 
@@ -432,12 +393,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        possible to determine what the correct size should be.
                        This option provides an override for these situations.
 
-       security=       [SECURITY] Choose a security module to enable at boot.
-                       If this boot parameter is not specified, only the first
-                       security module asking for security registration will be
-                       loaded. An invalid security module name will be treated
-                       as if no module has been chosen.
-
        capability.disable=
                        [SECURITY] Disable capabilities.  This would normally
                        be used only if an alternative security model is to be
@@ -509,24 +464,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        Range: 0 - 8192
                        Default: 64
 
-       dma_debug=off   If the kernel is compiled with DMA_API_DEBUG support
-                       this option disables the debugging code at boot.
-
-       dma_debug_entries=<number>
-                       This option allows to tune the number of preallocated
-                       entries for DMA-API debugging code. One entry is
-                       required per DMA-API allocation. Use this if the
-                       DMA-API debugging code disables itself because the
-                       architectural default is too low.
-
-       hpet=           [X86-32,HPET] option to control HPET usage
-                       Format: { enable (default) | disable | force |
-                               verbose }
-                       disable: disable HPET and use PIT instead
-                       force: allow force enabled of undocumented chips (ICH4,
-                       VIA, nVidia)
-                       verbose: show contents of HPET registers during setup
-
        com20020=       [HW,NET] ARCnet - COM20020 chipset
                        Format:
                        <io>[,<irq>[,<nodeID>[,<backplane>[,<ckp>[,<timeout>]]]]]
@@ -570,23 +507,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        console=brl,ttyS0
                For now, only VisioBraille is supported.
 
-       earlycon=       [KNL] Output early console device and options.
-               uart[8250],io,<addr>[,options]
-               uart[8250],mmio,<addr>[,options]
-                       Start an early, polled-mode console on the 8250/16550
-                       UART at the specified I/O port or MMIO address.
-                       The options are the same as for ttyS, above.
-
-       no_console_suspend
-                       [HW] Never suspend the console
-                       Disable suspending of consoles during suspend and
-                       hibernate operations.  Once disabled, debugging
-                       messages can reach various consoles while the rest
-                       of the system is being put to sleep (ie, while
-                       debugging driver suspend/resume hooks).  This may
-                       not work reliably with all consoles, but is known
-                       to work with serial and VGA consoles.
-
        coredump_filter=
                        [KNL] Change the default value for
                        /proc/<pid>/coredump_filter.
@@ -643,30 +563,13 @@ and is between 256 and 4096 characters. It is defined in the file
                        Format: <area>[,<node>]
                        See also Documentation/networking/decnet.txt.
 
-       vt.default_blu= [VT]
-                       Format: <blue0>,<blue1>,<blue2>,...,<blue15>
-                       Change the default blue palette of the console.
-                       This is a 16-member array composed of values
-                       ranging from 0-255.
-
-       vt.default_grn= [VT]
-                       Format: <green0>,<green1>,<green2>,...,<green15>
-                       Change the default green palette of the console.
-                       This is a 16-member array composed of values
-                       ranging from 0-255.
-
-       vt.default_red= [VT]
-                       Format: <red0>,<red1>,<red2>,...,<red15>
-                       Change the default red palette of the console.
-                       This is a 16-member array composed of values
-                       ranging from 0-255.
-
-       vt.default_utf8=
-                       [VT]
-                       Format=<0|1>
-                       Set system-wide default UTF-8 mode for all tty's.
-                       Default is 1, i.e. UTF-8 mode is enabled for all
-                       newly opened terminals.
+       default_hugepagesz=
+                       [same as hugepagesz=] The size of the default
+                       HugeTLB page size. This is the size represented by
+                       the legacy /proc/ hugepages APIs, used for SHM, and
+                       default size when mounting hugetlbfs filesystems.
+                       Defaults to the default architecture's huge page size
+                       if not specified.
 
        dhash_entries=  [KNL]
                        Set number of hash buckets for dentry cache.
@@ -679,27 +582,9 @@ and is between 256 and 4096 characters. It is defined in the file
                        Documentation/serial/digiepca.txt.
 
        disable_mtrr_cleanup [X86]
-       enable_mtrr_cleanup [X86]
                        The kernel tries to adjust MTRR layout from continuous
                        to discrete, to make X server driver able to add WB
-                       entry later. This parameter enables/disables that.
-
-       mtrr_chunk_size=nn[KMG] [X86]
-                       used for mtrr cleanup. It is largest continous chunk
-                       that could hold holes aka. UC entries.
-
-       mtrr_gran_size=nn[KMG] [X86]
-                       Used for mtrr cleanup. It is granularity of mtrr block.
-                       Default is 1.
-                       Large value could prevent small alignment from
-                       using up MTRRs.
-
-       mtrr_spare_reg_nr=n [X86]
-                       Format: <integer>
-                       Range: 0,7 : spare reg number
-                       Default : 1
-                       Used for mtrr cleanup. It is spare mtrr entries number.
-                       Set to 2 or more if your graphical card needs more.
+                       entry later. This parameter disables that.
 
        disable_mtrr_trim [X86, Intel and AMD only]
                        By default the kernel will trim any uncacheable
@@ -707,12 +592,38 @@ and is between 256 and 4096 characters. It is defined in the file
                        MTRR settings.  This parameter disables that behavior,
                        possibly causing your machine to run very slowly.
 
+       disable_timer_pin_1 [i386,x86-64]
+                       Disable PIN 1 of APIC timer
+                       Can be useful to work around chipset bugs.
+
        dmasound=       [HW,OSS] Sound subsystem buffers
 
+       dma_debug=off   If the kernel is compiled with DMA_API_DEBUG support,
+                       this option disables the debugging code at boot.
+
+       dma_debug_entries=<number>
+                       This option allows to tune the number of preallocated
+                       entries for DMA-API debugging code. One entry is
+                       required per DMA-API allocation. Use this if the
+                       DMA-API debugging code disables itself because the
+                       architectural default is too low.
+
        dscc4.setup=    [NET]
 
        dtc3181e=       [HW,SCSI]
 
+       dynamic_printk  Enables pr_debug()/dev_dbg() calls if
+                       CONFIG_DYNAMIC_PRINTK_DEBUG has been enabled.
+                       These can also be switched on/off via
+                       <debugfs>/dynamic_printk/modules
+
+       earlycon=       [KNL] Output early console device and options.
+               uart[8250],io,<addr>[,options]
+               uart[8250],mmio,<addr>[,options]
+                       Start an early, polled-mode console on the 8250/16550
+                       UART at the specified I/O port or MMIO address.
+                       The options are the same as for ttyS, above.
+
        earlyprintk=    [X86-32,X86-64,SH,BLACKFIN]
                        earlyprintk=vga
                        earlyprintk=serial[,ttySn[,baudrate]]
@@ -754,6 +665,17 @@ and is between 256 and 4096 characters. It is defined in the file
                        pass this option to capture kernel.
                        See Documentation/kdump/kdump.txt for details.
 
+       enable_mtrr_cleanup [X86]
+                       The kernel tries to adjust MTRR layout from continuous
+                       to discrete, to make X server driver able to add WB
+                       entry later. This parameter enables that.
+
+       enable_timer_pin_1 [i386,x86-64]
+                       Enable PIN 1 of APIC timer
+                       Can be useful to work around chipset bugs
+                       (in particular on some ATI chipsets).
+                       The kernel tries to set a reasonable default.
+
        enforcing       [SELINUX] Set initial enforcing status.
                        Format: {"0" | "1"}
                        See security/selinux/Kconfig help text.
@@ -841,6 +763,16 @@ and is between 256 and 4096 characters. It is defined in the file
        hisax=          [HW,ISDN]
                        See Documentation/isdn/README.HiSax.
 
+       hlt             [BUGS=ARM,SH]
+
+       hpet=           [X86-32,HPET] option to control HPET usage
+                       Format: { enable (default) | disable | force |
+                               verbose }
+                       disable: disable HPET and use PIT instead
+                       force: allow force enabled of undocumented chips (ICH4,
+                               VIA, nVidia)
+                       verbose: show contents of HPET registers during setup
+
        hugepages=      [HW,X86-32,IA-64] HugeTLB pages to allocate at boot.
        hugepagesz=     [HW,IA-64,PPC,X86-64] The size of the HugeTLB pages.
                        On x86-64 and powerpc, this option can be specified
@@ -850,15 +782,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        (when the CPU supports the "pdpe1gb" cpuinfo flag)
                        Note that 1GB pages can only be allocated at boot time
                        using hugepages= and not freed afterwards.
-       default_hugepagesz=
-                       [same as hugepagesz=] The size of the default
-                       HugeTLB page size. This is the size represented by
-                       the legacy /proc/ hugepages APIs, used for SHM, and
-                       default size when mounting hugetlbfs filesystems.
-                       Defaults to the default architecture's huge page size
-                       if not specified.
-
-       hlt             [BUGS=ARM,SH]
 
        hvc_iucv=       [S390] Number of z/VM IUCV hypervisor console (HVC)
                               terminal devices. Valid values: 0..8
@@ -919,6 +842,9 @@ and is between 256 and 4096 characters. It is defined in the file
        idebus=         [HW] (E)IDE subsystem - VLB/PCI bus speed
                        See Documentation/ide/ide.txt.
 
+       ide-pci-generic.all-generic-ide [HW] (E)IDE subsystem
+                       Claim all unknown PCI IDE storage controllers.
+
        idle=           [X86]
                        Format: idle=poll, idle=mwait, idle=halt, idle=nomwait
                        Poll forces a polling idle loop that can slightly
@@ -934,9 +860,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        In such case C2/C3 won't be used again.
                        idle=nomwait: Disable mwait for CPU C-states
 
-       ide-pci-generic.all-generic-ide [HW] (E)IDE subsystem
-                       Claim all unknown PCI IDE storage controllers.
-
        ignore_loglevel [KNL]
                        Ignore loglevel setting - this will print /all/
                        kernel messages to the console. Useful for debugging.
@@ -970,25 +893,6 @@ and is between 256 and 4096 characters. It is defined in the file
        inport.irq=     [HW] Inport (ATI XL and Microsoft) busmouse driver
                        Format: <irq>
 
-       inttest=        [IA64]
-
-       iomem=          Disable strict checking of access to MMIO memory
-               strict  regions from userspace.
-               relaxed
-
-       iommu=          [x86]
-               off
-               force
-               noforce
-               biomerge
-               panic
-               nopanic
-               merge
-               nomerge
-               forcesac
-               soft
-
-
        intel_iommu=    [DMAR] Intel IOMMU driver (DMAR) option
                on
                        Enable intel iommu driver.
@@ -1012,6 +916,28 @@ and is between 256 and 4096 characters. It is defined in the file
                        result in a hardware IOTLB flush operation as opposed
                        to batching them for performance.
 
+       inttest=        [IA64]
+
+       iomem=          Disable strict checking of access to MMIO memory
+               strict  regions from userspace.
+               relaxed
+
+       iommu=          [x86]
+               off
+               force
+               noforce
+               biomerge
+               panic
+               nopanic
+               merge
+               nomerge
+               forcesac
+               soft
+
+       io7=            [HW] IO7 for Marvel based alpha systems
+                       See comment before marvel_specify_io7 in
+                       arch/alpha/kernel/core_marvel.c.
+
        io_delay=       [X86-32,X86-64] I/O delay method
                0x80
                        Standard port 0x80 based delay
@@ -1022,10 +948,6 @@ and is between 256 and 4096 characters. It is defined in the file
                none
                        No delay
 
-       io7=            [HW] IO7 for Marvel based alpha systems
-                       See comment before marvel_specify_io7 in
-                       arch/alpha/kernel/core_marvel.c.
-
        ip=             [IP_PNP]
                        See Documentation/filesystems/nfsroot.txt.
 
@@ -1036,12 +958,6 @@ and is between 256 and 4096 characters. It is defined in the file
        ips=            [HW,SCSI] Adaptec / IBM ServeRAID controller
                        See header of drivers/scsi/ips.c.
 
-       ports=          [IP_VS_FTP] IPVS ftp helper module
-                       Default is 21.
-                       Up to 8 (IP_VS_APP_MAX_PORTS) ports
-                       may be specified.
-                       Format: <port>,<port>....
-
        irqfixup        [HW]
                        When an interrupt is not handled search all handlers
                        for it. Intended to get systems with badly broken
@@ -1082,6 +998,8 @@ and is between 256 and 4096 characters. It is defined in the file
        js=             [HW,JOY] Analog joystick
                        See Documentation/input/joystick.txt.
 
+       keepinitrd      [HW,ARM]
+
        kernelcore=nn[KMG]      [KNL,X86-32,IA-64,PPC,X86-64] This parameter
                        specifies the amount of memory usable by the kernel
                        for non-movable allocations.  The requested amount is
@@ -1107,21 +1025,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        higher than default (KMEMTRACE_N_SUBBUFS in code) if
                        you experience buffer overruns.
 
-       movablecore=nn[KMG]     [KNL,X86-32,IA-64,PPC,X86-64] This parameter
-                       is similar to kernelcore except it specifies the
-                       amount of memory used for migratable allocations.
-                       If both kernelcore and movablecore is specified,
-                       then kernelcore will be at *least* the specified
-                       value but may be more. If movablecore on its own
-                       is specified, the administrator must be careful
-                       that the amount of memory usable for all allocations
-                       is not too small.
-
-       keepinitrd      [HW,ARM]
-
-       kstack=N        [X86-32,X86-64] Print N words from the kernel stack
-                       in oops dumps.
-
        kgdboc=         [HW] kgdb over consoles.
                        Requires a tty driver that supports console polling.
                        (only serial suported for now)
@@ -1131,6 +1034,9 @@ and is between 256 and 4096 characters. It is defined in the file
                        Configure the RouterBoard 532 series on-chip
                        Ethernet adapter MAC address.
 
+       kstack=N        [X86-32,X86-64] Print N words from the kernel stack
+                       in oops dumps.
+
        l2cr=           [PPC]
 
        l3cr=           [PPC]
@@ -1276,9 +1182,8 @@ and is between 256 and 4096 characters. It is defined in the file
                        (machvec) in a generic kernel.
                        Example: machvec=hpzx1_swiotlb
 
-       max_loop=       [LOOP] Maximum number of loopback devices that can
-                       be mounted
-                       Format: <1-256>
+       max_addr=nn[KMG]        [KNL,BOOT,ia64] All physical memory greater
+                       than or equal to this physical address is ignored.
 
        maxcpus=        [SMP] Maximum number of processors that an SMP kernel
                        should make use of.  maxcpus=n : n >= 0 limits the
@@ -1286,8 +1191,9 @@ and is between 256 and 4096 characters. It is defined in the file
                        it is equivalent to "nosmp", which also disables
                        the IO APIC.
 
-       max_addr=nn[KMG]        [KNL,BOOT,ia64] All physical memory greater than
-                       or equal to this physical address is ignored.
+       max_loop=       [LOOP] Maximum number of loopback devices that can
+                       be mounted
+                       Format: <1-256>
 
        max_luns=       [SCSI] Maximum number of LUNs to probe.
                        Should be between 1 and 2^32-1.
@@ -1414,6 +1320,16 @@ and is between 256 and 4096 characters. It is defined in the file
        mousedev.yres=  [MOUSE] Vertical screen resolution, used for devices
                        reporting absolute coordinates, such as tablets
 
+       movablecore=nn[KMG]     [KNL,X86-32,IA-64,PPC,X86-64] This parameter
+                       is similar to kernelcore except it specifies the
+                       amount of memory used for migratable allocations.
+                       If both kernelcore and movablecore is specified,
+                       then kernelcore will be at *least* the specified
+                       value but may be more. If movablecore on its own
+                       is specified, the administrator must be careful
+                       that the amount of memory usable for all allocations
+                       is not too small.
+
        mpu401=         [HW,OSS]
                        Format: <io>,<irq>
 
@@ -1435,6 +1351,23 @@ and is between 256 and 4096 characters. It is defined in the file
                        [HW] Make the MicroTouch USB driver use raw coordinates
                        ('y', default) or cooked coordinates ('n')
 
+       mtrr_chunk_size=nn[KMG] [X86]
+                       used for mtrr cleanup. It is largest continous chunk
+                       that could hold holes aka. UC entries.
+
+       mtrr_gran_size=nn[KMG] [X86]
+                       Used for mtrr cleanup. It is granularity of mtrr block.
+                       Default is 1.
+                       Large value could prevent small alignment from
+                       using up MTRRs.
+
+       mtrr_spare_reg_nr=n [X86]
+                       Format: <integer>
+                       Range: 0,7 : spare reg number
+                       Default : 1
+                       Used for mtrr cleanup. It is spare mtrr entries number.
+                       Set to 2 or more if your graphical card needs more.
+
        n2=             [NET] SDL Inc. RISCom/N2 synchronous serial card
 
        NCR_D700=       [HW,SCSI]
@@ -1495,11 +1428,13 @@ and is between 256 and 4096 characters. It is defined in the file
                        0 - turn nmi_watchdog off
                        1 - use the IO-APIC timer for the NMI watchdog
                        2 - use the local APIC for the NMI watchdog using
-                       a performance counter. Note: This will use one performance
-                       counter and the local APIC's performance vector.
-                       When panic is specified panic when an NMI watchdog timeout occurs.
-                       This is useful when you use a panic=... timeout and need the box
-                       quickly up again.
+                       a performance counter. Note: This will use one
+                       performance counter and the local APIC's performance
+                       vector.
+                       When panic is specified, panic when an NMI watchdog
+                       timeout occurs.
+                       This is useful when you use a panic=... timeout and
+                       need the box quickly up again.
                        Instead of 1 and 2 it is possible to use the following
                        symbolic names: lapic and ioapic
                        Example: nmi_watchdog=2 or nmi_watchdog=panic,lapic
@@ -1508,6 +1443,16 @@ and is between 256 and 4096 characters. It is defined in the file
                        emulation library even if a 387 maths coprocessor
                        is present.
 
+       no_console_suspend
+                       [HW] Never suspend the console
+                       Disable suspending of consoles during suspend and
+                       hibernate operations.  Once disabled, debugging
+                       messages can reach various consoles while the rest
+                       of the system is being put to sleep (ie, while
+                       debugging driver suspend/resume hooks).  This may
+                       not work reliably with all consoles, but is known
+                       to work with serial and VGA consoles.
+
        noaliencache    [MM, NUMA, SLAB] Disables the allocation of alien
                        caches in the slab allocator.  Saves per-node memory,
                        but will impact performance.
@@ -1522,6 +1467,8 @@ and is between 256 and 4096 characters. It is defined in the file
 
        nocache         [ARM]
 
+       noclflush       [BUGS=X86] Don't use the CLFLUSH instruction
+
        nodelayacct     [KNL] Disable per-task delay accounting
 
        nodisconnect    [HW,SCSI,M68K] Disables SCSI disconnects.
@@ -1550,8 +1497,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        register save and restore. The kernel will only save
                        legacy floating-point registers on task switch.
 
-       noclflush       [BUGS=X86] Don't use the CLFLUSH instruction
-
        nohlt           [BUGS=ARM,SH] Tells the kernel that the sleep(SH) or
                        wfi(ARM) instruction doesn't work correctly and not to
                        use it. This is also useful when using JTAG debugger.
@@ -1596,12 +1541,6 @@ and is between 256 and 4096 characters. It is defined in the file
 
        nolapic_timer   [X86-32,APIC] Do not use the local APIC timer.
 
-       nox2apic        [X86-64,APIC] Do not enable x2APIC mode.
-
-       x2apic_phys     [X86-64,APIC] Use x2apic physical mode instead of
-                       default x2apic cluster mode on platforms
-                       supporting x2apic.
-
        noltlbs         [PPC] Do not use large page/tlb entries for kernel
                        lowmem mapping on PPC40x.
 
@@ -1612,6 +1551,9 @@ and is between 256 and 4096 characters. It is defined in the file
        nomfgpt         [X86-32] Disable Multi-Function General Purpose
                        Timer usage (for AMD Geode machines).
 
+       norandmaps      Don't use address space randomization.  Equivalent to
+                       echo 0 > /proc/sys/kernel/randomize_va_space
+
        noreplace-paravirt      [X86-32,PV_OPS] Don't patch paravirt_ops
 
        noreplace-smp   [X86-32,SMP] Don't replace SMP instructions
@@ -1650,13 +1592,13 @@ and is between 256 and 4096 characters. It is defined in the file
                        purges which is reported from either PAL_VM_SUMMARY or
                        SAL PALO.
 
+       nr_uarts=       [SERIAL] maximum number of UARTs to be registered.
+
        numa_zonelist_order= [KNL, BOOT] Select zonelist order for NUMA.
                        one of ['zone', 'node', 'default'] can be specified
                        This can be set from sysctl after boot.
                        See Documentation/sysctl/vm.txt for details.
 
-       nr_uarts=       [SERIAL] maximum number of UARTs to be registered.
-
        ohci1394_dma=early      [HW] enable debugging via the ohci1394 driver.
                        See Documentation/debugging-via-ohci1394.txt for more
                        info.
@@ -1905,6 +1847,14 @@ and is between 256 and 4096 characters. It is defined in the file
        printk.time=    Show timing data prefixed to each printk message line
                        Format: <bool>  (1/Y/y=enable, 0/N/n=disable)
 
+       processor.max_cstate=   [HW,ACPI]
+                       Limit processor to maximum C-state
+                       max_cstate=9 overrides any DMI blacklist limit.
+
+       processor.nocst [HW,ACPI]
+                       Ignore the _CST method to determine C-states,
+                       instead using the legacy FADT method
+
        profile=        [KNL] Enable kernel profiling via /proc/profile
                        Format: [schedule,]<number>
                        Param: "schedule" - profile schedule points.
@@ -1914,14 +1864,6 @@ and is between 256 and 4096 characters. It is defined in the file
                                Requires CONFIG_SCHEDSTATS
                        Param: "kvm" - profile VM exits.
 
-       processor.max_cstate=   [HW,ACPI]
-                       Limit processor to maximum C-state
-                       max_cstate=9 overrides any DMI blacklist limit.
-
-       processor.nocst [HW,ACPI]
-                       Ignore the _CST method to determine C-states,
-                       instead using the legacy FADT method
-
        prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk
                        before loading.
                        See Documentation/blockdev/ramdisk.txt.
@@ -2075,7 +2017,13 @@ and is between 256 and 4096 characters. It is defined in the file
                        allowing boot to proceed.  none ignores them, expecting
                        user space to do the scan.
 
-       selinux         [SELINUX] Disable or enable SELinux at boot time.
+       security=       [SECURITY] Choose a security module to enable at boot.
+                       If this boot parameter is not specified, only the first
+                       security module asking for security registration will be
+                       loaded. An invalid security module name will be treated
+                       as if no module has been chosen.
+
+       selinux=        [SELINUX] Disable or enable SELinux at boot time.
                        Format: { "0" | "1" }
                        See security/selinux/Kconfig help text.
                        0 -- disable.
@@ -2499,9 +2447,6 @@ and is between 256 and 4096 characters. It is defined in the file
                                        medium is write-protected).
                        Example: quirks=0419:aaf5:rl,0421:0433:rc
 
-       add_efi_memmap  [EFI; x86-32,X86-64] Include EFI memory map in
-                       kernel's map of available physical RAM.
-
        vdso=           [X86-32,SH,x86-64]
                        vdso=2: enable compat VDSO (default with COMPAT_VDSO)
                        vdso=1: enable VDSO (default)
@@ -2540,6 +2485,31 @@ and is between 256 and 4096 characters. It is defined in the file
        vmpoff=         [KNL,S390] Perform z/VM CP command after power off.
                        Format: <command>
 
+       vt.default_blu= [VT]
+                       Format: <blue0>,<blue1>,<blue2>,...,<blue15>
+                       Change the default blue palette of the console.
+                       This is a 16-member array composed of values
+                       ranging from 0-255.
+
+       vt.default_grn= [VT]
+                       Format: <green0>,<green1>,<green2>,...,<green15>
+                       Change the default green palette of the console.
+                       This is a 16-member array composed of values
+                       ranging from 0-255.
+
+       vt.default_red= [VT]
+                       Format: <red0>,<red1>,<red2>,...,<red15>
+                       Change the default red palette of the console.
+                       This is a 16-member array composed of values
+                       ranging from 0-255.
+
+       vt.default_utf8=
+                       [VT]
+                       Format=<0|1>
+                       Set system-wide default UTF-8 mode for all tty's.
+                       Default is 1, i.e. UTF-8 mode is enabled for all
+                       newly opened terminals.
+
        waveartist=     [HW,OSS]
                        Format: <io>,<irq>,<dma>,<dma2>
 
@@ -2552,6 +2522,10 @@ and is between 256 and 4096 characters. It is defined in the file
        wdt=            [WDT] Watchdog
                        See Documentation/watchdog/wdt.txt.
 
+       x2apic_phys     [X86-64,APIC] Use x2apic physical mode instead of
+                       default x2apic cluster mode on platforms
+                       supporting x2apic.
+
        xd=             [HW,XT] Original XT pre-IDE (RLL encoded) disks.
        xd_geo=         See header of drivers/block/xd.c.
 
@@ -2559,9 +2533,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        Format:
                        <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
 
-       norandmaps      Don't use address space randomization.  Equivalent to
-                       echo 0 > /proc/sys/kernel/randomize_va_space
-
 ______________________________________________________________________
 
 TODO:
index 48b3de90eb1eb03ceb1929e4228ae3a57debc526..1e7a769a10f97354a0b3aa15229e5606723a4cd8 100644 (file)
@@ -212,7 +212,9 @@ hit, Kprobes calls kp->pre_handler.  After the probed instruction
 is single-stepped, Kprobe calls kp->post_handler.  If a fault
 occurs during execution of kp->pre_handler or kp->post_handler,
 or during single-stepping of the probed instruction, Kprobes calls
-kp->fault_handler.  Any or all handlers can be NULL.
+kp->fault_handler.  Any or all handlers can be NULL. If kp->flags
+is set KPROBE_FLAG_DISABLED, that kp will be registered but disabled,
+so, it's handlers aren't hit until calling enable_kprobe(kp).
 
 NOTE:
 1. With the introduction of the "symbol_name" field to struct kprobe,
@@ -363,6 +365,26 @@ probes) in the specified array, they clear the addr field of those
 incorrect probes. However, other probes in the array are
 unregistered correctly.
 
+4.7 disable_*probe
+
+#include <linux/kprobes.h>
+int disable_kprobe(struct kprobe *kp);
+int disable_kretprobe(struct kretprobe *rp);
+int disable_jprobe(struct jprobe *jp);
+
+Temporarily disables the specified *probe. You can enable it again by using
+enable_*probe(). You must specify the probe which has been registered.
+
+4.8 enable_*probe
+
+#include <linux/kprobes.h>
+int enable_kprobe(struct kprobe *kp);
+int enable_kretprobe(struct kretprobe *rp);
+int enable_jprobe(struct jprobe *jp);
+
+Enables *probe which has been disabled by disable_*probe(). You must specify
+the probe which has been registered.
+
 5. Kprobes Features and Limitations
 
 Kprobes allows multiple probes at the same address.  Currently,
@@ -500,10 +522,14 @@ the probe. If the probed function belongs to a module, the module name
 is also specified. Following columns show probe status. If the probe is on
 a virtual address that is no longer valid (module init sections, module
 virtual addresses that correspond to modules that've been unloaded),
-such probes are marked with [GONE].
+such probes are marked with [GONE]. If the probe is temporarily disabled,
+such probes are marked with [DISABLED].
 
-/debug/kprobes/enabled: Turn kprobes ON/OFF
+/debug/kprobes/enabled: Turn kprobes ON/OFF forcibly.
 
-Provides a knob to globally turn registered kprobes ON or OFF. By default,
-all kprobes are enabled. By echoing "0" to this file, all registered probes
-will be disarmed, till such time a "1" is echoed to this file.
+Provides a knob to globally and forcibly turn registered kprobes ON or OFF.
+By default, all kprobes are enabled. By echoing "0" to this file, all
+registered probes will be disarmed, till such time a "1" is echoed to this
+file. Note that this knob just disarms and arms all kprobes and doesn't
+change each probe's disabling state. This means that disabled kprobes (marked
+[DISABLED]) will be not enabled if you turn ON all kprobes by this knob.
index 84a04d5eb8e6d76c188e44378b705c5d19604568..a48b2cadc7f08fd4203bbf67f12f3afed3f447ed 100644 (file)
@@ -5,9 +5,21 @@ Required properties:
 - reg : should specify localbus chip select and size used for the chip.
 - fsl,upm-addr-offset : UPM pattern offset for the address latch.
 - fsl,upm-cmd-offset : UPM pattern offset for the command latch.
-- gpios : may specify optional GPIO connected to the Ready-Not-Busy pin.
 
-Example:
+Optional properties:
+- fsl,upm-wait-flags : add chip-dependent short delays after running the
+       UPM pattern (0x1), after writing a data byte (0x2) or after
+       writing out a buffer (0x4).
+- fsl,upm-addr-line-cs-offsets : address offsets for multi-chip support.
+       The corresponding address lines are used to select the chip.
+- gpios : may specify optional GPIOs connected to the Ready-Not-Busy pins
+       (R/B#). For multi-chip devices, "n" GPIO definitions are required
+       according to the number of chips.
+- chip-delay : chip dependent delay for transfering data from array to
+       read registers (tR). Required if property "gpios" is not used
+       (R/B# pins not connected).
+
+Examples:
 
 upm@1,0 {
        compatible = "fsl,upm-nand";
@@ -26,3 +38,26 @@ upm@1,0 {
                };
        };
 };
+
+upm@3,0 {
+       #address-cells = <0>;
+       #size-cells = <0>;
+       compatible = "tqc,tqm8548-upm-nand", "fsl,upm-nand";
+       reg = <3 0x0 0x800>;
+       fsl,upm-addr-offset = <0x10>;
+       fsl,upm-cmd-offset = <0x08>;
+       /* Multi-chip NAND device */
+       fsl,upm-addr-line-cs-offsets = <0x0 0x200>;
+       fsl,upm-wait-flags = <0x5>;
+       chip-delay = <25>; // in micro-seconds
+
+       nand@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               partition@0 {
+                           label = "fs";
+                           reg = <0x00000000 0x10000000>;
+               };
+       };
+};
index ff51f4c0fa9d19bbc23c05773a229acbb18a1b78..4fe14deedc0a3e5aa3988288873c5e4f9a2ee01c 100644 (file)
@@ -1,15 +1,43 @@
-LED connected to GPIO
+LEDs connected to GPIO lines
 
 Required properties:
-- compatible : should be "gpio-led".
-- label : (optional) the label for this LED. If omitted, the label is
+- compatible : should be "gpio-leds".
+
+Each LED is represented as a sub-node of the gpio-leds device.  Each
+node's name represents the name of the corresponding LED.
+
+LED sub-node properties:
+- gpios :  Should specify the LED's GPIO, see "Specifying GPIO information
+  for devices" in Documentation/powerpc/booting-without-of.txt.  Active
+  low LEDs should be indicated using flags in the GPIO specifier.
+- label :  (optional) The label for this LED.  If omitted, the label is
   taken from the node name (excluding the unit address).
-- gpios : should specify LED GPIO.
+- linux,default-trigger :  (optional) This parameter, if present, is a
+  string defining the trigger assigned to the LED.  Current triggers are:
+    "backlight" - LED will act as a back-light, controlled by the framebuffer
+                 system
+    "default-on" - LED will turn on
+    "heartbeat" - LED "double" flashes at a load average based rate
+    "ide-disk" - LED indicates disk activity
+    "timer" - LED flashes at a fixed, configurable rate
 
-Example:
+Examples:
 
-led@0 {
-       compatible = "gpio-led";
-       label = "hdd";
-       gpios = <&mcu_pio 0 1>;
+leds {
+       compatible = "gpio-leds";
+       hdd {
+               label = "IDE Activity";
+               gpios = <&mcu_pio 0 1>; /* Active low */
+               linux,default-trigger = "ide-disk";
+       };
 };
+
+run-control {
+       compatible = "gpio-leds";
+       red {
+               gpios = <&mpc8572 6 0>;
+       };
+       green {
+               gpios = <&mpc8572 7 0>;
+       };
+}
index ddace3afc83b55974e5f6075d170711af3bcdb61..30f643f611b29f42bcc478a31a9b1b206624d18b 100644 (file)
@@ -60,17 +60,9 @@ Supported Cards/Chipsets
        9005:0285:9005:02d5     Adaptec ASR-2405 (Voodoo40 Lite)
        9005:0285:9005:02d6     Adaptec ASR-2445 (Voodoo44 Lite)
        9005:0285:9005:02d7     Adaptec ASR-2805 (Voodoo80 Lite)
-       9005:0285:9005:02d8     Adaptec 5405G (Voodoo40 PM)
-       9005:0285:9005:02d9     Adaptec 5445G (Voodoo44 PM)
-       9005:0285:9005:02da     Adaptec 5805G (Voodoo80 PM)
-       9005:0285:9005:02db     Adaptec 5085G (Voodoo08 PM)
-       9005:0285:9005:02dc     Adaptec 51245G (Voodoo124 PM)
-       9005:0285:9005:02dd     Adaptec 51645G (Voodoo164 PM)
-       9005:0285:9005:02de     Adaptec 52445G (Voodoo244 PM)
-       9005:0285:9005:02df     Adaptec ASR-2045G (Voodoo04 Lite PM)
-       9005:0285:9005:02e0     Adaptec ASR-2405G (Voodoo40 Lite PM)
-       9005:0285:9005:02e1     Adaptec ASR-2445G (Voodoo44 Lite PM)
-       9005:0285:9005:02e2     Adaptec ASR-2805G (Voodoo80 Lite PM)
+       9005:0285:9005:02d8     Adaptec 5405Z (Voodoo40 BLBU)
+       9005:0285:9005:02d9     Adaptec 5445Z (Voodoo44 BLBU)
+       9005:0285:9005:02da     Adaptec 5805Z (Voodoo80 BLBU)
        1011:0046:9005:0364     Adaptec 5400S (Mustang)
        1011:0046:9005:0365     Adaptec 5400S (Mustang)
        9005:0287:9005:0800     Adaptec Themisto (Jupiter)
@@ -140,6 +132,7 @@ Deanna Bonds                            (non-DASD support, PAE fibs and 64 bit,
                                         where fibs that go to the hardware are consistently called hw_fibs and
                                         not just fibs like the name of the driver tracking structure)
 Mark Salyzyn <Mark_Salyzyn@adaptec.com> Fixed panic issues and added some new product ids for upcoming hbas. Performance tuning, card failover and bug mitigations.
+Achim Leubner <Achim_Leubner@adaptec.com>
 
 Original Driver
 -------------------------
diff --git a/Documentation/sound/alsa/soc/jack.txt b/Documentation/sound/alsa/soc/jack.txt
new file mode 100644 (file)
index 0000000..fcf82a4
--- /dev/null
@@ -0,0 +1,71 @@
+ASoC jack detection
+===================
+
+ALSA has a standard API for representing physical jacks to user space,
+the kernel side of which can be seen in include/sound/jack.h.  ASoC
+provides a version of this API adding two additional features:
+
+ - It allows more than one jack detection method to work together on one
+   user visible jack.  In embedded systems it is common for multiple
+   to be present on a single jack but handled by separate bits of
+   hardware.
+
+ - Integration with DAPM, allowing DAPM endpoints to be updated
+   automatically based on the detected jack status (eg, turning off the
+   headphone outputs if no headphones are present).
+
+This is done by splitting the jacks up into three things working
+together: the jack itself represented by a struct snd_soc_jack, sets of
+snd_soc_jack_pins representing DAPM endpoints to update and blocks of
+code providing jack reporting mechanisms.
+
+For example, a system may have a stereo headset jack with two reporting
+mechanisms, one for the headphone and one for the microphone.  Some
+systems won't be able to use their speaker output while a headphone is
+connected and so will want to make sure to update both speaker and
+headphone when the headphone jack status changes.
+
+The jack - struct snd_soc_jack
+==============================
+
+This represents a physical jack on the system and is what is visible to
+user space.  The jack itself is completely passive, it is set up by the
+machine driver and updated by jack detection methods.
+
+Jacks are created by the machine driver calling snd_soc_jack_new().
+
+snd_soc_jack_pin
+================
+
+These represent a DAPM pin to update depending on some of the status
+bits supported by the jack.  Each snd_soc_jack has zero or more of these
+which are updated automatically.  They are created by the machine driver
+and associated with the jack using snd_soc_jack_add_pins().  The status
+of the endpoint may configured to be the opposite of the jack status if
+required (eg, enabling a built in microphone if a microphone is not
+connected via a jack).
+
+Jack detection methods
+======================
+
+Actual jack detection is done by code which is able to monitor some
+input to the system and update a jack by calling snd_soc_jack_report(),
+specifying a subset of bits to update.  The jack detection code should
+be set up by the machine driver, taking configuration for the jack to
+update and the set of things to report when the jack is connected.
+
+Often this is done based on the status of a GPIO - a handler for this is
+provided by the snd_soc_jack_add_gpio() function.  Other methods are
+also available, for example integrated into CODECs.  One example of
+CODEC integrated jack detection can be see in the WM8350 driver.
+
+Each jack may have multiple reporting mechanisms, though it will need at
+least one to be useful.
+
+Machine drivers
+===============
+
+These are all hooked together by the machine driver depending on the
+system hardware.  The machine driver will set up the snd_soc_jack and
+the list of pins to update then set up one or more jack detection
+mechanisms to update that jack based on their current status.
index 3197fc83bc51c0b42559be7c14c3d11471a1448b..97c4b3284329bebc051ba43840571784652306f4 100644 (file)
@@ -39,6 +39,8 @@ Currently, these files are in /proc/sys/vm:
 - nr_hugepages
 - nr_overcommit_hugepages
 - nr_pdflush_threads
+- nr_pdflush_threads_min
+- nr_pdflush_threads_max
 - nr_trim_pages         (only if CONFIG_MMU=n)
 - numa_zonelist_order
 - oom_dump_tasks
@@ -463,6 +465,32 @@ The default value is 0.
 
 ==============================================================
 
+nr_pdflush_threads_min
+
+This value controls the minimum number of pdflush threads.
+
+At boot time, the kernel will create and maintain 'nr_pdflush_threads_min'
+threads for the kernel's lifetime.
+
+The default value is 2.  The minimum value you can specify is 1, and
+the maximum value is the current setting of 'nr_pdflush_threads_max'.
+
+See 'nr_pdflush_threads_max' below for more information.
+
+==============================================================
+
+nr_pdflush_threads_max
+
+This value controls the maximum number of pdflush threads that can be
+created.  The pdflush algorithm will create a new pdflush thread (up to
+this maximum) if no pdflush threads have been available for >= 1 second.
+
+The default value is 8.  The minimum value you can specify is the
+current value of 'nr_pdflush_threads_min' and the
+maximum is 1000.
+
+==============================================================
+
 overcommit_memory:
 
 This value contains a flag that enables memory overcommitment.
diff --git a/Documentation/video4linux/pxa_camera.txt b/Documentation/video4linux/pxa_camera.txt
new file mode 100644 (file)
index 0000000..b1137f9
--- /dev/null
@@ -0,0 +1,125 @@
+                              PXA-Camera Host Driver
+                              ======================
+
+Constraints
+-----------
+  a) Image size for YUV422P format
+     All YUV422P images are enforced to have width x height % 16 = 0.
+     This is due to DMA constraints, which transfers only planes of 8 byte
+     multiples.
+
+
+Global video workflow
+---------------------
+  a) QCI stopped
+     Initialy, the QCI interface is stopped.
+     When a buffer is queued (pxa_videobuf_ops->buf_queue), the QCI starts.
+
+  b) QCI started
+     More buffers can be queued while the QCI is started without halting the
+     capture.  The new buffers are "appended" at the tail of the DMA chain, and
+     smoothly captured one frame after the other.
+
+     Once a buffer is filled in the QCI interface, it is marked as "DONE" and
+     removed from the active buffers list. It can be then requeud or dequeued by
+     userland application.
+
+     Once the last buffer is filled in, the QCI interface stops.
+
+
+DMA usage
+---------
+  a) DMA flow
+     - first buffer queued for capture
+       Once a first buffer is queued for capture, the QCI is started, but data
+       transfer is not started. On "End Of Frame" interrupt, the irq handler
+       starts the DMA chain.
+     - capture of one videobuffer
+       The DMA chain starts transfering data into videobuffer RAM pages.
+       When all pages are transfered, the DMA irq is raised on "ENDINTR" status
+     - finishing one videobuffer
+       The DMA irq handler marks the videobuffer as "done", and removes it from
+       the active running queue
+       Meanwhile, the next videobuffer (if there is one), is transfered by DMA
+     - finishing the last videobuffer
+       On the DMA irq of the last videobuffer, the QCI is stopped.
+
+  b) DMA prepared buffer will have this structure
+
+     +------------+-----+---------------+-----------------+
+     | desc-sg[0] | ... | desc-sg[last] | finisher/linker |
+     +------------+-----+---------------+-----------------+
+
+     This structure is pointed by dma->sg_cpu.
+     The descriptors are used as follows :
+      - desc-sg[i]: i-th descriptor, transfering the i-th sg
+        element to the video buffer scatter gather
+      - finisher: has ddadr=DADDR_STOP, dcmd=ENDIRQEN
+      - linker: has ddadr= desc-sg[0] of next video buffer, dcmd=0
+
+     For the next schema, let's assume d0=desc-sg[0] .. dN=desc-sg[N],
+     "f" stands for finisher and "l" for linker.
+     A typical running chain is :
+
+         Videobuffer 1         Videobuffer 2
+     +---------+----+---+  +----+----+----+---+
+     | d0 | .. | dN | l |  | d0 | .. | dN | f |
+     +---------+----+-|-+  ^----+----+----+---+
+                      |    |
+                      +----+
+
+     After the chaining is finished, the chain looks like :
+
+         Videobuffer 1         Videobuffer 2         Videobuffer 3
+     +---------+----+---+  +----+----+----+---+  +----+----+----+---+
+     | d0 | .. | dN | l |  | d0 | .. | dN | l |  | d0 | .. | dN | f |
+     +---------+----+-|-+  ^----+----+----+-|-+  ^----+----+----+---+
+                      |    |                |    |
+                      +----+                +----+
+                                           new_link
+
+  c) DMA hot chaining timeslice issue
+
+     As DMA chaining is done while DMA _is_ running, the linking may be done
+     while the DMA jumps from one Videobuffer to another. On the schema, that
+     would be a problem if the following sequence is encountered :
+
+      - DMA chain is Videobuffer1 + Videobuffer2
+      - pxa_videobuf_queue() is called to queue Videobuffer3
+      - DMA controller finishes Videobuffer2, and DMA stops
+      =>
+         Videobuffer 1         Videobuffer 2
+     +---------+----+---+  +----+----+----+---+
+     | d0 | .. | dN | l |  | d0 | .. | dN | f |
+     +---------+----+-|-+  ^----+----+----+-^-+
+                      |    |                |
+                      +----+                +-- DMA DDADR loads DDADR_STOP
+
+      - pxa_dma_add_tail_buf() is called, the Videobuffer2 "finisher" is
+        replaced by a "linker" to Videobuffer3 (creation of new_link)
+      - pxa_videobuf_queue() finishes
+      - the DMA irq handler is called, which terminates Videobuffer2
+      - Videobuffer3 capture is not scheduled on DMA chain (as it stopped !!!)
+
+         Videobuffer 1         Videobuffer 2         Videobuffer 3
+     +---------+----+---+  +----+----+----+---+  +----+----+----+---+
+     | d0 | .. | dN | l |  | d0 | .. | dN | l |  | d0 | .. | dN | f |
+     +---------+----+-|-+  ^----+----+----+-|-+  ^----+----+----+---+
+                      |    |                |    |
+                      +----+                +----+
+                                           new_link
+                                          DMA DDADR still is DDADR_STOP
+
+      - pxa_camera_check_link_miss() is called
+        This checks if the DMA is finished and a buffer is still on the
+        pcdev->capture list. If that's the case, the capture will be restarted,
+        and Videobuffer3 is scheduled on DMA chain.
+      - the DMA irq handler finishes
+
+     Note: if DMA stops just after pxa_camera_check_link_miss() reads DDADR()
+     value, we have the guarantee that the DMA irq handler will be called back
+     when the DMA will finish the buffer, and pxa_camera_check_link_miss() will
+     be called again, to reschedule Videobuffer3.
+
+--
+Author: Robert Jarzmik <robert.jarzmik@free.fr>
index a31177390e551a5873a28121901dc904bebacee0..854808b67faed03f209291ae2947be5f051e8af6 100644 (file)
@@ -90,7 +90,7 @@ up before calling v4l2_device_register then it will be untouched. If dev is
 NULL, then you *must* setup v4l2_dev->name before calling v4l2_device_register.
 
 The first 'dev' argument is normally the struct device pointer of a pci_dev,
-usb_device or platform_device. It is rare for dev to be NULL, but it happens
+usb_interface or platform_device. It is rare for dev to be NULL, but it happens
 with ISA devices or when one device creates multiple PCI devices, thus making
 it impossible to associate v4l2_dev with a particular parent.
 
@@ -351,17 +351,6 @@ And this to go from an i2c_client to a v4l2_subdev struct:
 
        struct v4l2_subdev *sd = i2c_get_clientdata(client);
 
-Finally you need to make a command function to make driver->command()
-call the right subdev_ops functions:
-
-static int subdev_command(struct i2c_client *client, unsigned cmd, void *arg)
-{
-       return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
-}
-
-If driver->command is never used then you can leave this out. Eventually the
-driver->command usage should be removed from v4l.
-
 Make sure to call v4l2_device_unregister_subdev(sd) when the remove() callback
 is called. This will unregister the sub-device from the bridge driver. It is
 safe to call this even if the sub-device was never registered.
@@ -375,14 +364,12 @@ from the remove() callback ensures that this is always done correctly.
 
 The bridge driver also has some helper functions it can use:
 
-struct v4l2_subdev *sd = v4l2_i2c_new_subdev(adapter, "module_foo", "chipid", 0x36);
+struct v4l2_subdev *sd = v4l2_i2c_new_subdev(v4l2_dev, adapter,
+              "module_foo", "chipid", 0x36);
 
 This loads the given module (can be NULL if no module needs to be loaded) and
 calls i2c_new_device() with the given i2c_adapter and chip/address arguments.
-If all goes well, then it registers the subdev with the v4l2_device. It gets
-the v4l2_device by calling i2c_get_adapdata(adapter), so you should make sure
-to call i2c_set_adapdata(adapter, v4l2_device) when you setup the i2c_adapter
-in your driver.
+If all goes well, then it registers the subdev with the v4l2_device.
 
 You can also use v4l2_i2c_new_probed_subdev() which is very similar to
 v4l2_i2c_new_subdev(), except that it has an array of possible I2C addresses
index 9673cd28a69b3049f1c9f7b5b3eda9aa279404d1..c3b215970f7b439fd83cf1dc2009979c3ce0a84f 100644 (file)
@@ -1544,7 +1544,6 @@ S:        Maintained
 DVB SUBSYSTEM AND DRIVERS
 P:     LinuxTV.org Project
 M:     linux-media@vger.kernel.org
-L:     linux-dvb@linuxtv.org (subscription required)
 W:     http://linuxtv.org/
 T:     git kernel.org:/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
 S:     Maintained
@@ -3245,6 +3244,13 @@ M:       andi@lisas.de
 L:     netdev@vger.kernel.org
 S:     Maintained
 
+NILFS2 FILESYSTEM
+P:     KONISHI Ryusuke
+M:     konishi.ryusuke@lab.ntt.co.jp
+L:     users@nilfs.org
+W:     http://www.nilfs.org/en/
+S:     Supported
+
 NINJA SCSI-3 / NINJA SCSI-32Bi (16bit/CardBus) PCMCIA SCSI HOST ADAPTER DRIVER
 P:     YOKOTA Hiroshi
 M:     yokota@netlab.is.tsukuba.ac.jp
index 38b6a9ce2a93cc8caecaa2d471e30c3198ce4421..0b97a528902b34d81ac93968e60fcf4ea10acd30 100644 (file)
@@ -118,7 +118,7 @@ static struct resource ide_resources[] = {
        },
 };
 
-static u64 ide_dma_mask = DMA_32BIT_MASK;
+static u64 ide_dma_mask = DMA_BIT_MASK(32);
 
 static struct platform_device ide_dev = {
        .name           = "palm_bk3710",
@@ -127,7 +127,7 @@ static struct platform_device ide_dev = {
        .num_resources  = ARRAY_SIZE(ide_resources),
        .dev = {
                .dma_mask               = &ide_dma_mask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
 };
 
diff --git a/arch/arm/mach-davinci/include/mach/nand.h b/arch/arm/mach-davinci/include/mach/nand.h
new file mode 100644 (file)
index 0000000..aa48284
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * mach-davinci/nand.h
+ *
+ * Copyright Â© 2006 Texas Instruments.
+ *
+ * Ported to 2.6.23 Copyright Â© 2008 by
+ *   Sander Huijsen <Shuijsen@optelecom-nkf.com>
+ *   Troy Kisky <troy.kisky@boundarydevices.com>
+ *   Dirk Behme <Dirk.Behme@gmail.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; 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 __ARCH_ARM_DAVINCI_NAND_H
+#define __ARCH_ARM_DAVINCI_NAND_H
+
+#include <linux/mtd/nand.h>
+
+#define NRCSR_OFFSET           0x00
+#define AWCCR_OFFSET           0x04
+#define A1CR_OFFSET            0x10
+#define NANDFCR_OFFSET         0x60
+#define NANDFSR_OFFSET         0x64
+#define NANDF1ECC_OFFSET       0x70
+
+/* 4-bit ECC syndrome registers */
+#define NAND_4BIT_ECC_LOAD_OFFSET      0xbc
+#define NAND_4BIT_ECC1_OFFSET          0xc0
+#define NAND_4BIT_ECC2_OFFSET          0xc4
+#define NAND_4BIT_ECC3_OFFSET          0xc8
+#define NAND_4BIT_ECC4_OFFSET          0xcc
+#define NAND_ERR_ADD1_OFFSET           0xd0
+#define NAND_ERR_ADD2_OFFSET           0xd4
+#define NAND_ERR_ERRVAL1_OFFSET                0xd8
+#define NAND_ERR_ERRVAL2_OFFSET                0xdc
+
+/* NOTE:  boards don't need to use these address bits
+ * for ALE/CLE unless they support booting from NAND.
+ * They're used unless platform data overrides them.
+ */
+#define        MASK_ALE                0x08
+#define        MASK_CLE                0x10
+
+struct davinci_nand_pdata {            /* platform_data */
+       uint32_t                mask_ale;
+       uint32_t                mask_cle;
+
+       /* for packages using two chipselects */
+       uint32_t                mask_chipsel;
+
+       /* board's default static partition info */
+       struct mtd_partition    *parts;
+       unsigned                nr_parts;
+
+       /* none  == NAND_ECC_NONE (strongly *not* advised!!)
+        * soft  == NAND_ECC_SOFT
+        * 1-bit == NAND_ECC_HW
+        * 4-bit == NAND_ECC_HW_SYNDROME (not on all chips)
+        */
+       nand_ecc_modes_t        ecc_mode;
+
+       /* e.g. NAND_BUSWIDTH_16 or NAND_USE_FLASH_BBT */
+       unsigned                options;
+};
+
+#endif /* __ARCH_ARM_DAVINCI_NAND_H */
index 69680784448a20a259f96ef059e2c4c375b0ea17..2429b79f6da2edf38926dd360dd6d72211f1ee1f 100644 (file)
@@ -64,7 +64,7 @@ static struct resource usb_resources[] = {
        },
 };
 
-static u64 usb_dmamask = DMA_32BIT_MASK;
+static u64 usb_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device usb_dev = {
        .name           = "musb_hdrc",
@@ -72,7 +72,7 @@ static struct platform_device usb_dev = {
        .dev = {
                .platform_data          = &usb_data,
                .dma_mask               = &usb_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .resource       = usb_resources,
        .num_resources  = ARRAY_SIZE(usb_resources),
index cfd4d2e6dacd6d1f7fb235c84c98552c99347a0e..bee42c609df6c6db3c491e9826fc5c4d5973225d 100644 (file)
@@ -307,7 +307,7 @@ static struct resource iop13xx_adma_2_resources[] = {
        }
 };
 
-static u64 iop13xx_adma_dmamask = DMA_64BIT_MASK;
+static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64);
 static struct iop_adma_platform_data iop13xx_adma_0_data = {
        .hw_id = 0,
        .pool_size = PAGE_SIZE,
@@ -331,7 +331,7 @@ static struct platform_device iop13xx_adma_0_channel = {
        .resource = iop13xx_adma_0_resources,
        .dev = {
                .dma_mask = &iop13xx_adma_dmamask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
                .platform_data = (void *) &iop13xx_adma_0_data,
        },
 };
@@ -343,7 +343,7 @@ static struct platform_device iop13xx_adma_1_channel = {
        .resource = iop13xx_adma_1_resources,
        .dev = {
                .dma_mask = &iop13xx_adma_dmamask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
                .platform_data = (void *) &iop13xx_adma_1_data,
        },
 };
@@ -355,7 +355,7 @@ static struct platform_device iop13xx_adma_2_channel = {
        .resource = iop13xx_adma_2_resources,
        .dev = {
                .dma_mask = &iop13xx_adma_dmamask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
                .platform_data = (void *) &iop13xx_adma_2_data,
        },
 };
index c6af1e1bee32e5a844d13686eabf02ade6f10c57..6fdad7a0425af0e1a6565b1fc3a45aab5f27aa35 100644 (file)
@@ -151,7 +151,7 @@ static struct resource iop13xx_tpmi_3_resources[] = {
        }
 };
 
-u64 iop13xx_tpmi_mask = DMA_64BIT_MASK;
+u64 iop13xx_tpmi_mask = DMA_BIT_MASK(64);
 static struct platform_device iop13xx_tpmi_0_device = {
        .name = "iop-tpmi",
        .id = 0,
@@ -159,7 +159,7 @@ static struct platform_device iop13xx_tpmi_0_device = {
        .resource = iop13xx_tpmi_0_resources,
        .dev = {
                .dma_mask          = &iop13xx_tpmi_mask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
        },
 };
 
@@ -170,7 +170,7 @@ static struct platform_device iop13xx_tpmi_1_device = {
        .resource = iop13xx_tpmi_1_resources,
        .dev = {
                .dma_mask          = &iop13xx_tpmi_mask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
        },
 };
 
@@ -181,7 +181,7 @@ static struct platform_device iop13xx_tpmi_2_device = {
        .resource = iop13xx_tpmi_2_resources,
        .dev = {
                .dma_mask          = &iop13xx_tpmi_mask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
        },
 };
 
@@ -192,7 +192,7 @@ static struct platform_device iop13xx_tpmi_3_device = {
        .resource = iop13xx_tpmi_3_resources,
        .dev = {
                .dma_mask          = &iop13xx_tpmi_mask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
        },
 };
 
index 3d2fae84651231dcd835c017c9630250ab66884a..16dc9ea0839398ea3c040bc636a991842fbba6cb 100644 (file)
@@ -508,7 +508,7 @@ static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = {
        .dram           = &kirkwood_mbus_dram_info,
 };
 
-static u64 kirkwood_xor_dmamask = DMA_32BIT_MASK;
+static u64 kirkwood_xor_dmamask = DMA_BIT_MASK(32);
 
 
 /*****************************************************************************
@@ -559,7 +559,7 @@ static struct platform_device kirkwood_xor00_channel = {
        .resource       = kirkwood_xor00_resources,
        .dev            = {
                .dma_mask               = &kirkwood_xor_dmamask,
-               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(64),
                .platform_data          = (void *)&kirkwood_xor00_data,
        },
 };
@@ -585,7 +585,7 @@ static struct platform_device kirkwood_xor01_channel = {
        .resource       = kirkwood_xor01_resources,
        .dev            = {
                .dma_mask               = &kirkwood_xor_dmamask,
-               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(64),
                .platform_data          = (void *)&kirkwood_xor01_data,
        },
 };
@@ -657,7 +657,7 @@ static struct platform_device kirkwood_xor10_channel = {
        .resource       = kirkwood_xor10_resources,
        .dev            = {
                .dma_mask               = &kirkwood_xor_dmamask,
-               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(64),
                .platform_data          = (void *)&kirkwood_xor10_data,
        },
 };
@@ -683,7 +683,7 @@ static struct platform_device kirkwood_xor11_channel = {
        .resource       = kirkwood_xor11_resources,
        .dev            = {
                .dma_mask               = &kirkwood_xor_dmamask,
-               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(64),
                .platform_data          = (void *)&kirkwood_xor11_data,
        },
 };
index 82f1309568ef92c950fc37f847c8f2c01c1b1f61..7f86fe073ec67232632ed3b84a025f96f90c3d53 100644 (file)
@@ -6,6 +6,9 @@
 
 obj-y                  += generic.o clock.o devices.o
 
+# Support for CMOS sensor interface
+obj-$(CONFIG_MX1_VIDEO)        += ksym_mx1.o mx1_camera_fiq.o
+
 # Specific board support
 obj-$(CONFIG_ARCH_MX1ADS) += mx1ads.o
 obj-$(CONFIG_MACH_SCB9328) += scb9328.o
\ No newline at end of file
index 97f42d96d7a14d3d2f7055498ee68396b4635153..76d1ffb4807980fadade7ca3c905d30a86af9523 100644 (file)
@@ -44,7 +44,7 @@ static struct resource imx_csi_resources[] = {
 static u64 imx_csi_dmamask = 0xffffffffUL;
 
 struct platform_device imx_csi_device = {
-       .name           = "imx-csi",
+       .name           = "mx1-camera",
        .id             = 0, /* This is used to put cameras on this interface */
        .dev            = {
                .dma_mask = &imx_csi_dmamask,
diff --git a/arch/arm/mach-mx1/ksym_mx1.c b/arch/arm/mach-mx1/ksym_mx1.c
new file mode 100644 (file)
index 0000000..b09ee12
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Exported ksyms of ARCH_MX1
+ *
+ * Copyright (C) 2008, Darius Augulis <augulis.darius@gmail.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.
+ */
+
+#include <linux/platform_device.h>
+#include <linux/module.h>
+
+#include <mach/mx1_camera.h>
+
+/* IMX camera FIQ handler */
+EXPORT_SYMBOL(mx1_camera_sof_fiq_start);
+EXPORT_SYMBOL(mx1_camera_sof_fiq_end);
diff --git a/arch/arm/mach-mx1/mx1_camera_fiq.S b/arch/arm/mach-mx1/mx1_camera_fiq.S
new file mode 100644 (file)
index 0000000..9c69aa6
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ *  Copyright (C) 2008 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
+ *
+ *  Based on linux/arch/arm/lib/floppydma.S
+ *      Copyright (C) 1995, 1996 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 <linux/linkage.h>
+#include <asm/assembler.h>
+
+               .text
+               .global mx1_camera_sof_fiq_end
+               .global mx1_camera_sof_fiq_start
+mx1_camera_sof_fiq_start:
+               @ enable dma
+               ldr     r12, [r9]
+               orr     r12, r12, #0x00000001
+               str     r12, [r9]
+               @ unmask DMA interrupt
+               ldr     r12, [r8]
+               bic     r12, r12, r13
+               str     r12, [r8]
+               @ disable SOF interrupt
+               ldr     r12, [r10]
+               bic     r12, r12, #0x00010000
+               str     r12, [r10]
+               @ clear SOF flag
+               mov     r12, #0x00010000
+               str     r12, [r11]
+               @ return from FIQ
+               subs    pc, lr, #4
+mx1_camera_sof_fiq_end:
index ca46f4801c3dbc22b8846789af23f42a464b1a33..9957a11533a4471fc7a03837417bf740e8765ae9 100644 (file)
@@ -533,7 +533,7 @@ static struct clk_lookup lookups[] __initdata = {
        _REGISTER_CLOCK(NULL, "kpp", kpp_clk)
        _REGISTER_CLOCK("fsl-usb2-udc", "usb", usb_clk1)
        _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", usb_clk2)
-       _REGISTER_CLOCK("mx3-camera.0", "csi", csi_clk)
+       _REGISTER_CLOCK("mx3-camera.0", NULL, csi_clk)
        _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk)
        _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk)
        _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
index 68cc3efae56736a47894c4fd304e55d3f4126012..6af99ddabdfb92e0159ba96252654549dc04b9ce 100644 (file)
@@ -463,7 +463,7 @@ static struct platform_device orion5x_xor_shared = {
        .resource       = orion5x_xor_shared_resources,
 };
 
-static u64 orion5x_xor_dmamask = DMA_32BIT_MASK;
+static u64 orion5x_xor_dmamask = DMA_BIT_MASK(32);
 
 static struct resource orion5x_xor0_resources[] = {
        [0] = {
@@ -486,7 +486,7 @@ static struct platform_device orion5x_xor0_channel = {
        .resource       = orion5x_xor0_resources,
        .dev            = {
                .dma_mask               = &orion5x_xor_dmamask,
-               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(64),
                .platform_data          = (void *)&orion5x_xor0_data,
        },
 };
@@ -512,7 +512,7 @@ static struct platform_device orion5x_xor1_channel = {
        .resource       = orion5x_xor1_resources,
        .dev            = {
                .dma_mask               = &orion5x_xor_dmamask,
-               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(64),
                .platform_data          = (void *)&orion5x_xor1_data,
        },
 };
index 2206cb61a9f918060d2416adea78fa83b1cfeae9..b87cecd9bbdc08fda122ed5842d7403af4be0f73 100644 (file)
@@ -38,6 +38,7 @@ struct pxa2xx_spi_chip {
        u8 dma_burst_size;
        u32 timeout;
        u8 enable_loopback;
+       int gpio_cs;
        void (*cs_control)(u32 command);
 };
 
index eb35fca9aea527bde9992f80917fd69cc174c346..3478eae32d8a8b8fe130e4e5c5f2c8f8a4694476 100644 (file)
@@ -49,6 +49,9 @@ struct pxa3xx_nand_platform_data {
         */
        int     enable_arbiter;
 
+       /* allow platform code to keep OBM/bootloader defined NFC config */
+       int     keep_config;
+
        const struct mtd_partition              *parts;
        unsigned int                            nr_parts;
 
index 01bd76725b920040a6b7ea1687d1c84770f32f54..4389c160f7d08f920d884b3f974ea2474d44fa09 100644 (file)
@@ -409,8 +409,7 @@ static struct platform_device bast_sio = {
 static struct s3c2410_platform_i2c __initdata bast_i2c_info = {
        .flags          = 0,
        .slave_addr     = 0x10,
-       .bus_freq       = 100*1000,
-       .max_freq       = 130*1000,
+       .frequency      = 100*1000,
 };
 
 /* Asix AX88796 10/100 ethernet controller */
index 05a5e877b49b73b7ccfa20734544b8f1f089e2c7..2b83f87077100b310f8a9502663c75451bacaca0 100644 (file)
@@ -340,8 +340,7 @@ static struct platform_device *n35_devices[] __initdata = {
 static struct s3c2410_platform_i2c n30_i2ccfg = {
        .flags          = 0,
        .slave_addr     = 0x10,
-       .bus_freq       = 10*1000,
-       .max_freq       = 10*1000,
+       .frequency      = 10*1000,
 };
 
 /* Lots of hardcoded stuff, but it sets up the hardware in a useful
index 72c266aee1410ab73ab085b65c1dbec1c00919aa..332bd3263eafd18134791a95b6fd041b564370e6 100644 (file)
@@ -453,8 +453,7 @@ static struct spi_board_info __initdata jive_spi_devs[] = {
 /* I2C bus and device configuration. */
 
 static struct s3c2410_platform_i2c jive_i2c_cfg __initdata = {
-       .max_freq       = 80 * 1000,
-       .bus_freq       = 50 * 1000,
+       .frequency      = 80 * 1000,
        .flags          = S3C_IICFLG_FILTER,
        .sda_delay      = 2,
 };
index f724208216199ef8ae3b1e5228b70c7d48ba7f60..3c127aabe214e4bb8d7a2ff00c37061836a88cff 100644 (file)
@@ -119,7 +119,7 @@ static struct resource iop3xx_aau_resources[] = {
        }
 };
 
-static u64 iop3xx_adma_dmamask = DMA_32BIT_MASK;
+static u64 iop3xx_adma_dmamask = DMA_BIT_MASK(32);
 
 static struct iop_adma_platform_data iop3xx_dma_0_data = {
        .hw_id = DMA0_ID,
@@ -143,7 +143,7 @@ struct platform_device iop3xx_dma_0_channel = {
        .resource = iop3xx_dma_0_resources,
        .dev = {
                .dma_mask = &iop3xx_adma_dmamask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
                .platform_data = (void *) &iop3xx_dma_0_data,
        },
 };
@@ -155,7 +155,7 @@ struct platform_device iop3xx_dma_1_channel = {
        .resource = iop3xx_dma_1_resources,
        .dev = {
                .dma_mask = &iop3xx_adma_dmamask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
                .platform_data = (void *) &iop3xx_dma_1_data,
        },
 };
@@ -167,7 +167,7 @@ struct platform_device iop3xx_aau_channel = {
        .resource = iop3xx_aau_resources,
        .dev = {
                .dma_mask = &iop3xx_adma_dmamask,
-               .coherent_dma_mask = DMA_64BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(64),
                .platform_data = (void *) &iop3xx_aau_data,
        },
 };
diff --git a/arch/arm/plat-mxc/include/mach/i2c.h b/arch/arm/plat-mxc/include/mach/i2c.h
new file mode 100644 (file)
index 0000000..4a5dc5c
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * i2c.h - i.MX I2C driver header file
+ *
+ * Copyright (c) 2008, Darius Augulis <augulis.darius@gmail.com>
+ *
+ * This file is released under the GPLv2
+ */
+
+#ifndef __ASM_ARCH_I2C_H_
+#define __ASM_ARCH_I2C_H_
+
+/**
+ * struct imxi2c_platform_data - structure of platform data for MXC I2C driver
+ * @init:      Initialise gpio's and other board specific things
+ * @exit:      Free everything initialised by @init
+ * @bitrate:   Bus speed measured in Hz
+ *
+ **/
+struct imxi2c_platform_data {
+       int (*init)(struct device *dev);
+       void (*exit)(struct device *dev);
+       int bitrate;
+};
+
+#endif /* __ASM_ARCH_I2C_H_ */
index e0783e619580a3e39e0dcb9ed87e21b2cd5365e8..eca37d09f3f8cee771db68b8d32dbb2a6ef5cfc1 100644 (file)
 #define PHYS_OFFSET            UL(0x80000000)
 #endif
 
+#if defined(CONFIG_MX1_VIDEO)
+/*
+ * Increase size of DMA-consistent memory region.
+ * This is required for i.MX camera driver to capture at least four VGA frames.
+ */
+#define CONSISTENT_DMA_SIZE SZ_4M
+#endif /* CONFIG_MX1_VIDEO */
+
 #endif /* __ASM_ARCH_MXC_MEMORY_H__ */
diff --git a/arch/arm/plat-mxc/include/mach/mx1_camera.h b/arch/arm/plat-mxc/include/mach/mx1_camera.h
new file mode 100644 (file)
index 0000000..4fd6c70
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * mx1_camera.h - i.MX1/i.MXL camera driver header file
+ *
+ * Copyright (c) 2008, Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
+ * Copyright (C) 2009, Darius Augulis <augulis.darius@gmail.com>
+ *
+ * Based on PXA camera.h file:
+ * Copyright (C) 2003, Intel Corporation
+ * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.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.
+ */
+
+#ifndef __ASM_ARCH_CAMERA_H_
+#define __ASM_ARCH_CAMERA_H_
+
+#define MX1_CAMERA_DATA_HIGH   1
+#define MX1_CAMERA_PCLK_RISING 2
+#define MX1_CAMERA_VSYNC_HIGH  4
+
+extern unsigned char mx1_camera_sof_fiq_start, mx1_camera_sof_fiq_end;
+
+/**
+ * struct mx1_camera_pdata - i.MX1/i.MXL camera platform data
+ * @mclk_10khz:        master clock frequency in 10kHz units
+ * @flags:     MX1 camera platform flags
+ */
+struct mx1_camera_pdata {
+       unsigned long mclk_10khz;
+       unsigned long flags;
+};
+
+#endif /* __ASM_ARCH_CAMERA_H_ */
index fe327074037ea05d4d996cbe52be7ab9a2deae78..428372868fbba66408c1fc2d290de9d138399397 100644 (file)
@@ -1,6 +1,6 @@
 /* linux/arch/arm/plat-s3c/dev-i2c0.c
  *
- * Copyright 2008 Simtec Electronics
+ * Copyright 2008,2009 Simtec Electronics
  *     Ben Dooks <ben@simtec.co.uk>
  *     http://armlinux.simtec.co.uk/
  *
@@ -50,9 +50,8 @@ struct platform_device s3c_device_i2c0 = {
 static struct s3c2410_platform_i2c default_i2c_data0 __initdata = {
        .flags          = 0,
        .slave_addr     = 0x10,
-       .bus_freq       = 100*1000,
-       .max_freq       = 400*1000,
-       .sda_delay      = S3C2410_IICLC_SDA_DELAY5 | S3C2410_IICLC_FILTER_ON,
+       .frequency      = 100*1000,
+       .sda_delay      = 100,
 };
 
 void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)
index 2387fbf57af6da984b49dce28fcf08a55a6afee5..8349c462788c9e2f41eb0977b2f491f79bbb6f9a 100644 (file)
@@ -1,6 +1,6 @@
 /* linux/arch/arm/plat-s3c/dev-i2c1.c
  *
- * Copyright 2008 Simtec Electronics
+ * Copyright 2008,2009 Simtec Electronics
  *     Ben Dooks <ben@simtec.co.uk>
  *     http://armlinux.simtec.co.uk/
  *
@@ -47,9 +47,8 @@ static struct s3c2410_platform_i2c default_i2c_data1 __initdata = {
        .flags          = 0,
        .bus_num        = 1,
        .slave_addr     = 0x10,
-       .bus_freq       = 100*1000,
-       .max_freq       = 400*1000,
-       .sda_delay      = S3C2410_IICLC_SDA_DELAY5 | S3C2410_IICLC_FILTER_ON,
+       .frequency      = 100*1000,
+       .sda_delay      = 100,
 };
 
 void __init s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *pd)
index dc1dfcb9bc6c63034e0a42750ab334ed72ed06d0..67450f115748641da0f8b889d4d19da185b13cd4 100644 (file)
@@ -1,9 +1,9 @@
-/* arch/arm/mach-s3c2410/include/mach/iic.h
+/* arch/arm/plat-s3c/include/plat/iic.h
  *
- * Copyright (c) 2004 Simtec Electronics
+ * Copyright 2004,2009 Simtec Electronics
  *     Ben Dooks <ben@simtec.co.uk>
  *
- * S3C2410 - I2C Controller platfrom_device info
+ * S3C - I2C Controller platform_device info
  *
  * 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
 
 #define S3C_IICFLG_FILTER      (1<<0)  /* enable s3c2440 filter */
 
-/* Notes:
- *     1) All frequencies are expressed in Hz
- *     2) A value of zero is `do not care`
-*/
-
+/**
+ *     struct s3c2410_platform_i2c - Platform data for s3c I2C.
+ *     @bus_num: The bus number to use (if possible).
+ *     @flags: Any flags for the I2C bus (E.g. S3C_IICFLK_FILTER).
+ *     @slave_addr: The I2C address for the slave device (if enabled).
+ *     @frequency: The desired frequency in Hz of the bus.  This is
+ *                  guaranteed to not be exceeded.  If the caller does
+ *                  not care, use zero and the driver will select a
+ *                  useful default.
+ *     @sda_delay: The delay (in ns) applied to SDA edges.
+ *     @cfg_gpio: A callback to configure the pins for I2C operation.
+ */
 struct s3c2410_platform_i2c {
-       int             bus_num;        /* bus number to use */
+       int             bus_num;
        unsigned int    flags;
-       unsigned int    slave_addr;     /* slave address for controller */
-       unsigned long   bus_freq;       /* standard bus frequency */
-       unsigned long   max_freq;       /* max frequency for the bus */
-       unsigned long   min_freq;       /* min frequency for the bus */
-       unsigned int    sda_delay;      /* pclks (s3c2440 only) */
+       unsigned int    slave_addr;
+       unsigned long   frequency;
+       unsigned int    sda_delay;
 
        void    (*cfg_gpio)(struct platform_device *dev);
 };
index 559bbcb03f9b696cb0589d649a803c8356772668..776c3cb9b6e410cfd7299149d49e667b8cb5f2b6 100644 (file)
@@ -280,13 +280,13 @@ static struct resource hh_fpga0_resource[] = {
        },
 };
 
-static u64 hh_fpga0_dma_mask = DMA_32BIT_MASK;
+static u64 hh_fpga0_dma_mask = DMA_BIT_MASK(32);
 static struct platform_device hh_fpga0_device = {
        .name           = "hh_fpga",
        .id             = 0,
        .dev            = {
                .dma_mask = &hh_fpga0_dma_mask,
-               .coherent_dma_mask = DMA_32BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
        },
        .resource       = hh_fpga0_resource,
        .num_resources  = ARRAY_SIZE(hh_fpga0_resource),
index 7cc6537983275d1bea9c6a183619e37a9c8392cc..eb9d4dc2e86dff84df6cc0905505d1efb97cfb59 100644 (file)
  * don't ... tc, smc, pio, rtc, watchdog, pwm, ps2, and more.
  */
 #define DEFINE_DEV(_name, _id)                                 \
-static u64 _name##_id##_dma_mask = DMA_32BIT_MASK;             \
+static u64 _name##_id##_dma_mask = DMA_BIT_MASK(32);           \
 static struct platform_device _name##_id##_device = {          \
        .name           = #_name,                               \
        .id             = _id,                                  \
        .dev            = {                                     \
                .dma_mask = &_name##_id##_dma_mask,             \
-               .coherent_dma_mask = DMA_32BIT_MASK,            \
+               .coherent_dma_mask = DMA_BIT_MASK(32),          \
        },                                                      \
        .resource       = _name##_id##_resource,                \
        .num_resources  = ARRAY_SIZE(_name##_id##_resource),    \
 }
 #define DEFINE_DEV_DATA(_name, _id)                            \
-static u64 _name##_id##_dma_mask = DMA_32BIT_MASK;             \
+static u64 _name##_id##_dma_mask = DMA_BIT_MASK(32);           \
 static struct platform_device _name##_id##_device = {          \
        .name           = #_name,                               \
        .id             = _id,                                  \
        .dev            = {                                     \
                .dma_mask = &_name##_id##_dma_mask,             \
                .platform_data  = &_name##_id##_data,           \
-               .coherent_dma_mask = DMA_32BIT_MASK,            \
+               .coherent_dma_mask = DMA_BIT_MASK(32),          \
        },                                                      \
        .resource       = _name##_id##_resource,                \
        .num_resources  = ARRAY_SIZE(_name##_id##_resource),    \
index 0292d58f9362e84e3b337c575a54b0b1ff6d9cad..aaeb4df10d578c6128aa6ef13a6ffb41b91e6a25 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef _SPI_CHANNEL_H_
 #define _SPI_CHANNEL_H_
 
+#define MIN_SPI_BAUD_VAL       2
+
 #define SPI_READ              0
 #define SPI_WRITE             1
 
@@ -122,6 +124,9 @@ struct bfin5xx_spi_chip {
        u8 bits_per_word;
        u8 cs_change_per_word;
        u16 cs_chg_udelay; /* Some devices require 16-bit delays */
+       u32 cs_gpio;
+       /* Value to send if no TX value is supplied, usually 0x0 or 0xFFFF */
+       u16 idle_tx_val;
 };
 
 #endif /* _SPI_CHANNEL_H_ */
index f49427293ca1c48e688e1f95a92504d2d8fa0b0a..e040e03335ea3c54792e44651424bbad51db5728 100644 (file)
@@ -337,7 +337,7 @@ int _access_ok(unsigned long addr, unsigned long size)
        if (addr >= memory_mtd_end && (addr + size) <= physical_mem_end)
                return 1;
 
-#ifdef CONFIG_ROMFS_MTD_FS
+#ifdef CONFIG_ROMFS_ON_MTD
        /* For XIP, allow user space to use pointers within the ROMFS.  */
        if (addr >= memory_mtd_start && (addr + size) <= memory_mtd_end)
                return 1;
index e21c1c3e4ec7e8129b87989c81e49f9f4001a6a0..0fb2ce5d840e14ae73ba9058d19e4da9f3bd0733 100644 (file)
@@ -53,9 +53,9 @@
 #define UART_SET_DLAB(uart)     do { UART_PUT_LCR(uart, UART_GET_LCR(uart) | DLAB); SSYNC(); } while (0)
 #define UART_CLEAR_DLAB(uart)   do { UART_PUT_LCR(uart, UART_GET_LCR(uart) & ~DLAB); SSYNC(); } while (0)
 
-#define UART_GET_CTS(x) gpio_get_value(x->cts_pin)
-#define UART_SET_RTS(x) gpio_set_value(x->rts_pin, 1)
-#define UART_CLEAR_RTS(x) gpio_set_value(x->rts_pin, 0)
+#define UART_GET_CTS(x) (!gpio_get_value(x->cts_pin))
+#define UART_DISABLE_RTS(x) gpio_set_value(x->rts_pin, 1)
+#define UART_ENABLE_RTS(x) gpio_set_value(x->rts_pin, 0)
 #define UART_ENABLE_INTS(x, v) UART_PUT_IER(x, v)
 #define UART_DISABLE_INTS(x) UART_PUT_IER(x, 0)
 
@@ -87,6 +87,7 @@
 struct bfin_serial_port {
        struct uart_port port;
        unsigned int old_status;
+       int status_irq;
        unsigned int lsr;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        int tx_done;
@@ -125,6 +126,7 @@ static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart)
 struct bfin_serial_res {
        unsigned long uart_base_addr;
        int uart_irq;
+       int uart_status_irq;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        unsigned int uart_tx_dma_channel;
        unsigned int uart_rx_dma_channel;
@@ -140,6 +142,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
         0xFFC00400,
         IRQ_UART0_RX,
+        IRQ_UART0_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
         CH_UART0_TX,
         CH_UART0_RX,
@@ -154,6 +157,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
         0xFFC02000,
         IRQ_UART1_RX,
+        IRQ_UART1_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
         CH_UART1_TX,
         CH_UART1_RX,
index e8c41fd842b5d818d70e83cc4ce78fda0288f01b..a625659dd67f4470d0ff310e833362ddd6ff3ebe 100644 (file)
@@ -53,9 +53,9 @@
 #define UART_SET_DLAB(uart)     do { UART_PUT_LCR(uart, UART_GET_LCR(uart) | DLAB); SSYNC(); } while (0)
 #define UART_CLEAR_DLAB(uart)   do { UART_PUT_LCR(uart, UART_GET_LCR(uart) & ~DLAB); SSYNC(); } while (0)
 
-#define UART_GET_CTS(x) gpio_get_value(x->cts_pin)
-#define UART_SET_RTS(x) gpio_set_value(x->rts_pin, 1)
-#define UART_CLEAR_RTS(x) gpio_set_value(x->rts_pin, 0)
+#define UART_GET_CTS(x) (!gpio_get_value(x->cts_pin))
+#define UART_DISABLE_RTS(x) gpio_set_value(x->rts_pin, 1)
+#define UART_ENABLE_RTS(x) gpio_set_value(x->rts_pin, 0)
 #define UART_ENABLE_INTS(x, v) UART_PUT_IER(x, v)
 #define UART_DISABLE_INTS(x) UART_PUT_IER(x, 0)
 
@@ -87,6 +87,7 @@
 struct bfin_serial_port {
        struct uart_port port;
        unsigned int old_status;
+       int status_irq;
        unsigned int lsr;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        int tx_done;
@@ -125,6 +126,7 @@ static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart)
 struct bfin_serial_res {
        unsigned long uart_base_addr;
        int uart_irq;
+       int uart_status_irq;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        unsigned int uart_tx_dma_channel;
        unsigned int uart_rx_dma_channel;
@@ -140,6 +142,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
         0xFFC00400,
         IRQ_UART0_RX,
+        IRQ_UART0_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
         CH_UART0_TX,
         CH_UART0_RX,
@@ -154,6 +157,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
         0xFFC02000,
         IRQ_UART1_RX,
+        IRQ_UART1_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
         CH_UART1_TX,
         CH_UART1_RX,
@@ -167,29 +171,3 @@ struct bfin_serial_res bfin_serial_resource[] = {
 };
 
 #define DRIVER_NAME "bfin-uart"
-
-static void bfin_serial_hw_init(struct bfin_serial_port *uart)
-{
-
-#ifdef CONFIG_SERIAL_BFIN_UART0
-       peripheral_request(P_UART0_TX, DRIVER_NAME);
-       peripheral_request(P_UART0_RX, DRIVER_NAME);
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_UART1
-       peripheral_request(P_UART1_TX, DRIVER_NAME);
-       peripheral_request(P_UART1_RX, DRIVER_NAME);
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       if (uart->cts_pin >= 0) {
-               gpio_request(uart->cts_pin, DRIVER_NAME);
-               gpio_direction_input(uart->cts_pin);
-       }
-
-       if (uart->rts_pin >= 0) {
-               gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_output(uart->rts_pin, 0);
-       }
-#endif
-}
index 5f517f53b0fd8d17fb8f9ab104269ffa51290f09..a3789d7ccf8c233c4fc182be215ba7585742c7c8 100644 (file)
@@ -53,9 +53,9 @@
 #define UART_SET_DLAB(uart)     do { UART_PUT_LCR(uart, UART_GET_LCR(uart) | DLAB); SSYNC(); } while (0)
 #define UART_CLEAR_DLAB(uart)   do { UART_PUT_LCR(uart, UART_GET_LCR(uart) & ~DLAB); SSYNC(); } while (0)
 
-#define UART_GET_CTS(x) gpio_get_value(x->cts_pin)
-#define UART_SET_RTS(x) gpio_set_value(x->rts_pin, 1)
-#define UART_CLEAR_RTS(x) gpio_set_value(x->rts_pin, 0)
+#define UART_GET_CTS(x) (!gpio_get_value(x->cts_pin))
+#define UART_DISABLE_RTS(x) gpio_set_value(x->rts_pin, 1)
+#define UART_ENABLE_RTS(x) gpio_set_value(x->rts_pin, 0)
 #define UART_ENABLE_INTS(x, v) UART_PUT_IER(x, v)
 #define UART_DISABLE_INTS(x) UART_PUT_IER(x, 0)
 
@@ -74,6 +74,7 @@
 struct bfin_serial_port {
         struct uart_port        port;
         unsigned int            old_status;
+       int                     status_irq;
        unsigned int lsr;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        int                     tx_done;
@@ -116,6 +117,7 @@ static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart)
 struct bfin_serial_res {
        unsigned long   uart_base_addr;
        int             uart_irq;
+       int             uart_status_irq;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        unsigned int    uart_tx_dma_channel;
        unsigned int    uart_rx_dma_channel;
@@ -130,6 +132,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC00400,
        IRQ_UART_RX,
+       IRQ_UART_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART_TX,
        CH_UART_RX,
@@ -142,23 +145,3 @@ struct bfin_serial_res bfin_serial_resource[] = {
 };
 
 #define DRIVER_NAME "bfin-uart"
-
-static void bfin_serial_hw_init(struct bfin_serial_port *uart)
-{
-
-#ifdef CONFIG_SERIAL_BFIN_UART0
-       peripheral_request(P_UART0_TX, DRIVER_NAME);
-       peripheral_request(P_UART0_RX, DRIVER_NAME);
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       if (uart->cts_pin >= 0) {
-               gpio_request(uart->cts_pin, DRIVER_NAME);
-               gpio_direction_input(uart->cts_pin);
-       }
-       if (uart->rts_pin >= 0) {
-               gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_output(uart->rts_pin, 0);
-       }
-#endif
-}
index 9e34700844a294278921a36fe7ca411fd9c3a61f..b86662fb9de76fad4cf16b0ee3a46e5d81db4d32 100644 (file)
@@ -53,9 +53,9 @@
 #define UART_SET_DLAB(uart)     do { UART_PUT_LCR(uart, UART_GET_LCR(uart) | DLAB); SSYNC(); } while (0)
 #define UART_CLEAR_DLAB(uart)   do { UART_PUT_LCR(uart, UART_GET_LCR(uart) & ~DLAB); SSYNC(); } while (0)
 
-#define UART_GET_CTS(x) gpio_get_value(x->cts_pin)
-#define UART_SET_RTS(x) gpio_set_value(x->rts_pin, 1)
-#define UART_CLEAR_RTS(x) gpio_set_value(x->rts_pin, 0)
+#define UART_GET_CTS(x) (!gpio_get_value(x->cts_pin))
+#define UART_DISABLE_RTS(x) gpio_set_value(x->rts_pin, 1)
+#define UART_ENABLE_RTS(x) gpio_set_value(x->rts_pin, 0)
 #define UART_ENABLE_INTS(x, v) UART_PUT_IER(x, v)
 #define UART_DISABLE_INTS(x) UART_PUT_IER(x, 0)
 
@@ -87,6 +87,7 @@
 struct bfin_serial_port {
         struct uart_port        port;
         unsigned int            old_status;
+       int                     status_irq;
        unsigned int lsr;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        int                     tx_done;
@@ -99,7 +100,6 @@ struct bfin_serial_port {
        struct work_struct      tx_dma_workqueue;
 #endif
 #ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       struct timer_list       cts_timer;
        int             cts_pin;
        int             rts_pin;
 #endif
@@ -125,6 +125,7 @@ static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart)
 struct bfin_serial_res {
        unsigned long   uart_base_addr;
        int             uart_irq;
+       int             uart_status_irq;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        unsigned int    uart_tx_dma_channel;
        unsigned int    uart_rx_dma_channel;
@@ -140,6 +141,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC00400,
        IRQ_UART0_RX,
+       IRQ_UART0_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART0_TX,
        CH_UART0_RX,
@@ -154,6 +156,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC02000,
        IRQ_UART1_RX,
+       IRQ_UART1_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART1_TX,
        CH_UART1_RX,
@@ -167,29 +170,3 @@ struct bfin_serial_res bfin_serial_resource[] = {
 };
 
 #define DRIVER_NAME "bfin-uart"
-
-static void bfin_serial_hw_init(struct bfin_serial_port *uart)
-{
-
-#ifdef CONFIG_SERIAL_BFIN_UART0
-       peripheral_request(P_UART0_TX, DRIVER_NAME);
-       peripheral_request(P_UART0_RX, DRIVER_NAME);
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_UART1
-       peripheral_request(P_UART1_TX, DRIVER_NAME);
-       peripheral_request(P_UART1_RX, DRIVER_NAME);
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       if (uart->cts_pin >= 0) {
-               gpio_request(uart->cts_pin, DRIVER_NAME);
-               gpio_direction_input(uart->cts_pin);
-       }
-
-       if (uart->rts_pin >= 0) {
-               gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_output(uart->rts_pin, 0);
-       }
-#endif
-}
index 3c2811ebecddd520fec44339c7bba04460ae52ca..c536551eb4b8ff64dd35194d9270e32014aa8704 100644 (file)
@@ -53,9 +53,9 @@
 #define UART_SET_DLAB(uart)     do { UART_PUT_LCR(uart, UART_GET_LCR(uart) | DLAB); SSYNC(); } while (0)
 #define UART_CLEAR_DLAB(uart)   do { UART_PUT_LCR(uart, UART_GET_LCR(uart) & ~DLAB); SSYNC(); } while (0)
 
-#define UART_GET_CTS(x) gpio_get_value(x->cts_pin)
-#define UART_SET_RTS(x) gpio_set_value(x->rts_pin, 1)
-#define UART_CLEAR_RTS(x) gpio_set_value(x->rts_pin, 0)
+#define UART_GET_CTS(x) (!gpio_get_value(x->cts_pin))
+#define UART_DISABLE_RTS(x) gpio_set_value(x->rts_pin, 1)
+#define UART_ENABLE_RTS(x) gpio_set_value(x->rts_pin, 0)
 #define UART_ENABLE_INTS(x, v) UART_PUT_IER(x, v)
 #define UART_DISABLE_INTS(x) UART_PUT_IER(x, 0)
 
@@ -87,6 +87,7 @@
 struct bfin_serial_port {
        struct uart_port        port;
        unsigned int            old_status;
+       int                     status_irq;
        unsigned int lsr;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        int                     tx_done;
@@ -125,6 +126,7 @@ static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart)
 struct bfin_serial_res {
        unsigned long   uart_base_addr;
        int             uart_irq;
+       int             uart_status_irq;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        unsigned int    uart_tx_dma_channel;
        unsigned int    uart_rx_dma_channel;
@@ -140,6 +142,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC00400,
        IRQ_UART0_RX,
+       IRQ_UART0_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART0_TX,
        CH_UART0_RX,
@@ -154,6 +157,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC02000,
        IRQ_UART1_RX,
+       IRQ_UART1_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART1_TX,
        CH_UART1_RX,
index c05e79cba257b0870629ed815bca9efe752bc809..2d1b5fa3cca04dece182ba61115674b3d868cb4f 100644 (file)
 #define UART_PUT_CHAR(uart,v)   bfin_write16(((uart)->port.membase + OFFSET_THR),v)
 #define UART_PUT_DLL(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_DLL),v)
 #define UART_SET_IER(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_IER_SET),v)
-#define UART_CLEAR_IER(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_IER_CLEAR),v)
+#define UART_CLEAR_IER(uart,v)  bfin_write16(((uart)->port.membase + OFFSET_IER_CLEAR),v)
 #define UART_PUT_DLH(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_DLH),v)
 #define UART_PUT_LSR(uart,v)   bfin_write16(((uart)->port.membase + OFFSET_LSR),v)
 #define UART_PUT_LCR(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_LCR),v)
 #define UART_CLEAR_LSR(uart)    bfin_write16(((uart)->port.membase + OFFSET_LSR), -1)
 #define UART_PUT_GCTL(uart,v)   bfin_write16(((uart)->port.membase + OFFSET_GCTL),v)
 #define UART_PUT_MCR(uart,v)    bfin_write16(((uart)->port.membase + OFFSET_MCR),v)
+#define UART_CLEAR_SCTS(uart)   bfin_write16(((uart)->port.membase + OFFSET_MSR),SCTS)
 
 #define UART_SET_DLAB(uart)     /* MMRs not muxed on BF54x */
 #define UART_CLEAR_DLAB(uart)   /* MMRs not muxed on BF54x */
 
 #define UART_GET_CTS(x) (UART_GET_MSR(x) & CTS)
-#define UART_SET_RTS(x) (UART_PUT_MCR(x, UART_GET_MCR(x) | MRTS))
-#define UART_CLEAR_RTS(x) (UART_PUT_MCR(x, UART_GET_MCR(x) & ~MRTS))
+#define UART_DISABLE_RTS(x) UART_PUT_MCR(x, UART_GET_MCR(x) & ~(ARTS|MRTS))
+#define UART_ENABLE_RTS(x) UART_PUT_MCR(x, UART_GET_MCR(x) | MRTS | ARTS)
 #define UART_ENABLE_INTS(x, v) UART_SET_IER(x, v)
 #define UART_DISABLE_INTS(x) UART_CLEAR_IER(x, 0xF)
 
-#if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART2_CTSRTS)
-# define CONFIG_SERIAL_BFIN_CTSRTS
-
-# ifndef CONFIG_UART0_CTS_PIN
-#  define CONFIG_UART0_CTS_PIN -1
-# endif
-
-# ifndef CONFIG_UART0_RTS_PIN
-#  define CONFIG_UART0_RTS_PIN -1
-# endif
-
-# ifndef CONFIG_UART2_CTS_PIN
-#  define CONFIG_UART2_CTS_PIN -1
-# endif
-
-# ifndef CONFIG_UART2_RTS_PIN
-#  define CONFIG_UART2_RTS_PIN -1
-# endif
+#if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) || \
+       defined(CONFIG_BFIN_UART2_CTSRTS) || defined(CONFIG_BFIN_UART3_CTSRTS)
+# define CONFIG_SERIAL_BFIN_HARD_CTSRTS
 #endif
 
 #define BFIN_UART_TX_FIFO_SIZE 2
@@ -91,6 +77,7 @@
 struct bfin_serial_port {
         struct uart_port        port;
         unsigned int            old_status;
+       int                     status_irq;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        int                     tx_done;
        int                     tx_count;
@@ -101,23 +88,24 @@ struct bfin_serial_port {
        unsigned int            rx_dma_channel;
        struct work_struct      tx_dma_workqueue;
 #endif
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       struct timer_list       cts_timer;
-       int             cts_pin;
-       int             rts_pin;
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       int                     scts;
+       int                     cts_pin;
+       int                     rts_pin;
 #endif
 };
 
 struct bfin_serial_res {
        unsigned long   uart_base_addr;
        int             uart_irq;
+       int             uart_status_irq;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        unsigned int    uart_tx_dma_channel;
        unsigned int    uart_rx_dma_channel;
 #endif
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       int     uart_cts_pin;
-       int     uart_rts_pin;
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       int             uart_cts_pin;
+       int             uart_rts_pin;
 #endif
 };
 
@@ -126,13 +114,14 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC00400,
        IRQ_UART0_RX,
+       IRQ_UART0_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART0_TX,
        CH_UART0_RX,
 #endif
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       CONFIG_UART0_CTS_PIN,
-       CONFIG_UART0_RTS_PIN,
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       0,
+       0,
 #endif
        },
 #endif
@@ -140,13 +129,14 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC02000,
        IRQ_UART1_RX,
+       IRQ_UART1_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART1_TX,
        CH_UART1_RX,
 #endif
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       0,
-       0,
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       GPIO_PE10,
+       GPIO_PE9,
 #endif
        },
 #endif
@@ -154,13 +144,14 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC02100,
        IRQ_UART2_RX,
+       IRQ_UART2_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART2_TX,
        CH_UART2_RX,
 #endif
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       CONFIG_UART2_CTS_PIN,
-       CONFIG_UART2_RTS_PIN,
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       0,
+       0,
 #endif
        },
 #endif
@@ -168,61 +159,17 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC03100,
        IRQ_UART3_RX,
+       IRQ_UART3_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART3_TX,
        CH_UART3_RX,
 #endif
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       0,
-       0,
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       GPIO_PB3,
+       GPIO_PB2,
 #endif
        },
 #endif
 };
 
 #define DRIVER_NAME "bfin-uart"
-
-static void bfin_serial_hw_init(struct bfin_serial_port *uart)
-{
-#ifdef CONFIG_SERIAL_BFIN_UART0
-       peripheral_request(P_UART0_TX, DRIVER_NAME);
-       peripheral_request(P_UART0_RX, DRIVER_NAME);
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_UART1
-       peripheral_request(P_UART1_TX, DRIVER_NAME);
-       peripheral_request(P_UART1_RX, DRIVER_NAME);
-
-#ifdef CONFIG_BFIN_UART1_CTSRTS
-       peripheral_request(P_UART1_RTS, DRIVER_NAME);
-       peripheral_request(P_UART1_CTS, DRIVER_NAME);
-#endif
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_UART2
-       peripheral_request(P_UART2_TX, DRIVER_NAME);
-       peripheral_request(P_UART2_RX, DRIVER_NAME);
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_UART3
-       peripheral_request(P_UART3_TX, DRIVER_NAME);
-       peripheral_request(P_UART3_RX, DRIVER_NAME);
-
-#ifdef CONFIG_BFIN_UART3_CTSRTS
-       peripheral_request(P_UART3_RTS, DRIVER_NAME);
-       peripheral_request(P_UART3_CTS, DRIVER_NAME);
-#endif
-#endif
-       SSYNC();
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       if (uart->cts_pin >= 0) {
-               gpio_request(uart->cts_pin, DRIVER_NAME);
-               gpio_direction_input(uart->cts_pin);
-       }
-
-       if (uart->rts_pin >= 0) {
-               gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_output(uart->rts_pin, 0);
-       }
-#endif
-}
index ca8c5f6452093c7c8d9247906e35a8b1baf4fb9b..a1b50878553fbfc462e63a869a5ab7be1c190722 100644 (file)
@@ -53,9 +53,9 @@
 #define UART_SET_DLAB(uart)     do { UART_PUT_LCR(uart, UART_GET_LCR(uart) | DLAB); SSYNC(); } while (0)
 #define UART_CLEAR_DLAB(uart)   do { UART_PUT_LCR(uart, UART_GET_LCR(uart) & ~DLAB); SSYNC(); } while (0)
 
-#define UART_GET_CTS(x) gpio_get_value(x->cts_pin)
-#define UART_SET_RTS(x) gpio_set_value(x->rts_pin, 1)
-#define UART_CLEAR_RTS(x) gpio_set_value(x->rts_pin, 0)
+#define UART_GET_CTS(x) (!gpio_get_value(x->cts_pin))
+#define UART_DISABLE_RTS(x) gpio_set_value(x->rts_pin, 1)
+#define UART_ENABLE_RTS(x) gpio_set_value(x->rts_pin, 0)
 #define UART_ENABLE_INTS(x, v) UART_PUT_IER(x, v)
 #define UART_DISABLE_INTS(x) UART_PUT_IER(x, 0)
 
@@ -74,6 +74,7 @@
 struct bfin_serial_port {
         struct uart_port        port;
         unsigned int            old_status;
+       int                     status_irq;
        unsigned int lsr;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        int                     tx_done;
@@ -116,6 +117,7 @@ static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart)
 struct bfin_serial_res {
        unsigned long   uart_base_addr;
        int             uart_irq;
+       int             uart_status_irq;
 #ifdef CONFIG_SERIAL_BFIN_DMA
        unsigned int    uart_tx_dma_channel;
        unsigned int    uart_rx_dma_channel;
@@ -130,6 +132,7 @@ struct bfin_serial_res bfin_serial_resource[] = {
        {
        0xFFC00400,
        IRQ_UART_RX,
+       IRQ_UART_ERROR,
 #ifdef CONFIG_SERIAL_BFIN_DMA
        CH_UART_TX,
        CH_UART_RX,
@@ -142,23 +145,3 @@ struct bfin_serial_res bfin_serial_resource[] = {
 };
 
 #define DRIVER_NAME "bfin-uart"
-
-static void bfin_serial_hw_init(struct bfin_serial_port *uart)
-{
-
-#ifdef CONFIG_SERIAL_BFIN_UART0
-       peripheral_request(P_UART0_TX, DRIVER_NAME);
-       peripheral_request(P_UART0_RX, DRIVER_NAME);
-#endif
-
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       if (uart->cts_pin >= 0) {
-               gpio_request(uart->cts_pin, DRIVER_NAME);
-               gpio_direction_input(uart->cts_pin);
-       }
-       if (uart->rts_pin >= 0) {
-               gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_output(uart->rts_pin, 0);
-       }
-#endif
-}
index 4f4e52531fa0bc7a07433caace232cdd4f053145..35bbc181598a710477c1e81fc099d3662ca13d99 100644 (file)
@@ -74,8 +74,9 @@
 #define TIOCSHAYESESP   0x545F  /* Set Hayes ESP configuration */
 #define FIOQSIZE       0x5460
 
-#define TIOCSERSETRS485 0x5461  /* enable rs-485 */
-#define TIOCSERWRRS485  0x5462  /* write rs-485 */
+#define TIOCSERSETRS485        0x5461  /* enable rs-485 (deprecated) */
+#define TIOCSERWRRS485 0x5462  /* write rs-485 */
+#define TIOCSRS485     0x5463  /* enable rs-485 */
 
 /* Used for packet mode */
 #define TIOCPKT_DATA            0
index c331c51b0c2b4cec0ac59df248220b32e351c7ce..ad40f9fbcb8ae7459a43985bc3b9748f30c19022 100644 (file)
@@ -1,15 +1,13 @@
 /* RS-485 structures */
 
-/* RS-485 support */
-/* Used with ioctl() TIOCSERSETRS485 */
+/* Used with ioctl() TIOCSERSETRS485 for backward compatibility!
+ * XXX: Do not use it for new code!
+ */
 struct rs485_control {
         unsigned short rts_on_send;
         unsigned short rts_after_sent;
         unsigned long delay_rts_before_send;
         unsigned short enabled;
-#ifdef __KERNEL__
-        int disable_serial_loopback;
-#endif
 };
 
 /* Used with ioctl() TIOCSERWRRS485 */
index b0124e6c2e416d7273fe274a9b36d7d7fb65d093..1265109f4ce3b485ac68623a889cd5a5621c079b 100644 (file)
@@ -4,6 +4,7 @@
 #include <asm/termbits.h>
 #include <asm/ioctls.h>
 #include <asm/rs485.h>
+#include <linux/serial.h>
 
 struct winsize {
        unsigned short ws_row;
index 07643482cad2699c256524d24bf344461516f954..7f392bc651a358ad062dff38233f4f204d0dc4aa 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/linkage.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
-#include <asm/highmem.h>
 #include <asm/spr-regs.h>
 
        .section        .text.tlbmiss
index e4cb443bb988feffbf93840dd023e319d205e7ca..eb987386f69138fe2eb2e829735b25784a763ecf 100644 (file)
@@ -37,7 +37,7 @@ int force_iommu __read_mostly;
    to i386. */
 struct device fallback_dev = {
        .init_name = "fallback device",
-       .coherent_dma_mask = DMA_32BIT_MASK,
+       .coherent_dma_mask = DMA_BIT_MASK(32),
        .dma_mask = &fallback_dev.coherent_dma_mask,
 };
 
@@ -75,7 +75,7 @@ int iommu_dma_supported(struct device *dev, u64 mask)
        /* Copied from i386. Doesn't make much sense, because it will
           only work for pci_alloc_coherent.
           The caller just has to use GFP_DMA in this case. */
-       if (mask < DMA_24BIT_MASK)
+       if (mask < DMA_BIT_MASK(24))
                return 0;
 
        /* Tell the device to use SAC when IOMMU force is on.  This
@@ -90,7 +90,7 @@ int iommu_dma_supported(struct device *dev, u64 mask)
           SAC for these.  Assume all masks <= 40 bits are of this
           type. Normally this doesn't make any difference, but gives
           more gentle handling of IOMMU overflow. */
-       if (iommu_sac_force && (mask >= DMA_40BIT_MASK)) {
+       if (iommu_sac_force && (mask >= DMA_BIT_MASK(40))) {
                dev_info(dev, "Force SAC with mask %lx\n", mask);
                return 0;
        }
index 8c130e8f00e1d3aee8052eb3141b8e33eb3ec3bd..d876423e4e755465d8249f4aeb01610490f62cff 100644 (file)
@@ -349,7 +349,7 @@ static int sn_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
 
 u64 sn_dma_get_required_mask(struct device *dev)
 {
-       return DMA_64BIT_MASK;
+       return DMA_BIT_MASK(64);
 }
 EXPORT_SYMBOL_GPL(sn_dma_get_required_mask);
 
index 5c76c6448e04c41d9c82e5e3eec4544f5f218f02..117f99f70649547f137a4442021444b2e8ef73fd 100644 (file)
@@ -80,14 +80,14 @@ static struct resource au1xxx_usb_ohci_resources[] = {
 };
 
 /* The dmamask must be set for OHCI to work */
-static u64 ohci_dmamask = DMA_32BIT_MASK;
+static u64 ohci_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device au1xxx_usb_ohci_device = {
        .name           = "au1xxx-ohci",
        .id             = 0,
        .dev = {
                .dma_mask               = &ohci_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(au1xxx_usb_ohci_resources),
        .resource       = au1xxx_usb_ohci_resources,
@@ -109,14 +109,14 @@ static struct resource au1100_lcd_resources[] = {
        }
 };
 
-static u64 au1100_lcd_dmamask = DMA_32BIT_MASK;
+static u64 au1100_lcd_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device au1100_lcd_device = {
        .name           = "au1100-lcd",
        .id             = 0,
        .dev = {
                .dma_mask               = &au1100_lcd_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(au1100_lcd_resources),
        .resource       = au1100_lcd_resources,
@@ -138,14 +138,14 @@ static struct resource au1xxx_usb_ehci_resources[] = {
        },
 };
 
-static u64 ehci_dmamask = DMA_32BIT_MASK;
+static u64 ehci_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device au1xxx_usb_ehci_device = {
        .name           = "au1xxx-ehci",
        .id             = 0,
        .dev = {
                .dma_mask               = &ehci_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(au1xxx_usb_ehci_resources),
        .resource       = au1xxx_usb_ehci_resources,
@@ -165,14 +165,14 @@ static struct resource au1xxx_usb_gdt_resources[] = {
        },
 };
 
-static u64 udc_dmamask = DMA_32BIT_MASK;
+static u64 udc_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device au1xxx_usb_gdt_device = {
        .name           = "au1xxx-udc",
        .id             = 0,
        .dev = {
                .dma_mask               = &udc_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(au1xxx_usb_gdt_resources),
        .resource       = au1xxx_usb_gdt_resources,
@@ -192,14 +192,14 @@ static struct resource au1xxx_usb_otg_resources[] = {
        },
 };
 
-static u64 uoc_dmamask = DMA_32BIT_MASK;
+static u64 uoc_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device au1xxx_usb_otg_device = {
        .name           = "au1xxx-uoc",
        .id             = 0,
        .dev = {
                .dma_mask               = &uoc_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(au1xxx_usb_otg_resources),
        .resource       = au1xxx_usb_otg_resources,
@@ -218,20 +218,20 @@ static struct resource au1200_lcd_resources[] = {
        }
 };
 
-static u64 au1200_lcd_dmamask = DMA_32BIT_MASK;
+static u64 au1200_lcd_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device au1200_lcd_device = {
        .name           = "au1200-lcd",
        .id             = 0,
        .dev = {
                .dma_mask               = &au1200_lcd_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(au1200_lcd_resources),
        .resource       = au1200_lcd_resources,
 };
 
-static u64 au1xxx_mmc_dmamask =  DMA_32BIT_MASK;
+static u64 au1xxx_mmc_dmamask =  DMA_BIT_MASK(32);
 
 extern struct au1xmmc_platform_data au1xmmc_platdata[2];
 
@@ -263,7 +263,7 @@ static struct platform_device au1200_mmc0_device = {
        .id = 0,
        .dev = {
                .dma_mask               = &au1xxx_mmc_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
                .platform_data          = &au1xmmc_platdata[0],
        },
        .num_resources  = ARRAY_SIZE(au1200_mmc0_resources),
@@ -299,7 +299,7 @@ static struct platform_device au1200_mmc1_device = {
        .id = 1,
        .dev = {
                .dma_mask               = &au1xxx_mmc_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
                .platform_data          = &au1xmmc_platdata[1],
        },
        .num_resources  = ARRAY_SIZE(au1200_mmc1_resources),
index 0d68e1985ffd15d2ca62b67280600fd4c088b150..b93dff4a6789ca4e5c054a42302e640b619e9f69 100644 (file)
@@ -119,14 +119,14 @@ static struct resource ide_resources[] = {
        }
 };
 
-static u64 ide_dmamask = DMA_32BIT_MASK;
+static u64 ide_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device ide_device = {
        .name           = "au1200-ide",
        .id             = 0,
        .dev = {
                .dma_mask               = &ide_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(ide_resources),
        .resource       = ide_resources
diff --git a/arch/mips/include/asm/txx9/ndfmc.h b/arch/mips/include/asm/txx9/ndfmc.h
new file mode 100644 (file)
index 0000000..fa67f3d
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ *
+ * (C) Copyright TOSHIBA CORPORATION 2007
+ */
+#ifndef __ASM_TXX9_NDFMC_H
+#define __ASM_TXX9_NDFMC_H
+
+#define NDFMC_PLAT_FLAG_USE_BSPRT      0x01
+#define NDFMC_PLAT_FLAG_NO_RSTR                0x02
+#define NDFMC_PLAT_FLAG_HOLDADD                0x04
+#define NDFMC_PLAT_FLAG_DUMMYWRITE     0x08
+
+struct txx9ndfmc_platform_data {
+       unsigned int shift;
+       unsigned int gbus_clock;
+       unsigned int hold;              /* hold time in nanosecond */
+       unsigned int spw;               /* strobe pulse width in nanosecond */
+       unsigned int flags;
+       unsigned char ch_mask;          /* available channel bitmask */
+       unsigned char wp_mask;          /* write-protect bitmask */
+       unsigned char wide_mask;        /* 16bit-nand bitmask */
+};
+
+void txx9_ndfmc_init(unsigned long baseaddr,
+                    const struct txx9ndfmc_platform_data *plat_data);
+
+#endif /* __ASM_TXX9_NDFMC_H */
index 1acf428c0b4fef83ef04f0aa5ab6af3227850fba..e517899794a8c6780b866d6b60ce24ee2e7e8669 100644 (file)
 void rbtx4939_prom_init(void);
 void rbtx4939_irq_setup(void);
 
+struct mtd_partition;
+struct map_info;
+struct rbtx4939_flash_data {
+       unsigned int width;
+       unsigned int nr_parts;
+       struct mtd_partition *parts;
+       void (*map_init)(struct map_info *map);
+};
+
 #endif /* __ASM_TXX9_RBTX4939_H */
index 0b068154054cb897c628651b74b7d58c84b0e31a..cd8bc2021755e8be084c2170371f3eaedf9d9fff 100644 (file)
@@ -291,6 +291,7 @@ int tx4938_pcic1_map_irq(const struct pci_dev *dev, u8 slot);
 void tx4938_setup_pcierr_irq(void);
 void tx4938_irq_init(void);
 void tx4938_mtd_init(int ch);
+void tx4938_ndfmc_init(unsigned int hold, unsigned int spw);
 
 struct tx4938ide_platform_info {
        /*
index 964ef7ede2684eaff7d8f8c1ad1e5e83a7b6c651..f02c50b3abfbd205f29dbd51aa828c7f5996b165 100644 (file)
@@ -542,5 +542,7 @@ int tx4939_irq(void);
 void tx4939_mtd_init(int ch);
 void tx4939_ata_init(void);
 void tx4939_rtc_init(void);
+void tx4939_ndfmc_init(unsigned int hold, unsigned int spw,
+                      unsigned char ch_mask, unsigned char wide_mask);
 
 #endif /* __ASM_TXX9_TX4939_H */
index b1ccbcc18f783aea6697d734677493d9f9231278..01f8345a2069d0fcf129b98f1c08ddd97b055b1c 100644 (file)
@@ -42,7 +42,7 @@
 #include <irq-mapping.h>
 #include <pnx833x.h>
 
-static u64 uart_dmamask     = DMA_32BIT_MASK;
+static u64 uart_dmamask     = DMA_BIT_MASK(32);
 
 static struct resource pnx833x_uart_resources[] = {
        [0] = {
@@ -101,14 +101,14 @@ static struct platform_device pnx833x_uart_device = {
        .id             = -1,
        .dev = {
                .dma_mask               = &uart_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
                .platform_data          = pnx8xxx_ports,
        },
        .num_resources  = ARRAY_SIZE(pnx833x_uart_resources),
        .resource       = pnx833x_uart_resources,
 };
 
-static u64 ehci_dmamask     = DMA_32BIT_MASK;
+static u64 ehci_dmamask     = DMA_BIT_MASK(32);
 
 static struct resource pnx833x_usb_ehci_resources[] = {
        [0] = {
@@ -128,7 +128,7 @@ static struct platform_device pnx833x_usb_ehci_device = {
        .id             = -1,
        .dev = {
                .dma_mask               = &ehci_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(pnx833x_usb_ehci_resources),
        .resource       = pnx833x_usb_ehci_resources,
@@ -198,7 +198,7 @@ static struct platform_device pnx833x_i2c1_device = {
 };
 #endif
 
-static u64 ethernet_dmamask = DMA_32BIT_MASK;
+static u64 ethernet_dmamask = DMA_BIT_MASK(32);
 
 static struct resource pnx833x_ethernet_resources[] = {
        [0] = {
@@ -218,7 +218,7 @@ static struct platform_device pnx833x_ethernet_device = {
        .id   = -1,
        .dev  = {
                .dma_mask          = &ethernet_dmamask,
-               .coherent_dma_mask = DMA_32BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
        },
        .num_resources = ARRAY_SIZE(pnx833x_ethernet_resources),
        .resource      = pnx833x_ethernet_resources,
index 21d2955359b3d97dfaee1094e1ce9dad9cb493f6..5264cc09a27bacbe2057ca7a66e50645a3eefd04 100644 (file)
@@ -92,16 +92,16 @@ struct pnx8xxx_port pnx8xxx_ports[] = {
 };
 
 /* The dmamask must be set for OHCI to work */
-static u64 ohci_dmamask = DMA_32BIT_MASK;
+static u64 ohci_dmamask = DMA_BIT_MASK(32);
 
-static u64 uart_dmamask = DMA_32BIT_MASK;
+static u64 uart_dmamask = DMA_BIT_MASK(32);
 
 static struct platform_device pnx8550_usb_ohci_device = {
        .name           = "pnx8550-ohci",
        .id             = -1,
        .dev = {
                .dma_mask               = &ohci_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(pnx8550_usb_ohci_resources),
        .resource       = pnx8550_usb_ohci_resources,
@@ -112,7 +112,7 @@ static struct platform_device pnx8550_uart_device = {
        .id             = -1,
        .dev = {
                .dma_mask               = &uart_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
                .platform_data = pnx8xxx_ports,
        },
        .num_resources  = ARRAY_SIZE(pnx8550_uart_resources),
index f7ca4f58233168ea3a2e9fd84dfa208f2fbaa596..0ee01e359dd8aa4f0a1fcaa20d3fb0c05709cbde 100644 (file)
@@ -49,14 +49,14 @@ static struct resource msp_usbhost_resources [] = {
        },
 };
 
-static u64 msp_usbhost_dma_mask = DMA_32BIT_MASK;
+static u64 msp_usbhost_dma_mask = DMA_BIT_MASK(32);
 
 static struct platform_device msp_usbhost_device = {
        .name   = "pmcmsp-ehci",
        .id     = 0,
        .dev    = {
                .dma_mask = &msp_usbhost_dma_mask,
-               .coherent_dma_mask = DMA_32BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(msp_usbhost_resources),
        .resource       = msp_usbhost_resources,
@@ -77,14 +77,14 @@ static struct resource msp_usbdev_resources [] = {
        },
 };
 
-static u64 msp_usbdev_dma_mask = DMA_32BIT_MASK;
+static u64 msp_usbdev_dma_mask = DMA_BIT_MASK(32);
 
 static struct platform_device msp_usbdev_device = {
        .name   = "msp71xx_udc",
        .id     = 0,
        .dev    = {
                .dma_mask = &msp_usbdev_dma_mask,
-               .coherent_dma_mask = DMA_32BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(msp_usbdev_resources),
        .resource       = msp_usbdev_resources,
index a13a08b8c9ec1c24ba9292fe377083f2f70c2e43..8a266c6a3f58eb68151d9b5139f4572d378ee95d 100644 (file)
@@ -32,6 +32,7 @@
 #include <asm/txx9/generic.h>
 #include <asm/txx9/pci.h>
 #include <asm/txx9tmr.h>
+#include <asm/txx9/ndfmc.h>
 #ifdef CONFIG_CPU_TX49XX
 #include <asm/txx9/tx4938.h>
 #endif
@@ -691,6 +692,26 @@ void __init txx9_physmap_flash_init(int no, unsigned long addr,
 #endif
 }
 
+void __init txx9_ndfmc_init(unsigned long baseaddr,
+                           const struct txx9ndfmc_platform_data *pdata)
+{
+#if defined(CONFIG_MTD_NAND_TXX9NDFMC) || \
+       defined(CONFIG_MTD_NAND_TXX9NDFMC_MODULE)
+       struct resource res = {
+               .start = baseaddr,
+               .end = baseaddr + 0x1000 - 1,
+               .flags = IORESOURCE_MEM,
+       };
+       struct platform_device *pdev = platform_device_alloc("txx9ndfmc", -1);
+
+       if (!pdev ||
+           platform_device_add_resources(pdev, &res, 1) ||
+           platform_device_add_data(pdev, pdata, sizeof(*pdata)) ||
+           platform_device_add(pdev))
+               platform_device_put(pdev);
+#endif
+}
+
 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
 static DEFINE_SPINLOCK(txx9_iocled_lock);
 
index 25819ff1c3507310b0edad65559afbe14afddf63..f0844f891f0bf11ca2ea9869f96ba590417eff71 100644 (file)
@@ -23,6 +23,7 @@
 #include <asm/txx9tmr.h>
 #include <asm/txx9pio.h>
 #include <asm/txx9/generic.h>
+#include <asm/txx9/ndfmc.h>
 #include <asm/txx9/tx4938.h>
 
 static void __init tx4938_wdr_init(void)
@@ -382,6 +383,26 @@ void __init tx4938_ata_init(unsigned int irq, unsigned int shift, int tune)
                platform_device_put(pdev);
 }
 
+void __init tx4938_ndfmc_init(unsigned int hold, unsigned int spw)
+{
+       struct txx9ndfmc_platform_data plat_data = {
+               .shift = 1,
+               .gbus_clock = txx9_gbus_clock,
+               .hold = hold,
+               .spw = spw,
+               .ch_mask = 1,
+       };
+       unsigned long baseaddr = TX4938_NDFMC_REG & 0xfffffffffULL;
+
+#ifdef __BIG_ENDIAN
+       baseaddr += 4;
+#endif
+       if ((__raw_readq(&tx4938_ccfgptr->pcfg) &
+            (TX4938_PCFG_ATA_SEL|TX4938_PCFG_ISA_SEL|TX4938_PCFG_NDF_SEL)) ==
+           TX4938_PCFG_NDF_SEL)
+               txx9_ndfmc_init(baseaddr, &plat_data);
+}
+
 static void __init tx4938_stop_unused_modules(void)
 {
        __u64 pcfg, rst = 0, ckd = 0;
index 55440967b3a88ddaef9d07cef1e79263f5648d7b..7a25b573e9b07ff45bde162e5e7326e8d0ee528c 100644 (file)
@@ -27,6 +27,7 @@
 #include <asm/txx9irq.h>
 #include <asm/txx9tmr.h>
 #include <asm/txx9/generic.h>
+#include <asm/txx9/ndfmc.h>
 #include <asm/txx9/tx4939.h>
 
 static void __init tx4939_wdr_init(void)
@@ -457,6 +458,22 @@ void __init tx4939_rtc_init(void)
        platform_device_register(&rtc_dev);
 }
 
+void __init tx4939_ndfmc_init(unsigned int hold, unsigned int spw,
+                             unsigned char ch_mask, unsigned char wide_mask)
+{
+       struct txx9ndfmc_platform_data plat_data = {
+               .shift = 1,
+               .gbus_clock = txx9_gbus_clock,
+               .hold = hold,
+               .spw = spw,
+               .flags = NDFMC_PLAT_FLAG_NO_RSTR | NDFMC_PLAT_FLAG_HOLDADD |
+                        NDFMC_PLAT_FLAG_DUMMYWRITE,
+               .ch_mask = ch_mask,
+               .wide_mask = wide_mask,
+       };
+       txx9_ndfmc_init(TX4939_NDFMC_REG & 0xfffffffffULL, &plat_data);
+}
+
 static void __init tx4939_stop_unused_modules(void)
 {
        __u64 pcfg, rst = 0, ckd = 0;
index 547ff2920bf084a20aab6dcdba001840a6ad6556..65d13df8878aabaafdb260dc87ef7d34f0a87108 100644 (file)
@@ -352,6 +352,8 @@ static void __init rbtx4938_device_init(void)
        rbtx4938_ne_init();
        tx4938_wdt_init();
        rbtx4938_mtd_init();
+       /* TC58DVM82A1FT: tDH=10ns, tWP=tRP=tREADID=35ns */
+       tx4938_ndfmc_init(10, 35);
        tx4938_ata_init(RBTX4938_IRQ_IOC_ATA, 0, 1);
        txx9_iocled_init(RBTX4938_LED_ADDR - IO_BASE, -1, 8, 1, "green", NULL);
 }
index 656603b85b711964db905fa41bc8b454306a60af..011e1e332f4797a26066105bb29ccc6315816dc5 100644 (file)
@@ -16,6 +16,9 @@
 #include <linux/leds.h>
 #include <linux/interrupt.h>
 #include <linux/smc91x.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/map.h>
 #include <asm/reboot.h>
 #include <asm/txx9/generic.h>
 #include <asm/txx9/pci.h>
@@ -282,6 +285,159 @@ static void rbtx4939_7segled_putc(unsigned int pos, unsigned char val)
        __rbtx4939_7segled_putc(pos, val);
 }
 
+#if defined(CONFIG_MTD_RBTX4939) || defined(CONFIG_MTD_RBTX4939_MODULE)
+/* special mapping for boot rom */
+static unsigned long rbtx4939_flash_fixup_ofs(unsigned long ofs)
+{
+       u8 bdipsw = readb(rbtx4939_bdipsw_addr) & 0x0f;
+       unsigned char shift;
+
+       if (bdipsw & 8) {
+               /* BOOT Mode: USER ROM1 / USER ROM2 */
+               shift = bdipsw & 3;
+               /* rotate A[23:22] */
+               return (ofs & ~0xc00000) | ((((ofs >> 22) + shift) & 3) << 22);
+       }
+#ifdef __BIG_ENDIAN
+       if (bdipsw == 0)
+               /* BOOT Mode: Monitor ROM */
+               ofs ^= 0x400000;        /* swap A[22] */
+#endif
+       return ofs;
+}
+
+static map_word rbtx4939_flash_read16(struct map_info *map, unsigned long ofs)
+{
+       map_word r;
+
+       ofs = rbtx4939_flash_fixup_ofs(ofs);
+       r.x[0] = __raw_readw(map->virt + ofs);
+       return r;
+}
+
+static void rbtx4939_flash_write16(struct map_info *map, const map_word datum,
+                                  unsigned long ofs)
+{
+       ofs = rbtx4939_flash_fixup_ofs(ofs);
+       __raw_writew(datum.x[0], map->virt + ofs);
+       mb();   /* see inline_map_write() in mtd/map.h */
+}
+
+static void rbtx4939_flash_copy_from(struct map_info *map, void *to,
+                                    unsigned long from, ssize_t len)
+{
+       u8 bdipsw = readb(rbtx4939_bdipsw_addr) & 0x0f;
+       unsigned char shift;
+       ssize_t curlen;
+
+       from += (unsigned long)map->virt;
+       if (bdipsw & 8) {
+               /* BOOT Mode: USER ROM1 / USER ROM2 */
+               shift = bdipsw & 3;
+               while (len) {
+                       curlen = min_t(unsigned long, len,
+                                    0x400000 - (from & (0x400000 - 1)));
+                       memcpy(to,
+                              (void *)((from & ~0xc00000) |
+                                       ((((from >> 22) + shift) & 3) << 22)),
+                              curlen);
+                       len -= curlen;
+                       from += curlen;
+                       to += curlen;
+               }
+               return;
+       }
+#ifdef __BIG_ENDIAN
+       if (bdipsw == 0) {
+               /* BOOT Mode: Monitor ROM */
+               while (len) {
+                       curlen = min_t(unsigned long, len,
+                                    0x400000 - (from & (0x400000 - 1)));
+                       memcpy(to, (void *)(from ^ 0x400000), curlen);
+                       len -= curlen;
+                       from += curlen;
+                       to += curlen;
+               }
+               return;
+       }
+#endif
+       memcpy(to, (void *)from, len);
+}
+
+static void rbtx4939_flash_map_init(struct map_info *map)
+{
+       map->read = rbtx4939_flash_read16;
+       map->write = rbtx4939_flash_write16;
+       map->copy_from = rbtx4939_flash_copy_from;
+}
+
+static void __init rbtx4939_mtd_init(void)
+{
+       static struct {
+               struct platform_device dev;
+               struct resource res;
+               struct rbtx4939_flash_data data;
+       } pdevs[4];
+       int i;
+       static char names[4][8];
+       static struct mtd_partition parts[4];
+       struct rbtx4939_flash_data *boot_pdata = &pdevs[0].data;
+       u8 bdipsw = readb(rbtx4939_bdipsw_addr) & 0x0f;
+
+       if (bdipsw & 8) {
+               /* BOOT Mode: USER ROM1 / USER ROM2 */
+               boot_pdata->nr_parts = 4;
+               for (i = 0; i < boot_pdata->nr_parts; i++) {
+                       sprintf(names[i], "img%d", 4 - i);
+                       parts[i].name = names[i];
+                       parts[i].size = 0x400000;
+                       parts[i].offset = MTDPART_OFS_NXTBLK;
+               }
+       } else if (bdipsw == 0) {
+               /* BOOT Mode: Monitor ROM */
+               boot_pdata->nr_parts = 2;
+               strcpy(names[0], "big");
+               strcpy(names[1], "little");
+               for (i = 0; i < boot_pdata->nr_parts; i++) {
+                       parts[i].name = names[i];
+                       parts[i].size = 0x400000;
+                       parts[i].offset = MTDPART_OFS_NXTBLK;
+               }
+       } else {
+               /* BOOT Mode: ROM Emulator */
+               boot_pdata->nr_parts = 2;
+               parts[0].name = "boot";
+               parts[0].offset = 0xc00000;
+               parts[0].size = 0x400000;
+               parts[1].name = "user";
+               parts[1].offset = 0;
+               parts[1].size = 0xc00000;
+       }
+       boot_pdata->parts = parts;
+       boot_pdata->map_init = rbtx4939_flash_map_init;
+
+       for (i = 0; i < ARRAY_SIZE(pdevs); i++) {
+               struct resource *r = &pdevs[i].res;
+               struct platform_device *dev = &pdevs[i].dev;
+
+               r->start = 0x1f000000 - i * 0x1000000;
+               r->end = r->start + 0x1000000 - 1;
+               r->flags = IORESOURCE_MEM;
+               pdevs[i].data.width = 2;
+               dev->num_resources = 1;
+               dev->resource = r;
+               dev->id = i;
+               dev->name = "rbtx4939-flash";
+               dev->dev.platform_data = &pdevs[i].data;
+               platform_device_register(dev);
+       }
+}
+#else
+static void __init rbtx4939_mtd_init(void)
+{
+}
+#endif
+
 static void __init rbtx4939_arch_init(void)
 {
        rbtx4939_pci_setup();
@@ -333,6 +489,11 @@ static void __init rbtx4939_device_init(void)
            platform_device_add_data(pdev, &smc_pdata, sizeof(smc_pdata)) ||
            platform_device_add(pdev))
                platform_device_put(pdev);
+       rbtx4939_mtd_init();
+       /* TC58DVM82A1FT: tDH=10ns, tWP=tRP=tREADID=35ns */
+       tx4939_ndfmc_init(10, 35,
+                         (1 << 1) | (1 << 2),
+                         (1 << 2)); /* ch1:8bit, ch2:16bit */
        rbtx4939_led_setup();
        tx4939_wdt_init();
        tx4939_ata_init();
index 9e08d8a69fdf48a78cc84c671815c9c1356ca3db..5b50e1ac61794ea71a2c76298e3ec7ac819a2cab 100644 (file)
@@ -316,7 +316,7 @@ config ARCH_ENABLE_MEMORY_HOTREMOVE
 
 config KEXEC
        bool "kexec system call (EXPERIMENTAL)"
-       depends on BOOK3S && EXPERIMENTAL
+       depends on PPC_BOOK3S && EXPERIMENTAL
        help
          kexec is a system call that implements the ability to shutdown your
          current kernel, and to start another kernel.  It is like a reboot
@@ -775,6 +775,7 @@ config LOWMEM_CAM_NUM_BOOL
          Say N here unless you know what you are doing.
 
 config LOWMEM_CAM_NUM
+       depends on FSL_BOOKE
        int "Number of CAMs to use to map low memory" if LOWMEM_CAM_NUM_BOOL
        default 3
 
index 308fe7c29deaf662379baa3e1106a1b82b045cea..c9cfd374bffb327ce8be53dadcd48d39935be113 100644 (file)
                bus-frequency = <0>;                            /* Fixed by bootwrapper */
 
                memory-controller@2000 {
-                       compatible = "fsl,8540-memory-controller";
+                       compatible = "fsl,mpc8540-memory-controller";
                        reg = <0x2000 0x1000>;
                        interrupt-parent = <&mpic>;
                        interrupts = <0x12 0x2>;
                };
 
                L2: l2-cache-controller@20000 {
-                       compatible = "fsl,8540-l2-cache-controller";
+                       compatible = "fsl,mpc8540-l2-cache-controller";
                        reg = <0x20000 0x1000>;
                        cache-line-size = <0x20>;               /* 32 bytes */
                        cache-size = <0x40000>;                 /* L2, 256K */
index b2d61091b36daca5c5ee20959051faba9420fe51..0bb6693767437bcbe8fe66e96fb16abbc07b8034 100644 (file)
        #address-cells = <1>;
        #size-cells = <1>;
 
+       aliases {
+               ethernet0 = &enet0;
+               ethernet1 = &enet1;
+               serial0 = &serial0;
+               serial1 = &serial1;
+               pci0 = &pci0;
+       };
+
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
@@ -45,7 +53,7 @@
                #size-cells = <1>;
                reg = <0xf0010100 0x60>;
 
-               ranges = <0x0 0x0 0xfe000000 0x800000
+               ranges = <0x0 0x0 0xff800000 0x800000
                          0x1 0x0 0xf4500000 0x8000
                          0x8 0x0 0xf8200000 0x8000>;
 
@@ -71,7 +79,7 @@
                };
        };
 
-       pci@f0010800 {
+       pci0: pci@f0010800 {
                device_type = "pci";
                reg = <0xf0010800 0x10c 0xf00101ac 0x8 0xf00101c4 0x8>;
                compatible = "fsl,mpc8280-pci", "fsl,pq2-pci";
                                reg = <0x119f0 0x10 0x115f0 0x10>;
                        };
 
-                       serial@11a00 {
+                       serial0: serial@11a00 {
                                device_type = "serial";
                                compatible = "fsl,mpc8280-scc-uart",
                                             "fsl,cpm2-scc-uart";
                                fsl,cpm-command = <0x800000>;
                        };
 
-                       serial@11a20 {
+                       serial1: serial@11a20 {
                                device_type = "serial";
                                compatible = "fsl,mpc8280-scc-uart",
                                             "fsl,cpm2-scc-uart";
                                fsl,cpm-command = <0x4a00000>;
                        };
 
-                       ethernet@11320 {
+                       enet0: ethernet@11320 {
                                device_type = "network";
                                compatible = "fsl,mpc8280-fcc-enet",
                                             "fsl,cpm2-fcc-enet";
                                fsl,cpm-command = <0x16200300>;
                        };
 
-                       ethernet@11340 {
+                       enet1: ethernet@11340 {
                                device_type = "network";
                                compatible = "fsl,mpc8280-fcc-enet",
                                             "fsl,cpm2-fcc-enet";
index 9c5079fec4f23b3750e671d2b39bf34e3a069d8a..b1f1416ac9988d254be577f200fc3ef59cb5abd6 100644 (file)
                compatible = "simple-bus";
 
                memory-controller@2000 {
-                       compatible = "fsl,8548-memory-controller";
+                       compatible = "fsl,mpc8548-memory-controller";
                        reg = <0x2000 0x1000>;
                        interrupt-parent = <&mpic>;
                        interrupts = <0x12 0x2>;
                };
 
                L2: l2-cache-controller@20000 {
-                       compatible = "fsl,8548-l2-cache-controller";
+                       compatible = "fsl,mpc8548-l2-cache-controller";
                        reg = <0x20000 0x1000>;
                        cache-line-size = <0x20>;       // 32 bytes
                        cache-size = <0x80000>; // L2, 512K
index b772405a9a0a2f70ef0821d7474ce9b9312c4e4d..c4564b81e47305e478aa6b6591118cd4712616f9 100644 (file)
                clock-frequency = <0>;
 
                memory-controller@2000 {
-                       compatible = "fsl,8560-memory-controller";
+                       compatible = "fsl,mpc8560-memory-controller";
                        reg = <0x2000 0x1000>;
                        interrupt-parent = <&mpic>;
                        interrupts = <0x12 0x2>;
                };
 
                L2: l2-cache-controller@20000 {
-                       compatible = "fsl,8560-l2-cache-controller";
+                       compatible = "fsl,mpc8560-l2-cache-controller";
                        reg = <0x20000 0x1000>;
                        cache-line-size = <0x20>;       // 32 bytes
                        cache-size = <0x40000>;         // L2, 256K
index b8d0fc6f00424aef2ef1ab26f48979d3a00f7e53..7a6ae75a1e573a14afac948038fa469a662b012f 100644 (file)
@@ -52,6 +52,7 @@
        soc8544@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
+               device_type = "soc";
 
                ranges = <0x00000000 0xe0000000 0x00100000>;
                reg = <0xe0000000 0x00001000>;  // CCSRBAR 1M
                        #address-cells = <1>;
                        #size-cells = <0>;
                        cell-index = <0>;
-                       compatible = "fsl-i2c";
+                       compatible = "fsl,mpc8544-i2c", "fsl-i2c";
                        reg = <0x3000 0x100>;
                        interrupts = <43 2>;
                        interrupt-parent = <&mpic>;
-                       dfsrr;
+                       fsl,preserve-clocking;
 
                        dtt@28 {
                                compatible = "winbond,w83782d";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        cell-index = <1>;
-                       compatible = "fsl-i2c";
+                       compatible = "fsl,mpc8544-i2c", "fsl-i2c";
                        reg = <0x3100 0x100>;
                        interrupts = <43 2>;
                        interrupt-parent = <&mpic>;
-                       dfsrr;
+                       fsl,preserve-clocking;
                };
 
                enet0: ethernet@24000 {
index 8b173957fb5f67ac9e99bcec040d755d77901c95..ea6b15152de39d15e0d3474b23a1771bc6a1f3f0 100644 (file)
                compatible = "fsl,mpc8560-immr", "simple-bus";
 
                memory-controller@2000 {
-                       compatible = "fsl,8540-memory-controller";
+                       compatible = "fsl,mpc8540-memory-controller";
                        reg = <0x2000 0x1000>;
                        interrupt-parent = <&mpic>;
                        interrupts = <18 2>;
                };
 
                L2: l2-cache-controller@20000 {
-                       compatible = "fsl,8540-l2-cache-controller";
+                       compatible = "fsl,mpc8540-l2-cache-controller";
                        reg = <0x20000 0x1000>;
                        cache-line-size = <32>;
                        cache-size = <0x40000>; // L2, 256K
index ac9413a29f9f5d6033bb52a63fcbe91f5bb2eb86..231bae756637e0eca72b6b45b2056ab812bf029a 100644 (file)
                compatible = "fsl,mpc8540-immr", "simple-bus";
 
                memory-controller@2000 {
-                       compatible = "fsl,8540-memory-controller";
+                       compatible = "fsl,mpc8540-memory-controller";
                        reg = <0x2000 0x1000>;
                        interrupt-parent = <&mpic>;
                        interrupts = <18 2>;
                };
 
                L2: l2-cache-controller@20000 {
-                       compatible = "fsl,8540-l2-cache-controller";
+                       compatible = "fsl,mpc8540-l2-cache-controller";
                        reg = <0x20000 0x1000>;
                        cache-line-size = <32>;
                        cache-size = <0x40000>; // L2, 256K
index c71bb5dd5e5ec02226ac3c410111edc00b7258b9..4356a1f08295d1edf7c9d6d2ee836c4f4d942e43 100644 (file)
                compatible = "fsl,mpc8541-immr", "simple-bus";
 
                memory-controller@2000 {
-                       compatible = "fsl,8540-memory-controller";
+                       compatible = "fsl,mpc8540-memory-controller";
                        reg = <0x2000 0x1000>;
                        interrupt-parent = <&mpic>;
                        interrupts = <18 2>;
                };
 
                L2: l2-cache-controller@20000 {
-                       compatible = "fsl,8540-l2-cache-controller";
+                       compatible = "fsl,mpc8540-l2-cache-controller";
                        reg = <0x20000 0x1000>;
                        cache-line-size = <32>;
                        cache-size = <0x40000>; // L2, 256K
index 28b1a95257cdfd8d5986f971b8cdf318d2808537..19aa72301c837348b7d04c91c0b167faa232569c 100644 (file)
                upm@3,0 {
                        #address-cells = <0>;
                        #size-cells = <0>;
-                       compatible = "fsl,upm-nand";
+                       compatible = "tqc,tqm8548-upm-nand", "fsl,upm-nand";
                        reg = <3 0x0 0x800>;
                        fsl,upm-addr-offset = <0x10>;
                        fsl,upm-cmd-offset = <0x08>;
+                       /* Micron MT29F8G08FAB multi-chip device */
+                       fsl,upm-addr-line-cs-offsets = <0x0 0x200>;
+                       fsl,upm-wait-flags = <0x5>;
                        chip-delay = <25>; // in micro-seconds
 
                        nand@0 {
 
                                partition@0 {
                                            label = "fs";
-                                           reg = <0x00000000 0x01000000>;
+                                           reg = <0x00000000 0x10000000>;
                                };
                        };
                };
index 826fb622cd3c4525f3f897401302016a97b8d53d..49145a04fc6c2b892535036ec2b1de89a76e38b7 100644 (file)
                upm@3,0 {
                        #address-cells = <0>;
                        #size-cells = <0>;
-                       compatible = "fsl,upm-nand";
+                       compatible = "tqc,tqm8548-upm-nand", "fsl,upm-nand";
                        reg = <3 0x0 0x800>;
                        fsl,upm-addr-offset = <0x10>;
                        fsl,upm-cmd-offset = <0x08>;
+                       /* Micron MT29F8G08FAB multi-chip device */
+                       fsl,upm-addr-line-cs-offsets = <0x0 0x200>;
+                       fsl,upm-wait-flags = <0x5>;
                        chip-delay = <25>; // in micro-seconds
 
                        nand@0 {
 
                                partition@0 {
                                            label = "fs";
-                                           reg = <0x00000000 0x01000000>;
+                                           reg = <0x00000000 0x10000000>;
                                };
                        };
                };
index a133ded6dddbba41886407edcb54717d1879287e..06d366ebbda30a84e910e1e7242cb71b2c867431 100644 (file)
                compatible = "fsl,mpc8555-immr", "simple-bus";
 
                memory-controller@2000 {
-                       compatible = "fsl,8540-memory-controller";
+                       compatible = "fsl,mpc8540-memory-controller";
                        reg = <0x2000 0x1000>;
                        interrupt-parent = <&mpic>;
                        interrupts = <18 2>;
                };
 
                L2: l2-cache-controller@20000 {
-                       compatible = "fsl,8540-l2-cache-controller";
+                       compatible = "fsl,mpc8540-l2-cache-controller";
                        reg = <0x20000 0x1000>;
                        cache-line-size = <32>;
                        cache-size = <0x40000>; // L2, 256K
index 649e2e576267a5eb913f3cfece032eb4437fd0ab..feff915e04926e2810a6ea5c8429aebe5557254e 100644 (file)
                compatible = "fsl,mpc8560-immr", "simple-bus";
 
                memory-controller@2000 {
-                       compatible = "fsl,8540-memory-controller";
+                       compatible = "fsl,mpc8540-memory-controller";
                        reg = <0x2000 0x1000>;
                        interrupt-parent = <&mpic>;
                        interrupts = <18 2>;
                };
 
                L2: l2-cache-controller@20000 {
-                       compatible = "fsl,8540-l2-cache-controller";
+                       compatible = "fsl,mpc8540-l2-cache-controller";
                        reg = <0x20000 0x1000>;
                        cache-line-size = <32>;
                        cache-size = <0x40000>; // L2, 256K
index 61b100849715d3907c87303b25bcfe0392147d2a..f1889abb89b1a196e61861413237f0ecd423368c 100644 (file)
@@ -95,7 +95,7 @@ CONFIG_CGROUP_CPUACCT=y
 CONFIG_SYSFS_DEPRECATED=y
 CONFIG_SYSFS_DEPRECATED_V2=y
 CONFIG_PROC_PID_CPUSET=y
-# CONFIG_RELAY is not set
+CONFIG_RELAY=y
 CONFIG_NAMESPACES=y
 # CONFIG_UTS_NS is not set
 # CONFIG_IPC_NS is not set
index 68235f7e4a8fabb4febe5302adee68e6a20d1d64..d2a65e8ca6ae08df08c17626dfa4acaf2d6103d9 100644 (file)
@@ -125,7 +125,7 @@ struct lppaca {
        // NOTE: This value will ALWAYS be zero for dedicated processors and
        // will NEVER be zero for shared processors (ie, initialized to a 1).
        volatile u32 yield_count;       // PLIC increments each dispatchx00-x03
-       u32 reserved6;
+       volatile u32 dispersion_count;  // dispatch changed phys cpu    x04-x07
        volatile u64 cmo_faults;        // CMO page fault count         x08-x0F
        volatile u64 cmo_fault_time;    // CMO page fault time          x10-x17
        u8      reserved7[104];         // Reserved                     x18-x7F
index c2ccca53b991a8af7fb6493726041ba286810bf2..a002682f3a6dfe4b2dfe4e2ac88b6f935839b137 100644 (file)
 #define MPIC_GREG_FEATURE_1            0x00010
 #define MPIC_GREG_GLOBAL_CONF_0                0x00020
 #define                MPIC_GREG_GCONF_RESET                   0x80000000
+/* On the FSL mpic implementations the Mode field is expand to be
+ * 2 bits wide:
+ *     0b00 = pass through (interrupts routed to IRQ0)
+ *     0b01 = Mixed mode
+ *     0b10 = reserved
+ *     0b11 = External proxy / coreint
+ */
+#define                MPIC_GREG_GCONF_COREINT                 0x60000000
 #define                MPIC_GREG_GCONF_8259_PTHROU_DIS         0x20000000
 #define                MPIC_GREG_GCONF_NO_BIAS                 0x10000000
 #define                MPIC_GREG_GCONF_BASE_MASK               0x000fffff
@@ -357,6 +365,8 @@ struct mpic
 #define MPIC_BROKEN_FRR_NIRQS          0x00000800
 /* Destination only supports a single CPU at a time */
 #define MPIC_SINGLE_DEST_CPU           0x00001000
+/* Enable CoreInt delivery of interrupts */
+#define MPIC_ENABLE_COREINT            0x00002000
 
 /* MPIC HW modification ID */
 #define MPIC_REGSET_MASK               0xf0000000
@@ -470,6 +480,8 @@ extern void mpic_end_irq(unsigned int irq);
 extern unsigned int mpic_get_one_irq(struct mpic *mpic);
 /* This one gets from the primary mpic */
 extern unsigned int mpic_get_irq(void);
+/* This one gets from the primary mpic via CoreInt*/
+extern unsigned int mpic_get_coreint_irq(void);
 /* Fetch Machine Check interrupt from primary mpic */
 extern unsigned int mpic_get_mcirq(void);
 
index 90dbefb8cfc4a01528c1700f123e870c160decab..e7233a849680ce4595f8b9afc345593b9431d6ce 100644 (file)
@@ -21,7 +21,6 @@
 
 #include <linux/types.h>
 #include <linux/ioctl.h>
-#include <linux/types.h>
 
 /* ioctl */
 #define PS3FB_IOCTL_SETMODE       _IOW('r',  1, int) /* set video mode */
index d9740e88680145e0dbf0ef77c263671aed8ec116..a7e210b6b48c347f4d7af601e56660cf824b1728 100644 (file)
@@ -151,9 +151,11 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void);
                                 _PAGE_NO_CACHE)
 #define PAGE_KERNEL_NCG        __pgprot(_PAGE_BASE_NC | _PAGE_KERNEL_RW | \
                                 _PAGE_NO_CACHE | _PAGE_GUARDED)
-#define PAGE_KERNEL_X  __pgprot(_PAGE_BASE | _PAGE_KERNEL_RW | _PAGE_EXEC)
+#define PAGE_KERNEL_X  __pgprot(_PAGE_BASE | _PAGE_KERNEL_RW | _PAGE_EXEC | \
+                                _PAGE_HWEXEC)
 #define PAGE_KERNEL_RO __pgprot(_PAGE_BASE | _PAGE_KERNEL_RO)
-#define PAGE_KERNEL_ROX        __pgprot(_PAGE_BASE | _PAGE_KERNEL_RO | _PAGE_EXEC)
+#define PAGE_KERNEL_ROX        __pgprot(_PAGE_BASE | _PAGE_KERNEL_RO | _PAGE_EXEC | \
+                                _PAGE_HWEXEC)
 
 /* Protection used for kernel text. We want the debuggers to be able to
  * set breakpoints anywhere, so don't write protect the kernel text
index c9ff1ec97479d0d7002c7ade3f6e65a811e1e9ff..e8018d540e87db3f3c0f5bf44b7453dc57dbe9d9 100644 (file)
 #define FPSCR_NI       0x00000004      /* FPU non IEEE-Mode */
 #define FPSCR_RN       0x00000003      /* FPU rounding control */
 
+/* Bit definitions for SPEFSCR. */
+#define SPEFSCR_SOVH   0x80000000      /* Summary integer overflow high */
+#define SPEFSCR_OVH    0x40000000      /* Integer overflow high */
+#define SPEFSCR_FGH    0x20000000      /* Embedded FP guard bit high */
+#define SPEFSCR_FXH    0x10000000      /* Embedded FP sticky bit high */
+#define SPEFSCR_FINVH  0x08000000      /* Embedded FP invalid operation high */
+#define SPEFSCR_FDBZH  0x04000000      /* Embedded FP div by zero high */
+#define SPEFSCR_FUNFH  0x02000000      /* Embedded FP underflow high */
+#define SPEFSCR_FOVFH  0x01000000      /* Embedded FP overflow high */
+#define SPEFSCR_FINXS  0x00200000      /* Embedded FP inexact sticky */
+#define SPEFSCR_FINVS  0x00100000      /* Embedded FP invalid op. sticky */
+#define SPEFSCR_FDBZS  0x00080000      /* Embedded FP div by zero sticky */
+#define SPEFSCR_FUNFS  0x00040000      /* Embedded FP underflow sticky */
+#define SPEFSCR_FOVFS  0x00020000      /* Embedded FP overflow sticky */
+#define SPEFSCR_MODE   0x00010000      /* Embedded FP mode */
+#define SPEFSCR_SOV    0x00008000      /* Integer summary overflow */
+#define SPEFSCR_OV     0x00004000      /* Integer overflow */
+#define SPEFSCR_FG     0x00002000      /* Embedded FP guard bit */
+#define SPEFSCR_FX     0x00001000      /* Embedded FP sticky bit */
+#define SPEFSCR_FINV   0x00000800      /* Embedded FP invalid operation */
+#define SPEFSCR_FDBZ   0x00000400      /* Embedded FP div by zero */
+#define SPEFSCR_FUNF   0x00000200      /* Embedded FP underflow */
+#define SPEFSCR_FOVF   0x00000100      /* Embedded FP overflow */
+#define SPEFSCR_FINXE  0x00000040      /* Embedded FP inexact enable */
+#define SPEFSCR_FINVE  0x00000020      /* Embedded FP invalid op. enable */
+#define SPEFSCR_FDBZE  0x00000010      /* Embedded FP div by zero enable */
+#define SPEFSCR_FUNFE  0x00000008      /* Embedded FP underflow enable */
+#define SPEFSCR_FOVFE  0x00000004      /* Embedded FP overflow enable */
+#define SPEFSCR_FRMC   0x00000003      /* Embedded FP rounding mode control */
+
 /* Special Purpose Registers (SPRNs)*/
 #define SPRN_CTR       0x009   /* Count Register */
 #define SPRN_DSCR      0x11
index a56f4d61aa7264c27ec60e9008c92e464a28a6f0..601ddbc460023e20a26558fafa61fdbafd24bfae 100644 (file)
 #define SGR_NORMAL     0               /* Speculative fetching allowed. */
 #define SGR_GUARDED    1               /* Speculative fetching disallowed. */
 
-/* Bit definitions for SPEFSCR. */
-#define SPEFSCR_SOVH   0x80000000      /* Summary integer overflow high */
-#define SPEFSCR_OVH    0x40000000      /* Integer overflow high */
-#define SPEFSCR_FGH    0x20000000      /* Embedded FP guard bit high */
-#define SPEFSCR_FXH    0x10000000      /* Embedded FP sticky bit high */
-#define SPEFSCR_FINVH  0x08000000      /* Embedded FP invalid operation high */
-#define SPEFSCR_FDBZH  0x04000000      /* Embedded FP div by zero high */
-#define SPEFSCR_FUNFH  0x02000000      /* Embedded FP underflow high */
-#define SPEFSCR_FOVFH  0x01000000      /* Embedded FP overflow high */
-#define SPEFSCR_FINXS  0x00200000      /* Embedded FP inexact sticky */
-#define SPEFSCR_FINVS  0x00100000      /* Embedded FP invalid op. sticky */
-#define SPEFSCR_FDBZS  0x00080000      /* Embedded FP div by zero sticky */
-#define SPEFSCR_FUNFS  0x00040000      /* Embedded FP underflow sticky */
-#define SPEFSCR_FOVFS  0x00020000      /* Embedded FP overflow sticky */
-#define SPEFSCR_MODE   0x00010000      /* Embedded FP mode */
-#define SPEFSCR_SOV    0x00008000      /* Integer summary overflow */
-#define SPEFSCR_OV     0x00004000      /* Integer overflow */
-#define SPEFSCR_FG     0x00002000      /* Embedded FP guard bit */
-#define SPEFSCR_FX     0x00001000      /* Embedded FP sticky bit */
-#define SPEFSCR_FINV   0x00000800      /* Embedded FP invalid operation */
-#define SPEFSCR_FDBZ   0x00000400      /* Embedded FP div by zero */
-#define SPEFSCR_FUNF   0x00000200      /* Embedded FP underflow */
-#define SPEFSCR_FOVF   0x00000100      /* Embedded FP overflow */
-#define SPEFSCR_FINXE  0x00000040      /* Embedded FP inexact enable */
-#define SPEFSCR_FINVE  0x00000020      /* Embedded FP invalid op. enable */
-#define SPEFSCR_FDBZE  0x00000010      /* Embedded FP div by zero enable */
-#define SPEFSCR_FUNFE  0x00000008      /* Embedded FP underflow enable */
-#define SPEFSCR_FOVFE  0x00000004      /* Embedded FP overflow enable */
-#define SPEFSCR_FRMC   0x00000003      /* Embedded FP rounding mode control */
-
 /*
  * The IBM-403 is an even more odd special case, as it is much
  * older than the IBM-405 series.  We put these down here incase someone
index 0aa0315fb7e8a56d5aa120e8932afb9ddf0c694f..01c12339b30444270d8f2a0be248f6860571d21f 100644 (file)
@@ -68,7 +68,8 @@ struct rtas_t {
 #define RTAS_EPOW_WARNING              0x40000000 /* set bit 1 */
 #define RTAS_POWERMGM_EVENTS           0x20000000 /* set bit 2 */
 #define RTAS_HOTPLUG_EVENTS            0x10000000 /* set bit 3 */
-#define RTAS_EVENT_SCAN_ALL_EVENTS     0xf0000000
+#define RTAS_IO_EVENTS                 0x08000000 /* set bit 4 */
+#define RTAS_EVENT_SCAN_ALL_EVENTS     0xffffffff
 
 /* RTAS event severity */
 #define RTAS_SEVERITY_FATAL            0x5
index 3d9f831c3c55749829e76abf8e912cbf47af7991..3a7a67a0d006cfe24d0b2bd626e7361d771dde1b 100644 (file)
@@ -29,9 +29,9 @@
 
 /* basic word size definitions */
 #define _FP_W_TYPE_SIZE                32
-#define _FP_W_TYPE             unsigned long
-#define _FP_WS_TYPE            signed long
-#define _FP_I_TYPE             long
+#define _FP_W_TYPE             unsigned int
+#define _FP_WS_TYPE            signed int
+#define _FP_I_TYPE             int
 
 #define __ll_B                 ((UWtype) 1 << (W_TYPE_SIZE / 2))
 #define __ll_lowpart(t)                ((UWtype) (t) & (__ll_B - 1))
index fe166491e9dcf9a821fb10be53678b48a3f3578e..d98a30dfd41ca2e11c8f7212097182ab6caaeaa2 100644 (file)
@@ -322,3 +322,6 @@ SYSCALL_SPU(epoll_create1)
 SYSCALL_SPU(dup3)
 SYSCALL_SPU(pipe2)
 SYSCALL(inotify_init1)
+SYSCALL(ni_syscall)
+COMPAT_SYS_SPU(preadv)
+COMPAT_SYS_SPU(pwritev)
index e07d0c76ed779793280480b50032d0ffefe04c54..3f06f8ec81c513639e96194ca7b40262e35cf0ca 100644 (file)
 #define __NR_dup3              316
 #define __NR_pipe2             317
 #define __NR_inotify_init1     318
+#define __NR_preadv            320
+#define __NR_pwritev           321
 
 #ifdef __KERNEL__
 
-#define __NR_syscalls          319
+#define __NR_syscalls          322
 
 #define __NR__exit __NR_exit
 #define NR_syscalls    __NR_syscalls
index 1c5c8a6fc129ff825bd1b4cb4da985e15ba85707..53c7788cba78d2978002e2edc5d03027f459e974 100644 (file)
@@ -94,7 +94,7 @@ static int dma_direct_dma_supported(struct device *dev, u64 mask)
         * done via some global so platforms can set the limit in case
         * they have limited DMA windows
         */
-       return mask >= DMA_32BIT_MASK;
+       return mask >= DMA_BIT_MASK(32);
 #else
        return 1;
 #endif
index a088c064ae405513a2d0969943c102647e8f4a46..2436df33c6f4433d7e7f54b88caad6ba570cf3f6 100644 (file)
@@ -145,6 +145,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
        beq     1f
        PPC_LL  r4,_MSR-STACK_FRAME_OVERHEAD(r5)
        li      r3,MSR_FP|MSR_FE0|MSR_FE1
+#ifdef CONFIG_VSX
+BEGIN_FTR_SECTION
+       oris    r3,r3,MSR_VSX@h
+END_FTR_SECTION_IFSET(CPU_FTR_VSX)
+#endif
        andc    r4,r4,r3                /* disable FP for previous task */
        PPC_STL r4,_MSR-STACK_FRAME_OVERHEAD(r5)
 1:
index 5455943f16aa4d84e86dcce9f558af9d79cab79b..70e2a736be1f5d5bf26b8211535dfdc9b8578b74 100644 (file)
@@ -293,7 +293,7 @@ __ftrace_make_nop(struct module *mod,
        if (tramp & 0x8000)
                tramp -= 0x10000;
 
-       pr_debug(" %x ", tramp);
+       pr_debug(" %lx ", tramp);
 
        if (tramp != addr) {
                printk(KERN_ERR
@@ -564,7 +564,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
        if (unlikely(atomic_read(&current->tracing_graph_pause)))
                return;
 
-#if CONFIG_PPC64
+#ifdef CONFIG_PPC64
        /* non core kernel code needs to save and restore the TOC */
        if (REGION_ID(self_addr) != KERNEL_REGION_ID)
                return_hooker = (unsigned long)&mod_return_to_handler;
index 5576147e57b63d5e7c54c359e31fbdf71b2ca5dd..8c1a4966867e2b40de5597b056c88a68d6d06e3b 100644 (file)
@@ -672,11 +672,13 @@ unsigned int irq_create_mapping(struct irq_host *host,
                        return NO_IRQ;
                }
        }
-       pr_debug("irq: -> obtained virq %d\n", virq);
 
        if (irq_setup_virq(host, virq, hwirq))
                return NO_IRQ;
 
+       printk(KERN_DEBUG "irq: irq %lu on host %s mapped to virtual irq %u\n",
+               hwirq, host->of_node ? host->of_node->full_name : "null", virq);
+
        return virq;
 }
 EXPORT_SYMBOL_GPL(irq_create_mapping);
index 182e0f642f36eacc3fd513c7d7ee484c45096257..78b3f7840ade9d4246ef07ebb39660fc6fd35f82 100644 (file)
@@ -434,6 +434,21 @@ static void pseries_cmo_data(struct seq_file *m)
        seq_printf(m, "cmo_page_size=%lu\n", cmo_get_page_size());
 }
 
+static void splpar_dispatch_data(struct seq_file *m)
+{
+       int cpu;
+       unsigned long dispatches = 0;
+       unsigned long dispatch_dispersions = 0;
+
+       for_each_possible_cpu(cpu) {
+               dispatches += lppaca[cpu].yield_count;
+               dispatch_dispersions += lppaca[cpu].dispersion_count;
+       }
+
+       seq_printf(m, "dispatches=%lu\n", dispatches);
+       seq_printf(m, "dispatch_dispersions=%lu\n", dispatch_dispersions);
+}
+
 static int pseries_lparcfg_data(struct seq_file *m, void *v)
 {
        int partition_potential_processors;
@@ -460,6 +475,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
                parse_ppp_data(m);
                parse_mpp_data(m);
                pseries_cmo_data(m);
+               splpar_dispatch_data(m);
 
                seq_printf(m, "purr=%ld\n", get_purr());
        } else {                /* non SPLPAR case */
index 3053fe5c62f2a67694d430187df900495c19531b..b9530b2395a289847f011d8f3cbc5278e1cb8c76 100644 (file)
@@ -495,7 +495,15 @@ _GLOBAL(giveup_altivec)
        stvx    vr0,r4,r3
        beq     1f
        ld      r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+#ifdef CONFIG_VSX
+BEGIN_FTR_SECTION
+       lis     r3,(MSR_VEC|MSR_VSX)@h
+FTR_SECTION_ELSE
+       lis     r3,MSR_VEC@h
+ALT_FTR_SECTION_END_IFSET(CPU_FTR_VSX)
+#else
        lis     r3,MSR_VEC@h
+#endif
        andc    r4,r4,r3                /* disable FP for previous task */
        std     r4,_MSR-STACK_FRAME_OVERHEAD(r5)
 1:
index 3f37a6e6277163d715b9d1b2988984fed19c789a..87df428e35880f1da99b2a40e6a3276e1f0a4f70 100644 (file)
@@ -76,7 +76,7 @@ struct of_device* of_platform_device_create(struct device_node *np,
                return NULL;
 
        dev->dma_mask = 0xffffffffUL;
-       dev->dev.coherent_dma_mask = DMA_32BIT_MASK;
+       dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
 
        dev->dev.bus = &of_platform_bus_type;
 
index 2e026c0407d4c2b69bed464cc28d3621a1d77f53..2f0e64b53642eb0c68191cd62929b906a2eba97c 100644 (file)
@@ -614,7 +614,7 @@ static unsigned char ibm_architecture_vec[] = {
        W(0xffffffff),                  /* virt_base */
        W(0xffffffff),                  /* virt_size */
        W(0xffffffff),                  /* load_base */
-       W(64),                          /* 128MB min RMA */
+       W(64),                          /* 64MB min RMA */
        W(0xffffffff),                  /* full client load */
        0,                              /* min RMA percentage of total RAM */
        48,                             /* max log_2(hash table size) */
@@ -732,15 +732,17 @@ static void __init prom_send_capabilities(void)
        root = call_prom("open", 1, 1, ADDR("/"));
        if (root != 0) {
                /* try calling the ibm,client-architecture-support method */
+               prom_printf("Calling ibm,client-architecture...");
                if (call_prom_ret("call-method", 3, 2, &ret,
                                  ADDR("ibm,client-architecture-support"),
                                  root,
                                  ADDR(ibm_architecture_vec)) == 0) {
                        /* the call exists... */
                        if (ret)
-                               prom_printf("WARNING: ibm,client-architecture"
+                               prom_printf("\nWARNING: ibm,client-architecture"
                                            "-support call FAILED!\n");
                        call_prom("close", 1, 0, root);
+                       prom_printf(" done\n");
                        return;
                }
                call_prom("close", 1, 0, root);
@@ -1083,7 +1085,7 @@ static void __init prom_instantiate_rtas(void)
                return;
        }
 
-       prom_printf("instantiating rtas at 0x%x ...", base);
+       prom_printf("instantiating rtas at 0x%x...", base);
 
        if (call_prom_ret("call-method", 3, 2, &entry,
                          ADDR("instantiate-rtas"),
@@ -1495,7 +1497,7 @@ static int __init prom_find_machine_type(void)
                return PLATFORM_GENERIC;
        x = prom_getproplen(rtas, "ibm,hypertas-functions");
        if (x != PROM_ERROR) {
-               prom_printf("Hypertas detected, assuming LPAR !\n");
+               prom_debug("Hypertas detected, assuming LPAR !\n");
                return PLATFORM_PSERIES_LPAR;
        }
        return PLATFORM_PSERIES;
@@ -1544,7 +1546,7 @@ static void __init prom_check_displays(void)
        };
        const unsigned char *clut;
 
-       prom_printf("Looking for displays\n");
+       prom_debug("Looking for displays\n");
        for (node = 0; prom_next_node(&node); ) {
                memset(type, 0, sizeof(type));
                prom_getprop(node, "device_type", type, sizeof(type));
@@ -1562,7 +1564,7 @@ static void __init prom_check_displays(void)
                if (call_prom("package-to-path", 3, 1, node, path,
                              PROM_SCRATCH_SIZE-10) == PROM_ERROR)
                        continue;
-               prom_printf("found display   : %s, opening ... ", path);
+               prom_printf("found display   : %s, opening... ", path);
                
                ih = call_prom("open", 1, 1, path);
                if (ih == 0) {
@@ -2387,7 +2389,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
        /*
         * Now finally create the flattened device-tree
         */
-       prom_printf("copying OF device tree ...\n");
+       prom_printf("copying OF device tree...\n");
        flatten_device_tree();
 
        /*
@@ -2402,7 +2404,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
         * Call OF "quiesce" method to shut down pending DMA's from
         * devices etc...
         */
-       prom_printf("Calling quiesce ...\n");
+       prom_printf("Calling quiesce...\n");
        call_prom("quiesce", 0, 0);
 
        /*
index 197d49c790ad55b2e67b6b5a989bb9b958dfd14c..297632cba047e5ee980950059bee841217978631 100644 (file)
@@ -67,7 +67,8 @@ static long compat_ptrace_old(struct task_struct *child, long request,
 /* Macros to workout the correct index for the FPR in the thread struct */
 #define FPRNUMBER(i) (((i) - PT_FPR0) >> 1)
 #define FPRHALF(i) (((i) - PT_FPR0) & 1)
-#define FPRINDEX(i) TS_FPRWIDTH * FPRNUMBER(i) + FPRHALF(i)
+#define FPRINDEX(i) TS_FPRWIDTH * FPRNUMBER(i) * 2 + FPRHALF(i)
+#define FPRINDEX_3264(i) (TS_FPRWIDTH * ((i) - PT_FPR0))
 
 long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                        compat_ulong_t caddr, compat_ulong_t cdata)
@@ -168,8 +169,9 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                CHECK_FULL_REGS(child->thread.regs);
                if (numReg >= PT_FPR0) {
                        flush_fp_to_thread(child);
-                       tmp = ((unsigned long int *)child->thread.fpr)
-                               [FPRINDEX(numReg)];
+                       /* get 64 bit FPR */
+                       tmp = ((u64 *)child->thread.fpr)
+                               [FPRINDEX_3264(numReg)];
                } else { /* register within PT_REGS struct */
                        tmp = ptrace_get_reg(child, numReg);
                } 
@@ -262,8 +264,13 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                                freg = (freg & 0xfffffffful) | (data << 32);
                        ret = ptrace_put_reg(child, numReg, freg);
                } else {
+                       u64 *tmp;
                        flush_fp_to_thread(child);
-                       ((unsigned int *)child->thread.regs)[index] = data;
+                       /* get 64 bit FPR ... */
+                       tmp = &(((u64 *)child->thread.fpr)
+                               [FPRINDEX_3264(numReg)]);
+                       /* ... write the 32 bit part we want */
+                       ((u32 *)tmp)[index % 2] = data;
                        ret = 0;
                }
                break;
index 9774f9fed96e52c5bde8cf8dce8e069ed8fc02a4..02fed27af7f64ed72cfad7ed344955721c3d546b 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/percpu.h>
 #include <linux/lmb.h>
 #include <linux/of_platform.h>
-#include <linux/platform_device.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/processor.h>
index 5744527a7f2ac777bd9c94985c71e47ff4afd146..bed4690de3944162eca2918e8df1164e1fd5b678 100644 (file)
@@ -644,7 +644,7 @@ static void dma_fixed_unmap_sg(struct device *dev, struct scatterlist *sg,
 
 static int dma_fixed_dma_supported(struct device *dev, u64 mask)
 {
-       return mask == DMA_64BIT_MASK;
+       return mask == DMA_BIT_MASK(64);
 }
 
 static int dma_set_mask_and_switch(struct device *dev, u64 dma_mask);
index 6ed75bffc8ab55d089faec045c04607d7ed8efde..ff43f1fd8343519d027f5abe3c138f4471fefe39 100644 (file)
@@ -202,7 +202,7 @@ static struct iommu_table vio_iommu_table;
 void *iseries_hv_alloc(size_t size, dma_addr_t *dma_handle, gfp_t flag)
 {
        return iommu_alloc_coherent(NULL, &vio_iommu_table, size, dma_handle,
-                               DMA_32BIT_MASK, flag, -1);
+                               DMA_BIT_MASK(32), flag, -1);
 }
 EXPORT_SYMBOL_GPL(iseries_hv_alloc);
 
@@ -217,7 +217,7 @@ dma_addr_t iseries_hv_map(void *vaddr, size_t size,
 {
        return iommu_map_page(NULL, &vio_iommu_table, virt_to_page(vaddr),
                              (unsigned long)vaddr % PAGE_SIZE, size,
-                             DMA_32BIT_MASK, direction, NULL);
+                             DMA_BIT_MASK(32), direction, NULL);
 }
 
 void iseries_hv_unmap(dma_addr_t dma_handle, size_t size,
index a705fffbb498e3ec8c14f56c33f3e48b065ddca1..9a73d0238639307cd2f1f16d5352def20aa27e86 100644 (file)
@@ -689,7 +689,7 @@ static void ps3_ioc0_unmap_sg(struct device *_dev, struct scatterlist *sg,
 
 static int ps3_dma_supported(struct device *_dev, u64 mask)
 {
-       return mask >= DMA_32BIT_MASK;
+       return mask >= DMA_BIT_MASK(32);
 }
 
 static struct dma_mapping_ops ps3_sb_dma_ops = {
index 0494ee55920f7c55f6aac6c2447a0cd7c2ad76c0..dceb8d1a843d7ccd63f46fc768c6352f2fb92b9c 100644 (file)
@@ -150,7 +150,7 @@ int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base, u32 mar)
 
        spin_lock_irqsave(&fsl_lbc_lock, flags);
 
-       out_be32(&fsl_lbc_regs->mar, mar << (32 - upm->width));
+       out_be32(&fsl_lbc_regs->mar, mar);
 
        switch (upm->width) {
        case 8:
index 532e205303a29ea530ab4e3e180cfd4e459ceaa4..21b956701596393e41833836ff39a62dfef9a354 100644 (file)
@@ -1170,6 +1170,12 @@ struct mpic * __init mpic_alloc(struct device_node *node,
                        mb();
        }
 
+       /* CoreInt */
+       if (flags & MPIC_ENABLE_COREINT)
+               mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
+                          mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
+                          | MPIC_GREG_GCONF_COREINT);
+
        if (flags & MPIC_ENABLE_MCK)
                mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
                           mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
@@ -1525,6 +1531,34 @@ unsigned int mpic_get_irq(void)
        return mpic_get_one_irq(mpic);
 }
 
+unsigned int mpic_get_coreint_irq(void)
+{
+#ifdef CONFIG_BOOKE
+       struct mpic *mpic = mpic_primary;
+       u32 src;
+
+       BUG_ON(mpic == NULL);
+
+       src = mfspr(SPRN_EPR);
+
+       if (unlikely(src == mpic->spurious_vec)) {
+               if (mpic->flags & MPIC_SPV_EOI)
+                       mpic_eoi(mpic);
+               return NO_IRQ;
+       }
+       if (unlikely(mpic->protected && test_bit(src, mpic->protected))) {
+               if (printk_ratelimit())
+                       printk(KERN_WARNING "%s: Got protected source %d !\n",
+                              mpic->name, (int)src);
+               return NO_IRQ;
+       }
+
+       return irq_linear_revmap(mpic->irqhost, src);
+#else
+       return NO_IRQ;
+#endif
+}
+
 unsigned int mpic_get_mcirq(void)
 {
        struct mpic *mpic = mpic_primary;
index 5b2196ab8168def9b8b44cc060877130d7b633bc..4b34082060914efd6d47b73ff3474cfc7f9a871c 100644 (file)
@@ -253,6 +253,7 @@ config SMP
 config X86_X2APIC
        bool "Support x2apic"
        depends on X86_LOCAL_APIC && X86_64
+       select INTR_REMAP
        ---help---
          This enables x2apic support on CPUs that have this feature.
 
@@ -1881,7 +1882,6 @@ config DMAR_FLOPPY_WA
 config INTR_REMAP
        bool "Support for Interrupt Remapping (EXPERIMENTAL)"
        depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI && EXPERIMENTAL
-       select X86_X2APIC
        ---help---
          Supports Interrupt remapping for IO-APIC and MSI devices.
          To use x2apic mode in the CPU's which support x2APIC enhancements or
index df8a300dfe6c380b5fdcf60e379ef9fb855d67ae..42f2f83774224fb7897bf848fc6b84c4bce87380 100644 (file)
@@ -107,6 +107,9 @@ extern u32 native_safe_apic_wait_icr_idle(void);
 extern void native_apic_icr_write(u32 low, u32 id);
 extern u64 native_apic_icr_read(void);
 
+#define EIM_8BIT_APIC_ID       0
+#define EIM_32BIT_APIC_ID      1
+
 #ifdef CONFIG_X86_X2APIC
 /*
  * Make previous memory operations globally visible before
index cea7b74963e9758e9338c7c739c02bb53e9d63e2..f82fdc412c64b9d3371fb1a9df65f38ba141bb52 100644 (file)
@@ -238,7 +238,7 @@ static inline unsigned long dma_alloc_coherent_mask(struct device *dev,
 
        dma_mask = dev->coherent_dma_mask;
        if (!dma_mask)
-               dma_mask = (gfp & GFP_DMA) ? DMA_24BIT_MASK : DMA_32BIT_MASK;
+               dma_mask = (gfp & GFP_DMA) ? DMA_BIT_MASK(24) : DMA_BIT_MASK(32);
 
        return dma_mask;
 }
@@ -247,10 +247,10 @@ static inline gfp_t dma_alloc_coherent_gfp_flags(struct device *dev, gfp_t gfp)
 {
        unsigned long dma_mask = dma_alloc_coherent_mask(dev, gfp);
 
-       if (dma_mask <= DMA_24BIT_MASK)
+       if (dma_mask <= DMA_BIT_MASK(24))
                gfp |= GFP_DMA;
 #ifdef CONFIG_X86_64
-       if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA))
+       if (dma_mask <= DMA_BIT_MASK(32) && !(gfp & GFP_DMA))
                gfp |= GFP_DMA32;
 #endif
        return gfp;
index 373cc2bbcad2cdfb17ef4e0448921da892691d0e..9d826e436010005254bb04e13bac1ee45d802b75 100644 (file)
@@ -162,10 +162,13 @@ extern int (*ioapic_renumber_irq)(int ioapic, int irq);
 extern void ioapic_init_mappings(void);
 
 #ifdef CONFIG_X86_64
-extern int save_IO_APIC_setup(void);
-extern void mask_IO_APIC_setup(void);
-extern void restore_IO_APIC_setup(void);
-extern void reinit_intr_remapped_IO_APIC(int);
+extern struct IO_APIC_route_entry **alloc_ioapic_entries(void);
+extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries);
+extern int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);
+extern void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);
+extern int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries);
+extern void reinit_intr_remapped_IO_APIC(int intr_remapping,
+       struct IO_APIC_route_entry **ioapic_entries);
 #endif
 
 extern void probe_nr_irqs_gsi(void);
index 85eb8e100818d2dfef0bae935684e6fe0253c888..098ec84b8c0054d1f0fcff0e02aa357a02b33dd3 100644 (file)
@@ -1304,6 +1304,7 @@ void __init enable_IR_x2apic(void)
 #ifdef CONFIG_INTR_REMAP
        int ret;
        unsigned long flags;
+       struct IO_APIC_route_entry **ioapic_entries = NULL;
 
        if (!cpu_has_x2apic)
                return;
@@ -1334,17 +1335,23 @@ void __init enable_IR_x2apic(void)
                return;
        }
 
-       ret = save_IO_APIC_setup();
+       ioapic_entries = alloc_ioapic_entries();
+       if (!ioapic_entries) {
+               pr_info("Allocate ioapic_entries failed: %d\n", ret);
+               goto end;
+       }
+
+       ret = save_IO_APIC_setup(ioapic_entries);
        if (ret) {
                pr_info("Saving IO-APIC state failed: %d\n", ret);
                goto end;
        }
 
        local_irq_save(flags);
-       mask_IO_APIC_setup();
+       mask_IO_APIC_setup(ioapic_entries);
        mask_8259A();
 
-       ret = enable_intr_remapping(1);
+       ret = enable_intr_remapping(EIM_32BIT_APIC_ID);
 
        if (ret && x2apic_preenabled) {
                local_irq_restore(flags);
@@ -1364,9 +1371,9 @@ end_restore:
                /*
                 * IR enabling failed
                 */
-               restore_IO_APIC_setup();
+               restore_IO_APIC_setup(ioapic_entries);
        else
-               reinit_intr_remapped_IO_APIC(x2apic_preenabled);
+               reinit_intr_remapped_IO_APIC(x2apic_preenabled, ioapic_entries);
 
        unmask_8259A();
        local_irq_restore(flags);
@@ -1379,6 +1386,8 @@ end:
                        pr_info("Enabled Interrupt-remapping\n");
        } else
                pr_err("Failed to enable Interrupt-remapping and x2apic\n");
+       if (ioapic_entries)
+               free_ioapic_entries(ioapic_entries);
 #else
        if (!cpu_has_x2apic)
                return;
@@ -1954,6 +1963,10 @@ static int lapic_suspend(struct sys_device *dev, pm_message_t state)
 
        local_irq_save(flags);
        disable_local_APIC();
+#ifdef CONFIG_INTR_REMAP
+       if (intr_remapping_enabled)
+               disable_intr_remapping();
+#endif
        local_irq_restore(flags);
        return 0;
 }
@@ -1964,15 +1977,41 @@ static int lapic_resume(struct sys_device *dev)
        unsigned long flags;
        int maxlvt;
 
+#ifdef CONFIG_INTR_REMAP
+       int ret;
+       struct IO_APIC_route_entry **ioapic_entries = NULL;
+
        if (!apic_pm_state.active)
                return 0;
 
-       maxlvt = lapic_get_maxlvt();
-
        local_irq_save(flags);
+       if (x2apic) {
+               ioapic_entries = alloc_ioapic_entries();
+               if (!ioapic_entries) {
+                       WARN(1, "Alloc ioapic_entries in lapic resume failed.");
+                       return -ENOMEM;
+               }
+
+               ret = save_IO_APIC_setup(ioapic_entries);
+               if (ret) {
+                       WARN(1, "Saving IO-APIC state failed: %d\n", ret);
+                       free_ioapic_entries(ioapic_entries);
+                       return ret;
+               }
+
+               mask_IO_APIC_setup(ioapic_entries);
+               mask_8259A();
+               enable_x2apic();
+       }
+#else
+       if (!apic_pm_state.active)
+               return 0;
 
+       local_irq_save(flags);
        if (x2apic)
                enable_x2apic();
+#endif
+
        else {
                /*
                 * Make sure the APICBASE points to the right address
@@ -1986,6 +2025,7 @@ static int lapic_resume(struct sys_device *dev)
                wrmsr(MSR_IA32_APICBASE, l, h);
        }
 
+       maxlvt = lapic_get_maxlvt();
        apic_write(APIC_LVTERR, ERROR_APIC_VECTOR | APIC_LVT_MASKED);
        apic_write(APIC_ID, apic_pm_state.apic_id);
        apic_write(APIC_DFR, apic_pm_state.apic_dfr);
@@ -2009,8 +2049,20 @@ static int lapic_resume(struct sys_device *dev)
        apic_write(APIC_ESR, 0);
        apic_read(APIC_ESR);
 
+#ifdef CONFIG_INTR_REMAP
+       if (intr_remapping_enabled)
+               reenable_intr_remapping(EIM_32BIT_APIC_ID);
+
+       if (x2apic) {
+               unmask_8259A();
+               restore_IO_APIC_setup(ioapic_entries);
+               free_ioapic_entries(ioapic_entries);
+       }
+#endif
+
        local_irq_restore(flags);
 
+
        return 0;
 }
 
@@ -2048,7 +2100,9 @@ static int __init init_lapic_sysfs(void)
                error = sysdev_register(&device_lapic);
        return error;
 }
-device_initcall(init_lapic_sysfs);
+
+/* local apic needs to resume before other devices access its registers. */
+core_initcall(init_lapic_sysfs);
 
 #else  /* CONFIG_PM */
 
index 1bb5c6cee3ebb140e30e421c05615bf94b001936..767fe7e46d6891ea02254a00e91480b4558eee64 100644 (file)
@@ -851,63 +851,74 @@ __setup("pirq=", ioapic_pirq_setup);
 #endif /* CONFIG_X86_32 */
 
 #ifdef CONFIG_INTR_REMAP
-/* I/O APIC RTE contents at the OS boot up */
-static struct IO_APIC_route_entry *early_ioapic_entries[MAX_IO_APICS];
+struct IO_APIC_route_entry **alloc_ioapic_entries(void)
+{
+       int apic;
+       struct IO_APIC_route_entry **ioapic_entries;
+
+       ioapic_entries = kzalloc(sizeof(*ioapic_entries) * nr_ioapics,
+                               GFP_ATOMIC);
+       if (!ioapic_entries)
+               return 0;
+
+       for (apic = 0; apic < nr_ioapics; apic++) {
+               ioapic_entries[apic] =
+                       kzalloc(sizeof(struct IO_APIC_route_entry) *
+                               nr_ioapic_registers[apic], GFP_ATOMIC);
+               if (!ioapic_entries[apic])
+                       goto nomem;
+       }
+
+       return ioapic_entries;
+
+nomem:
+       while (--apic >= 0)
+               kfree(ioapic_entries[apic]);
+       kfree(ioapic_entries);
+
+       return 0;
+}
 
 /*
  * Saves all the IO-APIC RTE's
  */
-int save_IO_APIC_setup(void)
+int save_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries)
 {
-       union IO_APIC_reg_01 reg_01;
-       unsigned long flags;
        int apic, pin;
 
-       /*
-        * The number of IO-APIC IRQ registers (== #pins):
-        */
-       for (apic = 0; apic < nr_ioapics; apic++) {
-               spin_lock_irqsave(&ioapic_lock, flags);
-               reg_01.raw = io_apic_read(apic, 1);
-               spin_unlock_irqrestore(&ioapic_lock, flags);
-               nr_ioapic_registers[apic] = reg_01.bits.entries+1;
-       }
+       if (!ioapic_entries)
+               return -ENOMEM;
 
        for (apic = 0; apic < nr_ioapics; apic++) {
-               early_ioapic_entries[apic] =
-                       kzalloc(sizeof(struct IO_APIC_route_entry) *
-                               nr_ioapic_registers[apic], GFP_KERNEL);
-               if (!early_ioapic_entries[apic])
-                       goto nomem;
-       }
+               if (!ioapic_entries[apic])
+                       return -ENOMEM;
 
-       for (apic = 0; apic < nr_ioapics; apic++)
                for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
-                       early_ioapic_entries[apic][pin] =
+                       ioapic_entries[apic][pin] =
                                ioapic_read_entry(apic, pin);
+       }
 
        return 0;
-
-nomem:
-       while (apic >= 0)
-               kfree(early_ioapic_entries[apic--]);
-       memset(early_ioapic_entries, 0,
-               ARRAY_SIZE(early_ioapic_entries));
-
-       return -ENOMEM;
 }
 
-void mask_IO_APIC_setup(void)
+/*
+ * Mask all IO APIC entries.
+ */
+void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries)
 {
        int apic, pin;
 
+       if (!ioapic_entries)
+               return;
+
        for (apic = 0; apic < nr_ioapics; apic++) {
-               if (!early_ioapic_entries[apic])
+               if (!ioapic_entries[apic])
                        break;
+
                for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
                        struct IO_APIC_route_entry entry;
 
-                       entry = early_ioapic_entries[apic][pin];
+                       entry = ioapic_entries[apic][pin];
                        if (!entry.mask) {
                                entry.mask = 1;
                                ioapic_write_entry(apic, pin, entry);
@@ -916,22 +927,30 @@ void mask_IO_APIC_setup(void)
        }
 }
 
-void restore_IO_APIC_setup(void)
+/*
+ * Restore IO APIC entries which was saved in ioapic_entries.
+ */
+int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries)
 {
        int apic, pin;
 
+       if (!ioapic_entries)
+               return -ENOMEM;
+
        for (apic = 0; apic < nr_ioapics; apic++) {
-               if (!early_ioapic_entries[apic])
-                       break;
+               if (!ioapic_entries[apic])
+                       return -ENOMEM;
+
                for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
                        ioapic_write_entry(apic, pin,
-                                          early_ioapic_entries[apic][pin]);
-               kfree(early_ioapic_entries[apic]);
-               early_ioapic_entries[apic] = NULL;
+                                       ioapic_entries[apic][pin]);
        }
+       return 0;
 }
 
-void reinit_intr_remapped_IO_APIC(int intr_remapping)
+void reinit_intr_remapped_IO_APIC(int intr_remapping,
+       struct IO_APIC_route_entry **ioapic_entries)
+
 {
        /*
         * for now plain restore of previous settings.
@@ -940,7 +959,17 @@ void reinit_intr_remapped_IO_APIC(int intr_remapping)
         * table entries. for now, do a plain restore, and wait for
         * the setup_IO_APIC_irqs() to do proper initialization.
         */
-       restore_IO_APIC_setup();
+       restore_IO_APIC_setup(ioapic_entries);
+}
+
+void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries)
+{
+       int apic;
+
+       for (apic = 0; apic < nr_ioapics; apic++)
+               kfree(ioapic_entries[apic]);
+
+       kfree(ioapic_entries);
 }
 #endif
 
@@ -2495,7 +2524,7 @@ static void irq_complete_move(struct irq_desc **descp)
 static inline void irq_complete_move(struct irq_desc **descp) {}
 #endif
 
-#ifdef CONFIG_INTR_REMAP
+#ifdef CONFIG_X86_X2APIC
 static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg)
 {
        int apic, pin;
@@ -2540,7 +2569,6 @@ static void ack_x2apic_edge(unsigned int irq)
 {
        ack_x2APIC_irq();
 }
-
 #endif
 
 static void ack_apic_edge(unsigned int irq)
@@ -2651,6 +2679,26 @@ static void ack_apic_level(unsigned int irq)
 #endif
 }
 
+#ifdef CONFIG_INTR_REMAP
+static void ir_ack_apic_edge(unsigned int irq)
+{
+#ifdef CONFIG_X86_X2APIC
+       if (x2apic_enabled())
+               return ack_x2apic_edge(irq);
+#endif
+       return ack_apic_edge(irq);
+}
+
+static void ir_ack_apic_level(unsigned int irq)
+{
+#ifdef CONFIG_X86_X2APIC
+       if (x2apic_enabled())
+               return ack_x2apic_level(irq);
+#endif
+       return ack_apic_level(irq);
+}
+#endif /* CONFIG_INTR_REMAP */
+
 static struct irq_chip ioapic_chip __read_mostly = {
        .name           = "IO-APIC",
        .startup        = startup_ioapic_irq,
@@ -2670,8 +2718,8 @@ static struct irq_chip ir_ioapic_chip __read_mostly = {
        .mask           = mask_IO_APIC_irq,
        .unmask         = unmask_IO_APIC_irq,
 #ifdef CONFIG_INTR_REMAP
-       .ack            = ack_x2apic_edge,
-       .eoi            = ack_x2apic_level,
+       .ack            = ir_ack_apic_edge,
+       .eoi            = ir_ack_apic_level,
 #ifdef CONFIG_SMP
        .set_affinity   = set_ir_ioapic_affinity_irq,
 #endif
@@ -3397,7 +3445,7 @@ static struct irq_chip msi_ir_chip = {
        .unmask         = unmask_msi_irq,
        .mask           = mask_msi_irq,
 #ifdef CONFIG_INTR_REMAP
-       .ack            = ack_x2apic_edge,
+       .ack            = ir_ack_apic_edge,
 #ifdef CONFIG_SMP
        .set_affinity   = ir_set_msi_irq_affinity,
 #endif
index 90f5b9ef5defbd44c6bb2d0ad0489bdafb1cca08..745579bc825687cdb5855b9d5e7a7a6cbd042239 100644 (file)
@@ -40,7 +40,7 @@ EXPORT_SYMBOL(bad_dma_address);
    to older i386. */
 struct device x86_dma_fallback_dev = {
        .init_name = "fallback device",
-       .coherent_dma_mask = DMA_32BIT_MASK,
+       .coherent_dma_mask = DMA_BIT_MASK(32),
        .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask,
 };
 EXPORT_SYMBOL(x86_dma_fallback_dev);
@@ -148,7 +148,7 @@ again:
        if (!is_buffer_dma_capable(dma_mask, addr, size)) {
                __free_pages(page, get_order(size));
 
-               if (dma_mask < DMA_32BIT_MASK && !(flag & GFP_DMA)) {
+               if (dma_mask < DMA_BIT_MASK(32) && !(flag & GFP_DMA)) {
                        flag = (flag & ~GFP_DMA32) | GFP_DMA;
                        goto again;
                }
@@ -243,7 +243,7 @@ int dma_supported(struct device *dev, u64 mask)
        /* Copied from i386. Doesn't make much sense, because it will
           only work for pci_alloc_coherent.
           The caller just has to use GFP_DMA in this case. */
-       if (mask < DMA_24BIT_MASK)
+       if (mask < DMA_BIT_MASK(24))
                return 0;
 
        /* Tell the device to use SAC when IOMMU force is on.  This
@@ -258,7 +258,7 @@ int dma_supported(struct device *dev, u64 mask)
           SAC for these.  Assume all masks <= 40 bits are of this
           type. Normally this doesn't make any difference, but gives
           more gentle handling of IOMMU overflow. */
-       if (iommu_sac_force && (mask >= DMA_40BIT_MASK)) {
+       if (iommu_sac_force && (mask >= DMA_BIT_MASK(40))) {
                dev_info(dev, "Force SAC with mask %Lx\n", mask);
                return 0;
        }
index c6d703b393261c2e5f45002b188b4d56638bc530..71d412a09f30ea2f529bd9a07cbd8b8d74072772 100644 (file)
@@ -15,7 +15,7 @@ static int
 check_addr(char *name, struct device *hwdev, dma_addr_t bus, size_t size)
 {
        if (hwdev && !is_buffer_dma_capable(*hwdev->dma_mask, bus, size)) {
-               if (*hwdev->dma_mask >= DMA_32BIT_MASK)
+               if (*hwdev->dma_mask >= DMA_BIT_MASK(32))
                        printk(KERN_ERR
                            "nommu_%s: overflow %Lx+%zu of device mask %Lx\n",
                                name, (long long)bus, size,
index 996ed906d8ca518c62dba691ad7b579ee794e1a0..43fdedc524ee1e62ac403dd0190e55da8ebf4f10 100644 (file)
@@ -64,12 +64,11 @@ static struct workqueue_struct *kblockd_workqueue;
 
 static void drive_stat_acct(struct request *rq, int new_io)
 {
-       struct gendisk *disk = rq->rq_disk;
        struct hd_struct *part;
        int rw = rq_data_dir(rq);
        int cpu;
 
-       if (!blk_fs_request(rq) || !disk || !blk_do_io_stat(disk->queue))
+       if (!blk_fs_request(rq) || !blk_do_io_stat(rq))
                return;
 
        cpu = part_stat_lock();
@@ -484,11 +483,11 @@ static int blk_init_free_list(struct request_queue *q)
 {
        struct request_list *rl = &q->rq;
 
-       rl->count[READ] = rl->count[WRITE] = 0;
-       rl->starved[READ] = rl->starved[WRITE] = 0;
+       rl->count[BLK_RW_SYNC] = rl->count[BLK_RW_ASYNC] = 0;
+       rl->starved[BLK_RW_SYNC] = rl->starved[BLK_RW_ASYNC] = 0;
        rl->elvpriv = 0;
-       init_waitqueue_head(&rl->wait[READ]);
-       init_waitqueue_head(&rl->wait[WRITE]);
+       init_waitqueue_head(&rl->wait[BLK_RW_SYNC]);
+       init_waitqueue_head(&rl->wait[BLK_RW_ASYNC]);
 
        rl->rq_pool = mempool_create_node(BLKDEV_MIN_RQ, mempool_alloc_slab,
                                mempool_free_slab, request_cachep, q->node);
@@ -699,18 +698,18 @@ static void ioc_set_batching(struct request_queue *q, struct io_context *ioc)
        ioc->last_waited = jiffies;
 }
 
-static void __freed_request(struct request_queue *q, int rw)
+static void __freed_request(struct request_queue *q, int sync)
 {
        struct request_list *rl = &q->rq;
 
-       if (rl->count[rw] < queue_congestion_off_threshold(q))
-               blk_clear_queue_congested(q, rw);
+       if (rl->count[sync] < queue_congestion_off_threshold(q))
+               blk_clear_queue_congested(q, sync);
 
-       if (rl->count[rw] + 1 <= q->nr_requests) {
-               if (waitqueue_active(&rl->wait[rw]))
-                       wake_up(&rl->wait[rw]);
+       if (rl->count[sync] + 1 <= q->nr_requests) {
+               if (waitqueue_active(&rl->wait[sync]))
+                       wake_up(&rl->wait[sync]);
 
-               blk_clear_queue_full(q, rw);
+               blk_clear_queue_full(q, sync);
        }
 }
 
@@ -718,18 +717,18 @@ static void __freed_request(struct request_queue *q, int rw)
  * A request has just been released.  Account for it, update the full and
  * congestion status, wake up any waiters.   Called under q->queue_lock.
  */
-static void freed_request(struct request_queue *q, int rw, int priv)
+static void freed_request(struct request_queue *q, int sync, int priv)
 {
        struct request_list *rl = &q->rq;
 
-       rl->count[rw]--;
+       rl->count[sync]--;
        if (priv)
                rl->elvpriv--;
 
-       __freed_request(q, rw);
+       __freed_request(q, sync);
 
-       if (unlikely(rl->starved[rw ^ 1]))
-               __freed_request(q, rw ^ 1);
+       if (unlikely(rl->starved[sync ^ 1]))
+               __freed_request(q, sync ^ 1);
 }
 
 /*
@@ -743,15 +742,15 @@ static struct request *get_request(struct request_queue *q, int rw_flags,
        struct request *rq = NULL;
        struct request_list *rl = &q->rq;
        struct io_context *ioc = NULL;
-       const int rw = rw_flags & 0x01;
+       const bool is_sync = rw_is_sync(rw_flags) != 0;
        int may_queue, priv;
 
        may_queue = elv_may_queue(q, rw_flags);
        if (may_queue == ELV_MQUEUE_NO)
                goto rq_starved;
 
-       if (rl->count[rw]+1 >= queue_congestion_on_threshold(q)) {
-               if (rl->count[rw]+1 >= q->nr_requests) {
+       if (rl->count[is_sync]+1 >= queue_congestion_on_threshold(q)) {
+               if (rl->count[is_sync]+1 >= q->nr_requests) {
                        ioc = current_io_context(GFP_ATOMIC, q->node);
                        /*
                         * The queue will fill after this allocation, so set
@@ -759,9 +758,9 @@ static struct request *get_request(struct request_queue *q, int rw_flags,
                         * This process will be allowed to complete a batch of
                         * requests, others will be blocked.
                         */
-                       if (!blk_queue_full(q, rw)) {
+                       if (!blk_queue_full(q, is_sync)) {
                                ioc_set_batching(q, ioc);
-                               blk_set_queue_full(q, rw);
+                               blk_set_queue_full(q, is_sync);
                        } else {
                                if (may_queue != ELV_MQUEUE_MUST
                                                && !ioc_batching(q, ioc)) {
@@ -774,7 +773,7 @@ static struct request *get_request(struct request_queue *q, int rw_flags,
                                }
                        }
                }
-               blk_set_queue_congested(q, rw);
+               blk_set_queue_congested(q, is_sync);
        }
 
        /*
@@ -782,11 +781,11 @@ static struct request *get_request(struct request_queue *q, int rw_flags,
         * limit of requests, otherwise we could have thousands of requests
         * allocated with any setting of ->nr_requests
         */
-       if (rl->count[rw] >= (3 * q->nr_requests / 2))
+       if (rl->count[is_sync] >= (3 * q->nr_requests / 2))
                goto out;
 
-       rl->count[rw]++;
-       rl->starved[rw] = 0;
+       rl->count[is_sync]++;
+       rl->starved[is_sync] = 0;
 
        priv = !test_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
        if (priv)
@@ -804,7 +803,7 @@ static struct request *get_request(struct request_queue *q, int rw_flags,
                 * wait queue, but this is pretty rare.
                 */
                spin_lock_irq(q->queue_lock);
-               freed_request(q, rw, priv);
+               freed_request(q, is_sync, priv);
 
                /*
                 * in the very unlikely event that allocation failed and no
@@ -814,8 +813,8 @@ static struct request *get_request(struct request_queue *q, int rw_flags,
                 * rq mempool into READ and WRITE
                 */
 rq_starved:
-               if (unlikely(rl->count[rw] == 0))
-                       rl->starved[rw] = 1;
+               if (unlikely(rl->count[is_sync] == 0))
+                       rl->starved[is_sync] = 1;
 
                goto out;
        }
@@ -829,7 +828,7 @@ rq_starved:
        if (ioc_batching(q, ioc))
                ioc->nr_batch_requests--;
 
-       trace_block_getrq(q, bio, rw);
+       trace_block_getrq(q, bio, rw_flags & 1);
 out:
        return rq;
 }
@@ -843,7 +842,7 @@ out:
 static struct request *get_request_wait(struct request_queue *q, int rw_flags,
                                        struct bio *bio)
 {
-       const int rw = rw_flags & 0x01;
+       const bool is_sync = rw_is_sync(rw_flags) != 0;
        struct request *rq;
 
        rq = get_request(q, rw_flags, bio, GFP_NOIO);
@@ -852,10 +851,10 @@ static struct request *get_request_wait(struct request_queue *q, int rw_flags,
                struct io_context *ioc;
                struct request_list *rl = &q->rq;
 
-               prepare_to_wait_exclusive(&rl->wait[rw], &wait,
+               prepare_to_wait_exclusive(&rl->wait[is_sync], &wait,
                                TASK_UNINTERRUPTIBLE);
 
-               trace_block_sleeprq(q, bio, rw);
+               trace_block_sleeprq(q, bio, rw_flags & 1);
 
                __generic_unplug_device(q);
                spin_unlock_irq(q->queue_lock);
@@ -871,7 +870,7 @@ static struct request *get_request_wait(struct request_queue *q, int rw_flags,
                ioc_set_batching(q, ioc);
 
                spin_lock_irq(q->queue_lock);
-               finish_wait(&rl->wait[rw], &wait);
+               finish_wait(&rl->wait[is_sync], &wait);
 
                rq = get_request(q, rw_flags, bio, GFP_NOIO);
        };
@@ -1070,14 +1069,14 @@ void __blk_put_request(struct request_queue *q, struct request *req)
         * it didn't come out of our reserved rq pools
         */
        if (req->cmd_flags & REQ_ALLOCED) {
-               int rw = rq_data_dir(req);
+               int is_sync = rq_is_sync(req) != 0;
                int priv = req->cmd_flags & REQ_ELVPRIV;
 
                BUG_ON(!list_empty(&req->queuelist));
                BUG_ON(!hlist_unhashed(&req->hash));
 
                blk_free_request(q, req);
-               freed_request(q, rw, priv);
+               freed_request(q, is_sync, priv);
        }
 }
 EXPORT_SYMBOL_GPL(__blk_put_request);
@@ -1124,10 +1123,10 @@ void init_request_from_bio(struct request *req, struct bio *bio)
 
        if (bio_sync(bio))
                req->cmd_flags |= REQ_RW_SYNC;
-       if (bio_unplug(bio))
-               req->cmd_flags |= REQ_UNPLUG;
        if (bio_rw_meta(bio))
                req->cmd_flags |= REQ_RW_META;
+       if (bio_noidle(bio))
+               req->cmd_flags |= REQ_NOIDLE;
 
        req->errors = 0;
        req->hard_sector = req->sector = bio->bi_sector;
@@ -1136,6 +1135,15 @@ void init_request_from_bio(struct request *req, struct bio *bio)
        blk_rq_bio_prep(req->q, req, bio);
 }
 
+/*
+ * Only disabling plugging for non-rotational devices if it does tagging
+ * as well, otherwise we do need the proper merging
+ */
+static inline bool queue_should_plug(struct request_queue *q)
+{
+       return !(blk_queue_nonrot(q) && blk_queue_tagged(q));
+}
+
 static int __make_request(struct request_queue *q, struct bio *bio)
 {
        struct request *req;
@@ -1242,11 +1250,11 @@ get_rq:
        if (test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags) ||
            bio_flagged(bio, BIO_CPU_AFFINE))
                req->cpu = blk_cpu_to_group(smp_processor_id());
-       if (!blk_queue_nonrot(q) && elv_queue_empty(q))
+       if (queue_should_plug(q) && elv_queue_empty(q))
                blk_plug_device(q);
        add_request(q, req);
 out:
-       if (unplug || blk_queue_nonrot(q))
+       if (unplug || !queue_should_plug(q))
                __generic_unplug_device(q);
        spin_unlock_irq(q->queue_lock);
        return 0;
@@ -1664,9 +1672,7 @@ EXPORT_SYMBOL(blkdev_dequeue_request);
 
 static void blk_account_io_completion(struct request *req, unsigned int bytes)
 {
-       struct gendisk *disk = req->rq_disk;
-
-       if (!disk || !blk_do_io_stat(disk->queue))
+       if (!blk_do_io_stat(req))
                return;
 
        if (blk_fs_request(req)) {
@@ -1683,9 +1689,7 @@ static void blk_account_io_completion(struct request *req, unsigned int bytes)
 
 static void blk_account_io_done(struct request *req)
 {
-       struct gendisk *disk = req->rq_disk;
-
-       if (!disk || !blk_do_io_stat(disk->queue))
+       if (!blk_do_io_stat(req))
                return;
 
        /*
@@ -1700,7 +1704,7 @@ static void blk_account_io_done(struct request *req)
                int cpu;
 
                cpu = part_stat_lock();
-               part = disk_map_sector_rcu(disk, req->sector);
+               part = disk_map_sector_rcu(req->rq_disk, req->sector);
 
                part_stat_inc(cpu, part, ios[rw]);
                part_stat_add(cpu, part, ticks[rw], duration);
index e39cb24b76792ad50d575ee88dcd440697c69074..63760ca3da0f44688a7d390048a73580d0043c3f 100644 (file)
@@ -338,6 +338,22 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
        return 1;
 }
 
+static void blk_account_io_merge(struct request *req)
+{
+       if (blk_do_io_stat(req)) {
+               struct hd_struct *part;
+               int cpu;
+
+               cpu = part_stat_lock();
+               part = disk_map_sector_rcu(req->rq_disk, req->sector);
+
+               part_round_stats(cpu, part);
+               part_dec_in_flight(part);
+
+               part_stat_unlock();
+       }
+}
+
 /*
  * Has to be called with the request spinlock acquired
  */
@@ -386,18 +402,7 @@ static int attempt_merge(struct request_queue *q, struct request *req,
 
        elv_merge_requests(q, req, next);
 
-       if (req->rq_disk) {
-               struct hd_struct *part;
-               int cpu;
-
-               cpu = part_stat_lock();
-               part = disk_map_sector_rcu(req->rq_disk, req->sector);
-
-               part_round_stats(cpu, part);
-               part_dec_in_flight(part);
-
-               part_stat_unlock();
-       }
+       blk_account_io_merge(req);
 
        req->ioprio = ioprio_best(req->ioprio, next->ioprio);
        if (blk_rq_cpu_valid(next))
index 59fd05d9f1d5d8022d1b16a5263d6ae087aadb21..69c42adde52bafb61913d127b9d867e69e45a0c4 100644 (file)
@@ -431,7 +431,7 @@ EXPORT_SYMBOL(blk_queue_segment_boundary);
  *
  * description:
  *    set required memory and length alignment for direct dma transactions.
- *    this is used when buiding direct io requests for the queue.
+ *    this is used when building direct io requests for the queue.
  *
  **/
 void blk_queue_dma_alignment(struct request_queue *q, int mask)
index e29ddfc73cf475d99f95d2daa7d0be58a474d01b..73f36beff5cd58c85ca0111df6ea4061ab2d27c0 100644 (file)
@@ -48,28 +48,28 @@ queue_requests_store(struct request_queue *q, const char *page, size_t count)
        q->nr_requests = nr;
        blk_queue_congestion_threshold(q);
 
-       if (rl->count[READ] >= queue_congestion_on_threshold(q))
-               blk_set_queue_congested(q, READ);
-       else if (rl->count[READ] < queue_congestion_off_threshold(q))
-               blk_clear_queue_congested(q, READ);
-
-       if (rl->count[WRITE] >= queue_congestion_on_threshold(q))
-               blk_set_queue_congested(q, WRITE);
-       else if (rl->count[WRITE] < queue_congestion_off_threshold(q))
-               blk_clear_queue_congested(q, WRITE);
-
-       if (rl->count[READ] >= q->nr_requests) {
-               blk_set_queue_full(q, READ);
-       } else if (rl->count[READ]+1 <= q->nr_requests) {
-               blk_clear_queue_full(q, READ);
-               wake_up(&rl->wait[READ]);
+       if (rl->count[BLK_RW_SYNC] >= queue_congestion_on_threshold(q))
+               blk_set_queue_congested(q, BLK_RW_SYNC);
+       else if (rl->count[BLK_RW_SYNC] < queue_congestion_off_threshold(q))
+               blk_clear_queue_congested(q, BLK_RW_SYNC);
+
+       if (rl->count[BLK_RW_ASYNC] >= queue_congestion_on_threshold(q))
+               blk_set_queue_congested(q, BLK_RW_ASYNC);
+       else if (rl->count[BLK_RW_ASYNC] < queue_congestion_off_threshold(q))
+               blk_clear_queue_congested(q, BLK_RW_ASYNC);
+
+       if (rl->count[BLK_RW_SYNC] >= q->nr_requests) {
+               blk_set_queue_full(q, BLK_RW_SYNC);
+       } else if (rl->count[BLK_RW_SYNC]+1 <= q->nr_requests) {
+               blk_clear_queue_full(q, BLK_RW_SYNC);
+               wake_up(&rl->wait[BLK_RW_SYNC]);
        }
 
-       if (rl->count[WRITE] >= q->nr_requests) {
-               blk_set_queue_full(q, WRITE);
-       } else if (rl->count[WRITE]+1 <= q->nr_requests) {
-               blk_clear_queue_full(q, WRITE);
-               wake_up(&rl->wait[WRITE]);
+       if (rl->count[BLK_RW_ASYNC] >= q->nr_requests) {
+               blk_set_queue_full(q, BLK_RW_ASYNC);
+       } else if (rl->count[BLK_RW_ASYNC]+1 <= q->nr_requests) {
+               blk_clear_queue_full(q, BLK_RW_ASYNC);
+               wake_up(&rl->wait[BLK_RW_ASYNC]);
        }
        spin_unlock_irq(q->queue_lock);
        return ret;
@@ -209,10 +209,14 @@ static ssize_t queue_iostats_store(struct request_queue *q, const char *page,
        ssize_t ret = queue_var_store(&stats, page, count);
 
        spin_lock_irq(q->queue_lock);
+       elv_quisce_start(q);
+
        if (stats)
                queue_flag_set(QUEUE_FLAG_IO_STAT, q);
        else
                queue_flag_clear(QUEUE_FLAG_IO_STAT, q);
+
+       elv_quisce_end(q);
        spin_unlock_irq(q->queue_lock);
 
        return ret;
index 3ee94358b43d0ba8d1194daaac7d34534e87bfa5..24fcaeeaf6202b1e19de9f8e57477b97bccc4065 100644 (file)
@@ -70,6 +70,10 @@ void blk_queue_congestion_threshold(struct request_queue *q);
 
 int blk_dev_init(void);
 
+void elv_quisce_start(struct request_queue *q);
+void elv_quisce_end(struct request_queue *q);
+
+
 /*
  * Return the threshold (number of used requests) at which the queue is
  * considered to be congested.  It include a little hysteresis to keep the
@@ -108,12 +112,14 @@ static inline int blk_cpu_to_group(int cpu)
 #endif
 }
 
-static inline int blk_do_io_stat(struct request_queue *q)
+static inline int blk_do_io_stat(struct request *rq)
 {
-       if (q)
-               return blk_queue_io_stat(q);
+       struct gendisk *disk = rq->rq_disk;
 
-       return 0;
+       if (!disk || !disk->queue)
+               return 0;
+
+       return blk_queue_io_stat(disk->queue) && (rq->cmd_flags & REQ_ELVPRIV);
 }
 
 #endif
index 664ebfd092ec21f95cedc56b6a5259874db0399c..a4809de6fea656a4ac6091f6c61c38f536a4f766 100644 (file)
@@ -160,6 +160,7 @@ struct cfq_queue {
 
        unsigned long slice_end;
        long slice_resid;
+       unsigned int slice_dispatch;
 
        /* pending metadata requests */
        int meta_pending;
@@ -176,13 +177,12 @@ struct cfq_queue {
 enum cfqq_state_flags {
        CFQ_CFQQ_FLAG_on_rr = 0,        /* on round-robin busy list */
        CFQ_CFQQ_FLAG_wait_request,     /* waiting for a request */
+       CFQ_CFQQ_FLAG_must_dispatch,    /* must be allowed a dispatch */
        CFQ_CFQQ_FLAG_must_alloc,       /* must be allowed rq alloc */
        CFQ_CFQQ_FLAG_must_alloc_slice, /* per-slice must_alloc flag */
-       CFQ_CFQQ_FLAG_must_dispatch,    /* must dispatch, even if expired */
        CFQ_CFQQ_FLAG_fifo_expire,      /* FIFO checked in this slice */
        CFQ_CFQQ_FLAG_idle_window,      /* slice idling enabled */
        CFQ_CFQQ_FLAG_prio_changed,     /* task priority has changed */
-       CFQ_CFQQ_FLAG_queue_new,        /* queue never been serviced */
        CFQ_CFQQ_FLAG_slice_new,        /* no requests dispatched in slice */
        CFQ_CFQQ_FLAG_sync,             /* synchronous queue */
 };
@@ -203,13 +203,12 @@ static inline int cfq_cfqq_##name(const struct cfq_queue *cfqq)           \
 
 CFQ_CFQQ_FNS(on_rr);
 CFQ_CFQQ_FNS(wait_request);
+CFQ_CFQQ_FNS(must_dispatch);
 CFQ_CFQQ_FNS(must_alloc);
 CFQ_CFQQ_FNS(must_alloc_slice);
-CFQ_CFQQ_FNS(must_dispatch);
 CFQ_CFQQ_FNS(fifo_expire);
 CFQ_CFQQ_FNS(idle_window);
 CFQ_CFQQ_FNS(prio_changed);
-CFQ_CFQQ_FNS(queue_new);
 CFQ_CFQQ_FNS(slice_new);
 CFQ_CFQQ_FNS(sync);
 #undef CFQ_CFQQ_FNS
@@ -774,10 +773,15 @@ static void __cfq_set_active_queue(struct cfq_data *cfqd,
        if (cfqq) {
                cfq_log_cfqq(cfqd, cfqq, "set_active");
                cfqq->slice_end = 0;
+               cfqq->slice_dispatch = 0;
+
+               cfq_clear_cfqq_wait_request(cfqq);
+               cfq_clear_cfqq_must_dispatch(cfqq);
                cfq_clear_cfqq_must_alloc_slice(cfqq);
                cfq_clear_cfqq_fifo_expire(cfqq);
                cfq_mark_cfqq_slice_new(cfqq);
-               cfq_clear_cfqq_queue_new(cfqq);
+
+               del_timer(&cfqd->idle_slice_timer);
        }
 
        cfqd->active_queue = cfqq;
@@ -795,7 +799,6 @@ __cfq_slice_expired(struct cfq_data *cfqd, struct cfq_queue *cfqq,
        if (cfq_cfqq_wait_request(cfqq))
                del_timer(&cfqd->idle_slice_timer);
 
-       cfq_clear_cfqq_must_dispatch(cfqq);
        cfq_clear_cfqq_wait_request(cfqq);
 
        /*
@@ -924,7 +927,6 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
            (sample_valid(cic->ttime_samples) && cic->ttime_mean > 2))
                return;
 
-       cfq_mark_cfqq_must_dispatch(cfqq);
        cfq_mark_cfqq_wait_request(cfqq);
 
        /*
@@ -1010,7 +1012,7 @@ static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd)
        /*
         * The active queue has run out of time, expire it and select new.
         */
-       if (cfq_slice_used(cfqq))
+       if (cfq_slice_used(cfqq) && !cfq_cfqq_must_dispatch(cfqq))
                goto expire;
 
        /*
@@ -1053,66 +1055,6 @@ keep_queue:
        return cfqq;
 }
 
-/*
- * Dispatch some requests from cfqq, moving them to the request queue
- * dispatch list.
- */
-static int
-__cfq_dispatch_requests(struct cfq_data *cfqd, struct cfq_queue *cfqq,
-                       int max_dispatch)
-{
-       int dispatched = 0;
-
-       BUG_ON(RB_EMPTY_ROOT(&cfqq->sort_list));
-
-       do {
-               struct request *rq;
-
-               /*
-                * follow expired path, else get first next available
-                */
-               rq = cfq_check_fifo(cfqq);
-               if (rq == NULL)
-                       rq = cfqq->next_rq;
-
-               /*
-                * finally, insert request into driver dispatch list
-                */
-               cfq_dispatch_insert(cfqd->queue, rq);
-
-               dispatched++;
-
-               if (!cfqd->active_cic) {
-                       atomic_inc(&RQ_CIC(rq)->ioc->refcount);
-                       cfqd->active_cic = RQ_CIC(rq);
-               }
-
-               if (RB_EMPTY_ROOT(&cfqq->sort_list))
-                       break;
-
-               /*
-                * If there is a non-empty RT cfqq waiting for current
-                * cfqq's timeslice to complete, pre-empt this cfqq
-                */
-               if (!cfq_class_rt(cfqq) && cfqd->busy_rt_queues)
-                       break;
-
-       } while (dispatched < max_dispatch);
-
-       /*
-        * expire an async queue immediately if it has used up its slice. idle
-        * queue always expire after 1 dispatch round.
-        */
-       if (cfqd->busy_queues > 1 && ((!cfq_cfqq_sync(cfqq) &&
-           dispatched >= cfq_prio_to_maxrq(cfqd, cfqq)) ||
-           cfq_class_idle(cfqq))) {
-               cfqq->slice_end = jiffies + 1;
-               cfq_slice_expired(cfqd, 0);
-       }
-
-       return dispatched;
-}
-
 static int __cfq_forced_dispatch_cfqq(struct cfq_queue *cfqq)
 {
        int dispatched = 0;
@@ -1146,11 +1088,45 @@ static int cfq_forced_dispatch(struct cfq_data *cfqd)
        return dispatched;
 }
 
+/*
+ * Dispatch a request from cfqq, moving them to the request queue
+ * dispatch list.
+ */
+static void cfq_dispatch_request(struct cfq_data *cfqd, struct cfq_queue *cfqq)
+{
+       struct request *rq;
+
+       BUG_ON(RB_EMPTY_ROOT(&cfqq->sort_list));
+
+       /*
+        * follow expired path, else get first next available
+        */
+       rq = cfq_check_fifo(cfqq);
+       if (!rq)
+               rq = cfqq->next_rq;
+
+       /*
+        * insert request into driver dispatch list
+        */
+       cfq_dispatch_insert(cfqd->queue, rq);
+
+       if (!cfqd->active_cic) {
+               struct cfq_io_context *cic = RQ_CIC(rq);
+
+               atomic_inc(&cic->ioc->refcount);
+               cfqd->active_cic = cic;
+       }
+}
+
+/*
+ * Find the cfqq that we need to service and move a request from that to the
+ * dispatch list
+ */
 static int cfq_dispatch_requests(struct request_queue *q, int force)
 {
        struct cfq_data *cfqd = q->elevator->elevator_data;
        struct cfq_queue *cfqq;
-       int dispatched;
+       unsigned int max_dispatch;
 
        if (!cfqd->busy_queues)
                return 0;
@@ -1158,29 +1134,63 @@ static int cfq_dispatch_requests(struct request_queue *q, int force)
        if (unlikely(force))
                return cfq_forced_dispatch(cfqd);
 
-       dispatched = 0;
-       while ((cfqq = cfq_select_queue(cfqd)) != NULL) {
-               int max_dispatch;
+       cfqq = cfq_select_queue(cfqd);
+       if (!cfqq)
+               return 0;
+
+       /*
+        * If this is an async queue and we have sync IO in flight, let it wait
+        */
+       if (cfqd->sync_flight && !cfq_cfqq_sync(cfqq))
+               return 0;
+
+       max_dispatch = cfqd->cfq_quantum;
+       if (cfq_class_idle(cfqq))
+               max_dispatch = 1;
 
-               max_dispatch = cfqd->cfq_quantum;
+       /*
+        * Does this cfqq already have too much IO in flight?
+        */
+       if (cfqq->dispatched >= max_dispatch) {
+               /*
+                * idle queue must always only have a single IO in flight
+                */
                if (cfq_class_idle(cfqq))
-                       max_dispatch = 1;
+                       return 0;
 
-               if (cfqq->dispatched >= max_dispatch && cfqd->busy_queues > 1)
-                       break;
+               /*
+                * We have other queues, don't allow more IO from this one
+                */
+               if (cfqd->busy_queues > 1)
+                       return 0;
 
-               if (cfqd->sync_flight && !cfq_cfqq_sync(cfqq))
-                       break;
+               /*
+                * we are the only queue, allow up to 4 times of 'quantum'
+                */
+               if (cfqq->dispatched >= 4 * max_dispatch)
+                       return 0;
+       }
 
-               cfq_clear_cfqq_must_dispatch(cfqq);
-               cfq_clear_cfqq_wait_request(cfqq);
-               del_timer(&cfqd->idle_slice_timer);
+       /*
+        * Dispatch a request from this cfqq
+        */
+       cfq_dispatch_request(cfqd, cfqq);
+       cfqq->slice_dispatch++;
+       cfq_clear_cfqq_must_dispatch(cfqq);
 
-               dispatched += __cfq_dispatch_requests(cfqd, cfqq, max_dispatch);
+       /*
+        * expire an async queue immediately if it has used up its slice. idle
+        * queue always expire after 1 dispatch round.
+        */
+       if (cfqd->busy_queues > 1 && ((!cfq_cfqq_sync(cfqq) &&
+           cfqq->slice_dispatch >= cfq_prio_to_maxrq(cfqd, cfqq)) ||
+           cfq_class_idle(cfqq))) {
+               cfqq->slice_end = jiffies + 1;
+               cfq_slice_expired(cfqd, 0);
        }
 
-       cfq_log(cfqd, "dispatched=%d", dispatched);
-       return dispatched;
+       cfq_log(cfqd, "dispatched a request");
+       return 1;
 }
 
 /*
@@ -1506,7 +1516,6 @@ retry:
                cfqq->cfqd = cfqd;
 
                cfq_mark_cfqq_prio_changed(cfqq);
-               cfq_mark_cfqq_queue_new(cfqq);
 
                cfq_init_prio_data(cfqq, ioc);
 
@@ -1893,15 +1902,13 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
 
        if (cfqq == cfqd->active_queue) {
                /*
-                * if we are waiting for a request for this queue, let it rip
-                * immediately and flag that we must not expire this queue
-                * just now
+                * Remember that we saw a request from this process, but
+                * don't start queuing just yet. Otherwise we risk seeing lots
+                * of tiny requests, because we disrupt the normal plugging
+                * and merging.
                 */
-               if (cfq_cfqq_wait_request(cfqq)) {
+               if (cfq_cfqq_wait_request(cfqq))
                        cfq_mark_cfqq_must_dispatch(cfqq);
-                       del_timer(&cfqd->idle_slice_timer);
-                       blk_start_queueing(cfqd->queue);
-               }
        } else if (cfq_should_preempt(cfqd, cfqq, rq)) {
                /*
                 * not the active queue - expire current slice if it is
@@ -1910,7 +1917,6 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
                 * this new queue is RT and the current one is BE
                 */
                cfq_preempt_queue(cfqd, cfqq);
-               cfq_mark_cfqq_must_dispatch(cfqq);
                blk_start_queueing(cfqd->queue);
        }
 }
@@ -1992,8 +1998,10 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
                }
                if (cfq_slice_used(cfqq) || cfq_class_idle(cfqq))
                        cfq_slice_expired(cfqd, 1);
-               else if (sync && RB_EMPTY_ROOT(&cfqq->sort_list))
+               else if (sync && !rq_noidle(rq) &&
+                        RB_EMPTY_ROOT(&cfqq->sort_list)) {
                        cfq_arm_slice_timer(cfqd);
+               }
        }
 
        if (!cfqd->rq_in_driver)
@@ -2169,6 +2177,12 @@ static void cfq_idle_slice_timer(unsigned long data)
        if (cfqq) {
                timed_out = 0;
 
+               /*
+                * We saw a request before the queue expired, let it through
+                */
+               if (cfq_cfqq_must_dispatch(cfqq))
+                       goto out_kick;
+
                /*
                 * expired
                 */
@@ -2185,10 +2199,8 @@ static void cfq_idle_slice_timer(unsigned long data)
                /*
                 * not expired and it has a request pending, let it dispatch
                 */
-               if (!RB_EMPTY_ROOT(&cfqq->sort_list)) {
-                       cfq_mark_cfqq_must_dispatch(cfqq);
+               if (!RB_EMPTY_ROOT(&cfqq->sort_list))
                        goto out_kick;
-               }
        }
 expire:
        cfq_slice_expired(cfqd, timed_out);
index 98259eda0ef66d4051cc5da958c0191f353b8158..fb81bcc14a8c0e14a1288ca255f2419337cc0568 100644 (file)
@@ -573,7 +573,7 @@ void elv_requeue_request(struct request_queue *q, struct request *rq)
        elv_insert(q, rq, ELEVATOR_INSERT_REQUEUE);
 }
 
-static void elv_drain_elevator(struct request_queue *q)
+void elv_drain_elevator(struct request_queue *q)
 {
        static int printed;
        while (q->elevator->ops->elevator_dispatch_fn(q, 1))
@@ -587,6 +587,31 @@ static void elv_drain_elevator(struct request_queue *q)
        }
 }
 
+/*
+ * Call with queue lock held, interrupts disabled
+ */
+void elv_quisce_start(struct request_queue *q)
+{
+       queue_flag_set(QUEUE_FLAG_ELVSWITCH, q);
+
+       /*
+        * make sure we don't have any requests in flight
+        */
+       elv_drain_elevator(q);
+       while (q->rq.elvpriv) {
+               blk_start_queueing(q);
+               spin_unlock_irq(q->queue_lock);
+               msleep(10);
+               spin_lock_irq(q->queue_lock);
+               elv_drain_elevator(q);
+       }
+}
+
+void elv_quisce_end(struct request_queue *q)
+{
+       queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
+}
+
 void elv_insert(struct request_queue *q, struct request *rq, int where)
 {
        struct list_head *pos;
@@ -677,7 +702,7 @@ void elv_insert(struct request_queue *q, struct request *rq, int where)
        }
 
        if (unplug_it && blk_queue_plugged(q)) {
-               int nrq = q->rq.count[READ] + q->rq.count[WRITE]
+               int nrq = q->rq.count[BLK_RW_SYNC] + q->rq.count[BLK_RW_ASYNC]
                        - q->in_flight;
 
                if (nrq >= q->unplug_thresh)
@@ -1101,18 +1126,7 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
         * Turn on BYPASS and drain all requests w/ elevator private data
         */
        spin_lock_irq(q->queue_lock);
-
-       queue_flag_set(QUEUE_FLAG_ELVSWITCH, q);
-
-       elv_drain_elevator(q);
-
-       while (q->rq.elvpriv) {
-               blk_start_queueing(q);
-               spin_unlock_irq(q->queue_lock);
-               msleep(10);
-               spin_lock_irq(q->queue_lock);
-               elv_drain_elevator(q);
-       }
+       elv_quisce_start(q);
 
        /*
         * Remember old elevator.
@@ -1136,7 +1150,7 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
         */
        elevator_exit(old_elevator);
        spin_lock_irq(q->queue_lock);
-       queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
+       elv_quisce_end(q);
        spin_unlock_irq(q->queue_lock);
 
        blk_add_trace_msg(q, "elv switch: %s", e->elevator_type->elevator_name);
index 045054037c2d2684f95e87b29e02088cd9a7dc66..daf4ad37896d1f13c627229070fb6893fc9e8474 100644 (file)
@@ -53,7 +53,6 @@ ACPI_MODULE_NAME("nsxfeval")
 /* Local prototypes */
 static void acpi_ns_resolve_references(struct acpi_evaluate_info *info);
 
-#ifdef ACPI_FUTURE_USAGE
 /*******************************************************************************
  *
  * FUNCTION:    acpi_evaluate_object_typed
@@ -147,7 +146,7 @@ acpi_evaluate_object_typed(acpi_handle handle,
 }
 
 ACPI_EXPORT_SYMBOL(acpi_evaluate_object_typed)
-#endif                         /*  ACPI_FUTURE_USAGE  */
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_evaluate_object
index 788bba2b1e1798fc8b60336f701e06348c0396c8..57be6bea48eb123cdac22c4e1a53d6d54e3aafb5 100644 (file)
@@ -78,6 +78,7 @@ static ssize_t ahci_led_store(struct ata_port *ap, const char *buf,
 static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
                                        ssize_t size);
 #define MAX_SLOTS 8
+#define MAX_RETRY 15
 
 enum {
        AHCI_PCI_BAR            = 5,
@@ -1115,6 +1116,8 @@ static void ahci_start_port(struct ata_port *ap)
        struct ahci_port_priv *pp = ap->private_data;
        struct ata_link *link;
        struct ahci_em_priv *emp;
+       ssize_t rc;
+       int i;
 
        /* enable FIS reception */
        ahci_start_fis_rx(ap);
@@ -1126,7 +1129,17 @@ static void ahci_start_port(struct ata_port *ap)
        if (ap->flags & ATA_FLAG_EM) {
                ata_for_each_link(link, ap, EDGE) {
                        emp = &pp->em_priv[link->pmp];
-                       ahci_transmit_led_message(ap, emp->led_state, 4);
+
+                       /* EM Transmit bit maybe busy during init */
+                       for (i = 0; i < MAX_RETRY; i++) {
+                               rc = ahci_transmit_led_message(ap,
+                                                              emp->led_state,
+                                                              4);
+                               if (rc == -EBUSY)
+                                       udelay(100);
+                               else
+                                       break;
+                       }
                }
        }
 
@@ -1331,7 +1344,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
        em_ctl = readl(mmio + HOST_EM_CTL);
        if (em_ctl & EM_CTL_TM) {
                spin_unlock_irqrestore(ap->lock, flags);
-               return -EINVAL;
+               return -EBUSY;
        }
 
        /*
@@ -2405,10 +2418,10 @@ static int ahci_configure_dma_masks(struct pci_dev *pdev, int using_dac)
        int rc;
 
        if (using_dac &&
-           !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+           !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (rc) {
                                dev_printk(KERN_ERR, &pdev->dev,
                                           "64-bit DMA enable failed\n");
@@ -2416,13 +2429,13 @@ static int ahci_configure_dma_masks(struct pci_dev *pdev, int using_dac)
                        }
                }
        } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit DMA enable failed\n");
                        return rc;
                }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit consistent DMA enable failed\n");
index e5cbe80ce172a8db5ba9de325ec1a0d5db1fcce5..942d14ac87924973c0574b502d4d3dffbc0bd3e0 100644 (file)
@@ -1053,6 +1053,13 @@ static int piix_broken_suspend(void)
                                DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M500"),
                        },
                },
+               {
+                       .ident = "VGN-BX297XP",
+                       .matches = {
+                               DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
+                               DMI_MATCH(DMI_PRODUCT_NAME, "VGN-BX297XP"),
+                       },
+               },
 
                { }     /* terminate list */
        };
index db6a96984f3fbbfcdce793191d16d1e42a74981e..0df83cf742337d4d481822e2d705b3a1802196aa 100644 (file)
@@ -203,11 +203,11 @@ static int __devinit cs5520_init_one(struct pci_dev *pdev, const struct pci_devi
                return -ENODEV;
        }
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR DRV_NAME ": unable to configure DMA mask.\n");
                return -ENODEV;
        }
-       if (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR DRV_NAME ": unable to configure consistent DMA mask.\n");
                return -ENODEV;
        }
index 19fdecf319a662f3de793a12501dd424fdec3011..ba54b089f98c799edbaf4a8848d5b9ed072406e2 100644 (file)
@@ -157,7 +157,7 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        /* acquire resources and fill host */
-       pdev->dev.coherent_dma_mask = DMA_32BIT_MASK;
+       pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
 
        data->cs0 = devm_ioremap(&pdev->dev, cs0->start, 0x1000);
        data->cs1 = devm_ioremap(&pdev->dev, cs1->start, 0x1000);
index efe2c1985af32d7bd48f8d77048d672f9cac06c9..8d9343accf3ca2bf937ab358fe1afdcd99224100 100644 (file)
@@ -503,7 +503,7 @@ static void octeon_cf_dma_setup(struct ata_queued_cmd *qc)
        struct ata_port *ap = qc->ap;
        struct octeon_cf_port *cf_port;
 
-       cf_port = (struct octeon_cf_port *)ap->private_data;
+       cf_port = ap->private_data;
        DPRINTK("ENTER\n");
        /* issue r/w command */
        qc->cursg = qc->sg;
@@ -596,7 +596,7 @@ static unsigned int octeon_cf_dma_finished(struct ata_port *ap,
        if (ap->hsm_task_state != HSM_ST_LAST)
                return 0;
 
-       cf_port = (struct octeon_cf_port *)ap->private_data;
+       cf_port = ap->private_data;
 
        dma_cfg.u64 = cvmx_read_csr(CVMX_MIO_BOOT_DMA_CFGX(ocd->dma_engine));
        if (dma_cfg.s.size != 0xfffff) {
@@ -657,7 +657,7 @@ static irqreturn_t octeon_cf_interrupt(int irq, void *dev_instance)
                        continue;
 
                ocd = ap->dev->platform_data;
-               cf_port = (struct octeon_cf_port *)ap->private_data;
+               cf_port = ap->private_data;
                dma_int.u64 =
                        cvmx_read_csr(CVMX_MIO_BOOT_DMA_INTX(ocd->dma_engine));
                dma_cfg.u64 =
index 39588178d028d5e3780cd38bc766bed78c3df185..6c65b0776a2cc900c6b97dd437a458cc7fd125ed 100644 (file)
@@ -607,13 +607,13 @@ static int adma_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base)
 {
        int rc;
 
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc) {
                dev_printk(KERN_ERR, &pdev->dev,
                        "32-bit DMA enable failed\n");
                return rc;
        }
-       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc) {
                dev_printk(KERN_ERR, &pdev->dev,
                        "32-bit consistent DMA enable failed\n");
index 305a4f825f538ce8eaafd7a861971330081a0bb2..8d890cc5a7ee06fb273daeed1739c7113c5896ba 100644 (file)
@@ -861,14 +861,14 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        /* Set dma_mask.  This devices doesn't support 64bit addressing. */
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc) {
                dev_printk(KERN_ERR, &pdev->dev,
                           "32-bit DMA enable failed\n");
                return rc;
        }
 
-       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc) {
                dev_printk(KERN_ERR, &pdev->dev,
                           "32-bit consistent DMA enable failed\n");
index a377226b81c8954005f37cfaac9aeb69ebff1677..37ae5dc1070cafbc887e0a94821d12c6d1099e87 100644 (file)
 /*
  * sata_mv TODO list:
  *
- * --> More errata workarounds for PCI-X.
- *
- * --> Complete a full errata audit for all chipsets to identify others.
- *
  * --> Develop a low-power-consumption strategy, and implement it.
  *
  * --> Add sysfs attributes for per-chip / per-HC IRQ coalescing thresholds.
  *       connect two SATA ports.
  */
 
+/*
+ * 80x1-B2 errata PCI#11:
+ *
+ * Users of the 6041/6081 Rev.B2 chips (current is C0)
+ * should be careful to insert those cards only onto PCI-X bus #0,
+ * and only in device slots 0..7, not higher.  The chips may not
+ * work correctly otherwise  (note: this is a pretty rare condition).
+ */
+
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -64,7 +69,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "sata_mv"
-#define DRV_VERSION    "1.27"
+#define DRV_VERSION    "1.28"
 
 /*
  * module options
@@ -109,23 +114,23 @@ enum {
         * Coalescing defers the interrupt until either the IO_THRESHOLD
         * (count of completed I/Os) is met, or the TIME_THRESHOLD is met.
         */
-       MV_COAL_REG_BASE        = 0x18000,
-       MV_IRQ_COAL_CAUSE       = (MV_COAL_REG_BASE + 0x08),
+       COAL_REG_BASE           = 0x18000,
+       IRQ_COAL_CAUSE          = (COAL_REG_BASE + 0x08),
        ALL_PORTS_COAL_IRQ      = (1 << 4),     /* all ports irq event */
 
-       MV_IRQ_COAL_IO_THRESHOLD   = (MV_COAL_REG_BASE + 0xcc),
-       MV_IRQ_COAL_TIME_THRESHOLD = (MV_COAL_REG_BASE + 0xd0),
+       IRQ_COAL_IO_THRESHOLD   = (COAL_REG_BASE + 0xcc),
+       IRQ_COAL_TIME_THRESHOLD = (COAL_REG_BASE + 0xd0),
 
        /*
         * Registers for the (unused here) transaction coalescing feature:
         */
-       MV_TRAN_COAL_CAUSE_LO   = (MV_COAL_REG_BASE + 0x88),
-       MV_TRAN_COAL_CAUSE_HI   = (MV_COAL_REG_BASE + 0x8c),
+       TRAN_COAL_CAUSE_LO      = (COAL_REG_BASE + 0x88),
+       TRAN_COAL_CAUSE_HI      = (COAL_REG_BASE + 0x8c),
 
-       MV_SATAHC0_REG_BASE     = 0x20000,
-       MV_FLASH_CTL_OFS        = 0x1046c,
-       MV_GPIO_PORT_CTL_OFS    = 0x104f0,
-       MV_RESET_CFG_OFS        = 0x180d8,
+       SATAHC0_REG_BASE        = 0x20000,
+       FLASH_CTL               = 0x1046c,
+       GPIO_PORT_CTL           = 0x104f0,
+       RESET_CFG               = 0x180d8,
 
        MV_PCI_REG_SZ           = MV_MAJOR_REG_AREA_SZ,
        MV_SATAHC_REG_SZ        = MV_MAJOR_REG_AREA_SZ,
@@ -180,40 +185,41 @@ enum {
 
        /* PCI interface registers */
 
-       PCI_COMMAND_OFS         = 0xc00,
-       PCI_COMMAND_MRDTRIG     = (1 << 7),     /* PCI Master Read Trigger */
+       MV_PCI_COMMAND          = 0xc00,
+       MV_PCI_COMMAND_MWRCOM   = (1 << 4),     /* PCI Master Write Combining */
+       MV_PCI_COMMAND_MRDTRIG  = (1 << 7),     /* PCI Master Read Trigger */
 
-       PCI_MAIN_CMD_STS_OFS    = 0xd30,
+       PCI_MAIN_CMD_STS        = 0xd30,
        STOP_PCI_MASTER         = (1 << 2),
        PCI_MASTER_EMPTY        = (1 << 3),
        GLOB_SFT_RST            = (1 << 4),
 
-       MV_PCI_MODE_OFS         = 0xd00,
+       MV_PCI_MODE             = 0xd00,
        MV_PCI_MODE_MASK        = 0x30,
 
        MV_PCI_EXP_ROM_BAR_CTL  = 0xd2c,
        MV_PCI_DISC_TIMER       = 0xd04,
        MV_PCI_MSI_TRIGGER      = 0xc38,
        MV_PCI_SERR_MASK        = 0xc28,
-       MV_PCI_XBAR_TMOUT_OFS   = 0x1d04,
+       MV_PCI_XBAR_TMOUT       = 0x1d04,
        MV_PCI_ERR_LOW_ADDRESS  = 0x1d40,
        MV_PCI_ERR_HIGH_ADDRESS = 0x1d44,
        MV_PCI_ERR_ATTRIBUTE    = 0x1d48,
        MV_PCI_ERR_COMMAND      = 0x1d50,
 
-       PCI_IRQ_CAUSE_OFS       = 0x1d58,
-       PCI_IRQ_MASK_OFS        = 0x1d5c,
+       PCI_IRQ_CAUSE           = 0x1d58,
+       PCI_IRQ_MASK            = 0x1d5c,
        PCI_UNMASK_ALL_IRQS     = 0x7fffff,     /* bits 22-0 */
 
-       PCIE_IRQ_CAUSE_OFS      = 0x1900,
-       PCIE_IRQ_MASK_OFS       = 0x1910,
+       PCIE_IRQ_CAUSE          = 0x1900,
+       PCIE_IRQ_MASK           = 0x1910,
        PCIE_UNMASK_ALL_IRQS    = 0x40a,        /* assorted bits */
 
        /* Host Controller Main Interrupt Cause/Mask registers (1 per-chip) */
-       PCI_HC_MAIN_IRQ_CAUSE_OFS = 0x1d60,
-       PCI_HC_MAIN_IRQ_MASK_OFS  = 0x1d64,
-       SOC_HC_MAIN_IRQ_CAUSE_OFS = 0x20020,
-       SOC_HC_MAIN_IRQ_MASK_OFS  = 0x20024,
+       PCI_HC_MAIN_IRQ_CAUSE   = 0x1d60,
+       PCI_HC_MAIN_IRQ_MASK    = 0x1d64,
+       SOC_HC_MAIN_IRQ_CAUSE   = 0x20020,
+       SOC_HC_MAIN_IRQ_MASK    = 0x20024,
        ERR_IRQ                 = (1 << 0),     /* shift by (2 * port #) */
        DONE_IRQ                = (1 << 1),     /* shift by (2 * port #) */
        HC0_IRQ_PEND            = 0x1ff,        /* bits 0-8 = HC0's ports */
@@ -234,9 +240,9 @@ enum {
        HC_MAIN_RSVD_SOC        = (0x3fffffb << 6),     /* bits 31-9, 7-6 */
 
        /* SATAHC registers */
-       HC_CFG_OFS              = 0,
+       HC_CFG                  = 0x00,
 
-       HC_IRQ_CAUSE_OFS        = 0x14,
+       HC_IRQ_CAUSE            = 0x14,
        DMA_IRQ                 = (1 << 0),     /* shift by port # */
        HC_COAL_IRQ             = (1 << 4),     /* IRQ coalescing */
        DEV_IRQ                 = (1 << 8),     /* shift by port # */
@@ -248,53 +254,54 @@ enum {
         * Coalescing defers the interrupt until either the IO_THRESHOLD
         * (count of completed I/Os) is met, or the TIME_THRESHOLD is met.
         */
-       HC_IRQ_COAL_IO_THRESHOLD_OFS    = 0x000c,
-       HC_IRQ_COAL_TIME_THRESHOLD_OFS  = 0x0010,
+       HC_IRQ_COAL_IO_THRESHOLD        = 0x000c,
+       HC_IRQ_COAL_TIME_THRESHOLD      = 0x0010,
 
-       SOC_LED_CTRL_OFS        = 0x2c,
+       SOC_LED_CTRL            = 0x2c,
        SOC_LED_CTRL_BLINK      = (1 << 0),     /* Active LED blink */
        SOC_LED_CTRL_ACT_PRESENCE = (1 << 2),   /* Multiplex dev presence */
                                                /*  with dev activity LED */
 
        /* Shadow block registers */
-       SHD_BLK_OFS             = 0x100,
-       SHD_CTL_AST_OFS         = 0x20,         /* ofs from SHD_BLK_OFS */
+       SHD_BLK                 = 0x100,
+       SHD_CTL_AST             = 0x20,         /* ofs from SHD_BLK */
 
        /* SATA registers */
-       SATA_STATUS_OFS         = 0x300,  /* ctrl, err regs follow status */
-       SATA_ACTIVE_OFS         = 0x350,
-       SATA_FIS_IRQ_CAUSE_OFS  = 0x364,
-       SATA_FIS_IRQ_AN         = (1 << 9),     /* async notification */
+       SATA_STATUS             = 0x300,  /* ctrl, err regs follow status */
+       SATA_ACTIVE             = 0x350,
+       FIS_IRQ_CAUSE           = 0x364,
+       FIS_IRQ_CAUSE_AN        = (1 << 9),     /* async notification */
 
-       LTMODE_OFS              = 0x30c,
+       LTMODE                  = 0x30c,        /* requires read-after-write */
        LTMODE_BIT8             = (1 << 8),     /* unknown, but necessary */
 
+       PHY_MODE2               = 0x330,
        PHY_MODE3               = 0x310,
-       PHY_MODE4               = 0x314,
+
+       PHY_MODE4               = 0x314,        /* requires read-after-write */
        PHY_MODE4_CFG_MASK      = 0x00000003,   /* phy internal config field */
        PHY_MODE4_CFG_VALUE     = 0x00000001,   /* phy internal config field */
        PHY_MODE4_RSVD_ZEROS    = 0x5de3fffa,   /* Gen2e always write zeros */
        PHY_MODE4_RSVD_ONES     = 0x00000005,   /* Gen2e always write ones */
 
-       PHY_MODE2               = 0x330,
-       SATA_IFCTL_OFS          = 0x344,
-       SATA_TESTCTL_OFS        = 0x348,
-       SATA_IFSTAT_OFS         = 0x34c,
-       VENDOR_UNIQUE_FIS_OFS   = 0x35c,
+       SATA_IFCTL              = 0x344,
+       SATA_TESTCTL            = 0x348,
+       SATA_IFSTAT             = 0x34c,
+       VENDOR_UNIQUE_FIS       = 0x35c,
 
-       FISCFG_OFS              = 0x360,
+       FISCFG                  = 0x360,
        FISCFG_WAIT_DEV_ERR     = (1 << 8),     /* wait for host on DevErr */
        FISCFG_SINGLE_SYNC      = (1 << 16),    /* SYNC on DMA activation */
 
        MV5_PHY_MODE            = 0x74,
-       MV5_LTMODE_OFS          = 0x30,
-       MV5_PHY_CTL_OFS         = 0x0C,
-       SATA_INTERFACE_CFG_OFS  = 0x050,
+       MV5_LTMODE              = 0x30,
+       MV5_PHY_CTL             = 0x0C,
+       SATA_IFCFG              = 0x050,
 
        MV_M2_PREAMP_MASK       = 0x7e0,
 
        /* Port registers */
-       EDMA_CFG_OFS            = 0,
+       EDMA_CFG                = 0,
        EDMA_CFG_Q_DEPTH        = 0x1f,         /* max device queue depth */
        EDMA_CFG_NCQ            = (1 << 5),     /* for R/W FPDMA queued */
        EDMA_CFG_NCQ_GO_ON_ERR  = (1 << 14),    /* continue on error */
@@ -303,8 +310,8 @@ enum {
        EDMA_CFG_EDMA_FBS       = (1 << 16),    /* EDMA FIS-Based Switching */
        EDMA_CFG_FBS            = (1 << 26),    /* FIS-Based Switching */
 
-       EDMA_ERR_IRQ_CAUSE_OFS  = 0x8,
-       EDMA_ERR_IRQ_MASK_OFS   = 0xc,
+       EDMA_ERR_IRQ_CAUSE      = 0x8,
+       EDMA_ERR_IRQ_MASK       = 0xc,
        EDMA_ERR_D_PAR          = (1 << 0),     /* UDMA data parity err */
        EDMA_ERR_PRD_PAR        = (1 << 1),     /* UDMA PRD parity err */
        EDMA_ERR_DEV            = (1 << 2),     /* device error */
@@ -373,36 +380,36 @@ enum {
                                  EDMA_ERR_INTRL_PAR |
                                  EDMA_ERR_IORDY,
 
-       EDMA_REQ_Q_BASE_HI_OFS  = 0x10,
-       EDMA_REQ_Q_IN_PTR_OFS   = 0x14,         /* also contains BASE_LO */
+       EDMA_REQ_Q_BASE_HI      = 0x10,
+       EDMA_REQ_Q_IN_PTR       = 0x14,         /* also contains BASE_LO */
 
-       EDMA_REQ_Q_OUT_PTR_OFS  = 0x18,
+       EDMA_REQ_Q_OUT_PTR      = 0x18,
        EDMA_REQ_Q_PTR_SHIFT    = 5,
 
-       EDMA_RSP_Q_BASE_HI_OFS  = 0x1c,
-       EDMA_RSP_Q_IN_PTR_OFS   = 0x20,
-       EDMA_RSP_Q_OUT_PTR_OFS  = 0x24,         /* also contains BASE_LO */
+       EDMA_RSP_Q_BASE_HI      = 0x1c,
+       EDMA_RSP_Q_IN_PTR       = 0x20,
+       EDMA_RSP_Q_OUT_PTR      = 0x24,         /* also contains BASE_LO */
        EDMA_RSP_Q_PTR_SHIFT    = 3,
 
-       EDMA_CMD_OFS            = 0x28,         /* EDMA command register */
+       EDMA_CMD                = 0x28,         /* EDMA command register */
        EDMA_EN                 = (1 << 0),     /* enable EDMA */
        EDMA_DS                 = (1 << 1),     /* disable EDMA; self-negated */
        EDMA_RESET              = (1 << 2),     /* reset eng/trans/link/phy */
 
-       EDMA_STATUS_OFS         = 0x30,         /* EDMA engine status */
+       EDMA_STATUS             = 0x30,         /* EDMA engine status */
        EDMA_STATUS_CACHE_EMPTY = (1 << 6),     /* GenIIe command cache empty */
        EDMA_STATUS_IDLE        = (1 << 7),     /* GenIIe EDMA enabled/idle */
 
-       EDMA_IORDY_TMOUT_OFS    = 0x34,
-       EDMA_ARB_CFG_OFS        = 0x38,
+       EDMA_IORDY_TMOUT        = 0x34,
+       EDMA_ARB_CFG            = 0x38,
 
-       EDMA_HALTCOND_OFS       = 0x60,         /* GenIIe halt conditions */
-       EDMA_UNKNOWN_RSVD_OFS   = 0x6C,         /* GenIIe unknown/reserved */
+       EDMA_HALTCOND           = 0x60,         /* GenIIe halt conditions */
+       EDMA_UNKNOWN_RSVD       = 0x6C,         /* GenIIe unknown/reserved */
 
-       BMDMA_CMD_OFS           = 0x224,        /* bmdma command register */
-       BMDMA_STATUS_OFS        = 0x228,        /* bmdma status register */
-       BMDMA_PRD_LOW_OFS       = 0x22c,        /* bmdma PRD addr 31:0 */
-       BMDMA_PRD_HIGH_OFS      = 0x230,        /* bmdma PRD addr 63:32 */
+       BMDMA_CMD               = 0x224,        /* bmdma command register */
+       BMDMA_STATUS            = 0x228,        /* bmdma status register */
+       BMDMA_PRD_LOW           = 0x22c,        /* bmdma PRD addr 31:0 */
+       BMDMA_PRD_HIGH          = 0x230,        /* bmdma PRD addr 63:32 */
 
        /* Host private flags (hp_flags) */
        MV_HP_FLAG_MSI          = (1 << 0),
@@ -534,8 +541,8 @@ struct mv_host_priv {
        void __iomem            *base;
        void __iomem            *main_irq_cause_addr;
        void __iomem            *main_irq_mask_addr;
-       u32                     irq_cause_ofs;
-       u32                     irq_mask_ofs;
+       u32                     irq_cause_offset;
+       u32                     irq_mask_offset;
        u32                     unmask_all_irqs;
        /*
         * These consistent DMA memory pools give us guaranteed
@@ -694,49 +701,49 @@ static struct ata_port_operations mv_iie_ops = {
 static const struct ata_port_info mv_port_info[] = {
        {  /* chip_504x */
                .flags          = MV_GEN_I_FLAGS,
-               .pio_mask       = 0x1f, /* pio0-4 */
+               .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &mv5_ops,
        },
        {  /* chip_508x */
                .flags          = MV_GEN_I_FLAGS | MV_FLAG_DUAL_HC,
-               .pio_mask       = 0x1f, /* pio0-4 */
+               .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &mv5_ops,
        },
        {  /* chip_5080 */
                .flags          = MV_GEN_I_FLAGS | MV_FLAG_DUAL_HC,
-               .pio_mask       = 0x1f, /* pio0-4 */
+               .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &mv5_ops,
        },
        {  /* chip_604x */
                .flags          = MV_GEN_II_FLAGS,
-               .pio_mask       = 0x1f, /* pio0-4 */
+               .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &mv6_ops,
        },
        {  /* chip_608x */
                .flags          = MV_GEN_II_FLAGS | MV_FLAG_DUAL_HC,
-               .pio_mask       = 0x1f, /* pio0-4 */
+               .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &mv6_ops,
        },
        {  /* chip_6042 */
                .flags          = MV_GEN_IIE_FLAGS,
-               .pio_mask       = 0x1f, /* pio0-4 */
+               .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &mv_iie_ops,
        },
        {  /* chip_7042 */
                .flags          = MV_GEN_IIE_FLAGS,
-               .pio_mask       = 0x1f, /* pio0-4 */
+               .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &mv_iie_ops,
        },
        {  /* chip_soc */
                .flags          = MV_GEN_IIE_FLAGS,
-               .pio_mask       = 0x1f, /* pio0-4 */
+               .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &mv_iie_ops,
        },
@@ -840,7 +847,7 @@ static inline unsigned int mv_hardport_from_port(unsigned int port)
 
 static inline void __iomem *mv_hc_base(void __iomem *base, unsigned int hc)
 {
-       return (base + MV_SATAHC0_REG_BASE + (hc * MV_SATAHC_REG_SZ));
+       return (base + SATAHC0_REG_BASE + (hc * MV_SATAHC_REG_SZ));
 }
 
 static inline void __iomem *mv_hc_base_from_port(void __iomem *base,
@@ -895,10 +902,10 @@ static void mv_save_cached_regs(struct ata_port *ap)
        void __iomem *port_mmio = mv_ap_base(ap);
        struct mv_port_priv *pp = ap->private_data;
 
-       pp->cached.fiscfg = readl(port_mmio + FISCFG_OFS);
-       pp->cached.ltmode = readl(port_mmio + LTMODE_OFS);
-       pp->cached.haltcond = readl(port_mmio + EDMA_HALTCOND_OFS);
-       pp->cached.unknown_rsvd = readl(port_mmio + EDMA_UNKNOWN_RSVD_OFS);
+       pp->cached.fiscfg = readl(port_mmio + FISCFG);
+       pp->cached.ltmode = readl(port_mmio + LTMODE);
+       pp->cached.haltcond = readl(port_mmio + EDMA_HALTCOND);
+       pp->cached.unknown_rsvd = readl(port_mmio + EDMA_UNKNOWN_RSVD);
 }
 
 /**
@@ -913,8 +920,26 @@ static void mv_save_cached_regs(struct ata_port *ap)
 static inline void mv_write_cached_reg(void __iomem *addr, u32 *old, u32 new)
 {
        if (new != *old) {
+               unsigned long laddr;
                *old = new;
-               writel(new, addr);
+               /*
+                * Workaround for 88SX60x1-B2 FEr SATA#13:
+                * Read-after-write is needed to prevent generating 64-bit
+                * write cycles on the PCI bus for SATA interface registers
+                * at offsets ending in 0x4 or 0xc.
+                *
+                * Looks like a lot of fuss, but it avoids an unnecessary
+                * +1 usec read-after-write delay for unaffected registers.
+                */
+               laddr = (long)addr & 0xffff;
+               if (laddr >= 0x300 && laddr <= 0x33c) {
+                       laddr &= 0x000f;
+                       if (laddr == 0x4 || laddr == 0xc) {
+                               writelfl(new, addr); /* read after write */
+                               return;
+                       }
+               }
+               writel(new, addr); /* unaffected by the errata */
        }
 }
 
@@ -931,10 +956,10 @@ static void mv_set_edma_ptrs(void __iomem *port_mmio,
        index = pp->req_idx << EDMA_REQ_Q_PTR_SHIFT;
 
        WARN_ON(pp->crqb_dma & 0x3ff);
-       writel((pp->crqb_dma >> 16) >> 16, port_mmio + EDMA_REQ_Q_BASE_HI_OFS);
+       writel((pp->crqb_dma >> 16) >> 16, port_mmio + EDMA_REQ_Q_BASE_HI);
        writelfl((pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK) | index,
-                port_mmio + EDMA_REQ_Q_IN_PTR_OFS);
-       writelfl(index, port_mmio + EDMA_REQ_Q_OUT_PTR_OFS);
+                port_mmio + EDMA_REQ_Q_IN_PTR);
+       writelfl(index, port_mmio + EDMA_REQ_Q_OUT_PTR);
 
        /*
         * initialize response queue
@@ -943,10 +968,10 @@ static void mv_set_edma_ptrs(void __iomem *port_mmio,
        index = pp->resp_idx << EDMA_RSP_Q_PTR_SHIFT;
 
        WARN_ON(pp->crpb_dma & 0xff);
-       writel((pp->crpb_dma >> 16) >> 16, port_mmio + EDMA_RSP_Q_BASE_HI_OFS);
-       writelfl(index, port_mmio + EDMA_RSP_Q_IN_PTR_OFS);
+       writel((pp->crpb_dma >> 16) >> 16, port_mmio + EDMA_RSP_Q_BASE_HI);
+       writelfl(index, port_mmio + EDMA_RSP_Q_IN_PTR);
        writelfl((pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK) | index,
-                port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
+                port_mmio + EDMA_RSP_Q_OUT_PTR);
 }
 
 static void mv_write_main_irq_mask(u32 mask, struct mv_host_priv *hpriv)
@@ -1004,15 +1029,15 @@ static void mv_clear_and_enable_port_irqs(struct ata_port *ap,
        u32 hc_irq_cause;
 
        /* clear EDMA event indicators, if any */
-       writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
+       writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE);
 
        /* clear pending irq events */
        hc_irq_cause = ~((DEV_IRQ | DMA_IRQ) << hardport);
-       writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE_OFS);
+       writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE);
 
        /* clear FIS IRQ Cause */
        if (IS_GEN_IIE(hpriv))
-               writelfl(0, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
+               writelfl(0, port_mmio + FIS_IRQ_CAUSE);
 
        mv_enable_port_irqs(ap, port_irqs);
 }
@@ -1048,10 +1073,10 @@ static void mv_set_irq_coalescing(struct ata_host *host,
                 * GEN_II/GEN_IIE with dual host controllers:
                 * one set of global thresholds for the entire chip.
                 */
-               writel(clks,  mmio + MV_IRQ_COAL_TIME_THRESHOLD);
-               writel(count, mmio + MV_IRQ_COAL_IO_THRESHOLD);
+               writel(clks,  mmio + IRQ_COAL_TIME_THRESHOLD);
+               writel(count, mmio + IRQ_COAL_IO_THRESHOLD);
                /* clear leftover coal IRQ bit */
-               writel(~ALL_PORTS_COAL_IRQ, mmio + MV_IRQ_COAL_CAUSE);
+               writel(~ALL_PORTS_COAL_IRQ, mmio + IRQ_COAL_CAUSE);
                if (count)
                        coal_enable = ALL_PORTS_COAL_DONE;
                clks = count = 0; /* force clearing of regular regs below */
@@ -1061,16 +1086,16 @@ static void mv_set_irq_coalescing(struct ata_host *host,
         * All chips: independent thresholds for each HC on the chip.
         */
        hc_mmio = mv_hc_base_from_port(mmio, 0);
-       writel(clks,  hc_mmio + HC_IRQ_COAL_TIME_THRESHOLD_OFS);
-       writel(count, hc_mmio + HC_IRQ_COAL_IO_THRESHOLD_OFS);
-       writel(~HC_COAL_IRQ, hc_mmio + HC_IRQ_CAUSE_OFS);
+       writel(clks,  hc_mmio + HC_IRQ_COAL_TIME_THRESHOLD);
+       writel(count, hc_mmio + HC_IRQ_COAL_IO_THRESHOLD);
+       writel(~HC_COAL_IRQ, hc_mmio + HC_IRQ_CAUSE);
        if (count)
                coal_enable |= PORTS_0_3_COAL_DONE;
        if (is_dual_hc) {
                hc_mmio = mv_hc_base_from_port(mmio, MV_PORTS_PER_HC);
-               writel(clks,  hc_mmio + HC_IRQ_COAL_TIME_THRESHOLD_OFS);
-               writel(count, hc_mmio + HC_IRQ_COAL_IO_THRESHOLD_OFS);
-               writel(~HC_COAL_IRQ, hc_mmio + HC_IRQ_CAUSE_OFS);
+               writel(clks,  hc_mmio + HC_IRQ_COAL_TIME_THRESHOLD);
+               writel(count, hc_mmio + HC_IRQ_COAL_IO_THRESHOLD);
+               writel(~HC_COAL_IRQ, hc_mmio + HC_IRQ_CAUSE);
                if (count)
                        coal_enable |= PORTS_4_7_COAL_DONE;
        }
@@ -1108,7 +1133,7 @@ static void mv_start_edma(struct ata_port *ap, void __iomem *port_mmio,
                mv_set_edma_ptrs(port_mmio, hpriv, pp);
                mv_clear_and_enable_port_irqs(ap, port_mmio, DONE_IRQ|ERR_IRQ);
 
-               writelfl(EDMA_EN, port_mmio + EDMA_CMD_OFS);
+               writelfl(EDMA_EN, port_mmio + EDMA_CMD);
                pp->pp_flags |= MV_PP_FLAG_EDMA_EN;
        }
 }
@@ -1128,7 +1153,7 @@ static void mv_wait_for_edma_empty_idle(struct ata_port *ap)
         * as a rough guess at what even more drives might require.
         */
        for (i = 0; i < timeout; ++i) {
-               u32 edma_stat = readl(port_mmio + EDMA_STATUS_OFS);
+               u32 edma_stat = readl(port_mmio + EDMA_STATUS);
                if ((edma_stat & empty_idle) == empty_idle)
                        break;
                udelay(per_loop);
@@ -1148,11 +1173,11 @@ static int mv_stop_edma_engine(void __iomem *port_mmio)
        int i;
 
        /* Disable eDMA.  The disable bit auto clears. */
-       writelfl(EDMA_DS, port_mmio + EDMA_CMD_OFS);
+       writelfl(EDMA_DS, port_mmio + EDMA_CMD);
 
        /* Wait for the chip to confirm eDMA is off. */
        for (i = 10000; i > 0; i--) {
-               u32 reg = readl(port_mmio + EDMA_CMD_OFS);
+               u32 reg = readl(port_mmio + EDMA_CMD);
                if (!(reg & EDMA_EN))
                        return 0;
                udelay(10);
@@ -1262,10 +1287,10 @@ static unsigned int mv_scr_offset(unsigned int sc_reg_in)
        case SCR_STATUS:
        case SCR_CONTROL:
        case SCR_ERROR:
-               ofs = SATA_STATUS_OFS + (sc_reg_in * sizeof(u32));
+               ofs = SATA_STATUS + (sc_reg_in * sizeof(u32));
                break;
        case SCR_ACTIVE:
-               ofs = SATA_ACTIVE_OFS;   /* active is not with the others */
+               ofs = SATA_ACTIVE;   /* active is not with the others */
                break;
        default:
                ofs = 0xffffffffU;
@@ -1290,7 +1315,25 @@ static int mv_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val)
        unsigned int ofs = mv_scr_offset(sc_reg_in);
 
        if (ofs != 0xffffffffU) {
-               writelfl(val, mv_ap_base(link->ap) + ofs);
+               void __iomem *addr = mv_ap_base(link->ap) + ofs;
+               if (sc_reg_in == SCR_CONTROL) {
+                       /*
+                        * Workaround for 88SX60x1 FEr SATA#26:
+                        *
+                        * COMRESETs have to take care not to accidently
+                        * put the drive to sleep when writing SCR_CONTROL.
+                        * Setting bits 12..15 prevents this problem.
+                        *
+                        * So if we see an outbound COMMRESET, set those bits.
+                        * Ditto for the followup write that clears the reset.
+                        *
+                        * The proprietary driver does this for
+                        * all chip versions, and so do we.
+                        */
+                       if ((val & 0xf) == 1 || (readl(addr) & 0xf) == 1)
+                               val |= 0xf000;
+               }
+               writelfl(val, addr);
                return 0;
        } else
                return -EINVAL;
@@ -1368,9 +1411,9 @@ static void mv_config_fbs(struct ata_port *ap, int want_ncq, int want_fbs)
        }
 
        port_mmio = mv_ap_base(ap);
-       mv_write_cached_reg(port_mmio + FISCFG_OFS, old_fiscfg, fiscfg);
-       mv_write_cached_reg(port_mmio + LTMODE_OFS, old_ltmode, ltmode);
-       mv_write_cached_reg(port_mmio + EDMA_HALTCOND_OFS, old_haltcond, haltcond);
+       mv_write_cached_reg(port_mmio + FISCFG, old_fiscfg, fiscfg);
+       mv_write_cached_reg(port_mmio + LTMODE, old_ltmode, ltmode);
+       mv_write_cached_reg(port_mmio + EDMA_HALTCOND, old_haltcond, haltcond);
 }
 
 static void mv_60x1_errata_sata25(struct ata_port *ap, int want_ncq)
@@ -1379,13 +1422,13 @@ static void mv_60x1_errata_sata25(struct ata_port *ap, int want_ncq)
        u32 old, new;
 
        /* workaround for 88SX60x1 FEr SATA#25 (part 1) */
-       old = readl(hpriv->base + MV_GPIO_PORT_CTL_OFS);
+       old = readl(hpriv->base + GPIO_PORT_CTL);
        if (want_ncq)
                new = old | (1 << 22);
        else
                new = old & ~(1 << 22);
        if (new != old)
-               writel(new, hpriv->base + MV_GPIO_PORT_CTL_OFS);
+               writel(new, hpriv->base + GPIO_PORT_CTL);
 }
 
 /**
@@ -1409,7 +1452,7 @@ static void mv_bmdma_enable_iie(struct ata_port *ap, int enable_bmdma)
                new = *old | 1;
        else
                new = *old & ~1;
-       mv_write_cached_reg(mv_ap_base(ap) + EDMA_UNKNOWN_RSVD_OFS, old, new);
+       mv_write_cached_reg(mv_ap_base(ap) + EDMA_UNKNOWN_RSVD, old, new);
 }
 
 /*
@@ -1437,8 +1480,8 @@ static void mv_soc_led_blink_enable(struct ata_port *ap)
                return;
        hpriv->hp_flags |= MV_HP_QUIRK_LED_BLINK_EN;
        hc_mmio = mv_hc_base_from_port(mv_host_base(host), ap->port_no);
-       led_ctrl = readl(hc_mmio + SOC_LED_CTRL_OFS);
-       writel(led_ctrl | SOC_LED_CTRL_BLINK, hc_mmio + SOC_LED_CTRL_OFS);
+       led_ctrl = readl(hc_mmio + SOC_LED_CTRL);
+       writel(led_ctrl | SOC_LED_CTRL_BLINK, hc_mmio + SOC_LED_CTRL);
 }
 
 static void mv_soc_led_blink_disable(struct ata_port *ap)
@@ -1463,8 +1506,8 @@ static void mv_soc_led_blink_disable(struct ata_port *ap)
 
        hpriv->hp_flags &= ~MV_HP_QUIRK_LED_BLINK_EN;
        hc_mmio = mv_hc_base_from_port(mv_host_base(host), ap->port_no);
-       led_ctrl = readl(hc_mmio + SOC_LED_CTRL_OFS);
-       writel(led_ctrl & ~SOC_LED_CTRL_BLINK, hc_mmio + SOC_LED_CTRL_OFS);
+       led_ctrl = readl(hc_mmio + SOC_LED_CTRL);
+       writel(led_ctrl & ~SOC_LED_CTRL_BLINK, hc_mmio + SOC_LED_CTRL);
 }
 
 static void mv_edma_cfg(struct ata_port *ap, int want_ncq, int want_edma)
@@ -1528,7 +1571,7 @@ static void mv_edma_cfg(struct ata_port *ap, int want_ncq, int want_edma)
                pp->pp_flags |=  MV_PP_FLAG_NCQ_EN;
        }
 
-       writelfl(cfg, port_mmio + EDMA_CFG_OFS);
+       writelfl(cfg, port_mmio + EDMA_CFG);
 }
 
 static void mv_port_free_dma_mem(struct ata_port *ap)
@@ -1575,6 +1618,7 @@ static int mv_port_start(struct ata_port *ap)
        struct device *dev = ap->host->dev;
        struct mv_host_priv *hpriv = ap->host->private_data;
        struct mv_port_priv *pp;
+       unsigned long flags;
        int tag;
 
        pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
@@ -1610,8 +1654,12 @@ static int mv_port_start(struct ata_port *ap)
                        pp->sg_tbl_dma[tag] = pp->sg_tbl_dma[0];
                }
        }
+
+       spin_lock_irqsave(ap->lock, flags);
        mv_save_cached_regs(ap);
        mv_edma_cfg(ap, 0, 0);
+       spin_unlock_irqrestore(ap->lock, flags);
+
        return 0;
 
 out_port_free_dma_mem:
@@ -1630,8 +1678,12 @@ out_port_free_dma_mem:
  */
 static void mv_port_stop(struct ata_port *ap)
 {
+       unsigned long flags;
+
+       spin_lock_irqsave(ap->lock, flags);
        mv_stop_edma(ap);
        mv_enable_port_irqs(ap, 0);
+       spin_unlock_irqrestore(ap->lock, flags);
        mv_port_free_dma_mem(ap);
 }
 
@@ -1749,13 +1801,13 @@ static void mv_bmdma_setup(struct ata_queued_cmd *qc)
        mv_fill_sg(qc);
 
        /* clear all DMA cmd bits */
-       writel(0, port_mmio + BMDMA_CMD_OFS);
+       writel(0, port_mmio + BMDMA_CMD);
 
        /* load PRD table addr. */
        writel((pp->sg_tbl_dma[qc->tag] >> 16) >> 16,
-               port_mmio + BMDMA_PRD_HIGH_OFS);
+               port_mmio + BMDMA_PRD_HIGH);
        writelfl(pp->sg_tbl_dma[qc->tag],
-               port_mmio + BMDMA_PRD_LOW_OFS);
+               port_mmio + BMDMA_PRD_LOW);
 
        /* issue r/w command */
        ap->ops->sff_exec_command(ap, &qc->tf);
@@ -1776,7 +1828,7 @@ static void mv_bmdma_start(struct ata_queued_cmd *qc)
        u32 cmd = (rw ? 0 : ATA_DMA_WR) | ATA_DMA_START;
 
        /* start host DMA transaction */
-       writelfl(cmd, port_mmio + BMDMA_CMD_OFS);
+       writelfl(cmd, port_mmio + BMDMA_CMD);
 }
 
 /**
@@ -1795,9 +1847,9 @@ static void mv_bmdma_stop(struct ata_queued_cmd *qc)
        u32 cmd;
 
        /* clear start/stop bit */
-       cmd = readl(port_mmio + BMDMA_CMD_OFS);
+       cmd = readl(port_mmio + BMDMA_CMD);
        cmd &= ~ATA_DMA_START;
-       writelfl(cmd, port_mmio + BMDMA_CMD_OFS);
+       writelfl(cmd, port_mmio + BMDMA_CMD);
 
        /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
        ata_sff_dma_pause(ap);
@@ -1821,7 +1873,7 @@ static u8 mv_bmdma_status(struct ata_port *ap)
         * Other bits are valid only if ATA_DMA_ACTIVE==0,
         * and the ATA_DMA_INTR bit doesn't exist.
         */
-       reg = readl(port_mmio + BMDMA_STATUS_OFS);
+       reg = readl(port_mmio + BMDMA_STATUS);
        if (reg & ATA_DMA_ACTIVE)
                status = ATA_DMA_ACTIVE;
        else
@@ -2029,28 +2081,28 @@ static unsigned int mv_send_fis(struct ata_port *ap, u32 *fis, int nwords)
        int i, timeout = 200, final_word = nwords - 1;
 
        /* Initiate FIS transmission mode */
-       old_ifctl = readl(port_mmio + SATA_IFCTL_OFS);
+       old_ifctl = readl(port_mmio + SATA_IFCTL);
        ifctl = 0x100 | (old_ifctl & 0xf);
-       writelfl(ifctl, port_mmio + SATA_IFCTL_OFS);
+       writelfl(ifctl, port_mmio + SATA_IFCTL);
 
        /* Send all words of the FIS except for the final word */
        for (i = 0; i < final_word; ++i)
-               writel(fis[i], port_mmio + VENDOR_UNIQUE_FIS_OFS);
+               writel(fis[i], port_mmio + VENDOR_UNIQUE_FIS);
 
        /* Flag end-of-transmission, and then send the final word */
-       writelfl(ifctl | 0x200, port_mmio + SATA_IFCTL_OFS);
-       writelfl(fis[final_word], port_mmio + VENDOR_UNIQUE_FIS_OFS);
+       writelfl(ifctl | 0x200, port_mmio + SATA_IFCTL);
+       writelfl(fis[final_word], port_mmio + VENDOR_UNIQUE_FIS);
 
        /*
         * Wait for FIS transmission to complete.
         * This typically takes just a single iteration.
         */
        do {
-               ifstat = readl(port_mmio + SATA_IFSTAT_OFS);
+               ifstat = readl(port_mmio + SATA_IFSTAT);
        } while (!(ifstat & 0x1000) && --timeout);
 
        /* Restore original port configuration */
-       writelfl(old_ifctl, port_mmio + SATA_IFCTL_OFS);
+       writelfl(old_ifctl, port_mmio + SATA_IFCTL);
 
        /* See if it worked */
        if ((ifstat & 0x3000) != 0x1000) {
@@ -2148,7 +2200,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
 
                /* Write the request in pointer to kick the EDMA to life */
                writelfl((pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK) | in_index,
-                                       port_mmio + EDMA_REQ_Q_IN_PTR_OFS);
+                                       port_mmio + EDMA_REQ_Q_IN_PTR);
                return 0;
 
        case ATA_PROT_PIO:
@@ -2259,7 +2311,7 @@ static unsigned int mv_get_err_pmp_map(struct ata_port *ap)
 {
        void __iomem *port_mmio = mv_ap_base(ap);
 
-       return readl(port_mmio + SATA_TESTCTL_OFS) >> 16;
+       return readl(port_mmio + SATA_TESTCTL) >> 16;
 }
 
 static void mv_pmp_eh_prep(struct ata_port *ap, unsigned int pmp_map)
@@ -2292,9 +2344,9 @@ static int mv_req_q_empty(struct ata_port *ap)
        void __iomem *port_mmio = mv_ap_base(ap);
        u32 in_ptr, out_ptr;
 
-       in_ptr  = (readl(port_mmio + EDMA_REQ_Q_IN_PTR_OFS)
+       in_ptr  = (readl(port_mmio + EDMA_REQ_Q_IN_PTR)
                        >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
-       out_ptr = (readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS)
+       out_ptr = (readl(port_mmio + EDMA_REQ_Q_OUT_PTR)
                        >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
        return (in_ptr == out_ptr);     /* 1 == queue_is_empty */
 }
@@ -2456,12 +2508,12 @@ static void mv_err_intr(struct ata_port *ap)
        sata_scr_read(&ap->link, SCR_ERROR, &serr);
        sata_scr_write_flush(&ap->link, SCR_ERROR, serr);
 
-       edma_err_cause = readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
+       edma_err_cause = readl(port_mmio + EDMA_ERR_IRQ_CAUSE);
        if (IS_GEN_IIE(hpriv) && (edma_err_cause & EDMA_ERR_TRANS_IRQ_7)) {
-               fis_cause = readl(port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
-               writelfl(~fis_cause, port_mmio + SATA_FIS_IRQ_CAUSE_OFS);
+               fis_cause = readl(port_mmio + FIS_IRQ_CAUSE);
+               writelfl(~fis_cause, port_mmio + FIS_IRQ_CAUSE);
        }
-       writelfl(~edma_err_cause, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
+       writelfl(~edma_err_cause, port_mmio + EDMA_ERR_IRQ_CAUSE);
 
        if (edma_err_cause & EDMA_ERR_DEV) {
                /*
@@ -2479,7 +2531,7 @@ static void mv_err_intr(struct ata_port *ap)
 
        if (IS_GEN_IIE(hpriv) && (edma_err_cause & EDMA_ERR_TRANS_IRQ_7)) {
                ata_ehi_push_desc(ehi, "fis_cause=%08x", fis_cause);
-               if (fis_cause & SATA_FIS_IRQ_AN) {
+               if (fis_cause & FIS_IRQ_CAUSE_AN) {
                        u32 ec = edma_err_cause &
                               ~(EDMA_ERR_TRANS_IRQ_7 | EDMA_ERR_IRQ_TRANSIENT);
                        sata_async_notification(ap);
@@ -2581,7 +2633,7 @@ static void mv_process_crpb_response(struct ata_port *ap,
                u16 edma_status = le16_to_cpu(response->flags);
                /*
                 * edma_status from a response queue entry:
-                *   LSB is from EDMA_ERR_IRQ_CAUSE_OFS (non-NCQ only).
+                *   LSB is from EDMA_ERR_IRQ_CAUSE (non-NCQ only).
                 *   MSB is saved ATA status from command completion.
                 */
                if (!ncq_enabled) {
@@ -2613,7 +2665,7 @@ static void mv_process_crpb_entries(struct ata_port *ap, struct mv_port_priv *pp
        int ncq_enabled = (pp->pp_flags & MV_PP_FLAG_NCQ_EN);
 
        /* Get the hardware queue position index */
-       in_index = (readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS)
+       in_index = (readl(port_mmio + EDMA_RSP_Q_IN_PTR)
                        >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK;
 
        /* Process new responses from since the last time we looked */
@@ -2638,7 +2690,7 @@ static void mv_process_crpb_entries(struct ata_port *ap, struct mv_port_priv *pp
        if (work_done)
                writelfl((pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK) |
                         (pp->resp_idx << EDMA_RSP_Q_PTR_SHIFT),
-                        port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
+                        port_mmio + EDMA_RSP_Q_OUT_PTR);
 }
 
 static void mv_port_intr(struct ata_port *ap, u32 port_cause)
@@ -2695,7 +2747,7 @@ static int mv_host_intr(struct ata_host *host, u32 main_irq_cause)
 
        /* If asserted, clear the "all ports" IRQ coalescing bit */
        if (main_irq_cause & ALL_PORTS_COAL_DONE)
-               writel(~ALL_PORTS_COAL_IRQ, mmio + MV_IRQ_COAL_CAUSE);
+               writel(~ALL_PORTS_COAL_IRQ, mmio + IRQ_COAL_CAUSE);
 
        for (port = 0; port < hpriv->n_ports; port++) {
                struct ata_port *ap = host->ports[port];
@@ -2739,7 +2791,7 @@ static int mv_host_intr(struct ata_host *host, u32 main_irq_cause)
                                        ack_irqs |= (DMA_IRQ | DEV_IRQ) << p;
                        }
                        hc_mmio = mv_hc_base_from_port(mmio, port);
-                       writelfl(~ack_irqs, hc_mmio + HC_IRQ_CAUSE_OFS);
+                       writelfl(~ack_irqs, hc_mmio + HC_IRQ_CAUSE);
                        handled = 1;
                }
                /*
@@ -2761,7 +2813,7 @@ static int mv_pci_error(struct ata_host *host, void __iomem *mmio)
        unsigned int i, err_mask, printed = 0;
        u32 err_cause;
 
-       err_cause = readl(mmio + hpriv->irq_cause_ofs);
+       err_cause = readl(mmio + hpriv->irq_cause_offset);
 
        dev_printk(KERN_ERR, host->dev, "PCI ERROR; PCI IRQ cause=0x%08x\n",
                   err_cause);
@@ -2769,7 +2821,7 @@ static int mv_pci_error(struct ata_host *host, void __iomem *mmio)
        DPRINTK("All regs @ PCI error\n");
        mv_dump_all_regs(mmio, -1, to_pci_dev(host->dev));
 
-       writelfl(0, mmio + hpriv->irq_cause_ofs);
+       writelfl(0, mmio + hpriv->irq_cause_offset);
 
        for (i = 0; i < host->n_ports; i++) {
                ap = host->ports[i];
@@ -2906,7 +2958,7 @@ static void mv5_reset_bus(struct ata_host *host, void __iomem *mmio)
 
 static void mv5_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio)
 {
-       writel(0x0fcfffff, mmio + MV_FLASH_CTL_OFS);
+       writel(0x0fcfffff, mmio + FLASH_CTL);
 }
 
 static void mv5_read_preamp(struct mv_host_priv *hpriv, int idx,
@@ -2925,7 +2977,7 @@ static void mv5_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio)
 {
        u32 tmp;
 
-       writel(0, mmio + MV_GPIO_PORT_CTL_OFS);
+       writel(0, mmio + GPIO_PORT_CTL);
 
        /* FIXME: handle MV_HP_ERRATA_50XXB2 errata */
 
@@ -2943,14 +2995,14 @@ static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
        int fix_apm_sq = (hpriv->hp_flags & MV_HP_ERRATA_50XXB0);
 
        if (fix_apm_sq) {
-               tmp = readl(phy_mmio + MV5_LTMODE_OFS);
+               tmp = readl(phy_mmio + MV5_LTMODE);
                tmp |= (1 << 19);
-               writel(tmp, phy_mmio + MV5_LTMODE_OFS);
+               writel(tmp, phy_mmio + MV5_LTMODE);
 
-               tmp = readl(phy_mmio + MV5_PHY_CTL_OFS);
+               tmp = readl(phy_mmio + MV5_PHY_CTL);
                tmp &= ~0x3;
                tmp |= 0x1;
-               writel(tmp, phy_mmio + MV5_PHY_CTL_OFS);
+               writel(tmp, phy_mmio + MV5_PHY_CTL);
        }
 
        tmp = readl(phy_mmio + MV5_PHY_MODE);
@@ -2971,7 +3023,7 @@ static void mv5_reset_hc_port(struct mv_host_priv *hpriv, void __iomem *mmio,
        mv_reset_channel(hpriv, mmio, port);
 
        ZERO(0x028);    /* command */
-       writel(0x11f, port_mmio + EDMA_CFG_OFS);
+       writel(0x11f, port_mmio + EDMA_CFG);
        ZERO(0x004);    /* timer */
        ZERO(0x008);    /* irq err cause */
        ZERO(0x00c);    /* irq err mask */
@@ -2982,7 +3034,7 @@ static void mv5_reset_hc_port(struct mv_host_priv *hpriv, void __iomem *mmio,
        ZERO(0x024);    /* respq outp */
        ZERO(0x020);    /* respq inp */
        ZERO(0x02c);    /* test control */
-       writel(0xbc, port_mmio + EDMA_IORDY_TMOUT_OFS);
+       writel(0xbc, port_mmio + EDMA_IORDY_TMOUT);
 }
 #undef ZERO
 
@@ -3028,16 +3080,16 @@ static void mv_reset_pci_bus(struct ata_host *host, void __iomem *mmio)
        struct mv_host_priv *hpriv = host->private_data;
        u32 tmp;
 
-       tmp = readl(mmio + MV_PCI_MODE_OFS);
+       tmp = readl(mmio + MV_PCI_MODE);
        tmp &= 0xff00ffff;
-       writel(tmp, mmio + MV_PCI_MODE_OFS);
+       writel(tmp, mmio + MV_PCI_MODE);
 
        ZERO(MV_PCI_DISC_TIMER);
        ZERO(MV_PCI_MSI_TRIGGER);
-       writel(0x000100ff, mmio + MV_PCI_XBAR_TMOUT_OFS);
+       writel(0x000100ff, mmio + MV_PCI_XBAR_TMOUT);
        ZERO(MV_PCI_SERR_MASK);
-       ZERO(hpriv->irq_cause_ofs);
-       ZERO(hpriv->irq_mask_ofs);
+       ZERO(hpriv->irq_cause_offset);
+       ZERO(hpriv->irq_mask_offset);
        ZERO(MV_PCI_ERR_LOW_ADDRESS);
        ZERO(MV_PCI_ERR_HIGH_ADDRESS);
        ZERO(MV_PCI_ERR_ATTRIBUTE);
@@ -3051,10 +3103,10 @@ static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio)
 
        mv5_reset_flash(hpriv, mmio);
 
-       tmp = readl(mmio + MV_GPIO_PORT_CTL_OFS);
+       tmp = readl(mmio + GPIO_PORT_CTL);
        tmp &= 0x3;
        tmp |= (1 << 5) | (1 << 6);
-       writel(tmp, mmio + MV_GPIO_PORT_CTL_OFS);
+       writel(tmp, mmio + GPIO_PORT_CTL);
 }
 
 /**
@@ -3069,7 +3121,7 @@ static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio)
 static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
                        unsigned int n_hc)
 {
-       void __iomem *reg = mmio + PCI_MAIN_CMD_STS_OFS;
+       void __iomem *reg = mmio + PCI_MAIN_CMD_STS;
        int i, rc = 0;
        u32 t;
 
@@ -3127,7 +3179,7 @@ static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx,
        void __iomem *port_mmio;
        u32 tmp;
 
-       tmp = readl(mmio + MV_RESET_CFG_OFS);
+       tmp = readl(mmio + RESET_CFG);
        if ((tmp & (1 << 0)) == 0) {
                hpriv->signal[idx].amps = 0x7 << 8;
                hpriv->signal[idx].pre = 0x1 << 5;
@@ -3143,7 +3195,7 @@ static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx,
 
 static void mv6_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio)
 {
-       writel(0x00000060, mmio + MV_GPIO_PORT_CTL_OFS);
+       writel(0x00000060, mmio + GPIO_PORT_CTL);
 }
 
 static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
@@ -3201,6 +3253,7 @@ static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
         * Workaround for 60x1-B2 errata SATA#13:
         * Any write to PHY_MODE4 (above) may corrupt PHY_MODE3,
         * so we must always rewrite PHY_MODE3 after PHY_MODE4.
+        * Or ensure we use writelfl() when writing PHY_MODE4.
         */
        writel(m3, port_mmio + PHY_MODE3);
 
@@ -3252,7 +3305,7 @@ static void mv_soc_reset_hc_port(struct mv_host_priv *hpriv,
        mv_reset_channel(hpriv, mmio, port);
 
        ZERO(0x028);            /* command */
-       writel(0x101f, port_mmio + EDMA_CFG_OFS);
+       writel(0x101f, port_mmio + EDMA_CFG);
        ZERO(0x004);            /* timer */
        ZERO(0x008);            /* irq err cause */
        ZERO(0x00c);            /* irq err mask */
@@ -3263,7 +3316,7 @@ static void mv_soc_reset_hc_port(struct mv_host_priv *hpriv,
        ZERO(0x024);            /* respq outp */
        ZERO(0x020);            /* respq inp */
        ZERO(0x02c);            /* test control */
-       writel(0xbc, port_mmio + EDMA_IORDY_TMOUT_OFS);
+       writel(0xbc, port_mmio + EDMA_IORDY_TMOUT);
 }
 
 #undef ZERO
@@ -3308,12 +3361,12 @@ static void mv_soc_reset_bus(struct ata_host *host, void __iomem *mmio)
 
 static void mv_setup_ifcfg(void __iomem *port_mmio, int want_gen2i)
 {
-       u32 ifcfg = readl(port_mmio + SATA_INTERFACE_CFG_OFS);
+       u32 ifcfg = readl(port_mmio + SATA_IFCFG);
 
        ifcfg = (ifcfg & 0xf7f) | 0x9b1000;     /* from chip spec */
        if (want_gen2i)
                ifcfg |= (1 << 7);              /* enable gen2i speed */
-       writelfl(ifcfg, port_mmio + SATA_INTERFACE_CFG_OFS);
+       writelfl(ifcfg, port_mmio + SATA_IFCFG);
 }
 
 static void mv_reset_channel(struct mv_host_priv *hpriv, void __iomem *mmio,
@@ -3327,7 +3380,7 @@ static void mv_reset_channel(struct mv_host_priv *hpriv, void __iomem *mmio,
         * to disable the EDMA engine before doing the EDMA_RESET operation.
         */
        mv_stop_edma_engine(port_mmio);
-       writelfl(EDMA_RESET, port_mmio + EDMA_CMD_OFS);
+       writelfl(EDMA_RESET, port_mmio + EDMA_CMD);
 
        if (!IS_GEN_I(hpriv)) {
                /* Enable 3.0gb/s link speed: this survives EDMA_RESET */
@@ -3336,11 +3389,11 @@ static void mv_reset_channel(struct mv_host_priv *hpriv, void __iomem *mmio,
        /*
         * Strobing EDMA_RESET here causes a hard reset of the SATA transport,
         * link, and physical layers.  It resets all SATA interface registers
-        * (except for SATA_INTERFACE_CFG), and issues a COMRESET to the dev.
+        * (except for SATA_IFCFG), and issues a COMRESET to the dev.
         */
-       writelfl(EDMA_RESET, port_mmio + EDMA_CMD_OFS);
+       writelfl(EDMA_RESET, port_mmio + EDMA_CMD);
        udelay(25);     /* allow reset propagation */
-       writelfl(0, port_mmio + EDMA_CMD_OFS);
+       writelfl(0, port_mmio + EDMA_CMD);
 
        hpriv->ops->phy_errata(hpriv, mmio, port_no);
 
@@ -3352,12 +3405,12 @@ static void mv_pmp_select(struct ata_port *ap, int pmp)
 {
        if (sata_pmp_supported(ap)) {
                void __iomem *port_mmio = mv_ap_base(ap);
-               u32 reg = readl(port_mmio + SATA_IFCTL_OFS);
+               u32 reg = readl(port_mmio + SATA_IFCTL);
                int old = reg & 0xf;
 
                if (old != pmp) {
                        reg = (reg & ~0xf) | pmp;
-                       writelfl(reg, port_mmio + SATA_IFCTL_OFS);
+                       writelfl(reg, port_mmio + SATA_IFCTL);
                }
        }
 }
@@ -3432,11 +3485,11 @@ static void mv_eh_thaw(struct ata_port *ap)
        u32 hc_irq_cause;
 
        /* clear EDMA errors on this port */
-       writel(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
+       writel(0, port_mmio + EDMA_ERR_IRQ_CAUSE);
 
        /* clear pending irq events */
        hc_irq_cause = ~((DEV_IRQ | DMA_IRQ) << hardport);
-       writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE_OFS);
+       writelfl(hc_irq_cause, hc_mmio + HC_IRQ_CAUSE);
 
        mv_enable_port_irqs(ap, ERR_IRQ);
 }
@@ -3455,8 +3508,7 @@ static void mv_eh_thaw(struct ata_port *ap)
  */
 static void mv_port_init(struct ata_ioports *port,  void __iomem *port_mmio)
 {
-       void __iomem *shd_base = port_mmio + SHD_BLK_OFS;
-       unsigned serr_ofs;
+       void __iomem *serr, *shd_base = port_mmio + SHD_BLK;
 
        /* PIO related setup
         */
@@ -3471,23 +3523,23 @@ static void mv_port_init(struct ata_ioports *port,  void __iomem *port_mmio)
        port->status_addr =
                port->command_addr = shd_base + (sizeof(u32) * ATA_REG_STATUS);
        /* special case: control/altstatus doesn't have ATA_REG_ address */
-       port->altstatus_addr = port->ctl_addr = shd_base + SHD_CTL_AST_OFS;
+       port->altstatus_addr = port->ctl_addr = shd_base + SHD_CTL_AST;
 
        /* unused: */
        port->cmd_addr = port->bmdma_addr = port->scr_addr = NULL;
 
        /* Clear any currently outstanding port interrupt conditions */
-       serr_ofs = mv_scr_offset(SCR_ERROR);
-       writelfl(readl(port_mmio + serr_ofs), port_mmio + serr_ofs);
-       writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS);
+       serr = port_mmio + mv_scr_offset(SCR_ERROR);
+       writelfl(readl(serr), serr);
+       writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE);
 
        /* unmask all non-transient EDMA error interrupts */
-       writelfl(~EDMA_ERR_IRQ_TRANSIENT, port_mmio + EDMA_ERR_IRQ_MASK_OFS);
+       writelfl(~EDMA_ERR_IRQ_TRANSIENT, port_mmio + EDMA_ERR_IRQ_MASK);
 
        VPRINTK("EDMA cfg=0x%08x EDMA IRQ err cause/mask=0x%08x/0x%08x\n",
-               readl(port_mmio + EDMA_CFG_OFS),
-               readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS),
-               readl(port_mmio + EDMA_ERR_IRQ_MASK_OFS));
+               readl(port_mmio + EDMA_CFG),
+               readl(port_mmio + EDMA_ERR_IRQ_CAUSE),
+               readl(port_mmio + EDMA_ERR_IRQ_MASK));
 }
 
 static unsigned int mv_in_pcix_mode(struct ata_host *host)
@@ -3498,7 +3550,7 @@ static unsigned int mv_in_pcix_mode(struct ata_host *host)
 
        if (IS_SOC(hpriv) || !IS_PCIE(hpriv))
                return 0;       /* not PCI-X capable */
-       reg = readl(mmio + MV_PCI_MODE_OFS);
+       reg = readl(mmio + MV_PCI_MODE);
        if ((reg & MV_PCI_MODE_MASK) == 0)
                return 0;       /* conventional PCI mode */
        return 1;       /* chip is in PCI-X mode */
@@ -3511,13 +3563,25 @@ static int mv_pci_cut_through_okay(struct ata_host *host)
        u32 reg;
 
        if (!mv_in_pcix_mode(host)) {
-               reg = readl(mmio + PCI_COMMAND_OFS);
-               if (reg & PCI_COMMAND_MRDTRIG)
+               reg = readl(mmio + MV_PCI_COMMAND);
+               if (reg & MV_PCI_COMMAND_MRDTRIG)
                        return 0; /* not okay */
        }
        return 1; /* okay */
 }
 
+static void mv_60x1b2_errata_pci7(struct ata_host *host)
+{
+       struct mv_host_priv *hpriv = host->private_data;
+       void __iomem *mmio = hpriv->base;
+
+       /* workaround for 60x1-B2 errata PCI#7 */
+       if (mv_in_pcix_mode(host)) {
+               u32 reg = readl(mmio + MV_PCI_COMMAND);
+               writelfl(reg & ~MV_PCI_COMMAND_MWRCOM, mmio + MV_PCI_COMMAND);
+       }
+}
+
 static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
 {
        struct pci_dev *pdev = to_pci_dev(host->dev);
@@ -3571,6 +3635,7 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
 
                switch (pdev->revision) {
                case 0x7:
+                       mv_60x1b2_errata_pci7(host);
                        hp_flags |= MV_HP_ERRATA_60X1B2;
                        break;
                case 0x9:
@@ -3647,12 +3712,12 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
 
        hpriv->hp_flags = hp_flags;
        if (hp_flags & MV_HP_PCIE) {
-               hpriv->irq_cause_ofs    = PCIE_IRQ_CAUSE_OFS;
-               hpriv->irq_mask_ofs     = PCIE_IRQ_MASK_OFS;
+               hpriv->irq_cause_offset = PCIE_IRQ_CAUSE;
+               hpriv->irq_mask_offset  = PCIE_IRQ_MASK;
                hpriv->unmask_all_irqs  = PCIE_UNMASK_ALL_IRQS;
        } else {
-               hpriv->irq_cause_ofs    = PCI_IRQ_CAUSE_OFS;
-               hpriv->irq_mask_ofs     = PCI_IRQ_MASK_OFS;
+               hpriv->irq_cause_offset = PCI_IRQ_CAUSE;
+               hpriv->irq_mask_offset  = PCI_IRQ_MASK;
                hpriv->unmask_all_irqs  = PCI_UNMASK_ALL_IRQS;
        }
 
@@ -3681,11 +3746,11 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx)
                goto done;
 
        if (IS_SOC(hpriv)) {
-               hpriv->main_irq_cause_addr = mmio + SOC_HC_MAIN_IRQ_CAUSE_OFS;
-               hpriv->main_irq_mask_addr  = mmio + SOC_HC_MAIN_IRQ_MASK_OFS;
+               hpriv->main_irq_cause_addr = mmio + SOC_HC_MAIN_IRQ_CAUSE;
+               hpriv->main_irq_mask_addr  = mmio + SOC_HC_MAIN_IRQ_MASK;
        } else {
-               hpriv->main_irq_cause_addr = mmio + PCI_HC_MAIN_IRQ_CAUSE_OFS;
-               hpriv->main_irq_mask_addr  = mmio + PCI_HC_MAIN_IRQ_MASK_OFS;
+               hpriv->main_irq_cause_addr = mmio + PCI_HC_MAIN_IRQ_CAUSE;
+               hpriv->main_irq_mask_addr  = mmio + PCI_HC_MAIN_IRQ_MASK;
        }
 
        /* initialize shadow irq mask with register's value */
@@ -3727,18 +3792,20 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx)
 
                VPRINTK("HC%i: HC config=0x%08x HC IRQ cause "
                        "(before clear)=0x%08x\n", hc,
-                       readl(hc_mmio + HC_CFG_OFS),
-                       readl(hc_mmio + HC_IRQ_CAUSE_OFS));
+                       readl(hc_mmio + HC_CFG),
+                       readl(hc_mmio + HC_IRQ_CAUSE));
 
                /* Clear any currently outstanding hc interrupt conditions */
-               writelfl(0, hc_mmio + HC_IRQ_CAUSE_OFS);
+               writelfl(0, hc_mmio + HC_IRQ_CAUSE);
        }
 
-       /* Clear any currently outstanding host interrupt conditions */
-       writelfl(0, mmio + hpriv->irq_cause_ofs);
+       if (!IS_SOC(hpriv)) {
+               /* Clear any currently outstanding host interrupt conditions */
+               writelfl(0, mmio + hpriv->irq_cause_offset);
 
-       /* and unmask interrupt generation for host regs */
-       writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
+               /* and unmask interrupt generation for host regs */
+               writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_offset);
+       }
 
        /*
         * enable only global host interrupts for now.
@@ -3844,7 +3911,7 @@ static int mv_platform_probe(struct platform_device *pdev)
        host->iomap = NULL;
        hpriv->base = devm_ioremap(&pdev->dev, res->start,
                                   res->end - res->start + 1);
-       hpriv->base -= MV_SATAHC0_REG_BASE;
+       hpriv->base -= SATAHC0_REG_BASE;
 
        /*
         * (Re-)program MBUS remapping windows if we are asked to.
@@ -3913,10 +3980,10 @@ static int pci_go_64(struct pci_dev *pdev)
 {
        int rc;
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (rc) {
                                dev_printk(KERN_ERR, &pdev->dev,
                                           "64-bit DMA enable failed\n");
@@ -3924,13 +3991,13 @@ static int pci_go_64(struct pci_dev *pdev)
                        }
                }
        } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit DMA enable failed\n");
                        return rc;
                }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit consistent DMA enable failed\n");
index c3936d35cdac5923e46810c9d7743be9760fbb98..326c0cfc29b34c366c146ea0c2a6c128d5f7f2f4 100644 (file)
@@ -584,10 +584,10 @@ static int qs_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base)
        int rc, have_64bit_bus = (bus_info & QS_HPHY_64BIT);
 
        if (have_64bit_bus &&
-           !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+           !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (rc) {
                                dev_printk(KERN_ERR, &pdev->dev,
                                           "64-bit DMA enable failed\n");
@@ -595,13 +595,13 @@ static int qs_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base)
                        }
                }
        } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                "32-bit DMA enable failed\n");
                        return rc;
                }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                "32-bit consistent DMA enable failed\n");
index 0d8990dcdfcd832f4a2d96adfa000987ef460daf..77aa8d7ecec47488369d968e32379ae8373c82ee 100644 (file)
@@ -1297,10 +1297,10 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        host->iomap = iomap;
 
        /* configure and activate the device */
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (rc) {
                                dev_printk(KERN_ERR, &pdev->dev,
                                           "64-bit DMA enable failed\n");
@@ -1308,13 +1308,13 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                        }
                }
        } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit DMA enable failed\n");
                        return rc;
                }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit consistent DMA enable failed\n");
index ed70bd28fa2cb558371170642c238f3236f99f13..8b2a278b25471af9427b8e32f705c2e3d8c01304 100644 (file)
@@ -399,10 +399,10 @@ static int __devinit vsc_sata_init_one(struct pci_dev *pdev,
        /*
         * Use 32 bit DMA mask, because 64 bit address support is poor.
         */
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc)
                return rc;
-       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc)
                return rc;
 
index bdbad7edf682b847b48231df7b042a1e364f8e66..2de64065aa1b203b113f62e8428319f140b0b382 100644 (file)
@@ -358,7 +358,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
 
        if (pci_enable_device(pci_dev))
                return -EIO;
-       if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK) != 0) {
+       if (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32)) != 0) {
                printk(KERN_WARNING "he: no suitable dma available\n");
                err = -EIO;
                goto init_one_failure;
index 8733a2ea04c2b39a02fede69c6e4dbd69035cd3a..cf97c34cbaf142dfeb1c5df68f0c5121a4cf6b4b 100644 (file)
@@ -1957,12 +1957,12 @@ static int __devinit lanai_pci_start(struct lanai_dev *lanai)
                return -ENXIO;
        }
        pci_set_master(pci);
-       if (pci_set_dma_mask(pci, DMA_32BIT_MASK) != 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) != 0) {
                printk(KERN_WARNING DEV_LABEL
                    "(itf %d): No suitable DMA available.\n", lanai->number);
                return -EBUSY;
        }
-       if (pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) != 0) {
+       if (pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) != 0) {
                printk(KERN_WARNING DEV_LABEL
                    "(itf %d): No suitable DMA available.\n", lanai->number);
                return -EBUSY;
index 479694b6cbe3995a59bb5a89faf4ca7edffa8d56..91dba65d72645509b74e289a04402af7696009b4 100644 (file)
@@ -141,7 +141,7 @@ int isa_register_driver(struct isa_driver *isa_driver, unsigned int ndev)
                isa_dev->dev.release            = isa_dev_release;
                isa_dev->id                     = id;
 
-               isa_dev->dev.coherent_dma_mask = DMA_24BIT_MASK;
+               isa_dev->dev.coherent_dma_mask = DMA_BIT_MASK(24);
                isa_dev->dev.dma_mask = &isa_dev->dev.coherent_dma_mask;
 
                error = device_register(&isa_dev->dev);
index f6a337c34ac47e84a3d542b6d8e8af071bb49ffc..f22ed6cc69f286f916c9c064871ffaad77babeca 100644 (file)
@@ -1169,9 +1169,9 @@ static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T
   int i;
 
   
-  if (pci_set_dma_mask(Controller->PCIDevice, DMA_32BIT_MASK))
+  if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
        return DAC960_Failure(Controller, "DMA mask out of range");
-  Controller->BounceBufferLimit = DMA_32BIT_MASK;
+  Controller->BounceBufferLimit = DMA_BIT_MASK(32);
 
   if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller)) {
     CommandMailboxesSize =  0;
@@ -1372,10 +1372,10 @@ static bool DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
   dma_addr_t   CommandMailboxDMA;
   DAC960_V2_CommandStatus_T CommandStatus;
 
-       if (!pci_set_dma_mask(Controller->PCIDevice, DMA_64BIT_MASK))
-               Controller->BounceBufferLimit = DMA_64BIT_MASK;
-       else if (!pci_set_dma_mask(Controller->PCIDevice, DMA_32BIT_MASK))
-               Controller->BounceBufferLimit = DMA_32BIT_MASK;
+       if (!pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(64)))
+               Controller->BounceBufferLimit = DMA_BIT_MASK(64);
+       else if (!pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
+               Controller->BounceBufferLimit = DMA_BIT_MASK(32);
        else
                return DAC960_Failure(Controller, "DMA mask out of range");
 
index e7b8aa0cb47cf687df0d4c2160bf2e5c4fc096f2..ddea8e485cc94dbc6ed9acddfd9231a26896bfca 100644 (file)
@@ -410,6 +410,23 @@ config ATA_OVER_ETH
        This driver provides Support for ATA over Ethernet block
        devices like the Coraid EtherDrive (R) Storage Blade.
 
+config MG_DISK
+       tristate "mGine mflash, gflash support"
+       depends on ARM && ATA && GPIOLIB
+       help
+         mGine mFlash(gFlash) block device driver
+
+config MG_DISK_RES
+       int "Size of reserved area before MBR"
+       depends on MG_DISK
+       default 0
+       help
+         Define size of reserved area that usually used for boot. Unit is KB.
+         All of the block device operation will be taken this value as start
+         offset
+         Examples:
+                       1024 => 1 MB
+
 config SUNVDC
        tristate "Sun Virtual Disk Client support"
        depends on SUN_LDOMS
index 3145141cef72952d377b86187d3035e60037214f..7755a5e2a85e3b5a7ffcfe1544ce507df050764d 100644 (file)
@@ -21,6 +21,7 @@ obj-$(CONFIG_BLK_CPQ_CISS_DA)  += cciss.o
 obj-$(CONFIG_BLK_DEV_DAC960)   += DAC960.o
 obj-$(CONFIG_XILINX_SYSACE)    += xsysace.o
 obj-$(CONFIG_CDROM_PKTCDVD)    += pktcdvd.o
+obj-$(CONFIG_MG_DISK)          += mg_disk.o
 obj-$(CONFIG_SUNVDC)           += sunvdc.o
 
 obj-$(CONFIG_BLK_DEV_UMEM)     += umem.o
index 5d0e135824f9c3e96bb76de0c5f88b259d50a241..0ef6f08aa6eadfbdb685704eb5fe5f039ff8e474 100644 (file)
@@ -51,6 +51,7 @@
 #include <scsi/scsi_ioctl.h>
 #include <linux/cdrom.h>
 #include <linux/scatterlist.h>
+#include <linux/kthread.h>
 
 #define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
 #define DRIVER_NAME "HP CISS Driver (v 3.6.20)"
@@ -186,6 +187,8 @@ static int sendcmd_withirq(__u8 cmd, int ctlr, void *buff, size_t size,
                           __u8 page_code, int cmd_type);
 
 static void fail_all_cmds(unsigned long ctlr);
+static int scan_thread(void *data);
+static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c);
 
 #ifdef CONFIG_PROC_FS
 static void cciss_procinit(int i);
@@ -735,6 +738,12 @@ static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo)
        return 0;
 }
 
+static void check_ioctl_unit_attention(ctlr_info_t *host, CommandList_struct *c)
+{
+       if (c->err_info->CommandStatus == CMD_TARGET_STATUS &&
+                       c->err_info->ScsiStatus != SAM_STAT_CHECK_CONDITION)
+               (void)check_for_unit_attention(host, c);
+}
 /*
  * ioctl
  */
@@ -1029,6 +1038,8 @@ static int cciss_ioctl(struct block_device *bdev, fmode_t mode,
                                         iocommand.buf_size,
                                         PCI_DMA_BIDIRECTIONAL);
 
+                       check_ioctl_unit_attention(host, c);
+
                        /* Copy the error information out */
                        iocommand.error_info = *(c->err_info);
                        if (copy_to_user
@@ -1180,6 +1191,7 @@ static int cciss_ioctl(struct block_device *bdev, fmode_t mode,
                                        (dma_addr_t) temp64.val, buff_size[i],
                                        PCI_DMA_BIDIRECTIONAL);
                        }
+                       check_ioctl_unit_attention(host, c);
                        /* Copy the error information out */
                        ioc->error_info = *(c->err_info);
                        if (copy_to_user(argp, ioc, sizeof(*ioc))) {
@@ -1287,6 +1299,7 @@ static void cciss_softirq_done(struct request *rq)
 {
        CommandList_struct *cmd = rq->completion_data;
        ctlr_info_t *h = hba[cmd->ctlr];
+       unsigned int nr_bytes;
        unsigned long flags;
        u64bit temp64;
        int i, ddir;
@@ -1308,7 +1321,14 @@ static void cciss_softirq_done(struct request *rq)
        printk("Done with %p\n", rq);
 #endif                         /* CCISS_DEBUG */
 
-       if (blk_end_request(rq, (rq->errors == 0) ? 0 : -EIO, blk_rq_bytes(rq)))
+       /*
+        * Store the full size and set the residual count for pc requests
+        */
+       nr_bytes = blk_rq_bytes(rq);
+       if (blk_pc_request(rq))
+               rq->data_len = cmd->err_info->ResidualCnt;
+
+       if (blk_end_request(rq, (rq->errors == 0) ? 0 : -EIO, nr_bytes))
                BUG();
 
        spin_lock_irqsave(&h->lock, flags);
@@ -2585,12 +2605,14 @@ static inline unsigned int make_status_bytes(unsigned int scsi_status_byte,
                ((driver_byte & 0xff) << 24);
 }
 
-static inline int evaluate_target_status(CommandList_struct *cmd)
+static inline int evaluate_target_status(ctlr_info_t *h,
+                       CommandList_struct *cmd, int *retry_cmd)
 {
        unsigned char sense_key;
        unsigned char status_byte, msg_byte, host_byte, driver_byte;
        int error_value;
 
+       *retry_cmd = 0;
        /* If we get in here, it means we got "target status", that is, scsi status */
        status_byte = cmd->err_info->ScsiStatus;
        driver_byte = DRIVER_OK;
@@ -2618,6 +2640,11 @@ static inline int evaluate_target_status(CommandList_struct *cmd)
        if (((sense_key == 0x0) || (sense_key == 0x1)) && !blk_pc_request(cmd->rq))
                error_value = 0;
 
+       if (check_for_unit_attention(h, cmd)) {
+               *retry_cmd = !blk_pc_request(cmd->rq);
+               return 0;
+       }
+
        if (!blk_pc_request(cmd->rq)) { /* Not SG_IO or similar? */
                if (error_value != 0)
                        printk(KERN_WARNING "cciss: cmd %p has CHECK CONDITION"
@@ -2657,7 +2684,7 @@ static inline void complete_command(ctlr_info_t *h, CommandList_struct *cmd,
 
        switch (cmd->err_info->CommandStatus) {
        case CMD_TARGET_STATUS:
-               rq->errors = evaluate_target_status(cmd);
+               rq->errors = evaluate_target_status(h, cmd, &retry_cmd);
                break;
        case CMD_DATA_UNDERRUN:
                if (blk_fs_request(cmd->rq)) {
@@ -3008,6 +3035,63 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
+static int scan_thread(void *data)
+{
+       ctlr_info_t *h = data;
+       int rc;
+       DECLARE_COMPLETION_ONSTACK(wait);
+       h->rescan_wait = &wait;
+
+       for (;;) {
+               rc = wait_for_completion_interruptible(&wait);
+               if (kthread_should_stop())
+                       break;
+               if (!rc)
+                       rebuild_lun_table(h, 0);
+       }
+       return 0;
+}
+
+static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c)
+{
+       if (c->err_info->SenseInfo[2] != UNIT_ATTENTION)
+               return 0;
+
+       switch (c->err_info->SenseInfo[12]) {
+       case STATE_CHANGED:
+               printk(KERN_WARNING "cciss%d: a state change "
+                       "detected, command retried\n", h->ctlr);
+               return 1;
+       break;
+       case LUN_FAILED:
+               printk(KERN_WARNING "cciss%d: LUN failure "
+                       "detected, action required\n", h->ctlr);
+               return 1;
+       break;
+       case REPORT_LUNS_CHANGED:
+               printk(KERN_WARNING "cciss%d: report LUN data "
+                       "changed\n", h->ctlr);
+               if (h->rescan_wait)
+                       complete(h->rescan_wait);
+               return 1;
+       break;
+       case POWER_OR_RESET:
+               printk(KERN_WARNING "cciss%d: a power on "
+                       "or device reset detected\n", h->ctlr);
+               return 1;
+       break;
+       case UNIT_ATTENTION_CLEARED:
+               printk(KERN_WARNING "cciss%d: unit attention "
+                   "cleared by another initiator\n", h->ctlr);
+               return 1;
+       break;
+       default:
+               printk(KERN_WARNING "cciss%d: unknown "
+                       "unit attention detected\n", h->ctlr);
+                               return 1;
+       }
+}
+
 /*
  *  We cannot read the structure directly, for portability we must use
  *   the io functions.
@@ -3181,12 +3265,21 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
  */
        cciss_interrupt_mode(c, pdev, board_id);
 
-       /*
-        * Memory base addr is first addr , the second points to the config
-        *   table
-        */
+       /* find the memory BAR */
+       for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+               if (pci_resource_flags(pdev, i) & IORESOURCE_MEM)
+                       break;
+       }
+       if (i == DEVICE_COUNT_RESOURCE) {
+               printk(KERN_WARNING "cciss: No memory BAR found\n");
+               err = -ENODEV;
+               goto err_out_free_res;
+       }
+
+       c->paddr = pci_resource_start(pdev, i); /* addressing mode bits
+                                                * already removed
+                                                */
 
-       c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */
 #ifdef CCISS_DEBUG
        printk("address 0 = %lx\n", c->paddr);
 #endif                         /* CCISS_DEBUG */
@@ -3637,9 +3730,9 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
        hba[i]->pdev = pdev;
 
        /* configure PCI DMA stuff */
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK))
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)))
                dac = 1;
-       else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK))
+       else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))
                dac = 0;
        else {
                printk(KERN_ERR "cciss: no suitable DMA available\n");
@@ -3753,6 +3846,11 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
        hba[i]->busy_initializing = 0;
 
        rebuild_lun_table(hba[i], 1);
+       hba[i]->cciss_scan_thread = kthread_run(scan_thread, hba[i],
+                               "cciss_scan%02d", i);
+       if (IS_ERR(hba[i]->cciss_scan_thread))
+               return PTR_ERR(hba[i]->cciss_scan_thread);
+
        return 1;
 
 clean4:
@@ -3828,6 +3926,7 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev)
                printk(KERN_ERR "cciss: Unable to remove device \n");
                return;
        }
+
        tmp_ptr = pci_get_drvdata(pdev);
        i = tmp_ptr->ctlr;
        if (hba[i] == NULL) {
@@ -3836,6 +3935,8 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev)
                return;
        }
 
+       kthread_stop(hba[i]->cciss_scan_thread);
+
        remove_proc_entry(hba[i]->devname, proc_cciss);
        unregister_blkdev(hba[i]->major, hba[i]->devname);
 
index 15e2b84734e3ad68df867b26a47b98ea9e982326..703e08038fb936ec722e23fafcf65a33cf411896 100644 (file)
@@ -121,6 +121,8 @@ struct ctlr_info
        struct sendcmd_reject_list scsi_rejects;
 #endif
        unsigned char alive;
+       struct completion *rescan_wait;
+       struct task_struct *cciss_scan_thread;
 };
 
 /*  Defining the diffent access_menthods */
index 24e22dea1a99e2ee2d8ec297b0dd69b624acff15..40b1b92dae7fcdd5a212d45f5706a194181c3442 100644 (file)
 #define CMD_TIMEOUT             0x000B
 #define CMD_UNABORTABLE                0x000C
 
+/* Unit Attentions ASC's as defined for the MSA2012sa */
+#define POWER_OR_RESET                 0x29
+#define STATE_CHANGED                  0x2a
+#define UNIT_ATTENTION_CLEARED         0x2f
+#define LUN_FAILED                     0x3e
+#define REPORT_LUNS_CHANGED            0x3f
+
+/* Unit Attentions ASCQ's as defined for the MSA2012sa */
+
+       /* These ASCQ's defined for ASC = POWER_OR_RESET */
+#define POWER_ON_RESET                 0x00
+#define POWER_ON_REBOOT                        0x01
+#define SCSI_BUS_RESET                 0x02
+#define MSA_TARGET_RESET               0x03
+#define CONTROLLER_FAILOVER            0x04
+#define TRANSCEIVER_SE                 0x05
+#define TRANSCEIVER_LVD                        0x06
+
+       /* These ASCQ's defined for ASC = STATE_CHANGED */
+#define RESERVATION_PREEMPTED          0x03
+#define ASYM_ACCESS_CHANGED            0x06
+#define LUN_CAPACITY_CHANGED           0x09
+
 //transfer direction
 #define XFER_NONE               0x00
 #define XFER_WRITE              0x01
index 40b17d3b55a1b2559b0f69cd2f507dae5e243bd1..ddae80825899ae0459bff4a8109d8fc3468868c3 100644 (file)
@@ -1431,6 +1431,7 @@ static int lo_open(struct block_device *bdev, fmode_t mode)
 static int lo_release(struct gendisk *disk, fmode_t mode)
 {
        struct loop_device *lo = disk->private_data;
+       int err;
 
        mutex_lock(&lo->lo_ctl_mutex);
 
@@ -1442,7 +1443,9 @@ static int lo_release(struct gendisk *disk, fmode_t mode)
                 * In autoclear mode, stop the loop thread
                 * and remove configuration after last close.
                 */
-               loop_clr_fd(lo, NULL);
+               err = loop_clr_fd(lo, NULL);
+               if (!err)
+                       goto out_unlocked;
        } else {
                /*
                 * Otherwise keep thread (if running) and config,
@@ -1453,7 +1456,7 @@ static int lo_release(struct gendisk *disk, fmode_t mode)
 
 out:
        mutex_unlock(&lo->lo_ctl_mutex);
-
+out_unlocked:
        return 0;
 }
 
diff --git a/drivers/block/mg_disk.c b/drivers/block/mg_disk.c
new file mode 100644 (file)
index 0000000..fb39d9a
--- /dev/null
@@ -0,0 +1,1005 @@
+/*
+ *  drivers/block/mg_disk.c
+ *
+ *  Support for the mGine m[g]flash IO mode.
+ *  Based on legacy hd.c
+ *
+ * (c) 2008 mGine Co.,LTD
+ * (c) 2008 unsik Kim <donari75@gmail.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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/blkdev.h>
+#include <linux/hdreg.h>
+#include <linux/libata.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/mg_disk.h>
+
+#define MG_RES_SEC (CONFIG_MG_DISK_RES << 1)
+
+static void mg_request(struct request_queue *);
+
+static void mg_dump_status(const char *msg, unsigned int stat,
+               struct mg_host *host)
+{
+       char *name = MG_DISK_NAME;
+       struct request *req;
+
+       if (host->breq) {
+               req = elv_next_request(host->breq);
+               if (req)
+                       name = req->rq_disk->disk_name;
+       }
+
+       printk(KERN_ERR "%s: %s: status=0x%02x { ", name, msg, stat & 0xff);
+       if (stat & MG_REG_STATUS_BIT_BUSY)
+               printk("Busy ");
+       if (stat & MG_REG_STATUS_BIT_READY)
+               printk("DriveReady ");
+       if (stat & MG_REG_STATUS_BIT_WRITE_FAULT)
+               printk("WriteFault ");
+       if (stat & MG_REG_STATUS_BIT_SEEK_DONE)
+               printk("SeekComplete ");
+       if (stat & MG_REG_STATUS_BIT_DATA_REQ)
+               printk("DataRequest ");
+       if (stat & MG_REG_STATUS_BIT_CORRECTED_ERROR)
+               printk("CorrectedError ");
+       if (stat & MG_REG_STATUS_BIT_ERROR)
+               printk("Error ");
+       printk("}\n");
+       if ((stat & MG_REG_STATUS_BIT_ERROR) == 0) {
+               host->error = 0;
+       } else {
+               host->error = inb((unsigned long)host->dev_base + MG_REG_ERROR);
+               printk(KERN_ERR "%s: %s: error=0x%02x { ", name, msg,
+                               host->error & 0xff);
+               if (host->error & MG_REG_ERR_BBK)
+                       printk("BadSector ");
+               if (host->error & MG_REG_ERR_UNC)
+                       printk("UncorrectableError ");
+               if (host->error & MG_REG_ERR_IDNF)
+                       printk("SectorIdNotFound ");
+               if (host->error & MG_REG_ERR_ABRT)
+                       printk("DriveStatusError ");
+               if (host->error & MG_REG_ERR_AMNF)
+                       printk("AddrMarkNotFound ");
+               printk("}");
+               if (host->error &
+                               (MG_REG_ERR_BBK | MG_REG_ERR_UNC |
+                                MG_REG_ERR_IDNF | MG_REG_ERR_AMNF)) {
+                       if (host->breq) {
+                               req = elv_next_request(host->breq);
+                               if (req)
+                                       printk(", sector=%ld", req->sector);
+                       }
+
+               }
+               printk("\n");
+       }
+}
+
+static unsigned int mg_wait(struct mg_host *host, u32 expect, u32 msec)
+{
+       u8 status;
+       unsigned long expire, cur_jiffies;
+       struct mg_drv_data *prv_data = host->dev->platform_data;
+
+       host->error = MG_ERR_NONE;
+       expire = jiffies + msecs_to_jiffies(msec);
+
+       status = inb((unsigned long)host->dev_base + MG_REG_STATUS);
+
+       do {
+               cur_jiffies = jiffies;
+               if (status & MG_REG_STATUS_BIT_BUSY) {
+                       if (expect == MG_REG_STATUS_BIT_BUSY)
+                               break;
+               } else {
+                       /* Check the error condition! */
+                       if (status & MG_REG_STATUS_BIT_ERROR) {
+                               mg_dump_status("mg_wait", status, host);
+                               break;
+                       }
+
+                       if (expect == MG_STAT_READY)
+                               if (MG_READY_OK(status))
+                                       break;
+
+                       if (expect == MG_REG_STATUS_BIT_DATA_REQ)
+                               if (status & MG_REG_STATUS_BIT_DATA_REQ)
+                                       break;
+               }
+               if (!msec) {
+                       mg_dump_status("not ready", status, host);
+                       return MG_ERR_INV_STAT;
+               }
+               if (prv_data->use_polling)
+                       msleep(1);
+
+               status = inb((unsigned long)host->dev_base + MG_REG_STATUS);
+       } while (time_before(cur_jiffies, expire));
+
+       if (time_after_eq(cur_jiffies, expire) && msec)
+               host->error = MG_ERR_TIMEOUT;
+
+       return host->error;
+}
+
+static unsigned int mg_wait_rstout(u32 rstout, u32 msec)
+{
+       unsigned long expire;
+
+       expire = jiffies + msecs_to_jiffies(msec);
+       while (time_before(jiffies, expire)) {
+               if (gpio_get_value(rstout) == 1)
+                       return MG_ERR_NONE;
+               msleep(10);
+       }
+
+       return MG_ERR_RSTOUT;
+}
+
+static void mg_unexpected_intr(struct mg_host *host)
+{
+       u32 status = inb((unsigned long)host->dev_base + MG_REG_STATUS);
+
+       mg_dump_status("mg_unexpected_intr", status, host);
+}
+
+static irqreturn_t mg_irq(int irq, void *dev_id)
+{
+       struct mg_host *host = dev_id;
+       void (*handler)(struct mg_host *) = host->mg_do_intr;
+
+       host->mg_do_intr = 0;
+       del_timer(&host->timer);
+       if (!handler)
+               handler = mg_unexpected_intr;
+       handler(host);
+       return IRQ_HANDLED;
+}
+
+static int mg_get_disk_id(struct mg_host *host)
+{
+       u32 i;
+       s32 err;
+       const u16 *id = host->id;
+       struct mg_drv_data *prv_data = host->dev->platform_data;
+       char fwrev[ATA_ID_FW_REV_LEN + 1];
+       char model[ATA_ID_PROD_LEN + 1];
+       char serial[ATA_ID_SERNO_LEN + 1];
+
+       if (!prv_data->use_polling)
+               outb(MG_REG_CTRL_INTR_DISABLE,
+                               (unsigned long)host->dev_base +
+                               MG_REG_DRV_CTRL);
+
+       outb(MG_CMD_ID, (unsigned long)host->dev_base + MG_REG_COMMAND);
+       err = mg_wait(host, MG_REG_STATUS_BIT_DATA_REQ, MG_TMAX_WAIT_RD_DRQ);
+       if (err)
+               return err;
+
+       for (i = 0; i < (MG_SECTOR_SIZE >> 1); i++)
+               host->id[i] = le16_to_cpu(inw((unsigned long)host->dev_base +
+                                       MG_BUFF_OFFSET + i * 2));
+
+       outb(MG_CMD_RD_CONF, (unsigned long)host->dev_base + MG_REG_COMMAND);
+       err = mg_wait(host, MG_STAT_READY, MG_TMAX_CONF_TO_CMD);
+       if (err)
+               return err;
+
+       if ((id[ATA_ID_FIELD_VALID] & 1) == 0)
+               return MG_ERR_TRANSLATION;
+
+       host->n_sectors = ata_id_u32(id, ATA_ID_LBA_CAPACITY);
+       host->cyls = id[ATA_ID_CYLS];
+       host->heads = id[ATA_ID_HEADS];
+       host->sectors = id[ATA_ID_SECTORS];
+
+       if (MG_RES_SEC && host->heads && host->sectors) {
+               /* modify cyls, n_sectors */
+               host->cyls = (host->n_sectors - MG_RES_SEC) /
+                       host->heads / host->sectors;
+               host->nres_sectors = host->n_sectors - host->cyls *
+                       host->heads * host->sectors;
+               host->n_sectors -= host->nres_sectors;
+       }
+
+       ata_id_c_string(id, fwrev, ATA_ID_FW_REV, sizeof(fwrev));
+       ata_id_c_string(id, model, ATA_ID_PROD, sizeof(model));
+       ata_id_c_string(id, serial, ATA_ID_SERNO, sizeof(serial));
+       printk(KERN_INFO "mg_disk: model: %s\n", model);
+       printk(KERN_INFO "mg_disk: firm: %.8s\n", fwrev);
+       printk(KERN_INFO "mg_disk: serial: %s\n", serial);
+       printk(KERN_INFO "mg_disk: %d + reserved %d sectors\n",
+                       host->n_sectors, host->nres_sectors);
+
+       if (!prv_data->use_polling)
+               outb(MG_REG_CTRL_INTR_ENABLE, (unsigned long)host->dev_base +
+                               MG_REG_DRV_CTRL);
+
+       return err;
+}
+
+
+static int mg_disk_init(struct mg_host *host)
+{
+       struct mg_drv_data *prv_data = host->dev->platform_data;
+       s32 err;
+       u8 init_status;
+
+       /* hdd rst low */
+       gpio_set_value(host->rst, 0);
+       err = mg_wait(host, MG_REG_STATUS_BIT_BUSY, MG_TMAX_RST_TO_BUSY);
+       if (err)
+               return err;
+
+       /* hdd rst high */
+       gpio_set_value(host->rst, 1);
+       err = mg_wait(host, MG_STAT_READY, MG_TMAX_HDRST_TO_RDY);
+       if (err)
+               return err;
+
+       /* soft reset on */
+       outb(MG_REG_CTRL_RESET |
+                       (prv_data->use_polling ? MG_REG_CTRL_INTR_DISABLE :
+                        MG_REG_CTRL_INTR_ENABLE),
+                       (unsigned long)host->dev_base + MG_REG_DRV_CTRL);
+       err = mg_wait(host, MG_REG_STATUS_BIT_BUSY, MG_TMAX_RST_TO_BUSY);
+       if (err)
+               return err;
+
+       /* soft reset off */
+       outb(prv_data->use_polling ? MG_REG_CTRL_INTR_DISABLE :
+                       MG_REG_CTRL_INTR_ENABLE,
+                       (unsigned long)host->dev_base + MG_REG_DRV_CTRL);
+       err = mg_wait(host, MG_STAT_READY, MG_TMAX_SWRST_TO_RDY);
+       if (err)
+               return err;
+
+       init_status = inb((unsigned long)host->dev_base + MG_REG_STATUS) & 0xf;
+
+       if (init_status == 0xf)
+               return MG_ERR_INIT_STAT;
+
+       return err;
+}
+
+static void mg_bad_rw_intr(struct mg_host *host)
+{
+       struct request *req = elv_next_request(host->breq);
+       if (req != NULL)
+               if (++req->errors >= MG_MAX_ERRORS ||
+                               host->error == MG_ERR_TIMEOUT)
+                       end_request(req, 0);
+}
+
+static unsigned int mg_out(struct mg_host *host,
+               unsigned int sect_num,
+               unsigned int sect_cnt,
+               unsigned int cmd,
+               void (*intr_addr)(struct mg_host *))
+{
+       struct mg_drv_data *prv_data = host->dev->platform_data;
+
+       if (mg_wait(host, MG_STAT_READY, MG_TMAX_CONF_TO_CMD))
+               return host->error;
+
+       if (!prv_data->use_polling) {
+               host->mg_do_intr = intr_addr;
+               mod_timer(&host->timer, jiffies + 3 * HZ);
+       }
+       if (MG_RES_SEC)
+               sect_num += MG_RES_SEC;
+       outb((u8)sect_cnt, (unsigned long)host->dev_base + MG_REG_SECT_CNT);
+       outb((u8)sect_num, (unsigned long)host->dev_base + MG_REG_SECT_NUM);
+       outb((u8)(sect_num >> 8), (unsigned long)host->dev_base +
+                       MG_REG_CYL_LOW);
+       outb((u8)(sect_num >> 16), (unsigned long)host->dev_base +
+                       MG_REG_CYL_HIGH);
+       outb((u8)((sect_num >> 24) | MG_REG_HEAD_LBA_MODE),
+                       (unsigned long)host->dev_base + MG_REG_DRV_HEAD);
+       outb(cmd, (unsigned long)host->dev_base + MG_REG_COMMAND);
+       return MG_ERR_NONE;
+}
+
+static void mg_read(struct request *req)
+{
+       u32 remains, j;
+       struct mg_host *host = req->rq_disk->private_data;
+
+       remains = req->nr_sectors;
+
+       if (mg_out(host, req->sector, req->nr_sectors, MG_CMD_RD, 0) !=
+                       MG_ERR_NONE)
+               mg_bad_rw_intr(host);
+
+       MG_DBG("requested %d sects (from %ld), buffer=0x%p\n",
+                       remains, req->sector, req->buffer);
+
+       while (remains) {
+               if (mg_wait(host, MG_REG_STATUS_BIT_DATA_REQ,
+                                       MG_TMAX_WAIT_RD_DRQ) != MG_ERR_NONE) {
+                       mg_bad_rw_intr(host);
+                       return;
+               }
+               for (j = 0; j < MG_SECTOR_SIZE >> 1; j++) {
+                       *(u16 *)req->buffer =
+                               inw((unsigned long)host->dev_base +
+                                               MG_BUFF_OFFSET + (j << 1));
+                       req->buffer += 2;
+               }
+
+               req->sector++;
+               req->errors = 0;
+               remains = --req->nr_sectors;
+               --req->current_nr_sectors;
+
+               if (req->current_nr_sectors <= 0) {
+                       MG_DBG("remain : %d sects\n", remains);
+                       end_request(req, 1);
+                       if (remains > 0)
+                               req = elv_next_request(host->breq);
+               }
+
+               outb(MG_CMD_RD_CONF, (unsigned long)host->dev_base +
+                               MG_REG_COMMAND);
+       }
+}
+
+static void mg_write(struct request *req)
+{
+       u32 remains, j;
+       struct mg_host *host = req->rq_disk->private_data;
+
+       remains = req->nr_sectors;
+
+       if (mg_out(host, req->sector, req->nr_sectors, MG_CMD_WR, 0) !=
+                       MG_ERR_NONE) {
+               mg_bad_rw_intr(host);
+               return;
+       }
+
+
+       MG_DBG("requested %d sects (from %ld), buffer=0x%p\n",
+                       remains, req->sector, req->buffer);
+       while (remains) {
+               if (mg_wait(host, MG_REG_STATUS_BIT_DATA_REQ,
+                                       MG_TMAX_WAIT_WR_DRQ) != MG_ERR_NONE) {
+                       mg_bad_rw_intr(host);
+                       return;
+               }
+               for (j = 0; j < MG_SECTOR_SIZE >> 1; j++) {
+                       outw(*(u16 *)req->buffer,
+                                       (unsigned long)host->dev_base +
+                                       MG_BUFF_OFFSET + (j << 1));
+                       req->buffer += 2;
+               }
+               req->sector++;
+               remains = --req->nr_sectors;
+               --req->current_nr_sectors;
+
+               if (req->current_nr_sectors <= 0) {
+                       MG_DBG("remain : %d sects\n", remains);
+                       end_request(req, 1);
+                       if (remains > 0)
+                               req = elv_next_request(host->breq);
+               }
+
+               outb(MG_CMD_WR_CONF, (unsigned long)host->dev_base +
+                               MG_REG_COMMAND);
+       }
+}
+
+static void mg_read_intr(struct mg_host *host)
+{
+       u32 i;
+       struct request *req;
+
+       /* check status */
+       do {
+               i = inb((unsigned long)host->dev_base + MG_REG_STATUS);
+               if (i & MG_REG_STATUS_BIT_BUSY)
+                       break;
+               if (!MG_READY_OK(i))
+                       break;
+               if (i & MG_REG_STATUS_BIT_DATA_REQ)
+                       goto ok_to_read;
+       } while (0);
+       mg_dump_status("mg_read_intr", i, host);
+       mg_bad_rw_intr(host);
+       mg_request(host->breq);
+       return;
+
+ok_to_read:
+       /* get current segment of request */
+       req = elv_next_request(host->breq);
+
+       /* read 1 sector */
+       for (i = 0; i < MG_SECTOR_SIZE >> 1; i++) {
+               *(u16 *)req->buffer =
+                       inw((unsigned long)host->dev_base + MG_BUFF_OFFSET +
+                                       (i << 1));
+               req->buffer += 2;
+       }
+
+       /* manipulate request */
+       MG_DBG("sector %ld, remaining=%ld, buffer=0x%p\n",
+                       req->sector, req->nr_sectors - 1, req->buffer);
+
+       req->sector++;
+       req->errors = 0;
+       i = --req->nr_sectors;
+       --req->current_nr_sectors;
+
+       /* let know if current segment done */
+       if (req->current_nr_sectors <= 0)
+               end_request(req, 1);
+
+       /* set handler if read remains */
+       if (i > 0) {
+               host->mg_do_intr = mg_read_intr;
+               mod_timer(&host->timer, jiffies + 3 * HZ);
+       }
+
+       /* send read confirm */
+       outb(MG_CMD_RD_CONF, (unsigned long)host->dev_base + MG_REG_COMMAND);
+
+       /* goto next request */
+       if (!i)
+               mg_request(host->breq);
+}
+
+static void mg_write_intr(struct mg_host *host)
+{
+       u32 i, j;
+       u16 *buff;
+       struct request *req;
+
+       /* get current segment of request */
+       req = elv_next_request(host->breq);
+
+       /* check status */
+       do {
+               i = inb((unsigned long)host->dev_base + MG_REG_STATUS);
+               if (i & MG_REG_STATUS_BIT_BUSY)
+                       break;
+               if (!MG_READY_OK(i))
+                       break;
+               if ((req->nr_sectors <= 1) || (i & MG_REG_STATUS_BIT_DATA_REQ))
+                       goto ok_to_write;
+       } while (0);
+       mg_dump_status("mg_write_intr", i, host);
+       mg_bad_rw_intr(host);
+       mg_request(host->breq);
+       return;
+
+ok_to_write:
+       /* manipulate request */
+       req->sector++;
+       i = --req->nr_sectors;
+       --req->current_nr_sectors;
+       req->buffer += MG_SECTOR_SIZE;
+
+       /* let know if current segment or all done */
+       if (!i || (req->bio && req->current_nr_sectors <= 0))
+               end_request(req, 1);
+
+       /* write 1 sector and set handler if remains */
+       if (i > 0) {
+               buff = (u16 *)req->buffer;
+               for (j = 0; j < MG_STORAGE_BUFFER_SIZE >> 1; j++) {
+                       outw(*buff, (unsigned long)host->dev_base +
+                                       MG_BUFF_OFFSET + (j << 1));
+                       buff++;
+               }
+               MG_DBG("sector %ld, remaining=%ld, buffer=0x%p\n",
+                               req->sector, req->nr_sectors, req->buffer);
+               host->mg_do_intr = mg_write_intr;
+               mod_timer(&host->timer, jiffies + 3 * HZ);
+       }
+
+       /* send write confirm */
+       outb(MG_CMD_WR_CONF, (unsigned long)host->dev_base + MG_REG_COMMAND);
+
+       if (!i)
+               mg_request(host->breq);
+}
+
+void mg_times_out(unsigned long data)
+{
+       struct mg_host *host = (struct mg_host *)data;
+       char *name;
+       struct request *req;
+
+       req = elv_next_request(host->breq);
+       if (!req)
+               return;
+
+       host->mg_do_intr = NULL;
+
+       name = req->rq_disk->disk_name;
+       printk(KERN_DEBUG "%s: timeout\n", name);
+
+       host->error = MG_ERR_TIMEOUT;
+       mg_bad_rw_intr(host);
+
+       mg_request(host->breq);
+}
+
+static void mg_request_poll(struct request_queue *q)
+{
+       struct request *req;
+       struct mg_host *host;
+
+       while ((req = elv_next_request(q)) != NULL) {
+               host = req->rq_disk->private_data;
+               if (blk_fs_request(req)) {
+                       switch (rq_data_dir(req)) {
+                       case READ:
+                               mg_read(req);
+                               break;
+                       case WRITE:
+                               mg_write(req);
+                               break;
+                       default:
+                               printk(KERN_WARNING "%s:%d unknown command\n",
+                                               __func__, __LINE__);
+                               end_request(req, 0);
+                               break;
+                       }
+               }
+       }
+}
+
+static unsigned int mg_issue_req(struct request *req,
+               struct mg_host *host,
+               unsigned int sect_num,
+               unsigned int sect_cnt)
+{
+       u16 *buff;
+       u32 i;
+
+       switch (rq_data_dir(req)) {
+       case READ:
+               if (mg_out(host, sect_num, sect_cnt, MG_CMD_RD, &mg_read_intr)
+                               != MG_ERR_NONE) {
+                       mg_bad_rw_intr(host);
+                       return host->error;
+               }
+               break;
+       case WRITE:
+               /* TODO : handler */
+               outb(MG_REG_CTRL_INTR_DISABLE,
+                               (unsigned long)host->dev_base +
+                               MG_REG_DRV_CTRL);
+               if (mg_out(host, sect_num, sect_cnt, MG_CMD_WR, &mg_write_intr)
+                               != MG_ERR_NONE) {
+                       mg_bad_rw_intr(host);
+                       return host->error;
+               }
+               del_timer(&host->timer);
+               mg_wait(host, MG_REG_STATUS_BIT_DATA_REQ, MG_TMAX_WAIT_WR_DRQ);
+               outb(MG_REG_CTRL_INTR_ENABLE, (unsigned long)host->dev_base +
+                               MG_REG_DRV_CTRL);
+               if (host->error) {
+                       mg_bad_rw_intr(host);
+                       return host->error;
+               }
+               buff = (u16 *)req->buffer;
+               for (i = 0; i < MG_SECTOR_SIZE >> 1; i++) {
+                       outw(*buff, (unsigned long)host->dev_base +
+                                       MG_BUFF_OFFSET + (i << 1));
+                       buff++;
+               }
+               mod_timer(&host->timer, jiffies + 3 * HZ);
+               outb(MG_CMD_WR_CONF, (unsigned long)host->dev_base +
+                               MG_REG_COMMAND);
+               break;
+       default:
+               printk(KERN_WARNING "%s:%d unknown command\n",
+                               __func__, __LINE__);
+               end_request(req, 0);
+               break;
+       }
+       return MG_ERR_NONE;
+}
+
+/* This function also called from IRQ context */
+static void mg_request(struct request_queue *q)
+{
+       struct request *req;
+       struct mg_host *host;
+       u32 sect_num, sect_cnt;
+
+       while (1) {
+               req = elv_next_request(q);
+               if (!req)
+                       return;
+
+               host = req->rq_disk->private_data;
+
+               /* check unwanted request call */
+               if (host->mg_do_intr)
+                       return;
+
+               del_timer(&host->timer);
+
+               sect_num = req->sector;
+               /* deal whole segments */
+               sect_cnt = req->nr_sectors;
+
+               /* sanity check */
+               if (sect_num >= get_capacity(req->rq_disk) ||
+                               ((sect_num + sect_cnt) >
+                                get_capacity(req->rq_disk))) {
+                       printk(KERN_WARNING
+                                       "%s: bad access: sector=%d, count=%d\n",
+                                       req->rq_disk->disk_name,
+                                       sect_num, sect_cnt);
+                       end_request(req, 0);
+                       continue;
+               }
+
+               if (!blk_fs_request(req))
+                       return;
+
+               if (!mg_issue_req(req, host, sect_num, sect_cnt))
+                       return;
+       }
+}
+
+static int mg_getgeo(struct block_device *bdev, struct hd_geometry *geo)
+{
+       struct mg_host *host = bdev->bd_disk->private_data;
+
+       geo->cylinders = (unsigned short)host->cyls;
+       geo->heads = (unsigned char)host->heads;
+       geo->sectors = (unsigned char)host->sectors;
+       return 0;
+}
+
+static struct block_device_operations mg_disk_ops = {
+       .getgeo = mg_getgeo
+};
+
+static int mg_suspend(struct platform_device *plat_dev, pm_message_t state)
+{
+       struct mg_drv_data *prv_data = plat_dev->dev.platform_data;
+       struct mg_host *host = prv_data->host;
+
+       if (mg_wait(host, MG_STAT_READY, MG_TMAX_CONF_TO_CMD))
+               return -EIO;
+
+       if (!prv_data->use_polling)
+               outb(MG_REG_CTRL_INTR_DISABLE,
+                               (unsigned long)host->dev_base +
+                               MG_REG_DRV_CTRL);
+
+       outb(MG_CMD_SLEEP, (unsigned long)host->dev_base + MG_REG_COMMAND);
+       /* wait until mflash deep sleep */
+       msleep(1);
+
+       if (mg_wait(host, MG_STAT_READY, MG_TMAX_CONF_TO_CMD)) {
+               if (!prv_data->use_polling)
+                       outb(MG_REG_CTRL_INTR_ENABLE,
+                                       (unsigned long)host->dev_base +
+                                       MG_REG_DRV_CTRL);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int mg_resume(struct platform_device *plat_dev)
+{
+       struct mg_drv_data *prv_data = plat_dev->dev.platform_data;
+       struct mg_host *host = prv_data->host;
+
+       if (mg_wait(host, MG_STAT_READY, MG_TMAX_CONF_TO_CMD))
+               return -EIO;
+
+       outb(MG_CMD_WAKEUP, (unsigned long)host->dev_base + MG_REG_COMMAND);
+       /* wait until mflash wakeup */
+       msleep(1);
+
+       if (mg_wait(host, MG_STAT_READY, MG_TMAX_CONF_TO_CMD))
+               return -EIO;
+
+       if (!prv_data->use_polling)
+               outb(MG_REG_CTRL_INTR_ENABLE, (unsigned long)host->dev_base +
+                               MG_REG_DRV_CTRL);
+
+       return 0;
+}
+
+static int mg_probe(struct platform_device *plat_dev)
+{
+       struct mg_host *host;
+       struct resource *rsc;
+       struct mg_drv_data *prv_data = plat_dev->dev.platform_data;
+       int err = 0;
+
+       if (!prv_data) {
+               printk(KERN_ERR "%s:%d fail (no driver_data)\n",
+                               __func__, __LINE__);
+               err = -EINVAL;
+               goto probe_err;
+       }
+
+       /* alloc mg_host */
+       host = kzalloc(sizeof(struct mg_host), GFP_KERNEL);
+       if (!host) {
+               printk(KERN_ERR "%s:%d fail (no memory for mg_host)\n",
+                               __func__, __LINE__);
+               err = -ENOMEM;
+               goto probe_err;
+       }
+       host->major = MG_DISK_MAJ;
+
+       /* link each other */
+       prv_data->host = host;
+       host->dev = &plat_dev->dev;
+
+       /* io remap */
+       rsc = platform_get_resource(plat_dev, IORESOURCE_MEM, 0);
+       if (!rsc) {
+               printk(KERN_ERR "%s:%d platform_get_resource fail\n",
+                               __func__, __LINE__);
+               err = -EINVAL;
+               goto probe_err_2;
+       }
+       host->dev_base = ioremap(rsc->start , rsc->end + 1);
+       if (!host->dev_base) {
+               printk(KERN_ERR "%s:%d ioremap fail\n",
+                               __func__, __LINE__);
+               err = -EIO;
+               goto probe_err_2;
+       }
+       MG_DBG("dev_base = 0x%x\n", (u32)host->dev_base);
+
+       /* get reset pin */
+       rsc = platform_get_resource_byname(plat_dev, IORESOURCE_IO,
+                       MG_RST_PIN);
+       if (!rsc) {
+               printk(KERN_ERR "%s:%d get reset pin fail\n",
+                               __func__, __LINE__);
+               err = -EIO;
+               goto probe_err_3;
+       }
+       host->rst = rsc->start;
+
+       /* init rst pin */
+       err = gpio_request(host->rst, MG_RST_PIN);
+       if (err)
+               goto probe_err_3;
+       gpio_direction_output(host->rst, 1);
+
+       /* reset out pin */
+       if (!(prv_data->dev_attr & MG_DEV_MASK))
+               goto probe_err_3a;
+
+       if (prv_data->dev_attr != MG_BOOT_DEV) {
+               rsc = platform_get_resource_byname(plat_dev, IORESOURCE_IO,
+                               MG_RSTOUT_PIN);
+               if (!rsc) {
+                       printk(KERN_ERR "%s:%d get reset-out pin fail\n",
+                                       __func__, __LINE__);
+                       err = -EIO;
+                       goto probe_err_3a;
+               }
+               host->rstout = rsc->start;
+               err = gpio_request(host->rstout, MG_RSTOUT_PIN);
+               if (err)
+                       goto probe_err_3a;
+               gpio_direction_input(host->rstout);
+       }
+
+       /* disk reset */
+       if (prv_data->dev_attr == MG_STORAGE_DEV) {
+               /* If POR seq. not yet finised, wait */
+               err = mg_wait_rstout(host->rstout, MG_TMAX_RSTOUT);
+               if (err)
+                       goto probe_err_3b;
+               err = mg_disk_init(host);
+               if (err) {
+                       printk(KERN_ERR "%s:%d fail (err code : %d)\n",
+                                       __func__, __LINE__, err);
+                       err = -EIO;
+                       goto probe_err_3b;
+               }
+       }
+
+       /* get irq resource */
+       if (!prv_data->use_polling) {
+               host->irq = platform_get_irq(plat_dev, 0);
+               if (host->irq == -ENXIO) {
+                       err = host->irq;
+                       goto probe_err_3b;
+               }
+               err = request_irq(host->irq, mg_irq,
+                               IRQF_DISABLED | IRQF_TRIGGER_RISING,
+                               MG_DEV_NAME, host);
+               if (err) {
+                       printk(KERN_ERR "%s:%d fail (request_irq err=%d)\n",
+                                       __func__, __LINE__, err);
+                       goto probe_err_3b;
+               }
+
+       }
+
+       /* get disk id */
+       err = mg_get_disk_id(host);
+       if (err) {
+               printk(KERN_ERR "%s:%d fail (err code : %d)\n",
+                               __func__, __LINE__, err);
+               err = -EIO;
+               goto probe_err_4;
+       }
+
+       err = register_blkdev(host->major, MG_DISK_NAME);
+       if (err < 0) {
+               printk(KERN_ERR "%s:%d register_blkdev fail (err code : %d)\n",
+                               __func__, __LINE__, err);
+               goto probe_err_4;
+       }
+       if (!host->major)
+               host->major = err;
+
+       spin_lock_init(&host->lock);
+
+       if (prv_data->use_polling)
+               host->breq = blk_init_queue(mg_request_poll, &host->lock);
+       else
+               host->breq = blk_init_queue(mg_request, &host->lock);
+
+       if (!host->breq) {
+               err = -ENOMEM;
+               printk(KERN_ERR "%s:%d (blk_init_queue) fail\n",
+                               __func__, __LINE__);
+               goto probe_err_5;
+       }
+
+       /* mflash is random device, thanx for the noop */
+       elevator_exit(host->breq->elevator);
+       err = elevator_init(host->breq, "noop");
+       if (err) {
+               printk(KERN_ERR "%s:%d (elevator_init) fail\n",
+                               __func__, __LINE__);
+               goto probe_err_6;
+       }
+       blk_queue_max_sectors(host->breq, MG_MAX_SECTS);
+       blk_queue_hardsect_size(host->breq, MG_SECTOR_SIZE);
+
+       init_timer(&host->timer);
+       host->timer.function = mg_times_out;
+       host->timer.data = (unsigned long)host;
+
+       host->gd = alloc_disk(MG_DISK_MAX_PART);
+       if (!host->gd) {
+               printk(KERN_ERR "%s:%d (alloc_disk) fail\n",
+                               __func__, __LINE__);
+               err = -ENOMEM;
+               goto probe_err_7;
+       }
+       host->gd->major = host->major;
+       host->gd->first_minor = 0;
+       host->gd->fops = &mg_disk_ops;
+       host->gd->queue = host->breq;
+       host->gd->private_data = host;
+       sprintf(host->gd->disk_name, MG_DISK_NAME"a");
+
+       set_capacity(host->gd, host->n_sectors);
+
+       add_disk(host->gd);
+
+       return err;
+
+probe_err_7:
+       del_timer_sync(&host->timer);
+probe_err_6:
+       blk_cleanup_queue(host->breq);
+probe_err_5:
+       unregister_blkdev(MG_DISK_MAJ, MG_DISK_NAME);
+probe_err_4:
+       if (!prv_data->use_polling)
+               free_irq(host->irq, host);
+probe_err_3b:
+       gpio_free(host->rstout);
+probe_err_3a:
+       gpio_free(host->rst);
+probe_err_3:
+       iounmap(host->dev_base);
+probe_err_2:
+       kfree(host);
+probe_err:
+       return err;
+}
+
+static int mg_remove(struct platform_device *plat_dev)
+{
+       struct mg_drv_data *prv_data = plat_dev->dev.platform_data;
+       struct mg_host *host = prv_data->host;
+       int err = 0;
+
+       /* delete timer */
+       del_timer_sync(&host->timer);
+
+       /* remove disk */
+       if (host->gd) {
+               del_gendisk(host->gd);
+               put_disk(host->gd);
+       }
+       /* remove queue */
+       if (host->breq)
+               blk_cleanup_queue(host->breq);
+
+       /* unregister blk device */
+       unregister_blkdev(host->major, MG_DISK_NAME);
+
+       /* free irq */
+       if (!prv_data->use_polling)
+               free_irq(host->irq, host);
+
+       /* free reset-out pin */
+       if (prv_data->dev_attr != MG_BOOT_DEV)
+               gpio_free(host->rstout);
+
+       /* free rst pin */
+       if (host->rst)
+               gpio_free(host->rst);
+
+       /* unmap io */
+       if (host->dev_base)
+               iounmap(host->dev_base);
+
+       /* free mg_host */
+       kfree(host);
+
+       return err;
+}
+
+static struct platform_driver mg_disk_driver = {
+       .probe = mg_probe,
+       .remove = mg_remove,
+       .suspend = mg_suspend,
+       .resume = mg_resume,
+       .driver = {
+               .name = MG_DEV_NAME,
+               .owner = THIS_MODULE,
+       }
+};
+
+/****************************************************************************
+ *
+ * Module stuff
+ *
+ ****************************************************************************/
+
+static int __init mg_init(void)
+{
+       printk(KERN_INFO "mGine mflash driver, (c) 2008 mGine Co.\n");
+       return platform_driver_register(&mg_disk_driver);
+}
+
+static void __exit mg_exit(void)
+{
+       printk(KERN_INFO "mflash driver : bye bye\n");
+       platform_driver_unregister(&mg_disk_driver);
+}
+
+module_init(mg_init);
+module_exit(mg_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("unsik Kim <donari75@gmail.com>");
+MODULE_DESCRIPTION("mGine m[g]flash device driver");
index a18e1ca0f76197e32bdef59323936a627372253e..ff0448e4bf036d36fc6e2a2a071be0ff13b19f99 100644 (file)
@@ -1586,9 +1586,9 @@ static int carm_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_out;
 
 #ifdef IF_64BIT_DMA_IS_POSSIBLE /* grrrr... */
-       rc = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (!rc) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (rc) {
                        printk(KERN_ERR DRV_NAME "(%s): consistent DMA mask failure\n",
                                pci_name(pdev));
@@ -1597,7 +1597,7 @@ static int carm_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                pci_dac = 1;
        } else {
 #endif
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        printk(KERN_ERR DRV_NAME "(%s): DMA mask failure\n",
                                pci_name(pdev));
index c24e1bdbad438785b0b68fca6aba5699331436b2..9744d59a69f210b3ab2ba61bc5446e9ddf156455 100644 (file)
@@ -829,8 +829,8 @@ static int __devinit mm_pci_probe(struct pci_dev *dev,
        dev_printk(KERN_INFO, &dev->dev,
          "Micro Memory(tm) controller found (PCI Mem Module (Battery Backup))\n");
 
-       if (pci_set_dma_mask(dev, DMA_64BIT_MASK) &&
-           pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(dev, DMA_BIT_MASK(64)) &&
+           pci_set_dma_mask(dev, DMA_BIT_MASK(32))) {
                dev_printk(KERN_WARNING, &dev->dev, "NO suitable DMA found\n");
                return  -ENOMEM;
        }
index 05674febb0c6bff218d2c76373402e7fcf0e1f58..73a0765344b63a4cde03de5cfbb1381a7b410a5d 100644 (file)
@@ -75,6 +75,7 @@ MODULE_DEVICE_TABLE(pci, applicom_pci_tbl);
 MODULE_AUTHOR("David Woodhouse & Applicom International");
 MODULE_DESCRIPTION("Driver for Applicom Profibus card");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_MISCDEV(AC_MINOR);
 
 MODULE_SUPPORTED_DEVICE("ac");
 
index 272db0e2b491188103f8658ed77e02671004f782..1fdb9f657d8f8650745ab136b7292d887568be7e 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/bitops.h>
 #include <linux/firmware.h>
+#include <linux/device.h>
 
 #include <asm/system.h>
 #include <linux/io.h>
@@ -5408,3 +5409,4 @@ module_exit(cy_cleanup_module);
 
 MODULE_LICENSE("GPL");
 MODULE_VERSION(CY_VERSION);
+MODULE_ALIAS_CHARDEV_MAJOR(CYCLADES_MAJOR);
index 45ec263ec012c504080409a2cb399aba7808b8e2..a5c59fc2b0ff44335bf61d94ba33b039e6103ac5 100644 (file)
@@ -2258,7 +2258,7 @@ static int esp_open(struct tty_struct *tty, struct file *filp)
  * driver.
  */
 
-static void show_serial_version(void)
+static void __init show_serial_version(void)
 {
        printk(KERN_INFO "%s version %s (DMA %u)\n",
                serial_name, serial_version, dma);
index 24aa6e88e223d5772649182d878342224749c3c1..a59eac584d1621b3e4824ca3e644d944a31266a6 100644 (file)
@@ -925,6 +925,7 @@ static void isicom_shutdown_port(struct isi_port *port)
                if (!card->count)
                        isicom_shutdown_board(card);
        }
+       tty_kref_put(tty);
 }
 
 static void isicom_flush_buffer(struct tty_struct *tty)
index 8b0da97d5293b58f09b267131455e714b5d8344c..4a4cab73d0be176aa640c9717bc7582231b39495 100644 (file)
@@ -1486,11 +1486,11 @@ static int moxa_poll_port(struct moxa_port *p, unsigned int handle,
        }
 
        if (!handle) /* nothing else to do */
-               return 0;
+               goto put;
 
        intr = readw(ip); /* port irq status */
        if (intr == 0)
-               return 0;
+               goto put;
 
        writew(0, ip); /* ACK port */
        ofsAddr = p->tableAddr;
@@ -1499,16 +1499,17 @@ static int moxa_poll_port(struct moxa_port *p, unsigned int handle,
                                ofsAddr + HostStat);
 
        if (!inited)
-               return 0;
+               goto put;
 
        if (tty && (intr & IntrBreak) && !I_IGNBRK(tty)) { /* BREAK */
                tty_insert_flip_char(tty, 0, TTY_BREAK);
                tty_schedule_flip(tty);
        }
-       tty_kref_put(tty);
 
        if (intr & IntrLine)
                moxa_new_dcdstate(p, readb(ofsAddr + FlagStat) & DCD_state);
+put:
+       tty_kref_put(tty);
 
        return 0;
 }
index 402c9f217f83a3853f62b5a09401ab8ab0d8f3a3..a420e8d437dd01c6a30d5e5446718797ce51dcb3 100644 (file)
@@ -820,7 +820,6 @@ static void mxser_check_modem_status(struct tty_struct *tty,
                        wake_up_interruptible(&port->port.open_wait);
        }
 
-       tty = tty_port_tty_get(&port->port);
        if (port->port.flags & ASYNC_CTS_FLOW) {
                if (tty->hw_stopped) {
                        if (status & UART_MSR_CTS) {
index 2e8a6eed34be59039c57fbb6151973b8c19c9c3d..ce81da5b2da9a20079cf46fe64eddcac546b1474 100644 (file)
@@ -333,7 +333,7 @@ void rio_copy_to_card(void *from, void __iomem *to, int len)
 
 int rio_minor(struct tty_struct *tty)
 {
-       return tty->index + (tty->driver == rio_driver) ? 0 : 256;
+       return tty->index + ((tty->driver == rio_driver) ? 0 : 256);
 }
 
 static int rio_set_real_termios(void *ptr)
index 9af8d74875bc9e24cb76f97528647532036d7712..217660451237a79c7cd186d38697bad07f9dbcf8 100644 (file)
@@ -48,6 +48,7 @@
 #include <linux/delay.h>
 #include <linux/tty_flip.h>
 #include <linux/spinlock.h>
+#include <linux/device.h>
 
 #include <linux/uaccess.h>
 
@@ -1524,6 +1525,7 @@ module_param(iobase2, int, 0);
 module_param(iobase3, int, 0);
 
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_CHARDEV_MAJOR(RISCOM8_NORMAL_MAJOR);
 #endif /* MODULE */
 
 /*
index 3c67c3d83de9c2962ab6dc76936848b5ca28dd76..e72be4190a442a6378cca9a68a306b3421dcb06c 100644 (file)
@@ -2365,3 +2365,4 @@ module_init(specialix_init_module);
 module_exit(specialix_exit_module);
 
 MODULE_LICENSE("GPL");
+MODULE_ALIAS_CHARDEV_MAJOR(SPECIALIX_NORMAL_MAJOR);
index 4d85402a9e4a0990d2db5afdfac0c66376b1af09..2bef086fb34268afaf0e65ec01e5017627142721 100644 (file)
@@ -2575,7 +2575,7 @@ static int hifn_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                return err;
        pci_set_master(pdev);
 
-       err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err)
                goto err_out_disable_pci_device;
 
index af9761ccf9f132a6414aacec926251b06c8b64c6..f9f05d7a707d09bd53a489d99acde270b2f26521 100644 (file)
@@ -209,7 +209,7 @@ static struct platform_device pseudo_dev = {
        .id   = 0,
        .num_resources = 0,
        .dev  = {
-               .coherent_dma_mask = DMA_32BIT_MASK,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
                .release = dev_release,
        }
 };
index ed83dd9df192a5a4b65d5f1f15b3e1e2349178b3..2225bb6ba3d14c55790eeeea78dace956fa905b0 100644 (file)
@@ -98,15 +98,15 @@ static int __devinit ioat_probe(struct pci_dev *pdev,
        if (err)
                goto err_request_regions;
 
-       err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (err)
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err)
                goto err_set_dma_mask;
 
-       err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
        if (err)
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err)
                goto err_set_dma_mask;
 
index 3009e0171e54958f2c99ea3b568d4619ff237b7c..18d65fb42ee71850d0914f5fd44cd6a91eaf3111 100644 (file)
@@ -545,7 +545,7 @@ static int __devinit dcdbas_probe(struct platform_device *dev)
         * BIOS SMI calls require buffer addresses be in 32-bit address space.
         * This is done by setting the DMA mask below.
         */
-       dcdbas_pdev->dev.coherent_dma_mask = DMA_32BIT_MASK;
+       dcdbas_pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
        dcdbas_pdev->dev.dma_mask = &dcdbas_pdev->dev.coherent_dma_mask;
 
        error = sysfs_create_group(&dev->dev.kobj, &dcdbas_attr_group);
index ce52bf2f235ed541660fe4a76d728272203ea816..0e8a9185f676fa6ade83113b983a7e6430e52739 100644 (file)
@@ -248,6 +248,18 @@ config SENSORS_ASB100
          This driver can also be built as a module.  If so, the module
          will be called asb100.
 
+config SENSORS_ATK0110
+       tristate "ASUS ATK0110 ACPI hwmon"
+       depends on X86 && ACPI && EXPERIMENTAL
+       help
+         If you say yes here you get support for the ACPI hardware
+         monitoring interface found in many ASUS motherboards. This
+         driver will provide readings of fans, voltages and temperatures
+         through the system firmware.
+
+         This driver can also be built as a module. If so, the module
+         will be called asus_atk0110.
+
 config SENSORS_ATXP1
        tristate "Attansic ATXP1 VID controller"
        depends on I2C && EXPERIMENTAL
@@ -358,6 +370,16 @@ config SENSORS_FSCHMD
          This driver can also be built as a module.  If so, the module
          will be called fschmd.
 
+config SENSORS_G760A
+       tristate "GMT G760A"
+       depends on I2C
+       help
+         If you say yes here you get support for Global Mixed-mode
+         Technology Inc G760A fan speed PWM controller chips.
+
+         This driver can also be built as a module.  If so, the module
+         will be called g760a.
+
 config SENSORS_GL518SM
        tristate "Genesys Logic GL518SM"
        depends on I2C
index 3a6b1f06f8f4a50bd7440da3e7dbc34a0aee7567..1d3757837b4ff5091f4ae2d6728616f9ec7aee1a 100644 (file)
@@ -32,6 +32,7 @@ obj-$(CONFIG_SENSORS_ADT7475) += adt7475.o
 
 obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o
 obj-$(CONFIG_SENSORS_AMS)      += ams/
+obj-$(CONFIG_SENSORS_ATK0110)  += asus_atk0110.o
 obj-$(CONFIG_SENSORS_ATXP1)    += atxp1.o
 obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o
 obj-$(CONFIG_SENSORS_DME1737)  += dme1737.o
@@ -42,6 +43,7 @@ obj-$(CONFIG_SENSORS_F75375S) += f75375s.o
 obj-$(CONFIG_SENSORS_FSCHER)   += fscher.o
 obj-$(CONFIG_SENSORS_FSCHMD)   += fschmd.o
 obj-$(CONFIG_SENSORS_FSCPOS)   += fscpos.o
+obj-$(CONFIG_SENSORS_G760A)    += g760a.o
 obj-$(CONFIG_SENSORS_GL518SM)  += gl518sm.o
 obj-$(CONFIG_SENSORS_GL520SM)  += gl520sm.o
 obj-$(CONFIG_SENSORS_ULTRA45)  += ultra45_env.o
diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c
new file mode 100644 (file)
index 0000000..0897ede
--- /dev/null
@@ -0,0 +1,1009 @@
+/*
+ * Copyright (C) 2007-2009 Luca Tettamanti <kronos.it@gmail.com>
+ *
+ * This file is released under the GPLv2
+ * See COPYING in the top level directory of the kernel tree.
+ */
+
+#include <linux/kernel.h>
+#include <linux/hwmon.h>
+#include <linux/list.h>
+#include <linux/module.h>
+
+#include <acpi/acpi.h>
+#include <acpi/acpixf.h>
+#include <acpi/acpi_drivers.h>
+#include <acpi/acpi_bus.h>
+
+
+#define ATK_HID "ATK0110"
+
+/* Minimum time between readings, enforced in order to avoid
+ * hogging the CPU.
+ */
+#define CACHE_TIME             HZ
+
+#define BOARD_ID               "MBIF"
+#define METHOD_ENUMERATE       "GGRP"
+#define METHOD_READ            "GITM"
+#define METHOD_WRITE           "SITM"
+#define METHOD_OLD_READ_TMP    "RTMP"
+#define METHOD_OLD_READ_VLT    "RVLT"
+#define METHOD_OLD_READ_FAN    "RFAN"
+#define METHOD_OLD_ENUM_TMP    "TSIF"
+#define METHOD_OLD_ENUM_VLT    "VSIF"
+#define METHOD_OLD_ENUM_FAN    "FSIF"
+
+#define ATK_MUX_HWMON          0x00000006ULL
+
+#define ATK_CLASS_MASK         0xff000000ULL
+#define ATK_CLASS_FREQ_CTL     0x03000000ULL
+#define ATK_CLASS_FAN_CTL      0x04000000ULL
+#define ATK_CLASS_HWMON                0x06000000ULL
+
+#define ATK_TYPE_MASK          0x00ff0000ULL
+#define HWMON_TYPE_VOLT                0x00020000ULL
+#define HWMON_TYPE_TEMP                0x00030000ULL
+#define HWMON_TYPE_FAN         0x00040000ULL
+
+#define HWMON_SENSOR_ID_MASK   0x0000ffffULL
+
+enum atk_pack_member {
+       HWMON_PACK_FLAGS,
+       HWMON_PACK_NAME,
+       HWMON_PACK_LIMIT1,
+       HWMON_PACK_LIMIT2,
+       HWMON_PACK_ENABLE
+};
+
+/* New package format */
+#define _HWMON_NEW_PACK_SIZE   7
+#define _HWMON_NEW_PACK_FLAGS  0
+#define _HWMON_NEW_PACK_NAME   1
+#define _HWMON_NEW_PACK_UNK1   2
+#define _HWMON_NEW_PACK_UNK2   3
+#define _HWMON_NEW_PACK_LIMIT1 4
+#define _HWMON_NEW_PACK_LIMIT2 5
+#define _HWMON_NEW_PACK_ENABLE 6
+
+/* Old package format */
+#define _HWMON_OLD_PACK_SIZE   5
+#define _HWMON_OLD_PACK_FLAGS  0
+#define _HWMON_OLD_PACK_NAME   1
+#define _HWMON_OLD_PACK_LIMIT1 2
+#define _HWMON_OLD_PACK_LIMIT2 3
+#define _HWMON_OLD_PACK_ENABLE 4
+
+
+struct atk_data {
+       struct device *hwmon_dev;
+       acpi_handle atk_handle;
+       struct acpi_device *acpi_dev;
+
+       bool old_interface;
+
+       /* old interface */
+       acpi_handle rtmp_handle;
+       acpi_handle rvlt_handle;
+       acpi_handle rfan_handle;
+       /* new inteface */
+       acpi_handle enumerate_handle;
+       acpi_handle read_handle;
+
+       int voltage_count;
+       int temperature_count;
+       int fan_count;
+       struct list_head sensor_list;
+};
+
+
+typedef ssize_t (*sysfs_show_func)(struct device *dev,
+                       struct device_attribute *attr, char *buf);
+
+static const struct acpi_device_id atk_ids[] = {
+       {ATK_HID, 0},
+       {"", 0},
+};
+MODULE_DEVICE_TABLE(acpi, atk_ids);
+
+#define ATTR_NAME_SIZE 16 /* Worst case is "tempN_input" */
+
+struct atk_sensor_data {
+       struct list_head list;
+       struct atk_data *data;
+       struct device_attribute label_attr;
+       struct device_attribute input_attr;
+       struct device_attribute limit1_attr;
+       struct device_attribute limit2_attr;
+       char label_attr_name[ATTR_NAME_SIZE];
+       char input_attr_name[ATTR_NAME_SIZE];
+       char limit1_attr_name[ATTR_NAME_SIZE];
+       char limit2_attr_name[ATTR_NAME_SIZE];
+       u64 id;
+       u64 type;
+       u64 limit1;
+       u64 limit2;
+       u64 cached_value;
+       unsigned long last_updated; /* in jiffies */
+       bool is_valid;
+       char const *acpi_name;
+};
+
+struct atk_acpi_buffer_u64 {
+       union acpi_object buf;
+       u64 value;
+};
+
+static int atk_add(struct acpi_device *device);
+static int atk_remove(struct acpi_device *device, int type);
+static void atk_print_sensor(struct atk_data *data, union acpi_object *obj);
+static int atk_read_value(struct atk_sensor_data *sensor, u64 *value);
+static void atk_free_sensors(struct atk_data *data);
+
+static struct acpi_driver atk_driver = {
+       .name   = ATK_HID,
+       .class  = "hwmon",
+       .ids    = atk_ids,
+       .ops    = {
+               .add    = atk_add,
+               .remove = atk_remove,
+       },
+};
+
+#define input_to_atk_sensor(attr) \
+       container_of(attr, struct atk_sensor_data, input_attr)
+
+#define label_to_atk_sensor(attr) \
+       container_of(attr, struct atk_sensor_data, label_attr)
+
+#define limit1_to_atk_sensor(attr) \
+       container_of(attr, struct atk_sensor_data, limit1_attr)
+
+#define limit2_to_atk_sensor(attr) \
+       container_of(attr, struct atk_sensor_data, limit2_attr)
+
+static ssize_t atk_input_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct atk_sensor_data *s = input_to_atk_sensor(attr);
+       u64 value;
+       int err;
+
+       err = atk_read_value(s, &value);
+       if (err)
+               return err;
+
+       if (s->type == HWMON_TYPE_TEMP)
+               /* ACPI returns decidegree */
+               value *= 100;
+
+       return sprintf(buf, "%llu\n", value);
+}
+
+static ssize_t atk_label_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct atk_sensor_data *s = label_to_atk_sensor(attr);
+
+       return sprintf(buf, "%s\n", s->acpi_name);
+}
+
+static ssize_t atk_limit1_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct atk_sensor_data *s = limit1_to_atk_sensor(attr);
+       u64 value = s->limit1;
+
+       if (s->type == HWMON_TYPE_TEMP)
+               value *= 100;
+
+       return sprintf(buf, "%lld\n", value);
+}
+
+static ssize_t atk_limit2_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct atk_sensor_data *s = limit2_to_atk_sensor(attr);
+       u64 value = s->limit2;
+
+       if (s->type == HWMON_TYPE_TEMP)
+               value *= 100;
+
+       return sprintf(buf, "%lld\n", value);
+}
+
+static ssize_t atk_name_show(struct device *dev,
+                               struct device_attribute *attr, char *buf)
+{
+       return sprintf(buf, "atk0110\n");
+}
+static struct device_attribute atk_name_attr =
+               __ATTR(name, 0444, atk_name_show, NULL);
+
+static void atk_init_attribute(struct device_attribute *attr, char *name,
+               sysfs_show_func show)
+{
+       attr->attr.name = name;
+       attr->attr.mode = 0444;
+       attr->show = show;
+       attr->store = NULL;
+}
+
+
+static union acpi_object *atk_get_pack_member(struct atk_data *data,
+                                               union acpi_object *pack,
+                                               enum atk_pack_member m)
+{
+       bool old_if = data->old_interface;
+       int offset;
+
+       switch (m) {
+       case HWMON_PACK_FLAGS:
+               offset = old_if ? _HWMON_OLD_PACK_FLAGS : _HWMON_NEW_PACK_FLAGS;
+               break;
+       case HWMON_PACK_NAME:
+               offset = old_if ? _HWMON_OLD_PACK_NAME : _HWMON_NEW_PACK_NAME;
+               break;
+       case HWMON_PACK_LIMIT1:
+               offset = old_if ? _HWMON_OLD_PACK_LIMIT1 :
+                                 _HWMON_NEW_PACK_LIMIT1;
+               break;
+       case HWMON_PACK_LIMIT2:
+               offset = old_if ? _HWMON_OLD_PACK_LIMIT2 :
+                                 _HWMON_NEW_PACK_LIMIT2;
+               break;
+       case HWMON_PACK_ENABLE:
+               offset = old_if ? _HWMON_OLD_PACK_ENABLE :
+                                 _HWMON_NEW_PACK_ENABLE;
+               break;
+       default:
+               return NULL;
+       }
+
+       return &pack->package.elements[offset];
+}
+
+
+/* New package format is:
+ * - flag (int)
+ *     class - used for de-muxing the request to the correct GITn
+ *     type (volt, temp, fan)
+ *     sensor id |
+ *     sensor id - used for de-muxing the request _inside_ the GITn
+ * - name (str)
+ * - unknown (int)
+ * - unknown (int)
+ * - limit1 (int)
+ * - limit2 (int)
+ * - enable (int)
+ *
+ * The old package has the same format but it's missing the two unknown fields.
+ */
+static int validate_hwmon_pack(struct atk_data *data, union acpi_object *obj)
+{
+       struct device *dev = &data->acpi_dev->dev;
+       union acpi_object *tmp;
+       bool old_if = data->old_interface;
+       int const expected_size = old_if ? _HWMON_OLD_PACK_SIZE :
+                                          _HWMON_NEW_PACK_SIZE;
+
+       if (obj->type != ACPI_TYPE_PACKAGE) {
+               dev_warn(dev, "Invalid type: %d\n", obj->type);
+               return -EINVAL;
+       }
+
+       if (obj->package.count != expected_size) {
+               dev_warn(dev, "Invalid package size: %d, expected: %d\n",
+                               obj->package.count, expected_size);
+               return -EINVAL;
+       }
+
+       tmp = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS);
+       if (tmp->type != ACPI_TYPE_INTEGER) {
+               dev_warn(dev, "Invalid type (flag): %d\n", tmp->type);
+               return -EINVAL;
+       }
+
+       tmp = atk_get_pack_member(data, obj, HWMON_PACK_NAME);
+       if (tmp->type != ACPI_TYPE_STRING) {
+               dev_warn(dev, "Invalid type (name): %d\n", tmp->type);
+               return -EINVAL;
+       }
+
+       /* Don't check... we don't know what they're useful for anyway */
+#if 0
+       tmp = &obj->package.elements[HWMON_PACK_UNK1];
+       if (tmp->type != ACPI_TYPE_INTEGER) {
+               dev_warn(dev, "Invalid type (unk1): %d\n", tmp->type);
+               return -EINVAL;
+       }
+
+       tmp = &obj->package.elements[HWMON_PACK_UNK2];
+       if (tmp->type != ACPI_TYPE_INTEGER) {
+               dev_warn(dev, "Invalid type (unk2): %d\n", tmp->type);
+               return -EINVAL;
+       }
+#endif
+
+       tmp = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT1);
+       if (tmp->type != ACPI_TYPE_INTEGER) {
+               dev_warn(dev, "Invalid type (limit1): %d\n", tmp->type);
+               return -EINVAL;
+       }
+
+       tmp = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT2);
+       if (tmp->type != ACPI_TYPE_INTEGER) {
+               dev_warn(dev, "Invalid type (limit2): %d\n", tmp->type);
+               return -EINVAL;
+       }
+
+       tmp = atk_get_pack_member(data, obj, HWMON_PACK_ENABLE);
+       if (tmp->type != ACPI_TYPE_INTEGER) {
+               dev_warn(dev, "Invalid type (enable): %d\n", tmp->type);
+               return -EINVAL;
+       }
+
+       atk_print_sensor(data, obj);
+
+       return 0;
+}
+
+static char const *atk_sensor_type(union acpi_object *flags)
+{
+       u64 type = flags->integer.value & ATK_TYPE_MASK;
+       char const *what;
+
+       switch (type) {
+       case HWMON_TYPE_VOLT:
+               what = "voltage";
+               break;
+       case HWMON_TYPE_TEMP:
+               what = "temperature";
+               break;
+       case HWMON_TYPE_FAN:
+               what = "fan";
+               break;
+       default:
+               what = "unknown";
+               break;
+       }
+
+       return what;
+}
+
+static void atk_print_sensor(struct atk_data *data, union acpi_object *obj)
+{
+#ifdef DEBUG
+       struct device *dev = &data->acpi_dev->dev;
+       union acpi_object *flags;
+       union acpi_object *name;
+       union acpi_object *limit1;
+       union acpi_object *limit2;
+       union acpi_object *enable;
+       char const *what;
+
+       flags = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS);
+       name = atk_get_pack_member(data, obj, HWMON_PACK_NAME);
+       limit1 = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT1);
+       limit2 = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT2);
+       enable = atk_get_pack_member(data, obj, HWMON_PACK_ENABLE);
+
+       what = atk_sensor_type(flags);
+
+       dev_dbg(dev, "%s: %#llx %s [%llu-%llu] %s\n", what,
+                       flags->integer.value,
+                       name->string.pointer,
+                       limit1->integer.value, limit2->integer.value,
+                       enable->integer.value ? "enabled" : "disabled");
+#endif
+}
+
+static int atk_read_value_old(struct atk_sensor_data *sensor, u64 *value)
+{
+       struct atk_data *data = sensor->data;
+       struct device *dev = &data->acpi_dev->dev;
+       struct acpi_object_list params;
+       union acpi_object id;
+       acpi_status status;
+       acpi_handle method;
+
+       switch (sensor->type) {
+       case HWMON_TYPE_VOLT:
+               method = data->rvlt_handle;
+               break;
+       case HWMON_TYPE_TEMP:
+               method = data->rtmp_handle;
+               break;
+       case HWMON_TYPE_FAN:
+               method = data->rfan_handle;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       id.type = ACPI_TYPE_INTEGER;
+       id.integer.value = sensor->id;
+
+       params.count = 1;
+       params.pointer = &id;
+
+       status = acpi_evaluate_integer(method, NULL, &params, value);
+       if (status != AE_OK) {
+               dev_warn(dev, "%s: ACPI exception: %s\n", __func__,
+                               acpi_format_exception(status));
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int atk_read_value_new(struct atk_sensor_data *sensor, u64 *value)
+{
+       struct atk_data *data = sensor->data;
+       struct device *dev = &data->acpi_dev->dev;
+       struct acpi_object_list params;
+       struct acpi_buffer ret;
+       union acpi_object id;
+       struct atk_acpi_buffer_u64 tmp;
+       acpi_status status;
+
+       id.type = ACPI_TYPE_INTEGER;
+       id.integer.value = sensor->id;
+
+       params.count = 1;
+       params.pointer = &id;
+
+       tmp.buf.type = ACPI_TYPE_BUFFER;
+       tmp.buf.buffer.pointer = (u8 *)&tmp.value;
+       tmp.buf.buffer.length = sizeof(u64);
+       ret.length = sizeof(tmp);
+       ret.pointer = &tmp;
+
+       status = acpi_evaluate_object_typed(data->read_handle, NULL, &params,
+                       &ret, ACPI_TYPE_BUFFER);
+       if (status != AE_OK) {
+               dev_warn(dev, "%s: ACPI exception: %s\n", __func__,
+                               acpi_format_exception(status));
+               return -EIO;
+       }
+
+       /* Return buffer format:
+        * [0-3] "value" is valid flag
+        * [4-7] value
+        */
+       if (!(tmp.value & 0xffffffff)) {
+               /* The reading is not valid, possible causes:
+                * - sensor failure
+                * - enumeration was FUBAR (and we didn't notice)
+                */
+               dev_info(dev, "Failure: %#llx\n", tmp.value);
+               return -EIO;
+       }
+
+       *value = (tmp.value & 0xffffffff00000000ULL) >> 32;
+
+       return 0;
+}
+
+static int atk_read_value(struct atk_sensor_data *sensor, u64 *value)
+{
+       int err;
+
+       if (!sensor->is_valid ||
+           time_after(jiffies, sensor->last_updated + CACHE_TIME)) {
+               if (sensor->data->old_interface)
+                       err = atk_read_value_old(sensor, value);
+               else
+                       err = atk_read_value_new(sensor, value);
+
+               sensor->is_valid = true;
+               sensor->last_updated = jiffies;
+               sensor->cached_value = *value;
+       } else {
+               *value = sensor->cached_value;
+               err = 0;
+       }
+
+       return err;
+}
+
+static int atk_add_sensor(struct atk_data *data, union acpi_object *obj)
+{
+       struct device *dev = &data->acpi_dev->dev;
+       union acpi_object *flags;
+       union acpi_object *name;
+       union acpi_object *limit1;
+       union acpi_object *limit2;
+       union acpi_object *enable;
+       struct atk_sensor_data *sensor;
+       char const *base_name;
+       char const *limit1_name;
+       char const *limit2_name;
+       u64 type;
+       int err;
+       int *num;
+       int start;
+
+       if (obj->type != ACPI_TYPE_PACKAGE) {
+               /* wft is this? */
+               dev_warn(dev, "Unknown type for ACPI object: (%d)\n",
+                               obj->type);
+               return -EINVAL;
+       }
+
+       err = validate_hwmon_pack(data, obj);
+       if (err)
+               return err;
+
+       /* Ok, we have a valid hwmon package */
+       type = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS)->integer.value
+              & ATK_TYPE_MASK;
+
+       switch (type) {
+       case HWMON_TYPE_VOLT:
+               base_name = "in";
+               limit1_name = "min";
+               limit2_name = "max";
+               num = &data->voltage_count;
+               start = 0;
+               break;
+       case HWMON_TYPE_TEMP:
+               base_name = "temp";
+               limit1_name = "max";
+               limit2_name = "crit";
+               num = &data->temperature_count;
+               start = 1;
+               break;
+       case HWMON_TYPE_FAN:
+               base_name = "fan";
+               limit1_name = "min";
+               limit2_name = "max";
+               num = &data->fan_count;
+               start = 1;
+               break;
+       default:
+               dev_warn(dev, "Unknown sensor type: %#llx\n", type);
+               return -EINVAL;
+       }
+
+       enable = atk_get_pack_member(data, obj, HWMON_PACK_ENABLE);
+       if (!enable->integer.value)
+               /* sensor is disabled */
+               return 0;
+
+       flags = atk_get_pack_member(data, obj, HWMON_PACK_FLAGS);
+       name = atk_get_pack_member(data, obj, HWMON_PACK_NAME);
+       limit1 = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT1);
+       limit2 = atk_get_pack_member(data, obj, HWMON_PACK_LIMIT2);
+
+       sensor = kzalloc(sizeof(*sensor), GFP_KERNEL);
+       if (!sensor)
+               return -ENOMEM;
+
+       sensor->acpi_name = kstrdup(name->string.pointer, GFP_KERNEL);
+       if (!sensor->acpi_name) {
+               err = -ENOMEM;
+               goto out;
+       }
+
+       INIT_LIST_HEAD(&sensor->list);
+       sensor->type = type;
+       sensor->data = data;
+       sensor->id = flags->integer.value;
+       sensor->limit1 = limit1->integer.value;
+       sensor->limit2 = limit2->integer.value;
+
+       snprintf(sensor->input_attr_name, ATTR_NAME_SIZE,
+                       "%s%d_input", base_name, start + *num);
+       atk_init_attribute(&sensor->input_attr,
+                       sensor->input_attr_name,
+                       atk_input_show);
+
+       snprintf(sensor->label_attr_name, ATTR_NAME_SIZE,
+                       "%s%d_label", base_name, start + *num);
+       atk_init_attribute(&sensor->label_attr,
+                       sensor->label_attr_name,
+                       atk_label_show);
+
+       snprintf(sensor->limit1_attr_name, ATTR_NAME_SIZE,
+                       "%s%d_%s", base_name, start + *num, limit1_name);
+       atk_init_attribute(&sensor->limit1_attr,
+                       sensor->limit1_attr_name,
+                       atk_limit1_show);
+
+       snprintf(sensor->limit2_attr_name, ATTR_NAME_SIZE,
+                       "%s%d_%s", base_name, start + *num, limit2_name);
+       atk_init_attribute(&sensor->limit2_attr,
+                       sensor->limit2_attr_name,
+                       atk_limit2_show);
+
+       list_add(&sensor->list, &data->sensor_list);
+       (*num)++;
+
+       return 1;
+out:
+       kfree(sensor->acpi_name);
+       kfree(sensor);
+       return err;
+}
+
+static int atk_enumerate_old_hwmon(struct atk_data *data)
+{
+       struct device *dev = &data->acpi_dev->dev;
+       struct acpi_buffer buf;
+       union acpi_object *pack;
+       acpi_status status;
+       int i, ret;
+       int count = 0;
+
+       /* Voltages */
+       buf.length = ACPI_ALLOCATE_BUFFER;
+       status = acpi_evaluate_object_typed(data->atk_handle,
+                       METHOD_OLD_ENUM_VLT, NULL, &buf, ACPI_TYPE_PACKAGE);
+       if (status != AE_OK) {
+               dev_warn(dev, METHOD_OLD_ENUM_VLT ": ACPI exception: %s\n",
+                               acpi_format_exception(status));
+
+               return -ENODEV;
+       }
+
+       pack = buf.pointer;
+       for (i = 1; i < pack->package.count; i++) {
+               union acpi_object *obj = &pack->package.elements[i];
+
+               ret = atk_add_sensor(data, obj);
+               if (ret > 0)
+                       count++;
+       }
+       ACPI_FREE(buf.pointer);
+
+       /* Temperatures */
+       buf.length = ACPI_ALLOCATE_BUFFER;
+       status = acpi_evaluate_object_typed(data->atk_handle,
+                       METHOD_OLD_ENUM_TMP, NULL, &buf, ACPI_TYPE_PACKAGE);
+       if (status != AE_OK) {
+               dev_warn(dev, METHOD_OLD_ENUM_TMP ": ACPI exception: %s\n",
+                               acpi_format_exception(status));
+
+               ret = -ENODEV;
+               goto cleanup;
+       }
+
+       pack = buf.pointer;
+       for (i = 1; i < pack->package.count; i++) {
+               union acpi_object *obj = &pack->package.elements[i];
+
+               ret = atk_add_sensor(data, obj);
+               if (ret > 0)
+                       count++;
+       }
+       ACPI_FREE(buf.pointer);
+
+       /* Fans */
+       buf.length = ACPI_ALLOCATE_BUFFER;
+       status = acpi_evaluate_object_typed(data->atk_handle,
+                       METHOD_OLD_ENUM_FAN, NULL, &buf, ACPI_TYPE_PACKAGE);
+       if (status != AE_OK) {
+               dev_warn(dev, METHOD_OLD_ENUM_FAN ": ACPI exception: %s\n",
+                               acpi_format_exception(status));
+
+               ret = -ENODEV;
+               goto cleanup;
+       }
+
+       pack = buf.pointer;
+       for (i = 1; i < pack->package.count; i++) {
+               union acpi_object *obj = &pack->package.elements[i];
+
+               ret = atk_add_sensor(data, obj);
+               if (ret > 0)
+                       count++;
+       }
+       ACPI_FREE(buf.pointer);
+
+       return count;
+cleanup:
+       atk_free_sensors(data);
+       return ret;
+}
+
+static int atk_enumerate_new_hwmon(struct atk_data *data)
+{
+       struct device *dev = &data->acpi_dev->dev;
+       struct acpi_buffer buf;
+       acpi_status ret;
+       struct acpi_object_list params;
+       union acpi_object id;
+       union acpi_object *pack;
+       int err;
+       int i;
+
+       dev_dbg(dev, "Enumerating hwmon sensors\n");
+
+       id.type = ACPI_TYPE_INTEGER;
+       id.integer.value = ATK_MUX_HWMON;
+       params.count = 1;
+       params.pointer = &id;
+
+       buf.length = ACPI_ALLOCATE_BUFFER;
+       ret = acpi_evaluate_object_typed(data->enumerate_handle, NULL, &params,
+                       &buf, ACPI_TYPE_PACKAGE);
+       if (ret != AE_OK) {
+               dev_warn(dev, METHOD_ENUMERATE ": ACPI exception: %s\n",
+                               acpi_format_exception(ret));
+               return -ENODEV;
+       }
+
+       /* Result must be a package */
+       pack = buf.pointer;
+
+       if (pack->package.count < 1) {
+               dev_dbg(dev, "%s: hwmon package is too small: %d\n", __func__,
+                               pack->package.count);
+               err = -EINVAL;
+               goto out;
+       }
+
+       for (i = 0; i < pack->package.count; i++) {
+               union acpi_object *obj = &pack->package.elements[i];
+
+               atk_add_sensor(data, obj);
+       }
+
+       err = data->voltage_count + data->temperature_count + data->fan_count;
+
+out:
+       ACPI_FREE(buf.pointer);
+       return err;
+}
+
+static int atk_create_files(struct atk_data *data)
+{
+       struct atk_sensor_data *s;
+       int err;
+
+       list_for_each_entry(s, &data->sensor_list, list) {
+               err = device_create_file(data->hwmon_dev, &s->input_attr);
+               if (err)
+                       return err;
+               err = device_create_file(data->hwmon_dev, &s->label_attr);
+               if (err)
+                       return err;
+               err = device_create_file(data->hwmon_dev, &s->limit1_attr);
+               if (err)
+                       return err;
+               err = device_create_file(data->hwmon_dev, &s->limit2_attr);
+               if (err)
+                       return err;
+       }
+
+       err = device_create_file(data->hwmon_dev, &atk_name_attr);
+
+       return err;
+}
+
+static void atk_remove_files(struct atk_data *data)
+{
+       struct atk_sensor_data *s;
+
+       list_for_each_entry(s, &data->sensor_list, list) {
+               device_remove_file(data->hwmon_dev, &s->input_attr);
+               device_remove_file(data->hwmon_dev, &s->label_attr);
+               device_remove_file(data->hwmon_dev, &s->limit1_attr);
+               device_remove_file(data->hwmon_dev, &s->limit2_attr);
+       }
+       device_remove_file(data->hwmon_dev, &atk_name_attr);
+}
+
+static void atk_free_sensors(struct atk_data *data)
+{
+       struct list_head *head = &data->sensor_list;
+       struct atk_sensor_data *s, *tmp;
+
+       list_for_each_entry_safe(s, tmp, head, list) {
+               kfree(s->acpi_name);
+               kfree(s);
+       }
+}
+
+static int atk_register_hwmon(struct atk_data *data)
+{
+       struct device *dev = &data->acpi_dev->dev;
+       int err;
+
+       dev_dbg(dev, "registering hwmon device\n");
+       data->hwmon_dev = hwmon_device_register(dev);
+       if (IS_ERR(data->hwmon_dev))
+               return PTR_ERR(data->hwmon_dev);
+
+       dev_dbg(dev, "populating sysfs directory\n");
+       err = atk_create_files(data);
+       if (err)
+               goto remove;
+
+       return 0;
+remove:
+       /* Cleanup the registered files */
+       atk_remove_files(data);
+       hwmon_device_unregister(data->hwmon_dev);
+       return err;
+}
+
+static int atk_check_old_if(struct atk_data *data)
+{
+       struct device *dev = &data->acpi_dev->dev;
+       acpi_handle ret;
+       acpi_status status;
+
+       /* RTMP: read temperature */
+       status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_TMP, &ret);
+       if (status != AE_OK) {
+               dev_dbg(dev, "method " METHOD_OLD_READ_TMP " not found: %s\n",
+                               acpi_format_exception(status));
+               return -ENODEV;
+       }
+       data->rtmp_handle = ret;
+
+       /* RVLT: read voltage */
+       status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_VLT, &ret);
+       if (status != AE_OK) {
+               dev_dbg(dev, "method " METHOD_OLD_READ_VLT " not found: %s\n",
+                               acpi_format_exception(status));
+               return -ENODEV;
+       }
+       data->rvlt_handle = ret;
+
+       /* RFAN: read fan status */
+       status = acpi_get_handle(data->atk_handle, METHOD_OLD_READ_FAN, &ret);
+       if (status != AE_OK) {
+               dev_dbg(dev, "method " METHOD_OLD_READ_FAN " not found: %s\n",
+                               acpi_format_exception(status));
+               return -ENODEV;
+       }
+       data->rfan_handle = ret;
+
+       return 0;
+}
+
+static int atk_check_new_if(struct atk_data *data)
+{
+       struct device *dev = &data->acpi_dev->dev;
+       acpi_handle ret;
+       acpi_status status;
+
+       /* Enumeration */
+       status = acpi_get_handle(data->atk_handle, METHOD_ENUMERATE, &ret);
+       if (status != AE_OK) {
+               dev_dbg(dev, "method " METHOD_ENUMERATE " not found: %s\n",
+                               acpi_format_exception(status));
+               return -ENODEV;
+       }
+       data->enumerate_handle = ret;
+
+       /* De-multiplexer (read) */
+       status = acpi_get_handle(data->atk_handle, METHOD_READ, &ret);
+       if (status != AE_OK) {
+               dev_dbg(dev, "method " METHOD_READ " not found: %s\n",
+                               acpi_format_exception(status));
+               return -ENODEV;
+       }
+       data->read_handle = ret;
+
+       return 0;
+}
+
+static int atk_add(struct acpi_device *device)
+{
+       acpi_status ret;
+       int err;
+       struct acpi_buffer buf;
+       union acpi_object *obj;
+       struct atk_data *data;
+
+       dev_dbg(&device->dev, "adding...\n");
+
+       data = kzalloc(sizeof(*data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       data->acpi_dev = device;
+       data->atk_handle = device->handle;
+       INIT_LIST_HEAD(&data->sensor_list);
+
+       buf.length = ACPI_ALLOCATE_BUFFER;
+       ret = acpi_evaluate_object_typed(data->atk_handle, BOARD_ID, NULL,
+                       &buf, ACPI_TYPE_PACKAGE);
+       if (ret != AE_OK) {
+               dev_dbg(&device->dev, "atk: method MBIF not found\n");
+               err = -ENODEV;
+               goto out;
+       }
+
+       obj = buf.pointer;
+       if (obj->package.count >= 2 &&
+                       obj->package.elements[1].type == ACPI_TYPE_STRING) {
+               dev_dbg(&device->dev, "board ID = %s\n",
+                               obj->package.elements[1].string.pointer);
+       }
+       ACPI_FREE(buf.pointer);
+
+       /* Check for hwmon methods: first check "old" style methods; note that
+        * both may be present: in this case we stick to the old interface;
+        * analysis of multiple DSDTs indicates that when both interfaces
+        * are present the new one (GGRP/GITM) is not functional.
+        */
+       err = atk_check_old_if(data);
+       if (!err) {
+               dev_dbg(&device->dev, "Using old hwmon interface\n");
+               data->old_interface = true;
+       } else {
+               err = atk_check_new_if(data);
+               if (err)
+                       goto out;
+
+               dev_dbg(&device->dev, "Using new hwmon interface\n");
+               data->old_interface = false;
+       }
+
+       if (data->old_interface)
+               err = atk_enumerate_old_hwmon(data);
+       else
+               err = atk_enumerate_new_hwmon(data);
+       if (err < 0)
+               goto out;
+       if (err == 0) {
+               dev_info(&device->dev,
+                        "No usable sensor detected, bailing out\n");
+               err = -ENODEV;
+               goto out;
+       }
+
+       err = atk_register_hwmon(data);
+       if (err)
+               goto cleanup;
+
+       device->driver_data = data;
+       return 0;
+cleanup:
+       atk_free_sensors(data);
+out:
+       kfree(data);
+       return err;
+}
+
+static int atk_remove(struct acpi_device *device, int type)
+{
+       struct atk_data *data = device->driver_data;
+       dev_dbg(&device->dev, "removing...\n");
+
+       device->driver_data = NULL;
+
+       atk_remove_files(data);
+       atk_free_sensors(data);
+       hwmon_device_unregister(data->hwmon_dev);
+
+       kfree(data);
+
+       return 0;
+}
+
+static int __init atk0110_init(void)
+{
+       int ret;
+
+       ret = acpi_bus_register_driver(&atk_driver);
+       if (ret)
+               pr_info("atk: acpi_bus_register_driver failed: %d\n", ret);
+
+       return ret;
+}
+
+static void __exit atk0110_exit(void)
+{
+       acpi_bus_unregister_driver(&atk_driver);
+}
+
+module_init(atk0110_init);
+module_exit(atk0110_exit);
+
+MODULE_LICENSE("GPL");
diff --git a/drivers/hwmon/g760a.c b/drivers/hwmon/g760a.c
new file mode 100644 (file)
index 0000000..19c01a4
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+    g760a - Driver for the Global Mixed-mode Technology Inc. G760A
+            fan speed PWM controller chip
+
+    Copyright (C) 2007  Herbert Valerio Riedel <hvr@gnu.org>
+
+    Complete datasheet is available at GMT's website:
+      http://www.gmt.com.tw/datasheet/g760a.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.
+*/
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/jiffies.h>
+#include <linux/i2c.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/err.h>
+#include <linux/mutex.h>
+#include <linux/sysfs.h>
+
+static const struct i2c_device_id g760a_id[] = {
+       { "g760a", 0 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, g760a_id);
+
+enum g760a_regs {
+       G760A_REG_SET_CNT = 0x00,
+       G760A_REG_ACT_CNT = 0x01,
+       G760A_REG_FAN_STA = 0x02
+};
+
+#define G760A_REG_FAN_STA_RPM_OFF 0x1 /* +/-20% off */
+#define G760A_REG_FAN_STA_RPM_LOW 0x2 /* below 1920rpm */
+
+/* register data is read (and cached) at most once per second */
+#define G760A_UPDATE_INTERVAL (HZ)
+
+struct g760a_data {
+       struct i2c_client *client;
+       struct device *hwmon_dev;
+       struct mutex update_lock;
+
+       /* board specific parameters */
+       u32 clk; /* default 32kHz */
+       u16 fan_div; /* default P=2 */
+
+       /* g760a register cache */
+       unsigned int valid:1;
+       unsigned long last_updated; /* In jiffies */
+
+       u8 set_cnt; /* PWM (period) count number; 0xff stops fan */
+       u8 act_cnt; /*   formula: cnt = (CLK * 30)/(rpm * P) */
+       u8 fan_sta; /* bit 0: set when actual fan speed more than 20%
+                    *   outside requested fan speed
+                    * bit 1: set when fan speed below 1920 rpm */
+};
+
+#define G760A_DEFAULT_CLK 32768
+#define G760A_DEFAULT_FAN_DIV 2
+
+#define PWM_FROM_CNT(cnt)      (0xff-(cnt))
+#define PWM_TO_CNT(pwm)                (0xff-(pwm))
+
+unsigned int rpm_from_cnt(u8 val, u32 clk, u16 div)
+{
+       return ((val == 0x00) ? 0 : ((clk*30)/(val*div)));
+}
+
+/* new-style driver model */
+static int g760a_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id);
+static int g760a_remove(struct i2c_client *client);
+
+static struct i2c_driver g760a_driver = {
+       .driver = {
+               .name   = "g760a",
+       },
+       .probe    = g760a_probe,
+       .remove   = g760a_remove,
+       .id_table = g760a_id,
+};
+
+/* read/write wrappers */
+static int g760a_read_value(struct i2c_client *client, enum g760a_regs reg)
+{
+       return i2c_smbus_read_byte_data(client, reg);
+}
+
+static int g760a_write_value(struct i2c_client *client, enum g760a_regs reg,
+                            u16 value)
+{
+       return i2c_smbus_write_byte_data(client, reg, value);
+}
+
+/****************************************************************************
+ * sysfs attributes
+ */
+
+static struct g760a_data *g760a_update_client(struct device *dev)
+{
+       struct i2c_client *client = to_i2c_client(dev);
+       struct g760a_data *data = i2c_get_clientdata(client);
+
+       mutex_lock(&data->update_lock);
+
+       if (time_after(jiffies, data->last_updated + G760A_UPDATE_INTERVAL)
+           || !data->valid) {
+               dev_dbg(&client->dev, "Starting g760a update\n");
+
+               data->set_cnt = g760a_read_value(client, G760A_REG_SET_CNT);
+               data->act_cnt = g760a_read_value(client, G760A_REG_ACT_CNT);
+               data->fan_sta = g760a_read_value(client, G760A_REG_FAN_STA);
+
+               data->last_updated = jiffies;
+               data->valid = 1;
+       }
+
+       mutex_unlock(&data->update_lock);
+
+       return data;
+}
+
+static ssize_t show_fan(struct device *dev, struct device_attribute *da,
+                       char *buf)
+{
+       struct g760a_data *data = g760a_update_client(dev);
+       unsigned int rpm = 0;
+
+       mutex_lock(&data->update_lock);
+       if (!(data->fan_sta & G760A_REG_FAN_STA_RPM_LOW))
+               rpm = rpm_from_cnt(data->act_cnt, data->clk, data->fan_div);
+       mutex_unlock(&data->update_lock);
+
+       return sprintf(buf, "%d\n", rpm);
+}
+
+static ssize_t show_fan_alarm(struct device *dev, struct device_attribute *da,
+                             char *buf)
+{
+       struct g760a_data *data = g760a_update_client(dev);
+
+       int fan_alarm = (data->fan_sta & G760A_REG_FAN_STA_RPM_OFF) ? 1 : 0;
+
+       return sprintf(buf, "%d\n", fan_alarm);
+}
+
+static ssize_t get_pwm(struct device *dev, struct device_attribute *da,
+                      char *buf)
+{
+       struct g760a_data *data = g760a_update_client(dev);
+
+       return sprintf(buf, "%d\n", PWM_FROM_CNT(data->set_cnt));
+}
+
+static ssize_t set_pwm(struct device *dev, struct device_attribute *da,
+                      const char *buf, size_t count)
+{
+       struct i2c_client *client = to_i2c_client(dev);
+       struct g760a_data *data = g760a_update_client(dev);
+       unsigned long val;
+
+       if (strict_strtoul(buf, 10, &val))
+               return -EINVAL;
+
+       mutex_lock(&data->update_lock);
+       data->set_cnt = PWM_TO_CNT(SENSORS_LIMIT(val, 0, 255));
+       g760a_write_value(client, G760A_REG_SET_CNT, data->set_cnt);
+       mutex_unlock(&data->update_lock);
+
+       return count;
+}
+
+static DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm);
+static DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL);
+static DEVICE_ATTR(fan1_alarm, S_IRUGO, show_fan_alarm, NULL);
+
+static struct attribute *g760a_attributes[] = {
+       &dev_attr_pwm1.attr,
+       &dev_attr_fan1_input.attr,
+       &dev_attr_fan1_alarm.attr,
+       NULL
+};
+
+static const struct attribute_group g760a_group = {
+       .attrs = g760a_attributes,
+};
+
+/****************************************************************************
+ * new-style driver model code
+ */
+
+static int g760a_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
+{
+       struct g760a_data *data;
+       int err;
+
+       if (!i2c_check_functionality(client->adapter,
+                                    I2C_FUNC_SMBUS_BYTE_DATA))
+               return -EIO;
+
+       data = kzalloc(sizeof(struct g760a_data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       i2c_set_clientdata(client, data);
+
+       data->client = client;
+       mutex_init(&data->update_lock);
+
+       /* setup default configuration for now */
+       data->fan_div = G760A_DEFAULT_FAN_DIV;
+       data->clk = G760A_DEFAULT_CLK;
+
+       /* Register sysfs hooks */
+       err = sysfs_create_group(&client->dev.kobj, &g760a_group);
+       if (err)
+               goto error_sysfs_create_group;
+
+       data->hwmon_dev = hwmon_device_register(&client->dev);
+       if (IS_ERR(data->hwmon_dev)) {
+               err = PTR_ERR(data->hwmon_dev);
+               goto error_hwmon_device_register;
+       }
+
+       return 0;
+
+error_hwmon_device_register:
+       sysfs_remove_group(&client->dev.kobj, &g760a_group);
+error_sysfs_create_group:
+       kfree(data);
+       i2c_set_clientdata(client, NULL);
+
+       return err;
+}
+
+static int g760a_remove(struct i2c_client *client)
+{
+       struct g760a_data *data = i2c_get_clientdata(client);
+       hwmon_device_unregister(data->hwmon_dev);
+       sysfs_remove_group(&client->dev.kobj, &g760a_group);
+       kfree(data);
+       i2c_set_clientdata(client, NULL);
+
+       return 0;
+}
+
+/* module management */
+
+static int __init g760a_init(void)
+{
+       return i2c_add_driver(&g760a_driver);
+}
+
+static void __exit g760a_exit(void)
+{
+       i2c_del_driver(&g760a_driver);
+}
+
+MODULE_AUTHOR("Herbert Valerio Riedel <hvr@gnu.org>");
+MODULE_DESCRIPTION("GMT G760A driver");
+MODULE_LICENSE("GPL");
+
+module_init(g760a_init);
+module_exit(g760a_exit);
index 091d95f38aaa7979d060a8f7b5dc8b7e922a16bf..e34f9e402a2c259ecffc377958735189d952caaa 100644 (file)
@@ -87,25 +87,11 @@ I2C_CLIENT_INSMOD_1(lm95241);
     (val_h)) * 1000 + (val_l) * 1000 / 256)
 
 /* Functions declaration */
-static int lm95241_attach_adapter(struct i2c_adapter *adapter);
-static int lm95241_detect(struct i2c_adapter *adapter, int address,
-                         int kind);
 static void lm95241_init_client(struct i2c_client *client);
-static int lm95241_detach_client(struct i2c_client *client);
 static struct lm95241_data *lm95241_update_device(struct device *dev);
 
-/* Driver data (common to all clients) */
-static struct i2c_driver lm95241_driver = {
-       .driver = {
-               .name   = "lm95241",
-       },
-       .attach_adapter = lm95241_attach_adapter,
-       .detach_client  = lm95241_detach_client,
-};
-
 /* Client data (each client gets its own) */
 struct lm95241_data {
-       struct i2c_client client;
        struct device *hwmon_dev;
        struct mutex update_lock;
        unsigned long last_updated, rate; /* in jiffies */
@@ -323,42 +309,16 @@ static const struct attribute_group lm95241_group = {
        .attrs = lm95241_attributes,
 };
 
-/* Init/exit code */
-static int lm95241_attach_adapter(struct i2c_adapter *adapter)
+/* Return 0 if detection is successful, -ENODEV otherwise */
+static int lm95241_detect(struct i2c_client *new_client, int kind,
+                         struct i2c_board_info *info)
 {
-       if (!(adapter->class & I2C_CLASS_HWMON))
-               return 0;
-       return i2c_probe(adapter, &addr_data, lm95241_detect);
-}
-
-/*
- * The following function does more than just detection. If detection
- * succeeds, it also registers the new chip.
- */
-static int lm95241_detect(struct i2c_adapter *adapter, int address, int kind)
-{
-       struct i2c_client *new_client;
-       struct lm95241_data *data;
-       int err = 0;
+       struct i2c_adapter *adapter = new_client->adapter;
+       int address = new_client->addr;
        const char *name = "";
 
        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-               goto exit;
-
-       data = kzalloc(sizeof(struct lm95241_data), GFP_KERNEL);
-       if (!data) {
-               err = -ENOMEM;
-               goto exit;
-       }
-
-       /* The common I2C client data is placed right before the
-          LM95241-specific data. */
-       new_client = &data->client;
-       i2c_set_clientdata(new_client, data);
-       new_client->addr = address;
-       new_client->adapter = adapter;
-       new_client->driver = &lm95241_driver;
-       new_client->flags = 0;
+               return -ENODEV;
 
        /*
         * Now we do the remaining detection. A negative kind means that
@@ -378,7 +338,7 @@ static int lm95241_detect(struct i2c_adapter *adapter, int address, int kind)
                        dev_dbg(&adapter->dev,
                                "LM95241 detection failed at 0x%02x.\n",
                                address);
-                       goto exit_free;
+                       return -ENODEV;
                }
        }
 
@@ -392,23 +352,32 @@ static int lm95241_detect(struct i2c_adapter *adapter, int address, int kind)
 
                        if (kind <= 0) { /* identification failed */
                                dev_info(&adapter->dev, "Unsupported chip\n");
-                               goto exit_free;
+                               return -ENODEV;
                        }
                }
        }
 
+       /* Fill the i2c board info */
        if (kind == lm95241)
                name = "lm95241";
+       strlcpy(info->type, name, I2C_NAME_SIZE);
+       return 0;
+}
 
-       /* We can fill in the remaining client fields */
-       strlcpy(new_client->name, name, I2C_NAME_SIZE);
-       data->valid = 0;
-       mutex_init(&data->update_lock);
+static int lm95241_probe(struct i2c_client *new_client,
+                        const struct i2c_device_id *id)
+{
+       struct lm95241_data *data;
+       int err;
 
-       /* Tell the I2C layer a new client has arrived */
-       err = i2c_attach_client(new_client);
-       if (err)
-               goto exit_free;
+       data = kzalloc(sizeof(struct lm95241_data), GFP_KERNEL);
+       if (!data) {
+               err = -ENOMEM;
+               goto exit;
+       }
+
+       i2c_set_clientdata(new_client, data);
+       mutex_init(&data->update_lock);
 
        /* Initialize the LM95241 chip */
        lm95241_init_client(new_client);
@@ -416,7 +385,7 @@ static int lm95241_detect(struct i2c_adapter *adapter, int address, int kind)
        /* Register sysfs hooks */
        err = sysfs_create_group(&new_client->dev.kobj, &lm95241_group);
        if (err)
-               goto exit_detach;
+               goto exit_free;
 
        data->hwmon_dev = hwmon_device_register(&new_client->dev);
        if (IS_ERR(data->hwmon_dev)) {
@@ -428,8 +397,6 @@ static int lm95241_detect(struct i2c_adapter *adapter, int address, int kind)
 
 exit_remove_files:
        sysfs_remove_group(&new_client->dev.kobj, &lm95241_group);
-exit_detach:
-       i2c_detach_client(new_client);
 exit_free:
        kfree(data);
 exit:
@@ -456,18 +423,14 @@ static void lm95241_init_client(struct i2c_client *client)
                                  data->model);
 }
 
-static int lm95241_detach_client(struct i2c_client *client)
+static int lm95241_remove(struct i2c_client *client)
 {
        struct lm95241_data *data = i2c_get_clientdata(client);
-       int err;
 
        hwmon_device_unregister(data->hwmon_dev);
        sysfs_remove_group(&client->dev.kobj, &lm95241_group);
 
-       err = i2c_detach_client(client);
-       if (err)
-               return err;
-
+       i2c_set_clientdata(client, NULL);
        kfree(data);
        return 0;
 }
@@ -509,6 +472,25 @@ static struct lm95241_data *lm95241_update_device(struct device *dev)
        return data;
 }
 
+/* Driver data (common to all clients) */
+static const struct i2c_device_id lm95241_id[] = {
+       { "lm95241", lm95241 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, lm95241_id);
+
+static struct i2c_driver lm95241_driver = {
+       .class          = I2C_CLASS_HWMON,
+       .driver = {
+               .name   = "lm95241",
+       },
+       .probe          = lm95241_probe,
+       .remove         = lm95241_remove,
+       .id_table       = lm95241_id,
+       .detect         = lm95241_detect,
+       .address_data   = &addr_data,
+};
+
 static int __init sensors_lm95241_init(void)
 {
        return i2c_add_driver(&lm95241_driver);
index b788579b82271defa96e8c3fa20f190b90788a1b..7b2ce4a085247fa3f123e9e527b4b0718db0a215 100644 (file)
@@ -14,8 +14,4 @@ config I2C_ALGOPCF
 config I2C_ALGOPCA
        tristate "I2C PCA 9564 interfaces"
 
-config I2C_ALGO_SGI
-       tristate
-       depends on SGI_IP22 || SGI_IP32 || X86_VISWS
-
 endmenu
index cac1051bd4f1343921ad5bf87d1e91d47b6845bd..18b3e962ec09cb0be81b38992a55823d3f1733e0 100644 (file)
@@ -5,7 +5,6 @@
 obj-$(CONFIG_I2C_ALGOBIT)      += i2c-algo-bit.o
 obj-$(CONFIG_I2C_ALGOPCF)      += i2c-algo-pcf.o
 obj-$(CONFIG_I2C_ALGOPCA)      += i2c-algo-pca.o
-obj-$(CONFIG_I2C_ALGO_SGI)     += i2c-algo-sgi.o
 
 ifeq ($(CONFIG_I2C_DEBUG_ALGO),y)
 EXTRA_CFLAGS += -DDEBUG
diff --git a/drivers/i2c/algos/i2c-algo-sgi.c b/drivers/i2c/algos/i2c-algo-sgi.c
deleted file mode 100644 (file)
index 6eaf145..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * i2c-algo-sgi.c: i2c driver algorithm used by the VINO (SGI Indy) and
- * MACE (SGI O2) chips.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License version 2 as published by the Free Software Foundation.
- *
- * Copyright (C) 2003 Ladislav Michl <ladis@linux-mips.org>
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/delay.h>
-
-#include <linux/i2c.h>
-#include <linux/i2c-algo-sgi.h>
-
-
-#define SGI_I2C_FORCE_IDLE     (0 << 0)
-#define SGI_I2C_NOT_IDLE       (1 << 0)
-#define SGI_I2C_WRITE          (0 << 1)
-#define SGI_I2C_READ           (1 << 1)
-#define SGI_I2C_RELEASE_BUS    (0 << 2)
-#define SGI_I2C_HOLD_BUS       (1 << 2)
-#define SGI_I2C_XFER_DONE      (0 << 4)
-#define SGI_I2C_XFER_BUSY      (1 << 4)
-#define SGI_I2C_ACK            (0 << 5)
-#define SGI_I2C_NACK           (1 << 5)
-#define SGI_I2C_BUS_OK         (0 << 7)
-#define SGI_I2C_BUS_ERR                (1 << 7)
-
-#define get_control()          adap->getctrl(adap->data)
-#define set_control(val)       adap->setctrl(adap->data, val)
-#define read_data()            adap->rdata(adap->data)
-#define write_data(val)                adap->wdata(adap->data, val)
-
-
-static int wait_xfer_done(struct i2c_algo_sgi_data *adap)
-{
-       int i;
-
-       for (i = 0; i < adap->xfer_timeout; i++) {
-               if ((get_control() & SGI_I2C_XFER_BUSY) == 0)
-                       return 0;
-               udelay(1);
-       }
-
-       return -ETIMEDOUT;
-}
-
-static int wait_ack(struct i2c_algo_sgi_data *adap)
-{
-       int i;
-
-       if (wait_xfer_done(adap))
-               return -ETIMEDOUT;
-       for (i = 0; i < adap->ack_timeout; i++) {
-               if ((get_control() & SGI_I2C_NACK) == 0)
-                       return 0;
-               udelay(1);
-       }
-
-       return -ETIMEDOUT;
-}
-
-static int force_idle(struct i2c_algo_sgi_data *adap)
-{
-       int i;
-
-       set_control(SGI_I2C_FORCE_IDLE);
-       for (i = 0; i < adap->xfer_timeout; i++) {
-               if ((get_control() & SGI_I2C_NOT_IDLE) == 0)
-                       goto out;
-               udelay(1);
-       }
-       return -ETIMEDOUT;
-out:
-       if (get_control() & SGI_I2C_BUS_ERR)
-               return -EIO;
-       return 0;
-}
-
-static int do_address(struct i2c_algo_sgi_data *adap, unsigned int addr,
-                     int rd)
-{
-       if (rd)
-               set_control(SGI_I2C_NOT_IDLE);
-       /* Check if bus is idle, eventually force it to do so */
-       if (get_control() & SGI_I2C_NOT_IDLE)
-               if (force_idle(adap))
-                       return -EIO;
-       /* Write out the i2c chip address and specify operation */
-       set_control(SGI_I2C_HOLD_BUS | SGI_I2C_WRITE | SGI_I2C_NOT_IDLE);
-       if (rd)
-               addr |= 1;
-       write_data(addr);
-       if (wait_ack(adap))
-               return -EIO;
-       return 0;
-}
-
-static int i2c_read(struct i2c_algo_sgi_data *adap, unsigned char *buf,
-                   unsigned int len)
-{
-       int i;
-
-       set_control(SGI_I2C_HOLD_BUS | SGI_I2C_READ | SGI_I2C_NOT_IDLE);
-       for (i = 0; i < len; i++) {
-               if (wait_xfer_done(adap))
-                       return -EIO;
-               buf[i] = read_data();
-       }
-       set_control(SGI_I2C_RELEASE_BUS | SGI_I2C_FORCE_IDLE);
-
-       return 0;
-
-}
-
-static int i2c_write(struct i2c_algo_sgi_data *adap, unsigned char *buf,
-                    unsigned int len)
-{
-       int i;
-
-       /* We are already in write state */
-       for (i = 0; i < len; i++) {
-               write_data(buf[i]);
-               if (wait_ack(adap))
-                       return -EIO;
-       }
-       return 0;
-}
-
-static int sgi_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs,
-                   int num)
-{
-       struct i2c_algo_sgi_data *adap = i2c_adap->algo_data;
-       struct i2c_msg *p;
-       int i, err = 0;
-
-       for (i = 0; !err && i < num; i++) {
-               p = &msgs[i];
-               err = do_address(adap, p->addr, p->flags & I2C_M_RD);
-               if (err || !p->len)
-                       continue;
-               if (p->flags & I2C_M_RD)
-                       err = i2c_read(adap, p->buf, p->len);
-               else
-                       err = i2c_write(adap, p->buf, p->len);
-       }
-
-       return (err < 0) ? err : i;
-}
-
-static u32 sgi_func(struct i2c_adapter *adap)
-{
-       return I2C_FUNC_SMBUS_EMUL;
-}
-
-static const struct i2c_algorithm sgi_algo = {
-       .master_xfer    = sgi_xfer,
-       .functionality  = sgi_func,
-};
-
-/*
- * registering functions to load algorithms at runtime
- */
-int i2c_sgi_add_bus(struct i2c_adapter *adap)
-{
-       adap->algo = &sgi_algo;
-
-       return i2c_add_adapter(adap);
-}
-EXPORT_SYMBOL(i2c_sgi_add_bus);
-
-MODULE_AUTHOR("Ladislav Michl <ladis@linux-mips.org>");
-MODULE_DESCRIPTION("I2C-Bus SGI algorithm");
-MODULE_LICENSE("GPL");
index da809ad0996aaa1ea010a13900fa466be9e92ec0..94eae5c3cbc7d3417d2273569f89164d45efea5b 100644 (file)
@@ -356,6 +356,16 @@ config I2C_IBM_IIC
          This driver can also be built as a module.  If so, the module
          will be called i2c-ibm_iic.
 
+config I2C_IMX
+       tristate "IMX I2C interface"
+       depends on ARCH_MXC
+       help
+         Say Y here if you want to use the IIC bus controller on
+         the Freescale i.MX/MXC processors.
+
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-imx.
+
 config I2C_IOP3XX
        tristate "Intel IOPx3xx and IXP4xx on-chip I2C interface"
        depends on ARCH_IOP32X || ARCH_IOP33X || ARCH_IXP4XX || ARCH_IOP13XX
@@ -462,6 +472,16 @@ config I2C_S3C2410
          Say Y here to include support for I2C controller in the
          Samsung S3C2410 based System-on-Chip devices.
 
+config I2C_S6000
+       tristate "S6000 I2C support"
+       depends on XTENSA_VARIANT_S6000
+       help
+         This driver supports the on chip I2C device on the
+         S6000 xtensa processor family.
+
+         To compile this driver as a module, choose M here. The module
+         will be called i2c-s6000.
+
 config I2C_SH7760
        tristate "Renesas SH7760 I2C Controller"
        depends on CPU_SUBTYPE_SH7760
index 0c2c4b26cdf1ff4d5bac686a40a4a306bf0e730f..776acb6403a783bed7bcab070ae93d7384221c50 100644 (file)
@@ -33,6 +33,7 @@ obj-$(CONFIG_I2C_DAVINCI)     += i2c-davinci.o
 obj-$(CONFIG_I2C_GPIO)         += i2c-gpio.o
 obj-$(CONFIG_I2C_HIGHLANDER)   += i2c-highlander.o
 obj-$(CONFIG_I2C_IBM_IIC)      += i2c-ibm_iic.o
+obj-$(CONFIG_I2C_IMX)          += i2c-imx.o
 obj-$(CONFIG_I2C_IOP3XX)       += i2c-iop3xx.o
 obj-$(CONFIG_I2C_IXP2000)      += i2c-ixp2000.o
 obj-$(CONFIG_I2C_MPC)          += i2c-mpc.o
@@ -43,6 +44,7 @@ obj-$(CONFIG_I2C_PASEMI)      += i2c-pasemi.o
 obj-$(CONFIG_I2C_PNX)          += i2c-pnx.o
 obj-$(CONFIG_I2C_PXA)          += i2c-pxa.o
 obj-$(CONFIG_I2C_S3C2410)      += i2c-s3c2410.o
+obj-$(CONFIG_I2C_S6000)                += i2c-s6000.o
 obj-$(CONFIG_I2C_SH7760)       += i2c-sh7760.o
 obj-$(CONFIG_I2C_SH_MOBILE)    += i2c-sh_mobile.o
 obj-$(CONFIG_I2C_SIMTEC)       += i2c-simtec.o
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
new file mode 100644 (file)
index 0000000..0b486a6
--- /dev/null
@@ -0,0 +1,624 @@
+/*
+ *     Copyright (C) 2002 Motorola GSG-China
+ *
+ *     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:
+ *     Darius Augulis, Teltonika Inc.
+ *
+ * Desc.:
+ *     Implementation of I2C Adapter/Algorithm Driver
+ *     for I2C Bus integrated in Freescale i.MX/MXC processors
+ *
+ *     Derived from Motorola GSG China I2C example driver
+ *
+ *     Copyright (C) 2005 Torsten Koschorrek <koschorrek at synertronixx.de
+ *     Copyright (C) 2005 Matthias Blaschke <blaschke at synertronixx.de
+ *     Copyright (C) 2007 RightHand Technologies, Inc.
+ *     Copyright (C) 2008 Darius Augulis <darius.augulis at teltonika.lt>
+ *
+ */
+
+/** Includes *******************************************************************
+*******************************************************************************/
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/io.h>
+#include <linux/sched.h>
+#include <linux/platform_device.h>
+#include <linux/clk.h>
+
+#include <mach/irqs.h>
+#include <mach/hardware.h>
+#include <mach/i2c.h>
+
+/** Defines ********************************************************************
+*******************************************************************************/
+
+/* This will be the driver name the kernel reports */
+#define DRIVER_NAME "imx-i2c"
+
+/* Default value */
+#define IMX_I2C_BIT_RATE       100000  /* 100kHz */
+
+/* IMX I2C registers */
+#define IMX_I2C_IADR   0x00    /* i2c slave address */
+#define IMX_I2C_IFDR   0x04    /* i2c frequency divider */
+#define IMX_I2C_I2CR   0x08    /* i2c control */
+#define IMX_I2C_I2SR   0x0C    /* i2c status */
+#define IMX_I2C_I2DR   0x10    /* i2c transfer data */
+
+/* Bits of IMX I2C registers */
+#define I2SR_RXAK      0x01
+#define I2SR_IIF       0x02
+#define I2SR_SRW       0x04
+#define I2SR_IAL       0x10
+#define I2SR_IBB       0x20
+#define I2SR_IAAS      0x40
+#define I2SR_ICF       0x80
+#define I2CR_RSTA      0x04
+#define I2CR_TXAK      0x08
+#define I2CR_MTX       0x10
+#define I2CR_MSTA      0x20
+#define I2CR_IIEN      0x40
+#define I2CR_IEN       0x80
+
+/** Variables ******************************************************************
+*******************************************************************************/
+
+/*
+ * sorted list of clock divider, register value pairs
+ * taken from table 26-5, p.26-9, Freescale i.MX
+ * Integrated Portable System Processor Reference Manual
+ * Document Number: MC9328MXLRM, Rev. 5.1, 06/2007
+ *
+ * Duplicated divider values removed from list
+ */
+
+static u16 __initdata i2c_clk_div[50][2] = {
+       { 22,   0x20 }, { 24,   0x21 }, { 26,   0x22 }, { 28,   0x23 },
+       { 30,   0x00 }, { 32,   0x24 }, { 36,   0x25 }, { 40,   0x26 },
+       { 42,   0x03 }, { 44,   0x27 }, { 48,   0x28 }, { 52,   0x05 },
+       { 56,   0x29 }, { 60,   0x06 }, { 64,   0x2A }, { 72,   0x2B },
+       { 80,   0x2C }, { 88,   0x09 }, { 96,   0x2D }, { 104,  0x0A },
+       { 112,  0x2E }, { 128,  0x2F }, { 144,  0x0C }, { 160,  0x30 },
+       { 192,  0x31 }, { 224,  0x32 }, { 240,  0x0F }, { 256,  0x33 },
+       { 288,  0x10 }, { 320,  0x34 }, { 384,  0x35 }, { 448,  0x36 },
+       { 480,  0x13 }, { 512,  0x37 }, { 576,  0x14 }, { 640,  0x38 },
+       { 768,  0x39 }, { 896,  0x3A }, { 960,  0x17 }, { 1024, 0x3B },
+       { 1152, 0x18 }, { 1280, 0x3C }, { 1536, 0x3D }, { 1792, 0x3E },
+       { 1920, 0x1B }, { 2048, 0x3F }, { 2304, 0x1C }, { 2560, 0x1D },
+       { 3072, 0x1E }, { 3840, 0x1F }
+};
+
+struct imx_i2c_struct {
+       struct i2c_adapter      adapter;
+       struct resource         *res;
+       struct clk              *clk;
+       void __iomem            *base;
+       int                     irq;
+       wait_queue_head_t       queue;
+       unsigned long           i2csr;
+       unsigned int            disable_delay;
+};
+
+/** Functions for IMX I2C adapter driver ***************************************
+*******************************************************************************/
+
+static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx)
+{
+       unsigned long orig_jiffies = jiffies;
+
+       dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__);
+
+       /* wait for bus not busy */
+       while (readb(i2c_imx->base + IMX_I2C_I2SR) & I2SR_IBB) {
+               if (signal_pending(current)) {
+                       dev_dbg(&i2c_imx->adapter.dev,
+                               "<%s> I2C Interrupted\n", __func__);
+                       return -EINTR;
+               }
+               if (time_after(jiffies, orig_jiffies + HZ / 1000)) {
+                       dev_dbg(&i2c_imx->adapter.dev,
+                               "<%s> I2C bus is busy\n", __func__);
+                       return -EIO;
+               }
+               schedule();
+       }
+
+       return 0;
+}
+
+static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx)
+{
+       int result;
+
+       result = wait_event_interruptible_timeout(i2c_imx->queue,
+               i2c_imx->i2csr & I2SR_IIF, HZ / 10);
+
+       if (unlikely(result < 0)) {
+               dev_dbg(&i2c_imx->adapter.dev, "<%s> result < 0\n", __func__);
+               return result;
+       } else if (unlikely(!(i2c_imx->i2csr & I2SR_IIF))) {
+               dev_dbg(&i2c_imx->adapter.dev, "<%s> Timeout\n", __func__);
+               return -ETIMEDOUT;
+       }
+       dev_dbg(&i2c_imx->adapter.dev, "<%s> TRX complete\n", __func__);
+       i2c_imx->i2csr = 0;
+       return 0;
+}
+
+static int i2c_imx_acked(struct imx_i2c_struct *i2c_imx)
+{
+       if (readb(i2c_imx->base + IMX_I2C_I2SR) & I2SR_RXAK) {
+               dev_dbg(&i2c_imx->adapter.dev, "<%s> No ACK\n", __func__);
+               return -EIO;  /* No ACK */
+       }
+
+       dev_dbg(&i2c_imx->adapter.dev, "<%s> ACK received\n", __func__);
+       return 0;
+}
+
+static void i2c_imx_start(struct imx_i2c_struct *i2c_imx)
+{
+       unsigned int temp = 0;
+
+       dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__);
+
+       /* Enable I2C controller */
+       writeb(I2CR_IEN, i2c_imx->base + IMX_I2C_I2CR);
+       /* Start I2C transaction */
+       temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+       temp |= I2CR_MSTA;
+       writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+       temp |= I2CR_IIEN | I2CR_MTX | I2CR_TXAK;
+       writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+}
+
+static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx)
+{
+       unsigned int temp = 0;
+
+       /* Stop I2C transaction */
+       dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__);
+       temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+       temp &= ~I2CR_MSTA;
+       writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+       /* setup chip registers to defaults */
+       writeb(I2CR_IEN, i2c_imx->base + IMX_I2C_I2CR);
+       writeb(0, i2c_imx->base + IMX_I2C_I2SR);
+       /*
+        * This delay caused by an i.MXL hardware bug.
+        * If no (or too short) delay, no "STOP" bit will be generated.
+        */
+       udelay(i2c_imx->disable_delay);
+       /* Disable I2C controller */
+       writeb(0, i2c_imx->base + IMX_I2C_I2CR);
+}
+
+static void __init i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,
+                                                       unsigned int rate)
+{
+       unsigned int i2c_clk_rate;
+       unsigned int div;
+       int i;
+
+       /* Divider value calculation */
+       i2c_clk_rate = clk_get_rate(i2c_imx->clk);
+       div = (i2c_clk_rate + rate - 1) / rate;
+       if (div < i2c_clk_div[0][0])
+               i = 0;
+       else if (div > i2c_clk_div[ARRAY_SIZE(i2c_clk_div) - 1][0])
+               i = ARRAY_SIZE(i2c_clk_div) - 1;
+       else
+               for (i = 0; i2c_clk_div[i][0] < div; i++);
+
+       /* Write divider value to register */
+       writeb(i2c_clk_div[i][1], i2c_imx->base + IMX_I2C_IFDR);
+
+       /*
+        * There dummy delay is calculated.
+        * It should be about one I2C clock period long.
+        * This delay is used in I2C bus disable function
+        * to fix chip hardware bug.
+        */
+       i2c_imx->disable_delay = (500000U * i2c_clk_div[i][0]
+               + (i2c_clk_rate / 2) - 1) / (i2c_clk_rate / 2);
+
+       /* dev_dbg() can't be used, because adapter is not yet registered */
+#ifdef CONFIG_I2C_DEBUG_BUS
+       printk(KERN_DEBUG "I2C: <%s> I2C_CLK=%d, REQ DIV=%d\n",
+               __func__, i2c_clk_rate, div);
+       printk(KERN_DEBUG "I2C: <%s> IFDR[IC]=0x%x, REAL DIV=%d\n",
+               __func__, i2c_clk_div[i][1], i2c_clk_div[i][0]);
+#endif
+}
+
+static irqreturn_t i2c_imx_isr(int irq, void *dev_id)
+{
+       struct imx_i2c_struct *i2c_imx = dev_id;
+       unsigned int temp;
+
+       temp = readb(i2c_imx->base + IMX_I2C_I2SR);
+       if (temp & I2SR_IIF) {
+               /* save status register */
+               i2c_imx->i2csr = temp;
+               temp &= ~I2SR_IIF;
+               writeb(temp, i2c_imx->base + IMX_I2C_I2SR);
+               wake_up_interruptible(&i2c_imx->queue);
+               return IRQ_HANDLED;
+       }
+
+       return IRQ_NONE;
+}
+
+static int i2c_imx_write(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs)
+{
+       int i, result;
+
+       dev_dbg(&i2c_imx->adapter.dev, "<%s> write slave address: addr=0x%x\n",
+               __func__, msgs->addr << 1);
+
+       /* write slave address */
+       writeb(msgs->addr << 1, i2c_imx->base + IMX_I2C_I2DR);
+       result = i2c_imx_trx_complete(i2c_imx);
+       if (result)
+               return result;
+       result = i2c_imx_acked(i2c_imx);
+       if (result)
+               return result;
+       dev_dbg(&i2c_imx->adapter.dev, "<%s> write data\n", __func__);
+
+       /* write data */
+       for (i = 0; i < msgs->len; i++) {
+               dev_dbg(&i2c_imx->adapter.dev,
+                       "<%s> write byte: B%d=0x%X\n",
+                       __func__, i, msgs->buf[i]);
+               writeb(msgs->buf[i], i2c_imx->base + IMX_I2C_I2DR);
+               result = i2c_imx_trx_complete(i2c_imx);
+               if (result)
+                       return result;
+               result = i2c_imx_acked(i2c_imx);
+               if (result)
+                       return result;
+       }
+       return 0;
+}
+
+static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs)
+{
+       int i, result;
+       unsigned int temp;
+
+       dev_dbg(&i2c_imx->adapter.dev,
+               "<%s> write slave address: addr=0x%x\n",
+               __func__, (msgs->addr << 1) | 0x01);
+
+       /* write slave address */
+       writeb((msgs->addr << 1) | 0x01, i2c_imx->base + IMX_I2C_I2DR);
+       result = i2c_imx_trx_complete(i2c_imx);
+       if (result)
+               return result;
+       result = i2c_imx_acked(i2c_imx);
+       if (result)
+               return result;
+
+       dev_dbg(&i2c_imx->adapter.dev, "<%s> setup bus\n", __func__);
+
+       /* setup bus to read data */
+       temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+       temp &= ~I2CR_MTX;
+       if (msgs->len - 1)
+               temp &= ~I2CR_TXAK;
+       writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+       readb(i2c_imx->base + IMX_I2C_I2DR); /* dummy read */
+
+       dev_dbg(&i2c_imx->adapter.dev, "<%s> read data\n", __func__);
+
+       /* read data */
+       for (i = 0; i < msgs->len; i++) {
+               result = i2c_imx_trx_complete(i2c_imx);
+               if (result)
+                       return result;
+               if (i == (msgs->len - 1)) {
+                       dev_dbg(&i2c_imx->adapter.dev,
+                               "<%s> clear MSTA\n", __func__);
+                       temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+                       temp &= ~I2CR_MSTA;
+                       writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+               } else if (i == (msgs->len - 2)) {
+                       dev_dbg(&i2c_imx->adapter.dev,
+                               "<%s> set TXAK\n", __func__);
+                       temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+                       temp |= I2CR_TXAK;
+                       writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+               }
+               msgs->buf[i] = readb(i2c_imx->base + IMX_I2C_I2DR);
+               dev_dbg(&i2c_imx->adapter.dev,
+                       "<%s> read byte: B%d=0x%X\n",
+                       __func__, i, msgs->buf[i]);
+       }
+       return 0;
+}
+
+static int i2c_imx_xfer(struct i2c_adapter *adapter,
+                                               struct i2c_msg *msgs, int num)
+{
+       unsigned int i, temp;
+       int result;
+       struct imx_i2c_struct *i2c_imx = i2c_get_adapdata(adapter);
+
+       dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__);
+
+       /* Check if i2c bus is not busy */
+       result = i2c_imx_bus_busy(i2c_imx);
+       if (result)
+               goto fail0;
+
+       /* Start I2C transfer */
+       i2c_imx_start(i2c_imx);
+
+       /* read/write data */
+       for (i = 0; i < num; i++) {
+               if (i) {
+                       dev_dbg(&i2c_imx->adapter.dev,
+                               "<%s> repeated start\n", __func__);
+                       temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+                       temp |= I2CR_RSTA;
+                       writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+               }
+               dev_dbg(&i2c_imx->adapter.dev,
+                       "<%s> transfer message: %d\n", __func__, i);
+               /* write/read data */
+#ifdef CONFIG_I2C_DEBUG_BUS
+               temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+               dev_dbg(&i2c_imx->adapter.dev, "<%s> CONTROL: IEN=%d, IIEN=%d, "
+                       "MSTA=%d, MTX=%d, TXAK=%d, RSTA=%d\n", __func__,
+                       (temp & I2CR_IEN ? 1 : 0), (temp & I2CR_IIEN ? 1 : 0),
+                       (temp & I2CR_MSTA ? 1 : 0), (temp & I2CR_MTX ? 1 : 0),
+                       (temp & I2CR_TXAK ? 1 : 0), (temp & I2CR_RSTA ? 1 : 0));
+               temp = readb(i2c_imx->base + IMX_I2C_I2SR);
+               dev_dbg(&i2c_imx->adapter.dev,
+                       "<%s> STATUS: ICF=%d, IAAS=%d, IBB=%d, "
+                       "IAL=%d, SRW=%d, IIF=%d, RXAK=%d\n", __func__,
+                       (temp & I2SR_ICF ? 1 : 0), (temp & I2SR_IAAS ? 1 : 0),
+                       (temp & I2SR_IBB ? 1 : 0), (temp & I2SR_IAL ? 1 : 0),
+                       (temp & I2SR_SRW ? 1 : 0), (temp & I2SR_IIF ? 1 : 0),
+                       (temp & I2SR_RXAK ? 1 : 0));
+#endif
+               if (msgs[i].flags & I2C_M_RD)
+                       result = i2c_imx_read(i2c_imx, &msgs[i]);
+               else
+                       result = i2c_imx_write(i2c_imx, &msgs[i]);
+       }
+
+fail0:
+       /* Stop I2C transfer */
+       i2c_imx_stop(i2c_imx);
+
+       dev_dbg(&i2c_imx->adapter.dev, "<%s> exit with: %s: %d\n", __func__,
+               (result < 0) ? "error" : "success msg",
+                       (result < 0) ? result : num);
+       return (result < 0) ? result : num;
+}
+
+static u32 i2c_imx_func(struct i2c_adapter *adapter)
+{
+       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
+}
+
+static struct i2c_algorithm i2c_imx_algo = {
+       .master_xfer    = i2c_imx_xfer,
+       .functionality  = i2c_imx_func,
+};
+
+static int __init i2c_imx_probe(struct platform_device *pdev)
+{
+       struct imx_i2c_struct *i2c_imx;
+       struct resource *res;
+       struct imxi2c_platform_data *pdata;
+       void __iomem *base;
+       resource_size_t res_size;
+       int irq;
+       int ret;
+
+       dev_dbg(&pdev->dev, "<%s>\n", __func__);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "can't get device resources\n");
+               return -ENOENT;
+       }
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               dev_err(&pdev->dev, "can't get irq number\n");
+               return -ENOENT;
+       }
+
+       pdata = pdev->dev.platform_data;
+
+       if (pdata && pdata->init) {
+               ret = pdata->init(&pdev->dev);
+               if (ret)
+                       return ret;
+       }
+
+       res_size = resource_size(res);
+       base = ioremap(res->start, res_size);
+       if (!base) {
+               dev_err(&pdev->dev, "ioremap failed\n");
+               ret = -EIO;
+               goto fail0;
+       }
+
+       i2c_imx = kzalloc(sizeof(struct imx_i2c_struct), GFP_KERNEL);
+       if (!i2c_imx) {
+               dev_err(&pdev->dev, "can't allocate interface\n");
+               ret = -ENOMEM;
+               goto fail1;
+       }
+
+       if (!request_mem_region(res->start, res_size, DRIVER_NAME)) {
+               ret = -EBUSY;
+               goto fail2;
+       }
+
+       /* Setup i2c_imx driver structure */
+       strcpy(i2c_imx->adapter.name, pdev->name);
+       i2c_imx->adapter.owner          = THIS_MODULE;
+       i2c_imx->adapter.algo           = &i2c_imx_algo;
+       i2c_imx->adapter.dev.parent     = &pdev->dev;
+       i2c_imx->adapter.nr             = pdev->id;
+       i2c_imx->irq                    = irq;
+       i2c_imx->base                   = base;
+       i2c_imx->res                    = res;
+
+       /* Get I2C clock */
+       i2c_imx->clk = clk_get(&pdev->dev, "i2c_clk");
+       if (IS_ERR(i2c_imx->clk)) {
+               ret = PTR_ERR(i2c_imx->clk);
+               dev_err(&pdev->dev, "can't get I2C clock\n");
+               goto fail3;
+       }
+       clk_enable(i2c_imx->clk);
+
+       /* Request IRQ */
+       ret = request_irq(i2c_imx->irq, i2c_imx_isr, 0, pdev->name, i2c_imx);
+       if (ret) {
+               dev_err(&pdev->dev, "can't claim irq %d\n", i2c_imx->irq);
+               goto fail4;
+       }
+
+       /* Init queue */
+       init_waitqueue_head(&i2c_imx->queue);
+
+       /* Set up adapter data */
+       i2c_set_adapdata(&i2c_imx->adapter, i2c_imx);
+
+       /* Set up clock divider */
+       if (pdata && pdata->bitrate)
+               i2c_imx_set_clk(i2c_imx, pdata->bitrate);
+       else
+               i2c_imx_set_clk(i2c_imx, IMX_I2C_BIT_RATE);
+
+       /* Set up chip registers to defaults */
+       writeb(0, i2c_imx->base + IMX_I2C_I2CR);
+       writeb(0, i2c_imx->base + IMX_I2C_I2SR);
+
+       /* Add I2C adapter */
+       ret = i2c_add_numbered_adapter(&i2c_imx->adapter);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "registration failed\n");
+               goto fail5;
+       }
+
+       /* Set up platform driver data */
+       platform_set_drvdata(pdev, i2c_imx);
+
+       dev_dbg(&i2c_imx->adapter.dev, "claimed irq %d\n", i2c_imx->irq);
+       dev_dbg(&i2c_imx->adapter.dev, "device resources from 0x%x to 0x%x\n",
+               i2c_imx->res->start, i2c_imx->res->end);
+       dev_dbg(&i2c_imx->adapter.dev, "allocated %d bytes at 0x%x \n",
+               res_size, i2c_imx->res->start);
+       dev_dbg(&i2c_imx->adapter.dev, "adapter name: \"%s\"\n",
+               i2c_imx->adapter.name);
+       dev_dbg(&i2c_imx->adapter.dev, "IMX I2C adapter registered\n");
+
+       return 0;   /* Return OK */
+
+fail5:
+       free_irq(i2c_imx->irq, i2c_imx);
+fail4:
+       clk_disable(i2c_imx->clk);
+       clk_put(i2c_imx->clk);
+fail3:
+       release_mem_region(i2c_imx->res->start, resource_size(res));
+fail2:
+       kfree(i2c_imx);
+fail1:
+       iounmap(base);
+fail0:
+       if (pdata && pdata->exit)
+               pdata->exit(&pdev->dev);
+       return ret; /* Return error number */
+}
+
+static int __exit i2c_imx_remove(struct platform_device *pdev)
+{
+       struct imx_i2c_struct *i2c_imx = platform_get_drvdata(pdev);
+       struct imxi2c_platform_data *pdata = pdev->dev.platform_data;
+
+       /* remove adapter */
+       dev_dbg(&i2c_imx->adapter.dev, "adapter removed\n");
+       i2c_del_adapter(&i2c_imx->adapter);
+       platform_set_drvdata(pdev, NULL);
+
+       /* free interrupt */
+       free_irq(i2c_imx->irq, i2c_imx);
+
+       /* setup chip registers to defaults */
+       writeb(0, i2c_imx->base + IMX_I2C_IADR);
+       writeb(0, i2c_imx->base + IMX_I2C_IFDR);
+       writeb(0, i2c_imx->base + IMX_I2C_I2CR);
+       writeb(0, i2c_imx->base + IMX_I2C_I2SR);
+
+       /* Shut down hardware */
+       if (pdata && pdata->exit)
+               pdata->exit(&pdev->dev);
+
+       /* Disable I2C clock */
+       clk_disable(i2c_imx->clk);
+       clk_put(i2c_imx->clk);
+
+       release_mem_region(i2c_imx->res->start, resource_size(i2c_imx->res));
+       iounmap(i2c_imx->base);
+       kfree(i2c_imx);
+       return 0;
+}
+
+static struct platform_driver i2c_imx_driver = {
+       .probe          = i2c_imx_probe,
+       .remove         = __exit_p(i2c_imx_remove),
+       .driver = {
+               .name   = DRIVER_NAME,
+               .owner  = THIS_MODULE,
+       }
+};
+
+static int __init i2c_adap_imx_init(void)
+{
+       return platform_driver_probe(&i2c_imx_driver, i2c_imx_probe);
+}
+
+static void __exit i2c_adap_imx_exit(void)
+{
+       platform_driver_unregister(&i2c_imx_driver);
+}
+
+module_init(i2c_adap_imx_init);
+module_exit(i2c_adap_imx_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Darius Augulis");
+MODULE_DESCRIPTION("I2C adapter driver for IMX I2C bus");
+MODULE_ALIAS("platform:" DRIVER_NAME);
index 26bf3701058648ad338847631122101eb37c691f..4af5c09f0e8fe3def51810746652f6d70da52717 100644 (file)
 #include <linux/of_platform.h>
 #include <linux/of_i2c.h>
 
-#include <asm/io.h>
+#include <linux/io.h>
 #include <linux/fsl_devices.h>
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 
+#include <asm/mpc52xx.h>
+#include <sysdev/fsl_soc.h>
+
 #define DRV_NAME "mpc-i2c"
 
-#define MPC_I2C_FDR    0x04
-#define MPC_I2C_CR     0x08
-#define MPC_I2C_SR     0x0c
-#define MPC_I2C_DR     0x10
+#define MPC_I2C_FDR   0x04
+#define MPC_I2C_CR    0x08
+#define MPC_I2C_SR    0x0c
+#define MPC_I2C_DR    0x10
 #define MPC_I2C_DFSRR 0x14
 
 #define CCR_MEN  0x80
 #define CSR_RXAK 0x01
 
 struct mpc_i2c {
+       struct device *dev;
        void __iomem *base;
        u32 interrupt;
        wait_queue_head_t queue;
        struct i2c_adapter adap;
        int irq;
-       u32 flags;
 };
 
-static __inline__ void writeccr(struct mpc_i2c *i2c, u32 x)
+struct mpc_i2c_divider {
+       u16 divider;
+       u16 fdr;        /* including dfsrr */
+};
+
+struct mpc_i2c_match_data {
+       void (*setclock)(struct device_node *node,
+                        struct mpc_i2c *i2c,
+                        u32 clock, u32 prescaler);
+       u32 prescaler;
+};
+
+static inline void writeccr(struct mpc_i2c *i2c, u32 x)
 {
        writeb(x, i2c->base + MPC_I2C_CR);
 }
@@ -100,12 +115,11 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
        u32 x;
        int result = 0;
 
-       if (i2c->irq == NO_IRQ)
-       {
+       if (i2c->irq == NO_IRQ) {
                while (!(readb(i2c->base + MPC_I2C_SR) & CSR_MIF)) {
                        schedule();
                        if (time_after(jiffies, orig_jiffies + timeout)) {
-                               pr_debug("I2C: timeout\n");
+                               dev_dbg(i2c->dev, "timeout\n");
                                writeccr(i2c, 0);
                                result = -EIO;
                                break;
@@ -119,7 +133,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
                        (i2c->interrupt & CSR_MIF), timeout);
 
                if (unlikely(!(i2c->interrupt & CSR_MIF))) {
-                       pr_debug("I2C: wait timeout\n");
+                       dev_dbg(i2c->dev, "wait timeout\n");
                        writeccr(i2c, 0);
                        result = -ETIMEDOUT;
                }
@@ -132,17 +146,17 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
                return result;
 
        if (!(x & CSR_MCF)) {
-               pr_debug("I2C: unfinished\n");
+               dev_dbg(i2c->dev, "unfinished\n");
                return -EIO;
        }
 
        if (x & CSR_MAL) {
-               pr_debug("I2C: MAL\n");
+               dev_dbg(i2c->dev, "MAL\n");
                return -EIO;
        }
 
        if (writing && (x & CSR_RXAK)) {
-               pr_debug("I2C: No RXAK\n");
+               dev_dbg(i2c->dev, "No RXAK\n");
                /* generate stop */
                writeccr(i2c, CCR_MEN);
                return -EIO;
@@ -150,18 +164,181 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
        return 0;
 }
 
-static void mpc_i2c_setclock(struct mpc_i2c *i2c)
+#ifdef CONFIG_PPC_52xx
+static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = {
+       {20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23},
+       {28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02},
+       {36, 0x26}, {40, 0x27}, {44, 0x04}, {48, 0x28},
+       {52, 0x63}, {56, 0x29}, {60, 0x41}, {64, 0x2a},
+       {68, 0x07}, {72, 0x2b}, {80, 0x2c}, {88, 0x09},
+       {96, 0x2d}, {104, 0x0a}, {112, 0x2e}, {120, 0x81},
+       {128, 0x2f}, {136, 0x47}, {144, 0x0c}, {160, 0x30},
+       {176, 0x49}, {192, 0x31}, {208, 0x4a}, {224, 0x32},
+       {240, 0x0f}, {256, 0x33}, {272, 0x87}, {288, 0x10},
+       {320, 0x34}, {352, 0x89}, {384, 0x35}, {416, 0x8a},
+       {448, 0x36}, {480, 0x13}, {512, 0x37}, {576, 0x14},
+       {640, 0x38}, {768, 0x39}, {896, 0x3a}, {960, 0x17},
+       {1024, 0x3b}, {1152, 0x18}, {1280, 0x3c}, {1536, 0x3d},
+       {1792, 0x3e}, {1920, 0x1b}, {2048, 0x3f}, {2304, 0x1c},
+       {2560, 0x1d}, {3072, 0x1e}, {3584, 0x7e}, {3840, 0x1f},
+       {4096, 0x7f}, {4608, 0x5c}, {5120, 0x5d}, {6144, 0x5e},
+       {7168, 0xbe}, {7680, 0x5f}, {8192, 0xbf}, {9216, 0x9c},
+       {10240, 0x9d}, {12288, 0x9e}, {15360, 0x9f}
+};
+
+int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, int prescaler)
+{
+       const struct mpc52xx_i2c_divider *div = NULL;
+       unsigned int pvr = mfspr(SPRN_PVR);
+       u32 divider;
+       int i;
+
+       if (!clock)
+               return -EINVAL;
+
+       /* Determine divider value */
+       divider = mpc52xx_find_ipb_freq(node) / clock;
+
+       /*
+        * We want to choose an FDR/DFSR that generates an I2C bus speed that
+        * is equal to or lower than the requested speed.
+        */
+       for (i = 0; i < ARRAY_SIZE(mpc52xx_i2c_dividers); i++) {
+               div = &mpc_i2c_dividers_52xx[i];
+               /* Old MPC5200 rev A CPUs do not support the high bits */
+               if (div->fdr & 0xc0 && pvr == 0x80822011)
+                       continue;
+               if (div->divider >= divider)
+                       break;
+       }
+
+       return div ? (int)div->fdr : -EINVAL;
+}
+
+static void mpc_i2c_setclock_52xx(struct device_node *node,
+                                 struct mpc_i2c *i2c,
+                                 u32 clock, u32 prescaler)
 {
-       /* Set clock and filters */
-       if (i2c->flags & FSL_I2C_DEV_SEPARATE_DFSRR) {
-               writeb(0x31, i2c->base + MPC_I2C_FDR);
-               writeb(0x10, i2c->base + MPC_I2C_DFSRR);
-       } else if (i2c->flags & FSL_I2C_DEV_CLOCK_5200)
-               writeb(0x3f, i2c->base + MPC_I2C_FDR);
-       else
-               writel(0x1031, i2c->base + MPC_I2C_FDR);
+       int fdr = mpc52xx_i2c_get_fdr(node, clock, prescaler);
+
+       if (fdr < 0)
+               fdr = 0x3f; /* backward compatibility */
+       writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR);
+       dev_info(i2c->dev, "clock %d Hz (fdr=%d)\n", clock, fdr);
+}
+#else /* !CONFIG_PPC_52xx */
+static void mpc_i2c_setclock_52xx(struct device_node *node,
+                                 struct mpc_i2c *i2c,
+                                 u32 clock, u32 prescaler)
+{
+}
+#endif /* CONFIG_PPC_52xx*/
+
+#ifdef CONFIG_FSL_SOC
+static const struct mpc_i2c_divider mpc_i2c_dividers_8xxx[] = {
+       {160, 0x0120}, {192, 0x0121}, {224, 0x0122}, {256, 0x0123},
+       {288, 0x0100}, {320, 0x0101}, {352, 0x0601}, {384, 0x0102},
+       {416, 0x0602}, {448, 0x0126}, {480, 0x0103}, {512, 0x0127},
+       {544, 0x0b03}, {576, 0x0104}, {608, 0x1603}, {640, 0x0105},
+       {672, 0x2003}, {704, 0x0b05}, {736, 0x2b03}, {768, 0x0106},
+       {800, 0x3603}, {832, 0x0b06}, {896, 0x012a}, {960, 0x0107},
+       {1024, 0x012b}, {1088, 0x1607}, {1152, 0x0108}, {1216, 0x2b07},
+       {1280, 0x0109}, {1408, 0x1609}, {1536, 0x010a}, {1664, 0x160a},
+       {1792, 0x012e}, {1920, 0x010b}, {2048, 0x012f}, {2176, 0x2b0b},
+       {2304, 0x010c}, {2560, 0x010d}, {2816, 0x2b0d}, {3072, 0x010e},
+       {3328, 0x2b0e}, {3584, 0x0132}, {3840, 0x010f}, {4096, 0x0133},
+       {4608, 0x0110}, {5120, 0x0111}, {6144, 0x0112}, {7168, 0x0136},
+       {7680, 0x0113}, {8192, 0x0137}, {9216, 0x0114}, {10240, 0x0115},
+       {12288, 0x0116}, {14336, 0x013a}, {15360, 0x0117}, {16384, 0x013b},
+       {18432, 0x0118}, {20480, 0x0119}, {24576, 0x011a}, {28672, 0x013e},
+       {30720, 0x011b}, {32768, 0x013f}, {36864, 0x011c}, {40960, 0x011d},
+       {49152, 0x011e}, {61440, 0x011f}
+};
+
+u32 mpc_i2c_get_sec_cfg_8xxx(void)
+{
+       struct device_node *node = NULL;
+       u32 __iomem *reg;
+       u32 val = 0;
+
+       node = of_find_node_by_name(NULL, "global-utilities");
+       if (node) {
+               const u32 *prop = of_get_property(node, "reg", NULL);
+               if (prop) {
+                       /*
+                        * Map and check POR Device Status Register 2
+                        * (PORDEVSR2) at 0xE0014
+                        */
+                       reg = ioremap(get_immrbase() + *prop + 0x14, 0x4);
+                       if (!reg)
+                               printk(KERN_ERR
+                                      "Error: couldn't map PORDEVSR2\n");
+                       else
+                               val = in_be32(reg) & 0x00000080; /* sec-cfg */
+                       iounmap(reg);
+               }
+       }
+       if (node)
+               of_node_put(node);
+
+       return val;
 }
 
+int mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock, u32 prescaler)
+{
+       const struct mpc_i2c_divider *div = NULL;
+       u32 divider;
+       int i;
+
+       if (!clock)
+               return -EINVAL;
+
+       /* Determine proper divider value */
+       if (of_device_is_compatible(node, "fsl,mpc8544-i2c"))
+               prescaler = mpc_i2c_get_sec_cfg_8xxx() ? 3 : 2;
+       if (!prescaler)
+               prescaler = 1;
+
+       divider = fsl_get_sys_freq() / clock / prescaler;
+
+       pr_debug("I2C: src_clock=%d clock=%d divider=%d\n",
+                fsl_get_sys_freq(), clock, divider);
+
+       /*
+        * We want to choose an FDR/DFSR that generates an I2C bus speed that
+        * is equal to or lower than the requested speed.
+        */
+       for (i = 0; i < ARRAY_SIZE(mpc_i2c_dividers_8xxx); i++) {
+               div = &mpc_i2c_dividers_8xxx[i];
+               if (div->divider >= divider)
+                       break;
+       }
+
+       return div ? (int)div->fdr : -EINVAL;
+}
+
+static void mpc_i2c_setclock_8xxx(struct device_node *node,
+                                 struct mpc_i2c *i2c,
+                                 u32 clock, u32 prescaler)
+{
+       int fdr = mpc_i2c_get_fdr_8xxx(node, clock, prescaler);
+
+       if (fdr < 0)
+               fdr = 0x1031; /* backward compatibility */
+       writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR);
+       writeb((fdr >> 8) & 0xff, i2c->base + MPC_I2C_DFSRR);
+       dev_info(i2c->dev, "clock %d Hz (dfsrr=%d fdr=%d)\n",
+                clock, fdr >> 8, fdr & 0xff);
+}
+
+#else /* !CONFIG_FSL_SOC */
+static void mpc_i2c_setclock_8xxx(struct device_node *node,
+                                 struct mpc_i2c *i2c,
+                                 u32 clock, u32 prescaler)
+{
+}
+#endif /* CONFIG_FSL_SOC */
+
 static void mpc_i2c_start(struct mpc_i2c *i2c)
 {
        /* Clear arbitration */
@@ -176,7 +353,7 @@ static void mpc_i2c_stop(struct mpc_i2c *i2c)
 }
 
 static int mpc_write(struct mpc_i2c *i2c, int target,
-                    const u8 * data, int length, int restart)
+                    const u8 *data, int length, int restart)
 {
        int i, result;
        unsigned timeout = i2c->adap.timeout;
@@ -207,7 +384,7 @@ static int mpc_write(struct mpc_i2c *i2c, int target,
 }
 
 static int mpc_read(struct mpc_i2c *i2c, int target,
-                   u8 * data, int length, int restart)
+                   u8 *data, int length, int restart)
 {
        unsigned timeout = i2c->adap.timeout;
        int i, result;
@@ -264,12 +441,12 @@ static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
        /* Allow bus up to 1s to become not busy */
        while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) {
                if (signal_pending(current)) {
-                       pr_debug("I2C: Interrupted\n");
+                       dev_dbg(i2c->dev, "Interrupted\n");
                        writeccr(i2c, 0);
                        return -EINTR;
                }
                if (time_after(jiffies, orig_jiffies + HZ)) {
-                       pr_debug("I2C: timeout\n");
+                       dev_dbg(i2c->dev, "timeout\n");
                        if (readb(i2c->base + MPC_I2C_SR) ==
                            (CSR_MCF | CSR_MBB | CSR_RXAK))
                                mpc_i2c_fixup(i2c);
@@ -280,9 +457,10 @@ static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
 
        for (i = 0; ret >= 0 && i < num; i++) {
                pmsg = &msgs[i];
-               pr_debug("Doing %s %d bytes to 0x%02x - %d of %d messages\n",
-                        pmsg->flags & I2C_M_RD ? "read" : "write",
-                        pmsg->len, pmsg->addr, i + 1, num);
+               dev_dbg(i2c->dev,
+                       "Doing %s %d bytes to 0x%02x - %d of %d messages\n",
+                       pmsg->flags & I2C_M_RD ? "read" : "write",
+                       pmsg->len, pmsg->addr, i + 1, num);
                if (pmsg->flags & I2C_M_RD)
                        ret =
                            mpc_read(i2c, pmsg->addr, pmsg->buf, pmsg->len, i);
@@ -311,27 +489,26 @@ static struct i2c_adapter mpc_ops = {
        .timeout = HZ,
 };
 
-static int __devinit fsl_i2c_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit fsl_i2c_probe(struct of_device *op,
+                                  const struct of_device_id *match)
 {
-       int result = 0;
        struct mpc_i2c *i2c;
+       const u32 *prop;
+       u32 clock = 0;
+       int result = 0;
+       int plen;
 
        i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);
        if (!i2c)
                return -ENOMEM;
 
-       if (of_get_property(op->node, "dfsrr", NULL))
-               i2c->flags |= FSL_I2C_DEV_SEPARATE_DFSRR;
-
-       if (of_device_is_compatible(op->node, "fsl,mpc5200-i2c") ||
-                       of_device_is_compatible(op->node, "mpc5200-i2c"))
-               i2c->flags |= FSL_I2C_DEV_CLOCK_5200;
+       i2c->dev = &op->dev; /* for debug and error output */
 
        init_waitqueue_head(&i2c->queue);
 
        i2c->base = of_iomap(op->node, 0);
        if (!i2c->base) {
-               printk(KERN_ERR "i2c-mpc - failed to map controller\n");
+               dev_err(i2c->dev, "failed to map controller\n");
                result = -ENOMEM;
                goto fail_map;
        }
@@ -341,12 +518,27 @@ static int __devinit fsl_i2c_probe(struct of_device *op, const struct of_device_
                result = request_irq(i2c->irq, mpc_i2c_isr,
                                     IRQF_SHARED, "i2c-mpc", i2c);
                if (result < 0) {
-                       printk(KERN_ERR "i2c-mpc - failed to attach interrupt\n");
+                       dev_err(i2c->dev, "failed to attach interrupt\n");
                        goto fail_request;
                }
        }
-       
-       mpc_i2c_setclock(i2c);
+
+       if (!of_get_property(op->node, "fsl,preserve-clocking", NULL)) {
+               prop = of_get_property(op->node, "clock-frequency", &plen);
+               if (prop && plen == sizeof(u32))
+                       clock = *prop;
+
+               if (match->data) {
+                       struct mpc_i2c_match_data *data =
+                               (struct mpc_i2c_match_data *)match->data;
+                       data->setclock(op->node, i2c, clock, data->prescaler);
+               } else {
+                       /* Backwards compatibility */
+                       if (of_get_property(op->node, "dfsrr", NULL))
+                               mpc_i2c_setclock_8xxx(op->node, i2c,
+                                                     clock, 0);
+               }
+       }
 
        dev_set_drvdata(&op->dev, i2c);
 
@@ -356,7 +548,7 @@ static int __devinit fsl_i2c_probe(struct of_device *op, const struct of_device_
 
        result = i2c_add_adapter(&i2c->adap);
        if (result < 0) {
-               printk(KERN_ERR "i2c-mpc - failed to add adapter\n");
+               dev_err(i2c->dev, "failed to add adapter\n");
                goto fail_add;
        }
        of_register_i2c_devices(&i2c->adap, op->node);
@@ -368,7 +560,7 @@ static int __devinit fsl_i2c_probe(struct of_device *op, const struct of_device_
        free_irq(i2c->irq, i2c);
  fail_request:
        irq_dispose_mapping(i2c->irq);
-       iounmap(i2c->base);
+       iounmap(i2c->base);
  fail_map:
        kfree(i2c);
        return result;
@@ -391,9 +583,43 @@ static int __devexit fsl_i2c_remove(struct of_device *op)
 };
 
 static const struct of_device_id mpc_i2c_of_match[] = {
-       {.compatible = "fsl-i2c",},
+       {.compatible = "mpc5200-i2c",
+        .data = &(struct mpc_i2c_match_data) {
+                       .setclock = mpc_i2c_setclock_52xx,
+               },
+       },
+       {.compatible = "fsl,mpc5200b-i2c",
+        .data = &(struct mpc_i2c_match_data) {
+                       .setclock = mpc_i2c_setclock_52xx,
+               },
+       },
+       {.compatible = "fsl,mpc5200-i2c",
+        .data = &(struct mpc_i2c_match_data) {
+                       .setclock = mpc_i2c_setclock_52xx,
+               },
+       },
+       {.compatible = "fsl,mpc8313-i2c",
+        .data = &(struct mpc_i2c_match_data) {
+                       .setclock = mpc_i2c_setclock_8xxx,
+               },
+       },
+       {.compatible = "fsl,mpc8543-i2c",
+        .data = &(struct mpc_i2c_match_data) {
+                       .setclock = mpc_i2c_setclock_8xxx,
+                       .prescaler = 2,
+               },
+       },
+       {.compatible = "fsl,mpc8544-i2c",
+        .data = &(struct mpc_i2c_match_data) {
+                       .setclock = mpc_i2c_setclock_8xxx,
+                       .prescaler = 3,
+               },
+       /* Backward compatibility */
+       },
+       {.compatible = "fsl-i2c", },
        {},
 };
+
 MODULE_DEVICE_TABLE(of, mpc_i2c_of_match);
 
 
@@ -414,7 +640,7 @@ static int __init fsl_i2c_init(void)
 
        rv = of_register_platform_driver(&mpc_i2c_driver);
        if (rv)
-               printk(KERN_ERR DRV_NAME 
+               printk(KERN_ERR DRV_NAME
                       " of_register_platform_driver failed (%i)\n", rv);
        return rv;
 }
@@ -428,6 +654,6 @@ module_init(fsl_i2c_init);
 module_exit(fsl_i2c_exit);
 
 MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>");
-MODULE_DESCRIPTION
-    ("I2C-Bus adapter for MPC107 bridge and MPC824x/85xx/52xx processors");
+MODULE_DESCRIPTION("I2C-Bus adapter for MPC107 bridge and "
+                  "MPC824x/85xx/52xx processors");
 MODULE_LICENSE("GPL");
index 5b7f95641ba48119d17fe71c7fc02b8c3b16fd2d..1691ef0f1ee1ee64dcd9352cf785849b26592623 100644 (file)
@@ -1,6 +1,6 @@
 /* linux/drivers/i2c/busses/i2c-s3c2410.c
  *
- * Copyright (C) 2004,2005 Simtec Electronics
+ * Copyright (C) 2004,2005,2009 Simtec Electronics
  *     Ben Dooks <ben@simtec.co.uk>
  *
  * S3C2410 I2C Controller
@@ -590,18 +590,6 @@ static int s3c24xx_i2c_calcdivisor(unsigned long clkin, unsigned int wanted,
        return clkin / (calc_divs * calc_div1);
 }
 
-/* freq_acceptable
- *
- * test wether a frequency is within the acceptable range of error
-*/
-
-static inline int freq_acceptable(unsigned int freq, unsigned int wanted)
-{
-       int diff = freq - wanted;
-
-       return diff >= -2 && diff <= 2;
-}
-
 /* s3c24xx_i2c_clockrate
  *
  * work out a divisor for the user requested frequency setting,
@@ -614,44 +602,28 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got)
        struct s3c2410_platform_i2c *pdata = i2c->dev->platform_data;
        unsigned long clkin = clk_get_rate(i2c->clk);
        unsigned int divs, div1;
+       unsigned long target_frequency;
        u32 iiccon;
        int freq;
-       int start, end;
 
        i2c->clkrate = clkin;
        clkin /= 1000;          /* clkin now in KHz */
 
-       dev_dbg(i2c->dev, "pdata %p, freq %lu %lu..%lu\n",
-                pdata, pdata->bus_freq, pdata->min_freq, pdata->max_freq);
-
-       if (pdata->bus_freq != 0) {
-               freq = s3c24xx_i2c_calcdivisor(clkin, pdata->bus_freq/1000,
-                                              &div1, &divs);
-               if (freq_acceptable(freq, pdata->bus_freq/1000))
-                       goto found;
-       }
-
-       /* ok, we may have to search for something suitable... */
+       dev_dbg(i2c->dev, "pdata desired frequency %lu\n", pdata->frequency);
 
-       start = (pdata->max_freq == 0) ? pdata->bus_freq : pdata->max_freq;
-       end = pdata->min_freq;
+       target_frequency = pdata->frequency ? pdata->frequency : 100000;
 
-       start /= 1000;
-       end /= 1000;
+       target_frequency /= 1000; /* Target frequency now in KHz */
 
-       /* search loop... */
+       freq = s3c24xx_i2c_calcdivisor(clkin, target_frequency, &div1, &divs);
 
-       for (; start > end; start--) {
-               freq = s3c24xx_i2c_calcdivisor(clkin, start, &div1, &divs);
-               if (freq_acceptable(freq, start))
-                       goto found;
+       if (freq > target_frequency) {
+               dev_err(i2c->dev,
+                       "Unable to achieve desired frequency %luKHz."   \
+                       " Lowest achievable %dKHz\n", target_frequency, freq);
+               return -EINVAL;
        }
 
-       /* cannot find frequency spec */
-
-       return -EINVAL;
-
- found:
        *got = freq;
 
        iiccon = readl(i2c->regs + S3C2410_IICCON);
@@ -663,6 +635,23 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got)
 
        writel(iiccon, i2c->regs + S3C2410_IICCON);
 
+       if (s3c24xx_i2c_is2440(i2c)) {
+               unsigned long sda_delay;
+
+               if (pdata->sda_delay) {
+                       sda_delay = (freq / 1000) * pdata->sda_delay;
+                       sda_delay /= 1000000;
+                       sda_delay = DIV_ROUND_UP(sda_delay, 5);
+                       if (sda_delay > 3)
+                               sda_delay = 3;
+                       sda_delay |= S3C2410_IICLC_FILTER_ON;
+               } else
+                       sda_delay = 0;
+
+               dev_dbg(i2c->dev, "IICLC=%08lx\n", sda_delay);
+               writel(sda_delay, i2c->regs + S3C2440_IICLC);
+       }
+
        return 0;
 }
 
@@ -769,11 +758,8 @@ static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c)
 
        /* check for s3c2440 i2c controller  */
 
-       if (s3c24xx_i2c_is2440(i2c)) {
-               dev_dbg(i2c->dev, "S3C2440_IICLC=%08x\n", pdata->sda_delay);
-
-               writel(pdata->sda_delay, i2c->regs + S3C2440_IICLC);
-       }
+       if (s3c24xx_i2c_is2440(i2c))
+               writel(0x0, i2c->regs + S3C2440_IICLC);
 
        return 0;
 }
@@ -1018,14 +1004,13 @@ static int __init i2c_adap_s3c_init(void)
 
        return ret;
 }
+subsys_initcall(i2c_adap_s3c_init);
 
 static void __exit i2c_adap_s3c_exit(void)
 {
        platform_driver_unregister(&s3c2410_i2c_driver);
        platform_driver_unregister(&s3c2440_i2c_driver);
 }
-
-module_init(i2c_adap_s3c_init);
 module_exit(i2c_adap_s3c_exit);
 
 MODULE_DESCRIPTION("S3C24XX I2C Bus driver");
diff --git a/drivers/i2c/busses/i2c-s6000.c b/drivers/i2c/busses/i2c-s6000.c
new file mode 100644 (file)
index 0000000..c91359f
--- /dev/null
@@ -0,0 +1,407 @@
+/*
+ * drivers/i2c/busses/i2c-s6000.c
+ *
+ * Description: Driver for S6000 Family I2C Interface
+ * Copyright (c) 2008 emlix GmbH
+ * Author:     Oskar Schirmer <os@emlix.com>
+ *
+ * Partially based on i2c-bfin-twi.c driver by <sonic.zhang@analog.com>
+ * Copyright (c) 2005-2007 Analog Devices, 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.
+ *
+ * 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 <linux/clk.h>
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/i2c/s6000.h>
+#include <linux/timer.h>
+#include <linux/spinlock.h>
+#include <linux/completion.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+
+#include <asm/io.h>
+#include "i2c-s6000.h"
+
+#define DRV_NAME "i2c-s6000"
+
+#define POLL_TIMEOUT   (2 * HZ)
+
+struct s6i2c_if {
+       u8 __iomem              *reg; /* memory mapped registers */
+       int                     irq;
+       spinlock_t              lock;
+       struct i2c_msg          *msgs; /* messages currently handled */
+       int                     msgs_num; /* nb of msgs to do */
+       int                     msgs_push; /* nb of msgs read/written */
+       int                     msgs_done; /* nb of msgs finally handled */
+       unsigned                push; /* nb of bytes read/written in msg */
+       unsigned                done; /* nb of bytes finally handled */
+       int                     timeout_count; /* timeout retries left */
+       struct timer_list       timeout_timer;
+       struct i2c_adapter      adap;
+       struct completion       complete;
+       struct clk              *clk;
+       struct resource         *res;
+};
+
+static inline u16 i2c_rd16(struct s6i2c_if *iface, unsigned n)
+{
+       return readw(iface->reg + (n));
+}
+
+static inline void i2c_wr16(struct s6i2c_if *iface, unsigned n, u16 v)
+{
+       writew(v, iface->reg + (n));
+}
+
+static inline u32 i2c_rd32(struct s6i2c_if *iface, unsigned n)
+{
+       return readl(iface->reg + (n));
+}
+
+static inline void i2c_wr32(struct s6i2c_if *iface, unsigned n, u32 v)
+{
+       writel(v, iface->reg + (n));
+}
+
+static struct s6i2c_if s6i2c_if;
+
+static void s6i2c_handle_interrupt(struct s6i2c_if *iface)
+{
+       if (i2c_rd16(iface, S6_I2C_INTRSTAT) & (1 << S6_I2C_INTR_TXABRT)) {
+               i2c_rd16(iface, S6_I2C_CLRTXABRT);
+               i2c_wr16(iface, S6_I2C_INTRMASK, 0);
+               complete(&iface->complete);
+               return;
+       }
+       if (iface->msgs_done >= iface->msgs_num) {
+               dev_err(&iface->adap.dev, "s6i2c: spurious I2C irq: %04x\n",
+                       i2c_rd16(iface, S6_I2C_INTRSTAT));
+               i2c_wr16(iface, S6_I2C_INTRMASK, 0);
+               return;
+       }
+       while ((iface->msgs_push < iface->msgs_num)
+           && (i2c_rd16(iface, S6_I2C_STATUS) & (1 << S6_I2C_STATUS_TFNF))) {
+               struct i2c_msg *m = &iface->msgs[iface->msgs_push];
+               if (!(m->flags & I2C_M_RD))
+                       i2c_wr16(iface, S6_I2C_DATACMD, m->buf[iface->push]);
+               else
+                       i2c_wr16(iface, S6_I2C_DATACMD,
+                                1 << S6_I2C_DATACMD_READ);
+               if (++iface->push >= m->len) {
+                       iface->push = 0;
+                       iface->msgs_push += 1;
+               }
+       }
+       do {
+               struct i2c_msg *m = &iface->msgs[iface->msgs_done];
+               if (!(m->flags & I2C_M_RD)) {
+                       if (iface->msgs_done < iface->msgs_push)
+                               iface->msgs_done += 1;
+                       else
+                               break;
+               } else if (i2c_rd16(iface, S6_I2C_STATUS)
+                               & (1 << S6_I2C_STATUS_RFNE)) {
+                       m->buf[iface->done] = i2c_rd16(iface, S6_I2C_DATACMD);
+                       if (++iface->done >= m->len) {
+                               iface->done = 0;
+                               iface->msgs_done += 1;
+                       }
+               } else{
+                       break;
+               }
+       } while (iface->msgs_done < iface->msgs_num);
+       if (iface->msgs_done >= iface->msgs_num) {
+               i2c_wr16(iface, S6_I2C_INTRMASK, 1 << S6_I2C_INTR_TXABRT);
+               complete(&iface->complete);
+       } else if (iface->msgs_push >= iface->msgs_num) {
+               i2c_wr16(iface, S6_I2C_INTRMASK, (1 << S6_I2C_INTR_TXABRT) |
+                                                (1 << S6_I2C_INTR_RXFULL));
+       } else {
+               i2c_wr16(iface, S6_I2C_INTRMASK, (1 << S6_I2C_INTR_TXABRT) |
+                                                (1 << S6_I2C_INTR_TXEMPTY) |
+                                                (1 << S6_I2C_INTR_RXFULL));
+       }
+}
+
+static irqreturn_t s6i2c_interrupt_entry(int irq, void *dev_id)
+{
+       struct s6i2c_if *iface = dev_id;
+       if (!(i2c_rd16(iface, S6_I2C_STATUS) & ((1 << S6_I2C_INTR_RXUNDER)
+                                             | (1 << S6_I2C_INTR_RXOVER)
+                                             | (1 << S6_I2C_INTR_RXFULL)
+                                             | (1 << S6_I2C_INTR_TXOVER)
+                                             | (1 << S6_I2C_INTR_TXEMPTY)
+                                             | (1 << S6_I2C_INTR_RDREQ)
+                                             | (1 << S6_I2C_INTR_TXABRT)
+                                             | (1 << S6_I2C_INTR_RXDONE)
+                                             | (1 << S6_I2C_INTR_ACTIVITY)
+                                             | (1 << S6_I2C_INTR_STOPDET)
+                                             | (1 << S6_I2C_INTR_STARTDET)
+                                             | (1 << S6_I2C_INTR_GENCALL))))
+               return IRQ_NONE;
+
+       spin_lock(&iface->lock);
+       del_timer(&iface->timeout_timer);
+       s6i2c_handle_interrupt(iface);
+       spin_unlock(&iface->lock);
+       return IRQ_HANDLED;
+}
+
+static void s6i2c_timeout(unsigned long data)
+{
+       struct s6i2c_if *iface = (struct s6i2c_if *)data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&iface->lock, flags);
+       s6i2c_handle_interrupt(iface);
+       if (--iface->timeout_count > 0) {
+               iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
+               add_timer(&iface->timeout_timer);
+       } else {
+               complete(&iface->complete);
+               i2c_wr16(iface, S6_I2C_INTRMASK, 0);
+       }
+       spin_unlock_irqrestore(&iface->lock, flags);
+}
+
+static int s6i2c_master_xfer(struct i2c_adapter *adap,
+                               struct i2c_msg *msgs, int num)
+{
+       struct s6i2c_if *iface = adap->algo_data;
+       int i;
+       if (num == 0)
+               return 0;
+       if (i2c_rd16(iface, S6_I2C_STATUS) & (1 << S6_I2C_STATUS_ACTIVITY))
+               yield();
+       i2c_wr16(iface, S6_I2C_INTRMASK, 0);
+       i2c_rd16(iface, S6_I2C_CLRINTR);
+       for (i = 0; i < num; i++) {
+               if (msgs[i].flags & I2C_M_TEN) {
+                       dev_err(&adap->dev,
+                               "s6i2c: 10 bits addr not supported\n");
+                       return -EINVAL;
+               }
+               if (msgs[i].len == 0) {
+                       dev_err(&adap->dev,
+                               "s6i2c: zero length message not supported\n");
+                       return -EINVAL;
+               }
+               if (msgs[i].addr != msgs[0].addr) {
+                       dev_err(&adap->dev,
+                               "s6i2c: multiple xfer cannot change target\n");
+                       return -EINVAL;
+               }
+       }
+
+       iface->msgs = msgs;
+       iface->msgs_num = num;
+       iface->msgs_push = 0;
+       iface->msgs_done = 0;
+       iface->push = 0;
+       iface->done = 0;
+       iface->timeout_count = 10;
+       i2c_wr16(iface, S6_I2C_TAR, msgs[0].addr);
+       i2c_wr16(iface, S6_I2C_ENABLE, 1);
+       i2c_wr16(iface, S6_I2C_INTRMASK, (1 << S6_I2C_INTR_TXEMPTY) |
+                                        (1 << S6_I2C_INTR_TXABRT));
+
+       iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
+       add_timer(&iface->timeout_timer);
+       wait_for_completion(&iface->complete);
+       del_timer_sync(&iface->timeout_timer);
+       while (i2c_rd32(iface, S6_I2C_TXFLR) > 0)
+               schedule();
+       while (i2c_rd16(iface, S6_I2C_STATUS) & (1 << S6_I2C_STATUS_ACTIVITY))
+               schedule();
+
+       i2c_wr16(iface, S6_I2C_INTRMASK, 0);
+       i2c_wr16(iface, S6_I2C_ENABLE, 0);
+       return iface->msgs_done;
+}
+
+static u32 s6i2c_functionality(struct i2c_adapter *adap)
+{
+       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
+}
+
+static struct i2c_algorithm s6i2c_algorithm = {
+       .master_xfer   = s6i2c_master_xfer,
+       .functionality = s6i2c_functionality,
+};
+
+static u16 __devinit nanoseconds_on_clk(struct s6i2c_if *iface, u32 ns)
+{
+       u32 dividend = ((clk_get_rate(iface->clk) / 1000) * ns) / 1000000;
+       if (dividend > 0xffff)
+               return 0xffff;
+       return dividend;
+}
+
+static int __devinit s6i2c_probe(struct platform_device *dev)
+{
+       struct s6i2c_if *iface = &s6i2c_if;
+       struct i2c_adapter *p_adap;
+       const char *clock;
+       int bus_num, rc;
+       spin_lock_init(&iface->lock);
+       init_completion(&iface->complete);
+       iface->irq = platform_get_irq(dev, 0);
+       if (iface->irq < 0) {
+               rc = iface->irq;
+               goto err_out;
+       }
+       iface->res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       if (!iface->res) {
+               rc = -ENXIO;
+               goto err_out;
+       }
+       iface->res = request_mem_region(iface->res->start,
+                                       resource_size(iface->res),
+                                       dev->dev.bus_id);
+       if (!iface->res) {
+               rc = -EBUSY;
+               goto err_out;
+       }
+       iface->reg = ioremap_nocache(iface->res->start,
+                                    resource_size(iface->res));
+       if (!iface->reg) {
+               rc = -ENOMEM;
+               goto err_reg;
+       }
+
+       clock = 0;
+       bus_num = -1;
+       if (dev->dev.platform_data) {
+               struct s6_i2c_platform_data *pdata = dev->dev.platform_data;
+               bus_num = pdata->bus_num;
+               clock = pdata->clock;
+       }
+       iface->clk = clk_get(&dev->dev, clock);
+       if (IS_ERR(iface->clk)) {
+               rc = PTR_ERR(iface->clk);
+               goto err_map;
+       }
+       rc = clk_enable(iface->clk);
+       if (rc < 0)
+               goto err_clk_put;
+       init_timer(&iface->timeout_timer);
+       iface->timeout_timer.function = s6i2c_timeout;
+       iface->timeout_timer.data = (unsigned long)iface;
+
+       p_adap = &iface->adap;
+       strlcpy(p_adap->name, dev->name, sizeof(p_adap->name));
+       p_adap->algo = &s6i2c_algorithm;
+       p_adap->algo_data = iface;
+       p_adap->nr = bus_num;
+       p_adap->class = 0;
+       p_adap->dev.parent = &dev->dev;
+       i2c_wr16(iface, S6_I2C_INTRMASK, 0);
+       rc = request_irq(iface->irq, s6i2c_interrupt_entry,
+                        IRQF_SHARED, dev->name, iface);
+       if (rc) {
+               dev_err(&p_adap->dev, "s6i2c: cant get IRQ %d\n", iface->irq);
+               goto err_clk_dis;
+       }
+
+       i2c_wr16(iface, S6_I2C_ENABLE, 0);
+       udelay(1);
+       i2c_wr32(iface, S6_I2C_SRESET, 1 << S6_I2C_SRESET_IC_SRST);
+       i2c_wr16(iface, S6_I2C_CLRTXABRT, 1);
+       i2c_wr16(iface, S6_I2C_CON,
+                       (1 << S6_I2C_CON_MASTER) |
+                       (S6_I2C_CON_SPEED_NORMAL << S6_I2C_CON_SPEED) |
+                       (0 << S6_I2C_CON_10BITSLAVE) |
+                       (0 << S6_I2C_CON_10BITMASTER) |
+                       (1 << S6_I2C_CON_RESTARTENA) |
+                       (1 << S6_I2C_CON_SLAVEDISABLE));
+       i2c_wr16(iface, S6_I2C_SSHCNT, nanoseconds_on_clk(iface, 4000));
+       i2c_wr16(iface, S6_I2C_SSLCNT, nanoseconds_on_clk(iface, 4700));
+       i2c_wr16(iface, S6_I2C_FSHCNT, nanoseconds_on_clk(iface, 600));
+       i2c_wr16(iface, S6_I2C_FSLCNT, nanoseconds_on_clk(iface, 1300));
+       i2c_wr16(iface, S6_I2C_RXTL, 0);
+       i2c_wr16(iface, S6_I2C_TXTL, 0);
+
+       platform_set_drvdata(dev, iface);
+       if (bus_num < 0)
+               rc = i2c_add_adapter(p_adap);
+       else
+               rc = i2c_add_numbered_adapter(p_adap);
+       if (rc)
+               goto err_irq_free;
+       return 0;
+
+err_irq_free:
+       free_irq(iface->irq, iface);
+err_clk_dis:
+       clk_disable(iface->clk);
+err_clk_put:
+       clk_put(iface->clk);
+err_map:
+       iounmap(iface->reg);
+err_reg:
+       release_mem_region(iface->res->start,
+                          resource_size(iface->res));
+err_out:
+       return rc;
+}
+
+static int __devexit s6i2c_remove(struct platform_device *pdev)
+{
+       struct s6i2c_if *iface = platform_get_drvdata(pdev);
+       i2c_wr16(iface, S6_I2C_ENABLE, 0);
+       platform_set_drvdata(pdev, NULL);
+       i2c_del_adapter(&iface->adap);
+       free_irq(iface->irq, iface);
+       clk_disable(iface->clk);
+       clk_put(iface->clk);
+       iounmap(iface->reg);
+       release_mem_region(iface->res->start,
+                          resource_size(iface->res));
+       return 0;
+}
+
+static struct platform_driver s6i2c_driver = {
+       .probe          = s6i2c_probe,
+       .remove         = __devexit_p(s6i2c_remove),
+       .driver         = {
+               .name   = DRV_NAME,
+               .owner  = THIS_MODULE,
+       },
+};
+
+static int __init s6i2c_init(void)
+{
+       pr_info("I2C: S6000 I2C driver\n");
+       return platform_driver_register(&s6i2c_driver);
+}
+
+static void __exit s6i2c_exit(void)
+{
+       platform_driver_unregister(&s6i2c_driver);
+}
+
+MODULE_DESCRIPTION("I2C-Bus adapter routines for S6000 I2C");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRV_NAME);
+
+subsys_initcall(s6i2c_init);
+module_exit(s6i2c_exit);
diff --git a/drivers/i2c/busses/i2c-s6000.h b/drivers/i2c/busses/i2c-s6000.h
new file mode 100644 (file)
index 0000000..ff23b81
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * drivers/i2c/busses/i2c-s6000.h
+ *
+ * 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.
+ *
+ * Copyright (C) 2008 Emlix GmbH <info@emlix.com>
+ * Author:     Oskar Schirmer <os@emlix.com>
+ */
+
+#ifndef __DRIVERS_I2C_BUSSES_I2C_S6000_H
+#define __DRIVERS_I2C_BUSSES_I2C_S6000_H
+
+#define S6_I2C_CON             0x000
+#define S6_I2C_CON_MASTER              0
+#define S6_I2C_CON_SPEED               1
+#define S6_I2C_CON_SPEED_NORMAL                        1
+#define S6_I2C_CON_SPEED_FAST                  2
+#define S6_I2C_CON_SPEED_MASK                  3
+#define S6_I2C_CON_10BITSLAVE          3
+#define S6_I2C_CON_10BITMASTER         4
+#define S6_I2C_CON_RESTARTENA          5
+#define S6_I2C_CON_SLAVEDISABLE                6
+#define S6_I2C_TAR             0x004
+#define S6_I2C_TAR_GCORSTART           10
+#define S6_I2C_TAR_SPECIAL             11
+#define S6_I2C_SAR             0x008
+#define S6_I2C_HSMADDR         0x00C
+#define S6_I2C_DATACMD         0x010
+#define S6_I2C_DATACMD_READ            8
+#define S6_I2C_SSHCNT          0x014
+#define S6_I2C_SSLCNT          0x018
+#define S6_I2C_FSHCNT          0x01C
+#define S6_I2C_FSLCNT          0x020
+#define S6_I2C_INTRSTAT                0x02C
+#define S6_I2C_INTRMASK                0x030
+#define S6_I2C_RAWINTR         0x034
+#define S6_I2C_INTR_RXUNDER            0
+#define S6_I2C_INTR_RXOVER             1
+#define S6_I2C_INTR_RXFULL             2
+#define S6_I2C_INTR_TXOVER             3
+#define S6_I2C_INTR_TXEMPTY            4
+#define S6_I2C_INTR_RDREQ              5
+#define S6_I2C_INTR_TXABRT             6
+#define S6_I2C_INTR_RXDONE             7
+#define S6_I2C_INTR_ACTIVITY           8
+#define S6_I2C_INTR_STOPDET            9
+#define S6_I2C_INTR_STARTDET           10
+#define S6_I2C_INTR_GENCALL            11
+#define S6_I2C_RXTL            0x038
+#define S6_I2C_TXTL            0x03C
+#define S6_I2C_CLRINTR         0x040
+#define S6_I2C_CLRRXUNDER      0x044
+#define S6_I2C_CLRRXOVER       0x048
+#define S6_I2C_CLRTXOVER       0x04C
+#define S6_I2C_CLRRDREQ                0x050
+#define S6_I2C_CLRTXABRT       0x054
+#define S6_I2C_CLRRXDONE       0x058
+#define S6_I2C_CLRACTIVITY     0x05C
+#define S6_I2C_CLRSTOPDET      0x060
+#define S6_I2C_CLRSTARTDET     0x064
+#define S6_I2C_CLRGENCALL      0x068
+#define S6_I2C_ENABLE          0x06C
+#define S6_I2C_STATUS          0x070
+#define S6_I2C_STATUS_ACTIVITY         0
+#define S6_I2C_STATUS_TFNF             1
+#define S6_I2C_STATUS_TFE              2
+#define S6_I2C_STATUS_RFNE             3
+#define S6_I2C_STATUS_RFF              4
+#define S6_I2C_TXFLR           0x074
+#define S6_I2C_RXFLR           0x078
+#define S6_I2C_SRESET          0x07C
+#define S6_I2C_SRESET_IC_SRST          0
+#define S6_I2C_SRESET_IC_MASTER_SRST   1
+#define S6_I2C_SRESET_IC_SLAVE_SRST    2
+#define S6_I2C_TXABRTSOURCE    0x080
+
+#endif
index 58fb90e5b7635c08ae16545b876776c46af095d0..87987a7d36c9c3c6d0cf391c92cd12a9c5426ae0 100644 (file)
@@ -122,7 +122,7 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
                return -ENODEV;
        }
        pci_set_master(dev);
-       if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(dev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING "%s: No suitable DMA available.\n",
                        d->name);
                return -ENODEV;
index a19dbccd76179cd4a234b168e2d18197bf86b18e..7a3a12d6e638eae21a9bbce4f3f269d55b5a8aa6 100644 (file)
@@ -208,7 +208,7 @@ static int ide_pci_enable(struct pci_dev *dev, const struct ide_port_info *d)
         * a DMA mask field to the struct ide_port_info if we need it
         * (or let lower level driver set the DMA mask)
         */
-       ret = pci_set_dma_mask(dev, DMA_32BIT_MASK);
+       ret = pci_set_dma_mask(dev, DMA_BIT_MASK(32));
        if (ret < 0) {
                printk(KERN_ERR "%s %s: can't set DMA mask\n",
                        d->name, pci_name(dev));
index 17e8ddd013347623c39d8ecb8e150b99aaa29094..bf740394d70431f1cb0f37732f6ca68fd7aaa4ed 100644 (file)
@@ -178,7 +178,7 @@ static int __init i7300_idle_ioat_selftest(u8 *ctl,
 
 static struct device dummy_dma_dev = {
        .init_name = "fallback device",
-       .coherent_dma_mask = DMA_64BIT_MASK,
+       .coherent_dma_mask = DMA_BIT_MASK(64),
        .dma_mask = &dummy_dma_dev.coherent_dma_mask,
 };
 
index 38f71203620120dd36a5bd1fb33e41be0c059e02..9555fd2538658561526400f6202dd1d13a7c2bc7 100644 (file)
@@ -1171,7 +1171,7 @@ static int __devinit add_card(struct pci_dev *dev,
 
         error = -ENXIO;
 
-        if (pci_set_dma_mask(dev, DMA_32BIT_MASK))
+        if (pci_set_dma_mask(dev, DMA_BIT_MASK(32)))
                 FAIL("DMA address limits not supported for PCILynx hardware");
         if (pci_enable_device(dev))
                 FAIL("failed to enable PCILynx hardware");
index 7d79aa361e26c84677f87bcf665a288f2b4b6182..0cfbb6d2f762b5699c4edef953ab5757196dae5c 100644 (file)
@@ -989,13 +989,13 @@ static int __devinit c2_probe(struct pci_dev *pcidev,
        }
 
        if ((sizeof(dma_addr_t) > 4)) {
-               ret = pci_set_dma_mask(pcidev, DMA_64BIT_MASK);
+               ret = pci_set_dma_mask(pcidev, DMA_BIT_MASK(64));
                if (ret < 0) {
                        printk(KERN_ERR PFX "64b DMA configuration failed\n");
                        goto bail2;
                }
        } else {
-               ret = pci_set_dma_mask(pcidev, DMA_32BIT_MASK);
+               ret = pci_set_dma_mask(pcidev, DMA_BIT_MASK(32));
                if (ret < 0) {
                        printk(KERN_ERR PFX "32b DMA configuration failed\n");
                        goto bail2;
index cb9daa6ac029d44a6cadd88057c9d3ddef57e020..04e88b600558caceaa0cedaf073b4ffeb7145ba5 100644 (file)
@@ -470,14 +470,14 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
                goto bail_disable;
        }
 
-       ret = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (ret) {
                /*
                 * if the 64 bit setup fails, try 32 bit.  Some systems
                 * do not setup 64 bit maps on systems with 2GB or less
                 * memory installed.
                 */
-               ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (ret) {
                        dev_info(&pdev->dev,
                                "Unable to set DMA mask for unit %u: %d\n",
@@ -486,7 +486,7 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
                }
                else {
                        ipath_dbg("No 64bit DMA mask, used 32 bit mask\n");
-                       ret = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (ret)
                                dev_info(&pdev->dev,
                                        "Unable to set DMA consistent mask "
@@ -496,7 +496,7 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
                }
        }
        else {
-               ret = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+               ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (ret)
                        dev_info(&pdev->dev,
                                "Unable to set DMA consistent mask "
index 52f60f4eea0070a2f763a2bcb8d3a5373f919963..1d83cf7caf38a4893a1e23355092cf134bb83a61 100644 (file)
@@ -1016,20 +1016,20 @@ static int __mthca_init_one(struct pci_dev *pdev, int hca_type)
 
        pci_set_master(pdev);
 
-       err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (err) {
                dev_warn(&pdev->dev, "Warning: couldn't set 64-bit PCI DMA mask.\n");
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        dev_err(&pdev->dev, "Can't set PCI DMA mask, aborting.\n");
                        goto err_free_res;
                }
        }
-       err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
        if (err) {
                dev_warn(&pdev->dev, "Warning: couldn't set 64-bit "
                         "consistent PCI DMA mask.\n");
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        dev_err(&pdev->dev, "Can't set consistent PCI DMA mask, "
                                "aborting.\n");
index ca599767ffbdc20f1b45af616541c47631cfbf9c..cbde0cfe27e0a7e3eeb784003317b90e262df6ae 100644 (file)
@@ -478,23 +478,23 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i
        }
 
        if ((sizeof(dma_addr_t) > 4)) {
-               ret = pci_set_dma_mask(pcidev, DMA_64BIT_MASK);
+               ret = pci_set_dma_mask(pcidev, DMA_BIT_MASK(64));
                if (ret < 0) {
                        printk(KERN_ERR PFX "64b DMA mask configuration failed\n");
                        goto bail2;
                }
-               ret = pci_set_consistent_dma_mask(pcidev, DMA_64BIT_MASK);
+               ret = pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64));
                if (ret) {
                        printk(KERN_ERR PFX "64b DMA consistent mask configuration failed\n");
                        goto bail2;
                }
        } else {
-               ret = pci_set_dma_mask(pcidev, DMA_32BIT_MASK);
+               ret = pci_set_dma_mask(pcidev, DMA_BIT_MASK(32));
                if (ret < 0) {
                        printk(KERN_ERR PFX "32b DMA mask configuration failed\n");
                        goto bail2;
                }
-               ret = pci_set_consistent_dma_mask(pcidev, DMA_32BIT_MASK);
+               ret = pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32));
                if (ret) {
                        printk(KERN_ERR PFX "32b DMA consistent mask configuration failed\n");
                        goto bail2;
index 831ddce1467bd162c1e875b7c019e6cf2f3c420d..781c4041f7b0d1a856b2be280126d89e0adf55e2 100644 (file)
@@ -821,7 +821,7 @@ static void read_iso_callback(struct urb *urb)
                /* pass URB to tasklet */
                ubc->isoindone = urb;
                ubc->isoinstatus = status;
-               tasklet_schedule(&ubc->rcvd_tasklet);
+               tasklet_hi_schedule(&ubc->rcvd_tasklet);
        } else {
                /* tasklet still busy, drop data and resubmit URB */
                ubc->loststatus = status;
@@ -888,7 +888,7 @@ static void write_iso_callback(struct urb *urb)
        ubc->isooutovfl = ubc->isooutdone;
        ubc->isooutdone = ucx;
        spin_unlock_irqrestore(&ubc->isooutlock, flags);
-       tasklet_schedule(&ubc->sent_tasklet);
+       tasklet_hi_schedule(&ubc->sent_tasklet);
 }
 
 /* starturbs
index 311e7ca0fb01956eb60ee4d2441e45a4878ea63f..820a30923feebff7006e2c5b3bad7751f16837c7 100644 (file)
@@ -193,7 +193,9 @@ static void if_close(struct tty_struct *tty, struct file *filp)
 
        mutex_lock(&cs->mutex);
 
-       if (!cs->open_count)
+       if (!cs->connected)
+               gig_dbg(DEBUG_IF, "not connected");     /* nothing to do */
+       else if (!cs->open_count)
                dev_warn(cs->dev, "%s: device not opened\n", __func__);
        else {
                if (!--cs->open_count) {
@@ -228,7 +230,10 @@ static int if_ioctl(struct tty_struct *tty, struct file *file,
        if (mutex_lock_interruptible(&cs->mutex))
                return -ERESTARTSYS; // FIXME -EINTR?
 
-       if (!cs->open_count)
+       if (!cs->connected) {
+               gig_dbg(DEBUG_IF, "not connected");
+               retval = -ENODEV;
+       } else if (!cs->open_count)
                dev_warn(cs->dev, "%s: device not opened\n", __func__);
        else {
                retval = 0;
@@ -248,13 +253,6 @@ static int if_ioctl(struct tty_struct *tty, struct file *file,
                                retval = put_user(int_arg, (int __user *) arg);
                        break;
                case GIGASET_BRKCHARS:
-                       //FIXME test if MS_LOCKED
-                       if (!cs->connected) {
-                               gig_dbg(DEBUG_ANY,
-                                   "can't communicate with unplugged device");
-                               retval = -ENODEV;
-                               break;
-                       }
                        retval = copy_from_user(&buf,
                                        (const unsigned char __user *) arg, 6)
                                ? -EFAULT : 0;
@@ -331,7 +329,7 @@ static int if_tiocmset(struct tty_struct *tty, struct file *file,
                return -ERESTARTSYS; // FIXME -EINTR?
 
        if (!cs->connected) {
-               gig_dbg(DEBUG_ANY, "can't communicate with unplugged device");
+               gig_dbg(DEBUG_IF, "not connected");
                retval = -ENODEV;
        } else {
                mc = (cs->control_state | set) & ~clear & (TIOCM_RTS|TIOCM_DTR);
@@ -360,14 +358,14 @@ static int if_write(struct tty_struct *tty, const unsigned char *buf, int count)
        if (mutex_lock_interruptible(&cs->mutex))
                return -ERESTARTSYS; // FIXME -EINTR?
 
-       if (!cs->open_count)
+       if (!cs->connected) {
+               gig_dbg(DEBUG_IF, "not connected");
+               retval = -ENODEV;
+       } else if (!cs->open_count)
                dev_warn(cs->dev, "%s: device not opened\n", __func__);
        else if (cs->mstate != MS_LOCKED) {
                dev_warn(cs->dev, "can't write to unlocked device\n");
                retval = -EBUSY;
-       } else if (!cs->connected) {
-               gig_dbg(DEBUG_ANY, "can't write to unplugged device");
-               retval = -EBUSY; //FIXME
        } else {
                retval = cs->ops->write_cmd(cs, buf, count,
                                            &cs->if_wake_tasklet);
@@ -394,14 +392,14 @@ static int if_write_room(struct tty_struct *tty)
        if (mutex_lock_interruptible(&cs->mutex))
                return -ERESTARTSYS; // FIXME -EINTR?
 
-       if (!cs->open_count)
+       if (!cs->connected) {
+               gig_dbg(DEBUG_IF, "not connected");
+               retval = -ENODEV;
+       } else if (!cs->open_count)
                dev_warn(cs->dev, "%s: device not opened\n", __func__);
        else if (cs->mstate != MS_LOCKED) {
                dev_warn(cs->dev, "can't write to unlocked device\n");
                retval = -EBUSY;
-       } else if (!cs->connected) {
-               gig_dbg(DEBUG_ANY, "can't write to unplugged device");
-               retval = -EBUSY; //FIXME
        } else
                retval = cs->ops->write_room(cs);
 
@@ -426,14 +424,14 @@ static int if_chars_in_buffer(struct tty_struct *tty)
        if (mutex_lock_interruptible(&cs->mutex))
                return -ERESTARTSYS; // FIXME -EINTR?
 
-       if (!cs->open_count)
+       if (!cs->connected) {
+               gig_dbg(DEBUG_IF, "not connected");
+               retval = -ENODEV;
+       } else if (!cs->open_count)
                dev_warn(cs->dev, "%s: device not opened\n", __func__);
        else if (cs->mstate != MS_LOCKED) {
                dev_warn(cs->dev, "can't write to unlocked device\n");
                retval = -EBUSY;
-       } else if (!cs->connected) {
-               gig_dbg(DEBUG_ANY, "can't write to unplugged device");
-               retval = -EBUSY; //FIXME
        } else
                retval = cs->ops->chars_in_buffer(cs);
 
@@ -456,7 +454,9 @@ static void if_throttle(struct tty_struct *tty)
 
        mutex_lock(&cs->mutex);
 
-       if (!cs->open_count)
+       if (!cs->connected)
+               gig_dbg(DEBUG_IF, "not connected");     /* nothing to do */
+       else if (!cs->open_count)
                dev_warn(cs->dev, "%s: device not opened\n", __func__);
        else {
                //FIXME
@@ -479,7 +479,9 @@ static void if_unthrottle(struct tty_struct *tty)
 
        mutex_lock(&cs->mutex);
 
-       if (!cs->open_count)
+       if (!cs->connected)
+               gig_dbg(DEBUG_IF, "not connected");     /* nothing to do */
+       else if (!cs->open_count)
                dev_warn(cs->dev, "%s: device not opened\n", __func__);
        else {
                //FIXME
@@ -506,13 +508,13 @@ static void if_set_termios(struct tty_struct *tty, struct ktermios *old)
 
        mutex_lock(&cs->mutex);
 
-       if (!cs->open_count) {
-               dev_warn(cs->dev, "%s: device not opened\n", __func__);
+       if (!cs->connected) {
+               gig_dbg(DEBUG_IF, "not connected");
                goto out;
        }
 
-       if (!cs->connected) {
-               gig_dbg(DEBUG_ANY, "can't communicate with unplugged device");
+       if (!cs->open_count) {
+               dev_warn(cs->dev, "%s: device not opened\n", __func__);
                goto out;
        }
 
index d9db17624f129fc88a3d1e50f49d69661e39ba99..9b60b6b684d9cd7c5a62c843d827e6071491a51f 100644 (file)
@@ -31,6 +31,13 @@ config LEDS_LOCOMO
          This option enables support for the LEDs on Sharp Locomo.
          Zaurus models SL-5500 and SL-5600.
 
+config LEDS_MIKROTIK_RB532
+       tristate "LED Support for Mikrotik Routerboard 532"
+       depends on LEDS_CLASS && MIKROTIK_RB532
+       help
+         This option enables support for the so called "User LED" of
+         Mikrotik's Routerboard 532.
+
 config LEDS_S3C24XX
        tristate "LED Support for Samsung S3C24XX GPIO LEDs"
        depends on LEDS_CLASS && ARCH_S3C2410
@@ -117,11 +124,40 @@ config LEDS_GPIO
        help
          This option enables support for the LEDs connected to GPIO
          outputs. To be useful the particular board must have LEDs
-         and they must be connected to the GPIO lines.
+         and they must be connected to the GPIO lines.  The LEDs must be
+         defined as platform devices and/or OpenFirmware platform devices.
+         The code to use these bindings can be selected below.
+
+config LEDS_GPIO_PLATFORM
+       bool "Platform device bindings for GPIO LEDs"
+       depends on LEDS_GPIO
+       default y
+       help
+         Let the leds-gpio driver drive LEDs which have been defined as
+         platform devices.  If you don't know what this means, say yes.
+
+config LEDS_GPIO_OF
+       bool "OpenFirmware platform device bindings for GPIO LEDs"
+       depends on LEDS_GPIO && OF_DEVICE
+       default y
+       help
+         Let the leds-gpio driver drive LEDs which have been defined as
+         of_platform devices.  For instance, LEDs which are listed in a "dts"
+         file.
+
+config LEDS_LP5521
+       tristate "LED Support for the LP5521 LEDs"
+       depends on LEDS_CLASS && I2C
+       help
+         If you say 'Y' here you get support for the National Semiconductor
+         LP5521 LED driver used in n8x0 boards.
+
+         This driver can be built as a module by choosing 'M'. The module
+         will be called leds-lp5521.
 
 config LEDS_CLEVO_MAIL
-       tristate "Mail LED on Clevo notebook (EXPERIMENTAL)"
-       depends on LEDS_CLASS && X86 && SERIO_I8042 && DMI && EXPERIMENTAL
+       tristate "Mail LED on Clevo notebook"
+       depends on LEDS_CLASS && X86 && SERIO_I8042 && DMI
        help
          This driver makes the mail LED accessible from userspace
          programs through the leds subsystem. This LED have three
@@ -171,6 +207,26 @@ config LEDS_DA903X
          This option enables support for on-chip LED drivers found
          on Dialog Semiconductor DA9030/DA9034 PMICs.
 
+config LEDS_DAC124S085
+       tristate "LED Support for DAC124S085 SPI DAC"
+       depends on LEDS_CLASS && SPI
+       help
+         This option enables support for DAC124S085 SPI DAC from NatSemi,
+         which can be used to control up to four LEDs.
+
+config LEDS_PWM
+       tristate "PWM driven LED Support"
+       depends on LEDS_CLASS && HAVE_PWM
+       help
+         This option enables support for pwm driven LEDs
+
+config LEDS_BD2802
+       tristate "LED driver for BD2802 RGB LED"
+       depends on LEDS_CLASS && I2C
+       help
+         This option enables support for BD2802GU RGB LED driver chips
+         accessed via the I2C bus.
+
 comment "LED Triggers"
 
 config LEDS_TRIGGERS
@@ -216,6 +272,19 @@ config LEDS_TRIGGER_BACKLIGHT
 
          If unsure, say N.
 
+config LEDS_TRIGGER_GPIO
+       tristate "LED GPIO Trigger"
+       depends on LEDS_TRIGGERS
+       depends on GPIOLIB
+       help
+         This allows LEDs to be controlled by gpio events. It's good
+         when using gpios as switches and triggering the needed LEDs
+         from there. One use case is n810's keypad LEDs that could
+         be triggered by this trigger when user slides up to show
+         keypad.
+
+         If unsure, say N.
+
 config LEDS_TRIGGER_DEFAULT_ON
        tristate "LED Default ON Trigger"
        depends on LEDS_TRIGGERS
index 9d76f0f160a43323101ead59a16db80d0865ce14..2d41c4dcf92ff9a8db515aac17aee9dc9482db96 100644 (file)
@@ -6,7 +6,9 @@ obj-$(CONFIG_LEDS_TRIGGERS)             += led-triggers.o
 
 # LED Platform Drivers
 obj-$(CONFIG_LEDS_ATMEL_PWM)           += leds-atmel-pwm.o
+obj-$(CONFIG_LEDS_BD2802)              += leds-bd2802.o
 obj-$(CONFIG_LEDS_LOCOMO)              += leds-locomo.o
+obj-$(CONFIG_LEDS_MIKROTIK_RB532)      += leds-rb532.o
 obj-$(CONFIG_LEDS_S3C24XX)             += leds-s3c24xx.o
 obj-$(CONFIG_LEDS_AMS_DELTA)           += leds-ams-delta.o
 obj-$(CONFIG_LEDS_NET48XX)             += leds-net48xx.o
@@ -24,10 +26,15 @@ obj-$(CONFIG_LEDS_FSG)                      += leds-fsg.o
 obj-$(CONFIG_LEDS_PCA955X)             += leds-pca955x.o
 obj-$(CONFIG_LEDS_DA903X)              += leds-da903x.o
 obj-$(CONFIG_LEDS_WM8350)              += leds-wm8350.o
+obj-$(CONFIG_LEDS_PWM)                 += leds-pwm.o
+
+# LED SPI Drivers
+obj-$(CONFIG_LEDS_DAC124S085)          += leds-dac124s085.o
 
 # LED Triggers
 obj-$(CONFIG_LEDS_TRIGGER_TIMER)       += ledtrig-timer.o
 obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK)    += ledtrig-ide-disk.o
 obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT)   += ledtrig-heartbeat.o
 obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT)   += ledtrig-backlight.o
+obj-$(CONFIG_LEDS_TRIGGER_GPIO)                += ledtrig-gpio.o
 obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON)  += ledtrig-default-on.o
index 52f82e3ea13aae5b04a603938fba9dbbd0654712..f2cc13d76810f457c752d6f92f53759980f465ea 100644 (file)
@@ -64,7 +64,16 @@ static ssize_t led_brightness_store(struct device *dev,
        return ret;
 }
 
+static ssize_t led_max_brightness_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct led_classdev *led_cdev = dev_get_drvdata(dev);
+
+       return sprintf(buf, "%u\n", led_cdev->max_brightness);
+}
+
 static DEVICE_ATTR(brightness, 0644, led_brightness_show, led_brightness_store);
+static DEVICE_ATTR(max_brightness, 0444, led_max_brightness_show, NULL);
 #ifdef CONFIG_LEDS_TRIGGERS
 static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store);
 #endif
@@ -138,6 +147,13 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
        list_add_tail(&led_cdev->node, &leds_list);
        up_write(&leds_list_lock);
 
+       if (!led_cdev->max_brightness)
+               led_cdev->max_brightness = LED_FULL;
+
+       rc = device_create_file(led_cdev->dev, &dev_attr_max_brightness);
+       if (rc)
+               goto err_out_attr_max;
+
        led_update_brightness(led_cdev);
 
 #ifdef CONFIG_LEDS_TRIGGERS
@@ -155,9 +171,11 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
 
 #ifdef CONFIG_LEDS_TRIGGERS
 err_out_led_list:
+       device_remove_file(led_cdev->dev, &dev_attr_max_brightness);
+#endif
+err_out_attr_max:
        device_remove_file(led_cdev->dev, &dev_attr_brightness);
        list_del(&led_cdev->node);
-#endif
 err_out:
        device_unregister(led_cdev->dev);
        return rc;
@@ -172,6 +190,7 @@ EXPORT_SYMBOL_GPL(led_classdev_register);
  */
 void led_classdev_unregister(struct led_classdev *led_cdev)
 {
+       device_remove_file(led_cdev->dev, &dev_attr_max_brightness);
        device_remove_file(led_cdev->dev, &dev_attr_brightness);
 #ifdef CONFIG_LEDS_TRIGGERS
        device_remove_file(led_cdev->dev, &dev_attr_trigger);
index f910eaffe3a6f057cd835412204c304f1bd0af38..d8ddd9ef89949da41b8b7b1f9e840b302772ff19 100644 (file)
@@ -156,12 +156,20 @@ EXPORT_SYMBOL_GPL(led_trigger_set_default);
 int led_trigger_register(struct led_trigger *trigger)
 {
        struct led_classdev *led_cdev;
+       struct led_trigger *trig;
 
        rwlock_init(&trigger->leddev_list_lock);
        INIT_LIST_HEAD(&trigger->led_cdevs);
 
-       /* Add to the list of led triggers */
        down_write(&triggers_list_lock);
+       /* Make sure the trigger's name isn't already in use */
+       list_for_each_entry(trig, &trigger_list, next_trig) {
+               if (!strcmp(trig->name, trigger->name)) {
+                       up_write(&triggers_list_lock);
+                       return -EEXIST;
+               }
+       }
+       /* Add to the list of led triggers */
        list_add_tail(&trigger->next_trig, &trigger_list);
        up_write(&triggers_list_lock);
 
diff --git a/drivers/leds/leds-bd2802.c b/drivers/leds/leds-bd2802.c
new file mode 100644 (file)
index 0000000..4149ecb
--- /dev/null
@@ -0,0 +1,765 @@
+/*
+ * leds-bd2802.c - RGB LED Driver
+ *
+ * Copyright (C) 2009 Samsung Electronics
+ * Kim Kyuwon <q1.kim@samsung.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.
+ *
+ * Datasheet: http://www.rohm.com/products/databook/driver/pdf/bd2802gu-e.pdf
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/gpio.h>
+#include <linux/delay.h>
+#include <linux/leds.h>
+#include <linux/leds-bd2802.h>
+
+
+#define LED_CTL(rgb2en, rgb1en) ((rgb2en) << 4 | ((rgb1en) << 0))
+
+#define BD2802_LED_OFFSET              0xa
+#define BD2802_COLOR_OFFSET            0x3
+
+#define BD2802_REG_CLKSETUP            0x00
+#define BD2802_REG_CONTROL             0x01
+#define BD2802_REG_HOURSETUP           0x02
+#define BD2802_REG_CURRENT1SETUP       0x03
+#define BD2802_REG_CURRENT2SETUP       0x04
+#define BD2802_REG_WAVEPATTERN         0x05
+
+#define BD2802_CURRENT_032             0x10 /* 3.2mA */
+#define BD2802_CURRENT_000             0x00 /* 0.0mA */
+
+#define BD2802_PATTERN_FULL            0x07
+#define BD2802_PATTERN_HALF            0x03
+
+enum led_ids {
+       LED1,
+       LED2,
+       LED_NUM,
+};
+
+enum led_colors {
+       RED,
+       GREEN,
+       BLUE,
+};
+
+enum led_bits {
+       BD2802_OFF,
+       BD2802_BLINK,
+       BD2802_ON,
+};
+
+/*
+ * State '0' : 'off'
+ * State '1' : 'blink'
+ * State '2' : 'on'.
+ */
+struct led_state {
+       unsigned r:2;
+       unsigned g:2;
+       unsigned b:2;
+};
+
+struct bd2802_led {
+       struct bd2802_led_platform_data *pdata;
+       struct i2c_client               *client;
+       struct rw_semaphore             rwsem;
+       struct work_struct              work;
+
+       struct led_state                led[2];
+
+       /*
+        * Making led_classdev as array is not recommended, because array
+        * members prevent using 'container_of' macro. So repetitive works
+        * are needed.
+        */
+       struct led_classdev             cdev_led1r;
+       struct led_classdev             cdev_led1g;
+       struct led_classdev             cdev_led1b;
+       struct led_classdev             cdev_led2r;
+       struct led_classdev             cdev_led2g;
+       struct led_classdev             cdev_led2b;
+
+       /*
+        * Advanced Configuration Function(ADF) mode:
+        * In ADF mode, user can set registers of BD2802GU directly,
+        * therefore BD2802GU doesn't enter reset state.
+        */
+       int                             adf_on;
+
+       enum led_ids                    led_id;
+       enum led_colors                 color;
+       enum led_bits                   state;
+};
+
+
+/*--------------------------------------------------------------*/
+/*     BD2802GU helper functions                                       */
+/*--------------------------------------------------------------*/
+
+static inline int bd2802_is_rgb_off(struct bd2802_led *led, enum led_ids id,
+                                                       enum led_colors color)
+{
+       switch (color) {
+       case RED:
+               return !led->led[id].r;
+       case GREEN:
+               return !led->led[id].g;
+       case BLUE:
+               return !led->led[id].b;
+       default:
+               dev_err(&led->client->dev, "%s: Invalid color\n", __func__);
+               return -EINVAL;
+       }
+}
+
+static inline int bd2802_is_led_off(struct bd2802_led *led, enum led_ids id)
+{
+       if (led->led[id].r || led->led[id].g || led->led[id].b)
+               return 0;
+
+       return 1;
+}
+
+static inline int bd2802_is_all_off(struct bd2802_led *led)
+{
+       int i;
+
+       for (i = 0; i < LED_NUM; i++)
+               if (!bd2802_is_led_off(led, i))
+                       return 0;
+
+       return 1;
+}
+
+static inline u8 bd2802_get_base_offset(enum led_ids id, enum led_colors color)
+{
+       return id * BD2802_LED_OFFSET + color * BD2802_COLOR_OFFSET;
+}
+
+static inline u8 bd2802_get_reg_addr(enum led_ids id, enum led_colors color,
+                                                               u8 reg_offset)
+{
+       return reg_offset + bd2802_get_base_offset(id, color);
+}
+
+
+/*--------------------------------------------------------------*/
+/*     BD2802GU core functions                                 */
+/*--------------------------------------------------------------*/
+
+static int bd2802_write_byte(struct i2c_client *client, u8 reg, u8 val)
+{
+       int ret = i2c_smbus_write_byte_data(client, reg, val);
+       if (ret >= 0)
+               return 0;
+
+       dev_err(&client->dev, "%s: reg 0x%x, val 0x%x, err %d\n",
+                                               __func__, reg, val, ret);
+
+       return ret;
+}
+
+static void bd2802_update_state(struct bd2802_led *led, enum led_ids id,
+                               enum led_colors color, enum led_bits led_bit)
+{
+       int i;
+       u8 value;
+
+       for (i = 0; i < LED_NUM; i++) {
+               if (i == id) {
+                       switch (color) {
+                       case RED:
+                               led->led[i].r = led_bit;
+                               break;
+                       case GREEN:
+                               led->led[i].g = led_bit;
+                               break;
+                       case BLUE:
+                               led->led[i].b = led_bit;
+                               break;
+                       default:
+                               dev_err(&led->client->dev,
+                                       "%s: Invalid color\n", __func__);
+                               return;
+                       }
+               }
+       }
+
+       if (led_bit == BD2802_BLINK || led_bit == BD2802_ON)
+               return;
+
+       if (!bd2802_is_led_off(led, id))
+               return;
+
+       if (bd2802_is_all_off(led) && !led->adf_on) {
+               gpio_set_value(led->pdata->reset_gpio, 0);
+               return;
+       }
+
+       /*
+        * In this case, other led is turned on, and current led is turned
+        * off. So set RGB LED Control register to stop the current RGB LED
+        */
+       value = (id == LED1) ? LED_CTL(1, 0) : LED_CTL(0, 1);
+       bd2802_write_byte(led->client, BD2802_REG_CONTROL, value);
+}
+
+static void bd2802_configure(struct bd2802_led *led)
+{
+       struct bd2802_led_platform_data *pdata = led->pdata;
+       u8 reg;
+
+       reg = bd2802_get_reg_addr(LED1, RED, BD2802_REG_HOURSETUP);
+       bd2802_write_byte(led->client, reg, pdata->rgb_time);
+
+       reg = bd2802_get_reg_addr(LED2, RED, BD2802_REG_HOURSETUP);
+       bd2802_write_byte(led->client, reg, pdata->rgb_time);
+}
+
+static void bd2802_reset_cancel(struct bd2802_led *led)
+{
+       gpio_set_value(led->pdata->reset_gpio, 1);
+       udelay(100);
+       bd2802_configure(led);
+}
+
+static void bd2802_enable(struct bd2802_led *led, enum led_ids id)
+{
+       enum led_ids other_led = (id == LED1) ? LED2 : LED1;
+       u8 value, other_led_on;
+
+       other_led_on = !bd2802_is_led_off(led, other_led);
+       if (id == LED1)
+               value = LED_CTL(other_led_on, 1);
+       else
+               value = LED_CTL(1 , other_led_on);
+
+       bd2802_write_byte(led->client, BD2802_REG_CONTROL, value);
+}
+
+static void bd2802_set_on(struct bd2802_led *led, enum led_ids id,
+                                                       enum led_colors color)
+{
+       u8 reg;
+
+       if (bd2802_is_all_off(led) && !led->adf_on)
+               bd2802_reset_cancel(led);
+
+       reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT1SETUP);
+       bd2802_write_byte(led->client, reg, BD2802_CURRENT_032);
+       reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT2SETUP);
+       bd2802_write_byte(led->client, reg, BD2802_CURRENT_000);
+       reg = bd2802_get_reg_addr(id, color, BD2802_REG_WAVEPATTERN);
+       bd2802_write_byte(led->client, reg, BD2802_PATTERN_FULL);
+
+       bd2802_enable(led, id);
+       bd2802_update_state(led, id, color, BD2802_ON);
+}
+
+static void bd2802_set_blink(struct bd2802_led *led, enum led_ids id,
+                                                       enum led_colors color)
+{
+       u8 reg;
+
+       if (bd2802_is_all_off(led) && !led->adf_on)
+               bd2802_reset_cancel(led);
+
+       reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT1SETUP);
+       bd2802_write_byte(led->client, reg, BD2802_CURRENT_000);
+       reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT2SETUP);
+       bd2802_write_byte(led->client, reg, BD2802_CURRENT_032);
+       reg = bd2802_get_reg_addr(id, color, BD2802_REG_WAVEPATTERN);
+       bd2802_write_byte(led->client, reg, BD2802_PATTERN_HALF);
+
+       bd2802_enable(led, id);
+       bd2802_update_state(led, id, color, BD2802_BLINK);
+}
+
+static void bd2802_turn_on(struct bd2802_led *led, enum led_ids id,
+                               enum led_colors color, enum led_bits led_bit)
+{
+       if (led_bit == BD2802_OFF) {
+               dev_err(&led->client->dev,
+                                       "Only 'blink' and 'on' are allowed\n");
+               return;
+       }
+
+       if (led_bit == BD2802_BLINK)
+               bd2802_set_blink(led, id, color);
+       else
+               bd2802_set_on(led, id, color);
+}
+
+static void bd2802_turn_off(struct bd2802_led *led, enum led_ids id,
+                                                       enum led_colors color)
+{
+       u8 reg;
+
+       if (bd2802_is_rgb_off(led, id, color))
+               return;
+
+       reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT1SETUP);
+       bd2802_write_byte(led->client, reg, BD2802_CURRENT_000);
+       reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT2SETUP);
+       bd2802_write_byte(led->client, reg, BD2802_CURRENT_000);
+
+       bd2802_update_state(led, id, color, BD2802_OFF);
+}
+
+static void bd2802_restore_state(struct bd2802_led *led)
+{
+       int i;
+
+       for (i = 0; i < LED_NUM; i++) {
+               if (led->led[i].r)
+                       bd2802_turn_on(led, i, RED, led->led[i].r);
+               if (led->led[i].g)
+                       bd2802_turn_on(led, i, GREEN, led->led[i].g);
+               if (led->led[i].b)
+                       bd2802_turn_on(led, i, BLUE, led->led[i].b);
+       }
+}
+
+#define BD2802_SET_REGISTER(reg_addr, reg_name)                                \
+static ssize_t bd2802_store_reg##reg_addr(struct device *dev,          \
+       struct device_attribute *attr, const char *buf, size_t count)   \
+{                                                                      \
+       struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));\
+       unsigned long val;                                              \
+       int ret;                                                        \
+       if (!count)                                                     \
+               return -EINVAL;                                         \
+       ret = strict_strtoul(buf, 16, &val);                            \
+       if (ret)                                                        \
+               return ret;                                             \
+       down_write(&led->rwsem);                                        \
+       bd2802_write_byte(led->client, reg_addr, (u8) val);             \
+       up_write(&led->rwsem);                                          \
+       return count;                                                   \
+}                                                                      \
+static struct device_attribute bd2802_reg##reg_addr##_attr = {         \
+       .attr = {.name = reg_name, .mode = 0644, .owner = THIS_MODULE}, \
+       .store = bd2802_store_reg##reg_addr,                            \
+};
+
+BD2802_SET_REGISTER(0x00, "0x00");
+BD2802_SET_REGISTER(0x01, "0x01");
+BD2802_SET_REGISTER(0x02, "0x02");
+BD2802_SET_REGISTER(0x03, "0x03");
+BD2802_SET_REGISTER(0x04, "0x04");
+BD2802_SET_REGISTER(0x05, "0x05");
+BD2802_SET_REGISTER(0x06, "0x06");
+BD2802_SET_REGISTER(0x07, "0x07");
+BD2802_SET_REGISTER(0x08, "0x08");
+BD2802_SET_REGISTER(0x09, "0x09");
+BD2802_SET_REGISTER(0x0a, "0x0a");
+BD2802_SET_REGISTER(0x0b, "0x0b");
+BD2802_SET_REGISTER(0x0c, "0x0c");
+BD2802_SET_REGISTER(0x0d, "0x0d");
+BD2802_SET_REGISTER(0x0e, "0x0e");
+BD2802_SET_REGISTER(0x0f, "0x0f");
+BD2802_SET_REGISTER(0x10, "0x10");
+BD2802_SET_REGISTER(0x11, "0x11");
+BD2802_SET_REGISTER(0x12, "0x12");
+BD2802_SET_REGISTER(0x13, "0x13");
+BD2802_SET_REGISTER(0x14, "0x14");
+BD2802_SET_REGISTER(0x15, "0x15");
+
+static struct device_attribute *bd2802_addr_attributes[] = {
+       &bd2802_reg0x00_attr,
+       &bd2802_reg0x01_attr,
+       &bd2802_reg0x02_attr,
+       &bd2802_reg0x03_attr,
+       &bd2802_reg0x04_attr,
+       &bd2802_reg0x05_attr,
+       &bd2802_reg0x06_attr,
+       &bd2802_reg0x07_attr,
+       &bd2802_reg0x08_attr,
+       &bd2802_reg0x09_attr,
+       &bd2802_reg0x0a_attr,
+       &bd2802_reg0x0b_attr,
+       &bd2802_reg0x0c_attr,
+       &bd2802_reg0x0d_attr,
+       &bd2802_reg0x0e_attr,
+       &bd2802_reg0x0f_attr,
+       &bd2802_reg0x10_attr,
+       &bd2802_reg0x11_attr,
+       &bd2802_reg0x12_attr,
+       &bd2802_reg0x13_attr,
+       &bd2802_reg0x14_attr,
+       &bd2802_reg0x15_attr,
+};
+
+static void bd2802_enable_adv_conf(struct bd2802_led *led)
+{
+       int i, ret;
+
+       for (i = 0; i < ARRAY_SIZE(bd2802_addr_attributes); i++) {
+               ret = device_create_file(&led->client->dev,
+                                               bd2802_addr_attributes[i]);
+               if (ret) {
+                       dev_err(&led->client->dev, "failed to sysfs file %s\n",
+                                       bd2802_addr_attributes[i]->attr.name);
+                       goto failed_remove_files;
+               }
+       }
+
+       if (bd2802_is_all_off(led))
+               bd2802_reset_cancel(led);
+
+       led->adf_on = 1;
+
+       return;
+
+failed_remove_files:
+       for (i--; i >= 0; i--)
+               device_remove_file(&led->client->dev,
+                                               bd2802_addr_attributes[i]);
+}
+
+static void bd2802_disable_adv_conf(struct bd2802_led *led)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(bd2802_addr_attributes); i++)
+               device_remove_file(&led->client->dev,
+                                               bd2802_addr_attributes[i]);
+
+       if (bd2802_is_all_off(led))
+               gpio_set_value(led->pdata->reset_gpio, 0);
+
+       led->adf_on = 0;
+}
+
+static ssize_t bd2802_show_adv_conf(struct device *dev,
+       struct device_attribute *attr, char *buf)
+{
+       struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));
+       ssize_t ret;
+
+       down_read(&led->rwsem);
+       if (led->adf_on)
+               ret = sprintf(buf, "on\n");
+       else
+               ret = sprintf(buf, "off\n");
+       up_read(&led->rwsem);
+
+       return ret;
+}
+
+static ssize_t bd2802_store_adv_conf(struct device *dev,
+       struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));
+
+       if (!count)
+               return -EINVAL;
+
+       down_write(&led->rwsem);
+       if (!led->adf_on && !strncmp(buf, "on", 2))
+               bd2802_enable_adv_conf(led);
+       else if (led->adf_on && !strncmp(buf, "off", 3))
+               bd2802_disable_adv_conf(led);
+       up_write(&led->rwsem);
+
+       return count;
+}
+
+static struct device_attribute bd2802_adv_conf_attr = {
+       .attr = {
+               .name = "advanced_configuration",
+               .mode = 0644,
+               .owner = THIS_MODULE
+       },
+       .show = bd2802_show_adv_conf,
+       .store = bd2802_store_adv_conf,
+};
+
+static void bd2802_led_work(struct work_struct *work)
+{
+       struct bd2802_led *led = container_of(work, struct bd2802_led, work);
+
+       if (led->state)
+               bd2802_turn_on(led, led->led_id, led->color, led->state);
+       else
+               bd2802_turn_off(led, led->led_id, led->color);
+}
+
+#define BD2802_CONTROL_RGBS(name, id, clr)                             \
+static void bd2802_set_##name##_brightness(struct led_classdev *led_cdev,\
+                                       enum led_brightness value)      \
+{                                                                      \
+       struct bd2802_led *led =                                        \
+               container_of(led_cdev, struct bd2802_led, cdev_##name); \
+       led->led_id = id;                                               \
+       led->color = clr;                                               \
+       if (value == LED_OFF)                                           \
+               led->state = BD2802_OFF;                                \
+       else                                                            \
+               led->state = BD2802_ON;                                 \
+       schedule_work(&led->work);                                      \
+}                                                                      \
+static int bd2802_set_##name##_blink(struct led_classdev *led_cdev,    \
+               unsigned long *delay_on, unsigned long *delay_off)      \
+{                                                                      \
+       struct bd2802_led *led =                                        \
+               container_of(led_cdev, struct bd2802_led, cdev_##name); \
+       if (*delay_on == 0 || *delay_off == 0)                          \
+               return -EINVAL;                                         \
+       led->led_id = id;                                               \
+       led->color = clr;                                               \
+       led->state = BD2802_BLINK;                                      \
+       schedule_work(&led->work);                                      \
+       return 0;                                                       \
+}
+
+BD2802_CONTROL_RGBS(led1r, LED1, RED);
+BD2802_CONTROL_RGBS(led1g, LED1, GREEN);
+BD2802_CONTROL_RGBS(led1b, LED1, BLUE);
+BD2802_CONTROL_RGBS(led2r, LED2, RED);
+BD2802_CONTROL_RGBS(led2g, LED2, GREEN);
+BD2802_CONTROL_RGBS(led2b, LED2, BLUE);
+
+static int bd2802_register_led_classdev(struct bd2802_led *led)
+{
+       int ret;
+
+       INIT_WORK(&led->work, bd2802_led_work);
+
+       led->cdev_led1r.name = "led1_R";
+       led->cdev_led1r.brightness = LED_OFF;
+       led->cdev_led1r.brightness_set = bd2802_set_led1r_brightness;
+       led->cdev_led1r.blink_set = bd2802_set_led1r_blink;
+       led->cdev_led1r.flags |= LED_CORE_SUSPENDRESUME;
+
+       ret = led_classdev_register(&led->client->dev, &led->cdev_led1r);
+       if (ret < 0) {
+               dev_err(&led->client->dev, "couldn't register LED %s\n",
+                                                       led->cdev_led1r.name);
+               goto failed_unregister_led1_R;
+       }
+
+       led->cdev_led1g.name = "led1_G";
+       led->cdev_led1g.brightness = LED_OFF;
+       led->cdev_led1g.brightness_set = bd2802_set_led1g_brightness;
+       led->cdev_led1g.blink_set = bd2802_set_led1g_blink;
+       led->cdev_led1g.flags |= LED_CORE_SUSPENDRESUME;
+
+       ret = led_classdev_register(&led->client->dev, &led->cdev_led1g);
+       if (ret < 0) {
+               dev_err(&led->client->dev, "couldn't register LED %s\n",
+                                                       led->cdev_led1g.name);
+               goto failed_unregister_led1_G;
+       }
+
+       led->cdev_led1b.name = "led1_B";
+       led->cdev_led1b.brightness = LED_OFF;
+       led->cdev_led1b.brightness_set = bd2802_set_led1b_brightness;
+       led->cdev_led1b.blink_set = bd2802_set_led1b_blink;
+       led->cdev_led1b.flags |= LED_CORE_SUSPENDRESUME;
+
+       ret = led_classdev_register(&led->client->dev, &led->cdev_led1b);
+       if (ret < 0) {
+               dev_err(&led->client->dev, "couldn't register LED %s\n",
+                                                       led->cdev_led1b.name);
+               goto failed_unregister_led1_B;
+       }
+
+       led->cdev_led2r.name = "led2_R";
+       led->cdev_led2r.brightness = LED_OFF;
+       led->cdev_led2r.brightness_set = bd2802_set_led2r_brightness;
+       led->cdev_led2r.blink_set = bd2802_set_led2r_blink;
+       led->cdev_led2r.flags |= LED_CORE_SUSPENDRESUME;
+
+       ret = led_classdev_register(&led->client->dev, &led->cdev_led2r);
+       if (ret < 0) {
+               dev_err(&led->client->dev, "couldn't register LED %s\n",
+                                                       led->cdev_led2r.name);
+               goto failed_unregister_led2_R;
+       }
+
+       led->cdev_led2g.name = "led2_G";
+       led->cdev_led2g.brightness = LED_OFF;
+       led->cdev_led2g.brightness_set = bd2802_set_led2g_brightness;
+       led->cdev_led2g.blink_set = bd2802_set_led2g_blink;
+       led->cdev_led2g.flags |= LED_CORE_SUSPENDRESUME;
+
+       ret = led_classdev_register(&led->client->dev, &led->cdev_led2g);
+       if (ret < 0) {
+               dev_err(&led->client->dev, "couldn't register LED %s\n",
+                                                       led->cdev_led2g.name);
+               goto failed_unregister_led2_G;
+       }
+
+       led->cdev_led2b.name = "led2_B";
+       led->cdev_led2b.brightness = LED_OFF;
+       led->cdev_led2b.brightness_set = bd2802_set_led2b_brightness;
+       led->cdev_led2b.blink_set = bd2802_set_led2b_blink;
+       led->cdev_led2b.flags |= LED_CORE_SUSPENDRESUME;
+
+       ret = led_classdev_register(&led->client->dev, &led->cdev_led2b);
+       if (ret < 0) {
+               dev_err(&led->client->dev, "couldn't register LED %s\n",
+                                                       led->cdev_led2b.name);
+               goto failed_unregister_led2_B;
+       }
+
+       return 0;
+
+failed_unregister_led2_B:
+       led_classdev_unregister(&led->cdev_led2g);
+failed_unregister_led2_G:
+       led_classdev_unregister(&led->cdev_led2r);
+failed_unregister_led2_R:
+       led_classdev_unregister(&led->cdev_led1b);
+failed_unregister_led1_B:
+       led_classdev_unregister(&led->cdev_led1g);
+failed_unregister_led1_G:
+       led_classdev_unregister(&led->cdev_led1r);
+failed_unregister_led1_R:
+
+       return ret;
+}
+
+static void bd2802_unregister_led_classdev(struct bd2802_led *led)
+{
+       cancel_work_sync(&led->work);
+       led_classdev_unregister(&led->cdev_led1r);
+}
+
+static int __devinit bd2802_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id)
+{
+       struct bd2802_led *led;
+       struct bd2802_led_platform_data *pdata;
+       int ret;
+
+       led = kzalloc(sizeof(struct bd2802_led), GFP_KERNEL);
+       if (!led) {
+               dev_err(&client->dev, "failed to allocate driver data\n");
+               return -ENOMEM;
+       }
+
+       led->client = client;
+       pdata = led->pdata = client->dev.platform_data;
+       i2c_set_clientdata(client, led);
+
+       /* Configure RESET GPIO (L: RESET, H: RESET cancel) */
+       gpio_request(pdata->reset_gpio, "RGB_RESETB");
+       gpio_direction_output(pdata->reset_gpio, 1);
+
+       /* Tacss = min 0.1ms */
+       udelay(100);
+
+       /* Detect BD2802GU */
+       ret = bd2802_write_byte(client, BD2802_REG_CLKSETUP, 0x00);
+       if (ret < 0) {
+               dev_err(&client->dev, "failed to detect device\n");
+               goto failed_free;
+       } else
+               dev_info(&client->dev, "return 0x%02x\n", ret);
+
+       /* To save the power, reset BD2802 after detecting */
+       gpio_set_value(led->pdata->reset_gpio, 0);
+
+       init_rwsem(&led->rwsem);
+
+       ret = device_create_file(&client->dev, &bd2802_adv_conf_attr);
+       if (ret) {
+               dev_err(&client->dev, "failed to create sysfs file %s\n",
+                                       bd2802_adv_conf_attr.attr.name);
+               goto failed_free;
+       }
+
+       ret = bd2802_register_led_classdev(led);
+       if (ret < 0)
+               goto failed_unregister_dev_file;
+
+       return 0;
+
+failed_unregister_dev_file:
+       device_remove_file(&client->dev, &bd2802_adv_conf_attr);
+failed_free:
+       i2c_set_clientdata(client, NULL);
+       kfree(led);
+
+       return ret;
+}
+
+static int __exit bd2802_remove(struct i2c_client *client)
+{
+       struct bd2802_led *led = i2c_get_clientdata(client);
+
+       bd2802_unregister_led_classdev(led);
+       gpio_set_value(led->pdata->reset_gpio, 0);
+       if (led->adf_on)
+               bd2802_disable_adv_conf(led);
+       device_remove_file(&client->dev, &bd2802_adv_conf_attr);
+       i2c_set_clientdata(client, NULL);
+       kfree(led);
+
+       return 0;
+}
+
+static int bd2802_suspend(struct i2c_client *client, pm_message_t mesg)
+{
+       struct bd2802_led *led = i2c_get_clientdata(client);
+
+       gpio_set_value(led->pdata->reset_gpio, 0);
+
+       return 0;
+}
+
+static int bd2802_resume(struct i2c_client *client)
+{
+       struct bd2802_led *led = i2c_get_clientdata(client);
+
+       if (!bd2802_is_all_off(led) || led->adf_on) {
+               gpio_set_value(led->pdata->reset_gpio, 1);
+               udelay(100);
+               bd2802_restore_state(led);
+       }
+
+       return 0;
+}
+
+static const struct i2c_device_id bd2802_id[] = {
+       { "BD2802", 0 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, bd2802_id);
+
+static struct i2c_driver bd2802_i2c_driver = {
+       .driver = {
+               .name   = "BD2802",
+       },
+       .probe          = bd2802_probe,
+       .remove         = __exit_p(bd2802_remove),
+       .suspend        = bd2802_suspend,
+       .resume         = bd2802_resume,
+       .id_table       = bd2802_id,
+};
+
+static int __init bd2802_init(void)
+{
+       return i2c_add_driver(&bd2802_i2c_driver);
+}
+module_init(bd2802_init);
+
+static void __exit bd2802_exit(void)
+{
+       i2c_del_driver(&bd2802_i2c_driver);
+}
+module_exit(bd2802_exit);
+
+MODULE_AUTHOR("Kim Kyuwon <q1.kim@samsung.com>");
+MODULE_DESCRIPTION("BD2802 LED driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/leds/leds-dac124s085.c b/drivers/leds/leds-dac124s085.c
new file mode 100644 (file)
index 0000000..098d9aa
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2008
+ * Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de>
+ *
+ * This file is subject to the terms and conditions of version 2 of
+ * the GNU General Public License.  See the file COPYING in the main
+ * directory of this archive for more details.
+ *
+ * LED driver for the DAC124S085 SPI DAC
+ */
+
+#include <linux/gfp.h>
+#include <linux/leds.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/workqueue.h>
+#include <linux/spi/spi.h>
+
+struct dac124s085_led {
+       struct led_classdev     ldev;
+       struct spi_device       *spi;
+       int                     id;
+       int                     brightness;
+       char                    name[sizeof("dac124s085-3")];
+
+       struct mutex            mutex;
+       struct work_struct      work;
+       spinlock_t              lock;
+};
+
+struct dac124s085 {
+       struct dac124s085_led leds[4];
+};
+
+#define REG_WRITE              (0 << 12)
+#define REG_WRITE_UPDATE       (1 << 12)
+#define ALL_WRITE_UPDATE       (2 << 12)
+#define POWER_DOWN_OUTPUT      (3 << 12)
+
+static void dac124s085_led_work(struct work_struct *work)
+{
+       struct dac124s085_led *led = container_of(work, struct dac124s085_led,
+                                                 work);
+       u16 word;
+
+       mutex_lock(&led->mutex);
+       word = cpu_to_le16(((led->id) << 14) | REG_WRITE_UPDATE |
+                          (led->brightness & 0xfff));
+       spi_write(led->spi, (const u8 *)&word, sizeof(word));
+       mutex_unlock(&led->mutex);
+}
+
+static void dac124s085_set_brightness(struct led_classdev *ldev,
+                                     enum led_brightness brightness)
+{
+       struct dac124s085_led *led = container_of(ldev, struct dac124s085_led,
+                                                 ldev);
+
+       spin_lock(&led->lock);
+       led->brightness = brightness;
+       schedule_work(&led->work);
+       spin_unlock(&led->lock);
+}
+
+static int dac124s085_probe(struct spi_device *spi)
+{
+       struct dac124s085       *dac;
+       struct dac124s085_led   *led;
+       int i, ret;
+
+       dac = kzalloc(sizeof(*dac), GFP_KERNEL);
+       if (!dac)
+               return -ENOMEM;
+
+       spi->bits_per_word = 16;
+
+       for (i = 0; i < ARRAY_SIZE(dac->leds); i++) {
+               led             = dac->leds + i;
+               led->id         = i;
+               led->brightness = LED_OFF;
+               led->spi        = spi;
+               snprintf(led->name, sizeof(led->name), "dac124s085-%d", i);
+               spin_lock_init(&led->lock);
+               INIT_WORK(&led->work, dac124s085_led_work);
+               mutex_init(&led->mutex);
+               led->ldev.name = led->name;
+               led->ldev.brightness = LED_OFF;
+               led->ldev.max_brightness = 0xfff;
+               led->ldev.brightness_set = dac124s085_set_brightness;
+               ret = led_classdev_register(&spi->dev, &led->ldev);
+               if (ret < 0)
+                       goto eledcr;
+       }
+
+       spi_set_drvdata(spi, dac);
+
+       return 0;
+
+eledcr:
+       while (i--)
+               led_classdev_unregister(&dac->leds[i].ldev);
+
+       spi_set_drvdata(spi, NULL);
+       kfree(dac);
+       return ret;
+}
+
+static int dac124s085_remove(struct spi_device *spi)
+{
+       struct dac124s085       *dac = spi_get_drvdata(spi);
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(dac->leds); i++) {
+               led_classdev_unregister(&dac->leds[i].ldev);
+               cancel_work_sync(&dac->leds[i].work);
+       }
+
+       spi_set_drvdata(spi, NULL);
+       kfree(dac);
+
+       return 0;
+}
+
+static struct spi_driver dac124s085_driver = {
+       .probe          = dac124s085_probe,
+       .remove         = dac124s085_remove,
+       .driver = {
+               .name   = "dac124s085",
+               .owner  = THIS_MODULE,
+       },
+};
+
+static int __init dac124s085_leds_init(void)
+{
+       return spi_register_driver(&dac124s085_driver);
+}
+
+static void __exit dac124s085_leds_exit(void)
+{
+       spi_unregister_driver(&dac124s085_driver);
+}
+
+module_init(dac124s085_leds_init);
+module_exit(dac124s085_leds_exit);
+
+MODULE_AUTHOR("Guennadi Liakhovetski <lg@denx.de>");
+MODULE_DESCRIPTION("DAC124S085 LED driver");
+MODULE_LICENSE("GPL v2");
index 2e3df08b649b6c2a3a2dd83b62233bc3505a1459..102ef4a14c5fea075c40226b3914cffe61f8b2d0 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2007 8D Technologies inc.
  * Raphael Assenat <raph@8d.com>
+ * Copyright (C) 2008 Freescale Semiconductor, Inc.
  *
  * 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
@@ -71,11 +72,67 @@ static int gpio_blink_set(struct led_classdev *led_cdev,
        return led_dat->platform_gpio_blink_set(led_dat->gpio, delay_on, delay_off);
 }
 
+static int __devinit create_gpio_led(const struct gpio_led *template,
+       struct gpio_led_data *led_dat, struct device *parent,
+       int (*blink_set)(unsigned, unsigned long *, unsigned long *))
+{
+       int ret;
+
+       /* skip leds that aren't available */
+       if (!gpio_is_valid(template->gpio)) {
+               printk(KERN_INFO "Skipping unavilable LED gpio %d (%s)\n", 
+                               template->gpio, template->name);
+               return;
+       }
+
+       ret = gpio_request(template->gpio, template->name);
+       if (ret < 0)
+               return ret;
+
+       led_dat->cdev.name = template->name;
+       led_dat->cdev.default_trigger = template->default_trigger;
+       led_dat->gpio = template->gpio;
+       led_dat->can_sleep = gpio_cansleep(template->gpio);
+       led_dat->active_low = template->active_low;
+       if (blink_set) {
+               led_dat->platform_gpio_blink_set = blink_set;
+               led_dat->cdev.blink_set = gpio_blink_set;
+       }
+       led_dat->cdev.brightness_set = gpio_led_set;
+       led_dat->cdev.brightness = LED_OFF;
+       if (!template->retain_state_suspended)
+               led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
+
+       ret = gpio_direction_output(led_dat->gpio, led_dat->active_low);
+       if (ret < 0)
+               goto err;
+
+       INIT_WORK(&led_dat->work, gpio_led_work);
+
+       ret = led_classdev_register(parent, &led_dat->cdev);
+       if (ret < 0)
+               goto err;
+
+       return 0;
+err:
+       gpio_free(led_dat->gpio);
+       return ret;
+}
+
+static void delete_gpio_led(struct gpio_led_data *led)
+{
+       if (!gpio_is_valid(led->gpio))
+               return;
+       led_classdev_unregister(&led->cdev);
+       cancel_work_sync(&led->work);
+       gpio_free(led->gpio);
+}
+
+#ifdef CONFIG_LEDS_GPIO_PLATFORM
 static int gpio_led_probe(struct platform_device *pdev)
 {
        struct gpio_led_platform_data *pdata = pdev->dev.platform_data;
-       struct gpio_led *cur_led;
-       struct gpio_led_data *leds_data, *led_dat;
+       struct gpio_led_data *leds_data;
        int i, ret = 0;
 
        if (!pdata)
@@ -87,35 +144,10 @@ static int gpio_led_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        for (i = 0; i < pdata->num_leds; i++) {
-               cur_led = &pdata->leds[i];
-               led_dat = &leds_data[i];
-
-               ret = gpio_request(cur_led->gpio, cur_led->name);
+               ret = create_gpio_led(&pdata->leds[i], &leds_data[i],
+                                     &pdev->dev, pdata->gpio_blink_set);
                if (ret < 0)
                        goto err;
-
-               led_dat->cdev.name = cur_led->name;
-               led_dat->cdev.default_trigger = cur_led->default_trigger;
-               led_dat->gpio = cur_led->gpio;
-               led_dat->can_sleep = gpio_cansleep(cur_led->gpio);
-               led_dat->active_low = cur_led->active_low;
-               if (pdata->gpio_blink_set) {
-                       led_dat->platform_gpio_blink_set = pdata->gpio_blink_set;
-                       led_dat->cdev.blink_set = gpio_blink_set;
-               }
-               led_dat->cdev.brightness_set = gpio_led_set;
-               led_dat->cdev.brightness = LED_OFF;
-               led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
-
-               gpio_direction_output(led_dat->gpio, led_dat->active_low);
-
-               INIT_WORK(&led_dat->work, gpio_led_work);
-
-               ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
-               if (ret < 0) {
-                       gpio_free(led_dat->gpio);
-                       goto err;
-               }
        }
 
        platform_set_drvdata(pdev, leds_data);
@@ -123,13 +155,8 @@ static int gpio_led_probe(struct platform_device *pdev)
        return 0;
 
 err:
-       if (i > 0) {
-               for (i = i - 1; i >= 0; i--) {
-                       led_classdev_unregister(&leds_data[i].cdev);
-                       cancel_work_sync(&leds_data[i].work);
-                       gpio_free(leds_data[i].gpio);
-               }
-       }
+       for (i = i - 1; i >= 0; i--)
+               delete_gpio_led(&leds_data[i]);
 
        kfree(leds_data);
 
@@ -144,11 +171,8 @@ static int __devexit gpio_led_remove(struct platform_device *pdev)
 
        leds_data = platform_get_drvdata(pdev);
 
-       for (i = 0; i < pdata->num_leds; i++) {
-               led_classdev_unregister(&leds_data[i].cdev);
-               cancel_work_sync(&leds_data[i].work);
-               gpio_free(leds_data[i].gpio);
-       }
+       for (i = 0; i < pdata->num_leds; i++)
+               delete_gpio_led(&leds_data[i]);
 
        kfree(leds_data);
 
@@ -164,20 +188,133 @@ static struct platform_driver gpio_led_driver = {
        },
 };
 
+MODULE_ALIAS("platform:leds-gpio");
+#endif /* CONFIG_LEDS_GPIO_PLATFORM */
+
+/* Code to create from OpenFirmware platform devices */
+#ifdef CONFIG_LEDS_GPIO_OF
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>
+
+struct gpio_led_of_platform_data {
+       int num_leds;
+       struct gpio_led_data led_data[];
+};
+
+static int __devinit of_gpio_leds_probe(struct of_device *ofdev,
+                                       const struct of_device_id *match)
+{
+       struct device_node *np = ofdev->node, *child;
+       struct gpio_led led;
+       struct gpio_led_of_platform_data *pdata;
+       int count = 0, ret;
+
+       /* count LEDs defined by this device, so we know how much to allocate */
+       for_each_child_of_node(np, child)
+               count++;
+       if (!count)
+               return 0; /* or ENODEV? */
+
+       pdata = kzalloc(sizeof(*pdata) + sizeof(struct gpio_led_data) * count,
+                       GFP_KERNEL);
+       if (!pdata)
+               return -ENOMEM;
+
+       memset(&led, 0, sizeof(led));
+       for_each_child_of_node(np, child) {
+               enum of_gpio_flags flags;
+
+               led.gpio = of_get_gpio_flags(child, 0, &flags);
+               led.active_low = flags & OF_GPIO_ACTIVE_LOW;
+               led.name = of_get_property(child, "label", NULL) ? : child->name;
+               led.default_trigger =
+                       of_get_property(child, "linux,default-trigger", NULL);
+
+               ret = create_gpio_led(&led, &pdata->led_data[pdata->num_leds++],
+                                     &ofdev->dev, NULL);
+               if (ret < 0) {
+                       of_node_put(child);
+                       goto err;
+               }
+       }
+
+       dev_set_drvdata(&ofdev->dev, pdata);
+
+       return 0;
+
+err:
+       for (count = pdata->num_leds - 2; count >= 0; count--)
+               delete_gpio_led(&pdata->led_data[count]);
+
+       kfree(pdata);
+
+       return ret;
+}
+
+static int __devexit of_gpio_leds_remove(struct of_device *ofdev)
+{
+       struct gpio_led_of_platform_data *pdata = dev_get_drvdata(&ofdev->dev);
+       int i;
+
+       for (i = 0; i < pdata->num_leds; i++)
+               delete_gpio_led(&pdata->led_data[i]);
+
+       kfree(pdata);
+
+       dev_set_drvdata(&ofdev->dev, NULL);
+
+       return 0;
+}
+
+static const struct of_device_id of_gpio_leds_match[] = {
+       { .compatible = "gpio-leds", },
+       {},
+};
+
+static struct of_platform_driver of_gpio_leds_driver = {
+       .driver = {
+               .name = "of_gpio_leds",
+               .owner = THIS_MODULE,
+       },
+       .match_table = of_gpio_leds_match,
+       .probe = of_gpio_leds_probe,
+       .remove = __devexit_p(of_gpio_leds_remove),
+};
+#endif
+
 static int __init gpio_led_init(void)
 {
-       return platform_driver_register(&gpio_led_driver);
+       int ret;
+
+#ifdef CONFIG_LEDS_GPIO_PLATFORM       
+       ret = platform_driver_register(&gpio_led_driver);
+       if (ret)
+               return ret;
+#endif
+#ifdef CONFIG_LEDS_GPIO_OF
+       ret = of_register_platform_driver(&of_gpio_leds_driver);
+#endif
+#ifdef CONFIG_LEDS_GPIO_PLATFORM       
+       if (ret)
+               platform_driver_unregister(&gpio_led_driver);
+#endif
+
+       return ret;
 }
 
 static void __exit gpio_led_exit(void)
 {
+#ifdef CONFIG_LEDS_GPIO_PLATFORM
        platform_driver_unregister(&gpio_led_driver);
+#endif
+#ifdef CONFIG_LEDS_GPIO_OF
+       of_unregister_platform_driver(&of_gpio_leds_driver);
+#endif
 }
 
 module_init(gpio_led_init);
 module_exit(gpio_led_exit);
 
-MODULE_AUTHOR("Raphael Assenat <raph@8d.com>");
+MODULE_AUTHOR("Raphael Assenat <raph@8d.com>, Trent Piepho <tpiepho@freescale.com>");
 MODULE_DESCRIPTION("GPIO LED driver");
 MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:leds-gpio");
index 11b77a70bbcb5e3d563e20f25f2493075de626c3..1aa46a390a0dfa780ec13d25c76e61b9128394a0 100644 (file)
@@ -104,7 +104,7 @@ static struct led_classdev h1940_blueled = {
        .default_trigger        = "h1940-bluetooth",
 };
 
-static int __init h1940leds_probe(struct platform_device *pdev)
+static int __devinit h1940leds_probe(struct platform_device *pdev)
 {
        int ret;
 
index bd3b431c9710eccc207228b6daacc049c3e04463..3937244fdcab8bf31562337430996a6cd7a943c2 100644 (file)
@@ -169,7 +169,7 @@ static int pca9532_event(struct input_dev *dev, unsigned int type,
 {
        struct pca9532_data *data = input_get_drvdata(dev);
 
-       if (type != EV_SND && (code != SND_BELL || code != SND_TONE))
+       if (!(type == EV_SND && (code == SND_BELL || code == SND_TONE)))
                return -1;
 
        /* XXX: allow different kind of beeps with psc/pwm modifications */
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
new file mode 100644 (file)
index 0000000..cdfdc87
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * linux/drivers/leds-pwm.c
+ *
+ * simple PWM based LED control
+ *
+ * Copyright 2009 Luotao Fu @ Pengutronix (l.fu@pengutronix.de)
+ *
+ * based on leds-gpio.c by Raphael Assenat <raph@8d.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.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/fb.h>
+#include <linux/leds.h>
+#include <linux/err.h>
+#include <linux/pwm.h>
+#include <linux/leds_pwm.h>
+
+struct led_pwm_data {
+       struct led_classdev     cdev;
+       struct pwm_device       *pwm;
+       unsigned int            active_low;
+       unsigned int            period;
+       unsigned int            max_brightness;
+};
+
+static void led_pwm_set(struct led_classdev *led_cdev,
+       enum led_brightness brightness)
+{
+       struct led_pwm_data *led_dat =
+               container_of(led_cdev, struct led_pwm_data, cdev);
+       unsigned int max = led_dat->max_brightness;
+       unsigned int period =  led_dat->period;
+
+       if (brightness == 0) {
+               pwm_config(led_dat->pwm, 0, period);
+               pwm_disable(led_dat->pwm);
+       } else {
+               pwm_config(led_dat->pwm, brightness * period / max, period);
+               pwm_enable(led_dat->pwm);
+       }
+}
+
+static int led_pwm_probe(struct platform_device *pdev)
+{
+       struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
+       struct led_pwm *cur_led;
+       struct led_pwm_data *leds_data, *led_dat;
+       int i, ret = 0;
+
+       if (!pdata)
+               return -EBUSY;
+
+       leds_data = kzalloc(sizeof(struct led_pwm_data) * pdata->num_leds,
+                               GFP_KERNEL);
+       if (!leds_data)
+               return -ENOMEM;
+
+       for (i = 0; i < pdata->num_leds; i++) {
+               cur_led = &pdata->leds[i];
+               led_dat = &leds_data[i];
+
+               led_dat->pwm = pwm_request(cur_led->pwm_id,
+                               cur_led->name);
+               if (IS_ERR(led_dat->pwm)) {
+                       dev_err(&pdev->dev, "unable to request PWM %d\n",
+                                       cur_led->pwm_id);
+                       goto err;
+               }
+
+               led_dat->cdev.name = cur_led->name;
+               led_dat->cdev.default_trigger = cur_led->default_trigger;
+               led_dat->active_low = cur_led->active_low;
+               led_dat->max_brightness = cur_led->max_brightness;
+               led_dat->period = cur_led->pwm_period_ns;
+               led_dat->cdev.brightness_set = led_pwm_set;
+               led_dat->cdev.brightness = LED_OFF;
+               led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
+
+               ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
+               if (ret < 0) {
+                       pwm_free(led_dat->pwm);
+                       goto err;
+               }
+       }
+
+       platform_set_drvdata(pdev, leds_data);
+
+       return 0;
+
+err:
+       if (i > 0) {
+               for (i = i - 1; i >= 0; i--) {
+                       led_classdev_unregister(&leds_data[i].cdev);
+                       pwm_free(leds_data[i].pwm);
+               }
+       }
+
+       kfree(leds_data);
+
+       return ret;
+}
+
+static int __devexit led_pwm_remove(struct platform_device *pdev)
+{
+       int i;
+       struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
+       struct led_pwm_data *leds_data;
+
+       leds_data = platform_get_drvdata(pdev);
+
+       for (i = 0; i < pdata->num_leds; i++) {
+               led_classdev_unregister(&leds_data[i].cdev);
+               pwm_free(leds_data[i].pwm);
+       }
+
+       kfree(leds_data);
+
+       return 0;
+}
+
+static struct platform_driver led_pwm_driver = {
+       .probe          = led_pwm_probe,
+       .remove         = __devexit_p(led_pwm_remove),
+       .driver         = {
+               .name   = "leds_pwm",
+               .owner  = THIS_MODULE,
+       },
+};
+
+static int __init led_pwm_init(void)
+{
+       return platform_driver_register(&led_pwm_driver);
+}
+
+static void __exit led_pwm_exit(void)
+{
+       platform_driver_unregister(&led_pwm_driver);
+}
+
+module_init(led_pwm_init);
+module_exit(led_pwm_exit);
+
+MODULE_AUTHOR("Luotao Fu <l.fu@pengutronix.de>");
+MODULE_DESCRIPTION("PWM LED driver for PXA");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:leds-pwm");
diff --git a/drivers/leds/leds-rb532.c b/drivers/leds/leds-rb532.c
new file mode 100644 (file)
index 0000000..c3525f3
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * LEDs driver for the "User LED" on Routerboard532
+ *
+ * Copyright (C) 2009 Phil Sutter <n0-1@freewrt.org>
+ *
+ * Based on leds-cobalt-qube.c by Florian Fainelly and
+ * rb-diag.c (my own standalone driver for both LED and
+ * button of Routerboard532).
+ */
+
+#include <linux/leds.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach-rc32434/gpio.h>
+#include <asm/mach-rc32434/rb.h>
+
+static void rb532_led_set(struct led_classdev *cdev,
+                          enum led_brightness brightness)
+{
+       if (brightness)
+               set_latch_u5(LO_ULED, 0);
+
+       else
+               set_latch_u5(0, LO_ULED);
+}
+
+static enum led_brightness rb532_led_get(struct led_classdev *cdev)
+{
+       return (get_latch_u5() & LO_ULED) ? LED_FULL : LED_OFF;
+}
+
+static struct led_classdev rb532_uled = {
+       .name = "uled",
+       .brightness_set = rb532_led_set,
+       .brightness_get = rb532_led_get,
+       .default_trigger = "nand-disk",
+};
+
+static int __devinit rb532_led_probe(struct platform_device *pdev)
+{
+       return led_classdev_register(&pdev->dev, &rb532_uled);
+}
+
+static int __devexit rb532_led_remove(struct platform_device *pdev)
+{
+       led_classdev_unregister(&rb532_uled);
+       return 0;
+}
+
+static struct platform_driver rb532_led_driver = {
+       .probe = rb532_led_probe,
+       .remove = __devexit_p(rb532_led_remove),
+       .driver = {
+               .name = "rb532-led",
+               .owner = THIS_MODULE,
+       },
+};
+
+static int __init rb532_led_init(void)
+{
+       return platform_driver_register(&rb532_led_driver);
+}
+
+static void __exit rb532_led_exit(void)
+{
+       platform_driver_unregister(&rb532_led_driver);
+}
+
+module_init(rb532_led_init);
+module_exit(rb532_led_exit);
+
+MODULE_ALIAS("platform:rb532-led");
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("User LED support for Routerboard532");
+MODULE_AUTHOR("Phil Sutter <n0-1@freewrt.org>");
index 4d81131542ae68e71e203dae1f9e63194547ffef..aa2e7ae0cdaeede5d97cc34e66dfe26e0e718194 100644 (file)
@@ -102,14 +102,11 @@ static int s3c24xx_led_probe(struct platform_device *dev)
        ret = led_classdev_register(&dev->dev, &led->cdev);
        if (ret < 0) {
                dev_err(&dev->dev, "led_classdev_register failed\n");
-               goto exit_err1;
+               kfree(led);
+               return ret;
        }
 
        return 0;
-
- exit_err1:
-       kfree(led);
-       return ret;
 }
 
 static struct platform_driver s3c24xx_led_driver = {
index 5edbf52c4fa7e6834e9125855bd4c1801e2c2809..2dd8ecbfdc3155250d3608897db8d1d0047fc317 100644 (file)
@@ -20,8 +20,8 @@
 static inline void led_set_brightness(struct led_classdev *led_cdev,
                                        enum led_brightness value)
 {
-       if (value > LED_FULL)
-               value = LED_FULL;
+       if (value > led_cdev->max_brightness)
+               value = led_cdev->max_brightness;
        led_cdev->brightness = value;
        if (!(led_cdev->flags & LED_SUSPENDED))
                led_cdev->brightness_set(led_cdev, value);
index 92995e40cfa43fd6ba9ea1b454f5172044119193..a4ef54b9d508efffe60b0cd4db2213479680547e 100644 (file)
@@ -19,7 +19,7 @@
 
 static void defon_trig_activate(struct led_classdev *led_cdev)
 {
-       led_set_brightness(led_cdev, LED_FULL);
+       led_set_brightness(led_cdev, led_cdev->max_brightness);
 }
 
 static struct led_trigger defon_led_trigger = {
diff --git a/drivers/leds/ledtrig-gpio.c b/drivers/leds/ledtrig-gpio.c
new file mode 100644 (file)
index 0000000..a247ae6
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * ledtrig-gio.c - LED Trigger Based on GPIO events
+ *
+ * Copyright 2009 Felipe Balbi <me@felipebalbi.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.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/gpio.h>
+#include <linux/interrupt.h>
+#include <linux/workqueue.h>
+#include <linux/leds.h>
+#include "leds.h"
+
+struct gpio_trig_data {
+       struct led_classdev *led;
+       struct work_struct work;
+
+       unsigned desired_brightness;    /* desired brightness when led is on */
+       unsigned inverted;              /* true when gpio is inverted */
+       unsigned gpio;                  /* gpio that triggers the leds */
+};
+
+static irqreturn_t gpio_trig_irq(int irq, void *_led)
+{
+       struct led_classdev *led = _led;
+       struct gpio_trig_data *gpio_data = led->trigger_data;
+
+       /* just schedule_work since gpio_get_value can sleep */
+       schedule_work(&gpio_data->work);
+
+       return IRQ_HANDLED;
+};
+
+static void gpio_trig_work(struct work_struct *work)
+{
+       struct gpio_trig_data *gpio_data = container_of(work,
+                       struct gpio_trig_data, work);
+       int tmp;
+
+       if (!gpio_data->gpio)
+              return;
+
+       tmp = gpio_get_value(gpio_data->gpio);
+       if (gpio_data->inverted)
+              tmp = !tmp;
+
+       if (tmp) {
+               if (gpio_data->desired_brightness)
+                       led_set_brightness(gpio_data->led,
+                                       gpio_data->desired_brightness);
+               else
+                       led_set_brightness(gpio_data->led, LED_FULL);
+       } else {
+               led_set_brightness(gpio_data->led, LED_OFF);
+       }
+}
+
+static ssize_t gpio_trig_brightness_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct led_classdev *led = dev_get_drvdata(dev);
+       struct gpio_trig_data *gpio_data = led->trigger_data;
+
+       return sprintf(buf, "%u\n", gpio_data->desired_brightness);
+}
+
+static ssize_t gpio_trig_brightness_store(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t n)
+{
+       struct led_classdev *led = dev_get_drvdata(dev);
+       struct gpio_trig_data *gpio_data = led->trigger_data;
+       unsigned desired_brightness;
+       int ret;
+
+       ret = sscanf(buf, "%u", &desired_brightness);
+       if (ret < 1 || desired_brightness > 255) {
+               dev_err(dev, "invalid value\n");
+               return -EINVAL;
+       }
+
+       gpio_data->desired_brightness = desired_brightness;
+
+       return n;
+}
+static DEVICE_ATTR(desired_brightness, 0644, gpio_trig_brightness_show,
+               gpio_trig_brightness_store);
+
+static ssize_t gpio_trig_inverted_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct led_classdev *led = dev_get_drvdata(dev);
+       struct gpio_trig_data *gpio_data = led->trigger_data;
+
+       return sprintf(buf, "%s\n", gpio_data->inverted ? "yes" : "no");
+}
+
+static ssize_t gpio_trig_inverted_store(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t n)
+{
+       struct led_classdev *led = dev_get_drvdata(dev);
+       struct gpio_trig_data *gpio_data = led->trigger_data;
+       unsigned inverted;
+       int ret;
+
+       ret = sscanf(buf, "%u", &inverted);
+       if (ret < 1) {
+               dev_err(dev, "invalid value\n");
+               return -EINVAL;
+       }
+
+       gpio_data->inverted = !!inverted;
+
+       return n;
+}
+static DEVICE_ATTR(inverted, 0644, gpio_trig_inverted_show,
+               gpio_trig_inverted_store);
+
+static ssize_t gpio_trig_gpio_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct led_classdev *led = dev_get_drvdata(dev);
+       struct gpio_trig_data *gpio_data = led->trigger_data;
+
+       return sprintf(buf, "%u\n", gpio_data->gpio);
+}
+
+static ssize_t gpio_trig_gpio_store(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t n)
+{
+       struct led_classdev *led = dev_get_drvdata(dev);
+       struct gpio_trig_data *gpio_data = led->trigger_data;
+       unsigned gpio;
+       int ret;
+
+       ret = sscanf(buf, "%u", &gpio);
+       if (ret < 1) {
+               dev_err(dev, "couldn't read gpio number\n");
+               flush_work(&gpio_data->work);
+               return -EINVAL;
+       }
+
+       if (!gpio) {
+               free_irq(gpio_to_irq(gpio_data->gpio), led);
+               return n;
+       }
+
+       if (gpio_data->gpio > 0 && gpio_data->gpio != gpio)
+               free_irq(gpio_to_irq(gpio_data->gpio), led);
+
+       gpio_data->gpio = gpio;
+       ret = request_irq(gpio_to_irq(gpio), gpio_trig_irq,
+                       IRQF_SHARED | IRQF_TRIGGER_RISING
+                       | IRQF_TRIGGER_FALLING, "ledtrig-gpio", led);
+       if (ret)
+               dev_err(dev, "request_irq failed with error %d\n", ret);
+
+       return ret ? ret : n;
+}
+static DEVICE_ATTR(gpio, 0644, gpio_trig_gpio_show, gpio_trig_gpio_store);
+
+static void gpio_trig_activate(struct led_classdev *led)
+{
+       struct gpio_trig_data *gpio_data;
+       int ret;
+
+       gpio_data = kzalloc(sizeof(*gpio_data), GFP_KERNEL);
+       if (!gpio_data)
+               return;
+
+       ret = device_create_file(led->dev, &dev_attr_gpio);
+       if (ret)
+               goto err_gpio;
+
+       ret = device_create_file(led->dev, &dev_attr_inverted);
+       if (ret)
+               goto err_inverted;
+
+       ret = device_create_file(led->dev, &dev_attr_desired_brightness);
+       if (ret)
+               goto err_brightness;
+
+       gpio_data->led = led;
+       led->trigger_data = gpio_data;
+       INIT_WORK(&gpio_data->work, gpio_trig_work);
+
+       return;
+
+err_brightness:
+       device_remove_file(led->dev, &dev_attr_inverted);
+
+err_inverted:
+       device_remove_file(led->dev, &dev_attr_gpio);
+
+err_gpio:
+       kfree(gpio_data);
+}
+
+static void gpio_trig_deactivate(struct led_classdev *led)
+{
+       struct gpio_trig_data *gpio_data = led->trigger_data;
+
+       if (gpio_data) {
+               device_remove_file(led->dev, &dev_attr_gpio);
+               device_remove_file(led->dev, &dev_attr_inverted);
+               device_remove_file(led->dev, &dev_attr_desired_brightness);
+               flush_work(&gpio_data->work);
+               free_irq(gpio_to_irq(gpio_data->gpio),led);
+               kfree(gpio_data);
+       }
+}
+
+static struct led_trigger gpio_led_trigger = {
+       .name           = "gpio",
+       .activate       = gpio_trig_activate,
+       .deactivate     = gpio_trig_deactivate,
+};
+
+static int __init gpio_trig_init(void)
+{
+       return led_trigger_register(&gpio_led_trigger);
+}
+module_init(gpio_trig_init);
+
+static void __exit gpio_trig_exit(void)
+{
+       led_trigger_unregister(&gpio_led_trigger);
+}
+module_exit(gpio_trig_exit);
+
+MODULE_AUTHOR("Felipe Balbi <me@felipebalbi.com>");
+MODULE_DESCRIPTION("GPIO LED trigger");
+MODULE_LICENSE("GPL");
index 4bf8cec8b8c14173b68f78d4d3126648e2092051..c1c1ea6f817b1eb7ddb7f2433cbdc917e20d164e 100644 (file)
@@ -47,7 +47,7 @@ static void led_heartbeat_function(unsigned long data)
                        msecs_to_jiffies(heartbeat_data->period);
                delay = msecs_to_jiffies(70);
                heartbeat_data->phase++;
-               brightness = LED_FULL;
+               brightness = led_cdev->max_brightness;
                break;
        case 1:
                delay = heartbeat_data->period / 4 - msecs_to_jiffies(70);
@@ -56,7 +56,7 @@ static void led_heartbeat_function(unsigned long data)
        case 2:
                delay = msecs_to_jiffies(70);
                heartbeat_data->phase++;
-               brightness = LED_FULL;
+               brightness = led_cdev->max_brightness;
                break;
        default:
                delay = heartbeat_data->period - heartbeat_data->period / 4 -
index 883a577b1b97aaaa189a3d82fc461939ffa286da..ec099fcbcb00ecf01c4f8ef4313710230428b15b 100644 (file)
@@ -37,7 +37,8 @@ static void ledtrig_ide_timerfunc(unsigned long data)
 {
        if (ide_lastactivity != ide_activity) {
                ide_lastactivity = ide_activity;
-               led_trigger_event(ledtrig_ide, LED_FULL);
+               /* INT_MAX will set each LED to its maximum brightness */
+               led_trigger_event(ledtrig_ide, INT_MAX);
                mod_timer(&ledtrig_ide_timer, jiffies + msecs_to_jiffies(10));
        } else {
                led_trigger_event(ledtrig_ide, LED_OFF);
index 3d6531396dda094e41eb7f00b80d20acbbd244cd..3b83406de7520b8052b73906992f2fa34e1b3891 100644 (file)
@@ -166,7 +166,7 @@ static void timer_trig_activate(struct led_classdev *led_cdev)
 
        timer_data->brightness_on = led_get_brightness(led_cdev);
        if (timer_data->brightness_on == LED_OFF)
-               timer_data->brightness_on = LED_FULL;
+               timer_data->brightness_on = led_cdev->max_brightness;
        led_cdev->trigger_data = timer_data;
 
        init_timer(&timer_data->timer);
index b4f4badc0068991290515b1281cdaddd898893ce..274b491a11c159daa9c4bd2b5171705aa09f99c7 100644 (file)
@@ -123,6 +123,7 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)
                                goto out_free_pages;
 
                        bio->bi_io_vec[i].bv_page = page;
+                       bio->bi_vcnt = i+1;
                }
        }
        /* If not user-requests, copy the page pointers to all bios */
@@ -138,9 +139,9 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)
        return r1_bio;
 
 out_free_pages:
-       for (i=0; i < RESYNC_PAGES ; i++)
-               for (j=0 ; j < pi->raid_disks; j++)
-                       safe_put_page(r1_bio->bios[j]->bi_io_vec[i].bv_page);
+       for (j=0 ; j < pi->raid_disks; j++)
+               for (i=0; i < r1_bio->bios[j]->bi_vcnt ; i++)
+                       put_page(r1_bio->bios[j]->bi_io_vec[i].bv_page);
        j = -1;
 out_free_bio:
        while ( ++j < pi->raid_disks )
@@ -585,7 +586,7 @@ static int raid1_congested(void *data, int bits)
                        /* Note the '|| 1' - when read_balance prefers
                         * non-congested targets, it can be removed
                         */
-                       if ((bits & (1<<BDI_write_congested)) || 1)
+                       if ((bits & (1<<BDI_async_congested)) || 1)
                                ret |= bdi_congested(&q->backing_dev_info, bits);
                        else
                                ret &= bdi_congested(&q->backing_dev_info, bits);
index 5b20cf5a29f02fa056834bca9cdbd7969e291578..971a8b18f6dd7214a9b797697e09baf386ff7ed8 100644 (file)
@@ -662,7 +662,7 @@ static int __devinit dm1105_probe(struct pci_dev *pdev,
        if (ret < 0)
                goto err_kfree;
 
-       ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (ret < 0)
                goto err_pci_disable_device;
 
index 6103caad1644917200dca2c6a72c3099b66859da..60955a70d8807a6a93a2d362c0cd124c98f3a4d0 100644 (file)
@@ -294,7 +294,7 @@ config DVB_USB_DTV5100
 
 config DVB_USB_AF9015
        tristate "Afatech AF9015 DVB-T USB2.0 support"
-       depends on DVB_USB && EXPERIMENTAL
+       depends on DVB_USB
        select DVB_AF9013
        select DVB_PLL              if !DVB_FE_CUSTOMISE
        select MEDIA_TUNER_MT2060   if !MEDIA_TUNER_CUSTOMISE
@@ -309,6 +309,6 @@ config DVB_USB_CE6230
        tristate "Intel CE6230 DVB-T USB2.0 support"
        depends on DVB_USB && EXPERIMENTAL
        select DVB_ZL10353
-       select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMIZE
+       select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
        help
          Say Y here to support the Intel CE6230 DVB-T USB2.0 receiver
index f0ba8b07b84ff9c144bf02dd6bb303f774128046..53bfc8e42fb940f9651d0e66e16efc7fe57fa8d3 100644 (file)
@@ -782,17 +782,14 @@ static int af9015_read_config(struct usb_device *udev)
                                  ARRAY_SIZE(af9015_ir_table_leadtek);
                                break;
                        case USB_VID_VISIONPLUS:
-                               if (udev->descriptor.idProduct ==
-                               cpu_to_le16(USB_PID_AZUREWAVE_AD_TU700)) {
-                                       af9015_properties[i].rc_key_map =
-                                         af9015_rc_keys_twinhan;
-                                       af9015_properties[i].rc_key_map_size =
-                                         ARRAY_SIZE(af9015_rc_keys_twinhan);
-                                       af9015_config.ir_table =
-                                         af9015_ir_table_twinhan;
-                                       af9015_config.ir_table_size =
-                                         ARRAY_SIZE(af9015_ir_table_twinhan);
-                               }
+                               af9015_properties[i].rc_key_map =
+                                 af9015_rc_keys_twinhan;
+                               af9015_properties[i].rc_key_map_size =
+                                 ARRAY_SIZE(af9015_rc_keys_twinhan);
+                               af9015_config.ir_table =
+                                 af9015_ir_table_twinhan;
+                               af9015_config.ir_table_size =
+                                 ARRAY_SIZE(af9015_ir_table_twinhan);
                                break;
                        case USB_VID_KWORLD_2:
                                /* TODO: use correct rc keys */
@@ -833,6 +830,16 @@ static int af9015_read_config(struct usb_device *udev)
                                          af9015_ir_table_msi;
                                        af9015_config.ir_table_size =
                                          ARRAY_SIZE(af9015_ir_table_msi);
+                               } else if (udev->descriptor.idProduct ==
+                                       cpu_to_le16(USB_PID_TREKSTOR_DVBT)) {
+                                       af9015_properties[i].rc_key_map =
+                                         af9015_rc_keys_trekstor;
+                                       af9015_properties[i].rc_key_map_size =
+                                         ARRAY_SIZE(af9015_rc_keys_trekstor);
+                                       af9015_config.ir_table =
+                                         af9015_ir_table_trekstor;
+                                       af9015_config.ir_table_size =
+                                         ARRAY_SIZE(af9015_ir_table_trekstor);
                                }
                                break;
                        case USB_VID_AVERMEDIA:
@@ -981,6 +988,21 @@ error:
        if (ret)
                err("eeprom read failed:%d", ret);
 
+       /* AverMedia AVerTV Volar Black HD (A850) device have bad EEPROM
+          content :-( Override some wrong values here. */
+       if (le16_to_cpu(udev->descriptor.idVendor) == USB_VID_AVERMEDIA &&
+           le16_to_cpu(udev->descriptor.idProduct) == USB_PID_AVERMEDIA_A850) {
+               deb_info("%s: AverMedia A850: overriding config\n", __func__);
+               /* disable dual mode */
+               af9015_config.dual_mode = 0;
+                /* disable 2nd adapter */
+               for (i = 0; i < af9015_properties_count; i++)
+                       af9015_properties[i].num_adapters = 1;
+
+               /* set correct IF */
+               af9015_af9013_config[0].tuner_if = 4570;
+       }
+
        return ret;
 }
 
@@ -1237,6 +1259,9 @@ static struct usb_device_id af9015_usb_table[] = {
 /* 15 */{USB_DEVICE(USB_VID_MSI_2,     USB_PID_MSI_DIGI_VOX_MINI_III)},
        {USB_DEVICE(USB_VID_KWORLD_2,  USB_PID_KWORLD_395U)},
        {USB_DEVICE(USB_VID_KWORLD_2,  USB_PID_KWORLD_395U_2)},
+       {USB_DEVICE(USB_VID_KWORLD_2,  USB_PID_KWORLD_395U_3)},
+       {USB_DEVICE(USB_VID_AFATECH,   USB_PID_TREKSTOR_DVBT)},
+       {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)},
        {0},
 };
 MODULE_DEVICE_TABLE(usb, af9015_usb_table);
@@ -1401,7 +1426,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
 
                .i2c_algo = &af9015_i2c_algo,
 
-               .num_device_descs = 7,
+               .num_device_descs = 9,
                .devices = {
                        {
                                .name = "Xtensions XD-380",
@@ -1437,7 +1462,19 @@ static struct dvb_usb_device_properties af9015_properties[] = {
                                .name = "KWorld USB DVB-T TV Stick II " \
                                        "(VS-DVB-T 395U)",
                                .cold_ids = {&af9015_usb_table[16],
-                                            &af9015_usb_table[17], NULL},
+                                            &af9015_usb_table[17],
+                                            &af9015_usb_table[18], NULL},
+                               .warm_ids = {NULL},
+                       },
+                       {
+                               .name = "TrekStor DVB-T USB Stick",
+                               .cold_ids = {&af9015_usb_table[19], NULL},
+                               .warm_ids = {NULL},
+                       },
+                       {
+                               .name = "AverMedia AVerTV Volar Black HD " \
+                                       "(A850)",
+                               .cold_ids = {&af9015_usb_table[20], NULL},
                                .warm_ids = {NULL},
                        },
                }
index 00e25714662a2ef0ad99ddafeb2273176829466a..8d81a17c116d773d6d3df53f7e9737e12cbe1b6a 100644 (file)
 
 #define AF9015_EEPROM_OFFSET (AF9015_EEPROM_SAW_BW2 - AF9015_EEPROM_SAW_BW1)
 
-#define AF9015_GPIO_ON (1 << 0)
-#define AF9015_GPIO_EN (1 << 1)
-#define AF9015_GPIO_O  (1 << 2)
-#define AF9015_GPIO_I  (1 << 3)
-
-#define AF9015_GPIO_TUNER_ON  (AF9015_GPIO_ON|AF9015_GPIO_EN)
-#define AF9015_GPIO_TUNER_OFF (AF9015_GPIO_ON|AF9015_GPIO_EN|AF9015_GPIO_O)
-
 struct req_t {
        u8  cmd;       /* [0] */
        /*  seq */     /* [1] */
@@ -120,11 +112,11 @@ struct af9015_config {
 
 enum af9015_remote {
        AF9015_REMOTE_NONE                    = 0,
-       AF9015_REMOTE_A_LINK_DTU_M,
+/* 1 */        AF9015_REMOTE_A_LINK_DTU_M,
        AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
        AF9015_REMOTE_MYGICTV_U718,
        AF9015_REMOTE_DIGITTRADE_DVB_T,
-       AF9015_REMOTE_AVERMEDIA_KS,
+/* 5 */        AF9015_REMOTE_AVERMEDIA_KS,
 };
 
 /* Leadtek WinFast DTV Dongle Gold */
@@ -691,4 +683,67 @@ static u8 af9015_ir_table_digittrade[] = {
        0x00, 0xff, 0x1d, 0xe2, 0x40, 0x00, 0x00,
 };
 
+/* TREKSTOR DVB-T USB Stick */
+static struct dvb_usb_rc_key af9015_rc_keys_trekstor[] = {
+       { 0x07, 0x04, KEY_AGAIN },              /* Home */
+       { 0x07, 0x05, KEY_MUTE },               /* Mute */
+       { 0x07, 0x06, KEY_UP },                 /* Up */
+       { 0x07, 0x07, KEY_DOWN },               /* Down */
+       { 0x07, 0x09, KEY_RIGHT },              /* Right */
+       { 0x07, 0x0a, KEY_ENTER },              /* OK */
+       { 0x07, 0x0b, KEY_FASTFORWARD },        /* Fast forward */
+       { 0x07, 0x0c, KEY_REWIND },             /* Rewind */
+       { 0x07, 0x0d, KEY_PLAY },               /* Play/Pause */
+       { 0x07, 0x0e, KEY_VOLUMEUP },           /* Volume + */
+       { 0x07, 0x0f, KEY_VOLUMEDOWN },         /* Volume - */
+       { 0x07, 0x10, KEY_RECORD },             /* Record */
+       { 0x07, 0x11, KEY_STOP },               /* Stop */
+       { 0x07, 0x12, KEY_ZOOM },               /* TV */
+       { 0x07, 0x13, KEY_EPG },                /* Info/EPG */
+       { 0x07, 0x14, KEY_CHANNELDOWN },        /* Channel - */
+       { 0x07, 0x15, KEY_CHANNELUP },          /* Channel + */
+       { 0x07, 0x1e, KEY_1 },
+       { 0x07, 0x1f, KEY_2 },
+       { 0x07, 0x20, KEY_3 },
+       { 0x07, 0x21, KEY_4 },
+       { 0x07, 0x22, KEY_5 },
+       { 0x07, 0x23, KEY_6 },
+       { 0x07, 0x24, KEY_7 },
+       { 0x07, 0x25, KEY_8 },
+       { 0x07, 0x26, KEY_9 },
+       { 0x07, 0x08, KEY_LEFT },               /* LEFT */
+       { 0x07, 0x27, KEY_0 },
+};
+
+static u8 af9015_ir_table_trekstor[] = {
+       0x00, 0xff, 0x86, 0x79, 0x04, 0x07, 0x00,
+       0x00, 0xff, 0x85, 0x7a, 0x05, 0x07, 0x00,
+       0x00, 0xff, 0x87, 0x78, 0x06, 0x07, 0x00,
+       0x00, 0xff, 0x8c, 0x73, 0x07, 0x07, 0x00,
+       0x00, 0xff, 0x89, 0x76, 0x09, 0x07, 0x00,
+       0x00, 0xff, 0x88, 0x77, 0x0a, 0x07, 0x00,
+       0x00, 0xff, 0x8a, 0x75, 0x0b, 0x07, 0x00,
+       0x00, 0xff, 0x9e, 0x61, 0x0c, 0x07, 0x00,
+       0x00, 0xff, 0x8d, 0x72, 0x0d, 0x07, 0x00,
+       0x00, 0xff, 0x8b, 0x74, 0x0e, 0x07, 0x00,
+       0x00, 0xff, 0x9b, 0x64, 0x0f, 0x07, 0x00,
+       0x00, 0xff, 0x9d, 0x62, 0x10, 0x07, 0x00,
+       0x00, 0xff, 0x8e, 0x71, 0x11, 0x07, 0x00,
+       0x00, 0xff, 0x9c, 0x63, 0x12, 0x07, 0x00,
+       0x00, 0xff, 0x8f, 0x70, 0x13, 0x07, 0x00,
+       0x00, 0xff, 0x93, 0x6c, 0x14, 0x07, 0x00,
+       0x00, 0xff, 0x97, 0x68, 0x15, 0x07, 0x00,
+       0x00, 0xff, 0x92, 0x6d, 0x1e, 0x07, 0x00,
+       0x00, 0xff, 0x96, 0x69, 0x1f, 0x07, 0x00,
+       0x00, 0xff, 0x9a, 0x65, 0x20, 0x07, 0x00,
+       0x00, 0xff, 0x91, 0x6e, 0x21, 0x07, 0x00,
+       0x00, 0xff, 0x95, 0x6a, 0x22, 0x07, 0x00,
+       0x00, 0xff, 0x99, 0x66, 0x23, 0x07, 0x00,
+       0x00, 0xff, 0x90, 0x6f, 0x24, 0x07, 0x00,
+       0x00, 0xff, 0x94, 0x6b, 0x25, 0x07, 0x00,
+       0x00, 0xff, 0x98, 0x67, 0x26, 0x07, 0x00,
+       0x00, 0xff, 0x9f, 0x60, 0x08, 0x07, 0x00,
+       0x00, 0xff, 0x84, 0x7b, 0x27, 0x07, 0x00,
+};
+
 #endif
index 5862820f109fad78f45dd307c3dfb1a94c921b82..52badc00e673c57be5ed59b28ef983764db9b943 100644 (file)
@@ -250,6 +250,7 @@ static int ce6230_probe(struct usb_interface *intf,
 
 static struct usb_device_id ce6230_table[] = {
        { USB_DEVICE(USB_VID_INTEL, USB_PID_INTEL_CE9500) },
+       { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A310) },
        { } /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, ce6230_table);
@@ -284,13 +285,18 @@ static struct dvb_usb_device_properties ce6230_properties = {
 
        .i2c_algo = &ce6230_i2c_algo,
 
-       .num_device_descs = 1,
+       .num_device_descs = 2,
        .devices = {
                {
                        .name = "Intel CE9500 reference design",
                        .cold_ids = {NULL},
                        .warm_ids = {&ce6230_table[0], NULL},
                },
+               {
+                       .name = "AVerMedia A310 USB 2.0 DVB-T tuner",
+                       .cold_ids = {NULL},
+                       .warm_ids = {&ce6230_table[1], NULL},
+               },
        }
 };
 
index dc7ea21cd1395ca6b74659be06f2ea9d9a7a6c6b..f506c74119f3bfb48d5714d2f3ad6d36e11d3066 100644 (file)
@@ -65,6 +65,7 @@
 #define USB_PID_AFATECH_AF9005                         0x9020
 #define USB_PID_AFATECH_AF9015_9015                    0x9015
 #define USB_PID_AFATECH_AF9015_9016                    0x9016
+#define USB_PID_TREKSTOR_DVBT                          0x901b
 #define USB_VID_ALINK_DTU                              0xf170
 #define USB_PID_ANSONIC_DVBT_USB                       0x6000
 #define USB_PID_ANYSEE                                 0x861f
 #define USB_PID_KWORLD_399U                            0xe399
 #define USB_PID_KWORLD_395U                            0xe396
 #define USB_PID_KWORLD_395U_2                          0xe39b
+#define USB_PID_KWORLD_395U_3                          0xe395
 #define USB_PID_KWORLD_PC160_2T                                0xc160
 #define USB_PID_KWORLD_VSTREAM_COLD                    0x17de
 #define USB_PID_KWORLD_VSTREAM_WARM                    0x17df
 #define USB_PID_AVERMEDIA_VOLAR_X                      0xa815
 #define USB_PID_AVERMEDIA_VOLAR_X_2                    0x8150
 #define USB_PID_AVERMEDIA_A309                         0xa309
+#define USB_PID_AVERMEDIA_A310                         0xa310
+#define USB_PID_AVERMEDIA_A850                         0x850a
 #define USB_PID_TECHNOTREND_CONNECT_S2400               0x3006
 #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY       0x005a
 #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2     0x0081
index 12f7730184ad32f076060e434d96d450cf6690ca..32526f103b596290232de5ea652b363074935f21 100644 (file)
@@ -151,7 +151,7 @@ static void debug_fcp(const u8 *data, int length)
                subunit_type = data[1] >> 3;
                subunit_id = data[1] & 7;
                op = subunit_type == 0x1e || subunit_id == 5 ? ~0 : data[2];
-               printk(KERN_INFO "%ssu=%x.%x l=%zu: %-8s - %s\n",
+               printk(KERN_INFO "%ssu=%x.%x l=%d: %-8s - %s\n",
                       prefix, subunit_type, subunit_id, length,
                       debug_fcp_ctype(data[0]),
                       debug_fcp_opcode(op, data, length));
index a486a7f81fa9c226594e3ef0d879345ddbca4a31..23e4cffeba38a789f1e03359c35a66685501dd71 100644 (file)
@@ -513,6 +513,13 @@ config DVB_LGS8GL5
        help
          A DMB-TH tuner module. Say Y when you want to support this frontend.
 
+config DVB_LGS8GXX
+       tristate "Legend Silicon LGS8913/LGS8GL5/LGS8GXX DMB-TH demodulator"
+       depends on DVB_CORE && I2C
+       default m if DVB_FE_CUSTOMISE
+       help
+         A DMB-TH tuner module. Say Y when you want to support this frontend.
+
 comment "Tools to develop new frontends"
 
 config DVB_DUMMY_FE
index 65a336aa1db68a79f4466701a6421893917bbf15..bc2b00abd1064612310cc58d9f3ae98ffacb0a37 100644 (file)
@@ -61,6 +61,7 @@ obj-$(CONFIG_DVB_TDA10048) += tda10048.o
 obj-$(CONFIG_DVB_TUNER_CX24113) += cx24113.o
 obj-$(CONFIG_DVB_S5H1411) += s5h1411.o
 obj-$(CONFIG_DVB_LGS8GL5) += lgs8gl5.o
+obj-$(CONFIG_DVB_LGS8GXX) += lgs8gxx.o
 obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o
 obj-$(CONFIG_DVB_AF9013) += af9013.o
 obj-$(CONFIG_DVB_CX24116) += cx24116.o
index d63e1527dc88f52ea16f63ce6f272ef2eeffecce..9e9a75576a1dab6595d65ad6f3e22ebb6697d502 100644 (file)
@@ -652,7 +652,7 @@ static int au8522_reset(struct v4l2_subdev *sd, u32 val)
 }
 
 static int au8522_s_video_routing(struct v4l2_subdev *sd,
-                                 const struct v4l2_routing *route)
+                                       u32 input, u32 output, u32 config)
 {
        struct au8522_state *state = to_state(sd);
 
@@ -663,11 +663,11 @@ static int au8522_s_video_routing(struct v4l2_subdev *sd,
           closed), and then came back to analog mode */
        au8522_writereg(state, 0x106, 1);
 
-       if (route->input == AU8522_COMPOSITE_CH1) {
+       if (input == AU8522_COMPOSITE_CH1) {
                au8522_setup_cvbs_mode(state);
-       } else if (route->input == AU8522_SVIDEO_CH13) {
+       } else if (input == AU8522_SVIDEO_CH13) {
                au8522_setup_svideo_mode(state);
-       } else if (route->input == AU8522_COMPOSITE_CH4_SIF) {
+       } else if (input == AU8522_COMPOSITE_CH4_SIF) {
                au8522_setup_cvbs_tuner_mode(state);
        } else {
                printk(KERN_ERR "au8522 mode not currently supported\n");
@@ -677,10 +677,10 @@ static int au8522_s_video_routing(struct v4l2_subdev *sd,
 }
 
 static int au8522_s_audio_routing(struct v4l2_subdev *sd,
-                                 const struct v4l2_routing *route)
+                                       u32 input, u32 output, u32 config)
 {
        struct au8522_state *state = to_state(sd);
-       set_audio_input(state, route->input);
+       set_audio_input(state, input);
        return 0;
 }
 
diff --git a/drivers/media/dvb/frontends/lgs8gxx.c b/drivers/media/dvb/frontends/lgs8gxx.c
new file mode 100644 (file)
index 0000000..f9785df
--- /dev/null
@@ -0,0 +1,816 @@
+/*
+ *    Support for Legend Silicon DMB-TH demodulator
+ *    LGS8913, LGS8GL5
+ *    experimental support LGS8G42, LGS8G52
+ *
+ *    Copyright (C) 2007,2008 David T.L. Wong <davidtlwong@gmail.com>
+ *    Copyright (C) 2008 Sirius International (Hong Kong) Limited
+ *    Timothy Lee <timothy.lee@siriushk.com> (for initial work on LGS8GL5)
+ *
+ *    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 <asm/div64.h>
+
+#include "dvb_frontend.h"
+
+#include "lgs8gxx.h"
+#include "lgs8gxx_priv.h"
+
+#define dprintk(args...) \
+       do { \
+               if (debug) \
+                       printk(KERN_DEBUG "lgs8gxx: " args); \
+       } while (0)
+
+static int debug;
+static int fake_signal_str;
+
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
+
+module_param(fake_signal_str, int, 0644);
+MODULE_PARM_DESC(fake_signal_str, "fake signal strength for LGS8913."
+"Signal strength calculation is slow.(default:off).");
+
+/* LGS8GXX internal helper functions */
+
+static int lgs8gxx_write_reg(struct lgs8gxx_state *priv, u8 reg, u8 data)
+{
+       int ret;
+       u8 buf[] = { reg, data };
+       struct i2c_msg msg = { .flags = 0, .buf = buf, .len = 2 };
+
+       msg.addr = priv->config->demod_address;
+       if (reg >= 0xC0)
+               msg.addr += 0x02;
+
+       if (debug >= 2)
+               printk(KERN_DEBUG "%s: reg=0x%02X, data=0x%02X\n",
+                       __func__, reg, data);
+
+       ret = i2c_transfer(priv->i2c, &msg, 1);
+
+       if (ret != 1)
+               dprintk(KERN_DEBUG "%s: error reg=0x%x, data=0x%x, ret=%i\n",
+                       __func__, reg, data, ret);
+
+       return (ret != 1) ? -1 : 0;
+}
+
+static int lgs8gxx_read_reg(struct lgs8gxx_state *priv, u8 reg, u8 *p_data)
+{
+       int ret;
+       u8 dev_addr;
+
+       u8 b0[] = { reg };
+       u8 b1[] = { 0 };
+       struct i2c_msg msg[] = {
+               { .flags = 0, .buf = b0, .len = 1 },
+               { .flags = I2C_M_RD, .buf = b1, .len = 1 },
+       };
+
+       dev_addr = priv->config->demod_address;
+       if (reg >= 0xC0)
+               dev_addr += 0x02;
+       msg[1].addr =  msg[0].addr = dev_addr;
+
+       ret = i2c_transfer(priv->i2c, msg, 2);
+       if (ret != 2) {
+               dprintk(KERN_DEBUG "%s: error reg=0x%x, ret=%i\n",
+                       __func__, reg, ret);
+               return -1;
+       }
+
+       *p_data = b1[0];
+       if (debug >= 2)
+               printk(KERN_DEBUG "%s: reg=0x%02X, data=0x%02X\n",
+                       __func__, reg, b1[0]);
+       return 0;
+}
+
+static int lgs8gxx_soft_reset(struct lgs8gxx_state *priv)
+{
+       lgs8gxx_write_reg(priv, 0x02, 0x00);
+       msleep(1);
+       lgs8gxx_write_reg(priv, 0x02, 0x01);
+       msleep(100);
+
+       return 0;
+}
+
+static int lgs8gxx_set_ad_mode(struct lgs8gxx_state *priv)
+{
+       const struct lgs8gxx_config *config = priv->config;
+       u8 if_conf;
+
+       if_conf = 0x10; /* AGC output on; */
+
+       if_conf |=
+               ((config->ext_adc) ? 0x80 : 0x00) |
+               ((config->if_neg_center) ? 0x04 : 0x00) |
+               ((config->if_freq == 0) ? 0x08 : 0x00) | /* Baseband */
+               ((config->ext_adc && config->adc_signed) ? 0x02 : 0x00) |
+               ((config->ext_adc && config->if_neg_edge) ? 0x01 : 0x00);
+
+       if (config->ext_adc &&
+               (config->prod == LGS8GXX_PROD_LGS8G52)) {
+               lgs8gxx_write_reg(priv, 0xBA, 0x40);
+       }
+
+       lgs8gxx_write_reg(priv, 0x07, if_conf);
+
+       return 0;
+}
+
+static int lgs8gxx_set_if_freq(struct lgs8gxx_state *priv, u32 freq /*in kHz*/)
+{
+       u64 val;
+       u32 v32;
+       u32 if_clk;
+
+       if_clk = priv->config->if_clk_freq;
+
+       val = freq;
+       if (freq != 0) {
+               val *= (u64)1 << 32;
+               if (if_clk != 0)
+                       do_div(val, if_clk);
+               v32 = val & 0xFFFFFFFF;
+               dprintk("Set IF Freq to %dkHz\n", freq);
+       } else {
+               v32 = 0;
+               dprintk("Set IF Freq to baseband\n");
+       }
+       dprintk("AFC_INIT_FREQ = 0x%08X\n", v32);
+
+       lgs8gxx_write_reg(priv, 0x09, 0xFF & (v32));
+       lgs8gxx_write_reg(priv, 0x0A, 0xFF & (v32 >> 8));
+       lgs8gxx_write_reg(priv, 0x0B, 0xFF & (v32 >> 16));
+       lgs8gxx_write_reg(priv, 0x0C, 0xFF & (v32 >> 24));
+
+       return 0;
+}
+
+static int lgs8gxx_set_mode_auto(struct lgs8gxx_state *priv)
+{
+       u8 t;
+
+       if (priv->config->prod == LGS8GXX_PROD_LGS8913)
+               lgs8gxx_write_reg(priv, 0xC6, 0x01);
+
+       lgs8gxx_read_reg(priv, 0x7E, &t);
+       lgs8gxx_write_reg(priv, 0x7E, t | 0x01);
+
+       /* clear FEC self reset */
+       lgs8gxx_read_reg(priv, 0xC5, &t);
+       lgs8gxx_write_reg(priv, 0xC5, t & 0xE0);
+
+       if (priv->config->prod == LGS8GXX_PROD_LGS8913) {
+               /* FEC auto detect */
+               lgs8gxx_write_reg(priv, 0xC1, 0x03);
+
+               lgs8gxx_read_reg(priv, 0x7C, &t);
+               t = (t & 0x8C) | 0x03;
+               lgs8gxx_write_reg(priv, 0x7C, t);
+       }
+
+
+       if (priv->config->prod == LGS8GXX_PROD_LGS8913) {
+               /* BER test mode */
+               lgs8gxx_read_reg(priv, 0xC3, &t);
+               t = (t & 0xEF) |  0x10;
+               lgs8gxx_write_reg(priv, 0xC3, t);
+       }
+
+       if (priv->config->prod == LGS8GXX_PROD_LGS8G52)
+               lgs8gxx_write_reg(priv, 0xD9, 0x40);
+
+       return 0;
+}
+
+static int lgs8gxx_set_mode_manual(struct lgs8gxx_state *priv)
+{
+       int ret = 0;
+       u8 t;
+
+       /* turn off auto-detect; manual settings */
+       lgs8gxx_write_reg(priv, 0x7E, 0);
+       if (priv->config->prod == LGS8GXX_PROD_LGS8913)
+               lgs8gxx_write_reg(priv, 0xC1, 0);
+
+       ret = lgs8gxx_read_reg(priv, 0xC5, &t);
+       t = (t & 0xE0) | 0x06;
+       lgs8gxx_write_reg(priv, 0xC5, t);
+
+       lgs8gxx_soft_reset(priv);
+
+       return 0;
+}
+
+static int lgs8gxx_is_locked(struct lgs8gxx_state *priv, u8 *locked)
+{
+       int ret = 0;
+       u8 t;
+
+       ret = lgs8gxx_read_reg(priv, 0x4B, &t);
+       if (ret != 0)
+               return ret;
+
+       *locked = ((t & 0xC0) == 0xC0) ? 1 : 0;
+       return 0;
+}
+
+static int lgs8gxx_is_autodetect_finished(struct lgs8gxx_state *priv,
+                                         u8 *finished)
+{
+       int ret = 0;
+       u8 t;
+
+       ret = lgs8gxx_read_reg(priv, 0xA4, &t);
+       if (ret != 0)
+               return ret;
+
+       *finished = ((t & 0x3) == 0x1) ? 1 : 0;
+
+       return 0;
+}
+
+static int lgs8gxx_autolock_gi(struct lgs8gxx_state *priv, u8 gi, u8 *locked)
+{
+       int err;
+       u8 ad_fini = 0;
+
+       if (gi == GI_945)
+               dprintk("try GI 945\n");
+       else if (gi == GI_595)
+               dprintk("try GI 595\n");
+       else if (gi == GI_420)
+               dprintk("try GI 420\n");
+       lgs8gxx_write_reg(priv, 0x04, gi);
+       lgs8gxx_soft_reset(priv);
+       msleep(50);
+       err = lgs8gxx_is_autodetect_finished(priv, &ad_fini);
+       if (err != 0)
+               return err;
+       if (ad_fini) {
+               err = lgs8gxx_is_locked(priv, locked);
+               if (err != 0)
+                       return err;
+       }
+
+       return 0;
+}
+
+static int lgs8gxx_auto_detect(struct lgs8gxx_state *priv,
+                              u8 *detected_param, u8 *gi)
+{
+       int i, j;
+       int err = 0;
+       u8 locked = 0, tmp_gi;
+
+       dprintk("%s\n", __func__);
+
+       lgs8gxx_set_mode_auto(priv);
+       /* Guard Interval */
+       lgs8gxx_write_reg(priv, 0x03, 00);
+
+       for (i = 0; i < 2; i++) {
+               for (j = 0; j < 2; j++) {
+                       tmp_gi = GI_945;
+                       err = lgs8gxx_autolock_gi(priv, GI_945, &locked);
+                       if (err)
+                               goto out;
+                       if (locked)
+                               goto locked;
+               }
+               for (j = 0; j < 2; j++) {
+                       tmp_gi = GI_420;
+                       err = lgs8gxx_autolock_gi(priv, GI_420, &locked);
+                       if (err)
+                               goto out;
+                       if (locked)
+                               goto locked;
+               }
+               tmp_gi = GI_595;
+               err = lgs8gxx_autolock_gi(priv, GI_595, &locked);
+               if (err)
+                       goto out;
+               if (locked)
+                       goto locked;
+       }
+
+locked:
+       if ((err == 0) && (locked == 1)) {
+               u8 t;
+
+               lgs8gxx_read_reg(priv, 0xA2, &t);
+               *detected_param = t;
+
+               if (tmp_gi == GI_945)
+                       dprintk("GI 945 locked\n");
+               else if (tmp_gi == GI_595)
+                       dprintk("GI 595 locked\n");
+               else if (tmp_gi == GI_420)
+                       dprintk("GI 420 locked\n");
+               *gi = tmp_gi;
+       }
+       if (!locked)
+               err = -1;
+
+out:
+       return err;
+}
+
+static void lgs8gxx_auto_lock(struct lgs8gxx_state *priv)
+{
+       s8 err;
+       u8 gi = 0x2;
+       u8 detected_param = 0;
+
+       err = lgs8gxx_auto_detect(priv, &detected_param, &gi);
+
+       if (err != 0) {
+               dprintk("lgs8gxx_auto_detect failed\n");
+       }
+
+       /* Apply detected parameters */
+       if (priv->config->prod == LGS8GXX_PROD_LGS8913) {
+               u8 inter_leave_len = detected_param & TIM_MASK ;
+               inter_leave_len = (inter_leave_len == TIM_LONG) ? 0x60 : 0x40;
+               detected_param &= CF_MASK | SC_MASK  | LGS_FEC_MASK;
+               detected_param |= inter_leave_len;
+       }
+       lgs8gxx_write_reg(priv, 0x7D, detected_param);
+       if (priv->config->prod == LGS8GXX_PROD_LGS8913)
+               lgs8gxx_write_reg(priv, 0xC0, detected_param);
+       /* lgs8gxx_soft_reset(priv); */
+
+       /* Enter manual mode */
+       lgs8gxx_set_mode_manual(priv);
+
+       switch (gi) {
+       case GI_945:
+               priv->curr_gi = 945; break;
+       case GI_595:
+               priv->curr_gi = 595; break;
+       case GI_420:
+               priv->curr_gi = 420; break;
+       default:
+               priv->curr_gi = 945; break;
+       }
+}
+
+static int lgs8gxx_set_mpeg_mode(struct lgs8gxx_state *priv,
+       u8 serial, u8 clk_pol, u8 clk_gated)
+{
+       int ret = 0;
+       u8 t;
+
+       ret = lgs8gxx_read_reg(priv, 0xC2, &t);
+       if (ret != 0)
+               return ret;
+
+       t &= 0xF8;
+       t |= serial ? TS_SERIAL : TS_PARALLEL;
+       t |= clk_pol ? TS_CLK_INVERTED : TS_CLK_NORMAL;
+       t |= clk_gated ? TS_CLK_GATED : TS_CLK_FREERUN;
+
+       ret = lgs8gxx_write_reg(priv, 0xC2, t);
+       if (ret != 0)
+               return ret;
+
+       return 0;
+}
+
+
+/* LGS8913 demod frontend functions */
+
+static int lgs8913_init(struct lgs8gxx_state *priv)
+{
+       u8 t;
+
+       /* LGS8913 specific */
+       lgs8gxx_write_reg(priv, 0xc1, 0x3);
+
+       lgs8gxx_read_reg(priv, 0x7c, &t);
+       lgs8gxx_write_reg(priv, 0x7c, (t&0x8c) | 0x3);
+
+       /* LGS8913 specific */
+       lgs8gxx_read_reg(priv, 0xc3, &t);
+       lgs8gxx_write_reg(priv, 0xc3, t&0x10);
+
+
+       return 0;
+}
+
+static int lgs8gxx_init(struct dvb_frontend *fe)
+{
+       struct lgs8gxx_state *priv =
+               (struct lgs8gxx_state *)fe->demodulator_priv;
+       const struct lgs8gxx_config *config = priv->config;
+       u8 data = 0;
+       s8 err;
+       dprintk("%s\n", __func__);
+
+       lgs8gxx_read_reg(priv, 0, &data);
+       dprintk("reg 0 = 0x%02X\n", data);
+
+       /* Setup MPEG output format */
+       err = lgs8gxx_set_mpeg_mode(priv, config->serial_ts,
+                                   config->ts_clk_pol,
+                                   config->ts_clk_gated);
+       if (err != 0)
+               return -EIO;
+
+       if (config->prod == LGS8GXX_PROD_LGS8913)
+               lgs8913_init(priv);
+       lgs8gxx_set_if_freq(priv, priv->config->if_freq);
+       if (config->prod != LGS8GXX_PROD_LGS8913)
+               lgs8gxx_set_ad_mode(priv);
+
+       return 0;
+}
+
+static void lgs8gxx_release(struct dvb_frontend *fe)
+{
+       struct lgs8gxx_state *state = fe->demodulator_priv;
+       dprintk("%s\n", __func__);
+
+       kfree(state);
+}
+
+
+static int lgs8gxx_write(struct dvb_frontend *fe, u8 *buf, int len)
+{
+       struct lgs8gxx_state *priv = fe->demodulator_priv;
+
+       if (len != 2)
+               return -EINVAL;
+
+       return lgs8gxx_write_reg(priv, buf[0], buf[1]);
+}
+
+static int lgs8gxx_set_fe(struct dvb_frontend *fe,
+                         struct dvb_frontend_parameters *fe_params)
+{
+       struct lgs8gxx_state *priv = fe->demodulator_priv;
+
+       dprintk("%s\n", __func__);
+
+       /* set frequency */
+       if (fe->ops.tuner_ops.set_params) {
+               fe->ops.tuner_ops.set_params(fe, fe_params);
+               if (fe->ops.i2c_gate_ctrl)
+                       fe->ops.i2c_gate_ctrl(fe, 0);
+       }
+
+       /* start auto lock */
+       lgs8gxx_auto_lock(priv);
+
+       msleep(10);
+
+       return 0;
+}
+
+static int lgs8gxx_get_fe(struct dvb_frontend *fe,
+                         struct dvb_frontend_parameters *fe_params)
+{
+       struct lgs8gxx_state *priv = fe->demodulator_priv;
+       u8 t;
+
+       dprintk("%s\n", __func__);
+
+       /* TODO: get real readings from device */
+       /* inversion status */
+       fe_params->inversion = INVERSION_OFF;
+
+       /* bandwidth */
+       fe_params->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
+
+
+       lgs8gxx_read_reg(priv, 0x7D, &t);
+       fe_params->u.ofdm.code_rate_HP = FEC_AUTO;
+       fe_params->u.ofdm.code_rate_LP = FEC_AUTO;
+
+       /* constellation */
+       switch (t & SC_MASK) {
+       case SC_QAM64:
+               fe_params->u.ofdm.constellation = QAM_64;
+               break;
+       case SC_QAM32:
+               fe_params->u.ofdm.constellation = QAM_32;
+               break;
+       case SC_QAM16:
+               fe_params->u.ofdm.constellation = QAM_16;
+               break;
+       case SC_QAM4:
+       case SC_QAM4NR:
+               fe_params->u.ofdm.constellation = QPSK;
+               break;
+       default:
+               fe_params->u.ofdm.constellation = QAM_64;
+       }
+
+       /* transmission mode */
+       fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
+
+       /* guard interval */
+       fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
+
+       /* hierarchy */
+       fe_params->u.ofdm.hierarchy_information = HIERARCHY_NONE;
+
+       return 0;
+}
+
+static
+int lgs8gxx_get_tune_settings(struct dvb_frontend *fe,
+                             struct dvb_frontend_tune_settings *fesettings)
+{
+       /* FIXME: copy from tda1004x.c */
+       fesettings->min_delay_ms = 800;
+       fesettings->step_size = 0;
+       fesettings->max_drift = 0;
+       return 0;
+}
+
+static int lgs8gxx_read_status(struct dvb_frontend *fe, fe_status_t *fe_status)
+{
+       struct lgs8gxx_state *priv = fe->demodulator_priv;
+       s8 ret;
+       u8 t;
+
+       dprintk("%s\n", __func__);
+
+       ret = lgs8gxx_read_reg(priv, 0x4B, &t);
+       if (ret != 0)
+               return -EIO;
+
+       dprintk("Reg 0x4B: 0x%02X\n", t);
+
+       *fe_status = 0;
+       if (priv->config->prod == LGS8GXX_PROD_LGS8913) {
+               if ((t & 0x40) == 0x40)
+                       *fe_status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;
+               if ((t & 0x80) == 0x80)
+                       *fe_status |= FE_HAS_VITERBI | FE_HAS_SYNC |
+                               FE_HAS_LOCK;
+       } else {
+               if ((t & 0x80) == 0x80)
+                       *fe_status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+                               FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
+       }
+
+       /* success */
+       dprintk("%s: fe_status=0x%x\n", __func__, *fe_status);
+       return 0;
+}
+
+static int lgs8gxx_read_signal_agc(struct lgs8gxx_state *priv, u16 *signal)
+{
+       u16 v;
+       u8 agc_lvl[2], cat;
+
+       dprintk("%s()\n", __func__);
+       lgs8gxx_read_reg(priv, 0x3F, &agc_lvl[0]);
+       lgs8gxx_read_reg(priv, 0x3E, &agc_lvl[1]);
+
+       v = agc_lvl[0];
+       v <<= 8;
+       v |= agc_lvl[1];
+
+       dprintk("agc_lvl: 0x%04X\n", v);
+
+       if (v < 0x100)
+               cat = 0;
+       else if (v < 0x190)
+               cat = 5;
+       else if (v < 0x2A8)
+               cat = 4;
+       else if (v < 0x381)
+               cat = 3;
+       else if (v < 0x400)
+               cat = 2;
+       else if (v == 0x400)
+               cat = 1;
+       else
+               cat = 0;
+
+       *signal = cat;
+
+       return 0;
+}
+
+static int lgs8913_read_signal_strength(struct lgs8gxx_state *priv, u16 *signal)
+{
+       u8 t; s8 ret;
+       s16 max_strength = 0;
+       u8 str;
+       u16 i, gi = priv->curr_gi;
+
+       dprintk("%s\n", __func__);
+
+       ret = lgs8gxx_read_reg(priv, 0x4B, &t);
+       if (ret != 0)
+               return -EIO;
+
+       if (fake_signal_str) {
+               if ((t & 0xC0) == 0xC0) {
+                       dprintk("Fake signal strength as 50\n");
+                       *signal = 0x32;
+               } else
+                       *signal = 0;
+               return 0;
+       }
+
+       dprintk("gi = %d\n", gi);
+       for (i = 0; i < gi; i++) {
+
+               if ((i & 0xFF) == 0)
+                       lgs8gxx_write_reg(priv, 0x84, 0x03 & (i >> 8));
+               lgs8gxx_write_reg(priv, 0x83, i & 0xFF);
+
+               lgs8gxx_read_reg(priv, 0x94, &str);
+               if (max_strength < str)
+                       max_strength = str;
+       }
+
+       *signal = max_strength;
+       dprintk("%s: signal=0x%02X\n", __func__, *signal);
+
+       lgs8gxx_read_reg(priv, 0x95, &t);
+       dprintk("%s: AVG Noise=0x%02X\n", __func__, t);
+
+       return 0;
+}
+
+static int lgs8gxx_read_signal_strength(struct dvb_frontend *fe, u16 *signal)
+{
+       struct lgs8gxx_state *priv = fe->demodulator_priv;
+
+       if (priv->config->prod == LGS8GXX_PROD_LGS8913)
+               return lgs8913_read_signal_strength(priv, signal);
+       else
+               return lgs8gxx_read_signal_agc(priv, signal);
+}
+
+static int lgs8gxx_read_snr(struct dvb_frontend *fe, u16 *snr)
+{
+       struct lgs8gxx_state *priv = fe->demodulator_priv;
+       u8 t;
+       *snr = 0;
+
+       lgs8gxx_read_reg(priv, 0x95, &t);
+       dprintk("AVG Noise=0x%02X\n", t);
+       *snr = 256 - t;
+       *snr <<= 8;
+       dprintk("snr=0x%x\n", *snr);
+
+       return 0;
+}
+
+static int lgs8gxx_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
+{
+       *ucblocks = 0;
+       dprintk("%s: ucblocks=0x%x\n", __func__, *ucblocks);
+       return 0;
+}
+
+static int lgs8gxx_read_ber(struct dvb_frontend *fe, u32 *ber)
+{
+       struct lgs8gxx_state *priv = fe->demodulator_priv;
+       u8 r0, r1, r2, r3;
+       u32 total_cnt, err_cnt;
+
+       dprintk("%s\n", __func__);
+
+       lgs8gxx_write_reg(priv, 0xc6, 0x01);
+       lgs8gxx_write_reg(priv, 0xc6, 0x41);
+       lgs8gxx_write_reg(priv, 0xc6, 0x01);
+
+       msleep(200);
+
+       lgs8gxx_write_reg(priv, 0xc6, 0x81);
+       lgs8gxx_read_reg(priv, 0xd0, &r0);
+       lgs8gxx_read_reg(priv, 0xd1, &r1);
+       lgs8gxx_read_reg(priv, 0xd2, &r2);
+       lgs8gxx_read_reg(priv, 0xd3, &r3);
+       total_cnt = (r3 << 24) | (r2 << 16) | (r1 << 8) | (r0);
+       lgs8gxx_read_reg(priv, 0xd4, &r0);
+       lgs8gxx_read_reg(priv, 0xd5, &r1);
+       lgs8gxx_read_reg(priv, 0xd6, &r2);
+       lgs8gxx_read_reg(priv, 0xd7, &r3);
+       err_cnt = (r3 << 24) | (r2 << 16) | (r1 << 8) | (r0);
+       dprintk("error=%d total=%d\n", err_cnt, total_cnt);
+
+       if (total_cnt == 0)
+               *ber = 0;
+       else
+               *ber = err_cnt * 100 / total_cnt;
+
+       dprintk("%s: ber=0x%x\n", __func__, *ber);
+       return 0;
+}
+
+static int lgs8gxx_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
+{
+       struct lgs8gxx_state *priv = fe->demodulator_priv;
+
+       if (priv->config->tuner_address == 0)
+               return 0;
+       if (enable) {
+               u8 v = 0x80 | priv->config->tuner_address;
+               return lgs8gxx_write_reg(priv, 0x01, v);
+       }
+       return lgs8gxx_write_reg(priv, 0x01, 0);
+}
+
+static struct dvb_frontend_ops lgs8gxx_ops = {
+       .info = {
+               .name = "Legend Silicon LGS8913/LGS8GXX DMB-TH",
+               .type = FE_OFDM,
+               .frequency_min = 474000000,
+               .frequency_max = 858000000,
+               .frequency_stepsize = 10000,
+               .caps =
+                       FE_CAN_FEC_AUTO |
+                       FE_CAN_QAM_AUTO |
+                       FE_CAN_TRANSMISSION_MODE_AUTO |
+                       FE_CAN_GUARD_INTERVAL_AUTO
+       },
+
+       .release = lgs8gxx_release,
+
+       .init = lgs8gxx_init,
+       .write = lgs8gxx_write,
+       .i2c_gate_ctrl = lgs8gxx_i2c_gate_ctrl,
+
+       .set_frontend = lgs8gxx_set_fe,
+       .get_frontend = lgs8gxx_get_fe,
+       .get_tune_settings = lgs8gxx_get_tune_settings,
+
+       .read_status = lgs8gxx_read_status,
+       .read_ber = lgs8gxx_read_ber,
+       .read_signal_strength = lgs8gxx_read_signal_strength,
+       .read_snr = lgs8gxx_read_snr,
+       .read_ucblocks = lgs8gxx_read_ucblocks,
+};
+
+struct dvb_frontend *lgs8gxx_attach(const struct lgs8gxx_config *config,
+       struct i2c_adapter *i2c)
+{
+       struct lgs8gxx_state *priv = NULL;
+       u8 data = 0;
+
+       dprintk("%s()\n", __func__);
+
+       if (config == NULL || i2c == NULL)
+               return NULL;
+
+       priv = kzalloc(sizeof(struct lgs8gxx_state), GFP_KERNEL);
+       if (priv == NULL)
+               goto error_out;
+
+       priv->config = config;
+       priv->i2c = i2c;
+
+       /* check if the demod is there */
+       if (lgs8gxx_read_reg(priv, 0, &data) != 0) {
+               dprintk("%s lgs8gxx not found at i2c addr 0x%02X\n",
+                       __func__, priv->config->demod_address);
+               goto error_out;
+       }
+
+       lgs8gxx_read_reg(priv, 1, &data);
+
+       memcpy(&priv->frontend.ops, &lgs8gxx_ops,
+              sizeof(struct dvb_frontend_ops));
+       priv->frontend.demodulator_priv = priv;
+
+       return &priv->frontend;
+
+error_out:
+       dprintk("%s() error_out\n", __func__);
+       kfree(priv);
+       return NULL;
+
+}
+EXPORT_SYMBOL(lgs8gxx_attach);
+
+MODULE_DESCRIPTION("Legend Silicon LGS8913/LGS8GXX DMB-TH demodulator driver");
+MODULE_AUTHOR("David T. L. Wong <davidtlwong@gmail.com>");
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/lgs8gxx.h b/drivers/media/dvb/frontends/lgs8gxx.h
new file mode 100644 (file)
index 0000000..321d366
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ *    Support for Legend Silicon DMB-TH demodulator
+ *    LGS8913, LGS8GL5
+ *    experimental support LGS8G42, LGS8G52
+ *
+ *    Copyright (C) 2007,2008 David T.L. Wong <davidtlwong@gmail.com>
+ *    Copyright (C) 2008 Sirius International (Hong Kong) Limited
+ *    Timothy Lee <timothy.lee@siriushk.com> (for initial work on LGS8GL5)
+ *
+ *    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 __LGS8GXX_H__
+#define __LGS8GXX_H__
+
+#include <linux/dvb/frontend.h>
+#include <linux/i2c.h>
+
+#define LGS8GXX_PROD_LGS8913 0
+#define LGS8GXX_PROD_LGS8GL5 1
+#define LGS8GXX_PROD_LGS8G42 3
+#define LGS8GXX_PROD_LGS8G52 4
+#define LGS8GXX_PROD_LGS8G54 5
+
+struct lgs8gxx_config {
+
+       /* product type */
+       u8 prod;
+
+       /* the demodulator's i2c address */
+       u8 demod_address;
+
+       /* parallel or serial transport stream */
+       u8 serial_ts;
+
+       /* transport stream polarity*/
+       u8 ts_clk_pol;
+
+       /* transport stream clock gated by ts_valid */
+       u8 ts_clk_gated;
+
+       /* A/D Clock frequency */
+       u32 if_clk_freq; /* in kHz */
+
+       /* IF frequency */
+       u32 if_freq; /* in kHz */
+
+       /*Use External ADC*/
+       u8 ext_adc;
+
+       /*External ADC output two's complement*/
+       u8 adc_signed;
+
+       /*Sample IF data at falling edge of IF_CLK*/
+       u8 if_neg_edge;
+
+       /*IF use Negative center frequency*/
+       u8 if_neg_center;
+
+       /* slave address and configuration of the tuner */
+       u8 tuner_address;
+};
+
+#if defined(CONFIG_DVB_LGS8GXX) || \
+       (defined(CONFIG_DVB_LGS8GXX_MODULE) && defined(MODULE))
+extern struct dvb_frontend *lgs8gxx_attach(const struct lgs8gxx_config *config,
+                                          struct i2c_adapter *i2c);
+#else
+static inline
+struct dvb_frontend *lgs8gxx_attach(const struct lgs8gxx_config *config,
+                                   struct i2c_adapter *i2c) {
+       printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
+       return NULL;
+}
+#endif /* CONFIG_DVB_LGS8GXX */
+
+#endif /* __LGS8GXX_H__ */
diff --git a/drivers/media/dvb/frontends/lgs8gxx_priv.h b/drivers/media/dvb/frontends/lgs8gxx_priv.h
new file mode 100644 (file)
index 0000000..9776d30
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ *    Support for Legend Silicon DMB-TH demodulator
+ *    LGS8913, LGS8GL5
+ *    experimental support LGS8G42, LGS8G52
+ *
+ *    Copyright (C) 2007,2008 David T.L. Wong <davidtlwong@gmail.com>
+ *    Copyright (C) 2008 Sirius International (Hong Kong) Limited
+ *    Timothy Lee <timothy.lee@siriushk.com> (for initial work on LGS8GL5)
+ *
+ *    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 LGS8913_PRIV_H
+#define LGS8913_PRIV_H
+
+struct lgs8gxx_state {
+       struct i2c_adapter *i2c;
+       /* configuration settings */
+       const struct lgs8gxx_config *config;
+       struct dvb_frontend frontend;
+       u16 curr_gi; /* current guard interval */
+};
+
+#define SC_MASK                0x1C    /* Sub-Carrier Modulation Mask */
+#define SC_QAM64       0x10    /* 64QAM modulation */
+#define SC_QAM32       0x0C    /* 32QAM modulation */
+#define SC_QAM16       0x08    /* 16QAM modulation */
+#define SC_QAM4NR      0x04    /* 4QAM modulation */
+#define SC_QAM4                0x00    /* 4QAM modulation */
+
+#define LGS_FEC_MASK   0x03    /* FEC Rate Mask */
+#define LGS_FEC_0_4    0x00    /* FEC Rate 0.4 */
+#define LGS_FEC_0_6    0x01    /* FEC Rate 0.6 */
+#define LGS_FEC_0_8    0x02    /* FEC Rate 0.8 */
+
+#define TIM_MASK         0x20  /* Time Interleave Length Mask */
+#define TIM_LONG         0x00  /* Time Interleave Length = 720 */
+#define TIM_MIDDLE     0x20   /* Time Interleave Length = 240 */
+
+#define CF_MASK        0x80    /* Control Frame Mask */
+#define CF_EN  0x80    /* Control Frame On */
+
+#define GI_MASK        0x03    /* Guard Interval Mask */
+#define GI_420 0x00    /* 1/9 Guard Interval */
+#define GI_595 0x01    /* */
+#define GI_945 0x02    /* 1/4 Guard Interval */
+
+
+#define TS_PARALLEL    0x00    /* Parallel TS Output a.k.a. SPI */
+#define TS_SERIAL      0x01    /* Serial TS Output a.k.a. SSI */
+#define TS_CLK_NORMAL          0x00    /* MPEG Clock Normal */
+#define TS_CLK_INVERTED                0x02    /* MPEG Clock Inverted */
+#define TS_CLK_GATED           0x00    /* MPEG clock gated */
+#define TS_CLK_FREERUN         0x04    /* MPEG clock free running*/
+
+
+#endif
index ee89623be85aa32a3a749c1e00217efd9d2d4bcb..598eaf8acc6e4ef4881fe1a862716142698b5c97 100644 (file)
@@ -616,7 +616,7 @@ static int __devinit pluto2_probe(struct pci_dev *pdev,
        /* enable interrupts */
        pci_write_config_dword(pdev, 0x6c, 0x8000);
 
-       ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (ret < 0)
                goto err_pci_disable_device;
 
index cc54ed4efc488fb49ad60102e1eb682e86b9ec35..6135762022940ec4095538bfa446803fb2be6373 100644 (file)
@@ -33,6 +33,9 @@
 
  History:
 
+ Version 0.45:
+       Converted to v4l2_device.
+
  Version 0.44:
        Add suspend/resume functions, fix unplug of device,
        a lot of cleanups and fixes by Alexey Klimov <klimov.linux@gmail.com>
@@ -88,7 +91,7 @@
 #include <linux/slab.h>
 #include <linux/input.h>
 #include <linux/videodev2.h>
-#include <media/v4l2-common.h>
+#include <media/v4l2-device.h>
 #include <media/v4l2-ioctl.h>
 #include <linux/usb.h>
 
  */
 #include <linux/version.h>     /* for KERNEL_VERSION MACRO     */
 
-#define DRIVER_VERSION "v0.44"
-#define RADIO_VERSION KERNEL_VERSION(0, 4, 4)
-
-static struct v4l2_queryctrl radio_qctrl[] = {
-       {
-               .id            = V4L2_CID_AUDIO_MUTE,
-               .name          = "Mute",
-               .minimum       = 0,
-               .maximum       = 1,
-               .default_value = 1,
-               .type          = V4L2_CTRL_TYPE_BOOLEAN,
-       },
-/* HINT: the disabled controls are only here to satify kradio and such apps */
-       {       .id             = V4L2_CID_AUDIO_VOLUME,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-       {
-               .id             = V4L2_CID_AUDIO_BALANCE,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-       {
-               .id             = V4L2_CID_AUDIO_BASS,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-       {
-               .id             = V4L2_CID_AUDIO_TREBLE,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-       {
-               .id             = V4L2_CID_AUDIO_LOUDNESS,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-};
+#define DRIVER_VERSION "v0.45"
+#define RADIO_VERSION KERNEL_VERSION(0, 4, 5)
 
 #define DRIVER_AUTHOR "Markus Demleitner <msdemlei@tucana.harvard.edu>"
 #define DRIVER_DESC "D-Link DSB-R100 USB FM radio driver"
@@ -167,6 +139,8 @@ module_param(radio_nr, int, 0);
 struct dsbr100_device {
        struct usb_device *usbdev;
        struct video_device videodev;
+       struct v4l2_device v4l2_dev;
+
        u8 *transfer_buffer;
        struct mutex lock;      /* buffer locking */
        int curfreq;
@@ -384,6 +358,7 @@ static void usb_dsbr100_disconnect(struct usb_interface *intf)
        mutex_unlock(&radio->lock);
 
        video_unregister_device(&radio->videodev);
+       v4l2_device_disconnect(&radio->v4l2_dev);
 }
 
 
@@ -479,14 +454,11 @@ static int vidioc_g_frequency(struct file *file, void *priv,
 static int vidioc_queryctrl(struct file *file, void *priv,
                                struct v4l2_queryctrl *qc)
 {
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(radio_qctrl); i++) {
-               if (qc->id && qc->id == radio_qctrl[i].id) {
-                       memcpy(qc, &(radio_qctrl[i]), sizeof(*qc));
-                       return 0;
-               }
+       switch (qc->id) {
+       case V4L2_CID_AUDIO_MUTE:
+               return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
        }
+
        return -EINVAL;
 }
 
@@ -656,6 +628,7 @@ static void usb_dsbr100_video_device_release(struct video_device *videodev)
 {
        struct dsbr100_device *radio = videodev_to_radio(videodev);
 
+       v4l2_device_unregister(&radio->v4l2_dev);
        kfree(radio->transfer_buffer);
        kfree(radio);
 }
@@ -683,22 +656,15 @@ static const struct v4l2_ioctl_ops usb_dsbr100_ioctl_ops = {
        .vidioc_s_input     = vidioc_s_input,
 };
 
-/* V4L2 interface */
-static struct video_device dsbr100_videodev_data = {
-       .name           = "D-Link DSB-R 100",
-       .fops           = &usb_dsbr100_fops,
-       .ioctl_ops      = &usb_dsbr100_ioctl_ops,
-       .release        = usb_dsbr100_video_device_release,
-};
-
 /* check if the device is present and register with v4l and usb if it is */
 static int usb_dsbr100_probe(struct usb_interface *intf,
                                const struct usb_device_id *id)
 {
        struct dsbr100_device *radio;
+       struct v4l2_device *v4l2_dev;
        int retval;
 
-       radio = kmalloc(sizeof(struct dsbr100_device), GFP_KERNEL);
+       radio = kzalloc(sizeof(struct dsbr100_device), GFP_KERNEL);
 
        if (!radio)
                return -ENOMEM;
@@ -710,17 +676,35 @@ static int usb_dsbr100_probe(struct usb_interface *intf,
                return -ENOMEM;
        }
 
+       v4l2_dev = &radio->v4l2_dev;
+
+       retval = v4l2_device_register(&intf->dev, v4l2_dev);
+       if (retval < 0) {
+               v4l2_err(v4l2_dev, "couldn't register v4l2_device\n");
+               kfree(radio->transfer_buffer);
+               kfree(radio);
+               return retval;
+       }
+
+       strlcpy(radio->videodev.name, v4l2_dev->name, sizeof(radio->videodev.name));
+       radio->videodev.v4l2_dev = v4l2_dev;
+       radio->videodev.fops = &usb_dsbr100_fops;
+       radio->videodev.ioctl_ops = &usb_dsbr100_ioctl_ops;
+       radio->videodev.release = usb_dsbr100_video_device_release;
+
        mutex_init(&radio->lock);
-       radio->videodev = dsbr100_videodev_data;
 
        radio->removed = 0;
        radio->users = 0;
        radio->usbdev = interface_to_usbdev(intf);
        radio->curfreq = FREQ_MIN * FREQ_MUL;
+
        video_set_drvdata(&radio->videodev, radio);
+
        retval = video_register_device(&radio->videodev, VFL_TYPE_RADIO, radio_nr);
        if (retval < 0) {
-               dev_err(&intf->dev, "couldn't register video device\n");
+               v4l2_err(v4l2_dev, "couldn't register video device\n");
+               v4l2_device_unregister(v4l2_dev);
                kfree(radio->transfer_buffer);
                kfree(radio);
                return -EIO;
index ac82e33cb6fcb89bf977d22b7f29bc590957c8d9..35edee009ba8b859378fcdf9e11a1f8fab1835b2 100644 (file)
@@ -355,20 +355,8 @@ static int vidioc_s_audio(struct file *file, void *priv,
        return a->index ? -EINVAL : 0;
 }
 
-static int rtrack_open(struct file *file)
-{
-       return 0;
-}
-
-static int rtrack_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations rtrack_fops = {
        .owner          = THIS_MODULE,
-       .open           = rtrack_open,
-       .release        = rtrack_release,
        .ioctl          = video_ioctl2,
 };
 
index 49299f7fd8341df92c7632faec4f17e5bbcfc5e6..8daf809eb01aa8c8fa218e177460fd190defc1ce 100644 (file)
@@ -318,20 +318,8 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
        return -EINVAL;
 }
 
-static int aztech_open(struct file *file)
-{
-       return 0;
-}
-
-static int aztech_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations aztech_fops = {
        .owner          = THIS_MODULE,
-       .open           = aztech_open,
-       .release        = aztech_release,
        .ioctl          = video_ioctl2,
 };
 
index 09265d25725e993c7fed2e64f0d4c2749b104c30..c3f579de6e7171b1c7dce048b82ce526b0ba9c59 100644 (file)
@@ -356,20 +356,8 @@ static struct pci_device_id gemtek_pci_id[] =
 
 MODULE_DEVICE_TABLE(pci, gemtek_pci_id);
 
-static int gemtek_pci_open(struct file *file)
-{
-       return 0;
-}
-
-static int gemtek_pci_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations gemtek_pci_fops = {
        .owner          = THIS_MODULE,
-       .open           = gemtek_pci_open,
-       .release        = gemtek_pci_release,
        .ioctl          = video_ioctl2,
 };
 
index 150464426d1d227e75348a6e3debc551b3551b1e..73985f641f072d361d128f769530281b150ffbfb 100644 (file)
@@ -375,20 +375,9 @@ static int gemtek_probe(struct gemtek *gt)
 /*
  * Video 4 Linux stuff.
  */
-static int gemtek_open(struct file *file)
-{
-       return 0;
-}
-
-static int gemtek_release(struct file *file)
-{
-       return 0;
-}
 
 static const struct v4l2_file_operations gemtek_fops = {
        .owner          = THIS_MODULE,
-       .open           = gemtek_open,
-       .release        = gemtek_release,
        .ioctl          = video_ioctl2,
 };
 
index 01a6d22950ade8ab7725fa9bc9e56e8e5a067f51..64d737c35acf18de14d9cc625ba7982ae3f3d641 100644 (file)
@@ -292,20 +292,8 @@ static int vidioc_s_audio(struct file *file, void *priv,
        return a->index ? -EINVAL : 0;
 }
 
-static int maestro_open(struct file *file)
-{
-       return 0;
-}
-
-static int maestro_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations maestro_fops = {
        .owner          = THIS_MODULE,
-       .open           = maestro_open,
-       .release        = maestro_release,
        .ioctl          = video_ioctl2,
 };
 
index 2606f0b303554ed88dee27dd2353d7c3b81cfd7d..3da51fe8fb937c46ab349a345ecea6a8cddcbfc7 100644 (file)
@@ -339,20 +339,8 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
        return -EINVAL;
 }
 
-static int maxiradio_open(struct file *file)
-{
-       return 0;
-}
-
-static int maxiradio_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations maxiradio_fops = {
        .owner          = THIS_MODULE,
-       .open           = maxiradio_open,
-       .release        = maxiradio_release,
        .ioctl          = video_ioctl2,
 };
 
index ded25bfb366e7ccc748c60bdf17ba6685f668197..cab19d05e02f91567750c427c4e45dfed73463e7 100644 (file)
@@ -43,6 +43,7 @@
  *                     Douglas Schilling Landgraf <dougsland@gmail.com> and
  *                     David Ellingsworth <david@identd.dyndns.org>
  *                     for discussion, help and support.
+ * Version 0.11:       Converted to v4l2_device.
  *
  * Many things to do:
  *     - Correct power managment of device (suspend & resume)
@@ -59,7 +60,7 @@
 #include <linux/slab.h>
 #include <linux/input.h>
 #include <linux/videodev2.h>
-#include <media/v4l2-common.h>
+#include <media/v4l2-device.h>
 #include <media/v4l2-ioctl.h>
 #include <linux/usb.h>
 #include <linux/version.h>     /* for KERNEL_VERSION MACRO */
@@ -67,8 +68,8 @@
 /* driver and module definitions */
 #define DRIVER_AUTHOR "Alexey Klimov <klimov.linux@gmail.com>"
 #define DRIVER_DESC "AverMedia MR 800 USB FM radio driver"
-#define DRIVER_VERSION "0.10"
-#define RADIO_VERSION KERNEL_VERSION(0, 1, 0)
+#define DRIVER_VERSION "0.11"
+#define RADIO_VERSION KERNEL_VERSION(0, 1, 1)
 
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(DRIVER_DESC);
@@ -113,38 +114,6 @@ static int radio_nr = -1;
 module_param(radio_nr, int, 0);
 MODULE_PARM_DESC(radio_nr, "Radio Nr");
 
-static struct v4l2_queryctrl radio_qctrl[] = {
-       {
-               .id            = V4L2_CID_AUDIO_MUTE,
-               .name          = "Mute",
-               .minimum       = 0,
-               .maximum       = 1,
-               .step          = 1,
-               .default_value = 1,
-               .type          = V4L2_CTRL_TYPE_BOOLEAN,
-       },
-/* HINT: the disabled controls are only here to satify kradio and such apps */
-       {       .id             = V4L2_CID_AUDIO_VOLUME,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-       {
-               .id             = V4L2_CID_AUDIO_BALANCE,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-       {
-               .id             = V4L2_CID_AUDIO_BASS,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-       {
-               .id             = V4L2_CID_AUDIO_TREBLE,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-       {
-               .id             = V4L2_CID_AUDIO_LOUDNESS,
-               .flags          = V4L2_CTRL_FLAG_DISABLED,
-       },
-};
-
 static int usb_amradio_probe(struct usb_interface *intf,
                             const struct usb_device_id *id);
 static void usb_amradio_disconnect(struct usb_interface *intf);
@@ -159,6 +128,7 @@ struct amradio_device {
        /* reference to USB and video device */
        struct usb_device *usbdev;
        struct video_device *videodev;
+       struct v4l2_device v4l2_dev;
 
        unsigned char *buffer;
        struct mutex lock;      /* buffer locking */
@@ -329,6 +299,7 @@ static void usb_amradio_disconnect(struct usb_interface *intf)
 
        usb_set_intfdata(intf, NULL);
        video_unregister_device(radio->videodev);
+       v4l2_device_disconnect(&radio->v4l2_dev);
 }
 
 /* vidioc_querycap - query device capabilities */
@@ -463,14 +434,11 @@ static int vidioc_g_frequency(struct file *file, void *priv,
 static int vidioc_queryctrl(struct file *file, void *priv,
                                struct v4l2_queryctrl *qc)
 {
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(radio_qctrl); i++) {
-               if (qc->id && qc->id == radio_qctrl[i].id) {
-                       memcpy(qc, &(radio_qctrl[i]), sizeof(*qc));
-                       return 0;
-               }
+       switch (qc->id) {
+       case V4L2_CID_AUDIO_MUTE:
+               return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
        }
+
        return -EINVAL;
 }
 
@@ -671,34 +639,29 @@ static const struct v4l2_ioctl_ops usb_amradio_ioctl_ops = {
        .vidioc_s_input     = vidioc_s_input,
 };
 
-static void usb_amradio_device_release(struct video_device *videodev)
+static void usb_amradio_video_device_release(struct video_device *videodev)
 {
        struct amradio_device *radio = video_get_drvdata(videodev);
 
        /* we call v4l to free radio->videodev */
        video_device_release(videodev);
 
+       v4l2_device_unregister(&radio->v4l2_dev);
+
        /* free rest memory */
        kfree(radio->buffer);
        kfree(radio);
 }
 
-/* V4L2 interface */
-static struct video_device amradio_videodev_template = {
-       .name           = "AverMedia MR 800 USB FM Radio",
-       .fops           = &usb_amradio_fops,
-       .ioctl_ops      = &usb_amradio_ioctl_ops,
-       .release        = usb_amradio_device_release,
-};
-
 /* check if the device is present and register with v4l and usb if it is */
 static int usb_amradio_probe(struct usb_interface *intf,
                                const struct usb_device_id *id)
 {
        struct amradio_device *radio;
+       struct v4l2_device *v4l2_dev;
        int retval;
 
-       radio = kmalloc(sizeof(struct amradio_device), GFP_KERNEL);
+       radio = kzalloc(sizeof(struct amradio_device), GFP_KERNEL);
 
        if (!radio) {
                dev_err(&intf->dev, "kmalloc for amradio_device failed\n");
@@ -713,6 +676,15 @@ static int usb_amradio_probe(struct usb_interface *intf,
                return -ENOMEM;
        }
 
+       v4l2_dev = &radio->v4l2_dev;
+       retval = v4l2_device_register(&intf->dev, v4l2_dev);
+       if (retval < 0) {
+               dev_err(&intf->dev, "couldn't register v4l2_device\n");
+               kfree(radio->buffer);
+               kfree(radio);
+               return retval;
+       }
+
        radio->videodev = video_device_alloc();
 
        if (!radio->videodev) {
@@ -722,8 +694,11 @@ static int usb_amradio_probe(struct usb_interface *intf,
                return -ENOMEM;
        }
 
-       memcpy(radio->videodev, &amradio_videodev_template,
-               sizeof(amradio_videodev_template));
+       strlcpy(radio->videodev->name, v4l2_dev->name, sizeof(radio->videodev->name));
+       radio->videodev->v4l2_dev = v4l2_dev;
+       radio->videodev->fops = &usb_amradio_fops;
+       radio->videodev->ioctl_ops = &usb_amradio_ioctl_ops;
+       radio->videodev->release = usb_amradio_video_device_release;
 
        radio->removed = 0;
        radio->users = 0;
@@ -734,10 +709,12 @@ static int usb_amradio_probe(struct usb_interface *intf,
        mutex_init(&radio->lock);
 
        video_set_drvdata(radio->videodev, radio);
+
        retval = video_register_device(radio->videodev, VFL_TYPE_RADIO, radio_nr);
        if (retval < 0) {
                dev_err(&intf->dev, "could not register video device\n");
                video_device_release(radio->videodev);
+               v4l2_device_unregister(v4l2_dev);
                kfree(radio->buffer);
                kfree(radio);
                return -EIO;
index d1e6b01d4eca76caa70818c051dd843d9d251459..9cb193fa6e335c367920e2079b67716e17378b6c 100644 (file)
@@ -260,20 +260,8 @@ static int vidioc_s_audio(struct file *file, void *priv,
        return a->index ? -EINVAL : 0;
 }
 
-static int rtrack2_open(struct file *file)
-{
-       return 0;
-}
-
-static int rtrack2_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations rtrack2_fops = {
        .owner          = THIS_MODULE,
-       .open           = rtrack2_open,
-       .release        = rtrack2_release,
        .ioctl          = video_ioctl2,
 };
 
index f4784f0d1a887a1cb63cfa5d2411168a4a0a535c..1dba8f0832a05427aa094683d0be06807955d75e 100644 (file)
@@ -260,20 +260,8 @@ static int vidioc_s_audio(struct file *file, void *priv,
        return a->index ? -EINVAL : 0;
 }
 
-static int fmi_open(struct file *file)
-{
-       return 0;
-}
-
-static int fmi_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations fmi_fops = {
        .owner          = THIS_MODULE,
-       .open           = fmi_open,
-       .release        = fmi_release,
        .ioctl          = video_ioctl2,
 };
 
index 0ba9d88a80fc06d155100ae92bb41b6d102f3474..c09ca8600ea1d0a2e3219bd26e2d511a0b7e9e6f 100644 (file)
@@ -377,20 +377,8 @@ static int vidioc_s_audio(struct file *file, void *priv,
        return a->index ? -EINVAL : 0;
 }
 
-static int fmr2_open(struct file *file)
-{
-       return 0;
-}
-
-static int fmr2_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations fmr2_fops = {
        .owner          = THIS_MODULE,
-       .open           = fmr2_open,
-       .release        = fmr2_release,
        .ioctl          = video_ioctl2,
 };
 
index 713e242ba8b217e8e7a4acfe6cd1f6b57bbfa9fa..92c297796a9fd25eb00355072409f45a6a778600 100644 (file)
@@ -1686,7 +1686,7 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
        /* show some infos about the specific si470x device */
        if (si470x_get_all_registers(radio) < 0) {
                retval = -EIO;
-               goto err_all;
+               goto err_video;
        }
        printk(KERN_INFO DRIVER_NAME ": DeviceID=0x%4.4hx ChipID=0x%4.4hx\n",
                        radio->registers[DEVICEID], radio->registers[CHIPID]);
@@ -1694,7 +1694,7 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
        /* get software and hardware versions */
        if (si470x_get_scratch_page_versions(radio) < 0) {
                retval = -EIO;
-               goto err_all;
+               goto err_video;
        }
        printk(KERN_INFO DRIVER_NAME
                        ": software version %d, hardware version %d\n",
@@ -1727,7 +1727,7 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
        radio->buffer = kmalloc(radio->buf_size, GFP_KERNEL);
        if (!radio->buffer) {
                retval = -EIO;
-               goto err_all;
+               goto err_video;
        }
 
        /* rds buffer configuration */
@@ -1749,8 +1749,9 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
 
        return 0;
 err_all:
-       video_device_release(radio->videodev);
        kfree(radio->buffer);
+err_video:
+       video_device_release(radio->videodev);
 err_radio:
        kfree(radio);
 err_initial:
index 5b007f5c74b2839e262d6fe801309c4248926595..699db9acaaf79e18df99e0baa9afc708caef9e84 100644 (file)
@@ -332,20 +332,8 @@ static int vidioc_s_audio(struct file *file, void *priv,
        return a->index ? -EINVAL : 0;
 }
 
-static int terratec_open(struct file *file)
-{
-       return 0;
-}
-
-static int terratec_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations terratec_fops = {
        .owner          = THIS_MODULE,
-       .open           = terratec_open,
-       .release        = terratec_release,
        .ioctl          = video_ioctl2,
 };
 
index d1be6492a07b1593e466a6012fc14b468577d596..6f9ecc359356c1cc20f93210d5558f072ca66c76 100644 (file)
@@ -338,20 +338,8 @@ static int vidioc_s_audio(struct file *file, void *priv,
        return a->index ? -EINVAL : 0;
 }
 
-static int trust_open(struct file *file)
-{
-       return 0;
-}
-
-static int trust_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations trust_fops = {
        .owner          = THIS_MODULE,
-       .open           = trust_open,
-       .release        = trust_release,
        .ioctl          = video_ioctl2,
 };
 
index 92d923c7f3603e68fea5932b828697f1becb08bb..3a98f139949565e23c84ce6ba7cd715b79d36e39 100644 (file)
@@ -314,20 +314,8 @@ static int vidioc_log_status(struct file *file, void *priv)
        return 0;
 }
 
-static int typhoon_open(struct file *file)
-{
-       return 0;
-}
-
-static int typhoon_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations typhoon_fops = {
        .owner          = THIS_MODULE,
-       .open           = typhoon_open,
-       .release        = typhoon_release,
        .ioctl          = video_ioctl2,
 };
 
index 1f85f2024dc041625aca396912147aad44e8e5b0..80e98b6422fe76d4d48847f23e0a73199a4472dc 100644 (file)
@@ -370,21 +370,9 @@ static int vidioc_s_audio(struct file *file, void *priv,
        return a->index ? -EINVAL : 0;
 }
 
-static int zoltrix_open(struct file *file)
-{
-       return 0;
-}
-
-static int zoltrix_release(struct file *file)
-{
-       return 0;
-}
-
 static const struct v4l2_file_operations zoltrix_fops =
 {
        .owner          = THIS_MODULE,
-       .open           = zoltrix_open,
-       .release        = zoltrix_release,
        .ioctl          = video_ioctl2,
 };
 
index 76bad58195928625583733b64009cc5e43dd4920..9d48da2fb013d9db9c656fb20437d8aab9910c6d 100644 (file)
@@ -746,6 +746,18 @@ config SOC_CAMERA_OV772X
        help
          This is a ov772x camera driver
 
+config MX1_VIDEO
+       bool
+
+config VIDEO_MX1
+       tristate "i.MX1/i.MXL CMOS Sensor Interface driver"
+       depends on VIDEO_DEV && ARCH_MX1 && SOC_CAMERA
+       select FIQ
+       select VIDEOBUF_DMA_CONTIG
+       select MX1_VIDEO
+       ---help---
+         This is a v4l2 driver for the i.MX1/i.MXL CMOS Sensor Interface
+
 config VIDEO_MX3
        tristate "i.MX3x Camera Sensor Interface driver"
        depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA
@@ -795,6 +807,8 @@ source "drivers/media/video/hdpvr/Kconfig"
 
 source "drivers/media/video/em28xx/Kconfig"
 
+source "drivers/media/video/cx231xx/Kconfig"
+
 source "drivers/media/video/usbvision/Kconfig"
 
 source "drivers/media/video/usbvideo/Kconfig"
@@ -904,5 +918,4 @@ config USB_S2255
          This driver can be compiled as a module, called s2255drv.
 
 endif # V4L_USB_DRIVERS
-
 endif # VIDEO_CAPTURE_DRIVERS
index b9046744463b9f51cd0fe5d659afde2337d23ab9..3f1a0350a5690a772b9c88dba113223cfca49e47 100644 (file)
@@ -10,7 +10,7 @@ stkwebcam-objs        :=      stk-webcam.o stk-sensor.o
 
 omap2cam-objs  :=      omap24xxcam.o omap24xxcam-dma.o
 
-videodev-objs  :=      v4l2-dev.o v4l2-ioctl.o v4l2-device.o v4l2-subdev.o
+videodev-objs  :=      v4l2-dev.o v4l2-ioctl.o v4l2-device.o
 
 obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-int-device.o
 ifeq ($(CONFIG_COMPAT),y)
@@ -67,6 +67,7 @@ obj-$(CONFIG_VIDEO_MEYE) += meye.o
 obj-$(CONFIG_VIDEO_SAA7134) += saa7134/
 obj-$(CONFIG_VIDEO_CX88) += cx88/
 obj-$(CONFIG_VIDEO_EM28XX) += em28xx/
+obj-$(CONFIG_VIDEO_CX231XX) += cx231xx/
 obj-$(CONFIG_VIDEO_USBVISION) += usbvision/
 obj-$(CONFIG_VIDEO_TVP5150) += tvp5150.o
 obj-$(CONFIG_VIDEO_TVP514X) += tvp514x.o
@@ -133,6 +134,7 @@ obj-$(CONFIG_VIDEO_CX18) += cx18/
 obj-$(CONFIG_VIDEO_VIVI) += vivi.o
 obj-$(CONFIG_VIDEO_CX23885) += cx23885/
 
+obj-$(CONFIG_VIDEO_MX1)                        += mx1_camera.o
 obj-$(CONFIG_VIDEO_MX3)                        += mx3_camera.o
 obj-$(CONFIG_VIDEO_PXA27x)             += pxa_camera.o
 obj-$(CONFIG_VIDEO_SH_MOBILE_CEU)      += sh_mobile_ceu_camera.o
index 873c30a41bd74420f408bc41216ea4a8f0d47ba9..97b003449c91f33e3df579d06f188634031931cd 100644 (file)
@@ -219,18 +219,19 @@ static int adv7170_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int adv7170_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int adv7170_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        struct adv7170 *encoder = to_adv7170(sd);
 
-       /* RJ: route->input = 0: input is from decoder
-          route->input = 1: input is from ZR36060
-          route->input = 2: color bar */
+       /* RJ: input = 0: input is from decoder
+          input = 1: input is from ZR36060
+          input = 2: color bar */
 
        v4l2_dbg(1, debug, sd, "set input from %s\n",
-                       route->input == 0 ? "decoder" : "ZR36060");
+                       input == 0 ? "decoder" : "ZR36060");
 
-       switch (route->input) {
+       switch (input) {
        case 0:
                adv7170_write(sd, 0x01, 0x20);
                adv7170_write(sd, 0x08, TR1CAPT);       /* TR1 */
@@ -250,11 +251,11 @@ static int adv7170_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
                break;
 
        default:
-               v4l2_dbg(1, debug, sd, "illegal input: %d\n", route->input);
+               v4l2_dbg(1, debug, sd, "illegal input: %d\n", input);
                return -EINVAL;
        }
-       v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[route->input]);
-       encoder->input = route->input;
+       v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[input]);
+       encoder->input = input;
        return 0;
 }
 
index ff12103032952c058178166f1c631d9dc38572a0..cf8c06c85ded992adf227ac24d306af3c2813868 100644 (file)
@@ -237,15 +237,16 @@ static int adv7175_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int adv7175_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int adv7175_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        struct adv7175 *encoder = to_adv7175(sd);
 
-       /* RJ: route->input = 0: input is from decoder
-          route->input = 1: input is from ZR36060
-          route->input = 2: color bar */
+       /* RJ: input = 0: input is from decoder
+          input = 1: input is from ZR36060
+          input = 2: color bar */
 
-       switch (route->input) {
+       switch (input) {
        case 0:
                adv7175_write(sd, 0x01, 0x00);
 
@@ -288,11 +289,11 @@ static int adv7175_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
                break;
 
        default:
-               v4l2_dbg(1, debug, sd, "illegal input: %d\n", route->input);
+               v4l2_dbg(1, debug, sd, "illegal input: %d\n", input);
                return -EINVAL;
        }
-       v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[route->input]);
-       encoder->input = route->input;
+       v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[input]);
+       encoder->input = input;
        return 0;
 }
 
index 05cdf494dfb0d7c320f4dcaf5a6dc63e9f5d83da..0c3a5ba0e857d85b8a657c476e2f36aaf509eb01 100644 (file)
@@ -4,6 +4,7 @@ config VIDEO_AU0828
        depends on I2C && INPUT && DVB_CORE && USB && VIDEO_V4L2
        select I2C_ALGOBIT
        select VIDEO_TVEEPROM
+       select VIDEOBUF_VMALLOC
        select DVB_AU8522 if !DVB_FE_CUSTOMISE
        select MEDIA_TUNER_XC5000 if !MEDIA_TUNER_CUSTOMISE
        select MEDIA_TUNER_MXL5007T if !MEDIA_TUNER_CUSTOMISE
index 1aabaa7e55bb0bb3f7930bc13ff6e831c4b73c41..053bbe8c8e3aaf89bd8850c5196400fdeb34e129 100644 (file)
@@ -46,6 +46,7 @@ struct au0828_board au0828_boards[] = {
                .name   = "Hauppauge HVR850",
                .tuner_type = TUNER_XC5000,
                .tuner_addr = 0x61,
+               .i2c_clk_divider = AU0828_I2C_CLK_30KHZ,
                .input = {
                        {
                                .type = AU0828_VMUX_TELEVISION,
@@ -70,6 +71,13 @@ struct au0828_board au0828_boards[] = {
                .name   = "Hauppauge HVR950Q",
                .tuner_type = TUNER_XC5000,
                .tuner_addr = 0x61,
+               /* The au0828 hardware i2c implementation does not properly
+                  support the xc5000's i2c clock stretching.  So we need to
+                  lower the clock frequency enough where the 15us clock
+                  stretch fits inside of a normal clock cycle, or else the
+                  au0828 fails to set the STOP bit.  A 30 KHz clock puts the
+                  clock pulse width at 18us */
+               .i2c_clk_divider = AU0828_I2C_CLK_30KHZ,
                .input = {
                        {
                                .type = AU0828_VMUX_TELEVISION,
@@ -94,16 +102,19 @@ struct au0828_board au0828_boards[] = {
                .name   = "Hauppauge HVR950Q rev xxF8",
                .tuner_type = UNSET,
                .tuner_addr = ADDR_UNSET,
+               .i2c_clk_divider = AU0828_I2C_CLK_250KHZ,
        },
        [AU0828_BOARD_DVICO_FUSIONHDTV7] = {
                .name   = "DViCO FusionHDTV USB",
                .tuner_type = UNSET,
                .tuner_addr = ADDR_UNSET,
+               .i2c_clk_divider = AU0828_I2C_CLK_250KHZ,
        },
        [AU0828_BOARD_HAUPPAUGE_WOODBURY] = {
                .name = "Hauppauge Woodbury",
                .tuner_type = UNSET,
                .tuner_addr = ADDR_UNSET,
+               .i2c_clk_divider = AU0828_I2C_CLK_250KHZ,
        },
 };
 
@@ -200,8 +211,8 @@ void au0828_card_setup(struct au0828_dev *dev)
                /* Load the analog demodulator driver (note this would need to
                   be abstracted out if we ever need to support a different
                   demod) */
-               sd = v4l2_i2c_new_subdev(&dev->i2c_adap, "au8522", "au8522",
-                                        0x8e >> 1);
+               sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                               "au8522", "au8522", 0x8e >> 1);
                if (sd == NULL)
                        printk(KERN_ERR "analog subdev registration failed\n");
        }
@@ -209,8 +220,8 @@ void au0828_card_setup(struct au0828_dev *dev)
        /* Setup tuners */
        if (dev->board.tuner_type != TUNER_ABSENT) {
                /* Load the tuner module, which does the attach */
-               sd = v4l2_i2c_new_subdev(&dev->i2c_adap, "tuner", "tuner",
-                                        dev->board.tuner_addr);
+               sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                               "tuner", "tuner", dev->board.tuner_addr);
                if (sd == NULL)
                        printk(KERN_ERR "tuner subdev registration fail\n");
 
index 8c761d1644420fa164108b1421ff314e636ca66e..4cee0b92eeee31b9f9b39d09c308b14da3ef613e 100644 (file)
@@ -36,8 +36,6 @@ int au0828_debug;
 module_param_named(debug, au0828_debug, int, 0644);
 MODULE_PARM_DESC(debug, "enable debug messages");
 
-static atomic_t au0828_instance = ATOMIC_INIT(0);
-
 #define _AU0828_BULKPIPE 0x03
 #define _BULKPIPESIZE 0xffff
 
@@ -169,7 +167,7 @@ static void au0828_usb_disconnect(struct usb_interface *interface)
 static int au0828_usb_probe(struct usb_interface *interface,
        const struct usb_device_id *id)
 {
-       int ifnum, retval, i;
+       int ifnum, retval;
        struct au0828_dev *dev;
        struct usb_device *usbdev = interface_to_usbdev(interface);
 
@@ -197,10 +195,7 @@ static int au0828_usb_probe(struct usb_interface *interface,
        usb_set_intfdata(interface, dev);
 
        /* Create the v4l2_device */
-       i = atomic_inc_return(&au0828_instance) - 1;
-       snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s-%03d",
-                "au0828", i);
-       retval = v4l2_device_register(&dev->usbdev->dev, &dev->v4l2_dev);
+       retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
        if (retval) {
                printk(KERN_ERR "%s() v4l2_device_register failed\n",
                       __func__);
index f9a958d0aef1bb05bc57a1ad8090c286dec43e16..13e494365e706d54a2bfc42dd64ac41140c75e4a 100644 (file)
@@ -39,13 +39,15 @@ MODULE_PARM_DESC(i2c_scan, "scan i2c bus at insmod time");
 static inline int i2c_slave_did_write_ack(struct i2c_adapter *i2c_adap)
 {
        struct au0828_dev *dev = i2c_adap->algo_data;
-       return au0828_read(dev, REG_201) & 0x08 ? 0 : 1;
+       return au0828_read(dev, AU0828_I2C_STATUS_201) &
+               AU0828_I2C_STATUS_NO_WRITE_ACK ? 0 : 1;
 }
 
 static inline int i2c_slave_did_read_ack(struct i2c_adapter *i2c_adap)
 {
        struct au0828_dev *dev = i2c_adap->algo_data;
-       return au0828_read(dev, REG_201) & 0x02 ? 0 : 1;
+       return au0828_read(dev, AU0828_I2C_STATUS_201) &
+               AU0828_I2C_STATUS_NO_READ_ACK ? 0 : 1;
 }
 
 static int i2c_wait_read_ack(struct i2c_adapter *i2c_adap)
@@ -67,7 +69,8 @@ static int i2c_wait_read_ack(struct i2c_adapter *i2c_adap)
 static inline int i2c_is_read_busy(struct i2c_adapter *i2c_adap)
 {
        struct au0828_dev *dev = i2c_adap->algo_data;
-       return au0828_read(dev, REG_201) & 0x01 ? 0 : 1;
+       return au0828_read(dev, AU0828_I2C_STATUS_201) &
+               AU0828_I2C_STATUS_READ_DONE ? 0 : 1;
 }
 
 static int i2c_wait_read_done(struct i2c_adapter *i2c_adap)
@@ -89,7 +92,8 @@ static int i2c_wait_read_done(struct i2c_adapter *i2c_adap)
 static inline int i2c_is_write_done(struct i2c_adapter *i2c_adap)
 {
        struct au0828_dev *dev = i2c_adap->algo_data;
-       return au0828_read(dev, REG_201) & 0x04 ? 1 : 0;
+       return au0828_read(dev, AU0828_I2C_STATUS_201) &
+               AU0828_I2C_STATUS_WRITE_DONE ? 1 : 0;
 }
 
 static int i2c_wait_write_done(struct i2c_adapter *i2c_adap)
@@ -111,7 +115,8 @@ static int i2c_wait_write_done(struct i2c_adapter *i2c_adap)
 static inline int i2c_is_busy(struct i2c_adapter *i2c_adap)
 {
        struct au0828_dev *dev = i2c_adap->algo_data;
-       return au0828_read(dev, REG_201) & 0x10 ? 1 : 0;
+       return au0828_read(dev, AU0828_I2C_STATUS_201) &
+               AU0828_I2C_STATUS_BUSY ? 1 : 0;
 }
 
 static int i2c_wait_done(struct i2c_adapter *i2c_adap)
@@ -139,19 +144,14 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
 
        dprintk(4, "%s()\n", __func__);
 
-       au0828_write(dev, REG_2FF, 0x01);
+       au0828_write(dev, AU0828_I2C_MULTIBYTE_MODE_2FF, 0x01);
 
-       /* FIXME: There is a problem with i2c communications with xc5000 that
-          requires us to slow down the i2c clock until we have a better
-          strategy (such as using the secondary i2c bus to do firmware
-          loading */
-       if ((msg->addr << 1) == 0xc2)
-               au0828_write(dev, REG_202, 0x40);
-       else
-               au0828_write(dev, REG_202, 0x07);
+       /* Set the I2C clock */
+       au0828_write(dev, AU0828_I2C_CLK_DIVIDER_202,
+                    dev->board.i2c_clk_divider);
 
        /* Hardware needs 8 bit addresses */
-       au0828_write(dev, REG_203, msg->addr << 1);
+       au0828_write(dev, AU0828_I2C_DEST_ADDR_203, msg->addr << 1);
 
        dprintk(4, "SEND: %02x\n", msg->addr);
 
@@ -163,7 +163,9 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
                   actual bytes to the bus, just do a read check.  This is
                   consistent with how I saw i2c device checking done in the
                   USB trace of the Windows driver */
-               au0828_write(dev, REG_200, 0x20);
+               au0828_write(dev, AU0828_I2C_TRIGGER_200,
+                            AU0828_I2C_TRIGGER_READ);
+
                if (!i2c_wait_done(i2c_adap))
                        return -EIO;
 
@@ -177,7 +179,7 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
 
                dprintk(4, " %02x\n", msg->buf[i]);
 
-               au0828_write(dev, REG_205, msg->buf[i]);
+               au0828_write(dev, AU0828_I2C_WRITE_FIFO_205, msg->buf[i]);
 
                strobe++;
                i++;
@@ -186,9 +188,12 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
 
                        /* Strobe the byte into the bus */
                        if (i < msg->len)
-                               au0828_write(dev, REG_200, 0x41);
+                               au0828_write(dev, AU0828_I2C_TRIGGER_200,
+                                            AU0828_I2C_TRIGGER_WRITE |
+                                            AU0828_I2C_TRIGGER_HOLD);
                        else
-                               au0828_write(dev, REG_200, 0x01);
+                               au0828_write(dev, AU0828_I2C_TRIGGER_200,
+                                            AU0828_I2C_TRIGGER_WRITE);
 
                        /* Reset strobe trigger */
                        strobe = 0;
@@ -216,25 +221,22 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap,
 
        dprintk(4, "%s()\n", __func__);
 
-       au0828_write(dev, REG_2FF, 0x01);
+       au0828_write(dev, AU0828_I2C_MULTIBYTE_MODE_2FF, 0x01);
 
-       /* FIXME: There is a problem with i2c communications with xc5000 that
-          requires us to slow down the i2c clock until we have a better
-          strategy (such as using the secondary i2c bus to do firmware
-          loading */
-       if ((msg->addr << 1) == 0xc2)
-               au0828_write(dev, REG_202, 0x40);
-       else
-               au0828_write(dev, REG_202, 0x07);
+       /* Set the I2C clock */
+       au0828_write(dev, AU0828_I2C_CLK_DIVIDER_202,
+                    dev->board.i2c_clk_divider);
 
        /* Hardware needs 8 bit addresses */
-       au0828_write(dev, REG_203, msg->addr << 1);
+       au0828_write(dev, AU0828_I2C_DEST_ADDR_203, msg->addr << 1);
 
        dprintk(4, " RECV:\n");
 
        /* Deal with i2c_scan */
        if (msg->len == 0) {
-               au0828_write(dev, REG_200, 0x20);
+               au0828_write(dev, AU0828_I2C_TRIGGER_200,
+                            AU0828_I2C_TRIGGER_READ);
+
                if (i2c_wait_read_ack(i2c_adap))
                        return -EIO;
                return 0;
@@ -245,14 +247,18 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap,
                i++;
 
                if (i < msg->len)
-                       au0828_write(dev, REG_200, 0x60);
+                       au0828_write(dev, AU0828_I2C_TRIGGER_200,
+                                    AU0828_I2C_TRIGGER_READ |
+                                    AU0828_I2C_TRIGGER_HOLD);
                else
-                       au0828_write(dev, REG_200, 0x20);
+                       au0828_write(dev, AU0828_I2C_TRIGGER_200,
+                                    AU0828_I2C_TRIGGER_READ);
 
                if (!i2c_wait_read_done(i2c_adap))
                        return -EIO;
 
-               msg->buf[i-1] = au0828_read(dev, REG_209) & 0xff;
+               msg->buf[i-1] = au0828_read(dev, AU0828_I2C_READ_FIFO_209) &
+                       0xff;
 
                dprintk(4, " %02x\n", msg->buf[i-1]);
        }
index b15e4a3b6fc054181d8a7ed869d2af71a702c3ed..c39f3d2b721e22580b786f6a0a56f96394a1d563 100644 (file)
 #define AU0828_SENSORCTRL_100 0x100
 #define AU0828_SENSORCTRL_VBI_103 0x103
 
-#define REG_200 0x200
-#define REG_201 0x201
-#define REG_202 0x202
-#define REG_203 0x203
-#define REG_205 0x205
-#define REG_209 0x209
-#define REG_2FF 0x2ff
+/* I2C registers */
+#define AU0828_I2C_TRIGGER_200         0x200
+#define AU0828_I2C_STATUS_201          0x201
+#define AU0828_I2C_CLK_DIVIDER_202     0x202
+#define AU0828_I2C_DEST_ADDR_203       0x203
+#define AU0828_I2C_WRITE_FIFO_205      0x205
+#define AU0828_I2C_READ_FIFO_209       0x209
+#define AU0828_I2C_MULTIBYTE_MODE_2FF  0x2ff
 
 /* Audio registers */
 #define AU0828_AUDIOCTRL_50C 0x50C
 
 #define REG_600 0x600
+
+/*********************************************************************/
+/* Here are constants for values associated with the above registers */
+
+/* I2C Trigger (Reg 0x200) */
+#define AU0828_I2C_TRIGGER_WRITE       0x01
+#define AU0828_I2C_TRIGGER_READ                0x20
+#define AU0828_I2C_TRIGGER_HOLD                0x40
+
+/* I2C Status (Reg 0x201) */
+#define AU0828_I2C_STATUS_READ_DONE    0x01
+#define AU0828_I2C_STATUS_NO_READ_ACK  0x02
+#define AU0828_I2C_STATUS_WRITE_DONE   0x04
+#define AU0828_I2C_STATUS_NO_WRITE_ACK 0x08
+#define AU0828_I2C_STATUS_BUSY         0x10
+
+/* I2C Clock Divider (Reg 0x202) */
+#define AU0828_I2C_CLK_250KHZ 0x07
+#define AU0828_I2C_CLK_100KHZ 0x14
+#define AU0828_I2C_CLK_30KHZ  0x40
index f7ad4958b94e507c8635f5bfdb853fc073dd6572..27bedc6c779114da92758f7efb494fa3ca6582f0 100644 (file)
@@ -1100,7 +1100,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
           have to make the au0828 bridge adjust the size of its capture
           buffer, which is currently hardcoded at 720x480 */
 
-       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_std, *norm);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, *norm);
        return 0;
 }
 
@@ -1154,7 +1154,6 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
        struct au0828_fh *fh = priv;
        struct au0828_dev *dev = fh->dev;
        int i;
-       struct v4l2_routing route;
 
        dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
                index);
@@ -1180,9 +1179,8 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
                break;
        }
 
-       route.input = AUVI_INPUT(index).vmux;
-       route.output = 0;
-       v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing, &route);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
+                       AUVI_INPUT(index).vmux, 0, 0);
 
        for (i = 0; i < AU0828_MAX_INPUT; i++) {
                int enable = 0;
@@ -1205,8 +1203,8 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
                }
        }
 
-       route.input = AUVI_INPUT(index).amux;
-       v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing, &route);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
+                       AUVI_INPUT(index).amux, 0, 0);
        return 0;
 }
 
index 6ed1a6129731a540d5c73ad9df659c3f56e2b9b9..b977915efbd0a0eaa52636c7e8cfb1c2a79d8a55 100644 (file)
@@ -81,6 +81,7 @@ struct au0828_board {
        char *name;
        unsigned int tuner_type;
        unsigned char tuner_addr;
+       unsigned char i2c_clk_divider;
        struct au0828_input input[AU0828_MAX_INPUT];
 
 };
index df4516d8dcab34e6d713d279c6edbe4c299b1a03..f9330e3529c3e1d03b903ac0fad8a7f49a96c733 100644 (file)
@@ -292,21 +292,22 @@ static int bt819_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int bt819_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int bt819_s_routing(struct v4l2_subdev *sd,
+                          u32 input, u32 output, u32 config)
 {
        struct bt819 *decoder = to_bt819(sd);
 
-       v4l2_dbg(1, debug, sd, "set input %x\n", route->input);
+       v4l2_dbg(1, debug, sd, "set input %x\n", input);
 
-       if (route->input < 0 || route->input > 7)
+       if (input < 0 || input > 7)
                return -EINVAL;
 
        if (sd->v4l2_dev == NULL || sd->v4l2_dev->notify == NULL)
                v4l2_err(sd, "no notify found!\n");
 
-       if (decoder->input != route->input) {
+       if (decoder->input != input) {
                v4l2_subdev_notify(sd, BT819_FIFO_RESET_LOW, 0);
-               decoder->input = route->input;
+               decoder->input = input;
                /* select mode */
                if (decoder->input == 0) {
                        bt819_setbit(decoder, 0x0b, 6, 0);
@@ -444,9 +445,6 @@ static const struct v4l2_subdev_core_ops bt819_core_ops = {
        .g_ctrl = bt819_g_ctrl,
        .s_ctrl = bt819_s_ctrl,
        .queryctrl = bt819_queryctrl,
-};
-
-static const struct v4l2_subdev_tuner_ops bt819_tuner_ops = {
        .s_std = bt819_s_std,
 };
 
@@ -459,7 +457,6 @@ static const struct v4l2_subdev_video_ops bt819_video_ops = {
 
 static const struct v4l2_subdev_ops bt819_ops = {
        .core = &bt819_core_ops,
-       .tuner = &bt819_tuner_ops,
        .video = &bt819_video_ops,
 };
 
index 78db39503947b765df2ac93d68887494abaab552..d0b4d4925ff84502e7ea09b0dd26aeecfce9106b 100644 (file)
@@ -142,16 +142,17 @@ static int bt856_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int bt856_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int bt856_s_routing(struct v4l2_subdev *sd,
+                          u32 input, u32 output, u32 config)
 {
        struct bt856 *encoder = to_bt856(sd);
 
-       v4l2_dbg(1, debug, sd, "set input %d\n", route->input);
+       v4l2_dbg(1, debug, sd, "set input %d\n", input);
 
        /* We only have video bus.
-        * route->input= 0: input is from bt819
-        * route->input= 1: input is from ZR36060 */
-       switch (route->input) {
+        * input= 0: input is from bt819
+        * input= 1: input is from ZR36060 */
+       switch (input) {
        case 0:
                bt856_setbit(encoder, 0xde, 4, 0);
                bt856_setbit(encoder, 0xde, 3, 1);
index 350cae4b02c3f96866fd9a73583889a88ed9ef68..af7e3a5bac9ff3adf96302f7eb0626137c3a6d04 100644 (file)
@@ -99,7 +99,8 @@ static int bt866_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int bt866_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int bt866_s_routing(struct v4l2_subdev *sd,
+                          u32 input, u32 output, u32 config)
 {
        static const __u8 init[] = {
                0xc8, 0xcc, /* CRSCALE */
@@ -137,7 +138,7 @@ static int bt866_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *ro
 
        val = encoder->reg[0xdc];
 
-       if (route->input == 0)
+       if (input == 0)
                val |= 0x40; /* CBSWAP */
        else
                val &= ~0x40; /* !CBSWAP */
@@ -145,15 +146,15 @@ static int bt866_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *ro
        bt866_write(encoder, 0xdc, val);
 
        val = encoder->reg[0xcc];
-       if (route->input == 2)
+       if (input == 2)
                val |= 0x01; /* OSDBAR */
        else
                val &= ~0x01; /* !OSDBAR */
        bt866_write(encoder, 0xcc, val);
 
-       v4l2_dbg(1, debug, sd, "set input %d\n", route->input);
+       v4l2_dbg(1, debug, sd, "set input %d\n", input);
 
-       switch (route->input) {
+       switch (input) {
        case 0:
        case 1:
        case 2:
index b9c3ba51fb86c3f66f0b3188215f70ec467f7c2b..fdb4adff3d287dd41b0777f9843321cf0c8682ea 100644 (file)
@@ -3324,17 +3324,6 @@ void __devinit bttv_init_card1(struct bttv *btv)
 /* initialization part two -- after registering i2c bus */
 void __devinit bttv_init_card2(struct bttv *btv)
 {
-       static const unsigned short tvaudio_addrs[] = {
-               I2C_ADDR_TDA8425   >> 1,
-               I2C_ADDR_TEA6300   >> 1,
-               I2C_ADDR_TEA6420   >> 1,
-               I2C_ADDR_TDA9840   >> 1,
-               I2C_ADDR_TDA985x_L >> 1,
-               I2C_ADDR_TDA985x_H >> 1,
-               I2C_ADDR_TDA9874   >> 1,
-               I2C_ADDR_PIC16C54  >> 1,
-               I2C_CLIENT_END
-       };
        int addr=ADDR_UNSET;
 
        btv->tuner_type = UNSET;
@@ -3512,12 +3501,15 @@ void __devinit bttv_init_card2(struct bttv *btv)
 
                /* Load tuner module before issuing tuner config call! */
                if (bttv_tvcards[btv->c.type].has_radio)
-                       v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                               "tuner", "tuner", v4l2_i2c_tuner_addrs(ADDRS_RADIO));
-               v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap, "tuner",
-                               "tuner", v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
-               v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap, "tuner",
-                               "tuner", v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));
+                       v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                               &btv->c.i2c_adap, "tuner", "tuner",
+                               v4l2_i2c_tuner_addrs(ADDRS_RADIO));
+               v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                               &btv->c.i2c_adap, "tuner", "tuner",
+                               v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+               v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                               &btv->c.i2c_adap, "tuner", "tuner",
+                               v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));
 
                tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
                tun_setup.type = btv->tuner_type;
@@ -3570,8 +3562,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
                };
                struct v4l2_subdev *sd;
 
-               sd = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                               "saa6588", "saa6588", addrs);
+               sd = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                       &btv->c.i2c_adap, "saa6588", "saa6588", addrs);
                btv->has_saa6588 = (sd != NULL);
        }
 
@@ -3595,8 +3587,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
                        I2C_CLIENT_END
                };
 
-               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                               "msp3400", "msp3400", addrs);
+               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                       &btv->c.i2c_adap, "msp3400", "msp3400", addrs);
                if (btv->sd_msp34xx)
                        return;
                goto no_audio;
@@ -3609,16 +3601,16 @@ void __devinit bttv_init_card2(struct bttv *btv)
                        I2C_CLIENT_END
                };
 
-               if (v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                               "tda7432", "tda7432", addrs))
+               if (v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                               &btv->c.i2c_adap, "tda7432", "tda7432", addrs))
                        return;
                goto no_audio;
        }
 
        case 3: {
                /* The user specified that we should probe for tvaudio */
-               btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                               "tvaudio", "tvaudio", tvaudio_addrs);
+               btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                       &btv->c.i2c_adap, "tvaudio", "tvaudio", tvaudio_addrs());
                if (btv->sd_tvaudio)
                        return;
                goto no_audio;
@@ -3637,21 +3629,13 @@ void __devinit bttv_init_card2(struct bttv *btv)
           it really is a msp3400, so it will return NULL when the device
           found is really something else (e.g. a tea6300). */
        if (!bttv_tvcards[btv->c.type].no_msp34xx) {
-               static const unsigned short addrs[] = {
-                       I2C_ADDR_MSP3400 >> 1,
-                       I2C_CLIENT_END
-               };
-
-               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                               "msp3400", "msp3400", addrs);
+               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev_addr(&btv->c.v4l2_dev,
+                       &btv->c.i2c_adap, "msp3400", "msp3400",
+                       I2C_ADDR_MSP3400 >> 1);
        } else if (bttv_tvcards[btv->c.type].msp34xx_alt) {
-               static const unsigned short addrs[] = {
-                       I2C_ADDR_MSP3400_ALT >> 1,
-                       I2C_CLIENT_END
-               };
-
-               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                               "msp3400", "msp3400", addrs);
+               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev_addr(&btv->c.v4l2_dev,
+                       &btv->c.i2c_adap, "msp3400", "msp3400",
+                       I2C_ADDR_MSP3400_ALT >> 1);
        }
 
        /* If we found a msp34xx, then we're done. */
@@ -3665,14 +3649,14 @@ void __devinit bttv_init_card2(struct bttv *btv)
                        I2C_CLIENT_END
                };
 
-               if (v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                               "tda7432", "tda7432", addrs))
+               if (v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                               &btv->c.i2c_adap, "tda7432", "tda7432", addrs))
                        return;
        }
 
        /* Now see if we can find one of the tvaudio devices. */
-       btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
-                       "tvaudio", "tvaudio", tvaudio_addrs);
+       btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+               &btv->c.i2c_adap, "tvaudio", "tvaudio", tvaudio_addrs());
        if (btv->sd_tvaudio)
                return;
 
index 7a8ca0d8356f68ecb4fe228f93dd966bdc0e0905..23b7499b31852d5aa7f0b3f52c5f5c2f37b481f6 100644 (file)
@@ -1198,7 +1198,7 @@ audio_mux(struct bttv *btv, int input, int mute)
        ctrl.value = btv->mute;
        bttv_call_all(btv, core, s_ctrl, &ctrl);
        if (btv->sd_msp34xx) {
-               struct v4l2_routing route;
+               u32 in;
 
                /* Note: the inputs tuner/radio/extern/intern are translated
                   to msp routings. This assumes common behavior for all msp3400
@@ -1207,11 +1207,11 @@ audio_mux(struct bttv *btv, int input, int mute)
                   For now this is sufficient. */
                switch (input) {
                case TVAUDIO_INPUT_RADIO:
-                       route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
+                       in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
                                    MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
                        break;
                case TVAUDIO_INPUT_EXTERN:
-                       route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
+                       in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
                                    MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
                        break;
                case TVAUDIO_INPUT_INTERN:
@@ -1220,7 +1220,7 @@ audio_mux(struct bttv *btv, int input, int mute)
                           input is the BTTV_BOARD_AVERMEDIA98. I wonder how
                           that was tested. My guess is that the whole INTERN
                           input does not work. */
-                       route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
+                       in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
                                    MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
                        break;
                case TVAUDIO_INPUT_TUNER:
@@ -1229,21 +1229,18 @@ audio_mux(struct bttv *btv, int input, int mute)
                           is the only difference between the VOODOOTV_FM
                           and VOODOOTV_200 */
                        if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
-                               route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
+                               in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
                                        MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
                        else
-                               route.input = MSP_INPUT_DEFAULT;
+                               in = MSP_INPUT_DEFAULT;
                        break;
                }
-               route.output = MSP_OUTPUT_DEFAULT;
-               v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing, &route);
+               v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing,
+                              in, MSP_OUTPUT_DEFAULT, 0);
        }
        if (btv->sd_tvaudio) {
-               struct v4l2_routing route;
-
-               route.input = input;
-               route.output = 0;
-               v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing, &route);
+               v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing,
+                               input, 0, 0);
        }
        return 0;
 }
@@ -1329,7 +1326,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm)
                break;
        }
        id = tvnorm->v4l2_id;
-       bttv_call_all(btv, tuner, s_std, id);
+       bttv_call_all(btv, core, s_std, id);
 
        return 0;
 }
@@ -4320,7 +4317,7 @@ static int __devinit bttv_probe(struct pci_dev *dev,
                       btv->c.nr);
                return -EIO;
        }
-       if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(dev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING "bttv%d: No suitable DMA available.\n",
                       btv->c.nr);
                return -EIO;
index 96498489199d25590cc7cd02700202df76eb0826..a1d0e9c9f2866ea3a11b24f4357ac31547899b4b 100644 (file)
@@ -26,7 +26,7 @@
 #define _BTTVP_H_
 
 #include <linux/version.h>
-#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,17)
+#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,18)
 
 #include <linux/types.h>
 #include <linux/wait.h>
index 7abe94d9fb4cd2dcccf73e588f197c35fd516f3e..5f582726985d8d39ea773c7ed14149f9d2733e39 100644 (file)
@@ -1954,7 +1954,7 @@ static int cafe_pci_probe(struct pci_dev *pdev,
                goto out_freeirq;
 
        cam->sensor_addr = 0x42;
-       cam->sensor = v4l2_i2c_new_subdev(&cam->i2c_adapter,
+       cam->sensor = v4l2_i2c_new_subdev(&cam->v4l2_dev, &cam->i2c_adapter,
                        "ov7670", "ov7670", cam->sensor_addr);
        if (cam->sensor == NULL) {
                ret = -ENODEV;
index 9714059ee9496746da94f813d45cd93b3d4d4947..57dc1704b6c000d2bba62df2c398c1fa1b2dce7d 100644 (file)
@@ -53,14 +53,15 @@ static inline int cs5345_read(struct v4l2_subdev *sd, u8 reg)
        return i2c_smbus_read_byte_data(client, reg);
 }
 
-static int cs5345_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int cs5345_s_routing(struct v4l2_subdev *sd,
+                           u32 input, u32 output, u32 config)
 {
-       if ((route->input & 0xf) > 6) {
-               v4l2_err(sd, "Invalid input %d.\n", route->input);
+       if ((input & 0xf) > 6) {
+               v4l2_err(sd, "Invalid input %d.\n", input);
                return -EINVAL;
        }
-       cs5345_write(sd, 0x09, route->input & 0xf);
-       cs5345_write(sd, 0x05, route->input & 0xf0);
+       cs5345_write(sd, 0x09, input & 0xf);
+       cs5345_write(sd, 0x05, input & 0xf0);
        return 0;
 }
 
index 5aeb066857a723caf3ea330023de6dabf2d04dfd..80bca8df9fbfddbfdf6ed0d4f786dc563206e44b 100644 (file)
@@ -58,17 +58,18 @@ static int cs53l32a_read(struct v4l2_subdev *sd, u8 reg)
        return i2c_smbus_read_byte_data(client, reg);
 }
 
-static int cs53l32a_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int cs53l32a_s_routing(struct v4l2_subdev *sd,
+                             u32 input, u32 output, u32 config)
 {
        /* There are 2 physical inputs, but the second input can be
           placed in two modes, the first mode bypasses the PGA (gain),
           the second goes through the PGA. Hence there are three
           possible inputs to choose from. */
-       if (route->input > 2) {
-               v4l2_err(sd, "Invalid input %d.\n", route->input);
+       if (input > 2) {
+               v4l2_err(sd, "Invalid input %d.\n", input);
                return -EINVAL;
        }
-       cs53l32a_write(sd, 0x01, 0x01 + (route->input << 4));
+       cs53l32a_write(sd, 0x01, 0x01 + (input << 4));
        return 0;
 }
 
index bb5c5165dd5fd2274be9a5d2a6fed1e64cf562df..1519e91c677adffa6c99d8df706c0ca5b6a05156 100644 (file)
@@ -33,7 +33,6 @@
 int cx18_audio_set_io(struct cx18 *cx)
 {
        const struct cx18_card_audio_input *in;
-       struct v4l2_routing route;
        u32 val;
        int err;
 
@@ -44,13 +43,11 @@ int cx18_audio_set_io(struct cx18 *cx)
                in = &cx->card->audio_inputs[cx->audio_input];
 
        /* handle muxer chips */
-       route.input = in->muxer_input;
-       route.output = 0;
-       v4l2_subdev_call(cx->sd_extmux, audio, s_routing, &route);
+       v4l2_subdev_call(cx->sd_extmux, audio, s_routing,
+                       in->audio_input, 0, 0);
 
-       route.input = in->audio_input;
        err = cx18_call_hw_err(cx, cx->card->hw_audio_ctrl,
-                              audio, s_routing, &route);
+                              audio, s_routing, in->audio_input, 0, 0);
        if (err)
                return err;
 
index f4dd9d78eb3d2fe346e8d98bc5e37bd919123b53..cf2bd888a429a8e00d45304bd48644fa7efdbdc2 100644 (file)
@@ -203,43 +203,42 @@ static int cx18_av_reset(struct v4l2_subdev *sd, u32 val)
 
 static int cx18_av_init(struct v4l2_subdev *sd, u32 val)
 {
-       struct cx18_av_state *state = to_cx18_av_state(sd);
        struct cx18 *cx = v4l2_get_subdevdata(sd);
 
-       switch (val) {
-       case CX18_AV_INIT_PLLS:
-               /*
-                * The crystal freq used in calculations in this driver will be
-                * 28.636360 MHz.
-                * Aim to run the PLLs' VCOs near 400 MHz to minimze errors.
-                */
+       /*
+        * The crystal freq used in calculations in this driver will be
+        * 28.636360 MHz.
+        * Aim to run the PLLs' VCOs near 400 MHz to minimze errors.
+        */
 
-               /*
-                * VDCLK  Integer = 0x0f, Post Divider = 0x04
-                * AIMCLK Integer = 0x0e, Post Divider = 0x16
-                */
-               cx18_av_write4(cx, CXADEC_PLL_CTRL1, 0x160e040f);
+       /*
+        * VDCLK  Integer = 0x0f, Post Divider = 0x04
+        * AIMCLK Integer = 0x0e, Post Divider = 0x16
+        */
+       cx18_av_write4(cx, CXADEC_PLL_CTRL1, 0x160e040f);
 
-               /* VDCLK Fraction = 0x2be2fe */
-               /* xtal * 0xf.15f17f0/4 = 108 MHz: 432 MHz before post divide */
-               cx18_av_write4(cx, CXADEC_VID_PLL_FRAC, 0x002be2fe);
+       /* VDCLK Fraction = 0x2be2fe */
+       /* xtal * 0xf.15f17f0/4 = 108 MHz: 432 MHz before post divide */
+       cx18_av_write4(cx, CXADEC_VID_PLL_FRAC, 0x002be2fe);
 
-               /* AIMCLK Fraction = 0x05227ad */
-               /* xtal * 0xe.2913d68/0x16 = 48000 * 384: 406 MHz pre post-div*/
-               cx18_av_write4(cx, CXADEC_AUX_PLL_FRAC, 0x005227ad);
+       /* AIMCLK Fraction = 0x05227ad */
+       /* xtal * 0xe.2913d68/0x16 = 48000 * 384: 406 MHz pre post-div*/
+       cx18_av_write4(cx, CXADEC_AUX_PLL_FRAC, 0x005227ad);
 
-               /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x16 */
-               cx18_av_write(cx, CXADEC_I2S_MCLK, 0x56);
-               break;
+       /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x16 */
+       cx18_av_write(cx, CXADEC_I2S_MCLK, 0x56);
+       return 0;
+}
 
-       case CX18_AV_INIT_NORMAL:
-       default:
-               if (!state->is_initialized) {
-                       /* initialize on first use */
-                       state->is_initialized = 1;
-                       cx18_av_initialize(cx);
-               }
-               break;
+static int cx18_av_load_fw(struct v4l2_subdev *sd)
+{
+       struct cx18_av_state *state = to_cx18_av_state(sd);
+       struct cx18 *cx = v4l2_get_subdevdata(sd);
+
+       if (!state->is_initialized) {
+               /* initialize on first use */
+               state->is_initialized = 1;
+               cx18_av_initialize(cx);
        }
        return 0;
 }
@@ -548,19 +547,19 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
 }
 
 static int cx18_av_s_video_routing(struct v4l2_subdev *sd,
-                                  const struct v4l2_routing *route)
+                                  u32 input, u32 output, u32 config)
 {
        struct cx18_av_state *state = to_cx18_av_state(sd);
        struct cx18 *cx = v4l2_get_subdevdata(sd);
-       return set_input(cx, route->input, state->aud_input);
+       return set_input(cx, input, state->aud_input);
 }
 
 static int cx18_av_s_audio_routing(struct v4l2_subdev *sd,
-                                  const struct v4l2_routing *route)
+                                  u32 input, u32 output, u32 config)
 {
        struct cx18_av_state *state = to_cx18_av_state(sd);
        struct cx18 *cx = v4l2_get_subdevdata(sd);
-       return set_input(cx, state->vid_input, route->input);
+       return set_input(cx, state->vid_input, input);
 }
 
 static int cx18_av_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
@@ -1185,10 +1184,12 @@ static const struct v4l2_subdev_core_ops cx18_av_general_ops = {
        .g_chip_ident = cx18_av_g_chip_ident,
        .log_status = cx18_av_log_status,
        .init = cx18_av_init,
+       .load_fw = cx18_av_load_fw,
        .reset = cx18_av_reset,
        .queryctrl = cx18_av_queryctrl,
        .g_ctrl = cx18_av_g_ctrl,
        .s_ctrl = cx18_av_s_ctrl,
+       .s_std = cx18_av_s_std,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
        .g_register = cx18_av_g_register,
        .s_register = cx18_av_s_register,
@@ -1200,7 +1201,6 @@ static const struct v4l2_subdev_tuner_ops cx18_av_tuner_ops = {
        .s_frequency = cx18_av_s_frequency,
        .g_tuner = cx18_av_g_tuner,
        .s_tuner = cx18_av_s_tuner,
-       .s_std = cx18_av_s_std,
 };
 
 static const struct v4l2_subdev_audio_ops cx18_av_audio_ops = {
index c458120e8c90e509f71d99b110ca47a72b009721..9b84a0c58e0ebbf8afd4316345c6145a178dc726 100644 (file)
@@ -328,11 +328,6 @@ static inline struct cx18_av_state *to_cx18_av_state(struct v4l2_subdev *sd)
        return container_of(sd, struct cx18_av_state, sd);
 }
 
-enum cx18_av_subdev_init_arg {
-       CX18_AV_INIT_NORMAL = 0,
-       CX18_AV_INIT_PLLS = 1,
-};
-
 /* ----------------------------------------------------------------------- */
 /* cx18_av-core.c                                                         */
 int cx18_av_write(struct cx18 *cx, u16 addr, u8 value);
index 210c68aaae00ede73af85a4804b156e246a8fe6c..49b1c3d7b1a81ab264a5fe3503f06b1158f76980 100644 (file)
@@ -810,7 +810,7 @@ static int __devinit cx18_probe(struct pci_dev *pci_dev,
                CX18_ERR("Could not register A/V decoder subdevice\n");
                goto free_map;
        }
-       cx18_call_hw(cx, CX18_HW_418_AV, core, init, (u32) CX18_AV_INIT_PLLS);
+       cx18_call_hw(cx, CX18_HW_418_AV, core, init, 0);
 
        /* Initialize GPIO Reset Controller to do chip resets during i2c init */
        if (cx->card->hw_all & CX18_HW_GPIO_RESET_CTRL) {
@@ -1028,7 +1028,7 @@ int cx18_init_on_first_open(struct cx18 *cx)
        cx18_vapi(cx, CX18_APU_STOP, 1, CX18_APU_ENCODING_METHOD_MPEG);
 
        /* Init the A/V decoder, if it hasn't been already */
-       v4l2_subdev_call(cx->sd_av, core, init, (u32) CX18_AV_INIT_NORMAL);
+       v4l2_subdev_call(cx->sd_av, core, load_fw);
 
        vf.tuner = 0;
        vf.type = V4L2_TUNER_ANALOG_TV;
index 4d7d6d5a7f86d2f9f7aca66643a7ecceada91be3..b3889c0b26974dd6c4f1806cb99d2a624464562d 100644 (file)
@@ -608,7 +608,7 @@ int cx18_v4l2_close(struct file *filp)
                /* Mark that the radio is no longer in use */
                clear_bit(CX18_F_I_RADIO_USER, &cx->i_flags);
                /* Switch tuner to TV */
-               cx18_call_all(cx, tuner, s_std, cx->std);
+               cx18_call_all(cx, core, s_std, cx->std);
                /* Select correct audio input (i.e. TV tuner or Line in) */
                cx18_audio_set_io(cx);
                if (atomic_read(&cx->ana_capturing) > 0) {
index 5518d1424f8fd250a25a28a5546ae9db368640a7..86a204b5448e7edd2f1088ee5e3d1b6596b42980 100644 (file)
@@ -156,12 +156,12 @@ static int gpiomux_s_std(struct v4l2_subdev *sd, v4l2_std_id norm)
 }
 
 static int gpiomux_s_audio_routing(struct v4l2_subdev *sd,
-                                  const struct v4l2_routing *route)
+                                  u32 input, u32 output, u32 config)
 {
        struct cx18 *cx = v4l2_get_subdevdata(sd);
        u32 data;
 
-       switch (route->input) {
+       switch (input) {
        case 0:
                data = cx->card->gpio_audio_input.tuner;
                break;
@@ -180,10 +180,10 @@ static int gpiomux_s_audio_routing(struct v4l2_subdev *sd,
 
 static const struct v4l2_subdev_core_ops gpiomux_core_ops = {
        .log_status = gpiomux_log_status,
+       .s_std = gpiomux_s_std,
 };
 
 static const struct v4l2_subdev_tuner_ops gpiomux_tuner_ops = {
-       .s_std = gpiomux_s_std,
        .s_radio = gpiomux_s_radio,
 };
 
index d092643faf463911d7d6d40467bf7672ee3daf89..b9b7064a2be82bd963bfb77807a79890afe2a280 100644 (file)
@@ -100,16 +100,16 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)
 
        if (hw == CX18_HW_TUNER) {
                /* special tuner group handling */
-               sd = v4l2_i2c_new_probed_subdev(adap, mod, type,
-                                               cx->card_i2c->radio);
+               sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
+                               adap, mod, type, cx->card_i2c->radio);
                if (sd != NULL)
                        sd->grp_id = hw;
-               sd = v4l2_i2c_new_probed_subdev(adap, mod, type,
-                                               cx->card_i2c->demod);
+               sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
+                               adap, mod, type, cx->card_i2c->demod);
                if (sd != NULL)
                        sd->grp_id = hw;
-               sd = v4l2_i2c_new_probed_subdev(adap, mod, type,
-                                               cx->card_i2c->tv);
+               sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
+                               adap, mod, type, cx->card_i2c->tv);
                if (sd != NULL)
                        sd->grp_id = hw;
                return sd != NULL ? 0 : -1;
@@ -120,7 +120,7 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)
                return -1;
 
        /* It's an I2C device other than an analog tuner */
-       sd = v4l2_i2c_new_subdev(adap, mod, type, hw_addrs[idx]);
+       sd = v4l2_i2c_new_subdev(&cx->v4l2_dev, adap, mod, type, hw_addrs[idx]);
        if (sd != NULL)
                sd->grp_id = hw;
        return sd != NULL ? 0 : -1;
index e4c9e3d8bacd8538dff693ba6759b96a5136bed9..d7b1921e6666006f327c54b3e18ce8b3ac649886 100644 (file)
@@ -705,7 +705,7 @@ int cx18_s_std(struct file *file, void *fh, v4l2_std_id *std)
                        (unsigned long long) cx->std);
 
        /* Tuner */
-       cx18_call_all(cx, tuner, s_std, cx->std);
+       cx18_call_all(cx, core, s_std, cx->std);
        return 0;
 }
 
@@ -926,16 +926,6 @@ static long cx18_default(struct file *file, void *fh, int cmd, void *arg)
        struct cx18 *cx = ((struct cx18_open_id *)fh)->cx;
 
        switch (cmd) {
-       case VIDIOC_INT_S_AUDIO_ROUTING: {
-               struct v4l2_routing *route = arg;
-
-               CX18_DEBUG_IOCTL("VIDIOC_INT_S_AUDIO_ROUTING(%d, %d)\n",
-                       route->input, route->output);
-               cx18_call_hw(cx, cx->card->hw_audio_ctrl, audio, s_routing,
-                            route);
-               break;
-       }
-
        case VIDIOC_INT_RESET: {
                u32 val = *(u32 *)arg;
 
index 6fdadedf17a89c8413c5797dac54153d95d0b351..6dc84aac8f4421eda5b4c53ac01f3c7e11eb3743 100644 (file)
 
 void cx18_video_set_io(struct cx18 *cx)
 {
-       struct v4l2_routing route;
        int inp = cx->active_input;
-       u32 type;
 
-       route.input = cx->card->video_inputs[inp].video_input;
-       route.output = 0;
-       v4l2_subdev_call(cx->sd_av, video, s_routing, &route);
-
-       type = cx->card->video_inputs[inp].video_type;
-
-       if (type == CX18_CARD_INPUT_VID_TUNER)
-               route.input = 0;  /* Tuner */
-       else if (type < CX18_CARD_INPUT_COMPOSITE1)
-               route.input = 2;  /* S-Video */
-       else
-               route.input = 1;  /* Composite */
+       v4l2_subdev_call(cx->sd_av, video, s_routing,
+                       cx->card->video_inputs[inp].video_input, 0, 0);
 }
diff --git a/drivers/media/video/cx231xx/Kconfig b/drivers/media/video/cx231xx/Kconfig
new file mode 100644 (file)
index 0000000..9115654
--- /dev/null
@@ -0,0 +1,35 @@
+config VIDEO_CX231XX
+       tristate "Conexant cx231xx USB video capture support"
+       depends on VIDEO_DEV && I2C && INPUT
+       select VIDEO_TUNER
+       select VIDEO_TVEEPROM
+       select VIDEO_IR
+       select VIDEOBUF_VMALLOC
+       select VIDEO_CX25840
+       select VIDEO_CX231XX_ALSA
+
+       ---help---
+         This is a video4linux driver for Conexant 231xx USB based TV cards.
+
+         To compile this driver as a module, choose M here: the
+         module will be called cx231xx
+
+config VIDEO_CX231XX_ALSA
+    tristate "Conexant Cx231xx ALSA audio module"
+       depends on VIDEO_CX231XX && SND
+       select SND_PCM
+
+       ---help---
+        This is an ALSA driver for Cx231xx USB based TV cards.
+
+        To compile this driver as a module, choose M here: the
+        module will be called cx231xx-alsa
+
+config VIDEO_CX231XX_DVB
+       tristate "DVB/ATSC Support for Cx231xx based TV cards"
+       depends on VIDEO_CX231XX && DVB_CORE
+       select VIDEOBUF_DVB
+       select MEDIA_TUNER_XC5000 if !DVB_FE_CUSTOMISE
+       ---help---
+        This adds support for DVB cards based on the
+        Conexant cx231xx chips.
diff --git a/drivers/media/video/cx231xx/Makefile b/drivers/media/video/cx231xx/Makefile
new file mode 100644 (file)
index 0000000..755dd0c
--- /dev/null
@@ -0,0 +1,14 @@
+cx231xx-objs     := cx231xx-video.o cx231xx-i2c.o cx231xx-cards.o cx231xx-core.o \
+                   cx231xx-avcore.o cx231xx-pcb-cfg.o cx231xx-vbi.o
+
+cx231xx-alsa-objs := cx231xx-audio.o
+
+obj-$(CONFIG_VIDEO_CX231XX) += cx231xx.o
+obj-$(CONFIG_VIDEO_CX231XX_ALSA) += cx231xx-alsa.o
+obj-$(CONFIG_VIDEO_CX231XX_DVB) += cx231xx-dvb.o
+
+EXTRA_CFLAGS += -Idrivers/media/video
+EXTRA_CFLAGS += -Idrivers/media/common/tuners
+EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
+EXTRA_CFLAGS += -Idrivers/media/dvb/frontends
+
diff --git a/drivers/media/video/cx231xx/cx231xx-audio.c b/drivers/media/video/cx231xx/cx231xx-audio.c
new file mode 100644 (file)
index 0000000..7793d60
--- /dev/null
@@ -0,0 +1,586 @@
+/*
+ *  Conexant Cx231xx audio extension
+ *
+ *  Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+ *       Based on em28xx 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.
+ *
+ *  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 <linux/kernel.h>
+#include <linux/usb.h>
+#include <linux/init.h>
+#include <linux/sound.h>
+#include <linux/spinlock.h>
+#include <linux/soundcard.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/proc_fs.h>
+#include <linux/module.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/info.h>
+#include <sound/initval.h>
+#include <sound/control.h>
+#include <media/v4l2-common.h>
+#include "cx231xx.h"
+
+static int debug;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "activates debug info");
+
+#define dprintk(fmt, arg...) do {                                      \
+               if (debug)                                              \
+                       printk(KERN_INFO "cx231xx-audio %s: " fmt,      \
+                               __func__, ##arg);                       \
+       } while (0)
+
+static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
+
+static int cx231xx_isoc_audio_deinit(struct cx231xx *dev)
+{
+       int i;
+
+       dprintk("Stopping isoc\n");
+
+       for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
+               if (dev->adev.urb[i]) {
+                       if (!irqs_disabled())
+                               usb_kill_urb(dev->adev.urb[i]);
+                       else
+                               usb_unlink_urb(dev->adev.urb[i]);
+
+                       usb_free_urb(dev->adev.urb[i]);
+                       dev->adev.urb[i] = NULL;
+
+                       kfree(dev->adev.transfer_buffer[i]);
+                       dev->adev.transfer_buffer[i] = NULL;
+               }
+       }
+
+       return 0;
+}
+
+static void cx231xx_audio_isocirq(struct urb *urb)
+{
+       struct cx231xx *dev = urb->context;
+       int i;
+       unsigned int oldptr;
+       int period_elapsed = 0;
+       int status;
+       unsigned char *cp;
+       unsigned int stride;
+       struct snd_pcm_substream *substream;
+       struct snd_pcm_runtime *runtime;
+
+       switch (urb->status) {
+       case 0:         /* success */
+       case -ETIMEDOUT:        /* NAK */
+               break;
+       case -ECONNRESET:       /* kill */
+       case -ENOENT:
+       case -ESHUTDOWN:
+               return;
+       default:                /* error */
+               dprintk("urb completition error %d.\n", urb->status);
+               break;
+       }
+
+       if (dev->adev.capture_pcm_substream) {
+               substream = dev->adev.capture_pcm_substream;
+               runtime = substream->runtime;
+               stride = runtime->frame_bits >> 3;
+
+               for (i = 0; i < urb->number_of_packets; i++) {
+                       int length = urb->iso_frame_desc[i].actual_length /
+                                    stride;
+                       cp = (unsigned char *)urb->transfer_buffer +
+                                             urb->iso_frame_desc[i].offset;
+
+                       if (!length)
+                               continue;
+
+                       oldptr = dev->adev.hwptr_done_capture;
+                       if (oldptr + length >= runtime->buffer_size) {
+                               unsigned int cnt;
+
+                               cnt = runtime->buffer_size - oldptr;
+                               memcpy(runtime->dma_area + oldptr * stride, cp,
+                                      cnt * stride);
+                               memcpy(runtime->dma_area, cp + cnt * stride,
+                                      length * stride - cnt * stride);
+                       } else {
+                               memcpy(runtime->dma_area + oldptr * stride, cp,
+                                      length * stride);
+                       }
+
+                       snd_pcm_stream_lock(substream);
+
+                       dev->adev.hwptr_done_capture += length;
+                       if (dev->adev.hwptr_done_capture >=
+                                               runtime->buffer_size)
+                               dev->adev.hwptr_done_capture -=
+                                               runtime->buffer_size;
+
+                       dev->adev.capture_transfer_done += length;
+                       if (dev->adev.capture_transfer_done >=
+                               runtime->period_size) {
+                               dev->adev.capture_transfer_done -=
+                                               runtime->period_size;
+                               period_elapsed = 1;
+                       }
+                       snd_pcm_stream_unlock(substream);
+               }
+               if (period_elapsed)
+                       snd_pcm_period_elapsed(substream);
+       }
+       urb->status = 0;
+
+       status = usb_submit_urb(urb, GFP_ATOMIC);
+       if (status < 0) {
+               cx231xx_errdev("resubmit of audio urb failed (error=%i)\n",
+                              status);
+       }
+       return;
+}
+
+static int cx231xx_init_audio_isoc(struct cx231xx *dev)
+{
+       int i, errCode;
+       int sb_size;
+
+       cx231xx_info("%s: Starting AUDIO transfers\n", __func__);
+
+       sb_size = CX231XX_NUM_AUDIO_PACKETS * dev->adev.max_pkt_size;
+
+       for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
+               struct urb *urb;
+               int j, k;
+
+               dev->adev.transfer_buffer[i] = kmalloc(sb_size, GFP_ATOMIC);
+               if (!dev->adev.transfer_buffer[i])
+                       return -ENOMEM;
+
+               memset(dev->adev.transfer_buffer[i], 0x80, sb_size);
+               urb = usb_alloc_urb(CX231XX_NUM_AUDIO_PACKETS, GFP_ATOMIC);
+               if (!urb) {
+                       cx231xx_errdev("usb_alloc_urb failed!\n");
+                       for (j = 0; j < i; j++) {
+                               usb_free_urb(dev->adev.urb[j]);
+                               kfree(dev->adev.transfer_buffer[j]);
+                       }
+                       return -ENOMEM;
+               }
+
+               urb->dev = dev->udev;
+               urb->context = dev;
+               urb->pipe = usb_rcvisocpipe(dev->udev,
+                                               dev->adev.end_point_addr);
+               urb->transfer_flags = URB_ISO_ASAP;
+               urb->transfer_buffer = dev->adev.transfer_buffer[i];
+               urb->interval = 1;
+               urb->complete = cx231xx_audio_isocirq;
+               urb->number_of_packets = CX231XX_NUM_AUDIO_PACKETS;
+               urb->transfer_buffer_length = sb_size;
+
+               for (j = k = 0; j < CX231XX_NUM_AUDIO_PACKETS;
+                       j++, k += dev->adev.max_pkt_size) {
+                       urb->iso_frame_desc[j].offset = k;
+                       urb->iso_frame_desc[j].length = dev->adev.max_pkt_size;
+               }
+               dev->adev.urb[i] = urb;
+       }
+
+       for (i = 0; i < CX231XX_AUDIO_BUFS; i++) {
+               errCode = usb_submit_urb(dev->adev.urb[i], GFP_ATOMIC);
+               if (errCode < 0) {
+                       cx231xx_isoc_audio_deinit(dev);
+                       return errCode;
+               }
+       }
+
+       return errCode;
+}
+
+static int cx231xx_cmd(struct cx231xx *dev, int cmd, int arg)
+{
+       dprintk("%s transfer\n", (dev->adev.capture_stream == STREAM_ON) ?
+               "stop" : "start");
+
+       switch (cmd) {
+       case CX231XX_CAPTURE_STREAM_EN:
+               if (dev->adev.capture_stream == STREAM_OFF && arg == 1) {
+                       dev->adev.capture_stream = STREAM_ON;
+                       cx231xx_init_audio_isoc(dev);
+               } else if (dev->adev.capture_stream == STREAM_ON && arg == 0) {
+                       dev->adev.capture_stream = STREAM_OFF;
+                       cx231xx_isoc_audio_deinit(dev);
+               } else {
+                       cx231xx_errdev("An underrun very likely occurred. "
+                                      "Ignoring it.\n");
+               }
+               return 0;
+       default:
+               return -EINVAL;
+       }
+}
+
+static int snd_pcm_alloc_vmalloc_buffer(struct snd_pcm_substream *subs,
+                                       size_t size)
+{
+       struct snd_pcm_runtime *runtime = subs->runtime;
+
+       dprintk("Allocating vbuffer\n");
+       if (runtime->dma_area) {
+               if (runtime->dma_bytes > size)
+                       return 0;
+
+               vfree(runtime->dma_area);
+       }
+       runtime->dma_area = vmalloc(size);
+       if (!runtime->dma_area)
+               return -ENOMEM;
+
+       runtime->dma_bytes = size;
+
+       return 0;
+}
+
+static struct snd_pcm_hardware snd_cx231xx_hw_capture = {
+       .info = SNDRV_PCM_INFO_BLOCK_TRANSFER   |
+           SNDRV_PCM_INFO_MMAP                 |
+           SNDRV_PCM_INFO_INTERLEAVED          |
+           SNDRV_PCM_INFO_MMAP_VALID,
+
+       .formats = SNDRV_PCM_FMTBIT_S16_LE,
+
+       .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_KNOT,
+
+       .rate_min = 48000,
+       .rate_max = 48000,
+       .channels_min = 2,
+       .channels_max = 2,
+       .buffer_bytes_max = 62720 * 8,  /* just about the value in usbaudio.c */
+       .period_bytes_min = 64,         /* 12544/2, */
+       .period_bytes_max = 12544,
+       .periods_min = 2,
+       .periods_max = 98,              /* 12544, */
+};
+
+static int snd_cx231xx_capture_open(struct snd_pcm_substream *substream)
+{
+       struct cx231xx *dev = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       int ret = 0;
+
+       dprintk("opening device and trying to acquire exclusive lock\n");
+
+       if (!dev) {
+               cx231xx_errdev("BUG: cx231xx can't find device struct."
+                              " Can't proceed with open\n");
+               return -ENODEV;
+       }
+
+       /* Sets volume, mute, etc */
+       dev->mute = 0;
+
+       /* set alternate setting for audio interface */
+       /* 1 - 48000 samples per sec */
+       ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 1);
+       if (ret < 0) {
+               cx231xx_errdev("failed to set alternate setting !\n");
+
+               return ret;
+       }
+
+       /* inform hardware to start streaming */
+       ret = cx231xx_capture_start(dev, 1, Audio);
+
+       runtime->hw = snd_cx231xx_hw_capture;
+
+       mutex_lock(&dev->lock);
+       dev->adev.users++;
+       mutex_unlock(&dev->lock);
+
+       snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
+       dev->adev.capture_pcm_substream = substream;
+       runtime->private_data = dev;
+
+       return 0;
+}
+
+static int snd_cx231xx_pcm_close(struct snd_pcm_substream *substream)
+{
+       int ret;
+       struct cx231xx *dev = snd_pcm_substream_chip(substream);
+
+       dprintk("closing device\n");
+
+       /* set alternate setting for audio interface */
+       /* 1 - 48000 samples per sec */
+       ret = cx231xx_set_alt_setting(dev, INDEX_AUDIO, 0);
+       if (ret < 0) {
+               cx231xx_errdev("failed to set alternate setting !\n");
+
+               return ret;
+       }
+
+       /* inform hardware to start streaming */
+       ret = cx231xx_capture_start(dev, 0, Audio);
+
+       dev->mute = 1;
+       mutex_lock(&dev->lock);
+       dev->adev.users--;
+       mutex_unlock(&dev->lock);
+
+       if (dev->adev.users == 0 && dev->adev.shutdown == 1) {
+               dprintk("audio users: %d\n", dev->adev.users);
+               dprintk("disabling audio stream!\n");
+               dev->adev.shutdown = 0;
+               dprintk("released lock\n");
+               cx231xx_cmd(dev, CX231XX_CAPTURE_STREAM_EN, 0);
+       }
+       return 0;
+}
+
+static int snd_cx231xx_hw_capture_params(struct snd_pcm_substream *substream,
+                                        struct snd_pcm_hw_params *hw_params)
+{
+       unsigned int channels, rate, format;
+       int ret;
+
+       dprintk("Setting capture parameters\n");
+
+       ret = snd_pcm_alloc_vmalloc_buffer(substream,
+                                          params_buffer_bytes(hw_params));
+       format = params_format(hw_params);
+       rate = params_rate(hw_params);
+       channels = params_channels(hw_params);
+
+       /* TODO: set up cx231xx audio chip to deliver the correct audio format,
+          current default is 48000hz multiplexed => 96000hz mono
+          which shouldn't matter since analogue TV only supports mono */
+       return 0;
+}
+
+static int snd_cx231xx_hw_capture_free(struct snd_pcm_substream *substream)
+{
+       struct cx231xx *dev = snd_pcm_substream_chip(substream);
+
+       dprintk("Stop capture, if needed\n");
+
+       if (dev->adev.capture_stream == STREAM_ON)
+               cx231xx_cmd(dev, CX231XX_CAPTURE_STREAM_EN, CX231XX_STOP_AUDIO);
+
+       return 0;
+}
+
+static int snd_cx231xx_prepare(struct snd_pcm_substream *substream)
+{
+       return 0;
+}
+
+static int snd_cx231xx_capture_trigger(struct snd_pcm_substream *substream,
+                                      int cmd)
+{
+       struct cx231xx *dev = snd_pcm_substream_chip(substream);
+       int retval;
+
+       dprintk("Should %s capture\n", (cmd == SNDRV_PCM_TRIGGER_START) ?
+               "start" : "stop");
+
+       spin_lock(&dev->adev.slock);
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+               cx231xx_cmd(dev, CX231XX_CAPTURE_STREAM_EN,
+                           CX231XX_START_AUDIO);
+               retval = 0;
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+               cx231xx_cmd(dev, CX231XX_CAPTURE_STREAM_EN, CX231XX_STOP_AUDIO);
+               retval = 0;
+               break;
+       default:
+               retval = -EINVAL;
+       }
+
+       spin_unlock(&dev->adev.slock);
+       return retval;
+}
+
+static snd_pcm_uframes_t snd_cx231xx_capture_pointer(struct snd_pcm_substream
+                                                    *substream)
+{
+       struct cx231xx *dev;
+       unsigned long flags;
+       snd_pcm_uframes_t hwptr_done;
+
+       dev = snd_pcm_substream_chip(substream);
+
+       spin_lock_irqsave(&dev->adev.slock, flags);
+       hwptr_done = dev->adev.hwptr_done_capture;
+       spin_unlock_irqrestore(&dev->adev.slock, flags);
+
+       return hwptr_done;
+}
+
+static struct page *snd_pcm_get_vmalloc_page(struct snd_pcm_substream *subs,
+                                            unsigned long offset)
+{
+       void *pageptr = subs->runtime->dma_area + offset;
+
+       return vmalloc_to_page(pageptr);
+}
+
+static struct snd_pcm_ops snd_cx231xx_pcm_capture = {
+       .open = snd_cx231xx_capture_open,
+       .close = snd_cx231xx_pcm_close,
+       .ioctl = snd_pcm_lib_ioctl,
+       .hw_params = snd_cx231xx_hw_capture_params,
+       .hw_free = snd_cx231xx_hw_capture_free,
+       .prepare = snd_cx231xx_prepare,
+       .trigger = snd_cx231xx_capture_trigger,
+       .pointer = snd_cx231xx_capture_pointer,
+       .page = snd_pcm_get_vmalloc_page,
+};
+
+static int cx231xx_audio_init(struct cx231xx *dev)
+{
+       struct cx231xx_audio *adev = &dev->adev;
+       struct snd_pcm *pcm;
+       struct snd_card *card;
+       static int devnr;
+       int err;
+       struct usb_interface *uif;
+       int i, isoc_pipe = 0;
+
+       if (dev->has_alsa_audio != 1) {
+               /* This device does not support the extension (in this case
+                  the device is expecting the snd-usb-audio module or
+                  doesn't have analog audio support at all) */
+               return 0;
+       }
+
+       cx231xx_info("cx231xx-audio.c: probing for cx231xx "
+                    "non standard usbaudio\n");
+
+       err = snd_card_create(index[devnr], "Cx231xx Audio", THIS_MODULE,
+                             0, &card);
+       if (err < 0)
+               return err;
+
+       spin_lock_init(&adev->slock);
+       err = snd_pcm_new(card, "Cx231xx Audio", 0, 0, 1, &pcm);
+       if (err < 0) {
+               snd_card_free(card);
+               return err;
+       }
+
+       snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
+                       &snd_cx231xx_pcm_capture);
+       pcm->info_flags = 0;
+       pcm->private_data = dev;
+       strcpy(pcm->name, "Conexant cx231xx Capture");
+       strcpy(card->driver, "Conexant cx231xx Audio");
+       strcpy(card->shortname, "Cx231xx Audio");
+       strcpy(card->longname, "Conexant cx231xx Audio");
+
+       err = snd_card_register(card);
+       if (err < 0) {
+               snd_card_free(card);
+               return err;
+       }
+       adev->sndcard = card;
+       adev->udev = dev->udev;
+
+       /* compute alternate max packet sizes for Audio */
+       uif =
+           dev->udev->actconfig->interface[dev->current_pcb_config.
+                                           hs_config_info[0].interface_info.
+                                           audio_index + 1];
+
+       adev->end_point_addr =
+           le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
+                       bEndpointAddress);
+
+       adev->num_alt = uif->num_altsetting;
+       cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
+                    adev->end_point_addr, adev->num_alt);
+       adev->alt_max_pkt_size = kmalloc(32 * adev->num_alt, GFP_KERNEL);
+
+       if (adev->alt_max_pkt_size == NULL) {
+               cx231xx_errdev("out of memory!\n");
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < adev->num_alt; i++) {
+               u16 tmp =
+                   le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
+                               wMaxPacketSize);
+               adev->alt_max_pkt_size[i] =
+                   (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
+               cx231xx_info("Alternate setting %i, max size= %i\n", i,
+                            adev->alt_max_pkt_size[i]);
+       }
+
+       return 0;
+}
+
+static int cx231xx_audio_fini(struct cx231xx *dev)
+{
+       if (dev == NULL)
+               return 0;
+
+       if (dev->has_alsa_audio != 1) {
+               /* This device does not support the extension (in this case
+                  the device is expecting the snd-usb-audio module or
+                  doesn't have analog audio support at all) */
+               return 0;
+       }
+
+       if (dev->adev.sndcard) {
+               snd_card_free(dev->adev.sndcard);
+               kfree(dev->adev.alt_max_pkt_size);
+               dev->adev.sndcard = NULL;
+       }
+
+       return 0;
+}
+
+static struct cx231xx_ops audio_ops = {
+       .id = CX231XX_AUDIO,
+       .name = "Cx231xx Audio Extension",
+       .init = cx231xx_audio_init,
+       .fini = cx231xx_audio_fini,
+};
+
+static int __init cx231xx_alsa_register(void)
+{
+       return cx231xx_register_extension(&audio_ops);
+}
+
+static void __exit cx231xx_alsa_unregister(void)
+{
+       cx231xx_unregister_extension(&audio_ops);
+}
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
+MODULE_DESCRIPTION("Cx231xx Audio driver");
+
+module_init(cx231xx_alsa_register);
+module_exit(cx231xx_alsa_unregister);
diff --git a/drivers/media/video/cx231xx/cx231xx-avcore.c b/drivers/media/video/cx231xx/cx231xx-avcore.c
new file mode 100644 (file)
index 0000000..1be3881
--- /dev/null
@@ -0,0 +1,2581 @@
+/*
+   cx231xx_avcore.c - driver for Conexant Cx23100/101/102
+                     USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+
+   This program contains the specific code to control the avdecoder chip and
+   other related usb control functions for cx231xx based chipset.
+
+   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 <linux/init.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/bitmap.h>
+#include <linux/usb.h>
+#include <linux/i2c.h>
+#include <linux/version.h>
+#include <linux/mm.h>
+#include <linux/mutex.h>
+
+#include <media/v4l2-common.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-chip-ident.h>
+
+#include "cx231xx.h"
+
+/******************************************************************************
+                       -: BLOCK ARRANGEMENT :-
+       I2S block ----------------------|
+       [I2S audio]                     |
+                                       |
+       Analog Front End --> Direct IF -|-> Cx25840 --> Audio
+       [video & audio]                 |   [Audio]
+                                       |
+                                       |-> Cx25840 --> Video
+                                           [Video]
+
+*******************************************************************************/
+
+/******************************************************************************
+ *                    A F E - B L O C K    C O N T R O L   functions          *
+ *                             [ANALOG FRONT END]                            *
+ ******************************************************************************/
+static int afe_write_byte(struct cx231xx *dev, u16 saddr, u8 data)
+{
+       return cx231xx_write_i2c_data(dev, AFE_DEVICE_ADDRESS,
+                                       saddr, 2, data, 1);
+}
+
+static int afe_read_byte(struct cx231xx *dev, u16 saddr, u8 *data)
+{
+       int status;
+       u32 temp = 0;
+
+       status = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
+                                       saddr, 2, &temp, 1);
+       *data = (u8) temp;
+       return status;
+}
+
+int cx231xx_afe_init_super_block(struct cx231xx *dev, u32 ref_count)
+{
+       int status = 0;
+       u8 temp = 0;
+       u8 afe_power_status = 0;
+       int i = 0;
+
+       /* super block initialize */
+       temp = (u8) (ref_count & 0xff);
+       status = afe_write_byte(dev, SUP_BLK_TUNE2, temp);
+       if (status < 0)
+               return status;
+
+       status = afe_read_byte(dev, SUP_BLK_TUNE2, &afe_power_status);
+       if (status < 0)
+               return status;
+
+       temp = (u8) ((ref_count & 0x300) >> 8);
+       temp |= 0x40;
+       status = afe_write_byte(dev, SUP_BLK_TUNE1, temp);
+       if (status < 0)
+               return status;
+
+       status = afe_write_byte(dev, SUP_BLK_PLL2, 0x0f);
+       if (status < 0)
+               return status;
+
+       /* enable pll     */
+       while (afe_power_status != 0x18) {
+               status = afe_write_byte(dev, SUP_BLK_PWRDN, 0x18);
+               if (status < 0) {
+                       cx231xx_info(
+                       ": Init Super Block failed in send cmd\n");
+                       break;
+               }
+
+               status = afe_read_byte(dev, SUP_BLK_PWRDN, &afe_power_status);
+               afe_power_status &= 0xff;
+               if (status < 0) {
+                       cx231xx_info(
+                       ": Init Super Block failed in receive cmd\n");
+                       break;
+               }
+               i++;
+               if (i == 10) {
+                       cx231xx_info(
+                       ": Init Super Block force break in loop !!!!\n");
+                       status = -1;
+                       break;
+               }
+       }
+
+       if (status < 0)
+               return status;
+
+       /* start tuning filter */
+       status = afe_write_byte(dev, SUP_BLK_TUNE3, 0x40);
+       if (status < 0)
+               return status;
+
+       msleep(5);
+
+       /* exit tuning */
+       status = afe_write_byte(dev, SUP_BLK_TUNE3, 0x00);
+
+       return status;
+}
+
+int cx231xx_afe_init_channels(struct cx231xx *dev)
+{
+       int status = 0;
+
+       /* power up all 3 channels, clear pd_buffer */
+       status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1, 0x00);
+       status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2, 0x00);
+       status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3, 0x00);
+
+       /* Enable quantizer calibration */
+       status = afe_write_byte(dev, ADC_COM_QUANT, 0x02);
+
+       /* channel initialize, force modulator (fb) reset */
+       status = afe_write_byte(dev, ADC_FB_FRCRST_CH1, 0x17);
+       status = afe_write_byte(dev, ADC_FB_FRCRST_CH2, 0x17);
+       status = afe_write_byte(dev, ADC_FB_FRCRST_CH3, 0x17);
+
+       /* start quantilizer calibration  */
+       status = afe_write_byte(dev, ADC_CAL_ATEST_CH1, 0x10);
+       status = afe_write_byte(dev, ADC_CAL_ATEST_CH2, 0x10);
+       status = afe_write_byte(dev, ADC_CAL_ATEST_CH3, 0x10);
+       msleep(5);
+
+       /* exit modulator (fb) reset */
+       status = afe_write_byte(dev, ADC_FB_FRCRST_CH1, 0x07);
+       status = afe_write_byte(dev, ADC_FB_FRCRST_CH2, 0x07);
+       status = afe_write_byte(dev, ADC_FB_FRCRST_CH3, 0x07);
+
+       /* enable the pre_clamp in each channel for single-ended input */
+       status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH1, 0xf0);
+       status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH2, 0xf0);
+       status = afe_write_byte(dev, ADC_NTF_PRECLMP_EN_CH3, 0xf0);
+
+       /* use diode instead of resistor, so set term_en to 0, res_en to 0  */
+       status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
+                                  ADC_QGAIN_RES_TRM_CH1, 3, 7, 0x00);
+       status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
+                                  ADC_QGAIN_RES_TRM_CH2, 3, 7, 0x00);
+       status = cx231xx_reg_mask_write(dev, AFE_DEVICE_ADDRESS, 8,
+                                  ADC_QGAIN_RES_TRM_CH3, 3, 7, 0x00);
+
+       /* dynamic element matching off */
+       status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH1, 0x03);
+       status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH2, 0x03);
+       status = afe_write_byte(dev, ADC_DCSERVO_DEM_CH3, 0x03);
+
+       return status;
+}
+
+int cx231xx_afe_setup_AFE_for_baseband(struct cx231xx *dev)
+{
+       u8 c_value = 0;
+       int status = 0;
+
+       status = afe_read_byte(dev, ADC_PWRDN_CLAMP_CH2, &c_value);
+       c_value &= (~(0x50));
+       status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2, c_value);
+
+       return status;
+}
+
+/*
+       The Analog Front End in Cx231xx has 3 channels. These
+       channels are used to share between different inputs
+       like tuner, s-video and composite inputs.
+
+       channel 1 ----- pin 1  to pin4(in reg is 1-4)
+       channel 2 ----- pin 5  to pin8(in reg is 5-8)
+       channel 3 ----- pin 9 to pin 12(in reg is 9-11)
+*/
+int cx231xx_afe_set_input_mux(struct cx231xx *dev, u32 input_mux)
+{
+       u8 ch1_setting = (u8) input_mux;
+       u8 ch2_setting = (u8) (input_mux >> 8);
+       u8 ch3_setting = (u8) (input_mux >> 16);
+       int status = 0;
+       u8 value = 0;
+
+       if (ch1_setting != 0) {
+               status = afe_read_byte(dev, ADC_INPUT_CH1, &value);
+               value &= (!INPUT_SEL_MASK);
+               value |= (ch1_setting - 1) << 4;
+               value &= 0xff;
+               status = afe_write_byte(dev, ADC_INPUT_CH1, value);
+       }
+
+       if (ch2_setting != 0) {
+               status = afe_read_byte(dev, ADC_INPUT_CH2, &value);
+               value &= (!INPUT_SEL_MASK);
+               value |= (ch2_setting - 1) << 4;
+               value &= 0xff;
+               status = afe_write_byte(dev, ADC_INPUT_CH2, value);
+       }
+
+       /* For ch3_setting, the value to put in the register is
+          7 less than the input number */
+       if (ch3_setting != 0) {
+               status = afe_read_byte(dev, ADC_INPUT_CH3, &value);
+               value &= (!INPUT_SEL_MASK);
+               value |= (ch3_setting - 1) << 4;
+               value &= 0xff;
+               status = afe_write_byte(dev, ADC_INPUT_CH3, value);
+       }
+
+       return status;
+}
+
+int cx231xx_afe_set_mode(struct cx231xx *dev, enum AFE_MODE mode)
+{
+       int status = 0;
+
+       /*
+       * FIXME: We need to implement the AFE code for LOW IF and for HI IF.
+       * Currently, only baseband works.
+       */
+
+       switch (mode) {
+       case AFE_MODE_LOW_IF:
+               /* SetupAFEforLowIF();  */
+               break;
+       case AFE_MODE_BASEBAND:
+               status = cx231xx_afe_setup_AFE_for_baseband(dev);
+               break;
+       case AFE_MODE_EU_HI_IF:
+               /* SetupAFEforEuHiIF(); */
+               break;
+       case AFE_MODE_US_HI_IF:
+               /* SetupAFEforUsHiIF(); */
+               break;
+       case AFE_MODE_JAPAN_HI_IF:
+               /* SetupAFEforJapanHiIF(); */
+               break;
+       }
+
+       if ((mode != dev->afe_mode) &&
+               (dev->video_input == CX231XX_VMUX_TELEVISION))
+               status = cx231xx_afe_adjust_ref_count(dev,
+                                                    CX231XX_VMUX_TELEVISION);
+
+       dev->afe_mode = mode;
+
+       return status;
+}
+
+int cx231xx_afe_update_power_control(struct cx231xx *dev,
+                                       enum AV_MODE avmode)
+{
+       u8 afe_power_status = 0;
+       int status = 0;
+
+       switch (dev->model) {
+       case CX231XX_BOARD_CNXT_RDE_250:
+       case CX231XX_BOARD_CNXT_RDU_250:
+               if (avmode == POLARIS_AVMODE_ANALOGT_TV) {
+                       while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
+                                               FLD_PWRDN_ENABLE_PLL)) {
+                               status = afe_write_byte(dev, SUP_BLK_PWRDN,
+                                                       FLD_PWRDN_TUNING_BIAS |
+                                                       FLD_PWRDN_ENABLE_PLL);
+                               status |= afe_read_byte(dev, SUP_BLK_PWRDN,
+                                                       &afe_power_status);
+                               if (status < 0)
+                                       break;
+                       }
+
+                       status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
+                                                       0x00);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
+                                                       0x00);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
+                                                       0x00);
+               } else if (avmode == POLARIS_AVMODE_DIGITAL) {
+                       status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
+                                                       0x70);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
+                                                       0x70);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
+                                                       0x70);
+
+                       status |= afe_read_byte(dev, SUP_BLK_PWRDN,
+                                                 &afe_power_status);
+                       afe_power_status |= FLD_PWRDN_PD_BANDGAP |
+                                               FLD_PWRDN_PD_BIAS |
+                                               FLD_PWRDN_PD_TUNECK;
+                       status |= afe_write_byte(dev, SUP_BLK_PWRDN,
+                                                  afe_power_status);
+               } else if (avmode == POLARIS_AVMODE_ENXTERNAL_AV) {
+                       while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
+                                               FLD_PWRDN_ENABLE_PLL)) {
+                               status = afe_write_byte(dev, SUP_BLK_PWRDN,
+                                                       FLD_PWRDN_TUNING_BIAS |
+                                                       FLD_PWRDN_ENABLE_PLL);
+                               status |= afe_read_byte(dev, SUP_BLK_PWRDN,
+                                                       &afe_power_status);
+                               if (status < 0)
+                                       break;
+                       }
+
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
+                                               0x00);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
+                                               0x00);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
+                                               0x00);
+               } else {
+                       cx231xx_info("Invalid AV mode input\n");
+                       status = -1;
+               }
+               break;
+       default:
+               if (avmode == POLARIS_AVMODE_ANALOGT_TV) {
+                       while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
+                                               FLD_PWRDN_ENABLE_PLL)) {
+                               status = afe_write_byte(dev, SUP_BLK_PWRDN,
+                                                       FLD_PWRDN_TUNING_BIAS |
+                                                       FLD_PWRDN_ENABLE_PLL);
+                               status |= afe_read_byte(dev, SUP_BLK_PWRDN,
+                                                       &afe_power_status);
+                               if (status < 0)
+                                       break;
+                       }
+
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
+                                                       0x40);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
+                                                       0x40);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
+                                                       0x00);
+               } else if (avmode == POLARIS_AVMODE_DIGITAL) {
+                       status = afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
+                                                       0x70);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
+                                                       0x70);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
+                                                       0x70);
+
+                       status |= afe_read_byte(dev, SUP_BLK_PWRDN,
+                                                      &afe_power_status);
+                       afe_power_status |= FLD_PWRDN_PD_BANDGAP |
+                                               FLD_PWRDN_PD_BIAS |
+                                               FLD_PWRDN_PD_TUNECK;
+                       status |= afe_write_byte(dev, SUP_BLK_PWRDN,
+                                                       afe_power_status);
+               } else if (avmode == POLARIS_AVMODE_ENXTERNAL_AV) {
+                       while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
+                                               FLD_PWRDN_ENABLE_PLL)) {
+                               status = afe_write_byte(dev, SUP_BLK_PWRDN,
+                                                       FLD_PWRDN_TUNING_BIAS |
+                                                       FLD_PWRDN_ENABLE_PLL);
+                               status |= afe_read_byte(dev, SUP_BLK_PWRDN,
+                                                       &afe_power_status);
+                               if (status < 0)
+                                       break;
+                       }
+
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH1,
+                                                       0x00);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH2,
+                                                       0x00);
+                       status |= afe_write_byte(dev, ADC_PWRDN_CLAMP_CH3,
+                                                       0x40);
+               } else {
+                       cx231xx_info("Invalid AV mode input\n");
+                       status = -1;
+               }
+       }                       /* switch  */
+
+       return status;
+}
+
+int cx231xx_afe_adjust_ref_count(struct cx231xx *dev, u32 video_input)
+{
+       u8 input_mode = 0;
+       u8 ntf_mode = 0;
+       int status = 0;
+
+       dev->video_input = video_input;
+
+       if (video_input == CX231XX_VMUX_TELEVISION) {
+               status = afe_read_byte(dev, ADC_INPUT_CH3, &input_mode);
+               status = afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH3,
+                                       &ntf_mode);
+       } else {
+               status = afe_read_byte(dev, ADC_INPUT_CH1, &input_mode);
+               status = afe_read_byte(dev, ADC_NTF_PRECLMP_EN_CH1,
+                                       &ntf_mode);
+       }
+
+       input_mode = (ntf_mode & 0x3) | ((input_mode & 0x6) << 1);
+
+       switch (input_mode) {
+       case SINGLE_ENDED:
+               dev->afe_ref_count = 0x23C;
+               break;
+       case LOW_IF:
+               dev->afe_ref_count = 0x24C;
+               break;
+       case EU_IF:
+               dev->afe_ref_count = 0x258;
+               break;
+       case US_IF:
+               dev->afe_ref_count = 0x260;
+               break;
+       default:
+               break;
+       }
+
+       status = cx231xx_afe_init_super_block(dev, dev->afe_ref_count);
+
+       return status;
+}
+
+/******************************************************************************
+ *     V I D E O / A U D I O    D E C O D E R    C O N T R O L   functions    *
+ ******************************************************************************/
+static int vid_blk_write_byte(struct cx231xx *dev, u16 saddr, u8 data)
+{
+       return cx231xx_write_i2c_data(dev, VID_BLK_I2C_ADDRESS,
+                                       saddr, 2, data, 1);
+}
+
+static int vid_blk_read_byte(struct cx231xx *dev, u16 saddr, u8 *data)
+{
+       int status;
+       u32 temp = 0;
+
+       status = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
+                                       saddr, 2, &temp, 1);
+       *data = (u8) temp;
+       return status;
+}
+
+static int vid_blk_write_word(struct cx231xx *dev, u16 saddr, u32 data)
+{
+       return cx231xx_write_i2c_data(dev, VID_BLK_I2C_ADDRESS,
+                                       saddr, 2, data, 4);
+}
+
+static int vid_blk_read_word(struct cx231xx *dev, u16 saddr, u32 *data)
+{
+       return cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
+                                       saddr, 2, data, 4);
+}
+
+int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input)
+{
+       int status = 0;
+
+       switch (INPUT(input)->type) {
+       case CX231XX_VMUX_COMPOSITE1:
+       case CX231XX_VMUX_SVIDEO:
+               if ((dev->current_pcb_config.type == USB_BUS_POWER) &&
+                   (dev->power_mode != POLARIS_AVMODE_ENXTERNAL_AV)) {
+                       /* External AV */
+                       status = cx231xx_set_power_mode(dev,
+                                       POLARIS_AVMODE_ENXTERNAL_AV);
+                       if (status < 0) {
+                               cx231xx_errdev("%s: set_power_mode : Failed to"
+                                               " set Power - errCode [%d]!\n",
+                                               __func__, status);
+                               return status;
+                       }
+               }
+               status = cx231xx_set_decoder_video_input(dev,
+                                                        INPUT(input)->type,
+                                                        INPUT(input)->vmux);
+               break;
+       case CX231XX_VMUX_TELEVISION:
+       case CX231XX_VMUX_CABLE:
+               if ((dev->current_pcb_config.type == USB_BUS_POWER) &&
+                   (dev->power_mode != POLARIS_AVMODE_ANALOGT_TV)) {
+                       /* Tuner */
+                       status = cx231xx_set_power_mode(dev,
+                                               POLARIS_AVMODE_ANALOGT_TV);
+                       if (status < 0) {
+                               cx231xx_errdev("%s: set_power_mode:Failed"
+                                       " to set Power - errCode [%d]!\n",
+                                       __func__, status);
+                               return status;
+                       }
+               }
+               status = cx231xx_set_decoder_video_input(dev,
+                                                       CX231XX_VMUX_COMPOSITE1,
+                                                       INPUT(input)->vmux);
+               break;
+       default:
+               cx231xx_errdev("%s: set_power_mode : Unknown Input %d !\n",
+                    __func__, INPUT(input)->type);
+               break;
+       }
+
+       /* save the selection */
+       dev->video_input = input;
+
+       return status;
+}
+
+int cx231xx_set_decoder_video_input(struct cx231xx *dev,
+                               u8 pin_type, u8 input)
+{
+       int status = 0;
+       u32 value = 0;
+
+       if (pin_type != dev->video_input) {
+               status = cx231xx_afe_adjust_ref_count(dev, pin_type);
+               if (status < 0) {
+                       cx231xx_errdev("%s: adjust_ref_count :Failed to set"
+                               "AFE input mux - errCode [%d]!\n",
+                               __func__, status);
+                       return status;
+               }
+       }
+
+       /* call afe block to set video inputs */
+       status = cx231xx_afe_set_input_mux(dev, input);
+       if (status < 0) {
+               cx231xx_errdev("%s: set_input_mux :Failed to set"
+                               " AFE input mux - errCode [%d]!\n",
+                               __func__, status);
+               return status;
+       }
+
+       switch (pin_type) {
+       case CX231XX_VMUX_COMPOSITE1:
+               status = vid_blk_read_word(dev, AFE_CTRL, &value);
+               value |= (0 << 13) | (1 << 4);
+               value &= ~(1 << 5);
+
+               /* set [24:23] [22:15] to 0  */
+               value &= (~(0x1ff8000));
+               /* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0  */
+               value |= 0x1000000;
+               status = vid_blk_write_word(dev, AFE_CTRL, value);
+
+               status = vid_blk_read_word(dev, OUT_CTRL1, &value);
+               value |= (1 << 7);
+               status = vid_blk_write_word(dev, OUT_CTRL1, value);
+
+               /* Set vip 1.1 output mode */
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       OUT_CTRL1,
+                                                       FLD_OUT_MODE,
+                                                       OUT_MODE_VIP11);
+
+               /* Tell DIF object to go to baseband mode  */
+               status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
+               if (status < 0) {
+                       cx231xx_errdev("%s: cx231xx_dif set to By pass"
+                                                  " mode- errCode [%d]!\n",
+                               __func__, status);
+                       return status;
+               }
+
+               /* Read the DFE_CTRL1 register */
+               status = vid_blk_read_word(dev, DFE_CTRL1, &value);
+
+               /* enable the VBI_GATE_EN */
+               value |= FLD_VBI_GATE_EN;
+
+               /* Enable the auto-VGA enable */
+               value |= FLD_VGA_AUTO_EN;
+
+               /* Write it back */
+               status = vid_blk_write_word(dev, DFE_CTRL1, value);
+
+               /* Disable auto config of registers */
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                       VID_BLK_I2C_ADDRESS,
+                                       MODE_CTRL, FLD_ACFG_DIS,
+                                       cx231xx_set_field(FLD_ACFG_DIS, 1));
+
+               /* Set CVBS input mode */
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                       VID_BLK_I2C_ADDRESS,
+                       MODE_CTRL, FLD_INPUT_MODE,
+                       cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_CVBS_0));
+               break;
+       case CX231XX_VMUX_SVIDEO:
+               /* Disable the use of  DIF */
+
+               status = vid_blk_read_word(dev, AFE_CTRL, &value);
+
+               /* set [24:23] [22:15] to 0 */
+               value &= (~(0x1ff8000));
+               /* set FUNC_MODE[24:23] = 2
+               IF_MOD[22:15] = 0 DCR_BYP_CH2[4:4] = 1; */
+               value |= 0x1000010;
+               status = vid_blk_write_word(dev, AFE_CTRL, value);
+
+               /* Tell DIF object to go to baseband mode */
+               status = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
+               if (status < 0) {
+                       cx231xx_errdev("%s: cx231xx_dif set to By pass"
+                                                  " mode- errCode [%d]!\n",
+                               __func__, status);
+                       return status;
+               }
+
+               /* Read the DFE_CTRL1 register */
+               status = vid_blk_read_word(dev, DFE_CTRL1, &value);
+
+               /* enable the VBI_GATE_EN */
+               value |= FLD_VBI_GATE_EN;
+
+               /* Enable the auto-VGA enable */
+               value |= FLD_VGA_AUTO_EN;
+
+               /* Write it back */
+               status = vid_blk_write_word(dev, DFE_CTRL1, value);
+
+               /* Disable auto config of registers  */
+               status =  cx231xx_read_modify_write_i2c_dword(dev,
+                                       VID_BLK_I2C_ADDRESS,
+                                       MODE_CTRL, FLD_ACFG_DIS,
+                                       cx231xx_set_field(FLD_ACFG_DIS, 1));
+
+               /* Set YC input mode */
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                       VID_BLK_I2C_ADDRESS,
+                       MODE_CTRL,
+                       FLD_INPUT_MODE,
+                       cx231xx_set_field(FLD_INPUT_MODE, INPUT_MODE_YC_1));
+
+               /* Chroma to ADC2 */
+               status = vid_blk_read_word(dev, AFE_CTRL, &value);
+               value |= FLD_CHROMA_IN_SEL;     /* set the chroma in select */
+
+               /* Clear VGA_SEL_CH2 and VGA_SEL_CH3 (bits 7 and 8)
+                  This sets them to use video
+                  rather than audio.  Only one of the two will be in use. */
+               value &= ~(FLD_VGA_SEL_CH2 | FLD_VGA_SEL_CH3);
+
+               status = vid_blk_write_word(dev, AFE_CTRL, value);
+
+               status = cx231xx_afe_set_mode(dev, AFE_MODE_BASEBAND);
+               break;
+       case CX231XX_VMUX_TELEVISION:
+       case CX231XX_VMUX_CABLE:
+       default:
+               switch (dev->model) {
+               case CX231XX_BOARD_CNXT_RDE_250:
+               case CX231XX_BOARD_CNXT_RDU_250:
+                       /* Disable the use of  DIF   */
+
+                       status = vid_blk_read_word(dev, AFE_CTRL, &value);
+                       value |= (0 << 13) | (1 << 4);
+                       value &= ~(1 << 5);
+
+                       /* set [24:23] [22:15] to 0 */
+                       value &= (~(0x1FF8000));
+                       /* set FUNC_MODE[24:23] = 2 IF_MOD[22:15] = 0 */
+                       value |= 0x1000000;
+                       status = vid_blk_write_word(dev, AFE_CTRL, value);
+
+                       status = vid_blk_read_word(dev, OUT_CTRL1, &value);
+                       value |= (1 << 7);
+                       status = vid_blk_write_word(dev, OUT_CTRL1, value);
+
+                       /* Set vip 1.1 output mode */
+                       status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       OUT_CTRL1, FLD_OUT_MODE,
+                                                       OUT_MODE_VIP11);
+
+                       /* Tell DIF object to go to baseband mode */
+                       status = cx231xx_dif_set_standard(dev,
+                                                         DIF_USE_BASEBAND);
+                       if (status < 0) {
+                               cx231xx_errdev("%s: cx231xx_dif set to By pass"
+                                               " mode- errCode [%d]!\n",
+                                               __func__, status);
+                               return status;
+                       }
+
+                       /* Read the DFE_CTRL1 register */
+                       status = vid_blk_read_word(dev, DFE_CTRL1, &value);
+
+                       /* enable the VBI_GATE_EN */
+                       value |= FLD_VBI_GATE_EN;
+
+                       /* Enable the auto-VGA enable */
+                       value |= FLD_VGA_AUTO_EN;
+
+                       /* Write it back */
+                       status = vid_blk_write_word(dev, DFE_CTRL1, value);
+
+                       /* Disable auto config of registers */
+                       status = cx231xx_read_modify_write_i2c_dword(dev,
+                                       VID_BLK_I2C_ADDRESS,
+                                       MODE_CTRL, FLD_ACFG_DIS,
+                                       cx231xx_set_field(FLD_ACFG_DIS, 1));
+
+                       /* Set CVBS input mode */
+                       status = cx231xx_read_modify_write_i2c_dword(dev,
+                               VID_BLK_I2C_ADDRESS,
+                               MODE_CTRL, FLD_INPUT_MODE,
+                               cx231xx_set_field(FLD_INPUT_MODE,
+                                               INPUT_MODE_CVBS_0));
+                       break;
+               default:
+                       /* Enable the DIF for the tuner */
+
+                       /* Reinitialize the DIF */
+                       status = cx231xx_dif_set_standard(dev, dev->norm);
+                       if (status < 0) {
+                               cx231xx_errdev("%s: cx231xx_dif set to By pass"
+                                               " mode- errCode [%d]!\n",
+                                               __func__, status);
+                               return status;
+                       }
+
+                       /* Make sure bypass is cleared */
+                       status = vid_blk_read_word(dev, DIF_MISC_CTRL, &value);
+
+                       /* Clear the bypass bit */
+                       value &= ~FLD_DIF_DIF_BYPASS;
+
+                       /* Enable the use of the DIF block */
+                       status = vid_blk_write_word(dev, DIF_MISC_CTRL, value);
+
+                       /* Read the DFE_CTRL1 register */
+                       status = vid_blk_read_word(dev, DFE_CTRL1, &value);
+
+                       /* Disable the VBI_GATE_EN */
+                       value &= ~FLD_VBI_GATE_EN;
+
+                       /* Enable the auto-VGA enable, AGC, and
+                          set the skip count to 2 */
+                       value |= FLD_VGA_AUTO_EN | FLD_AGC_AUTO_EN | 0x00200000;
+
+                       /* Write it back */
+                       status = vid_blk_write_word(dev, DFE_CTRL1, value);
+
+                       /* Wait until AGC locks up */
+                       msleep(1);
+
+                       /* Disable the auto-VGA enable AGC */
+                       value &= ~(FLD_VGA_AUTO_EN);
+
+                       /* Write it back */
+                       status = vid_blk_write_word(dev, DFE_CTRL1, value);
+
+                       /* Enable Polaris B0 AGC output */
+                       status = vid_blk_read_word(dev, PIN_CTRL, &value);
+                       value |= (FLD_OEF_AGC_RF) |
+                                (FLD_OEF_AGC_IFVGA) |
+                                (FLD_OEF_AGC_IF);
+                       status = vid_blk_write_word(dev, PIN_CTRL, value);
+
+                       /* Set vip 1.1 output mode */
+                       status = cx231xx_read_modify_write_i2c_dword(dev,
+                                               VID_BLK_I2C_ADDRESS,
+                                               OUT_CTRL1, FLD_OUT_MODE,
+                                               OUT_MODE_VIP11);
+
+                       /* Disable auto config of registers */
+                       status = cx231xx_read_modify_write_i2c_dword(dev,
+                                       VID_BLK_I2C_ADDRESS,
+                                       MODE_CTRL, FLD_ACFG_DIS,
+                                       cx231xx_set_field(FLD_ACFG_DIS, 1));
+
+                       /* Set CVBS input mode */
+                       status = cx231xx_read_modify_write_i2c_dword(dev,
+                               VID_BLK_I2C_ADDRESS,
+                               MODE_CTRL, FLD_INPUT_MODE,
+                               cx231xx_set_field(FLD_INPUT_MODE,
+                                               INPUT_MODE_CVBS_0));
+
+                       /* Set some bits in AFE_CTRL so that channel 2 or 3
+                        * is ready to receive audio */
+                       /* Clear clamp for channels 2 and 3      (bit 16-17) */
+                       /* Clear droop comp                      (bit 19-20) */
+                       /* Set VGA_SEL (for audio control)       (bit 7-8) */
+                       status = vid_blk_read_word(dev, AFE_CTRL, &value);
+
+                       value |= FLD_VGA_SEL_CH3 | FLD_VGA_SEL_CH2;
+
+                       status = vid_blk_write_word(dev, AFE_CTRL, value);
+                       break;
+
+               }
+               break;
+       }
+
+       /* Set raw VBI mode */
+       status = cx231xx_read_modify_write_i2c_dword(dev,
+                               VID_BLK_I2C_ADDRESS,
+                               OUT_CTRL1, FLD_VBIHACTRAW_EN,
+                               cx231xx_set_field(FLD_VBIHACTRAW_EN, 1));
+
+       status = vid_blk_read_word(dev, OUT_CTRL1, &value);
+       if (value & 0x02) {
+               value |= (1 << 19);
+               status = vid_blk_write_word(dev, OUT_CTRL1, value);
+       }
+
+       return status;
+}
+
+/*
+ * Handle any video-mode specific overrides that are different
+ * on a per video standards basis after touching the MODE_CTRL
+ * register which resets many values for autodetect
+ */
+int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev)
+{
+       int status = 0;
+
+       cx231xx_info("do_mode_ctrl_overrides : 0x%x\n",
+                    (unsigned int)dev->norm);
+
+       /* Change the DFE_CTRL3 bp_percent to fix flagging */
+       status = vid_blk_write_word(dev, DFE_CTRL3, 0xCD3F0280);
+
+       if (dev->norm & (V4L2_STD_NTSC | V4L2_STD_PAL_M)) {
+               cx231xx_info("do_mode_ctrl_overrides NTSC\n");
+
+               /* Move the close caption lines out of active video,
+                  adjust the active video start point */
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       VERT_TIM_CTRL,
+                                                       FLD_VBLANK_CNT, 0x18);
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       VERT_TIM_CTRL,
+                                                       FLD_VACTIVE_CNT,
+                                                       0x1E6000);
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       VERT_TIM_CTRL,
+                                                       FLD_V656BLANK_CNT,
+                                                       0x1E000000);
+
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       HORIZ_TIM_CTRL,
+                                                       FLD_HBLANK_CNT,
+                                                       cx231xx_set_field
+                                                       (FLD_HBLANK_CNT, 0x79));
+       } else if (dev->norm & V4L2_STD_SECAM) {
+               cx231xx_info("do_mode_ctrl_overrides SECAM\n");
+               status =  cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       VERT_TIM_CTRL,
+                                                       FLD_VBLANK_CNT, 0x24);
+               /* Adjust the active video horizontal start point */
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       HORIZ_TIM_CTRL,
+                                                       FLD_HBLANK_CNT,
+                                                       cx231xx_set_field
+                                                       (FLD_HBLANK_CNT, 0x85));
+       } else {
+               cx231xx_info("do_mode_ctrl_overrides PAL\n");
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       VERT_TIM_CTRL,
+                                                       FLD_VBLANK_CNT, 0x24);
+               /* Adjust the active video horizontal start point */
+               status = cx231xx_read_modify_write_i2c_dword(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       HORIZ_TIM_CTRL,
+                                                       FLD_HBLANK_CNT,
+                                                       cx231xx_set_field
+                                                       (FLD_HBLANK_CNT, 0x85));
+       }
+
+       return status;
+}
+
+int cx231xx_set_audio_input(struct cx231xx *dev, u8 input)
+{
+       int status = 0;
+       enum AUDIO_INPUT ainput = AUDIO_INPUT_LINE;
+
+       switch (INPUT(input)->amux) {
+       case CX231XX_AMUX_VIDEO:
+               ainput = AUDIO_INPUT_TUNER_TV;
+               break;
+       case CX231XX_AMUX_LINE_IN:
+               status = cx231xx_i2s_blk_set_audio_input(dev, input);
+               ainput = AUDIO_INPUT_LINE;
+               break;
+       default:
+               break;
+       }
+
+       status = cx231xx_set_audio_decoder_input(dev, ainput);
+
+       return status;
+}
+
+int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
+                                   enum AUDIO_INPUT audio_input)
+{
+       u32 dwval;
+       int status;
+       u8 gen_ctrl;
+       u32 value = 0;
+
+       /* Put it in soft reset   */
+       status = vid_blk_read_byte(dev, GENERAL_CTL, &gen_ctrl);
+       gen_ctrl |= 1;
+       status = vid_blk_write_byte(dev, GENERAL_CTL, gen_ctrl);
+
+       switch (audio_input) {
+       case AUDIO_INPUT_LINE:
+               /* setup AUD_IO control from Merlin paralle output */
+               value = cx231xx_set_field(FLD_AUD_CHAN1_SRC,
+                                         AUD_CHAN_SRC_PARALLEL);
+               status = vid_blk_write_word(dev, AUD_IO_CTRL, value);
+
+               /* setup input to Merlin, SRC2 connect to AC97
+                  bypass upsample-by-2, slave mode, sony mode, left justify
+                  adr 091c, dat 01000000 */
+               status = vid_blk_read_word(dev, AC97_CTL, &dwval);
+
+               status = vid_blk_write_word(dev, AC97_CTL,
+                                          (dwval | FLD_AC97_UP2X_BYPASS));
+
+               /* select the parallel1 and SRC3 */
+               status = vid_blk_write_word(dev, BAND_OUT_SEL,
+                               cx231xx_set_field(FLD_SRC3_IN_SEL, 0x0) |
+                               cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x0) |
+                               cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x0));
+
+               /* unmute all, AC97 in, independence mode
+                  adr 08d0, data 0x00063073 */
+               status = vid_blk_write_word(dev, PATH1_CTL1, 0x00063073);
+
+               /* set AVC maximum threshold, adr 08d4, dat ffff0024 */
+               status = vid_blk_read_word(dev, PATH1_VOL_CTL, &dwval);
+               status = vid_blk_write_word(dev, PATH1_VOL_CTL,
+                                          (dwval | FLD_PATH1_AVC_THRESHOLD));
+
+               /* set SC maximum threshold, adr 08ec, dat ffffb3a3 */
+               status = vid_blk_read_word(dev, PATH1_SC_CTL, &dwval);
+               status = vid_blk_write_word(dev, PATH1_SC_CTL,
+                                          (dwval | FLD_PATH1_SC_THRESHOLD));
+               break;
+
+       case AUDIO_INPUT_TUNER_TV:
+       default:
+
+               /* Setup SRC sources and clocks */
+               status = vid_blk_write_word(dev, BAND_OUT_SEL,
+                       cx231xx_set_field(FLD_SRC6_IN_SEL, 0x00)         |
+                       cx231xx_set_field(FLD_SRC6_CLK_SEL, 0x01)        |
+                       cx231xx_set_field(FLD_SRC5_IN_SEL, 0x00)         |
+                       cx231xx_set_field(FLD_SRC5_CLK_SEL, 0x02)        |
+                       cx231xx_set_field(FLD_SRC4_IN_SEL, 0x02)         |
+                       cx231xx_set_field(FLD_SRC4_CLK_SEL, 0x03)        |
+                       cx231xx_set_field(FLD_SRC3_IN_SEL, 0x00)         |
+                       cx231xx_set_field(FLD_SRC3_CLK_SEL, 0x00)        |
+                       cx231xx_set_field(FLD_BASEBAND_BYPASS_CTL, 0x00) |
+                       cx231xx_set_field(FLD_AC97_SRC_SEL, 0x03)        |
+                       cx231xx_set_field(FLD_I2S_SRC_SEL, 0x00)         |
+                       cx231xx_set_field(FLD_PARALLEL2_SRC_SEL, 0x02)   |
+                       cx231xx_set_field(FLD_PARALLEL1_SRC_SEL, 0x01));
+
+               /* Setup the AUD_IO control */
+               status = vid_blk_write_word(dev, AUD_IO_CTRL,
+                       cx231xx_set_field(FLD_I2S_PORT_DIR, 0x00)  |
+                       cx231xx_set_field(FLD_I2S_OUT_SRC, 0x00)   |
+                       cx231xx_set_field(FLD_AUD_CHAN3_SRC, 0x00) |
+                       cx231xx_set_field(FLD_AUD_CHAN2_SRC, 0x00) |
+                       cx231xx_set_field(FLD_AUD_CHAN1_SRC, 0x03));
+
+               status = vid_blk_write_word(dev, PATH1_CTL1, 0x1F063870);
+
+               /* setAudioStandard(_audio_standard); */
+
+               status = vid_blk_write_word(dev, PATH1_CTL1, 0x00063870);
+               switch (dev->model) {
+               case CX231XX_BOARD_CNXT_RDE_250:
+               case CX231XX_BOARD_CNXT_RDU_250:
+                       status = cx231xx_read_modify_write_i2c_dword(dev,
+                                       VID_BLK_I2C_ADDRESS,
+                                       CHIP_CTRL,
+                                       FLD_SIF_EN,
+                                       cx231xx_set_field(FLD_SIF_EN, 1));
+                       break;
+               default:
+                       break;
+               }
+               break;
+
+       case AUDIO_INPUT_TUNER_FM:
+               /*  use SIF for FM radio
+                  setupFM();
+                  setAudioStandard(_audio_standard);
+                */
+               break;
+
+       case AUDIO_INPUT_MUTE:
+               status = vid_blk_write_word(dev, PATH1_CTL1, 0x1F011012);
+               break;
+       }
+
+       /* Take it out of soft reset */
+       status = vid_blk_read_byte(dev, GENERAL_CTL, &gen_ctrl);
+       gen_ctrl &= ~1;
+       status = vid_blk_write_byte(dev, GENERAL_CTL, gen_ctrl);
+
+       return status;
+}
+
+/* Set resolution of the video */
+int cx231xx_resolution_set(struct cx231xx *dev)
+{
+       int width, height;
+       u32 hscale, vscale;
+       int status = 0;
+
+       width = dev->width;
+       height = dev->height;
+
+       get_scale(dev, width, height, &hscale, &vscale);
+
+       /* set horzontal scale */
+       status = vid_blk_write_word(dev, HSCALE_CTRL, hscale);
+
+       /* set vertical scale */
+       status = vid_blk_write_word(dev, VSCALE_CTRL, vscale);
+
+       return status;
+}
+
+/******************************************************************************
+ *                    C H I P Specific  C O N T R O L   functions             *
+ ******************************************************************************/
+int cx231xx_init_ctrl_pin_status(struct cx231xx *dev)
+{
+       u32 value;
+       int status = 0;
+
+       status = vid_blk_read_word(dev, PIN_CTRL, &value);
+       value |= (~dev->board.ctl_pin_status_mask);
+       status = vid_blk_write_word(dev, PIN_CTRL, value);
+
+       return status;
+}
+
+int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev,
+                                             u8 analog_or_digital)
+{
+       int status = 0;
+
+       /* first set the direction to output */
+       status = cx231xx_set_gpio_direction(dev,
+                                           dev->board.
+                                           agc_analog_digital_select_gpio, 1);
+
+       /* 0 - demod ; 1 - Analog mode */
+       status = cx231xx_set_gpio_value(dev,
+                                  dev->board.agc_analog_digital_select_gpio,
+                                  analog_or_digital);
+
+       return status;
+}
+
+int cx231xx_enable_i2c_for_tuner(struct cx231xx *dev, u8 I2CIndex)
+{
+       u8 value[4] = { 0, 0, 0, 0 };
+       int status = 0;
+
+       cx231xx_info("Changing the i2c port for tuner to %d\n", I2CIndex);
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER,
+                                      PWR_CTL_EN, value, 4);
+       if (status < 0)
+               return status;
+
+       if (I2CIndex == I2C_1) {
+               if (value[0] & I2C_DEMOD_EN) {
+                       value[0] &= ~I2C_DEMOD_EN;
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                  PWR_CTL_EN, value, 4);
+               }
+       } else {
+               if (!(value[0] & I2C_DEMOD_EN)) {
+                       value[0] |= I2C_DEMOD_EN;
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                  PWR_CTL_EN, value, 4);
+               }
+       }
+
+       return status;
+
+}
+
+/******************************************************************************
+ *                 D I F - B L O C K    C O N T R O L   functions             *
+ ******************************************************************************/
+int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
+                                         u32 function_mode, u32 standard)
+{
+       int status = 0;
+
+       if (mode == V4L2_TUNER_RADIO) {
+               /* C2HH */
+               /* lo if big signal */
+               status = cx231xx_reg_mask_write(dev,
+                               VID_BLK_I2C_ADDRESS, 32,
+                               AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
+               /* FUNC_MODE = DIF */
+               status = cx231xx_reg_mask_write(dev,
+                               VID_BLK_I2C_ADDRESS, 32,
+                               AFE_CTRL_C2HH_SRC_CTRL, 23, 24, function_mode);
+               /* IF_MODE */
+               status = cx231xx_reg_mask_write(dev,
+                               VID_BLK_I2C_ADDRESS, 32,
+                               AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xFF);
+               /* no inv */
+               status = cx231xx_reg_mask_write(dev,
+                               VID_BLK_I2C_ADDRESS, 32,
+                               AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
+       } else if (standard != DIF_USE_BASEBAND) {
+               if (standard & V4L2_STD_MN) {
+                       /* lo if big signal */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
+                       /* FUNC_MODE = DIF */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
+                                       function_mode);
+                       /* IF_MODE */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xb);
+                       /* no inv */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
+                       /* 0x124, AUD_CHAN1_SRC = 0x3 */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AUD_IO_CTRL, 0, 31, 0x00000003);
+               } else if ((standard == V4L2_STD_PAL_I) |
+                       (standard & V4L2_STD_SECAM)) {
+                       /* C2HH setup */
+                       /* lo if big signal */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
+                       /* FUNC_MODE = DIF */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
+                                       function_mode);
+                       /* IF_MODE */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xF);
+                       /* no inv */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
+               } else {
+                       /* default PAL BG */
+                       /* C2HH setup */
+                       /* lo if big signal */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 30, 31, 0x1);
+                       /* FUNC_MODE = DIF */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 23, 24,
+                                       function_mode);
+                       /* IF_MODE */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 15, 22, 0xE);
+                       /* no inv */
+                       status = cx231xx_reg_mask_write(dev,
+                                       VID_BLK_I2C_ADDRESS, 32,
+                                       AFE_CTRL_C2HH_SRC_CTRL, 9, 9, 0x1);
+               }
+       }
+
+       return status;
+}
+
+int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard)
+{
+       int status = 0;
+       u32 dif_misc_ctrl_value = 0;
+       u32 func_mode = 0;
+
+       cx231xx_info("%s: setStandard to %x\n", __func__, standard);
+
+       status = vid_blk_read_word(dev, DIF_MISC_CTRL, &dif_misc_ctrl_value);
+       if (standard != DIF_USE_BASEBAND)
+               dev->norm = standard;
+
+       switch (dev->model) {
+       case CX231XX_BOARD_CNXT_RDE_250:
+       case CX231XX_BOARD_CNXT_RDU_250:
+               func_mode = 0x03;
+               break;
+       default:
+               func_mode = 0x01;
+       }
+
+       status = cx231xx_dif_configure_C2HH_for_low_IF(dev, dev->active_mode,
+                                                 func_mode, standard);
+
+       if (standard == DIF_USE_BASEBAND) {     /* base band */
+               /* There is a different SRC_PHASE_INC value
+                  for baseband vs. DIF */
+               status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC, 0xDF7DF83);
+               status = vid_blk_read_word(dev, DIF_MISC_CTRL,
+                                               &dif_misc_ctrl_value);
+               dif_misc_ctrl_value |= FLD_DIF_DIF_BYPASS;
+               status = vid_blk_write_word(dev, DIF_MISC_CTRL,
+                                               dif_misc_ctrl_value);
+       } else if (standard & V4L2_STD_PAL_D) {
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL3, 0, 31, 0x00008800);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_REF, 0, 31, 0x444C1380);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_INT_CURRENT, 0, 31,
+                                          0x26001700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_RF_CURRENT, 0, 31,
+                                          0x00002660);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VIDEO_AGC_CTRL, 0, 31,
+                                          0x72500800);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VID_AUD_OVERRIDE, 0, 31,
+                                          0x27000100);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AV_SEP_CTRL, 0, 31, 0x3F3934EA);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_COMP_FLT_CTRL, 0, 31,
+                                          0x00000000);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_PHASE_INC, 0, 31,
+                                          0x1befbf06);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_GAIN_CONTROL, 0, 31,
+                                          0x000035e8);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_RPT_VARIANCE, 0, 31, 0x00000000);
+               /* Save the Spec Inversion value */
+               dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
+               dif_misc_ctrl_value |= 0x3a023F11;
+       } else if (standard & V4L2_STD_PAL_I) {
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL3, 0, 31, 0x00008800);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_REF, 0, 31, 0x444C1380);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_INT_CURRENT, 0, 31,
+                                          0x26001700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_RF_CURRENT, 0, 31,
+                                          0x00002660);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VIDEO_AGC_CTRL, 0, 31,
+                                          0x72500800);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VID_AUD_OVERRIDE, 0, 31,
+                                          0x27000100);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AV_SEP_CTRL, 0, 31, 0x5F39A934);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_COMP_FLT_CTRL, 0, 31,
+                                          0x00000000);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_PHASE_INC, 0, 31,
+                                          0x1befbf06);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_GAIN_CONTROL, 0, 31,
+                                          0x000035e8);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_RPT_VARIANCE, 0, 31, 0x00000000);
+               /* Save the Spec Inversion value */
+               dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
+               dif_misc_ctrl_value |= 0x3a033F11;
+       } else if (standard & V4L2_STD_PAL_M) {
+               /* improved Low Frequency Phase Noise */
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0xFF01FF0C);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xbd038c85);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1db4640a);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
+               status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C1380);
+               status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
+                                               0x26001700);
+               status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
+                                               0x00002660);
+               status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
+                                               0x72500800);
+               status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
+                                               0x27000100);
+               status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL, 0x012c405d);
+               status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
+                                               0x009f50c1);
+               status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
+                                               0x1befbf06);
+               status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
+                                               0x000035e8);
+               status = vid_blk_write_word(dev, DIF_SOFT_RST_CTRL_REVB,
+                                               0x00000000);
+               /* Save the Spec Inversion value */
+               dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
+               dif_misc_ctrl_value |= 0x3A0A3F10;
+       } else if (standard & (V4L2_STD_PAL_N | V4L2_STD_PAL_Nc)) {
+               /* improved Low Frequency Phase Noise */
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0xFF01FF0C);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xbd038c85);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1db4640a);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
+               status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C1380);
+               status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
+                                               0x26001700);
+               status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
+                                               0x00002660);
+               status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
+                                               0x72500800);
+               status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
+                                               0x27000100);
+               status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL,
+                                               0x012c405d);
+               status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
+                                               0x009f50c1);
+               status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
+                                               0x1befbf06);
+               status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
+                                               0x000035e8);
+               status = vid_blk_write_word(dev, DIF_SOFT_RST_CTRL_REVB,
+                                               0x00000000);
+               /* Save the Spec Inversion value */
+               dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
+               dif_misc_ctrl_value = 0x3A093F10;
+       } else if (standard &
+                 (V4L2_STD_SECAM_B | V4L2_STD_SECAM_D | V4L2_STD_SECAM_G |
+                  V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1)) {
+
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL3, 0, 31, 0x00008800);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_REF, 0, 31, 0x888C0380);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_INT_CURRENT, 0, 31,
+                                          0x26001700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_RF_CURRENT, 0, 31,
+                                          0x00002660);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VID_AUD_OVERRIDE, 0, 31,
+                                          0x27000100);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_COMP_FLT_CTRL, 0, 31,
+                                          0x00000000);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_PHASE_INC, 0, 31,
+                                          0x1befbf06);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_GAIN_CONTROL, 0, 31,
+                                          0x000035e8);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_RPT_VARIANCE, 0, 31, 0x00000000);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VIDEO_AGC_CTRL, 0, 31,
+                                          0xf4000000);
+
+               /* Save the Spec Inversion value */
+               dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
+               dif_misc_ctrl_value |= 0x3a023F11;
+       } else if (standard & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) {
+               /* Is it SECAM_L1? */
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL3, 0, 31, 0x00008800);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_REF, 0, 31, 0x888C0380);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_IF, 0, 31, 0xe0262600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_INT, 0, 31, 0xc2171700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_RF, 0, 31, 0xc2262600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_INT_CURRENT, 0, 31,
+                                          0x26001700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_RF_CURRENT, 0, 31,
+                                          0x00002660);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VID_AUD_OVERRIDE, 0, 31,
+                                          0x27000100);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AV_SEP_CTRL, 0, 31, 0x3F3530ec);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_COMP_FLT_CTRL, 0, 31,
+                                          0x00000000);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_PHASE_INC, 0, 31,
+                                          0x1befbf06);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_GAIN_CONTROL, 0, 31,
+                                          0x000035e8);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_RPT_VARIANCE, 0, 31, 0x00000000);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VIDEO_AGC_CTRL, 0, 31,
+                                          0xf2560000);
+
+               /* Save the Spec Inversion value */
+               dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
+               dif_misc_ctrl_value |= 0x3a023F11;
+
+       } else if (standard & V4L2_STD_NTSC_M) {
+               /* V4L2_STD_NTSC_M (75 IRE Setup) Or
+                  V4L2_STD_NTSC_M_JP (Japan,  0 IRE Setup) */
+
+               /* For NTSC the centre frequency of video coming out of
+                  sidewinder is around 7.1MHz or 3.6MHz depending on the
+                  spectral inversion. so for a non spectrally inverted channel
+                  the pll freq word is 0x03420c49
+                */
+
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL, 0x6503BC0C);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL1, 0xBD038C85);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL2, 0x1DB4640A);
+               status = vid_blk_write_word(dev, DIF_PLL_CTRL3, 0x00008800);
+               status = vid_blk_write_word(dev, DIF_AGC_IF_REF, 0x444C0380);
+               status = vid_blk_write_word(dev, DIF_AGC_IF_INT_CURRENT,
+                                               0x26001700);
+               status = vid_blk_write_word(dev, DIF_AGC_RF_CURRENT,
+                                               0x00002660);
+               status = vid_blk_write_word(dev, DIF_VIDEO_AGC_CTRL,
+                                               0x04000800);
+               status = vid_blk_write_word(dev, DIF_VID_AUD_OVERRIDE,
+                                               0x27000100);
+               status = vid_blk_write_word(dev, DIF_AV_SEP_CTRL, 0x01296e1f);
+
+               status = vid_blk_write_word(dev, DIF_COMP_FLT_CTRL,
+                                               0x009f50c1);
+               status = vid_blk_write_word(dev, DIF_SRC_PHASE_INC,
+                                               0x1befbf06);
+               status = vid_blk_write_word(dev, DIF_SRC_GAIN_CONTROL,
+                                               0x000035e8);
+
+               status = vid_blk_write_word(dev, DIF_AGC_CTRL_IF, 0xC2262600);
+               status = vid_blk_write_word(dev, DIF_AGC_CTRL_INT,
+                                               0xC2262600);
+               status = vid_blk_write_word(dev, DIF_AGC_CTRL_RF, 0xC2262600);
+
+               /* Save the Spec Inversion value */
+               dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
+               dif_misc_ctrl_value |= 0x3a003F10;
+       } else {
+               /* default PAL BG */
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL, 0, 31, 0x6503bc0c);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL1, 0, 31, 0xbd038c85);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL2, 0, 31, 0x1db4640a);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_PLL_CTRL3, 0, 31, 0x00008800);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_REF, 0, 31, 0x444C1380);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_IF, 0, 31, 0xDA302600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_INT, 0, 31, 0xDA261700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_CTRL_RF, 0, 31, 0xDA262600);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_IF_INT_CURRENT, 0, 31,
+                                          0x26001700);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AGC_RF_CURRENT, 0, 31,
+                                          0x00002660);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VIDEO_AGC_CTRL, 0, 31,
+                                          0x72500800);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_VID_AUD_OVERRIDE, 0, 31,
+                                          0x27000100);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_AV_SEP_CTRL, 0, 31, 0x3F3530EC);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_COMP_FLT_CTRL, 0, 31,
+                                          0x00A653A8);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_PHASE_INC, 0, 31,
+                                          0x1befbf06);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_SRC_GAIN_CONTROL, 0, 31,
+                                          0x000035e8);
+               status = cx231xx_reg_mask_write(dev, VID_BLK_I2C_ADDRESS, 32,
+                                          DIF_RPT_VARIANCE, 0, 31, 0x00000000);
+               /* Save the Spec Inversion value */
+               dif_misc_ctrl_value &= FLD_DIF_SPEC_INV;
+               dif_misc_ctrl_value |= 0x3a013F11;
+       }
+
+       /* The AGC values should be the same for all standards,
+          AUD_SRC_SEL[19] should always be disabled    */
+       dif_misc_ctrl_value &= ~FLD_DIF_AUD_SRC_SEL;
+
+       /* It is still possible to get Set Standard calls even when we
+          are in FM mode.
+          This is done to override the value for FM. */
+       if (dev->active_mode == V4L2_TUNER_RADIO)
+               dif_misc_ctrl_value = 0x7a080000;
+
+       /* Write the calculated value for misc ontrol register      */
+       status = vid_blk_write_word(dev, DIF_MISC_CTRL, dif_misc_ctrl_value);
+
+       return status;
+}
+
+int cx231xx_tuner_pre_channel_change(struct cx231xx *dev)
+{
+       int status = 0;
+       u32 dwval;
+
+       /* Set the RF and IF k_agc values to 3 */
+       status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
+       dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
+       dwval |= 0x33000000;
+
+       status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
+
+       return status;
+}
+
+int cx231xx_tuner_post_channel_change(struct cx231xx *dev)
+{
+       int status = 0;
+       u32 dwval;
+
+       /* Set the RF and IF k_agc values to 4 for PAL/NTSC and 8 for
+        * SECAM L/B/D standards */
+       status = vid_blk_read_word(dev, DIF_AGC_IF_REF, &dwval);
+       dwval &= ~(FLD_DIF_K_AGC_RF | FLD_DIF_K_AGC_IF);
+
+       if (dev->norm & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_B |
+                        V4L2_STD_SECAM_D))
+               dwval |= 0x88000000;
+       else
+               dwval |= 0x44000000;
+
+       status = vid_blk_write_word(dev, DIF_AGC_IF_REF, dwval);
+
+       return status;
+}
+
+/******************************************************************************
+ *                 I 2 S - B L O C K    C O N T R O L   functions            *
+ ******************************************************************************/
+int cx231xx_i2s_blk_initialize(struct cx231xx *dev)
+{
+       int status = 0;
+       u32 value;
+
+       status = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                      CH_PWR_CTRL1, 1, &value, 1);
+       /* enables clock to delta-sigma and decimation filter */
+       value |= 0x80;
+       status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                       CH_PWR_CTRL1, 1, value, 1);
+       /* power up all channel */
+       status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                       CH_PWR_CTRL2, 1, 0x00, 1);
+
+       return status;
+}
+
+int cx231xx_i2s_blk_update_power_control(struct cx231xx *dev,
+                                       enum AV_MODE avmode)
+{
+       int status = 0;
+       u32 value = 0;
+
+       if (avmode != POLARIS_AVMODE_ENXTERNAL_AV) {
+               status = cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                         CH_PWR_CTRL2, 1, &value, 1);
+               value |= 0xfe;
+               status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                               CH_PWR_CTRL2, 1, value, 1);
+       } else {
+               status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                               CH_PWR_CTRL2, 1, 0x00, 1);
+       }
+
+       return status;
+}
+
+/* set i2s_blk for audio input types */
+int cx231xx_i2s_blk_set_audio_input(struct cx231xx *dev, u8 audio_input)
+{
+       int status = 0;
+
+       switch (audio_input) {
+       case CX231XX_AMUX_LINE_IN:
+               status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                               CH_PWR_CTRL2, 1, 0x00, 1);
+               status = cx231xx_write_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                               CH_PWR_CTRL1, 1, 0x80, 1);
+               break;
+       case CX231XX_AMUX_VIDEO:
+       default:
+               break;
+       }
+
+       dev->ctl_ainput = audio_input;
+
+       return status;
+}
+
+/******************************************************************************
+ *                  P O W E R      C O N T R O L   functions                  *
+ ******************************************************************************/
+int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
+{
+       u8 value[4] = { 0, 0, 0, 0 };
+       u32 tmp = 0;
+       int status = 0;
+
+       if (dev->power_mode != mode)
+               dev->power_mode = mode;
+       else {
+               cx231xx_info(" setPowerMode::mode = %d, No Change req.\n",
+                            mode);
+               return 0;
+       }
+
+       cx231xx_info(" setPowerMode::mode = %d\n", mode);
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
+                                      4);
+       if (status < 0)
+               return status;
+
+       tmp = *((u32 *) value);
+
+       switch (mode) {
+       case POLARIS_AVMODE_ENXTERNAL_AV:
+
+               tmp &= (~PWR_MODE_MASK);
+
+               tmp |= PWR_AV_EN;
+               value[0] = (u8) tmp;
+               value[1] = (u8) (tmp >> 8);
+               value[2] = (u8) (tmp >> 16);
+               value[3] = (u8) (tmp >> 24);
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+               msleep(PWR_SLEEP_INTERVAL);
+
+               tmp |= PWR_ISO_EN;
+               value[0] = (u8) tmp;
+               value[1] = (u8) (tmp >> 8);
+               value[2] = (u8) (tmp >> 16);
+               value[3] = (u8) (tmp >> 24);
+               status =
+                   cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, PWR_CTL_EN,
+                                          value, 4);
+               msleep(PWR_SLEEP_INTERVAL);
+
+               tmp |= POLARIS_AVMODE_ENXTERNAL_AV;
+               value[0] = (u8) tmp;
+               value[1] = (u8) (tmp >> 8);
+               value[2] = (u8) (tmp >> 16);
+               value[3] = (u8) (tmp >> 24);
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+
+               /* reset state of xceive tuner */
+               dev->xc_fw_load_done = 0;
+               break;
+
+       case POLARIS_AVMODE_ANALOGT_TV:
+
+               tmp &= (~PWR_DEMOD_EN);
+               tmp |= (I2C_DEMOD_EN);
+               value[0] = (u8) tmp;
+               value[1] = (u8) (tmp >> 8);
+               value[2] = (u8) (tmp >> 16);
+               value[3] = (u8) (tmp >> 24);
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+               msleep(PWR_SLEEP_INTERVAL);
+
+               if (!(tmp & PWR_TUNER_EN)) {
+                       tmp |= (PWR_TUNER_EN);
+                       value[0] = (u8) tmp;
+                       value[1] = (u8) (tmp >> 8);
+                       value[2] = (u8) (tmp >> 16);
+                       value[3] = (u8) (tmp >> 24);
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                       PWR_CTL_EN, value, 4);
+                       msleep(PWR_SLEEP_INTERVAL);
+               }
+
+               if (!(tmp & PWR_AV_EN)) {
+                       tmp |= PWR_AV_EN;
+                       value[0] = (u8) tmp;
+                       value[1] = (u8) (tmp >> 8);
+                       value[2] = (u8) (tmp >> 16);
+                       value[3] = (u8) (tmp >> 24);
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                       PWR_CTL_EN, value, 4);
+                       msleep(PWR_SLEEP_INTERVAL);
+               }
+               if (!(tmp & PWR_ISO_EN)) {
+                       tmp |= PWR_ISO_EN;
+                       value[0] = (u8) tmp;
+                       value[1] = (u8) (tmp >> 8);
+                       value[2] = (u8) (tmp >> 16);
+                       value[3] = (u8) (tmp >> 24);
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                       PWR_CTL_EN, value, 4);
+                       msleep(PWR_SLEEP_INTERVAL);
+               }
+
+               if (!(tmp & POLARIS_AVMODE_ANALOGT_TV)) {
+                       tmp |= POLARIS_AVMODE_ANALOGT_TV;
+                       value[0] = (u8) tmp;
+                       value[1] = (u8) (tmp >> 8);
+                       value[2] = (u8) (tmp >> 16);
+                       value[3] = (u8) (tmp >> 24);
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                       PWR_CTL_EN, value, 4);
+                       msleep(PWR_SLEEP_INTERVAL);
+               }
+
+               if ((dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
+                   (dev->model == CX231XX_BOARD_CNXT_RDU_250)) {
+                       /* tuner path to channel 1 from port 3 */
+                       cx231xx_enable_i2c_for_tuner(dev, I2C_3);
+
+                       if (dev->cx231xx_reset_analog_tuner)
+                               dev->cx231xx_reset_analog_tuner(dev);
+               }
+               break;
+
+       case POLARIS_AVMODE_DIGITAL:
+               if (!(tmp & PWR_TUNER_EN)) {
+                       tmp |= (PWR_TUNER_EN);
+                       value[0] = (u8) tmp;
+                       value[1] = (u8) (tmp >> 8);
+                       value[2] = (u8) (tmp >> 16);
+                       value[3] = (u8) (tmp >> 24);
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                       PWR_CTL_EN, value, 4);
+                       msleep(PWR_SLEEP_INTERVAL);
+               }
+               if (!(tmp & PWR_AV_EN)) {
+                       tmp |= PWR_AV_EN;
+                       value[0] = (u8) tmp;
+                       value[1] = (u8) (tmp >> 8);
+                       value[2] = (u8) (tmp >> 16);
+                       value[3] = (u8) (tmp >> 24);
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                       PWR_CTL_EN, value, 4);
+                       msleep(PWR_SLEEP_INTERVAL);
+               }
+               if (!(tmp & PWR_ISO_EN)) {
+                       tmp |= PWR_ISO_EN;
+                       value[0] = (u8) tmp;
+                       value[1] = (u8) (tmp >> 8);
+                       value[2] = (u8) (tmp >> 16);
+                       value[3] = (u8) (tmp >> 24);
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                       PWR_CTL_EN, value, 4);
+                       msleep(PWR_SLEEP_INTERVAL);
+               }
+
+               tmp |= POLARIS_AVMODE_DIGITAL | I2C_DEMOD_EN;
+               value[0] = (u8) tmp;
+               value[1] = (u8) (tmp >> 8);
+               value[2] = (u8) (tmp >> 16);
+               value[3] = (u8) (tmp >> 24);
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+               msleep(PWR_SLEEP_INTERVAL);
+
+               if (!(tmp & PWR_DEMOD_EN)) {
+                       tmp |= PWR_DEMOD_EN;
+                       value[0] = (u8) tmp;
+                       value[1] = (u8) (tmp >> 8);
+                       value[2] = (u8) (tmp >> 16);
+                       value[3] = (u8) (tmp >> 24);
+                       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                                       PWR_CTL_EN, value, 4);
+                       msleep(PWR_SLEEP_INTERVAL);
+               }
+
+               if ((dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
+                   (dev->model == CX231XX_BOARD_CNXT_RDU_250)) {
+                       /* tuner path to channel 1 from port 3 */
+                       cx231xx_enable_i2c_for_tuner(dev, I2C_3);
+
+                       if (dev->cx231xx_reset_analog_tuner)
+                               dev->cx231xx_reset_analog_tuner(dev);
+               }
+               break;
+
+       default:
+               break;
+       }
+
+       msleep(PWR_SLEEP_INTERVAL);
+
+       /* For power saving, only enable Pwr_resetout_n
+          when digital TV is selected. */
+       if (mode == POLARIS_AVMODE_DIGITAL) {
+               tmp |= PWR_RESETOUT_EN;
+               value[0] = (u8) tmp;
+               value[1] = (u8) (tmp >> 8);
+               value[2] = (u8) (tmp >> 16);
+               value[3] = (u8) (tmp >> 24);
+               status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
+                                               PWR_CTL_EN, value, 4);
+               msleep(PWR_SLEEP_INTERVAL);
+       }
+
+       /* update power control for afe */
+       status = cx231xx_afe_update_power_control(dev, mode);
+
+       /* update power control for i2s_blk */
+       status = cx231xx_i2s_blk_update_power_control(dev, mode);
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN, value,
+                                      4);
+       cx231xx_info(" The data of PWR_CTL_EN register 0x74"
+                                "=0x%0x,0x%0x,0x%0x,0x%0x\n",
+                    value[0], value[1], value[2], value[3]);
+
+       return status;
+}
+
+int cx231xx_power_suspend(struct cx231xx *dev)
+{
+       u8 value[4] = { 0, 0, 0, 0 };
+       u32 tmp = 0;
+       int status = 0;
+
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
+                                      value, 4);
+       if (status > 0)
+               return status;
+
+       tmp = *((u32 *) value);
+       tmp &= (~PWR_MODE_MASK);
+
+       value[0] = (u8) tmp;
+       value[1] = (u8) (tmp >> 8);
+       value[2] = (u8) (tmp >> 16);
+       value[3] = (u8) (tmp >> 24);
+       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, PWR_CTL_EN,
+                                       value, 4);
+
+       return status;
+}
+
+/******************************************************************************
+ *                  S T R E A M    C O N T R O L   functions                  *
+ ******************************************************************************/
+int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask)
+{
+       u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
+       u32 tmp = 0;
+       int status = 0;
+
+       cx231xx_info("cx231xx_start_stream():: ep_mask = %x\n", ep_mask);
+       status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET,
+                                      value, 4);
+       if (status < 0)
+               return status;
+
+       tmp = *((u32 *) value);
+       tmp |= ep_mask;
+       value[0] = (u8) tmp;
+       value[1] = (u8) (tmp >> 8);
+       value[2] = (u8) (tmp >> 16);
+       value[3] = (u8) (tmp >> 24);
+
+       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, EP_MODE_SET,
+                                       value, 4);
+
+       return status;
+}
+
+int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask)
+{
+       u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
+       u32 tmp = 0;
+       int status = 0;
+
+       cx231xx_info("cx231xx_stop_stream():: ep_mask = %x\n", ep_mask);
+       status =
+           cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, EP_MODE_SET, value, 4);
+       if (status < 0)
+               return status;
+
+       tmp = *((u32 *) value);
+       tmp &= (~ep_mask);
+       value[0] = (u8) tmp;
+       value[1] = (u8) (tmp >> 8);
+       value[2] = (u8) (tmp >> 16);
+       value[3] = (u8) (tmp >> 24);
+
+       status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, EP_MODE_SET,
+                                       value, 4);
+
+       return status;
+}
+
+int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type)
+{
+       int status = 0;
+
+       if (dev->udev->speed == USB_SPEED_HIGH) {
+               switch (media_type) {
+               case 81: /* audio */
+                       cx231xx_info("%s: Audio enter HANC\n", __func__);
+                       status =
+                           cx231xx_mode_register(dev, TS_MODE_REG, 0x9300);
+                       break;
+
+               case 2: /* vbi */
+                       cx231xx_info("%s: set vanc registers\n", __func__);
+                       status = cx231xx_mode_register(dev, TS_MODE_REG, 0x300);
+                       break;
+
+               case 3: /* sliced cc */
+                       cx231xx_info("%s: set hanc registers\n", __func__);
+                       status =
+                           cx231xx_mode_register(dev, TS_MODE_REG, 0x1300);
+                       break;
+
+               case 0: /* video */
+                       cx231xx_info("%s: set video registers\n", __func__);
+                       status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
+                       break;
+
+               case 4: /* ts1 */
+                       cx231xx_info("%s: set ts1 registers\n", __func__);
+                       status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
+                       status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
+                       break;
+               case 6: /* ts1 parallel mode */
+                       cx231xx_info("%s: set ts1 parrallel mode registers\n",
+                                    __func__);
+                       status = cx231xx_mode_register(dev, TS_MODE_REG, 0x100);
+                       status = cx231xx_mode_register(dev, TS1_CFG_REG, 0x400);
+                       break;
+               }
+       } else {
+               status = cx231xx_mode_register(dev, TS_MODE_REG, 0x101);
+       }
+
+       return status;
+}
+
+int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type)
+{
+       int rc;
+       u32 ep_mask = -1;
+       struct pcb_config *pcb_config;
+
+       /* get EP for media type */
+       pcb_config = (struct pcb_config *)&dev->current_pcb_config;
+
+       if (pcb_config->config_num == 1) {
+               switch (media_type) {
+               case 0: /* Video */
+                       ep_mask = ENABLE_EP4;   /* ep4  [00:1000] */
+                       break;
+               case 1: /* Audio */
+                       ep_mask = ENABLE_EP3;   /* ep3  [00:0100] */
+                       break;
+               case 2: /* Vbi */
+                       ep_mask = ENABLE_EP5;   /* ep5 [01:0000] */
+                       break;
+               case 3: /* Sliced_cc */
+                       ep_mask = ENABLE_EP6;   /* ep6 [10:0000] */
+                       break;
+               case 4: /* ts1 */
+               case 6: /* ts1 parallel mode */
+                       ep_mask = ENABLE_EP1;   /* ep1 [00:0001] */
+                       break;
+               case 5: /* ts2 */
+                       ep_mask = ENABLE_EP2;   /* ep2 [00:0010] */
+                       break;
+               }
+
+       } else if (pcb_config->config_num > 1) {
+               switch (media_type) {
+               case 0: /* Video */
+                       ep_mask = ENABLE_EP4;   /* ep4  [00:1000] */
+                       break;
+               case 1: /* Audio */
+                       ep_mask = ENABLE_EP3;   /* ep3  [00:0100] */
+                       break;
+               case 2: /* Vbi */
+                       ep_mask = ENABLE_EP5;   /* ep5 [01:0000] */
+                       break;
+               case 3: /* Sliced_cc */
+                       ep_mask = ENABLE_EP6;   /* ep6 [10:0000] */
+                       break;
+               case 4: /* ts1 */
+               case 6: /* ts1 parallel mode */
+                       ep_mask = ENABLE_EP1;   /* ep1 [00:0001] */
+                       break;
+               case 5: /* ts2 */
+                       ep_mask = ENABLE_EP2;   /* ep2 [00:0010] */
+                       break;
+               }
+
+       }
+
+       if (start) {
+               rc = cx231xx_initialize_stream_xfer(dev, media_type);
+
+               if (rc < 0)
+                       return rc;
+
+               /* enable video capture */
+               if (ep_mask > 0)
+                       rc = cx231xx_start_stream(dev, ep_mask);
+       } else {
+               /* disable video capture */
+               if (ep_mask > 0)
+                       rc = cx231xx_stop_stream(dev, ep_mask);
+       }
+
+       if (dev->mode == CX231XX_ANALOG_MODE)
+               ;/* do any in Analog mode */
+       else
+               ;/* do any in digital mode */
+
+       return rc;
+}
+EXPORT_SYMBOL_GPL(cx231xx_capture_start);
+
+/*****************************************************************************
+*                   G P I O   B I T control functions                        *
+******************************************************************************/
+int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val)
+{
+       int status = 0;
+
+       status = cx231xx_send_gpio_cmd(dev, gpio_bit, gpio_val, 4, 0, 0);
+
+       return status;
+}
+
+int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val)
+{
+       int status = 0;
+
+       status = cx231xx_send_gpio_cmd(dev, gpio_bit, gpio_val, 4, 0, 1);
+
+       return status;
+}
+
+/*
+* cx231xx_set_gpio_direction
+*      Sets the direction of the GPIO pin to input or output
+*
+* Parameters :
+*      pin_number : The GPIO Pin number to program the direction for
+*                   from 0 to 31
+*      pin_value : The Direction of the GPIO Pin under reference.
+*                      0 = Input direction
+*                      1 = Output direction
+*/
+int cx231xx_set_gpio_direction(struct cx231xx *dev,
+                              int pin_number, int pin_value)
+{
+       int status = 0;
+       u32 value = 0;
+
+       /* Check for valid pin_number - if 32 , bail out */
+       if (pin_number >= 32)
+               return -EINVAL;
+
+       /* input */
+       if (pin_value == 0)
+               value = dev->gpio_dir & (~(1 << pin_number));   /* clear */
+       else
+               value = dev->gpio_dir | (1 << pin_number);
+
+       status = cx231xx_set_gpio_bit(dev, value, (u8 *) &dev->gpio_val);
+
+       /* cache the value for future */
+       dev->gpio_dir = value;
+
+       return status;
+}
+
+/*
+* cx231xx_set_gpio_value
+*      Sets the value of the GPIO pin to Logic high or low. The Pin under
+*      reference should ALREADY BE SET IN OUTPUT MODE !!!!!!!!!
+*
+* Parameters :
+*      pin_number : The GPIO Pin number to program the direction for
+*      pin_value : The value of the GPIO Pin under reference.
+*                      0 = set it to 0
+*                      1 = set it to 1
+*/
+int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value)
+{
+       int status = 0;
+       u32 value = 0;
+
+       /* Check for valid pin_number - if 0xFF , bail out */
+       if (pin_number >= 32)
+               return -EINVAL;
+
+       /* first do a sanity check - if the Pin is not output, make it output */
+       if ((dev->gpio_dir & (1 << pin_number)) == 0x00) {
+               /* It was in input mode */
+               value = dev->gpio_dir | (1 << pin_number);
+               dev->gpio_dir = value;
+               status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                             (u8 *) &dev->gpio_val);
+               value = 0;
+       }
+
+       if (pin_value == 0)
+               value = dev->gpio_val & (~(1 << pin_number));
+       else
+               value = dev->gpio_val | (1 << pin_number);
+
+       /* store the value */
+       dev->gpio_val = value;
+
+       /* toggle bit0 of GP_IO */
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       return status;
+}
+
+/*****************************************************************************
+*                      G P I O I2C related functions                         *
+******************************************************************************/
+int cx231xx_gpio_i2c_start(struct cx231xx *dev)
+{
+       int status = 0;
+
+       /* set SCL to output 1 ; set SDA to output 1 */
+       dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
+       dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
+       dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
+       dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
+
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       if (status < 0)
+               return -EINVAL;
+
+       /* set SCL to output 1; set SDA to output 0 */
+       dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
+       dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
+
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       if (status < 0)
+               return -EINVAL;
+
+       /* set SCL to output 0; set SDA to output 0      */
+       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+       dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
+
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       if (status < 0)
+               return -EINVAL;
+
+       return status;
+}
+
+int cx231xx_gpio_i2c_end(struct cx231xx *dev)
+{
+       int status = 0;
+
+       /* set SCL to output 0; set SDA to output 0      */
+       dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
+       dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
+
+       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+       dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
+
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       if (status < 0)
+               return -EINVAL;
+
+       /* set SCL to output 1; set SDA to output 0      */
+       dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
+       dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
+
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       if (status < 0)
+               return -EINVAL;
+
+       /* set SCL to input ,release SCL cable control
+          set SDA to input ,release SDA cable control */
+       dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
+       dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
+
+       status =
+           cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       if (status < 0)
+               return -EINVAL;
+
+       return status;
+}
+
+int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data)
+{
+       int status = 0;
+       u8 i;
+
+       /* set SCL to output ; set SDA to output */
+       dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
+       dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
+
+       for (i = 0; i < 8; i++) {
+               if (((data << i) & 0x80) == 0) {
+                       /* set SCL to output 0; set SDA to output 0     */
+                       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+                       dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
+                       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                                     (u8 *)&dev->gpio_val);
+
+                       /* set SCL to output 1; set SDA to output 0     */
+                       dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
+                       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                                     (u8 *)&dev->gpio_val);
+
+                       /* set SCL to output 0; set SDA to output 0     */
+                       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+                       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                                     (u8 *)&dev->gpio_val);
+               } else {
+                       /* set SCL to output 0; set SDA to output 1     */
+                       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+                       dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
+                       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                                     (u8 *)&dev->gpio_val);
+
+                       /* set SCL to output 1; set SDA to output 1     */
+                       dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
+                       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                                     (u8 *)&dev->gpio_val);
+
+                       /* set SCL to output 0; set SDA to output 1     */
+                       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+                       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                                     (u8 *)&dev->gpio_val);
+               }
+       }
+       return status;
+}
+
+int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 * buf)
+{
+       u8 value = 0;
+       int status = 0;
+       u32 gpio_logic_value = 0;
+       u8 i;
+
+       /* read byte */
+       for (i = 0; i < 8; i++) {       /* send write I2c addr */
+
+               /* set SCL to output 0; set SDA to input */
+               dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+               status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                             (u8 *)&dev->gpio_val);
+
+               /* set SCL to output 1; set SDA to input */
+               dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
+               status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
+                                             (u8 *)&dev->gpio_val);
+
+               /* get SDA data bit */
+               gpio_logic_value = dev->gpio_val;
+               status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
+                                             (u8 *)&dev->gpio_val);
+               if ((dev->gpio_val & (1 << dev->board.tuner_sda_gpio)) != 0)
+                       value |= (1 << (8 - i - 1));
+
+               dev->gpio_val = gpio_logic_value;
+       }
+
+       /* set SCL to output 0,finish the read latest SCL signal.
+          !!!set SDA to input, never to modify SDA direction at
+          the same times */
+       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       /* store the value */
+       *buf = value & 0xff;
+
+       return status;
+}
+
+int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
+{
+       int status = 0;
+       u32 gpio_logic_value = 0;
+       int nCnt = 10;
+       int nInit = nCnt;
+
+       /* clock stretch; set SCL to input; set SDA to input;
+          get SCL value till SCL = 1 */
+       dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
+       dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
+
+       gpio_logic_value = dev->gpio_val;
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       do {
+               msleep(2);
+               status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
+                                             (u8 *)&dev->gpio_val);
+               nCnt--;
+       } while (((dev->gpio_val &
+                         (1 << dev->board.tuner_scl_gpio)) == 0) &&
+                        (nCnt > 0));
+
+       if (nCnt == 0)
+               cx231xx_info("No ACK after %d msec -GPIO I2C failed!",
+                            nInit * 10);
+
+       /* readAck
+          throuth clock stretch ,slave has given a SCL signal,
+          so the SDA data can be directly read.  */
+       status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       if ((dev->gpio_val & 1 << dev->board.tuner_sda_gpio) == 0) {
+               dev->gpio_val = gpio_logic_value;
+               dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
+               status = 0;
+       } else {
+               dev->gpio_val = gpio_logic_value;
+               dev->gpio_val |= (1 << dev->board.tuner_sda_gpio);
+       }
+
+       /* read SDA end, set the SCL to output 0, after this operation,
+          SDA direction can be changed. */
+       dev->gpio_val = gpio_logic_value;
+       dev->gpio_dir |= (1 << dev->board.tuner_scl_gpio);
+       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       return status;
+}
+
+int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev)
+{
+       int status = 0;
+
+       /* set SDA to ouput */
+       dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       /* set SCL = 0 (output); set SDA = 0 (output) */
+       dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
+       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       /* set SCL = 1 (output); set SDA = 0 (output) */
+       dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       /* set SCL = 0 (output); set SDA = 0 (output) */
+       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       /* set SDA to input,and then the slave will read data from SDA. */
+       dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       return status;
+}
+
+int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev)
+{
+       int status = 0;
+
+       /* set scl to output ; set sda to input */
+       dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
+       dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       /* set scl to output 0; set sda to input */
+       dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       /* set scl to output 1; set sda to input */
+       dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+
+       return status;
+}
+
+/*****************************************************************************
+*                      G P I O I2C related functions                         *
+******************************************************************************/
+/* cx231xx_gpio_i2c_read
+ * Function to read data from gpio based I2C interface
+ */
+int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 * buf, u8 len)
+{
+       int status = 0;
+       int i = 0;
+
+       /* get the lock */
+       mutex_lock(&dev->gpio_i2c_lock);
+
+       /* start */
+       status = cx231xx_gpio_i2c_start(dev);
+
+       /* write dev_addr */
+       status = cx231xx_gpio_i2c_write_byte(dev, (dev_addr << 1) + 1);
+
+       /* readAck */
+       status = cx231xx_gpio_i2c_read_ack(dev);
+
+       /* read data */
+       for (i = 0; i < len; i++) {
+               /* read data */
+               buf[i] = 0;
+               status = cx231xx_gpio_i2c_read_byte(dev, &buf[i]);
+
+               if ((i + 1) != len) {
+                       /* only do write ack if we more length */
+                       status = cx231xx_gpio_i2c_write_ack(dev);
+               }
+       }
+
+       /* write NAK - inform reads are complete */
+       status = cx231xx_gpio_i2c_write_nak(dev);
+
+       /* write end */
+       status = cx231xx_gpio_i2c_end(dev);
+
+       /* release the lock */
+       mutex_unlock(&dev->gpio_i2c_lock);
+
+       return status;
+}
+
+/* cx231xx_gpio_i2c_write
+ * Function to write data to gpio based I2C interface
+ */
+int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 * buf, u8 len)
+{
+       int status = 0;
+       int i = 0;
+
+       /* get the lock */
+       mutex_lock(&dev->gpio_i2c_lock);
+
+       /* start */
+       status = cx231xx_gpio_i2c_start(dev);
+
+       /* write dev_addr */
+       status = cx231xx_gpio_i2c_write_byte(dev, dev_addr << 1);
+
+       /* read Ack */
+       status = cx231xx_gpio_i2c_read_ack(dev);
+
+       for (i = 0; i < len; i++) {
+               /* Write data */
+               status = cx231xx_gpio_i2c_write_byte(dev, buf[i]);
+
+               /* read Ack */
+               status = cx231xx_gpio_i2c_read_ack(dev);
+       }
+
+       /* write End */
+       status = cx231xx_gpio_i2c_end(dev);
+
+       /* release the lock */
+       mutex_unlock(&dev->gpio_i2c_lock);
+
+       return 0;
+}
diff --git a/drivers/media/video/cx231xx/cx231xx-cards.c b/drivers/media/video/cx231xx/cx231xx-cards.c
new file mode 100644 (file)
index 0000000..c8a32b1
--- /dev/null
@@ -0,0 +1,914 @@
+/*
+   cx231xx-cards.c - driver for Conexant Cx23100/101/102
+                               USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+                               Based on em28xx 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.
+
+   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 <linux/init.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/usb.h>
+#include <media/tuner.h>
+#include <media/tveeprom.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-chip-ident.h>
+
+#include <media/cx25840.h>
+#include "xc5000.h"
+
+#include "cx231xx.h"
+
+static int tuner = -1;
+module_param(tuner, int, 0444);
+MODULE_PARM_DESC(tuner, "tuner type");
+
+static unsigned int disable_ir;
+module_param(disable_ir, int, 0444);
+MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
+
+/* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */
+static unsigned long cx231xx_devused;
+
+/*
+ *  Reset sequences for analog/digital modes
+ */
+
+static struct cx231xx_reg_seq RDE250_XCV_TUNER[] = {
+       {0x03, 0x01, 10},
+       {0x03, 0x00, 30},
+       {0x03, 0x01, 10},
+       {-1, -1, -1},
+};
+
+/*
+ *  Board definitions
+ */
+struct cx231xx_board cx231xx_boards[] = {
+       [CX231XX_BOARD_UNKNOWN] = {
+               .name = "Unknown CX231xx video grabber",
+               .tuner_type = TUNER_ABSENT,
+               .input = {{
+                               .type = CX231XX_VMUX_TELEVISION,
+                               .vmux = CX231XX_VIN_3_1,
+                               .amux = CX231XX_AMUX_VIDEO,
+                               .gpio = 0,
+                       }, {
+                               .type = CX231XX_VMUX_COMPOSITE1,
+                               .vmux = CX231XX_VIN_2_1,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = 0,
+                       }, {
+                               .type = CX231XX_VMUX_SVIDEO,
+                               .vmux = CX231XX_VIN_1_1 |
+                                       (CX231XX_VIN_1_2 << 8) |
+                                       CX25840_SVIDEO_ON,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = 0,
+                       }
+               },
+       },
+       [CX231XX_BOARD_CNXT_RDE_250] = {
+               .name = "Conexant Hybrid TV - RDE250",
+               .tuner_type = TUNER_XC5000,
+               .tuner_addr = 0x61,
+               .tuner_gpio = RDE250_XCV_TUNER,
+               .tuner_sif_gpio = 0x05,
+               .tuner_scl_gpio = 0x1a,
+               .tuner_sda_gpio = 0x1b,
+               .decoder = CX231XX_AVDECODER,
+               .demod_xfer_mode = 0,
+               .ctl_pin_status_mask = 0xFFFFFFC4,
+               .agc_analog_digital_select_gpio = 0x0c,
+               .gpio_pin_status_mask = 0x4001000,
+               .tuner_i2c_master = 1,
+               .demod_i2c_master = 2,
+               .has_dvb = 1,
+               .demod_addr = 0x02,
+               .norm = V4L2_STD_PAL,
+
+               .input = {{
+                               .type = CX231XX_VMUX_TELEVISION,
+                               .vmux = CX231XX_VIN_3_1,
+                               .amux = CX231XX_AMUX_VIDEO,
+                               .gpio = 0,
+                       }, {
+                               .type = CX231XX_VMUX_COMPOSITE1,
+                               .vmux = CX231XX_VIN_2_1,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = 0,
+                       }, {
+                               .type = CX231XX_VMUX_SVIDEO,
+                               .vmux = CX231XX_VIN_1_1 |
+                                       (CX231XX_VIN_1_2 << 8) |
+                                       CX25840_SVIDEO_ON,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = 0,
+                       }
+               },
+       },
+
+       [CX231XX_BOARD_CNXT_RDU_250] = {
+               .name = "Conexant Hybrid TV - RDU250",
+               .tuner_type = TUNER_XC5000,
+               .tuner_addr = 0x61,
+               .tuner_gpio = RDE250_XCV_TUNER,
+               .tuner_sif_gpio = 0x05,
+               .tuner_scl_gpio = 0x1a,
+               .tuner_sda_gpio = 0x1b,
+               .decoder = CX231XX_AVDECODER,
+               .demod_xfer_mode = 0,
+               .ctl_pin_status_mask = 0xFFFFFFC4,
+               .agc_analog_digital_select_gpio = 0x0c,
+               .gpio_pin_status_mask = 0x4001000,
+               .tuner_i2c_master = 1,
+               .demod_i2c_master = 2,
+               .has_dvb = 1,
+               .demod_addr = 0x32,
+               .norm = V4L2_STD_NTSC,
+
+               .input = {{
+                               .type = CX231XX_VMUX_TELEVISION,
+                               .vmux = CX231XX_VIN_3_1,
+                               .amux = CX231XX_AMUX_VIDEO,
+                               .gpio = 0,
+                       }, {
+                               .type = CX231XX_VMUX_COMPOSITE1,
+                               .vmux = CX231XX_VIN_2_1,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = 0,
+                       }, {
+                               .type = CX231XX_VMUX_SVIDEO,
+                               .vmux = CX231XX_VIN_1_1 |
+                                       (CX231XX_VIN_1_2 << 8) |
+                                       CX25840_SVIDEO_ON,
+                               .amux = CX231XX_AMUX_LINE_IN,
+                               .gpio = 0,
+                       }
+               },
+       },
+};
+const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
+
+/* table of devices that work with this driver */
+struct usb_device_id cx231xx_id_table[] = {
+       {USB_DEVICE(0x0572, 0x5A3C),
+        .driver_info = CX231XX_BOARD_UNKNOWN},
+       {USB_DEVICE(0x0572, 0x58A2),
+        .driver_info = CX231XX_BOARD_CNXT_RDE_250},
+       {USB_DEVICE(0x0572, 0x58A1),
+        .driver_info = CX231XX_BOARD_CNXT_RDU_250},
+       {},
+};
+
+MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
+
+/* cx231xx_tuner_callback
+ * will be used to reset XC5000 tuner using GPIO pin
+ */
+
+int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
+{
+       int rc = 0;
+       struct cx231xx *dev = ptr;
+
+       if (dev->tuner_type == TUNER_XC5000) {
+               if (command == XC5000_TUNER_RESET) {
+                       cx231xx_info
+                               ("Tuner CB: RESET: cmd %d : tuner type %d \n",
+                                command, dev->tuner_type);
+                       cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
+                                              1);
+                       msleep(10);
+                       cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
+                                              0);
+                       msleep(330);
+                       cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
+                                              1);
+                       msleep(10);
+               }
+       }
+       return rc;
+}
+EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
+
+static inline void cx231xx_set_model(struct cx231xx *dev)
+{
+       memcpy(&dev->board, &cx231xx_boards[dev->model], sizeof(dev->board));
+}
+
+/* Since cx231xx_pre_card_setup() requires a proper dev->model,
+ * this won't work for boards with generic PCI IDs
+ */
+void cx231xx_pre_card_setup(struct cx231xx *dev)
+{
+
+       cx231xx_set_model(dev);
+
+       cx231xx_info("Identified as %s (card=%d)\n",
+                    dev->board.name, dev->model);
+
+       /* set the direction for GPIO pins */
+       cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
+       cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
+       cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
+
+       /* request some modules if any required */
+
+       /* reset the Tuner */
+       cx231xx_gpio_set(dev, dev->board.tuner_gpio);
+
+       /* set the mode to Analog mode initially */
+       cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
+
+       /* Unlock device */
+       /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
+
+}
+
+static void cx231xx_config_tuner(struct cx231xx *dev)
+{
+       struct tuner_setup tun_setup;
+       struct v4l2_frequency f;
+
+       if (dev->tuner_type == TUNER_ABSENT)
+               return;
+
+       tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
+       tun_setup.type = dev->tuner_type;
+       tun_setup.addr = dev->tuner_addr;
+       tun_setup.tuner_callback = cx231xx_tuner_callback;
+
+       tuner_call(dev, tuner, s_type_addr, &tun_setup);
+
+#if 0
+       if (tun_setup.type == TUNER_XC5000) {
+               static struct xc2028_ctrl ctrl = {
+                       .fname = XC5000_DEFAULT_FIRMWARE,
+                       .max_len = 64,
+                       .demod = 0;
+               };
+               struct v4l2_priv_tun_config cfg = {
+                       .tuner = dev->tuner_type,
+                       .priv = &ctrl,
+               };
+               tuner_call(dev, tuner, s_config, &cfg);
+       }
+#endif
+       /* configure tuner */
+       f.tuner = 0;
+       f.type = V4L2_TUNER_ANALOG_TV;
+       f.frequency = 9076;     /* just a magic number */
+       dev->ctl_freq = f.frequency;
+       call_all(dev, tuner, s_frequency, &f);
+
+}
+
+/* ----------------------------------------------------------------------- */
+void cx231xx_set_ir(struct cx231xx *dev, struct IR_i2c *ir)
+{
+       if (disable_ir) {
+               ir->get_key = NULL;
+               return;
+       }
+
+       /* detect & configure */
+       switch (dev->model) {
+
+       case CX231XX_BOARD_CNXT_RDE_250:
+               break;
+       case CX231XX_BOARD_CNXT_RDU_250:
+               break;
+       default:
+               break;
+       }
+}
+
+void cx231xx_card_setup(struct cx231xx *dev)
+{
+
+       cx231xx_set_model(dev);
+
+       dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
+       if (cx231xx_boards[dev->model].tuner_addr)
+               dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
+
+       /* request some modules */
+       if (dev->board.decoder == CX231XX_AVDECODER) {
+               dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                                       &dev->i2c_bus[0].i2c_adap,
+                                       "cx25840", "cx25840", 0x88 >> 1);
+               if (dev->sd_cx25840 == NULL)
+                       cx231xx_info("cx25840 subdev registration failure\n");
+               cx25840_call(dev, core, load_fw);
+
+       }
+
+       if (dev->board.tuner_type != TUNER_ABSENT) {
+               dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                               &dev->i2c_bus[1].i2c_adap,
+                               "tuner", "tuner", 0xc2 >> 1);
+               if (dev->sd_tuner == NULL)
+                       cx231xx_info("tuner subdev registration failure\n");
+
+               cx231xx_config_tuner(dev);
+       }
+
+       cx231xx_config_tuner(dev);
+
+#if 0
+       /* TBD  IR will be added later */
+       cx231xx_ir_init(dev);
+#endif
+}
+
+/*
+ * cx231xx_config()
+ * inits registers with sane defaults
+ */
+int cx231xx_config(struct cx231xx *dev)
+{
+       /* TBD need to add cx231xx specific code */
+       dev->mute = 1;          /* maybe not the right place... */
+       dev->volume = 0x1f;
+
+       return 0;
+}
+
+/*
+ * cx231xx_config_i2c()
+ * configure i2c attached devices
+ */
+void cx231xx_config_i2c(struct cx231xx *dev)
+{
+       /* u32 input = INPUT(dev->video_input)->vmux; */
+
+       call_all(dev, video, s_stream, 1);
+}
+
+/*
+ * cx231xx_realease_resources()
+ * unregisters the v4l2,i2c and usb devices
+ * called when the device gets disconected or at module unload
+*/
+void cx231xx_release_resources(struct cx231xx *dev)
+{
+
+#if 0          /* TBD IR related  */
+       if (dev->ir)
+               cx231xx_ir_fini(dev);
+#endif
+
+       cx231xx_release_analog_resources(dev);
+
+       cx231xx_remove_from_devlist(dev);
+
+       cx231xx_dev_uninit(dev);
+
+       usb_put_dev(dev->udev);
+
+       /* Mark device as unused */
+       cx231xx_devused &= ~(1 << dev->devno);
+}
+
+/*
+ * cx231xx_init_dev()
+ * allocates and inits the device structs, registers i2c bus and v4l device
+ */
+static int cx231xx_init_dev(struct cx231xx **devhandle, struct usb_device *udev,
+                           int minor)
+{
+       struct cx231xx *dev = *devhandle;
+       int retval = -ENOMEM;
+       int errCode;
+       unsigned int maxh, maxw;
+
+       dev->udev = udev;
+       mutex_init(&dev->lock);
+       mutex_init(&dev->ctrl_urb_lock);
+       mutex_init(&dev->gpio_i2c_lock);
+
+       spin_lock_init(&dev->video_mode.slock);
+       spin_lock_init(&dev->vbi_mode.slock);
+       spin_lock_init(&dev->sliced_cc_mode.slock);
+
+       init_waitqueue_head(&dev->open);
+       init_waitqueue_head(&dev->wait_frame);
+       init_waitqueue_head(&dev->wait_stream);
+
+       dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
+       dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
+       dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
+       dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
+       dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
+
+       /* Query cx231xx to find what pcb config it is related to */
+       initialize_cx231xx(dev);
+
+       /* Cx231xx pre card setup */
+       cx231xx_pre_card_setup(dev);
+
+       errCode = cx231xx_config(dev);
+       if (errCode) {
+               cx231xx_errdev("error configuring device\n");
+               return -ENOMEM;
+       }
+
+       /* set default norm */
+       dev->norm = dev->board.norm;
+
+       /* register i2c bus */
+       errCode = cx231xx_dev_init(dev);
+       if (errCode < 0) {
+               cx231xx_errdev("%s: cx231xx_i2c_register - errCode [%d]!\n",
+                              __func__, errCode);
+               return errCode;
+       }
+
+       /* Do board specific init */
+       cx231xx_card_setup(dev);
+
+       /* configure the device */
+       cx231xx_config_i2c(dev);
+
+       maxw = norm_maxw(dev);
+       maxh = norm_maxh(dev);
+
+       /* set default image size */
+       dev->width = maxw;
+       dev->height = maxh;
+       dev->interlaced = 0;
+       dev->hscale = 0;
+       dev->vscale = 0;
+       dev->video_input = 0;
+
+       errCode = cx231xx_config(dev);
+       if (errCode < 0) {
+               cx231xx_errdev("%s: cx231xx_config - errCode [%d]!\n",
+                              __func__, errCode);
+               return errCode;
+       }
+
+       /* init video dma queues */
+       INIT_LIST_HEAD(&dev->video_mode.vidq.active);
+       INIT_LIST_HEAD(&dev->video_mode.vidq.queued);
+
+       /* init vbi dma queues */
+       INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
+       INIT_LIST_HEAD(&dev->vbi_mode.vidq.queued);
+
+       /* Reset other chips required if they are tied up with GPIO pins */
+
+       cx231xx_add_into_devlist(dev);
+
+       retval = cx231xx_register_analog_devices(dev);
+       if (retval < 0) {
+               cx231xx_release_resources(dev);
+               goto fail_reg_devices;
+       }
+
+       cx231xx_init_extension(dev);
+
+       return 0;
+
+fail_reg_devices:
+       mutex_unlock(&dev->lock);
+       return retval;
+}
+
+#if defined(CONFIG_MODULES) && defined(MODULE)
+static void request_module_async(struct work_struct *work)
+{
+       struct cx231xx *dev = container_of(work,
+                                          struct cx231xx, request_module_wk);
+
+       if (dev->has_alsa_audio)
+               request_module("cx231xx-alsa");
+
+       if (dev->board.has_dvb)
+               request_module("cx231xx-dvb");
+
+}
+
+static void request_modules(struct cx231xx *dev)
+{
+       INIT_WORK(&dev->request_module_wk, request_module_async);
+       schedule_work(&dev->request_module_wk);
+}
+#else
+#define request_modules(dev)
+#endif /* CONFIG_MODULES */
+
+/*
+ * cx231xx_usb_probe()
+ * checks for supported devices
+ */
+static int cx231xx_usb_probe(struct usb_interface *interface,
+                            const struct usb_device_id *id)
+{
+       struct usb_device *udev;
+       struct usb_interface *uif;
+       struct cx231xx *dev = NULL;
+       int retval = -ENODEV;
+       int nr = 0, ifnum;
+       int i, isoc_pipe = 0;
+       char *speed;
+       char descr[255] = "";
+       struct usb_interface *lif = NULL;
+       int skip_interface = 0;
+       struct usb_interface_assoc_descriptor *assoc_desc;
+
+       udev = usb_get_dev(interface_to_usbdev(interface));
+       ifnum = interface->altsetting[0].desc.bInterfaceNumber;
+
+       if (!ifnum) {
+               /*
+                * Interface number 0 - IR interface
+                */
+               /* Check to see next free device and mark as used */
+               nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
+               cx231xx_devused |= 1 << nr;
+
+               if (nr >= CX231XX_MAXBOARDS) {
+                       cx231xx_err(DRIVER_NAME ": Supports only %i cx231xx boards.\n",
+                                    CX231XX_MAXBOARDS);
+                       cx231xx_devused &= ~(1 << nr);
+                       return -ENOMEM;
+               }
+
+               /* allocate memory for our device state and initialize it */
+               dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+               if (dev == NULL) {
+                       cx231xx_err(DRIVER_NAME ": out of memory!\n");
+                       cx231xx_devused &= ~(1 << nr);
+                       return -ENOMEM;
+               }
+
+               snprintf(dev->name, 29, "cx231xx #%d", nr);
+               dev->devno = nr;
+               dev->model = id->driver_info;
+               dev->video_mode.alt = -1;
+               dev->interface_count++;
+
+               /* reset gpio dir and value */
+               dev->gpio_dir = 0;
+               dev->gpio_val = 0;
+               dev->xc_fw_load_done = 0;
+               dev->has_alsa_audio = 1;
+               dev->power_mode = -1;
+
+               /* 0 - vbi ; 1 -sliced cc mode */
+               dev->vbi_or_sliced_cc_mode = 0;
+
+               /* get maximum no.of IAD interfaces */
+               assoc_desc = udev->actconfig->intf_assoc[0];
+               dev->max_iad_interface_count = assoc_desc->bInterfaceCount;
+
+               /* init CIR module TBD */
+
+               /* store the current interface */
+               lif = interface;
+
+               switch (udev->speed) {
+               case USB_SPEED_LOW:
+                       speed = "1.5";
+                       break;
+               case USB_SPEED_UNKNOWN:
+               case USB_SPEED_FULL:
+                       speed = "12";
+                       break;
+               case USB_SPEED_HIGH:
+                       speed = "480";
+                       break;
+               default:
+                       speed = "unknown";
+               }
+
+               if (udev->manufacturer)
+                       strlcpy(descr, udev->manufacturer, sizeof(descr));
+
+               if (udev->product) {
+                       if (*descr)
+                               strlcat(descr, " ", sizeof(descr));
+                       strlcat(descr, udev->product, sizeof(descr));
+               }
+               if (*descr)
+                       strlcat(descr, " ", sizeof(descr));
+
+               cx231xx_info("New device %s@ %s Mbps "
+                    "(%04x:%04x) with %d interfaces\n",
+                    descr,
+                    speed,
+                    le16_to_cpu(udev->descriptor.idVendor),
+                    le16_to_cpu(udev->descriptor.idProduct),
+                    dev->max_iad_interface_count);
+       } else {
+               /* Get dev structure first */
+               dev = usb_get_intfdata(udev->actconfig->interface[0]);
+               if (dev == NULL) {
+                       cx231xx_err(DRIVER_NAME ": out of first interface!\n");
+                       return -ENODEV;
+               }
+
+               /* store the interface 0 back */
+               lif = udev->actconfig->interface[0];
+
+               /* increment interface count */
+               dev->interface_count++;
+
+               /* get device number */
+               nr = dev->devno;
+
+               /*
+                * set skip interface, for all interfaces but
+                * interface 1 and the last one
+                */
+               if ((ifnum != 1) && ((dev->interface_count - 1)
+                                    != dev->max_iad_interface_count))
+                       skip_interface = 1;
+
+               if (ifnum == 1) {
+                       assoc_desc = udev->actconfig->intf_assoc[0];
+                       if (assoc_desc->bFirstInterface != ifnum) {
+                               cx231xx_err(DRIVER_NAME ": Not found "
+                                           "matching IAD interface\n");
+                               return -ENODEV;
+                       }
+               }
+       }
+
+       if (skip_interface)
+               return -ENODEV;
+
+       cx231xx_info("registering interface %d\n", ifnum);
+
+       /* save our data pointer in this interface device */
+       usb_set_intfdata(lif, dev);
+
+       if ((dev->interface_count - 1) != dev->max_iad_interface_count)
+               return 0;
+
+       /*
+        * AV device initialization - only done at the last interface
+        */
+
+       /* Create v4l2 device */
+       retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
+       if (retval) {
+               cx231xx_errdev("v4l2_device_register failed\n");
+               cx231xx_devused &= ~(1 << nr);
+               kfree(dev);
+               return -EIO;
+       }
+
+       /* allocate device struct */
+       retval = cx231xx_init_dev(&dev, udev, nr);
+       if (retval) {
+               cx231xx_devused &= ~(1 << dev->devno);
+               v4l2_device_unregister(&dev->v4l2_dev);
+               kfree(dev);
+               return retval;
+       }
+
+       /* compute alternate max packet sizes for video */
+       uif = udev->actconfig->interface[dev->current_pcb_config.
+                      hs_config_info[0].interface_info.video_index + 1];
+
+       dev->video_mode.end_point_addr = le16_to_cpu(uif->altsetting[0].
+                       endpoint[isoc_pipe].desc.bEndpointAddress);
+
+       dev->video_mode.num_alt = uif->num_altsetting;
+       cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
+                    dev->video_mode.end_point_addr,
+                    dev->video_mode.num_alt);
+       dev->video_mode.alt_max_pkt_size =
+               kmalloc(32 * dev->video_mode.num_alt, GFP_KERNEL);
+
+       if (dev->video_mode.alt_max_pkt_size == NULL) {
+               cx231xx_errdev("out of memory!\n");
+               cx231xx_devused &= ~(1 << nr);
+               v4l2_device_unregister(&dev->v4l2_dev);
+               kfree(dev);
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < dev->video_mode.num_alt; i++) {
+               u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
+                               desc.wMaxPacketSize);
+               dev->video_mode.alt_max_pkt_size[i] =
+                   (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
+               cx231xx_info("Alternate setting %i, max size= %i\n", i,
+                            dev->video_mode.alt_max_pkt_size[i]);
+       }
+
+       /* compute alternate max packet sizes for vbi */
+       uif = udev->actconfig->interface[dev->current_pcb_config.
+                                      hs_config_info[0].interface_info.
+                                      vanc_index + 1];
+
+       dev->vbi_mode.end_point_addr =
+           le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
+                       bEndpointAddress);
+
+       dev->vbi_mode.num_alt = uif->num_altsetting;
+       cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
+                    dev->vbi_mode.end_point_addr,
+                    dev->vbi_mode.num_alt);
+       dev->vbi_mode.alt_max_pkt_size =
+           kmalloc(32 * dev->vbi_mode.num_alt, GFP_KERNEL);
+
+       if (dev->vbi_mode.alt_max_pkt_size == NULL) {
+               cx231xx_errdev("out of memory!\n");
+               cx231xx_devused &= ~(1 << nr);
+               v4l2_device_unregister(&dev->v4l2_dev);
+               kfree(dev);
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < dev->vbi_mode.num_alt; i++) {
+               u16 tmp =
+                   le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
+                               desc.wMaxPacketSize);
+               dev->vbi_mode.alt_max_pkt_size[i] =
+                   (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
+               cx231xx_info("Alternate setting %i, max size= %i\n", i,
+                            dev->vbi_mode.alt_max_pkt_size[i]);
+       }
+
+       /* compute alternate max packet sizes for sliced CC */
+       uif = udev->actconfig->interface[dev->current_pcb_config.
+                                      hs_config_info[0].interface_info.
+                                      hanc_index + 1];
+
+       dev->sliced_cc_mode.end_point_addr =
+           le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
+                       bEndpointAddress);
+
+       dev->sliced_cc_mode.num_alt = uif->num_altsetting;
+       cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
+                    dev->sliced_cc_mode.end_point_addr,
+                    dev->sliced_cc_mode.num_alt);
+       dev->sliced_cc_mode.alt_max_pkt_size =
+               kmalloc(32 * dev->sliced_cc_mode.num_alt, GFP_KERNEL);
+
+       if (dev->sliced_cc_mode.alt_max_pkt_size == NULL) {
+               cx231xx_errdev("out of memory!\n");
+               cx231xx_devused &= ~(1 << nr);
+               v4l2_device_unregister(&dev->v4l2_dev);
+               kfree(dev);
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
+               u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
+                               desc.wMaxPacketSize);
+               dev->sliced_cc_mode.alt_max_pkt_size[i] =
+                   (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
+               cx231xx_info("Alternate setting %i, max size= %i\n", i,
+                            dev->sliced_cc_mode.alt_max_pkt_size[i]);
+       }
+
+       if (dev->current_pcb_config.ts1_source != 0xff) {
+               /* compute alternate max packet sizes for TS1 */
+               uif = udev->actconfig->interface[dev->current_pcb_config.
+                                              hs_config_info[0].
+                                              interface_info.
+                                              ts1_index + 1];
+
+               dev->ts1_mode.end_point_addr =
+                   le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].
+                               desc.bEndpointAddress);
+
+               dev->ts1_mode.num_alt = uif->num_altsetting;
+               cx231xx_info("EndPoint Addr 0x%x, Alternate settings: %i\n",
+                            dev->ts1_mode.end_point_addr,
+                            dev->ts1_mode.num_alt);
+               dev->ts1_mode.alt_max_pkt_size =
+                       kmalloc(32 * dev->ts1_mode.num_alt, GFP_KERNEL);
+
+               if (dev->ts1_mode.alt_max_pkt_size == NULL) {
+                       cx231xx_errdev("out of memory!\n");
+                       cx231xx_devused &= ~(1 << nr);
+                       v4l2_device_unregister(&dev->v4l2_dev);
+                       kfree(dev);
+                       return -ENOMEM;
+               }
+
+               for (i = 0; i < dev->ts1_mode.num_alt; i++) {
+                       u16 tmp = le16_to_cpu(uif->altsetting[i].
+                                               endpoint[isoc_pipe].desc.
+                                               wMaxPacketSize);
+                       dev->ts1_mode.alt_max_pkt_size[i] =
+                           (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
+                       cx231xx_info("Alternate setting %i, max size= %i\n", i,
+                                    dev->ts1_mode.alt_max_pkt_size[i]);
+               }
+       }
+
+       /* load other modules required */
+       request_modules(dev);
+
+       return 0;
+}
+
+/*
+ * cx231xx_usb_disconnect()
+ * called when the device gets diconencted
+ * video device will be unregistered on v4l2_close in case it is still open
+ */
+static void cx231xx_usb_disconnect(struct usb_interface *interface)
+{
+       struct cx231xx *dev;
+
+       dev = usb_get_intfdata(interface);
+       usb_set_intfdata(interface, NULL);
+
+       if (!dev)
+               return;
+
+       if (!dev->udev)
+               return;
+
+       /* delete v4l2 device */
+       v4l2_device_unregister(&dev->v4l2_dev);
+
+       /* wait until all current v4l2 io is finished then deallocate
+          resources */
+       mutex_lock(&dev->lock);
+
+       wake_up_interruptible_all(&dev->open);
+
+       if (dev->users) {
+               cx231xx_warn
+                   ("device /dev/video%d is open! Deregistration and memory "
+                    "deallocation are deferred on close.\n", dev->vdev->num);
+
+               dev->state |= DEV_MISCONFIGURED;
+               cx231xx_uninit_isoc(dev);
+               dev->state |= DEV_DISCONNECTED;
+               wake_up_interruptible(&dev->wait_frame);
+               wake_up_interruptible(&dev->wait_stream);
+       } else {
+               dev->state |= DEV_DISCONNECTED;
+               cx231xx_release_resources(dev);
+       }
+
+       cx231xx_close_extension(dev);
+
+       mutex_unlock(&dev->lock);
+
+       if (!dev->users) {
+               kfree(dev->video_mode.alt_max_pkt_size);
+               kfree(dev->vbi_mode.alt_max_pkt_size);
+               kfree(dev->sliced_cc_mode.alt_max_pkt_size);
+               kfree(dev->ts1_mode.alt_max_pkt_size);
+               kfree(dev);
+       }
+}
+
+static struct usb_driver cx231xx_usb_driver = {
+       .name = "cx231xx",
+       .probe = cx231xx_usb_probe,
+       .disconnect = cx231xx_usb_disconnect,
+       .id_table = cx231xx_id_table,
+};
+
+static int __init cx231xx_module_init(void)
+{
+       int result;
+
+       printk(KERN_INFO DRIVER_NAME " v4l2 driver loaded.\n");
+
+       /* register this driver with the USB subsystem */
+       result = usb_register(&cx231xx_usb_driver);
+       if (result)
+               cx231xx_err(DRIVER_NAME
+                           " usb_register failed. Error number %d.\n", result);
+
+       return result;
+}
+
+static void __exit cx231xx_module_exit(void)
+{
+       /* deregister this driver with the USB subsystem */
+       usb_deregister(&cx231xx_usb_driver);
+}
+
+module_init(cx231xx_module_init);
+module_exit(cx231xx_module_exit);
diff --git a/drivers/media/video/cx231xx/cx231xx-conf-reg.h b/drivers/media/video/cx231xx/cx231xx-conf-reg.h
new file mode 100644 (file)
index 0000000..a6f398a
--- /dev/null
@@ -0,0 +1,494 @@
+/*
+   cx231xx_conf-reg.h - driver for Conexant Cx23100/101/102 USB
+                       video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot 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; 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 _POLARIS_REG_H_
+#define _POLARIS_REG_H_
+
+#define BOARD_CFG_STAT          0x0
+#define TS_MODE_REG             0x4
+#define TS1_CFG_REG             0x8
+#define TS1_LENGTH_REG          0xc
+#define TS2_CFG_REG             0x10
+#define TS2_LENGTH_REG          0x14
+#define EP_MODE_SET             0x18
+#define CIR_PWR_PTN1            0x1c
+#define CIR_PWR_PTN2            0x20
+#define CIR_PWR_PTN3            0x24
+#define CIR_PWR_MASK0           0x28
+#define CIR_PWR_MASK1           0x2c
+#define CIR_PWR_MASK2           0x30
+#define CIR_GAIN                0x34
+#define CIR_CAR_REG             0x38
+#define CIR_OT_CFG1             0x40
+#define CIR_OT_CFG2             0x44
+#define PWR_CTL_EN              0x74
+
+/* Polaris Endpoints capture mask for register EP_MODE_SET */
+#define ENABLE_EP1              0x01   /* Bit[0]=1 */
+#define ENABLE_EP2              0x02   /* Bit[1]=1 */
+#define ENABLE_EP3              0x04   /* Bit[2]=1 */
+#define ENABLE_EP4              0x08   /* Bit[3]=1 */
+#define ENABLE_EP5              0x10   /* Bit[4]=1 */
+#define ENABLE_EP6              0x20   /* Bit[5]=1 */
+
+/* Bit definition for register PWR_CTL_EN */
+#define PWR_MODE_MASK           0x17f
+#define PWR_AV_EN               0x08   /* bit3 */
+#define PWR_ISO_EN              0x40   /* bit6 */
+#define PWR_AV_MODE             0x30   /* bit4,5  */
+#define PWR_TUNER_EN            0x04   /* bit2 */
+#define PWR_DEMOD_EN            0x02   /* bit1 */
+#define I2C_DEMOD_EN            0x01   /* bit0 */
+#define PWR_RESETOUT_EN         0x100  /* bit8 */
+
+enum AV_MODE{
+       POLARIS_AVMODE_DEFAULT = 0,
+       POLARIS_AVMODE_DIGITAL = 0x10,
+       POLARIS_AVMODE_ANALOGT_TV = 0x20,
+       POLARIS_AVMODE_ENXTERNAL_AV = 0x30,
+
+};
+
+/* Colibri Registers */
+
+#define SINGLE_ENDED            0x0
+#define LOW_IF                  0x4
+#define EU_IF                   0x9
+#define US_IF                   0xa
+
+#define SUP_BLK_TUNE1           0x00
+#define SUP_BLK_TUNE2           0x01
+#define SUP_BLK_TUNE3           0x02
+#define SUP_BLK_XTAL            0x03
+#define SUP_BLK_PLL1            0x04
+#define SUP_BLK_PLL2            0x05
+#define SUP_BLK_PLL3            0x06
+#define SUP_BLK_REF             0x07
+#define SUP_BLK_PWRDN           0x08
+#define SUP_BLK_TESTPAD         0x09
+#define ADC_COM_INT5_STAB_REF   0x0a
+#define ADC_COM_QUANT           0x0b
+#define ADC_COM_BIAS1           0x0c
+#define ADC_COM_BIAS2           0x0d
+#define ADC_COM_BIAS3           0x0e
+#define TESTBUS_CTRL            0x12
+
+#define FLD_PWRDN_TUNING_BIAS  0x10
+#define FLD_PWRDN_ENABLE_PLL   0x08
+#define FLD_PWRDN_PD_BANDGAP   0x04
+#define FLD_PWRDN_PD_BIAS      0x02
+#define FLD_PWRDN_PD_TUNECK    0x01
+
+
+#define ADC_STATUS_CH1          0x20
+#define ADC_STATUS_CH2          0x40
+#define ADC_STATUS_CH3          0x60
+
+#define ADC_STATUS2_CH1         0x21
+#define ADC_STATUS2_CH2         0x41
+#define ADC_STATUS2_CH3         0x61
+
+#define ADC_CAL_ATEST_CH1       0x22
+#define ADC_CAL_ATEST_CH2       0x42
+#define ADC_CAL_ATEST_CH3       0x62
+
+#define ADC_PWRDN_CLAMP_CH1     0x23
+#define ADC_PWRDN_CLAMP_CH2     0x43
+#define ADC_PWRDN_CLAMP_CH3     0x63
+
+#define ADC_CTRL_DAC23_CH1      0x24
+#define ADC_CTRL_DAC23_CH2      0x44
+#define ADC_CTRL_DAC23_CH3      0x64
+
+#define ADC_CTRL_DAC1_CH1       0x25
+#define ADC_CTRL_DAC1_CH2       0x45
+#define ADC_CTRL_DAC1_CH3       0x65
+
+#define ADC_DCSERVO_DEM_CH1     0x26
+#define ADC_DCSERVO_DEM_CH2     0x46
+#define ADC_DCSERVO_DEM_CH3     0x66
+
+#define ADC_FB_FRCRST_CH1       0x27
+#define ADC_FB_FRCRST_CH2       0x47
+#define ADC_FB_FRCRST_CH3       0x67
+
+#define ADC_INPUT_CH1           0x28
+#define ADC_INPUT_CH2           0x48
+#define ADC_INPUT_CH3           0x68
+#define INPUT_SEL_MASK          0x30   /* [5:4] in_sel */
+
+#define ADC_NTF_PRECLMP_EN_CH1  0x29
+#define ADC_NTF_PRECLMP_EN_CH2  0x49
+#define ADC_NTF_PRECLMP_EN_CH3  0x69
+
+#define ADC_QGAIN_RES_TRM_CH1   0x2a
+#define ADC_QGAIN_RES_TRM_CH2   0x4a
+#define ADC_QGAIN_RES_TRM_CH3   0x6a
+
+#define ADC_SOC_PRECLMP_TERM_CH1    0x2b
+#define ADC_SOC_PRECLMP_TERM_CH2    0x4b
+#define ADC_SOC_PRECLMP_TERM_CH3    0x6b
+
+#define TESTBUS_CTRL_CH1        0x32
+#define TESTBUS_CTRL_CH2        0x52
+#define TESTBUS_CTRL_CH3        0x72
+
+/******************************************************************************
+                           * DIF registers *
+ ******************************************************************************/
+#define      DIRECT_IF_REVB_BASE  0x00300
+
+/*****************************************************************************/
+#define      DIF_PLL_FREQ_WORD        (DIRECT_IF_REVB_BASE + 0x00000000)
+/*****************************************************************************/
+#define      FLD_DIF_PLL_LOCK                           0x80000000
+/*  Reserved                                [30:29] */
+#define      FLD_DIF_PLL_FREE_RUN                       0x10000000
+#define      FLD_DIF_PLL_FREQ                           0x0fffffff
+
+/*****************************************************************************/
+#define      DIF_PLL_CTRL             (DIRECT_IF_REVB_BASE + 0x00000004)
+/*****************************************************************************/
+#define      FLD_DIF_KD_PD                              0xff000000
+/*  Reserved                             [23:20] */
+#define      FLD_DIF_KDS_PD                             0x000f0000
+#define      FLD_DIF_KI_PD                              0x0000ff00
+/*  Reserved                             [7:4] */
+#define      FLD_DIF_KIS_PD                             0x0000000f
+
+/*****************************************************************************/
+#define      DIF_PLL_CTRL1            (DIRECT_IF_REVB_BASE + 0x00000008)
+/*****************************************************************************/
+#define      FLD_DIF_KD_FD                              0xff000000
+/*  Reserved                             [23:20] */
+#define      FLD_DIF_KDS_FD                             0x000f0000
+#define      FLD_DIF_KI_FD                              0x0000ff00
+#define      FLD_DIF_SIG_PROP_SZ                        0x000000f0
+#define      FLD_DIF_KIS_FD                             0x0000000f
+
+/*****************************************************************************/
+#define      DIF_PLL_CTRL2            (DIRECT_IF_REVB_BASE + 0x0000000c)
+/*****************************************************************************/
+#define      FLD_DIF_PLL_AGC_REF                        0xfff00000
+#define      FLD_DIF_PLL_AGC_KI                         0x000f0000
+/*  Reserved                             [15] */
+#define      FLD_DIF_FREQ_LIMIT                         0x00007000
+#define      FLD_DIF_K_FD                               0x00000f00
+#define      FLD_DIF_DOWNSMPL_FD                        0x000000ff
+
+/*****************************************************************************/
+#define      DIF_PLL_CTRL3            (DIRECT_IF_REVB_BASE + 0x00000010)
+/*****************************************************************************/
+/*  Reserved                             [31:16] */
+#define      FLD_DIF_PLL_AGC_EN                         0x00008000
+/*  Reserved                             [14:12] */
+#define      FLD_DIF_PLL_MAN_GAIN                       0x00000fff
+
+/*****************************************************************************/
+#define      DIF_AGC_IF_REF           (DIRECT_IF_REVB_BASE + 0x00000014)
+/*****************************************************************************/
+#define      FLD_DIF_K_AGC_RF                           0xf0000000
+#define      FLD_DIF_K_AGC_IF                           0x0f000000
+#define      FLD_DIF_K_AGC_INT                          0x00f00000
+/*  Reserved                             [19:12] */
+#define      FLD_DIF_IF_REF                             0x00000fff
+
+/*****************************************************************************/
+#define      DIF_AGC_CTRL_IF          (DIRECT_IF_REVB_BASE + 0x00000018)
+/*****************************************************************************/
+#define      FLD_DIF_IF_MAX                             0xff000000
+#define      FLD_DIF_IF_MIN                             0x00ff0000
+#define      FLD_DIF_IF_AGC                             0x0000ffff
+
+/*****************************************************************************/
+#define      DIF_AGC_CTRL_INT         (DIRECT_IF_REVB_BASE + 0x0000001c)
+/*****************************************************************************/
+#define      FLD_DIF_INT_MAX                            0xff000000
+#define      FLD_DIF_INT_MIN                            0x00ff0000
+#define      FLD_DIF_INT_AGC                            0x0000ffff
+
+/*****************************************************************************/
+#define      DIF_AGC_CTRL_RF          (DIRECT_IF_REVB_BASE + 0x00000020)
+/*****************************************************************************/
+#define      FLD_DIF_RF_MAX                             0xff000000
+#define      FLD_DIF_RF_MIN                             0x00ff0000
+#define      FLD_DIF_RF_AGC                             0x0000ffff
+
+/*****************************************************************************/
+#define      DIF_AGC_IF_INT_CURRENT   (DIRECT_IF_REVB_BASE + 0x00000024)
+/*****************************************************************************/
+#define      FLD_DIF_IF_AGC_IN                          0xffff0000
+#define      FLD_DIF_INT_AGC_IN                         0x0000ffff
+
+/*****************************************************************************/
+#define      DIF_AGC_RF_CURRENT       (DIRECT_IF_REVB_BASE + 0x00000028)
+/*****************************************************************************/
+/*  Reserved                            [31:16] */
+#define      FLD_DIF_RF_AGC_IN                          0x0000ffff
+
+/*****************************************************************************/
+#define      DIF_VIDEO_AGC_CTRL       (DIRECT_IF_REVB_BASE + 0x0000002c)
+/*****************************************************************************/
+#define      FLD_DIF_AFD                                0xc0000000
+#define      FLD_DIF_K_VID_AGC                          0x30000000
+#define      FLD_DIF_LINE_LENGTH                        0x0fff0000
+#define      FLD_DIF_AGC_GAIN                           0x0000ffff
+
+/*****************************************************************************/
+#define      DIF_VID_AUD_OVERRIDE     (DIRECT_IF_REVB_BASE + 0x00000030)
+/*****************************************************************************/
+#define      FLD_DIF_AUDIO_AGC_OVERRIDE                 0x80000000
+/*  Reserved                             [30:30] */
+#define      FLD_DIF_AUDIO_MAN_GAIN                     0x3f000000
+/*  Reserved                             [23:17] */
+#define      FLD_DIF_VID_AGC_OVERRIDE                   0x00010000
+#define      FLD_DIF_VID_MAN_GAIN                       0x0000ffff
+
+/*****************************************************************************/
+#define      DIF_AV_SEP_CTRL          (DIRECT_IF_REVB_BASE + 0x00000034)
+/*****************************************************************************/
+#define      FLD_DIF_LPF_FREQ                           0xc0000000
+#define      FLD_DIF_AV_PHASE_INC                       0x3f000000
+#define      FLD_DIF_AUDIO_FREQ                         0x00ffffff
+
+/*****************************************************************************/
+#define      DIF_COMP_FLT_CTRL        (DIRECT_IF_REVB_BASE + 0x00000038)
+/*****************************************************************************/
+/*  Reserved                            [31:24] */
+#define      FLD_DIF_IIR23_R2                           0x00ff0000
+#define      FLD_DIF_IIR23_R1                           0x0000ff00
+#define      FLD_DIF_IIR1_R1                            0x000000ff
+
+/*****************************************************************************/
+#define      DIF_MISC_CTRL            (DIRECT_IF_REVB_BASE + 0x0000003c)
+/*****************************************************************************/
+#define      FLD_DIF_DIF_BYPASS                         0x80000000
+#define      FLD_DIF_FM_NYQ_GAIN                        0x40000000
+#define      FLD_DIF_RF_AGC_ENA                         0x20000000
+#define      FLD_DIF_INT_AGC_ENA                        0x10000000
+#define      FLD_DIF_IF_AGC_ENA                         0x08000000
+#define      FLD_DIF_FORCE_RF_IF_LOCK                   0x04000000
+#define      FLD_DIF_VIDEO_AGC_ENA                      0x02000000
+#define      FLD_DIF_RF_AGC_INV                         0x01000000
+#define      FLD_DIF_INT_AGC_INV                        0x00800000
+#define      FLD_DIF_IF_AGC_INV                         0x00400000
+#define      FLD_DIF_SPEC_INV                           0x00200000
+#define      FLD_DIF_AUD_FULL_BW                        0x00100000
+#define      FLD_DIF_AUD_SRC_SEL                        0x00080000
+/*  Reserved                             [18] */
+#define      FLD_DIF_IF_FREQ                            0x00030000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_TIP_OFFSET                         0x00003f00
+/*  Reserved                             [7:5] */
+#define      FLD_DIF_DITHER_ENA                         0x00000010
+/*  Reserved                             [3:1] */
+#define      FLD_DIF_RF_IF_LOCK                         0x00000001
+
+/*****************************************************************************/
+#define      DIF_SRC_PHASE_INC        (DIRECT_IF_REVB_BASE + 0x00000040)
+/*****************************************************************************/
+/*  Reserved                             [31:29] */
+#define      FLD_DIF_PHASE_INC                          0x1fffffff
+
+/*****************************************************************************/
+#define      DIF_SRC_GAIN_CONTROL     (DIRECT_IF_REVB_BASE + 0x00000044)
+/*****************************************************************************/
+/*  Reserved                             [31:16] */
+#define      FLD_DIF_SRC_KI                             0x0000ff00
+#define      FLD_DIF_SRC_KD                             0x000000ff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF01          (DIRECT_IF_REVB_BASE + 0x00000048)
+/*****************************************************************************/
+/*  Reserved                             [31:19] */
+#define      FLD_DIF_BPF_COEFF_0                        0x00070000
+/*  Reserved                             [15:4] */
+#define      FLD_DIF_BPF_COEFF_1                        0x0000000f
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF23          (DIRECT_IF_REVB_BASE + 0x0000004c)
+/*****************************************************************************/
+/*  Reserved                             [31:22] */
+#define      FLD_DIF_BPF_COEFF_2                        0x003f0000
+/*  Reserved                             [15:7] */
+#define      FLD_DIF_BPF_COEFF_3                        0x0000007f
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF45          (DIRECT_IF_REVB_BASE + 0x00000050)
+/*****************************************************************************/
+/*  Reserved                             [31:24] */
+#define      FLD_DIF_BPF_COEFF_4                        0x00ff0000
+/*  Reserved                             [15:8] */
+#define      FLD_DIF_BPF_COEFF_5                        0x000000ff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF67          (DIRECT_IF_REVB_BASE + 0x00000054)
+/*****************************************************************************/
+/*  Reserved                             [31:25] */
+#define      FLD_DIF_BPF_COEFF_6                        0x01ff0000
+/*  Reserved                             [15:9] */
+#define      FLD_DIF_BPF_COEFF_7                        0x000001ff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF89          (DIRECT_IF_REVB_BASE + 0x00000058)
+/*****************************************************************************/
+/*  Reserved                             [31:26] */
+#define      FLD_DIF_BPF_COEFF_8                        0x03ff0000
+/*  Reserved                             [15:10] */
+#define      FLD_DIF_BPF_COEFF_9                        0x000003ff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF1011        (DIRECT_IF_REVB_BASE + 0x0000005c)
+/*****************************************************************************/
+/*  Reserved                             [31:27] */
+#define      FLD_DIF_BPF_COEFF_10                       0x07ff0000
+/*  Reserved                             [15:11] */
+#define      FLD_DIF_BPF_COEFF_11                       0x000007ff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF1213        (DIRECT_IF_REVB_BASE + 0x00000060)
+/*****************************************************************************/
+/*  Reserved                             [31:27] */
+#define      FLD_DIF_BPF_COEFF_12                       0x07ff0000
+/*  Reserved                             [15:12] */
+#define      FLD_DIF_BPF_COEFF_13                       0x00000fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF1415        (DIRECT_IF_REVB_BASE + 0x00000064)
+/*****************************************************************************/
+/*  Reserved                             [31:28] */
+#define      FLD_DIF_BPF_COEFF_14                       0x0fff0000
+/*  Reserved                             [15:12] */
+#define      FLD_DIF_BPF_COEFF_15                       0x00000fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF1617        (DIRECT_IF_REVB_BASE + 0x00000068)
+/*****************************************************************************/
+/*  Reserved                             [31:29] */
+#define      FLD_DIF_BPF_COEFF_16                       0x1fff0000
+/*  Reserved                             [15:13] */
+#define      FLD_DIF_BPF_COEFF_17                       0x00001fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF1819        (DIRECT_IF_REVB_BASE + 0x0000006c)
+/*****************************************************************************/
+/*  Reserved                             [31:29] */
+#define      FLD_DIF_BPF_COEFF_18                       0x1fff0000
+/*  Reserved                             [15:13] */
+#define      FLD_DIF_BPF_COEFF_19                       0x00001fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF2021        (DIRECT_IF_REVB_BASE + 0x00000070)
+/*****************************************************************************/
+/*  Reserved                             [31:29] */
+#define      FLD_DIF_BPF_COEFF_20                       0x1fff0000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_BPF_COEFF_21                       0x00003fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF2223        (DIRECT_IF_REVB_BASE + 0x00000074)
+/*****************************************************************************/
+/*  Reserved                             [31:30] */
+#define      FLD_DIF_BPF_COEFF_22                       0x3fff0000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_BPF_COEFF_23                       0x00003fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF2425        (DIRECT_IF_REVB_BASE + 0x00000078)
+/*****************************************************************************/
+/*  Reserved                             [31:30] */
+#define      FLD_DIF_BPF_COEFF_24                       0x3fff0000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_BPF_COEFF_25                       0x00003fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF2627        (DIRECT_IF_REVB_BASE + 0x0000007c)
+/*****************************************************************************/
+/*  Reserved                             [31:30] */
+#define      FLD_DIF_BPF_COEFF_26                       0x3fff0000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_BPF_COEFF_27                       0x00003fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF2829        (DIRECT_IF_REVB_BASE + 0x00000080)
+/*****************************************************************************/
+/*  Reserved                             [31:30] */
+#define      FLD_DIF_BPF_COEFF_28                       0x3fff0000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_BPF_COEFF_29                       0x00003fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF3031        (DIRECT_IF_REVB_BASE + 0x00000084)
+/*****************************************************************************/
+/*  Reserved                             [31:30] */
+#define      FLD_DIF_BPF_COEFF_30                       0x3fff0000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_BPF_COEFF_31                       0x00003fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF3233        (DIRECT_IF_REVB_BASE + 0x00000088)
+/*****************************************************************************/
+/*  Reserved                             [31:30] */
+#define      FLD_DIF_BPF_COEFF_32                       0x3fff0000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_BPF_COEFF_33                       0x00003fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF3435        (DIRECT_IF_REVB_BASE + 0x0000008c)
+/*****************************************************************************/
+/*  Reserved                             [31:30] */
+#define      FLD_DIF_BPF_COEFF_34                       0x3fff0000
+/*  Reserved                             [15:14] */
+#define      FLD_DIF_BPF_COEFF_35                       0x00003fff
+
+/*****************************************************************************/
+#define      DIF_BPF_COEFF36          (DIRECT_IF_REVB_BASE + 0x00000090)
+/*****************************************************************************/
+/*  Reserved                             [31:30] */
+#define      FLD_DIF_BPF_COEFF_36                       0x3fff0000
+/*  Reserved                             [15:0] */
+
+/*****************************************************************************/
+#define      DIF_RPT_VARIANCE         (DIRECT_IF_REVB_BASE + 0x00000094)
+/*****************************************************************************/
+/*  Reserved                             [31:20] */
+#define      FLD_DIF_RPT_VARIANCE                       0x000fffff
+
+/*****************************************************************************/
+#define      DIF_SOFT_RST_CTRL_REVB       (DIRECT_IF_REVB_BASE + 0x00000098)
+/*****************************************************************************/
+/*  Reserved                             [31:8] */
+#define      FLD_DIF_DIF_SOFT_RST                       0x00000080
+#define      FLD_DIF_DIF_REG_RST_MSK                    0x00000040
+#define      FLD_DIF_AGC_RST_MSK                        0x00000020
+#define      FLD_DIF_CMP_RST_MSK                        0x00000010
+#define      FLD_DIF_AVS_RST_MSK                        0x00000008
+#define      FLD_DIF_NYQ_RST_MSK                        0x00000004
+#define      FLD_DIF_DIF_SRC_RST_MSK                    0x00000002
+#define      FLD_DIF_PLL_RST_MSK                        0x00000001
+
+/*****************************************************************************/
+#define      DIF_PLL_FREQ_ERR         (DIRECT_IF_REVB_BASE + 0x0000009c)
+/*****************************************************************************/
+/*  Reserved                             [31:25] */
+#define      FLD_DIF_CTL_IP                             0x01ffffff
+
+#endif
diff --git a/drivers/media/video/cx231xx/cx231xx-core.c b/drivers/media/video/cx231xx/cx231xx-core.c
new file mode 100644 (file)
index 0000000..0d333e6
--- /dev/null
@@ -0,0 +1,1200 @@
+/*
+   cx231xx-core.c - driver for Conexant Cx23100/101/102
+                               USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+                               Based on em28xx 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.
+
+   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 <linux/init.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+#include <linux/vmalloc.h>
+#include <media/v4l2-common.h>
+
+#include "cx231xx.h"
+#include "cx231xx-reg.h"
+
+/* #define ENABLE_DEBUG_ISOC_FRAMES */
+
+static unsigned int core_debug;
+module_param(core_debug, int, 0644);
+MODULE_PARM_DESC(core_debug, "enable debug messages [core]");
+
+#define cx231xx_coredbg(fmt, arg...) do {\
+       if (core_debug) \
+               printk(KERN_INFO "%s %s :"fmt, \
+                        dev->name, __func__ , ##arg); } while (0)
+
+static unsigned int reg_debug;
+module_param(reg_debug, int, 0644);
+MODULE_PARM_DESC(reg_debug, "enable debug messages [URB reg]");
+
+#define cx231xx_regdbg(fmt, arg...) do {\
+       if (reg_debug) \
+               printk(KERN_INFO "%s %s :"fmt, \
+                        dev->name, __func__ , ##arg); } while (0)
+
+static int alt = CX231XX_PINOUT;
+module_param(alt, int, 0644);
+MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
+
+#define cx231xx_isocdbg(fmt, arg...) do {\
+       if (core_debug) \
+               printk(KERN_INFO "%s %s :"fmt, \
+                        dev->name, __func__ , ##arg); } while (0)
+
+/*****************************************************************
+*             Device control list functions                                     *
+******************************************************************/
+
+static LIST_HEAD(cx231xx_devlist);
+static DEFINE_MUTEX(cx231xx_devlist_mutex);
+
+struct cx231xx *cx231xx_get_device(int minor,
+                                  enum v4l2_buf_type *fh_type, int *has_radio)
+{
+       struct cx231xx *h, *dev = NULL;
+
+       *fh_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+       *has_radio = 0;
+
+       mutex_lock(&cx231xx_devlist_mutex);
+       list_for_each_entry(h, &cx231xx_devlist, devlist) {
+               if (h->vdev->minor == minor)
+                       dev = h;
+               if (h->vbi_dev->minor == minor) {
+                       dev = h;
+                       *fh_type = V4L2_BUF_TYPE_VBI_CAPTURE;
+               }
+               if (h->radio_dev && h->radio_dev->minor == minor) {
+                       dev = h;
+                       *has_radio = 1;
+               }
+       }
+       mutex_unlock(&cx231xx_devlist_mutex);
+
+       return dev;
+}
+
+/*
+ * cx231xx_realease_resources()
+ * unregisters the v4l2,i2c and usb devices
+ * called when the device gets disconected or at module unload
+*/
+void cx231xx_remove_from_devlist(struct cx231xx *dev)
+{
+       mutex_lock(&cx231xx_devlist_mutex);
+       list_del(&dev->devlist);
+       mutex_unlock(&cx231xx_devlist_mutex);
+};
+
+void cx231xx_add_into_devlist(struct cx231xx *dev)
+{
+       mutex_lock(&cx231xx_devlist_mutex);
+       list_add_tail(&dev->devlist, &cx231xx_devlist);
+       mutex_unlock(&cx231xx_devlist_mutex);
+};
+
+static LIST_HEAD(cx231xx_extension_devlist);
+static DEFINE_MUTEX(cx231xx_extension_devlist_lock);
+
+int cx231xx_register_extension(struct cx231xx_ops *ops)
+{
+       struct cx231xx *dev = NULL;
+
+       mutex_lock(&cx231xx_devlist_mutex);
+       mutex_lock(&cx231xx_extension_devlist_lock);
+       list_add_tail(&ops->next, &cx231xx_extension_devlist);
+       list_for_each_entry(dev, &cx231xx_devlist, devlist) {
+               if (dev)
+                       ops->init(dev);
+       }
+       printk(KERN_INFO DRIVER_NAME ": %s initialized\n", ops->name);
+       mutex_unlock(&cx231xx_extension_devlist_lock);
+       mutex_unlock(&cx231xx_devlist_mutex);
+       return 0;
+}
+EXPORT_SYMBOL(cx231xx_register_extension);
+
+void cx231xx_unregister_extension(struct cx231xx_ops *ops)
+{
+       struct cx231xx *dev = NULL;
+
+       mutex_lock(&cx231xx_devlist_mutex);
+       list_for_each_entry(dev, &cx231xx_devlist, devlist) {
+               if (dev)
+                       ops->fini(dev);
+       }
+
+       mutex_lock(&cx231xx_extension_devlist_lock);
+       printk(KERN_INFO DRIVER_NAME ": %s removed\n", ops->name);
+       list_del(&ops->next);
+       mutex_unlock(&cx231xx_extension_devlist_lock);
+       mutex_unlock(&cx231xx_devlist_mutex);
+}
+EXPORT_SYMBOL(cx231xx_unregister_extension);
+
+void cx231xx_init_extension(struct cx231xx *dev)
+{
+       struct cx231xx_ops *ops = NULL;
+
+       mutex_lock(&cx231xx_extension_devlist_lock);
+       if (!list_empty(&cx231xx_extension_devlist)) {
+               list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
+                       if (ops->init)
+                               ops->init(dev);
+               }
+       }
+       mutex_unlock(&cx231xx_extension_devlist_lock);
+}
+
+void cx231xx_close_extension(struct cx231xx *dev)
+{
+       struct cx231xx_ops *ops = NULL;
+
+       mutex_lock(&cx231xx_extension_devlist_lock);
+       if (!list_empty(&cx231xx_extension_devlist)) {
+               list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
+                       if (ops->fini)
+                               ops->fini(dev);
+               }
+       }
+       mutex_unlock(&cx231xx_extension_devlist_lock);
+}
+
+/****************************************************************
+*               U S B related functions                         *
+*****************************************************************/
+int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
+                            struct cx231xx_i2c_xfer_data *req_data)
+{
+       int status = 0;
+       struct cx231xx *dev = i2c_bus->dev;
+       struct VENDOR_REQUEST_IN ven_req;
+
+       u8 saddr_len = 0;
+       u8 _i2c_period = 0;
+       u8 _i2c_nostop = 0;
+       u8 _i2c_reserve = 0;
+
+       /* Get the I2C period, nostop and reserve parameters */
+       _i2c_period = i2c_bus->i2c_period;
+       _i2c_nostop = i2c_bus->i2c_nostop;
+       _i2c_reserve = i2c_bus->i2c_reserve;
+
+       saddr_len = req_data->saddr_len;
+
+       /* Set wValue */
+       if (saddr_len == 1)     /* need check saddr_len == 0  */
+               ven_req.wValue =
+                   req_data->
+                   dev_addr << 9 | _i2c_period << 4 | saddr_len << 2 |
+                   _i2c_nostop << 1 | I2C_SYNC | _i2c_reserve << 6;
+       else
+               ven_req.wValue =
+                   req_data->
+                   dev_addr << 9 | _i2c_period << 4 | saddr_len << 2 |
+                   _i2c_nostop << 1 | I2C_SYNC | _i2c_reserve << 6;
+
+       /* set channel number */
+       if (req_data->direction & I2C_M_RD) {
+               /* channel number, for read,spec required channel_num +4 */
+               ven_req.bRequest = i2c_bus->nr + 4;
+       } else
+               ven_req.bRequest = i2c_bus->nr; /* channel number,  */
+
+       /* set index value */
+       switch (saddr_len) {
+       case 0:
+               ven_req.wIndex = 0;     /* need check */
+               break;
+       case 1:
+               ven_req.wIndex = (req_data->saddr_dat & 0xff);
+               break;
+       case 2:
+               ven_req.wIndex = req_data->saddr_dat;
+               break;
+       }
+
+       /* set wLength value */
+       ven_req.wLength = req_data->buf_size;
+
+       /* set bData value */
+       ven_req.bData = 0;
+
+       /* set the direction */
+       if (req_data->direction) {
+               ven_req.direction = USB_DIR_IN;
+               memset(req_data->p_buffer, 0x00, ven_req.wLength);
+       } else
+               ven_req.direction = USB_DIR_OUT;
+
+       /* set the buffer for read / write */
+       ven_req.pBuff = req_data->p_buffer;
+
+
+       /* call common vendor command request */
+       status = cx231xx_send_vendor_cmd(dev, &ven_req);
+       if (status < 0) {
+               cx231xx_info
+                   ("UsbInterface::sendCommand, failed with status -%d\n",
+                    status);
+       }
+
+       return status;
+}
+EXPORT_SYMBOL_GPL(cx231xx_send_usb_command);
+
+/*
+ * cx231xx_read_ctrl_reg()
+ * reads data from the usb device specifying bRequest and wValue
+ */
+int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
+                         char *buf, int len)
+{
+       u8 val = 0;
+       int ret;
+       int pipe = usb_rcvctrlpipe(dev->udev, 0);
+
+       if (dev->state & DEV_DISCONNECTED)
+               return -ENODEV;
+
+       if (len > URB_MAX_CTRL_SIZE)
+               return -EINVAL;
+
+       switch (len) {
+       case 1:
+               val = ENABLE_ONE_BYTE;
+               break;
+       case 2:
+               val = ENABLE_TWE_BYTE;
+               break;
+       case 3:
+               val = ENABLE_THREE_BYTE;
+               break;
+       case 4:
+               val = ENABLE_FOUR_BYTE;
+               break;
+       default:
+               val = 0xFF;     /* invalid option */
+       }
+
+       if (val == 0xFF)
+               return -EINVAL;
+
+       if (reg_debug) {
+               cx231xx_isocdbg("(pipe 0x%08x): "
+                               "IN:  %02x %02x %02x %02x %02x %02x %02x %02x ",
+                               pipe,
+                               USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                               req, 0, val,
+                               reg & 0xff, reg >> 8, len & 0xff, len >> 8);
+       }
+
+       mutex_lock(&dev->ctrl_urb_lock);
+       ret = usb_control_msg(dev->udev, pipe, req,
+                             USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                             val, reg, dev->urb_buf, len, HZ);
+       if (ret < 0) {
+               cx231xx_isocdbg(" failed!\n");
+               /* mutex_unlock(&dev->ctrl_urb_lock); */
+               return ret;
+       }
+
+       if (len)
+               memcpy(buf, dev->urb_buf, len);
+
+       mutex_unlock(&dev->ctrl_urb_lock);
+
+       if (reg_debug) {
+               int byte;
+
+               cx231xx_isocdbg("<<<");
+               for (byte = 0; byte < len; byte++)
+                       cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
+               cx231xx_isocdbg("\n");
+       }
+
+       return ret;
+}
+
+int cx231xx_send_vendor_cmd(struct cx231xx *dev,
+                               struct VENDOR_REQUEST_IN *ven_req)
+{
+       int ret;
+       int pipe = 0;
+
+       if (dev->state & DEV_DISCONNECTED)
+               return -ENODEV;
+
+       if ((ven_req->wLength > URB_MAX_CTRL_SIZE))
+               return -EINVAL;
+
+       if (ven_req->direction)
+               pipe = usb_rcvctrlpipe(dev->udev, 0);
+       else
+               pipe = usb_sndctrlpipe(dev->udev, 0);
+
+       if (reg_debug) {
+               int byte;
+
+               cx231xx_isocdbg("(pipe 0x%08x): "
+                               "OUT: %02x %02x %02x %04x %04x %04x >>>",
+                               pipe,
+                               ven_req->
+                               direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                               ven_req->bRequest, 0, ven_req->wValue,
+                               ven_req->wIndex, ven_req->wLength);
+
+               for (byte = 0; byte < ven_req->wLength; byte++)
+                       cx231xx_isocdbg(" %02x",
+                                       (unsigned char)ven_req->pBuff[byte]);
+               cx231xx_isocdbg("\n");
+       }
+
+       mutex_lock(&dev->ctrl_urb_lock);
+       ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
+                             ven_req->
+                             direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                             ven_req->wValue, ven_req->wIndex, ven_req->pBuff,
+                             ven_req->wLength, HZ);
+       mutex_unlock(&dev->ctrl_urb_lock);
+
+       return ret;
+}
+
+/*
+ * cx231xx_write_ctrl_reg()
+ * sends data to the usb device, specifying bRequest
+ */
+int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
+                          int len)
+{
+       u8 val = 0;
+       int ret;
+       int pipe = usb_sndctrlpipe(dev->udev, 0);
+
+       if (dev->state & DEV_DISCONNECTED)
+               return -ENODEV;
+
+       if ((len < 1) || (len > URB_MAX_CTRL_SIZE))
+               return -EINVAL;
+
+       switch (len) {
+       case 1:
+               val = ENABLE_ONE_BYTE;
+               break;
+       case 2:
+               val = ENABLE_TWE_BYTE;
+               break;
+       case 3:
+               val = ENABLE_THREE_BYTE;
+               break;
+       case 4:
+               val = ENABLE_FOUR_BYTE;
+               break;
+       default:
+               val = 0xFF;     /* invalid option */
+       }
+
+       if (val == 0xFF)
+               return -EINVAL;
+
+       if (reg_debug) {
+               int byte;
+
+               cx231xx_isocdbg("(pipe 0x%08x): "
+                       "OUT: %02x %02x %02x %02x %02x %02x %02x %02x >>>",
+                       pipe,
+                       USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                       req, 0, val, reg & 0xff,
+                       reg >> 8, len & 0xff, len >> 8);
+
+               for (byte = 0; byte < len; byte++)
+                       cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
+               cx231xx_isocdbg("\n");
+       }
+
+       mutex_lock(&dev->ctrl_urb_lock);
+       memcpy(dev->urb_buf, buf, len);
+       ret = usb_control_msg(dev->udev, pipe, req,
+                             USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+                             val, reg, dev->urb_buf, len, HZ);
+       mutex_unlock(&dev->ctrl_urb_lock);
+
+       return ret;
+}
+
+/****************************************************************
+*           USB Alternate Setting functions                     *
+*****************************************************************/
+
+int cx231xx_set_video_alternate(struct cx231xx *dev)
+{
+       int errCode, prev_alt = dev->video_mode.alt;
+       unsigned int min_pkt_size = dev->width * 2 + 4;
+       u32 usb_interface_index = 0;
+
+       /* When image size is bigger than a certain value,
+          the frame size should be increased, otherwise, only
+          green screen will be received.
+        */
+       if (dev->width * 2 * dev->height > 720 * 240 * 2)
+               min_pkt_size *= 2;
+
+       if (dev->width > 360) {
+               /* resolutions: 720,704,640 */
+               dev->video_mode.alt = 3;
+       } else if (dev->width > 180) {
+               /* resolutions: 360,352,320,240 */
+               dev->video_mode.alt = 2;
+       } else if (dev->width > 0) {
+               /* resolutions: 180,176,160,128,88 */
+               dev->video_mode.alt = 1;
+       } else {
+               /* Change to alt0 BULK to release USB bandwidth */
+               dev->video_mode.alt = 0;
+       }
+
+       /* Get the correct video interface Index */
+       usb_interface_index =
+           dev->current_pcb_config.hs_config_info[0].interface_info.
+           video_index + 1;
+
+       if (dev->video_mode.alt != prev_alt) {
+               cx231xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
+                               min_pkt_size, dev->video_mode.alt);
+               dev->video_mode.max_pkt_size =
+                   dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
+               cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
+                               dev->video_mode.alt,
+                               dev->video_mode.max_pkt_size);
+               cx231xx_info
+                   (" setting alt %d with wMaxPktSize=%u , Interface = %d\n",
+                    dev->video_mode.alt, dev->video_mode.max_pkt_size,
+                    usb_interface_index);
+               errCode =
+                   usb_set_interface(dev->udev, usb_interface_index,
+                                     dev->video_mode.alt);
+               if (errCode < 0) {
+                       cx231xx_errdev
+                           ("cannot change alt number to %d (error=%i)\n",
+                            dev->video_mode.alt, errCode);
+                       return errCode;
+               }
+       }
+       return 0;
+}
+
+int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
+{
+       int status = 0;
+       u32 usb_interface_index = 0;
+       u32 max_pkt_size = 0;
+
+       switch (index) {
+       case INDEX_TS1:
+               usb_interface_index =
+                   dev->current_pcb_config.hs_config_info[0].interface_info.
+                   ts1_index + 1;
+               dev->video_mode.alt = alt;
+               if (dev->ts1_mode.alt_max_pkt_size != NULL)
+                       max_pkt_size = dev->ts1_mode.max_pkt_size =
+                           dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
+               break;
+       case INDEX_TS2:
+               usb_interface_index =
+                   dev->current_pcb_config.hs_config_info[0].interface_info.
+                   ts2_index + 1;
+               break;
+       case INDEX_AUDIO:
+               usb_interface_index =
+                   dev->current_pcb_config.hs_config_info[0].interface_info.
+                   audio_index + 1;
+               dev->adev.alt = alt;
+               if (dev->adev.alt_max_pkt_size != NULL)
+                       max_pkt_size = dev->adev.max_pkt_size =
+                           dev->adev.alt_max_pkt_size[dev->adev.alt];
+               break;
+       case INDEX_VIDEO:
+               usb_interface_index =
+                   dev->current_pcb_config.hs_config_info[0].interface_info.
+                   video_index + 1;
+               dev->video_mode.alt = alt;
+               if (dev->video_mode.alt_max_pkt_size != NULL)
+                       max_pkt_size = dev->video_mode.max_pkt_size =
+                           dev->video_mode.alt_max_pkt_size[dev->video_mode.
+                                                            alt];
+               break;
+       case INDEX_VANC:
+               usb_interface_index =
+                   dev->current_pcb_config.hs_config_info[0].interface_info.
+                   vanc_index + 1;
+               dev->vbi_mode.alt = alt;
+               if (dev->vbi_mode.alt_max_pkt_size != NULL)
+                       max_pkt_size = dev->vbi_mode.max_pkt_size =
+                           dev->vbi_mode.alt_max_pkt_size[dev->vbi_mode.alt];
+               break;
+       case INDEX_HANC:
+               usb_interface_index =
+                   dev->current_pcb_config.hs_config_info[0].interface_info.
+                   hanc_index + 1;
+               dev->sliced_cc_mode.alt = alt;
+               if (dev->sliced_cc_mode.alt_max_pkt_size != NULL)
+                       max_pkt_size = dev->sliced_cc_mode.max_pkt_size =
+                           dev->sliced_cc_mode.alt_max_pkt_size[dev->
+                                                                sliced_cc_mode.
+                                                                alt];
+               break;
+       default:
+               break;
+       }
+
+       if (alt > 0 && max_pkt_size == 0) {
+               cx231xx_errdev
+               ("can't change interface %d alt no. to %d: Max. Pkt size = 0\n",
+               usb_interface_index, alt);
+               return -1;
+       }
+
+       cx231xx_info
+           (" setting alternate %d with wMaxPacketSize=%u , Interface = %d\n",
+            alt, max_pkt_size, usb_interface_index);
+
+       if (usb_interface_index > 0) {
+               status = usb_set_interface(dev->udev, usb_interface_index, alt);
+               if (status < 0) {
+                       cx231xx_errdev
+                       ("can't change interface %d alt no. to %d (err=%i)\n",
+                       usb_interface_index, alt, status);
+                       return status;
+               }
+       }
+
+       return status;
+}
+EXPORT_SYMBOL_GPL(cx231xx_set_alt_setting);
+
+int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
+{
+       int rc = 0;
+
+       if (!gpio)
+               return rc;
+
+       /* Send GPIO reset sequences specified at board entry */
+       while (gpio->sleep >= 0) {
+               rc = cx231xx_set_gpio_value(dev, gpio->bit, gpio->val);
+               if (rc < 0)
+                       return rc;
+
+               if (gpio->sleep > 0)
+                       msleep(gpio->sleep);
+
+               gpio++;
+       }
+       return rc;
+}
+
+int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
+{
+       if (dev->mode == set_mode)
+               return 0;
+
+       if (set_mode == CX231XX_SUSPEND) {
+               /* Set the chip in power saving mode */
+               dev->mode = set_mode;
+       }
+
+       /* Resource is locked */
+       if (dev->mode != CX231XX_SUSPEND)
+               return -EINVAL;
+
+       dev->mode = set_mode;
+
+       if (dev->mode == CX231XX_DIGITAL_MODE)
+               ;/* Set Digital power mode */
+       else
+               ;/* Set Analog Power mode */
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(cx231xx_set_mode);
+
+/*****************************************************************
+*                URB Streaming functions                         *
+******************************************************************/
+
+/*
+ * IRQ callback, called by URB callback
+ */
+static void cx231xx_irq_callback(struct urb *urb)
+{
+       struct cx231xx_dmaqueue *dma_q = urb->context;
+       struct cx231xx_video_mode *vmode =
+           container_of(dma_q, struct cx231xx_video_mode, vidq);
+       struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
+       int rc, i;
+
+       switch (urb->status) {
+       case 0:         /* success */
+       case -ETIMEDOUT:        /* NAK */
+               break;
+       case -ECONNRESET:       /* kill */
+       case -ENOENT:
+       case -ESHUTDOWN:
+               return;
+       default:                /* error */
+               cx231xx_isocdbg("urb completition error %d.\n", urb->status);
+               break;
+       }
+
+       /* Copy data from URB */
+       spin_lock(&dev->video_mode.slock);
+       rc = dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
+       spin_unlock(&dev->video_mode.slock);
+
+       /* Reset urb buffers */
+       for (i = 0; i < urb->number_of_packets; i++) {
+               urb->iso_frame_desc[i].status = 0;
+               urb->iso_frame_desc[i].actual_length = 0;
+       }
+       urb->status = 0;
+
+       urb->status = usb_submit_urb(urb, GFP_ATOMIC);
+       if (urb->status) {
+               cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
+                               urb->status);
+       }
+}
+
+/*
+ * Stop and Deallocate URBs
+ */
+void cx231xx_uninit_isoc(struct cx231xx *dev)
+{
+       struct urb *urb;
+       int i;
+
+       cx231xx_isocdbg("cx231xx: called cx231xx_uninit_isoc\n");
+
+       dev->video_mode.isoc_ctl.nfields = -1;
+       for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
+               urb = dev->video_mode.isoc_ctl.urb[i];
+               if (urb) {
+                       if (!irqs_disabled())
+                               usb_kill_urb(urb);
+                       else
+                               usb_unlink_urb(urb);
+
+                       if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
+                               usb_buffer_free(dev->udev,
+                                               urb->transfer_buffer_length,
+                                               dev->video_mode.isoc_ctl.
+                                               transfer_buffer[i],
+                                               urb->transfer_dma);
+                       }
+                       usb_free_urb(urb);
+                       dev->video_mode.isoc_ctl.urb[i] = NULL;
+               }
+               dev->video_mode.isoc_ctl.transfer_buffer[i] = NULL;
+       }
+
+       kfree(dev->video_mode.isoc_ctl.urb);
+       kfree(dev->video_mode.isoc_ctl.transfer_buffer);
+
+       dev->video_mode.isoc_ctl.urb = NULL;
+       dev->video_mode.isoc_ctl.transfer_buffer = NULL;
+       dev->video_mode.isoc_ctl.num_bufs = 0;
+
+       cx231xx_capture_start(dev, 0, Raw_Video);
+}
+EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
+
+/*
+ * Allocate URBs and start IRQ
+ */
+int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
+                     int num_bufs, int max_pkt_size,
+                     int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
+{
+       struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
+       int i;
+       int sb_size, pipe;
+       struct urb *urb;
+       int j, k;
+       int rc;
+
+       cx231xx_isocdbg("cx231xx: called cx231xx_prepare_isoc\n");
+
+       dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
+
+       cx231xx_info("Setting Video mux to %d\n", dev->video_input);
+       video_mux(dev, dev->video_input);
+
+       /* De-allocates all pending stuff */
+       cx231xx_uninit_isoc(dev);
+
+       dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
+       dev->video_mode.isoc_ctl.num_bufs = num_bufs;
+       dma_q->pos = 0;
+       dma_q->is_partial_line = 0;
+       dma_q->last_sav = 0;
+       dma_q->current_field = -1;
+       dma_q->field1_done = 0;
+       dma_q->lines_per_field = dev->height / 2;
+       dma_q->bytes_left_in_line = dev->width << 1;
+       dma_q->lines_completed = 0;
+       for (i = 0; i < 8; i++)
+               dma_q->partial_buf[i] = 0;
+
+       dev->video_mode.isoc_ctl.urb =
+           kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
+       if (!dev->video_mode.isoc_ctl.urb) {
+               cx231xx_errdev("cannot alloc memory for usb buffers\n");
+               return -ENOMEM;
+       }
+
+       dev->video_mode.isoc_ctl.transfer_buffer =
+           kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
+       if (!dev->video_mode.isoc_ctl.transfer_buffer) {
+               cx231xx_errdev("cannot allocate memory for usbtransfer\n");
+               kfree(dev->video_mode.isoc_ctl.urb);
+               return -ENOMEM;
+       }
+
+       dev->video_mode.isoc_ctl.max_pkt_size = max_pkt_size;
+       dev->video_mode.isoc_ctl.buf = NULL;
+
+       sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
+
+       /* allocate urbs and transfer buffers */
+       for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
+               urb = usb_alloc_urb(max_packets, GFP_KERNEL);
+               if (!urb) {
+                       cx231xx_err("cannot alloc isoc_ctl.urb %i\n", i);
+                       cx231xx_uninit_isoc(dev);
+                       return -ENOMEM;
+               }
+               dev->video_mode.isoc_ctl.urb[i] = urb;
+
+               dev->video_mode.isoc_ctl.transfer_buffer[i] =
+                   usb_buffer_alloc(dev->udev, sb_size, GFP_KERNEL,
+                                    &urb->transfer_dma);
+               if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
+                       cx231xx_err("unable to allocate %i bytes for transfer"
+                                   " buffer %i%s\n",
+                                   sb_size, i,
+                                   in_interrupt() ? " while in int" : "");
+                       cx231xx_uninit_isoc(dev);
+                       return -ENOMEM;
+               }
+               memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
+
+               pipe =
+                   usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
+
+               usb_fill_int_urb(urb, dev->udev, pipe,
+                                dev->video_mode.isoc_ctl.transfer_buffer[i],
+                                sb_size, cx231xx_irq_callback, dma_q, 1);
+
+               urb->number_of_packets = max_packets;
+               urb->transfer_flags = URB_ISO_ASAP;
+
+               k = 0;
+               for (j = 0; j < max_packets; j++) {
+                       urb->iso_frame_desc[j].offset = k;
+                       urb->iso_frame_desc[j].length =
+                           dev->video_mode.isoc_ctl.max_pkt_size;
+                       k += dev->video_mode.isoc_ctl.max_pkt_size;
+               }
+       }
+
+       init_waitqueue_head(&dma_q->wq);
+
+       /* submit urbs and enables IRQ */
+       for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
+               rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i],
+                                   GFP_ATOMIC);
+               if (rc) {
+                       cx231xx_err("submit of urb %i failed (error=%i)\n", i,
+                                   rc);
+                       cx231xx_uninit_isoc(dev);
+                       return rc;
+               }
+       }
+
+       cx231xx_capture_start(dev, 1, Raw_Video);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
+
+/*****************************************************************
+*             Device Init/UnInit functions                       *
+******************************************************************/
+int cx231xx_dev_init(struct cx231xx *dev)
+{
+       int errCode = 0;
+
+       /* Initialize I2C bus */
+
+       /* External Master 1 Bus */
+       dev->i2c_bus[0].nr = 0;
+       dev->i2c_bus[0].dev = dev;
+       dev->i2c_bus[0].i2c_period = I2C_SPEED_1M;      /* 1MHz */
+       dev->i2c_bus[0].i2c_nostop = 0;
+       dev->i2c_bus[0].i2c_reserve = 0;
+
+       /* External Master 2 Bus */
+       dev->i2c_bus[1].nr = 1;
+       dev->i2c_bus[1].dev = dev;
+       dev->i2c_bus[1].i2c_period = I2C_SPEED_1M;      /* 1MHz */
+       dev->i2c_bus[1].i2c_nostop = 0;
+       dev->i2c_bus[1].i2c_reserve = 0;
+
+       /* Internal Master 3 Bus */
+       dev->i2c_bus[2].nr = 2;
+       dev->i2c_bus[2].dev = dev;
+       dev->i2c_bus[2].i2c_period = I2C_SPEED_400K;    /* 400kHz */
+       dev->i2c_bus[2].i2c_nostop = 0;
+       dev->i2c_bus[2].i2c_reserve = 0;
+
+       /* register I2C buses */
+       cx231xx_i2c_register(&dev->i2c_bus[0]);
+       cx231xx_i2c_register(&dev->i2c_bus[1]);
+       cx231xx_i2c_register(&dev->i2c_bus[2]);
+
+       /* init hardware */
+       /* Note : with out calling set power mode function,
+       afe can not be set up correctly */
+       errCode = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
+       if (errCode < 0) {
+               cx231xx_errdev
+                   ("%s: Failed to set Power - errCode [%d]!\n",
+                    __func__, errCode);
+               return errCode;
+       }
+
+       /* initialize Colibri block */
+       errCode = cx231xx_afe_init_super_block(dev, 0x23c);
+       if (errCode < 0) {
+               cx231xx_errdev
+                   ("%s: cx231xx_afe init super block - errCode [%d]!\n",
+                    __func__, errCode);
+               return errCode;
+       }
+       errCode = cx231xx_afe_init_channels(dev);
+       if (errCode < 0) {
+               cx231xx_errdev
+                   ("%s: cx231xx_afe init channels - errCode [%d]!\n",
+                    __func__, errCode);
+               return errCode;
+       }
+
+       /* Set DIF in By pass mode */
+       errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
+       if (errCode < 0) {
+               cx231xx_errdev
+                   ("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
+                    __func__, errCode);
+               return errCode;
+       }
+
+       /* I2S block related functions */
+       errCode = cx231xx_i2s_blk_initialize(dev);
+       if (errCode < 0) {
+               cx231xx_errdev
+                   ("%s: cx231xx_i2s block initialize - errCode [%d]!\n",
+                    __func__, errCode);
+               return errCode;
+       }
+
+       /* init control pins */
+       errCode = cx231xx_init_ctrl_pin_status(dev);
+       if (errCode < 0) {
+               cx231xx_errdev("%s: cx231xx_init ctrl pins - errCode [%d]!\n",
+                              __func__, errCode);
+               return errCode;
+       }
+
+       /* set AGC mode to Analog */
+       errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
+       if (errCode < 0) {
+               cx231xx_errdev
+                   ("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
+                    __func__, errCode);
+               return errCode;
+       }
+
+       /* set all alternate settings to zero initially */
+       cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
+       cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
+       cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
+       if (dev->board.has_dvb)
+               cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
+
+       /* set the I2C master port to 3 on channel 1 */
+       errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3);
+
+       return errCode;
+}
+EXPORT_SYMBOL_GPL(cx231xx_dev_init);
+
+void cx231xx_dev_uninit(struct cx231xx *dev)
+{
+       /* Un Initialize I2C bus */
+       cx231xx_i2c_unregister(&dev->i2c_bus[2]);
+       cx231xx_i2c_unregister(&dev->i2c_bus[1]);
+       cx231xx_i2c_unregister(&dev->i2c_bus[0]);
+}
+EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
+
+/*****************************************************************
+*              G P I O related functions                         *
+******************************************************************/
+int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val,
+                         u8 len, u8 request, u8 direction)
+{
+       int status = 0;
+       struct VENDOR_REQUEST_IN ven_req;
+
+       /* Set wValue */
+       ven_req.wValue = (u16) (gpio_bit >> 16 & 0xffff);
+
+       /* set request */
+       if (!request) {
+               if (direction)
+                       ven_req.bRequest = VRT_GET_GPIO;        /* 0x8 gpio */
+               else
+                       ven_req.bRequest = VRT_SET_GPIO;        /* 0x9 gpio */
+       } else {
+               if (direction)
+                       ven_req.bRequest = VRT_GET_GPIE;        /* 0xa gpie */
+               else
+                       ven_req.bRequest = VRT_SET_GPIE;        /* 0xb gpie */
+       }
+
+       /* set index value */
+       ven_req.wIndex = (u16) (gpio_bit & 0xffff);
+
+       /* set wLength value */
+       ven_req.wLength = len;
+
+       /* set bData value */
+       ven_req.bData = 0;
+
+       /* set the buffer for read / write */
+       ven_req.pBuff = gpio_val;
+
+       /* set the direction */
+       if (direction) {
+               ven_req.direction = USB_DIR_IN;
+               memset(ven_req.pBuff, 0x00, ven_req.wLength);
+       } else
+               ven_req.direction = USB_DIR_OUT;
+
+
+       /* call common vendor command request */
+       status = cx231xx_send_vendor_cmd(dev, &ven_req);
+       if (status < 0) {
+               cx231xx_info
+                   ("UsbInterface::sendCommand, failed with status -%d\n",
+                    status);
+       }
+
+       return status;
+}
+EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
+
+/*****************************************************************
+ *    C O N T R O L - Register R E A D / W R I T E functions     *
+ *****************************************************************/
+int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
+{
+       u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
+       u32 tmp = 0;
+       int status = 0;
+
+       status =
+           cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, address, value, 4);
+       if (status < 0)
+               return status;
+
+       tmp = *((u32 *) value);
+       tmp |= mode;
+
+       value[0] = (u8) tmp;
+       value[1] = (u8) (tmp >> 8);
+       value[2] = (u8) (tmp >> 16);
+       value[3] = (u8) (tmp >> 24);
+
+       status =
+           cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, address, value, 4);
+
+       return status;
+}
+
+/*****************************************************************
+ *            I 2 C Internal C O N T R O L   functions           *
+ *****************************************************************/
+int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
+                         u8 saddr_len, u32 *data, u8 data_len)
+{
+       int status = 0;
+       struct cx231xx_i2c_xfer_data req_data;
+       u8 value[4] = { 0, 0, 0, 0 };
+
+       if (saddr_len == 0)
+               saddr = 0;
+       else if (saddr_len == 0)
+               saddr &= 0xff;
+
+       /* prepare xfer_data struct */
+       req_data.dev_addr = dev_addr >> 1;
+       req_data.direction = I2C_M_RD;
+       req_data.saddr_len = saddr_len;
+       req_data.saddr_dat = saddr;
+       req_data.buf_size = data_len;
+       req_data.p_buffer = (u8 *) value;
+
+       /* usb send command */
+       status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
+
+       if (status >= 0) {
+               /* Copy the data read back to main buffer */
+               if (data_len == 1)
+                       *data = value[0];
+               else
+                       *data =
+                           value[0] | value[1] << 8 | value[2] << 16 | value[3]
+                           << 24;
+       }
+
+       return status;
+}
+
+int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
+                          u8 saddr_len, u32 data, u8 data_len)
+{
+       int status = 0;
+       u8 value[4] = { 0, 0, 0, 0 };
+       struct cx231xx_i2c_xfer_data req_data;
+
+       value[0] = (u8) data;
+       value[1] = (u8) (data >> 8);
+       value[2] = (u8) (data >> 16);
+       value[3] = (u8) (data >> 24);
+
+       if (saddr_len == 0)
+               saddr = 0;
+       else if (saddr_len == 0)
+               saddr &= 0xff;
+
+       /* prepare xfer_data struct */
+       req_data.dev_addr = dev_addr >> 1;
+       req_data.direction = 0;
+       req_data.saddr_len = saddr_len;
+       req_data.saddr_dat = saddr;
+       req_data.buf_size = data_len;
+       req_data.p_buffer = value;
+
+       /* usb send command */
+       status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
+
+       return status;
+}
+
+int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
+                          u16 register_address, u8 bit_start, u8 bit_end,
+                          u32 value)
+{
+       int status = 0;
+       u32 tmp;
+       u32 mask = 0;
+       int i;
+
+       if (bit_start > (size - 1) || bit_end > (size - 1))
+               return -1;
+
+       if (size == 8) {
+               status =
+                   cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
+                                         &tmp, 1);
+       } else {
+               status =
+                   cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
+                                         &tmp, 4);
+       }
+
+       if (status < 0)
+               return status;
+
+       mask = 1 << bit_end;
+       for (i = bit_end; i > bit_start && i > 0; i--)
+               mask = mask + (1 << (i - 1));
+
+       value <<= bit_start;
+
+       if (size == 8) {
+               tmp &= ~mask;
+               tmp |= value;
+               tmp &= 0xff;
+               status =
+                   cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
+                                          tmp, 1);
+       } else {
+               tmp &= ~mask;
+               tmp |= value;
+               status =
+                   cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
+                                          tmp, 4);
+       }
+
+       return status;
+}
+
+int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
+                                       u16 saddr, u32 mask, u32 value)
+{
+       u32 temp;
+       int status = 0;
+
+       status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
+
+       if (status < 0)
+               return status;
+
+       temp &= ~mask;
+       temp |= value;
+
+       status = cx231xx_write_i2c_data(dev, dev_addr, saddr, 2, temp, 4);
+
+       return status;
+}
+
+u32 cx231xx_set_field(u32 field_mask, u32 data)
+{
+       u32 temp;
+
+       for (temp = field_mask; (temp & 1) == 0; temp >>= 1)
+               data <<= 1;
+
+       return data;
+}
diff --git a/drivers/media/video/cx231xx/cx231xx-dvb.c b/drivers/media/video/cx231xx/cx231xx-dvb.c
new file mode 100644 (file)
index 0000000..c5082a4
--- /dev/null
@@ -0,0 +1,559 @@
+/*
+ DVB device driver for cx231xx
+
+ Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+               Based on em28xx 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.
+
+   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 <linux/kernel.h>
+#include <linux/usb.h>
+
+#include "cx231xx.h"
+#include <media/v4l2-common.h>
+#include <media/videobuf-vmalloc.h>
+
+#include "xc5000.h"
+#include "dvb_dummy_fe.h"
+
+MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
+MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
+MODULE_LICENSE("GPL");
+
+static unsigned int debug;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "enable debug messages [dvb]");
+
+DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
+
+#define dprintk(level, fmt, arg...) do {                       \
+if (debug >= level)                                            \
+       printk(KERN_DEBUG "%s/2-dvb: " fmt, dev->name, ## arg); \
+} while (0)
+
+#define CX231XX_DVB_NUM_BUFS 5
+#define CX231XX_DVB_MAX_PACKETSIZE 564
+#define CX231XX_DVB_MAX_PACKETS 64
+
+struct cx231xx_dvb {
+       struct dvb_frontend *frontend;
+
+       /* feed count management */
+       struct mutex lock;
+       int nfeeds;
+
+       /* general boilerplate stuff */
+       struct dvb_adapter adapter;
+       struct dvb_demux demux;
+       struct dmxdev dmxdev;
+       struct dmx_frontend fe_hw;
+       struct dmx_frontend fe_mem;
+       struct dvb_net net;
+};
+
+static inline void print_err_status(struct cx231xx *dev, int packet, int status)
+{
+       char *errmsg = "Unknown";
+
+       switch (status) {
+       case -ENOENT:
+               errmsg = "unlinked synchronuously";
+               break;
+       case -ECONNRESET:
+               errmsg = "unlinked asynchronuously";
+               break;
+       case -ENOSR:
+               errmsg = "Buffer error (overrun)";
+               break;
+       case -EPIPE:
+               errmsg = "Stalled (device not responding)";
+               break;
+       case -EOVERFLOW:
+               errmsg = "Babble (bad cable?)";
+               break;
+       case -EPROTO:
+               errmsg = "Bit-stuff error (bad cable?)";
+               break;
+       case -EILSEQ:
+               errmsg = "CRC/Timeout (could be anything)";
+               break;
+       case -ETIME:
+               errmsg = "Device does not respond";
+               break;
+       }
+       if (packet < 0) {
+               dprintk(1, "URB status %d [%s].\n", status, errmsg);
+       } else {
+               dprintk(1, "URB packet %d, status %d [%s].\n",
+                       packet, status, errmsg);
+       }
+}
+
+static inline int dvb_isoc_copy(struct cx231xx *dev, struct urb *urb)
+{
+       int i;
+
+       if (!dev)
+               return 0;
+
+       if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
+               return 0;
+
+       if (urb->status < 0) {
+               print_err_status(dev, -1, urb->status);
+               if (urb->status == -ENOENT)
+                       return 0;
+       }
+
+       for (i = 0; i < urb->number_of_packets; i++) {
+               int status = urb->iso_frame_desc[i].status;
+
+               if (status < 0) {
+                       print_err_status(dev, i, status);
+                       if (urb->iso_frame_desc[i].status != -EPROTO)
+                               continue;
+               }
+
+               dvb_dmx_swfilter(&dev->dvb->demux, urb->transfer_buffer +
+                                urb->iso_frame_desc[i].offset,
+                                urb->iso_frame_desc[i].actual_length);
+       }
+
+       return 0;
+}
+
+static int start_streaming(struct cx231xx_dvb *dvb)
+{
+       int rc;
+       struct cx231xx *dev = dvb->adapter.priv;
+
+       usb_set_interface(dev->udev, 0, 1);
+       rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
+       if (rc < 0)
+               return rc;
+
+       return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
+                                CX231XX_DVB_NUM_BUFS,
+                                CX231XX_DVB_MAX_PACKETSIZE, dvb_isoc_copy);
+}
+
+static int stop_streaming(struct cx231xx_dvb *dvb)
+{
+       struct cx231xx *dev = dvb->adapter.priv;
+
+       cx231xx_uninit_isoc(dev);
+
+       cx231xx_set_mode(dev, CX231XX_SUSPEND);
+
+       return 0;
+}
+
+static int start_feed(struct dvb_demux_feed *feed)
+{
+       struct dvb_demux *demux = feed->demux;
+       struct cx231xx_dvb *dvb = demux->priv;
+       int rc, ret;
+
+       if (!demux->dmx.frontend)
+               return -EINVAL;
+
+       mutex_lock(&dvb->lock);
+       dvb->nfeeds++;
+       rc = dvb->nfeeds;
+
+       if (dvb->nfeeds == 1) {
+               ret = start_streaming(dvb);
+               if (ret < 0)
+                       rc = ret;
+       }
+
+       mutex_unlock(&dvb->lock);
+       return rc;
+}
+
+static int stop_feed(struct dvb_demux_feed *feed)
+{
+       struct dvb_demux *demux = feed->demux;
+       struct cx231xx_dvb *dvb = demux->priv;
+       int err = 0;
+
+       mutex_lock(&dvb->lock);
+       dvb->nfeeds--;
+
+       if (0 == dvb->nfeeds)
+               err = stop_streaming(dvb);
+
+       mutex_unlock(&dvb->lock);
+       return err;
+}
+
+/* ------------------------------------------------------------------ */
+static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
+{
+       struct cx231xx *dev = fe->dvb->priv;
+
+       if (acquire)
+               return cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
+       else
+               return cx231xx_set_mode(dev, CX231XX_SUSPEND);
+}
+
+/* ------------------------------------------------------------------ */
+
+static struct xc5000_config cnxt_rde250_tunerconfig = {
+       .i2c_address = 0x61,
+       .if_khz = 5380,
+};
+
+/* ------------------------------------------------------------------ */
+#if 0
+static int attach_xc5000(u8 addr, struct cx231xx *dev)
+{
+
+       struct dvb_frontend *fe;
+       struct xc5000_config cfg;
+
+       memset(&cfg, 0, sizeof(cfg));
+       cfg.i2c_adap = &dev->i2c_bus[1].i2c_adap;
+       cfg.i2c_addr = addr;
+
+       if (!dev->dvb->frontend) {
+               printk(KERN_ERR "%s/2: dvb frontend not attached. "
+                      "Can't attach xc5000\n", dev->name);
+               return -EINVAL;
+       }
+
+       fe = dvb_attach(xc5000_attach, dev->dvb->frontend, &cfg);
+       if (!fe) {
+               printk(KERN_ERR "%s/2: xc5000 attach failed\n", dev->name);
+               dvb_frontend_detach(dev->dvb->frontend);
+               dev->dvb->frontend = NULL;
+               return -EINVAL;
+       }
+
+       printk(KERN_INFO "%s/2: xc5000 attached\n", dev->name);
+
+       return 0;
+}
+#endif
+
+int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
+{
+       int status = 0;
+
+       if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
+
+               struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
+
+               if (dops->set_analog_params != NULL) {
+                       struct analog_parameters params;
+
+                       params.frequency = freq;
+                       params.std = dev->norm;
+                       params.mode = 0;        /* 0- Air; 1 - cable */
+                       /*params.audmode = ;       */
+
+                       /* Set the analog parameters to set the frequency */
+                       cx231xx_info("Setting Frequency for XC5000\n");
+                       dops->set_analog_params(dev->dvb->frontend, &params);
+               }
+
+       }
+
+       return status;
+}
+
+int cx231xx_reset_analog_tuner(struct cx231xx *dev)
+{
+       int status = 0;
+
+       if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
+
+               struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
+
+               if (dops->init != NULL && !dev->xc_fw_load_done) {
+
+                       cx231xx_info("Reloading firmware for XC5000\n");
+                       status = dops->init(dev->dvb->frontend);
+                       if (status == 0) {
+                               dev->xc_fw_load_done = 1;
+                               cx231xx_info
+                                   ("XC5000 firmware download completed\n");
+                       } else {
+                               dev->xc_fw_load_done = 0;
+                               cx231xx_info
+                                   ("XC5000 firmware download failed !!!\n");
+                       }
+               }
+
+       }
+
+       return status;
+}
+
+/* ------------------------------------------------------------------ */
+
+static int register_dvb(struct cx231xx_dvb *dvb,
+                       struct module *module,
+                       struct cx231xx *dev, struct device *device)
+{
+       int result;
+
+       mutex_init(&dvb->lock);
+
+       /* register adapter */
+       result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
+                                     adapter_nr);
+       if (result < 0) {
+               printk(KERN_WARNING
+                      "%s: dvb_register_adapter failed (errno = %d)\n",
+                      dev->name, result);
+               goto fail_adapter;
+       }
+
+       /* Ensure all frontends negotiate bus access */
+       dvb->frontend->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
+
+       dvb->adapter.priv = dev;
+
+       /* register frontend */
+       result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
+       if (result < 0) {
+               printk(KERN_WARNING
+                      "%s: dvb_register_frontend failed (errno = %d)\n",
+                      dev->name, result);
+               goto fail_frontend;
+       }
+
+       /* register demux stuff */
+       dvb->demux.dmx.capabilities =
+           DMX_TS_FILTERING | DMX_SECTION_FILTERING |
+           DMX_MEMORY_BASED_FILTERING;
+       dvb->demux.priv = dvb;
+       dvb->demux.filternum = 256;
+       dvb->demux.feednum = 256;
+       dvb->demux.start_feed = start_feed;
+       dvb->demux.stop_feed = stop_feed;
+
+       result = dvb_dmx_init(&dvb->demux);
+       if (result < 0) {
+               printk(KERN_WARNING "%s: dvb_dmx_init failed (errno = %d)\n",
+                      dev->name, result);
+               goto fail_dmx;
+       }
+
+       dvb->dmxdev.filternum = 256;
+       dvb->dmxdev.demux = &dvb->demux.dmx;
+       dvb->dmxdev.capabilities = 0;
+       result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
+       if (result < 0) {
+               printk(KERN_WARNING "%s: dvb_dmxdev_init failed (errno = %d)\n",
+                      dev->name, result);
+               goto fail_dmxdev;
+       }
+
+       dvb->fe_hw.source = DMX_FRONTEND_0;
+       result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
+       if (result < 0) {
+               printk(KERN_WARNING
+                      "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
+                      dev->name, result);
+               goto fail_fe_hw;
+       }
+
+       dvb->fe_mem.source = DMX_MEMORY_FE;
+       result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
+       if (result < 0) {
+               printk(KERN_WARNING
+                      "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
+                      dev->name, result);
+               goto fail_fe_mem;
+       }
+
+       result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
+       if (result < 0) {
+               printk(KERN_WARNING
+                      "%s: connect_frontend failed (errno = %d)\n", dev->name,
+                      result);
+               goto fail_fe_conn;
+       }
+
+       /* register network adapter */
+       dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
+       return 0;
+
+fail_fe_conn:
+       dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
+fail_fe_mem:
+       dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
+fail_fe_hw:
+       dvb_dmxdev_release(&dvb->dmxdev);
+fail_dmxdev:
+       dvb_dmx_release(&dvb->demux);
+fail_dmx:
+       dvb_unregister_frontend(dvb->frontend);
+fail_frontend:
+       dvb_frontend_detach(dvb->frontend);
+       dvb_unregister_adapter(&dvb->adapter);
+fail_adapter:
+       return result;
+}
+
+static void unregister_dvb(struct cx231xx_dvb *dvb)
+{
+       dvb_net_release(&dvb->net);
+       dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
+       dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
+       dvb_dmxdev_release(&dvb->dmxdev);
+       dvb_dmx_release(&dvb->demux);
+       dvb_unregister_frontend(dvb->frontend);
+       dvb_frontend_detach(dvb->frontend);
+       dvb_unregister_adapter(&dvb->adapter);
+}
+
+static int dvb_init(struct cx231xx *dev)
+{
+       int result = 0;
+       struct cx231xx_dvb *dvb;
+
+       if (!dev->board.has_dvb) {
+               /* This device does not support the extension */
+               return 0;
+       }
+
+       dvb = kzalloc(sizeof(struct cx231xx_dvb), GFP_KERNEL);
+
+       if (dvb == NULL) {
+               printk(KERN_INFO "cx231xx_dvb: memory allocation failed\n");
+               return -ENOMEM;
+       }
+       dev->dvb = dvb;
+       dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
+       dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
+
+       cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
+       /* init frontend */
+       switch (dev->model) {
+       case CX231XX_BOARD_CNXT_RDE_250:
+
+               /* dev->dvb->frontend = dvb_attach(s5h1411_attach,
+                  &dvico_s5h1411_config,
+                  &dev->i2c_bus[1].i2c_adap); */
+               dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
+
+               if (dev->dvb->frontend == NULL) {
+                       printk(DRIVER_NAME
+                              ": Failed to attach dummy front end\n");
+                       result = -EINVAL;
+                       goto out_free;
+               }
+
+               /* define general-purpose callback pointer */
+               dvb->frontend->callback = cx231xx_tuner_callback;
+
+               if (dvb_attach(xc5000_attach, dev->dvb->frontend,
+                              &dev->i2c_bus[1].i2c_adap,
+                              &cnxt_rde250_tunerconfig) < 0) {
+                       result = -EINVAL;
+                       goto out_free;
+               }
+
+               break;
+       case CX231XX_BOARD_CNXT_RDU_250:
+
+               dev->dvb->frontend = dvb_attach(dvb_dummy_fe_ofdm_attach);
+
+               if (dev->dvb->frontend == NULL) {
+                       printk(DRIVER_NAME
+                              ": Failed to attach dummy front end\n");
+                       result = -EINVAL;
+                       goto out_free;
+               }
+
+               /* define general-purpose callback pointer */
+               dvb->frontend->callback = cx231xx_tuner_callback;
+
+               if (dvb_attach(xc5000_attach, dev->dvb->frontend,
+                              &dev->i2c_bus[1].i2c_adap,
+                              &cnxt_rde250_tunerconfig) < 0) {
+                       result = -EINVAL;
+                       goto out_free;
+               }
+               break;
+
+       default:
+               printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
+                      " isn't supported yet\n", dev->name);
+               break;
+       }
+       if (NULL == dvb->frontend) {
+               printk(KERN_ERR
+                      "%s/2: frontend initialization failed\n", dev->name);
+               result = -EINVAL;
+               goto out_free;
+       }
+
+       /* register everything */
+       result = register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);
+
+       if (result < 0)
+               goto out_free;
+
+       cx231xx_set_mode(dev, CX231XX_SUSPEND);
+       printk(KERN_INFO "Successfully loaded cx231xx-dvb\n");
+       return 0;
+
+out_free:
+       cx231xx_set_mode(dev, CX231XX_SUSPEND);
+       kfree(dvb);
+       dev->dvb = NULL;
+       return result;
+}
+
+static int dvb_fini(struct cx231xx *dev)
+{
+       if (!dev->board.has_dvb) {
+               /* This device does not support the extension */
+               return 0;
+       }
+
+       if (dev->dvb) {
+               unregister_dvb(dev->dvb);
+               dev->dvb = NULL;
+       }
+
+       return 0;
+}
+
+static struct cx231xx_ops dvb_ops = {
+       .id = CX231XX_DVB,
+       .name = "Cx231xx dvb Extension",
+       .init = dvb_init,
+       .fini = dvb_fini,
+};
+
+static int __init cx231xx_dvb_register(void)
+{
+       return cx231xx_register_extension(&dvb_ops);
+}
+
+static void __exit cx231xx_dvb_unregister(void)
+{
+       cx231xx_unregister_extension(&dvb_ops);
+}
+
+module_init(cx231xx_dvb_register);
+module_exit(cx231xx_dvb_unregister);
diff --git a/drivers/media/video/cx231xx/cx231xx-i2c.c b/drivers/media/video/cx231xx/cx231xx-i2c.c
new file mode 100644 (file)
index 0000000..b4a03d8
--- /dev/null
@@ -0,0 +1,555 @@
+/*
+   cx231xx-i2c.c - driver for Conexant Cx23100/101/102 USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+               Based on em28xx driver
+               Based on Cx23885 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.
+
+   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 <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/usb.h>
+#include <linux/i2c.h>
+#include <media/v4l2-common.h>
+#include <media/tuner.h>
+
+#include "cx231xx.h"
+
+/* ----------------------------------------------------------- */
+
+static unsigned int i2c_scan;
+module_param(i2c_scan, int, 0444);
+MODULE_PARM_DESC(i2c_scan, "scan i2c bus at insmod time");
+
+static unsigned int i2c_debug;
+module_param(i2c_debug, int, 0644);
+MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
+
+#define dprintk1(lvl, fmt, args...)                    \
+do {                                                   \
+       if (i2c_debug >= lvl) {                         \
+               printk(fmt, ##args);                    \
+               }                                       \
+} while (0)
+
+#define dprintk2(lvl, fmt, args...)                    \
+do {                                                   \
+       if (i2c_debug >= lvl) {                         \
+               printk(KERN_DEBUG "%s at %s: " fmt,     \
+                      dev->name, __func__ , ##args);   \
+      }                                                \
+} while (0)
+
+/*
+ * cx231xx_i2c_send_bytes()
+ */
+int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
+                          const struct i2c_msg *msg)
+{
+       struct cx231xx_i2c *bus = i2c_adap->algo_data;
+       struct cx231xx *dev = bus->dev;
+       struct cx231xx_i2c_xfer_data req_data;
+       int status = 0;
+       u16 size = 0;
+       u8 loop = 0;
+       u8 saddr_len = 1;
+       u8 *buf_ptr = NULL;
+       u16 saddr = 0;
+       u8 need_gpio = 0;
+
+       if ((bus->nr == 1) && (msg->addr == 0x61)
+           && (dev->tuner_type == TUNER_XC5000)) {
+
+               size = msg->len;
+
+               if (size == 2) {        /* register write sub addr */
+                       /* Just writing sub address will cause problem
+                       * to XC5000. So ignore the request */
+                       return 0;
+               } else if (size == 4) { /* register write with sub addr */
+                       if (msg->len >= 2)
+                               saddr = msg->buf[0] << 8 | msg->buf[1];
+                       else if (msg->len == 1)
+                               saddr = msg->buf[0];
+
+                       switch (saddr) {
+                       case 0x0000:    /* start tuner calibration mode */
+                               need_gpio = 1;
+                               /* FW Loading is done */
+                               dev->xc_fw_load_done = 1;
+                               break;
+                       case 0x000D:    /* Set signal source */
+                       case 0x0001:    /* Set TV standard - Video */
+                       case 0x0002:    /* Set TV standard - Audio */
+                       case 0x0003:    /* Set RF Frequency */
+                               need_gpio = 1;
+                               break;
+                       default:
+                               if (dev->xc_fw_load_done)
+                                       need_gpio = 1;
+                               break;
+                       }
+
+                       if (need_gpio) {
+                               dprintk1(1,
+                               "GPIO WRITE: addr 0x%x, len %d, saddr 0x%x\n",
+                               msg->addr, msg->len, saddr);
+
+                               return dev->cx231xx_gpio_i2c_write(dev,
+                                                                  msg->addr,
+                                                                  msg->buf,
+                                                                  msg->len);
+                       }
+               }
+
+               /* special case for Xc5000 tuner case */
+               saddr_len = 1;
+
+               /* adjust the length to correct length */
+               size -= saddr_len;
+               buf_ptr = (u8 *) (msg->buf + 1);
+
+               do {
+                       /* prepare xfer_data struct */
+                       req_data.dev_addr = msg->addr;
+                       req_data.direction = msg->flags;
+                       req_data.saddr_len = saddr_len;
+                       req_data.saddr_dat = msg->buf[0];
+                       req_data.buf_size = size > 16 ? 16 : size;
+                       req_data.p_buffer = (u8 *) (buf_ptr + loop * 16);
+
+                       bus->i2c_nostop = (size > 16) ? 1 : 0;
+                       bus->i2c_reserve = (loop == 0) ? 0 : 1;
+
+                       /* usb send command */
+                       status = dev->cx231xx_send_usb_command(bus, &req_data);
+                       loop++;
+
+                       if (size >= 16)
+                               size -= 16;
+                       else
+                               size = 0;
+
+               } while (size > 0);
+
+               bus->i2c_nostop = 0;
+               bus->i2c_reserve = 0;
+
+       } else {                /* regular case */
+
+               /* prepare xfer_data struct */
+               req_data.dev_addr = msg->addr;
+               req_data.direction = msg->flags;
+               req_data.saddr_len = 0;
+               req_data.saddr_dat = 0;
+               req_data.buf_size = msg->len;
+               req_data.p_buffer = msg->buf;
+
+               /* usb send command */
+               status = dev->cx231xx_send_usb_command(bus, &req_data);
+       }
+
+       return status < 0 ? status : 0;
+}
+
+/*
+ * cx231xx_i2c_recv_bytes()
+ * read a byte from the i2c device
+ */
+static int cx231xx_i2c_recv_bytes(struct i2c_adapter *i2c_adap,
+                                 const struct i2c_msg *msg)
+{
+       struct cx231xx_i2c *bus = i2c_adap->algo_data;
+       struct cx231xx *dev = bus->dev;
+       struct cx231xx_i2c_xfer_data req_data;
+       int status = 0;
+       u16 saddr = 0;
+       u8 need_gpio = 0;
+
+       if ((bus->nr == 1) && (msg->addr == 0x61)
+           && dev->tuner_type == TUNER_XC5000) {
+
+               if (msg->len == 2)
+                       saddr = msg->buf[0] << 8 | msg->buf[1];
+               else if (msg->len == 1)
+                       saddr = msg->buf[0];
+
+               if (dev->xc_fw_load_done) {
+
+                       switch (saddr) {
+                       case 0x0009:    /* BUSY check */
+                               dprintk1(1,
+                               "GPIO R E A D: Special case BUSY check \n");
+                               /*Try read BUSY register, just set it to zero*/
+                               msg->buf[0] = 0;
+                               if (msg->len == 2)
+                                       msg->buf[1] = 0;
+                               return 0;
+                       case 0x0004:    /* read Lock status */
+                               need_gpio = 1;
+                               break;
+
+                       }
+
+                       if (need_gpio) {
+                               /* this is a special case to handle Xceive tuner
+                               clock stretch issue with gpio based I2C */
+
+                               dprintk1(1,
+                               "GPIO R E A D: addr 0x%x, len %d, saddr 0x%x\n",
+                               msg->addr, msg->len,
+                               msg->buf[0] << 8 | msg->buf[1]);
+
+                               status =
+                                   dev->cx231xx_gpio_i2c_write(dev, msg->addr,
+                                                               msg->buf,
+                                                               msg->len);
+                               status =
+                                   dev->cx231xx_gpio_i2c_read(dev, msg->addr,
+                                                              msg->buf,
+                                                              msg->len);
+                               return status;
+                       }
+               }
+
+               /* prepare xfer_data struct */
+               req_data.dev_addr = msg->addr;
+               req_data.direction = msg->flags;
+               req_data.saddr_len = msg->len;
+               req_data.saddr_dat = msg->buf[0] << 8 | msg->buf[1];
+               req_data.buf_size = msg->len;
+               req_data.p_buffer = msg->buf;
+
+               /* usb send command */
+               status = dev->cx231xx_send_usb_command(bus, &req_data);
+
+       } else {
+
+               /* prepare xfer_data struct */
+               req_data.dev_addr = msg->addr;
+               req_data.direction = msg->flags;
+               req_data.saddr_len = 0;
+               req_data.saddr_dat = 0;
+               req_data.buf_size = msg->len;
+               req_data.p_buffer = msg->buf;
+
+               /* usb send command */
+               status = dev->cx231xx_send_usb_command(bus, &req_data);
+       }
+
+       return status < 0 ? status : 0;
+}
+
+/*
+ * cx231xx_i2c_recv_bytes_with_saddr()
+ * read a byte from the i2c device
+ */
+static int cx231xx_i2c_recv_bytes_with_saddr(struct i2c_adapter *i2c_adap,
+                                            const struct i2c_msg *msg1,
+                                            const struct i2c_msg *msg2)
+{
+       struct cx231xx_i2c *bus = i2c_adap->algo_data;
+       struct cx231xx *dev = bus->dev;
+       struct cx231xx_i2c_xfer_data req_data;
+       int status = 0;
+       u16 saddr = 0;
+       u8 need_gpio = 0;
+
+       if (msg1->len == 2)
+               saddr = msg1->buf[0] << 8 | msg1->buf[1];
+       else if (msg1->len == 1)
+               saddr = msg1->buf[0];
+
+       if ((bus->nr == 1) && (msg2->addr == 0x61)
+           && dev->tuner_type == TUNER_XC5000) {
+
+               if ((msg2->len < 16)) {
+
+                       dprintk1(1,
+                       "i2c_read: addr 0x%x, len %d, saddr 0x%x, len %d\n",
+                       msg2->addr, msg2->len, saddr, msg1->len);
+
+                       switch (saddr) {
+                       case 0x0008:    /* read FW load status */
+                               need_gpio = 1;
+                               break;
+                       case 0x0004:    /* read Lock status */
+                               need_gpio = 1;
+                               break;
+                       }
+
+                       if (need_gpio) {
+                               status =
+                                   dev->cx231xx_gpio_i2c_write(dev, msg1->addr,
+                                                               msg1->buf,
+                                                               msg1->len);
+                               status =
+                                   dev->cx231xx_gpio_i2c_read(dev, msg2->addr,
+                                                              msg2->buf,
+                                                              msg2->len);
+                               return status;
+                       }
+               }
+       }
+
+       /* prepare xfer_data struct */
+       req_data.dev_addr = msg2->addr;
+       req_data.direction = msg2->flags;
+       req_data.saddr_len = msg1->len;
+       req_data.saddr_dat = saddr;
+       req_data.buf_size = msg2->len;
+       req_data.p_buffer = msg2->buf;
+
+       /* usb send command */
+       status = dev->cx231xx_send_usb_command(bus, &req_data);
+
+       return status < 0 ? status : 0;
+}
+
+/*
+ * cx231xx_i2c_check_for_device()
+ * check if there is a i2c_device at the supplied address
+ */
+static int cx231xx_i2c_check_for_device(struct i2c_adapter *i2c_adap,
+                                       const struct i2c_msg *msg)
+{
+       struct cx231xx_i2c *bus = i2c_adap->algo_data;
+       struct cx231xx *dev = bus->dev;
+       struct cx231xx_i2c_xfer_data req_data;
+       int status = 0;
+
+       /* prepare xfer_data struct */
+       req_data.dev_addr = msg->addr;
+       req_data.direction = msg->flags;
+       req_data.saddr_len = 0;
+       req_data.saddr_dat = 0;
+       req_data.buf_size = 0;
+       req_data.p_buffer = NULL;
+
+       /* usb send command */
+       status = dev->cx231xx_send_usb_command(bus, &req_data);
+
+       return status < 0 ? status : 0;
+}
+
+/*
+ * cx231xx_i2c_xfer()
+ * the main i2c transfer function
+ */
+static int cx231xx_i2c_xfer(struct i2c_adapter *i2c_adap,
+                           struct i2c_msg msgs[], int num)
+{
+       struct cx231xx_i2c *bus = i2c_adap->algo_data;
+       struct cx231xx *dev = bus->dev;
+       int addr, rc, i, byte;
+
+       if (num <= 0)
+               return 0;
+
+       for (i = 0; i < num; i++) {
+
+               addr = msgs[i].addr >> 1;
+
+               dprintk2(2, "%s %s addr=%x len=%d:",
+                        (msgs[i].flags & I2C_M_RD) ? "read" : "write",
+                        i == num - 1 ? "stop" : "nonstop", addr, msgs[i].len);
+               if (!msgs[i].len) {
+                       /* no len: check only for device presence */
+                       rc = cx231xx_i2c_check_for_device(i2c_adap, &msgs[i]);
+                       if (rc < 0) {
+                               dprintk2(2, " no device\n");
+                               return rc;
+                       }
+
+               } else if (msgs[i].flags & I2C_M_RD) {
+                       /* read bytes */
+                       rc = cx231xx_i2c_recv_bytes(i2c_adap, &msgs[i]);
+                       if (i2c_debug >= 2) {
+                               for (byte = 0; byte < msgs[i].len; byte++)
+                                       printk(" %02x", msgs[i].buf[byte]);
+                       }
+               } else if (i + 1 < num && (msgs[i + 1].flags & I2C_M_RD) &&
+                          msgs[i].addr == msgs[i + 1].addr
+                          && (msgs[i].len <= 2) && (bus->nr < 2)) {
+                       /* read bytes */
+                       rc = cx231xx_i2c_recv_bytes_with_saddr(i2c_adap,
+                                                              &msgs[i],
+                                                              &msgs[i + 1]);
+                       if (i2c_debug >= 2) {
+                               for (byte = 0; byte < msgs[i].len; byte++)
+                                       printk(" %02x", msgs[i].buf[byte]);
+                       }
+                       i++;
+               } else {
+                       /* write bytes */
+                       if (i2c_debug >= 2) {
+                               for (byte = 0; byte < msgs[i].len; byte++)
+                                       printk(" %02x", msgs[i].buf[byte]);
+                       }
+                       rc = cx231xx_i2c_send_bytes(i2c_adap, &msgs[i]);
+               }
+               if (rc < 0)
+                       goto err;
+               if (i2c_debug >= 2)
+                       printk("\n");
+       }
+
+       return num;
+err:
+       dprintk2(2, " ERROR: %i\n", rc);
+       return rc;
+}
+
+/* ----------------------------------------------------------- */
+
+/*
+ * functionality()
+ */
+static u32 functionality(struct i2c_adapter *adap)
+{
+       return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C;
+}
+
+/*
+ * attach_inform()
+ * gets called when a device attaches to the i2c bus
+ * does some basic configuration
+ */
+static int attach_inform(struct i2c_client *client)
+{
+       struct cx231xx_i2c *bus = i2c_get_adapdata(client->adapter);
+       struct cx231xx *dev = bus->dev;
+
+       switch (client->addr << 1) {
+       case 0x8e:
+               {
+                       struct IR_i2c *ir = i2c_get_clientdata(client);
+                       dprintk1(1, "attach_inform: IR detected (%s).\n",
+                                ir->phys);
+                       cx231xx_set_ir(dev, ir);
+                       break;
+               }
+               break;
+
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+static struct i2c_algorithm cx231xx_algo = {
+       .master_xfer = cx231xx_i2c_xfer,
+       .functionality = functionality,
+};
+
+static struct i2c_adapter cx231xx_adap_template = {
+       .owner = THIS_MODULE,
+       .name = "cx231xx",
+       .id = I2C_HW_B_CX231XX,
+       .algo = &cx231xx_algo,
+       .client_register = attach_inform,
+};
+
+static struct i2c_client cx231xx_client_template = {
+       .name = "cx231xx internal",
+};
+
+/* ----------------------------------------------------------- */
+
+/*
+ * i2c_devs
+ * incomplete list of known devices
+ */
+static char *i2c_devs[128] = {
+       [0x60 >> 1] = "colibri",
+       [0x88 >> 1] = "hammerhead",
+       [0x8e >> 1] = "CIR",
+       [0x32 >> 1] = "GeminiIII",
+       [0x02 >> 1] = "Aquarius",
+       [0xa0 >> 1] = "eeprom",
+       [0xc0 >> 1] = "tuner/XC3028",
+       [0xc2 >> 1] = "tuner/XC5000",
+};
+
+/*
+ * cx231xx_do_i2c_scan()
+ * check i2c address range for devices
+ */
+void cx231xx_do_i2c_scan(struct cx231xx *dev, struct i2c_client *c)
+{
+       unsigned char buf;
+       int i, rc;
+
+       cx231xx_info(": Checking for I2C devices ..\n");
+       for (i = 0; i < 128; i++) {
+               c->addr = i;
+               rc = i2c_master_recv(c, &buf, 0);
+               if (rc < 0)
+                       continue;
+               cx231xx_info("%s: i2c scan: found device @ 0x%x  [%s]\n",
+                            dev->name, i << 1,
+                            i2c_devs[i] ? i2c_devs[i] : "???");
+       }
+       cx231xx_info(": Completed Checking for I2C devices.\n");
+}
+
+/*
+ * cx231xx_i2c_register()
+ * register i2c bus
+ */
+int cx231xx_i2c_register(struct cx231xx_i2c *bus)
+{
+       struct cx231xx *dev = bus->dev;
+
+       BUG_ON(!dev->cx231xx_send_usb_command);
+
+       memcpy(&bus->i2c_adap, &cx231xx_adap_template, sizeof(bus->i2c_adap));
+       memcpy(&bus->i2c_algo, &cx231xx_algo, sizeof(bus->i2c_algo));
+       memcpy(&bus->i2c_client, &cx231xx_client_template,
+              sizeof(bus->i2c_client));
+
+       bus->i2c_adap.dev.parent = &dev->udev->dev;
+
+       strlcpy(bus->i2c_adap.name, bus->dev->name, sizeof(bus->i2c_adap.name));
+
+       bus->i2c_algo.data = bus;
+       bus->i2c_adap.algo_data = bus;
+       i2c_set_adapdata(&bus->i2c_adap, &dev->v4l2_dev);
+       i2c_add_adapter(&bus->i2c_adap);
+
+       bus->i2c_client.adapter = &bus->i2c_adap;
+
+       if (0 == bus->i2c_rc) {
+               if (i2c_scan)
+                       cx231xx_do_i2c_scan(dev, &bus->i2c_client);
+       } else
+               cx231xx_warn("%s: i2c bus %d register FAILED\n",
+                            dev->name, bus->nr);
+
+       return bus->i2c_rc;
+}
+
+/*
+ * cx231xx_i2c_unregister()
+ * unregister i2c_bus
+ */
+int cx231xx_i2c_unregister(struct cx231xx_i2c *bus)
+{
+       i2c_del_adapter(&bus->i2c_adap);
+       return 0;
+}
diff --git a/drivers/media/video/cx231xx/cx231xx-input.c b/drivers/media/video/cx231xx/cx231xx-input.c
new file mode 100644 (file)
index 0000000..97e304c
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+  handle cx231xx IR remotes via linux kernel input layer.
+
+  Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+               Based on em28xx driver
+
+               < This is a place holder for IR now.>
+
+  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 <linux/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/input.h>
+#include <linux/usb.h>
+
+#include "cx231xx.h"
+
+static unsigned int ir_debug;
+module_param(ir_debug, int, 0644);
+MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]");
+
+#define i2cdprintk(fmt, arg...) \
+       if (ir_debug) { \
+               printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg); \
+       }
+
+#define dprintk(fmt, arg...) \
+       if (ir_debug) { \
+               printk(KERN_DEBUG "%s/ir: " fmt, ir->name , ## arg); \
+       }
+
+/**********************************************************
+ Polling structure used by cx231xx IR's
+ **********************************************************/
+
+struct cx231xx_ir_poll_result {
+       unsigned int toggle_bit:1;
+       unsigned int read_count:7;
+       u8 rc_address;
+       u8 rc_data[4];
+};
+
+struct cx231xx_IR {
+       struct cx231xx *dev;
+       struct input_dev *input;
+       struct ir_input_state ir;
+       char name[32];
+       char phys[32];
+
+       /* poll external decoder */
+       int polling;
+       struct work_struct work;
+       struct timer_list timer;
+       unsigned int last_toggle:1;
+       unsigned int last_readcount;
+       unsigned int repeat_interval;
+
+       int (*get_key) (struct cx231xx_IR *, struct cx231xx_ir_poll_result *);
+};
+
+/**********************************************************
+ Polling code for cx231xx
+ **********************************************************/
+
+static void cx231xx_ir_handle_key(struct cx231xx_IR *ir)
+{
+       int result;
+       int do_sendkey = 0;
+       struct cx231xx_ir_poll_result poll_result;
+
+       /* read the registers containing the IR status */
+       result = ir->get_key(ir, &poll_result);
+       if (result < 0) {
+               dprintk("ir->get_key() failed %d\n", result);
+               return;
+       }
+
+       dprintk("ir->get_key result tb=%02x rc=%02x lr=%02x data=%02x\n",
+               poll_result.toggle_bit, poll_result.read_count,
+               ir->last_readcount, poll_result.rc_data[0]);
+
+       if (ir->dev->chip_id == CHIP_ID_EM2874) {
+               /* The em2874 clears the readcount field every time the
+                  register is read.  The em2860/2880 datasheet says that it
+                  is supposed to clear the readcount, but it doesn't.  So with
+                  the em2874, we are looking for a non-zero read count as
+                  opposed to a readcount that is incrementing */
+               ir->last_readcount = 0;
+       }
+
+       if (poll_result.read_count == 0) {
+               /* The button has not been pressed since the last read */
+       } else if (ir->last_toggle != poll_result.toggle_bit) {
+               /* A button has been pressed */
+               dprintk("button has been pressed\n");
+               ir->last_toggle = poll_result.toggle_bit;
+               ir->repeat_interval = 0;
+               do_sendkey = 1;
+       } else if (poll_result.toggle_bit == ir->last_toggle &&
+                  poll_result.read_count > 0 &&
+                  poll_result.read_count != ir->last_readcount) {
+               /* The button is still being held down */
+               dprintk("button being held down\n");
+
+               /* Debouncer for first keypress */
+               if (ir->repeat_interval++ > 9) {
+                       /* Start repeating after 1 second */
+                       do_sendkey = 1;
+               }
+       }
+
+       if (do_sendkey) {
+               dprintk("sending keypress\n");
+               ir_input_keydown(ir->input, &ir->ir, poll_result.rc_data[0],
+                                poll_result.rc_data[0]);
+               ir_input_nokey(ir->input, &ir->ir);
+       }
+
+       ir->last_readcount = poll_result.read_count;
+       return;
+}
+
+static void ir_timer(unsigned long data)
+{
+       struct cx231xx_IR *ir = (struct cx231xx_IR *)data;
+
+       schedule_work(&ir->work);
+}
+
+static void cx231xx_ir_work(struct work_struct *work)
+{
+       struct cx231xx_IR *ir = container_of(work, struct cx231xx_IR, work);
+
+       cx231xx_ir_handle_key(ir);
+       mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling));
+}
+
+void cx231xx_ir_start(struct cx231xx_IR *ir)
+{
+       setup_timer(&ir->timer, ir_timer, (unsigned long)ir);
+       INIT_WORK(&ir->work, cx231xx_ir_work);
+       schedule_work(&ir->work);
+}
+
+static void cx231xx_ir_stop(struct cx231xx_IR *ir)
+{
+       del_timer_sync(&ir->timer);
+       flush_scheduled_work();
+}
+
+int cx231xx_ir_init(struct cx231xx *dev)
+{
+       struct cx231xx_IR *ir;
+       struct input_dev *input_dev;
+       u8 ir_config;
+       int err = -ENOMEM;
+
+       if (dev->board.ir_codes == NULL) {
+               /* No remote control support */
+               return 0;
+       }
+
+       ir = kzalloc(sizeof(*ir), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!ir || !input_dev)
+               goto err_out_free;
+
+       ir->input = input_dev;
+
+       /* Setup the proper handler based on the chip */
+       switch (dev->chip_id) {
+       default:
+               printk("Unrecognized cx231xx chip id: IR not supported\n");
+               goto err_out_free;
+       }
+
+       /* This is how often we ask the chip for IR information */
+       ir->polling = 100;      /* ms */
+
+       /* init input device */
+       snprintf(ir->name, sizeof(ir->name), "cx231xx IR (%s)", dev->name);
+
+       usb_make_path(dev->udev, ir->phys, sizeof(ir->phys));
+       strlcat(ir->phys, "/input0", sizeof(ir->phys));
+
+       ir_input_init(input_dev, &ir->ir, IR_TYPE_OTHER, dev->board.ir_codes);
+       input_dev->name = ir->name;
+       input_dev->phys = ir->phys;
+       input_dev->id.bustype = BUS_USB;
+       input_dev->id.version = 1;
+       input_dev->id.vendor = le16_to_cpu(dev->udev->descriptor.idVendor);
+       input_dev->id.product = le16_to_cpu(dev->udev->descriptor.idProduct);
+
+       input_dev->dev.parent = &dev->udev->dev;
+       /* record handles to ourself */
+       ir->dev = dev;
+       dev->ir = ir;
+
+       cx231xx_ir_start(ir);
+
+       /* all done */
+       err = input_register_device(ir->input);
+       if (err)
+               goto err_out_stop;
+
+       return 0;
+err_out_stop:
+       cx231xx_ir_stop(ir);
+       dev->ir = NULL;
+err_out_free:
+       input_free_device(input_dev);
+       kfree(ir);
+       return err;
+}
+
+int cx231xx_ir_fini(struct cx231xx *dev)
+{
+       struct cx231xx_IR *ir = dev->ir;
+
+       /* skip detach on non attached boards */
+       if (!ir)
+               return 0;
+
+       cx231xx_ir_stop(ir);
+       input_unregister_device(ir->input);
+       kfree(ir);
+
+       /* done */
+       dev->ir = NULL;
+       return 0;
+}
diff --git a/drivers/media/video/cx231xx/cx231xx-pcb-cfg.c b/drivers/media/video/cx231xx/cx231xx-pcb-cfg.c
new file mode 100644 (file)
index 0000000..7473c33
--- /dev/null
@@ -0,0 +1,795 @@
+/*
+   cx231xx-pcb-config.c - driver for Conexant
+               Cx23100/101/102 USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot 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; 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 "cx231xx.h"
+#include "cx231xx-conf-reg.h"
+
+static unsigned int pcb_debug;
+module_param(pcb_debug, int, 0644);
+MODULE_PARM_DESC(pcb_debug, "enable pcb config debug messages [video]");
+
+/******************************************************************************/
+
+struct pcb_config cx231xx_Scenario[] = {
+       {
+        INDEX_SELFPOWER_DIGITAL_ONLY,  /* index */
+        USB_SELF_POWER,        /* power_type */
+        0,                     /* speed , not decide yet */
+        MOD_DIGITAL,           /* mode */
+        SOURCE_TS_BDA,         /* ts1_source, digital tv only */
+        NOT_SUPPORTED,         /* ts2_source  */
+        NOT_SUPPORTED,         /* analog source */
+
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index   */
+        0,                     /* external_index */
+
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           NOT_SUPPORTED,      /* AUDIO */
+           NOT_SUPPORTED,      /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          ,
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        /* full-speed config */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           NOT_SUPPORTED,      /* AUDIO */
+           NOT_SUPPORTED,      /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+
+       {
+        INDEX_SELFPOWER_DUAL_DIGITAL,  /* index */
+        USB_SELF_POWER,        /* power_type */
+        0,                     /* speed , not decide yet */
+        MOD_DIGITAL,           /* mode */
+        SOURCE_TS_BDA,         /* ts1_source, digital tv only */
+        0,                     /* ts2_source,need update from register */
+        NOT_SUPPORTED,         /* analog source */
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index */
+        0,                     /* external_index */
+
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           2,                  /* TS2 index */
+           NOT_SUPPORTED,      /* AUDIO */
+           NOT_SUPPORTED,      /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        /* full-speed */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           2,                  /* TS2 index */
+           NOT_SUPPORTED,      /* AUDIO */
+           NOT_SUPPORTED,      /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+
+       {
+        INDEX_SELFPOWER_ANALOG_ONLY,   /* index */
+        USB_SELF_POWER,        /* power_type */
+        0,                     /* speed , not decide yet */
+        MOD_ANALOG | MOD_DIF | MOD_EXTERNAL,   /* mode ,analog tv only */
+        NOT_SUPPORTED,         /* ts1_source, NOT SUPPORT */
+        NOT_SUPPORTED,         /* ts2_source,NOT SUPPORT */
+        0,                     /* analog source, need update */
+
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index */
+        0,                     /* external_index */
+
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           NOT_SUPPORTED,      /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           1,                  /* AUDIO */
+           2,                  /* VIDEO */
+           3,                  /* VANC */
+           4,                  /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        /* full-speed */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           NOT_SUPPORTED,      /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           1,                  /* AUDIO */
+           2,                  /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+
+       {
+        INDEX_SELFPOWER_DUAL,  /* index */
+        USB_SELF_POWER,        /* power_type */
+        0,                     /* speed , not decide yet */
+        /* mode ,analog tv and digital path */
+        MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL,
+        0,                     /* ts1_source,will update in register */
+        NOT_SUPPORTED,         /* ts2_source,NOT SUPPORT */
+        0,                     /* analog source need update */
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index */
+        0,                     /* external_index */
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           2,                  /* AUDIO */
+           3,                  /* VIDEO */
+           4,                  /* VANC */
+           5,                  /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        /* full-speed */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           2,                  /* AUDIO */
+           3,                  /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+
+       {
+        INDEX_SELFPOWER_TRIPLE,        /* index */
+        USB_SELF_POWER,        /* power_type */
+        0,                     /* speed , not decide yet */
+        /* mode ,analog tv and digital path */
+        MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL,
+        0,                     /* ts1_source, update in register */
+        0,                     /* ts2_source,update in register */
+        0,                     /* analog source, need update */
+
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index */
+        0,                     /* external_index */
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           2,                  /* TS2 index */
+           3,                  /* AUDIO */
+           4,                  /* VIDEO */
+           5,                  /* VANC */
+           6,                  /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        /* full-speed */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           2,                  /* TS2 index */
+           3,                  /* AUDIO */
+           4,                  /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+
+       {
+        INDEX_SELFPOWER_COMPRESSOR,    /* index */
+        USB_SELF_POWER,        /* power_type */
+        0,                     /* speed , not decide yet */
+        /* mode ,analog tv AND DIGITAL path */
+        MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL,
+        NOT_SUPPORTED,         /* ts1_source, disable */
+        SOURCE_TS_BDA,         /* ts2_source */
+        0,                     /* analog source,need update */
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index */
+        0,                     /* external_index */
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           NOT_SUPPORTED,      /* ts1 index */
+           1,                  /* TS2 index */
+           2,                  /* AUDIO */
+           3,                  /* VIDEO */
+           4,                  /* VANC */
+           5,                  /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        /* full-speed  */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           NOT_SUPPORTED,      /* ts1 index */
+           1,                  /* TS2 index */
+           2,                  /* AUDIO */
+           3,                  /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+
+       {
+        INDEX_BUSPOWER_DIGITAL_ONLY,   /* index */
+        USB_BUS_POWER,         /* power_type */
+        0,                     /* speed , not decide yet */
+        MOD_DIGITAL,           /* mode ,analog tv AND DIGITAL path */
+        SOURCE_TS_BDA,         /* ts1_source, disable */
+        NOT_SUPPORTED,         /* ts2_source */
+        NOT_SUPPORTED,         /* analog source */
+
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index */
+        0,                     /* external_index */
+
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index  = 2 */
+           1,                  /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           NOT_SUPPORTED,      /* AUDIO */
+           NOT_SUPPORTED,      /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        /* full-speed */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index  = 2 */
+           1,                  /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           NOT_SUPPORTED,      /* AUDIO */
+           NOT_SUPPORTED,      /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+       {
+        INDEX_BUSPOWER_ANALOG_ONLY,    /* index */
+        USB_BUS_POWER,         /* power_type */
+        0,                     /* speed , not decide yet */
+        MOD_ANALOG,            /* mode ,analog tv AND DIGITAL path */
+        NOT_SUPPORTED,         /* ts1_source, disable */
+        NOT_SUPPORTED,         /* ts2_source */
+        SOURCE_ANALOG,         /* analog source--analog */
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index */
+        0,                     /* external_index */
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           NOT_SUPPORTED,      /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           1,                  /* AUDIO */
+           2,                  /* VIDEO */
+           3,                  /* VANC */
+           4,                  /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        {                      /* full-speed */
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           NOT_SUPPORTED,      /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           1,                  /* AUDIO */
+           2,                  /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+       {
+        INDEX_BUSPOWER_DIF_ONLY,       /* index */
+        USB_BUS_POWER,         /* power_type */
+        0,                     /* speed , not decide yet */
+        /* mode ,analog tv AND DIGITAL path */
+        MOD_DIF | MOD_ANALOG | MOD_DIGITAL | MOD_EXTERNAL,
+        SOURCE_TS_BDA,         /* ts1_source, disable */
+        NOT_SUPPORTED,         /* ts2_source */
+        SOURCE_DIF | SOURCE_ANALOG | SOURCE_EXTERNAL,  /* analog source, dif */
+        0,                     /* digital_index  */
+        0,                     /* analog index */
+        0,                     /* dif_index */
+        0,                     /* external_index */
+        1,                     /* only one configuration */
+        {
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           2,                  /* AUDIO */
+           3,                  /* VIDEO */
+           4,                  /* VANC */
+           5,                  /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        ,
+        {                      /* full speed */
+         {
+          0,                   /* config index */
+          {
+           0,                  /* interrupt ep index */
+           1,                  /* ts1 index */
+           NOT_SUPPORTED,      /* TS2 index */
+           2,                  /* AUDIO */
+           3,                  /* VIDEO */
+           NOT_SUPPORTED,      /* VANC */
+           NOT_SUPPORTED,      /* HANC */
+           NOT_SUPPORTED       /* ir_index */
+           }
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         ,
+         {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
+                          NOT_SUPPORTED}
+          }
+         }
+        }
+       ,
+
+};
+
+/*****************************************************************/
+
+u32 initialize_cx231xx(struct cx231xx *dev)
+{
+       u32 config_info = 0;
+       struct pcb_config *p_pcb_info;
+       u8 usb_speed = 1;       /* from register,1--HS, 0--FS  */
+       u8 data[4] = { 0, 0, 0, 0 };
+       u32 ts1_source = 0;
+       u32 ts2_source = 0;
+       u32 analog_source = 0;
+       u8 _current_scenario_idx = 0xff;
+
+       ts1_source = SOURCE_TS_BDA;
+       ts2_source = SOURCE_TS_BDA;
+
+       /* read board config register to find out which
+       pcb config it is related to */
+       cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, BOARD_CFG_STAT, data, 4);
+
+       config_info = *((u32 *) data);
+       usb_speed = (u8) (config_info & 0x1);
+
+       /* Verify this device belongs to Bus power or Self power device */
+       if (config_info & BUS_POWER) {  /* bus-power */
+               switch (config_info & BUSPOWER_MASK) {
+               case TS1_PORT | BUS_POWER:
+                       cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY].speed =
+                           usb_speed;
+                       p_pcb_info =
+                           &cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY];
+                       _current_scenario_idx = INDEX_BUSPOWER_DIGITAL_ONLY;
+                       break;
+               case AVDEC_ENABLE | BUS_POWER:
+                       cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY].speed =
+                           usb_speed;
+                       p_pcb_info =
+                           &cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY];
+                       _current_scenario_idx = INDEX_BUSPOWER_ANALOG_ONLY;
+                       break;
+               case AVDEC_ENABLE | BUS_POWER | TS1_PORT:
+                       cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY].speed =
+                           usb_speed;
+                       p_pcb_info = &cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY];
+                       _current_scenario_idx = INDEX_BUSPOWER_DIF_ONLY;
+                       break;
+               default:
+                       cx231xx_info("bad config in buspower!!!!\n");
+                       cx231xx_info("config_info=%x\n",
+                                    (config_info & BUSPOWER_MASK));
+                       return 1;
+               }
+       } else {                /* self-power */
+
+               switch (config_info & SELFPOWER_MASK) {
+               case TS1_PORT | SELF_POWER:
+                       cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY].speed =
+                           usb_speed;
+                       p_pcb_info =
+                           &cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY];
+                       _current_scenario_idx = INDEX_SELFPOWER_DIGITAL_ONLY;
+                       break;
+               case TS1_TS2_PORT | SELF_POWER:
+                       cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].speed =
+                           usb_speed;
+                       cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].
+                           ts2_source = ts2_source;
+                       p_pcb_info =
+                           &cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL];
+                       _current_scenario_idx = INDEX_SELFPOWER_DUAL_DIGITAL;
+                       break;
+               case AVDEC_ENABLE | SELF_POWER:
+                       cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].speed =
+                           usb_speed;
+                       cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].
+                           analog_source = analog_source;
+                       p_pcb_info =
+                           &cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY];
+                       _current_scenario_idx = INDEX_SELFPOWER_ANALOG_ONLY;
+                       break;
+               case AVDEC_ENABLE | TS1_PORT | SELF_POWER:
+                       cx231xx_Scenario[INDEX_SELFPOWER_DUAL].speed =
+                           usb_speed;
+                       cx231xx_Scenario[INDEX_SELFPOWER_DUAL].ts1_source =
+                           ts1_source;
+                       cx231xx_Scenario[INDEX_SELFPOWER_DUAL].analog_source =
+                           analog_source;
+                       p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_DUAL];
+                       _current_scenario_idx = INDEX_SELFPOWER_DUAL;
+                       break;
+               case AVDEC_ENABLE | TS1_TS2_PORT | SELF_POWER:
+                       cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].speed =
+                           usb_speed;
+                       cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts1_source =
+                           ts1_source;
+                       cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts2_source =
+                           ts2_source;
+                       cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].analog_source =
+                           analog_source;
+                       p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE];
+                       _current_scenario_idx = INDEX_SELFPOWER_TRIPLE;
+                       break;
+               case AVDEC_ENABLE | TS1VIP_TS2_PORT | SELF_POWER:
+                       cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].speed =
+                           usb_speed;
+                       cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].
+                           analog_source = analog_source;
+                       p_pcb_info =
+                           &cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR];
+                       _current_scenario_idx = INDEX_SELFPOWER_COMPRESSOR;
+                       break;
+               default:
+                       cx231xx_info("bad senario!!!!!\n");
+                       cx231xx_info("config_info=%x\n",
+                                    (config_info & SELFPOWER_MASK));
+                       return 1;
+               }
+       }
+
+       dev->current_scenario_idx = _current_scenario_idx;
+
+       memcpy(&dev->current_pcb_config, p_pcb_info,
+                  sizeof(struct pcb_config));
+
+       if (pcb_debug) {
+               cx231xx_info("SC(0x00) register = 0x%x\n", config_info);
+               cx231xx_info("scenario %d\n",
+                           (dev->current_pcb_config.index) + 1);
+               cx231xx_info("type=%x\n", dev->current_pcb_config.type);
+               cx231xx_info("mode=%x\n", dev->current_pcb_config.mode);
+               cx231xx_info("speed=%x\n", dev->current_pcb_config.speed);
+               cx231xx_info("ts1_source=%x\n",
+                            dev->current_pcb_config.ts1_source);
+               cx231xx_info("ts2_source=%x\n",
+                            dev->current_pcb_config.ts2_source);
+               cx231xx_info("analog_source=%x\n",
+                            dev->current_pcb_config.analog_source);
+       }
+
+       return 0;
+}
diff --git a/drivers/media/video/cx231xx/cx231xx-pcb-cfg.h b/drivers/media/video/cx231xx/cx231xx-pcb-cfg.h
new file mode 100644 (file)
index 0000000..f5e46e8
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+   cx231xx-pcb-cfg.h - driver for Conexant
+               Cx23100/101/102 USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot 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; 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 _PCB_CONFIG_H_
+#define _PCB_CONFIG_H_
+
+#include <linux/init.h>
+#include <linux/module.h>
+
+/***************************************************************************
+                               * Class Information *
+***************************************************************************/
+#define CLASS_DEFAULT       0xFF
+
+enum VENDOR_REQUEST_TYPE {
+       /* Set/Get I2C */
+       VRT_SET_I2C0 = 0x0,
+       VRT_SET_I2C1 = 0x1,
+       VRT_SET_I2C2 = 0x2,
+       VRT_GET_I2C0 = 0x4,
+       VRT_GET_I2C1 = 0x5,
+       VRT_GET_I2C2 = 0x6,
+
+       /* Set/Get GPIO */
+       VRT_SET_GPIO = 0x8,
+       VRT_GET_GPIO = 0x9,
+
+       /* Set/Get GPIE */
+       VRT_SET_GPIE = 0xA,
+       VRT_GET_GPIE = 0xB,
+
+       /* Set/Get Register Control/Status */
+       VRT_SET_REGISTER = 0xC,
+       VRT_GET_REGISTER = 0xD,
+
+       /* Get Extended Compat ID Descriptor */
+       VRT_GET_EXTCID_DESC = 0xFF,
+};
+
+enum BYTE_ENABLE_MASK {
+       ENABLE_ONE_BYTE = 0x1,
+       ENABLE_TWE_BYTE = 0x3,
+       ENABLE_THREE_BYTE = 0x7,
+       ENABLE_FOUR_BYTE = 0xF,
+};
+
+#define SPEED_MASK      0x1
+enum USB_SPEED{
+       FULL_SPEED = 0x0,       /* 0: full speed */
+       HIGH_SPEED = 0x1        /* 1: high speed */
+};
+
+enum _true_false{
+       FALSE = 0,
+       TRUE = 1
+};
+
+#define TS_MASK         0x6
+enum TS_PORT{
+       NO_TS_PORT = 0x0,       /* 2'b00: Neither port used. PCB not a Hybrid,
+                                  only offers Analog TV or Video */
+       TS1_PORT = 0x4,         /* 2'b10: TS1 Input (Hybrid mode :
+                               Digital or External Analog/Compressed source) */
+       TS1_TS2_PORT = 0x6,     /* 2'b11: TS1 & TS2 Inputs
+                               (Dual inputs from Digital and/or
+                               External Analog/Compressed sources) */
+       TS1_EXT_CLOCK = 0x6,    /* 2'b11: TS1 & TS2 as selector
+                                               to external clock */
+       TS1VIP_TS2_PORT = 0x2   /* 2'b01: TS1 used as 656/VIP Output,
+                                  TS2 Input (from Compressor) */
+};
+
+#define EAVP_MASK       0x8
+enum EAV_PRESENT{
+       NO_EXTERNAL_AV = 0x0,   /* 0: No External A/V inputs
+                                               (no need for i2s blcok),
+                                               Analog Tuner must be present */
+       EXTERNAL_AV = 0x8       /* 1: External A/V inputs
+                                               present (requires i2s blk) */
+};
+
+#define ATM_MASK        0x30
+enum AT_MODE{
+       DIF_TUNER = 0x30,       /* 2'b11: IF Tuner (requires use of DIF) */
+       BASEBAND_SOUND = 0x20,  /* 2'b10: Baseband Composite &
+                                               Sound-IF Signals present */
+       NO_TUNER = 0x10         /* 2'b0x: No Analog Tuner present */
+};
+
+#define PWR_SEL_MASK    0x40
+enum POWE_TYPE{
+       SELF_POWER = 0x0,       /* 0: self power */
+       BUS_POWER = 0x40        /* 1: bus power */
+};
+
+enum USB_POWE_TYPE{
+       USB_SELF_POWER = 0,
+       USB_BUS_POWER
+};
+
+#define BO_0_MASK       0x80
+enum AVDEC_STATUS{
+       AVDEC_DISABLE = 0x0,    /* 0: A/V Decoder Disabled */
+       AVDEC_ENABLE = 0x80     /* 1: A/V Decoder Enabled */
+};
+
+#define BO_1_MASK       0x100
+
+#define BUSPOWER_MASK   0xC4   /* for Polaris spec 0.8 */
+#define SELFPOWER_MASK  0x86
+
+/***************************************************************************/
+#define NOT_DECIDE_YET  0xFE
+#define NOT_SUPPORTED   0xFF
+
+/***************************************************************************
+                               * for mod field use *
+***************************************************************************/
+#define MOD_DIGITAL     0x1
+#define MOD_ANALOG      0x2
+#define MOD_DIF         0x4
+#define MOD_EXTERNAL    0x8
+#define CAP_ALL_MOD     0x0f
+
+/***************************************************************************
+                               * source define *
+***************************************************************************/
+#define SOURCE_DIGITAL          0x1
+#define SOURCE_ANALOG           0x2
+#define SOURCE_DIF              0x4
+#define SOURCE_EXTERNAL         0x8
+#define SOURCE_TS_BDA                  0x10
+#define SOURCE_TS_ENCODE               0x20
+#define SOURCE_TS_EXTERNAL     0x40
+
+/***************************************************************************
+                               * interface information define *
+***************************************************************************/
+struct INTERFACE_INFO {
+       u8 interrupt_index;
+       u8 ts1_index;
+       u8 ts2_index;
+       u8 audio_index;
+       u8 video_index;
+       u8 vanc_index;          /* VBI */
+       u8 hanc_index;          /* Sliced CC */
+       u8 ir_index;
+};
+
+enum INDEX_INTERFACE_INFO{
+       INDEX_INTERRUPT = 0x0,
+       INDEX_TS1,
+       INDEX_TS2,
+       INDEX_AUDIO,
+       INDEX_VIDEO,
+       INDEX_VANC,
+       INDEX_HANC,
+       INDEX_IR,
+};
+
+/***************************************************************************
+                               * configuration information define *
+***************************************************************************/
+struct CONFIG_INFO {
+       u8 config_index;
+       struct INTERFACE_INFO interface_info;
+};
+
+struct pcb_config {
+       u8 index;
+       u8 type;                /* bus power or self power,
+                                          self power--0, bus_power--1 */
+       u8 speed;               /* usb speed, 2.0--1, 1.1--0 */
+       u8 mode;                /* digital , anlog, dif or external A/V */
+       u32 ts1_source;         /* three source -- BDA,External,encode */
+       u32 ts2_source;
+       u32 analog_source;
+       u8 digital_index;       /* bus-power used */
+       u8 analog_index;        /* bus-power used */
+       u8 dif_index;           /* bus-power used */
+       u8 external_index;      /* bus-power used */
+       u8 config_num;          /* current config num, 0,1,2,
+                                                  for self-power, always 0 */
+       struct CONFIG_INFO hs_config_info[3];
+       struct CONFIG_INFO fs_config_info[3];
+};
+
+enum INDEX_PCB_CONFIG{
+       INDEX_SELFPOWER_DIGITAL_ONLY = 0x0,
+       INDEX_SELFPOWER_DUAL_DIGITAL,
+       INDEX_SELFPOWER_ANALOG_ONLY,
+       INDEX_SELFPOWER_DUAL,
+       INDEX_SELFPOWER_TRIPLE,
+       INDEX_SELFPOWER_COMPRESSOR,
+       INDEX_BUSPOWER_DIGITAL_ONLY,
+       INDEX_BUSPOWER_ANALOG_ONLY,
+       INDEX_BUSPOWER_DIF_ONLY,
+       INDEX_BUSPOWER_EXTERNAL_ONLY,
+       INDEX_BUSPOWER_EXTERNAL_ANALOG,
+       INDEX_BUSPOWER_EXTERNAL_DIF,
+       INDEX_BUSPOWER_EXTERNAL_DIGITAL,
+       INDEX_BUSPOWER_DIGITAL_ANALOG,
+       INDEX_BUSPOWER_DIGITAL_DIF,
+       INDEX_BUSPOWER_DIGITAL_ANALOG_EXTERNAL,
+       INDEX_BUSPOWER_DIGITAL_DIF_EXTERNAL,
+};
+
+/***************************************************************************/
+struct cx231xx;
+
+u32 initialize_cx231xx(struct cx231xx *p_dev);
+
+#endif
diff --git a/drivers/media/video/cx231xx/cx231xx-reg.h b/drivers/media/video/cx231xx/cx231xx-reg.h
new file mode 100644 (file)
index 0000000..750c5d3
--- /dev/null
@@ -0,0 +1,1564 @@
+/*
+   cx231xx-reg.h - driver for Conexant Cx23100/101/102
+              USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot 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; 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 _CX231XX_REG_H
+#define _CX231XX_REG_H
+
+/*****************************************************************************
+                               * VBI codes *
+*****************************************************************************/
+
+#define SAV_ACTIVE_VIDEO_FIELD1                0x80
+#define EAV_ACTIVE_VIDEO_FIELD1                0x90
+
+#define SAV_ACTIVE_VIDEO_FIELD2                0xc0
+#define EAV_ACTIVE_VIDEO_FIELD2                0xd0
+
+#define SAV_VBLANK_FIELD1              0xa0
+#define EAV_VBLANK_FIELD1              0xb0
+
+#define SAV_VBLANK_FIELD2              0xe0
+#define EAV_VBLANK_FIELD2              0xf0
+
+#define SAV_VBI_FIELD1                 0x20
+#define EAV_VBI_FIELD1                 0x30
+
+#define SAV_VBI_FIELD2                 0x60
+#define EAV_VBI_FIELD2                 0x70
+
+/*****************************************************************************/
+/* Audio ADC Registers */
+#define CH_PWR_CTRL1                   0x0000000e
+#define CH_PWR_CTRL2                   0x0000000f
+/*****************************************************************************/
+
+#define      HOST_REG1                0x000
+#define      FLD_FORCE_CHIP_SEL       0x80
+#define      FLD_AUTO_INC_DIS         0x20
+#define      FLD_PREFETCH_EN          0x10
+/* Reserved [2:3] */
+#define      FLD_DIGITAL_PWR_DN       0x02
+#define      FLD_SLEEP                0x01
+
+/*****************************************************************************/
+#define      HOST_REG2                0x001
+
+/*****************************************************************************/
+#define      HOST_REG3                0x002
+
+/*****************************************************************************/
+/* added for polaris */
+#define      GPIO_PIN_CTL0            0x3
+#define      GPIO_PIN_CTL1            0x4
+#define      GPIO_PIN_CTL2            0x5
+#define      GPIO_PIN_CTL3            0x6
+#define      TS1_PIN_CTL0             0x7
+#define      TS1_PIN_CTL1             0x8
+/*****************************************************************************/
+
+#define      FLD_CLK_IN_EN            0x80
+#define      FLD_XTAL_CTRL            0x70
+#define      FLD_BB_CLK_MODE          0x0C
+#define      FLD_REF_DIV_PLL          0x02
+#define      FLD_REF_SEL_PLL1         0x01
+
+/*****************************************************************************/
+#define      CHIP_CTRL                0x100
+/* Reserved [27] */
+/* Reserved [31:21] */
+#define      FLD_CHIP_ACFG_DIS        0x00100000
+/* Reserved [19] */
+#define      FLD_DUAL_MODE_ADC2       0x00040000
+#define      FLD_SIF_EN               0x00020000
+#define      FLD_SOFT_RST             0x00010000
+#define      FLD_DEVICE_ID            0x0000ffff
+
+/*****************************************************************************/
+#define      AFE_CTRL                 0x104
+#define      AFE_CTRL_C2HH_SRC_CTRL   0x104
+#define      FLD_DIF_OUT_SEL          0xc0000000
+#define      FLD_AUX_PLL_CLK_ALT_SEL  0x3c000000
+#define      FLD_UV_ORDER_MODE        0x02000000
+#define      FLD_FUNC_MODE            0x01800000
+#define      FLD_ROT1_PHASE_CTL       0x007f8000
+#define      FLD_AUD_IN_SEL           0x00004000
+#define      FLD_LUMA_IN_SEL          0x00002000
+#define      FLD_CHROMA_IN_SEL        0x00001000
+/* reserve [11:10] */
+#define      FLD_INV_SPEC_DIS         0x00000200
+#define      FLD_VGA_SEL_CH3          0x00000100
+#define      FLD_VGA_SEL_CH2          0x00000080
+#define      FLD_VGA_SEL_CH1          0x00000040
+#define      FLD_DCR_BYP_CH1          0x00000020
+#define      FLD_DCR_BYP_CH2          0x00000010
+#define      FLD_DCR_BYP_CH3          0x00000008
+#define      FLD_EN_12DB_CH3          0x00000004
+#define      FLD_EN_12DB_CH2          0x00000002
+#define      FLD_EN_12DB_CH1          0x00000001
+
+/* redefine in Cx231xx */
+/*****************************************************************************/
+#define      DC_CTRL1                 0x108
+/* reserve [31:30] */
+#define      FLD_CLAMP_LVL_CH1        0x3fff8000
+#define      FLD_CLAMP_LVL_CH2        0x00007fff
+/*****************************************************************************/
+
+/*****************************************************************************/
+#define      DC_CTRL2                 0x10c
+/* reserve [31:28] */
+#define      FLD_CLAMP_LVL_CH3        0x00fffe00
+#define      FLD_CLAMP_WIND_LENTH     0x000001e0
+#define      FLD_C2HH_SAT_MIN         0x0000001e
+#define      FLD_FLT_BYP_SEL          0x00000001
+/*****************************************************************************/
+
+/*****************************************************************************/
+#define      DC_CTRL3                 0x110
+/* reserve [31:16] */
+#define      FLD_ERR_GAIN_CTL         0x00070000
+#define      FLD_LPF_MIN              0x0000ffff
+/*****************************************************************************/
+
+/*****************************************************************************/
+#define      DC_CTRL4                 0x114
+/* reserve [31:31] */
+#define      FLD_INTG_CH1             0x7fffffff
+/*****************************************************************************/
+
+/*****************************************************************************/
+#define      DC_CTRL5                 0x118
+/* reserve [31:31] */
+#define      FLD_INTG_CH2             0x7fffffff
+/*****************************************************************************/
+
+/*****************************************************************************/
+#define      DC_CTRL6                 0x11c
+/* reserve [31:31] */
+#define      FLD_INTG_CH3             0x7fffffff
+/*****************************************************************************/
+
+/*****************************************************************************/
+#define      PIN_CTRL                 0x120
+#define      FLD_OEF_AGC_RF           0x00000001
+#define      FLD_OEF_AGC_IFVGA        0x00000002
+#define      FLD_OEF_AGC_IF           0x00000004
+#define      FLD_REG_BO_PUD           0x80000000
+#define      FLD_IR_IRQ_STAT          0x40000000
+#define      FLD_AUD_IRQ_STAT         0x20000000
+#define      FLD_VID_IRQ_STAT         0x10000000
+/* Reserved [27:26] */
+#define      FLD_IRQ_N_OUT_EN         0x02000000
+#define      FLD_IRQ_N_POLAR          0x01000000
+/* Reserved [23:6] */
+#define      FLD_OE_AUX_PLL_CLK       0x00000020
+#define      FLD_OE_I2S_BCLK          0x00000010
+#define      FLD_OE_I2S_WCLK          0x00000008
+#define      FLD_OE_AGC_IF            0x00000004
+#define      FLD_OE_AGC_IFVGA         0x00000002
+#define      FLD_OE_AGC_RF            0x00000001
+
+/*****************************************************************************/
+#define      AUD_IO_CTRL              0x124
+/* Reserved [31:8] */
+#define      FLD_I2S_PORT_DIR         0x00000080
+#define      FLD_I2S_OUT_SRC          0x00000040
+#define      FLD_AUD_CHAN3_SRC        0x00000030
+#define      FLD_AUD_CHAN2_SRC        0x0000000c
+#define      FLD_AUD_CHAN1_SRC        0x00000003
+
+/*****************************************************************************/
+#define      AUD_LOCK1                0x128
+#define      FLD_AUD_LOCK_KI_SHIFT    0xc0000000
+#define      FLD_AUD_LOCK_KD_SHIFT    0x30000000
+/* Reserved [27:25] */
+#define      FLD_EN_AV_LOCK           0x01000000
+#define      FLD_VID_COUNT            0x00ffffff
+
+/*****************************************************************************/
+#define      AUD_LOCK2                0x12c
+#define      FLD_AUD_LOCK_KI_MULT     0xf0000000
+#define      FLD_AUD_LOCK_KD_MULT     0x0F000000
+/* Reserved [23:22] */
+#define      FLD_AUD_LOCK_FREQ_SHIFT  0x00300000
+#define      FLD_AUD_COUNT            0x000fffff
+
+/*****************************************************************************/
+#define      AFE_DIAG_CTRL1           0x134
+/* Reserved [31:16] */
+#define      FLD_CUV_DLY_LENGTH       0x0000ff00
+#define      FLD_YC_DLY_LENGTH        0x000000ff
+
+/*****************************************************************************/
+/* Poalris redefine */
+#define      AFE_DIAG_CTRL3           0x138
+/* Reserved [31:26] */
+#define      FLD_AUD_DUAL_FLAG_POL    0x02000000
+#define      FLD_VID_DUAL_FLAG_POL    0x01000000
+/* Reserved [23:23] */
+#define      FLD_COL_CLAMP_DIS_CH1    0x00400000
+#define      FLD_COL_CLAMP_DIS_CH2    0x00200000
+#define      FLD_COL_CLAMP_DIS_CH3    0x00100000
+
+#define      TEST_CTRL1               0x144
+/* Reserved [31:29] */
+#define      FLD_LBIST_EN             0x10000000
+/* Reserved [27:10] */
+#define      FLD_FI_BIST_INTR_R       0x0000200
+#define      FLD_FI_BIST_INTR_L       0x0000100
+#define      FLD_BIST_FAIL_AUD_PLL    0x0000080
+#define      FLD_BIST_INTR_AUD_PLL    0x0000040
+#define      FLD_BIST_FAIL_VID_PLL    0x0000020
+#define      FLD_BIST_INTR_VID_PLL    0x0000010
+/* Reserved [3:1] */
+#define      FLD_CIR_TEST_DIS         0x00000001
+
+/*****************************************************************************/
+#define      TEST_CTRL2               0x148
+#define      FLD_TSXCLK_POL_CTL       0x80000000
+#define      FLD_ISO_CTL_SEL          0x40000000
+#define      FLD_ISO_CTL_EN           0x20000000
+#define      FLD_BIST_DEBUGZ          0x10000000
+#define      FLD_AUD_BIST_TEST_H      0x0f000000
+/* Reserved [23:22] */
+#define      FLD_FLTRN_BIST_TEST_H    0x00020000
+#define      FLD_VID_BIST_TEST_H      0x00010000
+/* Reserved [19:17] */
+#define      FLD_BIST_TEST_H          0x00010000
+/* Reserved [15:13] */
+#define      FLD_TAB_EN               0x00001000
+/* Reserved [11:0] */
+
+/*****************************************************************************/
+#define      BIST_STAT                0x14c
+#define      FLD_AUD_BIST_FAIL_H      0xfff00000
+#define      FLD_FLTRN_BIST_FAIL_H    0x00180000
+#define      FLD_VID_BIST_FAIL_H      0x00070000
+#define      FLD_AUD_BIST_TST_DONE    0x0000fff0
+#define      FLD_FLTRN_BIST_TST_DONE  0x00000008
+#define      FLD_VID_BIST_TST_DONE    0x00000007
+
+/*****************************************************************************/
+/* DirectIF registers definition have been moved to DIF_reg.h                */
+/*****************************************************************************/
+#define      MODE_CTRL                0x400
+#define      FLD_AFD_PAL60_DIS        0x20000000
+#define      FLD_AFD_FORCE_SECAM      0x10000000
+#define      FLD_AFD_FORCE_PALNC      0x08000000
+#define      FLD_AFD_FORCE_PAL        0x04000000
+#define      FLD_AFD_PALM_SEL         0x03000000
+#define      FLD_CKILL_MODE           0x00300000
+#define      FLD_COMB_NOTCH_MODE      0x00c00000       /* bit[19:18] */
+#define      FLD_CLR_LOCK_STAT        0x00020000
+#define      FLD_FAST_LOCK_MD         0x00010000
+#define      FLD_WCEN                 0x00008000
+#define      FLD_CAGCEN               0x00004000
+#define      FLD_CKILLEN              0x00002000
+#define      FLD_AUTO_SC_LOCK         0x00001000
+#define      FLD_MAN_SC_FAST_LOCK     0x00000800
+#define      FLD_INPUT_MODE           0x00000600
+#define      FLD_AFD_ACQUIRE          0x00000100
+#define      FLD_AFD_NTSC_SEL         0x00000080
+#define      FLD_AFD_PAL_SEL          0x00000040
+#define      FLD_ACFG_DIS             0x00000020
+#define      FLD_SQ_PIXEL             0x00000010
+#define      FLD_VID_FMT_SEL          0x0000000f
+
+/*****************************************************************************/
+#define      OUT_CTRL1                0x404
+#define      FLD_POLAR                0x7f000000
+/* Reserved [23] */
+#define      FLD_RND_MODE             0x00600000
+#define      FLD_VIPCLAMP_EN          0x00100000
+#define      FLD_VIPBLANK_EN          0x00080000
+#define      FLD_VIP_OPT_AL           0x00040000
+#define      FLD_IDID0_SOURCE         0x00020000
+#define      FLD_DCMODE               0x00010000
+#define      FLD_CLK_GATING           0x0000c000
+#define      FLD_CLK_INVERT           0x00002000
+#define      FLD_HSFMT                0x00001000
+#define      FLD_VALIDFMT             0x00000800
+#define      FLD_ACTFMT               0x00000400
+#define      FLD_SWAPRAW              0x00000200
+#define      FLD_CLAMPRAW_EN          0x00000100
+#define      FLD_BLUE_FIELD_EN        0x00000080
+#define      FLD_BLUE_FIELD_ACT       0x00000040
+#define      FLD_TASKBIT_VAL          0x00000020
+#define      FLD_ANC_DATA_EN          0x00000010
+#define      FLD_VBIHACTRAW_EN        0x00000008
+#define      FLD_MODE10B              0x00000004
+#define      FLD_OUT_MODE             0x00000003
+
+/*****************************************************************************/
+#define      OUT_CTRL2                0x408
+#define      FLD_AUD_GRP              0xc0000000
+#define      FLD_SAMPLE_RATE          0x30000000
+#define      FLD_AUD_ANC_EN           0x08000000
+#define      FLD_EN_C                 0x04000000
+#define      FLD_EN_B                 0x02000000
+#define      FLD_EN_A                 0x01000000
+/* Reserved [23:20] */
+#define      FLD_IDID1_LSB            0x000c0000
+#define      FLD_IDID0_LSB            0x00030000
+#define      FLD_IDID1_MSB            0x0000ff00
+#define      FLD_IDID0_MSB            0x000000ff
+
+/*****************************************************************************/
+#define      GEN_STAT                 0x40c
+#define      FLD_VCR_DETECT           0x00800000
+#define      FLD_SPECIAL_PLAY_N       0x00400000
+#define      FLD_VPRES                0x00200000
+#define      FLD_AGC_LOCK             0x00100000
+#define      FLD_CSC_LOCK             0x00080000
+#define      FLD_VLOCK                0x00040000
+#define      FLD_SRC_LOCK             0x00020000
+#define      FLD_HLOCK                0x00010000
+#define      FLD_VSYNC_N              0x00008000
+#define      FLD_SRC_FIFO_UFLOW       0x00004000
+#define      FLD_SRC_FIFO_OFLOW       0x00002000
+#define      FLD_FIELD                0x00001000
+#define      FLD_AFD_FMT_STAT         0x00000f00
+#define      FLD_MV_TYPE2_PAIR        0x00000080
+#define      FLD_MV_T3CS              0x00000040
+#define      FLD_MV_CS                0x00000020
+#define      FLD_MV_PSP               0x00000010
+/* Reserved [3] */
+#define      FLD_MV_CDAT              0x00000003
+
+/*****************************************************************************/
+#define      INT_STAT_MASK            0x410
+#define      FLD_COMB_3D_FIFO_MSK     0x80000000
+#define      FLD_WSS_DAT_AVAIL_MSK    0x40000000
+#define      FLD_GS2_DAT_AVAIL_MSK    0x20000000
+#define      FLD_GS1_DAT_AVAIL_MSK    0x10000000
+#define      FLD_CC_DAT_AVAIL_MSK     0x08000000
+#define      FLD_VPRES_CHANGE_MSK     0x04000000
+#define      FLD_MV_CHANGE_MSK        0x02000000
+#define      FLD_END_VBI_EVEN_MSK     0x01000000
+#define      FLD_END_VBI_ODD_MSK      0x00800000
+#define      FLD_FMT_CHANGE_MSK       0x00400000
+#define      FLD_VSYNC_TRAIL_MSK      0x00200000
+#define      FLD_HLOCK_CHANGE_MSK     0x00100000
+#define      FLD_VLOCK_CHANGE_MSK     0x00080000
+#define      FLD_CSC_LOCK_CHANGE_MSK  0x00040000
+#define      FLD_SRC_FIFO_UFLOW_MSK   0x00020000
+#define      FLD_SRC_FIFO_OFLOW_MSK   0x00010000
+#define      FLD_COMB_3D_FIFO_STAT    0x00008000
+#define      FLD_WSS_DAT_AVAIL_STAT   0x00004000
+#define      FLD_GS2_DAT_AVAIL_STAT   0x00002000
+#define      FLD_GS1_DAT_AVAIL_STAT   0x00001000
+#define      FLD_CC_DAT_AVAIL_STAT    0x00000800
+#define      FLD_VPRES_CHANGE_STAT    0x00000400
+#define      FLD_MV_CHANGE_STAT       0x00000200
+#define      FLD_END_VBI_EVEN_STAT    0x00000100
+#define      FLD_END_VBI_ODD_STAT     0x00000080
+#define      FLD_FMT_CHANGE_STAT      0x00000040
+#define      FLD_VSYNC_TRAIL_STAT     0x00000020
+#define      FLD_HLOCK_CHANGE_STAT    0x00000010
+#define      FLD_VLOCK_CHANGE_STAT    0x00000008
+#define      FLD_CSC_LOCK_CHANGE_STAT 0x00000004
+#define      FLD_SRC_FIFO_UFLOW_STAT  0x00000002
+#define      FLD_SRC_FIFO_OFLOW_STAT  0x00000001
+
+/*****************************************************************************/
+#define      LUMA_CTRL                0x414
+#define      BRIGHTNESS_CTRL_BYTE     0x414
+#define      CONTRAST_CTRL_BYTE       0x415
+#define      LUMA_CTRL_BYTE_3         0x416
+#define      FLD_LUMA_CORE_SEL        0x00c00000
+#define      FLD_RANGE                0x00300000
+/* Reserved [19] */
+#define      FLD_PEAK_EN              0x00040000
+#define      FLD_PEAK_SEL             0x00030000
+#define      FLD_CNTRST               0x0000ff00
+#define      FLD_BRITE                0x000000ff
+
+/*****************************************************************************/
+#define      HSCALE_CTRL              0x418
+#define      FLD_HFILT                0x03000000
+#define      FLD_HSCALE               0x00ffffff
+
+/*****************************************************************************/
+#define      VSCALE_CTRL              0x41c
+#define      FLD_LINE_AVG_DIS         0x01000000
+/* Reserved [23:20] */
+#define      FLD_VS_INTRLACE          0x00080000
+#define      FLD_VFILT                0x00070000
+/* Reserved [15:13] */
+#define      FLD_VSCALE               0x00001fff
+
+/*****************************************************************************/
+#define      CHROMA_CTRL              0x420
+#define      USAT_CTRL_BYTE           0x420
+#define      VSAT_CTRL_BYTE           0x421
+#define      HUE_CTRL_BYTE            0x422
+#define      FLD_C_LPF_EN             0x20000000
+#define      FLD_CHR_DELAY            0x1c000000
+#define      FLD_C_CORE_SEL           0x03000000
+#define      FLD_HUE                  0x00ff0000
+#define      FLD_VSAT                 0x0000ff00
+#define      FLD_USAT                 0x000000ff
+
+/*****************************************************************************/
+#define      VBI_LINE_CTRL1           0x424
+#define      FLD_VBI_MD_LINE4         0xff000000
+#define      FLD_VBI_MD_LINE3         0x00ff0000
+#define      FLD_VBI_MD_LINE2         0x0000ff00
+#define      FLD_VBI_MD_LINE1         0x000000ff
+
+/*****************************************************************************/
+#define      VBI_LINE_CTRL2           0x428
+#define      FLD_VBI_MD_LINE8         0xff000000
+#define      FLD_VBI_MD_LINE7         0x00ff0000
+#define      FLD_VBI_MD_LINE6         0x0000ff00
+#define      FLD_VBI_MD_LINE5         0x000000ff
+
+/*****************************************************************************/
+#define      VBI_LINE_CTRL3           0x42c
+#define      FLD_VBI_MD_LINE12        0xff000000
+#define      FLD_VBI_MD_LINE11        0x00ff0000
+#define      FLD_VBI_MD_LINE10        0x0000ff00
+#define      FLD_VBI_MD_LINE9         0x000000ff
+
+/*****************************************************************************/
+#define      VBI_LINE_CTRL4           0x430
+#define      FLD_VBI_MD_LINE16        0xff000000
+#define      FLD_VBI_MD_LINE15        0x00ff0000
+#define      FLD_VBI_MD_LINE14        0x0000ff00
+#define      FLD_VBI_MD_LINE13        0x000000ff
+
+/*****************************************************************************/
+#define      VBI_LINE_CTRL5           0x434
+#define      FLD_VBI_MD_LINE17        0x000000ff
+
+/*****************************************************************************/
+#define      VBI_FC_CFG               0x438
+#define      FLD_FC_ALT2              0xff000000
+#define      FLD_FC_ALT1              0x00ff0000
+#define      FLD_FC_ALT2_TYPE         0x0000f000
+#define      FLD_FC_ALT1_TYPE         0x00000f00
+/* Reserved [7:1] */
+#define      FLD_FC_SEARCH_MODE       0x00000001
+
+/*****************************************************************************/
+#define      VBI_MISC_CFG1            0x43c
+#define      FLD_TTX_PKTADRU          0xfff00000
+#define      FLD_TTX_PKTADRL          0x000fff00
+/* Reserved [7:6] */
+#define      FLD_MOJI_PACK_DIS        0x00000020
+#define      FLD_VPS_DEC_DIS          0x00000010
+#define      FLD_CRI_MARG_SCALE       0x0000000c
+#define      FLD_EDGE_RESYNC_EN       0x00000002
+#define      FLD_ADAPT_SLICE_DIS      0x00000001
+
+/*****************************************************************************/
+#define      VBI_MISC_CFG2            0x440
+#define      FLD_HAMMING_TYPE         0x0f000000
+/* Reserved [23:20] */
+#define      FLD_WSS_FIFO_RST         0x00080000
+#define      FLD_GS2_FIFO_RST         0x00040000
+#define      FLD_GS1_FIFO_RST         0x00020000
+#define      FLD_CC_FIFO_RST          0x00010000
+/* Reserved [15:12] */
+#define      FLD_VBI3_SDID            0x00000f00
+#define      FLD_VBI2_SDID            0x000000f0
+#define      FLD_VBI1_SDID            0x0000000f
+
+/*****************************************************************************/
+#define      VBI_PAY1                 0x444
+#define      FLD_GS1_FIFO_DAT         0xFF000000
+#define      FLD_GS1_STAT             0x00FF0000
+#define      FLD_CC_FIFO_DAT          0x0000FF00
+#define      FLD_CC_STAT              0x000000FF
+
+/*****************************************************************************/
+#define      VBI_PAY2                 0x448
+#define      FLD_WSS_FIFO_DAT         0xff000000
+#define      FLD_WSS_STAT             0x00ff0000
+#define      FLD_GS2_FIFO_DAT         0x0000ff00
+#define      FLD_GS2_STAT             0x000000ff
+
+/*****************************************************************************/
+#define      VBI_CUST1_CFG1           0x44c
+/* Reserved [31] */
+#define      FLD_VBI1_CRIWIN          0x7f000000
+#define      FLD_VBI1_SLICE_DIST      0x00f00000
+#define      FLD_VBI1_BITINC          0x000fff00
+#define      FLD_VBI1_HDELAY          0x000000ff
+
+/*****************************************************************************/
+#define      VBI_CUST1_CFG2           0x450
+#define      FLD_VBI1_FC_LENGTH       0x1f000000
+#define      FLD_VBI1_FRAME_CODE      0x00ffffff
+
+/*****************************************************************************/
+#define      VBI_CUST1_CFG3           0x454
+#define      FLD_VBI1_HAM_EN          0x80000000
+#define      FLD_VBI1_FIFO_MODE       0x70000000
+#define      FLD_VBI1_FORMAT_TYPE     0x0f000000
+#define      FLD_VBI1_PAYLD_LENGTH    0x00ff0000
+#define      FLD_VBI1_CRI_LENGTH      0x0000f000
+#define      FLD_VBI1_CRI_MARGIN      0x00000f00
+#define      FLD_VBI1_CRI_TIME        0x000000ff
+
+/*****************************************************************************/
+#define      VBI_CUST2_CFG1           0x458
+/* Reserved [31] */
+#define      FLD_VBI2_CRIWIN          0x7f000000
+#define      FLD_VBI2_SLICE_DIST      0x00f00000
+#define      FLD_VBI2_BITINC          0x000fff00
+#define      FLD_VBI2_HDELAY          0x000000ff
+
+/*****************************************************************************/
+#define      VBI_CUST2_CFG2           0x45c
+#define      FLD_VBI2_FC_LENGTH       0x1f000000
+#define      FLD_VBI2_FRAME_CODE      0x00ffffff
+
+/*****************************************************************************/
+#define      VBI_CUST2_CFG3           0x460
+#define      FLD_VBI2_HAM_EN          0x80000000
+#define      FLD_VBI2_FIFO_MODE       0x70000000
+#define      FLD_VBI2_FORMAT_TYPE     0x0f000000
+#define      FLD_VBI2_PAYLD_LENGTH    0x00ff0000
+#define      FLD_VBI2_CRI_LENGTH      0x0000f000
+#define      FLD_VBI2_CRI_MARGIN      0x00000f00
+#define      FLD_VBI2_CRI_TIME        0x000000ff
+
+/*****************************************************************************/
+#define      VBI_CUST3_CFG1           0x464
+/* Reserved [31] */
+#define      FLD_VBI3_CRIWIN          0x7f000000
+#define      FLD_VBI3_SLICE_DIST      0x00f00000
+#define      FLD_VBI3_BITINC          0x000fff00
+#define      FLD_VBI3_HDELAY          0x000000ff
+
+/*****************************************************************************/
+#define      VBI_CUST3_CFG2           0x468
+#define      FLD_VBI3_FC_LENGTH       0x1f000000
+#define      FLD_VBI3_FRAME_CODE      0x00ffffff
+
+/*****************************************************************************/
+#define      VBI_CUST3_CFG3           0x46c
+#define      FLD_VBI3_HAM_EN          0x80000000
+#define      FLD_VBI3_FIFO_MODE       0x70000000
+#define      FLD_VBI3_FORMAT_TYPE     0x0f000000
+#define      FLD_VBI3_PAYLD_LENGTH    0x00ff0000
+#define      FLD_VBI3_CRI_LENGTH      0x0000f000
+#define      FLD_VBI3_CRI_MARGIN      0x00000f00
+#define      FLD_VBI3_CRI_TIME        0x000000ff
+
+/*****************************************************************************/
+#define      HORIZ_TIM_CTRL           0x470
+#define      FLD_BGDEL_CNT            0xff000000
+/* Reserved [23:22] */
+#define      FLD_HACTIVE_CNT          0x003ff000
+/* Reserved [11:10] */
+#define      FLD_HBLANK_CNT           0x000003ff
+
+/*****************************************************************************/
+#define      VERT_TIM_CTRL            0x474
+#define      FLD_V656BLANK_CNT        0xff000000
+/* Reserved [23:22] */
+#define      FLD_VACTIVE_CNT          0x003ff000
+/* Reserved [11:10] */
+#define      FLD_VBLANK_CNT           0x000003ff
+
+/*****************************************************************************/
+#define      SRC_COMB_CFG             0x478
+#define      FLD_CCOMB_2LN_CHECK      0x80000000
+#define      FLD_CCOMB_3LN_EN         0x40000000
+#define      FLD_CCOMB_2LN_EN         0x20000000
+#define      FLD_CCOMB_3D_EN          0x10000000
+/* Reserved [27] */
+#define      FLD_LCOMB_3LN_EN         0x04000000
+#define      FLD_LCOMB_2LN_EN         0x02000000
+#define      FLD_LCOMB_3D_EN          0x01000000
+#define      FLD_LUMA_LPF_SEL         0x00c00000
+#define      FLD_UV_LPF_SEL           0x00300000
+#define      FLD_BLEND_SLOPE          0x000f0000
+#define      FLD_CCOMB_REDUCE_EN      0x00008000
+/* Reserved [14:10] */
+#define      FLD_SRC_DECIM_RATIO      0x000003ff
+
+/*****************************************************************************/
+#define      CHROMA_VBIOFF_CFG        0x47c
+#define      FLD_VBI_VOFFSET          0x1f000000
+/* Reserved [23:20] */
+#define      FLD_SC_STEP              0x000fffff
+
+/*****************************************************************************/
+#define      FIELD_COUNT              0x480
+#define      FLD_FIELD_COUNT_FLD      0x000003ff
+
+/*****************************************************************************/
+#define      MISC_TIM_CTRL            0x484
+#define      FLD_DEBOUNCE_COUNT       0xc0000000
+#define      FLD_VT_LINE_CNT_HYST     0x30000000
+/* Reserved [27] */
+#define      FLD_AFD_STAT             0x07ff0000
+#define      FLD_VPRES_VERT_EN        0x00008000
+/* Reserved [14:12] */
+#define      FLD_HR32                 0x00000800
+#define      FLD_TDALGN               0x00000400
+#define      FLD_TDFIELD              0x00000200
+/* Reserved [8:6] */
+#define      FLD_TEMPDEC              0x0000003f
+
+/*****************************************************************************/
+#define      DFE_CTRL1                0x488
+#define      FLD_CLAMP_AUTO_EN        0x80000000
+#define      FLD_AGC_AUTO_EN          0x40000000
+#define      FLD_VGA_CRUSH_EN         0x20000000
+#define      FLD_VGA_AUTO_EN          0x10000000
+#define      FLD_VBI_GATE_EN          0x08000000
+#define      FLD_CLAMP_LEVEL          0x07000000
+/* Reserved [23:22] */
+#define      FLD_CLAMP_SKIP_CNT       0x00300000
+#define      FLD_AGC_GAIN             0x000fff00
+/* Reserved [7:6] */
+#define      FLD_VGA_GAIN             0x0000003f
+
+/*****************************************************************************/
+#define      DFE_CTRL2                0x48c
+#define      FLD_VGA_ACQUIRE_RANGE    0x00ff0000
+#define      FLD_VGA_TRACK_RANGE      0x0000ff00
+#define      FLD_VGA_SYNC             0x000000ff
+
+/*****************************************************************************/
+#define      DFE_CTRL3                0x490
+#define      FLD_BP_PERCENT           0xff000000
+#define      FLD_DFT_THRESHOLD        0x00ff0000
+/* Reserved [15:12] */
+#define      FLD_SYNC_WIDTH_SEL       0x00000600
+#define      FLD_BP_LOOP_GAIN         0x00000300
+#define      FLD_SYNC_LOOP_GAIN       0x000000c0
+/* Reserved [5:4] */
+#define      FLD_AGC_LOOP_GAIN        0x0000000c
+#define      FLD_DCC_LOOP_GAIN        0x00000003
+
+/*****************************************************************************/
+#define      PLL_CTRL                 0x494
+#define      FLD_PLL_KD               0xff000000
+#define      FLD_PLL_KI               0x00ff0000
+#define      FLD_PLL_MAX_OFFSET       0x0000ffff
+
+/*****************************************************************************/
+#define      HTL_CTRL                 0x498
+/* Reserved [31:24] */
+#define      FLD_AUTO_LOCK_SPD        0x00080000
+#define      FLD_MAN_FAST_LOCK        0x00040000
+#define      FLD_HTL_15K_EN           0x00020000
+#define      FLD_HTL_500K_EN          0x00010000
+#define      FLD_HTL_KD               0x0000ff00
+#define      FLD_HTL_KI               0x000000ff
+
+/*****************************************************************************/
+#define      COMB_CTRL                0x49c
+#define      FLD_COMB_PHASE_LIMIT     0xff000000
+#define      FLD_CCOMB_ERR_LIMIT      0x00ff0000
+#define      FLD_LUMA_THRESHOLD       0x0000ff00
+#define      FLD_LCOMB_ERR_LIMIT      0x000000ff
+
+/*****************************************************************************/
+#define      CRUSH_CTRL               0x4a0
+#define      FLD_WTW_EN               0x00400000
+#define      FLD_CRUSH_FREQ           0x00200000
+#define      FLD_MAJ_SEL_EN           0x00100000
+#define      FLD_MAJ_SEL              0x000c0000
+/* Reserved [17:15] */
+#define      FLD_SYNC_TIP_REDUCE      0x00007e00
+/* Reserved [8:6] */
+#define      FLD_SYNC_TIP_INC         0x0000003f
+
+/*****************************************************************************/
+#define      SOFT_RST_CTRL            0x4a4
+#define      FLD_VD_SOFT_RST          0x00008000
+/* Reserved [14:12] */
+#define      FLD_REG_RST_MSK          0x00000800
+#define      FLD_VOF_RST_MSK          0x00000400
+#define      FLD_MVDET_RST_MSK        0x00000200
+#define      FLD_VBI_RST_MSK          0x00000100
+#define      FLD_SCALE_RST_MSK        0x00000080
+#define      FLD_CHROMA_RST_MSK       0x00000040
+#define      FLD_LUMA_RST_MSK         0x00000020
+#define      FLD_VTG_RST_MSK          0x00000010
+#define      FLD_YCSEP_RST_MSK        0x00000008
+#define      FLD_SRC_RST_MSK          0x00000004
+#define      FLD_DFE_RST_MSK          0x00000002
+/* Reserved [0] */
+
+/*****************************************************************************/
+#define      MV_DT_CTRL1              0x4a8
+/* Reserved [31:29] */
+#define      FLD_PSP_STOP_LINE        0x1f000000
+/* Reserved [23:21] */
+#define      FLD_PSP_STRT_LINE        0x001f0000
+/* Reserved [15] */
+#define      FLD_PSP_LLIMW            0x00007f00
+/* Reserved [7] */
+#define      FLD_PSP_ULIMW            0x0000007f
+
+/*****************************************************************************/
+#define      MV_DT_CTRL2              0x4aC
+#define      FLD_CS_STOPWIN           0xff000000
+#define      FLD_CS_STRTWIN           0x00ff0000
+#define      FLD_CS_WIDTH             0x0000ff00
+#define      FLD_PSP_SPEC_VAL         0x000000ff
+
+/*****************************************************************************/
+#define      MV_DT_CTRL3              0x4B0
+#define      FLD_AUTO_RATE_DIS        0x80000000
+#define      FLD_HLOCK_DIS            0x40000000
+#define      FLD_SEL_FIELD_CNT        0x20000000
+#define      FLD_CS_TYPE2_SEL         0x10000000
+#define      FLD_CS_LINE_THRSH_SEL    0x08000000
+#define      FLD_CS_ATHRESH_SEL       0x04000000
+#define      FLD_PSP_SPEC_SEL         0x02000000
+#define      FLD_PSP_LINES_SEL        0x01000000
+#define      FLD_FIELD_CNT            0x00f00000
+#define      FLD_CS_TYPE2_CNT         0x000fc000
+#define      FLD_CS_LINE_CNT          0x00003f00
+#define      FLD_CS_ATHRESH_LEV       0x000000ff
+
+/*****************************************************************************/
+#define      CHIP_VERSION             0x4b4
+/* Cx231xx redefine  */
+#define      VERSION                  0x4b4
+#define      FLD_REV_ID               0x000000ff
+
+/*****************************************************************************/
+#define      MISC_DIAG_CTRL           0x4b8
+/* Reserved [31:24] */
+#define      FLD_SC_CONVERGE_THRESH   0x00ff0000
+#define      FLD_CCOMB_ERR_LIMIT_3D   0x0000ff00
+#define      FLD_LCOMB_ERR_LIMIT_3D   0x000000ff
+
+/*****************************************************************************/
+#define      VBI_PASS_CTRL            0x4bc
+#define      FLD_VBI_PASS_MD          0x00200000
+#define      FLD_VBI_SETUP_DIS        0x00100000
+#define      FLD_PASS_LINE_CTRL       0x000fffff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      VCR_DET_CTRL             0x4c0
+#define      FLD_EN_FIELD_PHASE_DET   0x80000000
+#define      FLD_EN_HEAD_SW_DET       0x40000000
+#define      FLD_FIELD_PHASE_LENGTH   0x01ff0000
+/* Reserved [29:25] */
+#define      FLD_FIELD_PHASE_DELAY    0x0000ff00
+#define      FLD_FIELD_PHASE_LIMIT    0x000000f0
+#define      FLD_HEAD_SW_DET_LIMIT    0x0000000f
+
+/*****************************************************************************/
+#define      DL_CTL                   0x800
+#define      DL_CTL_ADDRESS_LOW       0x800    /* Byte 1 in DL_CTL */
+#define      DL_CTL_ADDRESS_HIGH      0x801    /* Byte 2 in DL_CTL */
+#define      DL_CTL_DATA              0x802    /* Byte 3 in DL_CTL */
+#define      DL_CTL_CONTROL           0x803    /* Byte 4 in DL_CTL */
+/* Reserved [31:5] */
+#define      FLD_START_8051           0x10000000
+#define      FLD_DL_ENABLE            0x08000000
+#define      FLD_DL_AUTO_INC          0x04000000
+#define      FLD_DL_MAP               0x03000000
+
+/*****************************************************************************/
+#define      STD_DET_STATUS           0x804
+#define      FLD_SPARE_STATUS1        0xff000000
+#define      FLD_SPARE_STATUS0        0x00ff0000
+#define      FLD_MOD_DET_STATUS1      0x0000ff00
+#define      FLD_MOD_DET_STATUS0      0x000000ff
+
+/*****************************************************************************/
+#define      AUD_BUILD_NUM            0x806
+#define      AUD_VER_NUM              0x807
+#define      STD_DET_CTL              0x808
+#define      STD_DET_CTL_AUD_CTL      0x808    /* Byte 1 in STD_DET_CTL */
+#define      STD_DET_CTL_PREF_MODE    0x809    /* Byte 2 in STD_DET_CTL */
+#define      FLD_SPARE_CTL0           0xff000000
+#define      FLD_DIS_DBX              0x00800000
+#define      FLD_DIS_BTSC             0x00400000
+#define      FLD_DIS_NICAM_A2         0x00200000
+#define      FLD_VIDEO_PRESENT        0x00100000
+#define      FLD_DW8051_VIDEO_FORMAT  0x000f0000
+#define      FLD_PREF_DEC_MODE        0x0000ff00
+#define      FLD_AUD_CONFIG           0x000000ff
+
+/*****************************************************************************/
+#define      DW8051_INT               0x80c
+#define      FLD_VIDEO_PRESENT_CHANGE 0x80000000
+#define      FLD_VIDEO_CHANGE         0x40000000
+#define      FLD_RDS_READY            0x20000000
+#define      FLD_AC97_INT             0x10000000
+#define      FLD_NICAM_BIT_ERROR_TOO_HIGH         0x08000000
+#define      FLD_NICAM_LOCK           0x04000000
+#define      FLD_NICAM_UNLOCK         0x02000000
+#define      FLD_DFT4_TH_CMP          0x01000000
+/* Reserved [23:22] */
+#define      FLD_LOCK_IND_INT         0x00200000
+#define      FLD_DFT3_TH_CMP          0x00100000
+#define      FLD_DFT2_TH_CMP          0x00080000
+#define      FLD_DFT1_TH_CMP          0x00040000
+#define      FLD_FM2_DFT_TH_CMP       0x00020000
+#define      FLD_FM1_DFT_TH_CMP       0x00010000
+#define      FLD_VIDEO_PRESENT_EN     0x00008000
+#define      FLD_VIDEO_CHANGE_EN      0x00004000
+#define      FLD_RDS_READY_EN         0x00002000
+#define      FLD_AC97_INT_EN          0x00001000
+#define      FLD_NICAM_BIT_ERROR_TOO_HIGH_EN      0x00000800
+#define      FLD_NICAM_LOCK_EN        0x00000400
+#define      FLD_NICAM_UNLOCK_EN      0x00000200
+#define      FLD_DFT4_TH_CMP_EN       0x00000100
+/* Reserved [7] */
+#define      FLD_DW8051_INT6_CTL1     0x00000040
+#define      FLD_DW8051_INT5_CTL1     0x00000020
+#define      FLD_DW8051_INT4_CTL1     0x00000010
+#define      FLD_DW8051_INT3_CTL1     0x00000008
+#define      FLD_DW8051_INT2_CTL1     0x00000004
+#define      FLD_DW8051_INT1_CTL1     0x00000002
+#define      FLD_DW8051_INT0_CTL1     0x00000001
+
+/*****************************************************************************/
+#define      GENERAL_CTL              0x810
+#define      FLD_RDS_INT              0x80000000
+#define      FLD_NBER_INT             0x40000000
+#define      FLD_NLL_INT              0x20000000
+#define      FLD_IFL_INT              0x10000000
+#define      FLD_FDL_INT              0x08000000
+#define      FLD_AFC_INT              0x04000000
+#define      FLD_AMC_INT              0x02000000
+#define      FLD_AC97_INT_CTL         0x01000000
+#define      FLD_RDS_INT_DIS          0x00800000
+#define      FLD_NBER_INT_DIS         0x00400000
+#define      FLD_NLL_INT_DIS          0x00200000
+#define      FLD_IFL_INT_DIS          0x00100000
+#define      FLD_FDL_INT_DIS          0x00080000
+#define      FLD_FC_INT_DIS           0x00040000
+#define      FLD_AMC_INT_DIS          0x00020000
+#define      FLD_AC97_INT_DIS         0x00010000
+#define      FLD_REV_NUM              0x0000ff00
+/* Reserved [7:5] */
+#define      FLD_DBX_SOFT_RESET_REG   0x00000010
+#define      FLD_AD_SOFT_RESET_REG    0x00000008
+#define      FLD_SRC_SOFT_RESET_REG   0x00000004
+#define      FLD_CDMOD_SOFT_RESET     0x00000002
+#define      FLD_8051_SOFT_RESET      0x00000001
+
+/*****************************************************************************/
+#define      AAGC_CTL                 0x814
+#define      FLD_AFE_12DB_EN          0x80000000
+#define      FLD_AAGC_DEFAULT_EN      0x40000000
+#define      FLD_AAGC_DEFAULT         0x3f000000
+/* Reserved [23] */
+#define      FLD_AAGC_GAIN            0x00600000
+#define      FLD_AAGC_TH              0x001f0000
+/* Reserved [15:14] */
+#define      FLD_AAGC_HYST2           0x00003f00
+/* Reserved [7:6] */
+#define      FLD_AAGC_HYST1           0x0000003f
+
+/*****************************************************************************/
+#define      IF_SRC_CTL               0x818
+#define      FLD_DBX_BYPASS           0x80000000
+/* Reserved [30:25] */
+#define      FLD_IF_SRC_MODE          0x01000000
+/* Reserved [23:18] */
+#define      FLD_IF_SRC_PHASE_INC     0x0001ffff
+
+/*****************************************************************************/
+#define      ANALOG_DEMOD_CTL         0x81c
+#define      FLD_ROT1_PHACC_PROG      0xffff0000
+/* Reserved [15] */
+#define      FLD_FM1_DELAY_FIX        0x00007000
+#define      FLD_PDF4_SHIFT           0x00000c00
+#define      FLD_PDF3_SHIFT           0x00000300
+#define      FLD_PDF2_SHIFT           0x000000c0
+#define      FLD_PDF1_SHIFT           0x00000030
+#define      FLD_FMBYPASS_MODE2       0x00000008
+#define      FLD_FMBYPASS_MODE1       0x00000004
+#define      FLD_NICAM_MODE           0x00000002
+#define      FLD_BTSC_FMRADIO_MODE    0x00000001
+
+/*****************************************************************************/
+#define      ROT_FREQ_CTL             0x820
+#define      FLD_ROT3_PHACC_PROG      0xffff0000
+#define      FLD_ROT2_PHACC_PROG      0x0000ffff
+
+/*****************************************************************************/
+#define      FM_CTL                   0x824
+#define      FLD_FM2_DC_FB_SHIFT      0xf0000000
+#define      FLD_FM2_DC_INT_SHIFT     0x0f000000
+#define      FLD_FM2_AFC_RESET        0x00800000
+#define      FLD_FM2_DC_PASS_IN       0x00400000
+#define      FLD_FM2_DAGC_SHIFT       0x00380000
+#define      FLD_FM2_CORDIC_SHIFT     0x00070000
+#define      FLD_FM1_DC_FB_SHIFT      0x0000f000
+#define      FLD_FM1_DC_INT_SHIFT     0x00000f00
+#define      FLD_FM1_AFC_RESET        0x00000080
+#define      FLD_FM1_DC_PASS_IN       0x00000040
+#define      FLD_FM1_DAGC_SHIFT       0x00000038
+#define      FLD_FM1_CORDIC_SHIFT     0x00000007
+
+/*****************************************************************************/
+#define      LPF_PDF_CTL              0x828
+/* Reserved [31:30] */
+#define      FLD_LPF32_SHIFT1         0x30000000
+#define      FLD_LPF32_SHIFT2         0x0c000000
+#define      FLD_LPF160_SHIFTA        0x03000000
+#define      FLD_LPF160_SHIFTB        0x00c00000
+#define      FLD_LPF160_SHIFTC        0x00300000
+#define      FLD_LPF32_COEF_SEL2      0x000c0000
+#define      FLD_LPF32_COEF_SEL1      0x00030000
+#define      FLD_LPF160_COEF_SELC     0x0000c000
+#define      FLD_LPF160_COEF_SELB     0x00003000
+#define      FLD_LPF160_COEF_SELA     0x00000c00
+#define      FLD_LPF160_IN_EN_REG     0x00000300
+#define      FLD_PDF4_PDF_SEL         0x000000c0
+#define      FLD_PDF3_PDF_SEL         0x00000030
+#define      FLD_PDF2_PDF_SEL         0x0000000c
+#define      FLD_PDF1_PDF_SEL         0x00000003
+
+/*****************************************************************************/
+#define      DFT1_CTL1                0x82c
+#define      FLD_DFT1_DWELL           0xffff0000
+#define      FLD_DFT1_FREQ            0x0000ffff
+
+/*****************************************************************************/
+#define      DFT1_CTL2                0x830
+#define      FLD_DFT1_THRESHOLD       0xffffff00
+#define      FLD_DFT1_CMP_CTL         0x00000080
+#define      FLD_DFT1_AVG             0x00000070
+/* Reserved [3:1] */
+#define      FLD_DFT1_START           0x00000001
+
+/*****************************************************************************/
+#define      DFT1_STATUS              0x834
+#define      FLD_DFT1_DONE            0x80000000
+#define      FLD_DFT1_TH_CMP_STAT     0x40000000
+#define      FLD_DFT1_RESULT          0x3fffffff
+
+/*****************************************************************************/
+#define      DFT2_CTL1                0x838
+#define      FLD_DFT2_DWELL           0xffff0000
+#define      FLD_DFT2_FREQ            0x0000ffff
+
+/*****************************************************************************/
+#define      DFT2_CTL2                0x83C
+#define      FLD_DFT2_THRESHOLD       0xffffff00
+#define      FLD_DFT2_CMP_CTL         0x00000080
+#define      FLD_DFT2_AVG             0x00000070
+/* Reserved [3:1] */
+#define      FLD_DFT2_START           0x00000001
+
+/*****************************************************************************/
+#define      DFT2_STATUS              0x840
+#define      FLD_DFT2_DONE            0x80000000
+#define      FLD_DFT2_TH_CMP_STAT     0x40000000
+#define      FLD_DFT2_RESULT          0x3fffffff
+
+/*****************************************************************************/
+#define      DFT3_CTL1                0x844
+#define      FLD_DFT3_DWELL           0xffff0000
+#define      FLD_DFT3_FREQ            0x0000ffff
+
+/*****************************************************************************/
+#define      DFT3_CTL2                0x848
+#define      FLD_DFT3_THRESHOLD       0xffffff00
+#define      FLD_DFT3_CMP_CTL         0x00000080
+#define      FLD_DFT3_AVG             0x00000070
+/* Reserved [3:1] */
+#define      FLD_DFT3_START           0x00000001
+
+/*****************************************************************************/
+#define      DFT3_STATUS              0x84c
+#define      FLD_DFT3_DONE            0x80000000
+#define      FLD_DFT3_TH_CMP_STAT     0x40000000
+#define      FLD_DFT3_RESULT          0x3fffffff
+
+/*****************************************************************************/
+#define      DFT4_CTL1                0x850
+#define      FLD_DFT4_DWELL           0xffff0000
+#define      FLD_DFT4_FREQ            0x0000ffff
+
+/*****************************************************************************/
+#define      DFT4_CTL2                0x854
+#define      FLD_DFT4_THRESHOLD       0xffffff00
+#define      FLD_DFT4_CMP_CTL         0x00000080
+#define      FLD_DFT4_AVG             0x00000070
+/* Reserved [3:1] */
+#define      FLD_DFT4_START           0x00000001
+
+/*****************************************************************************/
+#define      DFT4_STATUS              0x858
+#define      FLD_DFT4_DONE            0x80000000
+#define      FLD_DFT4_TH_CMP_STAT     0x40000000
+#define      FLD_DFT4_RESULT          0x3fffffff
+
+/*****************************************************************************/
+#define      AM_MTS_DET               0x85c
+#define      FLD_AM_MTS_MODE          0x80000000
+/* Reserved [30:26] */
+#define      FLD_AM_SUB               0x02000000
+#define      FLD_AM_GAIN_EN           0x01000000
+/* Reserved [23:16] */
+#define      FLD_AMMTS_GAIN_SCALE     0x0000e000
+#define      FLD_MTS_PDF_SHIFT        0x00001800
+#define      FLD_AM_REG_GAIN          0x00000700
+#define      FLD_AGC_REF              0x000000ff
+
+/*****************************************************************************/
+#define      ANALOG_MUX_CTL           0x860
+/* Reserved [31:29] */
+#define      FLD_MUX21_SEL            0x10000000
+#define      FLD_MUX20_SEL            0x08000000
+#define      FLD_MUX19_SEL            0x04000000
+#define      FLD_MUX18_SEL            0x02000000
+#define      FLD_MUX17_SEL            0x01000000
+#define      FLD_MUX16_SEL            0x00800000
+#define      FLD_MUX15_SEL            0x00400000
+#define      FLD_MUX14_SEL            0x00300000
+#define      FLD_MUX13_SEL            0x000C0000
+#define      FLD_MUX12_SEL            0x00020000
+#define      FLD_MUX11_SEL            0x00018000
+#define      FLD_MUX10_SEL            0x00004000
+#define      FLD_MUX9_SEL             0x00002000
+#define      FLD_MUX8_SEL             0x00001000
+#define      FLD_MUX7_SEL             0x00000800
+#define      FLD_MUX6_SEL             0x00000600
+#define      FLD_MUX5_SEL             0x00000100
+#define      FLD_MUX4_SEL             0x000000c0
+#define      FLD_MUX3_SEL             0x00000030
+#define      FLD_MUX2_SEL             0x0000000c
+#define      FLD_MUX1_SEL             0x00000003
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DPLL_CTRL1               0x864
+#define      DIG_PLL_CTL1             0x864
+
+#define      FLD_PLL_STATUS           0x07000000
+#define      FLD_BANDWIDTH_SELECT     0x00030000
+#define      FLD_PLL_SHIFT_REG        0x00007000
+#define      FLD_PHASE_SHIFT          0x000007ff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DPLL_CTRL2               0x868
+#define      DIG_PLL_CTL2             0x868
+#define      FLD_PLL_UNLOCK_THR       0xff000000
+#define      FLD_PLL_LOCK_THR         0x00ff0000
+/* Reserved [15:8] */
+#define      FLD_AM_PDF_SEL2          0x000000c0
+#define      FLD_AM_PDF_SEL1          0x00000030
+#define      FLD_DPLL_FSM_CTRL        0x0000000c
+/* Reserved [1] */
+#define      FLD_PLL_PILOT_DET        0x00000001
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DPLL_CTRL3               0x86c
+#define      DIG_PLL_CTL3             0x86c
+#define      FLD_DISABLE_LOOP         0x01000000
+#define      FLD_A1_DS1_SEL           0x000c0000
+#define      FLD_A1_DS2_SEL           0x00030000
+#define      FLD_A1_KI                0x0000ff00
+#define      FLD_A1_KD                0x000000ff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DPLL_CTRL4               0x870
+#define      DIG_PLL_CTL4             0x870
+#define      FLD_A2_DS1_SEL           0x000c0000
+#define      FLD_A2_DS2_SEL           0x00030000
+#define      FLD_A2_KI                0x0000ff00
+#define      FLD_A2_KD                0x000000ff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DPLL_CTRL5               0x874
+#define      DIG_PLL_CTL5             0x874
+#define      FLD_TRK_DS1_SEL          0x000c0000
+#define      FLD_TRK_DS2_SEL          0x00030000
+#define      FLD_TRK_KI               0x0000ff00
+#define      FLD_TRK_KD               0x000000ff
+
+/*****************************************************************************/
+#define      DEEMPH_GAIN_CTL          0x878
+#define      FLD_DEEMPH2_GAIN         0xFFFF0000
+#define      FLD_DEEMPH1_GAIN         0x0000FFFF
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DEEMPH_COEFF1            0x87c
+#define      DEEMPH_COEF1             0x87c
+#define      FLD_DEEMPH_B0            0xffff0000
+#define      FLD_DEEMPH_A0            0x0000ffff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DEEMPH_COEFF2            0x880
+#define      DEEMPH_COEF2             0x880
+#define      FLD_DEEMPH_B1            0xFFFF0000
+#define      FLD_DEEMPH_A1            0x0000FFFF
+
+/*****************************************************************************/
+#define      DBX1_CTL1                0x884
+#define      FLD_DBX1_WBE_GAIN        0xffff0000
+#define      FLD_DBX1_IN_GAIN         0x0000ffff
+
+/*****************************************************************************/
+#define      DBX1_CTL2                0x888
+#define      FLD_DBX1_SE_BYPASS       0xffff0000
+#define      FLD_DBX1_SE_GAIN         0x0000ffff
+
+/*****************************************************************************/
+#define      DBX1_RMS_SE              0x88C
+#define      FLD_DBX1_RMS_WBE         0xffff0000
+#define      FLD_DBX1_RMS_SE_FLD      0x0000ffff
+
+/*****************************************************************************/
+#define      DBX2_CTL1                0x890
+#define      FLD_DBX2_WBE_GAIN        0xffff0000
+#define      FLD_DBX2_IN_GAIN         0x0000ffff
+
+/*****************************************************************************/
+#define      DBX2_CTL2                0x894
+#define      FLD_DBX2_SE_BYPASS       0xffff0000
+#define      FLD_DBX2_SE_GAIN         0x0000ffff
+
+/*****************************************************************************/
+#define      DBX2_RMS_SE              0x898
+#define      FLD_DBX2_RMS_WBE         0xffff0000
+#define      FLD_DBX2_RMS_SE_FLD      0x0000ffff
+
+/*****************************************************************************/
+#define      AM_FM_DIFF               0x89c
+/* Reserved [31] */
+#define      FLD_FM_DIFF_OUT          0x7fff0000
+/* Reserved [15] */
+#define      FLD_AM_DIFF_OUT          0x00007fff
+
+/*****************************************************************************/
+#define      NICAM_FAW                0x8a0
+#define      FLD_FAWDETWINEND         0xFc000000
+#define      FLD_FAWDETWINSTR         0x03ff0000
+/* Reserved [15:12] */
+#define      FLD_FAWDETTHRSHLD3       0x00000f00
+#define      FLD_FAWDETTHRSHLD2       0x000000f0
+#define      FLD_FAWDETTHRSHLD1       0x0000000f
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DEEMPH_GAIN              0x8a4
+#define      NICAM_DEEMPHGAIN         0x8a4
+/* Reserved [31:18] */
+#define      FLD_DEEMPHGAIN           0x0003ffff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DEEMPH_NUMER1            0x8a8
+#define      NICAM_DEEMPHNUMER1       0x8a8
+/* Reserved [31:18] */
+#define      FLD_DEEMPHNUMER1         0x0003ffff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DEEMPH_NUMER2            0x8ac
+#define      NICAM_DEEMPHNUMER2       0x8ac
+/* Reserved [31:18] */
+#define      FLD_DEEMPHNUMER2         0x0003ffff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DEEMPH_DENOM1            0x8b0
+#define      NICAM_DEEMPHDENOM1       0x8b0
+/* Reserved [31:18] */
+#define      FLD_DEEMPHDENOM1         0x0003ffff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      DEEMPH_DENOM2            0x8b4
+#define      NICAM_DEEMPHDENOM2       0x8b4
+/* Reserved [31:18] */
+#define      FLD_DEEMPHDENOM2         0x0003ffff
+
+/*****************************************************************************/
+#define      NICAM_ERRLOG_CTL1        0x8B8
+/* Reserved [31:28] */
+#define      FLD_ERRINTRPTTHSHLD1     0x0fff0000
+/* Reserved [15:12] */
+#define      FLD_ERRLOGPERIOD         0x00000fff
+
+/*****************************************************************************/
+#define      NICAM_ERRLOG_CTL2        0x8bc
+/* Reserved [31:28] */
+#define      FLD_ERRINTRPTTHSHLD3     0x0fff0000
+/* Reserved [15:12] */
+#define      FLD_ERRINTRPTTHSHLD2     0x00000fff
+
+/*****************************************************************************/
+#define      NICAM_ERRLOG_STS1        0x8c0
+/* Reserved [31:28] */
+#define      FLD_ERRLOG2              0x0fff0000
+/* Reserved [15:12] */
+#define      FLD_ERRLOG1              0x00000fff
+
+/*****************************************************************************/
+#define      NICAM_ERRLOG_STS2        0x8c4
+/* Reserved [31:12] */
+#define      FLD_ERRLOG3              0x00000fff
+
+/*****************************************************************************/
+#define      NICAM_STATUS             0x8c8
+/* Reserved [31:20] */
+#define      FLD_NICAM_CIB            0x000c0000
+#define      FLD_NICAM_LOCK_STAT      0x00020000
+#define      FLD_NICAM_MUTE           0x00010000
+#define      FLD_NICAMADDIT_DATA      0x0000ffe0
+#define      FLD_NICAMCNTRL           0x0000001f
+
+/*****************************************************************************/
+#define      DEMATRIX_CTL             0x8cc
+#define      FLD_AC97_IN_SHIFT        0xf0000000
+#define      FLD_I2S_IN_SHIFT         0x0f000000
+#define      FLD_DEMATRIX_SEL_CTL     0x00ff0000
+/* Reserved [15:11] */
+#define      FLD_DMTRX_BYPASS         0x00000400
+#define      FLD_DEMATRIX_MODE        0x00000300
+/* Reserved [7:6] */
+#define      FLD_PH_DBX_SEL           0x00000020
+#define      FLD_PH_CH_SEL            0x00000010
+#define      FLD_PHASE_FIX            0x0000000f
+
+/*****************************************************************************/
+#define      PATH1_CTL1               0x8d0
+/* Reserved [31:29] */
+#define      FLD_PATH1_MUTE_CTL       0x1f000000
+/* Reserved [23:22] */
+#define      FLD_PATH1_AVC_CG         0x00300000
+#define      FLD_PATH1_AVC_RT         0x000f0000
+#define      FLD_PATH1_AVC_AT         0x0000f000
+#define      FLD_PATH1_AVC_STEREO     0x00000800
+#define      FLD_PATH1_AVC_CR         0x00000700
+#define      FLD_PATH1_AVC_RMS_CON    0x000000f0
+#define      FLD_PATH1_SEL_CTL        0x0000000f
+
+/*****************************************************************************/
+#define      PATH1_VOL_CTL            0x8d4
+#define      FLD_PATH1_AVC_THRESHOLD  0x7fff0000
+#define      FLD_PATH1_BAL_LEFT       0x00008000
+#define      FLD_PATH1_BAL_LEVEL      0x00007f00
+#define      FLD_PATH1_VOLUME         0x000000ff
+
+/*****************************************************************************/
+#define      PATH1_EQ_CTL             0x8d8
+/* Reserved [31:30] */
+#define      FLD_PATH1_EQ_TREBLE_VOL  0x3f000000
+/* Reserved [23:22] */
+#define      FLD_PATH1_EQ_MID_VOL     0x003f0000
+/* Reserved [15:14] */
+#define      FLD_PATH1_EQ_BASS_VOL    0x00003f00
+/* Reserved [7:1] */
+#define      FLD_PATH1_EQ_BAND_SEL    0x00000001
+
+/*****************************************************************************/
+#define      PATH1_SC_CTL             0x8dc
+#define      FLD_PATH1_SC_THRESHOLD   0x7fff0000
+#define      FLD_PATH1_SC_RT          0x0000f000
+#define      FLD_PATH1_SC_AT          0x00000f00
+#define      FLD_PATH1_SC_STEREO      0x00000080
+#define      FLD_PATH1_SC_CR          0x00000070
+#define      FLD_PATH1_SC_RMS_CON     0x0000000f
+
+/*****************************************************************************/
+#define      PATH2_CTL1               0x8e0
+/* Reserved [31:26] */
+#define      FLD_PATH2_MUTE_CTL       0x03000000
+/* Reserved [23:22] */
+#define      FLD_PATH2_AVC_CG         0x00300000
+#define      FLD_PATH2_AVC_RT         0x000f0000
+#define      FLD_PATH2_AVC_AT         0x0000f000
+#define      FLD_PATH2_AVC_STEREO     0x00000800
+#define      FLD_PATH2_AVC_CR         0x00000700
+#define      FLD_PATH2_AVC_RMS_CON    0x000000f0
+#define      FLD_PATH2_SEL_CTL        0x0000000f
+
+/*****************************************************************************/
+#define      PATH2_VOL_CTL            0x8e4
+#define      FLD_PATH2_AVC_THRESHOLD  0xffff0000
+#define      FLD_PATH2_BAL_LEFT       0x00008000
+#define      FLD_PATH2_BAL_LEVEL      0x00007f00
+#define      FLD_PATH2_VOLUME         0x000000ff
+
+/*****************************************************************************/
+#define      PATH2_EQ_CTL             0x8e8
+/* Reserved [31:30] */
+#define      FLD_PATH2_EQ_TREBLE_VOL  0x3f000000
+/* Reserved [23:22] */
+#define      FLD_PATH2_EQ_MID_VOL     0x003f0000
+/* Reserved [15:14] */
+#define      FLD_PATH2_EQ_BASS_VOL    0x00003f00
+/* Reserved [7:1] */
+#define      FLD_PATH2_EQ_BAND_SEL    0x00000001
+
+/*****************************************************************************/
+#define      PATH2_SC_CTL             0x8eC
+#define      FLD_PATH2_SC_THRESHOLD   0xffff0000
+#define      FLD_PATH2_SC_RT          0x0000f000
+#define      FLD_PATH2_SC_AT          0x00000f00
+#define      FLD_PATH2_SC_STEREO      0x00000080
+#define      FLD_PATH2_SC_CR          0x00000070
+#define      FLD_PATH2_SC_RMS_CON     0x0000000f
+
+/*****************************************************************************/
+#define      SRC_CTL                  0x8f0
+#define      FLD_SRC_STATUS           0xffffff00
+#define      FLD_FIFO_LF_EN           0x000000fc
+#define      FLD_BYPASS_LI            0x00000002
+#define      FLD_BYPASS_PF            0x00000001
+
+/*****************************************************************************/
+#define      SRC_LF_COEF              0x8f4
+#define      FLD_LOOP_FILTER_COEF2    0xffff0000
+#define      FLD_LOOP_FILTER_COEF1    0x0000ffff
+
+/*****************************************************************************/
+#define      SRC1_CTL                 0x8f8
+/* Reserved [31:28] */
+#define      FLD_SRC1_FIFO_RD_TH      0x0f000000
+/* Reserved [23:18] */
+#define      FLD_SRC1_PHASE_INC       0x0003ffff
+
+/*****************************************************************************/
+#define      SRC2_CTL                 0x8fc
+/* Reserved [31:28] */
+#define      FLD_SRC2_FIFO_RD_TH      0x0f000000
+/* Reserved [23:18] */
+#define      FLD_SRC2_PHASE_INC       0x0003ffff
+
+/*****************************************************************************/
+#define      SRC3_CTL                 0x900
+/* Reserved [31:28] */
+#define      FLD_SRC3_FIFO_RD_TH      0x0f000000
+/* Reserved [23:18] */
+#define      FLD_SRC3_PHASE_INC       0x0003ffff
+
+/*****************************************************************************/
+#define      SRC4_CTL                 0x904
+/* Reserved [31:28] */
+#define      FLD_SRC4_FIFO_RD_TH      0x0f000000
+/* Reserved [23:18] */
+#define      FLD_SRC4_PHASE_INC       0x0003ffff
+
+/*****************************************************************************/
+#define      SRC5_CTL                 0x908
+/* Reserved [31:28] */
+#define      FLD_SRC5_FIFO_RD_TH      0x0f000000
+/* Reserved [23:18] */
+#define      FLD_SRC5_PHASE_INC       0x0003ffff
+
+/*****************************************************************************/
+#define      SRC6_CTL                 0x90c
+/* Reserved [31:28] */
+#define      FLD_SRC6_FIFO_RD_TH      0x0f000000
+/* Reserved [23:18] */
+#define      FLD_SRC6_PHASE_INC       0x0003ffff
+
+/*****************************************************************************/
+#define      BAND_OUT_SEL             0x910
+#define      FLD_SRC6_IN_SEL          0xc0000000
+#define      FLD_SRC6_CLK_SEL         0x30000000
+#define      FLD_SRC5_IN_SEL          0x0c000000
+#define      FLD_SRC5_CLK_SEL         0x03000000
+#define      FLD_SRC4_IN_SEL          0x00c00000
+#define      FLD_SRC4_CLK_SEL         0x00300000
+#define      FLD_SRC3_IN_SEL          0x000c0000
+#define      FLD_SRC3_CLK_SEL         0x00030000
+#define      FLD_BASEBAND_BYPASS_CTL  0x0000ff00
+#define      FLD_AC97_SRC_SEL         0x000000c0
+#define      FLD_I2S_SRC_SEL          0x00000030
+#define      FLD_PARALLEL2_SRC_SEL    0x0000000c
+#define      FLD_PARALLEL1_SRC_SEL    0x00000003
+
+/*****************************************************************************/
+#define      I2S_IN_CTL               0x914
+/* Reserved [31:11] */
+#define      FLD_I2S_UP2X_BW20K       0x00000400
+#define      FLD_I2S_UP2X_BYPASS      0x00000200
+#define      FLD_I2S_IN_MASTER_MODE   0x00000100
+#define      FLD_I2S_IN_SONY_MODE     0x00000080
+#define      FLD_I2S_IN_RIGHT_JUST    0x00000040
+#define      FLD_I2S_IN_WS_SEL        0x00000020
+#define      FLD_I2S_IN_BCN_DEL       0x0000001f
+
+/*****************************************************************************/
+#define      I2S_OUT_CTL              0x918
+/* Reserved [31:17] */
+#define      FLD_I2S_OUT_SOFT_RESET_EN  0x00010000
+/* Reserved [15:9] */
+#define      FLD_I2S_OUT_MASTER_MODE  0x00000100
+#define      FLD_I2S_OUT_SONY_MODE    0x00000080
+#define      FLD_I2S_OUT_RIGHT_JUST   0x00000040
+#define      FLD_I2S_OUT_WS_SEL       0x00000020
+#define      FLD_I2S_OUT_BCN_DEL      0x0000001f
+
+/*****************************************************************************/
+#define      AC97_CTL                 0x91c
+/* Reserved [31:26] */
+#define      FLD_AC97_UP2X_BW20K      0x02000000
+#define      FLD_AC97_UP2X_BYPASS     0x01000000
+/* Reserved [23:17] */
+#define      FLD_AC97_RST_ACL         0x00010000
+/* Reserved [15:9] */
+#define      FLD_AC97_WAKE_UP_SYNC    0x00000100
+/* Reserved [7:1] */
+#define      FLD_AC97_SHUTDOWN        0x00000001
+
+/* Cx231xx redefine */
+#define      QPSK_IAGC_CTL1            0x94c
+#define      QPSK_IAGC_CTL2            0x950
+#define      QPSK_FEPR_FREQ            0x954
+#define      QPSK_BTL_CTL1             0x958
+#define      QPSK_BTL_CTL2             0x95c
+#define      QPSK_CTL_CTL1             0x960
+#define      QPSK_CTL_CTL2             0x964
+#define      QPSK_MF_FAGC_CTL          0x968
+#define      QPSK_EQ_CTL               0x96c
+#define      QPSK_LOCK_CTL             0x970
+
+/*****************************************************************************/
+#define      FM1_DFT_CTL              0x9a8
+#define      FLD_FM1_DFT_THRESHOLD    0xffff0000
+/* Reserved [15:8] */
+#define      FLD_FM1_DFT_CMP_CTL      0x00000080
+#define      FLD_FM1_DFT_AVG          0x00000070
+/* Reserved [3:1] */
+#define      FLD_FM1_DFT_START        0x00000001
+
+/*****************************************************************************/
+#define      FM1_DFT_STATUS           0x9ac
+#define      FLD_FM1_DFT_DONE         0x80000000
+/* Reserved [30:19] */
+#define      FLD_FM_DFT_TH_CMP        0x00040000
+#define      FLD_FM1_DFT              0x0003ffff
+
+/*****************************************************************************/
+#define      FM2_DFT_CTL              0x9b0
+#define      FLD_FM2_DFT_THRESHOLD    0xffff0000
+/* Reserved [15:8] */
+#define      FLD_FM2_DFT_CMP_CTL      0x00000080
+#define      FLD_FM2_DFT_AVG          0x00000070
+/* Reserved [3:1] */
+#define      FLD_FM2_DFT_START        0x00000001
+
+/*****************************************************************************/
+#define      FM2_DFT_STATUS           0x9b4
+#define      FLD_FM2_DFT_DONE         0x80000000
+/* Reserved [30:19] */
+#define      FLD_FM2_DFT_TH_CMP_STAT  0x00040000
+#define      FLD_FM2_DFT              0x0003ffff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      AAGC_STATUS_REG          0x9b8
+#define      AAGC_STATUS              0x9b8
+/* Reserved [31:27] */
+#define      FLD_FM2_DAGC_OUT         0x07000000
+/* Reserved [23:19] */
+#define      FLD_FM1_DAGC_OUT         0x00070000
+/* Reserved [15:6] */
+#define      FLD_AFE_VGA_OUT          0x0000003f
+
+/*****************************************************************************/
+#define      MTS_GAIN_STATUS          0x9bc
+/* Reserved [31:14] */
+#define      FLD_MTS_GAIN             0x00003fff
+
+#define      RDS_OUT                  0x9c0
+#define      FLD_RDS_Q                0xffff0000
+#define      FLD_RDS_I                0x0000ffff
+
+/*****************************************************************************/
+#define      AUTOCONFIG_REG           0x9c4
+/* Reserved [31:4] */
+#define      FLD_AUTOCONFIG_MODE      0x0000000f
+
+#define      FM_AFC                   0x9c8
+#define      FLD_FM2_AFC              0xffff0000
+#define      FLD_FM1_AFC              0x0000ffff
+
+/*****************************************************************************/
+/* Cx231xx redefine */
+#define      NEW_SPARE                0x9cc
+#define      NEW_SPARE_REG            0x9cc
+
+/*****************************************************************************/
+#define      DBX_ADJ                  0x9d0
+/* Reserved [31:28] */
+#define      FLD_DBX2_ADJ             0x0fff0000
+/* Reserved [15:12] */
+#define      FLD_DBX1_ADJ             0x00000fff
+
+#define      VID_FMT_AUTO              0
+#define      VID_FMT_NTSC_M            1
+#define      VID_FMT_NTSC_J            2
+#define      VID_FMT_NTSC_443          3
+#define      VID_FMT_PAL_BDGHI         4
+#define      VID_FMT_PAL_M             5
+#define      VID_FMT_PAL_N             6
+#define      VID_FMT_PAL_NC            7
+#define      VID_FMT_PAL_60            8
+#define      VID_FMT_SECAM             12
+#define      VID_FMT_SECAM_60          13
+
+#define      INPUT_MODE_CVBS_0         0       /* INPUT_MODE_VALUE(0) */
+#define      INPUT_MODE_YC_1           1       /* INPUT_MODE_VALUE(1) */
+#define      INPUT_MODE_YC2_2          2       /* INPUT_MODE_VALUE(2) */
+#define      INPUT_MODE_YUV_3          3       /* INPUT_MODE_VALUE(3) */
+
+#define      LUMA_LPF_LOW_BANDPASS     0       /* 0.6Mhz LPF BW */
+#define      LUMA_LPF_MEDIUM_BANDPASS  1       /* 1.0Mhz LPF BW */
+#define      LUMA_LPF_HIGH_BANDPASS    2       /* 1.5Mhz LPF BW */
+
+#define      UV_LPF_LOW_BANDPASS       0       /* 0.6Mhz LPF BW */
+#define      UV_LPF_MEDIUM_BANDPASS    1       /* 1.0Mhz LPF BW */
+#define      UV_LPF_HIGH_BANDPASS      2       /* 1.5Mhz LPF BW */
+
+#define      TWO_TAP_FILT              0
+#define      THREE_TAP_FILT            1
+#define      FOUR_TAP_FILT             2
+#define      FIVE_TAP_FILT             3
+
+#define      AUD_CHAN_SRC_PARALLEL     0
+#define      AUD_CHAN_SRC_I2S_INPUT    1
+#define      AUD_CHAN_SRC_FLATIRON     2
+#define      AUD_CHAN_SRC_PARALLEL3    3
+
+#define      OUT_MODE_601              0
+#define      OUT_MODE_656              1
+#define      OUT_MODE_VIP11            2
+#define      OUT_MODE_VIP20            3
+
+#define      PHASE_INC_49MHZ          0x0df22
+#define      PHASE_INC_56MHZ          0x0fa5b
+#define      PHASE_INC_28MHZ          0x010000
+
+#endif
diff --git a/drivers/media/video/cx231xx/cx231xx-vbi.c b/drivers/media/video/cx231xx/cx231xx-vbi.c
new file mode 100644 (file)
index 0000000..9418052
--- /dev/null
@@ -0,0 +1,701 @@
+/*
+   cx231xx_vbi.c - driver for Conexant Cx23100/101/102 USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+       Based on cx88 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.
+
+   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 <linux/init.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/bitmap.h>
+#include <linux/usb.h>
+#include <linux/i2c.h>
+#include <linux/version.h>
+#include <linux/mm.h>
+#include <linux/mutex.h>
+
+#include <media/v4l2-common.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-chip-ident.h>
+#include <media/msp3400.h>
+#include <media/tuner.h>
+
+#include "cx231xx.h"
+#include "cx231xx-vbi.h"
+
+static inline void print_err_status(struct cx231xx *dev, int packet, int status)
+{
+       char *errmsg = "Unknown";
+
+       switch (status) {
+       case -ENOENT:
+               errmsg = "unlinked synchronuously";
+               break;
+       case -ECONNRESET:
+               errmsg = "unlinked asynchronuously";
+               break;
+       case -ENOSR:
+               errmsg = "Buffer error (overrun)";
+               break;
+       case -EPIPE:
+               errmsg = "Stalled (device not responding)";
+               break;
+       case -EOVERFLOW:
+               errmsg = "Babble (bad cable?)";
+               break;
+       case -EPROTO:
+               errmsg = "Bit-stuff error (bad cable?)";
+               break;
+       case -EILSEQ:
+               errmsg = "CRC/Timeout (could be anything)";
+               break;
+       case -ETIME:
+               errmsg = "Device does not respond";
+               break;
+       }
+       if (packet < 0) {
+               cx231xx_err(DRIVER_NAME "URB status %d [%s].\n", status,
+                           errmsg);
+       } else {
+               cx231xx_err(DRIVER_NAME "URB packet %d, status %d [%s].\n",
+                           packet, status, errmsg);
+       }
+}
+
+/*
+ * Controls the isoc copy of each urb packet
+ */
+static inline int cx231xx_isoc_vbi_copy(struct cx231xx *dev, struct urb *urb)
+{
+       struct cx231xx_buffer *buf;
+       struct cx231xx_dmaqueue *dma_q = urb->context;
+       int rc = 1;
+       unsigned char *p_buffer;
+       u32 bytes_parsed = 0, buffer_size = 0;
+       u8 sav_eav = 0;
+
+       if (!dev)
+               return 0;
+
+       if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
+               return 0;
+
+       if (urb->status < 0) {
+               print_err_status(dev, -1, urb->status);
+               if (urb->status == -ENOENT)
+                       return 0;
+       }
+
+       buf = dev->vbi_mode.isoc_ctl.buf;
+
+       /* get buffer pointer and length */
+       p_buffer = urb->transfer_buffer;
+       buffer_size = urb->actual_length;
+
+       if (buffer_size > 0) {
+               bytes_parsed = 0;
+
+               if (dma_q->is_partial_line) {
+                       /* Handle the case where we were working on a partial
+                          line */
+                       sav_eav = dma_q->last_sav;
+               } else {
+                       /* Check for a SAV/EAV overlapping the
+                          buffer boundary */
+
+                       sav_eav = cx231xx_find_boundary_SAV_EAV(p_buffer,
+                                                         dma_q->partial_buf,
+                                                         &bytes_parsed);
+               }
+
+               sav_eav &= 0xF0;
+               /* Get the first line if we have some portion of an SAV/EAV from
+                  the last buffer or a partial line */
+               if (sav_eav) {
+                       bytes_parsed += cx231xx_get_vbi_line(dev, dma_q,
+                               sav_eav,                       /* SAV/EAV */
+                               p_buffer + bytes_parsed,       /* p_buffer */
+                               buffer_size - bytes_parsed);   /* buffer size */
+               }
+
+               /* Now parse data that is completely in this buffer */
+               dma_q->is_partial_line = 0;
+
+               while (bytes_parsed < buffer_size) {
+                       u32 bytes_used = 0;
+
+                       sav_eav = cx231xx_find_next_SAV_EAV(
+                               p_buffer + bytes_parsed,        /* p_buffer */
+                               buffer_size - bytes_parsed, /* buffer size */
+                               &bytes_used);   /* bytes used to get SAV/EAV */
+
+                       bytes_parsed += bytes_used;
+
+                       sav_eav &= 0xF0;
+                       if (sav_eav && (bytes_parsed < buffer_size)) {
+                               bytes_parsed += cx231xx_get_vbi_line(dev,
+                                       dma_q, sav_eav, /* SAV/EAV */
+                                       p_buffer+bytes_parsed, /* p_buffer */
+                                       buffer_size-bytes_parsed);/*buf size*/
+                       }
+               }
+
+               /* Save the last four bytes of the buffer so we can
+               check the buffer boundary condition next time */
+               memcpy(dma_q->partial_buf, p_buffer + buffer_size - 4, 4);
+               bytes_parsed = 0;
+       }
+
+       return rc;
+}
+
+/* ------------------------------------------------------------------
+       Vbi buf operations
+   ------------------------------------------------------------------*/
+
+static int
+vbi_buffer_setup(struct videobuf_queue *vq, unsigned int *count,
+                unsigned int *size)
+{
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx *dev = fh->dev;
+       u32 height = 0;
+
+       height = ((dev->norm & V4L2_STD_625_50) ?
+                 PAL_VBI_LINES : NTSC_VBI_LINES);
+
+       *size = (dev->width * height * 2);
+       if (0 == *count)
+               *count = CX231XX_DEF_VBI_BUF;
+
+       if (*count < CX231XX_MIN_BUF)
+               *count = CX231XX_MIN_BUF;
+
+       return 0;
+}
+
+/* This is called *without* dev->slock held; please keep it that way */
+static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
+{
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx *dev = fh->dev;
+       unsigned long flags = 0;
+       if (in_interrupt())
+               BUG();
+
+       /* We used to wait for the buffer to finish here, but this didn't work
+          because, as we were keeping the state as VIDEOBUF_QUEUED,
+          videobuf_queue_cancel marked it as finished for us.
+          (Also, it could wedge forever if the hardware was misconfigured.)
+
+          This should be safe; by the time we get here, the buffer isn't
+          queued anymore. If we ever start marking the buffers as
+          VIDEOBUF_ACTIVE, it won't be, though.
+        */
+       spin_lock_irqsave(&dev->vbi_mode.slock, flags);
+       if (dev->vbi_mode.isoc_ctl.buf == buf)
+               dev->vbi_mode.isoc_ctl.buf = NULL;
+       spin_unlock_irqrestore(&dev->vbi_mode.slock, flags);
+
+       videobuf_vmalloc_free(&buf->vb);
+       buf->vb.state = VIDEOBUF_NEEDS_INIT;
+}
+
+static int
+vbi_buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
+                  enum v4l2_field field)
+{
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+       struct cx231xx *dev = fh->dev;
+       int rc = 0, urb_init = 0;
+       u32 height = 0;
+
+       height = ((dev->norm & V4L2_STD_625_50) ?
+                 PAL_VBI_LINES : NTSC_VBI_LINES);
+       buf->vb.size = ((dev->width << 1) * height);
+
+       if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
+               return -EINVAL;
+
+       buf->vb.width = dev->width;
+       buf->vb.height = height;
+       buf->vb.field = field;
+       buf->vb.field = V4L2_FIELD_SEQ_TB;
+
+       if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
+               rc = videobuf_iolock(vq, &buf->vb, NULL);
+               if (rc < 0)
+                       goto fail;
+       }
+
+       if (!dev->vbi_mode.isoc_ctl.num_bufs)
+               urb_init = 1;
+
+       if (urb_init) {
+               rc = cx231xx_init_vbi_isoc(dev, CX231XX_NUM_VBI_PACKETS,
+                                          CX231XX_NUM_VBI_BUFS,
+                                          dev->vbi_mode.alt_max_pkt_size[0],
+                                          cx231xx_isoc_vbi_copy);
+               if (rc < 0)
+                       goto fail;
+       }
+
+       buf->vb.state = VIDEOBUF_PREPARED;
+       return 0;
+
+fail:
+       free_buffer(vq, buf);
+       return rc;
+}
+
+static void
+vbi_buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
+{
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx *dev = fh->dev;
+       struct cx231xx_dmaqueue *vidq = &dev->vbi_mode.vidq;
+
+       buf->vb.state = VIDEOBUF_QUEUED;
+       list_add_tail(&buf->vb.queue, &vidq->active);
+
+}
+
+static void vbi_buffer_release(struct videobuf_queue *vq,
+                              struct videobuf_buffer *vb)
+{
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+
+
+       free_buffer(vq, buf);
+}
+
+struct videobuf_queue_ops cx231xx_vbi_qops = {
+       .buf_setup   = vbi_buffer_setup,
+       .buf_prepare = vbi_buffer_prepare,
+       .buf_queue   = vbi_buffer_queue,
+       .buf_release = vbi_buffer_release,
+};
+
+/* ------------------------------------------------------------------
+       URB control
+   ------------------------------------------------------------------*/
+
+/*
+ * IRQ callback, called by URB callback
+ */
+static void cx231xx_irq_vbi_callback(struct urb *urb)
+{
+       struct cx231xx_dmaqueue *dma_q = urb->context;
+       struct cx231xx_video_mode *vmode =
+           container_of(dma_q, struct cx231xx_video_mode, vidq);
+       struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
+       int rc;
+
+       switch (urb->status) {
+       case 0:         /* success */
+       case -ETIMEDOUT:        /* NAK */
+               break;
+       case -ECONNRESET:       /* kill */
+       case -ENOENT:
+       case -ESHUTDOWN:
+               return;
+       default:                /* error */
+               cx231xx_err(DRIVER_NAME "urb completition error %d.\n",
+                           urb->status);
+               break;
+       }
+
+       /* Copy data from URB */
+       spin_lock(&dev->vbi_mode.slock);
+       rc = dev->vbi_mode.isoc_ctl.isoc_copy(dev, urb);
+       spin_unlock(&dev->vbi_mode.slock);
+
+       /* Reset status */
+       urb->status = 0;
+
+       urb->status = usb_submit_urb(urb, GFP_ATOMIC);
+       if (urb->status) {
+               cx231xx_err(DRIVER_NAME "urb resubmit failed (error=%i)\n",
+                           urb->status);
+       }
+}
+
+/*
+ * Stop and Deallocate URBs
+ */
+void cx231xx_uninit_vbi_isoc(struct cx231xx *dev)
+{
+       struct urb *urb;
+       int i;
+
+       cx231xx_info(DRIVER_NAME "cx231xx: called cx231xx_uninit_vbi_isoc\n");
+
+       dev->vbi_mode.isoc_ctl.nfields = -1;
+       for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
+               urb = dev->vbi_mode.isoc_ctl.urb[i];
+               if (urb) {
+                       if (!irqs_disabled())
+                               usb_kill_urb(urb);
+                       else
+                               usb_unlink_urb(urb);
+
+                       if (dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
+
+                               kfree(dev->vbi_mode.isoc_ctl.
+                                     transfer_buffer[i]);
+                               dev->vbi_mode.isoc_ctl.transfer_buffer[i] =
+                                   NULL;
+                       }
+                       usb_free_urb(urb);
+                       dev->vbi_mode.isoc_ctl.urb[i] = NULL;
+               }
+               dev->vbi_mode.isoc_ctl.transfer_buffer[i] = NULL;
+       }
+
+       kfree(dev->vbi_mode.isoc_ctl.urb);
+       kfree(dev->vbi_mode.isoc_ctl.transfer_buffer);
+
+       dev->vbi_mode.isoc_ctl.urb = NULL;
+       dev->vbi_mode.isoc_ctl.transfer_buffer = NULL;
+       dev->vbi_mode.isoc_ctl.num_bufs = 0;
+
+       cx231xx_capture_start(dev, 0, Vbi);
+}
+EXPORT_SYMBOL_GPL(cx231xx_uninit_vbi_isoc);
+
+/*
+ * Allocate URBs and start IRQ
+ */
+int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
+                         int num_bufs, int max_pkt_size,
+                         int (*isoc_copy) (struct cx231xx *dev,
+                                           struct urb *urb))
+{
+       struct cx231xx_dmaqueue *dma_q = &dev->vbi_mode.vidq;
+       int i;
+       int sb_size, pipe;
+       struct urb *urb;
+       int rc;
+
+       cx231xx_info(DRIVER_NAME "cx231xx: called cx231xx_prepare_isoc\n");
+
+       /* De-allocates all pending stuff */
+       cx231xx_uninit_vbi_isoc(dev);
+
+       /* clear if any halt */
+       usb_clear_halt(dev->udev,
+                      usb_rcvbulkpipe(dev->udev,
+                                      dev->vbi_mode.end_point_addr));
+
+       dev->vbi_mode.isoc_ctl.isoc_copy = isoc_copy;
+       dev->vbi_mode.isoc_ctl.num_bufs = num_bufs;
+       dma_q->pos = 0;
+       dma_q->is_partial_line = 0;
+       dma_q->last_sav = 0;
+       dma_q->current_field = -1;
+       dma_q->bytes_left_in_line = dev->width << 1;
+       dma_q->lines_per_field = ((dev->norm & V4L2_STD_625_50) ?
+                                 PAL_VBI_LINES : NTSC_VBI_LINES);
+       dma_q->lines_completed = 0;
+       for (i = 0; i < 8; i++)
+               dma_q->partial_buf[i] = 0;
+
+       dev->vbi_mode.isoc_ctl.urb = kzalloc(sizeof(void *) * num_bufs,
+                                            GFP_KERNEL);
+       if (!dev->vbi_mode.isoc_ctl.urb) {
+               cx231xx_errdev("cannot alloc memory for usb buffers\n");
+               return -ENOMEM;
+       }
+
+       dev->vbi_mode.isoc_ctl.transfer_buffer =
+           kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
+       if (!dev->vbi_mode.isoc_ctl.transfer_buffer) {
+               cx231xx_errdev("cannot allocate memory for usbtransfer\n");
+               kfree(dev->vbi_mode.isoc_ctl.urb);
+               return -ENOMEM;
+       }
+
+       dev->vbi_mode.isoc_ctl.max_pkt_size = max_pkt_size;
+       dev->vbi_mode.isoc_ctl.buf = NULL;
+
+       sb_size = max_packets * dev->vbi_mode.isoc_ctl.max_pkt_size;
+
+       /* allocate urbs and transfer buffers */
+       for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
+
+               urb = usb_alloc_urb(0, GFP_KERNEL);
+               if (!urb) {
+                       cx231xx_err(DRIVER_NAME
+                                   ": cannot alloc isoc_ctl.urb %i\n", i);
+                       cx231xx_uninit_vbi_isoc(dev);
+                       return -ENOMEM;
+               }
+               dev->vbi_mode.isoc_ctl.urb[i] = urb;
+               urb->transfer_flags = 0;
+
+               dev->vbi_mode.isoc_ctl.transfer_buffer[i] =
+                   kzalloc(sb_size, GFP_KERNEL);
+               if (!dev->vbi_mode.isoc_ctl.transfer_buffer[i]) {
+                       cx231xx_err(DRIVER_NAME
+                                   ": unable to allocate %i bytes for transfer"
+                                   " buffer %i%s\n", sb_size, i,
+                                   in_interrupt() ? " while in int" : "");
+                       cx231xx_uninit_vbi_isoc(dev);
+                       return -ENOMEM;
+               }
+
+               pipe = usb_rcvbulkpipe(dev->udev, dev->vbi_mode.end_point_addr);
+               usb_fill_bulk_urb(urb, dev->udev, pipe,
+                                 dev->vbi_mode.isoc_ctl.transfer_buffer[i],
+                                 sb_size, cx231xx_irq_vbi_callback, dma_q);
+       }
+
+       init_waitqueue_head(&dma_q->wq);
+
+       /* submit urbs and enables IRQ */
+       for (i = 0; i < dev->vbi_mode.isoc_ctl.num_bufs; i++) {
+               rc = usb_submit_urb(dev->vbi_mode.isoc_ctl.urb[i], GFP_ATOMIC);
+               if (rc) {
+                       cx231xx_err(DRIVER_NAME
+                                   ": submit of urb %i failed (error=%i)\n", i,
+                                   rc);
+                       cx231xx_uninit_vbi_isoc(dev);
+                       return rc;
+               }
+       }
+
+       cx231xx_capture_start(dev, 1, Vbi);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(cx231xx_init_vbi_isoc);
+
+u32 cx231xx_get_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                        u8 sav_eav, u8 *p_buffer, u32 buffer_size)
+{
+       u32 bytes_copied = 0;
+       int current_field = -1;
+
+       switch (sav_eav) {
+
+       case SAV_VBI_FIELD1:
+               current_field = 1;
+               break;
+
+       case SAV_VBI_FIELD2:
+               current_field = 2;
+               break;
+       default:
+               break;
+       }
+
+       if (current_field < 0)
+               return bytes_copied;
+
+       dma_q->last_sav = sav_eav;
+
+       bytes_copied =
+           cx231xx_copy_vbi_line(dev, dma_q, p_buffer, buffer_size,
+                                 current_field);
+
+       return bytes_copied;
+}
+
+/*
+ * Announces that a buffer were filled and request the next
+ */
+static inline void vbi_buffer_filled(struct cx231xx *dev,
+                                    struct cx231xx_dmaqueue *dma_q,
+                                    struct cx231xx_buffer *buf)
+{
+       /* Advice that buffer was filled */
+       /* cx231xx_info(DRIVER_NAME "[%p/%d] wakeup\n", buf, buf->vb.i); */
+
+       buf->vb.state = VIDEOBUF_DONE;
+       buf->vb.field_count++;
+       do_gettimeofday(&buf->vb.ts);
+
+       dev->vbi_mode.isoc_ctl.buf = NULL;
+
+       list_del(&buf->vb.queue);
+       wake_up(&buf->vb.done);
+}
+
+u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                         u8 *p_line, u32 length, int field_number)
+{
+       u32 bytes_to_copy;
+       struct cx231xx_buffer *buf;
+       u32 _line_size = dev->width * 2;
+
+       if (dma_q->current_field != field_number)
+               cx231xx_reset_vbi_buffer(dev, dma_q);
+
+       /* get the buffer pointer */
+       buf = dev->vbi_mode.isoc_ctl.buf;
+
+       /* Remember the field number for next time */
+       dma_q->current_field = field_number;
+
+       bytes_to_copy = dma_q->bytes_left_in_line;
+       if (bytes_to_copy > length)
+               bytes_to_copy = length;
+
+       if (dma_q->lines_completed >= dma_q->lines_per_field) {
+               dma_q->bytes_left_in_line -= bytes_to_copy;
+               dma_q->is_partial_line =
+                   (dma_q->bytes_left_in_line == 0) ? 0 : 1;
+               return 0;
+       }
+
+       dma_q->is_partial_line = 1;
+
+       /* If we don't have a buffer, just return the number of bytes we would
+          have copied if we had a buffer. */
+       if (!buf) {
+               dma_q->bytes_left_in_line -= bytes_to_copy;
+               dma_q->is_partial_line =
+                   (dma_q->bytes_left_in_line == 0) ? 0 : 1;
+               return bytes_to_copy;
+       }
+
+       /* copy the data to video buffer */
+       cx231xx_do_vbi_copy(dev, dma_q, p_line, bytes_to_copy);
+
+       dma_q->pos += bytes_to_copy;
+       dma_q->bytes_left_in_line -= bytes_to_copy;
+
+       if (dma_q->bytes_left_in_line == 0) {
+
+               dma_q->bytes_left_in_line = _line_size;
+               dma_q->lines_completed++;
+               dma_q->is_partial_line = 0;
+
+               if (cx231xx_is_vbi_buffer_done(dev, dma_q) && buf) {
+
+                       vbi_buffer_filled(dev, dma_q, buf);
+
+                       dma_q->pos = 0;
+                       buf = NULL;
+                       dma_q->lines_completed = 0;
+               }
+       }
+
+       return bytes_to_copy;
+}
+
+/*
+ * video-buf generic routine to get the next available buffer
+ */
+static inline void get_next_vbi_buf(struct cx231xx_dmaqueue *dma_q,
+                                   struct cx231xx_buffer **buf)
+{
+       struct cx231xx_video_mode *vmode =
+           container_of(dma_q, struct cx231xx_video_mode, vidq);
+       struct cx231xx *dev = container_of(vmode, struct cx231xx, vbi_mode);
+       char *outp;
+
+       if (list_empty(&dma_q->active)) {
+               cx231xx_err(DRIVER_NAME ": No active queue to serve\n");
+               dev->vbi_mode.isoc_ctl.buf = NULL;
+               *buf = NULL;
+               return;
+       }
+
+       /* Get the next buffer */
+       *buf = list_entry(dma_q->active.next, struct cx231xx_buffer, vb.queue);
+
+       /* Cleans up buffer - Usefull for testing for frame/URB loss */
+       outp = videobuf_to_vmalloc(&(*buf)->vb);
+       memset(outp, 0, (*buf)->vb.size);
+
+       dev->vbi_mode.isoc_ctl.buf = *buf;
+
+       return;
+}
+
+void cx231xx_reset_vbi_buffer(struct cx231xx *dev,
+                             struct cx231xx_dmaqueue *dma_q)
+{
+       struct cx231xx_buffer *buf;
+
+       buf = dev->vbi_mode.isoc_ctl.buf;
+
+       if (buf == NULL) {
+               /* first try to get the buffer */
+               get_next_vbi_buf(dma_q, &buf);
+
+               dma_q->pos = 0;
+               dma_q->current_field = -1;
+       }
+
+       dma_q->bytes_left_in_line = dev->width << 1;
+       dma_q->lines_completed = 0;
+}
+
+int cx231xx_do_vbi_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                       u8 *p_buffer, u32 bytes_to_copy)
+{
+       u8 *p_out_buffer = NULL;
+       u32 current_line_bytes_copied = 0;
+       struct cx231xx_buffer *buf;
+       u32 _line_size = dev->width << 1;
+       void *startwrite;
+       int offset, lencopy;
+
+       buf = dev->vbi_mode.isoc_ctl.buf;
+
+       if (buf == NULL)
+               return -EINVAL;
+
+       p_out_buffer = videobuf_to_vmalloc(&buf->vb);
+
+       if (dma_q->bytes_left_in_line != _line_size) {
+               current_line_bytes_copied =
+                   _line_size - dma_q->bytes_left_in_line;
+       }
+
+       offset = (dma_q->lines_completed * _line_size) +
+                current_line_bytes_copied;
+
+       /* prepare destination address */
+       startwrite = p_out_buffer + offset;
+
+       lencopy = dma_q->bytes_left_in_line > bytes_to_copy ?
+                 bytes_to_copy : dma_q->bytes_left_in_line;
+
+       memcpy(startwrite, p_buffer, lencopy);
+
+       return 0;
+}
+
+u8 cx231xx_is_vbi_buffer_done(struct cx231xx *dev,
+                             struct cx231xx_dmaqueue *dma_q)
+{
+       u32 height = 0;
+
+       height = ((dev->norm & V4L2_STD_625_50) ?
+                 PAL_VBI_LINES : NTSC_VBI_LINES);
+       return (dma_q->lines_completed == height) ? 1 : 0;
+}
diff --git a/drivers/media/video/cx231xx/cx231xx-vbi.h b/drivers/media/video/cx231xx/cx231xx-vbi.h
new file mode 100644 (file)
index 0000000..89c7fe8
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+   cx231xx_vbi.h - driver for Conexant Cx23100/101/102 USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+               Based on cx88 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.
+
+   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 _CX231XX_VBI_H
+#define _CX231XX_VBI_H
+
+extern struct videobuf_queue_ops cx231xx_vbi_qops;
+
+#define   NTSC_VBI_START_LINE 10       /* line 10 - 21 */
+#define   NTSC_VBI_END_LINE   21
+#define   NTSC_VBI_LINES         (NTSC_VBI_END_LINE-NTSC_VBI_START_LINE+1)
+
+#define   PAL_VBI_START_LINE  6
+#define   PAL_VBI_END_LINE    23
+#define   PAL_VBI_LINES       (PAL_VBI_END_LINE-PAL_VBI_START_LINE+1)
+
+#define   VBI_STRIDE            1440
+#define   VBI_SAMPLES_PER_LINE  1440
+
+#define   CX231XX_NUM_VBI_PACKETS       4
+#define   CX231XX_NUM_VBI_BUFS          5
+
+/* stream functions */
+int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
+                         int num_bufs, int max_pkt_size,
+                         int (*isoc_copy) (struct cx231xx *dev,
+                                           struct urb *urb));
+
+void cx231xx_uninit_vbi_isoc(struct cx231xx *dev);
+
+/* vbi data copy functions */
+u32 cx231xx_get_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                        u8 sav_eav, u8 *p_buffer, u32 buffer_size);
+
+u32 cx231xx_copy_vbi_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                         u8 *p_line, u32 length, int field_number);
+
+void cx231xx_reset_vbi_buffer(struct cx231xx *dev,
+                             struct cx231xx_dmaqueue *dma_q);
+
+int cx231xx_do_vbi_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                       u8 *p_buffer, u32 bytes_to_copy);
+
+u8 cx231xx_is_vbi_buffer_done(struct cx231xx *dev,
+                             struct cx231xx_dmaqueue *dma_q);
+
+#endif
diff --git a/drivers/media/video/cx231xx/cx231xx-video.c b/drivers/media/video/cx231xx/cx231xx-video.c
new file mode 100644 (file)
index 0000000..a23ae73
--- /dev/null
@@ -0,0 +1,2434 @@
+/*
+   cx231xx-video.c - driver for Conexant Cx23100/101/102
+                    USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+       Based on em28xx driver
+       Based on cx23885 driver
+       Based on cx88 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.
+
+   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 <linux/init.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/bitmap.h>
+#include <linux/usb.h>
+#include <linux/i2c.h>
+#include <linux/version.h>
+#include <linux/mm.h>
+#include <linux/mutex.h>
+
+#include <media/v4l2-common.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-chip-ident.h>
+#include <media/msp3400.h>
+#include <media/tuner.h>
+
+#include "dvb_frontend.h"
+
+#include "cx231xx.h"
+#include "cx231xx-vbi.h"
+
+#define CX231XX_VERSION_CODE            KERNEL_VERSION(0, 0, 1)
+
+#define DRIVER_AUTHOR   "Srinivasa Deevi <srinivasa.deevi@conexant.com>"
+#define DRIVER_DESC     "Conexant cx231xx based USB video device driver"
+
+#define cx231xx_videodbg(fmt, arg...) do {\
+       if (video_debug) \
+               printk(KERN_INFO "%s %s :"fmt, \
+                        dev->name, __func__ , ##arg); } while (0)
+
+static unsigned int isoc_debug;
+module_param(isoc_debug, int, 0644);
+MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
+
+#define cx231xx_isocdbg(fmt, arg...) \
+do {\
+       if (isoc_debug) { \
+               printk(KERN_INFO "%s %s :"fmt, \
+                        dev->name, __func__ , ##arg); \
+       } \
+  } while (0)
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_LICENSE("GPL");
+
+static unsigned int card[]     = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
+static unsigned int video_nr[] = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
+static unsigned int vbi_nr[]   = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
+static unsigned int radio_nr[] = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
+
+module_param_array(card, int, NULL, 0444);
+module_param_array(video_nr, int, NULL, 0444);
+module_param_array(vbi_nr, int, NULL, 0444);
+module_param_array(radio_nr, int, NULL, 0444);
+
+MODULE_PARM_DESC(card, "card type");
+MODULE_PARM_DESC(video_nr, "video device numbers");
+MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
+MODULE_PARM_DESC(radio_nr, "radio device numbers");
+
+static unsigned int video_debug;
+module_param(video_debug, int, 0644);
+MODULE_PARM_DESC(video_debug, "enable debug messages [video]");
+
+/* supported video standards */
+static struct cx231xx_fmt format[] = {
+       {
+        .name = "16bpp YUY2, 4:2:2, packed",
+        .fourcc = V4L2_PIX_FMT_YUYV,
+        .depth = 16,
+        .reg = 0,
+        },
+};
+
+/* supported controls */
+/* Common to all boards */
+
+/* ------------------------------------------------------------------- */
+
+static const struct v4l2_queryctrl no_ctl = {
+       .name = "42",
+       .flags = V4L2_CTRL_FLAG_DISABLED,
+};
+
+static struct cx231xx_ctrl cx231xx_ctls[] = {
+       /* --- video --- */
+       {
+               .v = {
+                       .id = V4L2_CID_BRIGHTNESS,
+                       .name = "Brightness",
+                       .minimum = 0x00,
+                       .maximum = 0xff,
+                       .step = 1,
+                       .default_value = 0x7f,
+                       .type = V4L2_CTRL_TYPE_INTEGER,
+               },
+               .off = 128,
+               .reg = LUMA_CTRL,
+               .mask = 0x00ff,
+               .shift = 0,
+       }, {
+               .v = {
+                       .id = V4L2_CID_CONTRAST,
+                       .name = "Contrast",
+                       .minimum = 0,
+                       .maximum = 0xff,
+                       .step = 1,
+                       .default_value = 0x3f,
+                       .type = V4L2_CTRL_TYPE_INTEGER,
+               },
+               .off = 0,
+               .reg = LUMA_CTRL,
+               .mask = 0xff00,
+               .shift = 8,
+       }, {
+               .v = {
+                       .id = V4L2_CID_HUE,
+                       .name = "Hue",
+                       .minimum = 0,
+                       .maximum = 0xff,
+                       .step = 1,
+                       .default_value = 0x7f,
+                       .type = V4L2_CTRL_TYPE_INTEGER,
+               },
+               .off = 128,
+               .reg = CHROMA_CTRL,
+               .mask = 0xff0000,
+               .shift = 16,
+       }, {
+       /* strictly, this only describes only U saturation.
+       * V saturation is handled specially through code.
+       */
+               .v = {
+                       .id = V4L2_CID_SATURATION,
+                       .name = "Saturation",
+                       .minimum = 0,
+                       .maximum = 0xff,
+                       .step = 1,
+                       .default_value = 0x7f,
+                       .type = V4L2_CTRL_TYPE_INTEGER,
+               },
+               .off = 0,
+               .reg = CHROMA_CTRL,
+               .mask = 0x00ff,
+               .shift = 0,
+       }, {
+               /* --- audio --- */
+               .v = {
+                       .id = V4L2_CID_AUDIO_MUTE,
+                       .name = "Mute",
+                       .minimum = 0,
+                       .maximum = 1,
+                       .default_value = 1,
+                       .type = V4L2_CTRL_TYPE_BOOLEAN,
+               },
+               .reg = PATH1_CTL1,
+               .mask = (0x1f << 24),
+               .shift = 24,
+       }, {
+               .v = {
+                       .id = V4L2_CID_AUDIO_VOLUME,
+                       .name = "Volume",
+                       .minimum = 0,
+                       .maximum = 0x3f,
+                       .step = 1,
+                       .default_value = 0x3f,
+                       .type = V4L2_CTRL_TYPE_INTEGER,
+               },
+               .reg = PATH1_VOL_CTL,
+               .mask = 0xff,
+               .shift = 0,
+       }
+};
+static const int CX231XX_CTLS = ARRAY_SIZE(cx231xx_ctls);
+
+static const u32 cx231xx_user_ctrls[] = {
+       V4L2_CID_USER_CLASS,
+       V4L2_CID_BRIGHTNESS,
+       V4L2_CID_CONTRAST,
+       V4L2_CID_SATURATION,
+       V4L2_CID_HUE,
+       V4L2_CID_AUDIO_VOLUME,
+#if 0
+       V4L2_CID_AUDIO_BALANCE,
+#endif
+       V4L2_CID_AUDIO_MUTE,
+       0
+};
+
+static const u32 *ctrl_classes[] = {
+       cx231xx_user_ctrls,
+       NULL
+};
+
+/* ------------------------------------------------------------------
+       Video buffer and parser functions
+   ------------------------------------------------------------------*/
+
+/*
+ * Announces that a buffer were filled and request the next
+ */
+static inline void buffer_filled(struct cx231xx *dev,
+                                struct cx231xx_dmaqueue *dma_q,
+                                struct cx231xx_buffer *buf)
+{
+       /* Advice that buffer was filled */
+       cx231xx_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
+       buf->vb.state = VIDEOBUF_DONE;
+       buf->vb.field_count++;
+       do_gettimeofday(&buf->vb.ts);
+
+       dev->video_mode.isoc_ctl.buf = NULL;
+
+       list_del(&buf->vb.queue);
+       wake_up(&buf->vb.done);
+}
+
+static inline void print_err_status(struct cx231xx *dev, int packet, int status)
+{
+       char *errmsg = "Unknown";
+
+       switch (status) {
+       case -ENOENT:
+               errmsg = "unlinked synchronuously";
+               break;
+       case -ECONNRESET:
+               errmsg = "unlinked asynchronuously";
+               break;
+       case -ENOSR:
+               errmsg = "Buffer error (overrun)";
+               break;
+       case -EPIPE:
+               errmsg = "Stalled (device not responding)";
+               break;
+       case -EOVERFLOW:
+               errmsg = "Babble (bad cable?)";
+               break;
+       case -EPROTO:
+               errmsg = "Bit-stuff error (bad cable?)";
+               break;
+       case -EILSEQ:
+               errmsg = "CRC/Timeout (could be anything)";
+               break;
+       case -ETIME:
+               errmsg = "Device does not respond";
+               break;
+       }
+       if (packet < 0) {
+               cx231xx_isocdbg("URB status %d [%s].\n", status, errmsg);
+       } else {
+               cx231xx_isocdbg("URB packet %d, status %d [%s].\n",
+                               packet, status, errmsg);
+       }
+}
+
+/*
+ * video-buf generic routine to get the next available buffer
+ */
+static inline void get_next_buf(struct cx231xx_dmaqueue *dma_q,
+                               struct cx231xx_buffer **buf)
+{
+       struct cx231xx_video_mode *vmode =
+           container_of(dma_q, struct cx231xx_video_mode, vidq);
+       struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
+
+       char *outp;
+
+       if (list_empty(&dma_q->active)) {
+               cx231xx_isocdbg("No active queue to serve\n");
+               dev->video_mode.isoc_ctl.buf = NULL;
+               *buf = NULL;
+               return;
+       }
+
+       /* Get the next buffer */
+       *buf = list_entry(dma_q->active.next, struct cx231xx_buffer, vb.queue);
+
+       /* Cleans up buffer - Usefull for testing for frame/URB loss */
+       outp = videobuf_to_vmalloc(&(*buf)->vb);
+       memset(outp, 0, (*buf)->vb.size);
+
+       dev->video_mode.isoc_ctl.buf = *buf;
+
+       return;
+}
+
+/*
+ * Controls the isoc copy of each urb packet
+ */
+static inline int cx231xx_isoc_copy(struct cx231xx *dev, struct urb *urb)
+{
+       struct cx231xx_buffer *buf;
+       struct cx231xx_dmaqueue *dma_q = urb->context;
+       unsigned char *outp = NULL;
+       int i, rc = 1;
+       unsigned char *p_buffer;
+       u32 bytes_parsed = 0, buffer_size = 0;
+       u8 sav_eav = 0;
+
+       if (!dev)
+               return 0;
+
+       if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
+               return 0;
+
+       if (urb->status < 0) {
+               print_err_status(dev, -1, urb->status);
+               if (urb->status == -ENOENT)
+                       return 0;
+       }
+
+       buf = dev->video_mode.isoc_ctl.buf;
+       if (buf != NULL)
+               outp = videobuf_to_vmalloc(&buf->vb);
+
+       for (i = 0; i < urb->number_of_packets; i++) {
+               int status = urb->iso_frame_desc[i].status;
+
+               if (status < 0) {
+                       print_err_status(dev, i, status);
+                       if (urb->iso_frame_desc[i].status != -EPROTO)
+                               continue;
+               }
+
+               if (urb->iso_frame_desc[i].actual_length <= 0) {
+                       /* cx231xx_isocdbg("packet %d is empty",i); - spammy */
+                       continue;
+               }
+               if (urb->iso_frame_desc[i].actual_length >
+                   dev->video_mode.max_pkt_size) {
+                       cx231xx_isocdbg("packet bigger than packet size");
+                       continue;
+               }
+
+               /*  get buffer pointer and length */
+               p_buffer = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
+               buffer_size = urb->iso_frame_desc[i].actual_length;
+               bytes_parsed = 0;
+
+               if (dma_q->is_partial_line) {
+                       /* Handle the case of a partial line */
+                       sav_eav = dma_q->last_sav;
+               } else {
+                       /* Check for a SAV/EAV overlapping
+                               the buffer boundary */
+                       sav_eav =
+                           cx231xx_find_boundary_SAV_EAV(p_buffer,
+                                                         dma_q->partial_buf,
+                                                         &bytes_parsed);
+               }
+
+               sav_eav &= 0xF0;
+               /* Get the first line if we have some portion of an SAV/EAV from
+                  the last buffer or a partial line  */
+               if (sav_eav) {
+                       bytes_parsed += cx231xx_get_video_line(dev, dma_q,
+                               sav_eav,        /* SAV/EAV */
+                               p_buffer + bytes_parsed,        /* p_buffer */
+                               buffer_size - bytes_parsed);/* buf size */
+               }
+
+               /* Now parse data that is completely in this buffer */
+               /* dma_q->is_partial_line = 0;  */
+
+               while (bytes_parsed < buffer_size) {
+                       u32 bytes_used = 0;
+
+                       sav_eav = cx231xx_find_next_SAV_EAV(
+                               p_buffer + bytes_parsed,        /* p_buffer */
+                               buffer_size - bytes_parsed,     /* buf size */
+                               &bytes_used);/* bytes used to get SAV/EAV */
+
+                       bytes_parsed += bytes_used;
+
+                       sav_eav &= 0xF0;
+                       if (sav_eav && (bytes_parsed < buffer_size)) {
+                               bytes_parsed += cx231xx_get_video_line(dev,
+                                       dma_q, sav_eav, /* SAV/EAV */
+                                       p_buffer + bytes_parsed,/* p_buffer */
+                                       buffer_size - bytes_parsed);/*buf size*/
+                       }
+               }
+
+               /* Save the last four bytes of the buffer so we can check the
+                  buffer boundary condition next time */
+               memcpy(dma_q->partial_buf, p_buffer + buffer_size - 4, 4);
+               bytes_parsed = 0;
+
+       }
+       return rc;
+}
+
+u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf,
+                                u32 *p_bytes_used)
+{
+       u32 bytes_used;
+       u8 boundary_bytes[8];
+       u8 sav_eav = 0;
+
+       *p_bytes_used = 0;
+
+       /* Create an array of the last 4 bytes of the last buffer and the first
+          4 bytes of the current buffer. */
+
+       memcpy(boundary_bytes, partial_buf, 4);
+       memcpy(boundary_bytes + 4, p_buffer, 4);
+
+       /* Check for the SAV/EAV in the boundary buffer */
+       sav_eav = cx231xx_find_next_SAV_EAV((u8 *)&boundary_bytes, 8,
+                                           &bytes_used);
+
+       if (sav_eav) {
+               /* found a boundary SAV/EAV.  Updates the bytes used to reflect
+                  only those used in the new buffer */
+               *p_bytes_used = bytes_used - 4;
+       }
+
+       return sav_eav;
+}
+
+u8 cx231xx_find_next_SAV_EAV(u8 *p_buffer, u32 buffer_size, u32 *p_bytes_used)
+{
+       u32 i;
+       u8 sav_eav = 0;
+
+       /*
+        * Don't search if the buffer size is less than 4.  It causes a page
+        * fault since buffer_size - 4 evaluates to a large number in that
+        * case.
+        */
+       if (buffer_size < 4) {
+               *p_bytes_used = buffer_size;
+               return 0;
+       }
+
+       for (i = 0; i < (buffer_size - 3); i++) {
+
+               if ((p_buffer[i] == 0xFF) &&
+                   (p_buffer[i + 1] == 0x00) && (p_buffer[i + 2] == 0x00)) {
+
+                       *p_bytes_used = i + 4;
+                       sav_eav = p_buffer[i + 3];
+                       return sav_eav;
+               }
+       }
+
+       *p_bytes_used = buffer_size;
+       return 0;
+}
+
+u32 cx231xx_get_video_line(struct cx231xx *dev,
+                          struct cx231xx_dmaqueue *dma_q, u8 sav_eav,
+                          u8 *p_buffer, u32 buffer_size)
+{
+       u32 bytes_copied = 0;
+       int current_field = -1;
+
+       switch (sav_eav) {
+       case SAV_ACTIVE_VIDEO_FIELD1:
+               /* looking for skipped line which occurred in PAL 720x480 mode.
+                  In this case, there will be no active data contained
+                  between the SAV and EAV */
+               if ((buffer_size > 3) && (p_buffer[0] == 0xFF) &&
+                   (p_buffer[1] == 0x00) && (p_buffer[2] == 0x00) &&
+                   ((p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD1) ||
+                    (p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD2) ||
+                    (p_buffer[3] == EAV_VBLANK_FIELD1) ||
+                    (p_buffer[3] == EAV_VBLANK_FIELD2)))
+                       return bytes_copied;
+               current_field = 1;
+               break;
+
+       case SAV_ACTIVE_VIDEO_FIELD2:
+               /* looking for skipped line which occurred in PAL 720x480 mode.
+                  In this case, there will be no active data contained between
+                  the SAV and EAV */
+               if ((buffer_size > 3) && (p_buffer[0] == 0xFF) &&
+                   (p_buffer[1] == 0x00) && (p_buffer[2] == 0x00) &&
+                   ((p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD1) ||
+                    (p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD2) ||
+                    (p_buffer[3] == EAV_VBLANK_FIELD1)       ||
+                    (p_buffer[3] == EAV_VBLANK_FIELD2)))
+                       return bytes_copied;
+               current_field = 2;
+               break;
+       }
+
+       dma_q->last_sav = sav_eav;
+
+       bytes_copied = cx231xx_copy_video_line(dev, dma_q, p_buffer,
+                                              buffer_size, current_field);
+
+       return bytes_copied;
+}
+
+u32 cx231xx_copy_video_line(struct cx231xx *dev,
+                           struct cx231xx_dmaqueue *dma_q, u8 *p_line,
+                           u32 length, int field_number)
+{
+       u32 bytes_to_copy;
+       struct cx231xx_buffer *buf;
+       u32 _line_size = dev->width * 2;
+
+       if (dma_q->current_field != field_number)
+               cx231xx_reset_video_buffer(dev, dma_q);
+
+       /* get the buffer pointer */
+       buf = dev->video_mode.isoc_ctl.buf;
+
+       /* Remember the field number for next time */
+       dma_q->current_field = field_number;
+
+       bytes_to_copy = dma_q->bytes_left_in_line;
+       if (bytes_to_copy > length)
+               bytes_to_copy = length;
+
+       if (dma_q->lines_completed >= dma_q->lines_per_field) {
+               dma_q->bytes_left_in_line -= bytes_to_copy;
+               dma_q->is_partial_line = (dma_q->bytes_left_in_line == 0) ?
+                                         0 : 1;
+               return 0;
+       }
+
+       dma_q->is_partial_line = 1;
+
+       /* If we don't have a buffer, just return the number of bytes we would
+          have copied if we had a buffer. */
+       if (!buf) {
+               dma_q->bytes_left_in_line -= bytes_to_copy;
+               dma_q->is_partial_line = (dma_q->bytes_left_in_line == 0)
+                                        ? 0 : 1;
+               return bytes_to_copy;
+       }
+
+       /* copy the data to video buffer */
+       cx231xx_do_copy(dev, dma_q, p_line, bytes_to_copy);
+
+       dma_q->pos += bytes_to_copy;
+       dma_q->bytes_left_in_line -= bytes_to_copy;
+
+       if (dma_q->bytes_left_in_line == 0) {
+               dma_q->bytes_left_in_line = _line_size;
+               dma_q->lines_completed++;
+               dma_q->is_partial_line = 0;
+
+               if (cx231xx_is_buffer_done(dev, dma_q) && buf) {
+                       buffer_filled(dev, dma_q, buf);
+
+                       dma_q->pos = 0;
+                       buf = NULL;
+                       dma_q->lines_completed = 0;
+               }
+       }
+
+       return bytes_to_copy;
+}
+
+void cx231xx_reset_video_buffer(struct cx231xx *dev,
+                               struct cx231xx_dmaqueue *dma_q)
+{
+       struct cx231xx_buffer *buf;
+
+       /* handle the switch from field 1 to field 2 */
+       if (dma_q->current_field == 1) {
+               if (dma_q->lines_completed >= dma_q->lines_per_field)
+                       dma_q->field1_done = 1;
+               else
+                       dma_q->field1_done = 0;
+       }
+
+       buf = dev->video_mode.isoc_ctl.buf;
+
+       if (buf == NULL) {
+               u8 *outp = NULL;
+               /* first try to get the buffer */
+               get_next_buf(dma_q, &buf);
+
+               if (buf)
+                       outp = videobuf_to_vmalloc(&buf->vb);
+
+               dma_q->pos = 0;
+               dma_q->field1_done = 0;
+               dma_q->current_field = -1;
+       }
+
+       /* reset the counters */
+       dma_q->bytes_left_in_line = dev->width << 1;
+       dma_q->lines_completed = 0;
+}
+
+int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                   u8 *p_buffer, u32 bytes_to_copy)
+{
+       u8 *p_out_buffer = NULL;
+       u32 current_line_bytes_copied = 0;
+       struct cx231xx_buffer *buf;
+       u32 _line_size = dev->width << 1;
+       void *startwrite;
+       int offset, lencopy;
+
+       buf = dev->video_mode.isoc_ctl.buf;
+
+       if (buf == NULL)
+               return -1;
+
+       p_out_buffer = videobuf_to_vmalloc(&buf->vb);
+
+       current_line_bytes_copied = _line_size - dma_q->bytes_left_in_line;
+
+       /* Offset field 2 one line from the top of the buffer */
+       offset = (dma_q->current_field == 1) ? 0 : _line_size;
+
+       /* Offset for field 2 */
+       startwrite = p_out_buffer + offset;
+
+       /* lines already completed in the current field */
+       startwrite += (dma_q->lines_completed * _line_size * 2);
+
+       /* bytes already completed in the current line */
+       startwrite += current_line_bytes_copied;
+
+       lencopy = dma_q->bytes_left_in_line > bytes_to_copy ?
+                 bytes_to_copy : dma_q->bytes_left_in_line;
+
+       if ((u8 *)(startwrite + lencopy) > (u8 *)(p_out_buffer + buf->vb.size))
+               return 0;
+
+       /* The below copies the UYVY data straight into video buffer */
+       cx231xx_swab((u16 *) p_buffer, (u16 *) startwrite, (u16) lencopy);
+
+       return 0;
+}
+
+void cx231xx_swab(u16 *from, u16 *to, u16 len)
+{
+       u16 i;
+
+       if (len <= 0)
+               return;
+
+       for (i = 0; i < len / 2; i++)
+               to[i] = (from[i] << 8) | (from[i] >> 8);
+}
+
+u8 cx231xx_is_buffer_done(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q)
+{
+       u8 buffer_complete = 0;
+
+       /* Dual field stream */
+       buffer_complete = ((dma_q->current_field == 2) &&
+                          (dma_q->lines_completed >= dma_q->lines_per_field) &&
+                           dma_q->field1_done);
+
+       return buffer_complete;
+}
+
+/* ------------------------------------------------------------------
+       Videobuf operations
+   ------------------------------------------------------------------*/
+
+static int
+buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
+{
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx *dev = fh->dev;
+       struct v4l2_frequency f;
+
+       *size = (fh->dev->width * fh->dev->height * dev->format->depth + 7)>>3;
+       if (0 == *count)
+               *count = CX231XX_DEF_BUF;
+
+       if (*count < CX231XX_MIN_BUF)
+               *count = CX231XX_MIN_BUF;
+
+       /* Ask tuner to go to analog mode */
+       memset(&f, 0, sizeof(f));
+       f.frequency = dev->ctl_freq;
+       f.type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
+
+       call_all(dev, tuner, s_frequency, &f);
+
+       return 0;
+}
+
+/* This is called *without* dev->slock held; please keep it that way */
+static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
+{
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx *dev = fh->dev;
+       unsigned long flags = 0;
+
+       if (in_interrupt())
+               BUG();
+
+       /* We used to wait for the buffer to finish here, but this didn't work
+          because, as we were keeping the state as VIDEOBUF_QUEUED,
+          videobuf_queue_cancel marked it as finished for us.
+          (Also, it could wedge forever if the hardware was misconfigured.)
+
+          This should be safe; by the time we get here, the buffer isn't
+          queued anymore. If we ever start marking the buffers as
+          VIDEOBUF_ACTIVE, it won't be, though.
+        */
+       spin_lock_irqsave(&dev->video_mode.slock, flags);
+       if (dev->video_mode.isoc_ctl.buf == buf)
+               dev->video_mode.isoc_ctl.buf = NULL;
+       spin_unlock_irqrestore(&dev->video_mode.slock, flags);
+
+       videobuf_vmalloc_free(&buf->vb);
+       buf->vb.state = VIDEOBUF_NEEDS_INIT;
+}
+
+static int
+buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
+              enum v4l2_field field)
+{
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+       struct cx231xx *dev = fh->dev;
+       int rc = 0, urb_init = 0;
+
+       /* The only currently supported format is 16 bits/pixel */
+       buf->vb.size = (fh->dev->width * fh->dev->height * dev->format->depth
+                       + 7) >> 3;
+       if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
+               return -EINVAL;
+
+       buf->vb.width = dev->width;
+       buf->vb.height = dev->height;
+       buf->vb.field = field;
+
+       if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
+               rc = videobuf_iolock(vq, &buf->vb, NULL);
+               if (rc < 0)
+                       goto fail;
+       }
+
+       if (!dev->video_mode.isoc_ctl.num_bufs)
+               urb_init = 1;
+
+       if (urb_init) {
+               rc = cx231xx_init_isoc(dev, CX231XX_NUM_PACKETS,
+                                      CX231XX_NUM_BUFS,
+                                      dev->video_mode.max_pkt_size,
+                                      cx231xx_isoc_copy);
+               if (rc < 0)
+                       goto fail;
+       }
+
+       buf->vb.state = VIDEOBUF_PREPARED;
+       return 0;
+
+fail:
+       free_buffer(vq, buf);
+       return rc;
+}
+
+static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
+{
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx *dev = fh->dev;
+       struct cx231xx_dmaqueue *vidq = &dev->video_mode.vidq;
+
+       buf->vb.state = VIDEOBUF_QUEUED;
+       list_add_tail(&buf->vb.queue, &vidq->active);
+
+}
+
+static void buffer_release(struct videobuf_queue *vq,
+                          struct videobuf_buffer *vb)
+{
+       struct cx231xx_buffer *buf =
+           container_of(vb, struct cx231xx_buffer, vb);
+       struct cx231xx_fh *fh = vq->priv_data;
+       struct cx231xx *dev = (struct cx231xx *)fh->dev;
+
+       cx231xx_isocdbg("cx231xx: called buffer_release\n");
+
+       free_buffer(vq, buf);
+}
+
+static struct videobuf_queue_ops cx231xx_video_qops = {
+       .buf_setup = buffer_setup,
+       .buf_prepare = buffer_prepare,
+       .buf_queue = buffer_queue,
+       .buf_release = buffer_release,
+};
+
+/*********************  v4l2 interface  **************************************/
+
+void video_mux(struct cx231xx *dev, int index)
+{
+       dev->video_input = index;
+       dev->ctl_ainput = INPUT(index)->amux;
+
+       cx231xx_set_video_input_mux(dev, index);
+
+       cx25840_call(dev, video, s_routing, INPUT(index)->vmux, 0, 0);
+
+       cx231xx_set_audio_input(dev, dev->ctl_ainput);
+
+       cx231xx_info("video_mux : %d\n", index);
+
+       /* do mode control overrides if required */
+       cx231xx_do_mode_ctrl_overrides(dev);
+}
+
+/* Usage lock check functions */
+static int res_get(struct cx231xx_fh *fh)
+{
+       struct cx231xx *dev = fh->dev;
+       int rc = 0;
+
+       /* This instance already has stream_on */
+       if (fh->stream_on)
+               return rc;
+
+       if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+               if (dev->stream_on)
+                       return -EBUSY;
+               dev->stream_on = 1;
+       } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
+               if (dev->vbi_stream_on)
+                       return -EBUSY;
+               dev->vbi_stream_on = 1;
+       } else
+               return -EINVAL;
+
+       fh->stream_on = 1;
+
+       return rc;
+}
+
+static int res_check(struct cx231xx_fh *fh)
+{
+       return fh->stream_on;
+}
+
+static void res_free(struct cx231xx_fh *fh)
+{
+       struct cx231xx *dev = fh->dev;
+
+       fh->stream_on = 0;
+
+       if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
+               dev->stream_on = 0;
+       if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
+               dev->vbi_stream_on = 0;
+}
+
+static int check_dev(struct cx231xx *dev)
+{
+       if (dev->state & DEV_DISCONNECTED) {
+               cx231xx_errdev("v4l2 ioctl: device not present\n");
+               return -ENODEV;
+       }
+
+       if (dev->state & DEV_MISCONFIGURED) {
+               cx231xx_errdev("v4l2 ioctl: device is misconfigured; "
+                              "close and open it again\n");
+               return -EIO;
+       }
+       return 0;
+}
+
+void get_scale(struct cx231xx *dev,
+              unsigned int width, unsigned int height,
+              unsigned int *hscale, unsigned int *vscale)
+{
+       unsigned int maxw = norm_maxw(dev);
+       unsigned int maxh = norm_maxh(dev);
+
+       *hscale = (((unsigned long)maxw) << 12) / width - 4096L;
+       if (*hscale >= 0x4000)
+               *hscale = 0x3fff;
+
+       *vscale = (((unsigned long)maxh) << 12) / height - 4096L;
+       if (*vscale >= 0x4000)
+               *vscale = 0x3fff;
+
+       dev->hscale = *hscale;
+       dev->vscale = *vscale;
+
+}
+
+/* ------------------------------------------------------------------
+       IOCTL vidioc handling
+   ------------------------------------------------------------------*/
+
+static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
+                               struct v4l2_format *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       mutex_lock(&dev->lock);
+
+       f->fmt.pix.width = dev->width;
+       f->fmt.pix.height = dev->height;
+       f->fmt.pix.pixelformat = dev->format->fourcc;;
+       f->fmt.pix.bytesperline = (dev->width * dev->format->depth + 7) >> 3;;
+       f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * dev->height;
+       f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
+
+       f->fmt.pix.field = V4L2_FIELD_INTERLACED;
+
+       mutex_unlock(&dev->lock);
+
+       return 0;
+}
+
+static struct cx231xx_fmt *format_by_fourcc(unsigned int fourcc)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(format); i++)
+               if (format[i].fourcc == fourcc)
+                       return &format[i];
+
+       return NULL;
+}
+
+static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
+                                 struct v4l2_format *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int width = f->fmt.pix.width;
+       int height = f->fmt.pix.height;
+       unsigned int maxw = norm_maxw(dev);
+       unsigned int maxh = norm_maxh(dev);
+       unsigned int hscale, vscale;
+       struct cx231xx_fmt *fmt;
+
+       fmt = format_by_fourcc(f->fmt.pix.pixelformat);
+       if (!fmt) {
+               cx231xx_videodbg("Fourcc format (%08x) invalid.\n",
+                                f->fmt.pix.pixelformat);
+               return -EINVAL;
+       }
+
+       /* width must even because of the YUYV format
+          height must be even because of interlacing */
+       height &= 0xfffe;
+       width &= 0xfffe;
+
+       if (unlikely(height < 32))
+               height = 32;
+       if (unlikely(height > maxh))
+               height = maxh;
+       if (unlikely(width < 48))
+               width = 48;
+       if (unlikely(width > maxw))
+               width = maxw;
+
+       get_scale(dev, width, height, &hscale, &vscale);
+
+       width = (((unsigned long)maxw) << 12) / (hscale + 4096L);
+       height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
+
+       f->fmt.pix.width = width;
+       f->fmt.pix.height = height;
+       f->fmt.pix.pixelformat = fmt->fourcc;
+       f->fmt.pix.bytesperline = (dev->width * fmt->depth + 7) >> 3;
+       f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height;
+       f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
+       f->fmt.pix.field = V4L2_FIELD_INTERLACED;
+
+       return 0;
+}
+
+static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
+                               struct v4l2_format *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+       struct cx231xx_fmt *fmt;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&dev->lock);
+
+       vidioc_try_fmt_vid_cap(file, priv, f);
+
+       fmt = format_by_fourcc(f->fmt.pix.pixelformat);
+       if (!fmt) {
+               rc = -EINVAL;
+               goto out;
+       }
+
+       if (videobuf_queue_is_busy(&fh->vb_vidq)) {
+               cx231xx_errdev("%s queue busy\n", __func__);
+               rc = -EBUSY;
+               goto out;
+       }
+
+       if (dev->stream_on && !fh->stream_on) {
+               cx231xx_errdev("%s device in use by another fh\n", __func__);
+               rc = -EBUSY;
+               goto out;
+       }
+
+       /* set new image size */
+       dev->width = f->fmt.pix.width;
+       dev->height = f->fmt.pix.height;
+       dev->format = fmt;
+       get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
+
+       call_all(dev, video, s_fmt, f);
+
+       /* Set the correct alternate setting for this resolution */
+       cx231xx_resolution_set(dev);
+
+out:
+       mutex_unlock(&dev->lock);
+       return rc;
+}
+
+static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id * id)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       *id = dev->norm;
+       return 0;
+}
+
+static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       struct v4l2_format f;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       cx231xx_info("vidioc_s_std : 0x%x\n", (unsigned int)*norm);
+
+       mutex_lock(&dev->lock);
+       dev->norm = *norm;
+
+       /* Adjusts width/height, if needed */
+       f.fmt.pix.width = dev->width;
+       f.fmt.pix.height = dev->height;
+       vidioc_try_fmt_vid_cap(file, priv, &f);
+
+       /* set new image size */
+       dev->width = f.fmt.pix.width;
+       dev->height = f.fmt.pix.height;
+       get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
+
+       call_all(dev, core, s_std, dev->norm);
+
+       mutex_unlock(&dev->lock);
+
+       cx231xx_resolution_set(dev);
+
+       /* do mode control overrides */
+       cx231xx_do_mode_ctrl_overrides(dev);
+
+       return 0;
+}
+
+static const char *iname[] = {
+       [CX231XX_VMUX_COMPOSITE1] = "Composite1",
+       [CX231XX_VMUX_SVIDEO]     = "S-Video",
+       [CX231XX_VMUX_TELEVISION] = "Television",
+       [CX231XX_VMUX_CABLE]      = "Cable TV",
+       [CX231XX_VMUX_DVB]        = "DVB",
+       [CX231XX_VMUX_DEBUG]      = "for debug only",
+};
+
+static int vidioc_enum_input(struct file *file, void *priv,
+                            struct v4l2_input *i)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       unsigned int n;
+
+       n = i->index;
+       if (n >= MAX_CX231XX_INPUT)
+               return -EINVAL;
+       if (0 == INPUT(n)->type)
+               return -EINVAL;
+
+       i->index = n;
+       i->type = V4L2_INPUT_TYPE_CAMERA;
+
+       strcpy(i->name, iname[INPUT(n)->type]);
+
+       if ((CX231XX_VMUX_TELEVISION == INPUT(n)->type) ||
+           (CX231XX_VMUX_CABLE == INPUT(n)->type))
+               i->type = V4L2_INPUT_TYPE_TUNER;
+
+       i->std = dev->vdev->tvnorms;
+
+       return 0;
+}
+
+static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       *i = dev->video_input;
+
+       return 0;
+}
+
+static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       if (i >= MAX_CX231XX_INPUT)
+               return -EINVAL;
+       if (0 == INPUT(i)->type)
+               return -EINVAL;
+
+       mutex_lock(&dev->lock);
+
+       video_mux(dev, i);
+
+       mutex_unlock(&dev->lock);
+       return 0;
+}
+
+static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       switch (a->index) {
+       case CX231XX_AMUX_VIDEO:
+               strcpy(a->name, "Television");
+               break;
+       case CX231XX_AMUX_LINE_IN:
+               strcpy(a->name, "Line In");
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       a->index = dev->ctl_ainput;
+       a->capability = V4L2_AUDCAP_STEREO;
+
+       return 0;
+}
+
+static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int status = 0;
+
+       /* Doesn't allow manual routing */
+       if (a->index != dev->ctl_ainput)
+               return -EINVAL;
+
+       dev->ctl_ainput = INPUT(a->index)->amux;
+       status = cx231xx_set_audio_input(dev, dev->ctl_ainput);
+
+       return status;
+}
+
+static int vidioc_queryctrl(struct file *file, void *priv,
+                           struct v4l2_queryctrl *qc)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int id = qc->id;
+       int i;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       qc->id = v4l2_ctrl_next(ctrl_classes, qc->id);
+       if (unlikely(qc->id == 0))
+               return -EINVAL;
+
+       memset(qc, 0, sizeof(*qc));
+
+       qc->id = id;
+
+       if (qc->id < V4L2_CID_BASE || qc->id >= V4L2_CID_LASTP1)
+               return -EINVAL;
+
+       for (i = 0; i < CX231XX_CTLS; i++)
+               if (cx231xx_ctls[i].v.id == qc->id)
+                       break;
+
+       if (i == CX231XX_CTLS) {
+               *qc = no_ctl;
+               return 0;
+       }
+       *qc = cx231xx_ctls[i].v;
+
+       mutex_lock(&dev->lock);
+       call_all(dev, core, queryctrl, qc);
+       mutex_unlock(&dev->lock);
+
+       if (qc->type)
+               return 0;
+       else
+               return -EINVAL;
+}
+
+static int vidioc_g_ctrl(struct file *file, void *priv,
+                        struct v4l2_control *ctrl)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&dev->lock);
+       call_all(dev, core, g_ctrl, ctrl);
+       mutex_unlock(&dev->lock);
+       return rc;
+}
+
+static int vidioc_s_ctrl(struct file *file, void *priv,
+                        struct v4l2_control *ctrl)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&dev->lock);
+       call_all(dev, core, s_ctrl, ctrl);
+       mutex_unlock(&dev->lock);
+       return rc;
+}
+
+static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       if (0 != t->index)
+               return -EINVAL;
+
+       strcpy(t->name, "Tuner");
+
+       t->type = V4L2_TUNER_ANALOG_TV;
+       t->capability = V4L2_TUNER_CAP_NORM;
+       t->rangehigh = 0xffffffffUL;
+       t->signal = 0xffff;     /* LOCKED */
+
+       return 0;
+}
+
+static int vidioc_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       if (0 != t->index)
+               return -EINVAL;
+#if 0
+       mutex_lock(&dev->lock);
+       call_all(dev, tuner, s_tuner, t);
+       mutex_unlock(&dev->lock);
+#endif
+       return 0;
+}
+
+static int vidioc_g_frequency(struct file *file, void *priv,
+                             struct v4l2_frequency *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       mutex_lock(&dev->lock);
+       f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
+       f->frequency = dev->ctl_freq;
+
+       call_all(dev, tuner, g_frequency, f);
+
+       mutex_unlock(&dev->lock);
+
+       return 0;
+}
+
+static int vidioc_s_frequency(struct file *file, void *priv,
+                             struct v4l2_frequency *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       if (0 != f->tuner)
+               return -EINVAL;
+
+       if (unlikely(0 == fh->radio && f->type != V4L2_TUNER_ANALOG_TV))
+               return -EINVAL;
+       if (unlikely(1 == fh->radio && f->type != V4L2_TUNER_RADIO))
+               return -EINVAL;
+
+       /* set pre channel change settings in DIF first */
+       rc = cx231xx_tuner_pre_channel_change(dev);
+
+       mutex_lock(&dev->lock);
+
+       dev->ctl_freq = f->frequency;
+
+       if (dev->tuner_type == TUNER_XC5000) {
+               if (dev->cx231xx_set_analog_freq != NULL)
+                       dev->cx231xx_set_analog_freq(dev, f->frequency);
+       } else
+               call_all(dev, tuner, s_frequency, f);
+
+       mutex_unlock(&dev->lock);
+
+       /* set post channel change settings in DIF first */
+       rc = cx231xx_tuner_post_channel_change(dev);
+
+       cx231xx_info("Set New FREQUENCY to %d\n", f->frequency);
+
+       return rc;
+}
+
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+
+/*
+  -R, --list-registers=type=<host/i2cdrv/i2caddr>,
+                               chip=<chip>[,min=<addr>,max=<addr>]
+                    dump registers from <min> to <max> [VIDIOC_DBG_G_REGISTER]
+  -r, --set-register=type=<host/i2cdrv/i2caddr>,
+                               chip=<chip>,reg=<addr>,val=<val>
+                    set the register [VIDIOC_DBG_S_REGISTER]
+
+  if type == host, then <chip> is the hosts chip ID (default 0)
+  if type == i2cdrv (default), then <chip> is the I2C driver name or ID
+  if type == i2caddr, then <chip> is the 7-bit I2C address
+*/
+
+static int vidioc_g_register(struct file *file, void *priv,
+                            struct v4l2_dbg_register *reg)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int ret = 0;
+       u8 value[4] = { 0, 0, 0, 0 };
+       u32 data = 0;
+
+       switch (reg->match.type) {
+       case V4L2_CHIP_MATCH_HOST:
+               switch (reg->match.addr) {
+               case 0: /* Cx231xx - internal registers */
+                       ret = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER,
+                                                 (u16)reg->reg, value, 4);
+                       reg->val = value[0] | value[1] << 8 |
+                                  value[2] << 16 | value[3] << 24;
+                       break;
+               case 1: /* AFE - read byte */
+                       ret = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
+                                                 (u16)reg->reg, 2, &data, 1);
+                       reg->val = le32_to_cpu(data & 0xff);
+                       break;
+               case 14: /* AFE - read dword */
+                       ret = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
+                                                 (u16)reg->reg, 2, &data, 4);
+                       reg->val = le32_to_cpu(data);
+                       break;
+               case 2: /* Video Block - read byte */
+                       ret = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
+                                                 (u16)reg->reg, 2, &data, 1);
+                       reg->val = le32_to_cpu(data & 0xff);
+                       break;
+               case 24: /* Video Block - read dword */
+                       ret = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
+                                                 (u16)reg->reg, 2, &data, 4);
+                       reg->val = le32_to_cpu(data);
+                       break;
+               case 3: /* I2S block - read byte */
+                       ret = cx231xx_read_i2c_data(dev,
+                                                   I2S_BLK_DEVICE_ADDRESS,
+                                                   (u16)reg->reg, 1,
+                                                   &data, 1);
+                       reg->val = le32_to_cpu(data & 0xff);
+                       break;
+               case 34: /* I2S Block - read dword */
+                       ret =
+                           cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
+                                                 (u16)reg->reg, 1, &data, 4);
+                       reg->val = le32_to_cpu(data);
+                       break;
+               }
+               return ret < 0 ? ret : 0;
+
+       case V4L2_CHIP_MATCH_I2C_DRIVER:
+               call_all(dev, core, g_register, reg);
+               return 0;
+       case V4L2_CHIP_MATCH_I2C_ADDR:
+               /* Not supported yet */
+               return -EINVAL;
+       default:
+               if (!v4l2_chip_match_host(&reg->match))
+                       return -EINVAL;
+       }
+
+       mutex_lock(&dev->lock);
+       call_all(dev, core, g_register, reg);
+       mutex_unlock(&dev->lock);
+
+       return ret;
+}
+
+static int vidioc_s_register(struct file *file, void *priv,
+                            struct v4l2_dbg_register *reg)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int ret = 0;
+       __le64 buf;
+       u32 value;
+       u8 data[4] = { 0, 0, 0, 0 };
+
+       buf = cpu_to_le64(reg->val);
+
+       switch (reg->match.type) {
+       case V4L2_CHIP_MATCH_HOST:
+               {
+                       value = (u32) buf & 0xffffffff;
+
+                       switch (reg->match.addr) {
+                       case 0: /* cx231xx internal registers */
+                               data[0] = (u8) value;
+                               data[1] = (u8) (value >> 8);
+                               data[2] = (u8) (value >> 16);
+                               data[3] = (u8) (value >> 24);
+                               ret = cx231xx_write_ctrl_reg(dev,
+                                                          VRT_SET_REGISTER,
+                                                          (u16)reg->reg, data,
+                                                          4);
+                               break;
+                       case 1: /* AFE - read byte */
+                               ret = cx231xx_write_i2c_data(dev,
+                                                       AFE_DEVICE_ADDRESS,
+                                                       (u16)reg->reg, 2,
+                                                       value, 1);
+                               break;
+                       case 14: /* AFE - read dword */
+                               ret = cx231xx_write_i2c_data(dev,
+                                                       AFE_DEVICE_ADDRESS,
+                                                       (u16)reg->reg, 2,
+                                                       value, 4);
+                               break;
+                       case 2: /* Video Block - read byte */
+                               ret =
+                                   cx231xx_write_i2c_data(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       (u16)reg->reg, 2,
+                                                       value, 1);
+                               break;
+                       case 24: /* Video Block - read dword */
+                               ret =
+                                   cx231xx_write_i2c_data(dev,
+                                                       VID_BLK_I2C_ADDRESS,
+                                                       (u16)reg->reg, 2,
+                                                       value, 4);
+                               break;
+                       case 3: /* I2S block - read byte */
+                               ret =
+                                   cx231xx_write_i2c_data(dev,
+                                                       I2S_BLK_DEVICE_ADDRESS,
+                                                       (u16)reg->reg, 1,
+                                                       value, 1);
+                               break;
+                       case 34: /* I2S block - read dword */
+                               ret =
+                                   cx231xx_write_i2c_data(dev,
+                                                       I2S_BLK_DEVICE_ADDRESS,
+                                                       (u16)reg->reg, 1,
+                                                       value, 4);
+                               break;
+                       }
+               }
+               return ret < 0 ? ret : 0;
+
+       default:
+               break;
+       }
+
+       mutex_lock(&dev->lock);
+       call_all(dev, core, s_register, reg);
+       mutex_unlock(&dev->lock);
+
+       return ret;
+}
+#endif
+
+static int vidioc_cropcap(struct file *file, void *priv,
+                         struct v4l2_cropcap *cc)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+               return -EINVAL;
+
+       cc->bounds.left = 0;
+       cc->bounds.top = 0;
+       cc->bounds.width = dev->width;
+       cc->bounds.height = dev->height;
+       cc->defrect = cc->bounds;
+       cc->pixelaspect.numerator = 54; /* 4:3 FIXME: remove magic numbers */
+       cc->pixelaspect.denominator = 59;
+
+       return 0;
+}
+
+static int vidioc_streamon(struct file *file, void *priv,
+                          enum v4l2_buf_type type)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&dev->lock);
+       rc = res_get(fh);
+
+       if (likely(rc >= 0))
+               rc = videobuf_streamon(&fh->vb_vidq);
+
+       call_all(dev, video, s_stream, 1);
+
+       mutex_unlock(&dev->lock);
+
+       return rc;
+}
+
+static int vidioc_streamoff(struct file *file, void *priv,
+                           enum v4l2_buf_type type)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       if ((fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
+           (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE))
+               return -EINVAL;
+       if (type != fh->type)
+               return -EINVAL;
+
+       mutex_lock(&dev->lock);
+
+       cx25840_call(dev, video, s_stream, 0);
+
+       videobuf_streamoff(&fh->vb_vidq);
+       res_free(fh);
+
+       mutex_unlock(&dev->lock);
+
+       return 0;
+}
+
+static int vidioc_querycap(struct file *file, void *priv,
+                          struct v4l2_capability *cap)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       strlcpy(cap->driver, "cx231xx", sizeof(cap->driver));
+       strlcpy(cap->card, cx231xx_boards[dev->model].name, sizeof(cap->card));
+       usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
+
+       cap->version = CX231XX_VERSION_CODE;
+
+       cap->capabilities = V4L2_CAP_VBI_CAPTURE |
+#if 0
+               V4L2_CAP_SLICED_VBI_CAPTURE |
+#endif
+               V4L2_CAP_VIDEO_CAPTURE  |
+               V4L2_CAP_AUDIO          |
+               V4L2_CAP_READWRITE      |
+               V4L2_CAP_STREAMING;
+
+       if (dev->tuner_type != TUNER_ABSENT)
+               cap->capabilities |= V4L2_CAP_TUNER;
+
+       return 0;
+}
+
+static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
+                                  struct v4l2_fmtdesc *f)
+{
+       if (unlikely(f->index >= ARRAY_SIZE(format)))
+               return -EINVAL;
+
+       strlcpy(f->description, format[f->index].name, sizeof(f->description));
+       f->pixelformat = format[f->index].fourcc;
+
+       return 0;
+}
+
+/* Sliced VBI ioctls */
+static int vidioc_g_fmt_sliced_vbi_cap(struct file *file, void *priv,
+                                      struct v4l2_format *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&dev->lock);
+
+       f->fmt.sliced.service_set = 0;
+
+       call_all(dev, video, g_fmt, f);
+
+       if (f->fmt.sliced.service_set == 0)
+               rc = -EINVAL;
+
+       mutex_unlock(&dev->lock);
+       return rc;
+}
+
+static int vidioc_try_set_sliced_vbi_cap(struct file *file, void *priv,
+                                        struct v4l2_format *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&dev->lock);
+       call_all(dev, video, g_fmt, f);
+       mutex_unlock(&dev->lock);
+
+       if (f->fmt.sliced.service_set == 0)
+               return -EINVAL;
+
+       return 0;
+}
+
+/* RAW VBI ioctls */
+
+static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
+                               struct v4l2_format *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       f->fmt.vbi.sampling_rate = (dev->norm & V4L2_STD_625_50) ?
+           35468950 : 28636363;
+       f->fmt.vbi.samples_per_line = VBI_LINE_LENGTH;
+       f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
+       f->fmt.vbi.offset = 64 * 4;
+       f->fmt.vbi.start[0] = (dev->norm & V4L2_STD_625_50) ?
+           PAL_VBI_START_LINE : NTSC_VBI_START_LINE;
+       f->fmt.vbi.count[0] = (dev->norm & V4L2_STD_625_50) ?
+           PAL_VBI_LINES : NTSC_VBI_LINES;
+       f->fmt.vbi.start[1] = (dev->norm & V4L2_STD_625_50) ?
+           PAL_VBI_START_LINE + 312 : NTSC_VBI_START_LINE + 263;
+       f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
+
+       return 0;
+
+}
+
+static int vidioc_try_fmt_vbi_cap(struct file *file, void *priv,
+                                 struct v4l2_format *f)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+
+       if (dev->vbi_stream_on && !fh->stream_on) {
+               cx231xx_errdev("%s device in use by another fh\n", __func__);
+               return -EBUSY;
+       }
+
+       f->type = V4L2_BUF_TYPE_VBI_CAPTURE;
+       f->fmt.vbi.sampling_rate = (dev->norm & V4L2_STD_625_50) ?
+           35468950 : 28636363;
+       f->fmt.vbi.samples_per_line = VBI_LINE_LENGTH;
+       f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
+       f->fmt.vbi.offset = 244;
+       f->fmt.vbi.flags = 0;
+       f->fmt.vbi.start[0] = (dev->norm & V4L2_STD_625_50) ?
+           PAL_VBI_START_LINE : NTSC_VBI_START_LINE;
+       f->fmt.vbi.count[0] = (dev->norm & V4L2_STD_625_50) ?
+           PAL_VBI_LINES : NTSC_VBI_LINES;
+       f->fmt.vbi.start[1] = (dev->norm & V4L2_STD_625_50) ?
+           PAL_VBI_START_LINE + 312 : NTSC_VBI_START_LINE + 263;
+       f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
+
+       return 0;
+
+}
+
+static int vidioc_reqbufs(struct file *file, void *priv,
+                         struct v4l2_requestbuffers *rb)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       return videobuf_reqbufs(&fh->vb_vidq, rb);
+}
+
+static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *b)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       return videobuf_querybuf(&fh->vb_vidq, b);
+}
+
+static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       return videobuf_qbuf(&fh->vb_vidq, b);
+}
+
+static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
+{
+       struct cx231xx_fh *fh = priv;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
+}
+
+#ifdef CONFIG_VIDEO_V4L1_COMPAT
+static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
+{
+       struct cx231xx_fh *fh = priv;
+
+       return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
+}
+#endif
+
+/* ----------------------------------------------------------- */
+/* RADIO ESPECIFIC IOCTLS                                      */
+/* ----------------------------------------------------------- */
+
+static int radio_querycap(struct file *file, void *priv,
+                         struct v4l2_capability *cap)
+{
+       struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
+
+       strlcpy(cap->driver, "cx231xx", sizeof(cap->driver));
+       strlcpy(cap->card, cx231xx_boards[dev->model].name, sizeof(cap->card));
+       usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
+
+       cap->version = CX231XX_VERSION_CODE;
+       cap->capabilities = V4L2_CAP_TUNER;
+       return 0;
+}
+
+static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
+{
+       struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
+
+       if (unlikely(t->index > 0))
+               return -EINVAL;
+
+       strcpy(t->name, "Radio");
+       t->type = V4L2_TUNER_RADIO;
+
+       mutex_lock(&dev->lock);
+       call_all(dev, tuner, s_tuner, t);
+       mutex_unlock(&dev->lock);
+
+       return 0;
+}
+
+static int radio_enum_input(struct file *file, void *priv, struct v4l2_input *i)
+{
+       if (i->index != 0)
+               return -EINVAL;
+       strcpy(i->name, "Radio");
+       i->type = V4L2_INPUT_TYPE_TUNER;
+
+       return 0;
+}
+
+static int radio_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
+{
+       if (unlikely(a->index))
+               return -EINVAL;
+
+       strcpy(a->name, "Radio");
+       return 0;
+}
+
+static int radio_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
+{
+       struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
+
+       if (0 != t->index)
+               return -EINVAL;
+
+       mutex_lock(&dev->lock);
+       call_all(dev, tuner, s_tuner, t);
+       mutex_unlock(&dev->lock);
+
+       return 0;
+}
+
+static int radio_s_audio(struct file *file, void *fh, struct v4l2_audio *a)
+{
+       return 0;
+}
+
+static int radio_s_input(struct file *file, void *fh, unsigned int i)
+{
+       return 0;
+}
+
+static int radio_queryctrl(struct file *file, void *priv,
+                          struct v4l2_queryctrl *c)
+{
+       int i;
+
+       if (c->id < V4L2_CID_BASE || c->id >= V4L2_CID_LASTP1)
+               return -EINVAL;
+       if (c->id == V4L2_CID_AUDIO_MUTE) {
+               for (i = 0; i < CX231XX_CTLS; i++)
+                       if (cx231xx_ctls[i].v.id == c->id)
+                               break;
+               *c = cx231xx_ctls[i].v;
+       } else
+               *c = no_ctl;
+       return 0;
+}
+
+/*
+ * cx231xx_v4l2_open()
+ * inits the device and starts isoc transfer
+ */
+static int cx231xx_v4l2_open(struct file *filp)
+{
+       int minor = video_devdata(filp)->minor;
+       int errCode = 0, radio = 0;
+       struct cx231xx *dev = NULL;
+       struct cx231xx_fh *fh;
+       enum v4l2_buf_type fh_type = 0;
+
+       dev = cx231xx_get_device(minor, &fh_type, &radio);
+       if (NULL == dev)
+               return -ENODEV;
+
+       mutex_lock(&dev->lock);
+
+       cx231xx_videodbg("open minor=%d type=%s users=%d\n",
+                        minor, v4l2_type_names[fh_type], dev->users);
+
+#if 0
+       errCode = cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
+       if (errCode < 0) {
+               cx231xx_errdev
+                   ("Device locked on digital mode. Can't open analog\n");
+               mutex_unlock(&dev->lock);
+               return -EBUSY;
+       }
+#endif
+
+       fh = kzalloc(sizeof(struct cx231xx_fh), GFP_KERNEL);
+       if (!fh) {
+               cx231xx_errdev("cx231xx-video.c: Out of memory?!\n");
+               mutex_unlock(&dev->lock);
+               return -ENOMEM;
+       }
+       fh->dev = dev;
+       fh->radio = radio;
+       fh->type = fh_type;
+       filp->private_data = fh;
+
+       if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
+               dev->width = norm_maxw(dev);
+               dev->height = norm_maxh(dev);
+               dev->hscale = 0;
+               dev->vscale = 0;
+
+               /* Power up in Analog TV mode */
+               cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
+
+#if 0
+               cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
+#endif
+               cx231xx_resolution_set(dev);
+
+               /* set video alternate setting */
+               cx231xx_set_video_alternate(dev);
+
+               /* Needed, since GPIO might have disabled power of
+                  some i2c device */
+               cx231xx_config_i2c(dev);
+
+               /* device needs to be initialized before isoc transfer */
+               dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
+               video_mux(dev, dev->video_input);
+
+       }
+       if (fh->radio) {
+               cx231xx_videodbg("video_open: setting radio device\n");
+
+               /* cx231xx_start_radio(dev); */
+
+               call_all(dev, tuner, s_radio);
+       }
+
+       dev->users++;
+
+       if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
+               videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_video_qops,
+                                           NULL, &dev->video_mode.slock,
+                                           fh->type, V4L2_FIELD_INTERLACED,
+                                           sizeof(struct cx231xx_buffer), fh);
+       if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
+               /* Set the required alternate setting  VBI interface works in
+                  Bulk mode only */
+               cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
+
+               videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_vbi_qops,
+                                           NULL, &dev->vbi_mode.slock,
+                                           fh->type, V4L2_FIELD_SEQ_TB,
+                                           sizeof(struct cx231xx_buffer), fh);
+       }
+
+       mutex_unlock(&dev->lock);
+
+       return errCode;
+}
+
+/*
+ * cx231xx_realease_resources()
+ * unregisters the v4l2,i2c and usb devices
+ * called when the device gets disconected or at module unload
+*/
+void cx231xx_release_analog_resources(struct cx231xx *dev)
+{
+
+       /*FIXME: I2C IR should be disconnected */
+
+       if (dev->radio_dev) {
+               if (-1 != dev->radio_dev->minor)
+                       video_unregister_device(dev->radio_dev);
+               else
+                       video_device_release(dev->radio_dev);
+               dev->radio_dev = NULL;
+       }
+       if (dev->vbi_dev) {
+               cx231xx_info("V4L2 device /dev/vbi%d deregistered\n",
+                            dev->vbi_dev->num);
+               if (-1 != dev->vbi_dev->minor)
+                       video_unregister_device(dev->vbi_dev);
+               else
+                       video_device_release(dev->vbi_dev);
+               dev->vbi_dev = NULL;
+       }
+       if (dev->vdev) {
+               cx231xx_info("V4L2 device /dev/video%d deregistered\n",
+                            dev->vdev->num);
+               if (-1 != dev->vdev->minor)
+                       video_unregister_device(dev->vdev);
+               else
+                       video_device_release(dev->vdev);
+               dev->vdev = NULL;
+       }
+}
+
+/*
+ * cx231xx_v4l2_close()
+ * stops streaming and deallocates all resources allocated by the v4l2
+ * calls and ioctls
+ */
+static int cx231xx_v4l2_close(struct file *filp)
+{
+       struct cx231xx_fh *fh = filp->private_data;
+       struct cx231xx *dev = fh->dev;
+
+       cx231xx_videodbg("users=%d\n", dev->users);
+
+       mutex_lock(&dev->lock);
+
+       if (res_check(fh))
+               res_free(fh);
+
+       if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
+               videobuf_stop(&fh->vb_vidq);
+               videobuf_mmap_free(&fh->vb_vidq);
+
+               /* the device is already disconnect,
+                  free the remaining resources */
+               if (dev->state & DEV_DISCONNECTED) {
+                       cx231xx_release_resources(dev);
+                       mutex_unlock(&dev->lock);
+                       kfree(dev);
+                       return 0;
+               }
+
+               /* do this before setting alternate! */
+               cx231xx_uninit_vbi_isoc(dev);
+
+               /* set alternate 0 */
+               if (!dev->vbi_or_sliced_cc_mode)
+                       cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
+               else
+                       cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
+
+               kfree(fh);
+               dev->users--;
+               wake_up_interruptible_nr(&dev->open, 1);
+               mutex_unlock(&dev->lock);
+               return 0;
+       }
+
+       if (dev->users == 1) {
+               videobuf_stop(&fh->vb_vidq);
+               videobuf_mmap_free(&fh->vb_vidq);
+
+               /* the device is already disconnect,
+                  free the remaining resources */
+               if (dev->state & DEV_DISCONNECTED) {
+                       cx231xx_release_resources(dev);
+                       mutex_unlock(&dev->lock);
+                       kfree(dev);
+                       return 0;
+               }
+
+               /* Save some power by putting tuner to sleep */
+               call_all(dev, tuner, s_standby);
+
+               /* do this before setting alternate! */
+               cx231xx_uninit_isoc(dev);
+               cx231xx_set_mode(dev, CX231XX_SUSPEND);
+
+               /* set alternate 0 */
+               cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
+       }
+       kfree(fh);
+       dev->users--;
+       wake_up_interruptible_nr(&dev->open, 1);
+       mutex_unlock(&dev->lock);
+       return 0;
+}
+
+/*
+ * cx231xx_v4l2_read()
+ * will allocate buffers when called for the first time
+ */
+static ssize_t
+cx231xx_v4l2_read(struct file *filp, char __user *buf, size_t count,
+                 loff_t *pos)
+{
+       struct cx231xx_fh *fh = filp->private_data;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       if ((fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) ||
+           (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)) {
+               mutex_lock(&dev->lock);
+               rc = res_get(fh);
+               mutex_unlock(&dev->lock);
+
+               if (unlikely(rc < 0))
+                       return rc;
+
+               return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
+                                           filp->f_flags & O_NONBLOCK);
+       }
+       return 0;
+}
+
+/*
+ * cx231xx_v4l2_poll()
+ * will allocate buffers when called for the first time
+ */
+static unsigned int cx231xx_v4l2_poll(struct file *filp, poll_table * wait)
+{
+       struct cx231xx_fh *fh = filp->private_data;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&dev->lock);
+       rc = res_get(fh);
+       mutex_unlock(&dev->lock);
+
+       if (unlikely(rc < 0))
+               return POLLERR;
+
+       if ((V4L2_BUF_TYPE_VIDEO_CAPTURE == fh->type) ||
+           (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type))
+               return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
+       else
+               return POLLERR;
+}
+
+/*
+ * cx231xx_v4l2_mmap()
+ */
+static int cx231xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+       struct cx231xx_fh *fh = filp->private_data;
+       struct cx231xx *dev = fh->dev;
+       int rc;
+
+       rc = check_dev(dev);
+       if (rc < 0)
+               return rc;
+
+       mutex_lock(&dev->lock);
+       rc = res_get(fh);
+       mutex_unlock(&dev->lock);
+
+       if (unlikely(rc < 0))
+               return rc;
+
+       rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
+
+       cx231xx_videodbg("vma start=0x%08lx, size=%ld, ret=%d\n",
+                        (unsigned long)vma->vm_start,
+                        (unsigned long)vma->vm_end -
+                        (unsigned long)vma->vm_start, rc);
+
+       return rc;
+}
+
+static const struct v4l2_file_operations cx231xx_v4l_fops = {
+       .owner   = THIS_MODULE,
+       .open    = cx231xx_v4l2_open,
+       .release = cx231xx_v4l2_close,
+       .read    = cx231xx_v4l2_read,
+       .poll    = cx231xx_v4l2_poll,
+       .mmap    = cx231xx_v4l2_mmap,
+       .ioctl   = video_ioctl2,
+};
+
+static const struct v4l2_ioctl_ops video_ioctl_ops = {
+       .vidioc_querycap               = vidioc_querycap,
+       .vidioc_enum_fmt_vid_cap       = vidioc_enum_fmt_vid_cap,
+       .vidioc_g_fmt_vid_cap          = vidioc_g_fmt_vid_cap,
+       .vidioc_try_fmt_vid_cap        = vidioc_try_fmt_vid_cap,
+       .vidioc_s_fmt_vid_cap          = vidioc_s_fmt_vid_cap,
+       .vidioc_g_fmt_vbi_cap          = vidioc_g_fmt_vbi_cap,
+       .vidioc_try_fmt_vbi_cap        = vidioc_try_fmt_vbi_cap,
+       .vidioc_s_fmt_vbi_cap          = vidioc_try_fmt_vbi_cap,
+       .vidioc_g_audio                =  vidioc_g_audio,
+       .vidioc_s_audio                = vidioc_s_audio,
+       .vidioc_cropcap                = vidioc_cropcap,
+       .vidioc_g_fmt_sliced_vbi_cap   = vidioc_g_fmt_sliced_vbi_cap,
+       .vidioc_try_fmt_sliced_vbi_cap = vidioc_try_set_sliced_vbi_cap,
+       .vidioc_reqbufs                = vidioc_reqbufs,
+       .vidioc_querybuf               = vidioc_querybuf,
+       .vidioc_qbuf                   = vidioc_qbuf,
+       .vidioc_dqbuf                  = vidioc_dqbuf,
+       .vidioc_s_std                  = vidioc_s_std,
+       .vidioc_g_std                  = vidioc_g_std,
+       .vidioc_enum_input             = vidioc_enum_input,
+       .vidioc_g_input                = vidioc_g_input,
+       .vidioc_s_input                = vidioc_s_input,
+       .vidioc_queryctrl              = vidioc_queryctrl,
+       .vidioc_g_ctrl                 = vidioc_g_ctrl,
+       .vidioc_s_ctrl                 = vidioc_s_ctrl,
+       .vidioc_streamon               = vidioc_streamon,
+       .vidioc_streamoff              = vidioc_streamoff,
+       .vidioc_g_tuner                = vidioc_g_tuner,
+       .vidioc_s_tuner                = vidioc_s_tuner,
+       .vidioc_g_frequency            = vidioc_g_frequency,
+       .vidioc_s_frequency            = vidioc_s_frequency,
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       .vidioc_g_register             = vidioc_g_register,
+       .vidioc_s_register             = vidioc_s_register,
+#endif
+#ifdef CONFIG_VIDEO_V4L1_COMPAT
+       .vidiocgmbuf                   = vidiocgmbuf,
+#endif
+};
+
+static struct video_device cx231xx_vbi_template;
+
+static const struct video_device cx231xx_video_template = {
+       .fops         = &cx231xx_v4l_fops,
+       .release      = video_device_release,
+       .ioctl_ops    = &video_ioctl_ops,
+       .minor        = -1,
+       .tvnorms      = V4L2_STD_ALL,
+       .current_norm = V4L2_STD_PAL,
+};
+
+static const struct v4l2_file_operations radio_fops = {
+       .owner   = THIS_MODULE,
+       .open   = cx231xx_v4l2_open,
+       .release = cx231xx_v4l2_close,
+       .ioctl   = video_ioctl2,
+};
+
+static const struct v4l2_ioctl_ops radio_ioctl_ops = {
+       .vidioc_querycap    = radio_querycap,
+       .vidioc_g_tuner     = radio_g_tuner,
+       .vidioc_enum_input  = radio_enum_input,
+       .vidioc_g_audio     = radio_g_audio,
+       .vidioc_s_tuner     = radio_s_tuner,
+       .vidioc_s_audio     = radio_s_audio,
+       .vidioc_s_input     = radio_s_input,
+       .vidioc_queryctrl   = radio_queryctrl,
+       .vidioc_g_ctrl      = vidioc_g_ctrl,
+       .vidioc_s_ctrl      = vidioc_s_ctrl,
+       .vidioc_g_frequency = vidioc_g_frequency,
+       .vidioc_s_frequency = vidioc_s_frequency,
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       .vidioc_g_register  = vidioc_g_register,
+       .vidioc_s_register  = vidioc_s_register,
+#endif
+};
+
+static struct video_device cx231xx_radio_template = {
+       .name      = "cx231xx-radio",
+       .fops      = &radio_fops,
+       .ioctl_ops = &radio_ioctl_ops,
+       .minor     = -1,
+};
+
+/******************************** usb interface ******************************/
+
+static struct video_device *cx231xx_vdev_init(struct cx231xx *dev,
+               const struct video_device
+               *template, const char *type_name)
+{
+       struct video_device *vfd;
+
+       vfd = video_device_alloc();
+       if (NULL == vfd)
+               return NULL;
+
+       *vfd = *template;
+       vfd->minor = -1;
+       vfd->v4l2_dev = &dev->v4l2_dev;
+       vfd->release = video_device_release;
+       vfd->debug = video_debug;
+
+       snprintf(vfd->name, sizeof(vfd->name), "%s %s", dev->name, type_name);
+
+       return vfd;
+}
+
+int cx231xx_register_analog_devices(struct cx231xx *dev)
+{
+       int ret;
+
+       cx231xx_info("%s: v4l2 driver version %d.%d.%d\n",
+                    dev->name,
+                    (CX231XX_VERSION_CODE >> 16) & 0xff,
+                    (CX231XX_VERSION_CODE >> 8) & 0xff,
+                    CX231XX_VERSION_CODE & 0xff);
+
+       /* set default norm */
+       /*dev->norm = cx231xx_video_template.current_norm; */
+       dev->width = norm_maxw(dev);
+       dev->height = norm_maxh(dev);
+       dev->interlaced = 0;
+       dev->hscale = 0;
+       dev->vscale = 0;
+
+       /* Analog specific initialization */
+       dev->format = &format[0];
+       /* video_mux(dev, dev->video_input); */
+
+       /* Audio defaults */
+       dev->mute = 1;
+       dev->volume = 0x1f;
+
+       /* enable vbi capturing */
+       /* write code here...  */
+
+       /* allocate and fill video video_device struct */
+       dev->vdev = cx231xx_vdev_init(dev, &cx231xx_video_template, "video");
+       if (!dev->vdev) {
+               cx231xx_errdev("cannot allocate video_device.\n");
+               return -ENODEV;
+       }
+
+       /* register v4l2 video video_device */
+       ret = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
+                                   video_nr[dev->devno]);
+       if (ret) {
+               cx231xx_errdev("unable to register video device (error=%i).\n",
+                              ret);
+               return ret;
+       }
+
+       cx231xx_info("%s/0: registered device video%d [v4l2]\n",
+                    dev->name, dev->vdev->num);
+
+       /* Initialize VBI template */
+       memcpy(&cx231xx_vbi_template, &cx231xx_video_template,
+              sizeof(cx231xx_vbi_template));
+       strcpy(cx231xx_vbi_template.name, "cx231xx-vbi");
+
+       /* Allocate and fill vbi video_device struct */
+       dev->vbi_dev = cx231xx_vdev_init(dev, &cx231xx_vbi_template, "vbi");
+
+       /* register v4l2 vbi video_device */
+       ret = video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
+                                   vbi_nr[dev->devno]);
+       if (ret < 0) {
+               cx231xx_errdev("unable to register vbi device\n");
+               return ret;
+       }
+
+       cx231xx_info("%s/0: registered device vbi%d\n",
+                    dev->name, dev->vbi_dev->num);
+
+       if (cx231xx_boards[dev->model].radio.type == CX231XX_RADIO) {
+               dev->radio_dev = cx231xx_vdev_init(dev, &cx231xx_radio_template,
+                                                  "radio");
+               if (!dev->radio_dev) {
+                       cx231xx_errdev("cannot allocate video_device.\n");
+                       return -ENODEV;
+               }
+               ret = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
+                                           radio_nr[dev->devno]);
+               if (ret < 0) {
+                       cx231xx_errdev("can't register radio device\n");
+                       return ret;
+               }
+               cx231xx_info("Registered radio device as /dev/radio%d\n",
+                            dev->radio_dev->num);
+       }
+
+       cx231xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n",
+                    dev->vdev->num, dev->vbi_dev->num);
+
+       return 0;
+}
diff --git a/drivers/media/video/cx231xx/cx231xx.h b/drivers/media/video/cx231xx/cx231xx.h
new file mode 100644 (file)
index 0000000..aa4a23e
--- /dev/null
@@ -0,0 +1,779 @@
+/*
+   cx231xx.h - driver for Conexant Cx23100/101/102 USB video capture devices
+
+   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
+       Based on em28xx 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.
+
+   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 _CX231XX_H
+#define _CX231XX_H
+
+#include <linux/videodev2.h>
+#include <linux/types.h>
+#include <linux/ioctl.h>
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
+#include <linux/mutex.h>
+
+
+#include <media/videobuf-vmalloc.h>
+#include <media/v4l2-device.h>
+#include <media/ir-kbd-i2c.h>
+#if defined(CONFIG_VIDEO_CX231XX_DVB) || \
+       defined(CONFIG_VIDEO_CX231XX_DVB_MODULE)
+#include <media/videobuf-dvb.h>
+#endif
+
+#include "cx231xx-reg.h"
+#include "cx231xx-pcb-cfg.h"
+#include "cx231xx-conf-reg.h"
+
+#define DRIVER_NAME                     "cx231xx"
+#define PWR_SLEEP_INTERVAL              5
+
+/* I2C addresses for control block in Cx231xx */
+#define     AFE_DEVICE_ADDRESS         0x60
+#define     I2S_BLK_DEVICE_ADDRESS     0x98
+#define     VID_BLK_I2C_ADDRESS                0x88
+#define     DIF_USE_BASEBAND            0xFFFFFFFF
+
+/* Boards supported by driver */
+#define CX231XX_BOARD_UNKNOWN              0
+#define CX231XX_BOARD_CNXT_RDE_250             1
+#define CX231XX_BOARD_CNXT_RDU_250             2
+
+/* Limits minimum and default number of buffers */
+#define CX231XX_MIN_BUF                 4
+#define CX231XX_DEF_BUF                 12
+#define CX231XX_DEF_VBI_BUF             6
+
+#define VBI_LINE_COUNT                  17
+#define VBI_LINE_LENGTH                 1440
+
+/*Limits the max URB message size */
+#define URB_MAX_CTRL_SIZE               80
+
+/* Params for validated field */
+#define CX231XX_BOARD_NOT_VALIDATED     1
+#define CX231XX_BOARD_VALIDATED                0
+
+/* maximum number of cx231xx boards */
+#define CX231XX_MAXBOARDS               8
+
+/* maximum number of frames that can be queued */
+#define CX231XX_NUM_FRAMES              5
+
+/* number of buffers for isoc transfers */
+#define CX231XX_NUM_BUFS                8
+
+/* number of packets for each buffer
+   windows requests only 40 packets .. so we better do the same
+   this is what I found out for all alternate numbers there!
+ */
+#define CX231XX_NUM_PACKETS             40
+
+/* default alternate; 0 means choose the best */
+#define CX231XX_PINOUT                  0
+
+#define CX231XX_INTERLACED_DEFAULT      1
+
+/* time to wait when stopping the isoc transfer */
+#define CX231XX_URB_TIMEOUT            \
+               msecs_to_jiffies(CX231XX_NUM_BUFS * CX231XX_NUM_PACKETS)
+
+enum cx231xx_mode {
+       CX231XX_SUSPEND,
+       CX231XX_ANALOG_MODE,
+       CX231XX_DIGITAL_MODE,
+};
+
+enum cx231xx_std_mode {
+       CX231XX_TV_AIR = 0,
+       CX231XX_TV_CABLE
+};
+
+enum cx231xx_stream_state {
+       STREAM_OFF,
+       STREAM_INTERRUPT,
+       STREAM_ON,
+};
+
+struct cx231xx;
+
+struct cx231xx_usb_isoc_ctl {
+       /* max packet size of isoc transaction */
+       int max_pkt_size;
+
+       /* number of allocated urbs */
+       int num_bufs;
+
+       /* urb for isoc transfers */
+       struct urb **urb;
+
+       /* transfer buffers for isoc transfer */
+       char **transfer_buffer;
+
+       /* Last buffer command and region */
+       u8 cmd;
+       int pos, size, pktsize;
+
+       /* Last field: ODD or EVEN? */
+       int field;
+
+       /* Stores incomplete commands */
+       u32 tmp_buf;
+       int tmp_buf_len;
+
+       /* Stores already requested buffers */
+       struct cx231xx_buffer *buf;
+
+       /* Stores the number of received fields */
+       int nfields;
+
+       /* isoc urb callback */
+       int (*isoc_copy) (struct cx231xx *dev, struct urb *urb);
+};
+
+struct cx231xx_fmt {
+       char *name;
+       u32 fourcc;             /* v4l2 format id */
+       int depth;
+       int reg;
+};
+
+/* buffer for one video frame */
+struct cx231xx_buffer {
+       /* common v4l buffer stuff -- must be first */
+       struct videobuf_buffer vb;
+
+       struct list_head frame;
+       int top_field;
+       int receiving;
+};
+
+struct cx231xx_dmaqueue {
+       struct list_head active;
+       struct list_head queued;
+
+       wait_queue_head_t wq;
+
+       /* Counters to control buffer fill */
+       int pos;
+       u8 is_partial_line;
+       u8 partial_buf[8];
+       u8 last_sav;
+       int current_field;
+       u32 bytes_left_in_line;
+       u32 lines_completed;
+       u8 field1_done;
+       u32 lines_per_field;
+};
+
+/* inputs */
+
+#define MAX_CX231XX_INPUT               4
+
+enum cx231xx_itype {
+       CX231XX_VMUX_COMPOSITE1 = 1,
+       CX231XX_VMUX_SVIDEO,
+       CX231XX_VMUX_TELEVISION,
+       CX231XX_VMUX_CABLE,
+       CX231XX_RADIO,
+       CX231XX_VMUX_DVB,
+       CX231XX_VMUX_DEBUG
+};
+
+enum cx231xx_v_input {
+       CX231XX_VIN_1_1 = 0x1,
+       CX231XX_VIN_2_1,
+       CX231XX_VIN_3_1,
+       CX231XX_VIN_4_1,
+       CX231XX_VIN_1_2 = 0x01,
+       CX231XX_VIN_2_2,
+       CX231XX_VIN_3_2,
+       CX231XX_VIN_1_3 = 0x1,
+       CX231XX_VIN_2_3,
+       CX231XX_VIN_3_3,
+};
+
+/* cx231xx has two audio inputs: tuner and line in */
+enum cx231xx_amux {
+       /* This is the only entry for cx231xx tuner input */
+       CX231XX_AMUX_VIDEO,     /* cx231xx tuner */
+       CX231XX_AMUX_LINE_IN,   /* Line In */
+};
+
+struct cx231xx_reg_seq {
+       unsigned char bit;
+       unsigned char val;
+       int sleep;
+};
+
+struct cx231xx_input {
+       enum cx231xx_itype type;
+       unsigned int vmux;
+       enum cx231xx_amux amux;
+       struct cx231xx_reg_seq *gpio;
+};
+
+#define INPUT(nr) (&cx231xx_boards[dev->model].input[nr])
+
+enum cx231xx_decoder {
+       CX231XX_NODECODER,
+       CX231XX_AVDECODER
+};
+
+enum CX231XX_I2C_MASTER_PORT {
+       I2C_0 = 0,
+       I2C_1 = 1,
+       I2C_2 = 2,
+       I2C_3 = 3
+};
+
+struct cx231xx_board {
+       char *name;
+       int vchannels;
+       int tuner_type;
+       int tuner_addr;
+       v4l2_std_id norm;       /* tv norm */
+
+       /* demod related */
+       int demod_addr;
+       u8 demod_xfer_mode;     /* 0 - Serial; 1 - parallel */
+
+       /* GPIO Pins */
+       struct cx231xx_reg_seq *dvb_gpio;
+       struct cx231xx_reg_seq *suspend_gpio;
+       struct cx231xx_reg_seq *tuner_gpio;
+       u8 tuner_sif_gpio;
+       u8 tuner_scl_gpio;
+       u8 tuner_sda_gpio;
+
+       /* PIN ctrl */
+       u32 ctl_pin_status_mask;
+       u8 agc_analog_digital_select_gpio;
+       u32 gpio_pin_status_mask;
+
+       /* i2c masters */
+       u8 tuner_i2c_master;
+       u8 demod_i2c_master;
+
+       unsigned int max_range_640_480:1;
+       unsigned int has_dvb:1;
+       unsigned int valid:1;
+
+       unsigned char xclk, i2c_speed;
+
+       enum cx231xx_decoder decoder;
+
+       struct cx231xx_input input[MAX_CX231XX_INPUT];
+       struct cx231xx_input radio;
+       IR_KEYTAB_TYPE *ir_codes;
+};
+
+/* device states */
+enum cx231xx_dev_state {
+       DEV_INITIALIZED = 0x01,
+       DEV_DISCONNECTED = 0x02,
+       DEV_MISCONFIGURED = 0x04,
+};
+
+enum AFE_MODE {
+       AFE_MODE_LOW_IF,
+       AFE_MODE_BASEBAND,
+       AFE_MODE_EU_HI_IF,
+       AFE_MODE_US_HI_IF,
+       AFE_MODE_JAPAN_HI_IF
+};
+
+enum AUDIO_INPUT {
+       AUDIO_INPUT_MUTE,
+       AUDIO_INPUT_LINE,
+       AUDIO_INPUT_TUNER_TV,
+       AUDIO_INPUT_SPDIF,
+       AUDIO_INPUT_TUNER_FM
+};
+
+#define CX231XX_AUDIO_BUFS              5
+#define CX231XX_NUM_AUDIO_PACKETS       64
+#define CX231XX_CAPTURE_STREAM_EN       1
+#define CX231XX_STOP_AUDIO              0
+#define CX231XX_START_AUDIO             1
+
+/* cx231xx extensions */
+#define CX231XX_AUDIO                   0x10
+#define CX231XX_DVB                     0x20
+
+struct cx231xx_audio {
+       char name[50];
+       char *transfer_buffer[CX231XX_AUDIO_BUFS];
+       struct urb *urb[CX231XX_AUDIO_BUFS];
+       struct usb_device *udev;
+       unsigned int capture_transfer_done;
+       struct snd_pcm_substream *capture_pcm_substream;
+
+       unsigned int hwptr_done_capture;
+       struct snd_card *sndcard;
+
+       int users, shutdown;
+       enum cx231xx_stream_state capture_stream;
+       spinlock_t slock;
+
+       int alt;                /* alternate */
+       int max_pkt_size;       /* max packet size of isoc transaction */
+       int num_alt;            /* Number of alternative settings */
+       unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
+       u16 end_point_addr;
+};
+
+struct cx231xx;
+
+struct cx231xx_fh {
+       struct cx231xx *dev;
+       unsigned int stream_on:1;       /* Locks streams */
+       int radio;
+
+       struct videobuf_queue vb_vidq;
+
+       enum v4l2_buf_type type;
+};
+
+/*****************************************************************/
+/* set/get i2c */
+/* 00--1Mb/s, 01-400kb/s, 10--100kb/s, 11--5Mb/s */
+#define I2C_SPEED_1M            0x0
+#define I2C_SPEED_400K          0x1
+#define I2C_SPEED_100K          0x2
+#define I2C_SPEED_5M            0x3
+
+/* 0-- STOP transaction */
+#define I2C_STOP                0x0
+/* 1-- do not transmit STOP at end of transaction */
+#define I2C_NOSTOP              0x1
+/* 1--alllow slave to insert clock wait states */
+#define I2C_SYNC                0x1
+
+struct cx231xx_i2c {
+       struct cx231xx *dev;
+
+       int nr;
+
+       /* i2c i/o */
+       struct i2c_adapter i2c_adap;
+       struct i2c_algo_bit_data i2c_algo;
+       struct i2c_client i2c_client;
+       u32 i2c_rc;
+
+       /* different settings for each bus */
+       u8 i2c_period;
+       u8 i2c_nostop;
+       u8 i2c_reserve;
+};
+
+struct cx231xx_i2c_xfer_data {
+       u8 dev_addr;
+       u8 direction;           /* 1 - IN, 0 - OUT */
+       u8 saddr_len;           /* sub address len */
+       u16 saddr_dat;          /* sub addr data */
+       u8 buf_size;            /* buffer size */
+       u8 *p_buffer;           /* pointer to the buffer */
+};
+
+struct VENDOR_REQUEST_IN {
+       u8 bRequest;
+       u16 wValue;
+       u16 wIndex;
+       u16 wLength;
+       u8 direction;
+       u8 bData;
+       u8 *pBuff;
+};
+
+struct cx231xx_ctrl {
+       struct v4l2_queryctrl v;
+       u32 off;
+       u32 reg;
+       u32 mask;
+       u32 shift;
+};
+
+enum TRANSFER_TYPE {
+       Raw_Video = 0,
+       Audio,
+       Vbi,                    /* VANC */
+       Sliced_cc,              /* HANC */
+       TS1_serial_mode,
+       TS2,
+       TS1_parallel_mode
+} ;
+
+struct cx231xx_video_mode {
+       /* Isoc control struct */
+       struct cx231xx_dmaqueue vidq;
+       struct cx231xx_usb_isoc_ctl isoc_ctl;
+       spinlock_t slock;
+
+       /* usb transfer */
+       int alt;                /* alternate */
+       int max_pkt_size;       /* max packet size of isoc transaction */
+       int num_alt;            /* Number of alternative settings */
+       unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
+       u16 end_point_addr;
+};
+
+/* main device struct */
+struct cx231xx {
+       /* generic device properties */
+       char name[30];          /* name (including minor) of the device */
+       int model;              /* index in the device_data struct */
+       int devno;              /* marks the number of this device */
+
+       struct cx231xx_board board;
+
+       unsigned int stream_on:1;       /* Locks streams */
+       unsigned int vbi_stream_on:1;   /* Locks streams for VBI */
+       unsigned int has_audio_class:1;
+       unsigned int has_alsa_audio:1;
+
+       struct cx231xx_fmt *format;
+
+       struct v4l2_device v4l2_dev;
+       struct v4l2_subdev *sd_cx25840;
+       struct v4l2_subdev *sd_tuner;
+
+       struct cx231xx_IR *ir;
+
+       struct list_head devlist;
+
+       int tuner_type;         /* type of the tuner */
+       int tuner_addr;         /* tuner address */
+
+       /* I2C adapters: Master 1 & 2 (External) & Master 3 (Internal only) */
+       struct cx231xx_i2c i2c_bus[3];
+       unsigned int xc_fw_load_done:1;
+       struct mutex gpio_i2c_lock;
+
+       /* video for linux */
+       int users;              /* user count for exclusive use */
+       struct video_device *vdev;      /* video for linux device struct */
+       v4l2_std_id norm;       /* selected tv norm */
+       int ctl_freq;           /* selected frequency */
+       unsigned int ctl_ainput;        /* selected audio input */
+       int mute;
+       int volume;
+
+       /* frame properties */
+       int width;              /* current frame width */
+       int height;             /* current frame height */
+       unsigned hscale;        /* horizontal scale factor (see datasheet) */
+       unsigned vscale;        /* vertical scale factor (see datasheet) */
+       int interlaced;         /* 1=interlace fileds, 0=just top fileds */
+
+       struct cx231xx_audio adev;
+
+       /* states */
+       enum cx231xx_dev_state state;
+
+       struct work_struct request_module_wk;
+
+       /* locks */
+       struct mutex lock;
+       struct mutex ctrl_urb_lock;     /* protects urb_buf */
+       struct list_head inqueue, outqueue;
+       wait_queue_head_t open, wait_frame, wait_stream;
+       struct video_device *vbi_dev;
+       struct video_device *radio_dev;
+
+       unsigned char eedata[256];
+
+       struct cx231xx_video_mode video_mode;
+       struct cx231xx_video_mode vbi_mode;
+       struct cx231xx_video_mode sliced_cc_mode;
+       struct cx231xx_video_mode ts1_mode;
+
+       struct usb_device *udev;        /* the usb device */
+       char urb_buf[URB_MAX_CTRL_SIZE];        /* urb control msg buffer */
+
+       /* helper funcs that call usb_control_msg */
+       int (*cx231xx_read_ctrl_reg) (struct cx231xx *dev, u8 req, u16 reg,
+                                     char *buf, int len);
+       int (*cx231xx_write_ctrl_reg) (struct cx231xx *dev, u8 req, u16 reg,
+                                      char *buf, int len);
+       int (*cx231xx_send_usb_command) (struct cx231xx_i2c *i2c_bus,
+                               struct cx231xx_i2c_xfer_data *req_data);
+       int (*cx231xx_gpio_i2c_read) (struct cx231xx *dev, u8 dev_addr,
+                                     u8 *buf, u8 len);
+       int (*cx231xx_gpio_i2c_write) (struct cx231xx *dev, u8 dev_addr,
+                                      u8 *buf, u8 len);
+
+       int (*cx231xx_set_analog_freq) (struct cx231xx *dev, u32 freq);
+       int (*cx231xx_reset_analog_tuner) (struct cx231xx *dev);
+
+       enum cx231xx_mode mode;
+
+       struct cx231xx_dvb *dvb;
+
+       /* Cx231xx supported PCB config's */
+       struct pcb_config current_pcb_config;
+       u8 current_scenario_idx;
+       u8 interface_count;
+       u8 max_iad_interface_count;
+
+       /* GPIO related register direction and values */
+       u32 gpio_dir;
+       u32 gpio_val;
+
+       /* Power Modes */
+       int power_mode;
+
+       /* afe parameters */
+       enum AFE_MODE afe_mode;
+       u32 afe_ref_count;
+
+       /* video related parameters */
+       u32 video_input;
+       u32 active_mode;
+       u8 vbi_or_sliced_cc_mode;       /* 0 - vbi ; 1 - sliced cc mode */
+       enum cx231xx_std_mode std_mode; /* 0 - Air; 1 - cable */
+
+};
+
+#define cx25840_call(cx231xx, o, f, args...) \
+       v4l2_subdev_call(cx231xx->sd_cx25840, o, f, ##args)
+#define tuner_call(cx231xx, o, f, args...) \
+       v4l2_subdev_call(cx231xx->sd_tuner, o, f, ##args)
+#define call_all(dev, o, f, args...) \
+       v4l2_device_call_until_err(&dev->v4l2_dev, 0, o, f, ##args)
+
+struct cx231xx_ops {
+       struct list_head next;
+       char *name;
+       int id;
+       int (*init) (struct cx231xx *);
+       int (*fini) (struct cx231xx *);
+};
+
+/* call back functions in dvb module */
+int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq);
+int cx231xx_reset_analog_tuner(struct cx231xx *dev);
+
+/* Provided by cx231xx-i2c.c */
+void cx231xx_do_i2c_scan(struct cx231xx *dev, struct i2c_client *c);
+int cx231xx_i2c_register(struct cx231xx_i2c *bus);
+int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
+
+/* Internal block control functions */
+int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr,
+                         u16 saddr, u8 saddr_len, u32 *data, u8 data_len);
+int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr,
+                          u16 saddr, u8 saddr_len, u32 data, u8 data_len);
+int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
+                          u16 register_address, u8 bit_start, u8 bit_end,
+                          u32 value);
+int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
+                                       u16 saddr, u32 mask, u32 value);
+u32 cx231xx_set_field(u32 field_mask, u32 data);
+
+/* afe related functions */
+int cx231xx_afe_init_super_block(struct cx231xx *dev, u32 ref_count);
+int cx231xx_afe_init_channels(struct cx231xx *dev);
+int cx231xx_afe_setup_AFE_for_baseband(struct cx231xx *dev);
+int cx231xx_afe_set_input_mux(struct cx231xx *dev, u32 input_mux);
+int cx231xx_afe_set_mode(struct cx231xx *dev, enum AFE_MODE mode);
+int cx231xx_afe_update_power_control(struct cx231xx *dev,
+                                       enum AV_MODE avmode);
+int cx231xx_afe_adjust_ref_count(struct cx231xx *dev, u32 video_input);
+
+/* i2s block related functions */
+int cx231xx_i2s_blk_initialize(struct cx231xx *dev);
+int cx231xx_i2s_blk_update_power_control(struct cx231xx *dev,
+                                       enum AV_MODE avmode);
+int cx231xx_i2s_blk_set_audio_input(struct cx231xx *dev, u8 audio_input);
+
+/* DIF related functions */
+int cx231xx_dif_configure_C2HH_for_low_IF(struct cx231xx *dev, u32 mode,
+                                         u32 function_mode, u32 standard);
+int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard);
+int cx231xx_tuner_pre_channel_change(struct cx231xx *dev);
+int cx231xx_tuner_post_channel_change(struct cx231xx *dev);
+
+/* video parser functions */
+u8 cx231xx_find_next_SAV_EAV(u8 *p_buffer, u32 buffer_size,
+                            u32 *p_bytes_used);
+u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf,
+                                u32 *p_bytes_used);
+int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                   u8 *p_buffer, u32 bytes_to_copy);
+void cx231xx_reset_video_buffer(struct cx231xx *dev,
+                               struct cx231xx_dmaqueue *dma_q);
+u8 cx231xx_is_buffer_done(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q);
+u32 cx231xx_copy_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                           u8 *p_line, u32 length, int field_number);
+u32 cx231xx_get_video_line(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
+                          u8 sav_eav, u8 *p_buffer, u32 buffer_size);
+void cx231xx_swab(u16 *from, u16 *to, u16 len);
+
+/* Provided by cx231xx-core.c */
+
+u32 cx231xx_request_buffers(struct cx231xx *dev, u32 count);
+void cx231xx_queue_unusedframes(struct cx231xx *dev);
+void cx231xx_release_buffers(struct cx231xx *dev);
+
+/* read from control pipe */
+int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
+                         char *buf, int len);
+
+/* write to control pipe */
+int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
+                          char *buf, int len);
+int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode);
+
+int cx231xx_send_vendor_cmd(struct cx231xx *dev,
+                               struct VENDOR_REQUEST_IN *ven_req);
+int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
+                               struct cx231xx_i2c_xfer_data *req_data);
+
+/* Gpio related functions */
+int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
+                         u8 len, u8 request, u8 direction);
+int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val);
+int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val);
+int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value);
+int cx231xx_set_gpio_direction(struct cx231xx *dev, int pin_number,
+                              int pin_value);
+
+int cx231xx_gpio_i2c_start(struct cx231xx *dev);
+int cx231xx_gpio_i2c_end(struct cx231xx *dev);
+int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data);
+int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf);
+int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev);
+int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev);
+int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev);
+
+int cx231xx_gpio_i2c_read(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len);
+int cx231xx_gpio_i2c_write(struct cx231xx *dev, u8 dev_addr, u8 *buf, u8 len);
+
+/* audio related functions */
+int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
+                                   enum AUDIO_INPUT audio_input);
+
+int cx231xx_capture_start(struct cx231xx *dev, int start, u8 media_type);
+int cx231xx_resolution_set(struct cx231xx *dev);
+int cx231xx_set_video_alternate(struct cx231xx *dev);
+int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt);
+int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
+                     int num_bufs, int max_pkt_size,
+                     int (*isoc_copy) (struct cx231xx *dev,
+                                       struct urb *urb));
+void cx231xx_uninit_isoc(struct cx231xx *dev);
+int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode);
+int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio);
+
+/* Device list functions */
+void cx231xx_release_resources(struct cx231xx *dev);
+void cx231xx_release_analog_resources(struct cx231xx *dev);
+int cx231xx_register_analog_devices(struct cx231xx *dev);
+void cx231xx_remove_from_devlist(struct cx231xx *dev);
+void cx231xx_add_into_devlist(struct cx231xx *dev);
+struct cx231xx *cx231xx_get_device(int minor,
+                                  enum v4l2_buf_type *fh_type, int *has_radio);
+void cx231xx_init_extension(struct cx231xx *dev);
+void cx231xx_close_extension(struct cx231xx *dev);
+
+/* hardware init functions */
+int cx231xx_dev_init(struct cx231xx *dev);
+void cx231xx_dev_uninit(struct cx231xx *dev);
+void cx231xx_config_i2c(struct cx231xx *dev);
+int cx231xx_config(struct cx231xx *dev);
+
+/* Stream control functions */
+int cx231xx_start_stream(struct cx231xx *dev, u32 ep_mask);
+int cx231xx_stop_stream(struct cx231xx *dev, u32 ep_mask);
+
+int cx231xx_initialize_stream_xfer(struct cx231xx *dev, u32 media_type);
+
+/* Power control functions */
+int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode);
+int cx231xx_power_suspend(struct cx231xx *dev);
+
+/* chip specific control functions */
+int cx231xx_init_ctrl_pin_status(struct cx231xx *dev);
+int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev,
+                                             u8 analog_or_digital);
+int cx231xx_enable_i2c_for_tuner(struct cx231xx *dev, u8 I2CIndex);
+
+/* video audio decoder related functions */
+void video_mux(struct cx231xx *dev, int index);
+int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input);
+int cx231xx_set_decoder_video_input(struct cx231xx *dev, u8 pin_type, u8 input);
+int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev);
+int cx231xx_set_audio_input(struct cx231xx *dev, u8 input);
+void get_scale(struct cx231xx *dev,
+              unsigned int width, unsigned int height,
+              unsigned int *hscale, unsigned int *vscale);
+
+/* Provided by cx231xx-video.c */
+int cx231xx_register_extension(struct cx231xx_ops *dev);
+void cx231xx_unregister_extension(struct cx231xx_ops *dev);
+void cx231xx_init_extension(struct cx231xx *dev);
+void cx231xx_close_extension(struct cx231xx *dev);
+
+/* Provided by cx231xx-cards.c */
+extern void cx231xx_pre_card_setup(struct cx231xx *dev);
+extern void cx231xx_card_setup(struct cx231xx *dev);
+extern struct cx231xx_board cx231xx_boards[];
+extern struct usb_device_id cx231xx_id_table[];
+extern const unsigned int cx231xx_bcount;
+void cx231xx_set_ir(struct cx231xx *dev, struct IR_i2c *ir);
+int cx231xx_tuner_callback(void *ptr, int component, int command, int arg);
+
+/* Provided by cx231xx-input.c */
+int cx231xx_ir_init(struct cx231xx *dev);
+int cx231xx_ir_fini(struct cx231xx *dev);
+
+/* printk macros */
+
+#define cx231xx_err(fmt, arg...) do {\
+       printk(KERN_ERR fmt , ##arg); } while (0)
+
+#define cx231xx_errdev(fmt, arg...) do {\
+       printk(KERN_ERR "%s: "fmt,\
+                       dev->name , ##arg); } while (0)
+
+#define cx231xx_info(fmt, arg...) do {\
+       printk(KERN_INFO "%s: "fmt,\
+                       dev->name , ##arg); } while (0)
+#define cx231xx_warn(fmt, arg...) do {\
+       printk(KERN_WARNING "%s: "fmt,\
+                       dev->name , ##arg); } while (0)
+
+static inline unsigned int norm_maxw(struct cx231xx *dev)
+{
+       if (dev->board.max_range_640_480)
+               return 640;
+       else
+               return 720;
+}
+
+static inline unsigned int norm_maxh(struct cx231xx *dev)
+{
+       if (dev->board.max_range_640_480)
+               return 480;
+       else
+               return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
+}
+#endif
index 5e4b7e790d9498f6235bd612696c38d4cb975669..a3c0565be1a976e0377a3aa7e03d543fe5654ab8 100644 (file)
@@ -739,9 +739,10 @@ void cx23885_card_setup(struct cx23885_dev *dev)
        case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
        case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
        case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
-               dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->i2c_bus[2].i2c_adap,
+               dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                               &dev->i2c_bus[2].i2c_adap,
                                "cx25840", "cx25840", 0x88 >> 1);
-               v4l2_subdev_call(dev->sd_cx25840, core, init, 0);
+               v4l2_subdev_call(dev->sd_cx25840, core, load_fw);
                break;
        }
 
index dc7fff22cfdd5a0218547faf50036e0d1383915f..beda42925ce761c961e7b08673a195cd6e6017fe 100644 (file)
@@ -875,7 +875,7 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
        cx23885_i2c_register(&dev->i2c_bus[1]);
        cx23885_i2c_register(&dev->i2c_bus[2]);
        cx23885_card_setup(dev);
-       call_all(dev, core, s_standby, 0);
+       call_all(dev, tuner, s_standby);
        cx23885_ir_init(dev);
 
        if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO) {
index d43c7439676781fb35508d78ac05a3c76156dbf6..f48454ab3900897eb92fb16b492533dc622d9983 100644 (file)
@@ -673,7 +673,7 @@ static int dvb_register(struct cx23885_tsport *port)
        fe0->dvb.frontend->callback = cx23885_tuner_callback;
 
        /* Put the analog decoder in standby to keep it quiet */
-       call_all(dev, core, s_standby, 0);
+       call_all(dev, tuner, s_standby);
 
        if (fe0->dvb.frontend->ops.analog_ops.standby)
                fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend);
index f0ac62c5dc83f398ee9b310fc8bff3069226ce1f..68068c6d098729c53b43d11c30f83c241e6d5cc4 100644 (file)
@@ -299,7 +299,7 @@ static int cx23885_set_tvnorm(struct cx23885_dev *dev, v4l2_std_id norm)
 
        dev->tvnorm = norm;
 
-       call_all(dev, tuner, s_std, norm);
+       call_all(dev, core, s_std, norm);
 
        return 0;
 }
@@ -393,9 +393,6 @@ static void res_free(struct cx23885_dev *dev, struct cx23885_fh *fh,
 
 static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
 {
-       struct v4l2_routing route;
-       memset(&route, 0, sizeof(route));
-
        dprintk(1, "%s() video_mux: %d [vmux=%d, gpio=0x%x,0x%x,0x%x,0x%x]\n",
                __func__,
                input, INPUT(input)->vmux,
@@ -403,10 +400,9 @@ static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
                INPUT(input)->gpio2, INPUT(input)->gpio3);
        dev->input = input;
 
-       route.input = INPUT(input)->vmux;
-
        /* Tell the internal A/V decoder */
-       v4l2_subdev_call(dev->sd_cx25840, video, s_routing, &route);
+       v4l2_subdev_call(dev->sd_cx25840, video, s_routing,
+                       INPUT(input)->vmux, 0, 0);
 
        return 0;
 }
@@ -1523,10 +1519,12 @@ int cx23885_video_register(struct cx23885_dev *dev)
                struct v4l2_subdev *sd = NULL;
 
                if (dev->tuner_addr)
-                       sd = v4l2_i2c_new_subdev(&dev->i2c_bus[1].i2c_adap,
+                       sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                               &dev->i2c_bus[1].i2c_adap,
                                "tuner", "tuner", dev->tuner_addr);
                else
-                       sd = v4l2_i2c_new_probed_subdev(&dev->i2c_bus[1].i2c_adap,
+                       sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                               &dev->i2c_bus[1].i2c_adap,
                                "tuner", "tuner", v4l2_i2c_tuner_addrs(ADDRS_TV));
                if (sd) {
                        struct tuner_setup tun_setup;
index 02d980a29962381474a7aea6c34ba2b95792e304..85642831ea8e935ffc96b1457aeaade824c7b598 100644 (file)
@@ -37,7 +37,7 @@
 #include <linux/version.h>
 #include <linux/mutex.h>
 
-#define CX23885_VERSION_CODE KERNEL_VERSION(0, 0, 1)
+#define CX23885_VERSION_CODE KERNEL_VERSION(0, 0, 2)
 
 #define UNSET (-1U)
 
index 93d74bee292afc82a3b8b33ede264dd18b745dc1..2f846f5e0f9fe1f3a60246cdcf8b960129bc7c46 100644 (file)
@@ -32,7 +32,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
 
        /* common for all inputs and rates */
        /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */
-       if (!state->is_cx23885)
+       if (!state->is_cx23885 && !state->is_cx231xx)
                cx25840_write(client, 0x127, 0x50);
 
        if (state->aud_input != CX25840_AUDIO_SERIAL) {
@@ -43,11 +43,14 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
                                 * so avoid destroying registers. */
                                break;
                        }
-                       /* VID_PLL and AUX_PLL */
-                       cx25840_write4(client, 0x108, 0x1006040f);
 
-                       /* AUX_PLL_FRAC */
-                       cx25840_write4(client, 0x110, 0x01bb39ee);
+                       if (!state->is_cx231xx) {
+                               /* VID_PLL and AUX_PLL */
+                               cx25840_write4(client, 0x108, 0x1006040f);
+
+                               /* AUX_PLL_FRAC */
+                               cx25840_write4(client, 0x110, 0x01bb39ee);
+                       }
 
                        if (state->is_cx25836)
                                break;
@@ -64,11 +67,14 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
                                 * so avoid destroying registers. */
                                break;
                        }
-                       /* VID_PLL and AUX_PLL */
-                       cx25840_write4(client, 0x108, 0x1009040f);
 
-                       /* AUX_PLL_FRAC */
-                       cx25840_write4(client, 0x110, 0x00ec6bd6);
+                       if (!state->is_cx231xx) {
+                               /* VID_PLL and AUX_PLL */
+                               cx25840_write4(client, 0x108, 0x1009040f);
+
+                               /* AUX_PLL_FRAC */
+                               cx25840_write4(client, 0x110, 0x00ec6bd6);
+                       }
 
                        if (state->is_cx25836)
                                break;
@@ -85,11 +91,14 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
                                 * so avoid destroying registers. */
                                break;
                        }
-                       /* VID_PLL and AUX_PLL */
-                       cx25840_write4(client, 0x108, 0x100a040f);
 
-                       /* AUX_PLL_FRAC */
-                       cx25840_write4(client, 0x110, 0x0098d6e5);
+                       if (!state->is_cx231xx) {
+                               /* VID_PLL and AUX_PLL */
+                               cx25840_write4(client, 0x108, 0x100a040f);
+
+                               /* AUX_PLL_FRAC */
+                               cx25840_write4(client, 0x110, 0x0098d6e5);
+                       }
 
                        if (state->is_cx25836)
                                break;
@@ -108,11 +117,14 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
                                 * so avoid destroying registers. */
                                break;
                        }
-                       /* VID_PLL and AUX_PLL */
-                       cx25840_write4(client, 0x108, 0x1e08040f);
 
-                       /* AUX_PLL_FRAC */
-                       cx25840_write4(client, 0x110, 0x012a0869);
+                       if (!state->is_cx231xx) {
+                               /* VID_PLL and AUX_PLL */
+                               cx25840_write4(client, 0x108, 0x1e08040f);
+
+                               /* AUX_PLL_FRAC */
+                               cx25840_write4(client, 0x110, 0x012a0869);
+                       }
 
                        if (state->is_cx25836)
                                break;
@@ -136,11 +148,14 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
                                break;
                        }
 
-                       /* VID_PLL and AUX_PLL */
-                       cx25840_write4(client, 0x108, 0x1809040f);
 
-                       /* AUX_PLL_FRAC */
-                       cx25840_write4(client, 0x110, 0x00ec6bd6);
+                       if (!state->is_cx231xx) {
+                               /* VID_PLL and AUX_PLL */
+                               cx25840_write4(client, 0x108, 0x1809040f);
+
+                               /* AUX_PLL_FRAC */
+                               cx25840_write4(client, 0x110, 0x00ec6bd6);
+                       }
 
                        if (state->is_cx25836)
                                break;
@@ -155,7 +170,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
                        break;
 
                case 48000:
-                       if (!state->is_cx23885) {
+                       if (!state->is_cx23885 && !state->is_cx231xx) {
                                /* VID_PLL and AUX_PLL */
                                cx25840_write4(client, 0x108, 0x180a040f);
 
@@ -166,7 +181,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
                        if (state->is_cx25836)
                                break;
 
-                       if (!state->is_cx23885) {
+                       if (!state->is_cx23885 && !state->is_cx231xx) {
                                /* src1_ctl */
                                cx25840_write4(client, 0x8f8, 0x08018000);
 
@@ -227,10 +242,9 @@ void cx25840_audio_set_path(struct i2c_client *client)
        /* deassert soft reset */
        cx25840_and_or(client, 0x810, ~0x1, 0x00);
 
-       if (state->is_cx23885) {
-               /* Ensure the controller is running when we exit */
+       /* Ensure the controller is running when we exit */
+       if (state->is_cx23885 || state->is_cx231xx)
                cx25840_and_or(client, 0x803, ~0x10, 0x10);
-       }
 }
 
 static int get_volume(struct i2c_client *client)
index 737ee4ea883082294330abfff84ade1512efefaa..0be51b65f0981c2387f2b9b9872e29e6d29f2f93 100644 (file)
@@ -345,6 +345,77 @@ static void cx23885_initialize(struct i2c_client *client)
 
 /* ----------------------------------------------------------------------- */
 
+static void cx231xx_initialize(struct i2c_client *client)
+{
+       DEFINE_WAIT(wait);
+       struct cx25840_state *state = to_state(i2c_get_clientdata(client));
+       struct workqueue_struct *q;
+
+       /* Internal Reset */
+       cx25840_and_or(client, 0x102, ~0x01, 0x01);
+       cx25840_and_or(client, 0x102, ~0x01, 0x00);
+
+       /* Stop microcontroller */
+       cx25840_and_or(client, 0x803, ~0x10, 0x00);
+
+       /* DIF in reset? */
+       cx25840_write(client, 0x398, 0);
+
+       /* Trust the default xtal, no division */
+       /* This changes for the cx23888 products */
+       cx25840_write(client, 0x2, 0x76);
+
+       /* Bring down the regulator for AUX clk */
+       cx25840_write(client, 0x1, 0x40);
+
+       /* Disable DIF bypass */
+       cx25840_write4(client, 0x33c, 0x00000001);
+
+       /* DIF Src phase inc */
+       cx25840_write4(client, 0x340, 0x0df7df83);
+
+       /* Luma */
+       cx25840_write4(client, 0x414, 0x00107d12);
+
+       /* Chroma */
+       cx25840_write4(client, 0x420, 0x3d008282);
+
+       /* ADC2 input select */
+       cx25840_write(client, 0x102, 0x10);
+
+       /* VIN1 & VIN5 */
+       cx25840_write(client, 0x103, 0x11);
+
+       /* Enable format auto detect */
+       cx25840_write(client, 0x400, 0);
+       /* Fast subchroma lock */
+       /* White crush, Chroma AGC & Chroma Killer enabled */
+       cx25840_write(client, 0x401, 0xe8);
+
+       /* Do the firmware load in a work handler to prevent.
+          Otherwise the kernel is blocked waiting for the
+          bit-banging i2c interface to finish uploading the
+          firmware. */
+       INIT_WORK(&state->fw_work, cx25840_work_handler);
+       init_waitqueue_head(&state->fw_wait);
+       q = create_singlethread_workqueue("cx25840_fw");
+       prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
+       queue_work(q, &state->fw_work);
+       schedule();
+       finish_wait(&state->fw_wait, &wait);
+       destroy_workqueue(q);
+
+       cx25840_std_setup(client);
+
+       /* (re)set input */
+       set_input(client, state->vid_input, state->aud_input);
+
+       /* start microcontroller */
+       cx25840_and_or(client, 0x803, ~0x10, 0x10);
+}
+
+/* ----------------------------------------------------------------------- */
+
 void cx25840_std_setup(struct i2c_client *client)
 {
        struct cx25840_state *state = to_state(i2c_get_clientdata(client));
@@ -414,39 +485,41 @@ void cx25840_std_setup(struct i2c_client *client)
        }
 
        /* DEBUG: Displays configured PLL frequency */
-       pll_int = cx25840_read(client, 0x108);
-       pll_frac = cx25840_read4(client, 0x10c) & 0x1ffffff;
-       pll_post = cx25840_read(client, 0x109);
-       v4l_dbg(1, cx25840_debug, client,
-                               "PLL regs = int: %u, frac: %u, post: %u\n",
-                               pll_int, pll_frac, pll_post);
-
-       if (pll_post) {
-               int fin, fsc;
-               int pll = (28636363L * ((((u64)pll_int) << 25L) + pll_frac)) >> 25L;
-
-               pll /= pll_post;
-               v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n",
-                               pll / 1000000, pll % 1000000);
-               v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n",
-                               pll / 8000000, (pll / 8) % 1000000);
-
-               fin = ((u64)src_decimation * pll) >> 12;
-               v4l_dbg(1, cx25840_debug, client,
-                               "ADC Sampling freq = %d.%06d MHz\n",
-                               fin / 1000000, fin % 1000000);
-
-               fsc = (((u64)sc) * pll) >> 24L;
+       if (!state->is_cx231xx) {
+               pll_int = cx25840_read(client, 0x108);
+               pll_frac = cx25840_read4(client, 0x10c) & 0x1ffffff;
+               pll_post = cx25840_read(client, 0x109);
                v4l_dbg(1, cx25840_debug, client,
-                               "Chroma sub-carrier freq = %d.%06d MHz\n",
-                               fsc / 1000000, fsc % 1000000);
-
-               v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, "
-                       "vblank %i, vactive %i, vblank656 %i, src_dec %i, "
-                       "burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x, "
-                       "sc 0x%06x\n",
-                       hblank, hactive, vblank, vactive, vblank656,
-                       src_decimation, burst, luma_lpf, uv_lpf, comb, sc);
+                       "PLL regs = int: %u, frac: %u, post: %u\n",
+                       pll_int, pll_frac, pll_post);
+
+               if (pll_post) {
+                       int fin, fsc;
+                       int pll = (28636363L * ((((u64)pll_int) << 25L) + pll_frac)) >> 25L;
+
+                       pll /= pll_post;
+                       v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n",
+                                       pll / 1000000, pll % 1000000);
+                       v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n",
+                                       pll / 8000000, (pll / 8) % 1000000);
+
+                       fin = ((u64)src_decimation * pll) >> 12;
+                       v4l_dbg(1, cx25840_debug, client,
+                                       "ADC Sampling freq = %d.%06d MHz\n",
+                                       fin / 1000000, fin % 1000000);
+
+                       fsc = (((u64)sc) * pll) >> 24L;
+                       v4l_dbg(1, cx25840_debug, client,
+                                       "Chroma sub-carrier freq = %d.%06d MHz\n",
+                                       fsc / 1000000, fsc % 1000000);
+
+                       v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, "
+                               "vblank %i, vactive %i, vblank656 %i, src_dec %i, "
+                               "burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x, "
+                               "sc 0x%06x\n",
+                               hblank, hactive, vblank, vactive, vblank656,
+                               src_decimation, burst, luma_lpf, uv_lpf, comb, sc);
+               }
        }
 
        /* Sets horizontal blanking delay and active lines */
@@ -596,7 +669,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
         * configuration in reg (for the cx23885) so we have no
         * need to attempt to flip bits for earlier av decoders.
         */
-       if (!state->is_cx23885) {
+       if (!state->is_cx23885 && !state->is_cx231xx) {
                switch (aud_input) {
                case CX25840_AUDIO_SERIAL:
                        /* do nothing, use serial audio input */
@@ -619,7 +692,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
        /* Set INPUT_MODE to Composite (0) or S-Video (1) */
        cx25840_and_or(client, 0x401, ~0x6, is_composite ? 0 : 0x02);
 
-       if (!state->is_cx23885) {
+       if (!state->is_cx23885 && !state->is_cx231xx) {
                /* Set CH_SEL_ADC2 to 1 if input comes from CH3 */
                cx25840_and_or(client, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0);
                /* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2&CH3 */
@@ -653,6 +726,19 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
                /* I2S_IN_CTL: I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1 */
                cx25840_write(client, 0x914, 0xa0);
 
+               /* I2S_OUT_CTL:
+                * I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1
+                * I2S_OUT_MASTER_MODE = Master
+                */
+               cx25840_write(client, 0x918, 0xa0);
+               cx25840_write(client, 0x919, 0x01);
+       } else if (state->is_cx231xx) {
+               /* Audio channel 1 src : Parallel 1 */
+               cx25840_write(client, 0x124, 0x03);
+
+               /* I2S_IN_CTL: I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1 */
+               cx25840_write(client, 0x914, 0xa0);
+
                /* I2S_OUT_CTL:
                 * I2S_IN_SONY_MODE, LEFT SAMPLE on WS=1
                 * I2S_OUT_MASTER_MODE = Master
@@ -1096,7 +1182,7 @@ static void log_audio_status(struct i2c_client *client)
 
 /* ----------------------------------------------------------------------- */
 
-/* This init operation must be called to load the driver's firmware.
+/* This load_fw operation must be called to load the driver's firmware.
    Without this the audio standard detection will fail and you will
    only get mono.
 
@@ -1106,18 +1192,20 @@ static void log_audio_status(struct i2c_client *client)
    postponing it is that loading this firmware takes a long time (seconds)
    due to the slow i2c bus speed. So it will speed up the boot process if
    you can avoid loading the fw as long as the video device isn't used.  */
-static int cx25840_init(struct v4l2_subdev *sd, u32 val)
+static int cx25840_load_fw(struct v4l2_subdev *sd)
 {
        struct cx25840_state *state = to_state(sd);
        struct i2c_client *client = v4l2_get_subdevdata(sd);
 
        if (!state->is_initialized) {
-               /* initialize on first use */
+               /* initialize and load firmware */
                state->is_initialized = 1;
                if (state->is_cx25836)
                        cx25836_initialize(client);
                else if (state->is_cx23885)
                        cx23885_initialize(client);
+               else if (state->is_cx231xx)
+                       cx231xx_initialize(client);
                else
                        cx25840_initialize(client);
        }
@@ -1159,7 +1247,7 @@ static int cx25840_s_stream(struct v4l2_subdev *sd, int enable)
        v4l_dbg(1, cx25840_debug, client, "%s output\n",
                        enable ? "enable" : "disable");
        if (enable) {
-               if (state->is_cx23885) {
+               if (state->is_cx23885 || state->is_cx231xx) {
                        u8 v = (cx25840_read(client, 0x421) | 0x0b);
                        cx25840_write(client, 0x421, v);
                } else {
@@ -1169,7 +1257,7 @@ static int cx25840_s_stream(struct v4l2_subdev *sd, int enable)
                                        state->is_cx25836 ? 0x04 : 0x07);
                }
        } else {
-               if (state->is_cx23885) {
+               if (state->is_cx23885 || state->is_cx231xx) {
                        u8 v = cx25840_read(client, 0x421) & ~(0x0b);
                        cx25840_write(client, 0x421, v);
                } else {
@@ -1234,22 +1322,24 @@ static int cx25840_s_radio(struct v4l2_subdev *sd)
        return 0;
 }
 
-static int cx25840_s_video_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int cx25840_s_video_routing(struct v4l2_subdev *sd,
+                                  u32 input, u32 output, u32 config)
 {
        struct cx25840_state *state = to_state(sd);
        struct i2c_client *client = v4l2_get_subdevdata(sd);
 
-       return set_input(client, route->input, state->aud_input);
+       return set_input(client, input, state->aud_input);
 }
 
-static int cx25840_s_audio_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int cx25840_s_audio_routing(struct v4l2_subdev *sd,
+                                  u32 input, u32 output, u32 config)
 {
        struct cx25840_state *state = to_state(sd);
        struct i2c_client *client = v4l2_get_subdevdata(sd);
 
        if (state->is_cx25836)
                return -EINVAL;
-       return set_input(client, state->vid_input, route->input);
+       return set_input(client, state->vid_input, input);
 }
 
 static int cx25840_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *freq)
@@ -1350,6 +1440,8 @@ static int cx25840_reset(struct v4l2_subdev *sd, u32 val)
                cx25836_initialize(client);
        else if (state->is_cx23885)
                cx23885_initialize(client);
+       else if (state->is_cx231xx)
+               cx231xx_initialize(client);
        else
                cx25840_initialize(client);
        return 0;
@@ -1382,8 +1474,9 @@ static const struct v4l2_subdev_core_ops cx25840_core_ops = {
        .g_ctrl = cx25840_g_ctrl,
        .s_ctrl = cx25840_s_ctrl,
        .queryctrl = cx25840_queryctrl,
+       .s_std = cx25840_s_std,
        .reset = cx25840_reset,
-       .init = cx25840_init,
+       .load_fw = cx25840_load_fw,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
        .g_register = cx25840_g_register,
        .s_register = cx25840_s_register,
@@ -1392,7 +1485,6 @@ static const struct v4l2_subdev_core_ops cx25840_core_ops = {
 
 static const struct v4l2_subdev_tuner_ops cx25840_tuner_ops = {
        .s_frequency = cx25840_s_frequency,
-       .s_std = cx25840_s_std,
        .s_radio = cx25840_s_radio,
        .g_tuner = cx25840_g_tuner,
        .s_tuner = cx25840_s_tuner,
@@ -1449,6 +1541,8 @@ static int cx25840_probe(struct i2c_client *client,
                id = V4L2_IDENT_CX25836 + ((device_id >> 4) & 0xf) - 6;
        } else if (device_id == 0x1313) {
                id = V4L2_IDENT_CX25836 + ((device_id >> 4) & 0xf) - 6;
+       } else if ((device_id & 0xfff0) == 0x5A30) {
+               id = V4L2_IDENT_CX25840 + ((device_id >> 4) & 0xf);
        }
        else {
                v4l_dbg(1, cx25840_debug, client, "cx25840 not found\n");
@@ -1471,6 +1565,7 @@ static int cx25840_probe(struct i2c_client *client,
        state->c = client;
        state->is_cx25836 = ((device_id & 0xff00) == 0x8300);
        state->is_cx23885 = (device_id == 0x0000) || (device_id == 0x1313);
+       state->is_cx231xx = (device_id == 0x5a3e);
        state->vid_input = CX25840_COMPOSITE7;
        state->aud_input = CX25840_AUDIO8;
        state->audclk_freq = 48000;
index 9ad0eb86ecfd4b94c7866bc696ea05f644234b2c..814b565369949e86a36776f3c2fe0755c75d5399 100644 (file)
@@ -50,6 +50,7 @@ struct cx25840_state {
        u32 rev;
        int is_cx25836;
        int is_cx23885;
+       int is_cx231xx;
        int is_initialized;
        wait_queue_head_t fw_wait;    /* wake up when the fw load is finished */
        struct work_struct fw_work;   /* work entry for fw load */
index 0b2dceb74108696b00cde823e9f63a6446818c1c..0df53b0d75d9ab07a6377eae4437a36e613bbf01 100644 (file)
@@ -25,6 +25,7 @@
 
 #define FWFILE "v4l-cx25840.fw"
 #define FWFILE_CX23885 "v4l-cx23885-avcore-01.fw"
+#define FWFILE_CX231XX "v4l-cx231xx-avcore-01.fw"
 
 /*
  * Mike Isely <isely@pobox.com> - The FWSEND parameter controls the
@@ -96,9 +97,17 @@ int cx25840_loadfw(struct i2c_client *client)
        u8 buffer[FWSEND];
        const u8 *ptr;
        int size, retval;
+       int MAX_BUF_SIZE = FWSEND;
 
        if (state->is_cx23885)
                firmware = FWFILE_CX23885;
+       else if (state->is_cx231xx)
+               firmware = FWFILE_CX231XX;
+
+       if ((state->is_cx231xx) && MAX_BUF_SIZE > 16) {
+               v4l_err(client, " Firmware download size changed to 16 bytes max length\n");
+               MAX_BUF_SIZE = 16;  /* cx231xx cannot accept more than 16 bytes at a time */
+       }
 
        if (request_firmware(&fw, firmware, FWDEV(client)) != 0) {
                v4l_err(client, "unable to open firmware %s\n", firmware);
@@ -113,7 +122,7 @@ int cx25840_loadfw(struct i2c_client *client)
        size = fw->size;
        ptr = fw->data;
        while (size > 0) {
-               int len = min(FWSEND - 2, size);
+               int len = min(MAX_BUF_SIZE - 2, size);
 
                memcpy(buffer + 2, ptr, len);
 
index ce98d955231ae4f505b8e018836698d33a3ebde8..0ccdf36626e30a0f30d47e7bb7fb44c2bfe04833 100644 (file)
@@ -745,7 +745,7 @@ static int __devinit snd_cx88_create(struct snd_card *card,
                return err;
        }
 
-       if (!pci_dma_supported(pci,DMA_32BIT_MASK)) {
+       if (!pci_dma_supported(pci,DMA_BIT_MASK(32))) {
                dprintk(0, "%s/1: Oops: no 32bit PCI DMA ???\n",core->name);
                err = -EIO;
                cx88_core_put(core,pci);
index 0363971a23a83001140a012b66562f3b3ed01fb3..6bbbfc66bb4bf2ac84be1fc56ecf5c7c0f8cc145 100644 (file)
@@ -3049,7 +3049,7 @@ static void cx88_card_setup(struct cx88_core *core)
                            ctl.fname);
                call_all(core, tuner, s_config, &xc2028_cfg);
        }
-       call_all(core, core, s_standby, 0);
+       call_all(core, tuner, s_standby);
 }
 
 /* ------------------------------------------------------------------ */
@@ -3221,16 +3221,19 @@ struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
                   The radio_type is sometimes missing, or set to UNSET but
                   later code configures a tea5767.
                 */
-               v4l2_i2c_new_probed_subdev(&core->i2c_adap, "tuner", "tuner",
+               v4l2_i2c_new_probed_subdev(&core->v4l2_dev, &core->i2c_adap,
+                               "tuner", "tuner",
                                v4l2_i2c_tuner_addrs(ADDRS_RADIO));
                if (has_demod)
-                       v4l2_i2c_new_probed_subdev(&core->i2c_adap, "tuner",
-                               "tuner", v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+                       v4l2_i2c_new_probed_subdev(&core->v4l2_dev,
+                               &core->i2c_adap, "tuner", "tuner",
+                               v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
                if (core->board.tuner_addr == ADDR_UNSET) {
-                       v4l2_i2c_new_probed_subdev(&core->i2c_adap, "tuner",
-                               "tuner", has_demod ? tv_addrs + 4 : tv_addrs);
+                       v4l2_i2c_new_probed_subdev(&core->v4l2_dev,
+                               &core->i2c_adap, "tuner", "tuner",
+                               has_demod ? tv_addrs + 4 : tv_addrs);
                } else {
-                       v4l2_i2c_new_subdev(&core->i2c_adap,
+                       v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
                                "tuner", "tuner", core->board.tuner_addr);
                }
        }
index f2fb9f30bfc185c025a06793294adb19bc06ad48..0e149b22bd194b14943fa30799ec143e36270343 100644 (file)
@@ -991,7 +991,7 @@ int cx88_set_tvnorm(struct cx88_core *core, v4l2_std_id norm)
        set_tvaudio(core);
 
        // tell i2c chips
-       call_all(core, tuner, s_std, norm);
+       call_all(core, core, s_std, norm);
 
        // done
        return 0;
index 4ff4d9fe0355849f3c9879421cdf98bd4beb7c45..9389cf290c1bfc815b5752697eaf120babecbcd3 100644 (file)
@@ -1168,7 +1168,7 @@ static int dvb_register(struct cx8802_dev *dev)
                fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
 
        /* Put the analog decoder in standby to keep it quiet */
-       call_all(core, core, s_standby, 0);
+       call_all(core, tuner, s_standby);
 
        /* register everything */
        return videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
index b295b76737e35acb4749cedef61f9c4f1edeaa67..da4e3912cd374991ba37f560779e2a871f05cf28 100644 (file)
@@ -455,7 +455,7 @@ static int cx8802_init_common(struct cx8802_dev *dev)
        if (pci_enable_device(dev->pci))
                return -EIO;
        pci_set_master(dev->pci);
-       if (!pci_dma_supported(dev->pci,DMA_32BIT_MASK)) {
+       if (!pci_dma_supported(dev->pci,DMA_BIT_MASK(32))) {
                printk("%s/2: Oops: no 32bit PCI DMA ???\n",dev->core->name);
                return -EIO;
        }
index 434237af5184ec99632b454a195affc62a2ce78d..b993d42fe73c138f5bfc9c289d16d1aa0a13ce13 100644 (file)
@@ -428,10 +428,8 @@ int cx88_video_mux(struct cx88_core *core, unsigned int input)
                   routes for different inputs. HVR-1300 surely does */
                if (core->board.audio_chip &&
                    core->board.audio_chip == V4L2_IDENT_WM8775) {
-                       struct v4l2_routing route;
-
-                       route.input = INPUT(input).audioroute;
-                       call_all(core, audio, s_routing, &route);
+                       call_all(core, audio, s_routing,
+                                       INPUT(input).audioroute, 0, 0);
                }
                /* cx2388's C-ADC is connected to the tuner only.
                   When used with S-Video, that ADC is busy dealing with
@@ -823,10 +821,8 @@ static int video_open(struct file *file)
                if (core->board.radio.audioroute) {
                        if(core->board.audio_chip &&
                                core->board.audio_chip == V4L2_IDENT_WM8775) {
-                               struct v4l2_routing route;
-
-                               route.input = core->board.radio.audioroute;
-                               call_all(core, audio, s_routing, &route);
+                               call_all(core, audio, s_routing,
+                                       core->board.radio.audioroute, 0, 0);
                        }
                        /* "I2S ADC mode" */
                        core->tvaudio = WW_I2SADC;
@@ -931,7 +927,7 @@ static int video_release(struct file *file)
        kfree(fh);
 
        if(atomic_dec_and_test(&dev->core->users))
-               call_all(dev->core, core, s_standby, 0);
+               call_all(dev->core, tuner, s_standby);
 
        return 0;
 }
@@ -1836,7 +1832,7 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
               dev->pci_lat,(unsigned long long)pci_resource_start(pci_dev,0));
 
        pci_set_master(pci_dev);
-       if (!pci_dma_supported(pci_dev,DMA_32BIT_MASK)) {
+       if (!pci_dma_supported(pci_dev,DMA_BIT_MASK(32))) {
                printk("%s/0: Oops: no 32bit PCI DMA ???\n",core->name);
                err = -EIO;
                goto fail_core;
@@ -1882,18 +1878,15 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
        /* load and configure helper modules */
 
        if (core->board.audio_chip == V4L2_IDENT_WM8775)
-               v4l2_i2c_new_subdev(&core->i2c_adap,
+               v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
                                "wm8775", "wm8775", 0x36 >> 1);
 
        if (core->board.audio_chip == V4L2_IDENT_TVAUDIO) {
                /* This probes for a tda9874 as is used on some
                   Pixelview Ultra boards. */
-               static const unsigned short i2c_addr[] = {
-                       0xb0 >> 1, I2C_CLIENT_END
-               };
-
-               v4l2_i2c_new_probed_subdev(&core->i2c_adap,
-                               "tvaudio", "tvaudio", i2c_addr);
+               v4l2_i2c_new_probed_subdev_addr(&core->v4l2_dev,
+                               &core->i2c_adap,
+                               "tvaudio", "tvaudio", 0xb0 >> 1);
        }
 
        switch (core->boardnr) {
index 9a43fdf20fae8977d3ac70fad7324a562aa6cc55..7724d168fc040434d6429e01c11ca82ddaeb87ea 100644 (file)
@@ -41,7 +41,7 @@
 
 #include <linux/version.h>
 #include <linux/mutex.h>
-#define CX88_VERSION_CODE KERNEL_VERSION(0,0,6)
+#define CX88_VERSION_CODE KERNEL_VERSION(0,0,7)
 
 #define UNSET (-1U)
 
index 0f48c0ff5ac399e14a0e8d9c8ca137fec0d681ec..7c70738479dd0ea79a1d277567ac89368655cddd 100644 (file)
@@ -31,6 +31,8 @@
 #include <media/msp3400.h>
 #include <media/saa7115.h>
 #include <media/tvp5150.h>
+#include <media/tvaudio.h>
+#include <media/i2c-addr.h>
 #include <media/tveeprom.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-chip-ident.h>
@@ -1240,6 +1242,7 @@ struct em28xx_board em28xx_boards[] = {
        [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
                .name         = "Compro VideoMate ForYou/Stereo",
                .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
+               .tvaudio_addr = 0xb0,
                .tda9887_conf = TDA9887_PRESENT,
                .decoder      = EM28XX_TVP5150,
                .adecoder     = EM28XX_TVAUDIO,
@@ -1444,6 +1447,24 @@ static struct em28xx_hash_table em28xx_i2c_hash[] = {
        {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
 };
 
+/* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */
+static unsigned short saa711x_addrs[] = {
+       0x4a >> 1, 0x48 >> 1,   /* SAA7111, SAA7111A and SAA7113 */
+       0x42 >> 1, 0x40 >> 1,   /* SAA7114, SAA7115 and SAA7118 */
+       I2C_CLIENT_END };
+
+static unsigned short tvp5150_addrs[] = {
+       0xb8 >> 1,
+       0xba >> 1,
+       I2C_CLIENT_END
+};
+
+static unsigned short msp3400_addrs[] = {
+       0x80 >> 1,
+       0x88 >> 1,
+       I2C_CLIENT_END
+};
+
 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
 {
        int rc = 0;
@@ -1672,31 +1693,55 @@ static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
        }
 }
 
-static void em28xx_config_tuner(struct em28xx *dev)
+static void em28xx_tuner_setup(struct em28xx *dev)
 {
-       struct v4l2_priv_tun_config  xc2028_cfg;
        struct tuner_setup           tun_setup;
        struct v4l2_frequency        f;
 
        if (dev->tuner_type == TUNER_ABSENT)
                return;
 
+       memset(&tun_setup, 0, sizeof(tun_setup));
+
        tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
-       tun_setup.type = dev->tuner_type;
-       tun_setup.addr = dev->tuner_addr;
        tun_setup.tuner_callback = em28xx_tuner_callback;
 
-       em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
+       if (dev->board.radio.type) {
+               tun_setup.type = dev->board.radio.type;
+               tun_setup.addr = dev->board.radio_addr;
+
+               v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
+       }
+
+       if ((dev->tuner_type != TUNER_ABSENT) && (dev->tuner_type)) {
+               tun_setup.type   = dev->tuner_type;
+               tun_setup.addr   = dev->tuner_addr;
+
+               v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
+       }
+
+       if (dev->tda9887_conf) {
+               struct v4l2_priv_tun_config tda9887_cfg;
+
+               tda9887_cfg.tuner = TUNER_TDA9887;
+               tda9887_cfg.priv = &dev->tda9887_conf;
+
+               v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &tda9887_cfg);
+       }
 
        if (dev->tuner_type == TUNER_XC2028) {
+               struct v4l2_priv_tun_config  xc2028_cfg;
                struct xc2028_ctrl           ctl;
 
+               memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
+               memset(&ctl, 0, sizeof(ctl));
+
                em28xx_setup_xc3028(dev, &ctl);
 
                xc2028_cfg.tuner = TUNER_XC2028;
                xc2028_cfg.priv  = &ctl;
 
-               em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &xc2028_cfg);
        }
 
        /* configure tuner */
@@ -1704,7 +1749,7 @@ static void em28xx_config_tuner(struct em28xx *dev)
        f.type = V4L2_TUNER_ANALOG_TV;
        f.frequency = 9076;     /* just a magic number */
        dev->ctl_freq = f.frequency;
-       em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
 }
 
 static int em28xx_hint_board(struct em28xx *dev)
@@ -1911,22 +1956,52 @@ void em28xx_card_setup(struct em28xx *dev)
        if (tuner >= 0)
                dev->tuner_type = tuner;
 
-#ifdef CONFIG_MODULES
        /* request some modules */
        if (dev->board.has_msp34xx)
-               request_module("msp3400");
+               v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                       "msp3400", "msp3400", msp3400_addrs);
+
        if (dev->board.decoder == EM28XX_SAA711X)
-               request_module("saa7115");
+               v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                       "saa7115", "saa7115_auto", saa711x_addrs);
+
        if (dev->board.decoder == EM28XX_TVP5150)
-               request_module("tvp5150");
-       if (dev->board.tuner_type != TUNER_ABSENT)
-               request_module("tuner");
-       if (dev->board.adecoder == EM28XX_TVAUDIO)
-               request_module("tvaudio");
-#endif
+               v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                       "tvp5150", "tvp5150", tvp5150_addrs);
 
-       em28xx_config_tuner(dev);
+       if (dev->board.adecoder == EM28XX_TVAUDIO)
+               v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                       "tvaudio", "tvaudio", dev->board.tvaudio_addr);
+
+       if (dev->board.tuner_type != TUNER_ABSENT) {
+               int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
+
+               if (dev->board.radio.type)
+                       v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                               "tuner", "tuner", dev->board.radio_addr);
+
+               if (has_demod)
+                       v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                               &dev->i2c_adap, "tuner", "tuner",
+                               v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+               if (dev->tuner_addr == 0) {
+                       enum v4l2_i2c_tuner_type type =
+                               has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
+                       struct v4l2_subdev *sd;
+
+                       sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                               &dev->i2c_adap, "tuner", "tuner",
+                               v4l2_i2c_tuner_addrs(type));
+
+                       if (sd)
+                               dev->tuner_addr = v4l2_i2c_subdev_addr(sd);
+               } else {
+                       v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                               "tuner", "tuner", dev->tuner_addr);
+               }
+       }
 
+       em28xx_tuner_setup(dev);
        em28xx_ir_init(dev);
 }
 
@@ -1975,6 +2050,9 @@ void em28xx_release_resources(struct em28xx *dev)
        em28xx_remove_from_devlist(dev);
 
        em28xx_i2c_unregister(dev);
+
+       v4l2_device_unregister(&dev->v4l2_dev);
+
        usb_put_dev(dev->udev);
 
        /* Mark device as unused */
@@ -1986,6 +2064,7 @@ void em28xx_release_resources(struct em28xx *dev)
  * allocates and inits the device structs, registers i2c bus and v4l device
  */
 static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
+                          struct usb_interface *interface,
                           int minor)
 {
        struct em28xx *dev = *devhandle;
@@ -2019,9 +2098,16 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
                }
        }
 
+       retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
+       if (retval < 0) {
+               em28xx_errdev("Call to v4l2_device_register() failed!\n");
+               return retval;
+       }
+
        /* register i2c bus */
        errCode = em28xx_i2c_register(dev);
        if (errCode < 0) {
+               v4l2_device_unregister(&dev->v4l2_dev);
                em28xx_errdev("%s: em28xx_i2c_register - errCode [%d]!\n",
                        __func__, errCode);
                return errCode;
@@ -2033,6 +2119,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
        /* Configure audio */
        errCode = em28xx_audio_setup(dev);
        if (errCode < 0) {
+               v4l2_device_unregister(&dev->v4l2_dev);
                em28xx_errdev("%s: Error while setting audio - errCode [%d]!\n",
                        __func__, errCode);
        }
@@ -2077,7 +2164,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
        em28xx_init_extension(dev);
 
        /* Save some power by putting tuner to sleep */
-       em28xx_i2c_call_clients(dev, TUNER_SET_STANDBY, NULL);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_standby);
 
        return 0;
 
@@ -2096,7 +2183,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
        struct usb_device *udev;
        struct usb_interface *uif;
        struct em28xx *dev = NULL;
-       int retval = -ENODEV;
+       int retval;
        int i, nr, ifnum, isoc_pipe;
        char *speed;
        char descr[255] = "";
@@ -2118,7 +2205,8 @@ static int em28xx_usb_probe(struct usb_interface *interface,
                        interface->altsetting[0].desc.bInterfaceClass);
 
                em28xx_devused &= ~(1<<nr);
-               return -ENODEV;
+               retval = -ENODEV;
+               goto err;
        }
 
        endpoint = &interface->cur_altsetting->endpoint[0].desc;
@@ -2151,7 +2239,8 @@ static int em28xx_usb_probe(struct usb_interface *interface,
                                "interface not used by the driver\n");
 
                        em28xx_devused &= ~(1<<nr);
-                       return -ENODEV;
+                       retval = -ENODEV;
+                       goto err;
                }
        }
 
@@ -2194,7 +2283,8 @@ static int em28xx_usb_probe(struct usb_interface *interface,
                printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
                                EM28XX_MAXBOARDS);
                em28xx_devused &= ~(1<<nr);
-               return -ENOMEM;
+               retval = -ENOMEM;
+               goto err;
        }
 
        /* allocate memory for our device state and initialize it */
@@ -2202,7 +2292,8 @@ static int em28xx_usb_probe(struct usb_interface *interface,
        if (dev == NULL) {
                em28xx_err(DRIVER_NAME ": out of memory!\n");
                em28xx_devused &= ~(1<<nr);
-               return -ENOMEM;
+               retval = -ENOMEM;
+               goto err;
        }
 
        snprintf(dev->name, 29, "em28xx #%d", nr);
@@ -2229,7 +2320,8 @@ static int em28xx_usb_probe(struct usb_interface *interface,
                em28xx_errdev("out of memory!\n");
                em28xx_devused &= ~(1<<nr);
                kfree(dev);
-               return -ENOMEM;
+               retval = -ENOMEM;
+               goto err;
        }
 
        for (i = 0; i < dev->num_alt ; i++) {
@@ -2244,12 +2336,11 @@ static int em28xx_usb_probe(struct usb_interface *interface,
        /* allocate device struct */
        mutex_init(&dev->lock);
        mutex_lock(&dev->lock);
-       retval = em28xx_init_dev(&dev, udev, nr);
+       retval = em28xx_init_dev(&dev, udev, interface, nr);
        if (retval) {
                em28xx_devused &= ~(1<<dev->devno);
                kfree(dev);
-
-               return retval;
+               goto err;
        }
 
        /* save our data pointer in this interface device */
@@ -2263,6 +2354,9 @@ static int em28xx_usb_probe(struct usb_interface *interface,
        mutex_unlock(&dev->lock);
 
        return 0;
+
+err:
+       return retval;
 }
 
 /*
@@ -2288,6 +2382,8 @@ static void em28xx_usb_disconnect(struct usb_interface *interface)
 
        wake_up_interruptible_all(&dev->open);
 
+       v4l2_device_disconnect(&dev->v4l2_dev);
+
        if (dev->users) {
                em28xx_warn
                    ("device /dev/video%d is open! Deregistration and memory "
index 8f1999ca4803925f0cc78fdcae0877dfb2108305..192b76cdd5d733fb300b73e2dee2ee9134104ff4 100644 (file)
@@ -1018,14 +1018,10 @@ EXPORT_SYMBOL_GPL(em28xx_init_isoc);
  */
 void em28xx_wake_i2c(struct em28xx *dev)
 {
-       struct v4l2_routing route;
-       int zero = 0;
-
-       route.input = INPUT(dev->ctl_input)->vmux;
-       route.output = 0;
-       em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, &zero);
-       em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
-       em28xx_i2c_call_clients(dev, VIDIOC_STREAMON, NULL);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, core,  reset, 0);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
+                       INPUT(dev->ctl_input)->vmux, 0, 0);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
 }
 
 /*
index 02c12fe6361be60834745e8e76c1b87e1f42873e..f0bf1d960c759a081652ade96e3573d6326a6113 100644 (file)
@@ -459,70 +459,15 @@ static u32 functionality(struct i2c_adapter *adap)
 static int attach_inform(struct i2c_client *client)
 {
        struct em28xx *dev = client->adapter->algo_data;
+       struct IR_i2c *ir = i2c_get_clientdata(client);
 
        switch (client->addr << 1) {
-       case 0x86:
-       case 0x84:
-       case 0x96:
-       case 0x94:
-       {
-               struct v4l2_priv_tun_config tda9887_cfg;
-
-               struct tuner_setup tun_setup;
-
-               tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
-               tun_setup.type = TUNER_TDA9887;
-               tun_setup.addr = client->addr;
-
-               em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR,
-                       &tun_setup);
-
-               tda9887_cfg.tuner = TUNER_TDA9887;
-               tda9887_cfg.priv = &dev->tda9887_conf;
-               em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG,
-                                       &tda9887_cfg);
-               break;
-       }
-       case 0x42:
-               dprintk1(1, "attach_inform: saa7114 detected.\n");
-               break;
-       case 0x4a:
-               dprintk1(1, "attach_inform: saa7113 detected.\n");
-               break;
-       case 0xa0:
-               dprintk1(1, "attach_inform: eeprom detected.\n");
-               break;
        case 0x60:
        case 0x8e:
-       {
-               struct IR_i2c *ir = i2c_get_clientdata(client);
-               dprintk1(1, "attach_inform: IR detected (%s).\n",
-                       ir->phys);
+               dprintk1(1, "attach_inform: IR detected (%s).\n", ir->phys);
                em28xx_set_ir(dev, ir);
                break;
        }
-       case 0x80:
-       case 0x88:
-               dprintk1(1, "attach_inform: msp34xx detected.\n");
-               break;
-       case 0xb8:
-       case 0xba:
-               dprintk1(1, "attach_inform: tvp5150 detected.\n");
-               break;
-
-       case 0xb0:
-               dprintk1(1, "attach_inform: tda9874 detected\n");
-               break;
-
-       default:
-               if (!dev->tuner_addr)
-                       dev->tuner_addr = client->addr;
-
-               dprintk1(1, "attach inform: detected I2C address %x\n",
-                               client->addr << 1);
-               dprintk1(1, "driver id %d\n", client->driver->id);
-
-       }
 
        return 0;
 }
@@ -534,7 +479,6 @@ static struct i2c_algorithm em28xx_algo = {
 
 static struct i2c_adapter em28xx_adap_template = {
        .owner = THIS_MODULE,
-       .class = I2C_CLASS_TV_ANALOG,
        .name = "em28xx",
        .id = I2C_HW_B_EM28XX,
        .algo = &em28xx_algo,
@@ -594,16 +538,6 @@ void em28xx_do_i2c_scan(struct em28xx *dev)
                                        ARRAY_SIZE(i2c_devicelist), 32);
 }
 
-/*
- * em28xx_i2c_call_clients()
- * send commands to all attached i2c devices
- */
-void em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg)
-{
-       BUG_ON(NULL == dev->i2c_adap.algo_data);
-       i2c_clients_command(&dev->i2c_adap, cmd, arg);
-}
-
 /*
  * em28xx_i2c_register()
  * register i2c bus
@@ -618,6 +552,7 @@ int em28xx_i2c_register(struct em28xx *dev)
        dev->i2c_adap.dev.parent = &dev->udev->dev;
        strcpy(dev->i2c_adap.name, dev->name);
        dev->i2c_adap.algo_data = dev;
+       i2c_set_adapdata(&dev->i2c_adap, &dev->v4l2_dev);
 
        retval = i2c_add_adapter(&dev->i2c_adap);
        if (retval < 0) {
index 575472f1e7029ffcce9797354d8fb1c8ae797e63..882796e84dbc7c9da7a1c8d26075d17726060ff1 100644 (file)
@@ -49,7 +49,7 @@
                      "Sascha Sommer <saschasommer@freenet.de>"
 
 #define DRIVER_DESC         "Empia em28xx based USB video device driver"
-#define EM28XX_VERSION_CODE  KERNEL_VERSION(0, 1, 1)
+#define EM28XX_VERSION_CODE  KERNEL_VERSION(0, 1, 2)
 
 #define em28xx_videodbg(fmt, arg...) do {\
        if (video_debug) \
@@ -400,7 +400,7 @@ buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
        f.frequency = dev->ctl_freq;
        f.type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
 
-       em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
 
        return 0;
 }
@@ -515,10 +515,6 @@ static struct videobuf_queue_ops em28xx_video_qops = {
 
 static void video_mux(struct em28xx *dev, int index)
 {
-       struct v4l2_routing route;
-
-       route.input = INPUT(index)->vmux;
-       route.output = 0;
        dev->ctl_input = index;
        dev->ctl_ainput = INPUT(index)->amux;
        dev->ctl_aoutput = INPUT(index)->aout;
@@ -526,25 +522,22 @@ static void video_mux(struct em28xx *dev, int index)
        if (!dev->ctl_aoutput)
                dev->ctl_aoutput = EM28XX_AOUT_MASTER;
 
-       em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
+                       INPUT(index)->vmux, 0, 0);
 
        if (dev->board.has_msp34xx) {
                if (dev->i2s_speed) {
-                       em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ,
-                               &dev->i2s_speed);
+                       v4l2_device_call_all(&dev->v4l2_dev, 0, audio,
+                               s_i2s_clock_freq, dev->i2s_speed);
                }
-               route.input = dev->ctl_ainput;
-               route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
                /* Note: this is msp3400 specific */
-               em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING,
-                       &route);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
+                        dev->ctl_ainput, MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0);
        }
 
        if (dev->board.adecoder != EM28XX_NOADECODER) {
-               route.input = dev->ctl_ainput;
-               route.output = dev->ctl_aoutput;
-               em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING,
-                       &route);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
+                       dev->ctl_ainput, dev->ctl_aoutput, 0);
        }
 
        em28xx_audio_analog_set(dev);
@@ -829,7 +822,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
        get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
 
        em28xx_resolution_set(dev);
-       em28xx_i2c_call_clients(dev, VIDIOC_S_STD, &dev->norm);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, dev->norm);
 
        mutex_unlock(&dev->lock);
        return 0;
@@ -995,8 +988,9 @@ static int vidioc_queryctrl(struct file *file, void *priv,
                        }
                }
        }
+
        mutex_lock(&dev->lock);
-       em28xx_i2c_call_clients(dev, VIDIOC_QUERYCTRL, qc);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, core, queryctrl, qc);
        mutex_unlock(&dev->lock);
 
        if (qc->type)
@@ -1020,11 +1014,11 @@ static int vidioc_g_ctrl(struct file *file, void *priv,
        mutex_lock(&dev->lock);
 
        if (dev->board.has_msp34xx)
-               em28xx_i2c_call_clients(dev, VIDIOC_G_CTRL, ctrl);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
        else {
                rc = em28xx_get_ctrl(dev, ctrl);
                if (rc < 0) {
-                       em28xx_i2c_call_clients(dev, VIDIOC_G_CTRL, ctrl);
+                       v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
                        rc = 0;
                }
        }
@@ -1048,7 +1042,7 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
        mutex_lock(&dev->lock);
 
        if (dev->board.has_msp34xx)
-               em28xx_i2c_call_clients(dev, VIDIOC_S_CTRL, ctrl);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
        else {
                rc = 1;
                for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) {
@@ -1067,7 +1061,7 @@ static int vidioc_s_ctrl(struct file *file, void *priv,
 
        /* Control not found - try to send it to the attached devices */
        if (rc == 1) {
-               em28xx_i2c_call_clients(dev, VIDIOC_S_CTRL, ctrl);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
                rc = 0;
        }
 
@@ -1092,10 +1086,9 @@ static int vidioc_g_tuner(struct file *file, void *priv,
        strcpy(t->name, "Tuner");
 
        mutex_lock(&dev->lock);
-
-       em28xx_i2c_call_clients(dev, VIDIOC_G_TUNER, t);
-
+       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
        mutex_unlock(&dev->lock);
+
        return 0;
 }
 
@@ -1114,10 +1107,9 @@ static int vidioc_s_tuner(struct file *file, void *priv,
                return -EINVAL;
 
        mutex_lock(&dev->lock);
-
-       em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, t);
-
+       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
        mutex_unlock(&dev->lock);
+
        return 0;
 }
 
@@ -1157,7 +1149,7 @@ static int vidioc_s_frequency(struct file *file, void *priv,
        mutex_lock(&dev->lock);
 
        dev->ctl_freq = f->frequency;
-       em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, f);
 
        mutex_unlock(&dev->lock);
 
@@ -1186,7 +1178,7 @@ static int vidioc_g_chip_ident(struct file *file, void *priv,
        chip->ident = V4L2_IDENT_NONE;
        chip->revision = 0;
 
-       em28xx_i2c_call_clients(dev, VIDIOC_DBG_G_CHIP_IDENT, chip);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
 
        return 0;
 }
@@ -1211,7 +1203,7 @@ static int vidioc_g_register(struct file *file, void *priv,
                reg->size = 1;
                return 0;
        case V4L2_CHIP_MATCH_I2C_DRIVER:
-               em28xx_i2c_call_clients(dev, VIDIOC_DBG_G_REGISTER, reg);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
                return 0;
        case V4L2_CHIP_MATCH_I2C_ADDR:
                /* Not supported yet */
@@ -1263,7 +1255,7 @@ static int vidioc_s_register(struct file *file, void *priv,
 
                return rc;
        case V4L2_CHIP_MATCH_I2C_DRIVER:
-               em28xx_i2c_call_clients(dev, VIDIOC_DBG_S_REGISTER, reg);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
                return 0;
        case V4L2_CHIP_MATCH_I2C_ADDR:
                /* Not supported yet */
@@ -1406,13 +1398,13 @@ static int vidioc_g_fmt_sliced_vbi_cap(struct file *file, void *priv,
        mutex_lock(&dev->lock);
 
        f->fmt.sliced.service_set = 0;
-
-       em28xx_i2c_call_clients(dev, VIDIOC_G_FMT, f);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, video, g_fmt, f);
 
        if (f->fmt.sliced.service_set == 0)
                rc = -EINVAL;
 
        mutex_unlock(&dev->lock);
+
        return rc;
 }
 
@@ -1428,7 +1420,7 @@ static int vidioc_try_set_sliced_vbi_cap(struct file *file, void *priv,
                return rc;
 
        mutex_lock(&dev->lock);
-       em28xx_i2c_call_clients(dev, VIDIOC_G_FMT, f);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, video, g_fmt, f);
        mutex_unlock(&dev->lock);
 
        if (f->fmt.sliced.service_set == 0)
@@ -1532,7 +1524,7 @@ static int radio_g_tuner(struct file *file, void *priv,
        t->type = V4L2_TUNER_RADIO;
 
        mutex_lock(&dev->lock);
-       em28xx_i2c_call_clients(dev, VIDIOC_G_TUNER, t);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
        mutex_unlock(&dev->lock);
 
        return 0;
@@ -1567,7 +1559,7 @@ static int radio_s_tuner(struct file *file, void *priv,
                return -EINVAL;
 
        mutex_lock(&dev->lock);
-       em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, t);
+       v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
        mutex_unlock(&dev->lock);
 
        return 0;
@@ -1655,7 +1647,7 @@ static int em28xx_v4l2_open(struct file *filp)
        }
        if (fh->radio) {
                em28xx_videodbg("video_open: setting radio device\n");
-               em28xx_i2c_call_clients(dev, AUDC_SET_RADIO, NULL);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_radio);
        }
 
        dev->users++;
@@ -1738,7 +1730,7 @@ static int em28xx_v4l2_close(struct file *filp)
                }
 
                /* Save some power by putting tuner to sleep */
-               em28xx_i2c_call_clients(dev, TUNER_SET_STANDBY, NULL);
+               v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_standby);
 
                /* do this before setting alternate! */
                em28xx_uninit_isoc(dev);
@@ -1959,11 +1951,12 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev,
        vfd = video_device_alloc();
        if (NULL == vfd)
                return NULL;
-       *vfd = *template;
-       vfd->minor   = -1;
-       vfd->parent = &dev->udev->dev;
-       vfd->release = video_device_release;
-       vfd->debug = video_debug;
+
+       *vfd            = *template;
+       vfd->minor      = -1;
+       vfd->v4l2_dev   = &dev->v4l2_dev;
+       vfd->release    = video_device_release;
+       vfd->debug      = video_debug;
 
        snprintf(vfd->name, sizeof(vfd->name), "%s %s",
                 dev->name, type_name);
index a33a58da016e708feb5adb9f9912a048452ed46d..4c4e58004f5473fb8c2c1d0dfb188f4d1b4a8b51 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <linux/videodev2.h>
 #include <media/videobuf-vmalloc.h>
+#include <media/v4l2-device.h>
 
 #include <linux/i2c.h>
 #include <linux/mutex.h>
@@ -385,6 +386,8 @@ struct em28xx_board {
        unsigned int valid:1;
 
        unsigned char xclk, i2c_speed;
+       unsigned char radio_addr;
+       unsigned short tvaudio_addr;
 
        enum em28xx_decoder decoder;
        enum em28xx_adecoder adecoder;
@@ -460,6 +463,7 @@ struct em28xx {
        int devno;              /* marks the number of this device */
        enum em28xx_chip_id chip_id;
 
+       struct v4l2_device v4l2_dev;
        struct em28xx_board board;
 
        unsigned int stream_on:1;       /* Locks streams */
@@ -577,11 +581,9 @@ struct em28xx_ops {
 };
 
 /* Provided by em28xx-i2c.c */
-
-void em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg);
 void em28xx_do_i2c_scan(struct em28xx *dev);
-int em28xx_i2c_register(struct em28xx *dev);
-int em28xx_i2c_unregister(struct em28xx *dev);
+int  em28xx_i2c_register(struct em28xx *dev);
+int  em28xx_i2c_unregister(struct em28xx *dev);
 
 /* Provided by em28xx-core.c */
 
index a75c1ca2db41d05953c8d9c6cba9c8ddc3701861..a2741d7dccfeca4696c0167fce5b317f5eba7e56 100644 (file)
@@ -1132,6 +1132,7 @@ static int vidioc_enum_input(struct file *file, void *priv,
        if (input->index != 0)
                return -EINVAL;
        input->type = V4L2_INPUT_TYPE_CAMERA;
+       input->status = gspca_dev->cam.input_flags;
        strncpy(input->name, gspca_dev->sd_desc->name,
                sizeof input->name);
        return 0;
index e4d4cf6ce05a2825828e8d6599770e15fc0e949c..58e8ff02136a46bbca14802753c3c09e45115314 100644 (file)
@@ -56,6 +56,7 @@ struct cam {
                                 * - cannot be > MAX_NURBS
                                 * - when 0 and bulk_size != 0 means
                                 *   1 URB and submit done by subdriver */
+       u32 input_flags;        /* value for ENUM_INPUT status flags */
 };
 
 struct gspca_dev;
index 226ab4fc9d60bd71c7029d205a10e276a45d477b..9fa3644f4869971d73aa76337c625da57e8f5eb3 100644 (file)
@@ -7,5 +7,4 @@ gspca_m5602-objs := m5602_core.o \
                    m5602_s5k83a.o \
                    m5602_s5k4aa.o
 
-EXTRA_CFLAGS += -Idrivers/media/video/gspca
-
+EXTRA_CFLAGS += -Idrivers/media/video/gspca
\ No newline at end of file
index a3f3b7a0c7e75e59f8262751d9370d48cf0ccf79..8f1cea6fd3bface9c601eda1dc6de8befc507a0b 100644 (file)
@@ -112,14 +112,14 @@ static const unsigned char sensor_urb_skeleton[] = {
 struct sd {
        struct gspca_dev gspca_dev;
 
-       /* The name of the m5602 camera */
-       char *name;
-
        /* A pointer to the currently connected sensor */
-       struct m5602_sensor *sensor;
+       const struct m5602_sensor *sensor;
 
        struct sd_desc *desc;
 
+       /* Sensor private data */
+       void *sensor_priv;
+
        /* The current frame's id, used to detect frame boundaries */
        u8 frame_id;
 
index b35e4838a6e5740cca162efab67d7ddeaecbf253..1aac2985fee6db002240466fbabd0981ee350f43 100644 (file)
@@ -51,7 +51,7 @@ int m5602_read_bridge(struct sd *sd, u8 address, u8 *i2c_data)
               address, *i2c_data);
 
        /* usb_control_msg(...) returns the number of bytes sent upon success,
-       mask that and return zero upon success instead*/
+       mask that and return zero instead*/
        return (err < 0) ? err : 0;
 }
 
@@ -76,7 +76,7 @@ int m5602_write_bridge(struct sd *sd, u8 address, u8 i2c_data)
                                4, M5602_URB_MSG_TIMEOUT);
 
        /* usb_control_msg(...) returns the number of bytes sent upon success,
-          mask that and return zero upon success instead */
+          mask that and return zero instead */
        return (err < 0) ? err : 0;
 }
 
@@ -92,29 +92,29 @@ int m5602_read_sensor(struct sd *sd, const u8 address,
                err = m5602_read_bridge(sd, M5602_XB_I2C_STATUS, i2c_data);
        } while ((*i2c_data & I2C_BUSY) && !err);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_write_bridge(sd, M5602_XB_I2C_DEV_ADDR,
                                 sd->sensor->i2c_slave_id);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_write_bridge(sd, M5602_XB_I2C_REG_ADDR, address);
        if (err < 0)
-               goto out;
+               return err;
 
        if (sd->sensor->i2c_regW == 1) {
                err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, len);
                if (err < 0)
-                       goto out;
+                       return err;
 
                err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08);
                if (err < 0)
-                       goto out;
+                       return err;
        } else {
                err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x18 + len);
                if (err < 0)
-                       goto out;
+                       return err;
        }
 
        for (i = 0; (i < len) && !err; i++) {
@@ -123,7 +123,6 @@ int m5602_read_sensor(struct sd *sd, const u8 address,
                PDEBUG(D_CONF, "Reading sensor register "
                               "0x%x containing 0x%x ", address, *i2c_data);
        }
-out:
        return err;
 }
 
@@ -310,7 +309,11 @@ static void m5602_urb_complete(struct gspca_dev *gspca_dev,
 
 static void m5602_stop_transfer(struct gspca_dev *gspca_dev)
 {
-       /* Is there are a command to stop a data transfer? */
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       /* Run the sensor specific end transfer sequence */
+       if (sd->sensor->stop)
+               sd->sensor->stop(sd);
 }
 
 /* sub-driver description, the ctrl and nctrl is filled at probe time */
@@ -359,6 +362,17 @@ static int m5602_probe(struct usb_interface *intf,
                               THIS_MODULE);
 }
 
+void m5602_disconnect(struct usb_interface *intf)
+{
+       struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       if (sd->sensor->disconnect)
+               sd->sensor->disconnect(sd);
+
+       gspca_disconnect(intf);
+}
+
 static struct usb_driver sd_driver = {
        .name = MODULE_NAME,
        .id_table = m5602_table,
@@ -367,7 +381,7 @@ static struct usb_driver sd_driver = {
        .suspend = gspca_suspend,
        .resume = gspca_resume,
 #endif
-       .disconnect = gspca_disconnect
+       .disconnect = m5602_disconnect
 };
 
 /* -- module insert / remove -- */
index c0e71c33145433a80437a44ec0e7adc6659c3449..7d3f9e348ef4d5b6a576da145611da5d367e1c24 100644 (file)
 
 #include "m5602_mt9m111.h"
 
+static struct v4l2_pix_format mt9m111_modes[] = {
+       {
+               640,
+               480,
+               V4L2_PIX_FMT_SBGGR8,
+               V4L2_FIELD_NONE,
+               .sizeimage = 640 * 480,
+               .bytesperline = 640,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .priv = 0
+       }
+};
+
+const static struct ctrl mt9m111_ctrls[] = {
+       {
+               {
+                       .id             = V4L2_CID_VFLIP,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "vertical flip",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 0
+               },
+               .set = mt9m111_set_vflip,
+               .get = mt9m111_get_vflip
+       }, {
+               {
+                       .id             = V4L2_CID_HFLIP,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "horizontal flip",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 0
+               },
+               .set = mt9m111_set_hflip,
+               .get = mt9m111_get_hflip
+       }, {
+               {
+                       .id             = V4L2_CID_GAIN,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "gain",
+                       .minimum        = 0,
+                       .maximum        = (INITIAL_MAX_GAIN - 1) * 2 * 2 * 2,
+                       .step           = 1,
+                       .default_value  = DEFAULT_GAIN,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = mt9m111_set_gain,
+               .get = mt9m111_get_gain
+       }
+};
+
+
 static void mt9m111_dump_registers(struct sd *sd);
 
 int mt9m111_probe(struct sd *sd)
@@ -62,10 +117,10 @@ int mt9m111_probe(struct sd *sd)
        return -ENODEV;
 
 sensor_found:
-       sd->gspca_dev.cam.cam_mode = mt9m111.modes;
-       sd->gspca_dev.cam.nmodes = mt9m111.nmodes;
-       sd->desc->ctrls = mt9m111.ctrls;
-       sd->desc->nctrls = mt9m111.nctrls;
+       sd->gspca_dev.cam.cam_mode = mt9m111_modes;
+       sd->gspca_dev.cam.nmodes = ARRAY_SIZE(mt9m111_modes);
+       sd->desc->ctrls = mt9m111_ctrls;
+       sd->desc->nctrls = ARRAY_SIZE(mt9m111_ctrls);
        return 0;
 }
 
@@ -125,16 +180,15 @@ int mt9m111_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
        /* Set the correct page map */
        err = m5602_write_sensor(sd, MT9M111_PAGE_MAP, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, MT9M111_SC_R_MODE_CONTEXT_B, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        data[0] = (data[0] & 0xfe) | val;
        err = m5602_write_sensor(sd, MT9M111_SC_R_MODE_CONTEXT_B,
                                   data, 2);
-out:
        return err;
 }
 
@@ -163,16 +217,15 @@ int mt9m111_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
        /* Set the correct page map */
        err = m5602_write_sensor(sd, MT9M111_PAGE_MAP, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, MT9M111_SC_R_MODE_CONTEXT_B, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        data[0] = (data[0] & 0xfd) | ((val << 1) & 0x02);
        err = m5602_write_sensor(sd, MT9M111_SC_R_MODE_CONTEXT_B,
                                        data, 2);
-out:
        return err;
 }
 
@@ -204,7 +257,7 @@ int mt9m111_set_gain(struct gspca_dev *gspca_dev, __s32 val)
        /* Set the correct page map */
        err = m5602_write_sensor(sd, MT9M111_PAGE_MAP, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        if (val >= INITIAL_MAX_GAIN * 2 * 2 * 2)
                return -EINVAL;
@@ -229,7 +282,7 @@ int mt9m111_set_gain(struct gspca_dev *gspca_dev, __s32 val)
 
        err = m5602_write_sensor(sd, MT9M111_SC_GLOBAL_GAIN,
                                   data, 2);
-out:
+
        return err;
 }
 
index e795ab7a36c92adf8c7baaadef3a087f63811b2b..00c6db02bdb7724987e4d38f41cdc13ab94d93f3 100644 (file)
@@ -94,7 +94,7 @@ int mt9m111_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
 int mt9m111_get_gain(struct gspca_dev *gspca_dev, __s32 *val);
 int mt9m111_set_gain(struct gspca_dev *gspca_dev, __s32 val);
 
-static struct m5602_sensor mt9m111 = {
+const static struct m5602_sensor mt9m111 = {
        .name = "MT9M111",
 
        .i2c_slave_id = 0xba,
@@ -102,64 +102,7 @@ static struct m5602_sensor mt9m111 = {
 
        .probe = mt9m111_probe,
        .init = mt9m111_init,
-       .power_down = mt9m111_power_down,
-
-       .nctrls = 3,
-       .ctrls = {
-       {
-               {
-                       .id             = V4L2_CID_VFLIP,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "vertical flip",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0
-               },
-               .set = mt9m111_set_vflip,
-               .get = mt9m111_get_vflip
-       }, {
-               {
-                       .id             = V4L2_CID_HFLIP,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "horizontal flip",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0
-               },
-               .set = mt9m111_set_hflip,
-               .get = mt9m111_get_hflip
-       }, {
-               {
-                       .id             = V4L2_CID_GAIN,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "gain",
-                       .minimum        = 0,
-                       .maximum        = (INITIAL_MAX_GAIN - 1) * 2 * 2 * 2,
-                       .step           = 1,
-                       .default_value  = DEFAULT_GAIN,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = mt9m111_set_gain,
-               .get = mt9m111_get_gain
-       }
-       },
-
-       .nmodes = 1,
-       .modes = {
-       {
-               M5602_DEFAULT_FRAME_WIDTH,
-               M5602_DEFAULT_FRAME_HEIGHT,
-               V4L2_PIX_FMT_SBGGR8,
-               V4L2_FIELD_NONE,
-               .sizeimage =
-                       M5602_DEFAULT_FRAME_WIDTH * M5602_DEFAULT_FRAME_HEIGHT,
-               .bytesperline = M5602_DEFAULT_FRAME_WIDTH,
-               .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 1
-       }
-       }
+       .power_down = mt9m111_power_down
 };
 
 static const unsigned char preinit_mt9m111[][4] =
index c908a8d6970a2aad0c648bd02bcfd6241e4ef817..fc4548fd441dc1674d807628b0a68ad3bca8aca6 100644 (file)
@@ -65,14 +65,177 @@ static
                        DMI_MATCH(DMI_PRODUCT_NAME, "Aurora m9700")
                }
        },
-       { }
+       {}
+};
+
+const static struct ctrl ov9650_ctrls[] = {
+#define EXPOSURE_IDX 0
+       {
+               {
+                       .id             = V4L2_CID_EXPOSURE,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "exposure",
+                       .minimum        = 0x00,
+                       .maximum        = 0x1ff,
+                       .step           = 0x4,
+                       .default_value  = EXPOSURE_DEFAULT,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = ov9650_set_exposure,
+               .get = ov9650_get_exposure
+       },
+#define GAIN_IDX 1
+       {
+               {
+                       .id             = V4L2_CID_GAIN,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "gain",
+                       .minimum        = 0x00,
+                       .maximum        = 0x3ff,
+                       .step           = 0x1,
+                       .default_value  = GAIN_DEFAULT,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = ov9650_set_gain,
+               .get = ov9650_get_gain
+       },
+#define RED_BALANCE_IDX 2
+       {
+               {
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "red balance",
+                       .minimum        = 0x00,
+                       .maximum        = 0xff,
+                       .step           = 0x1,
+                       .default_value  = RED_GAIN_DEFAULT,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = ov9650_set_red_balance,
+               .get = ov9650_get_red_balance
+       },
+#define BLUE_BALANCE_IDX 3
+       {
+               {
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "blue balance",
+                       .minimum        = 0x00,
+                       .maximum        = 0xff,
+                       .step           = 0x1,
+                       .default_value  = BLUE_GAIN_DEFAULT,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = ov9650_set_blue_balance,
+               .get = ov9650_get_blue_balance
+       },
+#define HFLIP_IDX 4
+       {
+               {
+                       .id             = V4L2_CID_HFLIP,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "horizontal flip",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 0
+               },
+               .set = ov9650_set_hflip,
+               .get = ov9650_get_hflip
+       },
+#define VFLIP_IDX 5
+       {
+               {
+                       .id             = V4L2_CID_VFLIP,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "vertical flip",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 0
+               },
+               .set = ov9650_set_vflip,
+               .get = ov9650_get_vflip
+       },
+#define AUTO_WHITE_BALANCE_IDX 6
+       {
+               {
+                       .id             = V4L2_CID_AUTO_WHITE_BALANCE,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "auto white balance",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 1
+               },
+               .set = ov9650_set_auto_white_balance,
+               .get = ov9650_get_auto_white_balance
+       },
+#define AUTO_GAIN_CTRL_IDX 7
+       {
+               {
+                       .id             = V4L2_CID_AUTOGAIN,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "auto gain control",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 1
+               },
+               .set = ov9650_set_auto_gain,
+               .get = ov9650_get_auto_gain
+       }
+};
+
+static struct v4l2_pix_format ov9650_modes[] = {
+       {
+               176,
+               144,
+               V4L2_PIX_FMT_SBGGR8,
+               V4L2_FIELD_NONE,
+               .sizeimage =
+                       176 * 144,
+               .bytesperline = 176,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .priv = 9
+       }, {
+               320,
+               240,
+               V4L2_PIX_FMT_SBGGR8,
+               V4L2_FIELD_NONE,
+               .sizeimage =
+                       320 * 240,
+               .bytesperline = 320,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .priv = 8
+       }, {
+               352,
+               288,
+               V4L2_PIX_FMT_SBGGR8,
+               V4L2_FIELD_NONE,
+               .sizeimage =
+                       352 * 288,
+               .bytesperline = 352,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .priv = 9
+       }, {
+               640,
+               480,
+               V4L2_PIX_FMT_SBGGR8,
+               V4L2_FIELD_NONE,
+               .sizeimage =
+                       640 * 480,
+               .bytesperline = 640,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .priv = 9
+       }
 };
 
 static void ov9650_dump_registers(struct sd *sd);
 
 int ov9650_probe(struct sd *sd)
 {
+       int err = 0;
        u8 prod_id = 0, ver_id = 0, i;
+       s32 *sensor_settings;
 
        if (force_sensor) {
                if (force_sensor == OV9650_SENSOR) {
@@ -86,16 +249,20 @@ int ov9650_probe(struct sd *sd)
 
        info("Probing for an ov9650 sensor");
 
-       /* Run the pre-init to actually probe the unit */
-       for (i = 0; i < ARRAY_SIZE(preinit_ov9650); i++) {
+       /* Run the pre-init before probing the sensor */
+       for (i = 0; i < ARRAY_SIZE(preinit_ov9650) && !err; i++) {
                u8 data = preinit_ov9650[i][2];
                if (preinit_ov9650[i][0] == SENSOR)
-                       m5602_write_sensor(sd,
-                                           preinit_ov9650[i][1], &data, 1);
+                       err = m5602_write_sensor(sd,
+                               preinit_ov9650[i][1], &data, 1);
                else
-                       m5602_write_bridge(sd, preinit_ov9650[i][1], data);
+                       err = m5602_write_bridge(sd,
+                               preinit_ov9650[i][1], data);
        }
 
+       if (err < 0)
+               return err;
+
        if (m5602_read_sensor(sd, OV9650_PID, &prod_id, 1))
                return -ENODEV;
 
@@ -106,14 +273,28 @@ int ov9650_probe(struct sd *sd)
                info("Detected an ov9650 sensor");
                goto sensor_found;
        }
-
        return -ENODEV;
 
 sensor_found:
-       sd->gspca_dev.cam.cam_mode = ov9650.modes;
-       sd->gspca_dev.cam.nmodes = ov9650.nmodes;
-       sd->desc->ctrls = ov9650.ctrls;
-       sd->desc->nctrls = ov9650.nctrls;
+       sensor_settings = kmalloc(
+               ARRAY_SIZE(ov9650_ctrls) * sizeof(s32), GFP_KERNEL);
+       if (!sensor_settings)
+               return -ENOMEM;
+
+       sd->gspca_dev.cam.cam_mode = ov9650_modes;
+       sd->gspca_dev.cam.nmodes = ARRAY_SIZE(ov9650_modes);
+       sd->desc->ctrls = ov9650_ctrls;
+       sd->desc->nctrls = ARRAY_SIZE(ov9650_ctrls);
+
+       for (i = 0; i < ARRAY_SIZE(ov9650_ctrls); i++)
+               sensor_settings[i] = ov9650_ctrls[i].qctrl.default_value;
+       sd->sensor_priv = sensor_settings;
+
+       if (dmi_check_system(ov9650_flip_dmi_table) && !err) {
+               info("vflip quirk active");
+               sensor_settings[VFLIP_IDX] = 1;
+       }
+
        return 0;
 }
 
@@ -121,6 +302,7 @@ int ov9650_init(struct sd *sd)
 {
        int i, err = 0;
        u8 data;
+       s32 *sensor_settings = sd->sensor_priv;
 
        if (dump_sensor)
                ov9650_dump_registers(sd);
@@ -134,70 +316,157 @@ int ov9650_init(struct sd *sd)
                        err = m5602_write_bridge(sd, init_ov9650[i][1], data);
        }
 
-       if (dmi_check_system(ov9650_flip_dmi_table) && !err) {
-               info("vflip quirk active");
-               data = 0x30;
-               err = m5602_write_sensor(sd, OV9650_MVFP, &data, 1);
-       }
+       err = ov9650_set_exposure(&sd->gspca_dev, sensor_settings[EXPOSURE_IDX]);
+       if (err < 0)
+               return err;
+
+       err = ov9650_set_gain(&sd->gspca_dev, sensor_settings[GAIN_IDX]);
+       if (err < 0)
+               return err;
+
+       err = ov9650_set_red_balance(&sd->gspca_dev, sensor_settings[RED_BALANCE_IDX]);
+       if (err < 0)
+               return err;
+
+       err = ov9650_set_blue_balance(&sd->gspca_dev, sensor_settings[BLUE_BALANCE_IDX]);
+       if (err < 0)
+               return err;
+
+       err = ov9650_set_hflip(&sd->gspca_dev, sensor_settings[HFLIP_IDX]);
+       if (err < 0)
+               return err;
+
+       err = ov9650_set_vflip(&sd->gspca_dev, sensor_settings[VFLIP_IDX]);
+       if (err < 0)
+               return err;
+
+       err = ov9650_set_auto_white_balance(&sd->gspca_dev, sensor_settings[AUTO_WHITE_BALANCE_IDX]);
+       if (err < 0)
+               return err;
+
+       err = ov9650_set_auto_gain(&sd->gspca_dev, sensor_settings[AUTO_GAIN_CTRL_IDX]);
        return err;
 }
 
 int ov9650_start(struct sd *sd)
 {
+       u8 data;
        int i, err = 0;
        struct cam *cam = &sd->gspca_dev.cam;
+       s32 *sensor_settings = sd->sensor_priv;
+
+       int width = cam->cam_mode[sd->gspca_dev.curr_mode].width;
+       int height = cam->cam_mode[sd->gspca_dev.curr_mode].height;
+       int ver_offs = cam->cam_mode[sd->gspca_dev.curr_mode].priv;
+       int hor_offs = OV9650_LEFT_OFFSET;
+
+       if (sensor_settings[VFLIP_IDX])
+               ver_offs--;
 
+       if (width <= 320)
+               hor_offs /= 2;
+
+       /* Synthesize the vsync/hsync setup */
        for (i = 0; i < ARRAY_SIZE(res_init_ov9650) && !err; i++) {
-               u8 data = res_init_ov9650[i][1];
-               err = m5602_write_bridge(sd, res_init_ov9650[i][0], data);
+               if (res_init_ov9650[i][0] == BRIDGE)
+                       err = m5602_write_bridge(sd, res_init_ov9650[i][1],
+                               res_init_ov9650[i][2]);
+               else if (res_init_ov9650[i][0] == SENSOR) {
+                       u8 data = res_init_ov9650[i][2];
+                       err = m5602_write_sensor(sd,
+                               res_init_ov9650[i][1], &data, 1);
+               }
        }
        if (err < 0)
                return err;
 
-       switch (cam->cam_mode[sd->gspca_dev.curr_mode].width)
-       {
+       err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA,
+                                ((ver_offs >> 8) & 0xff));
+       if (err < 0)
+               return err;
+
+       err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (ver_offs & 0xff));
+       if (err < 0)
+               return err;
+
+       err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, 0);
+       if (err < 0)
+               return err;
+
+       err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (height >> 8) & 0xff);
+       if (err < 0)
+               return err;
+
+       err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (height & 0xff));
+       if (err < 0)
+               return err;
+
+       for (i = 0; i < 2 && !err; i++)
+               err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, 0);
+       if (err < 0)
+               return err;
+
+       err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA,
+                                (hor_offs >> 8) & 0xff);
+       if (err < 0)
+               return err;
+
+       err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, hor_offs & 0xff);
+       if (err < 0)
+               return err;
+
+       err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA,
+                                ((width + hor_offs) >> 8) & 0xff);
+       if (err < 0)
+               return err;
+
+       err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA,
+                                ((width + hor_offs) & 0xff));
+       if (err < 0)
+               return err;
+
+       switch (width) {
        case 640:
                PDEBUG(D_V4L2, "Configuring camera for VGA mode");
 
-               for (i = 0; i < ARRAY_SIZE(VGA_ov9650) && !err; i++) {
-                       u8 data = VGA_ov9650[i][2];
-                       if (VGA_ov9650[i][0] == SENSOR)
-                               err = m5602_write_sensor(sd,
-                                       VGA_ov9650[i][1], &data, 1);
-                       else
-                               err = m5602_write_bridge(sd, VGA_ov9650[i][1], data);
-               }
+               data = OV9650_VGA_SELECT | OV9650_RGB_SELECT |
+                      OV9650_RAW_RGB_SELECT;
+               err = m5602_write_sensor(sd, OV9650_COM7, &data, 1);
                break;
 
        case 352:
                PDEBUG(D_V4L2, "Configuring camera for CIF mode");
 
-               for (i = 0; i < ARRAY_SIZE(CIF_ov9650) && !err; i++) {
-                       u8 data = CIF_ov9650[i][2];
-                       if (CIF_ov9650[i][0] == SENSOR)
-                               err = m5602_write_sensor(sd,
-                                       CIF_ov9650[i][1], &data, 1);
-                       else
-                               err = m5602_write_bridge(sd, CIF_ov9650[i][1], data);
-               }
+               data = OV9650_CIF_SELECT | OV9650_RGB_SELECT |
+                               OV9650_RAW_RGB_SELECT;
+               err = m5602_write_sensor(sd, OV9650_COM7, &data, 1);
                break;
 
        case 320:
                PDEBUG(D_V4L2, "Configuring camera for QVGA mode");
 
-               for (i = 0; i < ARRAY_SIZE(QVGA_ov9650) && !err; i++) {
-                       u8 data = QVGA_ov9650[i][2];
-                       if (QVGA_ov9650[i][0] == SENSOR)
-                               err = m5602_write_sensor(sd,
-                                       QVGA_ov9650[i][1], &data, 1);
-                       else
-                               err = m5602_write_bridge(sd, QVGA_ov9650[i][1], data);
-               }
+               data = OV9650_QVGA_SELECT | OV9650_RGB_SELECT |
+                               OV9650_RAW_RGB_SELECT;
+               err = m5602_write_sensor(sd, OV9650_COM7, &data, 1);
+               break;
+
+       case 176:
+               PDEBUG(D_V4L2, "Configuring camera for QCIF mode");
+
+               data = OV9650_QCIF_SELECT | OV9650_RGB_SELECT |
+                       OV9650_RAW_RGB_SELECT;
+               err = m5602_write_sensor(sd, OV9650_COM7, &data, 1);
                break;
        }
        return err;
 }
 
+int ov9650_stop(struct sd *sd)
+{
+       u8 data = OV9650_SOFT_SLEEP | OV9650_OUTPUT_DRIVE_2X;
+       return m5602_write_sensor(sd, OV9650_COM2, &data, 1);
+}
+
 int ov9650_power_down(struct sd *sd)
 {
        int i, err = 0;
@@ -214,76 +483,63 @@ int ov9650_power_down(struct sd *sd)
        return err;
 }
 
-int ov9650_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
+void ov9650_disconnect(struct sd *sd)
 {
-       struct sd *sd = (struct sd *) gspca_dev;
-       u8 i2c_data;
-       int err;
-
-       err = m5602_read_sensor(sd, OV9650_COM1, &i2c_data, 1);
-       if (err < 0)
-               goto out;
-       *val = i2c_data & 0x03;
+       ov9650_stop(sd);
+       ov9650_power_down(sd);
 
-       err = m5602_read_sensor(sd, OV9650_AECH, &i2c_data, 1);
-       if (err < 0)
-               goto out;
-       *val |= (i2c_data << 2);
+       sd->sensor = NULL;
+       kfree(sd->sensor_priv);
+}
 
-       err = m5602_read_sensor(sd, OV9650_AECHM, &i2c_data, 1);
-       if (err < 0)
-               goto out;
-       *val |= (i2c_data & 0x3f) << 10;
+int ov9650_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
+       *val = sensor_settings[EXPOSURE_IDX];
        PDEBUG(D_V4L2, "Read exposure %d", *val);
-out:
-       return err;
+       return 0;
 }
 
 int ov9650_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
 {
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
        u8 i2c_data;
        int err;
 
-       PDEBUG(D_V4L2, "Set exposure to %d",
-              val & 0xffff);
+       PDEBUG(D_V4L2, "Set exposure to %d", val);
 
+       sensor_settings[EXPOSURE_IDX] = val;
        /* The 6 MSBs */
        i2c_data = (val >> 10) & 0x3f;
        err = m5602_write_sensor(sd, OV9650_AECHM,
                                  &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        /* The 8 middle bits */
        i2c_data = (val >> 2) & 0xff;
        err = m5602_write_sensor(sd, OV9650_AECH,
                                  &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        /* The 2 LSBs */
        i2c_data = val & 0x03;
        err = m5602_write_sensor(sd, OV9650_COM1, &i2c_data, 1);
-
-out:
        return err;
 }
 
 int ov9650_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
 {
-       int err;
-       u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       m5602_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
-       *val = (i2c_data & 0x03) << 8;
-
-       err = m5602_read_sensor(sd, OV9650_GAIN, &i2c_data, 1);
-       *val |= i2c_data;
+       *val = sensor_settings[GAIN_IDX];
        PDEBUG(D_V4L2, "Read gain %d", *val);
-       return err;
+       return 0;
 }
 
 int ov9650_set_gain(struct gspca_dev *gspca_dev, __s32 val)
@@ -291,15 +547,25 @@ int ov9650_set_gain(struct gspca_dev *gspca_dev, __s32 val)
        int err;
        u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
+
+       PDEBUG(D_V4L2, "Setting gain to %d", val);
+
+       sensor_settings[GAIN_IDX] = val;
 
        /* The 2 MSB */
        /* Read the OV9650_VREF register first to avoid
           corrupting the VREF high and low bits */
-       m5602_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
+       err = m5602_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
+       if (err < 0)
+               return err;
+
        /* Mask away all uninteresting bits */
        i2c_data = ((val & 0x0300) >> 2) |
                        (i2c_data & 0x3F);
        err = m5602_write_sensor(sd, OV9650_VREF, &i2c_data, 1);
+       if (err < 0)
+               return err;
 
        /* The 8 LSBs */
        i2c_data = val & 0xff;
@@ -309,16 +575,12 @@ int ov9650_set_gain(struct gspca_dev *gspca_dev, __s32 val)
 
 int ov9650_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val)
 {
-       int err;
-       u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       err = m5602_read_sensor(sd, OV9650_RED, &i2c_data, 1);
-       *val = i2c_data;
-
+       *val = sensor_settings[RED_BALANCE_IDX];
        PDEBUG(D_V4L2, "Read red gain %d", *val);
-
-       return err;
+       return 0;
 }
 
 int ov9650_set_red_balance(struct gspca_dev *gspca_dev, __s32 val)
@@ -326,28 +588,26 @@ int ov9650_set_red_balance(struct gspca_dev *gspca_dev, __s32 val)
        int err;
        u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       PDEBUG(D_V4L2, "Set red gain to %d",
-                            val & 0xff);
+       PDEBUG(D_V4L2, "Set red gain to %d", val);
+
+       sensor_settings[RED_BALANCE_IDX] = val;
 
        i2c_data = val & 0xff;
        err = m5602_write_sensor(sd, OV9650_RED, &i2c_data, 1);
-
        return err;
 }
 
 int ov9650_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val)
 {
-       int err;
-       u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       err = m5602_read_sensor(sd, OV9650_BLUE, &i2c_data, 1);
-       *val = i2c_data;
-
+       *val = sensor_settings[BLUE_BALANCE_IDX];
        PDEBUG(D_V4L2, "Read blue gain %d", *val);
 
-       return err;
+       return 0;
 }
 
 int ov9650_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val)
@@ -355,30 +615,25 @@ int ov9650_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val)
        int err;
        u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
+
+       PDEBUG(D_V4L2, "Set blue gain to %d", val);
 
-       PDEBUG(D_V4L2, "Set blue gain to %d",
-              val & 0xff);
+       sensor_settings[BLUE_BALANCE_IDX] = val;
 
        i2c_data = val & 0xff;
        err = m5602_write_sensor(sd, OV9650_BLUE, &i2c_data, 1);
-
        return err;
 }
 
 int ov9650_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
 {
-       int err;
-       u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       err = m5602_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
-       if (dmi_check_system(ov9650_flip_dmi_table))
-               *val = ((i2c_data & OV9650_HFLIP) >> 5) ? 0 : 1;
-       else
-               *val = (i2c_data & OV9650_HFLIP) >> 5;
+       *val = sensor_settings[HFLIP_IDX];
        PDEBUG(D_V4L2, "Read horizontal flip %d", *val);
-
-       return err;
+       return 0;
 }
 
 int ov9650_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
@@ -386,38 +641,26 @@ int ov9650_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
        int err;
        u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
        PDEBUG(D_V4L2, "Set horizontal flip to %d", val);
-       err = m5602_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
-       if (err < 0)
-               goto out;
-
-       if (dmi_check_system(ov9650_flip_dmi_table))
-               i2c_data = ((i2c_data & 0xdf) |
-                          (((val ? 0 : 1) & 0x01) << 5));
-       else
-               i2c_data = ((i2c_data & 0xdf) |
-                          ((val & 0x01) << 5));
 
+       sensor_settings[HFLIP_IDX] = val;
+       i2c_data = ((val & 0x01) << 5) | (sensor_settings[VFLIP_IDX] << 4);
        err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
-out:
+
        return err;
 }
 
 int ov9650_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
 {
-       int err;
-       u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       err = m5602_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
-       if (dmi_check_system(ov9650_flip_dmi_table))
-               *val = ((i2c_data & 0x10) >> 4) ? 0 : 1;
-       else
-               *val = (i2c_data & 0x10) >> 4;
+       *val = sensor_settings[VFLIP_IDX];
        PDEBUG(D_V4L2, "Read vertical flip %d", *val);
 
-       return err;
+       return 0;
 }
 
 int ov9650_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
@@ -425,40 +668,32 @@ int ov9650_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
        int err;
        u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
        PDEBUG(D_V4L2, "Set vertical flip to %d", val);
-       err = m5602_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
+       sensor_settings[VFLIP_IDX] = val;
+
+       i2c_data = ((val & 0x01) << 4) | (sensor_settings[VFLIP_IDX] << 5);
+       err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
-       if (dmi_check_system(ov9650_flip_dmi_table))
-               i2c_data = ((i2c_data & 0xef) |
-                               (((val ? 0 : 1) & 0x01) << 4));
-       else
-               i2c_data = ((i2c_data & 0xef) |
-                               ((val & 0x01) << 4));
+       /* When vflip is toggled we need to readjust the bridge hsync/vsync */
+       if (gspca_dev->streaming)
+               err = ov9650_start(sd);
 
-       err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
-out:
        return err;
 }
 
 int ov9650_get_brightness(struct gspca_dev *gspca_dev, __s32 *val)
 {
-       int err;
-       u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       err = m5602_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
-       if (err < 0)
-               goto out;
-       *val = (i2c_data & 0x03) << 8;
-
-       err = m5602_read_sensor(sd, OV9650_GAIN, &i2c_data, 1);
-       *val |= i2c_data;
+       *val = sensor_settings[GAIN_IDX];
        PDEBUG(D_V4L2, "Read gain %d", *val);
-out:
-       return err;
+
+       return 0;
 }
 
 int ov9650_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
@@ -466,40 +701,38 @@ int ov9650_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
        int err;
        u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       PDEBUG(D_V4L2, "Set gain to %d", val & 0x3ff);
+       PDEBUG(D_V4L2, "Set gain to %d", val);
+
+       sensor_settings[GAIN_IDX] = val;
 
        /* Read the OV9650_VREF register first to avoid
                corrupting the VREF high and low bits */
        err = m5602_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        /* Mask away all uninteresting bits */
        i2c_data = ((val & 0x0300) >> 2) | (i2c_data & 0x3F);
        err = m5602_write_sensor(sd, OV9650_VREF, &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        /* The 8 LSBs */
        i2c_data = val & 0xff;
        err = m5602_write_sensor(sd, OV9650_GAIN, &i2c_data, 1);
 
-out:
        return err;
 }
 
 int ov9650_get_auto_white_balance(struct gspca_dev *gspca_dev, __s32 *val)
 {
-       int err;
-       u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       err = m5602_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
-       *val = (i2c_data & OV9650_AWB_EN) >> 1;
-       PDEBUG(D_V4L2, "Read auto white balance %d", *val);
-
-       return err;
+       *val = sensor_settings[AUTO_WHITE_BALANCE_IDX];
+       return 0;
 }
 
 int ov9650_set_auto_white_balance(struct gspca_dev *gspca_dev, __s32 val)
@@ -507,29 +740,29 @@ int ov9650_set_auto_white_balance(struct gspca_dev *gspca_dev, __s32 val)
        int err;
        u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
        PDEBUG(D_V4L2, "Set auto white balance to %d", val);
+
+       sensor_settings[AUTO_WHITE_BALANCE_IDX] = val;
        err = m5602_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        i2c_data = ((i2c_data & 0xfd) | ((val & 0x01) << 1));
        err = m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1);
-out:
+
        return err;
 }
 
 int ov9650_get_auto_gain(struct gspca_dev *gspca_dev, __s32 *val)
 {
-       int err;
-       u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
-       err = m5602_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
-       *val = (i2c_data & OV9650_AGC_EN) >> 2;
+       *val = sensor_settings[AUTO_GAIN_CTRL_IDX];
        PDEBUG(D_V4L2, "Read auto gain control %d", *val);
-
-       return err;
+       return 0;
 }
 
 int ov9650_set_auto_gain(struct gspca_dev *gspca_dev, __s32 val)
@@ -537,15 +770,18 @@ int ov9650_set_auto_gain(struct gspca_dev *gspca_dev, __s32 val)
        int err;
        u8 i2c_data;
        struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
 
        PDEBUG(D_V4L2, "Set auto gain control to %d", val);
+
+       sensor_settings[AUTO_GAIN_CTRL_IDX] = val;
        err = m5602_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        i2c_data = ((i2c_data & 0xfb) | ((val & 0x01) << 2));
        err = m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1);
-out:
+
        return err;
 }
 
index f4b33b8e8daebe08a62fb67d8b151f4cdfd76f98..fcc54e4c0f4f33d8e764f85960a4d93fa9229b65 100644 (file)
@@ -32,6 +32,7 @@
 #define OV9650_BAVE                    0x05
 #define OV9650_GEAVE                   0x06
 #define OV9650_RSVD7                   0x07
+#define OV9650_COM2                    0x09
 #define OV9650_PID                     0x0a
 #define OV9650_VER                     0x0b
 #define OV9650_COM3                    0x0c
@@ -96,6 +97,7 @@
 #define OV9650_VGA_SELECT              (1 << 6)
 #define OV9650_CIF_SELECT              (1 << 5)
 #define OV9650_QVGA_SELECT             (1 << 4)
+#define OV9650_QCIF_SELECT             (1 << 3)
 #define OV9650_RGB_SELECT              (1 << 2)
 #define OV9650_RAW_RGB_SELECT          (1 << 0)
 
 #define OV9650_VFLIP                   (1 << 4)
 #define OV9650_HFLIP                   (1 << 5)
 
+#define OV9650_SOFT_SLEEP              (1 << 4)
+#define OV9650_OUTPUT_DRIVE_2X         (1 << 0)
+
+#define OV9650_LEFT_OFFSET             0x62
+
 #define GAIN_DEFAULT                   0x14
 #define RED_GAIN_DEFAULT               0x70
 #define BLUE_GAIN_DEFAULT              0x20
-#define EXPOSURE_DEFAULT               0x5003
+#define EXPOSURE_DEFAULT               0x1ff
 
 /*****************************************************************************/
 
@@ -129,7 +136,9 @@ extern int dump_sensor;
 int ov9650_probe(struct sd *sd);
 int ov9650_init(struct sd *sd);
 int ov9650_start(struct sd *sd);
+int ov9650_stop(struct sd *sd);
 int ov9650_power_down(struct sd *sd);
+void ov9650_disconnect(struct sd *sd);
 
 int ov9650_set_exposure(struct gspca_dev *gspca_dev, __s32 val);
 int ov9650_get_exposure(struct gspca_dev *gspca_dev, __s32 *val);
@@ -150,152 +159,16 @@ int ov9650_set_auto_white_balance(struct gspca_dev *gspca_dev, __s32 val);
 int ov9650_get_auto_gain(struct gspca_dev *gspca_dev, __s32 *val);
 int ov9650_set_auto_gain(struct gspca_dev *gspca_dev, __s32 val);
 
-static struct m5602_sensor ov9650 = {
+const static struct m5602_sensor ov9650 = {
        .name = "OV9650",
        .i2c_slave_id = 0x60,
        .i2c_regW = 1,
        .probe = ov9650_probe,
        .init = ov9650_init,
        .start = ov9650_start,
+       .stop = ov9650_stop,
        .power_down = ov9650_power_down,
-
-       .nctrls = 8,
-       .ctrls = {
-       {
-               {
-                       .id             = V4L2_CID_EXPOSURE,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "exposure",
-                       .minimum        = 0x00,
-                       .maximum        = 0xffff,
-                       .step           = 0x1,
-                       .default_value  = EXPOSURE_DEFAULT,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = ov9650_set_exposure,
-               .get = ov9650_get_exposure
-       }, {
-               {
-                       .id             = V4L2_CID_GAIN,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "gain",
-                       .minimum        = 0x00,
-                       .maximum        = 0x3ff,
-                       .step           = 0x1,
-                       .default_value  = GAIN_DEFAULT,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = ov9650_set_gain,
-               .get = ov9650_get_gain
-       }, {
-               {
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "red balance",
-                       .minimum        = 0x00,
-                       .maximum        = 0xff,
-                       .step           = 0x1,
-                       .default_value  = RED_GAIN_DEFAULT,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = ov9650_set_red_balance,
-               .get = ov9650_get_red_balance
-       }, {
-               {
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "blue balance",
-                       .minimum        = 0x00,
-                       .maximum        = 0xff,
-                       .step           = 0x1,
-                       .default_value  = BLUE_GAIN_DEFAULT,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = ov9650_set_blue_balance,
-               .get = ov9650_get_blue_balance
-       }, {
-               {
-                       .id             = V4L2_CID_HFLIP,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "horizontal flip",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0
-               },
-               .set = ov9650_set_hflip,
-               .get = ov9650_get_hflip
-       }, {
-               {
-                       .id             = V4L2_CID_VFLIP,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "vertical flip",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0
-               },
-               .set = ov9650_set_vflip,
-               .get = ov9650_get_vflip
-       }, {
-               {
-                       .id             = V4L2_CID_AUTO_WHITE_BALANCE,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "auto white balance",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0
-               },
-               .set = ov9650_set_auto_white_balance,
-               .get = ov9650_get_auto_white_balance
-       }, {
-               {
-                       .id             = V4L2_CID_AUTOGAIN,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "auto gain control",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0
-               },
-               .set = ov9650_set_auto_gain,
-               .get = ov9650_get_auto_gain
-       }
-       },
-
-       .nmodes = 3,
-       .modes = {
-       {
-               320,
-               240,
-               V4L2_PIX_FMT_SBGGR8,
-               V4L2_FIELD_NONE,
-               .sizeimage =
-                       320 * 240,
-               .bytesperline = 320,
-               .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 0
-       }, {
-               352,
-               288,
-               V4L2_PIX_FMT_SBGGR8,
-               V4L2_FIELD_NONE,
-               .sizeimage =
-                       352 * 288,
-               .bytesperline = 352,
-               .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 0
-       }, {
-               640,
-               480,
-               V4L2_PIX_FMT_SBGGR8,
-               V4L2_FIELD_NONE,
-               .sizeimage =
-                       640 * 480,
-               .bytesperline = 640,
-               .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 0
-       }
-       }
+       .disconnect = ov9650_disconnect,
 };
 
 static const unsigned char preinit_ov9650[][3] =
@@ -345,6 +218,10 @@ static const unsigned char init_ov9650[][3] =
 
        /* Reset chip */
        {SENSOR, OV9650_COM7, OV9650_REGISTER_RESET},
+       /* One extra reset is needed in order to make the sensor behave
+          properly when resuming from ram */
+       {SENSOR, OV9650_COM7, OV9650_REGISTER_RESET},
+
        /* Enable double clock */
        {SENSOR, OV9650_CLKRC, 0x80},
        /* Do something out of spec with the power */
@@ -427,18 +304,12 @@ static const unsigned char init_ov9650[][3] =
        /* Enable denoise, and white-pixel erase */
        {SENSOR, OV9650_COM22, 0x23},
 
-       /* Set the high bits of the exposure value */
-       {SENSOR, OV9650_AECH, ((EXPOSURE_DEFAULT & 0xff00) >> 8)},
-
        /* Enable VARIOPIXEL */
        {SENSOR, OV9650_COM3, OV9650_VARIOPIXEL},
        {SENSOR, OV9650_COM4, OV9650_QVGA_VARIOPIXEL},
 
-       /* Set the low bits of the exposure value */
-       {SENSOR, OV9650_COM1, (EXPOSURE_DEFAULT & 0xff)},
-       {SENSOR, OV9650_GAIN, GAIN_DEFAULT},
-       {SENSOR, OV9650_BLUE, BLUE_GAIN_DEFAULT},
-       {SENSOR, OV9650_RED, RED_GAIN_DEFAULT},
+       /* Put the sensor in soft sleep mode */
+       {SENSOR, OV9650_COM2, OV9650_SOFT_SLEEP | OV9650_OUTPUT_DRIVE_2X},
 };
 
 static const unsigned char power_down_ov9650[][3] =
@@ -461,73 +332,15 @@ static const unsigned char power_down_ov9650[][3] =
        {BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0},
 };
 
-static const unsigned char res_init_ov9650[][2] =
-{
-       {M5602_XB_LINE_OF_FRAME_H, 0x82},
-       {M5602_XB_LINE_OF_FRAME_L, 0x00},
-       {M5602_XB_PIX_OF_LINE_H, 0x82},
-       {M5602_XB_PIX_OF_LINE_L, 0x00},
-       {M5602_XB_SIG_INI, 0x01}
-};
-
-static const unsigned char VGA_ov9650[][3] =
+static const unsigned char res_init_ov9650[][3] =
 {
-       /* Moves the view window in a vertical orientation */
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x09},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x01},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0xe0}, /* 480 */
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x62}, /* 98 */
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x02}, /* 640 + 98 */
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0xe2},
-
-       {SENSOR, OV9650_COM7, OV9650_VGA_SELECT |
-                             OV9650_RGB_SELECT |
-                             OV9650_RAW_RGB_SELECT},
-};
+       {SENSOR, OV9650_COM2, OV9650_OUTPUT_DRIVE_2X},
 
-static const unsigned char CIF_ov9650[][3] =
-{
-       /* Moves the view window in a vertical orientation */
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x09},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x01},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x20}, /* 288 */
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x62}, /* 98 */
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x01}, /* 352 + 98 */
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0xc2},
-
-       {SENSOR, OV9650_COM7, OV9650_CIF_SELECT |
-                             OV9650_RGB_SELECT |
-                             OV9650_RAW_RGB_SELECT},
-};
-
-static const unsigned char QVGA_ov9650[][3] =
-{
-       /* Moves the view window in a vertical orientation */
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x08},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0xf0}, /* 240 */
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x00},
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x31}, /* 50 */
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x01}, /* 320 + 50 */
-       {BRIDGE, M5602_XB_HSYNC_PARA, 0x71},
-
-       {SENSOR, OV9650_COM7, OV9650_QVGA_SELECT |
-                             OV9650_RGB_SELECT |
-                             OV9650_RAW_RGB_SELECT},
+       {BRIDGE, M5602_XB_LINE_OF_FRAME_H, 0x82},
+       {BRIDGE, M5602_XB_LINE_OF_FRAME_L, 0x00},
+       {BRIDGE, M5602_XB_PIX_OF_LINE_H, 0x82},
+       {BRIDGE, M5602_XB_PIX_OF_LINE_L, 0x00},
+       {BRIDGE, M5602_XB_SIG_INI, 0x01}
 };
 
 #endif
index 2e7fb91673cfe175392fb15cc117f214beea730c..eaddf488bad1033d1bd7ed8f3f5190317919f925 100644 (file)
 
 #include "m5602_po1030.h"
 
+static struct v4l2_pix_format po1030_modes[] = {
+       {
+               640,
+               480,
+               V4L2_PIX_FMT_SBGGR8,
+               V4L2_FIELD_NONE,
+               .sizeimage = 640 * 480,
+               .bytesperline = 640,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .priv = 0
+       }
+};
+
+const static struct ctrl po1030_ctrls[] = {
+       {
+               {
+                       .id             = V4L2_CID_GAIN,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "gain",
+                       .minimum        = 0x00,
+                       .maximum        = 0x4f,
+                       .step           = 0x1,
+                       .default_value  = PO1030_GLOBAL_GAIN_DEFAULT,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = po1030_set_gain,
+               .get = po1030_get_gain
+       }, {
+               {
+                       .id             = V4L2_CID_EXPOSURE,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "exposure",
+                       .minimum        = 0x00,
+                       .maximum        = 0x02ff,
+                       .step           = 0x1,
+                       .default_value  = PO1030_EXPOSURE_DEFAULT,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = po1030_set_exposure,
+               .get = po1030_get_exposure
+       }, {
+               {
+                       .id             = V4L2_CID_RED_BALANCE,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "red balance",
+                       .minimum        = 0x00,
+                       .maximum        = 0xff,
+                       .step           = 0x1,
+                       .default_value  = PO1030_RED_GAIN_DEFAULT,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = po1030_set_red_balance,
+               .get = po1030_get_red_balance
+       }, {
+               {
+                       .id             = V4L2_CID_BLUE_BALANCE,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "blue balance",
+                       .minimum        = 0x00,
+                       .maximum        = 0xff,
+                       .step           = 0x1,
+                       .default_value  = PO1030_BLUE_GAIN_DEFAULT,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = po1030_set_blue_balance,
+               .get = po1030_get_blue_balance
+       }, {
+               {
+                       .id             = V4L2_CID_HFLIP,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "horizontal flip",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 0,
+               },
+               .set = po1030_set_hflip,
+               .get = po1030_get_hflip
+       }, {
+               {
+                       .id             = V4L2_CID_VFLIP,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "vertical flip",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 0,
+               },
+               .set = po1030_set_vflip,
+               .get = po1030_get_vflip
+       }
+};
+
 static void po1030_dump_registers(struct sd *sd);
 
 int po1030_probe(struct sd *sd)
@@ -59,10 +152,10 @@ int po1030_probe(struct sd *sd)
        return -ENODEV;
 
 sensor_found:
-       sd->gspca_dev.cam.cam_mode = po1030.modes;
-       sd->gspca_dev.cam.nmodes = po1030.nmodes;
-       sd->desc->ctrls = po1030.ctrls;
-       sd->desc->nctrls = po1030.nctrls;
+       sd->gspca_dev.cam.cam_mode = po1030_modes;
+       sd->gspca_dev.cam.nmodes = ARRAY_SIZE(po1030_modes);
+       sd->desc->ctrls = po1030_ctrls;
+       sd->desc->nctrls = ARRAY_SIZE(po1030_ctrls);
        return 0;
 }
 
@@ -108,7 +201,7 @@ int po1030_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
        err = m5602_read_sensor(sd, PO1030_REG_INTEGLINES_H,
                                 &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
        *val = (i2c_data << 8);
 
        err = m5602_read_sensor(sd, PO1030_REG_INTEGLINES_M,
@@ -116,7 +209,7 @@ int po1030_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
        *val |= i2c_data;
 
        PDEBUG(D_V4L2, "Exposure read as %d", *val);
-out:
+
        return err;
 }
 
@@ -135,7 +228,7 @@ int po1030_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
        err = m5602_write_sensor(sd, PO1030_REG_INTEGLINES_H,
                                  &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        i2c_data = (val & 0xff);
        PDEBUG(D_V4L2, "Set exposure to low byte to 0x%x",
@@ -143,7 +236,6 @@ int po1030_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
        err = m5602_write_sensor(sd, PO1030_REG_INTEGLINES_M,
                                  &i2c_data, 1);
 
-out:
        return err;
 }
 
@@ -186,14 +278,13 @@ int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
        PDEBUG(D_V4L2, "Set hflip %d", val);
        err = m5602_read_sensor(sd, PO1030_REG_CONTROL2, &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        i2c_data = (0x7f & i2c_data) | ((val & 0x01) << 7);
 
        err = m5602_write_sensor(sd, PO1030_REG_CONTROL2,
                                 &i2c_data, 1);
 
-out:
        return err;
 }
 
@@ -222,14 +313,13 @@ int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
        PDEBUG(D_V4L2, "Set vflip %d", val);
        err = m5602_read_sensor(sd, PO1030_REG_CONTROL2, &i2c_data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        i2c_data = (i2c_data & 0xbf) | ((val & 0x01) << 6);
 
        err = m5602_write_sensor(sd, PO1030_REG_CONTROL2,
                                 &i2c_data, 1);
 
-out:
        return err;
 }
 
index def39d5bcec6a4985bce5921610073a9c3572ca4..c10b12335818f1dc65fe53eda77545dda403f692 100644 (file)
@@ -141,7 +141,7 @@ int po1030_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
 int po1030_get_vflip(struct gspca_dev *gspca_dev, __s32 *val);
 int po1030_set_vflip(struct gspca_dev *gspca_dev, __s32 val);
 
-static struct m5602_sensor po1030 = {
+static const struct m5602_sensor po1030 = {
        .name = "PO1030",
 
        .i2c_slave_id = 0xdc,
@@ -150,102 +150,6 @@ static struct m5602_sensor po1030 = {
        .probe = po1030_probe,
        .init = po1030_init,
        .power_down = po1030_power_down,
-
-       .nctrls = 6,
-       .ctrls = {
-       {
-               {
-                       .id             = V4L2_CID_GAIN,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "gain",
-                       .minimum        = 0x00,
-                       .maximum        = 0x4f,
-                       .step           = 0x1,
-                       .default_value  = PO1030_GLOBAL_GAIN_DEFAULT,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = po1030_set_gain,
-               .get = po1030_get_gain
-       }, {
-               {
-                       .id             = V4L2_CID_EXPOSURE,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "exposure",
-                       .minimum        = 0x00,
-                       .maximum        = 0x02ff,
-                       .step           = 0x1,
-                       .default_value  = PO1030_EXPOSURE_DEFAULT,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = po1030_set_exposure,
-               .get = po1030_get_exposure
-       }, {
-               {
-                       .id             = V4L2_CID_RED_BALANCE,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "red balance",
-                       .minimum        = 0x00,
-                       .maximum        = 0xff,
-                       .step           = 0x1,
-                       .default_value  = PO1030_RED_GAIN_DEFAULT,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = po1030_set_red_balance,
-               .get = po1030_get_red_balance
-       }, {
-               {
-                       .id             = V4L2_CID_BLUE_BALANCE,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "blue balance",
-                       .minimum        = 0x00,
-                       .maximum        = 0xff,
-                       .step           = 0x1,
-                       .default_value  = PO1030_BLUE_GAIN_DEFAULT,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = po1030_set_blue_balance,
-               .get = po1030_get_blue_balance
-       }, {
-               {
-                       .id             = V4L2_CID_HFLIP,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "horizontal flip",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0,
-               },
-               .set = po1030_set_hflip,
-               .get = po1030_get_hflip
-       }, {
-               {
-                       .id             = V4L2_CID_VFLIP,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "vertical flip",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0,
-               },
-               .set = po1030_set_vflip,
-               .get = po1030_get_vflip
-       }
-       },
-
-       .nmodes = 1,
-       .modes = {
-       {
-               M5602_DEFAULT_FRAME_WIDTH,
-               M5602_DEFAULT_FRAME_HEIGHT,
-               V4L2_PIX_FMT_SBGGR8,
-               V4L2_FIELD_NONE,
-               .sizeimage =
-                       M5602_DEFAULT_FRAME_WIDTH * M5602_DEFAULT_FRAME_HEIGHT,
-               .bytesperline = M5602_DEFAULT_FRAME_WIDTH,
-               .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 1
-       }
-       }
 };
 
 static const unsigned char preinit_po1030[][3] =
index 48892b5715d5e7cc94014f0346688cc473e270f1..4306d596056db72a66587a8da4ad25a22b35d46a 100644 (file)
@@ -50,6 +50,76 @@ static
        { }
 };
 
+static struct v4l2_pix_format s5k4aa_modes[] = {
+       {
+               640,
+               480,
+               V4L2_PIX_FMT_SBGGR8,
+               V4L2_FIELD_NONE,
+               .sizeimage =
+                       640 * 480,
+               .bytesperline = 640,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .priv = 0
+       }
+};
+
+const static struct ctrl s5k4aa_ctrls[] = {
+       {
+               {
+                       .id             = V4L2_CID_VFLIP,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "vertical flip",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 0
+               },
+               .set = s5k4aa_set_vflip,
+               .get = s5k4aa_get_vflip
+
+       }, {
+               {
+                       .id             = V4L2_CID_HFLIP,
+                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name           = "horizontal flip",
+                       .minimum        = 0,
+                       .maximum        = 1,
+                       .step           = 1,
+                       .default_value  = 0
+               },
+               .set = s5k4aa_set_hflip,
+               .get = s5k4aa_get_hflip
+
+       }, {
+               {
+                       .id             = V4L2_CID_GAIN,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "Gain",
+                       .minimum        = 0,
+                       .maximum        = 127,
+                       .step           = 1,
+                       .default_value  = 0xa0,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = s5k4aa_set_gain,
+               .get = s5k4aa_get_gain
+       }, {
+               {
+                       .id             = V4L2_CID_EXPOSURE,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "Exposure",
+                       .minimum        = 13,
+                       .maximum        = 0xfff,
+                       .step           = 1,
+                       .default_value  = 0x100,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = s5k4aa_set_exposure,
+               .get = s5k4aa_get_exposure
+       }
+};
+
 static void s5k4aa_dump_registers(struct sd *sd);
 
 int s5k4aa_probe(struct sd *sd)
@@ -115,14 +185,56 @@ int s5k4aa_probe(struct sd *sd)
                info("Detected a s5k4aa sensor");
 
 sensor_found:
-       sd->gspca_dev.cam.cam_mode = s5k4aa.modes;
-       sd->gspca_dev.cam.nmodes = s5k4aa.nmodes;
-       sd->desc->ctrls = s5k4aa.ctrls;
-       sd->desc->nctrls = s5k4aa.nctrls;
-
+       sd->gspca_dev.cam.cam_mode = s5k4aa_modes;
+       sd->gspca_dev.cam.nmodes = ARRAY_SIZE(s5k4aa_modes);
+       sd->desc->ctrls = s5k4aa_ctrls;
+       sd->desc->nctrls = ARRAY_SIZE(s5k4aa_ctrls);
        return 0;
 }
 
+int s5k4aa_start(struct sd *sd)
+{
+       int i, err = 0;
+       u8 data[2];
+       struct cam *cam = &sd->gspca_dev.cam;
+
+       switch (cam->cam_mode[sd->gspca_dev.curr_mode].width)
+       {
+       case 640:
+               PDEBUG(D_V4L2, "Configuring camera for VGA mode");
+
+               for (i = 0; i < ARRAY_SIZE(VGA_s5k4aa); i++) {
+                       switch (VGA_s5k4aa[i][0]) {
+                       case BRIDGE:
+                               err = m5602_write_bridge(sd,
+                                                VGA_s5k4aa[i][1],
+                                                VGA_s5k4aa[i][2]);
+                       break;
+
+                       case SENSOR:
+                               data[0] = VGA_s5k4aa[i][2];
+                               err = m5602_write_sensor(sd,
+                                                VGA_s5k4aa[i][1],
+                                                data, 1);
+                       break;
+
+                       case SENSOR_LONG:
+                               data[0] = VGA_s5k4aa[i][2];
+                               data[1] = VGA_s5k4aa[i][3];
+                               err = m5602_write_sensor(sd,
+                                                 VGA_s5k4aa[i][1],
+                                                 data, 2);
+                       break;
+
+                       default:
+                               err("Invalid stream command, exiting init");
+                               return -EINVAL;
+                       }
+               }
+       }
+       return err;
+}
+
 int s5k4aa_init(struct sd *sd)
 {
        int i, err = 0;
@@ -194,17 +306,17 @@ int s5k4aa_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
 
        err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, S5K4AA_EXPOSURE_HI, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        *val = data << 8;
        err = m5602_read_sensor(sd, S5K4AA_EXPOSURE_LO, &data, 1);
        *val |= data;
        PDEBUG(D_V4L2, "Read exposure %d", *val);
-out:
+
        return err;
 }
 
@@ -217,14 +329,14 @@ int s5k4aa_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
        PDEBUG(D_V4L2, "Set exposure to %d", val);
        err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
        data = (val >> 8) & 0xff;
        err = m5602_write_sensor(sd, S5K4AA_EXPOSURE_HI, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
        data = val & 0xff;
        err = m5602_write_sensor(sd, S5K4AA_EXPOSURE_LO, &data, 1);
-out:
+
        return err;
 }
 
@@ -236,13 +348,12 @@ int s5k4aa_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
 
        err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        *val = (data & S5K4AA_RM_V_FLIP) >> 7;
        PDEBUG(D_V4L2, "Read vertical flip %d", *val);
 
-out:
        return err;
 }
 
@@ -255,32 +366,32 @@ int s5k4aa_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
        PDEBUG(D_V4L2, "Set vertical flip to %d", val);
        err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
        err = m5602_write_sensor(sd, S5K4AA_READ_MODE, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
        data = ((data & ~S5K4AA_RM_V_FLIP)
                        | ((val & 0x01) << 7));
        err = m5602_write_sensor(sd, S5K4AA_READ_MODE, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        if (val) {
                err = m5602_read_sensor(sd, S5K4AA_ROWSTART_LO, &data, 1);
                if (err < 0)
-                       goto out;
+                       return err;
 
                data++;
                err = m5602_write_sensor(sd, S5K4AA_ROWSTART_LO, &data, 1);
        } else {
                err = m5602_read_sensor(sd, S5K4AA_ROWSTART_LO, &data, 1);
                if (err < 0)
-                       goto out;
+                       return err;
 
                data--;
                err = m5602_write_sensor(sd, S5K4AA_ROWSTART_LO, &data, 1);
        }
-out:
+
        return err;
 }
 
@@ -292,12 +403,12 @@ int s5k4aa_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
 
        err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        *val = (data & S5K4AA_RM_H_FLIP) >> 6;
        PDEBUG(D_V4L2, "Read horizontal flip %d", *val);
-out:
+
        return err;
 }
 
@@ -311,32 +422,32 @@ int s5k4aa_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
               val);
        err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
        err = m5602_write_sensor(sd, S5K4AA_READ_MODE, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        data = ((data & ~S5K4AA_RM_H_FLIP) | ((val & 0x01) << 6));
        err = m5602_write_sensor(sd, S5K4AA_READ_MODE, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        if (val) {
                err = m5602_read_sensor(sd, S5K4AA_COLSTART_LO, &data, 1);
                if (err < 0)
-                       goto out;
+                       return err;
                data++;
                err = m5602_write_sensor(sd, S5K4AA_COLSTART_LO, &data, 1);
                if (err < 0)
-                       goto out;
+                       return err;
        } else {
                err = m5602_read_sensor(sd, S5K4AA_COLSTART_LO, &data, 1);
                if (err < 0)
-                       goto out;
+                       return err;
                data--;
                err = m5602_write_sensor(sd, S5K4AA_COLSTART_LO, &data, 1);
        }
-out:
+
        return err;
 }
 
@@ -348,13 +459,12 @@ int s5k4aa_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
 
        err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, S5K4AA_GAIN_2, &data, 1);
        *val = data;
        PDEBUG(D_V4L2, "Read gain %d", *val);
 
-out:
        return err;
 }
 
@@ -367,12 +477,11 @@ int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val)
        PDEBUG(D_V4L2, "Set gain to %d", val);
        err = m5602_write_sensor(sd, S5K4AA_PAGE_MAP, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        data = val & 0xff;
        err = m5602_write_sensor(sd, S5K4AA_GAIN_2, &data, 1);
 
-out:
        return err;
 }
 
index 1f88b0d040c4649eea1f14cae040f6930da9cf4d..ca854d4f9475e94ddce7ea164870133632db8792 100644 (file)
@@ -65,6 +65,7 @@ extern int dump_sensor;
 
 int s5k4aa_probe(struct sd *sd);
 int s5k4aa_init(struct sd *sd);
+int s5k4aa_start(struct sd *sd);
 int s5k4aa_power_down(struct sd *sd);
 
 int s5k4aa_get_exposure(struct gspca_dev *gspca_dev, __s32 *val);
@@ -76,84 +77,14 @@ int s5k4aa_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
 int s5k4aa_get_gain(struct gspca_dev *gspca_dev, __s32 *val);
 int s5k4aa_set_gain(struct gspca_dev *gspca_dev, __s32 val);
 
-static struct m5602_sensor s5k4aa = {
+static const struct m5602_sensor s5k4aa = {
        .name = "S5K4AA",
        .probe = s5k4aa_probe,
        .init = s5k4aa_init,
+       .start = s5k4aa_start,
        .power_down = s5k4aa_power_down,
        .i2c_slave_id = 0x5a,
        .i2c_regW = 2,
-       .nctrls = 4,
-       .ctrls = {
-       {
-               {
-                       .id             = V4L2_CID_VFLIP,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "vertical flip",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0
-               },
-               .set = s5k4aa_set_vflip,
-               .get = s5k4aa_get_vflip
-
-       }, {
-               {
-                       .id             = V4L2_CID_HFLIP,
-                       .type           = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name           = "horizontal flip",
-                       .minimum        = 0,
-                       .maximum        = 1,
-                       .step           = 1,
-                       .default_value  = 0
-               },
-               .set = s5k4aa_set_hflip,
-               .get = s5k4aa_get_hflip
-
-       }, {
-               {
-                       .id             = V4L2_CID_GAIN,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "Gain",
-                       .minimum        = 0,
-                       .maximum        = 127,
-                       .step           = 1,
-                       .default_value  = 0xa0,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = s5k4aa_set_gain,
-               .get = s5k4aa_get_gain
-       }, {
-               {
-                       .id             = V4L2_CID_EXPOSURE,
-                       .type           = V4L2_CTRL_TYPE_INTEGER,
-                       .name           = "Exposure",
-                       .minimum        = 13,
-                       .maximum        = 0xfff,
-                       .step           = 1,
-                       .default_value  = 0x100,
-                       .flags          = V4L2_CTRL_FLAG_SLIDER
-               },
-               .set = s5k4aa_set_exposure,
-               .get = s5k4aa_get_exposure
-       }
-       },
-
-       .nmodes = 1,
-       .modes = {
-       {
-               M5602_DEFAULT_FRAME_WIDTH,
-               M5602_DEFAULT_FRAME_HEIGHT,
-               V4L2_PIX_FMT_SBGGR8,
-               V4L2_FIELD_NONE,
-               .sizeimage =
-                       M5602_DEFAULT_FRAME_WIDTH * M5602_DEFAULT_FRAME_HEIGHT,
-               .bytesperline = M5602_DEFAULT_FRAME_WIDTH,
-               .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 1
-       }
-       }
 };
 
 static const unsigned char preinit_s5k4aa[][4] =
@@ -329,4 +260,63 @@ static const unsigned char init_s5k4aa[][4] =
        {SENSOR, S5K4AA_GAIN_2, 0xa0, 0x00}
 };
 
+static const unsigned char VGA_s5k4aa[][4] =
+{
+       {BRIDGE, M5602_XB_SEN_CLK_DIV, 0x06, 0x00},
+       {BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0, 0x00},
+       {BRIDGE, M5602_XB_ADC_CTRL, 0xc0, 0x00},
+       {BRIDGE, M5602_XB_SENSOR_TYPE, 0x08, 0x00},
+       {BRIDGE, M5602_XB_LINE_OF_FRAME_H, 0x81, 0x00},
+       {BRIDGE, M5602_XB_PIX_OF_LINE_H, 0x82, 0x00},
+       {BRIDGE, M5602_XB_SIG_INI, 0x01, 0x00},
+       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
+       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
+       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
+       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
+       /* VSYNC_PARA, VSYNC_PARA : img height 480 = 0x01e0 */
+       {BRIDGE, M5602_XB_VSYNC_PARA, 0x01, 0x00},
+       {BRIDGE, M5602_XB_VSYNC_PARA, 0xe0, 0x00},
+       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
+       {BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
+       {BRIDGE, M5602_XB_SIG_INI, 0x00, 0x00},
+       {BRIDGE, M5602_XB_SIG_INI, 0x02, 0x00},
+       {BRIDGE, M5602_XB_HSYNC_PARA, 0x00, 0x00},
+       {BRIDGE, M5602_XB_HSYNC_PARA, 0x00, 0x00},
+       /* HSYNC_PARA, HSYNC_PARA : img width 640 = 0x0280 */
+       {BRIDGE, M5602_XB_HSYNC_PARA, 0x02, 0x00},
+       {BRIDGE, M5602_XB_HSYNC_PARA, 0x80, 0x00},
+       {BRIDGE, M5602_XB_SIG_INI, 0x00, 0x00},
+       {BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00, 0x00},
+       {BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xa0, 0x00}, /* 48 MHz */
+
+       {SENSOR, S5K4AA_PAGE_MAP, 0x02, 0x00},
+       {SENSOR, S5K4AA_READ_MODE, S5K4AA_RM_H_FLIP | S5K4AA_RM_ROW_SKIP_2X
+               | S5K4AA_RM_COL_SKIP_2X, 0x00},
+       /* 0x37 : Fix image stability when light is too bright and improves
+        * image quality in 640x480, but worsens it in 1280x1024 */
+       {SENSOR, 0x37, 0x01, 0x00},
+       /* ROWSTART_HI, ROWSTART_LO : 10 + (1024-960)/2 = 42 = 0x002a */
+       {SENSOR, S5K4AA_ROWSTART_HI, 0x00, 0x00},
+       {SENSOR, S5K4AA_ROWSTART_LO, 0x2a, 0x00},
+       {SENSOR, S5K4AA_COLSTART_HI, 0x00, 0x00},
+       {SENSOR, S5K4AA_COLSTART_LO, 0x0c, 0x00},
+       /* window_height_hi, window_height_lo : 960 = 0x03c0 */
+       {SENSOR, S5K4AA_WINDOW_HEIGHT_HI, 0x03, 0x00},
+       {SENSOR, S5K4AA_WINDOW_HEIGHT_LO, 0xc0, 0x00},
+       /* window_width_hi, window_width_lo : 1280 = 0x0500 */
+       {SENSOR, S5K4AA_WINDOW_WIDTH_HI, 0x05, 0x00},
+       {SENSOR, S5K4AA_WINDOW_WIDTH_LO, 0x00, 0x00},
+       {SENSOR, S5K4AA_H_BLANK_HI__, 0x00, 0x00},
+       {SENSOR, S5K4AA_H_BLANK_LO__, 0xa8, 0x00}, /* helps to sync... */
+       {SENSOR, S5K4AA_EXPOSURE_HI, 0x01, 0x00},
+       {SENSOR, S5K4AA_EXPOSURE_LO, 0x00, 0x00},
+       {SENSOR, 0x11, 0x04, 0x00},
+       {SENSOR, 0x12, 0xc3, 0x00},
+       {SENSOR, S5K4AA_PAGE_MAP, 0x02, 0x00},
+       {SENSOR, 0x02, 0x0e, 0x00},
+       {SENSOR_LONG, S5K4AA_GLOBAL_GAIN__, 0x0f, 0x00},
+       {SENSOR, S5K4AA_GAIN_1, 0x0b, 0x00},
+       {SENSOR, S5K4AA_GAIN_2, 0xa0, 0x00}
+};
+
 #endif
index ccea4a758464698d99ac09f7b3d221014ea0706b..42c86aa4dc8d073ca9931a6b256101f0dbcc85c8 100644 (file)
 
 #include "m5602_s5k83a.h"
 
+static struct v4l2_pix_format s5k83a_modes[] = {
+       {
+               640,
+               480,
+               V4L2_PIX_FMT_SBGGR8,
+               V4L2_FIELD_NONE,
+               .sizeimage =
+                       640 * 480,
+               .bytesperline = 640,
+               .colorspace = V4L2_COLORSPACE_SRGB,
+               .priv = 0
+       }
+};
+
+const static struct ctrl s5k83a_ctrls[] = {
+       {
+               {
+                       .id = V4L2_CID_BRIGHTNESS,
+                       .type = V4L2_CTRL_TYPE_INTEGER,
+                       .name = "brightness",
+                       .minimum = 0x00,
+                       .maximum = 0xff,
+                       .step = 0x01,
+                       .default_value = S5K83A_DEFAULT_BRIGHTNESS,
+                       .flags = V4L2_CTRL_FLAG_SLIDER
+               },
+                       .set = s5k83a_set_brightness,
+                       .get = s5k83a_get_brightness
+
+       }, {
+               {
+                       .id = V4L2_CID_WHITENESS,
+                       .type = V4L2_CTRL_TYPE_INTEGER,
+                       .name = "whiteness",
+                       .minimum = 0x00,
+                       .maximum = 0xff,
+                       .step = 0x01,
+                       .default_value = S5K83A_DEFAULT_WHITENESS,
+                       .flags = V4L2_CTRL_FLAG_SLIDER
+               },
+                       .set = s5k83a_set_whiteness,
+                       .get = s5k83a_get_whiteness,
+       }, {
+               {
+                       .id = V4L2_CID_GAIN,
+                       .type = V4L2_CTRL_TYPE_INTEGER,
+                       .name = "gain",
+                       .minimum = 0x00,
+                       .maximum = S5K83A_MAXIMUM_GAIN,
+                       .step = 0x01,
+                       .default_value = S5K83A_DEFAULT_GAIN,
+                       .flags = V4L2_CTRL_FLAG_SLIDER
+               },
+                       .set = s5k83a_set_gain,
+                       .get = s5k83a_get_gain
+       }, {
+               {
+                       .id         = V4L2_CID_HFLIP,
+                       .type       = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name       = "horizontal flip",
+                       .minimum    = 0,
+                       .maximum    = 1,
+                       .step       = 1,
+                       .default_value  = 0
+               },
+                       .set = s5k83a_set_hflip,
+                       .get = s5k83a_get_hflip
+       }, {
+               {
+                .id         = V4L2_CID_VFLIP,
+               .type       = V4L2_CTRL_TYPE_BOOLEAN,
+               .name       = "vertical flip",
+               .minimum    = 0,
+               .maximum    = 1,
+               .step       = 1,
+               .default_value  = 0
+               },
+               .set = s5k83a_set_vflip,
+               .get = s5k83a_get_vflip
+       }
+};
+
 static void s5k83a_dump_registers(struct sd *sd);
 
 int s5k83a_probe(struct sd *sd)
@@ -63,10 +145,10 @@ int s5k83a_probe(struct sd *sd)
                info("Detected a s5k83a sensor");
 
 sensor_found:
-       sd->gspca_dev.cam.cam_mode = s5k83a.modes;
-       sd->gspca_dev.cam.nmodes = s5k83a.nmodes;
-       sd->desc->ctrls = s5k83a.ctrls;
-       sd->desc->nctrls = s5k83a.nctrls;
+       sd->gspca_dev.cam.cam_mode = s5k83a_modes;
+       sd->gspca_dev.cam.nmodes = ARRAY_SIZE(s5k83a_modes);
+       sd->desc->ctrls = s5k83a_ctrls;
+       sd->desc->nctrls = ARRAY_SIZE(s5k83a_ctrls);
        return 0;
 }
 
@@ -108,6 +190,16 @@ int s5k83a_init(struct sd *sd)
        return (err < 0) ? err : 0;
 }
 
+int s5k83a_start(struct sd *sd)
+{
+       return s5k83a_set_led_indication(sd, 1);
+}
+
+int s5k83a_stop(struct sd *sd)
+{
+       return s5k83a_set_led_indication(sd, 0);
+}
+
 int s5k83a_power_down(struct sd *sd)
 {
        return 0;
@@ -163,12 +255,11 @@ int s5k83a_get_brightness(struct gspca_dev *gspca_dev, __s32 *val)
 
        err = m5602_read_sensor(sd, S5K83A_BRIGHTNESS, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        data[1] = data[1] << 1;
        *val = data[1];
 
-out:
        return err;
 }
 
@@ -182,13 +273,13 @@ int s5k83a_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
        data[1] = 0x20;
        err = m5602_write_sensor(sd, 0x14, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        data[0] = 0x01;
        data[1] = 0x00;
        err = m5602_write_sensor(sd, 0x0d, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        /* FIXME: This is not sane, we need to figure out the composition
                  of these registers */
@@ -196,7 +287,6 @@ int s5k83a_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
        data[1] = val >> 1; /* brightness, high 7 bits */
        err = m5602_write_sensor(sd, S5K83A_BRIGHTNESS, data, 2);
 
-out:
        return err;
 }
 
@@ -208,11 +298,10 @@ int s5k83a_get_whiteness(struct gspca_dev *gspca_dev, __s32 *val)
 
        err = m5602_read_sensor(sd, S5K83A_WHITENESS, &data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        *val = data;
 
-out:
        return err;
 }
 
@@ -236,7 +325,7 @@ int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
 
        err = m5602_read_sensor(sd, S5K83A_GAIN, data, 2);
        if (err < 0)
-               goto out;
+               return err;
 
        data[1] = data[1] & 0x3f;
        if (data[1] > S5K83A_MAXIMUM_GAIN)
@@ -244,7 +333,6 @@ int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
 
        *val = data[1];
 
-out:
        return err;
 }
 
@@ -269,12 +357,11 @@ int s5k83a_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
        data[0] = 0x05;
        err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, S5K83A_FLIP, data, 1);
        *val = (data[0] | 0x40) ? 1 : 0;
 
-out:
        return err;
 }
 
@@ -287,23 +374,22 @@ int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
        data[0] = 0x05;
        err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, S5K83A_FLIP, data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        /* set or zero six bit, seven is hflip */
        data[0] = (val) ? (data[0] & 0x80) | 0x40 | S5K83A_FLIP_MASK
                        : (data[0] & 0x80) | S5K83A_FLIP_MASK;
        err = m5602_write_sensor(sd, S5K83A_FLIP, data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        data[0] = (val) ? 0x0b : 0x0a;
        err = m5602_write_sensor(sd, S5K83A_VFLIP_TUNE, data, 1);
 
-out:
        return err;
 }
 
@@ -316,12 +402,11 @@ int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
        data[0] = 0x05;
        err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, S5K83A_FLIP, data, 1);
        *val = (data[0] | 0x80) ? 1 : 0;
 
-out:
        return err;
 }
 
@@ -334,21 +419,40 @@ int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
        data[0] = 0x05;
        err = m5602_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        err = m5602_read_sensor(sd, S5K83A_FLIP, data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        /* set or zero seven bit, six is vflip */
        data[0] = (val) ? (data[0] & 0x40) | 0x80 | S5K83A_FLIP_MASK
                        : (data[0] & 0x40) | S5K83A_FLIP_MASK;
        err = m5602_write_sensor(sd, S5K83A_FLIP, data, 1);
        if (err < 0)
-               goto out;
+               return err;
 
        data[0] = (val) ? 0x0a : 0x0b;
        err = m5602_write_sensor(sd, S5K83A_HFLIP_TUNE, data, 1);
-out:
+
        return err;
 }
+
+int s5k83a_set_led_indication(struct sd *sd, u8 val)
+{
+       int err = 0;
+       u8 data[1];
+
+       err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, data);
+       if (err < 0)
+               return err;
+
+       if (val)
+               data[0] = data[0] | S5K83A_GPIO_LED_MASK;
+       else
+               data[0] = data[0] & ~S5K83A_GPIO_LED_MASK;
+
+       err = m5602_write_bridge(sd, M5602_XB_GPIO_DAT, data[0]);
+
+       return (err < 0) ? err : 0;
+}
index 05ccb5b57a88578108884a06c42a1e52d12216fb..819ab25272bee72c9319e19663ee1c657584313b 100644 (file)
@@ -34,7 +34,7 @@
 #define S5K83A_DEFAULT_GAIN                    0x00
 #define S5K83A_MAXIMUM_GAIN                    0x3c
 #define S5K83A_FLIP_MASK                       0x10
-
+#define S5K83A_GPIO_LED_MASK           0x10
 
 /*****************************************************************************/
 
@@ -44,8 +44,12 @@ extern int dump_sensor;
 
 int s5k83a_probe(struct sd *sd);
 int s5k83a_init(struct sd *sd);
+int s5k83a_start(struct sd *sd);
+int s5k83a_stop(struct sd *sd);
 int s5k83a_power_down(struct sd *sd);
 
+int s5k83a_set_led_indication(struct sd *sd, u8 val);
+
 int s5k83a_set_brightness(struct gspca_dev *gspca_dev, __s32 val);
 int s5k83a_get_brightness(struct gspca_dev *gspca_dev, __s32 *val);
 int s5k83a_set_whiteness(struct gspca_dev *gspca_dev, __s32 val);
@@ -57,95 +61,15 @@ int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val);
 int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val);
 int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
 
-static struct m5602_sensor s5k83a = {
+static const struct m5602_sensor s5k83a = {
        .name = "S5K83A",
        .probe = s5k83a_probe,
        .init = s5k83a_init,
+       .start = s5k83a_start,
+       .stop = s5k83a_stop,
        .power_down = s5k83a_power_down,
        .i2c_slave_id = 0x5a,
        .i2c_regW = 2,
-       .nctrls = 5,
-       .ctrls = {
-       {
-               {
-                       .id = V4L2_CID_BRIGHTNESS,
-                       .type = V4L2_CTRL_TYPE_INTEGER,
-                       .name = "brightness",
-                       .minimum = 0x00,
-                       .maximum = 0xff,
-                       .step = 0x01,
-                       .default_value = S5K83A_DEFAULT_BRIGHTNESS,
-                       .flags = V4L2_CTRL_FLAG_SLIDER
-               },
-                       .set = s5k83a_set_brightness,
-                       .get = s5k83a_get_brightness
-
-       }, {
-               {
-                       .id = V4L2_CID_WHITENESS,
-                       .type = V4L2_CTRL_TYPE_INTEGER,
-                       .name = "whiteness",
-                       .minimum = 0x00,
-                       .maximum = 0xff,
-                       .step = 0x01,
-                       .default_value = S5K83A_DEFAULT_WHITENESS,
-                       .flags = V4L2_CTRL_FLAG_SLIDER
-               },
-                       .set = s5k83a_set_whiteness,
-                       .get = s5k83a_get_whiteness,
-       }, {
-               {
-                       .id = V4L2_CID_GAIN,
-                       .type = V4L2_CTRL_TYPE_INTEGER,
-                       .name = "gain",
-                       .minimum = 0x00,
-                       .maximum = S5K83A_MAXIMUM_GAIN,
-                       .step = 0x01,
-                       .default_value = S5K83A_DEFAULT_GAIN,
-                       .flags = V4L2_CTRL_FLAG_SLIDER
-               },
-                       .set = s5k83a_set_gain,
-                       .get = s5k83a_get_gain
-       }, {
-               {
-                       .id         = V4L2_CID_HFLIP,
-                       .type       = V4L2_CTRL_TYPE_BOOLEAN,
-                       .name       = "horizontal flip",
-                       .minimum    = 0,
-                       .maximum    = 1,
-                       .step       = 1,
-                       .default_value  = 0
-               },
-                       .set = s5k83a_set_hflip,
-                       .get = s5k83a_get_hflip
-       }, {
-               {
-                .id         = V4L2_CID_VFLIP,
-               .type       = V4L2_CTRL_TYPE_BOOLEAN,
-               .name       = "vertical flip",
-               .minimum    = 0,
-               .maximum    = 1,
-               .step       = 1,
-               .default_value  = 0
-               },
-               .set = s5k83a_set_vflip,
-               .get = s5k83a_get_vflip
-               }
-       },
-       .nmodes = 1,
-       .modes = {
-       {
-               M5602_DEFAULT_FRAME_WIDTH,
-               M5602_DEFAULT_FRAME_HEIGHT,
-               V4L2_PIX_FMT_SBGGR8,
-               V4L2_FIELD_NONE,
-               .sizeimage =
-                       M5602_DEFAULT_FRAME_WIDTH * M5602_DEFAULT_FRAME_HEIGHT,
-               .bytesperline = M5602_DEFAULT_FRAME_WIDTH,
-               .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 1
-       }
-       }
 };
 
 static const unsigned char preinit_s5k83a[][4] =
@@ -381,7 +305,7 @@ static const unsigned char init_s5k83a[][4] =
        {BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00, 0x00},
        {BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xf0, 0x00},
        {BRIDGE, M5602_XB_GPIO_DIR, 0x1d, 0x00},
-       {BRIDGE, M5602_XB_GPIO_DAT, 0x1c, 0x00},
+       {BRIDGE, M5602_XB_GPIO_DAT, 0x08, 0x00},
        {BRIDGE, M5602_XB_GPIO_EN_H, 0x06, 0x00},
        {BRIDGE, M5602_XB_GPIO_DIR_H, 0x06, 0x00},
        {BRIDGE, M5602_XB_GPIO_DAT_H, 0x00, 0x00},
index 261623f0da4818c220e21f2a0fa052648ac11ba3..0d3026936f2e90a8d4b842df62b73d03f0039581 100644 (file)
 
 #include "m5602_bridge.h"
 
-#define M5602_DEFAULT_FRAME_WIDTH  640
-#define M5602_DEFAULT_FRAME_HEIGHT 480
-
-#define M5602_MAX_CTRLS                (V4L2_CID_LASTP1 - V4L2_CID_BASE + 10)
-
 /* Enumerates all supported sensors */
 enum sensors {
        OV9650_SENSOR   = 1,
@@ -61,14 +56,14 @@ struct m5602_sensor {
        /* Executed when the camera starts to send data */
        int (*start)(struct sd *sd);
 
-       /* Performs a power down sequence */
-       int (*power_down)(struct sd *sd);
+       /* Executed when the camera ends to send data */
+       int (*stop)(struct sd *sd);
 
-       int nctrls;
-       struct ctrl ctrls[M5602_MAX_CTRLS];
+       /* Executed when the device is disconnected */
+       void (*disconnect)(struct sd *sd);
 
-       char nmodes;
-       struct v4l2_pix_format modes[];
+       /* Performs a power down sequence */
+       int (*power_down)(struct sd *sd);
 };
 
 #endif
index 04e3ae57a2e3867c1cd8cd0fc43e932fab806be9..2e1cdf068fda896043f2222622ac17a3798a982f 100644 (file)
@@ -360,6 +360,12 @@ static int sd_init(struct gspca_dev *gspca_dev)
        gspca_dev->cam.nmodes = ARRAY_SIZE(sq905_mode);
        if (!(ident & SQ905_HIRES_MASK))
                gspca_dev->cam.nmodes--;
+
+       if (ident & SQ905_ORIENTATION_MASK)
+               gspca_dev->cam.input_flags = V4L2_IN_ST_VFLIP;
+       else
+               gspca_dev->cam.input_flags = V4L2_IN_ST_VFLIP |
+                                            V4L2_IN_ST_HFLIP;
        return 0;
 }
 
index 4c802fb12cd67d738770278f505386f1920f5b36..e4e933c400bccd49a7def89c29d4a6038b20e880 100644 (file)
@@ -159,37 +159,16 @@ static const struct v4l2_pix_format vc0323_mode[] = {
                .priv = 2},
 };
 static const struct v4l2_pix_format bi_mode[] = {
-/*fixme: jeg does not work
-       {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
-               .bytesperline = 320,
-               .sizeimage = 320 * 240 * 3 / 8 + 590,
-               .colorspace = V4L2_COLORSPACE_JPEG,
-               .priv = 5},
-*/
        {320, 240, V4L2_PIX_FMT_YVYU, V4L2_FIELD_NONE,
                .bytesperline = 320,
                .sizeimage = 320 * 240 * 2,
                .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 4},
-/*
-       {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
-               .bytesperline = 640,
-               .sizeimage = 640 * 480 * 3 / 8 + 590,
-               .colorspace = V4L2_COLORSPACE_JPEG,
-               .priv = 3},
-*/
+               .priv = 2},
        {640, 480, V4L2_PIX_FMT_YVYU, V4L2_FIELD_NONE,
                .bytesperline = 640,
                .sizeimage = 640 * 480 * 2,
                .colorspace = V4L2_COLORSPACE_SRGB,
-               .priv = 2},
-/*
-       {1280, 1024, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
-               .bytesperline = 1280,
-               .sizeimage = 1280 * 1024 * 1 / 4 + 590,
-               .colorspace = V4L2_COLORSPACE_JPEG,
                .priv = 1},
-*/
        {1280, 1024, V4L2_PIX_FMT_YVYU, V4L2_FIELD_NONE,
                .bytesperline = 1280,
                .sizeimage = 1280 * 1024 * 2,
@@ -1034,121 +1013,6 @@ static const u8 mi1320_soc_InitVGA[][4] = {
        {0xb3, 0x5c, 0x01, 0xcc},
        {}
 };
-static const u8 mi1320_soc_InitVGA_JPG[][4] = {
-       {0xb3, 0x01, 0x01, 0xcc},
-       {0xb0, 0x03, 0x19, 0xcc},
-       {0xb0, 0x04, 0x02, 0xcc},
-       {0x00, 0x00, 0x30, 0xdd},
-       {0xb3, 0x00, 0x64, 0xcc},
-       {0xb3, 0x00, 0x67, 0xcc},
-       {0xb3, 0x05, 0x01, 0xcc},
-       {0xb3, 0x06, 0x01, 0xcc},
-       {0xb3, 0x08, 0x01, 0xcc},
-       {0xb3, 0x09, 0x0c, 0xcc},
-       {0xb3, 0x34, 0x02, 0xcc},
-       {0xb3, 0x35, 0xc8, 0xcc},
-       {0xb3, 0x02, 0x00, 0xcc},
-       {0xb3, 0x03, 0x0a, 0xcc},
-       {0xb3, 0x04, 0x05, 0xcc},
-       {0xb3, 0x20, 0x00, 0xcc},
-       {0xb3, 0x21, 0x00, 0xcc},
-       {0xb3, 0x22, 0x01, 0xcc},
-       {0xb3, 0x23, 0xe0, 0xcc},
-       {0xb3, 0x14, 0x00, 0xcc},
-       {0xb3, 0x15, 0x00, 0xcc},
-       {0xb3, 0x16, 0x02, 0xcc},
-       {0xb3, 0x17, 0x7f, 0xcc},
-       {0xb3, 0x00, 0x67, 0xcc},
-       {0xb8, 0x00, 0x00, 0xcc},
-       {0xbc, 0x00, 0x71, 0xcc},
-       {0xbc, 0x01, 0x01, 0xcc},
-       {0xb3, 0x5c, 0x01, 0xcc},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x00, 0x00, 0x10, 0xdd},
-       {0xc8, 0x00, 0x00, 0xbb},
-       {0x00, 0x00, 0x30, 0xdd},
-       {0xf0, 0x00, 0x00, 0xbb},
-       {0x00, 0x00, 0x10, 0xdd},
-       {0x07, 0x00, 0xe0, 0xbb},
-       {0x08, 0x00, 0x0b, 0xbb},
-       {0x21, 0x00, 0x0c, 0xbb},
-       {0x20, 0x01, 0x03, 0xbb},
-       {0xb6, 0x00, 0x00, 0xcc},
-       {0xb6, 0x03, 0x02, 0xcc},
-       {0xb6, 0x02, 0x80, 0xcc},
-       {0xb6, 0x05, 0x01, 0xcc},
-       {0xb6, 0x04, 0xe0, 0xcc},
-       {0xb6, 0x12, 0xf8, 0xcc},
-       {0xb6, 0x13, 0x05, 0xcc},
-       {0xb6, 0x18, 0x02, 0xcc},
-       {0xb6, 0x17, 0x58, 0xcc},
-       {0xb6, 0x16, 0x00, 0xcc},
-       {0xb6, 0x22, 0x12, 0xcc},
-       {0xb6, 0x23, 0x0b, 0xcc},
-       {0xbf, 0xc0, 0x39, 0xcc},
-       {0xbf, 0xc1, 0x04, 0xcc},
-       {0xbf, 0xcc, 0x00, 0xcc},
-       {0xb3, 0x01, 0x41, 0xcc},
-       {0xf0, 0x00, 0x00, 0xbb},
-       {0x05, 0x01, 0x78, 0xbb},
-       {0x06, 0x00, 0x11, 0xbb},
-       {0x07, 0x01, 0x42, 0xbb},
-       {0x08, 0x00, 0x11, 0xbb},
-       {0x20, 0x01, 0x03, 0xbb},
-       {0x21, 0x80, 0x00, 0xbb},
-       {0x22, 0x0d, 0x0f, 0xbb},
-       {0x24, 0x80, 0x00, 0xbb},
-       {0x59, 0x00, 0xff, 0xbb},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x39, 0x03, 0xca, 0xbb},
-       {0x3a, 0x06, 0x80, 0xbb},
-       {0x3b, 0x01, 0x52, 0xbb},
-       {0x3c, 0x05, 0x40, 0xbb},
-       {0x57, 0x01, 0x9c, 0xbb},
-       {0x58, 0x01, 0xee, 0xbb},
-       {0x59, 0x00, 0xf0, 0xbb},
-       {0x5a, 0x01, 0x20, 0xbb},
-       {0x5c, 0x1d, 0x17, 0xbb},
-       {0x5d, 0x22, 0x1c, 0xbb},
-       {0x64, 0x1e, 0x1c, 0xbb},
-       {0x5b, 0x00, 0x00, 0xbb},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x22, 0xa0, 0x78, 0xbb},
-       {0x23, 0xa0, 0x78, 0xbb},
-       {0x24, 0x7f, 0x00, 0xbb},
-       {0x28, 0xea, 0x02, 0xbb},
-       {0x29, 0x86, 0x7a, 0xbb},
-       {0x5e, 0x52, 0x4c, 0xbb},
-       {0x5f, 0x20, 0x24, 0xbb},
-       {0x60, 0x00, 0x02, 0xbb},
-       {0x02, 0x00, 0xee, 0xbb},
-       {0x03, 0x39, 0x23, 0xbb},
-       {0x04, 0x07, 0x24, 0xbb},
-       {0x09, 0x00, 0xc0, 0xbb},
-       {0x0a, 0x00, 0x79, 0xbb},
-       {0x0b, 0x00, 0x04, 0xbb},
-       {0x0c, 0x00, 0x5c, 0xbb},
-       {0x0d, 0x00, 0xd9, 0xbb},
-       {0x0e, 0x00, 0x53, 0xbb},
-       {0x0f, 0x00, 0x21, 0xbb},
-       {0x10, 0x00, 0xa4, 0xbb},
-       {0x11, 0x00, 0xe5, 0xbb},
-       {0x15, 0x00, 0x00, 0xbb},
-       {0x16, 0x00, 0x00, 0xbb},
-       {0x17, 0x00, 0x00, 0xbb},
-       {0x18, 0x00, 0x00, 0xbb},
-       {0x19, 0x00, 0x00, 0xbb},
-       {0x1a, 0x00, 0x00, 0xbb},
-       {0x1b, 0x00, 0x00, 0xbb},
-       {0x1c, 0x00, 0x00, 0xbb},
-       {0x1d, 0x00, 0x00, 0xbb},
-       {0x1e, 0x00, 0x00, 0xbb},
-       {0xf0, 0x00, 0x01, 0xbb},
-       {0x06, 0xe0, 0x0e, 0xbb},
-       {0x06, 0x60, 0x0e, 0xbb},
-       {0xb3, 0x5c, 0x01, 0xcc},
-       {}
-};
 static const u8 mi1320_soc_InitQVGA[][4] = {
        {0xb3, 0x01, 0x01, 0xcc},
        {0xb0, 0x03, 0x19, 0xcc},
@@ -1262,268 +1126,6 @@ static const u8 mi1320_soc_InitQVGA[][4] = {
        {0xb3, 0x5c, 0x01, 0xcc},
        {}
 };
-static const u8 mi1320_soc_InitQVGA_JPG[][4] = {
-       {0xb3, 0x01, 0x01, 0xcc},
-       {0xb0, 0x03, 0x19, 0xcc},
-       {0xb0, 0x04, 0x02, 0xcc},
-       {0x00, 0x00, 0x30, 0xdd},
-       {0xb3, 0x00, 0x64, 0xcc},
-       {0xb3, 0x00, 0x67, 0xcc},
-       {0xb3, 0x05, 0x01, 0xcc},
-       {0xb3, 0x06, 0x01, 0xcc},
-       {0xb3, 0x08, 0x01, 0xcc},
-       {0xb3, 0x09, 0x0c, 0xcc},
-       {0xb3, 0x34, 0x02, 0xcc},
-       {0xb3, 0x35, 0xc8, 0xcc},
-       {0xb3, 0x02, 0x00, 0xcc},
-       {0xb3, 0x03, 0x0a, 0xcc},
-       {0xb3, 0x04, 0x05, 0xcc},
-       {0xb3, 0x20, 0x00, 0xcc},
-       {0xb3, 0x21, 0x00, 0xcc},
-       {0xb3, 0x22, 0x01, 0xcc},
-       {0xb3, 0x23, 0xe0, 0xcc},
-       {0xb3, 0x14, 0x00, 0xcc},
-       {0xb3, 0x15, 0x00, 0xcc},
-       {0xb3, 0x16, 0x02, 0xcc},
-       {0xb3, 0x17, 0x7f, 0xcc},
-       {0xb3, 0x00, 0x67, 0xcc},
-       {0xb8, 0x00, 0x00, 0xcc},
-       {0xbc, 0x00, 0xd1, 0xcc},
-       {0xbc, 0x01, 0x01, 0xcc},
-       {0xb3, 0x5c, 0x01, 0xcc},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x00, 0x00, 0x10, 0xdd},
-       {0xc8, 0x00, 0x00, 0xbb},
-       {0x00, 0x00, 0x30, 0xdd},
-       {0xf0, 0x00, 0x00, 0xbb},
-       {0x00, 0x00, 0x10, 0xdd},
-       {0x07, 0x00, 0xe0, 0xbb},
-       {0x08, 0x00, 0x0b, 0xbb},
-       {0x21, 0x00, 0x0c, 0xbb},
-       {0x20, 0x01, 0x03, 0xbb},
-       {0xb6, 0x00, 0x00, 0xcc},
-       {0xb6, 0x03, 0x01, 0xcc},
-       {0xb6, 0x02, 0x40, 0xcc},
-       {0xb6, 0x05, 0x00, 0xcc},
-       {0xb6, 0x04, 0xf0, 0xcc},
-       {0xb6, 0x12, 0xf8, 0xcc},
-       {0xb6, 0x13, 0x05, 0xcc},
-       {0xb6, 0x18, 0x00, 0xcc},
-       {0xb6, 0x17, 0x96, 0xcc},
-       {0xb6, 0x16, 0x00, 0xcc},
-       {0xb6, 0x22, 0x12, 0xcc},
-       {0xb6, 0x23, 0x0b, 0xcc},
-       {0xbf, 0xc0, 0x39, 0xcc},
-       {0xbf, 0xc1, 0x04, 0xcc},
-       {0xbf, 0xcc, 0x00, 0xcc},
-       {0xbc, 0x02, 0x18, 0xcc},
-       {0xbc, 0x03, 0x50, 0xcc},
-       {0xbc, 0x04, 0x18, 0xcc},
-       {0xbc, 0x05, 0x00, 0xcc},
-       {0xbc, 0x06, 0x00, 0xcc},
-       {0xbc, 0x08, 0x30, 0xcc},
-       {0xbc, 0x09, 0x40, 0xcc},
-       {0xbc, 0x0a, 0x10, 0xcc},
-       {0xbc, 0x0b, 0x00, 0xcc},
-       {0xbc, 0x0c, 0x00, 0xcc},
-       {0xb3, 0x01, 0x41, 0xcc},
-       {0xf0, 0x00, 0x00, 0xbb},
-       {0x05, 0x01, 0x78, 0xbb},
-       {0x06, 0x00, 0x11, 0xbb},
-       {0x07, 0x01, 0x42, 0xbb},
-       {0x08, 0x00, 0x11, 0xbb},
-       {0x20, 0x01, 0x03, 0xbb},
-       {0x21, 0x80, 0x00, 0xbb},
-       {0x22, 0x0d, 0x0f, 0xbb},
-       {0x24, 0x80, 0x00, 0xbb},
-       {0x59, 0x00, 0xff, 0xbb},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x39, 0x03, 0xca, 0xbb},
-       {0x3a, 0x06, 0x80, 0xbb},
-       {0x3b, 0x01, 0x52, 0xbb},
-       {0x3c, 0x05, 0x40, 0xbb},
-       {0x57, 0x01, 0x9c, 0xbb},
-       {0x58, 0x01, 0xee, 0xbb},
-       {0x59, 0x00, 0xf0, 0xbb},
-       {0x5a, 0x01, 0x20, 0xbb},
-       {0x5c, 0x1d, 0x17, 0xbb},
-       {0x5d, 0x22, 0x1c, 0xbb},
-       {0x64, 0x1e, 0x1c, 0xbb},
-       {0x5b, 0x00, 0x00, 0xbb},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x22, 0xa0, 0x78, 0xbb},
-       {0x23, 0xa0, 0x78, 0xbb},
-       {0x24, 0x7f, 0x00, 0xbb},
-       {0x28, 0xea, 0x02, 0xbb},
-       {0x29, 0x86, 0x7a, 0xbb},
-       {0x5e, 0x52, 0x4c, 0xbb},
-       {0x5f, 0x20, 0x24, 0xbb},
-       {0x60, 0x00, 0x02, 0xbb},
-       {0x02, 0x00, 0xee, 0xbb},
-       {0x03, 0x39, 0x23, 0xbb},
-       {0x04, 0x07, 0x24, 0xbb},
-       {0x09, 0x00, 0xc0, 0xbb},
-       {0x0a, 0x00, 0x79, 0xbb},
-       {0x0b, 0x00, 0x04, 0xbb},
-       {0x0c, 0x00, 0x5c, 0xbb},
-       {0x0d, 0x00, 0xd9, 0xbb},
-       {0x0e, 0x00, 0x53, 0xbb},
-       {0x0f, 0x00, 0x21, 0xbb},
-       {0x10, 0x00, 0xa4, 0xbb},
-       {0x11, 0x00, 0xe5, 0xbb},
-       {0x15, 0x00, 0x00, 0xbb},
-       {0x16, 0x00, 0x00, 0xbb},
-       {0x17, 0x00, 0x00, 0xbb},
-       {0x18, 0x00, 0x00, 0xbb},
-       {0x19, 0x00, 0x00, 0xbb},
-       {0x1a, 0x00, 0x00, 0xbb},
-       {0x1b, 0x00, 0x00, 0xbb},
-       {0x1c, 0x00, 0x00, 0xbb},
-       {0x1d, 0x00, 0x00, 0xbb},
-       {0x1e, 0x00, 0x00, 0xbb},
-       {0xf0, 0x00, 0x01, 0xbb},
-       {0x06, 0xe0, 0x0e, 0xbb},
-       {0x06, 0x60, 0x0e, 0xbb},
-       {0xb3, 0x5c, 0x01, 0xcc},
-       {}
-};
-static const u8 mi1320_soc_InitSXGA_JPG[][4] = {
-       {0xb3, 0x01, 0x01, 0xcc},
-       {0xb0, 0x03, 0x19, 0xcc},
-       {0xb0, 0x04, 0x02, 0xcc},
-       {0x00, 0x00, 0x33, 0xdd},
-       {0xb3, 0x00, 0x64, 0xcc},
-       {0xb3, 0x00, 0x67, 0xcc},
-       {0xb3, 0x05, 0x00, 0xcc},
-       {0xb3, 0x06, 0x00, 0xcc},
-       {0xb3, 0x08, 0x01, 0xcc},
-       {0xb3, 0x09, 0x0c, 0xcc},
-       {0xb3, 0x34, 0x02, 0xcc},
-       {0xb3, 0x35, 0xc8, 0xcc},
-       {0xb3, 0x02, 0x00, 0xcc},
-       {0xb3, 0x03, 0x0a, 0xcc},
-       {0xb3, 0x04, 0x05, 0xcc},
-       {0xb3, 0x20, 0x00, 0xcc},
-       {0xb3, 0x21, 0x00, 0xcc},
-       {0xb3, 0x22, 0x04, 0xcc},
-       {0xb3, 0x23, 0x00, 0xcc},
-       {0xb3, 0x14, 0x00, 0xcc},
-       {0xb3, 0x15, 0x00, 0xcc},
-       {0xb3, 0x16, 0x04, 0xcc},
-       {0xb3, 0x17, 0xff, 0xcc},
-       {0xb3, 0x00, 0x67, 0xcc},
-       {0xbc, 0x00, 0x71, 0xcc},
-       {0xbc, 0x01, 0x01, 0xcc},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x00, 0x00, 0x30, 0xdd},
-       {0xc8, 0x9f, 0x0b, 0xbb},
-       {0x00, 0x00, 0x20, 0xdd},
-       {0x5b, 0x00, 0x01, 0xbb},
-       {0x00, 0x00, 0x20, 0xdd},
-       {0xf0, 0x00, 0x00, 0xbb},
-       {0x00, 0x00, 0x30, 0xdd},
-       {0x20, 0x01, 0x03, 0xbb},
-       {0x00, 0x00, 0x20, 0xdd},
-       {0xb6, 0x00, 0x00, 0xcc},
-       {0xb6, 0x03, 0x05, 0xcc},
-       {0xb6, 0x02, 0x00, 0xcc},
-       {0xb6, 0x05, 0x04, 0xcc},
-       {0xb6, 0x04, 0x00, 0xcc},
-       {0xb6, 0x12, 0xf8, 0xcc},
-       {0xb6, 0x13, 0x29, 0xcc},
-       {0xb6, 0x18, 0x0a, 0xcc},
-       {0xb6, 0x17, 0x00, 0xcc},
-       {0xb6, 0x16, 0x00, 0xcc},
-       {0xb6, 0x22, 0x12, 0xcc},
-       {0xb6, 0x23, 0x0b, 0xcc},
-       {0xbf, 0xc0, 0x39, 0xcc},
-       {0xbf, 0xc1, 0x04, 0xcc},
-       {0xbf, 0xcc, 0x00, 0xcc},
-       {0xb3, 0x5c, 0x01, 0xcc},
-       {0xb3, 0x01, 0x41, 0xcc},
-       {0xf0, 0x00, 0x00, 0xbb},
-       {0x05, 0x01, 0x78, 0xbb},
-       {0x06, 0x00, 0x11, 0xbb},
-       {0x07, 0x01, 0x42, 0xbb},
-       {0x08, 0x00, 0x11, 0xbb},
-       {0x20, 0x01, 0x03, 0xbb},
-       {0x21, 0x80, 0x00, 0xbb},
-       {0x22, 0x0d, 0x0f, 0xbb},
-       {0x24, 0x80, 0x00, 0xbb},
-       {0x59, 0x00, 0xff, 0xbb},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x39, 0x03, 0xca, 0xbb},
-       {0x3a, 0x06, 0x80, 0xbb},
-       {0x3b, 0x01, 0x52, 0xbb},
-       {0x3c, 0x05, 0x40, 0xbb},
-       {0x57, 0x01, 0x9c, 0xbb},
-       {0x58, 0x01, 0xee, 0xbb},
-       {0x59, 0x00, 0xf0, 0xbb},
-       {0x5a, 0x01, 0x20, 0xbb},
-       {0x5c, 0x1d, 0x17, 0xbb},
-       {0x5d, 0x22, 0x1c, 0xbb},
-       {0x64, 0x1e, 0x1c, 0xbb},
-       {0x5b, 0x00, 0x00, 0xbb},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x22, 0xa0, 0x78, 0xbb},
-       {0x23, 0xa0, 0x78, 0xbb},
-       {0x24, 0x7f, 0x00, 0xbb},
-       {0x28, 0xea, 0x02, 0xbb},
-       {0x29, 0x86, 0x7a, 0xbb},
-       {0x5e, 0x52, 0x4c, 0xbb},
-       {0x5f, 0x20, 0x24, 0xbb},
-       {0x60, 0x00, 0x02, 0xbb},
-       {0x02, 0x00, 0xee, 0xbb},
-       {0x03, 0x39, 0x23, 0xbb},
-       {0x04, 0x07, 0x24, 0xbb},
-       {0x09, 0x00, 0xc0, 0xbb},
-       {0x0a, 0x00, 0x79, 0xbb},
-       {0x0b, 0x00, 0x04, 0xbb},
-       {0x0c, 0x00, 0x5c, 0xbb},
-       {0x0d, 0x00, 0xd9, 0xbb},
-       {0x0e, 0x00, 0x53, 0xbb},
-       {0x0f, 0x00, 0x21, 0xbb},
-       {0x10, 0x00, 0xa4, 0xbb},
-       {0x11, 0x00, 0xe5, 0xbb},
-       {0x15, 0x00, 0x00, 0xbb},
-       {0x16, 0x00, 0x00, 0xbb},
-       {0x17, 0x00, 0x00, 0xbb},
-       {0x18, 0x00, 0x00, 0xbb},
-       {0x19, 0x00, 0x00, 0xbb},
-       {0x1a, 0x00, 0x00, 0xbb},
-       {0x1b, 0x00, 0x00, 0xbb},
-       {0x1c, 0x00, 0x00, 0xbb},
-       {0x1d, 0x00, 0x00, 0xbb},
-       {0x1e, 0x00, 0x00, 0xbb},
-       {0xf0, 0x00, 0x01, 0xbb},
-       {0x06, 0xe0, 0x0e, 0xbb},
-       {0x06, 0x60, 0x0e, 0xbb},
-       {0xb3, 0x5c, 0x01, 0xcc},
-       {0xf0, 0x00, 0x00, 0xbb},
-       {0x05, 0x01, 0x13, 0xbb},
-       {0x06, 0x00, 0x11, 0xbb},
-       {0x07, 0x00, 0x85, 0xbb},
-       {0x08, 0x00, 0x27, 0xbb},
-       {0x20, 0x01, 0x03, 0xbb},
-       {0x21, 0x80, 0x00, 0xbb},
-       {0x22, 0x0d, 0x0f, 0xbb},
-       {0x24, 0x80, 0x00, 0xbb},
-       {0x59, 0x00, 0xff, 0xbb},
-       {0xf0, 0x00, 0x02, 0xbb},
-       {0x39, 0x03, 0x0d, 0xbb},
-       {0x3a, 0x06, 0x1b, 0xbb},
-       {0x3b, 0x00, 0x95, 0xbb},
-       {0x3c, 0x04, 0xdb, 0xbb},
-       {0x57, 0x02, 0x00, 0xbb},
-       {0x58, 0x02, 0x66, 0xbb},
-       {0x59, 0x00, 0xff, 0xbb},
-       {0x5a, 0x01, 0x33, 0xbb},
-       {0x5c, 0x12, 0x0d, 0xbb},
-       {0x5d, 0x16, 0x11, 0xbb},
-       {0x64, 0x5e, 0x1c, 0xbb},
-       {0x2f, 0x90, 0x00, 0xbb},
-       {}
-};
 static const u8 mi1320_soc_InitSXGA[][4] = {
        {0xb3, 0x01, 0x01, 0xcc},
        {0xb0, 0x03, 0x19, 0xcc},
@@ -3015,11 +2617,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
        int mode;
        static const u8 (*mi1320_soc_init[])[4] = {
                mi1320_soc_InitSXGA,
-               mi1320_soc_InitSXGA_JPG,
                mi1320_soc_InitVGA,
-               mi1320_soc_InitVGA_JPG,
                mi1320_soc_InitQVGA,
-               mi1320_soc_InitQVGA_JPG
        };
 
        /* Assume start use the good resolution from gspca_dev->mode */
index eca8bf92a225c3e7236717302ff3228ff81a77bc..b0195e8ee4d1d45d64ba17792e94a53fd06642f8 100644 (file)
@@ -884,12 +884,9 @@ static void ivtv_load_and_init_modules(struct ivtv *itv)
        }
        else if (itv->card->type == IVTV_CARD_GV_MVPRX ||
                 itv->card->type == IVTV_CARD_GV_MVPRX2E) {
-               struct v4l2_crystal_freq crystal_freq;
-
                /* The crystal frequency of GVMVPRX is 24.576MHz */
-               crystal_freq.freq = SAA7115_FREQ_24_576_MHZ;
-               crystal_freq.flags = SAA7115_FREQ_FL_UCGC;
-               v4l2_subdev_call(itv->sd_video, video, s_crystal_freq, &crystal_freq);
+               v4l2_subdev_call(itv->sd_video, video, s_crystal_freq,
+                       SAA7115_FREQ_24_576_MHZ, SAA7115_FREQ_FL_UCGC);
        }
 
        if (hw & IVTV_HW_CX25840) {
@@ -1234,7 +1231,7 @@ int ivtv_init_on_first_open(struct ivtv *itv)
        if (itv->card->hw_all & IVTV_HW_CX25840) {
                struct v4l2_control ctrl;
 
-               v4l2_subdev_call(itv->sd_video, core, init, 0);
+               v4l2_subdev_call(itv->sd_video, core, load_fw);
                /* CX25840_CID_ENABLE_PVR150_WORKAROUND */
                ctrl.id = V4L2_CID_PRIVATE_BASE;
                ctrl.value = itv->pvr150_workaround;
index cfaacf6096d00735f7703f66fd5c282b592d54d8..e707ef3086b2b7a3e7025cfce4ff7aaaaa12983d 100644 (file)
@@ -857,15 +857,12 @@ int ivtv_v4l2_close(struct file *filp)
                /* Mark that the radio is no longer in use */
                clear_bit(IVTV_F_I_RADIO_USER, &itv->i_flags);
                /* Switch tuner to TV */
-               ivtv_call_all(itv, tuner, s_std, itv->std);
+               ivtv_call_all(itv, core, s_std, itv->std);
                /* Select correct audio input (i.e. TV tuner or Line in) */
                ivtv_audio_set_io(itv);
-               if (itv->hw_flags & IVTV_HW_SAA711X)
-               {
-                       struct v4l2_crystal_freq crystal_freq;
-                       crystal_freq.freq = SAA7115_FREQ_32_11_MHZ;
-                       crystal_freq.flags = 0;
-                       ivtv_call_hw(itv, IVTV_HW_SAA711X, video, s_crystal_freq, &crystal_freq);
+               if (itv->hw_flags & IVTV_HW_SAA711X) {
+                       ivtv_call_hw(itv, IVTV_HW_SAA711X, video, s_crystal_freq,
+                                       SAA7115_FREQ_32_11_MHZ, 0);
                }
                if (atomic_read(&itv->capturing) > 0) {
                        /* Undo video mute */
@@ -956,10 +953,8 @@ static int ivtv_serialized_open(struct ivtv_stream *s, struct file *filp)
                /* Select the correct audio input (i.e. radio tuner) */
                ivtv_audio_set_io(itv);
                if (itv->hw_flags & IVTV_HW_SAA711X) {
-                       struct v4l2_crystal_freq crystal_freq;
-                       crystal_freq.freq = SAA7115_FREQ_32_11_MHZ;
-                       crystal_freq.flags = SAA7115_FREQ_FL_APLL;
-                       ivtv_call_hw(itv, IVTV_HW_SAA711X, video, s_crystal_freq, &crystal_freq);
+                       ivtv_call_hw(itv, IVTV_HW_SAA711X, video, s_crystal_freq,
+                               SAA7115_FREQ_32_11_MHZ, SAA7115_FREQ_FL_APLL);
                }
                /* Done! Unmute and continue. */
                ivtv_unmute(itv);
index 3321983d89e55124516801296fd9caeaa81b88dc..ceb05bdcaf62c80c5cd3ee145e49b70da3c4d5b6 100644 (file)
@@ -248,15 +248,16 @@ static int subdev_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int subdev_s_audio_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int subdev_s_audio_routing(struct v4l2_subdev *sd,
+                                 u32 input, u32 output, u32 config)
 {
        struct ivtv *itv = sd_to_ivtv(sd);
        u16 mask, data;
 
-       if (route->input > 2)
+       if (input > 2)
                return -EINVAL;
        mask = itv->card->gpio_audio_input.mask;
-       switch (route->input) {
+       switch (input) {
        case 0:
                data = itv->card->gpio_audio_input.tuner;
                break;
@@ -318,17 +319,18 @@ static int subdev_log_status(struct v4l2_subdev *sd)
        return 0;
 }
 
-static int subdev_s_video_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int subdev_s_video_routing(struct v4l2_subdev *sd,
+                                 u32 input, u32 output, u32 config)
 {
        struct ivtv *itv = sd_to_ivtv(sd);
        u16 mask, data;
 
-       if (route->input > 2) /* 0:Tuner 1:Composite 2:S-Video */
+       if (input > 2) /* 0:Tuner 1:Composite 2:S-Video */
                return -EINVAL;
        mask = itv->card->gpio_video_input.mask;
-       if  (route->input == 0)
+       if (input == 0)
                data = itv->card->gpio_video_input.tuner;
-       else if  (route->input == 1)
+       else if (input == 1)
                data = itv->card->gpio_video_input.composite;
        else
                data = itv->card->gpio_video_input.svideo;
@@ -342,10 +344,10 @@ static const struct v4l2_subdev_core_ops subdev_core_ops = {
        .g_ctrl = subdev_g_ctrl,
        .s_ctrl = subdev_s_ctrl,
        .queryctrl = subdev_queryctrl,
+       .s_std = subdev_s_std,
 };
 
 static const struct v4l2_subdev_tuner_ops subdev_tuner_ops = {
-       .s_std = subdev_s_std,
        .s_radio = subdev_s_radio,
        .g_tuner = subdev_g_tuner,
        .s_tuner = subdev_s_tuner,
index e73a196ecc7ac88f9518a9c0539cf0defcbe198f..9e3d32b8004c0e571b2b92e3db4363bab2f7b1fd 100644 (file)
@@ -161,15 +161,18 @@ int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
                return -1;
        if (hw == IVTV_HW_TUNER) {
                /* special tuner handling */
-               sd = v4l2_i2c_new_probed_subdev(adap, mod, type,
+               sd = v4l2_i2c_new_probed_subdev(&itv->v4l2_dev,
+                               adap, mod, type,
                                itv->card_i2c->radio);
                if (sd)
                        sd->grp_id = 1 << idx;
-               sd = v4l2_i2c_new_probed_subdev(adap, mod, type,
+               sd = v4l2_i2c_new_probed_subdev(&itv->v4l2_dev,
+                               adap, mod, type,
                                itv->card_i2c->demod);
                if (sd)
                        sd->grp_id = 1 << idx;
-               sd = v4l2_i2c_new_probed_subdev(adap, mod, type,
+               sd = v4l2_i2c_new_probed_subdev(&itv->v4l2_dev,
+                               adap, mod, type,
                                itv->card_i2c->tv);
                if (sd)
                        sd->grp_id = 1 << idx;
@@ -178,11 +181,11 @@ int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
        if (!hw_addrs[idx])
                return -1;
        if (hw == IVTV_HW_UPD64031A || hw == IVTV_HW_UPD6408X) {
-               unsigned short addrs[2] = { hw_addrs[idx], I2C_CLIENT_END };
-
-               sd = v4l2_i2c_new_probed_subdev(adap, mod, type, addrs);
+               sd = v4l2_i2c_new_probed_subdev_addr(&itv->v4l2_dev,
+                               adap, mod, type, hw_addrs[idx]);
        } else {
-               sd = v4l2_i2c_new_subdev(adap, mod, type, hw_addrs[idx]);
+               sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
+                               adap, mod, type, hw_addrs[idx]);
        }
        if (sd)
                sd->grp_id = 1 << idx;
index 9a0424298af1452c30562c730ef10f4f85d96279..4a2d464f055e633e94d39554e346c8d38e2c75c6 100644 (file)
@@ -1033,7 +1033,6 @@ static int ivtv_g_output(struct file *file, void *fh, unsigned int *i)
 static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
 {
        struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
-       struct v4l2_routing route;
 
        if (outp >= itv->card->nof_outputs)
                return -EINVAL;
@@ -1046,9 +1045,9 @@ static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
                   itv->active_output, outp);
 
        itv->active_output = outp;
-       route.input = SAA7127_INPUT_TYPE_NORMAL;
-       route.output = itv->card->video_outputs[outp].video_output;
-       ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing, &route);
+       ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing,
+                       SAA7127_INPUT_TYPE_NORMAL,
+                       itv->card->video_outputs[outp].video_output, 0);
 
        return 0;
 }
@@ -1121,7 +1120,7 @@ int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std)
        IVTV_DEBUG_INFO("Switching standard to %llx.\n", (unsigned long long)itv->std);
 
        /* Tuner */
-       ivtv_call_all(itv, tuner, s_std, itv->std);
+       ivtv_call_all(itv, core, s_std, itv->std);
 
        if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
                /* set display standard */
@@ -1735,13 +1734,6 @@ static long ivtv_default(struct file *file, void *fh, int cmd, void *arg)
        struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
 
        switch (cmd) {
-       case VIDIOC_INT_S_AUDIO_ROUTING: {
-               struct v4l2_routing *route = arg;
-
-               ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing, route);
-               break;
-       }
-
        case VIDIOC_INT_RESET: {
                u32 val = *(u32 *)arg;
 
index 3fd302294497d430677109e121f68f70e1454aee..8898c569a1c90adab6cbc13e2b0a1afd6b1684d3 100644 (file)
@@ -34,7 +34,7 @@
 void ivtv_audio_set_io(struct ivtv *itv)
 {
        const struct ivtv_card_audio_input *in;
-       struct v4l2_routing route;
+       u32 input, output = 0;
 
        /* Determine which input to use */
        if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags))
@@ -43,73 +43,77 @@ void ivtv_audio_set_io(struct ivtv *itv)
                in = &itv->card->audio_inputs[itv->audio_input];
 
        /* handle muxer chips */
-       route.input = in->muxer_input;
-       route.output = 0;
+       input = in->muxer_input;
        if (itv->card->hw_muxer & IVTV_HW_M52790)
-               route.output = M52790_OUT_STEREO;
-       v4l2_subdev_call(itv->sd_muxer, audio, s_routing, &route);
+               output = M52790_OUT_STEREO;
+       v4l2_subdev_call(itv->sd_muxer, audio, s_routing,
+                       input, output, 0);
 
-       route.input = in->audio_input;
-       route.output = 0;
+       input = in->audio_input;
+       output = 0;
        if (itv->card->hw_audio & IVTV_HW_MSP34XX)
-               route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
-       ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing, &route);
+               output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
+       ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing,
+                       input, output, 0);
 }
 
 /* Selects the video input and output according to the current
    settings. */
 void ivtv_video_set_io(struct ivtv *itv)
 {
-       struct v4l2_routing route;
        int inp = itv->active_input;
+       u32 input;
        u32 type;
 
-       route.input = itv->card->video_inputs[inp].video_input;
-       route.output = 0;
-       v4l2_subdev_call(itv->sd_video, video, s_routing, &route);
+       v4l2_subdev_call(itv->sd_video, video, s_routing,
+               itv->card->video_inputs[inp].video_input, 0, 0);
 
        type = itv->card->video_inputs[inp].video_type;
 
        if (type == IVTV_CARD_INPUT_VID_TUNER) {
-               route.input = 0;  /* Tuner */
+               input = 0;  /* Tuner */
        } else if (type < IVTV_CARD_INPUT_COMPOSITE1) {
-               route.input = 2;  /* S-Video */
+               input = 2;  /* S-Video */
        } else {
-               route.input = 1;  /* Composite */
+               input = 1;  /* Composite */
        }
 
        if (itv->card->hw_video & IVTV_HW_GPIO)
-               ivtv_call_hw(itv, IVTV_HW_GPIO, video, s_routing, &route);
+               ivtv_call_hw(itv, IVTV_HW_GPIO, video, s_routing,
+                               input, 0, 0);
 
        if (itv->card->hw_video & IVTV_HW_UPD64031A) {
                if (type == IVTV_CARD_INPUT_VID_TUNER ||
                    type >= IVTV_CARD_INPUT_COMPOSITE1) {
                        /* Composite: GR on, connect to 3DYCS */
-                       route.input = UPD64031A_GR_ON | UPD64031A_3DYCS_COMPOSITE;
+                       input = UPD64031A_GR_ON | UPD64031A_3DYCS_COMPOSITE;
                } else {
                        /* S-Video: GR bypassed, turn it off */
-                       route.input = UPD64031A_GR_OFF | UPD64031A_3DYCS_DISABLE;
+                       input = UPD64031A_GR_OFF | UPD64031A_3DYCS_DISABLE;
                }
-               route.input |= itv->card->gr_config;
+               input |= itv->card->gr_config;
 
-               ivtv_call_hw(itv, IVTV_HW_UPD64031A, video, s_routing, &route);
+               ivtv_call_hw(itv, IVTV_HW_UPD64031A, video, s_routing,
+                               input, 0, 0);
        }
 
        if (itv->card->hw_video & IVTV_HW_UPD6408X) {
-               route.input = UPD64083_YCS_MODE;
+               input = UPD64083_YCS_MODE;
                if (type > IVTV_CARD_INPUT_VID_TUNER &&
                    type < IVTV_CARD_INPUT_COMPOSITE1) {
-                       /* S-Video uses YCNR mode and internal Y-ADC, the upd64031a
-                          is not used. */
-                       route.input |= UPD64083_YCNR_MODE;
+                       /* S-Video uses YCNR mode and internal Y-ADC, the
+                          upd64031a is not used. */
+                       input |= UPD64083_YCNR_MODE;
                }
                else if (itv->card->hw_video & IVTV_HW_UPD64031A) {
-                 /* Use upd64031a output for tuner and composite(CX23416GYC only) inputs */
-                 if ((type == IVTV_CARD_INPUT_VID_TUNER)||
-                     (itv->card->type == IVTV_CARD_CX23416GYC)) {
-                   route.input |= UPD64083_EXT_Y_ADC;
-                 }
+                       /* Use upd64031a output for tuner and
+                          composite(CX23416GYC only) inputs */
+                       if (type == IVTV_CARD_INPUT_VID_TUNER ||
+                           itv->card->type == IVTV_CARD_CX23416GYC) {
+                               input |= UPD64083_EXT_Y_ADC;
+                       }
                }
-               ivtv_call_hw(itv, IVTV_HW_UPD6408X, video, s_routing, &route);
+               ivtv_call_hw(itv, IVTV_HW_UPD6408X, video, s_routing,
+                               input, 0, 0);
        }
 }
index 841024b6bcdf7c9274fcddc34260211c1349db95..fab8e0254bbc1c7ad7bbd76406df973c24622545 100644 (file)
@@ -409,11 +409,12 @@ static void ks0127_init(struct v4l2_subdev *sd)
        }
 }
 
-static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int ks0127_s_routing(struct v4l2_subdev *sd,
+                           u32 input, u32 output, u32 config)
 {
        struct ks0127 *ks = to_ks0127(sd);
 
-       switch (route->input) {
+       switch (input) {
        case KS_INPUT_COMPOSITE_1:
        case KS_INPUT_COMPOSITE_2:
        case KS_INPUT_COMPOSITE_3:
@@ -421,13 +422,13 @@ static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
        case KS_INPUT_COMPOSITE_5:
        case KS_INPUT_COMPOSITE_6:
                v4l2_dbg(1, debug, sd,
-                       "s_routing %d: Composite\n", route->input);
+                       "s_routing %d: Composite\n", input);
                /* autodetect 50/60 Hz */
                ks0127_and_or(sd, KS_CMDA,   0xfc, 0x00);
                /* VSE=0 */
                ks0127_and_or(sd, KS_CMDA,   ~0x40, 0x00);
                /* set input line */
-               ks0127_and_or(sd, KS_CMDB,   0xb0, route->input);
+               ks0127_and_or(sd, KS_CMDB,   0xb0, input);
                /* non-freerunning mode */
                ks0127_and_or(sd, KS_CMDC,   0x70, 0x0a);
                /* analog input */
@@ -455,13 +456,13 @@ static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
        case KS_INPUT_SVIDEO_2:
        case KS_INPUT_SVIDEO_3:
                v4l2_dbg(1, debug, sd,
-                       "s_routing %d: S-Video\n", route->input);
+                       "s_routing %d: S-Video\n", input);
                /* autodetect 50/60 Hz */
                ks0127_and_or(sd, KS_CMDA,   0xfc, 0x00);
                /* VSE=0 */
                ks0127_and_or(sd, KS_CMDA,   ~0x40, 0x00);
                /* set input line */
-               ks0127_and_or(sd, KS_CMDB,   0xb0, route->input);
+               ks0127_and_or(sd, KS_CMDB,   0xb0, input);
                /* non-freerunning mode */
                ks0127_and_or(sd, KS_CMDC,   0x70, 0x0a);
                /* analog input */
@@ -496,7 +497,7 @@ static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
 
                ks0127_and_or(sd, KS_CMDA,   0xff, 0x40); /* VSE=1 */
                /* set input line and VALIGN */
-               ks0127_and_or(sd, KS_CMDB,   0xb0, (route->input | 0x40));
+               ks0127_and_or(sd, KS_CMDB,   0xb0, (input | 0x40));
                /* freerunning mode, */
                /* TSTGEN = 1 TSTGFR=11 TSTGPH=0 TSTGPK=0  VMEM=1*/
                ks0127_and_or(sd, KS_CMDC,   0x70, 0x87);
@@ -531,7 +532,7 @@ static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
 
        default:
                v4l2_dbg(1, debug, sd,
-                       "s_routing: Unknown input %d\n", route->input);
+                       "s_routing: Unknown input %d\n", input);
                break;
        }
 
@@ -648,9 +649,6 @@ static int ks0127_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_iden
 
 static const struct v4l2_subdev_core_ops ks0127_core_ops = {
        .g_chip_ident = ks0127_g_chip_ident,
-};
-
-static const struct v4l2_subdev_tuner_ops ks0127_tuner_ops = {
        .s_std = ks0127_s_std,
 };
 
@@ -663,7 +661,6 @@ static const struct v4l2_subdev_video_ops ks0127_video_ops = {
 
 static const struct v4l2_subdev_ops ks0127_ops = {
        .core = &ks0127_core_ops,
-       .tuner = &ks0127_tuner_ops,
        .video = &ks0127_video_ops,
 };
 
index 1f340fefc49db00dba48961ffb8edaad711bef1c..d7317e798cc474cb86bbca07a3fc945fbf800502 100644 (file)
@@ -69,12 +69,13 @@ static int m52790_write(struct v4l2_subdev *sd)
    part of the audio output routing. The normal case is that another
    chip takes care of the actual muting so making it part of the
    output routing seems to be the right thing to do for now. */
-static int m52790_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int m52790_s_routing(struct v4l2_subdev *sd,
+                           u32 input, u32 output, u32 config)
 {
        struct m52790_state *state = to_state(sd);
 
-       state->input = route->input;
-       state->output = route->output;
+       state->input = input;
+       state->output = output;
        m52790_write(sd);
        return 0;
 }
index 2ad11f0999c69a843d289d8af4ced5a88f2a2e04..1d66855a379a99209aa51cfa418e7aa1f6e0d0db 100644 (file)
@@ -117,7 +117,7 @@ static int ptable_alloc(void)
        memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
 
        /* give only 32 bit DMA addresses */
-       if (dma_set_mask(&meye.mchip_dev->dev, DMA_32BIT_MASK))
+       if (dma_set_mask(&meye.mchip_dev->dev, DMA_BIT_MASK(32)))
                return -1;
 
        meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
index 9e8e06cfe5c6d4d0f43acb23f0caa748fba551a5..e9df3cb02cc11c44b18c452715039401635ceb1a 100644 (file)
@@ -56,7 +56,7 @@
 #include <linux/videodev2.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-ioctl.h>
-#include <media/v4l2-i2c-drv-legacy.h>
+#include <media/v4l2-i2c-drv.h>
 #include <media/msp3400.h>
 #include <media/tvaudio.h>
 #include "msp3400-driver.h"
@@ -108,10 +108,6 @@ MODULE_PARM_DESC(dolby, "Activates Dolby processsing");
 /* DSP unit subaddress */
 #define I2C_MSP_DSP     0x12
 
-/* Addresses to scan */
-static unsigned short normal_i2c[] = { 0x80 >> 1, 0x88 >> 1, I2C_CLIENT_END };
-
-I2C_CLIENT_INSMOD;
 
 /* ----------------------------------------------------------------------- */
 /* functions for talking to the MSP3400C Sound processor                   */
@@ -509,25 +505,26 @@ static int msp_s_std(struct v4l2_subdev *sd, v4l2_std_id id)
        return 0;
 }
 
-static int msp_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *rt)
+static int msp_s_routing(struct v4l2_subdev *sd,
+                        u32 input, u32 output, u32 config)
 {
        struct msp_state *state = to_state(sd);
        struct i2c_client *client = v4l2_get_subdevdata(sd);
-       int tuner = (rt->input >> 3) & 1;
-       int sc_in = rt->input & 0x7;
-       int sc1_out = rt->output & 0xf;
-       int sc2_out = (rt->output >> 4) & 0xf;
+       int tuner = (input >> 3) & 1;
+       int sc_in = input & 0x7;
+       int sc1_out = output & 0xf;
+       int sc2_out = (output >> 4) & 0xf;
        u16 val, reg;
        int i;
        int extern_input = 1;
 
-       if (state->routing.input == rt->input &&
-                       state->routing.output == rt->output)
+       if (state->route_in == input && state->route_out == output)
                return 0;
-       state->routing = *rt;
+       state->route_in = input;
+       state->route_out = output;
        /* check if the tuner input is used */
        for (i = 0; i < 5; i++) {
-               if (((rt->input >> (4 + i * 4)) & 0xf) == 0)
+               if (((input >> (4 + i * 4)) & 0xf) == 0)
                        extern_input = 0;
        }
        state->mode = extern_input ? MSP_MODE_EXTERN : MSP_MODE_AM_DETECT;
@@ -677,7 +674,7 @@ static int msp_log_status(struct v4l2_subdev *sd)
        }
        v4l_info(client, "Audmode:  0x%04x\n", state->audmode);
        v4l_info(client, "Routing:  0x%08x (input) 0x%08x (output)\n",
-                       state->routing.input, state->routing.output);
+                       state->route_in, state->route_out);
        v4l_info(client, "ACB:      0x%04x\n", state->acb);
        return 0;
 }
@@ -696,11 +693,6 @@ static int msp_resume(struct i2c_client *client)
        return 0;
 }
 
-static int msp_command(struct i2c_client *client, unsigned cmd, void *arg)
-{
-       return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
-}
-
 /* ----------------------------------------------------------------------- */
 
 static const struct v4l2_subdev_core_ops msp_core_ops = {
@@ -709,6 +701,7 @@ static const struct v4l2_subdev_core_ops msp_core_ops = {
        .g_ctrl = msp_g_ctrl,
        .s_ctrl = msp_s_ctrl,
        .queryctrl = msp_queryctrl,
+       .s_std = msp_s_std,
 };
 
 static const struct v4l2_subdev_tuner_ops msp_tuner_ops = {
@@ -716,7 +709,6 @@ static const struct v4l2_subdev_tuner_ops msp_tuner_ops = {
        .g_tuner = msp_g_tuner,
        .s_tuner = msp_s_tuner,
        .s_radio = msp_s_radio,
-       .s_std = msp_s_std,
 };
 
 static const struct v4l2_subdev_audio_ops msp_audio_ops = {
@@ -770,8 +762,8 @@ static int msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
        state->i2s_mode = 0;
        init_waitqueue_head(&state->wq);
        /* These are the reset input/output positions */
-       state->routing.input = MSP_INPUT_DEFAULT;
-       state->routing.output = MSP_OUTPUT_DEFAULT;
+       state->route_in = MSP_INPUT_DEFAULT;
+       state->route_out = MSP_OUTPUT_DEFAULT;
 
        state->rev1 = msp_read_dsp(client, 0x1e);
        if (state->rev1 != -1)
@@ -925,8 +917,6 @@ MODULE_DEVICE_TABLE(i2c, msp_id);
 
 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
        .name = "msp3400",
-       .driverid = I2C_DRIVERID_MSP3400,
-       .command = msp_command,
        .probe = msp_probe,
        .remove = msp_remove,
        .suspend = msp_suspend,
index 3fe1c1b10f538ce61ebb47fd6a79c20cad5baa26..d6b3e6d0eef7fd845cd5f74996c919dd4b57acab 100644 (file)
@@ -80,7 +80,8 @@ struct msp_state {
        int i2s_mode;
        int main, second;       /* sound carrier */
        int input;
-       struct v4l2_routing routing;
+       u32 route_in;
+       u32 route_out;
 
        /* v4l2 */
        int audmode;
index a655e9c30146a986e7f95e1e4ba0d4fe25328c57..168bca703614e589cfb02e213f41f8f4d8e6f9ec 100644 (file)
@@ -188,7 +188,7 @@ void msp3400c_set_mode(struct i2c_client *client, int mode)
 {
        struct msp_state *state = to_state(i2c_get_clientdata(client));
        struct msp3400c_init_data_dem *data = &msp3400c_init_data[mode];
-       int tuner = (state->routing.input >> 3) & 1;
+       int tuner = (state->route_in >> 3) & 1;
        int i;
 
        v4l_dbg(1, msp_debug, client, "set_mode: %d\n", mode);
@@ -896,7 +896,7 @@ static void msp34xxg_set_source(struct i2c_client *client, u16 reg, int in)
 static void msp34xxg_set_sources(struct i2c_client *client)
 {
        struct msp_state *state = to_state(i2c_get_clientdata(client));
-       u32 in = state->routing.input;
+       u32 in = state->route_in;
 
        msp34xxg_set_source(client, 0x0008, (in >> 4) & 0xf);
        /* quasi-peak detector is set to same input as the loudspeaker (MAIN) */
@@ -912,7 +912,7 @@ static void msp34xxg_set_sources(struct i2c_client *client)
 static void msp34xxg_reset(struct i2c_client *client)
 {
        struct msp_state *state = to_state(i2c_get_clientdata(client));
-       int tuner = (state->routing.input >> 3) & 1;
+       int tuner = (state->route_in >> 3) & 1;
        int modus;
 
        /* initialize std to 1 (autodetect) to signal that no standard is
index fa7e5093edeb653e5b3ea6b0151d43019ae47f6a..684f62fa7897586152db543a6a3c95069dea7cf0 100644 (file)
@@ -207,7 +207,7 @@ static unsigned long mt9m001_query_bus_param(struct soc_camera_device *icd)
        struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd);
        struct soc_camera_link *icl = mt9m001->client->dev.platform_data;
        /* MT9M001 has all capture_format parameters fixed */
-       unsigned long flags = SOCAM_PCLK_SAMPLE_RISING |
+       unsigned long flags = SOCAM_PCLK_SAMPLE_FALLING |
                SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |
                SOCAM_DATA_ACTIVE_HIGH | SOCAM_MASTER;
 
index 23f9ce9d67ef688ee10158fb4543417992d1fa06..2b0927bfd217b1226366f370f6e09d4ee5c57dde 100644 (file)
@@ -141,8 +141,19 @@ static int get_shutter(struct soc_camera_device *icd, u32 *data)
 
 static int mt9t031_init(struct soc_camera_device *icd)
 {
+       struct mt9t031 *mt9t031 = container_of(icd, struct mt9t031, icd);
+       struct soc_camera_link *icl = mt9t031->client->dev.platform_data;
        int ret;
 
+       if (icl->power) {
+               ret = icl->power(&mt9t031->client->dev, 1);
+               if (ret < 0) {
+                       dev_err(icd->vdev->parent,
+                               "Platform failed to power-on the camera.\n");
+                       return ret;
+               }
+       }
+
        /* Disable chip output, synchronous option update */
        ret = reg_write(icd, MT9T031_RESET, 1);
        if (ret >= 0)
@@ -150,13 +161,23 @@ static int mt9t031_init(struct soc_camera_device *icd)
        if (ret >= 0)
                ret = reg_clear(icd, MT9T031_OUTPUT_CONTROL, 2);
 
+       if (ret < 0 && icl->power)
+               icl->power(&mt9t031->client->dev, 0);
+
        return ret >= 0 ? 0 : -EIO;
 }
 
 static int mt9t031_release(struct soc_camera_device *icd)
 {
+       struct mt9t031 *mt9t031 = container_of(icd, struct mt9t031, icd);
+       struct soc_camera_link *icl = mt9t031->client->dev.platform_data;
+
        /* Disable the chip */
        reg_clear(icd, MT9T031_OUTPUT_CONTROL, 2);
+
+       if (icl->power)
+               icl->power(&mt9t031->client->dev, 0);
+
        return 0;
 }
 
diff --git a/drivers/media/video/mx1_camera.c b/drivers/media/video/mx1_camera.c
new file mode 100644 (file)
index 0000000..86fab56
--- /dev/null
@@ -0,0 +1,827 @@
+/*
+ * V4L2 Driver for i.MXL/i.MXL camera (CSI) host
+ *
+ * Copyright (C) 2008, Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
+ * Copyright (C) 2009, Darius Augulis <augulis.darius@gmail.com>
+ *
+ * Based on PXA SoC camera driver
+ * Copyright (C) 2006, Sascha Hauer, Pengutronix
+ * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.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 <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/mutex.h>
+#include <linux/platform_device.h>
+#include <linux/time.h>
+#include <linux/version.h>
+#include <linux/videodev2.h>
+
+#include <media/soc_camera.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-dev.h>
+#include <media/videobuf-dma-contig.h>
+
+#include <asm/dma.h>
+#include <asm/fiq.h>
+#include <mach/dma-mx1-mx2.h>
+#include <mach/hardware.h>
+#include <mach/mx1_camera.h>
+
+/*
+ * CSI registers
+ */
+#define DMA_CCR(x)     (0x8c + ((x) << 6))     /* Control Registers */
+#define DMA_DIMR       0x08                    /* Interrupt mask Register */
+#define CSICR1         0x00                    /* CSI Control Register 1 */
+#define CSISR          0x08                    /* CSI Status Register */
+#define CSIRXR         0x10                    /* CSI RxFIFO Register */
+
+#define CSICR1_RXFF_LEVEL(x)   (((x) & 0x3) << 19)
+#define CSICR1_SOF_POL         (1 << 17)
+#define CSICR1_SOF_INTEN       (1 << 16)
+#define CSICR1_MCLKDIV(x)      (((x) & 0xf) << 12)
+#define CSICR1_MCLKEN          (1 << 9)
+#define CSICR1_FCC             (1 << 8)
+#define CSICR1_BIG_ENDIAN      (1 << 7)
+#define CSICR1_CLR_RXFIFO      (1 << 5)
+#define CSICR1_GCLK_MODE       (1 << 4)
+#define CSICR1_DATA_POL                (1 << 2)
+#define CSICR1_REDGE           (1 << 1)
+#define CSICR1_EN              (1 << 0)
+
+#define CSISR_SFF_OR_INT       (1 << 25)
+#define CSISR_RFF_OR_INT       (1 << 24)
+#define CSISR_STATFF_INT       (1 << 21)
+#define CSISR_RXFF_INT         (1 << 18)
+#define CSISR_SOF_INT          (1 << 16)
+#define CSISR_DRDY             (1 << 0)
+
+#define VERSION_CODE KERNEL_VERSION(0, 0, 1)
+#define DRIVER_NAME "mx1-camera"
+
+#define CSI_IRQ_MASK   (CSISR_SFF_OR_INT | CSISR_RFF_OR_INT | \
+                       CSISR_STATFF_INT | CSISR_RXFF_INT | CSISR_SOF_INT)
+
+#define CSI_BUS_FLAGS  (SOCAM_MASTER | SOCAM_HSYNC_ACTIVE_HIGH | \
+                       SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW | \
+                       SOCAM_PCLK_SAMPLE_RISING | SOCAM_PCLK_SAMPLE_FALLING | \
+                       SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATA_ACTIVE_LOW | \
+                       SOCAM_DATAWIDTH_8)
+
+#define MAX_VIDEO_MEM 16       /* Video memory limit in megabytes */
+
+/*
+ * Structures
+ */
+
+/* buffer for one video frame */
+struct mx1_buffer {
+       /* common v4l buffer stuff -- must be first */
+       struct videobuf_buffer vb;
+       const struct soc_camera_data_format *fmt;
+       int inwork;
+};
+
+/* i.MX1/i.MXL is only supposed to handle one camera on its Camera Sensor
+ * Interface. If anyone ever builds hardware to enable more than
+ * one camera, they will have to modify this driver too */
+struct mx1_camera_dev {
+       struct soc_camera_device        *icd;
+       struct mx1_camera_pdata         *pdata;
+       struct mx1_buffer               *active;
+       struct device                   *dev;
+       struct resource                 *res;
+       struct clk                      *clk;
+       struct list_head                capture;
+
+       void __iomem                    *base;
+       int                             dma_chan;
+       unsigned int                    irq;
+       unsigned long                   mclk;
+
+       spinlock_t                      lock;
+};
+
+/*
+ *  Videobuf operations
+ */
+static int mx1_videobuf_setup(struct videobuf_queue *vq, unsigned int *count,
+                             unsigned int *size)
+{
+       struct soc_camera_device *icd = vq->priv_data;
+
+       *size = icd->width * icd->height *
+               ((icd->current_fmt->depth + 7) >> 3);
+
+       if (!*count)
+               *count = 32;
+
+       while (*size * *count > MAX_VIDEO_MEM * 1024 * 1024)
+               (*count)--;
+
+       dev_dbg(&icd->dev, "count=%d, size=%d\n", *count, *size);
+
+       return 0;
+}
+
+static void free_buffer(struct videobuf_queue *vq, struct mx1_buffer *buf)
+{
+       struct soc_camera_device *icd = vq->priv_data;
+       struct videobuf_buffer *vb = &buf->vb;
+
+       BUG_ON(in_interrupt());
+
+       dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
+               vb, vb->baddr, vb->bsize);
+
+       /* This waits until this buffer is out of danger, i.e., until it is no
+        * longer in STATE_QUEUED or STATE_ACTIVE */
+       videobuf_waiton(vb, 0, 0);
+       videobuf_dma_contig_free(vq, vb);
+
+       vb->state = VIDEOBUF_NEEDS_INIT;
+}
+
+static int mx1_videobuf_prepare(struct videobuf_queue *vq,
+               struct videobuf_buffer *vb, enum v4l2_field field)
+{
+       struct soc_camera_device *icd = vq->priv_data;
+       struct mx1_buffer *buf = container_of(vb, struct mx1_buffer, vb);
+       int ret;
+
+       dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
+               vb, vb->baddr, vb->bsize);
+
+       /* Added list head initialization on alloc */
+       WARN_ON(!list_empty(&vb->queue));
+
+       BUG_ON(NULL == icd->current_fmt);
+
+       /* I think, in buf_prepare you only have to protect global data,
+        * the actual buffer is yours */
+       buf->inwork = 1;
+
+       if (buf->fmt    != icd->current_fmt ||
+           vb->width   != icd->width ||
+           vb->height  != icd->height ||
+           vb->field   != field) {
+               buf->fmt        = icd->current_fmt;
+               vb->width       = icd->width;
+               vb->height      = icd->height;
+               vb->field       = field;
+               vb->state       = VIDEOBUF_NEEDS_INIT;
+       }
+
+       vb->size = vb->width * vb->height * ((buf->fmt->depth + 7) >> 3);
+       if (0 != vb->baddr && vb->bsize < vb->size) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if (vb->state == VIDEOBUF_NEEDS_INIT) {
+               ret = videobuf_iolock(vq, vb, NULL);
+               if (ret)
+                       goto fail;
+
+               vb->state = VIDEOBUF_PREPARED;
+       }
+
+       buf->inwork = 0;
+
+       return 0;
+
+fail:
+       free_buffer(vq, buf);
+out:
+       buf->inwork = 0;
+       return ret;
+}
+
+static int mx1_camera_setup_dma(struct mx1_camera_dev *pcdev)
+{
+       struct videobuf_buffer *vbuf = &pcdev->active->vb;
+       int ret;
+
+       if (unlikely(!pcdev->active)) {
+               dev_err(pcdev->dev, "DMA End IRQ with no active buffer\n");
+               return -EFAULT;
+       }
+
+       /* setup sg list for future DMA */
+       ret = imx_dma_setup_single(pcdev->dma_chan,
+               videobuf_to_dma_contig(vbuf),
+               vbuf->size, pcdev->res->start +
+               CSIRXR, DMA_MODE_READ);
+       if (unlikely(ret))
+               dev_err(pcdev->dev, "Failed to setup DMA sg list\n");
+
+       return ret;
+}
+
+static void mx1_videobuf_queue(struct videobuf_queue *vq,
+                                               struct videobuf_buffer *vb)
+{
+       struct soc_camera_device *icd = vq->priv_data;
+       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
+       struct mx1_camera_dev *pcdev = ici->priv;
+       struct mx1_buffer *buf = container_of(vb, struct mx1_buffer, vb);
+       unsigned long flags;
+
+       dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
+               vb, vb->baddr, vb->bsize);
+
+       spin_lock_irqsave(&pcdev->lock, flags);
+
+       list_add_tail(&vb->queue, &pcdev->capture);
+
+       vb->state = VIDEOBUF_ACTIVE;
+
+       if (!pcdev->active) {
+               pcdev->active = buf;
+
+               /* setup sg list for future DMA */
+               if (!mx1_camera_setup_dma(pcdev)) {
+                       unsigned int temp;
+                       /* enable SOF irq */
+                       temp = __raw_readl(pcdev->base + CSICR1) |
+                                                       CSICR1_SOF_INTEN;
+                       __raw_writel(temp, pcdev->base + CSICR1);
+               }
+       }
+
+       spin_unlock_irqrestore(&pcdev->lock, flags);
+}
+
+static void mx1_videobuf_release(struct videobuf_queue *vq,
+                                struct videobuf_buffer *vb)
+{
+       struct mx1_buffer *buf = container_of(vb, struct mx1_buffer, vb);
+#ifdef DEBUG
+       struct soc_camera_device *icd = vq->priv_data;
+
+       dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
+               vb, vb->baddr, vb->bsize);
+
+       switch (vb->state) {
+       case VIDEOBUF_ACTIVE:
+               dev_dbg(&icd->dev, "%s (active)\n", __func__);
+               break;
+       case VIDEOBUF_QUEUED:
+               dev_dbg(&icd->dev, "%s (queued)\n", __func__);
+               break;
+       case VIDEOBUF_PREPARED:
+               dev_dbg(&icd->dev, "%s (prepared)\n", __func__);
+               break;
+       default:
+               dev_dbg(&icd->dev, "%s (unknown)\n", __func__);
+               break;
+       }
+#endif
+
+       free_buffer(vq, buf);
+}
+
+static void mx1_camera_wakeup(struct mx1_camera_dev *pcdev,
+                             struct videobuf_buffer *vb,
+                             struct mx1_buffer *buf)
+{
+       /* _init is used to debug races, see comment in mx1_camera_reqbufs() */
+       list_del_init(&vb->queue);
+       vb->state = VIDEOBUF_DONE;
+       do_gettimeofday(&vb->ts);
+       vb->field_count++;
+       wake_up(&vb->done);
+
+       if (list_empty(&pcdev->capture)) {
+               pcdev->active = NULL;
+               return;
+       }
+
+       pcdev->active = list_entry(pcdev->capture.next,
+                                  struct mx1_buffer, vb.queue);
+
+       /* setup sg list for future DMA */
+       if (likely(!mx1_camera_setup_dma(pcdev))) {
+               unsigned int temp;
+
+               /* enable SOF irq */
+               temp = __raw_readl(pcdev->base + CSICR1) | CSICR1_SOF_INTEN;
+               __raw_writel(temp, pcdev->base + CSICR1);
+       }
+}
+
+static void mx1_camera_dma_irq(int channel, void *data)
+{
+       struct mx1_camera_dev *pcdev = data;
+       struct mx1_buffer *buf;
+       struct videobuf_buffer *vb;
+       unsigned long flags;
+
+       spin_lock_irqsave(&pcdev->lock, flags);
+
+       imx_dma_disable(channel);
+
+       if (unlikely(!pcdev->active)) {
+               dev_err(pcdev->dev, "DMA End IRQ with no active buffer\n");
+               goto out;
+       }
+
+       vb = &pcdev->active->vb;
+       buf = container_of(vb, struct mx1_buffer, vb);
+       WARN_ON(buf->inwork || list_empty(&vb->queue));
+       dev_dbg(pcdev->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
+               vb, vb->baddr, vb->bsize);
+
+       mx1_camera_wakeup(pcdev, vb, buf);
+out:
+       spin_unlock_irqrestore(&pcdev->lock, flags);
+}
+
+static struct videobuf_queue_ops mx1_videobuf_ops = {
+       .buf_setup      = mx1_videobuf_setup,
+       .buf_prepare    = mx1_videobuf_prepare,
+       .buf_queue      = mx1_videobuf_queue,
+       .buf_release    = mx1_videobuf_release,
+};
+
+static void mx1_camera_init_videobuf(struct videobuf_queue *q,
+                                    struct soc_camera_device *icd)
+{
+       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
+       struct mx1_camera_dev *pcdev = ici->priv;
+
+       videobuf_queue_dma_contig_init(q, &mx1_videobuf_ops, pcdev->dev,
+                                       &pcdev->lock,
+                                       V4L2_BUF_TYPE_VIDEO_CAPTURE,
+                                       V4L2_FIELD_NONE,
+                                       sizeof(struct mx1_buffer), icd);
+}
+
+static int mclk_get_divisor(struct mx1_camera_dev *pcdev)
+{
+       unsigned int mclk = pcdev->mclk;
+       unsigned long div;
+       unsigned long lcdclk;
+
+       lcdclk = clk_get_rate(pcdev->clk);
+
+       /* We verify platform_mclk_10khz != 0, so if anyone breaks it, here
+        * they get a nice Oops */
+       div = (lcdclk + 2 * mclk - 1) / (2 * mclk) - 1;
+
+       dev_dbg(pcdev->dev, "System clock %lukHz, target freq %dkHz, "
+               "divisor %lu\n", lcdclk / 1000, mclk / 1000, div);
+
+       return div;
+}
+
+static void mx1_camera_activate(struct mx1_camera_dev *pcdev)
+{
+       unsigned int csicr1 = CSICR1_EN;
+
+       dev_dbg(pcdev->dev, "Activate device\n");
+
+       clk_enable(pcdev->clk);
+
+       /* enable CSI before doing anything else */
+       __raw_writel(csicr1, pcdev->base + CSICR1);
+
+       csicr1 |= CSICR1_MCLKEN | CSICR1_FCC | CSICR1_GCLK_MODE;
+       csicr1 |= CSICR1_MCLKDIV(mclk_get_divisor(pcdev));
+       csicr1 |= CSICR1_RXFF_LEVEL(2); /* 16 words */
+
+       __raw_writel(csicr1, pcdev->base + CSICR1);
+}
+
+static void mx1_camera_deactivate(struct mx1_camera_dev *pcdev)
+{
+       dev_dbg(pcdev->dev, "Deactivate device\n");
+
+       /* Disable all CSI interface */
+       __raw_writel(0x00, pcdev->base + CSICR1);
+
+       clk_disable(pcdev->clk);
+}
+
+/* The following two functions absolutely depend on the fact, that
+ * there can be only one camera on i.MX1/i.MXL camera sensor interface */
+static int mx1_camera_add_device(struct soc_camera_device *icd)
+{
+       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
+       struct mx1_camera_dev *pcdev = ici->priv;
+       int ret;
+
+       if (pcdev->icd) {
+               ret = -EBUSY;
+               goto ebusy;
+       }
+
+       dev_info(&icd->dev, "MX1 Camera driver attached to camera %d\n",
+                icd->devnum);
+
+       mx1_camera_activate(pcdev);
+       ret = icd->ops->init(icd);
+
+       if (!ret)
+               pcdev->icd = icd;
+
+ebusy:
+       return ret;
+}
+
+static void mx1_camera_remove_device(struct soc_camera_device *icd)
+{
+       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
+       struct mx1_camera_dev *pcdev = ici->priv;
+       unsigned int csicr1;
+
+       BUG_ON(icd != pcdev->icd);
+
+       /* disable interrupts */
+       csicr1 = __raw_readl(pcdev->base + CSICR1) & ~CSI_IRQ_MASK;
+       __raw_writel(csicr1, pcdev->base + CSICR1);
+
+       /* Stop DMA engine */
+       imx_dma_disable(pcdev->dma_chan);
+
+       dev_info(&icd->dev, "MX1 Camera driver detached from camera %d\n",
+                icd->devnum);
+
+       icd->ops->release(icd);
+
+       mx1_camera_deactivate(pcdev);
+
+       pcdev->icd = NULL;
+}
+
+static int mx1_camera_set_crop(struct soc_camera_device *icd,
+                              struct v4l2_rect *rect)
+{
+       return icd->ops->set_crop(icd, rect);
+}
+
+static int mx1_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt)
+{
+       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
+       struct mx1_camera_dev *pcdev = ici->priv;
+       unsigned long camera_flags, common_flags;
+       unsigned int csicr1;
+       int ret;
+
+       camera_flags = icd->ops->query_bus_param(icd);
+
+       /* MX1 supports only 8bit buswidth */
+       common_flags = soc_camera_bus_param_compatible(camera_flags,
+                                                              CSI_BUS_FLAGS);
+       if (!common_flags)
+               return -EINVAL;
+
+       icd->buswidth = 8;
+
+       /* Make choises, based on platform choice */
+       if ((common_flags & SOCAM_VSYNC_ACTIVE_HIGH) &&
+               (common_flags & SOCAM_VSYNC_ACTIVE_LOW)) {
+                       if (!pcdev->pdata ||
+                            pcdev->pdata->flags & MX1_CAMERA_VSYNC_HIGH)
+                               common_flags &= ~SOCAM_VSYNC_ACTIVE_LOW;
+                       else
+                               common_flags &= ~SOCAM_VSYNC_ACTIVE_HIGH;
+       }
+
+       if ((common_flags & SOCAM_PCLK_SAMPLE_RISING) &&
+               (common_flags & SOCAM_PCLK_SAMPLE_FALLING)) {
+                       if (!pcdev->pdata ||
+                            pcdev->pdata->flags & MX1_CAMERA_PCLK_RISING)
+                               common_flags &= ~SOCAM_PCLK_SAMPLE_FALLING;
+                       else
+                               common_flags &= ~SOCAM_PCLK_SAMPLE_RISING;
+       }
+
+       if ((common_flags & SOCAM_DATA_ACTIVE_HIGH) &&
+               (common_flags & SOCAM_DATA_ACTIVE_LOW)) {
+                       if (!pcdev->pdata ||
+                            pcdev->pdata->flags & MX1_CAMERA_DATA_HIGH)
+                               common_flags &= ~SOCAM_DATA_ACTIVE_LOW;
+                       else
+                               common_flags &= ~SOCAM_DATA_ACTIVE_HIGH;
+       }
+
+       ret = icd->ops->set_bus_param(icd, common_flags);
+       if (ret < 0)
+               return ret;
+
+       csicr1 = __raw_readl(pcdev->base + CSICR1);
+
+       if (common_flags & SOCAM_PCLK_SAMPLE_RISING)
+               csicr1 |= CSICR1_REDGE;
+       if (common_flags & SOCAM_VSYNC_ACTIVE_HIGH)
+               csicr1 |= CSICR1_SOF_POL;
+       if (common_flags & SOCAM_DATA_ACTIVE_LOW)
+               csicr1 |= CSICR1_DATA_POL;
+
+       __raw_writel(csicr1, pcdev->base + CSICR1);
+
+       return 0;
+}
+
+static int mx1_camera_set_fmt(struct soc_camera_device *icd,
+                             struct v4l2_format *f)
+{
+       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
+       const struct soc_camera_format_xlate *xlate;
+       struct v4l2_pix_format *pix = &f->fmt.pix;
+       int ret;
+
+       xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat);
+       if (!xlate) {
+               dev_warn(&ici->dev, "Format %x not found\n", pix->pixelformat);
+               return -EINVAL;
+       }
+
+       ret = icd->ops->set_fmt(icd, f);
+       if (!ret) {
+               icd->buswidth = xlate->buswidth;
+               icd->current_fmt = xlate->host_fmt;
+       }
+
+       return ret;
+}
+
+static int mx1_camera_try_fmt(struct soc_camera_device *icd,
+                             struct v4l2_format *f)
+{
+       /* TODO: limit to mx1 hardware capabilities */
+
+       /* limit to sensor capabilities */
+       return icd->ops->try_fmt(icd, f);
+}
+
+static int mx1_camera_reqbufs(struct soc_camera_file *icf,
+                             struct v4l2_requestbuffers *p)
+{
+       int i;
+
+       /* This is for locking debugging only. I removed spinlocks and now I
+        * check whether .prepare is ever called on a linked buffer, or whether
+        * a dma IRQ can occur for an in-work or unlinked buffer. Until now
+        * it hadn't triggered */
+       for (i = 0; i < p->count; i++) {
+               struct mx1_buffer *buf = container_of(icf->vb_vidq.bufs[i],
+                                                     struct mx1_buffer, vb);
+               buf->inwork = 0;
+               INIT_LIST_HEAD(&buf->vb.queue);
+       }
+
+       return 0;
+}
+
+static unsigned int mx1_camera_poll(struct file *file, poll_table *pt)
+{
+       struct soc_camera_file *icf = file->private_data;
+       struct mx1_buffer *buf;
+
+       buf = list_entry(icf->vb_vidq.stream.next, struct mx1_buffer,
+                        vb.stream);
+
+       poll_wait(file, &buf->vb.done, pt);
+
+       if (buf->vb.state == VIDEOBUF_DONE ||
+           buf->vb.state == VIDEOBUF_ERROR)
+               return POLLIN | POLLRDNORM;
+
+       return 0;
+}
+
+static int mx1_camera_querycap(struct soc_camera_host *ici,
+                              struct v4l2_capability *cap)
+{
+       /* cap->name is set by the friendly caller:-> */
+       strlcpy(cap->card, "i.MX1/i.MXL Camera", sizeof(cap->card));
+       cap->version = VERSION_CODE;
+       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
+
+       return 0;
+}
+
+static struct soc_camera_host_ops mx1_soc_camera_host_ops = {
+       .owner          = THIS_MODULE,
+       .add            = mx1_camera_add_device,
+       .remove         = mx1_camera_remove_device,
+       .set_bus_param  = mx1_camera_set_bus_param,
+       .set_crop       = mx1_camera_set_crop,
+       .set_fmt        = mx1_camera_set_fmt,
+       .try_fmt        = mx1_camera_try_fmt,
+       .init_videobuf  = mx1_camera_init_videobuf,
+       .reqbufs        = mx1_camera_reqbufs,
+       .poll           = mx1_camera_poll,
+       .querycap       = mx1_camera_querycap,
+};
+
+/* Should be allocated dynamically too, but we have only one. */
+static struct soc_camera_host mx1_soc_camera_host = {
+       .drv_name       = DRIVER_NAME,
+       .ops            = &mx1_soc_camera_host_ops,
+};
+
+static struct fiq_handler fh = {
+       .name           = "csi_sof"
+};
+
+static int __init mx1_camera_probe(struct platform_device *pdev)
+{
+       struct mx1_camera_dev *pcdev;
+       struct resource *res;
+       struct pt_regs regs;
+       struct clk *clk;
+       void __iomem *base;
+       unsigned int irq;
+       int err = 0;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       irq = platform_get_irq(pdev, 0);
+       if (!res || !irq) {
+               err = -ENODEV;
+               goto exit;
+       }
+
+       clk = clk_get(&pdev->dev, "csi_clk");
+       if (IS_ERR(clk)) {
+               err = PTR_ERR(clk);
+               goto exit;
+       }
+
+       pcdev = kzalloc(sizeof(*pcdev), GFP_KERNEL);
+       if (!pcdev) {
+               dev_err(&pdev->dev, "Could not allocate pcdev\n");
+               err = -ENOMEM;
+               goto exit_put_clk;
+       }
+
+       dev_set_drvdata(&pdev->dev, pcdev);
+       pcdev->res = res;
+       pcdev->clk = clk;
+
+       pcdev->pdata = pdev->dev.platform_data;
+
+       if (pcdev->pdata)
+               pcdev->mclk = pcdev->pdata->mclk_10khz * 10000;
+
+       if (!pcdev->mclk) {
+               dev_warn(&pdev->dev,
+                        "mclk_10khz == 0! Please, fix your platform data. "
+                        "Using default 20MHz\n");
+               pcdev->mclk = 20000000;
+       }
+
+       INIT_LIST_HEAD(&pcdev->capture);
+       spin_lock_init(&pcdev->lock);
+
+       /*
+        * Request the regions.
+        */
+       if (!request_mem_region(res->start, resource_size(res), DRIVER_NAME)) {
+               err = -EBUSY;
+               goto exit_kfree;
+       }
+
+       base = ioremap(res->start, resource_size(res));
+       if (!base) {
+               err = -ENOMEM;
+               goto exit_release;
+       }
+       pcdev->irq = irq;
+       pcdev->base = base;
+       pcdev->dev = &pdev->dev;
+
+       /* request dma */
+       pcdev->dma_chan = imx_dma_request_by_prio(DRIVER_NAME, DMA_PRIO_HIGH);
+       if (pcdev->dma_chan < 0) {
+               dev_err(pcdev->dev, "Can't request DMA for MX1 CSI\n");
+               err = -EBUSY;
+               goto exit_iounmap;
+       }
+       dev_dbg(pcdev->dev, "got DMA channel %d\n", pcdev->dma_chan);
+
+       imx_dma_setup_handlers(pcdev->dma_chan, mx1_camera_dma_irq, NULL,
+                              pcdev);
+
+       imx_dma_config_channel(pcdev->dma_chan, IMX_DMA_TYPE_FIFO,
+                              IMX_DMA_MEMSIZE_32, DMA_REQ_CSI_R, 0);
+       /* burst length : 16 words = 64 bytes */
+       imx_dma_config_burstlen(pcdev->dma_chan, 0);
+
+       /* request irq */
+       err = claim_fiq(&fh);
+       if (err) {
+               dev_err(pcdev->dev, "Camera interrupt register failed \n");
+               goto exit_free_dma;
+       }
+
+       set_fiq_handler(&mx1_camera_sof_fiq_start, &mx1_camera_sof_fiq_end -
+                                                  &mx1_camera_sof_fiq_start);
+
+       regs.ARM_r8 = DMA_BASE + DMA_DIMR;
+       regs.ARM_r9 = DMA_BASE + DMA_CCR(pcdev->dma_chan);
+       regs.ARM_r10 = (long)pcdev->base + CSICR1;
+       regs.ARM_fp = (long)pcdev->base + CSISR;
+       regs.ARM_sp = 1 << pcdev->dma_chan;
+       set_fiq_regs(&regs);
+
+       mxc_set_irq_fiq(irq, 1);
+       enable_fiq(irq);
+
+       mx1_soc_camera_host.priv        = pcdev;
+       mx1_soc_camera_host.dev.parent  = &pdev->dev;
+       mx1_soc_camera_host.nr          = pdev->id;
+       err = soc_camera_host_register(&mx1_soc_camera_host);
+       if (err)
+               goto exit_free_irq;
+
+       dev_info(&pdev->dev, "MX1 Camera driver loaded\n");
+
+       return 0;
+
+exit_free_irq:
+       disable_fiq(irq);
+       mxc_set_irq_fiq(irq, 0);
+       release_fiq(&fh);
+exit_free_dma:
+       imx_dma_free(pcdev->dma_chan);
+exit_iounmap:
+       iounmap(base);
+exit_release:
+       release_mem_region(res->start, resource_size(res));
+exit_kfree:
+       kfree(pcdev);
+exit_put_clk:
+       clk_put(clk);
+exit:
+       return err;
+}
+
+static int __exit mx1_camera_remove(struct platform_device *pdev)
+{
+       struct mx1_camera_dev *pcdev = platform_get_drvdata(pdev);
+       struct resource *res;
+
+       imx_dma_free(pcdev->dma_chan);
+       disable_fiq(pcdev->irq);
+       mxc_set_irq_fiq(pcdev->irq, 0);
+       release_fiq(&fh);
+
+       clk_put(pcdev->clk);
+
+       soc_camera_host_unregister(&mx1_soc_camera_host);
+
+       iounmap(pcdev->base);
+
+       res = pcdev->res;
+       release_mem_region(res->start, resource_size(res));
+
+       kfree(pcdev);
+
+       dev_info(&pdev->dev, "MX1 Camera driver unloaded\n");
+
+       return 0;
+}
+
+static struct platform_driver mx1_camera_driver = {
+       .driver         = {
+               .name   = DRIVER_NAME,
+       },
+       .remove         = __exit_p(mx1_camera_remove),
+};
+
+static int __init mx1_camera_init(void)
+{
+       return platform_driver_probe(&mx1_camera_driver, mx1_camera_probe);
+}
+
+static void __exit mx1_camera_exit(void)
+{
+       return platform_driver_unregister(&mx1_camera_driver);
+}
+
+module_init(mx1_camera_init);
+module_exit(mx1_camera_exit);
+
+MODULE_DESCRIPTION("i.MX1/i.MXL SoC Camera Host driver");
+MODULE_AUTHOR("Paulius Zaleckas <paulius.zaleckas@teltonika.lt>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRIVER_NAME);
index 70629e172e656da4be417c12029666baf81f584c..c462b811e99425b0e4fef4afb35e23414c169421 100644 (file)
@@ -1100,7 +1100,7 @@ static int mx3_camera_probe(struct platform_device *pdev)
        }
        memset(mx3_cam, 0, sizeof(*mx3_cam));
 
-       mx3_cam->clk = clk_get(&pdev->dev, "csi_clk");
+       mx3_cam->clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(mx3_cam->clk)) {
                err = PTR_ERR(mx3_cam->clk);
                goto eclkget;
index 84aec62e84527675d8706596967fb2d14a8e7224..3be5a71bdac284b5ccc866bd1d6eff39f4dc0246 100644 (file)
@@ -83,9 +83,14 @@ static struct {
 static int video_audio_connect[MXB_INPUTS] =
        { 0, 1, 3, 3 };
 
+struct mxb_routing {
+       u32 input;
+       u32 output;
+};
+
 /* These are the necessary input-output-pins for bringing one audio source
    (see above) to the CD-output. Note that gain is set to 0 in this table. */
-static struct v4l2_routing TEA6420_cd[MXB_AUDIOS + 1][2] = {
+static struct mxb_routing TEA6420_cd[MXB_AUDIOS + 1][2] = {
        { { 1, 1 }, { 1, 1 } }, /* Tuner */
        { { 5, 1 }, { 6, 1 } }, /* AUX 1 */
        { { 4, 1 }, { 6, 1 } }, /* AUX 2 */
@@ -97,7 +102,7 @@ static struct v4l2_routing TEA6420_cd[MXB_AUDIOS + 1][2] = {
 
 /* These are the necessary input-output-pins for bringing one audio source
    (see above) to the line-output. Note that gain is set to 0 in this table. */
-static struct v4l2_routing TEA6420_line[MXB_AUDIOS + 1][2] = {
+static struct mxb_routing TEA6420_line[MXB_AUDIOS + 1][2] = {
        { { 2, 3 }, { 1, 2 } },
        { { 5, 3 }, { 6, 2 } },
        { { 4, 3 }, { 6, 2 } },
@@ -134,10 +139,6 @@ struct mxb
 
 #define saa7111a_call(mxb, o, f, args...) \
        v4l2_subdev_call(mxb->saa7111a, o, f, ##args)
-#define tea6420_1_call(mxb, o, f, args...) \
-       v4l2_subdev_call(mxb->tea6420_1, o, f, ##args)
-#define tea6420_2_call(mxb, o, f, args...) \
-       v4l2_subdev_call(mxb->tea6420_2, o, f, ##args)
 #define tda9840_call(mxb, o, f, args...) \
        v4l2_subdev_call(mxb->tda9840, o, f, ##args)
 #define tea6415c_call(mxb, o, f, args...) \
@@ -147,6 +148,22 @@ struct mxb
 #define call_all(dev, o, f, args...) \
        v4l2_device_call_until_err(&dev->v4l2_dev, 0, o, f, ##args)
 
+static inline void tea6420_route_cd(struct mxb *mxb, int idx)
+{
+       v4l2_subdev_call(mxb->tea6420_1, audio, s_routing,
+               TEA6420_cd[idx][0].input, TEA6420_cd[idx][0].output, 0);
+       v4l2_subdev_call(mxb->tea6420_2, audio, s_routing,
+               TEA6420_cd[idx][1].input, TEA6420_cd[idx][1].output, 0);
+}
+
+static inline void tea6420_route_line(struct mxb *mxb, int idx)
+{
+       v4l2_subdev_call(mxb->tea6420_1, audio, s_routing,
+               TEA6420_line[idx][0].input, TEA6420_line[idx][0].output, 0);
+       v4l2_subdev_call(mxb->tea6420_2, audio, s_routing,
+               TEA6420_line[idx][1].input, TEA6420_line[idx][1].output, 0);
+}
+
 static struct saa7146_extension extension;
 
 static int mxb_probe(struct saa7146_dev *dev)
@@ -168,13 +185,20 @@ static int mxb_probe(struct saa7146_dev *dev)
                return -EFAULT;
        }
 
-       mxb->saa7111a = v4l2_i2c_new_subdev(&mxb->i2c_adapter, "saa7115", "saa7111", I2C_SAA7111A);
-       mxb->tea6420_1 = v4l2_i2c_new_subdev(&mxb->i2c_adapter, "tea6420", "tea6420", I2C_TEA6420_1);
-       mxb->tea6420_2 = v4l2_i2c_new_subdev(&mxb->i2c_adapter, "tea6420", "tea6420", I2C_TEA6420_2);
-       mxb->tea6415c = v4l2_i2c_new_subdev(&mxb->i2c_adapter, "tea6415c", "tea6415c", I2C_TEA6415C);
-       mxb->tda9840 = v4l2_i2c_new_subdev(&mxb->i2c_adapter, "tda9840", "tda9840", I2C_TDA9840);
-       mxb->tuner = v4l2_i2c_new_subdev(&mxb->i2c_adapter, "tuner", "tuner", I2C_TUNER);
-       if (v4l2_i2c_new_subdev(&mxb->i2c_adapter, "saa5246a", "saa5246a", I2C_SAA5246A)) {
+       mxb->saa7111a = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
+                       "saa7115", "saa7111", I2C_SAA7111A);
+       mxb->tea6420_1 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
+                       "tea6420", "tea6420", I2C_TEA6420_1);
+       mxb->tea6420_2 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
+                       "tea6420", "tea6420", I2C_TEA6420_2);
+       mxb->tea6415c = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
+                       "tea6415c", "tea6415c", I2C_TEA6415C);
+       mxb->tda9840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
+                       "tda9840", "tda9840", I2C_TDA9840);
+       mxb->tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
+                       "tuner", "tuner", I2C_TUNER);
+       if (v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
+                       "saa5246a", "saa5246a", I2C_SAA5246A)) {
                printk(KERN_INFO "mxb: found teletext decoder\n");
        }
 
@@ -261,18 +285,16 @@ static int mxb_init_done(struct saa7146_dev* dev)
        struct i2c_msg msg;
        struct tuner_setup tun_setup;
        v4l2_std_id std = V4L2_STD_PAL_BG;
-       struct v4l2_routing route;
 
        int i = 0, err = 0;
 
        /* select video mode in saa7111a */
-       saa7111a_call(mxb, tuner, s_std, std);
+       saa7111a_call(mxb, core, s_std, std);
 
        /* select tuner-output on saa7111a */
        i = 0;
-       route.input = SAA7115_COMPOSITE0;
-       route.output = SAA7111_FMT_CCIR | SAA7111_VBI_BYPASS;
-       saa7111a_call(mxb, video, s_routing, &route);
+       saa7111a_call(mxb, video, s_routing, SAA7115_COMPOSITE0,
+               SAA7111_FMT_CCIR | SAA7111_VBI_BYPASS, 0);
 
        /* select a tuner type */
        tun_setup.mode_mask = T_ANALOG_TV;
@@ -286,23 +308,17 @@ static int mxb_init_done(struct saa7146_dev* dev)
        tuner_call(mxb, tuner, s_frequency, &mxb->cur_freq);
 
        /* set a default video standard */
-       tuner_call(mxb, tuner, s_std, std);
+       tuner_call(mxb, core, s_std, std);
 
        /* mute audio on tea6420s */
-       tea6420_1_call(mxb, audio, s_routing, &TEA6420_line[6][0]);
-       tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[6][1]);
-       tea6420_1_call(mxb, audio, s_routing, &TEA6420_line[6][0]);
-       tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[6][1]);
+       tea6420_route_line(mxb, 6);
+       tea6420_route_cd(mxb, 6);
 
        /* switch to tuner-channel on tea6415c */
-       route.input = 3;
-       route.output = 17;
-       tea6415c_call(mxb, video, s_routing, &route);
+       tea6415c_call(mxb, video, s_routing, 3, 17, 0);
 
        /* select tuner-output on multicable on tea6415c */
-       route.input = 3;
-       route.output = 13;
-       tea6415c_call(mxb, video, s_routing, &route);
+       tea6415c_call(mxb, video, s_routing, 3, 13, 0);
 
        /* the rest for mxb */
        mxb->cur_input = 0;
@@ -426,18 +442,9 @@ static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *vc)
 
        if (vc->id == V4L2_CID_AUDIO_MUTE) {
                mxb->cur_mute = vc->value;
-               if (!vc->value) {
-                       /* switch the audio-source */
-                       tea6420_1_call(mxb, audio, s_routing,
-                                       &TEA6420_line[video_audio_connect[mxb->cur_input]][0]);
-                       tea6420_2_call(mxb, audio, s_routing,
-                                       &TEA6420_line[video_audio_connect[mxb->cur_input]][1]);
-               } else {
-                       tea6420_1_call(mxb, audio, s_routing,
-                                       &TEA6420_line[6][0]);
-                       tea6420_2_call(mxb, audio, s_routing,
-                                       &TEA6420_line[6][1]);
-               }
+               /* switch the audio-source */
+               tea6420_route_line(mxb, vc->value ? 6 :
+                               video_audio_connect[mxb->cur_input]);
                DEB_EE(("VIDIOC_S_CTRL, V4L2_CID_AUDIO_MUTE: %d.\n", vc->value));
        }
        return 0;
@@ -466,7 +473,7 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
 {
        struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
        struct mxb *mxb = (struct mxb *)dev->ext_priv;
-       struct v4l2_routing route;
+       int err = 0;
        int i = 0;
 
        DEB_EE(("VIDIOC_S_INPUT %d.\n", input));
@@ -484,16 +491,12 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
        switch (input) {
        case TUNER:
                i = SAA7115_COMPOSITE0;
-               route.input = 3;
-               route.output = 17;
 
-               if (tea6415c_call(mxb, video, s_routing, &route)) {
-                       printk(KERN_ERR "VIDIOC_S_INPUT: could not address tea6415c #1\n");
-                       return -EFAULT;
-               }
+               err = tea6415c_call(mxb, video, s_routing, 3, 17, 0);
+
                /* connect tuner-output always to multicable */
-               route.input = 3;
-               route.output = 13;
+               if (!err)
+                       err = tea6415c_call(mxb, video, s_routing, 3, 13, 0);
                break;
        case AUX3_YC:
                /* nothing to be done here. aux3_yc is
@@ -507,37 +510,20 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
                break;
        case AUX1:
                i = SAA7115_COMPOSITE0;
-               route.input = 1;
-               route.output = 17;
+               err = tea6415c_call(mxb, video, s_routing, 1, 17, 0);
                break;
        }
 
-       /* switch video in tea6415c only if necessary */
-       switch (input) {
-       case TUNER:
-       case AUX1:
-               if (tea6415c_call(mxb, video, s_routing, &route)) {
-                       printk(KERN_ERR "VIDIOC_S_INPUT: could not address tea6415c #3\n");
-                       return -EFAULT;
-               }
-               break;
-       default:
-               break;
-       }
+       if (err)
+               return err;
 
        /* switch video in saa7111a */
-       route.input = i;
-       route.output = 0;
-       if (saa7111a_call(mxb, video, s_routing, &route))
+       if (saa7111a_call(mxb, video, s_routing, i, 0, 0))
                printk(KERN_ERR "VIDIOC_S_INPUT: could not address saa7111a #1.\n");
 
        /* switch the audio-source only if necessary */
-       if (0 == mxb->cur_mute) {
-               tea6420_1_call(mxb, audio, s_routing,
-                               &TEA6420_line[video_audio_connect[input]][0]);
-               tea6420_2_call(mxb, audio, s_routing,
-                               &TEA6420_line[video_audio_connect[input]][1]);
-       }
+       if (0 == mxb->cur_mute)
+               tea6420_route_line(mxb, video_audio_connect[input]);
 
        return 0;
 }
@@ -679,9 +665,7 @@ static long vidioc_default(struct file *file, void *fh, int cmd, void *arg)
 
                DEB_EE(("MXB_S_AUDIO_CD: i:%d.\n", i));
 
-               tea6420_1_call(mxb, audio, s_routing, &TEA6420_cd[i][0]);
-               tea6420_2_call(mxb, audio, s_routing, &TEA6420_cd[i][1]);
-
+               tea6420_route_cd(mxb, i);
                return 0;
        }
        case MXB_S_AUDIO_LINE:
@@ -694,9 +678,7 @@ static long vidioc_default(struct file *file, void *fh, int cmd, void *arg)
                }
 
                DEB_EE(("MXB_S_AUDIO_LINE: i:%d.\n", i));
-               tea6420_1_call(mxb, audio, s_routing, &TEA6420_line[i][0]);
-               tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[i][1]);
-
+               tea6420_route_line(mxb, i);
                return 0;
        }
        default:
@@ -788,7 +770,7 @@ static int std_callback(struct saa7146_dev *dev, struct saa7146_standard *standa
                saa7146_write(dev, GPIO_CTRL, 0x00404050);
                /* unset the 7111 gpio register -- I don't know what this does exactly */
                saa7111a_call(mxb, core, s_gpio, 0);
-               tuner_call(mxb, tuner, s_std, std);
+               tuner_call(mxb, core, s_std, std);
        } else {
                v4l2_std_id std = V4L2_STD_PAL_BG;
 
@@ -797,7 +779,7 @@ static int std_callback(struct saa7146_dev *dev, struct saa7146_standard *standa
                saa7146_write(dev, GPIO_CTRL, 0x00404050);
                /* set the 7111 gpio register -- I don't know what this does exactly */
                saa7111a_call(mxb, core, s_gpio, 1);
-               tuner_call(mxb, tuner, s_std, std);
+               tuner_call(mxb, core, s_std, std);
        }
        return 0;
 }
index 84b0fc1bb23712874205063d4eff38eb63629de5..c0d911252862935b80a5a9215aff0a67ab55d5c8 100644 (file)
 #define GAM15       0x8C /* Gamma Curve 15th segment input end point */
 #define SLOP        0x8D /* Gamma curve highest segment slope */
 #define DNSTH       0x8E /* De-noise threshold */
-#define EDGE0       0x8F /* Edge enhancement control 0 */
-#define EDGE1       0x90 /* Edge enhancement control 1 */
+#define EDGE_STRNGT 0x8F /* Edge strength  control when manual mode */
+#define EDGE_TRSHLD 0x90 /* Edge threshold control when manual mode */
 #define DNSOFF      0x91 /* Auto De-noise threshold control */
-#define EDGE2       0x92 /* Edge enhancement strength low  point control */
-#define EDGE3       0x93 /* Edge enhancement strength high point control */
+#define EDGE_UPPER  0x92 /* Edge strength upper limit when Auto mode */
+#define EDGE_LOWER  0x93 /* Edge strength lower limit when Auto mode */
 #define MTX1        0x94 /* Matrix coefficient 1 */
 #define MTX2        0x95 /* Matrix coefficient 2 */
 #define MTX3        0x96 /* Matrix coefficient 3 */
 #define VOSZ_VGA        0xF0
 #define VOSZ_QVGA       0x78
 
+/* DSPAUTO (DSP Auto Function ON/OFF Control) */
+#define AWB_ACTRL       0x80 /* AWB auto threshold control */
+#define DENOISE_ACTRL   0x40 /* De-noise auto threshold control */
+#define EDGE_ACTRL      0x20 /* Edge enhancement auto strength control */
+#define UV_ACTRL        0x10 /* UV adjust auto slope control */
+#define SCAL0_ACTRL     0x08 /* Auto scaling factor control */
+#define SCAL1_2_ACTRL   0x04 /* Auto scaling factor control */
+
 /*
  * ID
  */
@@ -670,7 +678,7 @@ static int ov772x_set_bus_param(struct soc_camera_device *icd,
 static unsigned long ov772x_query_bus_param(struct soc_camera_device *icd)
 {
        struct ov772x_priv *priv = container_of(icd, struct ov772x_priv, icd);
-       struct soc_camera_link *icl = priv->client->dev.platform_data;
+       struct soc_camera_link *icl = &priv->info->link;
        unsigned long flags = SOCAM_PCLK_SAMPLE_RISING | SOCAM_MASTER |
                SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_HSYNC_ACTIVE_HIGH |
                SOCAM_DATA_ACTIVE_HIGH | priv->info->buswidth;
@@ -815,6 +823,53 @@ static int ov772x_set_params(struct ov772x_priv *priv, u32 width, u32 height,
         */
        ov772x_reset(priv->client);
 
+       /*
+        * Edge Ctrl
+        */
+       if (priv->info->edgectrl.strength & OV772X_MANUAL_EDGE_CTRL) {
+
+               /*
+                * Manual Edge Control Mode
+                *
+                * Edge auto strength bit is set by default.
+                * Remove it when manual mode.
+                */
+
+               ret = ov772x_mask_set(priv->client, DSPAUTO, EDGE_ACTRL, 0x00);
+               if (ret < 0)
+                       goto ov772x_set_fmt_error;
+
+               ret = ov772x_mask_set(priv->client,
+                                     EDGE_TRSHLD, EDGE_THRESHOLD_MASK,
+                                     priv->info->edgectrl.threshold);
+               if (ret < 0)
+                       goto ov772x_set_fmt_error;
+
+               ret = ov772x_mask_set(priv->client,
+                                     EDGE_STRNGT, EDGE_STRENGTH_MASK,
+                                     priv->info->edgectrl.strength);
+               if (ret < 0)
+                       goto ov772x_set_fmt_error;
+
+       } else if (priv->info->edgectrl.upper > priv->info->edgectrl.lower) {
+               /*
+                * Auto Edge Control Mode
+                *
+                * set upper and lower limit
+                */
+               ret = ov772x_mask_set(priv->client,
+                                     EDGE_UPPER, EDGE_UPPER_MASK,
+                                     priv->info->edgectrl.upper);
+               if (ret < 0)
+                       goto ov772x_set_fmt_error;
+
+               ret = ov772x_mask_set(priv->client,
+                                     EDGE_LOWER, EDGE_LOWER_MASK,
+                                     priv->info->edgectrl.lower);
+               if (ret < 0)
+                       goto ov772x_set_fmt_error;
+       }
+
        /*
         * set size format
         */
index ccf2a3c7ad068ac218e75f1c6235c187028555fe..10ef1a2c13eac39adbff08bed37d1c4daa0390e6 100644 (file)
@@ -58,9 +58,9 @@ static const struct routing_scheme routing_schemes[] = {
 void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
 {
        if (hdw->input_dirty || hdw->force_dirty) {
-               struct v4l2_routing route;
                const struct routing_scheme *sp;
                unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
+               u32 input;
 
                pvr2_trace(PVR2_TRACE_CHIPS, "subdev msp3400 v4l2 set_stereo");
 
@@ -68,7 +68,7 @@ void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
                    ((sp = routing_schemes + sid) != NULL) &&
                    (hdw->input_val >= 0) &&
                    (hdw->input_val < sp->cnt)) {
-                       route.input = sp->def[hdw->input_val];
+                       input = sp->def[hdw->input_val];
                } else {
                        pvr2_trace(PVR2_TRACE_ERROR_LEGS,
                                   "*** WARNING *** subdev msp3400 set_input:"
@@ -77,8 +77,8 @@ void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
                                   sid, hdw->input_val);
                        return;
                }
-               route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
-               sd->ops->audio->s_routing(sd, &route);
+               sd->ops->audio->s_routing(sd, input,
+                       MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0);
        }
 }
 
index b5c3428ebb9fdb3addd03cd8fdd2abbf45ce1b15..9023adf3fdcc5f587e64db693d683e65703e895c 100644 (file)
@@ -60,16 +60,16 @@ static const struct routing_scheme routing_schemes[] = {
 void pvr2_cs53l32a_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
 {
        if (hdw->input_dirty || hdw->force_dirty) {
-               struct v4l2_routing route;
                const struct routing_scheme *sp;
                unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
+               u32 input;
                pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_input(%d)",
                           hdw->input_val);
                if ((sid < ARRAY_SIZE(routing_schemes)) &&
                    ((sp = routing_schemes + sid) != NULL) &&
                    (hdw->input_val >= 0) &&
                    (hdw->input_val < sp->cnt)) {
-                       route.input = sp->def[hdw->input_val];
+                       input = sp->def[hdw->input_val];
                } else {
                        pvr2_trace(PVR2_TRACE_ERROR_LEGS,
                                   "*** WARNING *** subdev v4l2 set_input:"
@@ -78,8 +78,7 @@ void pvr2_cs53l32a_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
                                   sid, hdw->input_val);
                        return;
                }
-               route.output = 0;
-               sd->ops->audio->s_routing(sd, &route);
+               sd->ops->audio->s_routing(sd, input, 0, 0);
        }
 }
 
index 203f54cd18a16ac164e151166743b3a45327a95a..1b992b847198a486bc0eb62342d3d1b020c99919 100644 (file)
@@ -137,14 +137,12 @@ int pvr2_ctrl_get_min(struct pvr2_ctrl *cptr)
 int pvr2_ctrl_get_def(struct pvr2_ctrl *cptr, int *valptr)
 {
        int ret = 0;
-       if (!cptr) return 0;
+       if (!cptr) return -EINVAL;
        LOCK_TAKE(cptr->hdw->big_lock); do {
-               if (cptr->info->type == pvr2_ctl_int) {
-                       if (cptr->info->get_def_value) {
-                               ret = cptr->info->get_def_value(cptr, valptr);
-                       } else {
-                               *valptr = cptr->info->default_value;
-                       }
+               if (cptr->info->get_def_value) {
+                       ret = cptr->info->get_def_value(cptr, valptr);
+               } else {
+                       *valptr = cptr->info->default_value;
                }
        } while(0); LOCK_GIVE(cptr->hdw->big_lock);
        return ret;
index 4e017ff26c368e7a011c487debdb1cdbd96e367b..05e52358ae495a121c94c6722e8f536b5d418eb4 100644 (file)
@@ -105,14 +105,11 @@ void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
 {
        pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x update...");
        if (hdw->input_dirty || hdw->force_dirty) {
-               struct v4l2_routing route;
                enum cx25840_video_input vid_input;
                enum cx25840_audio_input aud_input;
                const struct routing_scheme *sp;
                unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
 
-               memset(&route, 0, sizeof(route));
-
                if ((sid < ARRAY_SIZE(routing_schemes)) &&
                    ((sp = routing_schemes + sid) != NULL) &&
                    (hdw->input_val >= 0) &&
@@ -131,10 +128,8 @@ void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
                pvr2_trace(PVR2_TRACE_CHIPS,
                           "subdev cx2584x set_input vid=0x%x aud=0x%x",
                           vid_input, aud_input);
-               route.input = (u32)vid_input;
-               sd->ops->video->s_routing(sd, &route);
-               route.input = (u32)aud_input;
-               sd->ops->audio->s_routing(sd, &route);
+               sd->ops->video->s_routing(sd, (u32)vid_input, 0, 0);
+               sd->ops->audio->s_routing(sd, (u32)aud_input, 0, 0);
        }
 }
 
index 7a65b42a4f53571abdba88c11d36bd83c7fad011..d9d974a8f52a4c5f2e761123eeb1d076cbf3651c 100644 (file)
@@ -2039,7 +2039,7 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
                           "Module ID %u:"
                           " Setting up with specified i2c address 0x%x",
                           mid, i2caddr[0]);
-               sd = v4l2_i2c_new_subdev(&hdw->i2c_adap,
+               sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
                                         fname, fname,
                                         i2caddr[0]);
        } else {
@@ -2047,7 +2047,7 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
                           "Module ID %u:"
                           " Setting up with address probe list",
                           mid);
-               sd = v4l2_i2c_new_probed_subdev(&hdw->i2c_adap,
+               sd = v4l2_i2c_new_probed_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
                                                fname, fname,
                                                i2caddr);
        }
@@ -2185,7 +2185,7 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
        pvr2_hdw_load_modules(hdw);
        if (!pvr2_hdw_dev_ok(hdw)) return;
 
-       v4l2_device_call_all(&hdw->v4l2_dev, 0, core, init, 0);
+       v4l2_device_call_all(&hdw->v4l2_dev, 0, core, load_fw);
 
        for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
                cptr = hdw->controls + idx;
@@ -2574,7 +2574,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
        hdw->ctl_read_urb = usb_alloc_urb(0,GFP_KERNEL);
        if (!hdw->ctl_read_urb) goto fail;
 
-       if (v4l2_device_register(&usb_dev->dev, &hdw->v4l2_dev) != 0) {
+       if (v4l2_device_register(&intf->dev, &hdw->v4l2_dev) != 0) {
                pvr2_trace(PVR2_TRACE_ERROR_LEGS,
                           "Error registering with v4l core, giving up");
                goto fail;
@@ -2926,6 +2926,7 @@ static void pvr2_subdev_update(struct pvr2_hdw *hdw)
                pvr2_trace(PVR2_TRACE_CHIPS, "subdev tuner set_type(%d)",
                           hdw->tuner_type);
                if (((int)(hdw->tuner_type)) >= 0) {
+                       memset(&setup, 0, sizeof(setup));
                        setup.addr = ADDR_UNSET;
                        setup.type = hdw->tuner_type;
                        setup.mode_mask = T_RADIO | T_ANALOG_TV;
@@ -2943,7 +2944,7 @@ static void pvr2_subdev_update(struct pvr2_hdw *hdw)
                        v4l2_std_id vs;
                        vs = hdw->std_mask_cur;
                        v4l2_device_call_all(&hdw->v4l2_dev, 0,
-                                            tuner, s_std, vs);
+                                            core, s_std, vs);
                }
                hdw->tuner_signal_stale = !0;
                hdw->cropcap_stale = !0;
index 9464862745fa35873a996568fc0c7c136cc06f0c..9af282f9e76544b8206aecc40505ab38a431e1bb 100644 (file)
@@ -520,16 +520,6 @@ static u32 pvr2_i2c_functionality(struct i2c_adapter *adap)
        return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C;
 }
 
-static int pvr2_i2c_attach_inform(struct i2c_client *client)
-{
-       return 0;
-}
-
-static int pvr2_i2c_detach_inform(struct i2c_client *client)
-{
-       return 0;
-}
-
 static struct i2c_algorithm pvr2_i2c_algo_template = {
        .master_xfer   = pvr2_i2c_xfer,
        .functionality = pvr2_i2c_functionality,
@@ -539,8 +529,6 @@ static struct i2c_adapter pvr2_i2c_adap_template = {
        .owner         = THIS_MODULE,
        .class         = 0,
        .id            = I2C_HW_B_BT848,
-       .client_register = pvr2_i2c_attach_inform,
-       .client_unregister = pvr2_i2c_detach_inform,
 };
 
 
index e20ba1e6e0ea20e63d4a0a82ad23225d028dd58c..299c1cbc38329ca5c87423b4af78e0a2123ae638 100644 (file)
@@ -153,14 +153,16 @@ static ssize_t show_def(struct device *class_dev,
        struct pvr2_sysfs_ctl_item *cip;
        int val;
        int ret;
+       unsigned int cnt = 0;
        cip = container_of(attr, struct pvr2_sysfs_ctl_item, attr_def);
        ret = pvr2_ctrl_get_def(cip->cptr, &val);
-       pvr2_sysfs_trace("pvr2_sysfs(%p) show_def(cid=%d) is %d, stat=%d",
-                        cip->chptr, cip->ctl_id, val, ret);
-       if (ret < 0) {
-               return ret;
-       }
-       return scnprintf(buf, PAGE_SIZE, "%d\n", val);
+       if (ret < 0) return ret;
+       ret = pvr2_ctrl_value_to_sym(cip->cptr, ~0, val,
+                                    buf, PAGE_SIZE - 1, &cnt);
+       pvr2_sysfs_trace("pvr2_sysfs(%p) show_def(cid=%d) is %.*s (%d)",
+                        cip->chptr, cip->ctl_id, cnt, buf, val);
+       buf[cnt] = '\n';
+       return cnt + 1;
 }
 
 static ssize_t show_val_norm(struct device *class_dev,
index b3862f5554bd92a9b4c0d3b7baaeaf651b0c573d..d2fe7c8f2c3a2cb7b6aafe42dfb8fcc46308e024 100644 (file)
@@ -75,16 +75,17 @@ static const struct routing_scheme routing_schemes[] = {
 void pvr2_saa7115_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
 {
        if (hdw->input_dirty || hdw->force_dirty) {
-               struct v4l2_routing route;
                const struct routing_scheme *sp;
                unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
+               u32 input;
+
                pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_input(%d)",
                           hdw->input_val);
                if ((sid < ARRAY_SIZE(routing_schemes)) &&
                    ((sp = routing_schemes + sid) != NULL) &&
                    (hdw->input_val >= 0) &&
                    (hdw->input_val < sp->cnt)) {
-                       route.input = sp->def[hdw->input_val];
+                       input = sp->def[hdw->input_val];
                } else {
                        pvr2_trace(PVR2_TRACE_ERROR_LEGS,
                                   "*** WARNING *** subdev v4l2 set_input:"
@@ -93,8 +94,7 @@ void pvr2_saa7115_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
                                   sid, hdw->input_val);
                        return;
                }
-               route.output = 0;
-               sd->ops->video->s_routing(sd, &route);
+               sd->ops->video->s_routing(sd, input, 0, 0);
        }
 }
 
index 1670aa4051ce7ecf8df6cade0fcd9a80c2bfb70a..8c1eae05aa08837072c54298e2d136885862022f 100644 (file)
 void pvr2_wm8775_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
 {
        if (hdw->input_dirty || hdw->force_dirty) {
-               struct v4l2_routing route;
-
-               memset(&route, 0, sizeof(route));
+               u32 input;
 
                switch (hdw->input_val) {
                case PVR2_CVAL_INPUT_RADIO:
-                       route.input = 1;
+                       input = 1;
                        break;
                default:
                        /* All other cases just use the second input */
-                       route.input = 2;
+                       input = 2;
                        break;
                }
                pvr2_trace(PVR2_TRACE_CHIPS, "subdev wm8775"
                           " set_input(val=%d route=0x%x)",
-                          hdw->input_val, route.input);
+                          hdw->input_val, input);
 
-               sd->ops->audio->s_routing(sd, &route);
+               sd->ops->audio->s_routing(sd, input, 0, 0);
        }
 }
 
index 8b9f0aa844a19b8f63b5dd66134a43f9d7993aa0..340f954aba346496e22460d7d5f276a5022951b2 100644 (file)
@@ -39,7 +39,7 @@ config USB_PWC_DEBUG
 config USB_PWC_INPUT_EVDEV
        bool "USB Philips Cameras input events device support"
        default y
-       depends on USB_PWC && INPUT
+       depends on USB_PWC=INPUT || INPUT=y
        ---help---
          This option makes USB Philips cameras register the snapshot button as
          an input device to report button events.
index c522616ef38f500006dd83075451a575de72e91e..c639845460fff8df6a327bf1f7e21ebbb954ac34 100644 (file)
                        CICR0_PERRM | CICR0_QDM | CICR0_CDM | CICR0_SOFM | \
                        CICR0_EOFM | CICR0_FOM)
 
+/*
+ * YUV422P picture size should be a multiple of 16, so the heuristic aligns
+ * height, width on 4 byte boundaries to reach the 16 multiple for the size.
+ */
+#define YUV422P_X_Y_ALIGN 4
+#define YUV422P_SIZE_ALIGN YUV422P_X_Y_ALIGN * YUV422P_X_Y_ALIGN
+
 /*
  * Structures
  */
@@ -236,20 +243,11 @@ static int pxa_videobuf_setup(struct videobuf_queue *vq, unsigned int *count,
                              unsigned int *size)
 {
        struct soc_camera_device *icd = vq->priv_data;
-       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
-       struct pxa_camera_dev *pcdev = ici->priv;
 
        dev_dbg(&icd->dev, "count=%d, size=%d\n", *count, *size);
 
-       /* planar capture requires Y, U and V buffers to be page aligned */
-       if (pcdev->channels == 3) {
-               *size = PAGE_ALIGN(icd->width * icd->height); /* Y pages */
-               *size += PAGE_ALIGN(icd->width * icd->height / 2); /* U pages */
-               *size += PAGE_ALIGN(icd->width * icd->height / 2); /* V pages */
-       } else {
-               *size = icd->width * icd->height *
-                       ((icd->current_fmt->depth + 7) >> 3);
-       }
+       *size = roundup(icd->width * icd->height *
+                       ((icd->current_fmt->depth + 7) >> 3), 8);
 
        if (0 == *count)
                *count = 32;
@@ -289,19 +287,63 @@ static void free_buffer(struct videobuf_queue *vq, struct pxa_buffer *buf)
        buf->vb.state = VIDEOBUF_NEEDS_INIT;
 }
 
+static int calculate_dma_sglen(struct scatterlist *sglist, int sglen,
+                              int sg_first_ofs, int size)
+{
+       int i, offset, dma_len, xfer_len;
+       struct scatterlist *sg;
+
+       offset = sg_first_ofs;
+       for_each_sg(sglist, sg, sglen, i) {
+               dma_len = sg_dma_len(sg);
+
+               /* PXA27x Developer's Manual 27.4.4.1: round up to 8 bytes */
+               xfer_len = roundup(min(dma_len - offset, size), 8);
+
+               size = max(0, size - xfer_len);
+               offset = 0;
+               if (size == 0)
+                       break;
+       }
+
+       BUG_ON(size != 0);
+       return i + 1;
+}
+
+/**
+ * pxa_init_dma_channel - init dma descriptors
+ * @pcdev: pxa camera device
+ * @buf: pxa buffer to find pxa dma channel
+ * @dma: dma video buffer
+ * @channel: dma channel (0 => 'Y', 1 => 'U', 2 => 'V')
+ * @cibr: camera Receive Buffer Register
+ * @size: bytes to transfer
+ * @sg_first: first element of sg_list
+ * @sg_first_ofs: offset in first element of sg_list
+ *
+ * Prepares the pxa dma descriptors to transfer one camera channel.
+ * Beware sg_first and sg_first_ofs are both input and output parameters.
+ *
+ * Returns 0 or -ENOMEM if no coherent memory is available
+ */
 static int pxa_init_dma_channel(struct pxa_camera_dev *pcdev,
                                struct pxa_buffer *buf,
                                struct videobuf_dmabuf *dma, int channel,
-                               int sglen, int sg_start, int cibr,
-                               unsigned int size)
+                               int cibr, int size,
+                               struct scatterlist **sg_first, int *sg_first_ofs)
 {
        struct pxa_cam_dma *pxa_dma = &buf->dmas[channel];
-       int i;
+       struct scatterlist *sg;
+       int i, offset, sglen;
+       int dma_len = 0, xfer_len = 0;
 
        if (pxa_dma->sg_cpu)
                dma_free_coherent(pcdev->dev, pxa_dma->sg_size,
                                  pxa_dma->sg_cpu, pxa_dma->sg_dma);
 
+       sglen = calculate_dma_sglen(*sg_first, dma->sglen,
+                                   *sg_first_ofs, size);
+
        pxa_dma->sg_size = (sglen + 1) * sizeof(struct pxa_dma_desc);
        pxa_dma->sg_cpu = dma_alloc_coherent(pcdev->dev, pxa_dma->sg_size,
                                             &pxa_dma->sg_dma, GFP_KERNEL);
@@ -309,31 +351,75 @@ static int pxa_init_dma_channel(struct pxa_camera_dev *pcdev,
                return -ENOMEM;
 
        pxa_dma->sglen = sglen;
+       offset = *sg_first_ofs;
 
-       for (i = 0; i < sglen; i++) {
-               int sg_i = sg_start + i;
-               struct scatterlist *sg = dma->sglist;
-               unsigned int dma_len = sg_dma_len(&sg[sg_i]), xfer_len;
+       dev_dbg(pcdev->dev, "DMA: sg_first=%p, sglen=%d, ofs=%d, dma.desc=%x\n",
+               *sg_first, sglen, *sg_first_ofs, pxa_dma->sg_dma);
 
-               pxa_dma->sg_cpu[i].dsadr = pcdev->res->start + cibr;
-               pxa_dma->sg_cpu[i].dtadr = sg_dma_address(&sg[sg_i]);
+
+       for_each_sg(*sg_first, sg, sglen, i) {
+               dma_len = sg_dma_len(sg);
 
                /* PXA27x Developer's Manual 27.4.4.1: round up to 8 bytes */
-               xfer_len = (min(dma_len, size) + 7) & ~7;
+               xfer_len = roundup(min(dma_len - offset, size), 8);
 
+               size = max(0, size - xfer_len);
+
+               pxa_dma->sg_cpu[i].dsadr = pcdev->res->start + cibr;
+               pxa_dma->sg_cpu[i].dtadr = sg_dma_address(sg) + offset;
                pxa_dma->sg_cpu[i].dcmd =
                        DCMD_FLOWSRC | DCMD_BURST8 | DCMD_INCTRGADDR | xfer_len;
-               size -= dma_len;
+#ifdef DEBUG
+               if (!i)
+                       pxa_dma->sg_cpu[i].dcmd |= DCMD_STARTIRQEN;
+#endif
                pxa_dma->sg_cpu[i].ddadr =
                        pxa_dma->sg_dma + (i + 1) * sizeof(struct pxa_dma_desc);
+
+               dev_vdbg(pcdev->dev, "DMA: desc.%08x->@phys=0x%08x, len=%d\n",
+                        pxa_dma->sg_dma + i * sizeof(struct pxa_dma_desc),
+                        sg_dma_address(sg) + offset, xfer_len);
+               offset = 0;
+
+               if (size == 0)
+                       break;
        }
 
-       pxa_dma->sg_cpu[sglen - 1].ddadr = DDADR_STOP;
-       pxa_dma->sg_cpu[sglen - 1].dcmd |= DCMD_ENDIRQEN;
+       pxa_dma->sg_cpu[sglen].ddadr = DDADR_STOP;
+       pxa_dma->sg_cpu[sglen].dcmd  = DCMD_FLOWSRC | DCMD_BURST8 | DCMD_ENDIRQEN;
+
+       /*
+        * Handle 1 special case :
+        *  - in 3 planes (YUV422P format), we might finish with xfer_len equal
+        *    to dma_len (end on PAGE boundary). In this case, the sg element
+        *    for next plane should be the next after the last used to store the
+        *    last scatter gather RAM page
+        */
+       if (xfer_len >= dma_len) {
+               *sg_first_ofs = xfer_len - dma_len;
+               *sg_first = sg_next(sg);
+       } else {
+               *sg_first_ofs = xfer_len;
+               *sg_first = sg;
+       }
 
        return 0;
 }
 
+static void pxa_videobuf_set_actdma(struct pxa_camera_dev *pcdev,
+                                   struct pxa_buffer *buf)
+{
+       buf->active_dma = DMA_Y;
+       if (pcdev->channels == 3)
+               buf->active_dma |= DMA_U | DMA_V;
+}
+
+/*
+ * Please check the DMA prepared buffer structure in :
+ *   Documentation/video4linux/pxa_camera.txt
+ * Please check also in pxa_camera_check_link_miss() to understand why DMA chain
+ * modification while DMA chain is running will work anyway.
+ */
 static int pxa_videobuf_prepare(struct videobuf_queue *vq,
                struct videobuf_buffer *vb, enum v4l2_field field)
 {
@@ -342,7 +428,6 @@ static int pxa_videobuf_prepare(struct videobuf_queue *vq,
        struct pxa_camera_dev *pcdev = ici->priv;
        struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb);
        int ret;
-       int sglen_y,  sglen_yu = 0, sglen_u = 0, sglen_v = 0;
        int size_y, size_u = 0, size_v = 0;
 
        dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
@@ -381,62 +466,58 @@ static int pxa_videobuf_prepare(struct videobuf_queue *vq,
        }
 
        if (vb->state == VIDEOBUF_NEEDS_INIT) {
-               unsigned int size = vb->size;
+               int size = vb->size;
+               int next_ofs = 0;
                struct videobuf_dmabuf *dma = videobuf_to_dma(vb);
+               struct scatterlist *sg;
 
                ret = videobuf_iolock(vq, vb, NULL);
                if (ret)
                        goto fail;
 
                if (pcdev->channels == 3) {
-                       /* FIXME the calculations should be more precise */
-                       sglen_y = dma->sglen / 2;
-                       sglen_u = sglen_v = dma->sglen / 4 + 1;
-                       sglen_yu = sglen_y + sglen_u;
                        size_y = size / 2;
                        size_u = size_v = size / 4;
                } else {
-                       sglen_y = dma->sglen;
                        size_y = size;
                }
 
-               /* init DMA for Y channel */
-               ret = pxa_init_dma_channel(pcdev, buf, dma, 0, sglen_y,
-                                          0, 0x28, size_y);
+               sg = dma->sglist;
 
+               /* init DMA for Y channel */
+               ret = pxa_init_dma_channel(pcdev, buf, dma, 0, CIBR0, size_y,
+                                          &sg, &next_ofs);
                if (ret) {
                        dev_err(pcdev->dev,
                                "DMA initialization for Y/RGB failed\n");
                        goto fail;
                }
 
-               if (pcdev->channels == 3) {
-                       /* init DMA for U channel */
-                       ret = pxa_init_dma_channel(pcdev, buf, dma, 1, sglen_u,
-                                                  sglen_y, 0x30, size_u);
-                       if (ret) {
-                               dev_err(pcdev->dev,
-                                       "DMA initialization for U failed\n");
-                               goto fail_u;
-                       }
-
-                       /* init DMA for V channel */
-                       ret = pxa_init_dma_channel(pcdev, buf, dma, 2, sglen_v,
-                                                  sglen_yu, 0x38, size_v);
-                       if (ret) {
-                               dev_err(pcdev->dev,
-                                       "DMA initialization for V failed\n");
-                               goto fail_v;
-                       }
+               /* init DMA for U channel */
+               if (size_u)
+                       ret = pxa_init_dma_channel(pcdev, buf, dma, 1, CIBR1,
+                                                  size_u, &sg, &next_ofs);
+               if (ret) {
+                       dev_err(pcdev->dev,
+                               "DMA initialization for U failed\n");
+                       goto fail_u;
+               }
+
+               /* init DMA for V channel */
+               if (size_v)
+                       ret = pxa_init_dma_channel(pcdev, buf, dma, 2, CIBR2,
+                                                  size_v, &sg, &next_ofs);
+               if (ret) {
+                       dev_err(pcdev->dev,
+                               "DMA initialization for V failed\n");
+                       goto fail_v;
                }
 
                vb->state = VIDEOBUF_PREPARED;
        }
 
        buf->inwork = 0;
-       buf->active_dma = DMA_Y;
-       if (pcdev->channels == 3)
-               buf->active_dma |= DMA_U | DMA_V;
+       pxa_videobuf_set_actdma(pcdev, buf);
 
        return 0;
 
@@ -453,6 +534,92 @@ out:
        return ret;
 }
 
+/**
+ * pxa_dma_start_channels - start DMA channel for active buffer
+ * @pcdev: pxa camera device
+ *
+ * Initialize DMA channels to the beginning of the active video buffer, and
+ * start these channels.
+ */
+static void pxa_dma_start_channels(struct pxa_camera_dev *pcdev)
+{
+       int i;
+       struct pxa_buffer *active;
+
+       active = pcdev->active;
+
+       for (i = 0; i < pcdev->channels; i++) {
+               dev_dbg(pcdev->dev, "%s (channel=%d) ddadr=%08x\n", __func__,
+                       i, active->dmas[i].sg_dma);
+               DDADR(pcdev->dma_chans[i]) = active->dmas[i].sg_dma;
+               DCSR(pcdev->dma_chans[i]) = DCSR_RUN;
+       }
+}
+
+static void pxa_dma_stop_channels(struct pxa_camera_dev *pcdev)
+{
+       int i;
+
+       for (i = 0; i < pcdev->channels; i++) {
+               dev_dbg(pcdev->dev, "%s (channel=%d)\n", __func__, i);
+               DCSR(pcdev->dma_chans[i]) = 0;
+       }
+}
+
+static void pxa_dma_add_tail_buf(struct pxa_camera_dev *pcdev,
+                                struct pxa_buffer *buf)
+{
+       int i;
+       struct pxa_dma_desc *buf_last_desc;
+
+       for (i = 0; i < pcdev->channels; i++) {
+               buf_last_desc = buf->dmas[i].sg_cpu + buf->dmas[i].sglen;
+               buf_last_desc->ddadr = DDADR_STOP;
+
+               if (pcdev->sg_tail[i])
+                       /* Link the new buffer to the old tail */
+                       pcdev->sg_tail[i]->ddadr = buf->dmas[i].sg_dma;
+
+               /* Update the channel tail */
+               pcdev->sg_tail[i] = buf_last_desc;
+       }
+}
+
+/**
+ * pxa_camera_start_capture - start video capturing
+ * @pcdev: camera device
+ *
+ * Launch capturing. DMA channels should not be active yet. They should get
+ * activated at the end of frame interrupt, to capture only whole frames, and
+ * never begin the capture of a partial frame.
+ */
+static void pxa_camera_start_capture(struct pxa_camera_dev *pcdev)
+{
+       unsigned long cicr0, cifr;
+
+       dev_dbg(pcdev->dev, "%s\n", __func__);
+       /* Reset the FIFOs */
+       cifr = __raw_readl(pcdev->base + CIFR) | CIFR_RESET_F;
+       __raw_writel(cifr, pcdev->base + CIFR);
+       /* Enable End-Of-Frame Interrupt */
+       cicr0 = __raw_readl(pcdev->base + CICR0) | CICR0_ENB;
+       cicr0 &= ~CICR0_EOFM;
+       __raw_writel(cicr0, pcdev->base + CICR0);
+}
+
+static void pxa_camera_stop_capture(struct pxa_camera_dev *pcdev)
+{
+       unsigned long cicr0;
+
+       pxa_dma_stop_channels(pcdev);
+
+       cicr0 = __raw_readl(pcdev->base + CICR0) & ~CICR0_ENB;
+       __raw_writel(cicr0, pcdev->base + CICR0);
+
+       pcdev->active = NULL;
+       dev_dbg(pcdev->dev, "%s\n", __func__);
+}
+
 static void pxa_videobuf_queue(struct videobuf_queue *vq,
                               struct videobuf_buffer *vb)
 {
@@ -460,81 +627,20 @@ static void pxa_videobuf_queue(struct videobuf_queue *vq,
        struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
        struct pxa_camera_dev *pcdev = ici->priv;
        struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb);
-       struct pxa_buffer *active;
        unsigned long flags;
-       int i;
 
-       dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
-               vb, vb->baddr, vb->bsize);
+       dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d active=%p\n", __func__,
+               vb, vb->baddr, vb->bsize, pcdev->active);
+
        spin_lock_irqsave(&pcdev->lock, flags);
 
        list_add_tail(&vb->queue, &pcdev->capture);
 
        vb->state = VIDEOBUF_ACTIVE;
-       active = pcdev->active;
+       pxa_dma_add_tail_buf(pcdev, buf);
 
-       if (!active) {
-               unsigned long cifr, cicr0;
-
-               cifr = __raw_readl(pcdev->base + CIFR) | CIFR_RESET_F;
-               __raw_writel(cifr, pcdev->base + CIFR);
-
-               for (i = 0; i < pcdev->channels; i++) {
-                       DDADR(pcdev->dma_chans[i]) = buf->dmas[i].sg_dma;
-                       DCSR(pcdev->dma_chans[i]) = DCSR_RUN;
-                       pcdev->sg_tail[i] = buf->dmas[i].sg_cpu + buf->dmas[i].sglen - 1;
-               }
-
-               pcdev->active = buf;
-
-               cicr0 = __raw_readl(pcdev->base + CICR0) | CICR0_ENB;
-               __raw_writel(cicr0, pcdev->base + CICR0);
-       } else {
-               struct pxa_cam_dma *buf_dma;
-               struct pxa_cam_dma *act_dma;
-               int nents;
-
-               for (i = 0; i < pcdev->channels; i++) {
-                       buf_dma = &buf->dmas[i];
-                       act_dma = &active->dmas[i];
-                       nents = buf_dma->sglen;
-
-                       /* Stop DMA engine */
-                       DCSR(pcdev->dma_chans[i]) = 0;
-
-                       /* Add the descriptors we just initialized to
-                          the currently running chain */
-                       pcdev->sg_tail[i]->ddadr = buf_dma->sg_dma;
-                       pcdev->sg_tail[i] = buf_dma->sg_cpu + buf_dma->sglen - 1;
-
-                       /* Setup a dummy descriptor with the DMA engines current
-                        * state
-                        */
-                       buf_dma->sg_cpu[nents].dsadr =
-                               pcdev->res->start + 0x28 + i*8; /* CIBRx */
-                       buf_dma->sg_cpu[nents].dtadr =
-                               DTADR(pcdev->dma_chans[i]);
-                       buf_dma->sg_cpu[nents].dcmd =
-                               DCMD(pcdev->dma_chans[i]);
-
-                       if (DDADR(pcdev->dma_chans[i]) == DDADR_STOP) {
-                               /* The DMA engine is on the last
-                                  descriptor, set the next descriptors
-                                  address to the descriptors we just
-                                  initialized */
-                               buf_dma->sg_cpu[nents].ddadr = buf_dma->sg_dma;
-                       } else {
-                               buf_dma->sg_cpu[nents].ddadr =
-                                       DDADR(pcdev->dma_chans[i]);
-                       }
-
-                       /* The next descriptor is the dummy descriptor */
-                       DDADR(pcdev->dma_chans[i]) = buf_dma->sg_dma + nents *
-                               sizeof(struct pxa_dma_desc);
-
-                       DCSR(pcdev->dma_chans[i]) = DCSR_RUN;
-               }
-       }
+       if (!pcdev->active)
+               pxa_camera_start_capture(pcdev);
 
        spin_unlock_irqrestore(&pcdev->lock, flags);
 }
@@ -572,7 +678,7 @@ static void pxa_camera_wakeup(struct pxa_camera_dev *pcdev,
                              struct videobuf_buffer *vb,
                              struct pxa_buffer *buf)
 {
-       unsigned long cicr0;
+       int i;
 
        /* _init is used to debug races, see comment in pxa_camera_reqbufs() */
        list_del_init(&vb->queue);
@@ -580,15 +686,12 @@ static void pxa_camera_wakeup(struct pxa_camera_dev *pcdev,
        do_gettimeofday(&vb->ts);
        vb->field_count++;
        wake_up(&vb->done);
+       dev_dbg(pcdev->dev, "%s dequeud buffer (vb=0x%p)\n", __func__, vb);
 
        if (list_empty(&pcdev->capture)) {
-               pcdev->active = NULL;
-               DCSR(pcdev->dma_chans[0]) = 0;
-               DCSR(pcdev->dma_chans[1]) = 0;
-               DCSR(pcdev->dma_chans[2]) = 0;
-
-               cicr0 = __raw_readl(pcdev->base + CICR0) & ~CICR0_ENB;
-               __raw_writel(cicr0, pcdev->base + CICR0);
+               pxa_camera_stop_capture(pcdev);
+               for (i = 0; i < pcdev->channels; i++)
+                       pcdev->sg_tail[i] = NULL;
                return;
        }
 
@@ -596,6 +699,35 @@ static void pxa_camera_wakeup(struct pxa_camera_dev *pcdev,
                                   struct pxa_buffer, vb.queue);
 }
 
+/**
+ * pxa_camera_check_link_miss - check missed DMA linking
+ * @pcdev: camera device
+ *
+ * The DMA chaining is done with DMA running. This means a tiny temporal window
+ * remains, where a buffer is queued on the chain, while the chain is already
+ * stopped. This means the tailed buffer would never be transfered by DMA.
+ * This function restarts the capture for this corner case, where :
+ *  - DADR() == DADDR_STOP
+ *  - a videobuffer is queued on the pcdev->capture list
+ *
+ * Please check the "DMA hot chaining timeslice issue" in
+ *   Documentation/video4linux/pxa_camera.txt
+ *
+ * Context: should only be called within the dma irq handler
+ */
+static void pxa_camera_check_link_miss(struct pxa_camera_dev *pcdev)
+{
+       int i, is_dma_stopped = 1;
+
+       for (i = 0; i < pcdev->channels; i++)
+               if (DDADR(pcdev->dma_chans[i]) != DDADR_STOP)
+                       is_dma_stopped = 0;
+       dev_dbg(pcdev->dev, "%s : top queued buffer=%p, dma_stopped=%d\n",
+               __func__, pcdev->active, is_dma_stopped);
+       if (pcdev->active && is_dma_stopped)
+               pxa_camera_start_capture(pcdev);
+}
+
 static void pxa_camera_dma_irq(int channel, struct pxa_camera_dev *pcdev,
                               enum pxa_camera_active_dma act_dma)
 {
@@ -603,61 +735,70 @@ static void pxa_camera_dma_irq(int channel, struct pxa_camera_dev *pcdev,
        unsigned long flags;
        u32 status, camera_status, overrun;
        struct videobuf_buffer *vb;
-       unsigned long cifr, cicr0;
 
        spin_lock_irqsave(&pcdev->lock, flags);
 
        status = DCSR(channel);
-       DCSR(channel) = status | DCSR_ENDINTR;
+       DCSR(channel) = status;
+
+       camera_status = __raw_readl(pcdev->base + CISR);
+       overrun = CISR_IFO_0;
+       if (pcdev->channels == 3)
+               overrun |= CISR_IFO_1 | CISR_IFO_2;
 
        if (status & DCSR_BUSERR) {
                dev_err(pcdev->dev, "DMA Bus Error IRQ!\n");
                goto out;
        }
 
-       if (!(status & DCSR_ENDINTR)) {
+       if (!(status & (DCSR_ENDINTR | DCSR_STARTINTR))) {
                dev_err(pcdev->dev, "Unknown DMA IRQ source, "
                        "status: 0x%08x\n", status);
                goto out;
        }
 
-       if (!pcdev->active) {
-               dev_err(pcdev->dev, "DMA End IRQ with no active buffer!\n");
-               goto out;
-       }
-
-       camera_status = __raw_readl(pcdev->base + CISR);
-       overrun = CISR_IFO_0;
-       if (pcdev->channels == 3)
-               overrun |= CISR_IFO_1 | CISR_IFO_2;
-       if (camera_status & overrun) {
-               dev_dbg(pcdev->dev, "FIFO overrun! CISR: %x\n", camera_status);
-               /* Stop the Capture Interface */
-               cicr0 = __raw_readl(pcdev->base + CICR0) & ~CICR0_ENB;
-               __raw_writel(cicr0, pcdev->base + CICR0);
-
-               /* Stop DMA */
-               DCSR(channel) = 0;
-               /* Reset the FIFOs */
-               cifr = __raw_readl(pcdev->base + CIFR) | CIFR_RESET_F;
-               __raw_writel(cifr, pcdev->base + CIFR);
-               /* Enable End-Of-Frame Interrupt */
-               cicr0 &= ~CICR0_EOFM;
-               __raw_writel(cicr0, pcdev->base + CICR0);
-               /* Restart the Capture Interface */
-               __raw_writel(cicr0 | CICR0_ENB, pcdev->base + CICR0);
+       /*
+        * pcdev->active should not be NULL in DMA irq handler.
+        *
+        * But there is one corner case : if capture was stopped due to an
+        * overrun of channel 1, and at that same channel 2 was completed.
+        *
+        * When handling the overrun in DMA irq for channel 1, we'll stop the
+        * capture and restart it (and thus set pcdev->active to NULL). But the
+        * DMA irq handler will already be pending for channel 2. So on entering
+        * the DMA irq handler for channel 2 there will be no active buffer, yet
+        * that is normal.
+        */
+       if (!pcdev->active)
                goto out;
-       }
 
        vb = &pcdev->active->vb;
        buf = container_of(vb, struct pxa_buffer, vb);
        WARN_ON(buf->inwork || list_empty(&vb->queue));
-       dev_dbg(pcdev->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
-               vb, vb->baddr, vb->bsize);
 
-       buf->active_dma &= ~act_dma;
-       if (!buf->active_dma)
-               pxa_camera_wakeup(pcdev, vb, buf);
+       dev_dbg(pcdev->dev, "%s channel=%d %s%s(vb=0x%p) dma.desc=%x\n",
+               __func__, channel, status & DCSR_STARTINTR ? "SOF " : "",
+               status & DCSR_ENDINTR ? "EOF " : "", vb, DDADR(channel));
+
+       if (status & DCSR_ENDINTR) {
+               /*
+                * It's normal if the last frame creates an overrun, as there
+                * are no more DMA descriptors to fetch from QCI fifos
+                */
+               if (camera_status & overrun &&
+                   !list_is_last(pcdev->capture.next, &pcdev->capture)) {
+                       dev_dbg(pcdev->dev, "FIFO overrun! CISR: %x\n",
+                               camera_status);
+                       pxa_camera_stop_capture(pcdev);
+                       pxa_camera_start_capture(pcdev);
+                       goto out;
+               }
+               buf->active_dma &= ~act_dma;
+               if (!buf->active_dma) {
+                       pxa_camera_wakeup(pcdev, vb, buf);
+                       pxa_camera_check_link_miss(pcdev);
+               }
+       }
 
 out:
        spin_unlock_irqrestore(&pcdev->lock, flags);
@@ -786,6 +927,8 @@ static irqreturn_t pxa_camera_irq(int irq, void *data)
 {
        struct pxa_camera_dev *pcdev = data;
        unsigned long status, cicr0;
+       struct pxa_buffer *buf;
+       struct videobuf_buffer *vb;
 
        status = __raw_readl(pcdev->base + CISR);
        dev_dbg(pcdev->dev, "Camera interrupt status 0x%lx\n", status);
@@ -796,12 +939,14 @@ static irqreturn_t pxa_camera_irq(int irq, void *data)
        __raw_writel(status, pcdev->base + CISR);
 
        if (status & CISR_EOF) {
-               int i;
-               for (i = 0; i < pcdev->channels; i++) {
-                       DDADR(pcdev->dma_chans[i]) =
-                               pcdev->active->dmas[i].sg_dma;
-                       DCSR(pcdev->dma_chans[i]) = DCSR_RUN;
-               }
+               pcdev->active = list_first_entry(&pcdev->capture,
+                                          struct pxa_buffer, vb.queue);
+               vb = &pcdev->active->vb;
+               buf = container_of(vb, struct pxa_buffer, vb);
+               pxa_videobuf_set_actdma(pcdev, buf);
+
+               pxa_dma_start_channels(pcdev);
+
                cicr0 = __raw_readl(pcdev->base + CICR0) | CICR0_EOFM;
                __raw_writel(cicr0, pcdev->base + CICR0);
        }
@@ -1265,6 +1410,18 @@ static int pxa_camera_try_fmt(struct soc_camera_device *icd,
                pix->width = 2048;
        pix->width &= ~0x01;
 
+       /*
+        * YUV422P planar format requires images size to be a 16 bytes
+        * multiple. If not, zeros will be inserted between Y and U planes, and
+        * U and V planes, and YUV422P standard would be violated.
+        */
+       if (xlate->host_fmt->fourcc == V4L2_PIX_FMT_YUV422P) {
+               if (!IS_ALIGNED(pix->width * pix->height, YUV422P_SIZE_ALIGN))
+                       pix->height = ALIGN(pix->height, YUV422P_X_Y_ALIGN);
+               if (!IS_ALIGNED(pix->width * pix->height, YUV422P_SIZE_ALIGN))
+                       pix->width = ALIGN(pix->width, YUV422P_X_Y_ALIGN);
+       }
+
        pix->bytesperline = pix->width *
                DIV_ROUND_UP(xlate->host_fmt->depth, 8);
        pix->sizeimage = pix->height * pix->bytesperline;
@@ -1372,18 +1529,8 @@ static int pxa_camera_resume(struct soc_camera_device *icd)
                ret = pcdev->icd->ops->resume(pcdev->icd);
 
        /* Restart frame capture if active buffer exists */
-       if (!ret && pcdev->active) {
-               unsigned long cifr, cicr0;
-
-               /* Reset the FIFOs */
-               cifr = __raw_readl(pcdev->base + CIFR) | CIFR_RESET_F;
-               __raw_writel(cifr, pcdev->base + CIFR);
-
-               cicr0 = __raw_readl(pcdev->base + CICR0);
-               cicr0 &= ~CICR0_EOFM;   /* Enable End-Of-Frame Interrupt */
-               cicr0 |= CICR0_ENB;     /* Restart the Capture Interface */
-               __raw_writel(cicr0, pcdev->base + CICR0);
-       }
+       if (!ret && pcdev->active)
+               pxa_camera_start_capture(pcdev);
 
        return ret;
 }
index b5be633e3bb0cb0683d7a085f553eb1a228c710c..5202cadb2aaec3f114c33fca69a58d34b756591c 100644 (file)
@@ -722,7 +722,6 @@ static void free_buffer(struct videobuf_queue *vq, struct s2255_buffer *buf)
 {
        dprintk(4, "%s\n", __func__);
 
-       videobuf_waiton(&buf->vb, 0, 0);
        videobuf_vmalloc_free(&buf->vb);
        buf->vb.state = VIDEOBUF_NEEDS_INIT;
 }
@@ -1324,7 +1323,6 @@ static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
 
 static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
 {
-       int res;
        struct s2255_fh *fh = priv;
        struct s2255_dev *dev = fh->dev;
 
@@ -1338,9 +1336,7 @@ static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
                return -EINVAL;
        }
        s2255_stop_acquire(dev, fh->channel);
-       res = videobuf_streamoff(&fh->vb_vidq);
-       if (res < 0)
-               return res;
+       videobuf_streamoff(&fh->vb_vidq);
        res_free(dev, fh);
        return 0;
 }
@@ -1707,13 +1703,13 @@ static void s2255_destroy(struct kref *kref)
        kfree(dev->fw_data);
        usb_put_dev(dev->udev);
        dprintk(1, "%s", __func__);
-       kfree(dev);
 
        while (!list_empty(&s2255_devlist)) {
                list = s2255_devlist.next;
                list_del(list);
        }
        mutex_unlock(&dev->open_lock);
+       kfree(dev);
 }
 
 static int s2255_close(struct file *file)
index df4e08d2dceb7d83f04fc6b1bd3749486c991b7a..5c24c993ac16724e1d29ab077ae3184cfa0ea0e3 100644 (file)
@@ -299,17 +299,18 @@ static int saa7110_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int saa7110_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int saa7110_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        struct saa7110 *decoder = to_saa7110(sd);
 
-       if (route->input < 0 || route->input >= SAA7110_MAX_INPUT) {
-               v4l2_dbg(1, debug, sd, "input=%d not available\n", route->input);
+       if (input < 0 || input >= SAA7110_MAX_INPUT) {
+               v4l2_dbg(1, debug, sd, "input=%d not available\n", input);
                return -EINVAL;
        }
-       if (decoder->input != route->input) {
-               saa7110_selmux(sd, route->input);
-               v4l2_dbg(1, debug, sd, "switched to input=%d\n", route->input);
+       if (decoder->input != input) {
+               saa7110_selmux(sd, input);
+               v4l2_dbg(1, debug, sd, "switched to input=%d\n", input);
        }
        return 0;
 }
@@ -414,9 +415,6 @@ static const struct v4l2_subdev_core_ops saa7110_core_ops = {
        .g_ctrl = saa7110_g_ctrl,
        .s_ctrl = saa7110_s_ctrl,
        .queryctrl = saa7110_queryctrl,
-};
-
-static const struct v4l2_subdev_tuner_ops saa7110_tuner_ops = {
        .s_std = saa7110_s_std,
 };
 
@@ -429,7 +427,6 @@ static const struct v4l2_subdev_video_ops saa7110_video_ops = {
 
 static const struct v4l2_subdev_ops saa7110_ops = {
        .core = &saa7110_core_ops,
-       .tuner = &saa7110_tuner_ops,
        .video = &saa7110_video_ops,
 };
 
index cebf159f52cfd4e09bea71d808ba60c21cf35a52..44873a016c2c750eeaa75de9121af5eb622fdb44 100644 (file)
@@ -46,7 +46,7 @@
 #include <linux/videodev2.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-chip-ident.h>
-#include <media/v4l2-i2c-drv-legacy.h>
+#include <media/v4l2-i2c-drv.h>
 #include <media/saa7115.h>
 #include <asm/div64.h>
 
@@ -62,12 +62,6 @@ module_param(debug, bool, 0644);
 
 MODULE_PARM_DESC(debug, "Debug level (0-1)");
 
-static unsigned short normal_i2c[] = {
-               0x4a >> 1, 0x48 >> 1,   /* SAA7111, SAA7111A and SAA7113 */
-               0x42 >> 1, 0x40 >> 1,   /* SAA7114, SAA7115 and SAA7118 */
-               I2C_CLIENT_END };
-
-I2C_CLIENT_INSMOD;
 
 struct saa711x_state {
        struct v4l2_subdev sd;
@@ -1234,30 +1228,32 @@ static int saa711x_s_radio(struct v4l2_subdev *sd)
        return 0;
 }
 
-static int saa711x_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int saa711x_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        struct saa711x_state *state = to_state(sd);
-       u32 input = route->input;
        u8 mask = (state->ident == V4L2_IDENT_SAA7111) ? 0xf8 : 0xf0;
 
-       v4l2_dbg(1, debug, sd, "decoder set input %d output %d\n", route->input, route->output);
+       v4l2_dbg(1, debug, sd, "decoder set input %d output %d\n",
+               input, output);
+
        /* saa7111/3 does not have these inputs */
        if ((state->ident == V4L2_IDENT_SAA7113 ||
             state->ident == V4L2_IDENT_SAA7111) &&
-           (route->input == SAA7115_COMPOSITE4 ||
-            route->input == SAA7115_COMPOSITE5)) {
+           (input == SAA7115_COMPOSITE4 ||
+            input == SAA7115_COMPOSITE5)) {
                return -EINVAL;
        }
-       if (route->input > SAA7115_SVIDEO3)
+       if (input > SAA7115_SVIDEO3)
                return -EINVAL;
-       if (route->output > SAA7115_IPORT_ON)
+       if (output > SAA7115_IPORT_ON)
                return -EINVAL;
-       if (state->input == route->input && state->output == route->output)
+       if (state->input == input && state->output == output)
                return 0;
        v4l2_dbg(1, debug, sd, "now setting %s input %s output\n",
-               (route->input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite",
-               (route->output == SAA7115_IPORT_ON) ? "iport on" : "iport off");
-       state->input = route->input;
+               (input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite",
+               (output == SAA7115_IPORT_ON) ? "iport on" : "iport off");
+       state->input = input;
 
        /* saa7111 has slightly different input numbering */
        if (state->ident == V4L2_IDENT_SAA7111) {
@@ -1266,10 +1262,10 @@ static int saa711x_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
                /* saa7111 specific */
                saa711x_write(sd, R_10_CHROMA_CNTL_2,
                                (saa711x_read(sd, R_10_CHROMA_CNTL_2) & 0x3f) |
-                               ((route->output & 0xc0) ^ 0x40));
+                               ((output & 0xc0) ^ 0x40));
                saa711x_write(sd, R_13_RT_X_PORT_OUT_CNTL,
                                (saa711x_read(sd, R_13_RT_X_PORT_OUT_CNTL) & 0xf0) |
-                               ((route->output & 2) ? 0x0a : 0));
+                               ((output & 2) ? 0x0a : 0));
        }
 
        /* select mode */
@@ -1282,7 +1278,7 @@ static int saa711x_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
                        (saa711x_read(sd, R_09_LUMA_CNTL) & 0x7f) |
                        (state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0));
 
-       state->output = route->output;
+       state->output = output;
        if (state->ident == V4L2_IDENT_SAA7114 ||
                        state->ident == V4L2_IDENT_SAA7115) {
                saa711x_write(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK,
@@ -1319,17 +1315,16 @@ static int saa711x_s_stream(struct v4l2_subdev *sd, int enable)
        return 0;
 }
 
-static int saa711x_s_crystal_freq(struct v4l2_subdev *sd, struct v4l2_crystal_freq *freq)
+static int saa711x_s_crystal_freq(struct v4l2_subdev *sd, u32 freq, u32 flags)
 {
        struct saa711x_state *state = to_state(sd);
 
-       if (freq->freq != SAA7115_FREQ_32_11_MHZ &&
-                       freq->freq != SAA7115_FREQ_24_576_MHZ)
+       if (freq != SAA7115_FREQ_32_11_MHZ && freq != SAA7115_FREQ_24_576_MHZ)
                return -EINVAL;
-       state->crystal_freq = freq->freq;
-       state->cgcdiv = (freq->flags & SAA7115_FREQ_FL_CGCDIV) ? 3 : 4;
-       state->ucgc = (freq->flags & SAA7115_FREQ_FL_UCGC) ? 1 : 0;
-       state->apll = (freq->flags & SAA7115_FREQ_FL_APLL) ? 1 : 0;
+       state->crystal_freq = freq;
+       state->cgcdiv = (flags & SAA7115_FREQ_FL_CGCDIV) ? 3 : 4;
+       state->ucgc = (flags & SAA7115_FREQ_FL_UCGC) ? 1 : 0;
+       state->apll = (flags & SAA7115_FREQ_FL_APLL) ? 1 : 0;
        saa711x_s_clock_freq(sd, state->audclk_freq);
        return 0;
 }
@@ -1498,11 +1493,6 @@ static int saa711x_log_status(struct v4l2_subdev *sd)
        return 0;
 }
 
-static int saa711x_command(struct i2c_client *client, unsigned cmd, void *arg)
-{
-       return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
-}
-
 /* ----------------------------------------------------------------------- */
 
 static const struct v4l2_subdev_core_ops saa711x_core_ops = {
@@ -1511,6 +1501,7 @@ static const struct v4l2_subdev_core_ops saa711x_core_ops = {
        .g_ctrl = saa711x_g_ctrl,
        .s_ctrl = saa711x_s_ctrl,
        .queryctrl = saa711x_queryctrl,
+       .s_std = saa711x_s_std,
        .reset = saa711x_reset,
        .s_gpio = saa711x_s_gpio,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
@@ -1520,7 +1511,6 @@ static const struct v4l2_subdev_core_ops saa711x_core_ops = {
 };
 
 static const struct v4l2_subdev_tuner_ops saa711x_tuner_ops = {
-       .s_std = saa711x_s_std,
        .s_radio = saa711x_s_radio,
        .g_tuner = saa711x_g_tuner,
 };
@@ -1676,10 +1666,7 @@ MODULE_DEVICE_TABLE(i2c, saa7115_id);
 
 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
        .name = "saa7115",
-       .driverid = I2C_DRIVERID_SAA711X,
-       .command = saa711x_command,
        .probe = saa711x_probe,
        .remove = saa711x_remove,
-       .legacy_class = I2C_CLASS_TV_ANALOG | I2C_CLASS_TV_DIGITAL,
        .id_table = saa7115_id,
 };
index 128bb8b8dbbf1ba16ee97224862b89e2fb243888..2fe7a701b954a700044ee890096b65691e904f6a 100644 (file)
@@ -570,15 +570,16 @@ static int saa7127_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
        return saa7127_set_std(sd, std);
 }
 
-static int saa7127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int saa7127_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        struct saa7127_state *state = to_state(sd);
        int rc = 0;
 
-       if (state->input_type != route->input)
-               rc = saa7127_set_input_type(sd, route->input);
-       if (rc == 0 && state->output_type != route->output)
-               rc = saa7127_set_output_type(sd, route->output);
+       if (state->input_type != input)
+               rc = saa7127_set_input_type(sd, input);
+       if (rc == 0 && state->output_type != output)
+               rc = saa7127_set_output_type(sd, output);
        return rc;
 }
 
index dc2213e2f86e67095f11a17206ddce66413181c5..63c4b8f1f541b5f2c7e22fffaa9f9dc0b98be316 100644 (file)
@@ -928,9 +928,6 @@ static const struct v4l2_subdev_core_ops saa6752hs_core_ops = {
        .g_ext_ctrls = saa6752hs_g_ext_ctrls,
        .s_ext_ctrls = saa6752hs_s_ext_ctrls,
        .try_ext_ctrls = saa6752hs_try_ext_ctrls,
-};
-
-static const struct v4l2_subdev_tuner_ops saa6752hs_tuner_ops = {
        .s_std = saa6752hs_s_std,
 };
 
@@ -941,7 +938,6 @@ static const struct v4l2_subdev_video_ops saa6752hs_video_ops = {
 
 static const struct v4l2_subdev_ops saa6752hs_ops = {
        .core = &saa6752hs_core_ops,
-       .tuner = &saa6752hs_tuner_ops,
        .video = &saa6752hs_video_ops,
 };
 
index a790a7246a631c64439ba06ee1ee93c40ee8ee30..fdb19449d269df0396cd7802455916119265e09e 100644 (file)
@@ -4508,12 +4508,17 @@ struct saa7134_board saa7134_boards[] = {
                /* Matthias Schwarzott <zzam@gentoo.org> */
                .name           = "Avermedia DVB-S Hybrid+FM A700",
                .audio_clock    = 0x00187de7,
-               .tuner_type     = TUNER_ABSENT, /* TUNER_XC2028 */
+               .tuner_type     = TUNER_XC2028,
                .radio_type     = UNSET,
                .tuner_addr     = ADDR_UNSET,
                .radio_addr     = ADDR_UNSET,
                .mpeg           = SAA7134_MPEG_DVB,
                .inputs         = { {
+                       .name   = name_tv,
+                       .vmux   = 4,
+                       .amux   = TV,
+                       .tv     = 1,
+               }, {
                        .name = name_comp,
                        .vmux = 1,
                        .amux = LINE1,
@@ -4522,6 +4527,10 @@ struct saa7134_board saa7134_boards[] = {
                        .vmux = 6,
                        .amux = LINE1,
                } },
+               .radio = {
+                       .name = name_radio,
+                       .amux = TV,
+               },
        },
        [SAA7134_BOARD_BEHOLD_H6] = {
                /* Igor Kuznetsov <igk@igk.ru> */
@@ -5914,6 +5923,11 @@ static int saa7134_xc2028_callback(struct saa7134_dev *dev,
                        msleep(10);
                        saa7134_set_gpio(dev, 21, 1);
                break;
+               case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
+                       saa7134_set_gpio(dev, 18, 0);
+                       msleep(10);
+                       saa7134_set_gpio(dev, 18, 1);
+               break;
                }
        return 0;
        }
@@ -6259,10 +6273,6 @@ int saa7134_board_init1(struct saa7134_dev *dev)
                saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0c0007cd, 0x0c0007cd);
                break;
        case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
-               printk("%s: %s: hybrid analog/dvb card\n"
-                      "%s: Sorry, of the analog inputs, only analog s-video and composite "
-                      "are supported for now.\n",
-                       dev->name, card(dev).name, dev->name);
        case SAA7134_BOARD_AVERMEDIA_A700_PRO:
                /* write windows gpio values */
                saa_andorl(SAA7134_GPIO_GPMODE0 >> 2,   0x80040100, 0x80040100);
@@ -6326,6 +6336,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev)
                case SAA7134_BOARD_AVERMEDIA_A16D:
                case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
                case SAA7134_BOARD_AVERMEDIA_M103:
+               case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
                        ctl.demod = XC3028_FE_ZARLINK456;
                        break;
                default:
@@ -6599,20 +6610,24 @@ int saa7134_board_init2(struct saa7134_dev *dev)
                /* Note: radio tuner address is always filled in,
                   so we do not need to probe for a radio tuner device. */
                if (dev->radio_type != UNSET)
-                       v4l2_i2c_new_subdev(&dev->i2c_adap,
-                               "tuner", "tuner", dev->radio_addr);
+                       v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                               &dev->i2c_adap, "tuner", "tuner",
+                               dev->radio_addr);
                if (has_demod)
-                       v4l2_i2c_new_probed_subdev(&dev->i2c_adap, "tuner",
-                               "tuner", v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+                       v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                               &dev->i2c_adap, "tuner", "tuner",
+                               v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
                if (dev->tuner_addr == ADDR_UNSET) {
                        enum v4l2_i2c_tuner_type type =
                                has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
 
-                       v4l2_i2c_new_probed_subdev(&dev->i2c_adap, "tuner",
-                               "tuner", v4l2_i2c_tuner_addrs(type));
+                       v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                               &dev->i2c_adap, "tuner", "tuner",
+                               v4l2_i2c_tuner_addrs(type));
                } else {
-                       v4l2_i2c_new_subdev(&dev->i2c_adap,
-                               "tuner", "tuner", dev->tuner_addr);
+                       v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                               &dev->i2c_adap, "tuner", "tuner",
+                               dev->tuner_addr);
                }
        }
 
index dafa0d88bed09662cace3ba2e153b12f0163b695..2def6fec814bb31adaf6e2e32d476b13bdeb6107 100644 (file)
@@ -911,7 +911,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
               pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
               dev->pci_lat,(unsigned long long)pci_resource_start(pci_dev,0));
        pci_set_master(pci_dev);
-       if (!pci_dma_supported(pci_dev, DMA_32BIT_MASK)) {
+       if (!pci_dma_supported(pci_dev, DMA_BIT_MASK(32))) {
                printk("%s: Oops: no 32bit PCI DMA ???\n",dev->name);
                err = -EIO;
                goto fail1;
@@ -982,7 +982,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
        /* load i2c helpers */
        if (card_is_empress(dev)) {
                struct v4l2_subdev *sd =
-                       v4l2_i2c_new_subdev(&dev->i2c_adap,
+                       v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
                                "saa6752hs", "saa6752hs",
                                saa7134_boards[dev->board].empress_addr);
 
@@ -991,12 +991,11 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
        }
 
        if (saa7134_boards[dev->board].rds_addr) {
-               unsigned short addrs[2] = { 0, I2C_CLIENT_END };
                struct v4l2_subdev *sd;
 
-               addrs[0] = saa7134_boards[dev->board].rds_addr;
-               sd = v4l2_i2c_new_probed_subdev(&dev->i2c_adap, "saa6588",
-                           "saa6588", addrs);
+               sd = v4l2_i2c_new_probed_subdev_addr(&dev->v4l2_dev,
+                               &dev->i2c_adap, "saa6588", "saa6588",
+                               saa7134_boards[dev->board].rds_addr);
                if (sd)
                        printk(KERN_INFO "%s: found RDS decoder\n", dev->name);
        }
@@ -1015,7 +1014,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
        saa7134_irq_video_signalchange(dev);
 
        if (TUNER_ABSENT != dev->tuner_type)
-               saa_call_all(dev, core, s_standby, 0);
+               saa_call_all(dev, tuner, s_standby);
 
        /* register v4l devices */
        if (saa7134_no_overlay > 0)
index 404f70eeb355e9f7f6cd31ae55d494925fffd3f3..493cad941460e0fc32725332d907e19959c474e6 100644 (file)
@@ -625,10 +625,10 @@ void saa7134_set_tvnorm_hw(struct saa7134_dev *dev)
        saa7134_set_decoder(dev);
 
        if (card_in(dev, dev->ctl_input).tv)
-               saa_call_all(dev, tuner, s_std, dev->tvnorm->id);
+               saa_call_all(dev, core, s_std, dev->tvnorm->id);
        /* Set the correct norm for the saa6752hs. This function
           does nothing if there is no saa6752hs. */
-       saa_call_empress(dev, tuner, s_std, dev->tvnorm->id);
+       saa_call_empress(dev, core, s_std, dev->tvnorm->id);
 }
 
 static void set_h_prescale(struct saa7134_dev *dev, int task, int prescale)
@@ -1496,7 +1496,7 @@ static int video_release(struct file *file)
        saa_andorb(SAA7134_OFMT_DATA_A, 0x1f, 0);
        saa_andorb(SAA7134_OFMT_DATA_B, 0x1f, 0);
 
-       saa_call_all(dev, core, s_standby, 0);
+       saa_call_all(dev, tuner, s_standby);
        if (fh->radio)
                saa_call_all(dev, core, ioctl, RDS_CMD_CLOSE, &cmd);
 
index a2dd326de5b91d40b899e94a6988f98de7d4d71a..0cbaf90d48745ead75f6c08149729fdf81ad39e0 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 #include <linux/version.h>
-#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,14)
+#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,15)
 
 #include <linux/pci.h>
 #include <linux/i2c.h>
index 25bf2303a6b5b2c0fc57ab10cef415087b7ba4c9..b15c40908e8423556ed4ca6dae8590af520395c4 100644 (file)
@@ -1104,22 +1104,22 @@ static struct v4l2_queryctrl saa717x_qctrl[] = {
        },
 };
 
-static int saa717x_s_video_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int saa717x_s_video_routing(struct v4l2_subdev *sd,
+                                  u32 input, u32 output, u32 config)
 {
        struct saa717x_state *decoder = to_state(sd);
-       int inp = route->input;
-       int is_tuner = inp & 0x80;  /* tuner input flag */
+       int is_tuner = input & 0x80;  /* tuner input flag */
 
-       inp &= 0x7f;
+       input &= 0x7f;
 
-       v4l2_dbg(1, debug, sd, "decoder set input (%d)\n", inp);
+       v4l2_dbg(1, debug, sd, "decoder set input (%d)\n", input);
        /* inputs from 0-9 are available*/
        /* saa717x have mode0-mode9 but mode5 is reserved. */
-       if (inp < 0 || inp > 9 || inp == 5)
+       if (input < 0 || input > 9 || input == 5)
                return -EINVAL;
 
-       if (decoder->input != inp) {
-               int input_line = inp;
+       if (decoder->input != input) {
+               int input_line = input;
 
                decoder->input = input_line;
                v4l2_dbg(1, debug, sd,  "now setting %s input %d\n",
@@ -1276,12 +1276,13 @@ static int saa717x_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int saa717x_s_audio_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int saa717x_s_audio_routing(struct v4l2_subdev *sd,
+                                  u32 input, u32 output, u32 config)
 {
        struct saa717x_state *decoder = to_state(sd);
 
-       if (route->input < 3) { /* FIXME! --tadachi */
-               decoder->audio_input = route->input;
+       if (input < 3) { /* FIXME! --tadachi */
+               decoder->audio_input = input;
                v4l2_dbg(1, debug, sd,
                                "set decoder audio input to %d\n",
                                decoder->audio_input);
@@ -1390,12 +1391,12 @@ static const struct v4l2_subdev_core_ops saa717x_core_ops = {
        .queryctrl = saa717x_queryctrl,
        .g_ctrl = saa717x_g_ctrl,
        .s_ctrl = saa717x_s_ctrl,
+       .s_std = saa717x_s_std,
 };
 
 static const struct v4l2_subdev_tuner_ops saa717x_tuner_ops = {
        .g_tuner = saa717x_g_tuner,
        .s_tuner = saa717x_s_tuner,
-       .s_std = saa717x_s_std,
        .s_radio = saa717x_s_radio,
 };
 
index 75747b104d0738eed0d002953dd92124a205eac4..212baa10829bf4535ed5bd6d396cfd5b14f8c453 100644 (file)
@@ -245,14 +245,15 @@ static int saa7185_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int saa7185_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int saa7185_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        struct saa7185 *encoder = to_saa7185(sd);
 
-       /* RJ: route->input = 0: input is from SA7111
-        route->input = 1: input is from ZR36060 */
+       /* RJ: input = 0: input is from SA7111
+        input = 1: input is from ZR36060 */
 
-       switch (route->input) {
+       switch (input) {
        case 0:
                /* turn off colorbar */
                saa7185_write(sd, 0x3a, 0x0f);
index 3f523aeec56e6c12673af5f06336b235c2c34a56..a2513772196bf41279bed4c65a2af61114b8ecc7 100644 (file)
@@ -160,14 +160,14 @@ static int saa7191_write_block(struct v4l2_subdev *sd,
 /* Helper functions */
 
 static int saa7191_s_routing(struct v4l2_subdev *sd,
-                               const struct v4l2_routing *route)
+                            u32 input, u32 output, u32 config)
 {
        struct saa7191 *decoder = to_saa7191(sd);
        u8 luma = saa7191_read_reg(sd, SAA7191_REG_LUMA);
        u8 iock = saa7191_read_reg(sd, SAA7191_REG_IOCK);
        int err;
 
-       switch (route->input) {
+       switch (input) {
        case SAA7191_INPUT_COMPOSITE: /* Set Composite input */
                iock &= ~(SAA7191_IOCK_CHRS | SAA7191_IOCK_GPSW1
                          | SAA7191_IOCK_GPSW2);
@@ -190,7 +190,7 @@ static int saa7191_s_routing(struct v4l2_subdev *sd,
        if (err)
                return -EIO;
 
-       decoder->input = route->input;
+       decoder->input = input;
 
        return 0;
 }
@@ -582,9 +582,6 @@ static const struct v4l2_subdev_core_ops saa7191_core_ops = {
        .g_chip_ident = saa7191_g_chip_ident,
        .g_ctrl = saa7191_g_ctrl,
        .s_ctrl = saa7191_s_ctrl,
-};
-
-static const struct v4l2_subdev_tuner_ops saa7191_tuner_ops = {
        .s_std = saa7191_s_std,
 };
 
@@ -597,7 +594,6 @@ static const struct v4l2_subdev_video_ops saa7191_video_ops = {
 static const struct v4l2_subdev_ops saa7191_ops = {
        .core = &saa7191_core_ops,
        .video = &saa7191_video_ops,
-       .tuner = &saa7191_tuner_ops,
 };
 
 static int saa7191_probe(struct i2c_client *client,
index 6d8bfd4d97e20ba49303b26b133665045f5a61a9..0e890cc233776d85c3cba061299761e9402e7047 100644 (file)
@@ -764,7 +764,10 @@ static int soc_camera_s_register(struct file *file, void *fh,
 
 static int device_register_link(struct soc_camera_device *icd)
 {
-       int ret = device_register(&icd->dev);
+       int ret = dev_set_name(&icd->dev, "%u-%u", icd->iface, icd->devnum);
+
+       if (!ret)
+               ret = device_register(&icd->dev);
 
        if (ret < 0) {
                /* Prevent calling device_unregister() */
@@ -1060,7 +1063,6 @@ int soc_camera_device_register(struct soc_camera_device *icd)
 
        icd->devnum = num;
        icd->dev.bus = &soc_camera_bus_type;
-       dev_set_name(&icd->dev, "%u-%u", icd->iface, icd->devnum);
 
        icd->dev.release        = dummy_release;
        icd->use_count          = 0;
index fe1158094c2491c277ec433db8f99de44651ee98..d381fce3db407c6062f73dc4d75162ccb77d5f4a 100644 (file)
@@ -192,7 +192,6 @@ static int tda9840_remove(struct i2c_client *client)
        return 0;
 }
 
-
 static const struct i2c_device_id tda9840_id[] = {
        { "tda9840", 0 },
        { }
index d61c56f42bcd93010e96731147c6dd80ca0026c3..d4a9ed45764b066c0b47c0c3bdd81fe52ac9734e 100644 (file)
@@ -47,12 +47,11 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
 
 
 /* makes a connection between the input-pin 'i' and the output-pin 'o' */
-static int tea6415c_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int tea6415c_s_routing(struct v4l2_subdev *sd,
+                             u32 i, u32 o, u32 config)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        u8 byte = 0;
-       u32 i = route->input;
-       u32 o = route->output;
        int ret;
 
        v4l2_dbg(1, debug, sd, "i=%d, o=%d\n", i, o);
@@ -170,7 +169,6 @@ static int tea6415c_remove(struct i2c_client *client)
        return 0;
 }
 
-
 static const struct i2c_device_id tea6415c_id[] = {
        { "tea6415c", 0 },
        { }
index 34922232402af32e72dc4cc672bd15bd80816605..ced6eadf347a6d2090104ef340936a3cf6cad51b 100644 (file)
@@ -48,15 +48,15 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
 
 /* make a connection between the input 'i' and the output 'o'
    with gain 'g' (note: i = 6 means 'mute') */
-static int tea6420_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int tea6420_s_routing(struct v4l2_subdev *sd,
+                            u32 i, u32 o, u32 config)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
-       int i = route->input;
-       int o = route->output & 0xf;
-       int g = (route->output >> 4) & 0xf;
+       int g = (o >> 4) & 0xf;
        u8 byte;
        int ret;
 
+       o &= 0xf;
        v4l2_dbg(1, debug, sd, "i=%d, o=%d, g=%d\n", i, o, g);
 
        /* check if the parameters are valid */
@@ -133,13 +133,8 @@ static int tea6420_probe(struct i2c_client *client,
 
        /* set initial values: set "mute"-input to all outputs at gain 0 */
        err = 0;
-       for (i = 1; i < 5; i++) {
-               struct v4l2_routing route;
-
-               route.input = 6;
-               route.output = i;
-               err += tea6420_s_routing(sd, &route);
-       }
+       for (i = 1; i < 5; i++)
+               err += tea6420_s_routing(sd, 6, i, 0);
        if (err) {
                v4l_dbg(1, debug, client, "could not initialize tea6420\n");
                return -ENODEV;
@@ -156,7 +151,6 @@ static int tea6420_remove(struct i2c_client *client)
        return 0;
 }
 
-
 static const struct i2c_device_id tea6420_id[] = {
        { "tea6420", 0 },
        { }
index 72d41032742dd003e51abf923798d83fe838f65a..78c377a399cb893d1517b4ea6f4a48a6c04d8f19 100644 (file)
 #include <linux/i2c.h>
 #include <linux/types.h>
 #include <linux/init.h>
-#include <linux/videodev.h>
+#include <linux/videodev2.h>
 #include <media/tuner.h>
 #include <media/tuner-types.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-ioctl.h>
-#include <media/v4l2-i2c-drv-legacy.h>
+#include <media/v4l2-i2c-drv.h>
 #include "mt20xx.h"
 #include "tda8290.h"
 #include "tea5761.h"
@@ -101,18 +101,6 @@ static inline struct tuner *to_tuner(struct v4l2_subdev *sd)
        return container_of(sd, struct tuner, sd);
 }
 
-/* standard i2c insmod options */
-static unsigned short normal_i2c[] = {
-#if defined(CONFIG_MEDIA_TUNER_TEA5761) || (defined(CONFIG_MEDIA_TUNER_TEA5761_MODULE) && defined(MODULE))
-       0x10,
-#endif
-       0x42, 0x43, 0x4a, 0x4b,                 /* tda8290 */
-       0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-       0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-       I2C_CLIENT_END
-};
-
-I2C_CLIENT_INSMOD;
 
 /* insmod options used at init time => read/only */
 static unsigned int addr;
@@ -785,7 +773,7 @@ static int tuner_s_radio(struct v4l2_subdev *sd)
        return 0;
 }
 
-static int tuner_s_standby(struct v4l2_subdev *sd, u32 standby)
+static int tuner_s_standby(struct v4l2_subdev *sd)
 {
        struct tuner *t = to_tuner(sd);
        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
@@ -951,11 +939,6 @@ static int tuner_log_status(struct v4l2_subdev *sd)
        return 0;
 }
 
-static int tuner_command(struct i2c_client *client, unsigned cmd, void *arg)
-{
-       return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
-}
-
 static int tuner_suspend(struct i2c_client *c, pm_message_t state)
 {
        struct tuner *t = to_tuner(i2c_get_clientdata(c));
@@ -980,15 +963,28 @@ static int tuner_resume(struct i2c_client *c)
        return 0;
 }
 
+static int tuner_command(struct i2c_client *client, unsigned cmd, void *arg)
+{
+       struct v4l2_subdev *sd = i2c_get_clientdata(client);
+
+       /* TUNER_SET_CONFIG is still called by tuner-simple.c, so we have
+          to handle it here.
+          There must be a better way of doing this... */
+       switch (cmd) {
+       case TUNER_SET_CONFIG:
+               return tuner_s_config(sd, arg);
+       }
+       return -ENOIOCTLCMD;
+}
+
 /* ----------------------------------------------------------------------- */
 
 static const struct v4l2_subdev_core_ops tuner_core_ops = {
        .log_status = tuner_log_status,
-       .s_standby = tuner_s_standby,
+       .s_std = tuner_s_std,
 };
 
 static const struct v4l2_subdev_tuner_ops tuner_tuner_ops = {
-       .s_std = tuner_s_std,
        .s_radio = tuner_s_radio,
        .g_tuner = tuner_g_tuner,
        .s_tuner = tuner_s_tuner,
@@ -996,6 +992,7 @@ static const struct v4l2_subdev_tuner_ops tuner_tuner_ops = {
        .g_frequency = tuner_g_frequency,
        .s_type_addr = tuner_s_type_addr,
        .s_config = tuner_s_config,
+       .s_standby = tuner_s_standby,
 };
 
 static const struct v4l2_subdev_ops tuner_ops = {
@@ -1023,7 +1020,7 @@ static void tuner_lookup(struct i2c_adapter *adap,
                int mode_mask;
 
                if (pos->i2c->adapter != adap ||
-                   pos->i2c->driver->id != I2C_DRIVERID_TUNER)
+                   strcmp(pos->i2c->driver->driver.name, "tuner"))
                        continue;
 
                mode_mask = pos->mode_mask & ~T_STANDBY;
@@ -1167,40 +1164,6 @@ register_client:
        return 0;
 }
 
-static int tuner_legacy_probe(struct i2c_adapter *adap)
-{
-       if (0 != addr) {
-               normal_i2c[0] = addr;
-               normal_i2c[1] = I2C_CLIENT_END;
-       }
-
-       if ((adap->class & I2C_CLASS_TV_ANALOG) == 0)
-               return 0;
-
-       /* HACK: Ignore 0x6b and 0x6f on cx88 boards.
-        * FusionHDTV5 RT Gold has an ir receiver at 0x6b
-        * and an RTC at 0x6f which can get corrupted if probed.
-        */
-       if ((adap->id == I2C_HW_B_CX2388x) ||
-           (adap->id == I2C_HW_B_CX23885)) {
-               unsigned int i = 0;
-
-               while (i < I2C_CLIENT_MAX_OPTS && ignore[i] != I2C_CLIENT_END)
-                       i += 2;
-               if (i + 4 < I2C_CLIENT_MAX_OPTS) {
-                       ignore[i+0] = adap->nr;
-                       ignore[i+1] = 0x6b;
-                       ignore[i+2] = adap->nr;
-                       ignore[i+3] = 0x6f;
-                       ignore[i+4] = I2C_CLIENT_END;
-               } else
-                       printk(KERN_WARNING "tuner: "
-                              "too many options specified "
-                              "in i2c probe ignore list!\n");
-       }
-       return 1;
-}
-
 static int tuner_remove(struct i2c_client *client)
 {
        struct tuner *t = to_tuner(i2c_get_clientdata(client));
@@ -1227,13 +1190,11 @@ MODULE_DEVICE_TABLE(i2c, tuner_id);
 
 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
        .name = "tuner",
-       .driverid = I2C_DRIVERID_TUNER,
-       .command = tuner_command,
        .probe = tuner_probe,
        .remove = tuner_remove,
+       .command = tuner_command,
        .suspend = tuner_suspend,
        .resume = tuner_resume,
-       .legacy_probe = tuner_legacy_probe,
        .id_table = tuner_id,
 };
 
index 226bf3565ac96eddf81c33182d715e878ca1fe8d..0869bafc2b56a11821a72c0dce4e56d7da2968a2 100644 (file)
@@ -35,7 +35,7 @@
 #include <media/tvaudio.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-chip-ident.h>
-#include <media/v4l2-i2c-drv-legacy.h>
+#include <media/v4l2-i2c-drv.h>
 
 #include <media/i2c-addr.h>
 
@@ -136,20 +136,6 @@ static inline struct CHIPSTATE *to_state(struct v4l2_subdev *sd)
        return container_of(sd, struct CHIPSTATE, sd);
 }
 
-/* ---------------------------------------------------------------------- */
-/* i2c addresses                                                          */
-
-static unsigned short normal_i2c[] = {
-       I2C_ADDR_TDA8425   >> 1,
-       I2C_ADDR_TEA6300   >> 1,
-       I2C_ADDR_TEA6420   >> 1,
-       I2C_ADDR_TDA9840   >> 1,
-       I2C_ADDR_TDA985x_L >> 1,
-       I2C_ADDR_TDA985x_H >> 1,
-       I2C_ADDR_TDA9874   >> 1,
-       I2C_ADDR_PIC16C54  >> 1,
-       I2C_CLIENT_END };
-I2C_CLIENT_INSMOD;
 
 /* ---------------------------------------------------------------------- */
 /* i2c I/O functions                                                      */
@@ -1795,17 +1781,18 @@ static int tvaudio_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
        return -EINVAL;
 }
 
-static int tvaudio_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *rt)
+static int tvaudio_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        struct CHIPSTATE *chip = to_state(sd);
        struct CHIPDESC *desc = chip->desc;
 
        if (!(desc->flags & CHIP_HAS_INPUTSEL))
                return 0;
-       if (rt->input >= 4)
+       if (input >= 4)
                return -EINVAL;
        /* There are four inputs: tuner, radio, extern and intern. */
-       chip->input = rt->input;
+       chip->input = input;
        if (chip->muted)
                return 0;
        chip_write_masked(chip, desc->inputreg,
@@ -1918,11 +1905,6 @@ static int tvaudio_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ide
        return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_TVAUDIO, 0);
 }
 
-static int tvaudio_command(struct i2c_client *client, unsigned cmd, void *arg)
-{
-       return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
-}
-
 /* ----------------------------------------------------------------------- */
 
 static const struct v4l2_subdev_core_ops tvaudio_core_ops = {
@@ -1930,12 +1912,12 @@ static const struct v4l2_subdev_core_ops tvaudio_core_ops = {
        .queryctrl = tvaudio_queryctrl,
        .g_ctrl = tvaudio_g_ctrl,
        .s_ctrl = tvaudio_s_ctrl,
+       .s_std = tvaudio_s_std,
 };
 
 static const struct v4l2_subdev_tuner_ops tvaudio_tuner_ops = {
        .s_radio = tvaudio_s_radio,
        .s_frequency = tvaudio_s_frequency,
-       .s_std = tvaudio_s_std,
        .s_tuner = tvaudio_s_tuner,
        .s_tuner = tvaudio_g_tuner,
 };
@@ -2088,17 +2070,6 @@ static int tvaudio_remove(struct i2c_client *client)
        return 0;
 }
 
-static int tvaudio_legacy_probe(struct i2c_adapter *adap)
-{
-       /* don't attach on saa7146 based cards,
-          because dedicated drivers are used */
-       if ((adap->id == I2C_HW_SAA7146))
-               return 0;
-       if (adap->class & I2C_CLASS_TV_ANALOG)
-               return 1;
-       return 0;
-}
-
 /* This driver supports many devices and the idea is to let the driver
    detect which device is present. So rather than listing all supported
    devices here, we pretend to support a single, fake device type. */
@@ -2110,10 +2081,7 @@ MODULE_DEVICE_TABLE(i2c, tvaudio_id);
 
 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
        .name = "tvaudio",
-       .driverid = I2C_DRIVERID_TVAUDIO,
-       .command = tvaudio_command,
        .probe = tvaudio_probe,
        .remove = tvaudio_remove,
-       .legacy_probe = tvaudio_legacy_probe,
        .id_table = tvaudio_id,
 };
index 3a5a95f134b4cae0cfe19b39c77894c5018a55d9..2d38e253f14e395416cbec779ffb6e31452f55ee 100644 (file)
@@ -10,7 +10,7 @@
 #include <linux/delay.h>
 #include <media/v4l2-device.h>
 #include <media/tvp5150.h>
-#include <media/v4l2-i2c-drv-legacy.h>
+#include <media/v4l2-i2c-drv.h>
 #include <media/v4l2-chip-ident.h>
 
 #include "tvp5150_reg.h"
@@ -19,14 +19,6 @@ MODULE_DESCRIPTION("Texas Instruments TVP5150A video decoder driver");
 MODULE_AUTHOR("Mauro Carvalho Chehab");
 MODULE_LICENSE("GPL");
 
-/* standard i2c insmod options */
-static unsigned short normal_i2c[] = {
-       0xb8 >> 1,
-       0xba >> 1,
-       I2C_CLIENT_END
-};
-
-I2C_CLIENT_INSMOD;
 
 static int debug;
 module_param(debug, int, 0);
@@ -77,7 +69,8 @@ struct tvp5150 {
        struct v4l2_subdev sd;
 
        v4l2_std_id norm;       /* Current set standard */
-       struct v4l2_routing route;
+       u32 input;
+       u32 output;
        int enable;
        int bright;
        int contrast;
@@ -288,10 +281,10 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd)
        int input = 0;
        unsigned char val;
 
-       if ((decoder->route.output & TVP5150_BLACK_SCREEN) || !decoder->enable)
+       if ((decoder->output & TVP5150_BLACK_SCREEN) || !decoder->enable)
                input = 8;
 
-       switch (decoder->route.input) {
+       switch (decoder->input) {
        case TVP5150_COMPOSITE1:
                input |= 2;
                /* fall through */
@@ -307,8 +300,8 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd)
 
        v4l2_dbg(1, debug, sd, "Selecting video route: route input=%i, output=%i "
                        "=> tvp5150 input=%i, opmode=%i\n",
-                       decoder->route.input,decoder->route.output,
-                       input, opmode );
+                       decoder->input, decoder->output,
+                       input, opmode);
 
        tvp5150_write(sd, TVP5150_OP_MODE_CTL, opmode);
        tvp5150_write(sd, TVP5150_VD_IN_SRC_SEL_1, input);
@@ -317,7 +310,7 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd)
         * For Composite and TV, it should be the reverse
         */
        val = tvp5150_read(sd, TVP5150_MISC_CTL);
-       if (decoder->route.input == TVP5150_SVIDEO)
+       if (decoder->input == TVP5150_SVIDEO)
                val = (val & ~0x40) | 0x10;
        else
                val = (val & ~0x10) | 0x40;
@@ -886,11 +879,13 @@ static int tvp5150_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
                        I2C Command
  ****************************************************************************/
 
-static int tvp5150_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int tvp5150_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        struct tvp5150 *decoder = to_tvp5150(sd);
 
-       decoder->route = *route;
+       decoder->input = input;
+       decoder->output = output;
        tvp5150_selmux(sd);
        return 0;
 }
@@ -1026,11 +1021,6 @@ static int tvp5150_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
        return -EINVAL;
 }
 
-static int tvp5150_command(struct i2c_client *client, unsigned cmd, void *arg)
-{
-       return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
-}
-
 /* ----------------------------------------------------------------------- */
 
 static const struct v4l2_subdev_core_ops tvp5150_core_ops = {
@@ -1038,6 +1028,7 @@ static const struct v4l2_subdev_core_ops tvp5150_core_ops = {
        .g_ctrl = tvp5150_g_ctrl,
        .s_ctrl = tvp5150_s_ctrl,
        .queryctrl = tvp5150_queryctrl,
+       .s_std = tvp5150_s_std,
        .reset = tvp5150_reset,
        .g_chip_ident = tvp5150_g_chip_ident,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
@@ -1047,7 +1038,6 @@ static const struct v4l2_subdev_core_ops tvp5150_core_ops = {
 };
 
 static const struct v4l2_subdev_tuner_ops tvp5150_tuner_ops = {
-       .s_std = tvp5150_s_std,
        .g_tuner = tvp5150_g_tuner,
 };
 
@@ -1090,7 +1080,7 @@ static int tvp5150_probe(struct i2c_client *c,
                 c->addr << 1, c->adapter->name);
 
        core->norm = V4L2_STD_ALL;      /* Default is autodetect */
-       core->route.input = TVP5150_COMPOSITE1;
+       core->input = TVP5150_COMPOSITE1;
        core->enable = 1;
        core->bright = 128;
        core->contrast = 128;
@@ -1125,9 +1115,7 @@ MODULE_DEVICE_TABLE(i2c, tvp5150_id);
 
 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
        .name = "tvp5150",
-       .command = tvp5150_command,
        .probe = tvp5150_probe,
        .remove = tvp5150_remove,
-       .legacy_class = I2C_CLASS_TV_ANALOG | I2C_CLASS_TV_DIGITAL,
        .id_table = tvp5150_id,
 };
index c0ac651bb35844bd8d63d44b2c5b7526fba78ac3..a07a3fbb51eb8aad3af201289ff9a677e765dc5f 100644 (file)
@@ -124,17 +124,18 @@ static int upd64031a_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *
 
 /* ------------------------------------------------------------------------ */
 
-static int upd64031a_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int upd64031a_s_routing(struct v4l2_subdev *sd,
+                              u32 input, u32 output, u32 config)
 {
        struct upd64031a_state *state = to_state(sd);
        u8 r00, r05, r08;
 
-       state->gr_mode = (route->input & 3) << 6;
-       state->direct_3dycs_connect = (route->input & 0xc) << 4;
+       state->gr_mode = (input & 3) << 6;
+       state->direct_3dycs_connect = (input & 0xc) << 4;
        state->ext_comp_sync =
-               (route->input & UPD64031A_COMPOSITE_EXTERNAL) << 1;
+               (input & UPD64031A_COMPOSITE_EXTERNAL) << 1;
        state->ext_vert_sync =
-               (route->input & UPD64031A_VERTICAL_EXTERNAL) << 2;
+               (input & UPD64031A_VERTICAL_EXTERNAL) << 2;
        r00 = (state->regs[R00] & ~GR_MODE_MASK) | state->gr_mode;
        r05 = (state->regs[R00] & ~SYNC_CIRCUIT_MASK) |
                state->ext_comp_sync | state->ext_vert_sync;
index 410c915d51fa3e56e70122ae9d800b6d4430d910..6eb0e5b00c3282012c8437d45a3d78fdd6bca068 100644 (file)
@@ -102,15 +102,16 @@ static u8 upd64083_read(struct v4l2_subdev *sd, u8 reg)
 
 /* ------------------------------------------------------------------------ */
 
-static int upd64083_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int upd64083_s_routing(struct v4l2_subdev *sd,
+                             u32 input, u32 output, u32 config)
 {
        struct upd64083_state *state = to_state(sd);
        u8 r00, r02;
 
-       if (route->input > 7 || (route->input & 6) == 6)
+       if (input > 7 || (input & 6) == 6)
                return -EINVAL;
-       state->mode = (route->input & 3) << 6;
-       state->ext_y_adc = (route->input & UPD64083_EXT_Y_ADC) << 3;
+       state->mode = (input & 3) << 6;
+       state->ext_y_adc = (input & UPD64083_EXT_Y_ADC) << 3;
        r00 = (state->regs[R00] & ~(3 << 6)) | state->mode;
        r02 = (state->regs[R02] & ~(1 << 5)) | state->ext_y_adc;
        upd64083_write(sd, R00, r00);
index a0feb1c97736b4c6ac2e68be71ac4857709526a7..8bc03b9e1315b2a517df95392b2cd76b97b08bcd 100644 (file)
@@ -2597,7 +2597,6 @@ int usbvision_muxsel(struct usb_usbvision *usbvision, int channel)
        /* inputs #1 and #2 are variable for SAA7111 and SAA7113 */
        int mode[4]= {SAA7115_COMPOSITE0, 0, 0, SAA7115_COMPOSITE3};
        int audio[]= {1, 0, 0, 0};
-       struct v4l2_routing route;
        //channel 0 is TV with audiochannel 1 (tuner mono)
        //channel 1 is Composite with audio channel 0 (line in)
        //channel 2 is S-Video with audio channel 0 (line in)
@@ -2630,9 +2629,7 @@ int usbvision_muxsel(struct usb_usbvision *usbvision, int channel)
                        mode[2] = SAA7115_SVIDEO1;
                        break;
        }
-       route.input = mode[channel];
-       route.output = 0;
-       call_all(usbvision, video, s_routing, &route);
+       call_all(usbvision, video, s_routing, mode[channel], 0, 0);
        usbvision_set_audio(usbvision, audio[channel]);
        return 0;
 }
index dd2f8f27c73bbbc38244ada5040d043dd6a013c9..1fe5befbbf85b8c06ae2dbfa96e88bd866c86349 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/version.h>
 #include <linux/utsname.h>
 #include <linux/init.h>
 #include <asm/uaccess.h>
@@ -247,7 +246,8 @@ int usbvision_i2c_register(struct usb_usbvision *usbvision)
        switch (usbvision_device_data[usbvision->DevModel].Codec) {
        case CODEC_SAA7113:
        case CODEC_SAA7111:
-               v4l2_i2c_new_probed_subdev(&usbvision->i2c_adap, "saa7115",
+               v4l2_i2c_new_probed_subdev(&usbvision->v4l2_dev,
+                               &usbvision->i2c_adap, "saa7115",
                                "saa7115_auto", saa711x_addrs);
                break;
        }
@@ -256,13 +256,15 @@ int usbvision_i2c_register(struct usb_usbvision *usbvision)
                enum v4l2_i2c_tuner_type type;
                struct tuner_setup tun_setup;
 
-               sd = v4l2_i2c_new_probed_subdev(&usbvision->i2c_adap, "tuner",
+               sd = v4l2_i2c_new_probed_subdev(&usbvision->v4l2_dev,
+                               &usbvision->i2c_adap, "tuner",
                                "tuner", v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
                /* depending on whether we found a demod or not, select
                   the tuner type. */
                type = sd ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
 
-               sd = v4l2_i2c_new_probed_subdev(&usbvision->i2c_adap, "tuner",
+               sd = v4l2_i2c_new_probed_subdev(&usbvision->v4l2_dev,
+                               &usbvision->i2c_adap, "tuner",
                                "tuner", v4l2_i2c_tuner_addrs(type));
 
                if (usbvision->tuner_type != -1) {
index fa62a2fd7b22ee342102711712cf9c39306d3ae1..d7056a5b7f9b1bc9a463d70282cd8be47dcabc8d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * USB USBVISION Video device driver 0.9.9
+ * USB USBVISION Video device driver 0.9.10
  *
  *
  *
@@ -79,7 +79,7 @@
 #define DRIVER_LICENSE "GPL"
 #define USBVISION_DRIVER_VERSION_MAJOR 0
 #define USBVISION_DRIVER_VERSION_MINOR 9
-#define USBVISION_DRIVER_VERSION_PATCHLEVEL 9
+#define USBVISION_DRIVER_VERSION_PATCHLEVEL 10
 #define USBVISION_DRIVER_VERSION KERNEL_VERSION(USBVISION_DRIVER_VERSION_MAJOR,\
 USBVISION_DRIVER_VERSION_MINOR,\
 USBVISION_DRIVER_VERSION_PATCHLEVEL)
@@ -621,7 +621,7 @@ static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *id)
        usbvision->tvnormId=*id;
 
        mutex_lock(&usbvision->lock);
-       call_all(usbvision, tuner, s_std, usbvision->tvnormId);
+       call_all(usbvision, core, s_std, usbvision->tvnormId);
        mutex_unlock(&usbvision->lock);
        /* propagate the change to the decoder */
        usbvision_muxsel(usbvision, usbvision->ctl_input);
@@ -1522,7 +1522,8 @@ static int __devinit usbvision_register_video(struct usb_usbvision *usbvision)
  * Returns NULL on error, a pointer to usb_usbvision else.
  *
  */
-static struct usb_usbvision *usbvision_alloc(struct usb_device *dev)
+static struct usb_usbvision *usbvision_alloc(struct usb_device *dev,
+                                            struct usb_interface *intf)
 {
        struct usb_usbvision *usbvision;
 
@@ -1531,7 +1532,7 @@ static struct usb_usbvision *usbvision_alloc(struct usb_device *dev)
                return NULL;
 
        usbvision->dev = dev;
-       if (v4l2_device_register(&dev->dev, &usbvision->v4l2_dev))
+       if (v4l2_device_register(&intf->dev, &usbvision->v4l2_dev))
                goto err_free;
 
        mutex_init(&usbvision->lock);   /* available */
@@ -1669,7 +1670,8 @@ static int __devinit usbvision_probe(struct usb_interface *intf,
                return -ENODEV;
        }
 
-       if ((usbvision = usbvision_alloc(dev)) == NULL) {
+       usbvision = usbvision_alloc(dev, intf);
+       if (usbvision == NULL) {
                dev_err(&intf->dev, "%s: couldn't allocate USBVision struct\n", __func__);
                return -ENOMEM;
        }
index c2d9760de832795b1a9fa9a97dbc15c9c5dc24f2..2956a7637219acd6735a53f7d5292fec4ad45926 100644 (file)
@@ -9,7 +9,7 @@ config USB_VIDEO_CLASS
 config USB_VIDEO_CLASS_INPUT_EVDEV
        bool "UVC input events device support"
        default y
-       depends on USB_VIDEO_CLASS && INPUT
+       depends on USB_VIDEO_CLASS=INPUT || INPUT=y
        ---help---
          This option makes USB Video Class devices register an input device
          to report button events.
index b617bf05e2d7ce39f1a34a5b0bdd1b704e2188a5..02f2a6d18b4582987e1ce0ade96ba510738093ff 100644 (file)
@@ -575,6 +575,8 @@ static noinline long v4l1_compat_get_input_info(
                        chan->norm = VIDEO_MODE_NTSC;
                if (sid & V4L2_STD_SECAM)
                        chan->norm = VIDEO_MODE_SECAM;
+               if (sid == V4L2_STD_ALL)
+                       chan->norm = VIDEO_MODE_AUTO;
        }
 done:
        return err;
@@ -601,6 +603,9 @@ static noinline long v4l1_compat_set_input(
        case VIDEO_MODE_SECAM:
                sid = V4L2_STD_SECAM;
                break;
+       case VIDEO_MODE_AUTO:
+               sid = V4L2_STD_ALL;
+               break;
        }
        if (0 != sid) {
                err = drv(file, VIDIOC_S_STD, &sid);
@@ -804,9 +809,9 @@ static noinline long v4l1_compat_select_tuner(
 
        t.index = tun->tuner;
 
-       err = drv(file, VIDIOC_S_INPUT, &t);
+       err = drv(file, VIDIOC_S_TUNER, &t);
        if (err < 0)
-               dprintk("VIDIOCSTUNER / VIDIOC_S_INPUT: %ld\n", err);
+               dprintk("VIDIOCSTUNER / VIDIOC_S_TUNER: %ld\n", err);
        return err;
 }
 
index 1da8cb836cb6a247622a332a8674364b45baf92a..f576ef66b8078a79f42dfd9667d498a61118338f 100644 (file)
@@ -739,33 +739,8 @@ EXPORT_SYMBOL(v4l2_chip_ident_i2c_client);
 
 /* ----------------------------------------------------------------- */
 
-/* Helper function for I2C legacy drivers */
+/* I2C Helper functions */
 
-int v4l2_i2c_attach(struct i2c_adapter *adapter, int address, struct i2c_driver *driver,
-               const char *name,
-               int (*probe)(struct i2c_client *, const struct i2c_device_id *))
-{
-       struct i2c_client *client;
-       int err;
-
-       client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-       if (!client)
-               return -ENOMEM;
-
-       client->addr = address;
-       client->adapter = adapter;
-       client->driver = driver;
-       strlcpy(client->name, name, sizeof(client->name));
-
-       err = probe(client, NULL);
-       if (err == 0) {
-               i2c_attach_client(client);
-       } else {
-               kfree(client);
-       }
-       return err != -ENOMEM ? 0 : err;
-}
-EXPORT_SYMBOL(v4l2_i2c_attach);
 
 void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client,
                const struct v4l2_subdev_ops *ops)
@@ -785,18 +760,16 @@ EXPORT_SYMBOL_GPL(v4l2_i2c_subdev_init);
 
 
 
-/* Load an i2c sub-device. It assumes that i2c_get_adapdata(adapter)
-   returns the v4l2_device and that i2c_get_clientdata(client)
-   returns the v4l2_subdev. */
-struct v4l2_subdev *v4l2_i2c_new_subdev(struct i2c_adapter *adapter,
+/* Load an i2c sub-device. */
+struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
+               struct i2c_adapter *adapter,
                const char *module_name, const char *client_type, u8 addr)
 {
-       struct v4l2_device *dev = i2c_get_adapdata(adapter);
        struct v4l2_subdev *sd = NULL;
        struct i2c_client *client;
        struct i2c_board_info info;
 
-       BUG_ON(!dev);
+       BUG_ON(!v4l2_dev);
 
        if (module_name)
                request_module(module_name);
@@ -823,7 +796,7 @@ struct v4l2_subdev *v4l2_i2c_new_subdev(struct i2c_adapter *adapter,
 
        /* Register with the v4l2_device which increases the module's
           use count as well. */
-       if (v4l2_device_register_subdev(dev, sd))
+       if (v4l2_device_register_subdev(v4l2_dev, sd))
                sd = NULL;
        /* Decrease the module use count to match the first try_module_get. */
        module_put(client->driver->driver.owner);
@@ -837,19 +810,17 @@ error:
 }
 EXPORT_SYMBOL_GPL(v4l2_i2c_new_subdev);
 
-/* Probe and load an i2c sub-device. It assumes that i2c_get_adapdata(adapter)
-   returns the v4l2_device and that i2c_get_clientdata(client)
-   returns the v4l2_subdev. */
-struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct i2c_adapter *adapter,
+/* Probe and load an i2c sub-device. */
+struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct v4l2_device *v4l2_dev,
+       struct i2c_adapter *adapter,
        const char *module_name, const char *client_type,
        const unsigned short *addrs)
 {
-       struct v4l2_device *dev = i2c_get_adapdata(adapter);
        struct v4l2_subdev *sd = NULL;
        struct i2c_client *client = NULL;
        struct i2c_board_info info;
 
-       BUG_ON(!dev);
+       BUG_ON(!v4l2_dev);
 
        if (module_name)
                request_module(module_name);
@@ -875,7 +846,7 @@ struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct i2c_adapter *adapter,
 
        /* Register with the v4l2_device which increases the module's
           use count as well. */
-       if (v4l2_device_register_subdev(dev, sd))
+       if (v4l2_device_register_subdev(v4l2_dev, sd))
                sd = NULL;
        /* Decrease the module use count to match the first try_module_get. */
        module_put(client->driver->driver.owner);
@@ -889,6 +860,17 @@ error:
 }
 EXPORT_SYMBOL_GPL(v4l2_i2c_new_probed_subdev);
 
+struct v4l2_subdev *v4l2_i2c_new_probed_subdev_addr(struct v4l2_device *v4l2_dev,
+               struct i2c_adapter *adapter,
+               const char *module_name, const char *client_type, u8 addr)
+{
+       unsigned short addrs[2] = { addr, I2C_CLIENT_END };
+
+       return v4l2_i2c_new_probed_subdev(v4l2_dev, adapter,
+                       module_name, client_type, addrs);
+}
+EXPORT_SYMBOL_GPL(v4l2_i2c_new_probed_subdev_addr);
+
 /* Return i2c client address of v4l2_subdev. */
 unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd)
 {
index 91228b3df07d92f639804c89d1a98953829f6bd9..31eac66411d736e4330119900e111aa921e841e4 100644 (file)
@@ -229,7 +229,7 @@ static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
 static int v4l2_open(struct inode *inode, struct file *filp)
 {
        struct video_device *vdev;
-       int ret;
+       int ret = 0;
 
        /* Check if the video device is available */
        mutex_lock(&videodev_lock);
@@ -243,7 +243,9 @@ static int v4l2_open(struct inode *inode, struct file *filp)
        /* and increase the device refcount */
        video_get(vdev);
        mutex_unlock(&videodev_lock);
-       ret = vdev->fops->open(filp);
+       if (vdev->fops->open)
+               ret = vdev->fops->open(filp);
+
        /* decrease the refcount in case of an error */
        if (ret)
                video_put(vdev);
@@ -254,7 +256,10 @@ static int v4l2_open(struct inode *inode, struct file *filp)
 static int v4l2_release(struct inode *inode, struct file *filp)
 {
        struct video_device *vdev = video_devdata(filp);
-       int ret = vdev->fops->release(filp);
+       int ret = 0;
+
+       if (vdev->fops->release)
+               vdev->fops->release(filp);
 
        /* decrease the refcount unconditionally since the release()
           return value is ignored. */
index f41c6f506f4209e11ba7885f1833a43ad7656f62..88f10d6cbc92e899fd2c19d7f65797685728e5cd 100644 (file)
@@ -275,32 +275,6 @@ static const char *v4l2_ioctls[] = {
 };
 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
 
-static const char *v4l2_int_ioctls[] = {
-       [_IOC_NR(AUDC_SET_RADIO)]              = "AUDC_SET_RADIO",
-
-       [_IOC_NR(TUNER_SET_TYPE_ADDR)]         = "TUNER_SET_TYPE_ADDR",
-       [_IOC_NR(TUNER_SET_STANDBY)]           = "TUNER_SET_STANDBY",
-       [_IOC_NR(TUNER_SET_CONFIG)]            = "TUNER_SET_CONFIG",
-
-       [_IOC_NR(VIDIOC_INT_S_TUNER_MODE)]     = "VIDIOC_INT_S_TUNER_MODE",
-       [_IOC_NR(VIDIOC_INT_RESET)]            = "VIDIOC_INT_RESET",
-       [_IOC_NR(VIDIOC_INT_AUDIO_CLOCK_FREQ)] = "VIDIOC_INT_AUDIO_CLOCK_FREQ",
-       [_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE)]  = "VIDIOC_INT_DECODE_VBI_LINE",
-       [_IOC_NR(VIDIOC_INT_S_VBI_DATA)]       = "VIDIOC_INT_S_VBI_DATA",
-       [_IOC_NR(VIDIOC_INT_G_VBI_DATA)]       = "VIDIOC_INT_G_VBI_DATA",
-       [_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)]   = "VIDIOC_INT_I2S_CLOCK_FREQ",
-       [_IOC_NR(VIDIOC_INT_S_STANDBY)]        = "VIDIOC_INT_S_STANDBY",
-       [_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)]  = "VIDIOC_INT_S_AUDIO_ROUTING",
-       [_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING)]  = "VIDIOC_INT_G_AUDIO_ROUTING",
-       [_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING)]  = "VIDIOC_INT_S_VIDEO_ROUTING",
-       [_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING)]  = "VIDIOC_INT_G_VIDEO_ROUTING",
-       [_IOC_NR(VIDIOC_INT_S_CRYSTAL_FREQ)]   = "VIDIOC_INT_S_CRYSTAL_FREQ",
-       [_IOC_NR(VIDIOC_INT_INIT)]             = "VIDIOC_INT_INIT",
-       [_IOC_NR(VIDIOC_INT_G_STD_OUTPUT)]     = "VIDIOC_INT_G_STD_OUTPUT",
-       [_IOC_NR(VIDIOC_INT_S_STD_OUTPUT)]     = "VIDIOC_INT_S_STD_OUTPUT",
-};
-#define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)
-
 /* Common ioctl debug function. This function can be used by
    external ioctl messages as well as internal V4L ioctl */
 void v4l_printk_ioctl(unsigned int cmd)
@@ -309,12 +283,8 @@ void v4l_printk_ioctl(unsigned int cmd)
 
        switch (_IOC_TYPE(cmd)) {
        case 'd':
-               if (_IOC_NR(cmd) >= V4L2_INT_IOCTLS) {
-                       type = "v4l2_int";
-                       break;
-               }
-               printk("%s", v4l2_int_ioctls[_IOC_NR(cmd)]);
-               return;
+               type = "v4l2_int";
+               break;
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
        case 'v':
                if (_IOC_NR(cmd) >= V4L1_IOCTLS) {
diff --git a/drivers/media/video/v4l2-subdev.c b/drivers/media/video/v4l2-subdev.c
deleted file mode 100644 (file)
index dc88167..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-    V4L2 sub-device support.
-
-    Copyright (C) 2008  Hans Verkuil <hverkuil@xs4all.nl>
-
-    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 <linux/types.h>
-#include <linux/ioctl.h>
-#include <linux/i2c.h>
-#include <linux/videodev2.h>
-#include <media/v4l2-subdev.h>
-
-int v4l2_subdev_command(struct v4l2_subdev *sd, unsigned cmd, void *arg)
-{
-       switch (cmd) {
-       case VIDIOC_QUERYCTRL:
-               return v4l2_subdev_call(sd, core, queryctrl, arg);
-       case VIDIOC_G_CTRL:
-               return v4l2_subdev_call(sd, core, g_ctrl, arg);
-       case VIDIOC_S_CTRL:
-               return v4l2_subdev_call(sd, core, s_ctrl, arg);
-       case VIDIOC_G_EXT_CTRLS:
-               return v4l2_subdev_call(sd, core, g_ext_ctrls, arg);
-       case VIDIOC_S_EXT_CTRLS:
-               return v4l2_subdev_call(sd, core, s_ext_ctrls, arg);
-       case VIDIOC_TRY_EXT_CTRLS:
-               return v4l2_subdev_call(sd, core, try_ext_ctrls, arg);
-       case VIDIOC_QUERYMENU:
-               return v4l2_subdev_call(sd, core, querymenu, arg);
-       case VIDIOC_LOG_STATUS:
-               return v4l2_subdev_call(sd, core, log_status);
-       case VIDIOC_DBG_G_CHIP_IDENT:
-               return v4l2_subdev_call(sd, core, g_chip_ident, arg);
-       case VIDIOC_INT_S_STANDBY:
-               return v4l2_subdev_call(sd, core, s_standby, arg ? (*(u32 *)arg) : 0);
-       case VIDIOC_INT_RESET:
-               return v4l2_subdev_call(sd, core, reset, arg ? (*(u32 *)arg) : 0);
-       case VIDIOC_INT_S_GPIO:
-               return v4l2_subdev_call(sd, core, s_gpio, arg ? (*(u32 *)arg) : 0);
-       case VIDIOC_INT_INIT:
-               return v4l2_subdev_call(sd, core, init, arg ? (*(u32 *)arg) : 0);
-#ifdef CONFIG_VIDEO_ADV_DEBUG
-       case VIDIOC_DBG_G_REGISTER:
-               return v4l2_subdev_call(sd, core, g_register, arg);
-       case VIDIOC_DBG_S_REGISTER:
-               return v4l2_subdev_call(sd, core, s_register, arg);
-#endif
-
-       case VIDIOC_INT_S_TUNER_MODE:
-               return v4l2_subdev_call(sd, tuner, s_mode, *(enum v4l2_tuner_type *)arg);
-       case AUDC_SET_RADIO:
-               return v4l2_subdev_call(sd, tuner, s_radio);
-       case VIDIOC_S_TUNER:
-               return v4l2_subdev_call(sd, tuner, s_tuner, arg);
-       case VIDIOC_G_TUNER:
-               return v4l2_subdev_call(sd, tuner, g_tuner, arg);
-       case VIDIOC_S_STD:
-               return v4l2_subdev_call(sd, tuner, s_std, *(v4l2_std_id *)arg);
-       case VIDIOC_S_FREQUENCY:
-               return v4l2_subdev_call(sd, tuner, s_frequency, arg);
-       case VIDIOC_G_FREQUENCY:
-               return v4l2_subdev_call(sd, tuner, g_frequency, arg);
-       case TUNER_SET_TYPE_ADDR:
-               return v4l2_subdev_call(sd, tuner, s_type_addr, arg);
-       case TUNER_SET_CONFIG:
-               return v4l2_subdev_call(sd, tuner, s_config, arg);
-
-       case VIDIOC_INT_AUDIO_CLOCK_FREQ:
-               return v4l2_subdev_call(sd, audio, s_clock_freq, *(u32 *)arg);
-       case VIDIOC_INT_S_AUDIO_ROUTING:
-               return v4l2_subdev_call(sd, audio, s_routing, arg);
-       case VIDIOC_INT_I2S_CLOCK_FREQ:
-               return v4l2_subdev_call(sd, audio, s_i2s_clock_freq, *(u32 *)arg);
-
-       case VIDIOC_INT_S_VIDEO_ROUTING:
-               return v4l2_subdev_call(sd, video, s_routing, arg);
-       case VIDIOC_INT_S_CRYSTAL_FREQ:
-               return v4l2_subdev_call(sd, video, s_crystal_freq, arg);
-       case VIDIOC_INT_DECODE_VBI_LINE:
-               return v4l2_subdev_call(sd, video, decode_vbi_line, arg);
-       case VIDIOC_INT_S_VBI_DATA:
-               return v4l2_subdev_call(sd, video, s_vbi_data, arg);
-       case VIDIOC_INT_G_VBI_DATA:
-               return v4l2_subdev_call(sd, video, g_vbi_data, arg);
-       case VIDIOC_G_SLICED_VBI_CAP:
-               return v4l2_subdev_call(sd, video, g_sliced_vbi_cap, arg);
-       case VIDIOC_ENUM_FMT:
-               return v4l2_subdev_call(sd, video, enum_fmt, arg);
-       case VIDIOC_TRY_FMT:
-               return v4l2_subdev_call(sd, video, try_fmt, arg);
-       case VIDIOC_S_FMT:
-               return v4l2_subdev_call(sd, video, s_fmt, arg);
-       case VIDIOC_G_FMT:
-               return v4l2_subdev_call(sd, video, g_fmt, arg);
-       case VIDIOC_INT_S_STD_OUTPUT:
-               return v4l2_subdev_call(sd, video, s_std_output, *(v4l2_std_id *)arg);
-       case VIDIOC_QUERYSTD:
-               return v4l2_subdev_call(sd, video, querystd, arg);
-       case VIDIOC_INT_G_INPUT_STATUS:
-               return v4l2_subdev_call(sd, video, g_input_status, arg);
-       case VIDIOC_STREAMON:
-               return v4l2_subdev_call(sd, video, s_stream, 1);
-       case VIDIOC_STREAMOFF:
-               return v4l2_subdev_call(sd, video, s_stream, 0);
-       case VIDIOC_S_PARM:
-               return v4l2_subdev_call(sd, video, s_parm, arg);
-       case VIDIOC_G_PARM:
-               return v4l2_subdev_call(sd, video, g_parm, arg);
-
-       default:
-               return v4l2_subdev_call(sd, core, ioctl, cmd, arg);
-       }
-}
-EXPORT_SYMBOL_GPL(v4l2_subdev_command);
index 8da4dd1e0e94ac1300fb2dcd0530d6f724045fdd..43e0998adb534bb857fdc88ada51117c914ab411 100644 (file)
@@ -60,8 +60,8 @@
 // #define VINO_DEBUG
 // #define VINO_DEBUG_INT
 
-#define VINO_MODULE_VERSION "0.0.5"
-#define VINO_VERSION_CODE KERNEL_VERSION(0, 0, 5)
+#define VINO_MODULE_VERSION "0.0.6"
+#define VINO_VERSION_CODE KERNEL_VERSION(0, 0, 6)
 
 MODULE_DESCRIPTION("SGI VINO Video4Linux2 driver");
 MODULE_VERSION(VINO_MODULE_VERSION);
@@ -2565,12 +2565,11 @@ static int vino_acquire_input(struct vino_channel_settings *vcs)
                int input;
                int data_norm;
                v4l2_std_id norm;
-               struct v4l2_routing route = { 0, 0 };
 
                input = VINO_INPUT_COMPOSITE;
 
-               route.input = vino_get_saa7191_input(input);
-               ret = decoder_call(video, s_routing, &route);
+               ret = decoder_call(video, s_routing,
+                               vino_get_saa7191_input(input), 0, 0);
                if (ret) {
                        ret = -EINVAL;
                        goto out;
@@ -2589,7 +2588,7 @@ static int vino_acquire_input(struct vino_channel_settings *vcs)
                        }
                        if (data_norm == 3)
                                data_norm = VINO_DATA_NORM_PAL;
-                       ret = decoder_call(tuner, s_std, norm);
+                       ret = decoder_call(core, s_std, norm);
                }
 
                spin_lock_irqsave(&vino_drvdata->input_lock, flags);
@@ -2656,10 +2655,9 @@ static int vino_set_input(struct vino_channel_settings *vcs, int input)
                if (vino_drvdata->decoder_owner == vcs->channel) {
                        int data_norm;
                        v4l2_std_id norm;
-                       struct v4l2_routing route = { 0, 0 };
 
-                       route.input = vino_get_saa7191_input(input);
-                       ret = decoder_call(video, s_routing, &route);
+                       ret = decoder_call(video, s_routing,
+                                       vino_get_saa7191_input(input), 0, 0);
                        if (ret) {
                                vino_drvdata->decoder_owner = VINO_NO_CHANNEL;
                                ret = -EINVAL;
@@ -2679,7 +2677,7 @@ static int vino_set_input(struct vino_channel_settings *vcs, int input)
                                }
                                if (data_norm == 3)
                                        data_norm = VINO_DATA_NORM_PAL;
-                               ret = decoder_call(tuner, s_std, norm);
+                               ret = decoder_call(core, s_std, norm);
                        }
 
                        spin_lock_irqsave(&vino_drvdata->input_lock, flags);
@@ -2813,7 +2811,7 @@ static int vino_set_data_norm(struct vino_channel_settings *vcs,
                 * as it may take a while... */
 
                norm = vino_data_norms[data_norm].std;
-               err = decoder_call(tuner, s_std, norm);
+               err = decoder_call(core, s_std, norm);
 
                spin_lock_irqsave(&vino_drvdata->input_lock, *flags);
 
@@ -4266,7 +4264,6 @@ static int vino_init_channel_settings(struct vino_channel_settings *vcs,
 
 static int __init vino_module_init(void)
 {
-       unsigned short addr[] = { 0, I2C_CLIENT_END };
        int ret;
 
        printk(KERN_INFO "SGI VINO driver version %s\n",
@@ -4336,12 +4333,12 @@ static int __init vino_module_init(void)
        }
        vino_init_stage++;
 
-       addr[0] = 0x45;
-       vino_drvdata->decoder = v4l2_i2c_new_probed_subdev(&vino_i2c_adapter,
-                       "saa7191", "saa7191", addr);
-       addr[0] = 0x2b;
-       vino_drvdata->camera = v4l2_i2c_new_probed_subdev(&vino_i2c_adapter,
-                       "indycam", "indycam", addr);
+       vino_drvdata->decoder =
+               v4l2_i2c_new_probed_subdev_addr(&vino_drvdata->v4l2_dev,
+                       &vino_i2c_adapter, "saa7191", "saa7191", 0x45);
+       vino_drvdata->camera =
+               v4l2_i2c_new_probed_subdev_addr(&vino_drvdata->v4l2_dev,
+                       &vino_i2c_adapter, "indycam", "indycam", 0x2b);
 
        dprintk("init complete!\n");
 
index 42e23a4fa60715cc129ec3b361f6c61966b17a97..38e53b303cc35bd836361c9e0652aaec23a67489 100644 (file)
@@ -134,11 +134,11 @@ static int vp27smpx_log_status(struct v4l2_subdev *sd)
 static const struct v4l2_subdev_core_ops vp27smpx_core_ops = {
        .log_status = vp27smpx_log_status,
        .g_chip_ident = vp27smpx_g_chip_ident,
+       .s_std = vp27smpx_s_std,
 };
 
 static const struct v4l2_subdev_tuner_ops vp27smpx_tuner_ops = {
        .s_radio = vp27smpx_s_radio,
-       .s_std = vp27smpx_s_std,
        .s_tuner = vp27smpx_s_tuner,
        .g_tuner = vp27smpx_g_tuner,
 };
index 2fa7e8bb5746fa7893dc7f07fefb43b79b95e872..97e0ce28ff18f91655d4e69b928c54ad0a2b0e47 100644 (file)
@@ -376,33 +376,34 @@ static int vpx3220_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
        return 0;
 }
 
-static int vpx3220_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int vpx3220_s_routing(struct v4l2_subdev *sd,
+                            u32 input, u32 output, u32 config)
 {
        int data;
 
-       /* RJ:   route->input = 0: ST8 (PCTV) input
-                route->input = 1: COMPOSITE  input
-                route->input = 2: SVHS       input  */
+       /* RJ:   input = 0: ST8 (PCTV) input
+                input = 1: COMPOSITE  input
+                input = 2: SVHS       input  */
 
-       const int input[3][2] = {
+       const int input_vals[3][2] = {
                {0x0c, 0},
                {0x0d, 0},
                {0x0e, 1}
        };
 
-       if (route->input < 0 || route->input > 2)
+       if (input < 0 || input > 2)
                return -EINVAL;
 
-       v4l2_dbg(1, debug, sd, "input switched to %s\n", inputs[route->input]);
+       v4l2_dbg(1, debug, sd, "input switched to %s\n", inputs[input]);
 
-       vpx3220_write(sd, 0x33, input[route->input][0]);
+       vpx3220_write(sd, 0x33, input_vals[input][0]);
 
        data = vpx3220_fp_read(sd, 0xf2) & ~(0x0020);
        if (data < 0)
                return data;
        /* 0x0010 is required to latch the setting */
        vpx3220_fp_write(sd, 0xf2,
-                       data | (input[route->input][1] << 5) | 0x0010);
+                       data | (input_vals[input][1] << 5) | 0x0010);
 
        udelay(10);
        return 0;
@@ -516,9 +517,6 @@ static const struct v4l2_subdev_core_ops vpx3220_core_ops = {
        .g_ctrl = vpx3220_g_ctrl,
        .s_ctrl = vpx3220_s_ctrl,
        .queryctrl = vpx3220_queryctrl,
-};
-
-static const struct v4l2_subdev_tuner_ops vpx3220_tuner_ops = {
        .s_std = vpx3220_s_std,
 };
 
@@ -531,7 +529,6 @@ static const struct v4l2_subdev_video_ops vpx3220_video_ops = {
 
 static const struct v4l2_subdev_ops vpx3220_ops = {
        .core = &vpx3220_core_ops,
-       .tuner = &vpx3220_tuner_ops,
        .video = &vpx3220_video_ops,
 };
 
index 3b08bc4af909c57131ed90d67d76e496809103cb..f59b2bd07e898e44a738b4e38d769fb43e8fbfa1 100644 (file)
@@ -3440,7 +3440,7 @@ w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
        if (!cam)
                return -ENOMEM;
 
-       err = v4l2_device_register(&udev->dev, &cam->v4l2_dev);
+       err = v4l2_device_register(&intf->dev, &cam->v4l2_dev);
        if (err)
                goto fail0;
 
@@ -3523,7 +3523,8 @@ w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
        w9968cf_turn_on_led(cam);
 
        w9968cf_i2c_init(cam);
-       cam->sensor_sd = v4l2_i2c_new_probed_subdev(&cam->i2c_adapter,
+       cam->sensor_sd = v4l2_i2c_new_probed_subdev(&cam->v4l2_dev,
+                       &cam->i2c_adapter,
                        "ovcamchip", "ovcamchip", addrs);
 
        usb_set_intfdata(intf, cam);
index fdfc6a4e1c8f92b703f137102404cd81177c5076..73ad864b4842151d304118367717a6165e4c3a8d 100644 (file)
@@ -134,7 +134,7 @@ static const struct w9968cf_format w9968cf_formatlist[] = {
 
 #define W9968CF_MODULE_NAME     "V4L driver for W996[87]CF JPEG USB " \
                                "Dual Mode Camera Chip"
-#define W9968CF_MODULE_VERSION  "1:1.33-basic"
+#define W9968CF_MODULE_VERSION  "1:1.34-basic"
 #define W9968CF_MODULE_AUTHOR   "(C) 2002-2004 Luca Risolia"
 #define W9968CF_AUTHOR_EMAIL    "<luca.risolia@studio.unibo.it>"
 #define W9968CF_MODULE_LICENSE  "GPL"
index eddf11abe1d9e93e279754da4e418f533b047be6..f1f261a35245830b4217268e92b6b34af66d43fd 100644 (file)
@@ -79,7 +79,8 @@ static int wm8775_write(struct v4l2_subdev *sd, int reg, u16 val)
        return -1;
 }
 
-static int wm8775_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
+static int wm8775_s_routing(struct v4l2_subdev *sd,
+                           u32 input, u32 output, u32 config)
 {
        struct wm8775_state *state = to_state(sd);
 
@@ -88,11 +89,11 @@ static int wm8775_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
           16 combinations.
           If only one input is active (the normal case) then the
           input values 1, 2, 4 or 8 should be used. */
-       if (route->input > 15) {
-               v4l2_err(sd, "Invalid input %d.\n", route->input);
+       if (input > 15) {
+               v4l2_err(sd, "Invalid input %d.\n", input);
                return -EINVAL;
        }
-       state->input = route->input;
+       state->input = input;
        if (state->muted)
                return 0;
        wm8775_write(sd, R21, 0x0c0);
index afecf32f1a87c5a709eccd0a8db5fa798f658350..d439c76b27e121d136b928a2b27aa960b0484a5d 100644 (file)
@@ -143,8 +143,8 @@ Private IOCTL to set up for displaying MJPEG
 #ifdef __KERNEL__
 
 #define MAJOR_VERSION 0                /* driver major version */
-#define MINOR_VERSION 9                /* driver minor version */
-#define RELEASE_VERSION 5      /* release version */
+#define MINOR_VERSION 10       /* driver minor version */
+#define RELEASE_VERSION 0      /* release version */
 
 #define ZORAN_NAME    "ZORAN"  /* name of the device */
 
index f91bba435ed56f394a96ef73e80446b6a6d4efe0..ea6c577b0eb3131f7366e5b163ed317de4dad623 100644 (file)
@@ -1087,10 +1087,8 @@ zr36057_init (struct zoran *zr)
                detect_guest_activity(zr);
        test_interrupts(zr);
        if (!pass_through) {
-               struct v4l2_routing route = { 2, 0 };
-
                decoder_call(zr, video, s_stream, 0);
-               encoder_call(zr, video, s_routing, &route);
+               encoder_call(zr, video, s_routing, 2, 0, 0);
        }
 
        zr->zoran_proc = NULL;
@@ -1360,11 +1358,13 @@ static int __devinit zoran_probe(struct pci_dev *pdev,
                goto zr_free_irq;
        }
 
-       zr->decoder = v4l2_i2c_new_probed_subdev(&zr->i2c_adapter,
-               zr->card.mod_decoder, zr->card.i2c_decoder, zr->card.addrs_decoder);
+       zr->decoder = v4l2_i2c_new_probed_subdev(&zr->v4l2_dev,
+               &zr->i2c_adapter, zr->card.mod_decoder, zr->card.i2c_decoder,
+               zr->card.addrs_decoder);
 
        if (zr->card.mod_encoder)
-               zr->encoder = v4l2_i2c_new_probed_subdev(&zr->i2c_adapter,
+               zr->encoder = v4l2_i2c_new_probed_subdev(&zr->v4l2_dev,
+                       &zr->i2c_adapter,
                        zr->card.mod_encoder, zr->card.i2c_encoder,
                        zr->card.addrs_encoder);
 
index e0223deed35edfc268917b5c22976ad25be1d1cb..f6c2fb4fc3b4d54ae56fbf30dc56763fee1474f2 100644 (file)
@@ -971,7 +971,6 @@ zr36057_enable_jpg (struct zoran          *zr,
        struct vfe_settings cap;
        int field_size =
            zr->jpg_buffers.buffer_size / zr->jpg_settings.field_per_buff;
-       struct v4l2_routing route = { 0, 0 };
 
        zr->codec_mode = mode;
 
@@ -994,8 +993,7 @@ zr36057_enable_jpg (struct zoran          *zr,
                 */
                set_videobus_dir(zr, 0);
                decoder_call(zr, video, s_stream, 1);
-               route.input = 0;
-               encoder_call(zr, video, s_routing, &route);
+               encoder_call(zr, video, s_routing, 0, 0, 0);
 
                /* Take the JPEG codec and the VFE out of sleep */
                jpeg_codec_sleep(zr, 0);
@@ -1043,8 +1041,7 @@ zr36057_enable_jpg (struct zoran          *zr,
                 */
                decoder_call(zr, video, s_stream, 0);
                set_videobus_dir(zr, 1);
-               route.input = 1;
-               encoder_call(zr, video, s_routing, &route);
+               encoder_call(zr, video, s_routing, 1, 0, 0);
 
                /* Take the JPEG codec and the VFE out of sleep */
                jpeg_codec_sleep(zr, 0);
@@ -1089,8 +1086,7 @@ zr36057_enable_jpg (struct zoran          *zr,
                zr36057_adjust_vfe(zr, mode);
 
                decoder_call(zr, video, s_stream, 1);
-               route.input = 0;
-               encoder_call(zr, video, s_routing, &route);
+               encoder_call(zr, video, s_routing, 0, 0, 0);
 
                dprintk(2, KERN_INFO "%s: enable_jpg(IDLE)\n", ZR_DEVNAME(zr));
                break;
@@ -1571,8 +1567,6 @@ zoran_set_pci_master (struct zoran *zr,
 void
 zoran_init_hardware (struct zoran *zr)
 {
-       struct v4l2_routing route = { 0, 0 };
-
        /* Enable bus-mastering */
        zoran_set_pci_master(zr, 1);
 
@@ -1581,16 +1575,14 @@ zoran_init_hardware (struct zoran *zr)
                zr->card.init(zr);
        }
 
-       route.input = zr->card.input[zr->input].muxsel;
-
        decoder_call(zr, core, init, 0);
-       decoder_call(zr, tuner, s_std, zr->norm);
-       decoder_call(zr, video, s_routing, &route);
+       decoder_call(zr, core, s_std, zr->norm);
+       decoder_call(zr, video, s_routing,
+               zr->card.input[zr->input].muxsel, 0, 0);
 
        encoder_call(zr, core, init, 0);
        encoder_call(zr, video, s_std_output, zr->norm);
-       route.input = 0;
-       encoder_call(zr, video, s_routing, &route);
+       encoder_call(zr, video, s_routing, 0, 0, 0);
 
        /* toggle JPEG codec sleep to sync PLL */
        jpeg_codec_sleep(zr, 1);
index f16e57cf11e40d7f368dac81e781b27677ac0ee0..092333b1c34f5c8808a3148c1b36ca52327e691a 100644 (file)
@@ -1018,10 +1018,8 @@ zoran_close(struct file  *file)
                zoran_set_pci_master(zr, 0);
 
                if (!pass_through) {    /* Switch to color bar */
-                       struct v4l2_routing route = { 2, 0 };
-
                        decoder_call(zr, video, s_stream, 0);
-                       encoder_call(zr, video, s_routing, &route);
+                       encoder_call(zr, video, s_routing, 2, 0, 0);
                }
        }
 
@@ -1449,7 +1447,7 @@ zoran_set_norm (struct zoran *zr,
                v4l2_std_id std = 0;
 
                decoder_call(zr, video, querystd, &std);
-               decoder_call(zr, tuner, s_std, std);
+               decoder_call(zr, core, s_std, std);
 
                /* let changes come into effect */
                ssleep(2);
@@ -1461,7 +1459,7 @@ zoran_set_norm (struct zoran *zr,
                                "%s: %s - no norm detected\n",
                                ZR_DEVNAME(zr), __func__);
                        /* reset norm */
-                       decoder_call(zr, tuner, s_std, zr->norm);
+                       decoder_call(zr, core, s_std, zr->norm);
                        return -EIO;
                }
 
@@ -1480,7 +1478,7 @@ zoran_set_norm (struct zoran *zr,
        if (on)
                zr36057_overlay(zr, 0);
 
-       decoder_call(zr, tuner, s_std, norm);
+       decoder_call(zr, core, s_std, norm);
        encoder_call(zr, video, s_std_output, norm);
 
        if (on)
@@ -1496,8 +1494,6 @@ static int
 zoran_set_input (struct zoran *zr,
                 int           input)
 {
-       struct v4l2_routing route = { 0, 0 };
-
        if (input == zr->input) {
                return 0;
        }
@@ -1519,10 +1515,10 @@ zoran_set_input (struct zoran *zr,
                return -EINVAL;
        }
 
-       route.input = zr->card.input[input].muxsel;
        zr->input = input;
 
-       decoder_call(zr, video, s_routing, &route);
+       decoder_call(zr, video, s_routing,
+                       zr->card.input[input].muxsel, 0, 0);
 
        return 0;
 }
@@ -1748,7 +1744,6 @@ jpgreqbuf_unlock_and_return:
        case BUZIOC_G_STATUS:
        {
                struct zoran_status *bstat = arg;
-               struct v4l2_routing route = { 0, 0 };
                int status = 0, res = 0;
                v4l2_std_id norm;
 
@@ -1762,8 +1757,6 @@ jpgreqbuf_unlock_and_return:
                        return -EINVAL;
                }
 
-               route.input = zr->card.input[bstat->input].muxsel;
-
                mutex_lock(&zr->resource_lock);
 
                if (zr->codec_mode != BUZ_MODE_IDLE) {
@@ -1775,7 +1768,8 @@ jpgreqbuf_unlock_and_return:
                        goto gstat_unlock_and_return;
                }
 
-               decoder_call(zr, video, s_routing, &route);
+               decoder_call(zr, video, s_routing,
+                               zr->card.input[bstat->input].muxsel, 0, 0);
 
                /* sleep 1 second */
                ssleep(1);
@@ -1785,8 +1779,8 @@ jpgreqbuf_unlock_and_return:
                decoder_call(zr, video, g_input_status, &status);
 
                /* restore previous input and norm */
-               route.input = zr->card.input[zr->input].muxsel;
-               decoder_call(zr, video, s_routing, &route);
+               decoder_call(zr, video, s_routing,
+                               zr->card.input[zr->input].muxsel, 0, 0);
 gstat_unlock_and_return:
                mutex_unlock(&zr->resource_lock);
 
index 221409fe168265f921bd0ff57b3f5271a58412d8..ac169c9eb18d04e958ff1b6bc406f5513efbf471 100644 (file)
@@ -26,7 +26,6 @@
  */
 
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/usb.h>
index 2fb95a5b72eb2ede1c55c295ab946c3b2cede474..f4a162a4bece30532ca15cf4a4f49e247787b160 100644 (file)
@@ -877,7 +877,7 @@ static int jmb38x_ms_probe(struct pci_dev *pdev,
        int pci_dev_busy = 0;
        int rc, cnt;
 
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc)
                return rc;
 
index ea3aafbbda449696b6653edc9ebf02094490e067..d0d126c6935497df2b2e09c6b9adae235b90e8b8 100644 (file)
@@ -1534,13 +1534,13 @@ mpt_mapresources(MPT_ADAPTER *ioc)
 
        pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)
-           && !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
+           && !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
                dinitprintk(ioc, printk(MYIOC_s_INFO_FMT
                    ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n",
                    ioc->name));
-       } else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)
-           && !pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
+       } else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
+           && !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
                dinitprintk(ioc, printk(MYIOC_s_INFO_FMT
                    ": 32 BIT PCI BUS DMA ADDRESSING SUPPORTED\n",
                    ioc->name));
index 12b732512e579049fe0152e1a570dd3594b8ad15..a9019f081b971b888464166c407a4c8aabb9da30 100644 (file)
@@ -2279,9 +2279,8 @@ mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
        mutex_lock(&ioc->sas_topology_mutex);
        list_for_each_entry_safe(port_info, n, &ioc->sas_topology, list) {
 
-               if (port_info->phy_info &&
-                   (!(port_info->phy_info[0].identify.device_info &
-                   MPI_SAS_DEVICE_INFO_SMP_TARGET)))
+               if (!(port_info->phy_info[0].identify.device_info &
+                   MPI_SAS_DEVICE_INFO_SMP_TARGET))
                        continue;
 
                if (mptsas_sas_expander_pg0(ioc, &buffer,
index f5cc95c564e22c1debd9b8d440ccb6ea29b65210..292b41e49fbd57c5881c03cf7daa889a72404948 100644 (file)
@@ -185,9 +185,9 @@ int i2o_dma_alloc(struct device *dev, struct i2o_dma *addr, size_t len)
        int dma_64 = 0;
 
        mutex_lock(&mem_lock);
-       if ((sizeof(dma_addr_t) > 4) && (pdev->dma_mask == DMA_64BIT_MASK)) {
+       if ((sizeof(dma_addr_t) > 4) && (pdev->dma_mask == DMA_BIT_MASK(64))) {
                dma_64 = 1;
-               if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+               if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                        mutex_unlock(&mem_lock);
                        return -ENOMEM;
                }
@@ -196,7 +196,7 @@ int i2o_dma_alloc(struct device *dev, struct i2o_dma *addr, size_t len)
        addr->virt = dma_alloc_coherent(dev, len, &addr->phys, GFP_KERNEL);
 
        if ((sizeof(dma_addr_t) > 4) && dma_64)
-               if (pci_set_dma_mask(pdev, DMA_64BIT_MASK))
+               if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)))
                        printk(KERN_WARNING "i2o: unable to set 64-bit DMA");
        mutex_unlock(&mem_lock);
 
index 25d6f234198367cd1f70895fc7ab7f030f7262e0..35ba2ae38b4233d541efed5ae35b7af98586a511 100644 (file)
@@ -334,7 +334,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev,
                return rc;
        }
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING "i2o: no suitable DMA found for %s\n",
                       pci_name(pdev));
                rc = -ENODEV;
@@ -397,7 +397,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev,
                }
 #ifdef CONFIG_I2O_EXT_ADAPTEC_DMA64
                if (sizeof(dma_addr_t) > 4) {
-                       if (pci_set_dma_mask(pdev, DMA_64BIT_MASK))
+                       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)))
                                printk(KERN_INFO "%s: 64-bit DMA unavailable\n",
                                       c->name);
                        else {
index be5672a98702615bb21585871ad0b2deefc8efdb..a6ef18259da033ea7a9d6426f53575de1a35e027 100644 (file)
@@ -324,7 +324,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev,
        int pci_dev_busy = 0;
        int rc;
 
-       rc = pci_set_dma_mask(dev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(dev, DMA_BIT_MASK(32));
        if (rc)
                return rc;
 
index 406da9a8d453718b7d057e174199a139cab332e1..c5b316e22371e687076eee25142bc0ae73de868c 100644 (file)
@@ -380,7 +380,7 @@ static int sdhci_pci_enable_dma(struct sdhci_host *host)
                        "doesn't fully claim to support it.\n");
        }
 
-       ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (ret)
                return ret;
 
index 4521b1ecce452607987b3d32c6251264de02d2b8..82d1e4de475bba283870d8a590416f9fc55161a8 100644 (file)
@@ -4,7 +4,7 @@
 
 # Core functionality.
 obj-$(CONFIG_MTD)              += mtd.o
-mtd-y                          := mtdcore.o mtdsuper.o
+mtd-y                          := mtdcore.o mtdsuper.o mtdbdi.o
 mtd-$(CONFIG_MTD_PARTITIONS)   += mtdpart.o
 
 obj-$(CONFIG_MTD_CONCAT)       += mtdconcat.o
index ecf170b55c3245650c220e1cf7bb75606ade0e84..6697a1ec72d067ec07a42c15986740ea33169095 100644 (file)
@@ -44,8 +44,6 @@ struct ar7_bin_rec {
        unsigned int address;
 };
 
-static struct mtd_partition ar7_parts[AR7_PARTS];
-
 static int create_mtd_partitions(struct mtd_info *master,
                                 struct mtd_partition **pparts,
                                 unsigned long origin)
@@ -57,7 +55,11 @@ static int create_mtd_partitions(struct mtd_info *master,
        unsigned int root_offset = ROOT_OFFSET;
 
        int retries = 10;
+       struct mtd_partition *ar7_parts;
 
+       ar7_parts = kzalloc(sizeof(*ar7_parts) * AR7_PARTS, GFP_KERNEL);
+       if (!ar7_parts)
+               return -ENOMEM;
        ar7_parts[0].name = "loader";
        ar7_parts[0].offset = 0;
        ar7_parts[0].size = master->erasesize;
index f5ab6fa1057bdc422816c8f5e317de466a65107f..c240454fd113d757794141a160eaaac60015c036 100644 (file)
@@ -1236,10 +1236,14 @@ static int inval_cache_and_wait_for_operation(
                        remove_wait_queue(&chip->wq, &wait);
                        spin_lock(chip->mutex);
                }
-               if (chip->erase_suspended || chip->write_suspended)  {
-                       /* Suspend has occured while sleep: reset timeout */
+               if (chip->erase_suspended && chip_state == FL_ERASING)  {
+                       /* Erase suspend occured while sleep: reset timeout */
                        timeo = reset_timeo;
                        chip->erase_suspended = 0;
+               }
+               if (chip->write_suspended && chip_state == FL_WRITING)  {
+                       /* Write suspend occured while sleep: reset timeout */
+                       timeo = reset_timeo;
                        chip->write_suspended = 0;
                }
        }
index 94bb61e19047764ae06dcf91408946219869fa06..61ea833e09086e631024f298575678ff3f123ea3 100644 (file)
@@ -282,6 +282,16 @@ static void fixup_s29gl032n_sectors(struct mtd_info *mtd, void *param)
        }
 }
 
+static void fixup_M29W128G_write_buffer(struct mtd_info *mtd, void *param)
+{
+       struct map_info *map = mtd->priv;
+       struct cfi_private *cfi = map->fldrv_priv;
+       if (cfi->cfiq->BufWriteTimeoutTyp) {
+               pr_warning("Don't use write buffer on ST flash M29W128G\n");
+               cfi->cfiq->BufWriteTimeoutTyp = 0;
+       }
+}
+
 static struct cfi_fixup cfi_fixup_table[] = {
        { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
 #ifdef AMD_BOOTLOC_BUG
@@ -298,6 +308,7 @@ static struct cfi_fixup cfi_fixup_table[] = {
        { CFI_MFR_AMD, 0x1301, fixup_s29gl064n_sectors, NULL, },
        { CFI_MFR_AMD, 0x1a00, fixup_s29gl032n_sectors, NULL, },
        { CFI_MFR_AMD, 0x1a01, fixup_s29gl032n_sectors, NULL, },
+       { CFI_MFR_ST,  0x227E, fixup_M29W128G_write_buffer, NULL, },
 #if !FORCE_WORD_WRITE
        { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
 #endif
index 2f3f2f719ba497026a7a6f304fdcab4d03bbe5bd..e824b9b9b05619b18a9348ffa74c8586b865842a 100644 (file)
 #define SST39LF800     0x2781
 #define SST39LF160     0x2782
 #define SST39VF1601    0x234b
+#define SST39VF3201    0x235b
 #define SST39LF512     0x00D4
 #define SST39LF010     0x00D5
 #define SST39LF020     0x00D6
@@ -1489,6 +1490,21 @@ static const struct amd_flash_info jedec_table[] = {
                        ERASEINFO(0x1000,256),
                        ERASEINFO(0x1000,256)
                }
+       }, {
+               .mfr_id         = MANUFACTURER_SST,     /* should be CFI */
+               .dev_id         = SST39VF3201,
+               .name           = "SST 39VF3201",
+               .devtypes       = CFI_DEVICETYPE_X16,
+               .uaddr          = MTD_UADDR_0xAAAA_0x5555,
+               .dev_size       = SIZE_4MiB,
+               .cmd_set        = P_ID_AMD_STD,
+               .nr_regions     = 4,
+               .regions        = {
+                       ERASEINFO(0x1000,256),
+                       ERASEINFO(0x1000,256),
+                       ERASEINFO(0x1000,256),
+                       ERASEINFO(0x1000,256)
+               }
        }, {
                .mfr_id         = MANUFACTURER_SST,
                .dev_id         = SST36VF3203,
index 072dd8abf33a726620bd0f9299c3005632ce4ee4..6bdc50c727e7b1aad9bea45c81e18959fc7f79f6 100644 (file)
@@ -21,6 +21,8 @@ static int mapram_write (struct mtd_info *, loff_t, size_t, size_t *, const u_ch
 static int mapram_erase (struct mtd_info *, struct erase_info *);
 static void mapram_nop (struct mtd_info *);
 static struct mtd_info *map_ram_probe(struct map_info *map);
+static unsigned long mapram_unmapped_area(struct mtd_info *, unsigned long,
+                                         unsigned long, unsigned long);
 
 
 static struct mtd_chip_driver mapram_chipdrv = {
@@ -64,6 +66,7 @@ static struct mtd_info *map_ram_probe(struct map_info *map)
        mtd->type = MTD_RAM;
        mtd->size = map->size;
        mtd->erase = mapram_erase;
+       mtd->get_unmapped_area = mapram_unmapped_area;
        mtd->read = mapram_read;
        mtd->write = mapram_write;
        mtd->sync = mapram_nop;
@@ -79,6 +82,20 @@ static struct mtd_info *map_ram_probe(struct map_info *map)
 }
 
 
+/*
+ * Allow NOMMU mmap() to directly map the device (if not NULL)
+ * - return the address to which the offset maps
+ * - return -ENOSYS to indicate refusal to do the mapping
+ */
+static unsigned long mapram_unmapped_area(struct mtd_info *mtd,
+                                         unsigned long len,
+                                         unsigned long offset,
+                                         unsigned long flags)
+{
+       struct map_info *map = mtd->priv;
+       return (unsigned long) map->virt + offset;
+}
+
 static int mapram_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
 {
        struct map_info *map = mtd->priv;
index c76d6e5f47ee305868da2bc6b382c205107b2247..076090a67b9088319b676ce58fc7cf82263d6a85 100644 (file)
@@ -20,6 +20,8 @@ static int maprom_write (struct mtd_info *, loff_t, size_t, size_t *, const u_ch
 static void maprom_nop (struct mtd_info *);
 static struct mtd_info *map_rom_probe(struct map_info *map);
 static int maprom_erase (struct mtd_info *mtd, struct erase_info *info);
+static unsigned long maprom_unmapped_area(struct mtd_info *, unsigned long,
+                                         unsigned long, unsigned long);
 
 static struct mtd_chip_driver maprom_chipdrv = {
        .probe  = map_rom_probe,
@@ -40,6 +42,7 @@ static struct mtd_info *map_rom_probe(struct map_info *map)
        mtd->name = map->name;
        mtd->type = MTD_ROM;
        mtd->size = map->size;
+       mtd->get_unmapped_area = maprom_unmapped_area;
        mtd->read = maprom_read;
        mtd->write = maprom_write;
        mtd->sync = maprom_nop;
@@ -53,6 +56,20 @@ static struct mtd_info *map_rom_probe(struct map_info *map)
 }
 
 
+/*
+ * Allow NOMMU mmap() to directly map the device (if not NULL)
+ * - return the address to which the offset maps
+ * - return -ENOSYS to indicate refusal to do the mapping
+ */
+static unsigned long maprom_unmapped_area(struct mtd_info *mtd,
+                                         unsigned long len,
+                                         unsigned long offset,
+                                         unsigned long flags)
+{
+       struct map_info *map = mtd->priv;
+       return (unsigned long) map->virt + offset;
+}
+
 static int maprom_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
 {
        struct map_info *map = mtd->priv;
index 50a340388e742024945b6011490c760d0de4dcad..5011fa73f91886302135ea08904908c2c6f89461 100644 (file)
@@ -335,7 +335,11 @@ static int parse_cmdline_partitions(struct mtd_info *master,
                                }
                                offset += part->parts[i].size;
                        }
-                       *pparts = part->parts;
+                       *pparts = kmemdup(part->parts,
+                                       sizeof(*part->parts) * part->num_parts,
+                                       GFP_KERNEL);
+                       if (!*pparts)
+                               return -ENOMEM;
                        return part->num_parts;
                }
        }
index 50de839c77a9edf410747ba963ae4c3c93d49156..5bf5f460e1327828c203710ffee7041044fb14b2 100644 (file)
@@ -10,7 +10,6 @@
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
-#include <linux/miscdevice.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
index e32c568c11450e1c8041f4e28604ed1b72654d00..0990f7803628605fba21b083c0e426ae2697628c 100644 (file)
@@ -10,7 +10,6 @@
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
-#include <linux/miscdevice.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/init.h>
index d853f891b586d65e82254d44716f3cd78de47005..719b2915dc3ae4134fc5ffc4588012956c0d70a8 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
-#include <linux/miscdevice.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/init.h>
index 874e51b110a2d4cfbdadef073e146aab68040bdc..a19cda52da5c15804cdf50aa594f41dc4f27b433 100644 (file)
@@ -26,7 +26,6 @@
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
-#include <linux/miscdevice.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/init.h>
index 7c3fc766dcf17b4b6cfcd2dec41d7220a75a03be..8185b1f3e5e632d9dcae772b25e1f83104f39b5d 100644 (file)
 #define FAST_READ_DUMMY_BYTE 0
 #endif
 
-#ifdef CONFIG_MTD_PARTITIONS
-#define        mtd_has_partitions()    (1)
-#else
-#define        mtd_has_partitions()    (0)
-#endif
-
 /****************************************************************************/
 
 struct m25p {
@@ -678,6 +672,8 @@ static int __devinit m25p_probe(struct spi_device *spi)
                flash->mtd.erasesize = info->sector_size;
        }
 
+       flash->mtd.dev.parent = &spi->dev;
+
        dev_info(&spi->dev, "%s (%lld Kbytes)\n", info->name,
                        (long long)flash->mtd.size >> 10);
 
@@ -708,12 +704,13 @@ static int __devinit m25p_probe(struct spi_device *spi)
                struct mtd_partition    *parts = NULL;
                int                     nr_parts = 0;
 
-#ifdef CONFIG_MTD_CMDLINE_PARTS
-               static const char *part_probes[] = { "cmdlinepart", NULL, };
+               if (mtd_has_cmdlinepart()) {
+                       static const char *part_probes[]
+                                       = { "cmdlinepart", NULL, };
 
-               nr_parts = parse_mtd_partitions(&flash->mtd,
-                               part_probes, &parts, 0);
-#endif
+                       nr_parts = parse_mtd_partitions(&flash->mtd,
+                                       part_probes, &parts, 0);
+               }
 
                if (nr_parts <= 0 && data && data->parts) {
                        parts = data->parts;
index 6d9f810565c84c9b8a6c86ed51dc1e1bd07d7717..62dee54af0a58bfc4f1efe8cf8d8f6096ac95c0c 100644 (file)
@@ -98,12 +98,6 @@ struct dataflash {
        struct mtd_info         mtd;
 };
 
-#ifdef CONFIG_MTD_PARTITIONS
-#define        mtd_has_partitions()    (1)
-#else
-#define        mtd_has_partitions()    (0)
-#endif
-
 /* ......................................................................... */
 
 /*
@@ -670,6 +664,8 @@ add_dataflash_otp(struct spi_device *spi, char *name,
        device->write = dataflash_write;
        device->priv = priv;
 
+       device->dev.parent = &spi->dev;
+
        if (revision >= 'c')
                otp_tag = otp_setup(device, revision);
 
@@ -682,11 +678,13 @@ add_dataflash_otp(struct spi_device *spi, char *name,
                struct mtd_partition    *parts;
                int                     nr_parts = 0;
 
-#ifdef CONFIG_MTD_CMDLINE_PARTS
-               static const char *part_probes[] = { "cmdlinepart", NULL, };
+               if (mtd_has_cmdlinepart()) {
+                       static const char *part_probes[]
+                                       = { "cmdlinepart", NULL, };
 
-               nr_parts = parse_mtd_partitions(device, part_probes, &parts, 0);
-#endif
+                       nr_parts = parse_mtd_partitions(device,
+                                       part_probes, &parts, 0);
+               }
 
                if (nr_parts <= 0 && pdata && pdata->parts) {
                        parts = pdata->parts;
index 3aaca88847d39cec5421a072b13609bd25796cda..fce5ff7589aa7e0591601041d82238878eca38b7 100644 (file)
@@ -65,6 +65,19 @@ static void ram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
 {
 }
 
+/*
+ * Allow NOMMU mmap() to directly map the device (if not NULL)
+ * - return the address to which the offset maps
+ * - return -ENOSYS to indicate refusal to do the mapping
+ */
+static unsigned long ram_get_unmapped_area(struct mtd_info *mtd,
+                                          unsigned long len,
+                                          unsigned long offset,
+                                          unsigned long flags)
+{
+       return (unsigned long) mtd->priv + offset;
+}
+
 static int ram_read(struct mtd_info *mtd, loff_t from, size_t len,
                size_t *retlen, u_char *buf)
 {
@@ -116,6 +129,7 @@ int mtdram_init_device(struct mtd_info *mtd, void *mapped_address,
        mtd->erase = ram_erase;
        mtd->point = ram_point;
        mtd->unpoint = ram_unpoint;
+       mtd->get_unmapped_area = ram_get_unmapped_area;
        mtd->read = ram_read;
        mtd->write = ram_write;
 
index f751dd97c5493a1a8e732e8745c759fad56f6cfa..32e82aef3e5392550012b694e5dd58ffd71d6d1d 100644 (file)
@@ -28,7 +28,6 @@
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
-#include <linux/miscdevice.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/init.h>
diff --git a/drivers/mtd/internal.h b/drivers/mtd/internal.h
new file mode 100644 (file)
index 0000000..c658fe7
--- /dev/null
@@ -0,0 +1,17 @@
+/* Internal MTD definitions
+ *
+ * Copyright Â© 2006 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+/*
+ * mtdbdi.c
+ */
+extern struct backing_dev_info mtd_bdi_unmappable;
+extern struct backing_dev_info mtd_bdi_ro_mappable;
+extern struct backing_dev_info mtd_bdi_rw_mappable;
index 729f899a5cd5d71725ab137715d2c5b1c8a45789..82923bd2d9c5444166c53552a409f27ebb646e50 100644 (file)
@@ -529,12 +529,6 @@ config MTD_DMV182
         help
           Map driver for Dy-4 SVME/DMV-182 board.
 
-config MTD_SHARP_SL
-       tristate "ROM mapped on Sharp SL Series"
-       depends on ARCH_PXA
-       help
-         This enables access to the flash chip on the Sharp SL Series of PDAs.
-
 config MTD_INTEL_VR_NOR
        tristate "NOR flash on Intel Vermilion Range Expansion Bus CS0"
        depends on PCI
@@ -542,6 +536,12 @@ config MTD_INTEL_VR_NOR
          Map driver for a NOR flash bank located on the Expansion Bus of the
          Intel Vermilion Range chipset.
 
+config MTD_RBTX4939
+       tristate "Map driver for RBTX4939 board"
+       depends on TOSHIBA_RBTX4939 && MTD_CFI && MTD_COMPLEX_MAPPINGS
+       help
+         Map driver for NOR flash chips on RBTX4939 board.
+
 config MTD_PLATRAM
        tristate "Map driver for platform device RAM (mtd-ram)"
        select MTD_RAM
index 26b28a7a90b5e19a57baf21502d2dd94fdc349a7..2dbc1bec848808559f4bc52995eda5ee06fb8dad 100644 (file)
@@ -56,9 +56,9 @@ obj-$(CONFIG_MTD_IXP4XX)      += ixp4xx.o
 obj-$(CONFIG_MTD_IXP2000)      += ixp2000.o
 obj-$(CONFIG_MTD_WRSBC8260)    += wr_sbc82xx_flash.o
 obj-$(CONFIG_MTD_DMV182)       += dmv182.o
-obj-$(CONFIG_MTD_SHARP_SL)     += sharpsl-flash.o
 obj-$(CONFIG_MTD_PLATRAM)      += plat-ram.o
 obj-$(CONFIG_MTD_OMAP_NOR)     += omap_nor.o
 obj-$(CONFIG_MTD_INTEL_VR_NOR) += intel_vr_nor.o
 obj-$(CONFIG_MTD_BFIN_ASYNC)   += bfin-async-flash.o
+obj-$(CONFIG_MTD_RBTX4939)     += rbtx4939-flash.o
 obj-$(CONFIG_MTD_VMU)          += vmu-flash.o
index 7e50e9b1b781fa964893d2a44b017c6a84facfde..a24478102b118920e1dfd423fa082fa432576345 100644 (file)
@@ -115,6 +115,8 @@ static int __init omapflash_probe(struct platform_device *pdev)
        }
        info->mtd->owner = THIS_MODULE;
 
+       info->mtd->dev.parent = &pdev->dev;
+
 #ifdef CONFIG_MTD_PARTITIONS
        err = parse_mtd_partitions(info->mtd, part_probes, &info->parts, 0);
        if (err > 0)
index 229718222db710e27fc980fb68ca287d9553e99d..29a9011573522abbe7d8b021ddec46182dcfb2d2 100644 (file)
@@ -147,6 +147,7 @@ static int physmap_flash_probe(struct platform_device *dev)
                        devices_found++;
                }
                info->mtd[i]->owner = THIS_MODULE;
+               info->mtd[i]->dev.parent = &dev->dev;
        }
 
        if (devices_found == 1) {
index fbf0ca939d723ba7121f2ca14c4d85a2a603a0ef..c83a60fada530e1a73f812bef5c44d18e7432259 100644 (file)
@@ -219,6 +219,7 @@ static int __devinit of_flash_probe(struct of_device *dev,
                goto err_out;
        }
        info->mtd->owner = THIS_MODULE;
+       info->mtd->dev.parent = &dev->dev;
 
 #ifdef CONFIG_MTD_PARTITIONS
        /* First look for RedBoot table or partitions on the command
index e7dd9c8a965e2fc86d32b98eaa060657d0819724..49c9ece764770e6f8cfddb9d46fd26b94d22bb47 100644 (file)
@@ -224,6 +224,7 @@ static int platram_probe(struct platform_device *pdev)
        }
 
        info->mtd->owner = THIS_MODULE;
+       info->mtd->dev.parent = &pdev->dev;
 
        platram_setrw(info, PLATRAM_RW);
 
diff --git a/drivers/mtd/maps/rbtx4939-flash.c b/drivers/mtd/maps/rbtx4939-flash.c
new file mode 100644 (file)
index 0000000..d39f0ad
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * rbtx4939-flash (based on physmap.c)
+ *
+ * This is a simplified physmap driver with map_init callback function.
+ *
+ * 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.
+ *
+ * Copyright (C) 2009 Atsushi Nemoto <anemo@mba.ocn.ne.jp>
+ */
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+#include <asm/txx9/rbtx4939.h>
+
+struct rbtx4939_flash_info {
+       struct mtd_info *mtd;
+       struct map_info map;
+#ifdef CONFIG_MTD_PARTITIONS
+       int nr_parts;
+       struct mtd_partition *parts;
+#endif
+};
+
+static int rbtx4939_flash_remove(struct platform_device *dev)
+{
+       struct rbtx4939_flash_info *info;
+
+       info = platform_get_drvdata(dev);
+       if (!info)
+               return 0;
+       platform_set_drvdata(dev, NULL);
+
+       if (info->mtd) {
+#ifdef CONFIG_MTD_PARTITIONS
+               struct rbtx4939_flash_data *pdata = dev->dev.platform_data;
+
+               if (info->nr_parts) {
+                       del_mtd_partitions(info->mtd);
+                       kfree(info->parts);
+               } else if (pdata->nr_parts)
+                       del_mtd_partitions(info->mtd);
+               else
+                       del_mtd_device(info->mtd);
+#else
+               del_mtd_device(info->mtd);
+#endif
+               map_destroy(info->mtd);
+       }
+       return 0;
+}
+
+static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", NULL };
+#ifdef CONFIG_MTD_PARTITIONS
+static const char *part_probe_types[] = { "cmdlinepart", NULL };
+#endif
+
+static int rbtx4939_flash_probe(struct platform_device *dev)
+{
+       struct rbtx4939_flash_data *pdata;
+       struct rbtx4939_flash_info *info;
+       struct resource *res;
+       const char **probe_type;
+       int err = 0;
+       unsigned long size;
+
+       pdata = dev->dev.platform_data;
+       if (!pdata)
+               return -ENODEV;
+
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENODEV;
+       info = devm_kzalloc(&dev->dev, sizeof(struct rbtx4939_flash_info),
+                           GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       platform_set_drvdata(dev, info);
+
+       size = resource_size(res);
+       pr_notice("rbtx4939 platform flash device: %pR\n", res);
+
+       if (!devm_request_mem_region(&dev->dev, res->start, size,
+                                    dev_name(&dev->dev)))
+               return -EBUSY;
+
+       info->map.name = dev_name(&dev->dev);
+       info->map.phys = res->start;
+       info->map.size = size;
+       info->map.bankwidth = pdata->width;
+
+       info->map.virt = devm_ioremap(&dev->dev, info->map.phys, size);
+       if (!info->map.virt)
+               return -EBUSY;
+
+       if (pdata->map_init)
+               (*pdata->map_init)(&info->map);
+       else
+               simple_map_init(&info->map);
+
+       probe_type = rom_probe_types;
+       for (; !info->mtd && *probe_type; probe_type++)
+               info->mtd = do_map_probe(*probe_type, &info->map);
+       if (!info->mtd) {
+               dev_err(&dev->dev, "map_probe failed\n");
+               err = -ENXIO;
+               goto err_out;
+       }
+       info->mtd->owner = THIS_MODULE;
+       if (err)
+               goto err_out;
+
+#ifdef CONFIG_MTD_PARTITIONS
+       err = parse_mtd_partitions(info->mtd, part_probe_types,
+                               &info->parts, 0);
+       if (err > 0) {
+               add_mtd_partitions(info->mtd, info->parts, err);
+               info->nr_parts = err;
+               return 0;
+       }
+
+       if (pdata->nr_parts) {
+               pr_notice("Using rbtx4939 partition information\n");
+               add_mtd_partitions(info->mtd, pdata->parts, pdata->nr_parts);
+               return 0;
+       }
+#endif
+
+       add_mtd_device(info->mtd);
+       return 0;
+
+err_out:
+       rbtx4939_flash_remove(dev);
+       return err;
+}
+
+#ifdef CONFIG_PM
+static int rbtx4939_flash_suspend(struct platform_device *dev,
+                                 pm_message_t state)
+{
+       struct rbtx4939_flash_info *info = platform_get_drvdata(dev);
+
+       if (info->mtd->suspend)
+               return info->mtd->suspend(info->mtd);
+       return 0;
+}
+
+static int rbtx4939_flash_resume(struct platform_device *dev)
+{
+       struct rbtx4939_flash_info *info = platform_get_drvdata(dev);
+
+       if (info->mtd->resume)
+               info->mtd->resume(info->mtd);
+       return 0;
+}
+
+static void rbtx4939_flash_shutdown(struct platform_device *dev)
+{
+       struct rbtx4939_flash_info *info = platform_get_drvdata(dev);
+
+       if (info->mtd->suspend && info->mtd->resume)
+               if (info->mtd->suspend(info->mtd) == 0)
+                       info->mtd->resume(info->mtd);
+}
+#else
+#define rbtx4939_flash_suspend NULL
+#define rbtx4939_flash_resume NULL
+#define rbtx4939_flash_shutdown NULL
+#endif
+
+static struct platform_driver rbtx4939_flash_driver = {
+       .probe          = rbtx4939_flash_probe,
+       .remove         = rbtx4939_flash_remove,
+       .suspend        = rbtx4939_flash_suspend,
+       .resume         = rbtx4939_flash_resume,
+       .shutdown       = rbtx4939_flash_shutdown,
+       .driver         = {
+               .name   = "rbtx4939-flash",
+               .owner  = THIS_MODULE,
+       },
+};
+
+static int __init rbtx4939_flash_init(void)
+{
+       return platform_driver_register(&rbtx4939_flash_driver);
+}
+
+static void __exit rbtx4939_flash_exit(void)
+{
+       platform_driver_unregister(&rbtx4939_flash_driver);
+}
+
+module_init(rbtx4939_flash_init);
+module_exit(rbtx4939_flash_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("RBTX4939 MTD map driver");
+MODULE_ALIAS("platform:rbtx4939-flash");
index 8f57b6f40aa2d3cfef54db252a3b9d63f9d47974..05e9362dc7f0fdd252d7c7ecb5d6922cf000de98 100644 (file)
@@ -351,7 +351,7 @@ sa1100_setup_mtd(struct platform_device *pdev, struct flash_platform_data *plat)
 
 static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };
 
-static int __init sa1100_mtd_probe(struct platform_device *pdev)
+static int __devinit sa1100_mtd_probe(struct platform_device *pdev)
 {
        struct flash_platform_data *plat = pdev->dev.platform_data;
        struct mtd_partition *parts;
diff --git a/drivers/mtd/maps/sharpsl-flash.c b/drivers/mtd/maps/sharpsl-flash.c
deleted file mode 100644 (file)
index b392f09..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * sharpsl-flash.c
- *
- * Copyright (C) 2001 Lineo Japan, Inc.
- * Copyright (C) 2002  SHARP
- *
- * based on rpxlite.c,v 1.15 2001/10/02 15:05:14 dwmw2 Exp
- *          Handle mapping of the flash on the RPX Lite and CLLF boards
- *
- * 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 <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/partitions.h>
-#include <asm/io.h>
-#include <asm/mach-types.h>
-
-#define WINDOW_ADDR 0x00000000
-#define WINDOW_SIZE 0x00800000
-#define BANK_WIDTH 2
-
-static struct mtd_info *mymtd;
-
-struct map_info sharpsl_map = {
-       .name = "sharpsl-flash",
-       .size = WINDOW_SIZE,
-       .bankwidth = BANK_WIDTH,
-       .phys = WINDOW_ADDR
-};
-
-static struct mtd_partition sharpsl_partitions[1] = {
-       {
-               name:           "Boot PROM Filesystem",
-       }
-};
-
-static int __init init_sharpsl(void)
-{
-       struct mtd_partition *parts;
-       int nb_parts = 0;
-       char *part_type = "static";
-
-       printk(KERN_NOTICE "Sharp SL series flash device: %x at %x\n",
-               WINDOW_SIZE, WINDOW_ADDR);
-       sharpsl_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);
-       if (!sharpsl_map.virt) {
-               printk("Failed to ioremap\n");
-               return -EIO;
-       }
-
-       simple_map_init(&sharpsl_map);
-
-       mymtd = do_map_probe("map_rom", &sharpsl_map);
-       if (!mymtd) {
-               iounmap(sharpsl_map.virt);
-               return -ENXIO;
-       }
-
-       mymtd->owner = THIS_MODULE;
-
-       if (machine_is_corgi() || machine_is_shepherd() || machine_is_husky()
-               || machine_is_poodle()) {
-               sharpsl_partitions[0].size=0x006d0000;
-               sharpsl_partitions[0].offset=0x00120000;
-       } else if (machine_is_tosa()) {
-               sharpsl_partitions[0].size=0x006a0000;
-               sharpsl_partitions[0].offset=0x00160000;
-       } else if (machine_is_spitz() || machine_is_akita() || machine_is_borzoi()) {
-               sharpsl_partitions[0].size=0x006b0000;
-               sharpsl_partitions[0].offset=0x00140000;
-       } else {
-               map_destroy(mymtd);
-               iounmap(sharpsl_map.virt);
-               return -ENODEV;
-       }
-
-       parts = sharpsl_partitions;
-       nb_parts = ARRAY_SIZE(sharpsl_partitions);
-
-       printk(KERN_NOTICE "Using %s partition definition\n", part_type);
-       add_mtd_partitions(mymtd, parts, nb_parts);
-
-       return 0;
-}
-
-static void __exit cleanup_sharpsl(void)
-{
-       if (mymtd) {
-               del_mtd_partitions(mymtd);
-               map_destroy(mymtd);
-       }
-       if (sharpsl_map.virt) {
-               iounmap(sharpsl_map.virt);
-               sharpsl_map.virt = 0;
-       }
-}
-
-module_init(init_sharpsl);
-module_exit(cleanup_sharpsl);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("SHARP (Original: Arnold Christensen <AKC@pel.dk>)");
-MODULE_DESCRIPTION("MTD map driver for SHARP SL series");
index 1409f01406f6e7ebc356cf906ab4880f7719b1c1..a49a9c8f2cb1faffe5c16d782ea793839062dcc4 100644 (file)
@@ -286,6 +286,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
        gd->private_data = new;
        new->blkcore_priv = gd;
        gd->queue = tr->blkcore_priv->rq;
+       gd->driverfs_dev = new->mtd->dev.parent;
 
        if (new->readonly)
                set_disk_ro(gd, 1);
@@ -382,11 +383,12 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)
        tr->blkcore_priv->thread = kthread_run(mtd_blktrans_thread, tr,
                        "%sd", tr->name);
        if (IS_ERR(tr->blkcore_priv->thread)) {
+               int ret = PTR_ERR(tr->blkcore_priv->thread);
                blk_cleanup_queue(tr->blkcore_priv->rq);
                unregister_blkdev(tr->major, tr->name);
                kfree(tr->blkcore_priv);
                mutex_unlock(&mtd_table_mutex);
-               return PTR_ERR(tr->blkcore_priv->thread);
+               return ret;
        }
 
        INIT_LIST_HEAD(&tr->devs);
diff --git a/drivers/mtd/mtdbdi.c b/drivers/mtd/mtdbdi.c
new file mode 100644 (file)
index 0000000..5ca5aed
--- /dev/null
@@ -0,0 +1,43 @@
+/* MTD backing device capabilities
+ *
+ * Copyright Â© 2006 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/backing-dev.h>
+#include <linux/mtd/mtd.h>
+#include "internal.h"
+
+/*
+ * backing device capabilities for non-mappable devices (such as NAND flash)
+ * - permits private mappings, copies are taken of the data
+ */
+struct backing_dev_info mtd_bdi_unmappable = {
+       .capabilities   = BDI_CAP_MAP_COPY,
+};
+
+/*
+ * backing device capabilities for R/O mappable devices (such as ROM)
+ * - permits private mappings, copies are taken of the data
+ * - permits non-writable shared mappings
+ */
+struct backing_dev_info mtd_bdi_ro_mappable = {
+       .capabilities   = (BDI_CAP_MAP_COPY | BDI_CAP_MAP_DIRECT |
+                          BDI_CAP_EXEC_MAP | BDI_CAP_READ_MAP),
+};
+
+/*
+ * backing device capabilities for writable mappable devices (such as RAM)
+ * - permits private mappings, copies are taken of the data
+ * - permits non-writable shared mappings
+ */
+struct backing_dev_info mtd_bdi_rw_mappable = {
+       .capabilities   = (BDI_CAP_MAP_COPY | BDI_CAP_MAP_DIRECT |
+                          BDI_CAP_EXEC_MAP | BDI_CAP_READ_MAP |
+                          BDI_CAP_WRITE_MAP),
+};
index e9ec59e9a566ab2a7560e9a166cfaa506077703f..763d3f0a1f428104d7a630de7746a09bc9883bb9 100644 (file)
 #include <linux/slab.h>
 #include <linux/sched.h>
 #include <linux/smp_lock.h>
+#include <linux/backing-dev.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/compatmac.h>
 
 #include <asm/uaccess.h>
 
-static struct class *mtd_class;
-
-static void mtd_notify_add(struct mtd_info* mtd)
-{
-       if (!mtd)
-               return;
-
-       device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2),
-                     NULL, "mtd%d", mtd->index);
-
-       device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1),
-                     NULL, "mtd%dro", mtd->index);
-}
-
-static void mtd_notify_remove(struct mtd_info* mtd)
-{
-       if (!mtd)
-               return;
-
-       device_destroy(mtd_class, MKDEV(MTD_CHAR_MAJOR, mtd->index*2));
-       device_destroy(mtd_class, MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1));
-}
-
-static struct mtd_notifier notifier = {
-       .add    = mtd_notify_add,
-       .remove = mtd_notify_remove,
-};
 
 /*
  * Data structure to hold the pointer to the mtd device as well
@@ -107,12 +81,15 @@ static int mtd_open(struct inode *inode, struct file *file)
                goto out;
        }
 
-       if (MTD_ABSENT == mtd->type) {
+       if (mtd->type == MTD_ABSENT) {
                put_mtd_device(mtd);
                ret = -ENODEV;
                goto out;
        }
 
+       if (mtd->backing_dev_info)
+               file->f_mapping->backing_dev_info = mtd->backing_dev_info;
+
        /* You can't open it RW if it's not a writeable device */
        if ((file->f_mode & FMODE_WRITE) && !(mtd->flags & MTD_WRITEABLE)) {
                put_mtd_device(mtd);
@@ -781,6 +758,59 @@ static int mtd_ioctl(struct inode *inode, struct file *file,
        return ret;
 } /* memory_ioctl */
 
+/*
+ * try to determine where a shared mapping can be made
+ * - only supported for NOMMU at the moment (MMU can't doesn't copy private
+ *   mappings)
+ */
+#ifndef CONFIG_MMU
+static unsigned long mtd_get_unmapped_area(struct file *file,
+                                          unsigned long addr,
+                                          unsigned long len,
+                                          unsigned long pgoff,
+                                          unsigned long flags)
+{
+       struct mtd_file_info *mfi = file->private_data;
+       struct mtd_info *mtd = mfi->mtd;
+
+       if (mtd->get_unmapped_area) {
+               unsigned long offset;
+
+               if (addr != 0)
+                       return (unsigned long) -EINVAL;
+
+               if (len > mtd->size || pgoff >= (mtd->size >> PAGE_SHIFT))
+                       return (unsigned long) -EINVAL;
+
+               offset = pgoff << PAGE_SHIFT;
+               if (offset > mtd->size - len)
+                       return (unsigned long) -EINVAL;
+
+               return mtd->get_unmapped_area(mtd, len, offset, flags);
+       }
+
+       /* can't map directly */
+       return (unsigned long) -ENOSYS;
+}
+#endif
+
+/*
+ * set up a mapping for shared memory segments
+ */
+static int mtd_mmap(struct file *file, struct vm_area_struct *vma)
+{
+#ifdef CONFIG_MMU
+       struct mtd_file_info *mfi = file->private_data;
+       struct mtd_info *mtd = mfi->mtd;
+
+       if (mtd->type == MTD_RAM || mtd->type == MTD_ROM)
+               return 0;
+       return -ENOSYS;
+#else
+       return vma->vm_flags & VM_SHARED ? 0 : -ENOSYS;
+#endif
+}
+
 static const struct file_operations mtd_fops = {
        .owner          = THIS_MODULE,
        .llseek         = mtd_lseek,
@@ -789,39 +819,36 @@ static const struct file_operations mtd_fops = {
        .ioctl          = mtd_ioctl,
        .open           = mtd_open,
        .release        = mtd_close,
+       .mmap           = mtd_mmap,
+#ifndef CONFIG_MMU
+       .get_unmapped_area = mtd_get_unmapped_area,
+#endif
 };
 
 static int __init init_mtdchar(void)
 {
-       if (register_chrdev(MTD_CHAR_MAJOR, "mtd", &mtd_fops)) {
+       int status;
+
+       status = register_chrdev(MTD_CHAR_MAJOR, "mtd", &mtd_fops);
+       if (status < 0) {
                printk(KERN_NOTICE "Can't allocate major number %d for Memory Technology Devices.\n",
                       MTD_CHAR_MAJOR);
-               return -EAGAIN;
        }
 
-       mtd_class = class_create(THIS_MODULE, "mtd");
-
-       if (IS_ERR(mtd_class)) {
-               printk(KERN_ERR "Error creating mtd class.\n");
-               unregister_chrdev(MTD_CHAR_MAJOR, "mtd");
-               return PTR_ERR(mtd_class);
-       }
-
-       register_mtd_user(&notifier);
-       return 0;
+       return status;
 }
 
 static void __exit cleanup_mtdchar(void)
 {
-       unregister_mtd_user(&notifier);
-       class_destroy(mtd_class);
        unregister_chrdev(MTD_CHAR_MAJOR, "mtd");
 }
 
 module_init(init_mtdchar);
 module_exit(cleanup_mtdchar);
 
+MODULE_ALIAS_CHARDEV_MAJOR(MTD_CHAR_MAJOR);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
 MODULE_DESCRIPTION("Direct character-device access to MTD devices");
+MODULE_ALIAS_CHARDEV_MAJOR(MTD_CHAR_MAJOR);
index 3dbb1b38db666cf4294047ec8cac5f8610c19525..792b547786b8fdf6c4122f28240b1458c0d80f66 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/slab.h>
 #include <linux/sched.h>
 #include <linux/types.h>
+#include <linux/backing-dev.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/concat.h>
@@ -683,6 +684,40 @@ static int concat_block_markbad(struct mtd_info *mtd, loff_t ofs)
        return err;
 }
 
+/*
+ * try to support NOMMU mmaps on concatenated devices
+ * - we don't support subdev spanning as we can't guarantee it'll work
+ */
+static unsigned long concat_get_unmapped_area(struct mtd_info *mtd,
+                                             unsigned long len,
+                                             unsigned long offset,
+                                             unsigned long flags)
+{
+       struct mtd_concat *concat = CONCAT(mtd);
+       int i;
+
+       for (i = 0; i < concat->num_subdev; i++) {
+               struct mtd_info *subdev = concat->subdev[i];
+
+               if (offset >= subdev->size) {
+                       offset -= subdev->size;
+                       continue;
+               }
+
+               /* we've found the subdev over which the mapping will reside */
+               if (offset + len > subdev->size)
+                       return (unsigned long) -EINVAL;
+
+               if (subdev->get_unmapped_area)
+                       return subdev->get_unmapped_area(subdev, len, offset,
+                                                        flags);
+
+               break;
+       }
+
+       return (unsigned long) -ENOSYS;
+}
+
 /*
  * This function constructs a virtual MTD device by concatenating
  * num_devs MTD devices. A pointer to the new device object is
@@ -740,6 +775,8 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[],       /* subdevices to c
 
        concat->mtd.ecc_stats.badblocks = subdev[0]->ecc_stats.badblocks;
 
+       concat->mtd.backing_dev_info = subdev[0]->backing_dev_info;
+
        concat->subdev[0] = subdev[0];
 
        for (i = 1; i < num_devs; i++) {
@@ -766,6 +803,15 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[],      /* subdevices to c
                                concat->mtd.flags |=
                                    subdev[i]->flags & MTD_WRITEABLE;
                }
+
+               /* only permit direct mapping if the BDIs are all the same
+                * - copy-mapping is still permitted
+                */
+               if (concat->mtd.backing_dev_info !=
+                   subdev[i]->backing_dev_info)
+                       concat->mtd.backing_dev_info =
+                               &default_backing_dev_info;
+
                concat->mtd.size += subdev[i]->size;
                concat->mtd.ecc_stats.badblocks +=
                        subdev[i]->ecc_stats.badblocks;
@@ -796,6 +842,7 @@ struct mtd_info *mtd_concat_create(struct mtd_info *subdev[],       /* subdevices to c
        concat->mtd.unlock = concat_unlock;
        concat->mtd.suspend = concat_suspend;
        concat->mtd.resume = concat_resume;
+       concat->mtd.get_unmapped_area = concat_get_unmapped_area;
 
        /*
         * Combine the erase block size info of the subdevices:
index 76fe0a1e7a5e26534749a49436665b1d7ebcd086..fdd6ae8593972f78987f7d775c6fda93aa4661cd 100644 (file)
 #include <linux/proc_fs.h>
 
 #include <linux/mtd/mtd.h>
+#include "internal.h"
 
 #include "mtdcore.h"
 
+
+static struct class *mtd_class;
+
 /* These are exported solely for the purpose of mtd_blkdevs.c. You
    should not use them for _anything_ else */
 DEFINE_MUTEX(mtd_table_mutex);
@@ -32,6 +36,160 @@ EXPORT_SYMBOL_GPL(mtd_table);
 
 static LIST_HEAD(mtd_notifiers);
 
+
+#if defined(CONFIG_MTD_CHAR) || defined(CONFIG_MTD_CHAR_MODULE)
+#define MTD_DEVT(index) MKDEV(MTD_CHAR_MAJOR, (index)*2)
+#else
+#define MTD_DEVT(index) 0
+#endif
+
+/* REVISIT once MTD uses the driver model better, whoever allocates
+ * the mtd_info will probably want to use the release() hook...
+ */
+static void mtd_release(struct device *dev)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+
+       /* remove /dev/mtdXro node if needed */
+       if (MTD_DEVT(mtd->index))
+               device_destroy(mtd_class, MTD_DEVT(mtd->index) + 1);
+}
+
+static ssize_t mtd_type_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+       char *type;
+
+       switch (mtd->type) {
+       case MTD_ABSENT:
+               type = "absent";
+               break;
+       case MTD_RAM:
+               type = "ram";
+               break;
+       case MTD_ROM:
+               type = "rom";
+               break;
+       case MTD_NORFLASH:
+               type = "nor";
+               break;
+       case MTD_NANDFLASH:
+               type = "nand";
+               break;
+       case MTD_DATAFLASH:
+               type = "dataflash";
+               break;
+       case MTD_UBIVOLUME:
+               type = "ubi";
+               break;
+       default:
+               type = "unknown";
+       }
+
+       return snprintf(buf, PAGE_SIZE, "%s\n", type);
+}
+static DEVICE_ATTR(type, S_IRUGO, mtd_type_show, NULL);
+
+static ssize_t mtd_flags_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+
+       return snprintf(buf, PAGE_SIZE, "0x%lx\n", (unsigned long)mtd->flags);
+
+}
+static DEVICE_ATTR(flags, S_IRUGO, mtd_flags_show, NULL);
+
+static ssize_t mtd_size_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+
+       return snprintf(buf, PAGE_SIZE, "%llu\n",
+               (unsigned long long)mtd->size);
+
+}
+static DEVICE_ATTR(size, S_IRUGO, mtd_size_show, NULL);
+
+static ssize_t mtd_erasesize_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+
+       return snprintf(buf, PAGE_SIZE, "%lu\n", (unsigned long)mtd->erasesize);
+
+}
+static DEVICE_ATTR(erasesize, S_IRUGO, mtd_erasesize_show, NULL);
+
+static ssize_t mtd_writesize_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+
+       return snprintf(buf, PAGE_SIZE, "%lu\n", (unsigned long)mtd->writesize);
+
+}
+static DEVICE_ATTR(writesize, S_IRUGO, mtd_writesize_show, NULL);
+
+static ssize_t mtd_oobsize_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+
+       return snprintf(buf, PAGE_SIZE, "%lu\n", (unsigned long)mtd->oobsize);
+
+}
+static DEVICE_ATTR(oobsize, S_IRUGO, mtd_oobsize_show, NULL);
+
+static ssize_t mtd_numeraseregions_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+
+       return snprintf(buf, PAGE_SIZE, "%u\n", mtd->numeraseregions);
+
+}
+static DEVICE_ATTR(numeraseregions, S_IRUGO, mtd_numeraseregions_show,
+       NULL);
+
+static ssize_t mtd_name_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_to_mtd(dev);
+
+       return snprintf(buf, PAGE_SIZE, "%s\n", mtd->name);
+
+}
+static DEVICE_ATTR(name, S_IRUGO, mtd_name_show, NULL);
+
+static struct attribute *mtd_attrs[] = {
+       &dev_attr_type.attr,
+       &dev_attr_flags.attr,
+       &dev_attr_size.attr,
+       &dev_attr_erasesize.attr,
+       &dev_attr_writesize.attr,
+       &dev_attr_oobsize.attr,
+       &dev_attr_numeraseregions.attr,
+       &dev_attr_name.attr,
+       NULL,
+};
+
+struct attribute_group mtd_group = {
+       .attrs          = mtd_attrs,
+};
+
+struct attribute_group *mtd_groups[] = {
+       &mtd_group,
+       NULL,
+};
+
+static struct device_type mtd_devtype = {
+       .name           = "mtd",
+       .groups         = mtd_groups,
+       .release        = mtd_release,
+};
+
 /**
  *     add_mtd_device - register an MTD device
  *     @mtd: pointer to new MTD device info structure
@@ -40,12 +198,27 @@ static LIST_HEAD(mtd_notifiers);
  *     notify each currently active MTD 'user' of its arrival. Returns
  *     zero on success or 1 on failure, which currently will only happen
  *     if the number of present devices exceeds MAX_MTD_DEVICES (i.e. 16)
+ *     or there's a sysfs error.
  */
 
 int add_mtd_device(struct mtd_info *mtd)
 {
        int i;
 
+       if (!mtd->backing_dev_info) {
+               switch (mtd->type) {
+               case MTD_RAM:
+                       mtd->backing_dev_info = &mtd_bdi_rw_mappable;
+                       break;
+               case MTD_ROM:
+                       mtd->backing_dev_info = &mtd_bdi_ro_mappable;
+                       break;
+               default:
+                       mtd->backing_dev_info = &mtd_bdi_unmappable;
+                       break;
+               }
+       }
+
        BUG_ON(mtd->writesize == 0);
        mutex_lock(&mtd_table_mutex);
 
@@ -80,6 +253,23 @@ int add_mtd_device(struct mtd_info *mtd)
                                               mtd->name);
                        }
 
+                       /* Caller should have set dev.parent to match the
+                        * physical device.
+                        */
+                       mtd->dev.type = &mtd_devtype;
+                       mtd->dev.class = mtd_class;
+                       mtd->dev.devt = MTD_DEVT(i);
+                       dev_set_name(&mtd->dev, "mtd%d", i);
+                       if (device_register(&mtd->dev) != 0) {
+                               mtd_table[i] = NULL;
+                               break;
+                       }
+
+                       if (MTD_DEVT(i))
+                               device_create(mtd_class, mtd->dev.parent,
+                                               MTD_DEVT(i) + 1,
+                                               NULL, "mtd%dro", i);
+
                        DEBUG(0, "mtd: Giving out device %d to %s\n",i, mtd->name);
                        /* No need to get a refcount on the module containing
                           the notifier, since we hold the mtd_table_mutex */
@@ -124,6 +314,8 @@ int del_mtd_device (struct mtd_info *mtd)
        } else {
                struct mtd_notifier *not;
 
+               device_unregister(&mtd->dev);
+
                /* No need to get a refcount on the module containing
                   the notifier, since we hold the mtd_table_mutex */
                list_for_each_entry(not, &mtd_notifiers, list)
@@ -393,28 +585,38 @@ done:
         return ((count < begin+len-off) ? count : begin+len-off);
 }
 
+#endif /* CONFIG_PROC_FS */
+
 /*====================================================================*/
 /* Init code */
 
 static int __init init_mtd(void)
 {
+       mtd_class = class_create(THIS_MODULE, "mtd");
+
+       if (IS_ERR(mtd_class)) {
+               pr_err("Error creating mtd class.\n");
+               return PTR_ERR(mtd_class);
+       }
+#ifdef CONFIG_PROC_FS
        if ((proc_mtd = create_proc_entry( "mtd", 0, NULL )))
                proc_mtd->read_proc = mtd_read_proc;
+#endif /* CONFIG_PROC_FS */
        return 0;
 }
 
 static void __exit cleanup_mtd(void)
 {
+#ifdef CONFIG_PROC_FS
         if (proc_mtd)
                remove_proc_entry( "mtd", NULL);
+#endif /* CONFIG_PROC_FS */
+       class_destroy(mtd_class);
 }
 
 module_init(init_mtd);
 module_exit(cleanup_mtd);
 
-#endif /* CONFIG_PROC_FS */
-
-
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
 MODULE_DESCRIPTION("Core MTD registration and access routines");
index 1a6b3beabe8d04f70762f9aa3e470160a8e7c653..1060337c06df7a57b0a1a76455635a004ad22543 100644 (file)
@@ -44,6 +44,7 @@ static struct mtdoops_context {
        int oops_pages;
        int nextpage;
        int nextcount;
+       char *name;
 
        void *oops_buf;
 
@@ -273,6 +274,9 @@ static void mtdoops_notify_add(struct mtd_info *mtd)
 {
        struct mtdoops_context *cxt = &oops_cxt;
 
+       if (cxt->name && !strcmp(mtd->name, cxt->name))
+               cxt->mtd_index = mtd->index;
+
        if ((mtd->index != cxt->mtd_index) || cxt->mtd_index < 0)
                return;
 
@@ -357,8 +361,10 @@ mtdoops_console_write(struct console *co, const char *s, unsigned int count)
        spin_lock_irqsave(&cxt->writecount_lock, flags);
 
        /* Check ready status didn't change whilst waiting for the lock */
-       if (!cxt->ready)
+       if (!cxt->ready) {
+               spin_unlock_irqrestore(&cxt->writecount_lock, flags);
                return;
+       }
 
        if (cxt->writecount == 0) {
                u32 *stamp = cxt->oops_buf;
@@ -383,8 +389,12 @@ static int __init mtdoops_console_setup(struct console *co, char *options)
 {
        struct mtdoops_context *cxt = co->data;
 
-       if (cxt->mtd_index != -1)
+       if (cxt->mtd_index != -1 || cxt->name)
                return -EBUSY;
+       if (options) {
+               cxt->name = kstrdup(options, GFP_KERNEL);
+               return 0;
+       }
        if (co->index == -1)
                return -EINVAL;
 
@@ -412,6 +422,7 @@ static int __init mtdoops_console_init(void)
 
        cxt->mtd_index = -1;
        cxt->oops_buf = vmalloc(OOPS_PAGE_SIZE);
+       spin_lock_init(&cxt->writecount_lock);
 
        if (!cxt->oops_buf) {
                printk(KERN_ERR "Failed to allocate mtdoops buffer workspace\n");
@@ -432,6 +443,7 @@ static void __exit mtdoops_console_exit(void)
 
        unregister_mtd_user(&mtdoops_notifier);
        unregister_console(&mtdoops_console);
+       kfree(cxt->name);
        vfree(cxt->oops_buf);
 }
 
index 144e6b613a77cebdaf848707d8ad5c7abf4add89..29675edb44b46180bb954ed520f3d329c451a83d 100644 (file)
@@ -48,8 +48,11 @@ static int part_read(struct mtd_info *mtd, loff_t from, size_t len,
                size_t *retlen, u_char *buf)
 {
        struct mtd_part *part = PART(mtd);
+       struct mtd_ecc_stats stats;
        int res;
 
+       stats = part->master->ecc_stats;
+
        if (from >= mtd->size)
                len = 0;
        else if (from + len > mtd->size)
@@ -58,9 +61,9 @@ static int part_read(struct mtd_info *mtd, loff_t from, size_t len,
                                   len, retlen, buf);
        if (unlikely(res)) {
                if (res == -EUCLEAN)
-                       mtd->ecc_stats.corrected++;
+                       mtd->ecc_stats.corrected += part->master->ecc_stats.corrected - stats.corrected;
                if (res == -EBADMSG)
-                       mtd->ecc_stats.failed++;
+                       mtd->ecc_stats.failed += part->master->ecc_stats.failed - stats.failed;
        }
        return res;
 }
@@ -84,6 +87,18 @@ static void part_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
        part->master->unpoint(part->master, from + part->offset, len);
 }
 
+static unsigned long part_get_unmapped_area(struct mtd_info *mtd,
+                                           unsigned long len,
+                                           unsigned long offset,
+                                           unsigned long flags)
+{
+       struct mtd_part *part = PART(mtd);
+
+       offset += part->offset;
+       return part->master->get_unmapped_area(part->master, len, offset,
+                                              flags);
+}
+
 static int part_read_oob(struct mtd_info *mtd, loff_t from,
                struct mtd_oob_ops *ops)
 {
@@ -342,6 +357,12 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,
 
        slave->mtd.name = part->name;
        slave->mtd.owner = master->owner;
+       slave->mtd.backing_dev_info = master->backing_dev_info;
+
+       /* NOTE:  we don't arrange MTDs as a tree; it'd be error-prone
+        * to have the same data be in two different partitions.
+        */
+       slave->mtd.dev.parent = master->dev.parent;
 
        slave->mtd.read = part_read;
        slave->mtd.write = part_write;
@@ -354,6 +375,8 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,
                slave->mtd.unpoint = part_unpoint;
        }
 
+       if (master->get_unmapped_area)
+               slave->mtd.get_unmapped_area = part_get_unmapped_area;
        if (master->read_oob)
                slave->mtd.read_oob = part_read_oob;
        if (master->write_oob)
@@ -493,7 +516,9 @@ out_register:
  * This function, given a master MTD object and a partition table, creates
  * and registers slave MTD objects which are bound to the master according to
  * the partition definitions.
- * (Q: should we register the master MTD object as well?)
+ *
+ * We don't register the master, or expect the caller to have done so,
+ * for reasons of data integrity.
  */
 
 int add_mtd_partitions(struct mtd_info *master,
index 2ff88791cebc359aae7b830a18cf5b9679ec15b4..890936d0275ed21b957e2a46a9af52764a1fe28b 100644 (file)
@@ -334,7 +334,7 @@ config MTD_NAND_ATMEL_ECC_NONE
 endchoice
 
 config MTD_NAND_PXA3xx
-       bool "Support for NAND flash devices on PXA3xx"
+       tristate "Support for NAND flash devices on PXA3xx"
        depends on MTD_NAND && PXA3xx
        help
          This enables the driver for the NAND flash device found on
@@ -427,4 +427,23 @@ config MTD_NAND_SH_FLCTL
          Several Renesas SuperH CPU has FLCTL. This option enables support
          for NAND Flash using FLCTL. This driver support SH7723.
 
+config MTD_NAND_DAVINCI
+        tristate "Support NAND on DaVinci SoC"
+        depends on ARCH_DAVINCI
+        help
+         Enable the driver for NAND flash chips on Texas Instruments
+         DaVinci processors.
+
+config MTD_NAND_TXX9NDFMC
+       tristate "NAND Flash support for TXx9 SoC"
+       depends on SOC_TX4938 || SOC_TX4939
+       help
+         This enables the NAND flash controller on the TXx9 SoCs.
+
+config MTD_NAND_SOCRATES
+       tristate "Support for NAND on Socrates board"
+       depends on MTD_NAND && SOCRATES
+       help
+         Enables support for NAND Flash chips wired onto Socrates board.
+
 endif # MTD_NAND
index b661586afbfc38f5b2d616b4c5615207c9d5862e..d33860ac42c396a4f500d6498daf9559787b50c7 100644 (file)
@@ -14,6 +14,7 @@ obj-$(CONFIG_MTD_NAND_AU1550)         += au1550nd.o
 obj-$(CONFIG_MTD_NAND_BF5XX)           += bf5xx_nand.o
 obj-$(CONFIG_MTD_NAND_PPCHAMELEONEVB)  += ppchameleonevb.o
 obj-$(CONFIG_MTD_NAND_S3C2410)         += s3c2410.o
+obj-$(CONFIG_MTD_NAND_DAVINCI)         += davinci_nand.o
 obj-$(CONFIG_MTD_NAND_DISKONCHIP)      += diskonchip.o
 obj-$(CONFIG_MTD_NAND_H1900)           += h1910.o
 obj-$(CONFIG_MTD_NAND_RTC_FROM4)       += rtc_from4.o
@@ -36,5 +37,7 @@ obj-$(CONFIG_MTD_NAND_FSL_ELBC)               += fsl_elbc_nand.o
 obj-$(CONFIG_MTD_NAND_FSL_UPM)         += fsl_upm.o
 obj-$(CONFIG_MTD_NAND_SH_FLCTL)                += sh_flctl.o
 obj-$(CONFIG_MTD_NAND_MXC)             += mxc_nand.o
+obj-$(CONFIG_MTD_NAND_SOCRATES)                += socrates_nand.o
+obj-$(CONFIG_MTD_NAND_TXX9NDFMC)       += txx9ndfmc.o
 
 nand-objs := nand_base.o nand_bbt.o
index 9af2a2cc1153adf36c51da04ea6b5ce7f765753c..4c2a67ca801e3e07c4ebbfa82e449b3210a296d3 100644 (file)
@@ -552,7 +552,6 @@ static void bf5xx_nand_dma_write_buf(struct mtd_info *mtd,
 static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info)
 {
        int ret;
-       unsigned short val;
 
        /* Do not use dma */
        if (!hardware_ecc)
@@ -560,13 +559,6 @@ static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info)
 
        init_completion(&info->dma_completion);
 
-#ifdef CONFIG_BF54x
-       /* Setup DMAC1 channel mux for NFC which shared with SDH */
-       val = bfin_read_DMAC1_PERIMUX();
-       val &= 0xFFFE;
-       bfin_write_DMAC1_PERIMUX(val);
-       SSYNC();
-#endif
        /* Request NFC DMA channel */
        ret = request_dma(CH_NFC, "BF5XX NFC driver");
        if (ret < 0) {
@@ -574,7 +566,13 @@ static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info)
                return ret;
        }
 
-       set_dma_callback(CH_NFC, (void *) bf5xx_nand_dma_irq, (void *) info);
+#ifdef CONFIG_BF54x
+       /* Setup DMAC1 channel mux for NFC which shared with SDH */
+       bfin_write_DMAC1_PERIMUX(bfin_read_DMAC1_PERIMUX() & ~1);
+       SSYNC();
+#endif
+
+       set_dma_callback(CH_NFC, bf5xx_nand_dma_irq, info);
 
        /* Turn off the DMA channel first */
        disable_dma(CH_NFC);
@@ -632,7 +630,7 @@ static int bf5xx_nand_hw_init(struct bf5xx_nand_info *info)
 /*
  * Device management interface
  */
-static int bf5xx_nand_add_partition(struct bf5xx_nand_info *info)
+static int __devinit bf5xx_nand_add_partition(struct bf5xx_nand_info *info)
 {
        struct mtd_info *mtd = &info->mtd;
 
index 22a6b2e50e917467dbacb08f45775934d5a51832..7c5b257ce8e482c8a974fae8b6eb8ba286a39277 100644 (file)
@@ -654,6 +654,7 @@ static int __devinit cafe_nand_probe(struct pci_dev *pdev,
        }
        cafe = (void *)(&mtd[1]);
 
+       mtd->dev.parent = &pdev->dev;
        mtd->priv = cafe;
        mtd->owner = THIS_MODULE;
 
diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c
new file mode 100644 (file)
index 0000000..0119220
--- /dev/null
@@ -0,0 +1,570 @@
+/*
+ * davinci_nand.c - NAND Flash Driver for DaVinci family chips
+ *
+ * Copyright Â© 2006 Texas Instruments.
+ *
+ * Port to 2.6.23 Copyright Â© 2008 by:
+ *   Sander Huijsen <Shuijsen@optelecom-nkf.com>
+ *   Troy Kisky <troy.kisky@boundarydevices.com>
+ *   Dirk Behme <Dirk.Behme@gmail.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; 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 <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+
+#include <mach/nand.h>
+
+#include <asm/mach-types.h>
+
+
+/*
+ * This is a device driver for the NAND flash controller found on the
+ * various DaVinci family chips.  It handles up to four SoC chipselects,
+ * and some flavors of secondary chipselect (e.g. based on A12) as used
+ * with multichip packages.
+ *
+ * The 1-bit ECC hardware is supported, but not yet the newer 4-bit ECC
+ * available on chips like the DM355 and OMAP-L137 and needed with the
+ * more error-prone MLC NAND chips.
+ *
+ * This driver assumes EM_WAIT connects all the NAND devices' RDY/nBUSY
+ * outputs in a "wire-AND" configuration, with no per-chip signals.
+ */
+struct davinci_nand_info {
+       struct mtd_info         mtd;
+       struct nand_chip        chip;
+
+       struct device           *dev;
+       struct clk              *clk;
+       bool                    partitioned;
+
+       void __iomem            *base;
+       void __iomem            *vaddr;
+
+       uint32_t                ioaddr;
+       uint32_t                current_cs;
+
+       uint32_t                mask_chipsel;
+       uint32_t                mask_ale;
+       uint32_t                mask_cle;
+
+       uint32_t                core_chipsel;
+};
+
+static DEFINE_SPINLOCK(davinci_nand_lock);
+
+#define to_davinci_nand(m) container_of(m, struct davinci_nand_info, mtd)
+
+
+static inline unsigned int davinci_nand_readl(struct davinci_nand_info *info,
+               int offset)
+{
+       return __raw_readl(info->base + offset);
+}
+
+static inline void davinci_nand_writel(struct davinci_nand_info *info,
+               int offset, unsigned long value)
+{
+       __raw_writel(value, info->base + offset);
+}
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * Access to hardware control lines:  ALE, CLE, secondary chipselect.
+ */
+
+static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd,
+                                  unsigned int ctrl)
+{
+       struct davinci_nand_info        *info = to_davinci_nand(mtd);
+       uint32_t                        addr = info->current_cs;
+       struct nand_chip                *nand = mtd->priv;
+
+       /* Did the control lines change? */
+       if (ctrl & NAND_CTRL_CHANGE) {
+               if ((ctrl & NAND_CTRL_CLE) == NAND_CTRL_CLE)
+                       addr |= info->mask_cle;
+               else if ((ctrl & NAND_CTRL_ALE) == NAND_CTRL_ALE)
+                       addr |= info->mask_ale;
+
+               nand->IO_ADDR_W = (void __iomem __force *)addr;
+       }
+
+       if (cmd != NAND_CMD_NONE)
+               iowrite8(cmd, nand->IO_ADDR_W);
+}
+
+static void nand_davinci_select_chip(struct mtd_info *mtd, int chip)
+{
+       struct davinci_nand_info        *info = to_davinci_nand(mtd);
+       uint32_t                        addr = info->ioaddr;
+
+       /* maybe kick in a second chipselect */
+       if (chip > 0)
+               addr |= info->mask_chipsel;
+       info->current_cs = addr;
+
+       info->chip.IO_ADDR_W = (void __iomem __force *)addr;
+       info->chip.IO_ADDR_R = info->chip.IO_ADDR_W;
+}
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * 1-bit hardware ECC ... context maintained for each core chipselect
+ */
+
+static inline uint32_t nand_davinci_readecc_1bit(struct mtd_info *mtd)
+{
+       struct davinci_nand_info *info = to_davinci_nand(mtd);
+
+       return davinci_nand_readl(info, NANDF1ECC_OFFSET
+                       + 4 * info->core_chipsel);
+}
+
+static void nand_davinci_hwctl_1bit(struct mtd_info *mtd, int mode)
+{
+       struct davinci_nand_info *info;
+       uint32_t nandcfr;
+       unsigned long flags;
+
+       info = to_davinci_nand(mtd);
+
+       /* Reset ECC hardware */
+       nand_davinci_readecc_1bit(mtd);
+
+       spin_lock_irqsave(&davinci_nand_lock, flags);
+
+       /* Restart ECC hardware */
+       nandcfr = davinci_nand_readl(info, NANDFCR_OFFSET);
+       nandcfr |= BIT(8 + info->core_chipsel);
+       davinci_nand_writel(info, NANDFCR_OFFSET, nandcfr);
+
+       spin_unlock_irqrestore(&davinci_nand_lock, flags);
+}
+
+/*
+ * Read hardware ECC value and pack into three bytes
+ */
+static int nand_davinci_calculate_1bit(struct mtd_info *mtd,
+                                     const u_char *dat, u_char *ecc_code)
+{
+       unsigned int ecc_val = nand_davinci_readecc_1bit(mtd);
+       unsigned int ecc24 = (ecc_val & 0x0fff) | ((ecc_val & 0x0fff0000) >> 4);
+
+       /* invert so that erased block ecc is correct */
+       ecc24 = ~ecc24;
+       ecc_code[0] = (u_char)(ecc24);
+       ecc_code[1] = (u_char)(ecc24 >> 8);
+       ecc_code[2] = (u_char)(ecc24 >> 16);
+
+       return 0;
+}
+
+static int nand_davinci_correct_1bit(struct mtd_info *mtd, u_char *dat,
+                                    u_char *read_ecc, u_char *calc_ecc)
+{
+       struct nand_chip *chip = mtd->priv;
+       uint32_t eccNand = read_ecc[0] | (read_ecc[1] << 8) |
+                                         (read_ecc[2] << 16);
+       uint32_t eccCalc = calc_ecc[0] | (calc_ecc[1] << 8) |
+                                         (calc_ecc[2] << 16);
+       uint32_t diff = eccCalc ^ eccNand;
+
+       if (diff) {
+               if ((((diff >> 12) ^ diff) & 0xfff) == 0xfff) {
+                       /* Correctable error */
+                       if ((diff >> (12 + 3)) < chip->ecc.size) {
+                               dat[diff >> (12 + 3)] ^= BIT((diff >> 12) & 7);
+                               return 1;
+                       } else {
+                               return -1;
+                       }
+               } else if (!(diff & (diff - 1))) {
+                       /* Single bit ECC error in the ECC itself,
+                        * nothing to fix */
+                       return 1;
+               } else {
+                       /* Uncorrectable error */
+                       return -1;
+               }
+
+       }
+       return 0;
+}
+
+/*----------------------------------------------------------------------*/
+
+/*
+ * NOTE:  NAND boot requires ALE == EM_A[1], CLE == EM_A[2], so that's
+ * how these chips are normally wired.  This translates to both 8 and 16
+ * bit busses using ALE == BIT(3) in byte addresses, and CLE == BIT(4).
+ *
+ * For now we assume that configuration, or any other one which ignores
+ * the two LSBs for NAND access ... so we can issue 32-bit reads/writes
+ * and have that transparently morphed into multiple NAND operations.
+ */
+static void nand_davinci_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
+{
+       struct nand_chip *chip = mtd->priv;
+
+       if ((0x03 & ((unsigned)buf)) == 0 && (0x03 & len) == 0)
+               ioread32_rep(chip->IO_ADDR_R, buf, len >> 2);
+       else if ((0x01 & ((unsigned)buf)) == 0 && (0x01 & len) == 0)
+               ioread16_rep(chip->IO_ADDR_R, buf, len >> 1);
+       else
+               ioread8_rep(chip->IO_ADDR_R, buf, len);
+}
+
+static void nand_davinci_write_buf(struct mtd_info *mtd,
+               const uint8_t *buf, int len)
+{
+       struct nand_chip *chip = mtd->priv;
+
+       if ((0x03 & ((unsigned)buf)) == 0 && (0x03 & len) == 0)
+               iowrite32_rep(chip->IO_ADDR_R, buf, len >> 2);
+       else if ((0x01 & ((unsigned)buf)) == 0 && (0x01 & len) == 0)
+               iowrite16_rep(chip->IO_ADDR_R, buf, len >> 1);
+       else
+               iowrite8_rep(chip->IO_ADDR_R, buf, len);
+}
+
+/*
+ * Check hardware register for wait status. Returns 1 if device is ready,
+ * 0 if it is still busy.
+ */
+static int nand_davinci_dev_ready(struct mtd_info *mtd)
+{
+       struct davinci_nand_info *info = to_davinci_nand(mtd);
+
+       return davinci_nand_readl(info, NANDFSR_OFFSET) & BIT(0);
+}
+
+static void __init nand_dm6446evm_flash_init(struct davinci_nand_info *info)
+{
+       uint32_t regval, a1cr;
+
+       /*
+        * NAND FLASH timings @ PLL1 == 459 MHz
+        *  - AEMIF.CLK freq   = PLL1/6 = 459/6 = 76.5 MHz
+        *  - AEMIF.CLK period = 1/76.5 MHz = 13.1 ns
+        */
+       regval = 0
+               | (0 << 31)           /* selectStrobe */
+               | (0 << 30)           /* extWait (never with NAND) */
+               | (1 << 26)           /* writeSetup      10 ns */
+               | (3 << 20)           /* writeStrobe     40 ns */
+               | (1 << 17)           /* writeHold       10 ns */
+               | (0 << 13)           /* readSetup       10 ns */
+               | (3 << 7)            /* readStrobe      60 ns */
+               | (0 << 4)            /* readHold        10 ns */
+               | (3 << 2)            /* turnAround      ?? ns */
+               | (0 << 0)            /* asyncSize       8-bit bus */
+               ;
+       a1cr = davinci_nand_readl(info, A1CR_OFFSET);
+       if (a1cr != regval) {
+               dev_dbg(info->dev, "Warning: NAND config: Set A1CR " \
+                      "reg to 0x%08x, was 0x%08x, should be done by " \
+                      "bootloader.\n", regval, a1cr);
+               davinci_nand_writel(info, A1CR_OFFSET, regval);
+       }
+}
+
+/*----------------------------------------------------------------------*/
+
+static int __init nand_davinci_probe(struct platform_device *pdev)
+{
+       struct davinci_nand_pdata       *pdata = pdev->dev.platform_data;
+       struct davinci_nand_info        *info;
+       struct resource                 *res1;
+       struct resource                 *res2;
+       void __iomem                    *vaddr;
+       void __iomem                    *base;
+       int                             ret;
+       uint32_t                        val;
+       nand_ecc_modes_t                ecc_mode;
+
+       /* which external chipselect will we be managing? */
+       if (pdev->id < 0 || pdev->id > 3)
+               return -ENODEV;
+
+       info = kzalloc(sizeof(*info), GFP_KERNEL);
+       if (!info) {
+               dev_err(&pdev->dev, "unable to allocate memory\n");
+               ret = -ENOMEM;
+               goto err_nomem;
+       }
+
+       platform_set_drvdata(pdev, info);
+
+       res1 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       res2 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       if (!res1 || !res2) {
+               dev_err(&pdev->dev, "resource missing\n");
+               ret = -EINVAL;
+               goto err_nomem;
+       }
+
+       vaddr = ioremap(res1->start, res1->end - res1->start);
+       base = ioremap(res2->start, res2->end - res2->start);
+       if (!vaddr || !base) {
+               dev_err(&pdev->dev, "ioremap failed\n");
+               ret = -EINVAL;
+               goto err_ioremap;
+       }
+
+       info->dev               = &pdev->dev;
+       info->base              = base;
+       info->vaddr             = vaddr;
+
+       info->mtd.priv          = &info->chip;
+       info->mtd.name          = dev_name(&pdev->dev);
+       info->mtd.owner         = THIS_MODULE;
+
+       info->mtd.dev.parent    = &pdev->dev;
+
+       info->chip.IO_ADDR_R    = vaddr;
+       info->chip.IO_ADDR_W    = vaddr;
+       info->chip.chip_delay   = 0;
+       info->chip.select_chip  = nand_davinci_select_chip;
+
+       /* options such as NAND_USE_FLASH_BBT or 16-bit widths */
+       info->chip.options      = pdata ? pdata->options : 0;
+
+       info->ioaddr            = (uint32_t __force) vaddr;
+
+       info->current_cs        = info->ioaddr;
+       info->core_chipsel      = pdev->id;
+       info->mask_chipsel      = pdata->mask_chipsel;
+
+       /* use nandboot-capable ALE/CLE masks by default */
+       if (pdata && pdata->mask_ale)
+               info->mask_ale  = pdata->mask_cle;
+       else
+               info->mask_ale  = MASK_ALE;
+       if (pdata && pdata->mask_cle)
+               info->mask_cle  = pdata->mask_cle;
+       else
+               info->mask_cle  = MASK_CLE;
+
+       /* Set address of hardware control function */
+       info->chip.cmd_ctrl     = nand_davinci_hwcontrol;
+       info->chip.dev_ready    = nand_davinci_dev_ready;
+
+       /* Speed up buffer I/O */
+       info->chip.read_buf     = nand_davinci_read_buf;
+       info->chip.write_buf    = nand_davinci_write_buf;
+
+       /* use board-specific ECC config; else, the best available */
+       if (pdata)
+               ecc_mode = pdata->ecc_mode;
+       else
+               ecc_mode = NAND_ECC_HW;
+
+       switch (ecc_mode) {
+       case NAND_ECC_NONE:
+       case NAND_ECC_SOFT:
+               break;
+       case NAND_ECC_HW:
+               info->chip.ecc.calculate = nand_davinci_calculate_1bit;
+               info->chip.ecc.correct = nand_davinci_correct_1bit;
+               info->chip.ecc.hwctl = nand_davinci_hwctl_1bit;
+               info->chip.ecc.size = 512;
+               info->chip.ecc.bytes = 3;
+               break;
+       case NAND_ECC_HW_SYNDROME:
+               /* FIXME implement */
+               info->chip.ecc.size = 512;
+               info->chip.ecc.bytes = 10;
+
+               dev_warn(&pdev->dev, "4-bit ECC nyet supported\n");
+               /* FALL THROUGH */
+       default:
+               ret = -EINVAL;
+               goto err_ecc;
+       }
+       info->chip.ecc.mode = ecc_mode;
+
+       info->clk = clk_get(&pdev->dev, "AEMIFCLK");
+       if (IS_ERR(info->clk)) {
+               ret = PTR_ERR(info->clk);
+               dev_dbg(&pdev->dev, "unable to get AEMIFCLK, err %d\n", ret);
+               goto err_clk;
+       }
+
+       ret = clk_enable(info->clk);
+       if (ret < 0) {
+               dev_dbg(&pdev->dev, "unable to enable AEMIFCLK, err %d\n", ret);
+               goto err_clk_enable;
+       }
+
+       /* EMIF timings should normally be set by the boot loader,
+        * especially after boot-from-NAND.  The *only* reason to
+        * have this special casing for the DM6446 EVM is to work
+        * with boot-from-NOR ... with CS0 manually re-jumpered
+        * (after startup) so it addresses the NAND flash, not NOR.
+        * Even for dev boards, that's unusually rude...
+        */
+       if (machine_is_davinci_evm())
+               nand_dm6446evm_flash_init(info);
+
+       spin_lock_irq(&davinci_nand_lock);
+
+       /* put CSxNAND into NAND mode */
+       val = davinci_nand_readl(info, NANDFCR_OFFSET);
+       val |= BIT(info->core_chipsel);
+       davinci_nand_writel(info, NANDFCR_OFFSET, val);
+
+       spin_unlock_irq(&davinci_nand_lock);
+
+       /* Scan to find existence of the device(s) */
+       ret = nand_scan(&info->mtd, pdata->mask_chipsel ? 2 : 1);
+       if (ret < 0) {
+               dev_dbg(&pdev->dev, "no NAND chip(s) found\n");
+               goto err_scan;
+       }
+
+       if (mtd_has_partitions()) {
+               struct mtd_partition    *mtd_parts = NULL;
+               int                     mtd_parts_nb = 0;
+
+               if (mtd_has_cmdlinepart()) {
+                       static const char *probes[] __initconst =
+                               { "cmdlinepart", NULL };
+
+                       const char              *master_name;
+
+                       /* Set info->mtd.name = 0 temporarily */
+                       master_name             = info->mtd.name;
+                       info->mtd.name          = (char *)0;
+
+                       /* info->mtd.name == 0, means: don't bother checking
+                          <mtd-id> */
+                       mtd_parts_nb = parse_mtd_partitions(&info->mtd, probes,
+                                                           &mtd_parts, 0);
+
+                       /* Restore info->mtd.name */
+                       info->mtd.name = master_name;
+               }
+
+               if (mtd_parts_nb <= 0 && pdata) {
+                       mtd_parts = pdata->parts;
+                       mtd_parts_nb = pdata->nr_parts;
+               }
+
+               /* Register any partitions */
+               if (mtd_parts_nb > 0) {
+                       ret = add_mtd_partitions(&info->mtd,
+                                       mtd_parts, mtd_parts_nb);
+                       if (ret == 0)
+                               info->partitioned = true;
+               }
+
+       } else if (pdata && pdata->nr_parts) {
+               dev_warn(&pdev->dev, "ignoring %d default partitions on %s\n",
+                               pdata->nr_parts, info->mtd.name);
+       }
+
+       /* If there's no partition info, just package the whole chip
+        * as a single MTD device.
+        */
+       if (!info->partitioned)
+               ret = add_mtd_device(&info->mtd) ? -ENODEV : 0;
+
+       if (ret < 0)
+               goto err_scan;
+
+       val = davinci_nand_readl(info, NRCSR_OFFSET);
+       dev_info(&pdev->dev, "controller rev. %d.%d\n",
+              (val >> 8) & 0xff, val & 0xff);
+
+       return 0;
+
+err_scan:
+       clk_disable(info->clk);
+
+err_clk_enable:
+       clk_put(info->clk);
+
+err_ecc:
+err_clk:
+err_ioremap:
+       if (base)
+               iounmap(base);
+       if (vaddr)
+               iounmap(vaddr);
+
+err_nomem:
+       kfree(info);
+       return ret;
+}
+
+static int __exit nand_davinci_remove(struct platform_device *pdev)
+{
+       struct davinci_nand_info *info = platform_get_drvdata(pdev);
+       int status;
+
+       if (mtd_has_partitions() && info->partitioned)
+               status = del_mtd_partitions(&info->mtd);
+       else
+               status = del_mtd_device(&info->mtd);
+
+       iounmap(info->base);
+       iounmap(info->vaddr);
+
+       nand_release(&info->mtd);
+
+       clk_disable(info->clk);
+       clk_put(info->clk);
+
+       kfree(info);
+
+       return 0;
+}
+
+static struct platform_driver nand_davinci_driver = {
+       .remove         = __exit_p(nand_davinci_remove),
+       .driver         = {
+               .name   = "davinci_nand",
+       },
+};
+MODULE_ALIAS("platform:davinci_nand");
+
+static int __init nand_davinci_init(void)
+{
+       return platform_driver_probe(&nand_davinci_driver, nand_davinci_probe);
+}
+module_init(nand_davinci_init);
+
+static void __exit nand_davinci_exit(void)
+{
+       platform_driver_unregister(&nand_davinci_driver);
+}
+module_exit(nand_davinci_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Texas Instruments");
+MODULE_DESCRIPTION("Davinci NAND flash driver");
+
index 7815a404a63287a04ec4c25e4a77afbc8a1b6a8e..d120cd8d72674919fc453870978765ebf95d9a00 100644 (file)
 #include <linux/io.h>
 #include <asm/fsl_lbc.h>
 
+#define FSL_UPM_WAIT_RUN_PATTERN  0x1
+#define FSL_UPM_WAIT_WRITE_BYTE   0x2
+#define FSL_UPM_WAIT_WRITE_BUFFER 0x4
+
 struct fsl_upm_nand {
        struct device *dev;
        struct mtd_info mtd;
@@ -36,8 +40,12 @@ struct fsl_upm_nand {
        uint8_t upm_addr_offset;
        uint8_t upm_cmd_offset;
        void __iomem *io_base;
-       int rnb_gpio;
+       int rnb_gpio[NAND_MAX_CHIPS];
+       uint32_t mchip_offsets[NAND_MAX_CHIPS];
+       uint32_t mchip_count;
+       uint32_t mchip_number;
        int chip_delay;
+       uint32_t wait_flags;
 };
 
 #define to_fsl_upm_nand(mtd) container_of(mtd, struct fsl_upm_nand, mtd)
@@ -46,7 +54,7 @@ static int fun_chip_ready(struct mtd_info *mtd)
 {
        struct fsl_upm_nand *fun = to_fsl_upm_nand(mtd);
 
-       if (gpio_get_value(fun->rnb_gpio))
+       if (gpio_get_value(fun->rnb_gpio[fun->mchip_number]))
                return 1;
 
        dev_vdbg(fun->dev, "busy\n");
@@ -55,9 +63,9 @@ static int fun_chip_ready(struct mtd_info *mtd)
 
 static void fun_wait_rnb(struct fsl_upm_nand *fun)
 {
-       int cnt = 1000000;
+       if (fun->rnb_gpio[fun->mchip_number] >= 0) {
+               int cnt = 1000000;
 
-       if (fun->rnb_gpio >= 0) {
                while (--cnt && !fun_chip_ready(&fun->mtd))
                        cpu_relax();
                if (!cnt)
@@ -69,7 +77,9 @@ static void fun_wait_rnb(struct fsl_upm_nand *fun)
 
 static void fun_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
 {
+       struct nand_chip *chip = mtd->priv;
        struct fsl_upm_nand *fun = to_fsl_upm_nand(mtd);
+       u32 mar;
 
        if (!(ctrl & fun->last_ctrl)) {
                fsl_upm_end_pattern(&fun->upm);
@@ -87,9 +97,28 @@ static void fun_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
                        fsl_upm_start_pattern(&fun->upm, fun->upm_cmd_offset);
        }
 
-       fsl_upm_run_pattern(&fun->upm, fun->io_base, cmd);
+       mar = (cmd << (32 - fun->upm.width)) |
+               fun->mchip_offsets[fun->mchip_number];
+       fsl_upm_run_pattern(&fun->upm, chip->IO_ADDR_R, mar);
+
+       if (fun->wait_flags & FSL_UPM_WAIT_RUN_PATTERN)
+               fun_wait_rnb(fun);
+}
+
+static void fun_select_chip(struct mtd_info *mtd, int mchip_nr)
+{
+       struct nand_chip *chip = mtd->priv;
+       struct fsl_upm_nand *fun = to_fsl_upm_nand(mtd);
 
-       fun_wait_rnb(fun);
+       if (mchip_nr == -1) {
+               chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
+       } else if (mchip_nr >= 0) {
+               fun->mchip_number = mchip_nr;
+               chip->IO_ADDR_R = fun->io_base + fun->mchip_offsets[mchip_nr];
+               chip->IO_ADDR_W = chip->IO_ADDR_R;
+       } else {
+               BUG();
+       }
 }
 
 static uint8_t fun_read_byte(struct mtd_info *mtd)
@@ -115,8 +144,11 @@ static void fun_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
 
        for (i = 0; i < len; i++) {
                out_8(fun->chip.IO_ADDR_W, buf[i]);
-               fun_wait_rnb(fun);
+               if (fun->wait_flags & FSL_UPM_WAIT_WRITE_BYTE)
+                       fun_wait_rnb(fun);
        }
+       if (fun->wait_flags & FSL_UPM_WAIT_WRITE_BUFFER)
+               fun_wait_rnb(fun);
 }
 
 static int __devinit fun_chip_init(struct fsl_upm_nand *fun,
@@ -137,8 +169,10 @@ static int __devinit fun_chip_init(struct fsl_upm_nand *fun,
        fun->chip.read_buf = fun_read_buf;
        fun->chip.write_buf = fun_write_buf;
        fun->chip.ecc.mode = NAND_ECC_SOFT;
+       if (fun->mchip_count > 1)
+               fun->chip.select_chip = fun_select_chip;
 
-       if (fun->rnb_gpio >= 0)
+       if (fun->rnb_gpio[0] >= 0)
                fun->chip.dev_ready = fun_chip_ready;
 
        fun->mtd.priv = &fun->chip;
@@ -155,7 +189,7 @@ static int __devinit fun_chip_init(struct fsl_upm_nand *fun,
                goto err;
        }
 
-       ret = nand_scan(&fun->mtd, 1);
+       ret = nand_scan(&fun->mtd, fun->mchip_count);
        if (ret)
                goto err;
 
@@ -185,8 +219,10 @@ static int __devinit fun_probe(struct of_device *ofdev,
        struct fsl_upm_nand *fun;
        struct resource io_res;
        const uint32_t *prop;
+       int rnb_gpio;
        int ret;
        int size;
+       int i;
 
        fun = kzalloc(sizeof(*fun), GFP_KERNEL);
        if (!fun)
@@ -208,7 +244,7 @@ static int __devinit fun_probe(struct of_device *ofdev,
        if (!prop || size != sizeof(uint32_t)) {
                dev_err(&ofdev->dev, "can't get UPM address offset\n");
                ret = -EINVAL;
-               goto err2;
+               goto err1;
        }
        fun->upm_addr_offset = *prop;
 
@@ -216,21 +252,40 @@ static int __devinit fun_probe(struct of_device *ofdev,
        if (!prop || size != sizeof(uint32_t)) {
                dev_err(&ofdev->dev, "can't get UPM command offset\n");
                ret = -EINVAL;
-               goto err2;
+               goto err1;
        }
        fun->upm_cmd_offset = *prop;
 
-       fun->rnb_gpio = of_get_gpio(ofdev->node, 0);
-       if (fun->rnb_gpio >= 0) {
-               ret = gpio_request(fun->rnb_gpio, dev_name(&ofdev->dev));
-               if (ret) {
-                       dev_err(&ofdev->dev, "can't request RNB gpio\n");
+       prop = of_get_property(ofdev->node,
+                              "fsl,upm-addr-line-cs-offsets", &size);
+       if (prop && (size / sizeof(uint32_t)) > 0) {
+               fun->mchip_count = size / sizeof(uint32_t);
+               if (fun->mchip_count >= NAND_MAX_CHIPS) {
+                       dev_err(&ofdev->dev, "too much multiple chips\n");
+                       goto err1;
+               }
+               for (i = 0; i < fun->mchip_count; i++)
+                       fun->mchip_offsets[i] = prop[i];
+       } else {
+               fun->mchip_count = 1;
+       }
+
+       for (i = 0; i < fun->mchip_count; i++) {
+               fun->rnb_gpio[i] = -1;
+               rnb_gpio = of_get_gpio(ofdev->node, i);
+               if (rnb_gpio >= 0) {
+                       ret = gpio_request(rnb_gpio, dev_name(&ofdev->dev));
+                       if (ret) {
+                               dev_err(&ofdev->dev,
+                                       "can't request RNB gpio #%d\n", i);
+                               goto err2;
+                       }
+                       gpio_direction_input(rnb_gpio);
+                       fun->rnb_gpio[i] = rnb_gpio;
+               } else if (rnb_gpio == -EINVAL) {
+                       dev_err(&ofdev->dev, "RNB gpio #%d is invalid\n", i);
                        goto err2;
                }
-               gpio_direction_input(fun->rnb_gpio);
-       } else if (fun->rnb_gpio == -EINVAL) {
-               dev_err(&ofdev->dev, "specified RNB gpio is invalid\n");
-               goto err2;
        }
 
        prop = of_get_property(ofdev->node, "chip-delay", NULL);
@@ -239,8 +294,15 @@ static int __devinit fun_probe(struct of_device *ofdev,
        else
                fun->chip_delay = 50;
 
+       prop = of_get_property(ofdev->node, "fsl,upm-wait-flags", &size);
+       if (prop && size == sizeof(uint32_t))
+               fun->wait_flags = *prop;
+       else
+               fun->wait_flags = FSL_UPM_WAIT_RUN_PATTERN |
+                                 FSL_UPM_WAIT_WRITE_BYTE;
+
        fun->io_base = devm_ioremap_nocache(&ofdev->dev, io_res.start,
-                                         io_res.end - io_res.start + 1);
+                                           io_res.end - io_res.start + 1);
        if (!fun->io_base) {
                ret = -ENOMEM;
                goto err2;
@@ -257,8 +319,11 @@ static int __devinit fun_probe(struct of_device *ofdev,
 
        return 0;
 err2:
-       if (fun->rnb_gpio >= 0)
-               gpio_free(fun->rnb_gpio);
+       for (i = 0; i < fun->mchip_count; i++) {
+               if (fun->rnb_gpio[i] < 0)
+                       break;
+               gpio_free(fun->rnb_gpio[i]);
+       }
 err1:
        kfree(fun);
 
@@ -268,12 +333,16 @@ err1:
 static int __devexit fun_remove(struct of_device *ofdev)
 {
        struct fsl_upm_nand *fun = dev_get_drvdata(&ofdev->dev);
+       int i;
 
        nand_release(&fun->mtd);
        kfree(fun->mtd.name);
 
-       if (fun->rnb_gpio >= 0)
-               gpio_free(fun->rnb_gpio);
+       for (i = 0; i < fun->mchip_count; i++) {
+               if (fun->rnb_gpio[i] < 0)
+                       break;
+               gpio_free(fun->rnb_gpio[i]);
+       }
 
        kfree(fun);
 
index bad048aca89af040b48248bd7e3852365c143044..f3548d0480142cb5fa8c5e599ff3b8add7b91e97 100644 (file)
@@ -866,6 +866,7 @@ static int __init mxcnd_probe(struct platform_device *pdev)
        mtd = &host->mtd;
        mtd->priv = this;
        mtd->owner = THIS_MODULE;
+       mtd->dev.parent = &pdev->dev;
 
        /* 50 us command delay time */
        this->chip_delay = 5;
index 5f71371eb1b085ce6ad469d0120264dbc5bb1f33..3d7ed432fa4157ec9d655c3354c4c1edc699ebc8 100644 (file)
@@ -82,6 +82,20 @@ static struct nand_ecclayout nand_oob_64 = {
                 .length = 38}}
 };
 
+static struct nand_ecclayout nand_oob_128 = {
+       .eccbytes = 48,
+       .eccpos = {
+                  80, 81, 82, 83, 84, 85, 86, 87,
+                  88, 89, 90, 91, 92, 93, 94, 95,
+                  96, 97, 98, 99, 100, 101, 102, 103,
+                  104, 105, 106, 107, 108, 109, 110, 111,
+                  112, 113, 114, 115, 116, 117, 118, 119,
+                  120, 121, 122, 123, 124, 125, 126, 127},
+       .oobfree = {
+               {.offset = 2,
+                .length = 78}}
+};
+
 static int nand_get_device(struct nand_chip *chip, struct mtd_info *mtd,
                           int new_state);
 
@@ -748,6 +762,8 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
  * @mtd:       mtd info structure
  * @chip:      nand chip info structure
  * @buf:       buffer to store read data
+ *
+ * Not for syndrome calculating ecc controllers, which use a special oob layout
  */
 static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
                              uint8_t *buf)
@@ -757,6 +773,47 @@ static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
        return 0;
 }
 
+/**
+ * nand_read_page_raw_syndrome - [Intern] read raw page data without ecc
+ * @mtd:       mtd info structure
+ * @chip:      nand chip info structure
+ * @buf:       buffer to store read data
+ *
+ * We need a special oob layout and handling even when OOB isn't used.
+ */
+static int nand_read_page_raw_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
+                             uint8_t *buf)
+{
+       int eccsize = chip->ecc.size;
+       int eccbytes = chip->ecc.bytes;
+       uint8_t *oob = chip->oob_poi;
+       int steps, size;
+
+       for (steps = chip->ecc.steps; steps > 0; steps--) {
+               chip->read_buf(mtd, buf, eccsize);
+               buf += eccsize;
+
+               if (chip->ecc.prepad) {
+                       chip->read_buf(mtd, oob, chip->ecc.prepad);
+                       oob += chip->ecc.prepad;
+               }
+
+               chip->read_buf(mtd, oob, eccbytes);
+               oob += eccbytes;
+
+               if (chip->ecc.postpad) {
+                       chip->read_buf(mtd, oob, chip->ecc.postpad);
+                       oob += chip->ecc.postpad;
+               }
+       }
+
+       size = mtd->oobsize - (oob - chip->oob_poi);
+       if (size)
+               chip->read_buf(mtd, oob, size);
+
+       return 0;
+}
+
 /**
  * nand_read_page_swecc - [REPLACABLE] software ecc based page read function
  * @mtd:       mtd info structure
@@ -1482,6 +1539,8 @@ static int nand_read_oob(struct mtd_info *mtd, loff_t from,
  * @mtd:       mtd info structure
  * @chip:      nand chip info structure
  * @buf:       data buffer
+ *
+ * Not for syndrome calculating ecc controllers, which use a special oob layout
  */
 static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
                                const uint8_t *buf)
@@ -1490,6 +1549,44 @@ static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
        chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
 }
 
+/**
+ * nand_write_page_raw_syndrome - [Intern] raw page write function
+ * @mtd:       mtd info structure
+ * @chip:      nand chip info structure
+ * @buf:       data buffer
+ *
+ * We need a special oob layout and handling even when ECC isn't checked.
+ */
+static void nand_write_page_raw_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
+                               const uint8_t *buf)
+{
+       int eccsize = chip->ecc.size;
+       int eccbytes = chip->ecc.bytes;
+       uint8_t *oob = chip->oob_poi;
+       int steps, size;
+
+       for (steps = chip->ecc.steps; steps > 0; steps--) {
+               chip->write_buf(mtd, buf, eccsize);
+               buf += eccsize;
+
+               if (chip->ecc.prepad) {
+                       chip->write_buf(mtd, oob, chip->ecc.prepad);
+                       oob += chip->ecc.prepad;
+               }
+
+               chip->read_buf(mtd, oob, eccbytes);
+               oob += eccbytes;
+
+               if (chip->ecc.postpad) {
+                       chip->write_buf(mtd, oob, chip->ecc.postpad);
+                       oob += chip->ecc.postpad;
+               }
+       }
+
+       size = mtd->oobsize - (oob - chip->oob_poi);
+       if (size)
+               chip->write_buf(mtd, oob, size);
+}
 /**
  * nand_write_page_swecc - [REPLACABLE] software ecc based page write function
  * @mtd:       mtd info structure
@@ -1863,7 +1960,7 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
        }
 
        if (unlikely(ops->ooboffs >= len)) {
-               DEBUG(MTD_DEBUG_LEVEL0, "nand_read_oob: "
+               DEBUG(MTD_DEBUG_LEVEL0, "nand_do_write_oob: "
                        "Attempt to start write outside oob\n");
                return -EINVAL;
        }
@@ -1873,7 +1970,7 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
                     ops->ooboffs + ops->ooblen >
                        ((mtd->size >> chip->page_shift) -
                         (to >> chip->page_shift)) * len)) {
-               DEBUG(MTD_DEBUG_LEVEL0, "nand_read_oob: "
+               DEBUG(MTD_DEBUG_LEVEL0, "nand_do_write_oob: "
                        "Attempt write beyond end of device\n");
                return -EINVAL;
        }
@@ -1929,8 +2026,8 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to,
 
        /* Do not allow writes past end of device */
        if (ops->datbuf && (to + ops->len) > mtd->size) {
-               DEBUG(MTD_DEBUG_LEVEL0, "nand_read_oob: "
-                     "Attempt read beyond end of device\n");
+               DEBUG(MTD_DEBUG_LEVEL0, "nand_write_oob: "
+                     "Attempt write beyond end of device\n");
                return -EINVAL;
        }
 
@@ -2555,6 +2652,9 @@ int nand_scan_tail(struct mtd_info *mtd)
                case 64:
                        chip->ecc.layout = &nand_oob_64;
                        break;
+               case 128:
+                       chip->ecc.layout = &nand_oob_128;
+                       break;
                default:
                        printk(KERN_WARNING "No oob scheme defined for "
                               "oobsize %d\n", mtd->oobsize);
@@ -2569,10 +2669,6 @@ int nand_scan_tail(struct mtd_info *mtd)
         * check ECC mode, default to software if 3byte/512byte hardware ECC is
         * selected and we have 256 byte pagesize fallback to software ECC
         */
-       if (!chip->ecc.read_page_raw)
-               chip->ecc.read_page_raw = nand_read_page_raw;
-       if (!chip->ecc.write_page_raw)
-               chip->ecc.write_page_raw = nand_write_page_raw;
 
        switch (chip->ecc.mode) {
        case NAND_ECC_HW:
@@ -2581,6 +2677,10 @@ int nand_scan_tail(struct mtd_info *mtd)
                        chip->ecc.read_page = nand_read_page_hwecc;
                if (!chip->ecc.write_page)
                        chip->ecc.write_page = nand_write_page_hwecc;
+               if (!chip->ecc.read_page_raw)
+                       chip->ecc.read_page_raw = nand_read_page_raw;
+               if (!chip->ecc.write_page_raw)
+                       chip->ecc.write_page_raw = nand_write_page_raw;
                if (!chip->ecc.read_oob)
                        chip->ecc.read_oob = nand_read_oob_std;
                if (!chip->ecc.write_oob)
@@ -2602,6 +2702,10 @@ int nand_scan_tail(struct mtd_info *mtd)
                        chip->ecc.read_page = nand_read_page_syndrome;
                if (!chip->ecc.write_page)
                        chip->ecc.write_page = nand_write_page_syndrome;
+               if (!chip->ecc.read_page_raw)
+                       chip->ecc.read_page_raw = nand_read_page_raw_syndrome;
+               if (!chip->ecc.write_page_raw)
+                       chip->ecc.write_page_raw = nand_write_page_raw_syndrome;
                if (!chip->ecc.read_oob)
                        chip->ecc.read_oob = nand_read_oob_syndrome;
                if (!chip->ecc.write_oob)
@@ -2620,6 +2724,8 @@ int nand_scan_tail(struct mtd_info *mtd)
                chip->ecc.read_page = nand_read_page_swecc;
                chip->ecc.read_subpage = nand_read_subpage;
                chip->ecc.write_page = nand_write_page_swecc;
+               chip->ecc.read_page_raw = nand_read_page_raw;
+               chip->ecc.write_page_raw = nand_write_page_raw;
                chip->ecc.read_oob = nand_read_oob_std;
                chip->ecc.write_oob = nand_write_oob_std;
                chip->ecc.size = 256;
@@ -2632,6 +2738,8 @@ int nand_scan_tail(struct mtd_info *mtd)
                chip->ecc.read_page = nand_read_page_raw;
                chip->ecc.write_page = nand_write_page_raw;
                chip->ecc.read_oob = nand_read_oob_std;
+               chip->ecc.read_page_raw = nand_read_page_raw;
+               chip->ecc.write_page_raw = nand_write_page_raw;
                chip->ecc.write_oob = nand_write_oob_std;
                chip->ecc.size = mtd->writesize;
                chip->ecc.bytes = 0;
@@ -2676,6 +2784,7 @@ int nand_scan_tail(struct mtd_info *mtd)
                        break;
                case 4:
                case 8:
+               case 16:
                        mtd->subpage_sft = 2;
                        break;
                }
index 75f9f4874ecfad57195220f720181b18c486862f..86e1d08eee00761f05c1edc710fd178cbc44cef4 100644 (file)
@@ -30,7 +30,7 @@ struct plat_nand_data {
 /*
  * Probe for the NAND device.
  */
-static int __init plat_nand_probe(struct platform_device *pdev)
+static int __devinit plat_nand_probe(struct platform_device *pdev)
 {
        struct platform_nand_data *pdata = pdev->dev.platform_data;
        struct plat_nand_data *data;
index 61b69cc4000956cee468f116653bc5766fa1037f..30a8ce6d3e69bcdc1f0429daafacd06115baf06e 100644 (file)
@@ -170,7 +170,13 @@ static int use_dma = 1;
 module_param(use_dma, bool, 0444);
 MODULE_PARM_DESC(use_dma, "enable DMA for data transfering to/from NAND HW");
 
-#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN
+/*
+ * Default NAND flash controller configuration setup by the
+ * bootloader. This configuration is used only when pdata->keep_config is set
+ */
+static struct pxa3xx_nand_timing default_timing;
+static struct pxa3xx_nand_flash default_flash;
+
 static struct pxa3xx_nand_cmdset smallpage_cmdset = {
        .read1          = 0x0000,
        .read2          = 0x0050,
@@ -197,6 +203,7 @@ static struct pxa3xx_nand_cmdset largepage_cmdset = {
        .lock_status    = 0x007A,
 };
 
+#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN
 static struct pxa3xx_nand_timing samsung512MbX16_timing = {
        .tCH    = 10,
        .tCS    = 0,
@@ -296,9 +303,23 @@ static struct pxa3xx_nand_flash *builtin_flash_types[] = {
 #define NDTR1_tWHR(c)  (min((c), 15) << 4)
 #define NDTR1_tAR(c)   (min((c), 15) << 0)
 
+#define tCH_NDTR0(r)   (((r) >> 19) & 0x7)
+#define tCS_NDTR0(r)   (((r) >> 16) & 0x7)
+#define tWH_NDTR0(r)   (((r) >> 11) & 0x7)
+#define tWP_NDTR0(r)   (((r) >> 8) & 0x7)
+#define tRH_NDTR0(r)   (((r) >> 3) & 0x7)
+#define tRP_NDTR0(r)   (((r) >> 0) & 0x7)
+
+#define tR_NDTR1(r)    (((r) >> 16) & 0xffff)
+#define tWHR_NDTR1(r)  (((r) >> 4) & 0xf)
+#define tAR_NDTR1(r)   (((r) >> 0) & 0xf)
+
 /* convert nano-seconds to nand flash controller clock cycles */
 #define ns2cycle(ns, clk)      (int)(((ns) * (clk / 1000000) / 1000) - 1)
 
+/* convert nand flash controller clock cycles to nano-seconds */
+#define cycle2ns(c, clk)       ((((c) + 1) * 1000000 + clk / 500) / (clk / 1000))
+
 static void pxa3xx_nand_set_timing(struct pxa3xx_nand_info *info,
                                   const struct pxa3xx_nand_timing *t)
 {
@@ -920,6 +941,82 @@ static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info,
        return 0;
 }
 
+static void pxa3xx_nand_detect_timing(struct pxa3xx_nand_info *info,
+                                     struct pxa3xx_nand_timing *t)
+{
+       unsigned long nand_clk = clk_get_rate(info->clk);
+       uint32_t ndtr0 = nand_readl(info, NDTR0CS0);
+       uint32_t ndtr1 = nand_readl(info, NDTR1CS0);
+
+       t->tCH = cycle2ns(tCH_NDTR0(ndtr0), nand_clk);
+       t->tCS = cycle2ns(tCS_NDTR0(ndtr0), nand_clk);
+       t->tWH = cycle2ns(tWH_NDTR0(ndtr0), nand_clk);
+       t->tWP = cycle2ns(tWP_NDTR0(ndtr0), nand_clk);
+       t->tRH = cycle2ns(tRH_NDTR0(ndtr0), nand_clk);
+       t->tRP = cycle2ns(tRP_NDTR0(ndtr0), nand_clk);
+
+       t->tR = cycle2ns(tR_NDTR1(ndtr1), nand_clk);
+       t->tWHR = cycle2ns(tWHR_NDTR1(ndtr1), nand_clk);
+       t->tAR = cycle2ns(tAR_NDTR1(ndtr1), nand_clk);
+}
+
+static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info)
+{
+       uint32_t ndcr = nand_readl(info, NDCR);
+       struct nand_flash_dev *type = NULL;
+       uint32_t id = -1;
+       int i;
+
+       default_flash.page_per_block = ndcr & NDCR_PG_PER_BLK ? 64 : 32;
+       default_flash.page_size = ndcr & NDCR_PAGE_SZ ? 2048 : 512;
+       default_flash.flash_width = ndcr & NDCR_DWIDTH_M ? 16 : 8;
+       default_flash.dfc_width = ndcr & NDCR_DWIDTH_C ? 16 : 8;
+
+       if (default_flash.page_size == 2048)
+               default_flash.cmdset = &largepage_cmdset;
+       else
+               default_flash.cmdset = &smallpage_cmdset;
+
+       /* set info fields needed to __readid */
+       info->flash_info = &default_flash;
+       info->read_id_bytes = (default_flash.page_size == 2048) ? 4 : 2;
+       info->reg_ndcr = ndcr;
+
+       if (__readid(info, &id))
+               return -ENODEV;
+
+       /* Lookup the flash id */
+       id = (id >> 8) & 0xff;          /* device id is byte 2 */
+       for (i = 0; nand_flash_ids[i].name != NULL; i++) {
+               if (id == nand_flash_ids[i].id) {
+                       type =  &nand_flash_ids[i];
+                       break;
+               }
+       }
+
+       if (!type)
+               return -ENODEV;
+
+       /* fill the missing flash information */
+       i = __ffs(default_flash.page_per_block * default_flash.page_size);
+       default_flash.num_blocks = type->chipsize << (20 - i);
+
+       info->oob_size = (default_flash.page_size == 2048) ? 64 : 16;
+
+       /* calculate addressing information */
+       info->col_addr_cycles = (default_flash.page_size == 2048) ? 2 : 1;
+
+       if (default_flash.num_blocks * default_flash.page_per_block > 65536)
+               info->row_addr_cycles = 3;
+       else
+               info->row_addr_cycles = 2;
+
+       pxa3xx_nand_detect_timing(info, &default_timing);
+       default_flash.timing = &default_timing;
+
+       return 0;
+}
+
 static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info,
                                    const struct pxa3xx_nand_platform_data *pdata)
 {
@@ -927,6 +1024,10 @@ static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info,
        uint32_t id = -1;
        int i;
 
+       if (pdata->keep_config)
+               if (pxa3xx_nand_detect_config(info) == 0)
+                       return 0;
+
        for (i = 0; i<pdata->num_flash; ++i) {
                f = pdata->flash + i;
 
@@ -1078,6 +1179,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev)
 
        this = &info->nand_chip;
        mtd->priv = info;
+       mtd->owner = THIS_MODULE;
 
        info->clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(info->clk)) {
@@ -1117,14 +1219,14 @@ static int pxa3xx_nand_probe(struct platform_device *pdev)
                goto fail_put_clk;
        }
 
-       r = request_mem_region(r->start, r->end - r->start + 1, pdev->name);
+       r = request_mem_region(r->start, resource_size(r), pdev->name);
        if (r == NULL) {
                dev_err(&pdev->dev, "failed to request memory resource\n");
                ret = -EBUSY;
                goto fail_put_clk;
        }
 
-       info->mmio_base = ioremap(r->start, r->end - r->start + 1);
+       info->mmio_base = ioremap(r->start, resource_size(r));
        if (info->mmio_base == NULL) {
                dev_err(&pdev->dev, "ioremap() failed\n");
                ret = -ENODEV;
@@ -1173,7 +1275,7 @@ fail_free_buf:
 fail_free_io:
        iounmap(info->mmio_base);
 fail_free_res:
-       release_mem_region(r->start, r->end - r->start + 1);
+       release_mem_region(r->start, resource_size(r));
 fail_put_clk:
        clk_disable(info->clk);
        clk_put(info->clk);
@@ -1186,6 +1288,7 @@ static int pxa3xx_nand_remove(struct platform_device *pdev)
 {
        struct mtd_info *mtd = platform_get_drvdata(pdev);
        struct pxa3xx_nand_info *info = mtd->priv;
+       struct resource *r;
 
        platform_set_drvdata(pdev, NULL);
 
@@ -1198,6 +1301,14 @@ static int pxa3xx_nand_remove(struct platform_device *pdev)
                                info->data_buff, info->data_buff_phys);
        } else
                kfree(info->data_buff);
+
+       iounmap(info->mmio_base);
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       release_mem_region(r->start, resource_size(r));
+
+       clk_disable(info->clk);
+       clk_put(info->clk);
+
        kfree(mtd);
        return 0;
 }
index 821acb08ff1cc5441be0e0e1c307830c54619450..2bc896623e2d7e21ea5d76977ce3417958293c6f 100644 (file)
@@ -58,7 +58,7 @@ static struct nand_bbt_descr flctl_4secc_smallpage = {
 };
 
 static struct nand_bbt_descr flctl_4secc_largepage = {
-       .options = 0,
+       .options = NAND_BBT_SCAN2NDPAGE,
        .offs = 58,
        .len = 2,
        .pattern = scan_ff_pattern,
@@ -149,7 +149,7 @@ static void wait_wfifo_ready(struct sh_flctl *flctl)
        printk(KERN_ERR "wait_wfifo_ready(): Timeout occured \n");
 }
 
-static int wait_recfifo_ready(struct sh_flctl *flctl)
+static int wait_recfifo_ready(struct sh_flctl *flctl, int sector_number)
 {
        uint32_t timeout = LOOP_TIMEOUT_MAX;
        int checked[4];
@@ -183,7 +183,12 @@ static int wait_recfifo_ready(struct sh_flctl *flctl)
                                uint8_t org;
                                int index;
 
-                               index = data >> 16;
+                               if (flctl->page_size)
+                                       index = (512 * sector_number) +
+                                               (data >> 16);
+                               else
+                                       index = data >> 16;
+
                                org = flctl->done_buff[index];
                                flctl->done_buff[index] = org ^ (data & 0xFF);
                                checked[i] = 1;
@@ -238,14 +243,14 @@ static void read_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
        }
 }
 
-static int read_ecfiforeg(struct sh_flctl *flctl, uint8_t *buff)
+static int read_ecfiforeg(struct sh_flctl *flctl, uint8_t *buff, int sector)
 {
        int i;
        unsigned long *ecc_buf = (unsigned long *)buff;
        void *fifo_addr = (void *)FLECFIFO(flctl);
 
        for (i = 0; i < 4; i++) {
-               if (wait_recfifo_ready(flctl))
+               if (wait_recfifo_ready(flctl , sector))
                        return 1;
                ecc_buf[i] = readl(fifo_addr);
                ecc_buf[i] = be32_to_cpu(ecc_buf[i]);
@@ -384,7 +389,8 @@ static void execmd_read_page_sector(struct mtd_info *mtd, int page_addr)
                read_fiforeg(flctl, 512, 512 * sector);
 
                ret = read_ecfiforeg(flctl,
-                       &flctl->done_buff[mtd->writesize + 16 * sector]);
+                       &flctl->done_buff[mtd->writesize + 16 * sector],
+                       sector);
 
                if (ret)
                        flctl->hwecc_cant_correct[sector] = 1;
diff --git a/drivers/mtd/nand/socrates_nand.c b/drivers/mtd/nand/socrates_nand.c
new file mode 100644 (file)
index 0000000..a4519a7
--- /dev/null
@@ -0,0 +1,325 @@
+/*
+ * drivers/mtd/nand/socrates_nand.c
+ *
+ *  Copyright Â© 2008 Ilya Yanok, Emcraft Systems
+ *
+ *
+ * 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 <linux/slab.h>
+#include <linux/module.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+#include <linux/of_platform.h>
+#include <linux/io.h>
+
+#define FPGA_NAND_CMD_MASK             (0x7 << 28)
+#define FPGA_NAND_CMD_COMMAND          (0x0 << 28)
+#define FPGA_NAND_CMD_ADDR             (0x1 << 28)
+#define FPGA_NAND_CMD_READ             (0x2 << 28)
+#define FPGA_NAND_CMD_WRITE            (0x3 << 28)
+#define FPGA_NAND_BUSY                 (0x1 << 15)
+#define FPGA_NAND_ENABLE               (0x1 << 31)
+#define FPGA_NAND_DATA_SHIFT           16
+
+struct socrates_nand_host {
+       struct nand_chip        nand_chip;
+       struct mtd_info         mtd;
+       void __iomem            *io_base;
+       struct device           *dev;
+};
+
+/**
+ * socrates_nand_write_buf -  write buffer to chip
+ * @mtd:       MTD device structure
+ * @buf:       data buffer
+ * @len:       number of bytes to write
+ */
+static void socrates_nand_write_buf(struct mtd_info *mtd,
+               const uint8_t *buf, int len)
+{
+       int i;
+       struct nand_chip *this = mtd->priv;
+       struct socrates_nand_host *host = this->priv;
+
+       for (i = 0; i < len; i++) {
+               out_be32(host->io_base, FPGA_NAND_ENABLE |
+                               FPGA_NAND_CMD_WRITE |
+                               (buf[i] << FPGA_NAND_DATA_SHIFT));
+       }
+}
+
+/**
+ * socrates_nand_read_buf -  read chip data into buffer
+ * @mtd:       MTD device structure
+ * @buf:       buffer to store date
+ * @len:       number of bytes to read
+ */
+static void socrates_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
+{
+       int i;
+       struct nand_chip *this = mtd->priv;
+       struct socrates_nand_host *host = this->priv;
+       uint32_t val;
+
+       val = FPGA_NAND_ENABLE | FPGA_NAND_CMD_READ;
+
+       out_be32(host->io_base, val);
+       for (i = 0; i < len; i++) {
+               buf[i] = (in_be32(host->io_base) >>
+                               FPGA_NAND_DATA_SHIFT) & 0xff;
+       }
+}
+
+/**
+ * socrates_nand_read_byte -  read one byte from the chip
+ * @mtd:       MTD device structure
+ */
+static uint8_t socrates_nand_read_byte(struct mtd_info *mtd)
+{
+       uint8_t byte;
+       socrates_nand_read_buf(mtd, &byte, sizeof(byte));
+       return byte;
+}
+
+/**
+ * socrates_nand_read_word -  read one word from the chip
+ * @mtd:       MTD device structure
+ */
+static uint16_t socrates_nand_read_word(struct mtd_info *mtd)
+{
+       uint16_t word;
+       socrates_nand_read_buf(mtd, (uint8_t *)&word, sizeof(word));
+       return word;
+}
+
+/**
+ * socrates_nand_verify_buf -  Verify chip data against buffer
+ * @mtd:       MTD device structure
+ * @buf:       buffer containing the data to compare
+ * @len:       number of bytes to compare
+ */
+static int socrates_nand_verify_buf(struct mtd_info *mtd, const u8 *buf,
+               int len)
+{
+       int i;
+
+       for (i = 0; i < len; i++) {
+               if (buf[i] != socrates_nand_read_byte(mtd))
+                       return -EFAULT;
+       }
+       return 0;
+}
+
+/*
+ * Hardware specific access to control-lines
+ */
+static void socrates_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
+               unsigned int ctrl)
+{
+       struct nand_chip *nand_chip = mtd->priv;
+       struct socrates_nand_host *host = nand_chip->priv;
+       uint32_t val;
+
+       if (cmd == NAND_CMD_NONE)
+               return;
+
+       if (ctrl & NAND_CLE)
+               val = FPGA_NAND_CMD_COMMAND;
+       else
+               val = FPGA_NAND_CMD_ADDR;
+
+       if (ctrl & NAND_NCE)
+               val |= FPGA_NAND_ENABLE;
+
+       val |= (cmd & 0xff) << FPGA_NAND_DATA_SHIFT;
+
+       out_be32(host->io_base, val);
+}
+
+/*
+ * Read the Device Ready pin.
+ */
+static int socrates_nand_device_ready(struct mtd_info *mtd)
+{
+       struct nand_chip *nand_chip = mtd->priv;
+       struct socrates_nand_host *host = nand_chip->priv;
+
+       if (in_be32(host->io_base) & FPGA_NAND_BUSY)
+               return 0; /* busy */
+       return 1;
+}
+
+#ifdef CONFIG_MTD_PARTITIONS
+static const char *part_probes[] = { "cmdlinepart", NULL };
+#endif
+
+/*
+ * Probe for the NAND device.
+ */
+static int __devinit socrates_nand_probe(struct of_device *ofdev,
+                                        const struct of_device_id *ofid)
+{
+       struct socrates_nand_host *host;
+       struct mtd_info *mtd;
+       struct nand_chip *nand_chip;
+       int res;
+
+#ifdef CONFIG_MTD_PARTITIONS
+       struct mtd_partition *partitions = NULL;
+       int num_partitions = 0;
+#endif
+
+       /* Allocate memory for the device structure (and zero it) */
+       host = kzalloc(sizeof(struct socrates_nand_host), GFP_KERNEL);
+       if (!host) {
+               printk(KERN_ERR
+                      "socrates_nand: failed to allocate device structure.\n");
+               return -ENOMEM;
+       }
+
+       host->io_base = of_iomap(ofdev->node, 0);
+       if (host->io_base == NULL) {
+               printk(KERN_ERR "socrates_nand: ioremap failed\n");
+               kfree(host);
+               return -EIO;
+       }
+
+       mtd = &host->mtd;
+       nand_chip = &host->nand_chip;
+       host->dev = &ofdev->dev;
+
+       nand_chip->priv = host;         /* link the private data structures */
+       mtd->priv = nand_chip;
+       mtd->name = "socrates_nand";
+       mtd->owner = THIS_MODULE;
+       mtd->dev.parent = &ofdev->dev;
+
+       /*should never be accessed directly */
+       nand_chip->IO_ADDR_R = (void *)0xdeadbeef;
+       nand_chip->IO_ADDR_W = (void *)0xdeadbeef;
+
+       nand_chip->cmd_ctrl = socrates_nand_cmd_ctrl;
+       nand_chip->read_byte = socrates_nand_read_byte;
+       nand_chip->read_word = socrates_nand_read_word;
+       nand_chip->write_buf = socrates_nand_write_buf;
+       nand_chip->read_buf = socrates_nand_read_buf;
+       nand_chip->verify_buf = socrates_nand_verify_buf;
+       nand_chip->dev_ready = socrates_nand_device_ready;
+
+       nand_chip->ecc.mode = NAND_ECC_SOFT;    /* enable ECC */
+
+       /* TODO: I have no idea what real delay is. */
+       nand_chip->chip_delay = 20;             /* 20us command delay time */
+
+       dev_set_drvdata(&ofdev->dev, host);
+
+       /* first scan to find the device and get the page size */
+       if (nand_scan_ident(mtd, 1)) {
+               res = -ENXIO;
+               goto out;
+       }
+
+       /* second phase scan */
+       if (nand_scan_tail(mtd)) {
+               res = -ENXIO;
+               goto out;
+       }
+
+#ifdef CONFIG_MTD_PARTITIONS
+#ifdef CONFIG_MTD_CMDLINE_PARTS
+       num_partitions = parse_mtd_partitions(mtd, part_probes,
+                                             &partitions, 0);
+       if (num_partitions < 0) {
+               res = num_partitions;
+               goto release;
+       }
+#endif
+
+#ifdef CONFIG_MTD_OF_PARTS
+       if (num_partitions == 0) {
+               num_partitions = of_mtd_parse_partitions(&ofdev->dev,
+                                                        ofdev->node,
+                                                        &partitions);
+               if (num_partitions < 0) {
+                       res = num_partitions;
+                       goto release;
+               }
+       }
+#endif
+       if (partitions && (num_partitions > 0))
+               res = add_mtd_partitions(mtd, partitions, num_partitions);
+       else
+#endif
+               res = add_mtd_device(mtd);
+
+       if (!res)
+               return res;
+
+#ifdef CONFIG_MTD_PARTITIONS
+release:
+#endif
+       nand_release(mtd);
+
+out:
+       dev_set_drvdata(&ofdev->dev, NULL);
+       iounmap(host->io_base);
+       kfree(host);
+       return res;
+}
+
+/*
+ * Remove a NAND device.
+ */
+static int __devexit socrates_nand_remove(struct of_device *ofdev)
+{
+       struct socrates_nand_host *host = dev_get_drvdata(&ofdev->dev);
+       struct mtd_info *mtd = &host->mtd;
+
+       nand_release(mtd);
+
+       dev_set_drvdata(&ofdev->dev, NULL);
+       iounmap(host->io_base);
+       kfree(host);
+
+       return 0;
+}
+
+static struct of_device_id socrates_nand_match[] =
+{
+       {
+               .compatible   = "abb,socrates-nand",
+       },
+       {},
+};
+
+MODULE_DEVICE_TABLE(of, socrates_nand_match);
+
+static struct of_platform_driver socrates_nand_driver = {
+       .name           = "socrates_nand",
+       .match_table    = socrates_nand_match,
+       .probe          = socrates_nand_probe,
+       .remove         = __devexit_p(socrates_nand_remove),
+};
+
+static int __init socrates_nand_init(void)
+{
+       return of_register_platform_driver(&socrates_nand_driver);
+}
+
+static void __exit socrates_nand_exit(void)
+{
+       of_unregister_platform_driver(&socrates_nand_driver);
+}
+
+module_init(socrates_nand_init);
+module_exit(socrates_nand_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Ilya Yanok");
+MODULE_DESCRIPTION("NAND driver for Socrates board");
diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c
new file mode 100644 (file)
index 0000000..8124792
--- /dev/null
@@ -0,0 +1,428 @@
+/*
+ * TXx9 NAND flash memory controller driver
+ * Based on RBTX49xx patch from CELF patch archive.
+ *
+ * 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.
+ *
+ * (C) Copyright TOSHIBA CORPORATION 2004-2007
+ * All Rights Reserved.
+ */
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/nand_ecc.h>
+#include <linux/mtd/partitions.h>
+#include <linux/io.h>
+#include <asm/txx9/ndfmc.h>
+
+/* TXX9 NDFMC Registers */
+#define TXX9_NDFDTR    0x00
+#define TXX9_NDFMCR    0x04
+#define TXX9_NDFSR     0x08
+#define TXX9_NDFISR    0x0c
+#define TXX9_NDFIMR    0x10
+#define TXX9_NDFSPR    0x14
+#define TXX9_NDFRSTR   0x18    /* not TX4939 */
+
+/* NDFMCR : NDFMC Mode Control */
+#define TXX9_NDFMCR_WE 0x80
+#define TXX9_NDFMCR_ECC_ALL    0x60
+#define TXX9_NDFMCR_ECC_RESET  0x60
+#define TXX9_NDFMCR_ECC_READ   0x40
+#define TXX9_NDFMCR_ECC_ON     0x20
+#define TXX9_NDFMCR_ECC_OFF    0x00
+#define TXX9_NDFMCR_CE 0x10
+#define TXX9_NDFMCR_BSPRT      0x04    /* TX4925/TX4926 only */
+#define TXX9_NDFMCR_ALE        0x02
+#define TXX9_NDFMCR_CLE        0x01
+/* TX4939 only */
+#define TXX9_NDFMCR_X16        0x0400
+#define TXX9_NDFMCR_DMAREQ_MASK        0x0300
+#define TXX9_NDFMCR_DMAREQ_NODMA       0x0000
+#define TXX9_NDFMCR_DMAREQ_128 0x0100
+#define TXX9_NDFMCR_DMAREQ_256 0x0200
+#define TXX9_NDFMCR_DMAREQ_512 0x0300
+#define TXX9_NDFMCR_CS_MASK    0x0c
+#define TXX9_NDFMCR_CS(ch)     ((ch) << 2)
+
+/* NDFMCR : NDFMC Status */
+#define TXX9_NDFSR_BUSY        0x80
+/* TX4939 only */
+#define TXX9_NDFSR_DMARUN      0x40
+
+/* NDFMCR : NDFMC Reset */
+#define TXX9_NDFRSTR_RST       0x01
+
+struct txx9ndfmc_priv {
+       struct platform_device *dev;
+       struct nand_chip chip;
+       struct mtd_info mtd;
+       int cs;
+       char mtdname[BUS_ID_SIZE + 2];
+};
+
+#define MAX_TXX9NDFMC_DEV      4
+struct txx9ndfmc_drvdata {
+       struct mtd_info *mtds[MAX_TXX9NDFMC_DEV];
+       void __iomem *base;
+       unsigned char hold;     /* in gbusclock */
+       unsigned char spw;      /* in gbusclock */
+       struct nand_hw_control hw_control;
+#ifdef CONFIG_MTD_PARTITIONS
+       struct mtd_partition *parts[MAX_TXX9NDFMC_DEV];
+#endif
+};
+
+static struct platform_device *mtd_to_platdev(struct mtd_info *mtd)
+{
+       struct nand_chip *chip = mtd->priv;
+       struct txx9ndfmc_priv *txx9_priv = chip->priv;
+       return txx9_priv->dev;
+}
+
+static void __iomem *ndregaddr(struct platform_device *dev, unsigned int reg)
+{
+       struct txx9ndfmc_drvdata *drvdata = platform_get_drvdata(dev);
+       struct txx9ndfmc_platform_data *plat = dev->dev.platform_data;
+
+       return drvdata->base + (reg << plat->shift);
+}
+
+static u32 txx9ndfmc_read(struct platform_device *dev, unsigned int reg)
+{
+       return __raw_readl(ndregaddr(dev, reg));
+}
+
+static void txx9ndfmc_write(struct platform_device *dev,
+                           u32 val, unsigned int reg)
+{
+       __raw_writel(val, ndregaddr(dev, reg));
+}
+
+static uint8_t txx9ndfmc_read_byte(struct mtd_info *mtd)
+{
+       struct platform_device *dev = mtd_to_platdev(mtd);
+
+       return txx9ndfmc_read(dev, TXX9_NDFDTR);
+}
+
+static void txx9ndfmc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
+                               int len)
+{
+       struct platform_device *dev = mtd_to_platdev(mtd);
+       void __iomem *ndfdtr = ndregaddr(dev, TXX9_NDFDTR);
+       u32 mcr = txx9ndfmc_read(dev, TXX9_NDFMCR);
+
+       txx9ndfmc_write(dev, mcr | TXX9_NDFMCR_WE, TXX9_NDFMCR);
+       while (len--)
+               __raw_writel(*buf++, ndfdtr);
+       txx9ndfmc_write(dev, mcr, TXX9_NDFMCR);
+}
+
+static void txx9ndfmc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
+{
+       struct platform_device *dev = mtd_to_platdev(mtd);
+       void __iomem *ndfdtr = ndregaddr(dev, TXX9_NDFDTR);
+
+       while (len--)
+               *buf++ = __raw_readl(ndfdtr);
+}
+
+static int txx9ndfmc_verify_buf(struct mtd_info *mtd, const uint8_t *buf,
+                               int len)
+{
+       struct platform_device *dev = mtd_to_platdev(mtd);
+       void __iomem *ndfdtr = ndregaddr(dev, TXX9_NDFDTR);
+
+       while (len--)
+               if (*buf++ != (uint8_t)__raw_readl(ndfdtr))
+                       return -EFAULT;
+       return 0;
+}
+
+static void txx9ndfmc_cmd_ctrl(struct mtd_info *mtd, int cmd,
+                              unsigned int ctrl)
+{
+       struct nand_chip *chip = mtd->priv;
+       struct txx9ndfmc_priv *txx9_priv = chip->priv;
+       struct platform_device *dev = txx9_priv->dev;
+       struct txx9ndfmc_platform_data *plat = dev->dev.platform_data;
+
+       if (ctrl & NAND_CTRL_CHANGE) {
+               u32 mcr = txx9ndfmc_read(dev, TXX9_NDFMCR);
+
+               mcr &= ~(TXX9_NDFMCR_CLE | TXX9_NDFMCR_ALE | TXX9_NDFMCR_CE);
+               mcr |= ctrl & NAND_CLE ? TXX9_NDFMCR_CLE : 0;
+               mcr |= ctrl & NAND_ALE ? TXX9_NDFMCR_ALE : 0;
+               /* TXX9_NDFMCR_CE bit is 0:high 1:low */
+               mcr |= ctrl & NAND_NCE ? TXX9_NDFMCR_CE : 0;
+               if (txx9_priv->cs >= 0 && (ctrl & NAND_NCE)) {
+                       mcr &= ~TXX9_NDFMCR_CS_MASK;
+                       mcr |= TXX9_NDFMCR_CS(txx9_priv->cs);
+               }
+               txx9ndfmc_write(dev, mcr, TXX9_NDFMCR);
+       }
+       if (cmd != NAND_CMD_NONE)
+               txx9ndfmc_write(dev, cmd & 0xff, TXX9_NDFDTR);
+       if (plat->flags & NDFMC_PLAT_FLAG_DUMMYWRITE) {
+               /* dummy write to update external latch */
+               if ((ctrl & NAND_CTRL_CHANGE) && cmd == NAND_CMD_NONE)
+                       txx9ndfmc_write(dev, 0, TXX9_NDFDTR);
+       }
+       mmiowb();
+}
+
+static int txx9ndfmc_dev_ready(struct mtd_info *mtd)
+{
+       struct platform_device *dev = mtd_to_platdev(mtd);
+
+       return !(txx9ndfmc_read(dev, TXX9_NDFSR) & TXX9_NDFSR_BUSY);
+}
+
+static int txx9ndfmc_calculate_ecc(struct mtd_info *mtd, const uint8_t *dat,
+                                  uint8_t *ecc_code)
+{
+       struct platform_device *dev = mtd_to_platdev(mtd);
+       u32 mcr = txx9ndfmc_read(dev, TXX9_NDFMCR);
+
+       mcr &= ~TXX9_NDFMCR_ECC_ALL;
+       txx9ndfmc_write(dev, mcr | TXX9_NDFMCR_ECC_OFF, TXX9_NDFMCR);
+       txx9ndfmc_write(dev, mcr | TXX9_NDFMCR_ECC_READ, TXX9_NDFMCR);
+       ecc_code[1] = txx9ndfmc_read(dev, TXX9_NDFDTR);
+       ecc_code[0] = txx9ndfmc_read(dev, TXX9_NDFDTR);
+       ecc_code[2] = txx9ndfmc_read(dev, TXX9_NDFDTR);
+       txx9ndfmc_write(dev, mcr | TXX9_NDFMCR_ECC_OFF, TXX9_NDFMCR);
+       return 0;
+}
+
+static void txx9ndfmc_enable_hwecc(struct mtd_info *mtd, int mode)
+{
+       struct platform_device *dev = mtd_to_platdev(mtd);
+       u32 mcr = txx9ndfmc_read(dev, TXX9_NDFMCR);
+
+       mcr &= ~TXX9_NDFMCR_ECC_ALL;
+       txx9ndfmc_write(dev, mcr | TXX9_NDFMCR_ECC_RESET, TXX9_NDFMCR);
+       txx9ndfmc_write(dev, mcr | TXX9_NDFMCR_ECC_OFF, TXX9_NDFMCR);
+       txx9ndfmc_write(dev, mcr | TXX9_NDFMCR_ECC_ON, TXX9_NDFMCR);
+}
+
+static void txx9ndfmc_initialize(struct platform_device *dev)
+{
+       struct txx9ndfmc_platform_data *plat = dev->dev.platform_data;
+       struct txx9ndfmc_drvdata *drvdata = platform_get_drvdata(dev);
+       int tmout = 100;
+
+       if (plat->flags & NDFMC_PLAT_FLAG_NO_RSTR)
+               ; /* no NDFRSTR.  Write to NDFSPR resets the NDFMC. */
+       else {
+               /* reset NDFMC */
+               txx9ndfmc_write(dev,
+                               txx9ndfmc_read(dev, TXX9_NDFRSTR) |
+                               TXX9_NDFRSTR_RST,
+                               TXX9_NDFRSTR);
+               while (txx9ndfmc_read(dev, TXX9_NDFRSTR) & TXX9_NDFRSTR_RST) {
+                       if (--tmout == 0) {
+                               dev_err(&dev->dev, "reset failed.\n");
+                               break;
+                       }
+                       udelay(1);
+               }
+       }
+       /* setup Hold Time, Strobe Pulse Width */
+       txx9ndfmc_write(dev, (drvdata->hold << 4) | drvdata->spw, TXX9_NDFSPR);
+       txx9ndfmc_write(dev,
+                       (plat->flags & NDFMC_PLAT_FLAG_USE_BSPRT) ?
+                       TXX9_NDFMCR_BSPRT : 0, TXX9_NDFMCR);
+}
+
+#define TXX9NDFMC_NS_TO_CYC(gbusclk, ns) \
+       DIV_ROUND_UP((ns) * DIV_ROUND_UP(gbusclk, 1000), 1000000)
+
+static int __init txx9ndfmc_probe(struct platform_device *dev)
+{
+       struct txx9ndfmc_platform_data *plat = dev->dev.platform_data;
+#ifdef CONFIG_MTD_PARTITIONS
+       static const char *probes[] = { "cmdlinepart", NULL };
+#endif
+       int hold, spw;
+       int i;
+       struct txx9ndfmc_drvdata *drvdata;
+       unsigned long gbusclk = plat->gbus_clock;
+       struct resource *res;
+
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENODEV;
+       drvdata = devm_kzalloc(&dev->dev, sizeof(*drvdata), GFP_KERNEL);
+       if (!drvdata)
+               return -ENOMEM;
+       if (!devm_request_mem_region(&dev->dev, res->start,
+                                    resource_size(res), dev_name(&dev->dev)))
+               return -EBUSY;
+       drvdata->base = devm_ioremap(&dev->dev, res->start,
+                                    resource_size(res));
+       if (!drvdata->base)
+               return -EBUSY;
+
+       hold = plat->hold ?: 20; /* tDH */
+       spw = plat->spw ?: 90; /* max(tREADID, tWP, tRP) */
+
+       hold = TXX9NDFMC_NS_TO_CYC(gbusclk, hold);
+       spw = TXX9NDFMC_NS_TO_CYC(gbusclk, spw);
+       if (plat->flags & NDFMC_PLAT_FLAG_HOLDADD)
+               hold -= 2;      /* actual hold time : (HOLD + 2) BUSCLK */
+       spw -= 1;       /* actual wait time : (SPW + 1) BUSCLK */
+       hold = clamp(hold, 1, 15);
+       drvdata->hold = hold;
+       spw = clamp(spw, 1, 15);
+       drvdata->spw = spw;
+       dev_info(&dev->dev, "CLK:%ldMHz HOLD:%d SPW:%d\n",
+                (gbusclk + 500000) / 1000000, hold, spw);
+
+       spin_lock_init(&drvdata->hw_control.lock);
+       init_waitqueue_head(&drvdata->hw_control.wq);
+
+       platform_set_drvdata(dev, drvdata);
+       txx9ndfmc_initialize(dev);
+
+       for (i = 0; i < MAX_TXX9NDFMC_DEV; i++) {
+               struct txx9ndfmc_priv *txx9_priv;
+               struct nand_chip *chip;
+               struct mtd_info *mtd;
+#ifdef CONFIG_MTD_PARTITIONS
+               int nr_parts;
+#endif
+
+               if (!(plat->ch_mask & (1 << i)))
+                       continue;
+               txx9_priv = kzalloc(sizeof(struct txx9ndfmc_priv),
+                                   GFP_KERNEL);
+               if (!txx9_priv) {
+                       dev_err(&dev->dev, "Unable to allocate "
+                               "TXx9 NDFMC MTD device structure.\n");
+                       continue;
+               }
+               chip = &txx9_priv->chip;
+               mtd = &txx9_priv->mtd;
+               mtd->owner = THIS_MODULE;
+
+               mtd->priv = chip;
+
+               chip->read_byte = txx9ndfmc_read_byte;
+               chip->read_buf = txx9ndfmc_read_buf;
+               chip->write_buf = txx9ndfmc_write_buf;
+               chip->verify_buf = txx9ndfmc_verify_buf;
+               chip->cmd_ctrl = txx9ndfmc_cmd_ctrl;
+               chip->dev_ready = txx9ndfmc_dev_ready;
+               chip->ecc.calculate = txx9ndfmc_calculate_ecc;
+               chip->ecc.correct = nand_correct_data;
+               chip->ecc.hwctl = txx9ndfmc_enable_hwecc;
+               chip->ecc.mode = NAND_ECC_HW;
+               chip->ecc.size = 256;
+               chip->ecc.bytes = 3;
+               chip->chip_delay = 100;
+               chip->controller = &drvdata->hw_control;
+
+               chip->priv = txx9_priv;
+               txx9_priv->dev = dev;
+
+               if (plat->ch_mask != 1) {
+                       txx9_priv->cs = i;
+                       sprintf(txx9_priv->mtdname, "%s.%u",
+                               dev_name(&dev->dev), i);
+               } else {
+                       txx9_priv->cs = -1;
+                       strcpy(txx9_priv->mtdname, dev_name(&dev->dev));
+               }
+               if (plat->wide_mask & (1 << i))
+                       chip->options |= NAND_BUSWIDTH_16;
+
+               if (nand_scan(mtd, 1)) {
+                       kfree(txx9_priv);
+                       continue;
+               }
+               mtd->name = txx9_priv->mtdname;
+
+#ifdef CONFIG_MTD_PARTITIONS
+               nr_parts = parse_mtd_partitions(mtd, probes,
+                                               &drvdata->parts[i], 0);
+               if (nr_parts > 0)
+                       add_mtd_partitions(mtd, drvdata->parts[i], nr_parts);
+#endif
+               add_mtd_device(mtd);
+               drvdata->mtds[i] = mtd;
+       }
+
+       return 0;
+}
+
+static int __exit txx9ndfmc_remove(struct platform_device *dev)
+{
+       struct txx9ndfmc_drvdata *drvdata = platform_get_drvdata(dev);
+       int i;
+
+       platform_set_drvdata(dev, NULL);
+       if (!drvdata)
+               return 0;
+       for (i = 0; i < MAX_TXX9NDFMC_DEV; i++) {
+               struct mtd_info *mtd = drvdata->mtds[i];
+               struct nand_chip *chip;
+               struct txx9ndfmc_priv *txx9_priv;
+
+               if (!mtd)
+                       continue;
+               chip = mtd->priv;
+               txx9_priv = chip->priv;
+
+#ifdef CONFIG_MTD_PARTITIONS
+               del_mtd_partitions(mtd);
+               kfree(drvdata->parts[i]);
+#endif
+               del_mtd_device(mtd);
+               kfree(txx9_priv);
+       }
+       return 0;
+}
+
+#ifdef CONFIG_PM
+static int txx9ndfmc_resume(struct platform_device *dev)
+{
+       if (platform_get_drvdata(dev))
+               txx9ndfmc_initialize(dev);
+       return 0;
+}
+#else
+#define txx9ndfmc_resume NULL
+#endif
+
+static struct platform_driver txx9ndfmc_driver = {
+       .remove         = __exit_p(txx9ndfmc_remove),
+       .resume         = txx9ndfmc_resume,
+       .driver         = {
+               .name   = "txx9ndfmc",
+               .owner  = THIS_MODULE,
+       },
+};
+
+static int __init txx9ndfmc_init(void)
+{
+       return platform_driver_probe(&txx9ndfmc_driver, txx9ndfmc_probe);
+}
+
+static void __exit txx9ndfmc_exit(void)
+{
+       platform_driver_unregister(&txx9ndfmc_driver);
+}
+
+module_init(txx9ndfmc_init);
+module_exit(txx9ndfmc_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("TXx9 SoC NAND flash controller driver");
+MODULE_ALIAS("platform:txx9ndfmc");
index d1c4546513f7ac88706646eb8e04083ec4bc465a..e3f8495a94c27492ccaaca85e0a96a1d478a98cd 100644 (file)
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
-#include <linux/miscdevice.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/hdreg.h>
+#include <linux/blkdev.h>
 
 #include <linux/kmod.h>
 #include <linux/mtd/mtd.h>
@@ -818,3 +818,4 @@ module_exit(cleanup_nftl);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>, Fabrice Bellard <fabrice.bellard@netgem.com> et al.");
 MODULE_DESCRIPTION("Support code for NAND Flash Translation Layer, used on M-Systems DiskOnChip 2000 and Millennium");
+MODULE_ALIAS_BLOCKDEV_MAJOR(NFTL_MAJOR);
index 9e45b3f39c0e7e6cf4f4417f874376e5bfdda9df..3e164f0c9295c7bc779b0b0c72c798f76176c09e 100644 (file)
@@ -46,6 +46,13 @@ int __devinit of_mtd_parse_partitions(struct device *dev,
                const u32 *reg;
                int len;
 
+               /* check if this is a partition node */
+               partname = of_get_property(pp, "name", &len);
+               if (strcmp(partname, "partition") != 0) {
+                       nr_parts--;
+                       continue;
+               }
+
                reg = of_get_property(pp, "reg", &len);
                if (!reg || (len != 2 * sizeof(u32))) {
                        of_node_put(pp);
index 77a4f14461564043da7ee45bfd638bad5974a445..f2e9de1414dfcdb4002419c72b60bf1d1ce4927f 100644 (file)
@@ -294,6 +294,10 @@ static int omap3_onenand_read_bufferram(struct mtd_info *mtd, int area,
        if (bram_offset & 3 || (size_t)buf & 3 || count < 384)
                goto out_copy;
 
+       /* panic_write() may be in an interrupt context */
+       if (in_interrupt())
+               goto out_copy;
+
        if (buf >= high_memory) {
                struct page *p1;
 
@@ -672,6 +676,8 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
        c->mtd.priv = &c->onenand;
        c->mtd.owner = THIS_MODULE;
 
+       c->mtd.dev.parent = &pdev->dev;
+
        if (c->dma_channel >= 0) {
                struct onenand_chip *this = &c->onenand;
 
index 529af271db17486074ef44a6610bd365ace65d28..30d6999e5f9f5a75a22078ee56459798ea0fc865 100644 (file)
@@ -1455,7 +1455,8 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
                                struct mtd_oob_ops *ops)
 {
        struct onenand_chip *this = mtd->priv;
-       int written = 0, column, thislen, subpage;
+       int written = 0, column, thislen = 0, subpage = 0;
+       int prev = 0, prevlen = 0, prev_subpage = 0, first = 1;
        int oobwritten = 0, oobcolumn, thisooblen, oobsize;
        size_t len = ops->len;
        size_t ooblen = ops->ooblen;
@@ -1482,6 +1483,10 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
                 return -EINVAL;
         }
 
+       /* Check zero length */
+       if (!len)
+               return 0;
+
        if (ops->mode == MTD_OOB_AUTO)
                oobsize = this->ecclayout->oobavail;
        else
@@ -1492,79 +1497,121 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
        column = to & (mtd->writesize - 1);
 
        /* Loop until all data write */
-       while (written < len) {
-               u_char *wbuf = (u_char *) buf;
+       while (1) {
+               if (written < len) {
+                       u_char *wbuf = (u_char *) buf;
 
-               thislen = min_t(int, mtd->writesize - column, len - written);
-               thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten);
+                       thislen = min_t(int, mtd->writesize - column, len - written);
+                       thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten);
 
-               cond_resched();
+                       cond_resched();
 
-               this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
+                       this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
 
-               /* Partial page write */
-               subpage = thislen < mtd->writesize;
-               if (subpage) {
-                       memset(this->page_buf, 0xff, mtd->writesize);
-                       memcpy(this->page_buf + column, buf, thislen);
-                       wbuf = this->page_buf;
-               }
+                       /* Partial page write */
+                       subpage = thislen < mtd->writesize;
+                       if (subpage) {
+                               memset(this->page_buf, 0xff, mtd->writesize);
+                               memcpy(this->page_buf + column, buf, thislen);
+                               wbuf = this->page_buf;
+                       }
 
-               this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
+                       this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
 
-               if (oob) {
-                       oobbuf = this->oob_buf;
+                       if (oob) {
+                               oobbuf = this->oob_buf;
 
-                       /* We send data to spare ram with oobsize
-                        * to prevent byte access */
-                       memset(oobbuf, 0xff, mtd->oobsize);
-                       if (ops->mode == MTD_OOB_AUTO)
-                               onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
-                       else
-                               memcpy(oobbuf + oobcolumn, oob, thisooblen);
+                               /* We send data to spare ram with oobsize
+                                * to prevent byte access */
+                               memset(oobbuf, 0xff, mtd->oobsize);
+                               if (ops->mode == MTD_OOB_AUTO)
+                                       onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
+                               else
+                                       memcpy(oobbuf + oobcolumn, oob, thisooblen);
 
-                       oobwritten += thisooblen;
-                       oob += thisooblen;
-                       oobcolumn = 0;
+                               oobwritten += thisooblen;
+                               oob += thisooblen;
+                               oobcolumn = 0;
+                       } else
+                               oobbuf = (u_char *) ffchars;
+
+                       this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
                } else
-                       oobbuf = (u_char *) ffchars;
+                       ONENAND_SET_NEXT_BUFFERRAM(this);
 
-               this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
+               /*
+                * 2 PLANE, MLC, and Flex-OneNAND doesn't support
+                * write-while-programe feature.
+                */
+               if (!ONENAND_IS_2PLANE(this) && !first) {
+                       ONENAND_SET_PREV_BUFFERRAM(this);
 
-               this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);
+                       ret = this->wait(mtd, FL_WRITING);
 
-               ret = this->wait(mtd, FL_WRITING);
+                       /* In partial page write we don't update bufferram */
+                       onenand_update_bufferram(mtd, prev, !ret && !prev_subpage);
+                       if (ret) {
+                               written -= prevlen;
+                               printk(KERN_ERR "onenand_write_ops_nolock: write filaed %d\n", ret);
+                               break;
+                       }
 
-               /* In partial page write we don't update bufferram */
-               onenand_update_bufferram(mtd, to, !ret && !subpage);
-               if (ONENAND_IS_2PLANE(this)) {
-                       ONENAND_SET_BUFFERRAM1(this);
-                       onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage);
-               }
+                       if (written == len) {
+                               /* Only check verify write turn on */
+                               ret = onenand_verify(mtd, buf - len, to - len, len);
+                               if (ret)
+                                       printk(KERN_ERR "onenand_write_ops_nolock: verify failed %d\n", ret);
+                               break;
+                       }
 
-               if (ret) {
-                       printk(KERN_ERR "onenand_write_ops_nolock: write filaed %d\n", ret);
-                       break;
+                       ONENAND_SET_NEXT_BUFFERRAM(this);
                }
 
-               /* Only check verify write turn on */
-               ret = onenand_verify(mtd, buf, to, thislen);
-               if (ret) {
-                       printk(KERN_ERR "onenand_write_ops_nolock: verify failed %d\n", ret);
-                       break;
-               }
+               this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);
 
-               written += thislen;
+               /*
+                * 2 PLANE, MLC, and Flex-OneNAND wait here
+                */
+               if (ONENAND_IS_2PLANE(this)) {
+                       ret = this->wait(mtd, FL_WRITING);
 
-               if (written == len)
-                       break;
+                       /* In partial page write we don't update bufferram */
+                       onenand_update_bufferram(mtd, to, !ret && !subpage);
+                       if (ret) {
+                               printk(KERN_ERR "onenand_write_ops_nolock: write filaed %d\n", ret);
+                               break;
+                       }
+
+                       /* Only check verify write turn on */
+                       ret = onenand_verify(mtd, buf, to, thislen);
+                       if (ret) {
+                               printk(KERN_ERR "onenand_write_ops_nolock: verify failed %d\n", ret);
+                               break;
+                       }
+
+                       written += thislen;
+
+                       if (written == len)
+                               break;
+
+               } else
+                       written += thislen;
 
                column = 0;
+               prev_subpage = subpage;
+               prev = to;
+               prevlen = thislen;
                to += thislen;
                buf += thislen;
+               first = 0;
        }
 
+       /* In error case, clear all bufferrams */
+       if (written != len)
+               onenand_invalidate_bufferram(mtd, 0, -1);
+
        ops->retlen = written;
+       ops->oobretlen = oobwritten;
 
        return ret;
 }
index e63c8fc3df3a08c9faeca3357f3e94e0ef0760dd..f8e0f68f218634cfc98747cd748183e652116027 100644 (file)
@@ -186,6 +186,16 @@ static loff_t vol_cdev_llseek(struct file *file, loff_t offset, int origin)
        return new_offset;
 }
 
+static int vol_cdev_fsync(struct file *file, struct dentry *dentry,
+                         int datasync)
+{
+       struct ubi_volume_desc *desc = file->private_data;
+       struct ubi_device *ubi = desc->vol->ubi;
+
+       return ubi_sync(ubi->ubi_num);
+}
+
+
 static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count,
                             loff_t *offp)
 {
@@ -1073,6 +1083,7 @@ const struct file_operations ubi_vol_cdev_operations = {
        .llseek         = vol_cdev_llseek,
        .read           = vol_cdev_read,
        .write          = vol_cdev_write,
+       .fsync          = vol_cdev_fsync,
        .unlocked_ioctl = vol_cdev_ioctl,
        .compat_ioctl   = vol_cdev_compat_ioctl,
 };
index a09e3a7cac4f7c834c6e65d9a462ea6158d9dd4c..02330f3d5a55d35e1201e22aefc3b8e491f65f9f 100644 (file)
@@ -1530,7 +1530,7 @@ static void cp_get_ethtool_stats (struct net_device *dev,
 
        /* begin NIC statistics dump */
        cpw32(StatsAddr + 4, (u64)dma >> 32);
-       cpw32(StatsAddr, ((u64)dma & DMA_32BIT_MASK) | DumpStats);
+       cpw32(StatsAddr, ((u64)dma & DMA_BIT_MASK(32)) | DumpStats);
        cpr32(StatsAddr);
 
        for (i = 0; i < 1000; i++) {
@@ -1929,19 +1929,19 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        /* Configure DMA attributes. */
        if ((sizeof(dma_addr_t) > 4) &&
-           !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK) &&
-           !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+           !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) &&
+           !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                pci_using_dac = 1;
        } else {
                pci_using_dac = 0;
 
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_err(&pdev->dev,
                                   "No usable DMA configuration, aborting.\n");
                        goto err_out_res;
                }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_err(&pdev->dev,
                                   "No usable consistent DMA configuration, "
index 16899eee397ebf2d2c7e0a843e4a71174d04936b..9e7baec457202c6b3d39865752fb4ab819d4a42f 100644 (file)
@@ -2234,7 +2234,7 @@ config BNX2
        tristate "Broadcom NetXtremeII support"
        depends on PCI
        select CRC32
-       select ZLIB_INFLATE
+       select FW_LOADER
        help
          This driver supports Broadcom NetXtremeII gigabit Ethernet cards.
 
index 06a9f11669f31c9176fce319fb579419db020ee0..57bc7152785050b893cad09fd85b2f639daf1696 100644 (file)
@@ -1161,9 +1161,9 @@ static int __devinit ace_init(struct net_device *dev)
        /*
         * Configure DMA attributes.
         */
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                ap->pci_using_dac = 1;
-       } else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       } else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                ap->pci_using_dac = 0;
        } else {
                ecode = -ENODEV;
index cb9c95d3ed0ab45854da0e1b1e8e0240c6c044d6..19831bd64016f850416afe1387dc71b4e7fb18ea 100644 (file)
@@ -1871,7 +1871,7 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev,
        }
 
        /* Initialize DMA */
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) < 0) {
                printk(KERN_ERR "amd8111e: DMA not supported,"
                        "exiting.\n");
                goto err_free_reg;
index c758884728a53ee545879d61cc5b128de2bbe219..fb57b750866bf53657ba680c7301b7fe683e9136 100644 (file)
@@ -2326,8 +2326,8 @@ static int __devinit atl1e_probe(struct pci_dev *pdev,
         * various kernel subsystems to support the mechanics required by a
         * fixed-high-32-bit system.
         */
-       if ((pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) ||
-           (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) != 0)) {
+       if ((pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) ||
+           (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)) != 0)) {
                dev_err(&pdev->dev, "No usable DMA configuration,aborting\n");
                goto err_dma;
        }
index 43fc1b2ca3cd62d70cfacaa14dbc54ca89eb4490..0ab22540bf597a8ec6b97f8c4f54f2055608af0e 100644 (file)
@@ -2929,7 +2929,7 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
         * various kernel subsystems to support the mechanics required by a
         * fixed-high-32-bit system.
         */
-       err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err) {
                dev_err(&pdev->dev, "no usable DMA configuration\n");
                goto err_dma;
index 9fe06c3f409731b429371fbe0166693ec958c5e8..c734b1983ec14667bc2debd4d5eec05b4f66369d 100644 (file)
@@ -1358,8 +1358,8 @@ static int __devinit atl2_probe(struct pci_dev *pdev,
         * until the kernel has the proper infrastructure to support 64-bit DMA
         * on these devices.
         */
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) &&
-               pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) &&
+               pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR "atl2: No usable DMA configuration, aborting\n");
                goto err_dma;
        }
index 5c84541e07377ac80eb2a9da592b7645e6eb82c2..b70b81ec34c386f0520437f8cd96199cebc9e611 100644 (file)
@@ -660,7 +660,7 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
        /* Hardware bug work-around, the chip is unable to do PCI DMA
           to/from anything above 1GB :-( */
        if (ssb_dma_mapping_error(bp->sdev, mapping) ||
-               mapping + RX_PKT_BUF_SZ > DMA_30BIT_MASK) {
+               mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) {
                /* Sigh... */
                if (!ssb_dma_mapping_error(bp->sdev, mapping))
                        ssb_dma_unmap_single(bp->sdev, mapping,
@@ -673,7 +673,7 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
                                             RX_PKT_BUF_SZ,
                                             DMA_FROM_DEVICE);
                if (ssb_dma_mapping_error(bp->sdev, mapping) ||
-                       mapping + RX_PKT_BUF_SZ > DMA_30BIT_MASK) {
+                       mapping + RX_PKT_BUF_SZ > DMA_BIT_MASK(30)) {
                        if (!ssb_dma_mapping_error(bp->sdev, mapping))
                                ssb_dma_unmap_single(bp->sdev, mapping, RX_PKT_BUF_SZ,DMA_FROM_DEVICE);
                        dev_kfree_skb_any(skb);
@@ -703,7 +703,7 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
 
        if (bp->flags & B44_FLAG_RX_RING_HACK)
                b44_sync_dma_desc_for_device(bp->sdev, bp->rx_ring_dma,
-                                           dest_idx * sizeof(dp),
+                                           dest_idx * sizeof(*dp),
                                            DMA_BIDIRECTIONAL);
 
        return RX_PKT_BUF_SZ;
@@ -731,7 +731,7 @@ static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
 
        if (bp->flags & B44_FLAG_RX_RING_HACK)
                b44_sync_dma_desc_for_cpu(bp->sdev, bp->rx_ring_dma,
-                                        src_idx * sizeof(src_desc),
+                                        src_idx * sizeof(*src_desc),
                                         DMA_BIDIRECTIONAL);
 
        ctrl = src_desc->ctrl;
@@ -747,10 +747,10 @@ static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
 
        if (bp->flags & B44_FLAG_RX_RING_HACK)
                b44_sync_dma_desc_for_device(bp->sdev, bp->rx_ring_dma,
-                                            dest_idx * sizeof(dest_desc),
+                                            dest_idx * sizeof(*dest_desc),
                                             DMA_BIDIRECTIONAL);
 
-       ssb_dma_sync_single_for_device(bp->sdev, le32_to_cpu(src_desc->addr),
+       ssb_dma_sync_single_for_device(bp->sdev, dest_map->mapping,
                                       RX_PKT_BUF_SZ,
                                       DMA_FROM_DEVICE);
 }
@@ -965,7 +965,7 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        mapping = ssb_dma_map_single(bp->sdev, skb->data, len, DMA_TO_DEVICE);
-       if (ssb_dma_mapping_error(bp->sdev, mapping) || mapping + len > DMA_30BIT_MASK) {
+       if (ssb_dma_mapping_error(bp->sdev, mapping) || mapping + len > DMA_BIT_MASK(30)) {
                struct sk_buff *bounce_skb;
 
                /* Chip can't handle DMA to/from >1GB, use bounce buffer */
@@ -979,7 +979,7 @@ static int b44_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
                mapping = ssb_dma_map_single(bp->sdev, bounce_skb->data,
                                             len, DMA_TO_DEVICE);
-               if (ssb_dma_mapping_error(bp->sdev, mapping) || mapping + len > DMA_30BIT_MASK) {
+               if (ssb_dma_mapping_error(bp->sdev, mapping) || mapping + len > DMA_BIT_MASK(30)) {
                        if (!ssb_dma_mapping_error(bp->sdev, mapping))
                                ssb_dma_unmap_single(bp->sdev, mapping,
                                                     len, DMA_TO_DEVICE);
@@ -1204,7 +1204,7 @@ static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp)
                                                 DMA_BIDIRECTIONAL);
 
                if (ssb_dma_mapping_error(bp->sdev, rx_ring_dma) ||
-                       rx_ring_dma + size > DMA_30BIT_MASK) {
+                       rx_ring_dma + size > DMA_BIT_MASK(30)) {
                        kfree(rx_ring);
                        goto out_err;
                }
@@ -1231,7 +1231,7 @@ static int b44_alloc_consistent(struct b44 *bp, gfp_t gfp)
                                            DMA_TO_DEVICE);
 
                if (ssb_dma_mapping_error(bp->sdev, tx_ring_dma) ||
-                       tx_ring_dma + size > DMA_30BIT_MASK) {
+                       tx_ring_dma + size > DMA_BIT_MASK(30)) {
                        kfree(tx_ring);
                        goto out_err;
                }
@@ -2180,7 +2180,7 @@ static int __devinit b44_init_one(struct ssb_device *sdev,
                        "Failed to powerup the bus\n");
                goto err_out_free_dev;
        }
-       err = ssb_dma_set_mask(sdev, DMA_30BIT_MASK);
+       err = ssb_dma_set_mask(sdev, DMA_BIT_MASK(30));
        if (err) {
                dev_err(sdev->dev,
                        "Required 30BIT DMA mask unsupported by the system.\n");
index ad446db8e1861bb5a5c2813ba14856cd490b8510..9d268be0b670e70a9921cdf66694400b76e7d788 100644 (file)
 #include <linux/crc32.h>
 #include <linux/prefetch.h>
 #include <linux/cache.h>
-#include <linux/zlib.h>
+#include <linux/firmware.h>
 #include <linux/log2.h>
 
 #include "bnx2.h"
 #include "bnx2_fw.h"
-#include "bnx2_fw2.h"
-
-#define FW_BUF_SIZE            0x10000
 
 #define DRV_MODULE_NAME                "bnx2"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "1.9.3"
-#define DRV_MODULE_RELDATE     "March 17, 2009"
+#define DRV_MODULE_VERSION     "2.0.0"
+#define DRV_MODULE_RELDATE     "April 2, 2009"
+#define FW_MIPS_FILE_06                "bnx2/bnx2-mips-06-4.6.16.fw"
+#define FW_RV2P_FILE_06                "bnx2/bnx2-rv2p-06-4.6.16.fw"
+#define FW_MIPS_FILE_09                "bnx2/bnx2-mips-09-4.6.17.fw"
+#define FW_RV2P_FILE_09                "bnx2/bnx2-rv2p-09-4.6.15.fw"
 
 #define RUN_AT(x) (jiffies + (x))
 
@@ -72,6 +73,10 @@ MODULE_AUTHOR("Michael Chan <mchan@broadcom.com>");
 MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(DRV_MODULE_VERSION);
+MODULE_FIRMWARE(FW_MIPS_FILE_06);
+MODULE_FIRMWARE(FW_RV2P_FILE_06);
+MODULE_FIRMWARE(FW_MIPS_FILE_09);
+MODULE_FIRMWARE(FW_RV2P_FILE_09);
 
 static int disable_msi = 0;
 
@@ -3391,33 +3396,143 @@ bnx2_set_rx_mode(struct net_device *dev)
        spin_unlock_bh(&bp->phy_lock);
 }
 
-static void
-load_rv2p_fw(struct bnx2 *bp, __le32 *rv2p_code, u32 rv2p_code_len,
-       u32 rv2p_proc)
+static int __devinit
+check_fw_section(const struct firmware *fw,
+                const struct bnx2_fw_file_section *section,
+                u32 alignment, bool non_empty)
+{
+       u32 offset = be32_to_cpu(section->offset);
+       u32 len = be32_to_cpu(section->len);
+
+       if ((offset == 0 && len != 0) || offset >= fw->size || offset & 3)
+               return -EINVAL;
+       if ((non_empty && len == 0) || len > fw->size - offset ||
+           len & (alignment - 1))
+               return -EINVAL;
+       return 0;
+}
+
+static int __devinit
+check_mips_fw_entry(const struct firmware *fw,
+                   const struct bnx2_mips_fw_file_entry *entry)
+{
+       if (check_fw_section(fw, &entry->text, 4, true) ||
+           check_fw_section(fw, &entry->data, 4, false) ||
+           check_fw_section(fw, &entry->rodata, 4, false))
+               return -EINVAL;
+       return 0;
+}
+
+static int __devinit
+bnx2_request_firmware(struct bnx2 *bp)
 {
+       const char *mips_fw_file, *rv2p_fw_file;
+       const struct bnx2_mips_fw_file *mips;
+       const struct bnx2_rv2p_fw_file *rv2p;
+       int rc;
+
+       if (CHIP_NUM(bp) == CHIP_NUM_5709) {
+               mips_fw_file = FW_MIPS_FILE_09;
+               rv2p_fw_file = FW_RV2P_FILE_09;
+       } else {
+               mips_fw_file = FW_MIPS_FILE_06;
+               rv2p_fw_file = FW_RV2P_FILE_06;
+       }
+
+       rc = request_firmware(&bp->mips_firmware, mips_fw_file, &bp->pdev->dev);
+       if (rc) {
+               printk(KERN_ERR PFX "Can't load firmware file \"%s\"\n",
+                      mips_fw_file);
+               return rc;
+       }
+
+       rc = request_firmware(&bp->rv2p_firmware, rv2p_fw_file, &bp->pdev->dev);
+       if (rc) {
+               printk(KERN_ERR PFX "Can't load firmware file \"%s\"\n",
+                      rv2p_fw_file);
+               return rc;
+       }
+       mips = (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
+       rv2p = (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
+       if (bp->mips_firmware->size < sizeof(*mips) ||
+           check_mips_fw_entry(bp->mips_firmware, &mips->com) ||
+           check_mips_fw_entry(bp->mips_firmware, &mips->cp) ||
+           check_mips_fw_entry(bp->mips_firmware, &mips->rxp) ||
+           check_mips_fw_entry(bp->mips_firmware, &mips->tpat) ||
+           check_mips_fw_entry(bp->mips_firmware, &mips->txp)) {
+               printk(KERN_ERR PFX "Firmware file \"%s\" is invalid\n",
+                      mips_fw_file);
+               return -EINVAL;
+       }
+       if (bp->rv2p_firmware->size < sizeof(*rv2p) ||
+           check_fw_section(bp->rv2p_firmware, &rv2p->proc1.rv2p, 8, true) ||
+           check_fw_section(bp->rv2p_firmware, &rv2p->proc2.rv2p, 8, true)) {
+               printk(KERN_ERR PFX "Firmware file \"%s\" is invalid\n",
+                      rv2p_fw_file);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static u32
+rv2p_fw_fixup(u32 rv2p_proc, int idx, u32 loc, u32 rv2p_code)
+{
+       switch (idx) {
+       case RV2P_P1_FIXUP_PAGE_SIZE_IDX:
+               rv2p_code &= ~RV2P_BD_PAGE_SIZE_MSK;
+               rv2p_code |= RV2P_BD_PAGE_SIZE;
+               break;
+       }
+       return rv2p_code;
+}
+
+static int
+load_rv2p_fw(struct bnx2 *bp, u32 rv2p_proc,
+            const struct bnx2_rv2p_fw_file_entry *fw_entry)
+{
+       u32 rv2p_code_len, file_offset;
+       __be32 *rv2p_code;
        int i;
-       u32 val;
+       u32 val, cmd, addr;
+
+       rv2p_code_len = be32_to_cpu(fw_entry->rv2p.len);
+       file_offset = be32_to_cpu(fw_entry->rv2p.offset);
+
+       rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset);
 
-       if (rv2p_proc == RV2P_PROC2 && CHIP_NUM(bp) == CHIP_NUM_5709) {
-               val = le32_to_cpu(rv2p_code[XI_RV2P_PROC2_MAX_BD_PAGE_LOC]);
-               val &= ~XI_RV2P_PROC2_BD_PAGE_SIZE_MSK;
-               val |= XI_RV2P_PROC2_BD_PAGE_SIZE;
-               rv2p_code[XI_RV2P_PROC2_MAX_BD_PAGE_LOC] = cpu_to_le32(val);
+       if (rv2p_proc == RV2P_PROC1) {
+               cmd = BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
+               addr = BNX2_RV2P_PROC1_ADDR_CMD;
+       } else {
+               cmd = BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
+               addr = BNX2_RV2P_PROC2_ADDR_CMD;
        }
 
        for (i = 0; i < rv2p_code_len; i += 8) {
-               REG_WR(bp, BNX2_RV2P_INSTR_HIGH, le32_to_cpu(*rv2p_code));
+               REG_WR(bp, BNX2_RV2P_INSTR_HIGH, be32_to_cpu(*rv2p_code));
                rv2p_code++;
-               REG_WR(bp, BNX2_RV2P_INSTR_LOW, le32_to_cpu(*rv2p_code));
+               REG_WR(bp, BNX2_RV2P_INSTR_LOW, be32_to_cpu(*rv2p_code));
                rv2p_code++;
 
-               if (rv2p_proc == RV2P_PROC1) {
-                       val = (i / 8) | BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
-                       REG_WR(bp, BNX2_RV2P_PROC1_ADDR_CMD, val);
-               }
-               else {
-                       val = (i / 8) | BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
-                       REG_WR(bp, BNX2_RV2P_PROC2_ADDR_CMD, val);
+               val = (i / 8) | cmd;
+               REG_WR(bp, addr, val);
+       }
+
+       rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset);
+       for (i = 0; i < 8; i++) {
+               u32 loc, code;
+
+               loc = be32_to_cpu(fw_entry->fixup[i]);
+               if (loc && ((loc * 4) < rv2p_code_len)) {
+                       code = be32_to_cpu(*(rv2p_code + loc - 1));
+                       REG_WR(bp, BNX2_RV2P_INSTR_HIGH, code);
+                       code = be32_to_cpu(*(rv2p_code + loc));
+                       code = rv2p_fw_fixup(rv2p_proc, i, loc, code);
+                       REG_WR(bp, BNX2_RV2P_INSTR_LOW, code);
+
+                       val = (loc / 2) | cmd;
+                       REG_WR(bp, addr, val);
                }
        }
 
@@ -3428,14 +3543,18 @@ load_rv2p_fw(struct bnx2 *bp, __le32 *rv2p_code, u32 rv2p_code_len,
        else {
                REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);
        }
+
+       return 0;
 }
 
 static int
-load_cpu_fw(struct bnx2 *bp, const struct cpu_reg *cpu_reg, struct fw_info *fw)
+load_cpu_fw(struct bnx2 *bp, const struct cpu_reg *cpu_reg,
+           const struct bnx2_mips_fw_file_entry *fw_entry)
 {
+       u32 addr, len, file_offset;
+       __be32 *data;
        u32 offset;
        u32 val;
-       int rc;
 
        /* Halt the CPU. */
        val = bnx2_reg_rd_ind(bp, cpu_reg->mode);
@@ -3444,64 +3563,52 @@ load_cpu_fw(struct bnx2 *bp, const struct cpu_reg *cpu_reg, struct fw_info *fw)
        bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear);
 
        /* Load the Text area. */
-       offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base);
-       if (fw->gz_text) {
-               int j;
-
-               rc = zlib_inflate_blob(fw->text, FW_BUF_SIZE, fw->gz_text,
-                                      fw->gz_text_len);
-               if (rc < 0)
-                       return rc;
+       addr = be32_to_cpu(fw_entry->text.addr);
+       len = be32_to_cpu(fw_entry->text.len);
+       file_offset = be32_to_cpu(fw_entry->text.offset);
+       data = (__be32 *)(bp->mips_firmware->data + file_offset);
 
-               for (j = 0; j < (fw->text_len / 4); j++, offset += 4) {
-                       bnx2_reg_wr_ind(bp, offset, le32_to_cpu(fw->text[j]));
-               }
-       }
-
-       /* Load the Data area. */
-       offset = cpu_reg->spad_base + (fw->data_addr - cpu_reg->mips_view_base);
-       if (fw->data) {
+       offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
+       if (len) {
                int j;
 
-               for (j = 0; j < (fw->data_len / 4); j++, offset += 4) {
-                       bnx2_reg_wr_ind(bp, offset, fw->data[j]);
-               }
+               for (j = 0; j < (len / 4); j++, offset += 4)
+                       bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
        }
 
-       /* Load the SBSS area. */
-       offset = cpu_reg->spad_base + (fw->sbss_addr - cpu_reg->mips_view_base);
-       if (fw->sbss_len) {
-               int j;
-
-               for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) {
-                       bnx2_reg_wr_ind(bp, offset, 0);
-               }
-       }
+       /* Load the Data area. */
+       addr = be32_to_cpu(fw_entry->data.addr);
+       len = be32_to_cpu(fw_entry->data.len);
+       file_offset = be32_to_cpu(fw_entry->data.offset);
+       data = (__be32 *)(bp->mips_firmware->data + file_offset);
 
-       /* Load the BSS area. */
-       offset = cpu_reg->spad_base + (fw->bss_addr - cpu_reg->mips_view_base);
-       if (fw->bss_len) {
+       offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
+       if (len) {
                int j;
 
-               for (j = 0; j < (fw->bss_len/4); j++, offset += 4) {
-                       bnx2_reg_wr_ind(bp, offset, 0);
-               }
+               for (j = 0; j < (len / 4); j++, offset += 4)
+                       bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
        }
 
        /* Load the Read-Only area. */
-       offset = cpu_reg->spad_base +
-               (fw->rodata_addr - cpu_reg->mips_view_base);
-       if (fw->rodata) {
+       addr = be32_to_cpu(fw_entry->rodata.addr);
+       len = be32_to_cpu(fw_entry->rodata.len);
+       file_offset = be32_to_cpu(fw_entry->rodata.offset);
+       data = (__be32 *)(bp->mips_firmware->data + file_offset);
+
+       offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
+       if (len) {
                int j;
 
-               for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) {
-                       bnx2_reg_wr_ind(bp, offset, fw->rodata[j]);
-               }
+               for (j = 0; j < (len / 4); j++, offset += 4)
+                       bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
        }
 
        /* Clear the pre-fetch instruction. */
        bnx2_reg_wr_ind(bp, cpu_reg->inst, 0);
-       bnx2_reg_wr_ind(bp, cpu_reg->pc, fw->start_addr);
+
+       val = be32_to_cpu(fw_entry->start_addr);
+       bnx2_reg_wr_ind(bp, cpu_reg->pc, val);
 
        /* Start the CPU. */
        val = bnx2_reg_rd_ind(bp, cpu_reg->mode);
@@ -3515,95 +3622,40 @@ load_cpu_fw(struct bnx2 *bp, const struct cpu_reg *cpu_reg, struct fw_info *fw)
 static int
 bnx2_init_cpus(struct bnx2 *bp)
 {
-       struct fw_info *fw;
-       int rc, rv2p_len;
-       void *text, *rv2p;
+       const struct bnx2_mips_fw_file *mips_fw =
+               (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
+       const struct bnx2_rv2p_fw_file *rv2p_fw =
+               (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
+       int rc;
 
        /* Initialize the RV2P processor. */
-       text = vmalloc(FW_BUF_SIZE);
-       if (!text)
-               return -ENOMEM;
-       if (CHIP_NUM(bp) == CHIP_NUM_5709) {
-               rv2p = bnx2_xi_rv2p_proc1;
-               rv2p_len = sizeof(bnx2_xi_rv2p_proc1);
-       } else {
-               rv2p = bnx2_rv2p_proc1;
-               rv2p_len = sizeof(bnx2_rv2p_proc1);
-       }
-       rc = zlib_inflate_blob(text, FW_BUF_SIZE, rv2p, rv2p_len);
-       if (rc < 0)
-               goto init_cpu_err;
-
-       load_rv2p_fw(bp, text, rc /* == len */, RV2P_PROC1);
-
-       if (CHIP_NUM(bp) == CHIP_NUM_5709) {
-               rv2p = bnx2_xi_rv2p_proc2;
-               rv2p_len = sizeof(bnx2_xi_rv2p_proc2);
-       } else {
-               rv2p = bnx2_rv2p_proc2;
-               rv2p_len = sizeof(bnx2_rv2p_proc2);
-       }
-       rc = zlib_inflate_blob(text, FW_BUF_SIZE, rv2p, rv2p_len);
-       if (rc < 0)
-               goto init_cpu_err;
-
-       load_rv2p_fw(bp, text, rc /* == len */, RV2P_PROC2);
+       load_rv2p_fw(bp, RV2P_PROC1, &rv2p_fw->proc1);
+       load_rv2p_fw(bp, RV2P_PROC2, &rv2p_fw->proc2);
 
        /* Initialize the RX Processor. */
-       if (CHIP_NUM(bp) == CHIP_NUM_5709)
-               fw = &bnx2_rxp_fw_09;
-       else
-               fw = &bnx2_rxp_fw_06;
-
-       fw->text = text;
-       rc = load_cpu_fw(bp, &cpu_reg_rxp, fw);
+       rc = load_cpu_fw(bp, &cpu_reg_rxp, &mips_fw->rxp);
        if (rc)
                goto init_cpu_err;
 
        /* Initialize the TX Processor. */
-       if (CHIP_NUM(bp) == CHIP_NUM_5709)
-               fw = &bnx2_txp_fw_09;
-       else
-               fw = &bnx2_txp_fw_06;
-
-       fw->text = text;
-       rc = load_cpu_fw(bp, &cpu_reg_txp, fw);
+       rc = load_cpu_fw(bp, &cpu_reg_txp, &mips_fw->txp);
        if (rc)
                goto init_cpu_err;
 
        /* Initialize the TX Patch-up Processor. */
-       if (CHIP_NUM(bp) == CHIP_NUM_5709)
-               fw = &bnx2_tpat_fw_09;
-       else
-               fw = &bnx2_tpat_fw_06;
-
-       fw->text = text;
-       rc = load_cpu_fw(bp, &cpu_reg_tpat, fw);
+       rc = load_cpu_fw(bp, &cpu_reg_tpat, &mips_fw->tpat);
        if (rc)
                goto init_cpu_err;
 
        /* Initialize the Completion Processor. */
-       if (CHIP_NUM(bp) == CHIP_NUM_5709)
-               fw = &bnx2_com_fw_09;
-       else
-               fw = &bnx2_com_fw_06;
-
-       fw->text = text;
-       rc = load_cpu_fw(bp, &cpu_reg_com, fw);
+       rc = load_cpu_fw(bp, &cpu_reg_com, &mips_fw->com);
        if (rc)
                goto init_cpu_err;
 
        /* Initialize the Command Processor. */
-       if (CHIP_NUM(bp) == CHIP_NUM_5709)
-               fw = &bnx2_cp_fw_09;
-       else
-               fw = &bnx2_cp_fw_06;
-
-       fw->text = text;
-       rc = load_cpu_fw(bp, &cpu_reg_cp, fw);
+       rc = load_cpu_fw(bp, &cpu_reg_cp, &mips_fw->cp);
 
 init_cpu_err:
-       vfree(text);
        return rc;
 }
 
@@ -7473,9 +7525,9 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
 
        /* 5708 cannot support DMA addresses > 40-bit.  */
        if (CHIP_NUM(bp) == CHIP_NUM_5708)
-               persist_dma_mask = dma_mask = DMA_40BIT_MASK;
+               persist_dma_mask = dma_mask = DMA_BIT_MASK(40);
        else
-               persist_dma_mask = dma_mask = DMA_64BIT_MASK;
+               persist_dma_mask = dma_mask = DMA_BIT_MASK(64);
 
        /* Configure DMA attributes. */
        if (pci_set_dma_mask(pdev, dma_mask) == 0) {
@@ -7486,7 +7538,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
                                "pci_set_consistent_dma_mask failed, aborting.\n");
                        goto err_out_unmap;
                }
-       } else if ((rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) != 0) {
+       } else if ((rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) != 0) {
                dev_err(&pdev->dev, "System does not support DMA, aborting.\n");
                goto err_out_unmap;
        }
@@ -7807,6 +7859,10 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        pci_set_drvdata(pdev, dev);
 
+       rc = bnx2_request_firmware(bp);
+       if (rc)
+               goto error;
+
        memcpy(dev->dev_addr, bp->mac_addr, 6);
        memcpy(dev->perm_addr, bp->mac_addr, 6);
 
@@ -7823,13 +7879,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        if ((rc = register_netdev(dev))) {
                dev_err(&pdev->dev, "Cannot register net device\n");
-               if (bp->regview)
-                       iounmap(bp->regview);
-               pci_release_regions(pdev);
-               pci_disable_device(pdev);
-               pci_set_drvdata(pdev, NULL);
-               free_netdev(dev);
-               return rc;
+               goto error;
        }
 
        printk(KERN_INFO "%s: %s (%c%d) %s found at mem %lx, "
@@ -7843,6 +7893,20 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                bp->pdev->irq, dev->dev_addr);
 
        return 0;
+
+error:
+       if (bp->mips_firmware)
+               release_firmware(bp->mips_firmware);
+       if (bp->rv2p_firmware)
+               release_firmware(bp->rv2p_firmware);
+
+       if (bp->regview)
+               iounmap(bp->regview);
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
+       free_netdev(dev);
+       return rc;
 }
 
 static void __devexit
@@ -7855,6 +7919,11 @@ bnx2_remove_one(struct pci_dev *pdev)
 
        unregister_netdev(dev);
 
+       if (bp->mips_firmware)
+               release_firmware(bp->mips_firmware);
+       if (bp->rv2p_firmware)
+               release_firmware(bp->rv2p_firmware);
+
        if (bp->regview)
                iounmap(bp->regview);
 
index 704cbbcbf97aeaf3e8a4b3a386846fadfe6de69c..5b570e17c839a2d35db6fba9f27da71a1efaf41e 100644 (file)
@@ -6885,6 +6885,8 @@ struct bnx2 {
 
        u32                     idle_chk_status_idx;
 
+       const struct firmware   *mips_firmware;
+       const struct firmware   *rv2p_firmware;
 };
 
 #define REG_RD(bp, offset)                                     \
@@ -6915,44 +6917,41 @@ struct cpu_reg {
        u32 mips_view_base;
 };
 
-struct fw_info {
-       const u32 ver_major;
-       const u32 ver_minor;
-       const u32 ver_fix;
-
-       const u32 start_addr;
-
-       /* Text section. */
-       const u32 text_addr;
-       const u32 text_len;
-       const u32 text_index;
-       __le32 *text;
-       u8 *gz_text;
-       const u32 gz_text_len;
-
-       /* Data section. */
-       const u32 data_addr;
-       const u32 data_len;
-       const u32 data_index;
-       const u32 *data;
-
-       /* SBSS section. */
-       const u32 sbss_addr;
-       const u32 sbss_len;
-       const u32 sbss_index;
-
-       /* BSS section. */
-       const u32 bss_addr;
-       const u32 bss_len;
-       const u32 bss_index;
-
-       /* Read-only section. */
-       const u32 rodata_addr;
-       const u32 rodata_len;
-       const u32 rodata_index;
-       const u32 *rodata;
+struct bnx2_fw_file_section {
+       __be32 addr;
+       __be32 len;
+       __be32 offset;
 };
 
+struct bnx2_mips_fw_file_entry {
+       __be32 start_addr;
+       struct bnx2_fw_file_section text;
+       struct bnx2_fw_file_section data;
+       struct bnx2_fw_file_section rodata;
+};
+
+struct bnx2_rv2p_fw_file_entry {
+       struct bnx2_fw_file_section rv2p;
+       __be32 fixup[8];
+};
+
+struct bnx2_mips_fw_file {
+       struct bnx2_mips_fw_file_entry com;
+       struct bnx2_mips_fw_file_entry cp;
+       struct bnx2_mips_fw_file_entry rxp;
+       struct bnx2_mips_fw_file_entry tpat;
+       struct bnx2_mips_fw_file_entry txp;
+};
+
+struct bnx2_rv2p_fw_file {
+       struct bnx2_rv2p_fw_file_entry proc1;
+       struct bnx2_rv2p_fw_file_entry proc2;
+};
+
+#define RV2P_P1_FIXUP_PAGE_SIZE_IDX            0
+#define RV2P_BD_PAGE_SIZE_MSK                  0xffff
+#define RV2P_BD_PAGE_SIZE                      ((BCM_PAGE_SIZE / 16) - 1)
+
 #define RV2P_PROC1                              0
 #define RV2P_PROC2                              1
 
index 6a4f1d695de71acdf7952acddd9c9e505e5a0c82..940eb91f209d29365b4a9c0b090240f82e46e2a1 100644 (file)
@@ -4,883 +4,9 @@
  *
  * 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, except as noted below.
- *
- * This file contains firmware data derived from proprietary unpublished
- * source code, Copyright (c) 2004, 2005, 2006, 2007 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware data
- * in hexadecimal or equivalent format, provided this copyright notice is
- * accompanying it.
+ * the Free Software Foundation.
  */
 
-static u8 bnx2_COM_b06FwText[] = {
-       0xcd, 0x7c, 0x0d, 0x70, 0x5c, 0xd7, 0x75, 0xde, 0xd9, 0xb7, 0xbb, 0xc0,
-       0x12, 0x04, 0xc1, 0x07, 0x68, 0x05, 0xad, 0x24, 0x24, 0xde, 0x87, 0x7d,
-       0x00, 0x56, 0x22, 0xe4, 0x3c, 0x32, 0x10, 0x0d, 0xb9, 0x5b, 0x72, 0xbd,
-       0x0b, 0x50, 0x90, 0x43, 0x23, 0x90, 0x84, 0x28, 0x6a, 0x86, 0xe3, 0x41,
-       0x97, 0xa0, 0x62, 0x69, 0xdc, 0x86, 0x1e, 0x2b, 0x29, 0xe5, 0x2a, 0xe6,
-       0x6a, 0x01, 0xca, 0x94, 0x02, 0x72, 0x61, 0x12, 0x04, 0xd5, 0x54, 0x6d,
-       0xd7, 0x0b, 0x80, 0x54, 0xd4, 0x25, 0x97, 0x94, 0xfc, 0xa3, 0x99, 0xd8,
-       0x21, 0x4a, 0xd1, 0x92, 0xed, 0x71, 0xa7, 0x92, 0xc7, 0x9d, 0xaa, 0x33,
-       0x9a, 0x94, 0xa5, 0xe4, 0xda, 0xf1, 0x34, 0x8d, 0x6a, 0x7b, 0x1a, 0x25,
-       0xb1, 0xf3, 0xfa, 0x7d, 0xf7, 0xdd, 0x0b, 0x2c, 0x20, 0x48, 0x56, 0x92,
-       0xf1, 0x4c, 0x30, 0xb3, 0xbc, 0xef, 0xde, 0x77, 0x7f, 0xcf, 0x39, 0xf7,
-       0x9c, 0xef, 0x9c, 0x7b, 0x1f, 0x77, 0x89, 0xb4, 0x88, 0xfe, 0xdb, 0x82,
-       0xdf, 0xc0, 0xbf, 0xf8, 0x9d, 0xfd, 0xdb, 0x3f, 0xb8, 0xf3, 0x83, 0x78,
-       0xdc, 0x69, 0xd9, 0x4d, 0x11, 0x96, 0x87, 0xf1, 0x8b, 0xe3, 0xb7, 0x43,
-       0x3f, 0x6f, 0xf4, 0x67, 0xb3, 0x41, 0x48, 0x64, 0xe2, 0x87, 0x22, 0xa1,
-       0x75, 0xef, 0x62, 0xef, 0xd2, 0xe6, 0xbd, 0xfe, 0xac, 0xf7, 0x59, 0xcf,
-       0xfe, 0x7b, 0xf4, 0x6d, 0xfe, 0xc2, 0xba, 0xf9, 0x16, 0xfd, 0x93, 0x98,
-       0x95, 0xb9, 0xfa, 0xb1, 0x9c, 0x2b, 0xb1, 0x70, 0xe6, 0xbb, 0xa3, 0xfb,
-       0x5d, 0x91, 0x6c, 0x6d, 0x5b, 0x32, 0x2f, 0x3f, 0xf3, 0x8b, 0xf1, 0x88,
-       0xb0, 0xfc, 0x97, 0x32, 0x3f, 0x3d, 0xfc, 0xb5, 0x0f, 0x39, 0x6f, 0x55,
-       0xc2, 0x12, 0xb3, 0x33, 0x6f, 0x8b, 0xdd, 0x2b, 0xb1, 0x2e, 0xb4, 0x79,
-       0xba, 0xef, 0x59, 0x4b, 0xda, 0x4c, 0x5f, 0xf6, 0x44, 0x38, 0x23, 0x63,
-       0x93, 0x33, 0x87, 0x7d, 0xcb, 0x95, 0xe2, 0x4d, 0x19, 0x37, 0x59, 0x92,
-       0xd6, 0xc1, 0xe9, 0x81, 0x0f, 0x09, 0xf2, 0x63, 0x93, 0xb5, 0x98, 0xe4,
-       0xea, 0xc5, 0x56, 0xcb, 0x75, 0x91, 0xc6, 0x8a, 0x37, 0x67, 0x24, 0xd6,
-       0x94, 0x79, 0xba, 0xf9, 0x25, 0x97, 0xe3, 0x27, 0x46, 0x73, 0xee, 0xcd,
-       0x12, 0x71, 0x7d, 0x7f, 0x1a, 0xe3, 0xef, 0xa9, 0xfd, 0xcc, 0x7f, 0x2c,
-       0x12, 0x8c, 0x6d, 0x65, 0x8a, 0x61, 0xa6, 0xa1, 0x4c, 0x72, 0xb4, 0xbb,
-       0xa6, 0xf2, 0x4d, 0x41, 0xde, 0x35, 0xf9, 0x2d, 0x41, 0x7e, 0x42, 0xe7,
-       0xed, 0x96, 0x60, 0x2d, 0xb1, 0x4d, 0x58, 0x4b, 0x2c, 0x92, 0x19, 0xda,
-       0x84, 0x3e, 0x63, 0xd1, 0x8c, 0x9b, 0x59, 0x52, 0xf5, 0x3e, 0xa1, 0xeb,
-       0x1d, 0x8c, 0x06, 0xed, 0x26, 0x47, 0x7b, 0x6b, 0x4c, 0x1f, 0x1e, 0xed,
-       0x51, 0xe9, 0xa3, 0xa3, 0x29, 0x95, 0x16, 0x55, 0xbd, 0x50, 0x66, 0x7a,
-       0xd4, 0x55, 0x69, 0x97, 0x2e, 0x4f, 0x8f, 0x26, 0x55, 0xda, 0xaf, 0x53,
-       0x4f, 0xa7, 0x03, 0x3a, 0x1d, 0xd4, 0x69, 0x46, 0xa7, 0x59, 0x9d, 0x0e,
-       0xe9, 0x7e, 0x46, 0x74, 0x7e, 0xaf, 0x4e, 0xc7, 0x74, 0x3a, 0xae, 0xd3,
-       0xfb, 0x75, 0xba, 0x4f, 0xcf, 0xeb, 0x93, 0x3a, 0x7f, 0x50, 0xcf, 0xef,
-       0x10, 0xe6, 0xf1, 0x93, 0x26, 0x2d, 0xbf, 0x58, 0x67, 0x52, 0xf6, 0xcf,
-       0xc4, 0xa4, 0x54, 0x0e, 0x4b, 0x5e, 0xf1, 0xb5, 0x3f, 0x2a, 0x2d, 0x31,
-       0x99, 0xaa, 0xc7, 0xe4, 0xaa, 0x12, 0xdb, 0x1f, 0xf8, 0x5f, 0xeb, 0xb3,
-       0xe5, 0x42, 0x3d, 0x2e, 0x97, 0xea, 0x12, 0x1a, 0xeb, 0xdb, 0x24, 0xd6,
-       0x89, 0x9b, 0x24, 0x6b, 0x87, 0x24, 0xac, 0xe8, 0x9b, 0x94, 0xdc, 0x4c,
-       0x27, 0xf2, 0x4e, 0x42, 0x64, 0x32, 0x1a, 0xf0, 0x33, 0x26, 0xe1, 0x79,
-       0xf2, 0x67, 0x7e, 0xf4, 0xa5, 0xb9, 0x84, 0x44, 0x8e, 0x27, 0xd1, 0x7f,
-       0xab, 0x44, 0xe7, 0xa5, 0x2b, 0x2c, 0x3d, 0x89, 0x07, 0x50, 0x63, 0xa8,
-       0x16, 0x91, 0xe1, 0x5a, 0x08, 0x3c, 0x8b, 0x41, 0x5e, 0x5a, 0xf1, 0xb3,
-       0xf1, 0x8b, 0xe3, 0x97, 0xc0, 0xef, 0x09, 0xf4, 0xd3, 0x25, 0xf9, 0x1a,
-       0xfb, 0xc4, 0xb8, 0x65, 0x8c, 0x5f, 0x76, 0xec, 0x09, 0xe1, 0x9c, 0x12,
-       0xf2, 0xb5, 0xbe, 0x60, 0x4e, 0x97, 0xea, 0xb1, 0x50, 0xee, 0xb4, 0x1c,
-       0xcc, 0x7b, 0x92, 0xb4, 0xdc, 0x16, 0x29, 0xd8, 0xa1, 0xe4, 0x64, 0xba,
-       0x43, 0x8a, 0xe3, 0x78, 0x57, 0x96, 0xac, 0x85, 0xbe, 0x0b, 0xb6, 0x4c,
-       0x04, 0xef, 0x58, 0xf6, 0x37, 0xd8, 0xb7, 0x8e, 0x4d, 0x01, 0xbe, 0x54,
-       0xfe, 0x63, 0x3c, 0xb3, 0xaf, 0xff, 0x17, 0x0e, 0xe6, 0xfc, 0xd7, 0xc8,
-       0xb3, 0xfc, 0xcb, 0x5b, 0x83, 0x3c, 0x9f, 0x59, 0xd7, 0x8c, 0x69, 0xd6,
-       0xca, 0xb1, 0xfb, 0xb0, 0x5e, 0x8e, 0xbf, 0xb2, 0x5e, 0xcc, 0xa3, 0x35,
-       0x94, 0x3f, 0x9d, 0x94, 0x23, 0xe5, 0x5d, 0x92, 0xf3, 0x7c, 0x7f, 0xbf,
-       0x27, 0x71, 0x4b, 0x7a, 0xec, 0x3c, 0xde, 0x56, 0x6b, 0x12, 0xca, 0x95,
-       0x0d, 0x3d, 0xd8, 0x6f, 0x04, 0x65, 0x9d, 0xa8, 0xdf, 0x16, 0x1a, 0x3a,
-       0x8d, 0xb9, 0x67, 0x48, 0x17, 0xc8, 0xae, 0xd7, 0x93, 0x98, 0xc4, 0x78,
-       0x0b, 0xb5, 0x1e, 0xef, 0xb2, 0xd8, 0xe8, 0xb3, 0x03, 0x75, 0x48, 0x23,
-       0xf6, 0xc5, 0x3e, 0xd9, 0x5f, 0x2b, 0xda, 0xc6, 0xf1, 0x8e, 0x73, 0xf2,
-       0xfd, 0x9c, 0x67, 0x33, 0x2f, 0x15, 0xd0, 0xad, 0x42, 0xba, 0xb5, 0x74,
-       0xc9, 0x99, 0x1a, 0xc7, 0xd8, 0x68, 0xde, 0xb7, 0xfe, 0x23, 0x9b, 0x77,
-       0x02, 0xfd, 0xc7, 0x91, 0x6e, 0x0e, 0xe5, 0x4e, 0xfa, 0x18, 0x3f, 0x81,
-       0xe7, 0x8d, 0xd6, 0x70, 0x55, 0xcb, 0x60, 0x02, 0x73, 0x8f, 0xcb, 0x45,
-       0x25, 0x87, 0x9b, 0x25, 0x0c, 0x39, 0x24, 0x8f, 0xdb, 0xe7, 0x6f, 0x97,
-       0x42, 0xdc, 0x49, 0x52, 0x87, 0x76, 0xef, 0xd8, 0x84, 0x35, 0x6a, 0x6d,
-       0x78, 0x3c, 0x0e, 0x39, 0xbc, 0xdc, 0x6e, 0xa1, 0xc4, 0x12, 0xc7, 0xfe,
-       0x2d, 0x29, 0x4a, 0x7e, 0xf1, 0x91, 0x90, 0xb4, 0x58, 0xa8, 0xb7, 0x2d,
-       0x14, 0xd0, 0x80, 0xf4, 0xc9, 0x82, 0x3e, 0x21, 0x09, 0xf6, 0x73, 0x56,
-       0xba, 0x6b, 0xea, 0x7d, 0xd2, 0x52, 0xef, 0x86, 0xf0, 0x2e, 0x22, 0xa9,
-       0x1d, 0xe6, 0xfd, 0x10, 0xde, 0xdf, 0x24, 0x13, 0x36, 0xe6, 0x52, 0x7e,
-       0xc1, 0xca, 0x61, 0x8e, 0x1f, 0x89, 0xa8, 0xb5, 0xa2, 0xee, 0x44, 0x43,
-       0x3f, 0x13, 0xa8, 0xf7, 0x34, 0xc6, 0xc2, 0x7c, 0xcb, 0x49, 0xcc, 0xa5,
-       0x13, 0x73, 0xe1, 0x1c, 0x8b, 0x56, 0xae, 0x1e, 0x41, 0x7e, 0xda, 0xca,
-       0x9f, 0x3d, 0x8a, 0x67, 0xb1, 0xad, 0xcc, 0x0b, 0x4c, 0xd1, 0x7e, 0x5f,
-       0x43, 0xfb, 0x7d, 0x68, 0xcf, 0x31, 0xd8, 0x3e, 0x90, 0xff, 0xa2, 0x92,
-       0xc5, 0xe4, 0x7b, 0xd0, 0x23, 0xfc, 0xf7, 0xa0, 0xc7, 0xd7, 0x34, 0x3d,
-       0x7e, 0x26, 0xbf, 0x78, 0x7a, 0x5c, 0xfd, 0x05, 0xd1, 0x43, 0xa4, 0x70,
-       0x92, 0xcf, 0x11, 0x29, 0x2a, 0xbd, 0xc5, 0x7d, 0x4b, 0x79, 0xa7, 0xce,
-       0x22, 0x9d, 0x28, 0xc7, 0xd8, 0x03, 0xf5, 0x08, 0xd2, 0x67, 0x90, 0x6e,
-       0x0e, 0x8d, 0x9d, 0x7c, 0x13, 0xfc, 0xf7, 0xc5, 0xde, 0x61, 0xec, 0x47,
-       0x31, 0x61, 0x4b, 0x97, 0xd8, 0x1f, 0x84, 0xf1, 0xee, 0x74, 0xec, 0x82,
-       0x7c, 0x9f, 0xef, 0x43, 0xc6, 0xce, 0xe7, 0x66, 0x36, 0xbd, 0x9d, 0x55,
-       0x4f, 0x51, 0xd2, 0x33, 0x6b, 0x65, 0x22, 0xa1, 0x7c, 0x39, 0x39, 0x61,
-       0x65, 0xe2, 0xd0, 0x53, 0xcc, 0x0f, 0x86, 0x82, 0x39, 0x0f, 0xa0, 0xae,
-       0xd1, 0x59, 0x66, 0xee, 0x03, 0x98, 0xfb, 0x7a, 0xdd, 0x95, 0xc5, 0x5c,
-       0x38, 0x07, 0xce, 0xab, 0xa8, 0x75, 0x10, 0xfb, 0x39, 0xa4, 0xfa, 0x09,
-       0x67, 0x06, 0x85, 0xb6, 0xb4, 0x30, 0xc3, 0x7d, 0xc0, 0x76, 0xec, 0x2b,
-       0xd0, 0xc9, 0x85, 0x9a, 0xe9, 0xa3, 0xd8, 0xd8, 0x07, 0xe6, 0x23, 0x5b,
-       0x2d, 0x37, 0x0a, 0xde, 0xb3, 0xab, 0xa3, 0x78, 0xf7, 0xb4, 0xe4, 0xce,
-       0xde, 0x61, 0x61, 0x0d, 0xe8, 0x97, 0x34, 0x1a, 0x83, 0xce, 0xe6, 0x3e,
-       0x8b, 0x49, 0x3e, 0xce, 0xb2, 0x49, 0x3d, 0x6e, 0x44, 0xb2, 0x2a, 0x9f,
-       0x6b, 0x5b, 0x9d, 0xc7, 0x0b, 0x7a, 0x3d, 0x19, 0xac, 0x87, 0x73, 0x30,
-       0x6b, 0xc9, 0x34, 0xac, 0xc5, 0xd0, 0x9a, 0xb4, 0xb0, 0xa1, 0xe3, 0x63,
-       0xda, 0x86, 0xb0, 0xdd, 0x74, 0x03, 0xef, 0xa6, 0xd1, 0x86, 0xb4, 0x47,
-       0x9d, 0x75, 0x76, 0x85, 0x36, 0x65, 0x08, 0xfd, 0x94, 0xe6, 0x2c, 0xc9,
-       0x7b, 0xb0, 0xd9, 0xde, 0xcd, 0x5a, 0x5e, 0x57, 0x65, 0x29, 0xba, 0xa1,
-       0x2c, 0x3d, 0x66, 0x05, 0xfa, 0x1a, 0xb6, 0x05, 0xf6, 0x67, 0x6a, 0xce,
-       0x49, 0x1b, 0x59, 0x2a, 0xcd, 0xbc, 0x1f, 0x59, 0x32, 0xed, 0x63, 0x90,
-       0x5d, 0x33, 0xc6, 0xfa, 0x39, 0x9b, 0x3a, 0x98, 0x63, 0x79, 0x48, 0x63,
-       0x15, 0x8e, 0x13, 0xd8, 0x86, 0xca, 0x1a, 0xdb, 0x70, 0x14, 0x6d, 0x25,
-       0x94, 0xef, 0x6b, 0x95, 0x03, 0x73, 0xa6, 0x8f, 0xa3, 0x4a, 0x66, 0x27,
-       0x67, 0x1c, 0x7b, 0x38, 0x2c, 0xd9, 0xe1, 0xd9, 0x41, 0x19, 0xaa, 0x77,
-       0x81, 0xa7, 0x6f, 0xfb, 0xb0, 0x9d, 0x1f, 0x8c, 0x8a, 0x0b, 0xbd, 0x88,
-       0x35, 0x0f, 0x80, 0xc6, 0xf5, 0xa8, 0x58, 0x19, 0x0f, 0x69, 0x23, 0xd6,
-       0x8a, 0x44, 0x86, 0xd7, 0xe4, 0x9b, 0x50, 0x07, 0x7d, 0x0f, 0xac, 0xaf,
-       0x07, 0xf9, 0x04, 0x6d, 0x73, 0xde, 0xcf, 0x7c, 0xd8, 0x61, 0x6d, 0xb3,
-       0x58, 0x4a, 0x3d, 0x61, 0x74, 0xc4, 0x6f, 0x60, 0x7f, 0xab, 0xbd, 0x50,
-       0x04, 0x76, 0x41, 0x1f, 0xa2, 0xe4, 0xb4, 0x54, 0x7f, 0xce, 0xec, 0x7b,
-       0x55, 0xbe, 0x67, 0x80, 0xb2, 0x57, 0x01, 0x26, 0xe0, 0x9a, 0x16, 0xd5,
-       0x5e, 0xcf, 0xdb, 0x71, 0x99, 0x2e, 0x73, 0x3d, 0x8b, 0x92, 0xaa, 0xfd,
-       0x7b, 0xc9, 0x9f, 0x15, 0xf9, 0xd6, 0x0c, 0xeb, 0x7d, 0x55, 0xd7, 0x7b,
-       0x01, 0xf5, 0x52, 0xc9, 0xa1, 0x90, 0x03, 0x3b, 0xe0, 0x60, 0x9b, 0x6c,
-       0x4b, 0x22, 0xb5, 0x47, 0xf0, 0x1b, 0xa2, 0x91, 0x41, 0xbd, 0x00, 0xfb,
-       0xbc, 0x00, 0x7a, 0x88, 0xdc, 0x5d, 0x6e, 0x86, 0x3e, 0xf9, 0x9f, 0x98,
-       0x6b, 0x5c, 0x9e, 0xc4, 0x3a, 0x5e, 0x9a, 0x21, 0xbe, 0xfa, 0xaa, 0x2c,
-       0xcd, 0x10, 0x6f, 0xbd, 0x20, 0xd3, 0x33, 0x29, 0xef, 0x5b, 0xa0, 0xf3,
-       0x19, 0xe1, 0x5a, 0xb6, 0x79, 0x48, 0x81, 0x05, 0x9d, 0xe4, 0xe3, 0xd0,
-       0x67, 0x7d, 0x3b, 0x82, 0xfe, 0x7a, 0x74, 0x7f, 0x6e, 0xcd, 0x91, 0xab,
-       0x36, 0xf5, 0xd3, 0x3b, 0xf7, 0x78, 0x4e, 0xef, 0xf1, 0x31, 0xaf, 0x4b,
-       0x2c, 0xec, 0xeb, 0xec, 0x78, 0x11, 0xd6, 0x8f, 0xfb, 0xfa, 0x6d, 0x6b,
-       0x15, 0xff, 0x24, 0x80, 0x59, 0x1d, 0x65, 0xef, 0xfe, 0x6e, 0x7b, 0xbc,
-       0x71, 0x6f, 0x73, 0xfc, 0x36, 0xb4, 0x89, 0x20, 0x7d, 0xef, 0x7d, 0x8d,
-       0x3e, 0x1a, 0xda, 0x0e, 0x72, 0x5f, 0xa0, 0xcd, 0xbf, 0x05, 0x2d, 0x48,
-       0xff, 0xf7, 0xb3, 0x9f, 0x6f, 0x0b, 0xbf, 0xaf, 0xfd, 0x3c, 0xfe, 0x5e,
-       0xfb, 0xb9, 0x71, 0x2f, 0x5f, 0x20, 0x2d, 0x30, 0xb6, 0xcc, 0x06, 0xb2,
-       0xd5, 0x03, 0x5a, 0x27, 0x21, 0xa7, 0x98, 0x43, 0xf9, 0x6f, 0xfd, 0x6c,
-       0x24, 0xc0, 0x73, 0x81, 0x3c, 0xb1, 0x9e, 0xa9, 0x13, 0xe8, 0xde, 0xa1,
-       0xfa, 0x55, 0xa5, 0x67, 0x2f, 0x2a, 0x3d, 0xeb, 0x1c, 0x2d, 0x0a, 0xe5,
-       0xed, 0xf6, 0x30, 0xe9, 0x7e, 0xc1, 0xfb, 0x7d, 0xcc, 0xd1, 0x49, 0x26,
-       0xad, 0x9e, 0xa2, 0x65, 0xfd, 0xbe, 0x1c, 0x5c, 0x78, 0x58, 0x0e, 0x96,
-       0xd9, 0xc7, 0x2e, 0xbc, 0x77, 0x51, 0xb6, 0x09, 0xba, 0x96, 0x3a, 0xfd,
-       0xed, 0x50, 0x30, 0x96, 0x05, 0xfb, 0xb5, 0x1c, 0xba, 0xbb, 0x7e, 0x25,
-       0x94, 0x5b, 0xe0, 0xde, 0x45, 0x79, 0xbd, 0x51, 0xe7, 0x1b, 0x7d, 0xff,
-       0x0a, 0xc6, 0x34, 0x72, 0xee, 0x35, 0xe8, 0xd4, 0x69, 0xe2, 0x41, 0x2b,
-       0xe7, 0x91, 0x7f, 0xb4, 0x2d, 0x8f, 0xd8, 0xc1, 0xfa, 0x0f, 0x81, 0x66,
-       0xb4, 0x49, 0xa4, 0x21, 0xec, 0x61, 0x84, 0xfb, 0x97, 0xcf, 0xe2, 0x87,
-       0x33, 0xdc, 0x83, 0x12, 0x09, 0x67, 0x80, 0x7f, 0xe3, 0xac, 0xb3, 0x0b,
-       0x73, 0x0e, 0xf6, 0x77, 0x71, 0x65, 0x7f, 0x77, 0xcb, 0xc4, 0x42, 0x16,
-       0x3a, 0x20, 0xaf, 0xfa, 0x89, 0xba, 0x6b, 0x6c, 0x0b, 0xea, 0x27, 0x35,
-       0x1f, 0x36, 0x1b, 0xfd, 0x87, 0x32, 0x4f, 0x97, 0x35, 0x35, 0x94, 0x19,
-       0x7e, 0x15, 0x30, 0x16, 0x6d, 0xc4, 0x88, 0xc6, 0x3d, 0xbe, 0x9f, 0x27,
-       0x9f, 0xfb, 0xf7, 0x09, 0xf7, 0xc4, 0xa5, 0x72, 0xd1, 0x0e, 0x2b, 0xd9,
-       0x5c, 0xfc, 0xd8, 0xaa, 0x6c, 0x02, 0x27, 0xab, 0x5e, 0x48, 0x5b, 0xce,
-       0xa5, 0x15, 0xb4, 0x1c, 0xc2, 0x1a, 0x40, 0xb3, 0xce, 0x10, 0xe8, 0xd6,
-       0x2a, 0x85, 0xfa, 0x2e, 0xfd, 0x8e, 0xe5, 0x11, 0x19, 0x8b, 0x1b, 0x3b,
-       0xf4, 0xe7, 0x5b, 0x03, 0xac, 0x8b, 0x3a, 0xe5, 0xff, 0x1d, 0x0e, 0x64,
-       0xdf, 0x96, 0xc2, 0xe9, 0x21, 0xc8, 0x18, 0xb1, 0xd8, 0x26, 0x2d, 0x63,
-       0xec, 0x07, 0xe5, 0x67, 0x29, 0xc3, 0xa2, 0xf5, 0xe7, 0x20, 0xd2, 0x1f,
-       0x87, 0x69, 0xb7, 0xd9, 0x57, 0xe1, 0xb4, 0x69, 0x6f, 0xe6, 0xd1, 0xb1,
-       0xd2, 0xcf, 0x98, 0x67, 0x49, 0x58, 0xcd, 0x05, 0x65, 0x67, 0xd7, 0xce,
-       0xc5, 0xea, 0x34, 0x73, 0x79, 0x34, 0x1c, 0xcc, 0xa5, 0xa3, 0xa1, 0xaf,
-       0x78, 0xc3, 0x5c, 0x9a, 0x30, 0x97, 0xb8, 0xb2, 0x37, 0x9c, 0xcb, 0x05,
-       0xf0, 0xbe, 0x70, 0xf6, 0xc6, 0xeb, 0x82, 0x36, 0xf1, 0x86, 0x36, 0x9d,
-       0xeb, 0xda, 0xb0, 0xbe, 0x19, 0x03, 0xef, 0xce, 0x5e, 0xdd, 0x1c, 0xb4,
-       0x61, 0xbd, 0x26, 0xd8, 0x37, 0xbe, 0x53, 0x7e, 0x5b, 0x83, 0xfc, 0x1f,
-       0x84, 0xfc, 0x1b, 0xb9, 0x32, 0xb6, 0xd9, 0xf0, 0x75, 0x53, 0x28, 0x7f,
-       0xf2, 0x03, 0xf4, 0x3d, 0x43, 0x63, 0xe5, 0x25, 0xf8, 0x0f, 0x49, 0x29,
-       0xa4, 0xe1, 0x9b, 0xd8, 0x83, 0xa2, 0xfc, 0x89, 0x34, 0x7c, 0x16, 0x7b,
-       0xb3, 0xc2, 0x5b, 0x85, 0x74, 0xbf, 0xb6, 0x59, 0xdf, 0x97, 0x09, 0xc8,
-       0x70, 0x21, 0x9d, 0xc6, 0x78, 0xd0, 0xd5, 0x6e, 0x2f, 0xda, 0x71, 0xdc,
-       0xb7, 0x22, 0xb4, 0x23, 0x17, 0xca, 0x1f, 0x47, 0x7e, 0x33, 0xde, 0xff,
-       0xa9, 0x9e, 0x4f, 0x1b, 0xea, 0x7c, 0x5a, 0xf9, 0x26, 0x17, 0x54, 0x1d,
-       0xf6, 0x71, 0x19, 0xf9, 0x3b, 0x50, 0x07, 0x9b, 0x1c, 0x12, 0x68, 0xb9,
-       0x3b, 0xf1, 0xfb, 0x36, 0xca, 0x3e, 0x84, 0xb2, 0x2f, 0xa3, 0xec, 0x76,
-       0xe4, 0x5f, 0x5c, 0xd7, 0xef, 0x36, 0xe4, 0x1f, 0xc3, 0x7b, 0xac, 0xd3,
-       0xfe, 0x06, 0xde, 0xdf, 0x81, 0xdf, 0x97, 0xd7, 0xd5, 0xf9, 0x37, 0xeb,
-       0xf2, 0xc6, 0x2f, 0xf8, 0x63, 0x2d, 0x73, 0xc6, 0x27, 0x08, 0xf4, 0xe8,
-       0x54, 0xb9, 0x35, 0x34, 0x7c, 0x3a, 0x16, 0xda, 0x73, 0x9a, 0x78, 0x23,
-       0xa2, 0xfc, 0x80, 0x08, 0xfc, 0x80, 0xe9, 0x39, 0x3a, 0x88, 0x11, 0x94,
-       0x11, 0xbb, 0xcb, 0x40, 0x93, 0xf4, 0x78, 0x57, 0xb0, 0x4f, 0x0a, 0xb5,
-       0x2e, 0xe4, 0xb9, 0x7f, 0x20, 0x63, 0xb5, 0x16, 0xc8, 0x75, 0x4f, 0xba,
-       0x0a, 0x19, 0x3b, 0x00, 0xdf, 0x64, 0x02, 0x36, 0x70, 0xa2, 0xd6, 0x25,
-       0x0f, 0xd4, 0xae, 0x44, 0x02, 0x39, 0x32, 0x63, 0x3f, 0xbd, 0x6e, 0xec,
-       0x18, 0xfd, 0x0a, 0xc8, 0xfd, 0xfc, 0xe8, 0xfe, 0x39, 0x8e, 0x6f, 0x75,
-       0x47, 0xa4, 0x0d, 0x73, 0xa0, 0xff, 0x28, 0xbd, 0x11, 0xe9, 0x49, 0x4e,
-       0x29, 0x07, 0xb5, 0x28, 0xe1, 0x4c, 0x0f, 0xec, 0x83, 0xca, 0xc3, 0x5f,
-       0x84, 0xbe, 0xab, 0xad, 0xfa, 0x91, 0xc3, 0x2b, 0x7e, 0x64, 0x17, 0xfc,
-       0xcc, 0x17, 0x23, 0xc1, 0xde, 0x6f, 0x85, 0x6e, 0xb8, 0x9e, 0x38, 0x47,
-       0xe9, 0x77, 0xee, 0xf1, 0x9c, 0xd7, 0xae, 0xf3, 0x94, 0x65, 0xe8, 0x0b,
-       0x2b, 0xaa, 0xf4, 0x95, 0x58, 0x78, 0x37, 0x40, 0xf9, 0x45, 0x7e, 0xa1,
-       0x71, 0x7f, 0xff, 0x0e, 0xf6, 0x32, 0xdf, 0x1b, 0x39, 0xc3, 0x3f, 0x4a,
-       0xc6, 0x18, 0xbf, 0xf8, 0x8b, 0x75, 0x6b, 0x3b, 0xb0, 0x6e, 0x6d, 0x91,
-       0x15, 0xba, 0x72, 0x8d, 0x51, 0xac, 0x71, 0x69, 0x8e, 0xb4, 0xed, 0x87,
-       0x7c, 0x8a, 0x1b, 0x11, 0xca, 0x31, 0xf5, 0x6a, 0x1b, 0x74, 0x35, 0x69,
-       0x17, 0x11, 0xc6, 0x3c, 0x26, 0xb0, 0xa6, 0x09, 0xac, 0x69, 0xa2, 0x81,
-       0x8e, 0x07, 0x56, 0xd6, 0x64, 0xe6, 0x8d, 0x7a, 0x6a, 0xbf, 0xf1, 0x99,
-       0x3f, 0xe8, 0xa9, 0x36, 0x83, 0x69, 0x38, 0x97, 0xdc, 0xba, 0xb9, 0x90,
-       0x16, 0x9c, 0xcb, 0xca, 0x3c, 0xe2, 0x8c, 0x1c, 0x1d, 0xac, 0x91, 0xaf,
-       0x1c, 0x73, 0xaf, 0x4c, 0x96, 0x3f, 0xa0, 0xe7, 0xd1, 0x8a, 0x79, 0x8c,
-       0x41, 0x6f, 0x70, 0x3c, 0xec, 0xff, 0xda, 0x38, 0x9e, 0xe3, 0xe4, 0xbf,
-       0x9e, 0x8b, 0xa1, 0x05, 0xfd, 0xb6, 0x84, 0xc6, 0xe2, 0x86, 0x5e, 0xae,
-       0xc2, 0x0e, 0x97, 0xca, 0xff, 0x6d, 0x6b, 0x30, 0xb7, 0xa4, 0x9e, 0x47,
-       0x40, 0x63, 0x60, 0x78, 0x60, 0xa9, 0xbc, 0xd6, 0x07, 0x8d, 0x74, 0xbd,
-       0xbb, 0x49, 0xeb, 0x2b, 0xc8, 0x40, 0x63, 0xf9, 0xa7, 0x9a, 0x56, 0xeb,
-       0x32, 0x3f, 0xaf, 0xf3, 0x5b, 0x42, 0xc3, 0x27, 0x4d, 0xd9, 0xd5, 0xa6,
-       0x77, 0xf6, 0xf7, 0xd5, 0x26, 0xa3, 0x3f, 0x2e, 0x95, 0x1b, 0xf7, 0xfb,
-       0x21, 0x2b, 0xb0, 0x3b, 0x45, 0x29, 0x0d, 0x64, 0xa1, 0xe7, 0x68, 0x7f,
-       0x86, 0xac, 0xc0, 0xf6, 0xb0, 0xce, 0x21, 0x85, 0x1d, 0x23, 0x99, 0x2a,
-       0xe5, 0x1e, 0xb4, 0xac, 0x8d, 0xe6, 0x66, 0x7c, 0x7f, 0xca, 0x5b, 0x4e,
-       0x84, 0x85, 0x7a, 0x99, 0xb8, 0x8d, 0xe5, 0xcf, 0xa0, 0x1c, 0x76, 0xbd,
-       0x3e, 0x26, 0x6c, 0xb7, 0x31, 0x3e, 0x4b, 0x6a, 0x7c, 0x16, 0x00, 0xbb,
-       0x9c, 0xc2, 0x53, 0x4f, 0x8d, 0xc2, 0xfe, 0xeb, 0xe7, 0xa7, 0xf1, 0x9c,
-       0x6c, 0xc4, 0x80, 0xe8, 0xb7, 0x32, 0x9a, 0x9b, 0x53, 0x76, 0x00, 0xfb,
-       0x81, 0xbc, 0x3a, 0x03, 0x5e, 0x85, 0x64, 0x5a, 0xd9, 0x04, 0xce, 0x83,
-       0xed, 0x2a, 0xa3, 0xdd, 0x8b, 0x4c, 0xab, 0xa3, 0xee, 0x62, 0x58, 0x0e,
-       0xc4, 0x83, 0xb6, 0xcc, 0x27, 0x17, 0x8d, 0xdd, 0x6e, 0x91, 0x68, 0x86,
-       0xba, 0xcd, 0x49, 0x03, 0x87, 0x62, 0x3d, 0x47, 0x47, 0xa7, 0x5d, 0xda,
-       0xcb, 0xff, 0x03, 0x79, 0x68, 0x91, 0x26, 0x25, 0x27, 0x4f, 0xea, 0xb1,
-       0xce, 0x60, 0xac, 0xad, 0x98, 0x6b, 0x18, 0x3a, 0x32, 0x92, 0xc0, 0x38,
-       0x87, 0x2d, 0x77, 0x1b, 0xc6, 0xa3, 0xd7, 0xd8, 0x25, 0x53, 0x75, 0xca,
-       0xfa, 0xdf, 0x44, 0x56, 0x7d, 0xc5, 0x13, 0x68, 0x67, 0x7c, 0x14, 0x8e,
-       0x57, 0x05, 0x46, 0x69, 0xc1, 0x3a, 0x1c, 0x3b, 0x17, 0x86, 0xed, 0x9b,
-       0x33, 0x75, 0x38, 0xa7, 0xe3, 0xa3, 0xa9, 0xc5, 0x14, 0xfa, 0xea, 0xa2,
-       0xec, 0x41, 0xe6, 0xc2, 0xf8, 0xb1, 0x6f, 0xb6, 0x83, 0x4e, 0x1e, 0x34,
-       0x76, 0x7c, 0xb5, 0xbd, 0x69, 0xd7, 0xbd, 0x38, 0xa2, 0x65, 0xf7, 0xaf,
-       0xfc, 0xec, 0x38, 0xdf, 0x37, 0xc6, 0x07, 0x4c, 0x3b, 0x53, 0x27, 0xac,
-       0xf5, 0xf1, 0x7d, 0xd1, 0xd5, 0x79, 0x3e, 0x35, 0x1a, 0xf8, 0x31, 0x12,
-       0xc9, 0xf7, 0x0d, 0x6a, 0xbe, 0x3d, 0x8d, 0x32, 0xb6, 0xc7, 0x5e, 0xa8,
-       0x37, 0x62, 0xf0, 0xa0, 0xdf, 0x22, 0xb0, 0x47, 0xa9, 0xdc, 0x04, 0x5d,
-       0x93, 0x6d, 0x0f, 0x62, 0x22, 0xef, 0x85, 0xbb, 0xc1, 0x53, 0xf4, 0x53,
-       0x5a, 0x69, 0xab, 0xe2, 0x93, 0xa3, 0x2f, 0xa1, 0xff, 0x23, 0xe5, 0x60,
-       0xaf, 0x05, 0x74, 0x20, 0x5e, 0x0a, 0xc9, 0x92, 0x9b, 0x84, 0x7f, 0x47,
-       0x3b, 0x94, 0x94, 0x97, 0x5d, 0x83, 0x9f, 0x88, 0x9d, 0x50, 0xbf, 0xce,
-       0xf9, 0x70, 0xdd, 0x27, 0xb0, 0x6e, 0x5f, 0x66, 0xbd, 0x40, 0x3e, 0xfa,
-       0xb0, 0x37, 0xff, 0x53, 0xc4, 0x39, 0x4a, 0x3f, 0xe0, 0x6a, 0xa4, 0x71,
-       0x5d, 0xc6, 0x9e, 0x3d, 0xa5, 0x63, 0x93, 0x27, 0x34, 0x2f, 0x2b, 0xe0,
-       0xe5, 0xb6, 0xa4, 0x2d, 0xbd, 0x98, 0x3b, 0xea, 0xf4, 0xf7, 0x00, 0x8f,
-       0xd3, 0xd7, 0x4b, 0x60, 0x3e, 0x36, 0x64, 0x7d, 0xab, 0xb6, 0xfb, 0x9f,
-       0x89, 0x52, 0x5f, 0xb4, 0xab, 0xb8, 0xe7, 0x09, 0x25, 0x6b, 0x81, 0xec,
-       0x85, 0xf5, 0x7b, 0xc3, 0xef, 0x30, 0xcd, 0xae, 0xac, 0xc6, 0xf9, 0x8c,
-       0xae, 0x66, 0xfd, 0x39, 0xd4, 0x0f, 0x61, 0x4d, 0xbe, 0x3f, 0xa9, 0xe6,
-       0x3b, 0x0f, 0x5e, 0x87, 0xa5, 0xb4, 0x22, 0x8f, 0xf3, 0x90, 0xc7, 0x26,
-       0x91, 0x8e, 0x46, 0xb9, 0xa1, 0xac, 0xbc, 0x1e, 0x65, 0x4c, 0x2e, 0x69,
-       0x19, 0xde, 0x45, 0x88, 0xdd, 0x90, 0x37, 0xbc, 0xe3, 0xf3, 0x46, 0x18,
-       0x90, 0x71, 0x27, 0xdf, 0x5f, 0xf2, 0x18, 0x23, 0x6c, 0x96, 0xa2, 0x1d,
-       0xe0, 0x97, 0x92, 0x47, 0x39, 0xcd, 0x25, 0x23, 0xe2, 0x24, 0x0e, 0xc8,
-       0x9b, 0xe8, 0x3b, 0x9b, 0x8e, 0x4a, 0xe0, 0xa7, 0x4e, 0x80, 0x6e, 0xcb,
-       0xb6, 0xef, 0xbf, 0x04, 0xbf, 0xba, 0x0a, 0xbf, 0x66, 0x09, 0x69, 0xa9,
-       0x86, 0x3d, 0xd0, 0x12, 0xc1, 0x9e, 0x32, 0x7b, 0x25, 0x26, 0x15, 0xd4,
-       0x59, 0xc0, 0xbb, 0xc7, 0x6b, 0x86, 0xcb, 0xbe, 0x6f, 0x61, 0x5d, 0xfb,
-       0xdd, 0xbf, 0xf6, 0x0b, 0xf1, 0xc6, 0xba, 0x06, 0x77, 0x11, 0x33, 0x11,
-       0xf3, 0x10, 0xab, 0xf0, 0x1d, 0xf1, 0xc7, 0x61, 0xcc, 0x85, 0x32, 0xdc,
-       0x26, 0xb1, 0x8c, 0x93, 0x18, 0x11, 0xa3, 0x8b, 0x5f, 0x03, 0xff, 0x8b,
-       0x7e, 0xb3, 0xdb, 0x25, 0xcf, 0x83, 0xd7, 0xcf, 0xd5, 0x0d, 0xef, 0x93,
-       0xe0, 0xbd, 0x53, 0x2c, 0x8a, 0x2f, 0x17, 0x3d, 0x37, 0xf9, 0x39, 0xa4,
-       0xdf, 0xf1, 0x7e, 0x85, 0xb4, 0x78, 0x0a, 0x26, 0x0f, 0x38, 0x1b, 0x7a,
-       0x75, 0xd6, 0xe0, 0xc7, 0x36, 0xe2, 0x7d, 0x4d, 0xc7, 0xab, 0xe8, 0xd3,
-       0xb1, 0x2d, 0x80, 0xa5, 0x3b, 0x51, 0x2f, 0x90, 0x6b, 0x53, 0x76, 0x18,
-       0x75, 0x39, 0x07, 0xfa, 0x62, 0xdf, 0xc5, 0x5e, 0xf2, 0xfd, 0x7b, 0xbd,
-       0xc9, 0x86, 0x3d, 0x31, 0x0f, 0x1e, 0x28, 0xd9, 0x1c, 0x68, 0x17, 0xc6,
-       0xee, 0xa4, 0xbf, 0x43, 0xf9, 0x0a, 0x7c, 0x86, 0x8c, 0x0e, 0xd0, 0x26,
-       0x24, 0x55, 0xdc, 0x8f, 0xb6, 0xe7, 0x39, 0xd0, 0xfe, 0xd3, 0x35, 0xf2,
-       0xa1, 0x55, 0xe9, 0xfe, 0xe7, 0xcb, 0xb4, 0xef, 0x01, 0x46, 0x9b, 0x50,
-       0xb1, 0x5c, 0xda, 0x84, 0x34, 0x78, 0x13, 0xc4, 0xf0, 0x1e, 0x50, 0x6d,
-       0x59, 0x8f, 0x6d, 0x1b, 0xf9, 0xc7, 0x3a, 0x5b, 0x81, 0xaf, 0x28, 0x83,
-       0x6d, 0xc0, 0x25, 0xed, 0x72, 0x20, 0xdd, 0x0c, 0xba, 0x77, 0x28, 0x3c,
-       0x65, 0xb9, 0x1f, 0x86, 0xed, 0x02, 0xa6, 0xb3, 0x1d, 0x6f, 0xd5, 0xf7,
-       0xb8, 0x1d, 0x65, 0x3f, 0x05, 0xfd, 0x59, 0xb6, 0x49, 0xc7, 0xaf, 0x1f,
-       0xc6, 0xfe, 0xab, 0x6c, 0x0d, 0xe2, 0x22, 0xe4, 0x83, 0xd1, 0x03, 0xc6,
-       0xfe, 0xd9, 0x1a, 0x47, 0x92, 0x37, 0x41, 0x0c, 0xc5, 0x52, 0x75, 0x89,
-       0xe7, 0x1b, 0xfd, 0x16, 0xee, 0x3b, 0xdf, 0xbf, 0xe8, 0x29, 0x7b, 0x0a,
-       0x1e, 0xec, 0x86, 0x0d, 0x8b, 0x68, 0x5a, 0xb7, 0x82, 0xd6, 0x81, 0x8d,
-       0x4d, 0x76, 0x40, 0xef, 0xb8, 0x56, 0x53, 0x40, 0x3f, 0x62, 0x85, 0xbf,
-       0x85, 0x1f, 0x4f, 0xff, 0x81, 0x38, 0x81, 0x73, 0x47, 0xbb, 0x05, 0xd6,
-       0xa5, 0x2d, 0x7e, 0x0c, 0x63, 0x84, 0x25, 0xd9, 0xc9, 0xfc, 0x03, 0xba,
-       0x0d, 0x9f, 0x7d, 0xe9, 0xdd, 0xd1, 0x28, 0xcf, 0x83, 0x98, 0x27, 0xd7,
-       0x63, 0xe2, 0x7a, 0x5d, 0x4a, 0x07, 0xac, 0xca, 0x85, 0x99, 0x93, 0x19,
-       0x97, 0x73, 0x4b, 0x48, 0x07, 0xe6, 0x76, 0x37, 0x74, 0xf4, 0x8e, 0x0e,
-       0xf6, 0x69, 0xc6, 0x6e, 0x9c, 0x93, 0xc1, 0x2f, 0x81, 0xdd, 0x8d, 0xba,
-       0xcd, 0xb2, 0xa3, 0x93, 0xb4, 0xeb, 0x52, 0xba, 0x7a, 0x95, 0x1f, 0xb4,
-       0xbf, 0x1c, 0x7b, 0x7d, 0xf9, 0x1d, 0x0d, 0xf3, 0x6a, 0x3c, 0x03, 0x20,
-       0x76, 0xd8, 0x89, 0x77, 0x9c, 0x13, 0x9c, 0xe4, 0xb8, 0x2f, 0x7b, 0x14,
-       0xdd, 0x38, 0xb7, 0xc6, 0x79, 0x10, 0x43, 0x71, 0xce, 0x9c, 0xc3, 0x7a,
-       0x6c, 0xc2, 0xf9, 0xfc, 0x57, 0xcd, 0xc3, 0x4d, 0x7a, 0x5d, 0x06, 0xcb,
-       0xa4, 0xd0, 0xf6, 0x3f, 0x60, 0x0d, 0x7c, 0xe6, 0x3a, 0x8c, 0xcd, 0x4e,
-       0x05, 0xfd, 0xb4, 0x98, 0x78, 0xb0, 0x89, 0x6b, 0x70, 0x5e, 0xdc, 0x33,
-       0x86, 0x4e, 0x1d, 0x9a, 0x47, 0xbb, 0xd7, 0x8d, 0xeb, 0x78, 0x6b, 0xf5,
-       0xc8, 0xed, 0x0d, 0xeb, 0xeb, 0x97, 0xe2, 0x02, 0xe5, 0xe2, 0x36, 0xa4,
-       0x06, 0x13, 0x0c, 0x40, 0xf7, 0xbf, 0x2b, 0x26, 0xe0, 0x59, 0xd5, 0x78,
-       0x01, 0x3e, 0x99, 0xd2, 0xfd, 0x6a, 0x2f, 0xc6, 0x90, 0x87, 0x3e, 0xa9,
-       0xdf, 0x43, 0x19, 0x1b, 0x9f, 0xa8, 0x79, 0xe3, 0x93, 0xb5, 0x81, 0x71,
-       0xe2, 0xa9, 0x40, 0xe6, 0x50, 0xbf, 0x26, 0x13, 0xf0, 0xb3, 0xc7, 0x73,
-       0xaa, 0x9d, 0x8a, 0x31, 0x6c, 0xd0, 0x8f, 0x70, 0x3f, 0x4e, 0x04, 0x63,
-       0xc5, 0xc6, 0xf3, 0xd0, 0x41, 0x0b, 0xb3, 0xb0, 0x4b, 0xae, 0x93, 0xa5,
-       0x5c, 0xee, 0xf7, 0x9c, 0x11, 0x25, 0x7b, 0x71, 0x67, 0x8c, 0xbc, 0xac,
-       0xce, 0xfe, 0xb2, 0x2c, 0xcc, 0xf9, 0x72, 0x17, 0x74, 0xe1, 0x43, 0x90,
-       0x55, 0x39, 0x07, 0x45, 0x78, 0x0e, 0xca, 0xeb, 0x5c, 0x5c, 0xac, 0x53,
-       0x5d, 0x12, 0x3d, 0x96, 0x90, 0xc8, 0x31, 0x62, 0xcb, 0x94, 0x7d, 0x97,
-       0x08, 0xec, 0xd8, 0x8b, 0x1f, 0xb2, 0xc4, 0x19, 0xcc, 0x4a, 0x2a, 0xf9,
-       0x38, 0x6c, 0x6f, 0x15, 0x69, 0x49, 0x52, 0xe9, 0xb3, 0xe8, 0x2b, 0x7a,
-       0x0e, 0x75, 0xd1, 0x6e, 0xd3, 0x52, 0x12, 0xbf, 0x4e, 0x69, 0x59, 0x0a,
-       0xf6, 0x4a, 0xcb, 0xd2, 0x5a, 0xff, 0x7c, 0x68, 0xc5, 0x3f, 0xe7, 0xfb,
-       0xb7, 0x75, 0x5c, 0xe1, 0x8b, 0xfa, 0x8c, 0x81, 0x32, 0x42, 0x7b, 0xa4,
-       0x7c, 0x63, 0xe8, 0xfd, 0x2f, 0xc2, 0xc7, 0x02, 0x0e, 0x2c, 0xc3, 0x97,
-       0xca, 0xf8, 0xf2, 0xac, 0x57, 0xf4, 0x73, 0x03, 0xbe, 0xbc, 0xe6, 0xb9,
-       0xc5, 0x82, 0x38, 0x6f, 0x53, 0xdf, 0xfd, 0x85, 0xf7, 0x4f, 0xe4, 0xfe,
-       0x76, 0xe7, 0xfe, 0x6c, 0xa8, 0xe8, 0xb7, 0xc2, 0xb7, 0xba, 0x31, 0x73,
-       0x58, 0xf6, 0x6f, 0x5f, 0x86, 0x0f, 0x9c, 0xbd, 0x11, 0x38, 0x2b, 0x51,
-       0x50, 0xba, 0xea, 0x75, 0xe5, 0xb7, 0x7d, 0xa2, 0xe7, 0xb0, 0x6c, 0xd9,
-       0xee, 0xd8, 0xd7, 0xc2, 0xc4, 0x40, 0x87, 0x25, 0x0f, 0xfd, 0x9f, 0x0f,
-       0xbb, 0xf6, 0x5e, 0x71, 0x46, 0x1e, 0x11, 0x9e, 0x0d, 0xba, 0xd2, 0x7d,
-       0xcc, 0x4d, 0x7c, 0x32, 0xd4, 0x7b, 0xf0, 0x93, 0xc0, 0xae, 0xdd, 0xe7,
-       0x98, 0xf7, 0x25, 0xb6, 0xdd, 0xc6, 0x73, 0x5c, 0xba, 0x4f, 0x25, 0x25,
-       0x05, 0xba, 0xf4, 0x29, 0x9a, 0xf0, 0x6c, 0x22, 0x21, 0xbd, 0xc7, 0x88,
-       0x49, 0x14, 0x6d, 0xfa, 0x40, 0x9b, 0x34, 0x68, 0x03, 0x9f, 0x66, 0x9b,
-       0x7d, 0x0d, 0xe9, 0x65, 0x49, 0x0d, 0x7e, 0x0f, 0xb4, 0xe9, 0x03, 0x6d,
-       0x7a, 0xcf, 0x25, 0xd1, 0x1e, 0x7d, 0x2c, 0x75, 0x23, 0x6d, 0x91, 0x5f,
-       0xbb, 0xbe, 0x13, 0xcf, 0xae, 0xa4, 0x8e, 0xc5, 0x30, 0x46, 0x48, 0xf6,
-       0xf4, 0x14, 0x65, 0x78, 0x3b, 0x30, 0x74, 0xfc, 0xb0, 0x5c, 0x81, 0x1d,
-       0x2a, 0xc3, 0x7f, 0x7b, 0x76, 0xd0, 0x19, 0x5b, 0x86, 0x2e, 0xad, 0xdf,
-       0xed, 0xcb, 0x37, 0xb6, 0x7f, 0xd3, 0x4f, 0x5c, 0xef, 0xdc, 0x2f, 0xa1,
-       0x01, 0x99, 0x2e, 0x2b, 0xfb, 0x90, 0xc8, 0x85, 0x15, 0xd6, 0xc1, 0x1a,
-       0x8b, 0xb0, 0x31, 0x3c, 0xf3, 0x74, 0xa1, 0xeb, 0x1f, 0x91, 0x87, 0x2a,
-       0x53, 0xf8, 0x01, 0x77, 0xcf, 0xb0, 0xee, 0x41, 0xe0, 0xed, 0x87, 0xe5,
-       0xc0, 0x0c, 0xb0, 0x58, 0x06, 0xf3, 0x1e, 0x70, 0x81, 0xcb, 0x33, 0xcd,
-       0xd2, 0x86, 0x32, 0xd0, 0x76, 0xac, 0xbe, 0x1e, 0xd7, 0x2e, 0x83, 0x0f,
-       0x83, 0xf2, 0x27, 0xf5, 0x01, 0xf9, 0x4a, 0xbd, 0x5f, 0xbe, 0x04, 0xdb,
-       0xf2, 0x5c, 0xbd, 0x0b, 0x7b, 0x25, 0x01, 0x9e, 0x64, 0xc0, 0x1f, 0x4f,
-       0xbe, 0x5c, 0x4f, 0xcb, 0x17, 0x41, 0xab, 0xe7, 0xf1, 0x1b, 0x2e, 0xa7,
-       0x65, 0x4f, 0xb9, 0x5f, 0xf3, 0x88, 0xfc, 0x71, 0x31, 0x1f, 0x17, 0x6b,
-       0x77, 0x9e, 0x29, 0x62, 0xff, 0x2d, 0xd4, 0xdd, 0xb7, 0xaa, 0x34, 0xb2,
-       0x6d, 0xb6, 0x9c, 0x59, 0xb1, 0x2f, 0x45, 0xdf, 0x76, 0x9d, 0xa3, 0x13,
-       0xe0, 0x43, 0x15, 0xfb, 0x74, 0x4c, 0xd1, 0x7e, 0xd5, 0xf6, 0x54, 0x03,
-       0xdb, 0x63, 0xd6, 0x37, 0x5b, 0x90, 0xef, 0x48, 0xee, 0xc4, 0xb4, 0xec,
-       0x3f, 0xe9, 0xcb, 0x6f, 0x7a, 0x3e, 0xe4, 0x98, 0xba, 0x78, 0x80, 0x3a,
-       0x3e, 0x39, 0x11, 0xb6, 0x94, 0x9f, 0x1b, 0x60, 0x8d, 0xef, 0x75, 0x60,
-       0xcf, 0xa6, 0xb3, 0xd6, 0x94, 0xa4, 0x4e, 0x4c, 0x49, 0xf7, 0x09, 0xc8,
-       0x82, 0xc7, 0xbe, 0x96, 0x6d, 0xeb, 0x1d, 0xf2, 0xc0, 0x71, 0x9c, 0xc1,
-       0xbc, 0xb8, 0xf6, 0x5b, 0x92, 0xc6, 0xf8, 0x87, 0xa4, 0x07, 0x6d, 0x5c,
-       0xb4, 0xb9, 0xa6, 0xc6, 0x6e, 0xc5, 0xd8, 0xcd, 0x72, 0x24, 0xee, 0x40,
-       0xd6, 0x68, 0xc3, 0xff, 0xaf, 0xe4, 0xaa, 0x4c, 0x7f, 0x24, 0xb9, 0x33,
-       0x6f, 0x37, 0x4b, 0x0b, 0x9f, 0xa1, 0x1a, 0xe6, 0x59, 0xde, 0x8d, 0x94,
-       0xe5, 0xae, 0x58, 0xc7, 0x7f, 0x22, 0xb9, 0xf3, 0x1c, 0xfb, 0x2d, 0x94,
-       0x7f, 0x43, 0x72, 0xc7, 0x7f, 0x8a, 0xfc, 0x15, 0xa4, 0x6f, 0x23, 0x1d,
-       0x93, 0xee, 0xe3, 0xf0, 0x91, 0xcf, 0x7f, 0x1b, 0x79, 0xf8, 0x74, 0xe7,
-       0x8f, 0xa0, 0xde, 0x6e, 0xcc, 0xef, 0xde, 0x18, 0xb0, 0x06, 0x74, 0x5e,
-       0xec, 0xba, 0x60, 0xfe, 0x2c, 0x67, 0x19, 0xdf, 0x1d, 0x81, 0x4e, 0xfb,
-       0x1f, 0xd0, 0x69, 0xfa, 0x79, 0x81, 0x79, 0xea, 0x36, 0x3e, 0x4f, 0x81,
-       0x26, 0x87, 0x90, 0xf7, 0xe5, 0x61, 0x8f, 0xf6, 0x66, 0xa7, 0x8c, 0xdb,
-       0x45, 0xbf, 0x05, 0xb8, 0xa2, 0x15, 0xfb, 0x60, 0x6a, 0xc7, 0xc6, 0xfb,
-       0xe0, 0x68, 0xef, 0x61, 0xd9, 0xb4, 0xdd, 0xac, 0xdf, 0xac, 0xd7, 0xb5,
-       0x7f, 0xa8, 0xe8, 0xe0, 0x14, 0x3f, 0x29, 0x5c, 0x87, 0x9b, 0x78, 0xd2,
-       0xea, 0xbd, 0xff, 0x21, 0xec, 0x03, 0xeb, 0x3c, 0xf3, 0xc1, 0x3e, 0xb0,
-       0xce, 0x43, 0x37, 0xcc, 0xc3, 0x47, 0x9b, 0xef, 0x92, 0xe6, 0xe3, 0xab,
-       0xfb, 0xa0, 0xe9, 0xf8, 0xcf, 0xdf, 0x07, 0xcd, 0xe7, 0x51, 0xef, 0x3c,
-       0x69, 0x86, 0x3e, 0xce, 0x90, 0x66, 0x9d, 0x48, 0x1f, 0xc1, 0x5a, 0x39,
-       0xf7, 0x66, 0xcc, 0x3d, 0xc0, 0x45, 0x1f, 0x82, 0xbc, 0x7f, 0x62, 0xfb,
-       0x21, 0x5d, 0xfe, 0x9f, 0xfd, 0x91, 0xb8, 0x53, 0x91, 0x10, 0x69, 0x8a,
-       0xba, 0x55, 0xd2, 0xf0, 0x79, 0xd0, 0xe6, 0xa0, 0x74, 0x93, 0x7e, 0xd5,
-       0xbd, 0xc8, 0x17, 0xfd, 0x28, 0x7d, 0x74, 0x45, 0x4f, 0xe0, 0xa4, 0x01,
-       0x96, 0xbf, 0x0a, 0x99, 0x21, 0xc6, 0x7c, 0x5d, 0xf6, 0xcf, 0xf8, 0x32,
-       0xee, 0x71, 0xfd, 0x6f, 0x62, 0xfd, 0xd9, 0xed, 0x71, 0x59, 0x4e, 0xc6,
-       0x41, 0x93, 0x05, 0xe8, 0xf6, 0x2b, 0x12, 0xd0, 0x81, 0x31, 0xe7, 0x3d,
-       0xe2, 0x26, 0x86, 0xc5, 0x4d, 0x7f, 0x0f, 0x74, 0x18, 0x86, 0xec, 0xe7,
-       0xeb, 0x94, 0x9d, 0x57, 0x64, 0x08, 0x32, 0xf1, 0x86, 0xe7, 0xa4, 0x81,
-       0x85, 0xa0, 0x2f, 0x28, 0x17, 0x94, 0x89, 0x36, 0xa5, 0x93, 0xe6, 0x3d,
-       0xe7, 0xa9, 0xaa, 0xdc, 0x2a, 0xf3, 0x0a, 0x9b, 0xe2, 0xdd, 0x71, 0x65,
-       0x2f, 0xd2, 0x13, 0x56, 0x0f, 0x74, 0x74, 0x5a, 0xec, 0xde, 0x9b, 0x9b,
-       0xcd, 0x3d, 0x85, 0xc2, 0x89, 0x90, 0x4c, 0xf5, 0x92, 0x57, 0xec, 0x17,
-       0xf9, 0x6a, 0xd1, 0x8f, 0xb8, 0x6f, 0xf9, 0xa7, 0x3b, 0x93, 0xf2, 0xe9,
-       0xde, 0x15, 0xb9, 0xac, 0x88, 0x04, 0xfb, 0x62, 0x48, 0xf1, 0xc3, 0xcc,
-       0xdb, 0xac, 0xc5, 0xbc, 0xeb, 0x6f, 0x78, 0xc7, 0xb5, 0x50, 0xd6, 0x57,
-       0xf6, 0x4e, 0xf2, 0x9d, 0x73, 0xfd, 0x5d, 0xd0, 0xcc, 0x79, 0xaa, 0x24,
-       0xaf, 0x41, 0xf6, 0x40, 0xc3, 0xf3, 0x4c, 0x49, 0xc3, 0x29, 0xc8, 0xfd,
-       0xab, 0xb2, 0xe7, 0x04, 0xf7, 0xcc, 0xab, 0x58, 0xab, 0xd2, 0x25, 0xd0,
-       0x11, 0xec, 0xcf, 0x97, 0x69, 0x8f, 0xb1, 0x92, 0x5b, 0x13, 0x93, 0xf0,
-       0xe1, 0x26, 0x6c, 0x5f, 0x96, 0xbc, 0xa2, 0x2c, 0x0d, 0xa2, 0x4d, 0xf5,
-       0x11, 0xfc, 0xda, 0xf4, 0xda, 0x3e, 0x0b, 0xba, 0x3b, 0xc9, 0x8a, 0xf5,
-       0x19, 0xd0, 0xfd, 0x61, 0x49, 0x1d, 0x5f, 0xd1, 0x35, 0x90, 0xbb, 0x40,
-       0xd7, 0xa4, 0xce, 0xdb, 0x52, 0x2d, 0xbb, 0xf2, 0x71, 0xea, 0x90, 0x32,
-       0xd7, 0x05, 0x1d, 0xc3, 0xf3, 0xdb, 0x32, 0xf4, 0x4c, 0x19, 0x3a, 0x05,
-       0x3a, 0xe4, 0x4b, 0x28, 0xff, 0x22, 0xea, 0x3c, 0x0f, 0x9f, 0xe7, 0x39,
-       0x60, 0xbf, 0x8b, 0xc0, 0x14, 0x17, 0xca, 0x59, 0xed, 0x1b, 0xaa, 0xf5,
-       0xc2, 0x66, 0x29, 0x7f, 0x45, 0xaa, 0x15, 0xd2, 0xe3, 0x27, 0x8a, 0xb7,
-       0x39, 0x6f, 0x2b, 0x71, 0x16, 0x66, 0x26, 0x52, 0xa9, 0x18, 0x9a, 0x50,
-       0xf7, 0x31, 0xf6, 0x6f, 0x74, 0x65, 0xeb, 0x3a, 0x5d, 0x29, 0xf2, 0x62,
-       0x2d, 0xc0, 0x93, 0xc4, 0xc7, 0xa5, 0x99, 0xe4, 0xca, 0x19, 0x59, 0x09,
-       0x76, 0xf3, 0x32, 0xfc, 0x92, 0x58, 0xe6, 0x5b, 0x12, 0x3b, 0xe5, 0xfb,
-       0xdf, 0x87, 0xdd, 0x2c, 0x82, 0x27, 0x56, 0x08, 0xe5, 0x8b, 0x7c, 0x47,
-       0xb9, 0xa7, 0x6c, 0x87, 0x18, 0x2b, 0x97, 0x97, 0x51, 0x56, 0x55, 0x3e,
-       0xd3, 0xb7, 0x31, 0x1f, 0x3d, 0x3f, 0x55, 0xc6, 0x7a, 0xcd, 0x92, 0x1f,
-       0x4f, 0xcb, 0xe3, 0xe5, 0x6d, 0x76, 0x33, 0xda, 0x57, 0x16, 0xd9, 0xc6,
-       0x19, 0xe4, 0x95, 0x9d, 0x97, 0x17, 0x59, 0xde, 0x25, 0x57, 0x66, 0x32,
-       0x6a, 0x0e, 0xd5, 0xb9, 0x8c, 0x04, 0x31, 0x49, 0xea, 0x2b, 0xce, 0x15,
-       0x79, 0xfa, 0x96, 0x65, 0xda, 0xd9, 0x88, 0x14, 0x13, 0xa4, 0x75, 0x42,
-       0x2e, 0xcf, 0xc4, 0x37, 0x31, 0x86, 0x93, 0x73, 0xf9, 0x6c, 0x62, 0x07,
-       0xf6, 0xfb, 0x88, 0x1d, 0x30, 0x5e, 0x10, 0x81, 0x2d, 0x53, 0x31, 0x04,
-       0xa4, 0xc9, 0x06, 0x9f, 0x95, 0xef, 0x03, 0x6c, 0xb4, 0x8a, 0x1f, 0x89,
-       0x27, 0xb9, 0x5e, 0xa7, 0xb8, 0x0c, 0xfd, 0xd1, 0x91, 0x79, 0x49, 0xee,
-       0x99, 0x0f, 0xd6, 0x67, 0x9d, 0x11, 0xde, 0xd3, 0x90, 0x6b, 0x73, 0x8e,
-       0x77, 0x15, 0x98, 0x22, 0x1f, 0xf7, 0xc0, 0xaf, 0x3f, 0x8b, 0x41, 0x7f,
-       0x0d, 0x66, 0xad, 0x3d, 0x9b, 0x02, 0x7c, 0x16, 0x91, 0xa9, 0x19, 0x9e,
-       0xa9, 0x41, 0xb7, 0x01, 0x43, 0xfe, 0xf3, 0x08, 0x9e, 0x6b, 0xcc, 0xc3,
-       0x4f, 0x0b, 0x7c, 0x50, 0x3c, 0x07, 0xfd, 0x91, 0xe6, 0xd6, 0x3c, 0xd7,
-       0x1e, 0x92, 0x7b, 0x80, 0x4e, 0x04, 0xfd, 0x77, 0xeb, 0xb1, 0xba, 0xcf,
-       0xa4, 0x19, 0xc3, 0x93, 0x14, 0xf4, 0x45, 0x6e, 0x2e, 0x82, 0xb1, 0xba,
-       0x34, 0x36, 0xe7, 0xbb, 0xf5, 0xd8, 0xd3, 0xf8, 0x78, 0x69, 0x79, 0xa2,
-       0x6c, 0xb0, 0x5e, 0x1a, 0x36, 0x56, 0x22, 0x23, 0x7d, 0xbe, 0x7c, 0xdf,
-       0x23, 0xbd, 0xfa, 0x91, 0xf7, 0xe4, 0x68, 0xfd, 0xdd, 0xce, 0xce, 0x1a,
-       0xff, 0x5a, 0x31, 0x47, 0xfe, 0x30, 0x3f, 0xe0, 0x23, 0xce, 0xdd, 0x82,
-       0x3d, 0x2f, 0x01, 0x77, 0x59, 0xe7, 0xba, 0xd4, 0x3b, 0x0b, 0xd8, 0xa0,
-       0x3a, 0x03, 0xdd, 0x78, 0x8e, 0xe7, 0x89, 0xd0, 0x6d, 0xe7, 0xa2, 0x52,
-       0x9a, 0xa5, 0x5c, 0x4a, 0x87, 0x05, 0x7e, 0xb1, 0x7e, 0x75, 0xa6, 0x0b,
-       0x69, 0x2b, 0xd2, 0xa4, 0xea, 0xa7, 0x3a, 0xe3, 0xaa, 0xf6, 0xd5, 0x99,
-       0xb4, 0x6a, 0x57, 0x9d, 0xe9, 0x47, 0xea, 0x49, 0xd3, 0x39, 0x38, 0x4e,
-       0xe7, 0x7a, 0x65, 0xea, 0x34, 0xec, 0xcb, 0x80, 0xa5, 0xce, 0xe2, 0x27,
-       0x60, 0x7f, 0x22, 0xf0, 0xb2, 0xae, 0xda, 0x83, 0xc0, 0x58, 0x3b, 0x81,
-       0x41, 0x76, 0x8a, 0x7b, 0x8a, 0xeb, 0xa7, 0xee, 0xbd, 0xcc, 0x78, 0x52,
-       0xe2, 0x41, 0xc9, 0xca, 0x81, 0xd9, 0x66, 0xec, 0xd7, 0x88, 0x5d, 0x92,
-       0x1e, 0x7b, 0x18, 0xf9, 0x42, 0x85, 0x74, 0xbb, 0x4f, 0xf9, 0x6e, 0x39,
-       0xef, 0x1c, 0x78, 0x92, 0xc1, 0x18, 0xef, 0xa7, 0x7d, 0x1f, 0xe4, 0xcf,
-       0xd5, 0x7d, 0x64, 0x30, 0x9f, 0x46, 0x7a, 0xf0, 0x1c, 0x31, 0xfb, 0x73,
-       0xce, 0x11, 0x29, 0xd7, 0xa4, 0xef, 0x7d, 0x72, 0xd9, 0xcd, 0xc8, 0xcb,
-       0x6e, 0x5a, 0xae, 0xb8, 0x3b, 0xe4, 0xeb, 0xb0, 0xd3, 0x2f, 0xb9, 0x7d,
-       0x9b, 0x88, 0x05, 0xaa, 0xea, 0x6c, 0xc6, 0xf0, 0xca, 0xd5, 0xf1, 0xc4,
-       0x1f, 0xc8, 0xd2, 0x0c, 0xb1, 0xb3, 0xbf, 0x7b, 0xbf, 0x57, 0xa4, 0xdd,
-       0xc2, 0x1c, 0x88, 0xd5, 0x8a, 0xb0, 0x7f, 0x87, 0x65, 0xd8, 0xa3, 0xdd,
-       0x53, 0x36, 0x2a, 0x31, 0x1c, 0xec, 0x67, 0xaf, 0x00, 0xbd, 0x7a, 0x79,
-       0x16, 0xfb, 0x49, 0x28, 0xff, 0x78, 0xae, 0x90, 0xef, 0xae, 0x3c, 0x59,
-       0xe6, 0x3a, 0x4b, 0xd7, 0xb5, 0x48, 0x58, 0x46, 0x14, 0x5e, 0x68, 0x93,
-       0x17, 0x17, 0x37, 0x8b, 0x05, 0x0b, 0x65, 0xdd, 0x12, 0x55, 0xb7, 0x18,
-       0xe8, 0x7f, 0x4b, 0x3b, 0xef, 0x22, 0xbd, 0x05, 0xda, 0x30, 0x16, 0x80,
-       0xb5, 0xb5, 0x73, 0x25, 0x26, 0xdf, 0x8f, 0xfd, 0xf5, 0x96, 0xda, 0x6b,
-       0x79, 0x37, 0x8e, 0x67, 0xa6, 0xdc, 0x73, 0x8c, 0x3b, 0x85, 0x75, 0xfc,
-       0xf7, 0xaf, 0xd4, 0xfb, 0x66, 0x77, 0x17, 0x70, 0x1d, 0xe5, 0x15, 0xe9,
-       0x52, 0x30, 0x6e, 0x1e, 0x38, 0xae, 0xd0, 0xcf, 0x3b, 0x14, 0x4e, 0xba,
-       0x88, 0xbd, 0x30, 0xa1, 0xea, 0xef, 0xc4, 0x7e, 0xda, 0xd4, 0x42, 0xfc,
-       0xb0, 0x07, 0xb2, 0xf8, 0xd2, 0x0c, 0x9f, 0xf9, 0x9e, 0xfe, 0x15, 0xe3,
-       0x6b, 0x17, 0x46, 0xa7, 0xdd, 0xdf, 0xd2, 0xfb, 0x47, 0x42, 0x77, 0xf5,
-       0x01, 0x87, 0x1e, 0x6b, 0xc2, 0x5a, 0x9c, 0x64, 0x32, 0x64, 0x75, 0x5a,
-       0xc0, 0xf1, 0xc3, 0xca, 0xe6, 0xf6, 0x61, 0xfe, 0x69, 0x39, 0x93, 0x6e,
-       0x93, 0xaa, 0xed, 0xaa, 0x3b, 0x57, 0xcb, 0xf6, 0x76, 0x62, 0x7d, 0xfc,
-       0x36, 0xa1, 0xac, 0x07, 0x69, 0x33, 0xd2, 0xdb, 0xa4, 0x74, 0xb2, 0xaf,
-       0x25, 0xe8, 0x2f, 0xba, 0x2e, 0xff, 0x75, 0x3d, 0xce, 0x5f, 0x6a, 0x7f,
-       0x8a, 0xe3, 0x44, 0xc5, 0xfd, 0x7c, 0xab, 0xf4, 0x1c, 0xb3, 0x81, 0x6d,
-       0x13, 0xc0, 0xba, 0x5d, 0x92, 0x3e, 0x96, 0x94, 0x5b, 0x8e, 0x99, 0x38,
-       0xd1, 0x97, 0x47, 0x53, 0x2a, 0x66, 0xf8, 0xa5, 0x51, 0xb7, 0xa2, 0xce,
-       0x53, 0xf5, 0xdd, 0xb0, 0x65, 0x7d, 0x67, 0xec, 0x1b, 0xa3, 0x7d, 0x2a,
-       0xfd, 0xf6, 0x68, 0x5a, 0xa5, 0xaf, 0x8c, 0xde, 0x52, 0x0b, 0xfc, 0xa3,
-       0xd2, 0x42, 0x5a, 0x3e, 0x57, 0x26, 0xbe, 0x1c, 0x00, 0x76, 0xf4, 0xa0,
-       0x67, 0xfa, 0xa1, 0x67, 0xd2, 0xd0, 0x33, 0x83, 0xd4, 0x33, 0xd0, 0xdb,
-       0xaf, 0x40, 0x6f, 0x7b, 0xf2, 0x06, 0xe4, 0xf5, 0x82, 0xd7, 0x0c, 0x5c,
-       0xe8, 0xfb, 0xc1, 0x5a, 0x9d, 0xa7, 0x96, 0xc1, 0xdf, 0xea, 0x59, 0x89,
-       0xb5, 0x43, 0x07, 0x6d, 0x9f, 0x6f, 0x92, 0x85, 0xb8, 0xef, 0x9f, 0xf0,
-       0x5c, 0xb9, 0x86, 0xfa, 0x39, 0x97, 0xfb, 0x78, 0xa2, 0x85, 0xfe, 0xd8,
-       0xb5, 0x99, 0x1d, 0xd0, 0x49, 0x94, 0xf7, 0x98, 0x54, 0xc7, 0x13, 0xb2,
-       0x08, 0xff, 0x6c, 0xb5, 0x4e, 0x1a, 0xcf, 0xdc, 0xff, 0xff, 0x12, 0x75,
-       0xd3, 0xb0, 0x0f, 0xb6, 0x2c, 0xf5, 0x25, 0xe5, 0x4c, 0x9f, 0x33, 0x98,
-       0xb4, 0xa8, 0xbb, 0x92, 0x52, 0x81, 0xaf, 0x5f, 0x2d, 0xb3, 0x3e, 0xeb,
-       0x61, 0x7f, 0x96, 0x83, 0x76, 0xd3, 0x65, 0xa3, 0x27, 0x20, 0x9f, 0x73,
-       0x8c, 0x03, 0x06, 0x36, 0xc0, 0xb2, 0x9a, 0x21, 0x07, 0x1e, 0xe8, 0x3f,
-       0x8e, 0xf2, 0x01, 0xde, 0x25, 0x40, 0x19, 0xb1, 0x50, 0x49, 0xf1, 0x38,
-       0xef, 0x8d, 0xa3, 0x8c, 0x6d, 0x9c, 0x44, 0x0a, 0xe5, 0x63, 0x92, 0x4a,
-       0x14, 0xd4, 0xbd, 0xa6, 0x4e, 0x94, 0xb1, 0x8f, 0xb0, 0x8e, 0xc7, 0xcc,
-       0xb6, 0x50, 0x8e, 0xc2, 0xae, 0x29, 0xdf, 0xa6, 0x62, 0x03, 0x59, 0xdb,
-       0xc3, 0x7e, 0x60, 0x59, 0xca, 0x66, 0xbb, 0xbc, 0xe7, 0x29, 0x5d, 0x78,
-       0xaf, 0x3e, 0xb7, 0xb8, 0xa7, 0xd6, 0x2a, 0xf9, 0x5a, 0xd3, 0x7b, 0xe8,
-       0x7f, 0xb3, 0x27, 0x2f, 0x27, 0x6c, 0xe1, 0x19, 0x7b, 0xb0, 0xcf, 0x23,
-       0x3b, 0xb8, 0x27, 0x40, 0x77, 0xd8, 0xdf, 0xe7, 0xb1, 0xde, 0xe7, 0x60,
-       0x7f, 0x2f, 0xc2, 0xfe, 0x5e, 0x28, 0xaf, 0xea, 0x8f, 0xc0, 0xee, 0x52,
-       0x07, 0x3c, 0x03, 0x9e, 0x8d, 0x01, 0xf7, 0xef, 0x85, 0x3f, 0x30, 0x02,
-       0xec, 0x3f, 0x04, 0xfe, 0x65, 0xc0, 0xbb, 0x71, 0xde, 0x45, 0x01, 0x1f,
-       0x07, 0xd5, 0x59, 0xe6, 0xac, 0x3a, 0xcf, 0xff, 0x81, 0xb2, 0xbd, 0x8f,
-       0x97, 0x2d, 0xd8, 0x87, 0xa2, 0x7f, 0x9d, 0xeb, 0x00, 0xff, 0xad, 0xec,
-       0xe7, 0xc1, 0x17, 0xa1, 0x57, 0x7e, 0x8c, 0x79, 0x3d, 0x37, 0x4b, 0x7b,
-       0x8e, 0x3a, 0x01, 0xde, 0xf6, 0x18, 0xeb, 0xc2, 0x7e, 0x3e, 0x7a, 0x59,
-       0x96, 0x81, 0x3b, 0xb2, 0x94, 0x63, 0xf8, 0x0f, 0xce, 0x85, 0x8a, 0xf4,
-       0x52, 0x07, 0x02, 0x13, 0x0d, 0xca, 0xc0, 0xf1, 0x04, 0xb0, 0x1e, 0x90,
-       0xbc, 0x3a, 0xaf, 0xc3, 0xf3, 0xf9, 0x2d, 0x62, 0x11, 0xef, 0x79, 0x3c,
-       0x9b, 0xa1, 0xde, 0x30, 0x18, 0x69, 0x79, 0xb0, 0x43, 0xb2, 0xdb, 0x3b,
-       0x94, 0xee, 0x70, 0xbc, 0x97, 0x31, 0xee, 0x1e, 0xb8, 0x20, 0x6f, 0x00,
-       0x21, 0x58, 0x99, 0x43, 0xf2, 0xbf, 0x3c, 0xc6, 0xa8, 0x02, 0xdf, 0x0f,
-       0x73, 0x89, 0x81, 0x66, 0x9b, 0xf6, 0xbb, 0x76, 0x6c, 0x4f, 0x9d, 0xfd,
-       0xc7, 0x14, 0xc6, 0xca, 0x0b, 0xfb, 0x87, 0x9d, 0xc0, 0x98, 0xa9, 0xe3,
-       0x94, 0xfd, 0x6d, 0xe0, 0xdb, 0x3f, 0x05, 0x06, 0x22, 0x55, 0x87, 0x36,
-       0x07, 0xfb, 0x85, 0xf3, 0x5f, 0x26, 0x9e, 0x60, 0x4c, 0x3d, 0xf0, 0xcb,
-       0x57, 0xe6, 0xb6, 0x13, 0xf6, 0xeb, 0xb6, 0xcd, 0x94, 0x81, 0x71, 0x0f,
-       0x7e, 0xdf, 0xf1, 0xc0, 0x5e, 0x77, 0x9f, 0x47, 0xab, 0x13, 0xd2, 0xc9,
-       0xd3, 0x4e, 0x4b, 0x6e, 0x91, 0x8f, 0x44, 0x82, 0x7e, 0xac, 0x79, 0x1b,
-       0xb2, 0x4a, 0x3d, 0xd0, 0x09, 0x39, 0x67, 0x9e, 0x3a, 0x85, 0x3a, 0x81,
-       0xb2, 0xe0, 0x4a, 0xa9, 0x0e, 0x9d, 0xd0, 0xd6, 0x25, 0x15, 0xd2, 0x6c,
-       0x9e, 0x7a, 0xe2, 0x07, 0x32, 0xbd, 0x4e, 0x57, 0x0e, 0x89, 0xf1, 0x6b,
-       0x5b, 0x25, 0x9a, 0x71, 0xed, 0x7b, 0xd5, 0x1a, 0x03, 0x7d, 0x79, 0x80,
-       0xf8, 0x73, 0x36, 0xeb, 0x74, 0x88, 0xc6, 0x9e, 0x0a, 0x3f, 0xbd, 0x89,
-       0xb5, 0xb2, 0x0f, 0x45, 0xa7, 0xc1, 0xa1, 0xc0, 0x17, 0x50, 0x31, 0x3f,
-       0xe0, 0xe0, 0xc4, 0x8f, 0xa1, 0x6b, 0xf3, 0xc4, 0x25, 0xa0, 0x73, 0xf7,
-       0x09, 0xca, 0xd1, 0x75, 0xea, 0x6c, 0xbc, 0x62, 0xa5, 0xa9, 0xaf, 0x65,
-       0xf1, 0x38, 0x30, 0x97, 0xb5, 0x4b, 0x0a, 0x94, 0x57, 0x9e, 0x7d, 0x2f,
-       0x5a, 0x32, 0x3d, 0xd7, 0x26, 0x3d, 0xf3, 0x8c, 0xaf, 0xee, 0x6e, 0x91,
-       0x36, 0xc6, 0x58, 0x69, 0x83, 0x06, 0x24, 0x8f, 0xf2, 0xee, 0xf9, 0xb0,
-       0x8a, 0x87, 0x55, 0x2c, 0xd2, 0xa8, 0x1f, 0xfa, 0xc0, 0x49, 0x2f, 0x5b,
-       0xff, 0x25, 0x16, 0x60, 0x48, 0xc8, 0x52, 0x19, 0x32, 0x56, 0x86, 0x8c,
-       0x95, 0x21, 0x63, 0x65, 0xc8, 0x18, 0xb0, 0xdf, 0x73, 0xd8, 0x7f, 0x17,
-       0xcb, 0x83, 0xda, 0xae, 0xdf, 0xaf, 0xec, 0xfa, 0x91, 0x32, 0xcf, 0xf0,
-       0xe9, 0x83, 0x26, 0x95, 0x0e, 0xb9, 0xa4, 0x7c, 0x51, 0xe3, 0xa3, 0xbe,
-       0x22, 0xcf, 0xcc, 0xbe, 0x2a, 0x67, 0x66, 0x57, 0x71, 0xe0, 0x54, 0xd9,
-       0x97, 0x97, 0x3d, 0xf8, 0x9f, 0x0b, 0xc4, 0x54, 0xd9, 0xf6, 0x66, 0x85,
-       0xad, 0x0e, 0x4b, 0x41, 0xe1, 0x64, 0x65, 0x47, 0x80, 0xaf, 0x14, 0x2e,
-       0xe4, 0xde, 0x94, 0x8e, 0xed, 0xaf, 0xc9, 0x45, 0xd8, 0xf1, 0xc5, 0xfa,
-       0xeb, 0xf2, 0xbc, 0xc2, 0xe3, 0xa4, 0xc3, 0x07, 0xe4, 0x47, 0x76, 0x70,
-       0x4e, 0x7c, 0x06, 0x58, 0x63, 0xb1, 0x8f, 0xba, 0x23, 0x02, 0x5b, 0xe0,
-       0x14, 0xbb, 0xb1, 0xaf, 0x0f, 0x5a, 0x37, 0x00, 0xd3, 0xf0, 0xfd, 0x16,
-       0x79, 0x71, 0xb6, 0xd8, 0x20, 0x13, 0xd4, 0x0f, 0xce, 0x51, 0xb1, 0x68,
-       0xa7, 0x68, 0x37, 0xb9, 0x5e, 0xda, 0xa9, 0x3f, 0xd8, 0xcc, 0xb3, 0xd4,
-       0xea, 0xc9, 0x73, 0x2d, 0x8c, 0x37, 0xc6, 0x5d, 0xd2, 0xf4, 0x35, 0x39,
-       0x58, 0x63, 0xd9, 0xab, 0xe0, 0x0f, 0xd3, 0xef, 0xf9, 0xf7, 0xc4, 0x39,
-       0x1e, 0xfb, 0x05, 0x6e, 0xea, 0xc4, 0x5a, 0xcb, 0x7f, 0xa9, 0x63, 0x5e,
-       0xfd, 0x0a, 0x47, 0xbf, 0x13, 0x2f, 0x9b, 0x7b, 0x0d, 0xaf, 0xa9, 0x78,
-       0xe0, 0x06, 0x71, 0xe2, 0xa7, 0xb0, 0xaf, 0x8a, 0x57, 0x85, 0x31, 0x4b,
-       0xc6, 0x73, 0x19, 0x2b, 0x6e, 0xd4, 0x18, 0xea, 0xbc, 0x54, 0xee, 0x86,
-       0x7e, 0xb9, 0x07, 0xfa, 0xe5, 0xde, 0x77, 0xdc, 0xaf, 0x35, 0x71, 0xfb,
-       0x9e, 0x62, 0xd8, 0xea, 0x92, 0xb1, 0x5a, 0x63, 0x5b, 0xc6, 0x71, 0x37,
-       0x8a, 0xdb, 0x32, 0xa6, 0x9b, 0x5e, 0x17, 0x0b, 0xa4, 0x6c, 0xf8, 0xf2,
-       0x92, 0xc7, 0xb8, 0x9b, 0xb9, 0x9b, 0xbd, 0x11, 0xfe, 0xfa, 0xc3, 0xcd,
-       0x26, 0xe6, 0x1c, 0xc9, 0x5c, 0x15, 0xde, 0xd1, 0x2e, 0xcd, 0x10, 0x0f,
-       0xa8, 0xb3, 0x40, 0x15, 0xbb, 0xce, 0x07, 0xf1, 0x03, 0x94, 0xc3, 0xea,
-       0xc2, 0xdf, 0x61, 0xec, 0xda, 0xde, 0xe1, 0xd8, 0x63, 0xe1, 0xe0, 0xae,
-       0x1f, 0xf7, 0x72, 0xa0, 0xcb, 0x20, 0x8b, 0xf5, 0xd5, 0x3b, 0x74, 0x43,
-       0x4a, 0x5f, 0x5c, 0xc5, 0x1e, 0x20, 0xbf, 0xe0, 0x2f, 0x60, 0x9f, 0x4c,
-       0x41, 0x3f, 0x15, 0x54, 0x7f, 0x31, 0xca, 0x45, 0x36, 0x17, 0xb6, 0x24,
-       0x7a, 0x8a, 0xbe, 0x50, 0x10, 0x6b, 0xc9, 0x87, 0x1d, 0xa5, 0xbf, 0x31,
-       0x77, 0xe0, 0x33, 0xee, 0xcf, 0xe4, 0x44, 0x73, 0xa6, 0x09, 0x76, 0x15,
-       0xfc, 0xab, 0x33, 0x26, 0x80, 0xbd, 0xbb, 0xf4, 0x5d, 0x39, 0x30, 0x77,
-       0x69, 0x73, 0x20, 0xff, 0x8c, 0x23, 0x73, 0x7d, 0x66, 0x0e, 0x6b, 0xfb,
-       0xb6, 0x4e, 0x49, 0xac, 0x05, 0x36, 0xed, 0xa3, 0xa7, 0x88, 0x07, 0x9a,
-       0x65, 0x39, 0xce, 0x7e, 0x83, 0x3d, 0x33, 0x5d, 0x66, 0xdf, 0xdf, 0x95,
-       0xe1, 0xb9, 0x74, 0x2b, 0xf5, 0xc8, 0x12, 0xf4, 0xc0, 0x65, 0x9b, 0x36,
-       0x74, 0x1c, 0x36, 0xae, 0x53, 0xde, 0x9c, 0xa3, 0x7d, 0x4c, 0xd9, 0x67,
-       0x64, 0x5b, 0xe2, 0x0c, 0xe6, 0xf4, 0x84, 0x17, 0xa1, 0x8f, 0xe6, 0x0f,
-       0xa1, 0xec, 0xeb, 0x92, 0xb2, 0xbb, 0x43, 0x7c, 0xde, 0x66, 0x3f, 0x29,
-       0xbc, 0x6f, 0x90, 0xb2, 0x6f, 0x0d, 0x51, 0x8e, 0xe0, 0x73, 0x2f, 0xad,
-       0xce, 0xf3, 0x7b, 0x73, 0xca, 0x4f, 0x52, 0x7a, 0x66, 0xc9, 0xe3, 0x78,
-       0x97, 0xb4, 0x6e, 0xbb, 0x15, 0xfa, 0x24, 0xa6, 0xcf, 0xc2, 0xd0, 0x86,
-       0xd8, 0xc6, 0x8b, 0xe8, 0xfc, 0x67, 0x25, 0x77, 0x3a, 0x0e, 0x7d, 0xc6,
-       0xbe, 0x8c, 0xef, 0x40, 0x1b, 0x69, 0xf0, 0x36, 0xed, 0xdd, 0x2e, 0xd8,
-       0xbd, 0x9b, 0xd4, 0x7c, 0x46, 0xbc, 0x7e, 0x99, 0x3a, 0xc9, 0xb1, 0xfb,
-       0xa0, 0xcb, 0x13, 0x4a, 0x6e, 0x4b, 0xe5, 0xcb, 0x89, 0x18, 0x74, 0x72,
-       0x6c, 0x3b, 0xe9, 0xf9, 0x61, 0xb9, 0xd3, 0x1d, 0x97, 0xbb, 0x20, 0x3b,
-       0x43, 0xae, 0x27, 0xc3, 0xe0, 0xc5, 0x1e, 0x17, 0x76, 0x47, 0x61, 0xe8,
-       0x66, 0xf8, 0x5d, 0x1c, 0x9b, 0xf7, 0xc4, 0xd9, 0x36, 0xc0, 0x8f, 0x7f,
-       0x54, 0x0f, 0x68, 0x94, 0x9b, 0xfb, 0x88, 0xa2, 0xcd, 0x88, 0xb7, 0x53,
-       0xdb, 0xd9, 0x36, 0xc9, 0xab, 0x7a, 0x3b, 0x95, 0x3d, 0x2e, 0x2d, 0xde,
-       0x87, 0x14, 0xb6, 0x79, 0x11, 0xfa, 0x06, 0x98, 0xbb, 0x54, 0xdb, 0x81,
-       0x3c, 0x6c, 0xe8, 0x62, 0x06, 0xe9, 0x87, 0x91, 0xb2, 0x6e, 0xa8, 0x35,
-       0x88, 0xe5, 0x1a, 0x3c, 0xba, 0x7a, 0xbf, 0xf0, 0xa3, 0x0a, 0x97, 0x5e,
-       0x55, 0xf7, 0xcb, 0x2c, 0x60, 0x9d, 0x1c, 0xf4, 0x4a, 0x2b, 0x30, 0xd0,
-       0xcc, 0x29, 0x27, 0x3d, 0x1c, 0xda, 0x2d, 0xbf, 0x06, 0x5f, 0xbe, 0xea,
-       0x91, 0x97, 0x3b, 0xe4, 0xc1, 0x3b, 0x28, 0x23, 0xbb, 0x65, 0xff, 0x1d,
-       0x21, 0xd9, 0xdf, 0xef, 0x64, 0x39, 0xef, 0x5b, 0x6e, 0x33, 0xfe, 0x74,
-       0xcf, 0x48, 0x2a, 0x34, 0x20, 0x4f, 0x42, 0xc6, 0x8a, 0x90, 0xaf, 0xe1,
-       0x3a, 0x69, 0x4e, 0x7d, 0x4f, 0x3d, 0x9f, 0x06, 0x56, 0x36, 0xd8, 0xcf,
-       0x95, 0x99, 0x7a, 0x93, 0x24, 0xaf, 0x67, 0x3c, 0x39, 0x19, 0x9c, 0x71,
-       0x5c, 0x4f, 0x99, 0x80, 0x0f, 0x72, 0x7d, 0xb0, 0x3f, 0xd5, 0xbd, 0x2e,
-       0xf5, 0x1c, 0xa7, 0xff, 0xeb, 0x13, 0xe7, 0x15, 0x14, 0x5f, 0x68, 0x23,
-       0x98, 0xfe, 0xbb, 0xd6, 0x15, 0x7c, 0xd7, 0x46, 0xff, 0x61, 0x67, 0xeb,
-       0xea, 0xbd, 0xf4, 0xf5, 0xb2, 0x68, 0xe2, 0x6e, 0x15, 0xac, 0x99, 0x36,
-       0xdd, 0xb1, 0xa9, 0x0b, 0xdb, 0xdd, 0xfb, 0xe5, 0x4f, 0x60, 0xdf, 0xbf,
-       0xb2, 0x62, 0xdf, 0xf7, 0x81, 0x1e, 0xeb, 0x31, 0x80, 0x6b, 0xdf, 0x8d,
-       0xb5, 0x8c, 0x80, 0x9f, 0x77, 0xe1, 0x77, 0x67, 0x79, 0x4d, 0x1c, 0x6f,
-       0xb6, 0x08, 0x3c, 0xd9, 0xe4, 0xb2, 0xbf, 0x35, 0xf1, 0xbc, 0x62, 0x41,
-       0x56, 0x62, 0x85, 0x83, 0xd7, 0x84, 0x76, 0xef, 0x2d, 0x89, 0xf6, 0xba,
-       0x6f, 0x75, 0x87, 0xdc, 0x17, 0xac, 0x10, 0xcf, 0x95, 0x3d, 0x39, 0x5b,
-       0x27, 0x0e, 0xbb, 0x22, 0xd6, 0x79, 0x62, 0xb0, 0x6f, 0xa8, 0x18, 0x54,
-       0xb5, 0xfc, 0x6d, 0xa4, 0xa8, 0x0f, 0xfd, 0x18, 0x0e, 0xe2, 0x14, 0x0a,
-       0xab, 0x50, 0xcf, 0xde, 0x05, 0x3e, 0x4c, 0xe1, 0xd7, 0xbd, 0xfd, 0x56,
-       0xec, 0x5f, 0xca, 0x29, 0x63, 0x5f, 0xbd, 0xf6, 0xf6, 0x10, 0xdf, 0x6d,
-       0x14, 0x07, 0xfb, 0x8e, 0x44, 0x4e, 0xc0, 0xd6, 0x59, 0xd4, 0x0f, 0x5c,
-       0x07, 0xed, 0xa4, 0x2d, 0x0b, 0x27, 0xb9, 0xd7, 0x37, 0xaa, 0x6f, 0xea,
-       0x9a, 0xb5, 0x28, 0xbb, 0x91, 0x2d, 0x30, 0xc6, 0x59, 0x26, 0x0f, 0x3c,
-       0xf0, 0xc0, 0x97, 0x53, 0x5e, 0x3b, 0xf4, 0x76, 0x5c, 0xc2, 0xa7, 0x7c,
-       0x19, 0x52, 0xd8, 0x75, 0x1b, 0x30, 0xd7, 0x16, 0x8d, 0x1b, 0xe2, 0x12,
-       0x39, 0xd5, 0x25, 0xcd, 0xc0, 0xd5, 0x4d, 0xc7, 0x68, 0x23, 0x53, 0xc9,
-       0x21, 0x08, 0x41, 0x44, 0xdd, 0x55, 0x74, 0x06, 0xdf, 0x94, 0x6d, 0xc9,
-       0x37, 0x85, 0x78, 0xe9, 0x86, 0x2d, 0xf0, 0x09, 0xbc, 0x2b, 0x1b, 0xd4,
-       0x2f, 0xad, 0xd6, 0x87, 0x1c, 0x31, 0xb6, 0xc6, 0x36, 0x8c, 0xb5, 0xa5,
-       0x06, 0xdf, 0x60, 0x8c, 0x0d, 0xbe, 0x66, 0xd3, 0xb9, 0x60, 0x0e, 0xd6,
-       0x52, 0x87, 0x54, 0x4f, 0x73, 0x8f, 0x32, 0xce, 0x62, 0x07, 0x7e, 0x6a,
-       0x99, 0xfe, 0x2a, 0xdf, 0x27, 0xf5, 0xfb, 0x6e, 0xfd, 0x9e, 0xfe, 0x68,
-       0xd1, 0x6f, 0x02, 0x4d, 0xf7, 0x40, 0x7f, 0xde, 0xb7, 0xc3, 0x55, 0xb8,
-       0xe1, 0xbe, 0x15, 0x9e, 0xed, 0x15, 0xeb, 0x38, 0xfc, 0xd4, 0xf2, 0x61,
-       0x71, 0xb7, 0x2f, 0xa7, 0x23, 0x32, 0x06, 0x5e, 0x30, 0x9f, 0xe5, 0x7c,
-       0xd2, 0x47, 0xe4, 0xa0, 0xe2, 0x4d, 0xf5, 0xa4, 0x73, 0x34, 0x19, 0x9a,
-       0x12, 0xab, 0xca, 0xe7, 0x47, 0x90, 0x1e, 0x01, 0xde, 0x09, 0x62, 0x97,
-       0x56, 0x75, 0x2d, 0x2d, 0x81, 0x31, 0xec, 0x3d, 0x6b, 0xe2, 0x58, 0xab,
-       0x31, 0x2e, 0xbe, 0x1f, 0x52, 0xef, 0xd3, 0x6b, 0xe2, 0x5c, 0x79, 0x8b,
-       0x58, 0xc6, 0xbc, 0x27, 0x2f, 0xc8, 0x2f, 0xd8, 0xe2, 0x93, 0x26, 0xe6,
-       0xd5, 0xa6, 0xf9, 0x42, 0xfe, 0xcc, 0xc8, 0x45, 0xdb, 0x19, 0xa1, 0xfc,
-       0xfd, 0xea, 0x8e, 0x1b, 0x65, 0xa2, 0x93, 0xf1, 0xb6, 0xc6, 0x39, 0xac,
-       0x8f, 0xa3, 0x35, 0x8e, 0xbf, 0x3e, 0xfe, 0xc6, 0xb1, 0x83, 0x18, 0x5b,
-       0x6e, 0x4d, 0x8c, 0xad, 0x71, 0x3c, 0x8e, 0xb5, 0x05, 0xfe, 0x53, 0xd1,
-       0x8f, 0xbb, 0xe4, 0x51, 0x4f, 0x72, 0x8e, 0xf9, 0x2f, 0x58, 0xe0, 0x63,
-       0x1c, 0x76, 0x84, 0xbc, 0x34, 0x67, 0xcf, 0xe4, 0x69, 0x2a, 0x79, 0x24,
-       0xe0, 0xe7, 0x60, 0xc0, 0xf7, 0x80, 0xff, 0x57, 0x56, 0xf8, 0x48, 0xfb,
-       0x40, 0x3e, 0x76, 0x8a, 0x40, 0xcf, 0x5a, 0xc7, 0xc8, 0x43, 0xa6, 0xe4,
-       0x21, 0xdf, 0x91, 0x87, 0xdd, 0xfa, 0x1d, 0xf9, 0x07, 0x9c, 0xf6, 0x79,
-       0x60, 0x0c, 0x2f, 0xa7, 0xbe, 0xb1, 0xe9, 0xee, 0x35, 0x7b, 0x31, 0x2d,
-       0xcf, 0x2f, 0xb4, 0x88, 0x9d, 0x09, 0xd6, 0x35, 0xbe, 0x26, 0xde, 0xce,
-       0xf3, 0xab, 0x7e, 0x62, 0x4f, 0xb3, 0xae, 0x04, 0xd7, 0x75, 0x50, 0x5e,
-       0x93, 0xc2, 0x4c, 0x04, 0x3e, 0x60, 0x1a, 0x38, 0xa7, 0x1f, 0xfa, 0x96,
-       0xf1, 0x51, 0x94, 0xd5, 0x88, 0x57, 0x68, 0xeb, 0xd2, 0xd8, 0x2b, 0xd4,
-       0xc1, 0xc4, 0x23, 0xaf, 0x4a, 0xbe, 0x62, 0x74, 0x0c, 0xfa, 0xb7, 0x4c,
-       0xff, 0xa4, 0x73, 0xf6, 0x96, 0xeb, 0x64, 0x39, 0x79, 0x9d, 0x38, 0xc9,
-       0x45, 0x59, 0xe5, 0xeb, 0xf8, 0xc6, 0x74, 0xf7, 0xee, 0x0b, 0xaf, 0xca,
-       0xc6, 0xf8, 0x06, 0xbc, 0x9f, 0x14, 0xf3, 0xde, 0xf0, 0x7e, 0x43, 0x3e,
-       0x14, 0x5f, 0x11, 0xf2, 0x82, 0x34, 0x20, 0x1e, 0x8e, 0xca, 0xef, 0xc6,
-       0xb9, 0x1f, 0x8b, 0xea, 0x7c, 0x33, 0x65, 0xf5, 0x2a, 0x9d, 0x31, 0xe4,
-       0x05, 0xf2, 0x5a, 0xc4, 0x38, 0xb1, 0x9e, 0xdf, 0xf3, 0x87, 0xe2, 0xf0,
-       0x73, 0x7b, 0xa8, 0x5f, 0xcc, 0x9e, 0x6e, 0x51, 0x7b, 0xfa, 0x09, 0x2f,
-       0x24, 0x25, 0x37, 0x24, 0x53, 0xee, 0x61, 0x85, 0xf1, 0x7f, 0x03, 0x7d,
-       0x3d, 0xa8, 0xfb, 0x9a, 0x92, 0x5e, 0xad, 0x7f, 0x0e, 0x41, 0xce, 0x7d,
-       0xb9, 0xd7, 0xdb, 0x21, 0xbf, 0xda, 0xce, 0x3d, 0x60, 0xd6, 0x7f, 0x58,
-       0x7a, 0x76, 0x2c, 0x27, 0xe1, 0x19, 0xdc, 0x12, 0x5d, 0xa1, 0x01, 0xf7,
-       0x99, 0x91, 0xef, 0x80, 0x0e, 0xc1, 0xfa, 0xd7, 0xac, 0x55, 0xaf, 0x93,
-       0x6b, 0x66, 0x3d, 0xae, 0x35, 0xc0, 0xf2, 0xab, 0x6b, 0x35, 0xf5, 0x5b,
-       0x21, 0x4b, 0x4e, 0x52, 0x42, 0x8d, 0xb4, 0x59, 0xd1, 0x51, 0x23, 0x8c,
-       0x91, 0x2c, 0xdb, 0x4e, 0x3a, 0x19, 0x32, 0xb1, 0xe8, 0x00, 0xeb, 0x76,
-       0x03, 0x87, 0xbb, 0xbd, 0xbd, 0xe9, 0x82, 0x8a, 0x91, 0x5a, 0x6a, 0x5d,
-       0x53, 0xc0, 0x64, 0x0b, 0xde, 0x2b, 0xfe, 0xa7, 0x81, 0x59, 0x27, 0xe4,
-       0x61, 0x09, 0xaf, 0x89, 0xe5, 0x22, 0x7f, 0x9e, 0xf1, 0x5c, 0x27, 0x99,
-       0x05, 0x8f, 0x7f, 0x13, 0x3e, 0x7c, 0x15, 0x7a, 0xff, 0xe3, 0xb4, 0x0d,
-       0x65, 0xd8, 0x0b, 0xe0, 0x92, 0xaf, 0xbc, 0x27, 0x86, 0x9f, 0x68, 0x88,
-       0xe5, 0x06, 0xf8, 0xf4, 0xa2, 0xc2, 0xa4, 0xc4, 0xed, 0x47, 0x43, 0x77,
-       0xf7, 0x85, 0xe1, 0x67, 0x14, 0xfd, 0x98, 0x4b, 0x1c, 0x77, 0x58, 0xee,
-       0x04, 0x7f, 0xce, 0x2e, 0x14, 0x43, 0x7b, 0xca, 0x46, 0x56, 0xe1, 0x57,
-       0xd6, 0x9d, 0xf4, 0x65, 0xd0, 0xe3, 0x19, 0x8d, 0xf9, 0x78, 0x5e, 0x53,
-       0xd5, 0x3e, 0x0b, 0x63, 0x43, 0xa5, 0xfa, 0x61, 0x99, 0xf6, 0x18, 0xdb,
-       0xe9, 0x91, 0x52, 0x3c, 0x7b, 0x63, 0xf3, 0x0a, 0x8d, 0x1c, 0x1b, 0x3e,
-       0x5f, 0x9a, 0xfa, 0xbb, 0xaa, 0xcf, 0x3b, 0x9e, 0x51, 0xf2, 0x65, 0xe2,
-       0xc2, 0xf4, 0x8f, 0x78, 0x5e, 0xd5, 0x63, 0x8f, 0xf0, 0xb9, 0x42, 0x19,
-       0x50, 0x3e, 0x13, 0x68, 0xf9, 0x90, 0x64, 0xc7, 0x92, 0x0a, 0xb7, 0x3c,
-       0x5e, 0xe6, 0x7e, 0x21, 0xfe, 0x7f, 0x0d, 0xd8, 0x3f, 0x02, 0x9e, 0xd1,
-       0x0f, 0xe0, 0xd8, 0xdc, 0x17, 0x28, 0xab, 0xd9, 0xef, 0xb2, 0x2f, 0x5e,
-       0x6b, 0x23, 0xc6, 0xb8, 0x54, 0x16, 0x45, 0xbf, 0x65, 0x31, 0xb1, 0x73,
-       0x85, 0x05, 0x8b, 0xb9, 0x70, 0x48, 0x52, 0x27, 0xfe, 0x35, 0x64, 0xe8,
-       0xd7, 0xe1, 0x23, 0xa9, 0x7a, 0xea, 0xfc, 0x6a, 0x08, 0x98, 0xcb, 0x72,
-       0x6f, 0x90, 0x92, 0x1d, 0x95, 0x92, 0xba, 0xa3, 0xc9, 0xf3, 0xdc, 0xb0,
-       0x8a, 0xed, 0x94, 0x6c, 0x62, 0xfe, 0xff, 0xde, 0x16, 0xd8, 0xfa, 0x0e,
-       0xe4, 0xd9, 0x8e, 0x79, 0x96, 0x4f, 0x49, 0xf4, 0xc4, 0x21, 0x69, 0x3a,
-       0xf1, 0xb0, 0x34, 0x1f, 0x27, 0xc6, 0x63, 0xec, 0xde, 0xda, 0xd5, 0x2c,
-       0xc4, 0xdc, 0x43, 0x18, 0xfb, 0xb0, 0x7c, 0xdf, 0x33, 0x73, 0x5a, 0xc4,
-       0x1c, 0x59, 0xc7, 0xe4, 0x0d, 0x1e, 0xdf, 0x85, 0xf9, 0x70, 0xfd, 0x49,
-       0x8d, 0xfb, 0x76, 0x35, 0xf8, 0xae, 0x4d, 0xda, 0x77, 0x65, 0xbb, 0x4f,
-       0x61, 0xad, 0x27, 0x25, 0xea, 0x9a, 0xf6, 0xbb, 0x51, 0x2f, 0xd1, 0x70,
-       0x07, 0x82, 0x75, 0xf4, 0x9d, 0x80, 0x36, 0xe2, 0x1e, 0x9e, 0xb7, 0xb3,
-       0x2c, 0x38, 0xf3, 0xb7, 0xaa, 0xbb, 0xc2, 0x6b, 0xc7, 0xdf, 0xd9, 0x50,
-       0xd7, 0x94, 0x99, 0x36, 0xd1, 0xc0, 0xe7, 0x1f, 0x88, 0x36, 0xb4, 0x83,
-       0x71, 0x53, 0x69, 0xe0, 0x7b, 0x04, 0x7e, 0x10, 0xd7, 0x90, 0x6e, 0xc0,
-       0x39, 0x6b, 0xbf, 0x45, 0xcc, 0xa3, 0xbc, 0x30, 0x67, 0xee, 0x91, 0x59,
-       0x58, 0x8b, 0x53, 0xa4, 0xff, 0x62, 0xf3, 0x4e, 0xee, 0x5c, 0x11, 0xf3,
-       0xbe, 0x49, 0xdd, 0x25, 0xe2, 0xdd, 0x0d, 0xd4, 0x4b, 0x06, 0xf8, 0x93,
-       0xf9, 0x04, 0x78, 0x7e, 0x5b, 0x97, 0x95, 0xf9, 0xf3, 0x1b, 0x73, 0x03,
-       0xc4, 0x37, 0x5b, 0x79, 0x0e, 0x09, 0xdc, 0x4c, 0x39, 0xfb, 0x2e, 0xe4,
-       0xac, 0x59, 0x9d, 0xfb, 0x94, 0xca, 0xf4, 0xe7, 0x0a, 0x90, 0x1f, 0xde,
-       0x87, 0xa3, 0xdf, 0x57, 0xd0, 0xf1, 0x58, 0xce, 0x93, 0x98, 0xde, 0xf8,
-       0x07, 0xec, 0x73, 0xfd, 0x19, 0x6c, 0xe3, 0xfd, 0x12, 0xca, 0x5b, 0x42,
-       0xcd, 0x79, 0x78, 0x9d, 0xbf, 0x72, 0x04, 0xba, 0x60, 0x01, 0xf2, 0x3c,
-       0x09, 0x1d, 0x38, 0x14, 0xe6, 0xfe, 0x6c, 0xd1, 0xbe, 0xac, 0x4b, 0xbf,
-       0x3d, 0x34, 0x86, 0x3e, 0xac, 0xe3, 0xaf, 0xcb, 0x14, 0xf4, 0xff, 0x74,
-       0x3d, 0xa5, 0xbe, 0x17, 0xc9, 0x26, 0x78, 0x07, 0x8c, 0xe5, 0x63, 0x18,
-       0xff, 0x75, 0xe0, 0xe1, 0xcd, 0xa0, 0xa7, 0xa5, 0x79, 0xf5, 0x2b, 0x3a,
-       0x16, 0x15, 0x63, 0x2c, 0x1e, 0x7a, 0xb3, 0x14, 0x60, 0xcd, 0xf8, 0x34,
-       0xd2, 0xcd, 0x2d, 0x81, 0xbc, 0x4e, 0x6e, 0xd5, 0x77, 0x2f, 0x50, 0xfe,
-       0x98, 0x8a, 0x41, 0x06, 0x6b, 0x72, 0xb4, 0xaf, 0x12, 0x85, 0xcc, 0x71,
-       0x5d, 0xf7, 0xa2, 0x1e, 0x65, 0xad, 0x4f, 0x9f, 0xcd, 0xb6, 0x28, 0xfd,
-       0x98, 0x87, 0x2c, 0x15, 0x94, 0x1f, 0x01, 0x7c, 0xef, 0xb1, 0xdd, 0xaf,
-       0x6f, 0xe5, 0xd9, 0x67, 0x93, 0xab, 0x7c, 0x8b, 0xce, 0xb0, 0x98, 0xb2,
-       0x8f, 0xa0, 0x8c, 0x72, 0x76, 0x03, 0x78, 0xc3, 0xb2, 0x1c, 0xf2, 0x1c,
-       0xeb, 0x46, 0x3d, 0x0e, 0xc7, 0xb8, 0xb4, 0x79, 0xed, 0x9c, 0xb8, 0x96,
-       0xce, 0x75, 0x77, 0xe7, 0x59, 0x76, 0x83, 0x2e, 0x8b, 0xe8, 0xf5, 0xfd,
-       0xa9, 0xfe, 0xb6, 0xc1, 0x39, 0x9a, 0x5d, 0xc1, 0xc6, 0x9c, 0x5f, 0x4c,
-       0xb5, 0xcb, 0xda, 0x81, 0xec, 0x1c, 0x01, 0x3f, 0x22, 0x99, 0xaf, 0xf1,
-       0x4c, 0x19, 0xf4, 0x35, 0x7b, 0x22, 0xa1, 0xfc, 0xce, 0xa4, 0x15, 0xdc,
-       0x5d, 0xba, 0x58, 0x6e, 0xf4, 0x19, 0xcc, 0xfd, 0x6f, 0x57, 0xc6, 0x56,
-       0x78, 0x45, 0xbe, 0x91, 0x5f, 0xef, 0xc6, 0x2b, 0xf2, 0x91, 0xfc, 0x2a,
-       0x48, 0x69, 0x96, 0x7c, 0xa2, 0xbc, 0x8c, 0x29, 0x79, 0x29, 0x55, 0x0c,
-       0x4e, 0xa6, 0x2e, 0xe1, 0x37, 0x0f, 0x1b, 0x9d, 0xd7, 0x9b, 0xbb, 0x61,
-       0xbf, 0x44, 0xfa, 0x85, 0x86, 0xe1, 0x1e, 0x2d, 0xcc, 0x2a, 0x9d, 0x02,
-       0xbb, 0x98, 0x50, 0xba, 0xa2, 0x30, 0xce, 0xfc, 0xd2, 0x56, 0x7e, 0x9b,
-       0x8b, 0x79, 0xa0, 0xbc, 0x53, 0xf3, 0xf5, 0x06, 0x75, 0xbf, 0x89, 0x7b,
-       0xb0, 0x54, 0xa9, 0xab, 0xf7, 0x67, 0xe7, 0x9a, 0x54, 0xfd, 0xb3, 0x73,
-       0xeb, 0xef, 0x28, 0xb1, 0xec, 0x66, 0xc6, 0x55, 0x64, 0x71, 0xa6, 0x49,
-       0x96, 0xe6, 0xfe, 0x90, 0x7e, 0x22, 0x8c, 0xc1, 0xca, 0xf7, 0x1d, 0xfa,
-       0x5b, 0x2c, 0x5f, 0x86, 0x21, 0x37, 0x0b, 0x83, 0xd3, 0x52, 0x1d, 0xa4,
-       0x1f, 0xa4, 0xee, 0x0e, 0x62, 0xbd, 0x4d, 0xc0, 0xc0, 0xc0, 0x85, 0x2e,
-       0xe3, 0xcf, 0x5b, 0xb4, 0x3e, 0x79, 0xb0, 0x75, 0x25, 0x2e, 0x1d, 0x2f,
-       0xfa, 0x55, 0xd7, 0x7c, 0x33, 0xc3, 0x3e, 0xf9, 0xdd, 0x0c, 0x79, 0x66,
-       0xa1, 0x3d, 0xef, 0x64, 0x76, 0x33, 0xae, 0xad, 0xf9, 0x1c, 0x46, 0x7d,
-       0xa6, 0xbf, 0xa7, 0xf3, 0x73, 0x3a, 0xfd, 0xac, 0xec, 0x3f, 0xf9, 0x19,
-       0xcc, 0x7b, 0x53, 0x70, 0xef, 0x4a, 0x1a, 0xbf, 0x9b, 0x88, 0xe8, 0x6f,
-       0x34, 0x3e, 0x8b, 0x32, 0xc6, 0xe2, 0x3e, 0xab, 0xd6, 0xc4, 0xbb, 0x7d,
-       0x45, 0xf9, 0x79, 0x77, 0x54, 0x8c, 0x3f, 0xc8, 0xfb, 0x53, 0x2d, 0xba,
-       0xbf, 0x3d, 0x5a, 0x96, 0xc6, 0x65, 0x3f, 0xec, 0x5d, 0x01, 0xb8, 0x98,
-       0x77, 0xce, 0x26, 0xc2, 0x8d, 0x63, 0x9a, 0xfd, 0x14, 0xc4, 0x1a, 0xcc,
-       0xdd, 0x87, 0xb0, 0xf2, 0x89, 0x56, 0xe2, 0x16, 0xba, 0x7c, 0x5c, 0x0e,
-       0x94, 0x55, 0xfc, 0x42, 0x9d, 0x59, 0x4e, 0x43, 0x2f, 0x0c, 0x29, 0x9b,
-       0x16, 0x0b, 0x0d, 0xd7, 0x32, 0x52, 0x38, 0xbd, 0x17, 0xe3, 0x30, 0x16,
-       0x98, 0xd5, 0x67, 0x83, 0xfb, 0x64, 0x7f, 0x3d, 0x18, 0x7b, 0xb2, 0xcc,
-       0xf7, 0x29, 0xe0, 0x04, 0xbe, 0xcf, 0x27, 0xc2, 0xea, 0x74, 0xe3, 0x56,
-       0xb4, 0x6d, 0xd2, 0x74, 0xe6, 0xbd, 0x6b, 0xb6, 0xa7, 0x0e, 0x00, 0xc0,
-       0x69, 0xc9, 0xe3, 0x3d, 0xdb, 0x98, 0xfe, 0x26, 0x61, 0xb7, 0xe8, 0x9f,
-       0x3f, 0x2a, 0xcb, 0x95, 0x69, 0xb9, 0x5c, 0x31, 0xb2, 0xce, 0xbb, 0xd7,
-       0x9c, 0xfb, 0x5d, 0xc1, 0xb7, 0xbf, 0xe5, 0x2c, 0xf8, 0xb3, 0x96, 0x56,
-       0xf9, 0x35, 0xdf, 0xdb, 0xfc, 0x2b, 0x3b, 0xf8, 0xe6, 0x6d, 0xb7, 0xba,
-       0xc3, 0xb5, 0x76, 0xcf, 0xb1, 0x9f, 0xfd, 0x36, 0xcf, 0x3a, 0x82, 0x7b,
-       0x68, 0x9d, 0x0d, 0xef, 0xe3, 0xfa, 0xee, 0xd7, 0xa7, 0xec, 0x80, 0x8f,
-       0xa4, 0xe7, 0x98, 0x9e, 0xef, 0xad, 0xd8, 0xff, 0xec, 0xf3, 0x31, 0xcd,
-       0x37, 0xa4, 0x0b, 0x7c, 0xe6, 0xfe, 0x5a, 0xd6, 0xe7, 0xbf, 0xb6, 0x1e,
-       0xa3, 0xf1, 0xee, 0x5d, 0x53, 0xc3, 0xb8, 0x6c, 0x4f, 0xfb, 0x64, 0xee,
-       0x80, 0xb3, 0xec, 0xa4, 0xbe, 0xe3, 0x77, 0xb5, 0xa1, 0xcc, 0xdc, 0x45,
-       0x23, 0xbd, 0x18, 0xd3, 0x44, 0x5a, 0x1f, 0xd3, 0xcf, 0x63, 0x0d, 0xdf,
-       0xc8, 0x98, 0x3e, 0x23, 0xe8, 0xc3, 0xdc, 0x41, 0x6f, 0xbc, 0x53, 0xcc,
-       0xef, 0x83, 0x28, 0x8b, 0x16, 0xbf, 0x61, 0xa6, 0x1f, 0x08, 0xec, 0xb6,
-       0x45, 0x26, 0xd5, 0x7c, 0x8a, 0xea, 0xbe, 0x06, 0xbf, 0x9b, 0x19, 0xb2,
-       0x83, 0xfc, 0xe4, 0xc2, 0x7a, 0x39, 0x65, 0xf9, 0x33, 0xcd, 0xd2, 0x52,
-       0xc4, 0x38, 0x7c, 0xbf, 0xd1, 0xf7, 0xf4, 0x51, 0xfd, 0x9d, 0x90, 0x87,
-       0x36, 0x4f, 0x50, 0xde, 0x8b, 0xc5, 0x95, 0x7b, 0xa2, 0xc5, 0xe0, 0x1b,
-       0x26, 0xcb, 0xdc, 0xd7, 0xe4, 0x37, 0xda, 0x22, 0x17, 0x6a, 0xfc, 0x3e,
-       0x69, 0xb7, 0xba, 0x47, 0x13, 0x9c, 0x4d, 0x72, 0x5e, 0x3d, 0xca, 0x2e,
-       0x54, 0x6b, 0x25, 0xd2, 0x54, 0xdb, 0xf6, 0xa8, 0xb6, 0xed, 0xa4, 0xf1,
-       0x08, 0x68, 0xfc, 0x25, 0xcd, 0x17, 0xb6, 0xcf, 0xaa, 0xfb, 0xdd, 0xd9,
-       0x38, 0xcf, 0xc7, 0x1e, 0x53, 0x6b, 0xa1, 0x9d, 0x40, 0xdb, 0x5f, 0x0e,
-       0xab, 0x78, 0xa7, 0xfa, 0x06, 0x1c, 0xf2, 0xc9, 0x6f, 0xba, 0xa1, 0xe3,
-       0xcb, 0xfc, 0x76, 0x7b, 0x04, 0x29, 0xbf, 0xd9, 0xde, 0xab, 0xee, 0xff,
-       0x57, 0xd5, 0x37, 0x01, 0x46, 0x1e, 0xc3, 0x7a, 0xac, 0x6f, 0x62, 0x8c,
-       0x80, 0xef, 0x85, 0x32, 0xbf, 0xe5, 0x36, 0x77, 0x4c, 0x37, 0x2f, 0x73,
-       0x4f, 0x88, 0xf2, 0xf3, 0x83, 0x6f, 0xfb, 0xab, 0xea, 0x3b, 0x82, 0x24,
-       0xbf, 0x2b, 0x84, 0xfd, 0xba, 0x1f, 0xcf, 0x3c, 0x57, 0xde, 0x87, 0x14,
-       0xfa, 0xa7, 0x36, 0x81, 0xf4, 0x61, 0xc9, 0xab, 0xb8, 0x5f, 0x2b, 0xf2,
-       0x93, 0x6a, 0xec, 0x52, 0xed, 0x13, 0xb2, 0xff, 0xf4, 0x43, 0xfc, 0x5e,
-       0x42, 0x7d, 0x77, 0x9e, 0xf3, 0x38, 0xc7, 0xb8, 0x4c, 0xa9, 0x75, 0x17,
-       0x35, 0xed, 0xcd, 0x59, 0xcc, 0xcf, 0xd4, 0xb7, 0x19, 0xc5, 0x5a, 0x2b,
-       0xe6, 0x18, 0xd2, 0xf7, 0x4c, 0xe9, 0x0f, 0x98, 0xf5, 0xb7, 0xf0, 0xee,
-       0xa2, 0xcf, 0xf3, 0xc3, 0xfd, 0x65, 0xde, 0x23, 0x4d, 0xe9, 0x38, 0x01,
-       0x63, 0x87, 0x3c, 0x9f, 0xa0, 0x8c, 0x3b, 0xe9, 0x09, 0x58, 0xa0, 0xa8,
-       0x24, 0x78, 0xb6, 0xad, 0xd7, 0xd2, 0xda, 0xb0, 0x16, 0xde, 0x9d, 0x0d,
-       0xd6, 0xc3, 0xef, 0x21, 0x0a, 0xe5, 0xc6, 0x6f, 0x2a, 0xd4, 0x37, 0xd0,
-       0xfc, 0x76, 0x46, 0x26, 0x6a, 0x9f, 0x94, 0x07, 0xca, 0x5b, 0xf4, 0xf7,
-       0x14, 0x31, 0x79, 0xa0, 0xf6, 0xba, 0xa2, 0x69, 0x41, 0x7d, 0xd7, 0x11,
-       0xd5, 0x3c, 0x33, 0xdf, 0x54, 0x04, 0xfd, 0x1d, 0xa8, 0x39, 0x0d, 0xdf,
-       0x2f, 0x44, 0x65, 0x62, 0xe1, 0x47, 0x91, 0x8d, 0xbf, 0x61, 0x78, 0x54,
-       0x72, 0xa7, 0x69, 0xa3, 0xa7, 0xe5, 0xf1, 0x8a, 0xef, 0xdf, 0xe9, 0x11,
-       0x5b, 0x6e, 0x96, 0xcb, 0xf1, 0xb1, 0x3d, 0x6f, 0xb8, 0x1d, 0xa1, 0xea,
-       0x6c, 0x33, 0x74, 0x2f, 0xf1, 0x8c, 0xb4, 0x30, 0xbf, 0x30, 0xcb, 0x7d,
-       0x1a, 0xc1, 0x1a, 0x1d, 0xfb, 0x9a, 0xdc, 0xde, 0xce, 0xb8, 0xdb, 0x9d,
-       0xf0, 0x65, 0x7f, 0xdb, 0x0b, 0xf4, 0xf5, 0xe7, 0x16, 0xf7, 0xca, 0xe7,
-       0x6a, 0xb1, 0x50, 0x75, 0x86, 0xf7, 0x0d, 0x9d, 0x91, 0x8a, 0xa4, 0x50,
-       0x8f, 0xfd, 0x43, 0x5e, 0x12, 0xd7, 0xc9, 0xb3, 0x27, 0x7f, 0xea, 0x5f,
-       0x73, 0xf1, 0x1e, 0xba, 0xe6, 0xb2, 0x67, 0x62, 0x8b, 0x63, 0xf0, 0x5d,
-       0x59, 0xef, 0x3a, 0xc8, 0x01, 0xb0, 0x03, 0xf6, 0x1c, 0xfd, 0xdc, 0x6b,
-       0x5a, 0x6f, 0x59, 0xc7, 0x6e, 0x92, 0x6b, 0x2b, 0xf7, 0x95, 0x5f, 0x83,
-       0x6c, 0x27, 0x03, 0xfa, 0xab, 0x58, 0xfc, 0x21, 0x09, 0x7f, 0x1e, 0x36,
-       0xe5, 0xf3, 0x4d, 0x4a, 0xb7, 0xd3, 0xb6, 0xc1, 0x07, 0x82, 0x9f, 0x13,
-       0x41, 0x3f, 0xa9, 0xf6, 0x40, 0x66, 0xa7, 0x45, 0xbe, 0xb0, 0x49, 0xb2,
-       0xed, 0xf4, 0xa3, 0xe5, 0xe7, 0xe8, 0xaf, 0xc6, 0x7d, 0x96, 0x96, 0x3f,
-       0xe2, 0x1e, 0xaf, 0x73, 0x2d, 0xa9, 0xc4, 0x9f, 0xc9, 0xa7, 0x65, 0x22,
-       0xc1, 0xb5, 0x3c, 0x2a, 0xc5, 0xca, 0x63, 0xf8, 0x71, 0x9d, 0x9c, 0xf7,
-       0xc7, 0xf4, 0x5d, 0x86, 0x31, 0x29, 0xcd, 0x64, 0x64, 0x6a, 0x6e, 0x92,
-       0xdf, 0xa0, 0x8e, 0xdc, 0xa9, 0xce, 0xf8, 0x9c, 0x44, 0x2a, 0xb4, 0x2d,
-       0x39, 0xc5, 0xbb, 0x1b, 0x6a, 0x3d, 0x93, 0x58, 0xcf, 0xe3, 0xed, 0xbc,
-       0xb3, 0x7e, 0x0d, 0xfa, 0xd7, 0x3a, 0x45, 0x39, 0x74, 0xec, 0xee, 0x10,
-       0xf3, 0xfb, 0xe0, 0xbf, 0xb3, 0x6c, 0x9f, 0x84, 0x8f, 0xad, 0xe8, 0x79,
-       0x94, 0xeb, 0xb3, 0x66, 0xd5, 0xfe, 0x14, 0xda, 0xa2, 0xde, 0x31, 0xd3,
-       0xd6, 0xd4, 0x61, 0x5b, 0xae, 0x73, 0xaf, 0x34, 0x9f, 0x33, 0xf3, 0x82,
-       0x1c, 0x26, 0x1a, 0xe9, 0xdd, 0xb2, 0x8e, 0xde, 0x11, 0x62, 0x5e, 0xd0,
-       0x8b, 0x34, 0x0e, 0x6b, 0x1a, 0x7f, 0x05, 0xfd, 0x1b, 0x1e, 0xdc, 0x89,
-       0x32, 0x5b, 0x7f, 0x93, 0xf4, 0x7e, 0xe8, 0x4e, 0x9a, 0xb3, 0x3e, 0xe9,
-       0x4e, 0xd9, 0xe2, 0x7c, 0x36, 0xa2, 0xf9, 0xeb, 0x9a, 0x2f, 0xfb, 0x40,
-       0x2f, 0xde, 0x2b, 0xdd, 0xa6, 0xbe, 0x2f, 0xc8, 0x8e, 0xef, 0x83, 0xec,
-       0x98, 0x75, 0x6d, 0x83, 0x8c, 0xf1, 0xdc, 0x84, 0xf5, 0x1b, 0x69, 0x12,
-       0xd8, 0xbd, 0x30, 0x63, 0x1f, 0x2e, 0xd7, 0x0a, 0x5c, 0xfa, 0x05, 0xda,
-       0x28, 0x7e, 0x63, 0x7d, 0xb3, 0xb6, 0x51, 0x3f, 0x8f, 0xc7, 0x3f, 0x6a,
-       0x0f, 0x6c, 0x94, 0x0d, 0x9a, 0xb4, 0xe9, 0x36, 0xfb, 0x80, 0x91, 0x19,
-       0x0f, 0x4e, 0x25, 0x1e, 0x14, 0x33, 0x8e, 0xbf, 0x9b, 0x7e, 0xef, 0xd0,
-       0xc0, 0x36, 0xa0, 0x16, 0x75, 0x67, 0x27, 0xc1, 0x3b, 0x40, 0xa9, 0xd0,
-       0x3e, 0x75, 0x7f, 0x63, 0xed, 0xf7, 0x23, 0x69, 0x79, 0x76, 0x55, 0x56,
-       0x46, 0x7e, 0x28, 0x8e, 0x24, 0x6f, 0xa4, 0xac, 0xb0, 0xdf, 0x49, 0xae,
-       0x33, 0xf1, 0x90, 0x5a, 0xa7, 0x0d, 0x3f, 0x92, 0x77, 0x2d, 0xec, 0x50,
-       0x75, 0x8e, 0x7c, 0x47, 0xba, 0xc8, 0x67, 0x73, 0xde, 0xab, 0xf4, 0x0a,
-       0xc6, 0x65, 0x19, 0x75, 0x23, 0xdf, 0x67, 0xf4, 0x79, 0x70, 0x7b, 0x07,
-       0xef, 0x24, 0x14, 0x50, 0x56, 0x59, 0xdc, 0x78, 0x6e, 0xbf, 0xad, 0xe4,
-       0xe0, 0x51, 0xd0, 0xfd, 0x9f, 0xa1, 0xee, 0x63, 0x48, 0xb9, 0xc6, 0xcc,
-       0x0a, 0xdf, 0x49, 0xef, 0x8f, 0xca, 0x20, 0xe4, 0x82, 0xf9, 0x47, 0x81,
-       0x37, 0x69, 0x4f, 0x91, 0x56, 0xf8, 0x4c, 0x5d, 0xef, 0x6a, 0x7b, 0xca,
-       0xb9, 0xec, 0xc3, 0x5c, 0xd4, 0x3a, 0xb5, 0x3c, 0xdd, 0xaf, 0xdb, 0x8d,
-       0xaf, 0xd0, 0xea, 0xa1, 0x77, 0xe0, 0x8d, 0xe8, 0x0a, 0xde, 0x08, 0xc6,
-       0xca, 0x76, 0x18, 0xac, 0x11, 0xac, 0x21, 0xc0, 0x1a, 0x81, 0x9c, 0x4f,
-       0x4a, 0x04, 0x72, 0x1c, 0x5e, 0x95, 0x63, 0xe0, 0x9e, 0x60, 0xcf, 0x4c,
-       0xf1, 0x1c, 0x53, 0xd1, 0x99, 0x72, 0x48, 0xf9, 0x25, 0x1f, 0x1b, 0x79,
-       0x7d, 0xfb, 0xbb, 0xf0, 0xba, 0xd4, 0x61, 0xf0, 0xc3, 0x3f, 0x6c, 0x1f,
-       0x3c, 0xd2, 0xb1, 0xba, 0x0f, 0x6e, 0xfa, 0x05, 0xed, 0x83, 0xf5, 0x72,
-       0xd9, 0x28, 0x53, 0x36, 0xe4, 0x89, 0xfc, 0xa2, 0x3c, 0x51, 0x8e, 0x48,
-       0x4b, 0xea, 0xd3, 0x66, 0xfa, 0x6f, 0x89, 0xab, 0xea, 0xdb, 0x91, 0x69,
-       0xe8, 0xa0, 0x8e, 0x50, 0xa5, 0x12, 0x97, 0xd2, 0xe2, 0x4f, 0x94, 0x4c,
-       0x3f, 0x5b, 0xa7, 0x5e, 0x7a, 0xaf, 0xb5, 0xaf, 0xd5, 0xb9, 0x85, 0x75,
-       0x3a, 0xb7, 0xb0, 0xa2, 0x73, 0xdb, 0xb5, 0xcf, 0xf6, 0x0f, 0xd1, 0xb9,
-       0xf1, 0x86, 0xb3, 0x21, 0x73, 0x2e, 0x24, 0xa1, 0x5c, 0x5f, 0x8b, 0xec,
-       0x81, 0x1d, 0x19, 0x99, 0xd9, 0x2b, 0x7f, 0x30, 0x33, 0xad, 0xee, 0x49,
-       0x7d, 0xd3, 0x4b, 0x25, 0x3e, 0x11, 0xf2, 0xe5, 0xa3, 0xf0, 0xb9, 0x27,
-       0xba, 0x9a, 0x64, 0xcf, 0x6d, 0xea, 0xbc, 0xd3, 0xce, 0x85, 0x3a, 0x85,
-       0x91, 0xf8, 0xbc, 0xe7, 0x78, 0xc9, 0x10, 0xef, 0xcc, 0x35, 0xcb, 0x44,
-       0xbc, 0x55, 0xf6, 0x02, 0x3b, 0x15, 0xaf, 0xf7, 0xd4, 0x37, 0xd3, 0x59,
-       0x75, 0x9e, 0xf4, 0x86, 0xe6, 0x3b, 0xe8, 0xd0, 0x66, 0xcb, 0x7f, 0xac,
-       0x33, 0xcf, 0xf2, 0x07, 0xd7, 0xe5, 0xf9, 0xfc, 0x04, 0xfc, 0xb9, 0x38,
-       0x68, 0xd5, 0x78, 0xff, 0x28, 0xac, 0xe8, 0x59, 0xaa, 0x8c, 0xab, 0x7b,
-       0x5d, 0x57, 0xc3, 0xa4, 0x97, 0xf2, 0xa1, 0x12, 0xb9, 0x30, 0x30, 0xce,
-       0x2c, 0x90, 0xb4, 0x4b, 0xbf, 0x53, 0xe3, 0x4f, 0xe8, 0xff, 0xfd, 0xea,
-       0x7c, 0x79, 0x19, 0xb4, 0xf1, 0x55, 0xfc, 0xb9, 0x10, 0x27, 0xae, 0x5f,
-       0xbd, 0xc3, 0xfc, 0x4e, 0x7c, 0xaf, 0xb0, 0xbd, 0x39, 0x0b, 0xd1, 0xf1,
-       0x2a, 0x1d, 0x07, 0x50, 0x67, 0x7b, 0x1b, 0xfd, 0xbf, 0x0b, 0xc4, 0x7a,
-       0xfc, 0xae, 0x9f, 0xd8, 0xce, 0x39, 0x5a, 0x91, 0x1f, 0x2a, 0x5f, 0x34,
-       0x4b, 0xfa, 0x56, 0xc1, 0xa7, 0xe3, 0x09, 0x63, 0xcf, 0x43, 0xdd, 0xe7,
-       0x1b, 0x7d, 0x51, 0xf6, 0x11, 0x53, 0x77, 0x42, 0x56, 0xff, 0x9f, 0x17,
-       0xc6, 0x98, 0xb2, 0xa1, 0xbb, 0xcb, 0xd3, 0x12, 0x3e, 0x31, 0x26, 0x91,
-       0xe3, 0x8c, 0xe7, 0x67, 0xa5, 0x14, 0xf7, 0xe5, 0x01, 0x6f, 0xad, 0x6f,
-       0xd2, 0x6d, 0xad, 0x9f, 0xfb, 0xa3, 0x32, 0x74, 0xfa, 0x31, 0x89, 0x9e,
-       0xe0, 0xbb, 0x35, 0x67, 0x39, 0xd0, 0x47, 0x9b, 0xa5, 0x12, 0x67, 0x4c,
-       0x3b, 0xaa, 0xce, 0xc6, 0x2f, 0x8f, 0xbf, 0x1e, 0x2d, 0x01, 0x2b, 0x14,
-       0x94, 0x6e, 0x41, 0xba, 0xe2, 0x4b, 0xe4, 0xae, 0xe3, 0x9e, 0x82, 0xbf,
-       0x19, 0x9a, 0xa8, 0x44, 0xd5, 0x1d, 0xa5, 0xcb, 0x71, 0xd6, 0x7d, 0x0c,
-       0x7e, 0x37, 0x71, 0x06, 0x74, 0xc7, 0x98, 0xb4, 0x30, 0x1f, 0x3e, 0xb1,
-       0x8a, 0x33, 0xa8, 0x13, 0x86, 0xbc, 0xb8, 0x44, 0xce, 0x04, 0x6b, 0xe7,
-       0x7f, 0x1c, 0x64, 0xcd, 0xef, 0x95, 0xf0, 0x71, 0x3e, 0x37, 0xfa, 0x43,
-       0xc4, 0xee, 0xb0, 0x0d, 0xe7, 0x7f, 0x1f, 0xfd, 0xf1, 0x5d, 0x56, 0x7f,
-       0x87, 0x8b, 0x7c, 0xf5, 0xef, 0xfa, 0x7f, 0x04, 0x50, 0xf6, 0xff, 0x3f,
-       0xc3, 0x8e, 0xbb, 0xb0, 0xa8, 0x4d, 0x00, 0x00, 0x00 };
-
-static const u32 bnx2_COM_b06FwData[(0x0/4) + 1] = { 0x0 };
-static const u32 bnx2_COM_b06FwRodata[(0x14/4) + 1] = {
-       0x08000e7c, 0x08000ec4, 0x08000f04, 0x08000f50, 0x08000f84, 0x00000000
-};
-
-static struct fw_info bnx2_com_fw_06 = {
-       /* Firmware version: 4.6.16 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0x10,
-
-       .start_addr                     = 0x080000f8,
-
-       .text_addr                      = 0x08000000,
-       .text_len                       = 0x4da4,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_COM_b06FwText,
-       .gz_text_len                    = sizeof(bnx2_COM_b06FwText),
-
-       .data_addr                      = 0x00000000,
-       .data_len                       = 0x0,
-       .data_index                     = 0x0,
-       .data                           = bnx2_COM_b06FwData,
-
-       .sbss_addr                      = 0x08004de0,
-       .sbss_len                       = 0x38,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08004e18,
-       .bss_len                        = 0xbc,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x08004da4,
-       .rodata_len                     = 0x14,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_COM_b06FwRodata,
-};
-
 /* Initialized Values for the Completion Processor. */
 static const struct cpu_reg cpu_reg_com = {
        .mode = BNX2_COM_CPU_MODE,
@@ -897,1277 +23,6 @@ static const struct cpu_reg cpu_reg_com = {
        .mips_view_base = 0x8000000,
 };
 
-static u8 bnx2_CP_b06FwText[] = {
-       0x9d, 0xbc, 0x0d, 0x7c, 0x1b, 0xe5, 0x95, 0x2e, 0xfe, 0xcc, 0x48, 0xb2,
-       0x65, 0x5b, 0xb6, 0xc7, 0x8e, 0x92, 0x28, 0xac, 0x37, 0xd1, 0xc4, 0x23,
-       0x47, 0xc1, 0xa6, 0x8c, 0x12, 0x27, 0xa8, 0xac, 0x4a, 0x54, 0xc7, 0x24,
-       0x4e, 0x48, 0xc1, 0x29, 0x69, 0x6b, 0xb8, 0x2d, 0xa8, 0xf9, 0xc2, 0x84,
-       0x40, 0x43, 0xcb, 0xde, 0x6b, 0xee, 0xed, 0xae, 0x55, 0xdb, 0x49, 0x9c,
-       0x44, 0x96, 0x6c, 0xc7, 0x24, 0xa1, 0xdb, 0xff, 0xa2, 0xc4, 0xce, 0x07,
-       0x54, 0xb6, 0xd2, 0x96, 0xee, 0x86, 0xde, 0x74, 0xd1, 0x4d, 0x02, 0x18,
-       0xca, 0x47, 0xda, 0xe5, 0x76, 0x69, 0x7f, 0xbd, 0xc5, 0x97, 0x42, 0x08,
-       0x5b, 0x0a, 0xe9, 0xe7, 0x86, 0x7e, 0x30, 0xf7, 0x39, 0x23, 0x29, 0x31,
-       0x2c, 0xdb, 0x76, 0xff, 0xfa, 0xfd, 0xe6, 0x27, 0xcd, 0xe8, 0xfd, 0x38,
-       0xef, 0x79, 0xcf, 0x79, 0xce, 0x73, 0xde, 0x79, 0x67, 0xfc, 0x40, 0x39,
-       0x0a, 0x9f, 0x4a, 0x1e, 0x1f, 0x6a, 0xde, 0xb6, 0x61, 0x69, 0xe8, 0x43,
-       0x4b, 0xe5, 0xdc, 0xa9, 0x95, 0x38, 0xf1, 0x67, 0x7e, 0xfc, 0x7f, 0x6e,
-       0xc1, 0xc2, 0x47, 0xe1, 0xd1, 0x58, 0xf8, 0xed, 0x00, 0xb4, 0x62, 0xff,
-       0x72, 0xc0, 0xad, 0x46, 0xc6, 0x3a, 0x5a, 0x0c, 0xb8, 0x1d, 0x91, 0x6d,
-       0xb7, 0x6f, 0x30, 0x80, 0x68, 0xa6, 0xd1, 0xbf, 0x1c, 0x7f, 0xb0, 0xe2,
-       0x5e, 0x27, 0xe4, 0xfa, 0x5f, 0x46, 0x7e, 0xdf, 0xfd, 0xed, 0x6b, 0xf4,
-       0x0b, 0x69, 0x07, 0xdc, 0x5a, 0x24, 0x0e, 0xad, 0x01, 0xee, 0x3a, 0xd6,
-       0xf9, 0xca, 0x82, 0xaf, 0x28, 0xa8, 0x2a, 0xb6, 0x75, 0xde, 0xfa, 0xf6,
-       0x02, 0x5f, 0xac, 0x2c, 0xa2, 0xe1, 0xf1, 0x2c, 0xda, 0x9b, 0x06, 0xba,
-       0xad, 0x4a, 0x23, 0x04, 0xb7, 0x61, 0x74, 0x0c, 0x28, 0x9e, 0xf0, 0x96,
-       0x25, 0xf0, 0x94, 0x1a, 0x88, 0x5f, 0x11, 0x41, 0xfb, 0x95, 0xe3, 0xe5,
-       0x71, 0x67, 0xc4, 0x8d, 0xb6, 0xac, 0x3b, 0xfe, 0x17, 0x11, 0x03, 0x2b,
-       0xb3, 0x46, 0x19, 0xaa, 0x34, 0xf4, 0x65, 0x5f, 0x77, 0xe7, 0xdb, 0x6b,
-       0x2e, 0x7c, 0xdf, 0x56, 0x9b, 0xff, 0x9e, 0x15, 0x73, 0x46, 0x80, 0xed,
-       0x09, 0xcb, 0x2a, 0x89, 0xdc, 0x7c, 0xb3, 0x1a, 0x31, 0x7c, 0x47, 0xb0,
-       0x0c, 0xeb, 0x35, 0x7c, 0x71, 0x47, 0xf3, 0x2f, 0x94, 0x53, 0x23, 0x4d,
-       0x88, 0x1f, 0x75, 0x20, 0xaa, 0x3d, 0xcb, 0xef, 0xb9, 0x73, 0x3b, 0xc2,
-       0x4d, 0x38, 0x70, 0xf4, 0x22, 0xaf, 0x3b, 0xed, 0x6b, 0xbd, 0xfb, 0xe7,
-       0xce, 0xbd, 0x25, 0xfc, 0x2c, 0x1e, 0x3c, 0x2a, 0xbf, 0xef, 0x40, 0x77,
-       0x93, 0x82, 0xa9, 0x9b, 0x37, 0xc3, 0x61, 0x34, 0xa1, 0x6f, 0xbf, 0xe2,
-       0xec, 0x69, 0x52, 0x11, 0xf5, 0xea, 0xc1, 0x18, 0x27, 0xc1, 0x69, 0x20,
-       0x56, 0x1a, 0x09, 0x3b, 0xdf, 0x48, 0x44, 0x34, 0x87, 0x61, 0x59, 0xc1,
-       0xd0, 0x6c, 0x38, 0x6a, 0x2c, 0xeb, 0x31, 0xd3, 0x03, 0xff, 0xa7, 0x9e,
-       0x47, 0x7c, 0xb4, 0x1d, 0xaa, 0xf1, 0x3c, 0x7a, 0x46, 0x9f, 0xc7, 0x43,
-       0x7b, 0xcb, 0x31, 0x35, 0x83, 0xe3, 0x4d, 0xf9, 0xf0, 0xed, 0x05, 0xd2,
-       0xb7, 0xc8, 0xd1, 0xcc, 0xc3, 0x8d, 0x29, 0xc7, 0x39, 0x7e, 0x4b, 0x99,
-       0x8b, 0xd6, 0xd4, 0xec, 0xcb, 0x65, 0xb6, 0xb3, 0x4c, 0xdf, 0xfb, 0xca,
-       0xc4, 0x47, 0x23, 0xf8, 0x4e, 0x42, 0xc1, 0x96, 0x50, 0x15, 0xa2, 0x35,
-       0x32, 0x5e, 0xcb, 0x3a, 0x6a, 0x9e, 0xb3, 0xa6, 0x34, 0xe9, 0x6b, 0x12,
-       0xcf, 0xf2, 0xbf, 0x1d, 0xa1, 0x57, 0xad, 0x9c, 0x57, 0xda, 0xfb, 0x3c,
-       0x6d, 0x68, 0x2d, 0xaf, 0x3b, 0x91, 0x4a, 0x20, 0x56, 0x15, 0xf9, 0x04,
-       0xcf, 0x75, 0xf3, 0x2d, 0xc5, 0xed, 0x7e, 0x3b, 0xe1, 0xfe, 0x54, 0xa5,
-       0xa1, 0xde, 0x57, 0x0d, 0x27, 0x9e, 0xa3, 0xcc, 0x27, 0xcc, 0xcd, 0x70,
-       0x19, 0x5f, 0x10, 0x9b, 0xe3, 0xb8, 0x5e, 0xb4, 0x30, 0xbb, 0x58, 0x5f,
-       0xda, 0xd5, 0xb0, 0x23, 0x65, 0x59, 0xbb, 0xcc, 0xe8, 0x87, 0xcb, 0x68,
-       0x10, 0xa7, 0x13, 0xed, 0x70, 0x47, 0x02, 0xfe, 0xf3, 0x08, 0x63, 0x79,
-       0xd6, 0x8b, 0x27, 0x12, 0x70, 0xb6, 0x2c, 0xa8, 0x43, 0x4f, 0x36, 0x82,
-       0xeb, 0xb3, 0x26, 0x5a, 0xb3, 0x7f, 0xda, 0xca, 0x6e, 0x48, 0xf9, 0x39,
-       0x86, 0x3f, 0x58, 0xf9, 0x31, 0xc8, 0xf8, 0xe4, 0x9b, 0xf3, 0x9a, 0xba,
-       0x02, 0xbb, 0x47, 0x0c, 0xec, 0xe4, 0xfc, 0xad, 0x0a, 0xe5, 0xa2, 0x65,
-       0xd0, 0xcd, 0xf3, 0x88, 0x60, 0x45, 0xd6, 0xe0, 0x9c, 0x46, 0xb0, 0x3c,
-       0x55, 0xaf, 0x8d, 0x62, 0x21, 0xa2, 0xbe, 0xbc, 0x6d, 0xef, 0xe1, 0x78,
-       0xd7, 0x07, 0xda, 0x51, 0x49, 0x1b, 0xc9, 0x2c, 0x09, 0xa3, 0x85, 0xfd,
-       0xaf, 0xf9, 0x33, 0xfa, 0xbf, 0x89, 0xfd, 0xbf, 0xc5, 0xfe, 0x73, 0x76,
-       0xff, 0x70, 0xae, 0xe6, 0xb9, 0x9b, 0xf6, 0xb8, 0x3b, 0xe3, 0x74, 0xae,
-       0x4a, 0x79, 0xb1, 0x2b, 0x63, 0xd2, 0xe6, 0xe4, 0x2f, 0x1f, 0x76, 0x8c,
-       0xd4, 0x61, 0xe7, 0x88, 0xee, 0x7b, 0x8a, 0xbf, 0x7b, 0xc7, 0xae, 0xc0,
-       0xf6, 0x11, 0x05, 0x87, 0x8c, 0x2b, 0xd0, 0xc3, 0xdf, 0x07, 0x46, 0xe6,
-       0xe2, 0xc1, 0x11, 0x07, 0xc2, 0x33, 0xa6, 0x8f, 0x43, 0xbe, 0xaf, 0x40,
-       0x7c, 0xcc, 0x8f, 0x9e, 0xc4, 0xb3, 0xb6, 0x0e, 0x2b, 0x23, 0xdf, 0x2e,
-       0xfa, 0x33, 0x7d, 0xc7, 0x8f, 0x0d, 0x09, 0x1f, 0x7a, 0x52, 0xe2, 0x07,
-       0x6e, 0xda, 0xa6, 0xf8, 0xc1, 0xaf, 0x80, 0x2a, 0xb6, 0x9f, 0x2d, 0xfe,
-       0xaf, 0xc0, 0xc9, 0x79, 0xdb, 0xc8, 0xff, 0x76, 0xa5, 0xc4, 0x26, 0xa4,
-       0x4d, 0xb1, 0x0b, 0xf9, 0x5d, 0x4b, 0xbb, 0x2b, 0x87, 0xff, 0x70, 0x39,
-       0x82, 0x0f, 0x68, 0x78, 0xad, 0x59, 0xae, 0xd3, 0xde, 0x43, 0x52, 0x66,
-       0x10, 0x47, 0x32, 0xe2, 0xa7, 0x7e, 0xb4, 0x24, 0x26, 0xd9, 0x7e, 0x33,
-       0xdb, 0x36, 0xf1, 0x4f, 0xd9, 0x26, 0xfc, 0x63, 0x36, 0x88, 0x7f, 0xa0,
-       0x1e, 0xbf, 0x99, 0xf5, 0xe3, 0xd1, 0x6c, 0x1d, 0xbe, 0x91, 0xf5, 0xe1,
-       0xeb, 0x9c, 0xbf, 0xaf, 0x65, 0xdb, 0x69, 0xfb, 0x1a, 0x8e, 0x67, 0x45,
-       0xff, 0x25, 0x1c, 0x6f, 0x39, 0x7a, 0x47, 0xea, 0x83, 0xa7, 0x69, 0x5b,
-       0xff, 0x60, 0xae, 0x46, 0xae, 0xb6, 0xd9, 0xb6, 0xc9, 0x5d, 0xbc, 0xbe,
-       0x7b, 0xa4, 0x3e, 0x7a, 0xa5, 0x62, 0x59, 0x6a, 0xa8, 0x31, 0x7c, 0x4a,
-       0x55, 0x31, 0xe5, 0xd5, 0xfd, 0x39, 0x55, 0xf7, 0x47, 0xe1, 0x42, 0x82,
-       0xbe, 0x11, 0x9f, 0xa9, 0xa7, 0xe3, 0xb4, 0x29, 0xaf, 0x31, 0xca, 0xf1,
-       0xe8, 0xfe, 0xb8, 0xaa, 0x61, 0x67, 0x4a, 0x3f, 0x10, 0x57, 0xbd, 0x88,
-       0x67, 0xcb, 0xf1, 0xb3, 0x11, 0xbd, 0x3f, 0xae, 0xde, 0x88, 0x78, 0xad,
-       0x65, 0x7d, 0x3d, 0x84, 0x6d, 0xb3, 0x23, 0x88, 0xce, 0x8c, 0x20, 0x36,
-       0x37, 0x52, 0x87, 0x54, 0x0a, 0x78, 0x6b, 0xc0, 0xf0, 0xfd, 0x8b, 0xd2,
-       0x8e, 0xbf, 0x6e, 0xd7, 0xfd, 0x7e, 0xb5, 0x31, 0x3e, 0xaa, 0x2e, 0xa1,
-       0x4b, 0xc3, 0xef, 0x8b, 0xac, 0x44, 0x97, 0x7d, 0x4d, 0x81, 0x66, 0x78,
-       0xd1, 0x9b, 0xfa, 0x30, 0x62, 0xde, 0xfa, 0x8e, 0x21, 0xb5, 0xfe, 0xa2,
-       0xa9, 0xea, 0x93, 0xed, 0xaa, 0x65, 0xfd, 0x7c, 0xf1, 0x5b, 0x96, 0x7f,
-       0x96, 0x65, 0x2d, 0x5a, 0x2c, 0x7d, 0xfa, 0x51, 0x13, 0x31, 0xb1, 0xd6,
-       0x9e, 0xc3, 0x72, 0x9c, 0x1b, 0xa9, 0x65, 0x1f, 0x1a, 0xfe, 0xf7, 0x35,
-       0x7a, 0x70, 0xb3, 0x5a, 0x8e, 0xd7, 0xc6, 0xca, 0xf1, 0x0a, 0xc7, 0xf3,
-       0x8b, 0x11, 0x1f, 0x7e, 0x35, 0x62, 0x59, 0x9f, 0x32, 0xff, 0x0a, 0xc3,
-       0xb5, 0x83, 0xf8, 0xc7, 0x09, 0x2f, 0x7e, 0x96, 0xd0, 0xf0, 0x6a, 0x22,
-       0x7a, 0xef, 0x0c, 0xe8, 0xd1, 0x09, 0xe5, 0xf4, 0xed, 0x55, 0x68, 0x6c,
-       0xaf, 0x52, 0xf4, 0xb6, 0x3d, 0xd0, 0x7d, 0x57, 0x2a, 0x5e, 0x9c, 0xcf,
-       0x68, 0xf8, 0x49, 0xa6, 0x3e, 0xfc, 0xcf, 0xec, 0xf3, 0x37, 0xe6, 0x63,
-       0x56, 0x6e, 0x96, 0xe8, 0x4d, 0x74, 0x44, 0x3d, 0xa7, 0xa8, 0xe7, 0x14,
-       0xf5, 0x9c, 0xa2, 0x9e, 0x29, 0xc3, 0xa3, 0x29, 0xea, 0x99, 0xba, 0xfb,
-       0x3a, 0x6d, 0xea, 0x6b, 0x9c, 0xc7, 0xe3, 0xf6, 0x3c, 0x86, 0x39, 0x5f,
-       0x7f, 0x81, 0xbf, 0xb5, 0xb1, 0xf5, 0x59, 0xeb, 0xbf, 0x79, 0x65, 0x4c,
-       0x0f, 0xcf, 0xcc, 0xe3, 0x97, 0x8c, 0xed, 0x3b, 0x56, 0x4c, 0x93, 0x71,
-       0xc9, 0xf8, 0x6c, 0xfd, 0xf9, 0xb7, 0x29, 0x3b, 0x15, 0x94, 0x5b, 0xd6,
-       0x5e, 0xb3, 0xf0, 0xbf, 0xb7, 0x38, 0xbe, 0x9b, 0x95, 0xbc, 0x5d, 0xfd,
-       0x5d, 0x29, 0xf5, 0x1d, 0x8c, 0xaa, 0x2b, 0x79, 0xae, 0xc7, 0xa3, 0xf8,
-       0xa8, 0xe3, 0xbd, 0xe7, 0xf7, 0x7a, 0x65, 0x3e, 0xfc, 0x97, 0xce, 0x69,
-       0x8f, 0x76, 0x7f, 0x77, 0xf2, 0x5c, 0xc6, 0x22, 0xb6, 0x28, 0x36, 0xe0,
-       0xa5, 0xbd, 0x5c, 0x53, 0xf8, 0x0f, 0x71, 0x35, 0xb2, 0x0d, 0xed, 0xcd,
-       0x8f, 0xd8, 0x7d, 0x94, 0x24, 0xc5, 0x6f, 0x14, 0xbc, 0xf5, 0x61, 0x05,
-       0xa7, 0x42, 0x06, 0x6d, 0xe6, 0x18, 0x71, 0x01, 0x28, 0x4d, 0xc2, 0xed,
-       0x89, 0x44, 0x90, 0x18, 0x80, 0xbb, 0x2c, 0x12, 0xc6, 0xc2, 0x81, 0xfa,
-       0xce, 0x73, 0xd0, 0x83, 0x03, 0x8a, 0xde, 0xce, 0x58, 0x62, 0x8e, 0x53,
-       0x8f, 0x57, 0x2a, 0xba, 0xbf, 0x44, 0x81, 0x5b, 0x61, 0xb9, 0x40, 0xe6,
-       0x18, 0x76, 0x66, 0xe5, 0x77, 0x18, 0x46, 0xe6, 0x37, 0xc5, 0xbe, 0x24,
-       0xa6, 0xd0, 0xee, 0xcf, 0x71, 0xec, 0xba, 0x9f, 0xf8, 0xea, 0x76, 0x45,
-       0x3a, 0x71, 0x38, 0x01, 0x77, 0x49, 0x64, 0x2b, 0x9e, 0x4c, 0x84, 0x67,
-       0x16, 0xcb, 0x29, 0x2c, 0xe7, 0xcf, 0x4c, 0x97, 0xe5, 0xc7, 0x56, 0xd4,
-       0x9b, 0x97, 0xa5, 0x3c, 0x79, 0x0c, 0x7b, 0x52, 0x52, 0x37, 0x62, 0xd7,
-       0x75, 0xb2, 0x8f, 0xbe, 0x44, 0x7d, 0xdb, 0x0d, 0x8a, 0x1e, 0x7e, 0x98,
-       0xf3, 0xd7, 0x83, 0xc6, 0xe8, 0x1b, 0xd0, 0xb5, 0x4e, 0xe4, 0x65, 0x59,
-       0x90, 0xc9, 0xcb, 0x31, 0x3f, 0x03, 0xe5, 0xf6, 0x14, 0xac, 0x39, 0x06,
-       0x3c, 0x3e, 0xc3, 0xf0, 0xbf, 0xe3, 0xa8, 0xc5, 0x01, 0xce, 0x4f, 0x1f,
-       0x7d, 0x45, 0xf0, 0xec, 0xee, 0xbd, 0x7e, 0x78, 0x0c, 0x0b, 0x47, 0x42,
-       0xb5, 0x78, 0x96, 0x58, 0x5b, 0x45, 0xdf, 0x7c, 0x5e, 0x43, 0x74, 0x4e,
-       0x24, 0xac, 0xdc, 0x92, 0x1d, 0x2d, 0xcc, 0xc1, 0x8b, 0x35, 0x05, 0x19,
-       0xdf, 0x77, 0xbd, 0x5a, 0xf9, 0xe0, 0xeb, 0x50, 0x3a, 0x52, 0x7a, 0x30,
-       0x0e, 0x0b, 0xd5, 0x8b, 0x75, 0xff, 0x94, 0xf2, 0x96, 0x8a, 0x2a, 0x62,
-       0x75, 0xf6, 0xfd, 0xe5, 0x1a, 0xb5, 0x31, 0xc6, 0x65, 0x07, 0x43, 0x5f,
-       0x54, 0xd3, 0x4d, 0x36, 0x13, 0x74, 0xd9, 0xd7, 0x1c, 0x48, 0x3b, 0xa3,
-       0x3e, 0x07, 0x7e, 0x6f, 0x45, 0xd7, 0xc9, 0xb5, 0x72, 0xc4, 0xda, 0x1b,
-       0x7d, 0x4e, 0x34, 0x86, 0xb7, 0xd3, 0x07, 0xa7, 0xd6, 0xb5, 0xf0, 0xbf,
-       0x80, 0x79, 0x1a, 0xf5, 0xfe, 0xed, 0x90, 0xdf, 0xef, 0xd0, 0x6e, 0x5a,
-       0xa4, 0x2e, 0xcb, 0x88, 0x1d, 0xea, 0x9a, 0xf8, 0x78, 0x9f, 0x69, 0x59,
-       0x87, 0xcd, 0x13, 0x4a, 0x4b, 0xea, 0x5d, 0x2b, 0xea, 0x8c, 0x47, 0x4b,
-       0x23, 0x01, 0x73, 0x27, 0xc1, 0xd8, 0x11, 0x89, 0x2b, 0xd1, 0x6c, 0x9f,
-       0x72, 0x7d, 0xb6, 0x5f, 0x59, 0x91, 0x95, 0xf2, 0x27, 0x94, 0xe5, 0x59,
-       0x29, 0x5f, 0x2c, 0x1b, 0x66, 0x59, 0xe0, 0x48, 0x22, 0x10, 0x2c, 0x96,
-       0x5f, 0xc1, 0xb2, 0xd7, 0x5f, 0x2a, 0x1b, 0xa6, 0xad, 0x9a, 0x9c, 0x97,
-       0x0a, 0x6c, 0xd6, 0xf4, 0x68, 0x9c, 0x3a, 0x2f, 0x8d, 0xf8, 0x6e, 0x7d,
-       0xdd, 0xc8, 0x05, 0x1d, 0x9c, 0x83, 0xa3, 0x1c, 0x59, 0x2b, 0x71, 0x6e,
-       0x83, 0xe1, 0x42, 0xbf, 0x56, 0x8d, 0x0d, 0xe6, 0x6f, 0xad, 0xcd, 0xeb,
-       0xe4, 0xbf, 0xbc, 0x6c, 0xb0, 0xcb, 0xd7, 0xb1, 0xbc, 0x6e, 0x1e, 0x2d,
-       0x60, 0xeb, 0xa9, 0x04, 0x06, 0x1d, 0x11, 0x62, 0x7e, 0x73, 0xc0, 0xdf,
-       0x03, 0x99, 0x1b, 0x3f, 0xae, 0xa7, 0x2c, 0x69, 0xe7, 0x74, 0xfc, 0x45,
-       0xfc, 0x72, 0x19, 0xb9, 0x26, 0xe5, 0xa6, 0x68, 0xdf, 0x82, 0x75, 0x96,
-       0x35, 0x64, 0x8a, 0x9d, 0xfb, 0x68, 0xe7, 0x33, 0xe1, 0xaf, 0xd5, 0xe3,
-       0x69, 0x56, 0x38, 0x9c, 0x98, 0x81, 0xb4, 0xa6, 0x12, 0x73, 0xef, 0xf2,
-       0xa0, 0x2a, 0xaa, 0x94, 0x90, 0xdb, 0x60, 0x42, 0xc6, 0x59, 0x89, 0xa8,
-       0x53, 0x0f, 0xca, 0xdc, 0x95, 0x30, 0xe6, 0x35, 0xa8, 0xac, 0x77, 0xc9,
-       0x97, 0x65, 0xcc, 0x7e, 0xfa, 0x72, 0xdc, 0xd6, 0x51, 0xeb, 0xa5, 0x71,
-       0x4b, 0x7b, 0x45, 0x1d, 0xfd, 0x67, 0xea, 0x59, 0xd6, 0x8e, 0x4b, 0xba,
-       0x2d, 0x89, 0x96, 0x51, 0xb7, 0xc7, 0x12, 0x81, 0xf0, 0xd3, 0x88, 0x2b,
-       0x6d, 0x59, 0x27, 0xc6, 0x12, 0x52, 0xaf, 0x8f, 0xe5, 0xfb, 0x95, 0x95,
-       0x97, 0xea, 0x4c, 0x15, 0xfc, 0x56, 0xc6, 0x23, 0xe3, 0xbb, 0x0e, 0x1b,
-       0xf6, 0xea, 0xf1, 0x38, 0xc4, 0xae, 0xa2, 0x58, 0x6f, 0xea, 0x7e, 0xda,
-       0x1f, 0xed, 0x06, 0xa8, 0x49, 0xc6, 0xdc, 0x79, 0x0c, 0x00, 0xee, 0xd8,
-       0xdb, 0xce, 0xb1, 0x5a, 0x78, 0xcd, 0xac, 0xc5, 0x18, 0xbd, 0xb4, 0x3a,
-       0x29, 0xd7, 0xa7, 0xcb, 0x18, 0x51, 0xd6, 0x1f, 0xf5, 0x97, 0xa1, 0x5c,
-       0xe4, 0xfc, 0x1b, 0x35, 0x6f, 0xbf, 0x1f, 0x54, 0xff, 0x17, 0xd6, 0x98,
-       0x37, 0x7f, 0xad, 0x3a, 0x29, 0x9c, 0xaf, 0x1d, 0x5a, 0xd2, 0xc3, 0x78,
-       0x17, 0xb7, 0x2a, 0x0c, 0xbd, 0xfd, 0x82, 0xd2, 0x8d, 0x1b, 0x43, 0x7a,
-       0xec, 0x87, 0x8a, 0x1e, 0x1d, 0x50, 0x0c, 0xfa, 0x61, 0x10, 0xab, 0xb2,
-       0xef, 0xef, 0xeb, 0xfb, 0x50, 0x0f, 0x4b, 0x3f, 0xd2, 0xdf, 0x59, 0xf4,
-       0xdb, 0x63, 0x2a, 0x8e, 0x47, 0xc6, 0xa6, 0x60, 0xb3, 0x3d, 0xa6, 0x15,
-       0xb6, 0x7f, 0x7c, 0xd7, 0x74, 0x61, 0xe3, 0xde, 0x53, 0x0b, 0xc5, 0x40,
-       0x36, 0x1d, 0x8d, 0xa2, 0xb7, 0xd9, 0x85, 0x0d, 0xa3, 0x37, 0xa9, 0x22,
-       0x1b, 0xd4, 0xf9, 0x65, 0xf9, 0x6f, 0x85, 0xbc, 0xc5, 0x83, 0xf5, 0x59,
-       0xce, 0x1d, 0x31, 0x74, 0xfd, 0x51, 0x99, 0xdb, 0x5a, 0x7e, 0xcb, 0xdc,
-       0x7a, 0xf9, 0x2d, 0xf3, 0x3c, 0x8b, 0xdf, 0xd5, 0xf0, 0xcf, 0x12, 0x59,
-       0x9a, 0x91, 0xd8, 0x0f, 0x77, 0x45, 0xa4, 0x0b, 0x77, 0x0d, 0x58, 0x56,
-       0x7f, 0xc0, 0xb2, 0xca, 0x42, 0xe4, 0x59, 0x81, 0xc6, 0xf0, 0x95, 0x4a,
-       0x09, 0xa6, 0xb4, 0x66, 0xf4, 0x1f, 0x2d, 0x89, 0x55, 0x47, 0x66, 0xd1,
-       0xf7, 0x35, 0xfc, 0x6c, 0x49, 0x3b, 0x26, 0xc6, 0xa7, 0x8f, 0x21, 0x6f,
-       0x67, 0xdf, 0x5e, 0x50, 0xb4, 0x33, 0x91, 0x5f, 0x64, 0xd7, 0xfb, 0xd3,
-       0xf4, 0xcb, 0xb8, 0x86, 0x18, 0xfd, 0x83, 0x32, 0xd5, 0xa2, 0xe7, 0x12,
-       0xa7, 0xfe, 0xa0, 0xfa, 0x17, 0x1b, 0x3b, 0x13, 0xef, 0x5a, 0x0c, 0xa7,
-       0xfc, 0xe4, 0x1a, 0xef, 0xcd, 0xbc, 0xd7, 0x6e, 0xca, 0x6c, 0xbb, 0x91,
-       0xb2, 0x17, 0x1b, 0xef, 0xcc, 0xac, 0xb0, 0xc7, 0x9c, 0x66, 0xe1, 0x4d,
-       0x7b, 0x45, 0xa7, 0xa2, 0x03, 0x0b, 0xc7, 0xcd, 0xeb, 0x88, 0x15, 0xaf,
-       0x5b, 0x8e, 0x59, 0xd2, 0x46, 0x97, 0xd2, 0x4a, 0x7b, 0x8a, 0x3b, 0x4b,
-       0x41, 0x4e, 0xad, 0x95, 0x44, 0xa2, 0xca, 0x5a, 0x5b, 0xff, 0xad, 0xca,
-       0xca, 0xd1, 0xe9, 0x6d, 0x77, 0xd1, 0x77, 0x1f, 0x57, 0xf3, 0xf3, 0x7d,
-       0xde, 0x1e, 0x43, 0x5e, 0x7e, 0x3f, 0xda, 0x53, 0xd2, 0x8e, 0xe8, 0x35,
-       0xef, 0x6f, 0xed, 0x12, 0x23, 0x2e, 0xc9, 0x9c, 0xe7, 0x1e, 0x97, 0x31,
-       0x61, 0xc9, 0x7b, 0xf0, 0xe3, 0x7a, 0xe2, 0x47, 0xf4, 0x3f, 0xc4, 0x8f,
-       0xa5, 0x7f, 0xa2, 0xec, 0x59, 0xca, 0x21, 0x3c, 0x45, 0xe2, 0x9e, 0xf0,
-       0x16, 0xe1, 0x2b, 0x41, 0xca, 0x25, 0xfc, 0xa5, 0x68, 0x1b, 0x96, 0xf5,
-       0x4d, 0x73, 0x01, 0x62, 0xb5, 0xfa, 0x20, 0x50, 0x87, 0x41, 0xca, 0xea,
-       0x48, 0x22, 0xce, 0x71, 0x52, 0xd7, 0xea, 0x75, 0x0e, 0xa8, 0x4d, 0x0e,
-       0x74, 0xe3, 0x55, 0xd3, 0xe8, 0xdf, 0x8c, 0xbf, 0x44, 0x8f, 0xd7, 0xc2,
-       0x61, 0x33, 0x48, 0x5c, 0x2a, 0x47, 0x67, 0x13, 0x27, 0x62, 0xad, 0x17,
-       0x43, 0xa9, 0x78, 0x07, 0x61, 0x83, 0x31, 0xec, 0xd9, 0x4f, 0x26, 0x02,
-       0x7a, 0xfb, 0x56, 0xa6, 0x40, 0xab, 0x06, 0xdc, 0xf0, 0x4b, 0x2a, 0xc4,
-       0x98, 0xf1, 0x75, 0xc6, 0xf9, 0x4d, 0xe6, 0x15, 0xd4, 0x6d, 0x1f, 0x6d,
-       0x48, 0xa5, 0xbd, 0x48, 0x3f, 0x41, 0xf2, 0x19, 0xa9, 0xcb, 0xb8, 0xd0,
-       0xa0, 0xe0, 0x86, 0x06, 0xda, 0x27, 0x79, 0xd1, 0xe7, 0x43, 0x4e, 0xfb,
-       0xff, 0x44, 0xb6, 0x31, 0x7a, 0xb3, 0xfa, 0x23, 0x0b, 0x33, 0xed, 0x36,
-       0xb4, 0xa8, 0x4a, 0xb9, 0xff, 0x28, 0x27, 0x30, 0x21, 0x5c, 0xad, 0xd2,
-       0xf8, 0x0d, 0xc6, 0xbd, 0x52, 0xa7, 0x0a, 0x15, 0xc3, 0xf1, 0x59, 0xe5,
-       0xb4, 0xe1, 0xd2, 0x88, 0x8e, 0xbb, 0x46, 0x2b, 0xe1, 0x18, 0xd6, 0x2f,
-       0xae, 0x74, 0x20, 0x56, 0x22, 0xfc, 0x70, 0xb4, 0x16, 0x35, 0xfb, 0xac,
-       0x6e, 0x77, 0xc4, 0xb2, 0x3c, 0x4b, 0x22, 0xb8, 0xf7, 0xa8, 0x06, 0x75,
-       0x9f, 0x0b, 0x15, 0xcc, 0x43, 0xd6, 0x99, 0x7d, 0xb8, 0x8f, 0xfc, 0x6e,
-       0x4e, 0x32, 0x88, 0xd5, 0xc4, 0xa2, 0x8b, 0xa9, 0xb6, 0xd6, 0x17, 0x12,
-       0x0d, 0xdb, 0xe6, 0x38, 0x84, 0xfb, 0xaf, 0xc1, 0xe6, 0xec, 0x1a, 0xdc,
-       0xc9, 0xd8, 0xf9, 0x9c, 0x81, 0xee, 0x39, 0xf4, 0xd7, 0x3b, 0xc9, 0xff,
-       0x36, 0xa6, 0xd6, 0x61, 0x63, 0x76, 0x1b, 0xff, 0xeb, 0xc0, 0xdd, 0x3c,
-       0x36, 0xa5, 0xc4, 0xbf, 0x3f, 0x8d, 0x4d, 0xd9, 0x7a, 0xc4, 0x46, 0x37,
-       0x62, 0x2b, 0x39, 0xc1, 0x5d, 0xa3, 0x5e, 0xea, 0xb6, 0x0d, 0x1b, 0xb2,
-       0x6d, 0xb8, 0x97, 0x63, 0xb9, 0x97, 0xf3, 0xa1, 0x26, 0xb7, 0xd2, 0xc7,
-       0x3c, 0xf0, 0x0e, 0x2f, 0xc5, 0x7d, 0xa3, 0xd7, 0x61, 0x0b, 0xe3, 0xe4,
-       0xed, 0x4b, 0xae, 0x43, 0xf7, 0xe8, 0x7d, 0xe8, 0x4a, 0x19, 0x5d, 0x73,
-       0x98, 0x6a, 0xbd, 0xb5, 0xe4, 0x3e, 0xdc, 0x43, 0x39, 0xb6, 0xed, 0xb5,
-       0x50, 0xb6, 0x68, 0xb1, 0x6a, 0xd4, 0xc4, 0x2d, 0x9f, 0x21, 0xb1, 0xf9,
-       0xc0, 0xad, 0x7d, 0xc6, 0xee, 0x02, 0xb6, 0x38, 0x51, 0x62, 0x28, 0x62,
-       0xa3, 0xf9, 0xeb, 0x89, 0xbf, 0xc1, 0xe6, 0x51, 0x17, 0xee, 0x18, 0xed,
-       0x52, 0x56, 0x8b, 0xad, 0xb8, 0x54, 0xce, 0x67, 0x94, 0xd8, 0xd7, 0xaa,
-       0xb4, 0x8c, 0xda, 0xf3, 0xac, 0x79, 0x23, 0x5d, 0xca, 0xba, 0xec, 0x9d,
-       0x0e, 0x94, 0xcb, 0x5c, 0x5c, 0x83, 0xf1, 0xa6, 0xaf, 0x58, 0xe9, 0xfc,
-       0x7c, 0xa6, 0xe9, 0x3e, 0x6e, 0x5f, 0xe4, 0x57, 0x9f, 0xf4, 0x2d, 0xd0,
-       0xbb, 0x0e, 0xa8, 0xc2, 0x2b, 0xdd, 0xc8, 0xd9, 0xf3, 0x59, 0xc2, 0x7e,
-       0x6a, 0x70, 0xc4, 0x9b, 0xe7, 0x12, 0xf3, 0xd8, 0x97, 0x95, 0x72, 0x71,
-       0xac, 0x94, 0x9b, 0xe3, 0x99, 0x93, 0xf4, 0xe1, 0x7e, 0xea, 0xa7, 0x8b,
-       0x73, 0xd4, 0x45, 0xbd, 0x7c, 0x2e, 0x75, 0x8a, 0x31, 0x62, 0x1b, 0x3e,
-       0x57, 0xe8, 0xa7, 0x2f, 0x5b, 0x8a, 0x72, 0xa3, 0x0f, 0x8f, 0x68, 0x25,
-       0xf4, 0x31, 0xe1, 0x19, 0x07, 0x6e, 0x3d, 0x6c, 0xac, 0xe3, 0x18, 0xbe,
-       0xc4, 0x36, 0x44, 0xae, 0x46, 0xad, 0x06, 0xf9, 0xb2, 0x3d, 0xc4, 0xec,
-       0x72, 0xe3, 0x37, 0xd6, 0x23, 0xde, 0x76, 0xbb, 0x6c, 0x15, 0xcb, 0x3e,
-       0x3f, 0xe0, 0xc7, 0x8d, 0xb4, 0xef, 0xb2, 0x64, 0x94, 0x7a, 0x77, 0x93,
-       0x53, 0xb5, 0x52, 0xe7, 0x9c, 0x63, 0xea, 0xf5, 0x0e, 0xda, 0xb3, 0x33,
-       0xb9, 0x86, 0xf3, 0xa0, 0xa1, 0x32, 0xd9, 0xc7, 0x79, 0xf0, 0xc2, 0x9d,
-       0x6c, 0x47, 0x27, 0xe5, 0x72, 0x25, 0xd7, 0x71, 0x2e, 0xea, 0xe0, 0x49,
-       0x76, 0x70, 0x2e, 0x80, 0xbb, 0xa8, 0xcb, 0xfb, 0x42, 0xbf, 0x56, 0x7a,
-       0x6b, 0x65, 0x18, 0x6d, 0x9c, 0xbf, 0x28, 0x36, 0xa7, 0xea, 0xc3, 0x3b,
-       0x24, 0xee, 0x3b, 0x99, 0x90, 0x19, 0x3f, 0x26, 0x17, 0xa6, 0xf5, 0x1b,
-       0x3d, 0xfc, 0x5d, 0x94, 0xb3, 0x88, 0xe3, 0x22, 0xa7, 0xc4, 0xd7, 0xa2,
-       0x9c, 0x2e, 0x94, 0x19, 0xcf, 0x5a, 0x0f, 0x7b, 0xe1, 0x77, 0xb1, 0x6c,
-       0x39, 0xcb, 0xae, 0xa6, 0x9c, 0xab, 0x29, 0xff, 0xbc, 0xe4, 0xa7, 0xd1,
-       0x4d, 0x39, 0xe7, 0x0c, 0xbb, 0xc9, 0x51, 0x75, 0xdc, 0x4f, 0xdd, 0x1f,
-       0x48, 0x95, 0xa1, 0x9a, 0xf3, 0xfc, 0x39, 0xfe, 0xde, 0x41, 0x3f, 0x7a,
-       0x7e, 0xd0, 0xc2, 0x99, 0x90, 0x86, 0x41, 0xad, 0x0c, 0xbd, 0xc1, 0xad,
-       0xe4, 0xe5, 0x32, 0x57, 0xcc, 0xa7, 0x8c, 0x0a, 0xc6, 0x75, 0xc4, 0x5d,
-       0xcd, 0x3a, 0xb6, 0x07, 0xdd, 0x48, 0x7b, 0x11, 0x75, 0x19, 0x51, 0xda,
-       0xb8, 0x0b, 0x03, 0x9a, 0x02, 0x17, 0xf1, 0xb0, 0x94, 0xfe, 0xb4, 0x93,
-       0x71, 0xd7, 0x15, 0x91, 0xff, 0x68, 0x27, 0xe4, 0x60, 0xd5, 0x11, 0x23,
-       0xfe, 0x82, 0x12, 0x68, 0x73, 0xa9, 0xf7, 0x51, 0x47, 0x15, 0x38, 0x33,
-       0xf8, 0x25, 0x6c, 0x64, 0x5f, 0x7d, 0x29, 0x0f, 0x73, 0x93, 0xbf, 0x53,
-       0x72, 0x36, 0x7e, 0x7a, 0x90, 0x1c, 0x79, 0xdc, 0x9a, 0x67, 0x88, 0xdd,
-       0x44, 0x70, 0xcf, 0xd1, 0x2a, 0x0c, 0x0e, 0x5e, 0x87, 0x6d, 0x2c, 0xb7,
-       0x2b, 0x55, 0x0d, 0x63, 0x68, 0x99, 0x5d, 0x67, 0x84, 0xfe, 0x35, 0x90,
-       0xbc, 0x0f, 0x2b, 0x53, 0xf5, 0xc1, 0xa3, 0x4a, 0x8c, 0x3a, 0xf4, 0xa2,
-       0x3f, 0xb9, 0xd1, 0xd6, 0x69, 0x62, 0x5f, 0x27, 0xb6, 0x1e, 0xbd, 0x02,
-       0x7b, 0xf6, 0x6d, 0xc1, 0x5d, 0x47, 0x99, 0xbf, 0xda, 0xb6, 0xac, 0xa2,
-       0x77, 0xdf, 0x75, 0xca, 0x06, 0xb6, 0xb7, 0x7b, 0x98, 0xf6, 0x4c, 0x9b,
-       0xbe, 0x7f, 0xaf, 0x91, 0x5b, 0xe6, 0xd8, 0xa2, 0xf8, 0x6b, 0xaf, 0x43,
-       0x97, 0x6d, 0x7b, 0x79, 0xbd, 0xed, 0xc8, 0xce, 0x67, 0x9e, 0xf3, 0xb7,
-       0xd6, 0xa3, 0xde, 0x52, 0x7b, 0x7e, 0x55, 0xea, 0xad, 0x25, 0xc1, 0xdc,
-       0xbf, 0x96, 0xb9, 0x57, 0xc1, 0x5e, 0x7a, 0xb3, 0x8b, 0xc9, 0x1b, 0xbd,
-       0xc8, 0x68, 0x41, 0xea, 0xa3, 0x38, 0x0f, 0x0d, 0x05, 0x7b, 0x79, 0x8b,
-       0x65, 0x6c, 0x5b, 0x7e, 0x9f, 0x2f, 0xc8, 0xfc, 0xb6, 0xa3, 0x86, 0xf1,
-       0x75, 0x43, 0x68, 0x9d, 0x72, 0xaf, 0x76, 0x69, 0xce, 0x7c, 0xc5, 0x39,
-       0x93, 0x3c, 0xd1, 0x6e, 0x2b, 0xf1, 0x25, 0xdb, 0x76, 0xaf, 0xcf, 0x36,
-       0xa3, 0x73, 0x74, 0x7a, 0xfb, 0xc5, 0x3a, 0x65, 0x9c, 0x8b, 0xe2, 0x3c,
-       0xeb, 0xfd, 0x82, 0x65, 0x81, 0x45, 0x45, 0x2c, 0xbb, 0xb3, 0xd0, 0xff,
-       0x41, 0x8b, 0x31, 0xc9, 0xe9, 0x32, 0x1c, 0x18, 0x09, 0xfe, 0x57, 0x25,
-       0x5e, 0xeb, 0xa4, 0xcc, 0x0a, 0xb1, 0xe4, 0xef, 0xac, 0x3d, 0xeb, 0x64,
-       0x5e, 0x3e, 0x42, 0x43, 0x86, 0xe2, 0xba, 0xe4, 0xb3, 0x6b, 0xb0, 0x3e,
-       0x25, 0xb2, 0xb6, 0x63, 0x43, 0xca, 0x96, 0xcb, 0x5f, 0x94, 0xab, 0x8f,
-       0x36, 0xa3, 0x25, 0x77, 0xdb, 0x32, 0xb5, 0xd3, 0xae, 0xee, 0xd9, 0xab,
-       0xe2, 0xe9, 0xd0, 0x26, 0xc5, 0x3f, 0x53, 0xe2, 0x70, 0x3d, 0xba, 0xf6,
-       0xca, 0xb7, 0x9f, 0x7c, 0x37, 0xa6, 0x4c, 0xcd, 0x1c, 0x60, 0xb9, 0x65,
-       0x58, 0xbf, 0xb7, 0x16, 0x73, 0x38, 0xd6, 0xdb, 0xcd, 0xff, 0xa2, 0xbc,
-       0x33, 0x43, 0xc6, 0xb3, 0xa2, 0x10, 0xcb, 0xeb, 0x71, 0xdf, 0x5e, 0xf1,
-       0x21, 0xf9, 0xdd, 0x82, 0xde, 0xa5, 0xf5, 0x85, 0x38, 0xff, 0x37, 0x9c,
-       0x97, 0x2e, 0xe5, 0x06, 0xe2, 0x42, 0x8c, 0xb8, 0x40, 0x9b, 0x52, 0xda,
-       0x89, 0x0b, 0xd7, 0x17, 0x70, 0xc1, 0x43, 0x5c, 0x58, 0x93, 0x7d, 0x9b,
-       0xf2, 0x88, 0x2f, 0xbe, 0x57, 0x9e, 0xbb, 0x29, 0xcf, 0xb1, 0xd0, 0x1c,
-       0xc0, 0x96, 0x67, 0x19, 0x79, 0x4c, 0x2d, 0xe7, 0xd0, 0x62, 0x7c, 0x50,
-       0x94, 0x11, 0x5b, 0xcf, 0xcb, 0x28, 0xb3, 0xd8, 0x94, 0x45, 0xb9, 0x7f,
-       0x8f, 0x06, 0x7b, 0x7d, 0xe0, 0xb2, 0x3c, 0xeb, 0xf7, 0xbe, 0xcb, 0x1c,
-       0x41, 0x7e, 0x13, 0x2f, 0x9a, 0xeb, 0x89, 0x73, 0xcb, 0x88, 0x7b, 0x2e,
-       0x8e, 0x4b, 0xb0, 0x4e, 0x64, 0x73, 0xd1, 0x2f, 0xa4, 0x6d, 0xd1, 0xc9,
-       0x52, 0x47, 0x7e, 0x1e, 0x8a, 0xf3, 0xec, 0xa4, 0x1f, 0xbb, 0x51, 0x1d,
-       0xd1, 0xa3, 0x37, 0x39, 0x64, 0xce, 0x88, 0xf2, 0x43, 0xed, 0x85, 0xbe,
-       0xfe, 0xbb, 0xd2, 0x50, 0xd3, 0x4f, 0x39, 0x4f, 0x28, 0xb7, 0x70, 0x5c,
-       0xfe, 0xd2, 0xaa, 0xa8, 0x27, 0x12, 0xe8, 0x48, 0xbc, 0x2f, 0x36, 0xde,
-       0x90, 0xcd, 0xf3, 0x4b, 0x75, 0x28, 0x6e, 0x95, 0xd3, 0xf6, 0x9d, 0x46,
-       0xe0, 0xe2, 0x6a, 0xf6, 0x30, 0xef, 0xa0, 0xf0, 0x19, 0x93, 0x6d, 0x15,
-       0xfb, 0xaa, 0x23, 0x96, 0x84, 0x0a, 0x76, 0xb0, 0x46, 0x61, 0xde, 0xd0,
-       0x16, 0xb5, 0xed, 0x61, 0x17, 0xf5, 0x75, 0x42, 0xf9, 0x98, 0x70, 0x66,
-       0x9b, 0x63, 0xc4, 0x95, 0x55, 0xc4, 0x95, 0xea, 0xa4, 0x12, 0xf5, 0x46,
-       0x1a, 0xb7, 0xd5, 0x20, 0xd0, 0xf6, 0x28, 0xfb, 0xac, 0x21, 0xcf, 0xbc,
-       0x89, 0xb1, 0x36, 0xc9, 0x3e, 0x57, 0xb1, 0xcf, 0xb5, 0xd9, 0x2d, 0x6c,
-       0x57, 0xb0, 0x55, 0xc5, 0x9c, 0x7d, 0x70, 0x7b, 0x69, 0x07, 0x23, 0x0d,
-       0x4e, 0x84, 0x17, 0xff, 0x02, 0x98, 0x81, 0x98, 0xca, 0xfc, 0x7d, 0x5e,
-       0x52, 0x72, 0xa9, 0x03, 0xb7, 0x2e, 0xcb, 0x08, 0x96, 0x6a, 0xf0, 0x0c,
-       0x7b, 0x25, 0x1e, 0xa1, 0x2f, 0x54, 0xa7, 0xec, 0xb1, 0xf1, 0x56, 0x45,
-       0xd9, 0x3e, 0x05, 0x57, 0x85, 0xbe, 0xae, 0xa4, 0x67, 0xe6, 0x31, 0x5f,
-       0xa5, 0x3e, 0x7a, 0x26, 0x04, 0x1b, 0xd3, 0xc4, 0xc6, 0x63, 0x4a, 0x7e,
-       0x3d, 0x86, 0x7e, 0x9f, 0x42, 0xbc, 0x2a, 0x22, 0x6b, 0x20, 0x81, 0xce,
-       0x0f, 0x29, 0xf7, 0x11, 0x0b, 0x5d, 0x8c, 0x43, 0x1e, 0x62, 0xa3, 0xc4,
-       0xe9, 0xf4, 0xad, 0x89, 0x81, 0x3a, 0xf4, 0xd3, 0xb7, 0x37, 0x1e, 0x3d,
-       0x75, 0x8b, 0x07, 0xb5, 0xfc, 0xf6, 0xf2, 0x98, 0xc5, 0xc3, 0x4d, 0x5f,
-       0x76, 0xc3, 0x31, 0x20, 0x7c, 0xaf, 0x89, 0xb1, 0xca, 0x83, 0xf2, 0x01,
-       0x13, 0x5b, 0x28, 0x4f, 0xe9, 0x50, 0x33, 0xe3, 0x09, 0xfd, 0x3c, 0x55,
-       0x83, 0xeb, 0x07, 0x97, 0x60, 0x93, 0x8d, 0x5f, 0xb5, 0x38, 0x3b, 0xb8,
-       0xd4, 0xc6, 0x8d, 0x87, 0x52, 0x33, 0xf0, 0xce, 0xde, 0x6b, 0x6c, 0x8c,
-       0x1b, 0x64, 0x6c, 0xf6, 0xed, 0x0b, 0xa3, 0x8b, 0x6d, 0x7a, 0xf7, 0x5d,
-       0x8b, 0xfb, 0x8e, 0xfa, 0xa8, 0x23, 0x83, 0x71, 0x40, 0x7d, 0xd7, 0xff,
-       0x49, 0xb1, 0xf3, 0xe9, 0xd8, 0x2f, 0x73, 0x2d, 0x75, 0x32, 0x34, 0x56,
-       0xf9, 0xed, 0xb4, 0xb9, 0x70, 0x5e, 0x47, 0x79, 0x9d, 0x5c, 0x4d, 0x9d,
-       0xdc, 0x94, 0xa5, 0x39, 0x0c, 0x3b, 0x39, 0xd7, 0xe4, 0x10, 0x35, 0xb5,
-       0xf4, 0xcb, 0x12, 0x1e, 0xb4, 0xff, 0xd1, 0xbf, 0x60, 0x6c, 0xcf, 0x71,
-       0x3e, 0xf9, 0xdb, 0x94, 0xf9, 0x94, 0xf8, 0xe9, 0x20, 0xe6, 0x2a, 0xd4,
-       0xef, 0xff, 0x02, 0x66, 0xe7, 0x73, 0x9b, 0xa2, 0xae, 0x54, 0x8e, 0xbf,
-       0x25, 0x91, 0xb3, 0x39, 0x3d, 0x33, 0x22, 0x5d, 0xe5, 0x7f, 0x1b, 0x8f,
-       0x92, 0x73, 0x27, 0xc5, 0x67, 0xbd, 0xb4, 0xe7, 0x26, 0xea, 0x4b, 0x63,
-       0xec, 0x30, 0x89, 0x73, 0xb3, 0xe0, 0xe2, 0x38, 0x36, 0x51, 0x3f, 0x1e,
-       0x8e, 0x63, 0x2b, 0xcb, 0xdd, 0xc5, 0xff, 0xee, 0x3a, 0x5a, 0xcb, 0xc3,
-       0xcb, 0x63, 0x16, 0x8f, 0x9f, 0x12, 0xb3, 0x9a, 0x69, 0xc7, 0x0e, 0x94,
-       0x0c, 0xab, 0x78, 0xca, 0x54, 0x70, 0xa1, 0x89, 0xfd, 0x35, 0x5c, 0xc6,
-       0x3a, 0x89, 0x65, 0xde, 0xe4, 0x97, 0x88, 0x73, 0x7e, 0xac, 0x23, 0x27,
-       0xe8, 0xdc, 0xab, 0xc1, 0x15, 0xca, 0x30, 0x67, 0x12, 0x19, 0x4e, 0x14,
-       0x38, 0xe6, 0x3c, 0xe6, 0x3a, 0x8d, 0x61, 0xda, 0x90, 0xb6, 0xd9, 0xb6,
-       0xa1, 0x38, 0xe3, 0x73, 0x90, 0xb9, 0x7e, 0xde, 0x76, 0x5b, 0xde, 0x63,
-       0x47, 0xf4, 0x31, 0x8e, 0x67, 0x4e, 0x44, 0xf7, 0xdf, 0x42, 0x5f, 0x10,
-       0xce, 0x57, 0x9a, 0x04, 0x0e, 0x0c, 0xb6, 0xa3, 0x9a, 0x36, 0xe3, 0x5d,
-       0x7c, 0x14, 0xa9, 0xda, 0x7e, 0xdb, 0x56, 0xf3, 0x6d, 0x97, 0x45, 0x2b,
-       0x23, 0x8d, 0x31, 0x69, 0x7b, 0xbc, 0xd0, 0xf6, 0x0a, 0xb6, 0x9d, 0x60,
-       0xdb, 0x2b, 0xff, 0x5d, 0xdb, 0xd3, 0xe3, 0x5d, 0x4f, 0x21, 0x2e, 0x4b,
-       0xde, 0x5c, 0xc4, 0xed, 0x22, 0xc7, 0xf8, 0x8d, 0xf7, 0x32, 0x4e, 0xee,
-       0x90, 0xb9, 0xf3, 0xe5, 0x7d, 0xf6, 0xbd, 0xd8, 0x7c, 0xb9, 0xad, 0x3d,
-       0xc5, 0x18, 0x6f, 0xd6, 0x4c, 0x6b, 0x6b, 0x0e, 0xff, 0xff, 0x70, 0x4a,
-       0xb8, 0x44, 0x3b, 0x2c, 0xca, 0xfa, 0xac, 0xa1, 0x77, 0x2d, 0x73, 0x18,
-       0xdb, 0x2e, 0x32, 0xd7, 0xb9, 0xf1, 0x52, 0x5f, 0xb2, 0x36, 0xd2, 0x8e,
-       0x85, 0x03, 0x7a, 0xe7, 0x2e, 0xf2, 0xd1, 0xc3, 0x21, 0x3d, 0xfa, 0x2d,
-       0xe8, 0xf1, 0x52, 0xe5, 0x25, 0x94, 0x4c, 0x9c, 0xc5, 0x60, 0xf6, 0x47,
-       0x92, 0x6f, 0xb2, 0x4d, 0xb7, 0xe2, 0x99, 0xe8, 0x43, 0x8c, 0xf5, 0xdc,
-       0xac, 0xe7, 0x1e, 0x80, 0xbb, 0x92, 0xf5, 0xc6, 0x07, 0xe2, 0x96, 0x8b,
-       0x5c, 0x50, 0x8d, 0xe8, 0x1d, 0x95, 0x8a, 0x11, 0xdb, 0xc4, 0xb6, 0xd7,
-       0x30, 0x96, 0x95, 0x27, 0xbb, 0xc9, 0x03, 0x74, 0xdf, 0x97, 0x55, 0xbd,
-       0x6b, 0x3d, 0x5e, 0xc2, 0xbf, 0x92, 0x3c, 0xce, 0x4b, 0x9e, 0x45, 0x8a,
-       0xed, 0x59, 0xe3, 0x1a, 0xf9, 0xcc, 0xbb, 0x56, 0x78, 0x41, 0x85, 0x53,
-       0xda, 0xbd, 0x38, 0xbe, 0xe0, 0xdd, 0xc4, 0x65, 0x3c, 0xd7, 0x5c, 0x46,
-       0xe3, 0xfb, 0xf0, 0xa9, 0xa9, 0x75, 0x45, 0x62, 0xfd, 0x56, 0x57, 0x64,
-       0xdb, 0xfd, 0xc7, 0x9b, 0xf3, 0x76, 0xeb, 0xcf, 0xb8, 0x71, 0xd6, 0x2b,
-       0xbe, 0xc4, 0xfc, 0x67, 0x7f, 0x13, 0x76, 0xef, 0x67, 0x5e, 0xa9, 0x36,
-       0x86, 0xcb, 0x95, 0x1a, 0xe6, 0x44, 0xc3, 0x36, 0x1f, 0x76, 0x1a, 0xbb,
-       0xec, 0x9c, 0x59, 0xe2, 0x83, 0xd4, 0x99, 0x9f, 0x91, 0xf8, 0x27, 0xeb,
-       0x39, 0x07, 0x6e, 0xdd, 0x90, 0xa0, 0xdf, 0x6a, 0xbd, 0x2c, 0xb3, 0xae,
-       0xb0, 0x4e, 0x2f, 0x6b, 0x18, 0xbd, 0xd3, 0x38, 0xc9, 0xba, 0x69, 0xb1,
-       0xaa, 0xd1, 0x5f, 0x73, 0x29, 0x8e, 0x74, 0x14, 0xca, 0x33, 0xd9, 0xb3,
-       0x65, 0x73, 0x4f, 0xc3, 0xb3, 0x1d, 0xbc, 0x96, 0xf7, 0x85, 0xcb, 0xf1,
-       0x6e, 0x67, 0x61, 0x6e, 0x0e, 0xb9, 0xf2, 0xb8, 0xff, 0x69, 0x77, 0x71,
-       0xbd, 0x28, 0x5f, 0xe6, 0xda, 0x12, 0x94, 0xef, 0xb9, 0x14, 0x5b, 0xe2,
-       0xc4, 0xf2, 0x6d, 0x7b, 0xf3, 0xeb, 0x93, 0x95, 0x4b, 0x05, 0xb7, 0xeb,
-       0x71, 0xb7, 0xed, 0xf7, 0x5f, 0x75, 0xe5, 0xed, 0xc0, 0x59, 0x18, 0x97,
-       0x49, 0x1b, 0xbc, 0x52, 0xd6, 0xfc, 0x0b, 0xf8, 0x39, 0x9b, 0xff, 0xf7,
-       0x42, 0xe6, 0xc2, 0x45, 0xff, 0x7c, 0xdc, 0x74, 0x60, 0x6a, 0x46, 0x9e,
-       0xaf, 0xab, 0xfb, 0x9a, 0xd0, 0x33, 0x46, 0xbc, 0xa1, 0x0f, 0xb5, 0x85,
-       0xd6, 0x5a, 0xa8, 0x91, 0x75, 0x83, 0x5a, 0x54, 0xec, 0x13, 0xde, 0x4c,
-       0x9e, 0x31, 0x76, 0xca, 0x1e, 0x4b, 0x6f, 0x26, 0xbf, 0x2e, 0xb2, 0x33,
-       0xd5, 0xf7, 0xee, 0x1d, 0x9a, 0xe0, 0x85, 0xd8, 0x46, 0xdd, 0xad, 0x0b,
-       0x03, 0x39, 0xbf, 0x03, 0xba, 0xb9, 0x4b, 0x56, 0x92, 0x12, 0xb7, 0x61,
-       0x7b, 0xad, 0x82, 0x2e, 0xa3, 0x1a, 0x8e, 0xc5, 0xbf, 0xb5, 0xee, 0x58,
-       0x27, 0xff, 0xbd, 0x5b, 0xc0, 0x97, 0x0f, 0xb2, 0x6f, 0x19, 0xb7, 0x70,
-       0x3a, 0x37, 0x2a, 0xe8, 0x53, 0x37, 0x38, 0x84, 0x73, 0x2a, 0x8c, 0x9d,
-       0xf6, 0x5c, 0xa0, 0x37, 0xad, 0x60, 0x77, 0x5a, 0x30, 0xd3, 0x49, 0x1c,
-       0xf4, 0x61, 0x67, 0x5a, 0x70, 0xd0, 0x45, 0x1c, 0x9c, 0x83, 0xed, 0x69,
-       0xc1, 0xc1, 0x12, 0xbc, 0x3c, 0x78, 0x05, 0x1e, 0xe2, 0xef, 0x07, 0x53,
-       0xa5, 0x08, 0xef, 0xfd, 0x0b, 0x1c, 0x48, 0x0b, 0x7f, 0x72, 0x23, 0x35,
-       0x5c, 0x87, 0x54, 0x3a, 0xcf, 0x25, 0xaa, 0x86, 0xff, 0x12, 0x49, 0xfe,
-       0x1e, 0x20, 0xef, 0xcb, 0x0c, 0xcd, 0x45, 0x82, 0xbf, 0x65, 0xbd, 0xcd,
-       0x43, 0xf9, 0x13, 0x81, 0x0a, 0x6c, 0x18, 0x92, 0x1c, 0xda, 0x77, 0xeb,
-       0x5d, 0x81, 0x79, 0xec, 0xb3, 0x0e, 0xbb, 0xc9, 0xd9, 0xda, 0x86, 0xfc,
-       0xe8, 0xe7, 0xef, 0x9d, 0xa9, 0x4a, 0xbc, 0x36, 0xa8, 0xdb, 0xfd, 0xf5,
-       0xa4, 0x56, 0xac, 0x70, 0x19, 0x55, 0x58, 0x31, 0x38, 0x1f, 0x3b, 0xd2,
-       0x82, 0xbd, 0xd5, 0xc4, 0xde, 0x7a, 0x3c, 0x98, 0x16, 0x7e, 0xa9, 0xc1,
-       0xbb, 0xd7, 0xc0, 0x48, 0x5a, 0xd6, 0x84, 0x6b, 0x70, 0x61, 0x28, 0x80,
-       0x41, 0xbb, 0x7f, 0x13, 0xc9, 0x54, 0x98, 0xf2, 0x79, 0x51, 0xb9, 0x2f,
-       0xe7, 0xab, 0x82, 0x82, 0xc9, 0x40, 0x10, 0x03, 0x63, 0xb3, 0x50, 0xbe,
-       0x4f, 0x37, 0xb7, 0x42, 0xbf, 0x78, 0x17, 0xae, 0xc4, 0xee, 0x31, 0x1f,
-       0x4a, 0xf7, 0x55, 0xc3, 0x1d, 0x6a, 0xc2, 0xce, 0xb1, 0x0f, 0x61, 0xfb,
-       0x58, 0x1d, 0xb1, 0x13, 0x78, 0x3a, 0x63, 0xa2, 0x9f, 0x18, 0x3c, 0x87,
-       0x31, 0xe6, 0x95, 0xac, 0xcc, 0xa3, 0xcc, 0x8f, 0x02, 0x4f, 0xa0, 0x9a,
-       0x31, 0x4a, 0x7e, 0xcb, 0xb5, 0xb0, 0x8d, 0xed, 0xf9, 0x75, 0x2a, 0x3d,
-       0xbe, 0x13, 0xb6, 0xbe, 0x91, 0xcb, 0x88, 0xee, 0x65, 0x4d, 0x68, 0xba,
-       0x3d, 0xed, 0xb4, 0xd7, 0xe8, 0x2f, 0xdb, 0xe5, 0x5f, 0x15, 0xec, 0xd2,
-       0x5e, 0x53, 0xc3, 0x93, 0x97, 0xf2, 0x5c, 0xb4, 0x96, 0x20, 0x60, 0x3a,
-       0x15, 0xf8, 0x99, 0xef, 0xfa, 0x9f, 0x7a, 0xdf, 0xda, 0xda, 0xe5, 0xf5,
-       0x9f, 0xe9, 0x6b, 0xb0, 0x72, 0x6f, 0x49, 0x65, 0x3c, 0x2f, 0x41, 0x5c,
-       0x93, 0x35, 0xaa, 0x46, 0x8d, 0x5a, 0x79, 0x5f, 0xde, 0x5d, 0x15, 0x2b,
-       0x8b, 0x34, 0xc3, 0x3f, 0x5e, 0xe7, 0x7f, 0x2d, 0x21, 0x3a, 0xfd, 0xbd,
-       0xe5, 0x36, 0x0c, 0xdf, 0x31, 0xd4, 0xf9, 0x7f, 0x92, 0x79, 0xbb, 0x04,
-       0x55, 0x1e, 0x5c, 0x9f, 0xf8, 0xe0, 0x7a, 0x6a, 0x04, 0xca, 0xca, 0x66,
-       0x1f, 0x79, 0x3f, 0x9c, 0xab, 0x17, 0x60, 0xda, 0x87, 0x7c, 0x24, 0x02,
-       0xf5, 0x74, 0x73, 0x98, 0xb9, 0x7e, 0xfe, 0x7e, 0xce, 0xf2, 0xac, 0xee,
-       0x8b, 0x2a, 0xf9, 0x7b, 0x36, 0x9d, 0xa1, 0x3f, 0xd0, 0xae, 0xbb, 0x85,
-       0xb3, 0xb0, 0x2f, 0x60, 0x6b, 0xc2, 0xb2, 0x9e, 0xa4, 0x0e, 0xe4, 0x5e,
-       0xe0, 0x9b, 0x99, 0xdf, 0x59, 0x93, 0x5e, 0x27, 0x5e, 0x37, 0xa6, 0xb7,
-       0x47, 0xae, 0x17, 0x31, 0x19, 0xfb, 0xec, 0x13, 0x75, 0xdc, 0x68, 0xdc,
-       0x76, 0x98, 0x79, 0xf2, 0xc2, 0x80, 0xee, 0x4f, 0xe2, 0xff, 0x5a, 0xc2,
-       0x0b, 0xd3, 0x4a, 0x71, 0xdd, 0xee, 0xfd, 0x6b, 0x27, 0x55, 0x31, 0x17,
-       0xc7, 0x77, 0x28, 0xa1, 0xf7, 0xc7, 0x99, 0xb7, 0x45, 0xbd, 0x88, 0x39,
-       0x23, 0x75, 0xfe, 0x9d, 0x09, 0x7b, 0x9c, 0xe6, 0x79, 0xce, 0xdd, 0xe9,
-       0xe6, 0x3a, 0x7f, 0x6f, 0x46, 0x6c, 0x50, 0xe1, 0x58, 0x9a, 0xf1, 0x70,
-       0x46, 0xc5, 0x9d, 0x0f, 0x78, 0xb1, 0x69, 0xc0, 0x83, 0x6d, 0x03, 0x5f,
-       0x82, 0x71, 0x95, 0x13, 0x77, 0x30, 0xf7, 0xdb, 0x3c, 0x50, 0x4a, 0x3d,
-       0x6a, 0xd8, 0x32, 0xe0, 0x44, 0xd3, 0x55, 0x55, 0x88, 0xcf, 0x2c, 0xc5,
-       0xf3, 0xf4, 0xdd, 0xab, 0x42, 0x15, 0x48, 0xdb, 0x9c, 0x43, 0xb0, 0x41,
-       0x78, 0x9b, 0xe8, 0x8d, 0x71, 0xd0, 0x10, 0x0c, 0xf9, 0xa0, 0xf5, 0x99,
-       0xdf, 0x58, 0xb9, 0x99, 0x7b, 0x6c, 0x3e, 0xe9, 0x88, 0x88, 0x6e, 0xa4,
-       0xae, 0xac, 0x35, 0x79, 0x19, 0x23, 0xdf, 0xa3, 0x47, 0x65, 0x5e, 0x24,
-       0x30, 0xb9, 0x4c, 0x71, 0x20, 0x1c, 0xa8, 0x8a, 0x55, 0x47, 0xc2, 0x58,
-       0x99, 0xed, 0xf1, 0xf9, 0xec, 0x7b, 0x59, 0x11, 0x9c, 0x5f, 0x62, 0xe2,
-       0x96, 0x2c, 0x9c, 0x2b, 0xa9, 0xfb, 0x56, 0xea, 0x75, 0x87, 0xf9, 0x07,
-       0x2b, 0x9f, 0xd7, 0xb8, 0x89, 0x97, 0x96, 0xb5, 0x99, 0xfa, 0x65, 0x4e,
-       0x81, 0x9f, 0x16, 0xf4, 0x2b, 0x3a, 0xad, 0x18, 0xff, 0x9d, 0x75, 0x9a,
-       0xfa, 0x75, 0xb3, 0x3d, 0x37, 0xdb, 0x2b, 0x1b, 0x7f, 0xaf, 0x9e, 0x4b,
-       0x29, 0xcf, 0x4a, 0x5b, 0x86, 0xd9, 0x72, 0x2f, 0xc0, 0x1f, 0x55, 0x8a,
-       0x3c, 0xf4, 0x4f, 0x8d, 0xe9, 0x25, 0x7b, 0xbd, 0xed, 0xeb, 0x59, 0xcb,
-       0x1a, 0x36, 0x45, 0xff, 0x7e, 0xea, 0x5f, 0xd6, 0x5d, 0x64, 0x0e, 0x9a,
-       0x10, 0xad, 0xd5, 0xfb, 0x01, 0x49, 0x7c, 0x15, 0xcc, 0x60, 0xae, 0xf5,
-       0x8d, 0x76, 0x0f, 0x5e, 0x4b, 0x54, 0xda, 0xe3, 0xbe, 0xaa, 0xc1, 0xb2,
-       0xbe, 0x16, 0xf2, 0xe3, 0x4d, 0xa3, 0x31, 0xbc, 0x48, 0xd5, 0x19, 0x13,
-       0x64, 0xed, 0x83, 0xba, 0x48, 0xcd, 0xe5, 0x7c, 0x89, 0xcf, 0x63, 0x1b,
-       0xed, 0xc9, 0xef, 0x88, 0x00, 0xaf, 0x26, 0x8c, 0xe0, 0x0e, 0xf6, 0x3f,
-       0xea, 0x8d, 0x60, 0x7b, 0x4a, 0x6d, 0x75, 0x92, 0x7c, 0x96, 0x31, 0xd7,
-       0xdb, 0x85, 0x7f, 0xb5, 0xd2, 0x5e, 0x0b, 0x25, 0x21, 0x89, 0x25, 0xf3,
-       0x70, 0x46, 0x73, 0xe0, 0x99, 0xe0, 0x2c, 0x44, 0x6b, 0x1c, 0xe4, 0x33,
-       0xaf, 0x5b, 0xff, 0xec, 0x95, 0x7e, 0x64, 0x2c, 0x7f, 0xe0, 0x38, 0x14,
-       0x1b, 0xef, 0x76, 0xa6, 0x22, 0xd4, 0xf7, 0xfb, 0xfb, 0xff, 0xbf, 0xd6,
-       0x94, 0x57, 0xfa, 0xd7, 0x35, 0x3f, 0xf9, 0xf9, 0xe3, 0x1f, 0xb8, 0xce,
-       0x12, 0xe4, 0x78, 0xbf, 0x67, 0x7d, 0xc7, 0x6e, 0xf3, 0x23, 0xa5, 0x79,
-       0x5e, 0x2f, 0xed, 0x3d, 0xcd, 0xf1, 0x49, 0x9b, 0xc5, 0x7e, 0x44, 0x6f,
-       0x93, 0xa5, 0x82, 0xd7, 0x3b, 0x53, 0xa2, 0x3f, 0xc9, 0x97, 0x4e, 0x5b,
-       0x98, 0x25, 0xe7, 0x0f, 0xdb, 0x65, 0xe3, 0xd4, 0x57, 0x0f, 0x6d, 0x88,
-       0xb1, 0x81, 0xf1, 0x42, 0xee, 0xb2, 0x6a, 0xc4, 0x5c, 0x0b, 0xdb, 0x19,
-       0xb2, 0xd2, 0xde, 0x6a, 0xec, 0x34, 0x69, 0x77, 0x86, 0x3a, 0xdf, 0x09,
-       0x0b, 0xa7, 0x4d, 0x39, 0x77, 0x61, 0xca, 0xeb, 0xc0, 0x2e, 0xd3, 0x89,
-       0x4e, 0x43, 0xd5, 0xe5, 0xba, 0x23, 0x24, 0xe7, 0x2e, 0xf8, 0x67, 0x2a,
-       0xd8, 0x13, 0x56, 0xb1, 0xc5, 0xe8, 0xf1, 0xcb, 0xf5, 0xe5, 0x21, 0x39,
-       0x57, 0xb0, 0x91, 0x3a, 0x89, 0x33, 0x57, 0xde, 0xca, 0x76, 0x7b, 0x43,
-       0xf9, 0x75, 0xf1, 0x18, 0x2c, 0x6b, 0x8f, 0xd9, 0xf2, 0xe1, 0x0a, 0x96,
-       0x3b, 0x67, 0x4a, 0xec, 0x38, 0x70, 0xcb, 0xc2, 0x40, 0x3c, 0x5a, 0x02,
-       0x3d, 0x56, 0x46, 0x3f, 0xdd, 0x39, 0x30, 0x8f, 0xf5, 0x04, 0xfb, 0x9d,
-       0xbe, 0xdd, 0x90, 0xf5, 0xae, 0x80, 0xff, 0x27, 0xe4, 0xde, 0x69, 0xef,
-       0x02, 0x6a, 0xd6, 0xf0, 0xbf, 0xc2, 0x79, 0xab, 0x36, 0x9c, 0xdb, 0x5e,
-       0x80, 0xde, 0x59, 0xa6, 0x2c, 0x08, 0x56, 0xc1, 0x85, 0x38, 0xf9, 0xf9,
-       0xd8, 0x38, 0xf3, 0xeb, 0x94, 0xa1, 0x1d, 0xb1, 0xd7, 0xcc, 0x3d, 0xd4,
-       0x85, 0x87, 0xf1, 0x22, 0xa0, 0x4d, 0x2a, 0xc5, 0xf3, 0x79, 0x82, 0x0d,
-       0x31, 0x47, 0x44, 0xf0, 0x2d, 0x6e, 0x3d, 0xd1, 0x4c, 0xd5, 0x19, 0x6e,
-       0x7f, 0x2c, 0xe3, 0xe1, 0xa1, 0xf1, 0xf0, 0xfa, 0x37, 0x65, 0x7c, 0xfe,
-       0x8d, 0x19, 0xf8, 0xd7, 0x67, 0x8a, 0x76, 0x59, 0xf4, 0x6d, 0xc1, 0x36,
-       0xcb, 0x92, 0x7b, 0xc9, 0x8f, 0x67, 0xa5, 0xad, 0x7c, 0x1c, 0x2b, 0xa1,
-       0xec, 0x4f, 0xd2, 0xd6, 0x5d, 0x8c, 0x55, 0xbb, 0x8c, 0x38, 0xa1, 0xd2,
-       0xb2, 0x0c, 0xf2, 0x99, 0x12, 0xc5, 0x8f, 0x9d, 0x4d, 0xbf, 0xe5, 0x7c,
-       0x02, 0x9b, 0x32, 0x01, 0x77, 0x7e, 0x3e, 0xc4, 0xcf, 0x04, 0x03, 0xfc,
-       0x8c, 0xbf, 0x3e, 0x7f, 0x0f, 0xfb, 0xd9, 0x9e, 0x99, 0xee, 0x03, 0x0a,
-       0x56, 0xb3, 0xad, 0x96, 0x10, 0x9c, 0x2b, 0x9a, 0xfe, 0xcd, 0xca, 0x79,
-       0xa7, 0xdf, 0x37, 0x75, 0x33, 0xe6, 0xc2, 0xb9, 0xbe, 0x49, 0xce, 0x15,
-       0xb4, 0x84, 0xe5, 0x5c, 0xc1, 0x7a, 0x43, 0xce, 0x89, 0xd9, 0x59, 0x39,
-       0xb7, 0xac, 0xcb, 0xe7, 0xef, 0xc7, 0x22, 0x13, 0x77, 0xa5, 0x64, 0xed,
-       0x4d, 0xb0, 0xc8, 0xed, 0xff, 0x4e, 0xa6, 0x09, 0x5b, 0x52, 0x72, 0x7f,
-       0x8c, 0xb9, 0x86, 0xe1, 0xf1, 0x3f, 0x93, 0xb9, 0x16, 0x77, 0xee, 0x0f,
-       0xa3, 0x73, 0x3f, 0x9a, 0xca, 0x38, 0x86, 0xd2, 0x50, 0xc0, 0x7f, 0x14,
-       0x9a, 0xff, 0x0c, 0x75, 0x72, 0x8a, 0x72, 0x9e, 0x7e, 0x8f, 0x9c, 0xa2,
-       0x43, 0xf8, 0xef, 0x4e, 0xb8, 0x91, 0x09, 0xbd, 0x63, 0xc5, 0xed, 0x5c,
-       0xc8, 0xeb, 0xbf, 0x27, 0xe1, 0x47, 0xce, 0xce, 0xc9, 0xde, 0x28, 0x15,
-       0xec, 0xee, 0x4b, 0xc5, 0xa3, 0x2a, 0x8a, 0xf3, 0xab, 0x87, 0x65, 0x6e,
-       0x5f, 0x4d, 0xc8, 0x7f, 0xd1, 0x2f, 0xa9, 0x8c, 0x4b, 0x2a, 0x73, 0xf9,
-       0x41, 0x59, 0xdf, 0x57, 0x4b, 0x45, 0x3f, 0x72, 0x8f, 0x22, 0x2e, 0x39,
-       0x63, 0x13, 0xaf, 0x6b, 0x8b, 0x10, 0xab, 0xa1, 0x9e, 0xca, 0x0d, 0xaf,
-       0xbf, 0x71, 0xc2, 0xe7, 0x37, 0x27, 0xe0, 0xbf, 0x72, 0x62, 0xba, 0x08,
-       0xe4, 0x0a, 0xea, 0x07, 0x61, 0x81, 0xd7, 0xbf, 0x39, 0x31, 0x8f, 0x3c,
-       0x33, 0x6e, 0x2d, 0x6f, 0x3e, 0x6f, 0xcd, 0x8b, 0x18, 0xb9, 0xd3, 0x94,
-       0xe1, 0x9d, 0x6b, 0xf4, 0xf8, 0x1c, 0xc7, 0xa9, 0xfb, 0xb5, 0x69, 0x7d,
-       0x5c, 0x08, 0xfd, 0xff, 0xed, 0xa3, 0x18, 0xe7, 0x68, 0x0f, 0xcd, 0x32,
-       0x06, 0x89, 0x77, 0xcc, 0x85, 0x6a, 0x65, 0x2c, 0x81, 0x02, 0x6f, 0x2b,
-       0x8e, 0x4b, 0xe1, 0x5c, 0xbb, 0xa9, 0x8b, 0x62, 0x0c, 0xb3, 0xac, 0x5e,
-       0xc3, 0x57, 0x58, 0x03, 0xe7, 0x9c, 0x65, 0x4f, 0x7d, 0xd8, 0xc9, 0x9c,
-       0xfd, 0x9c, 0xd9, 0xf2, 0x57, 0x4e, 0x44, 0x7d, 0xa5, 0x8c, 0xad, 0xb2,
-       0xf6, 0x74, 0xa6, 0x69, 0xca, 0x9a, 0x64, 0x1e, 0xd4, 0x92, 0x95, 0xfb,
-       0x4b, 0x0e, 0xda, 0xb7, 0x85, 0x87, 0x4d, 0xf9, 0x5f, 0x70, 0x26, 0x1e,
-       0x73, 0xd0, 0x56, 0xdc, 0x86, 0xde, 0xf1, 0x65, 0xa5, 0x8a, 0xae, 0xec,
-       0x0c, 0x4e, 0x42, 0x0f, 0x6f, 0x51, 0xe8, 0x87, 0x35, 0x0b, 0x4c, 0x99,
-       0x82, 0x37, 0x12, 0x01, 0x33, 0x50, 0x88, 0x4b, 0xe7, 0x38, 0x77, 0x6f,
-       0x25, 0x8c, 0xce, 0x27, 0x0b, 0xe7, 0x3f, 0xcb, 0x4c, 0x5f, 0x1f, 0x17,
-       0x7b, 0x74, 0xbb, 0xb7, 0x27, 0x70, 0xc1, 0xd1, 0x8c, 0x0b, 0x87, 0xcc,
-       0x12, 0x2c, 0x6f, 0x17, 0x3b, 0x75, 0xbb, 0x77, 0x26, 0x30, 0xe5, 0xe4,
-       0xb5, 0x73, 0xe6, 0x5c, 0x62, 0x9a, 0xbd, 0x7e, 0x29, 0x31, 0x22, 0xa6,
-       0x31, 0xbe, 0x96, 0x47, 0xbc, 0xee, 0xf2, 0x09, 0x68, 0x65, 0xe4, 0x40,
-       0xee, 0x08, 0x5a, 0x1d, 0x49, 0xdd, 0xdf, 0xe6, 0x68, 0xc2, 0xaa, 0xac,
-       0x9f, 0x3c, 0xfa, 0x05, 0xf2, 0x4e, 0xfb, 0x3e, 0x1f, 0x6d, 0xd2, 0xc9,
-       0x0a, 0x43, 0xb3, 0xd4, 0x88, 0xe4, 0x76, 0x55, 0xb8, 0x4b, 0xdb, 0xfa,
-       0x11, 0x35, 0x32, 0x88, 0x9b, 0x9a, 0xdd, 0xad, 0xd5, 0x13, 0x45, 0x9d,
-       0x20, 0xe6, 0x89, 0x40, 0xab, 0x32, 0xa0, 0x56, 0x46, 0x44, 0x37, 0xfe,
-       0xd6, 0xe4, 0xb8, 0xc8, 0xaa, 0xb9, 0x07, 0xc6, 0x7f, 0xe3, 0x46, 0x79,
-       0x94, 0x58, 0xf5, 0x43, 0xdf, 0x7f, 0xae, 0xde, 0x33, 0x6e, 0xc1, 0x7b,
-       0x97, 0x21, 0xdf, 0xb6, 0x6d, 0x31, 0x1f, 0x19, 0xfb, 0x8c, 0x3b, 0x60,
-       0x59, 0x8c, 0x93, 0x3e, 0x28, 0x73, 0x39, 0x1e, 0xfa, 0x1a, 0xe3, 0xd2,
-       0xc6, 0xcc, 0x1f, 0xac, 0x8f, 0x3a, 0x6d, 0x0e, 0x40, 0xde, 0xe4, 0xbf,
-       0xed, 0x75, 0xe3, 0xf7, 0x96, 0xf0, 0x11, 0x27, 0x7d, 0xba, 0x84, 0x78,
-       0xbe, 0xdb, 0x74, 0xb6, 0xad, 0x50, 0x14, 0xf4, 0x19, 0x0b, 0xb4, 0x32,
-       0xc6, 0xa9, 0x5e, 0xfa, 0x75, 0xcc, 0x6b, 0x04, 0x0f, 0x81, 0xe5, 0x32,
-       0x9b, 0x37, 0xbb, 0x22, 0xf7, 0x7c, 0x76, 0xac, 0x59, 0xb0, 0x60, 0xea,
-       0xb6, 0x27, 0x8d, 0x0e, 0xf2, 0xaf, 0xaf, 0x90, 0xa7, 0xe5, 0xfb, 0xc9,
-       0x61, 0xde, 0x07, 0xf4, 0xb3, 0x79, 0x73, 0x69, 0x44, 0x78, 0x58, 0xfa,
-       0xb6, 0xc3, 0x46, 0x1b, 0x73, 0xb0, 0x7b, 0x3e, 0x7b, 0xae, 0xf9, 0x00,
-       0xbf, 0xf3, 0x75, 0xd2, 0xa8, 0xfe, 0xc0, 0x3a, 0x15, 0x11, 0xe9, 0xc3,
-       0xcf, 0x3e, 0xee, 0xf9, 0x6c, 0xe7, 0x92, 0x31, 0x6c, 0xcf, 0x6e, 0xfb,
-       0x93, 0xfd, 0x54, 0x46, 0x64, 0x3d, 0x34, 0x76, 0xfb, 0xea, 0xc0, 0x3d,
-       0x9f, 0xcd, 0x2c, 0x19, 0x64, 0x1f, 0x9f, 0x66, 0x7c, 0xc9, 0xd7, 0x89,
-       0x2a, 0x8e, 0x0f, 0xd4, 0x41, 0x59, 0x64, 0xdb, 0xed, 0x0b, 0x03, 0xbf,
-       0xb7, 0x16, 0x0c, 0x94, 0xd8, 0x3a, 0x70, 0x51, 0x07, 0x0f, 0x9a, 0xce,
-       0x5c, 0xc0, 0x61, 0xeb, 0xa0, 0xcb, 0x47, 0x1d, 0x24, 0xa9, 0x83, 0xdc,
-       0x4c, 0x23, 0xfc, 0x36, 0x75, 0xb0, 0x60, 0x7c, 0xf3, 0xe6, 0xb2, 0x08,
-       0x9c, 0x0e, 0xe3, 0x47, 0x0e, 0xe6, 0x45, 0xaa, 0xcb, 0xd8, 0x4c, 0xbd,
-       0xdd, 0xf3, 0xd9, 0xf9, 0x4b, 0x6c, 0x9d, 0xdf, 0xea, 0x0e, 0xdc, 0x47,
-       0xbb, 0x69, 0xa5, 0xad, 0x6f, 0xe5, 0xd1, 0xce, 0xa3, 0x8f, 0x47, 0x02,
-       0xbb, 0xb3, 0x1b, 0xa9, 0xab, 0x35, 0x1c, 0xc7, 0x3a, 0xca, 0xd5, 0xc5,
-       0xdf, 0x31, 0xfe, 0x8e, 0xf3, 0xb7, 0xcc, 0x8f, 0x7a, 0x49, 0xb6, 0xd8,
-       0x25, 0xd9, 0x1c, 0x94, 0xc7, 0x63, 0xaf, 0x55, 0x96, 0x47, 0x8e, 0xdf,
-       0xba, 0x3a, 0xd0, 0xc9, 0x36, 0xfe, 0xbf, 0x32, 0xd9, 0x57, 0xe0, 0x32,
-       0xe2, 0x3e, 0x27, 0x44, 0x3e, 0xbd, 0xa3, 0x13, 0x39, 0x62, 0xef, 0xef,
-       0xf2, 0xd8, 0x4b, 0xd9, 0xaa, 0x38, 0x3f, 0xcf, 0x2d, 0x49, 0xcf, 0xf6,
-       0x18, 0xf0, 0xb9, 0x8d, 0x7e, 0x0c, 0x64, 0x47, 0xa8, 0x03, 0xb1, 0x93,
-       0x2f, 0x52, 0x7f, 0xdd, 0xac, 0x73, 0x8a, 0xb1, 0x4c, 0x8f, 0xd2, 0x67,
-       0x69, 0xb3, 0x7a, 0x98, 0x07, 0xed, 0xe5, 0x51, 0xb6, 0x9b, 0xa6, 0x4c,
-       0x25, 0xb4, 0x5f, 0x05, 0x72, 0x0f, 0xf7, 0x0c, 0xdb, 0x3f, 0x6c, 0xfc,
-       0xba, 0xe2, 0x14, 0xc7, 0x1e, 0xf5, 0x6e, 0xc6, 0x68, 0x93, 0xe8, 0x2a,
-       0x46, 0x5d, 0xe9, 0x3e, 0xff, 0x34, 0x5d, 0x5e, 0x96, 0xf7, 0x0a, 0xf2,
-       0x09, 0xcb, 0xfa, 0x89, 0xd1, 0xb2, 0x90, 0x49, 0x21, 0xd2, 0x76, 0xae,
-       0x64, 0x59, 0x25, 0xf6, 0xfe, 0xb3, 0xd8, 0xed, 0x1b, 0x0c, 0x91, 0xb7,
-       0xb1, 0x7d, 0x3b, 0x8d, 0x73, 0x73, 0x86, 0xfe, 0x1c, 0xf8, 0x9d, 0x15,
-       0x9d, 0x29, 0xf5, 0xe6, 0xe1, 0x15, 0xc6, 0xde, 0xa8, 0x16, 0xef, 0x74,
-       0x0b, 0xbf, 0x37, 0x9c, 0xe1, 0x35, 0x88, 0x33, 0xa1, 0xd4, 0x83, 0x77,
-       0x92, 0x7b, 0x9e, 0x33, 0xf2, 0x7e, 0x7c, 0x24, 0xa3, 0x47, 0x1f, 0xe6,
-       0x39, 0x39, 0x30, 0xb9, 0x54, 0x31, 0x4e, 0x05, 0xc9, 0x7b, 0x3d, 0x70,
-       0x32, 0x87, 0x6a, 0x75, 0xf4, 0x04, 0x5d, 0xa0, 0x2f, 0x96, 0xcb, 0xb8,
-       0xe2, 0x1c, 0xa3, 0xe0, 0xb6, 0x5b, 0xdb, 0x68, 0x63, 0x79, 0x7c, 0xa1,
-       0x0b, 0x1e, 0x6d, 0x53, 0xa6, 0x18, 0xe3, 0x3c, 0xda, 0xfa, 0x84, 0xe0,
-       0x82, 0xdc, 0x77, 0x0d, 0x53, 0xcf, 0x82, 0x0f, 0xaf, 0xda, 0x7b, 0xd5,
-       0x88, 0x11, 0x55, 0x4e, 0x23, 0xdf, 0xae, 0xc6, 0x76, 0xdb, 0x1d, 0x1a,
-       0x2e, 0xfb, 0xb8, 0xae, 0xb5, 0x3b, 0x64, 0x1f, 0x1d, 0xd1, 0x2b, 0x53,
-       0xa8, 0x97, 0xc7, 0xb9, 0x65, 0x2e, 0x1b, 0xe7, 0xd8, 0x06, 0xf3, 0x8e,
-       0xe5, 0x89, 0xf7, 0xf7, 0x2f, 0xfd, 0x49, 0xbf, 0x3d, 0x35, 0x2a, 0x64,
-       0x9f, 0x8f, 0xdc, 0x13, 0xeb, 0x64, 0xbe, 0x36, 0x7d, 0xaf, 0x8f, 0x7e,
-       0x82, 0xed, 0x1f, 0x8f, 0x73, 0x3e, 0xe7, 0x1a, 0xb2, 0x0f, 0x48, 0xee,
-       0xa1, 0x4d, 0xdf, 0xf7, 0x63, 0xdf, 0x9f, 0x2c, 0x17, 0x2e, 0x73, 0x98,
-       0x38, 0x19, 0x6d, 0x97, 0xfa, 0x96, 0xf5, 0xe3, 0x05, 0x41, 0xe4, 0x66,
-       0x38, 0x31, 0xd2, 0x00, 0x0c, 0x27, 0x45, 0xd7, 0xe9, 0xcf, 0x6c, 0x30,
-       0xfe, 0xcd, 0x8a, 0xd6, 0x36, 0x6a, 0xbd, 0xaa, 0xac, 0x67, 0x8c, 0xdd,
-       0xda, 0x67, 0xd4, 0x6b, 0x7d, 0x6a, 0xee, 0x18, 0xe3, 0xd0, 0x01, 0xe6,
-       0xe8, 0xe5, 0x82, 0x15, 0x35, 0x46, 0xb4, 0xbf, 0x06, 0x0d, 0xf0, 0xdb,
-       0xf7, 0x24, 0xf4, 0xf8, 0x37, 0x54, 0x23, 0xb8, 0x56, 0xf8, 0xa7, 0xfa,
-       0x8e, 0x95, 0xa6, 0x0d, 0x7c, 0xa1, 0xe1, 0x67, 0x65, 0x79, 0x6c, 0x8f,
-       0x76, 0xce, 0xe2, 0xbc, 0xbc, 0xb9, 0x48, 0xf7, 0x67, 0x14, 0xd1, 0x91,
-       0x70, 0xae, 0x11, 0xec, 0x62, 0x3c, 0xfe, 0xb7, 0x86, 0x08, 0x8e, 0xf0,
-       0xfb, 0xa7, 0xd7, 0xca, 0x1e, 0x37, 0xcb, 0x0a, 0x06, 0x16, 0x84, 0x6b,
-       0x38, 0x86, 0x67, 0xf8, 0x7f, 0x7f, 0xf6, 0x75, 0xeb, 0xdc, 0x2c, 0x63,
-       0x70, 0x25, 0x83, 0xe2, 0xf0, 0x84, 0xae, 0x4d, 0xa9, 0xff, 0xd9, 0x3d,
-       0x37, 0xf6, 0x3a, 0xe3, 0x67, 0x9e, 0x0f, 0x34, 0x6a, 0x49, 0xb5, 0xae,
-       0x5c, 0xf4, 0x3a, 0x3c, 0xf1, 0x52, 0x21, 0xce, 0xe7, 0xef, 0x75, 0x3e,
-       0x7e, 0x49, 0x3f, 0x72, 0xdf, 0x76, 0x1e, 0x6d, 0x2e, 0x1a, 0xa7, 0xde,
-       0xdd, 0x33, 0x38, 0xe6, 0x2f, 0x34, 0xdc, 0x69, 0x8f, 0xb3, 0xd6, 0x98,
-       0xc3, 0x31, 0x2a, 0xd0, 0x1a, 0x9c, 0xe5, 0x79, 0xfe, 0xd8, 0x42, 0x96,
-       0x96, 0xb6, 0x5a, 0xe9, 0x43, 0x25, 0xac, 0x73, 0xbd, 0x79, 0x70, 0x76,
-       0x4f, 0x93, 0xee, 0xfb, 0x02, 0x6d, 0x35, 0xd4, 0xf0, 0x2b, 0x2b, 0xaa,
-       0x39, 0xcd, 0xaf, 0x73, 0xd4, 0x77, 0x26, 0xa4, 0xac, 0xcc, 0xab, 0x11,
-       0x6d, 0x50, 0xde, 0xb2, 0x30, 0x33, 0x10, 0x6e, 0xb0, 0xc7, 0x0f, 0xdc,
-       0x91, 0x19, 0x61, 0xae, 0x2c, 0x6d, 0x2a, 0x58, 0x19, 0x78, 0xc3, 0xf2,
-       0xcf, 0x1a, 0xc1, 0xce, 0xec, 0x1f, 0xe3, 0xb0, 0x5f, 0x21, 0x87, 0xd6,
-       0x3b, 0xe2, 0x79, 0xbf, 0x6b, 0x03, 0xfb, 0x2d, 0x37, 0xec, 0x3c, 0xfc,
-       0xb6, 0x44, 0x40, 0xd6, 0x8c, 0xc6, 0x3e, 0x33, 0x1e, 0x90, 0xbd, 0x19,
-       0x5e, 0xe4, 0xda, 0xa5, 0x4c, 0xbd, 0x36, 0x8e, 0x1c, 0x19, 0xa6, 0xec,
-       0x23, 0x39, 0x54, 0x9e, 0x5f, 0x47, 0x70, 0xc8, 0x3a, 0xb8, 0xf6, 0x2a,
-       0x39, 0x61, 0x9b, 0x21, 0x6d, 0x28, 0x58, 0x18, 0x98, 0x81, 0xc6, 0xb5,
-       0x3f, 0x7a, 0xb9, 0x24, 0x90, 0xf7, 0xdb, 0x3e, 0xc3, 0xd8, 0x76, 0x1a,
-       0xbf, 0x26, 0x56, 0xc9, 0x3e, 0x93, 0xb4, 0xd4, 0x63, 0x5b, 0x0d, 0xc8,
-       0x68, 0x4e, 0x8c, 0x1a, 0xb2, 0x0f, 0xd2, 0xb2, 0x56, 0x07, 0x5e, 0xa3,
-       0xdf, 0x51, 0x9e, 0xac, 0xb3, 0x50, 0x57, 0xca, 0x14, 0xf6, 0x70, 0x28,
-       0x2d, 0x9f, 0x15, 0x9d, 0x3c, 0x61, 0xc6, 0x99, 0x35, 0x48, 0x7c, 0x18,
-       0xfb, 0xcc, 0xeb, 0x86, 0x70, 0x78, 0xdd, 0x5c, 0xa9, 0x54, 0x33, 0xde,
-       0x3a, 0xfd, 0x63, 0xf6, 0x7a, 0x86, 0x9f, 0x58, 0x2e, 0x3c, 0x54, 0x72,
-       0x43, 0x27, 0x9e, 0x34, 0x6a, 0xf0, 0x84, 0x96, 0xe7, 0x74, 0xc4, 0x44,
-       0xbc, 0x90, 0x58, 0x90, 0xa3, 0x87, 0x90, 0x1b, 0x1b, 0x9d, 0x17, 0x95,
-       0x5f, 0x33, 0x6f, 0x04, 0x9e, 0xcb, 0x74, 0xe1, 0x41, 0xb9, 0x8f, 0xa5,
-       0xd4, 0xb7, 0x35, 0x3a, 0xa4, 0xbf, 0x2e, 0xec, 0xb2, 0xd7, 0x65, 0xc7,
-       0x3e, 0x73, 0xd8, 0x78, 0xa4, 0x20, 0xab, 0x60, 0xfe, 0xd8, 0x67, 0x9e,
-       0x34, 0x4e, 0xdb, 0x73, 0x27, 0x7b, 0x16, 0xfa, 0x4d, 0xc1, 0xc6, 0x72,
-       0xa8, 0xcc, 0x2f, 0x1c, 0xc6, 0xa7, 0xe1, 0xa8, 0x19, 0xa3, 0xed, 0xc9,
-       0x7a, 0xcf, 0xed, 0x70, 0xd6, 0xb8, 0xe8, 0x9b, 0x77, 0xc0, 0x55, 0x23,
-       0x9c, 0xbe, 0xc8, 0xb7, 0xdb, 0xf8, 0xbf, 0xe8, 0x76, 0xca, 0xd6, 0xad,
-       0x93, 0xd8, 0xd3, 0x27, 0xf9, 0x9f, 0x51, 0x4d, 0x1d, 0xe9, 0x1d, 0xb2,
-       0xae, 0x5d, 0x49, 0x6c, 0x65, 0x1c, 0x75, 0x57, 0xb3, 0xcc, 0xdb, 0xd4,
-       0xfb, 0x82, 0x81, 0x0a, 0x72, 0x7d, 0xcb, 0x7a, 0x87, 0x5c, 0x7f, 0x61,
-       0xa0, 0x31, 0x67, 0x30, 0xfe, 0xe1, 0x66, 0xbd, 0x4d, 0xee, 0x11, 0x6f,
-       0x30, 0x2e, 0x5a, 0xb1, 0x75, 0x52, 0x46, 0xf7, 0xc5, 0x94, 0x62, 0x1f,
-       0x8b, 0xe0, 0x9f, 0x61, 0xc1, 0x15, 0xb1, 0x88, 0x5d, 0xba, 0x19, 0x45,
-       0x8b, 0xec, 0xf5, 0x69, 0x97, 0xf1, 0xbb, 0xe4, 0x7e, 0x03, 0xa2, 0x93,
-       0x2e, 0x18, 0xb9, 0x23, 0x32, 0x67, 0xb3, 0x2d, 0x04, 0x16, 0xff, 0x8e,
-       0x39, 0x93, 0xcc, 0x4f, 0x7d, 0xae, 0x49, 0xc9, 0x05, 0x7d, 0xe4, 0xfe,
-       0x8f, 0x40, 0x6f, 0x4f, 0x50, 0xd7, 0xad, 0x21, 0x1b, 0xf3, 0x7c, 0x09,
-       0xd8, 0x7c, 0xdf, 0x7c, 0x05, 0x1f, 0x45, 0x25, 0x73, 0xdc, 0x86, 0xf1,
-       0x35, 0xa8, 0xaa, 0x89, 0xfa, 0xca, 0xb1, 0x94, 0xe7, 0x5b, 0x99, 0xc7,
-       0x7c, 0x12, 0x55, 0x6b, 0x63, 0x48, 0x70, 0xec, 0x95, 0xc6, 0xad, 0xbc,
-       0xd6, 0x87, 0x64, 0xca, 0xc5, 0x71, 0xfc, 0xd0, 0xaa, 0x9a, 0x29, 0xb2,
-       0x99, 0xde, 0x0a, 0x83, 0x79, 0xb7, 0xad, 0x0b, 0x62, 0x79, 0x4a, 0xb8,
-       0x54, 0x63, 0x74, 0x0b, 0xfe, 0x40, 0xdb, 0xd5, 0x3b, 0x36, 0x2a, 0x71,
-       0xda, 0x6c, 0x82, 0x3a, 0x97, 0xb2, 0x96, 0xb5, 0x2a, 0xf0, 0x5b, 0xea,
-       0x38, 0xce, 0x73, 0xc3, 0xff, 0x1a, 0xd4, 0xa5, 0xa5, 0x38, 0x6b, 0xc5,
-       0x35, 0x1f, 0xed, 0x52, 0x5d, 0x27, 0xbc, 0x6b, 0x45, 0x48, 0xad, 0x40,
-       0xb9, 0x56, 0xb0, 0xd3, 0x74, 0x41, 0x97, 0x53, 0xb7, 0xf5, 0x19, 0x6f,
-       0x94, 0xcb, 0x75, 0x87, 0x7d, 0xdd, 0x5f, 0xb8, 0x9e, 0xe6, 0xf5, 0xf3,
-       0xbc, 0x3e, 0x48, 0xdd, 0xab, 0x57, 0x48, 0xfd, 0xcd, 0xa6, 0xd4, 0x27,
-       0x1d, 0x31, 0x12, 0x85, 0xf9, 0x88, 0xdd, 0x9e, 0x2f, 0xbb, 0xed, 0xf6,
-       0x7c, 0x1b, 0x4e, 0xb6, 0x11, 0x8f, 0x96, 0xc3, 0x44, 0x45, 0x40, 0x70,
-       0x5e, 0xe4, 0xe2, 0xdc, 0x65, 0x45, 0xae, 0xad, 0x8c, 0x8b, 0x3d, 0x4f,
-       0x97, 0x23, 0xde, 0x35, 0xc7, 0xb6, 0xc3, 0x34, 0x79, 0x8a, 0xee, 0x7f,
-       0x5d, 0x69, 0xf1, 0xc9, 0xb2, 0x4e, 0x8a, 0x9c, 0xf7, 0x7e, 0xd3, 0x19,
-       0x6e, 0x72, 0x2c, 0xc8, 0x95, 0xc2, 0x88, 0x5d, 0x54, 0x66, 0x57, 0x08,
-       0x3e, 0x24, 0x32, 0x2d, 0xcc, 0xd0, 0xe2, 0x41, 0xe6, 0x56, 0xc1, 0x2c,
-       0x75, 0xbb, 0x9e, 0x88, 0x7d, 0xc2, 0xde, 0xb3, 0xe4, 0x9c, 0x5c, 0x83,
-       0x16, 0xdd, 0x81, 0x05, 0xe1, 0x39, 0xcc, 0xd0, 0x68, 0x97, 0x66, 0xa9,
-       0x43, 0xf7, 0xdf, 0x84, 0xff, 0x62, 0xd7, 0x3b, 0x92, 0xc9, 0x75, 0x96,
-       0x73, 0x4e, 0xbf, 0x4a, 0x39, 0x76, 0x07, 0x44, 0x8e, 0xb1, 0x82, 0x1c,
-       0x31, 0xc6, 0x5c, 0x53, 0xbb, 0x21, 0x30, 0x78, 0x49, 0x6f, 0x4f, 0xdb,
-       0x7a, 0xeb, 0xe3, 0x79, 0x29, 0x76, 0x90, 0x3f, 0x9e, 0x6a, 0xf2, 0x16,
-       0xd6, 0xf6, 0x25, 0xa7, 0x13, 0xfc, 0x3d, 0xfb, 0xa9, 0x0d, 0x86, 0x1e,
-       0x76, 0xd8, 0xfc, 0xdf, 0x8d, 0xb8, 0xcd, 0xad, 0x1d, 0x10, 0xee, 0xf8,
-       0xb0, 0x5d, 0xce, 0x45, 0x9d, 0x54, 0xe0, 0x91, 0x82, 0xbf, 0x54, 0x30,
-       0xbe, 0x7d, 0xd5, 0xfe, 0x9d, 0xe6, 0xdc, 0xba, 0xe8, 0xab, 0xc5, 0x18,
-       0x25, 0xeb, 0x83, 0xfd, 0xb6, 0xef, 0xa7, 0xf1, 0x7d, 0xfb, 0x3b, 0x97,
-       0xcf, 0xcb, 0xd0, 0x47, 0x9f, 0x70, 0xb0, 0x8d, 0x5e, 0x7b, 0x2f, 0xaa,
-       0xac, 0x15, 0x5c, 0x8b, 0x1d, 0x1c, 0x95, 0xdb, 0xe8, 0x44, 0xbf, 0x26,
-       0x36, 0xd1, 0x8d, 0xa4, 0x66, 0x7a, 0xb3, 0x4d, 0xd3, 0x73, 0x2a, 0x13,
-       0x87, 0x9a, 0x7e, 0xcf, 0x58, 0x2e, 0xd7, 0xce, 0x5a, 0x87, 0x8d, 0x53,
-       0x21, 0x7a, 0x70, 0x67, 0x89, 0xad, 0xdf, 0xa9, 0xdb, 0xec, 0x7d, 0x5b,
-       0x94, 0xf9, 0xe9, 0x84, 0xc4, 0xd1, 0x79, 0xc8, 0x98, 0x22, 0x9b, 0xb3,
-       0x7d, 0x0f, 0xe7, 0xa4, 0x2f, 0x15, 0x88, 0x5e, 0xc9, 0xff, 0x26, 0x19,
-       0xcb, 0x7a, 0xa9, 0xcf, 0x58, 0xbb, 0xf0, 0xb8, 0xad, 0x38, 0x40, 0x1b,
-       0x9b, 0x30, 0x2d, 0xeb, 0x08, 0x31, 0xa2, 0x7a, 0x81, 0x8a, 0xdc, 0xcc,
-       0xad, 0x48, 0x31, 0x36, 0x1d, 0x31, 0x5a, 0x3e, 0x5a, 0x82, 0xb8, 0x9f,
-       0x31, 0xdc, 0xb7, 0x93, 0xa3, 0xb9, 0x9f, 0xf3, 0x75, 0xca, 0x14, 0x7e,
-       0xe9, 0xbc, 0xb8, 0x02, 0x46, 0x78, 0x99, 0xe3, 0x87, 0xd6, 0x94, 0xc8,
-       0x9e, 0xea, 0xf9, 0x5f, 0x94, 0x61, 0x9b, 0x38, 0x6f, 0x35, 0xe7, 0xf8,
-       0xed, 0x80, 0xde, 0xf6, 0x02, 0xfb, 0x69, 0x1c, 0x68, 0xe9, 0x14, 0x19,
-       0x0e, 0x87, 0x9c, 0xb1, 0x23, 0x08, 0xb4, 0x6f, 0x55, 0x8a, 0x39, 0x04,
-       0x70, 0xe5, 0xb8, 0x89, 0xa3, 0x4d, 0xcf, 0x90, 0xef, 0x48, 0xfd, 0x52,
-       0x3c, 0x66, 0x3e, 0x65, 0xd5, 0xcf, 0x7e, 0xde, 0x3a, 0x66, 0xa8, 0x5b,
-       0xa8, 0xed, 0x58, 0x25, 0x64, 0x4d, 0x33, 0x7d, 0xdb, 0x5d, 0x01, 0xdd,
-       0xdc, 0xc3, 0xb6, 0xce, 0x24, 0x4e, 0x05, 0xdd, 0x6c, 0xeb, 0x11, 0x53,
-       0x72, 0x08, 0x67, 0x5b, 0x1b, 0xe7, 0xb6, 0x27, 0x15, 0xf0, 0xc9, 0xba,
-       0xad, 0xe4, 0x79, 0xb7, 0x27, 0x64, 0xcf, 0xf8, 0x18, 0xc7, 0x13, 0xdd,
-       0xe6, 0x42, 0xcb, 0xfd, 0x55, 0xb4, 0x9f, 0x6a, 0x14, 0x6d, 0x5d, 0xf7,
-       0x11, 0xef, 0x70, 0x17, 0xcb, 0xbc, 0x1c, 0x98, 0x87, 0xe7, 0x42, 0x2d,
-       0x6b, 0xe7, 0xc1, 0x19, 0x3b, 0xa6, 0x04, 0xda, 0xb6, 0x2a, 0x71, 0x4d,
-       0x6c, 0xf1, 0xce, 0x8c, 0x1e, 0x6c, 0x85, 0x60, 0x77, 0x8c, 0xfa, 0x98,
-       0x87, 0x77, 0x16, 0x8b, 0x5c, 0xce, 0x70, 0xd0, 0x11, 0xe8, 0x7a, 0x8a,
-       0xf3, 0x5b, 0xb5, 0x40, 0x64, 0x07, 0xb2, 0x19, 0x91, 0x3f, 0x86, 0x64,
-       0xf6, 0xec, 0xdb, 0x87, 0x0d, 0x38, 0x4f, 0x34, 0x3d, 0x68, 0xc1, 0xde,
-       0x63, 0xde, 0x22, 0xf3, 0xd0, 0x21, 0xf3, 0x50, 0x4e, 0x7f, 0x5a, 0x4d,
-       0xb9, 0xb7, 0xd8, 0x72, 0xcf, 0xc3, 0xa8, 0x29, 0xeb, 0x64, 0x4e, 0xed,
-       0x4e, 0x0c, 0x12, 0x3b, 0x03, 0x17, 0x7b, 0xd8, 0xcf, 0xcb, 0x94, 0x79,
-       0x01, 0xf5, 0x3e, 0xd5, 0x2e, 0xfc, 0xb6, 0x0f, 0x03, 0xa9, 0xe2, 0x1e,
-       0x74, 0x05, 0x92, 0x7a, 0x4f, 0x39, 0xfa, 0xc8, 0xf7, 0x7a, 0xac, 0xa9,
-       0x99, 0x72, 0x3d, 0x8d, 0x1d, 0xa9, 0xa8, 0x46, 0x7f, 0xa0, 0xde, 0xa1,
-       0xcf, 0x83, 0x3e, 0xf9, 0xaa, 0x23, 0x4a, 0x1f, 0x30, 0xbd, 0x17, 0x89,
-       0x0d, 0x27, 0xd0, 0x65, 0xa1, 0xc6, 0xb6, 0x87, 0x9f, 0x8e, 0x19, 0x0e,
-       0x59, 0x6b, 0x0f, 0xe6, 0xa8, 0x03, 0x95, 0x73, 0x22, 0x3a, 0xa8, 0xa4,
-       0xcf, 0x8e, 0x07, 0x74, 0xff, 0x73, 0x94, 0x67, 0x0f, 0xe5, 0x59, 0x93,
-       0x9f, 0x43, 0xdf, 0x0e, 0x45, 0x7c, 0x3a, 0xd0, 0xbe, 0x81, 0xd7, 0x77,
-       0x53, 0x9e, 0xc0, 0x80, 0x82, 0x34, 0xd1, 0xac, 0x8f, 0x7c, 0xf6, 0xc0,
-       0x34, 0x79, 0xdc, 0xf6, 0x9c, 0xc5, 0xc9, 0x05, 0x4a, 0x71, 0xd8, 0x14,
-       0xfc, 0xd6, 0x30, 0x4a, 0x3b, 0x3d, 0xc4, 0x19, 0x89, 0x7a, 0x55, 0x94,
-       0x1a, 0x82, 0x01, 0x33, 0x79, 0xcd, 0xc5, 0xb9, 0xa9, 0xc6, 0x31, 0x2d,
-       0xcd, 0x38, 0x59, 0xe4, 0x76, 0x7f, 0xb0, 0x8e, 0x7a, 0x85, 0x9f, 0xc9,
-       0x3a, 0x9a, 0xac, 0x35, 0x7d, 0xb9, 0x22, 0xbf, 0xbf, 0x52, 0xf6, 0x3f,
-       0xe4, 0xaf, 0x3f, 0xad, 0x09, 0x47, 0x2e, 0x96, 0xff, 0xb9, 0xf5, 0x84,
-       0x5d, 0x5e, 0xca, 0xb9, 0x6c, 0x2e, 0x5f, 0x6e, 0x97, 0xfb, 0xb9, 0xf5,
-       0x8c, 0xe6, 0x9c, 0x56, 0xae, 0xb8, 0x07, 0xef, 0xd4, 0x97, 0x5c, 0xc4,
-       0x3c, 0x47, 0xc3, 0x32, 0x3c, 0x61, 0x9c, 0xad, 0x5f, 0xdf, 0xd4, 0xcd,
-       0x38, 0x56, 0xe4, 0x5a, 0x75, 0xf4, 0x2b, 0x0b, 0x43, 0xe6, 0xa9, 0xa1,
-       0x12, 0xf4, 0x90, 0x3b, 0x0a, 0x17, 0x10, 0x8e, 0x2a, 0xeb, 0x7c, 0xb7,
-       0x96, 0x5f, 0xce, 0x79, 0xf5, 0xa0, 0x5f, 0x6d, 0xb3, 0xb9, 0x61, 0x54,
-       0x15, 0xdc, 0xad, 0xb3, 0xc7, 0x7e, 0x39, 0xfe, 0x4b, 0xac, 0x98, 0xbe,
-       0x6e, 0xd7, 0x8d, 0x43, 0x46, 0x91, 0xb3, 0x9c, 0x7a, 0x50, 0x25, 0x4e,
-       0x0e, 0x9b, 0xcb, 0x24, 0x36, 0xfb, 0x59, 0x3f, 0x18, 0x53, 0xa7, 0x73,
-       0x9b, 0xbf, 0xa9, 0x40, 0x55, 0xcf, 0x2e, 0x07, 0x64, 0xff, 0xaf, 0xec,
-       0xd9, 0x96, 0xbe, 0xca, 0x0a, 0xeb, 0x57, 0x1f, 0xc4, 0x35, 0x8a, 0x7d,
-       0x09, 0xdf, 0xa8, 0x28, 0xca, 0x18, 0x8c, 0xda, 0x72, 0xfe, 0xd2, 0x5a,
-       0xab, 0xe5, 0xe6, 0x68, 0x78, 0xaf, 0xec, 0xd1, 0x82, 0xec, 0xb1, 0x0f,
-       0x5c, 0x7f, 0x93, 0x7e, 0xa6, 0xb7, 0x59, 0xdc, 0x7b, 0x2a, 0x6b, 0xb3,
-       0xf2, 0x9f, 0x82, 0x1e, 0xe2, 0x50, 0x54, 0x6b, 0x61, 0x9c, 0xd7, 0x7d,
-       0x9b, 0x38, 0x1f, 0x71, 0xaf, 0xec, 0x6b, 0x2d, 0xc6, 0xc8, 0x52, 0xe4,
-       0xd7, 0x48, 0x81, 0x43, 0x85, 0x75, 0x51, 0xda, 0x3d, 0x7a, 0x32, 0xbf,
-       0xb3, 0x72, 0x5e, 0x27, 0x63, 0xe1, 0xe5, 0xfd, 0xf7, 0x69, 0xea, 0x75,
-       0x94, 0xff, 0xed, 0xb8, 0xb4, 0xee, 0x22, 0x6b, 0x4f, 0x12, 0x7b, 0x7f,
-       0x6b, 0xad, 0x7f, 0x4f, 0xd9, 0xe9, 0x7b, 0x5f, 0x67, 0xc6, 0x64, 0x3f,
-       0xda, 0xd1, 0xc2, 0xfa, 0x7c, 0xeb, 0xbf, 0xdf, 0x8f, 0x46, 0x5b, 0x42,
-       0x74, 0x07, 0xb9, 0x5d, 0x1c, 0x7d, 0x38, 0x9a, 0x68, 0xd4, 0x76, 0x42,
-       0x93, 0x75, 0x69, 0x7e, 0xfa, 0x70, 0x2c, 0x81, 0x68, 0xc9, 0x55, 0xd5,
-       0xe4, 0x5b, 0x88, 0x3a, 0x64, 0x8f, 0x50, 0xa2, 0xb1, 0x6d, 0x37, 0xc7,
-       0xe4, 0x5f, 0xdb, 0x87, 0xd1, 0x44, 0xcb, 0xad, 0x8c, 0x23, 0xfe, 0x8a,
-       0x3c, 0xd7, 0xe9, 0x38, 0x4c, 0x1c, 0xd8, 0x5e, 0x58, 0x1b, 0x5b, 0x9f,
-       0xf8, 0x15, 0xe5, 0xb7, 0x85, 0x64, 0xbd, 0x3f, 0x56, 0xee, 0x2c, 0x7a,
-       0x53, 0x67, 0xb1, 0x79, 0x50, 0x11, 0xfb, 0xc2, 0xa6, 0xb4, 0xc8, 0x73,
-       0x16, 0x1b, 0x07, 0xbf, 0x87, 0x43, 0x83, 0xb3, 0xd1, 0x6a, 0xeb, 0xa6,
-       0x0b, 0x5b, 0xf7, 0x9e, 0xc4, 0x9e, 0x94, 0x85, 0xdd, 0x21, 0x0f, 0xb6,
-       0x1c, 0x54, 0xb0, 0x2a, 0x70, 0x06, 0x3b, 0xf7, 0x5a, 0x98, 0x1f, 0xea,
-       0x46, 0x9b, 0x59, 0x81, 0xd2, 0x9a, 0x05, 0x9d, 0x2a, 0xcb, 0xad, 0x1f,
-       0xed, 0x52, 0x6e, 0xe4, 0xb8, 0x73, 0xae, 0xe3, 0xc4, 0x02, 0x15, 0x3e,
-       0x03, 0x5a, 0x75, 0x24, 0xaa, 0xdc, 0x92, 0x6d, 0x55, 0x3a, 0x46, 0x6d,
-       0x3e, 0xa5, 0xdc, 0x94, 0xf5, 0x55, 0x4a, 0x4c, 0x3f, 0x14, 0x3a, 0x8b,
-       0x74, 0xba, 0xaa, 0x32, 0xef, 0x2f, 0x67, 0xc9, 0x1d, 0x24, 0xe7, 0x30,
-       0x69, 0x53, 0x7f, 0xec, 0xb9, 0x02, 0xb1, 0xbb, 0x29, 0xfc, 0x64, 0xe4,
-       0x15, 0xbc, 0x32, 0xf2, 0x2f, 0x58, 0xae, 0x49, 0x9e, 0x69, 0x75, 0x3b,
-       0x23, 0x96, 0xb5, 0xbf, 0x39, 0x6e, 0xcd, 0x34, 0x2c, 0xb6, 0x57, 0x85,
-       0x59, 0x91, 0xef, 0x62, 0xb7, 0xc6, 0xb6, 0x52, 0xc7, 0xed, 0x7b, 0xb7,
-       0xbe, 0xc8, 0xa7, 0xe1, 0x4b, 0xe5, 0xcc, 0x5a, 0x44, 0x87, 0x6a, 0xa1,
-       0x6f, 0xab, 0x71, 0x18, 0x5d, 0xff, 0x5b, 0x69, 0xc2, 0x4d, 0xd9, 0x57,
-       0xf0, 0xe6, 0x48, 0x37, 0x31, 0x53, 0xef, 0xf8, 0x96, 0x62, 0x75, 0xef,
-       0x0e, 0xe9, 0x6d, 0xff, 0x55, 0x89, 0xc6, 0xcb, 0x69, 0x53, 0x65, 0xcc,
-       0x09, 0x6e, 0x1e, 0x91, 0x7c, 0xb9, 0x03, 0xee, 0x01, 0x3d, 0xb7, 0x82,
-       0x3c, 0xfb, 0x0b, 0x8b, 0xe2, 0x73, 0x66, 0xd0, 0x2e, 0x1d, 0x8a, 0x1e,
-       0x34, 0xd4, 0x6e, 0x3c, 0x6e, 0xea, 0x93, 0xbf, 0x75, 0x18, 0xe9, 0x6f,
-       0xa2, 0x09, 0xeb, 0xb2, 0x7a, 0x7a, 0x29, 0xf3, 0xb0, 0x9d, 0x49, 0x13,
-       0xa9, 0xa4, 0xde, 0xd1, 0xe5, 0xe8, 0xc7, 0xdd, 0x81, 0xfa, 0x6d, 0x6f,
-       0x93, 0xcb, 0x79, 0x88, 0x29, 0xc9, 0x89, 0x0c, 0xf3, 0xdc, 0x7e, 0x6c,
-       0x3d, 0x18, 0xc1, 0x96, 0xfd, 0x26, 0xfa, 0x92, 0x19, 0xca, 0xf6, 0x1a,
-       0x6d, 0xdb, 0xb2, 0xda, 0x43, 0xf1, 0x1b, 0x54, 0x04, 0xa2, 0xec, 0xb3,
-       0x45, 0x8d, 0x04, 0xfc, 0xaa, 0xc2, 0xe8, 0x3f, 0xe1, 0x44, 0x2f, 0xcb,
-       0x0c, 0xa4, 0x68, 0x73, 0x49, 0x37, 0xe3, 0x65, 0x1d, 0x46, 0xc7, 0x7d,
-       0x38, 0x32, 0xee, 0x41, 0x7a, 0x5c, 0xe3, 0x51, 0x8e, 0x87, 0x86, 0x2d,
-       0x62, 0xb9, 0x17, 0x8f, 0x1d, 0x76, 0x63, 0xfb, 0x3e, 0x0f, 0xe6, 0x45,
-       0x66, 0xe1, 0xf0, 0xe1, 0x72, 0x1c, 0xe0, 0xf5, 0x9a, 0xc5, 0x7e, 0x7c,
-       0x8d, 0xd7, 0x07, 0xf7, 0xb9, 0x38, 0x0f, 0xf3, 0x71, 0x9c, 0x86, 0x9d,
-       0x1e, 0xaf, 0x40, 0x6a, 0x98, 0x26, 0x4f, 0xce, 0xfa, 0x3a, 0x33, 0x8c,
-       0xa3, 0x87, 0x19, 0x1b, 0x0f, 0x9a, 0x48, 0xb0, 0x9f, 0x3d, 0xd4, 0x55,
-       0x1f, 0x71, 0x6d, 0xeb, 0xb8, 0x60, 0xfc, 0x3a, 0xac, 0x1e, 0xd0, 0xdb,
-       0x5a, 0x15, 0x23, 0xba, 0x44, 0x09, 0xca, 0x73, 0x2b, 0x6e, 0x95, 0xd7,
-       0x5a, 0x12, 0xba, 0xd9, 0x8a, 0x6e, 0x9c, 0xe6, 0xb8, 0xff, 0x3b, 0xfd,
-       0x76, 0x99, 0x43, 0xef, 0xbf, 0x5e, 0x3d, 0x89, 0xa1, 0x6c, 0x8e, 0x5c,
-       0x1d, 0x08, 0x1f, 0x3a, 0x49, 0xfe, 0xf6, 0x38, 0xf1, 0xe7, 0x65, 0xcb,
-       0x67, 0xa8, 0xb8, 0xe9, 0x01, 0x23, 0x7c, 0x41, 0x09, 0x6c, 0xfb, 0x25,
-       0x75, 0x70, 0xe3, 0x61, 0x15, 0x1f, 0x1b, 0x5a, 0x86, 0x4c, 0x28, 0x8a,
-       0x3d, 0x4b, 0x54, 0xdc, 0x70, 0xf0, 0x24, 0x71, 0xff, 0xac, 0xcd, 0x93,
-       0x73, 0x99, 0x2f, 0x22, 0x38, 0x20, 0x6b, 0xf7, 0x6e, 0xc6, 0xef, 0x4a,
-       0x9c, 0x19, 0xec, 0xa6, 0xdf, 0x56, 0xe2, 0x54, 0xfa, 0x24, 0xed, 0xb1,
-       0x12, 0x8f, 0x0f, 0x1a, 0x93, 0x3f, 0x71, 0x54, 0xe2, 0x31, 0x9e, 0x0f,
-       0xf1, 0x7c, 0xf1, 0xb0, 0x31, 0xd8, 0xa5, 0x56, 0x62, 0xd1, 0xa1, 0x66,
-       0x0c, 0x26, 0xc5, 0x36, 0x35, 0x6c, 0x1b, 0x6f, 0x2a, 0xe8, 0x5e, 0x74,
-       0xee, 0xc5, 0x3d, 0xd4, 0xd5, 0xdd, 0x43, 0xdd, 0xec, 0xcf, 0x47, 0x9d,
-       0x9f, 0xc4, 0x43, 0xcc, 0xeb, 0x76, 0x27, 0x7d, 0x38, 0x9f, 0x32, 0xfc,
-       0x9f, 0x52, 0x0c, 0xb3, 0x4c, 0x09, 0x68, 0x67, 0xe0, 0xc3, 0x2b, 0xd9,
-       0x72, 0xf4, 0x0e, 0xd7, 0xe1, 0x27, 0xb4, 0xcf, 0x07, 0xf7, 0x9d, 0xb4,
-       0xed, 0xff, 0x40, 0x6a, 0x2e, 0x1e, 0x1b, 0x33, 0xd9, 0xb6, 0xcc, 0x93,
-       0xc3, 0xde, 0xdb, 0xe4, 0x4a, 0x89, 0x6f, 0x44, 0x87, 0x68, 0x16, 0xc4,
-       0xc4, 0x93, 0xc8, 0x0e, 0xea, 0xfd, 0x37, 0xab, 0xc2, 0xab, 0x55, 0xea,
-       0xd2, 0x81, 0x29, 0x4d, 0x8f, 0xd7, 0xa8, 0xf1, 0x41, 0xe6, 0xaf, 0xf1,
-       0x5a, 0xea, 0xe4, 0xb1, 0x41, 0x27, 0x16, 0x2c, 0x56, 0x79, 0x3d, 0x7e,
-       0x91, 0xb1, 0x2d, 0x3e, 0x4f, 0x35, 0x71, 0xc0, 0x96, 0x15, 0xf1, 0x12,
-       0x72, 0xfb, 0xea, 0xc5, 0xf5, 0x8c, 0x5f, 0x0e, 0xb1, 0xbd, 0x58, 0xa5,
-       0xea, 0xa4, 0xde, 0x5f, 0xc1, 0x18, 0xed, 0xfa, 0x11, 0x1e, 0xc7, 0x47,
-       0xac, 0xee, 0x55, 0xe4, 0xdc, 0xf3, 0x03, 0x56, 0xf7, 0xcd, 0xa6, 0xe1,
-       0x2b, 0x51, 0x03, 0xd1, 0x2f, 0xe0, 0x15, 0x1c, 0x1b, 0x93, 0x32, 0xb2,
-       0x0f, 0x24, 0x86, 0x91, 0xa4, 0xd5, 0x3d, 0x64, 0xce, 0x47, 0xb3, 0x9d,
-       0x1b, 0xbb, 0x2a, 0xf3, 0x98, 0x29, 0x7e, 0x24, 0x6b, 0x25, 0x53, 0xf8,
-       0x25, 0xdb, 0xb9, 0x30, 0x52, 0x8d, 0x19, 0xb5, 0xe2, 0x07, 0x67, 0xf1,
-       0xc6, 0xe0, 0x77, 0x71, 0x7e, 0xd0, 0xc2, 0xa2, 0x90, 0x05, 0x67, 0xa8,
-       0xd1, 0x6c, 0x55, 0x97, 0x12, 0x23, 0x14, 0xac, 0x6e, 0xf8, 0x1e, 0xde,
-       0x1a, 0x94, 0xfd, 0xa6, 0x96, 0x2d, 0xcb, 0x00, 0x16, 0x5b, 0x7b, 0x66,
-       0x8a, 0xdf, 0x48, 0xbd, 0x3f, 0x95, 0x07, 0xeb, 0x8c, 0x86, 0xc5, 0x5c,
-       0xf8, 0x15, 0x8c, 0x8e, 0x18, 0xd1, 0xcd, 0x45, 0x39, 0x07, 0x5f, 0xa1,
-       0x0e, 0xec, 0xf8, 0x74, 0xb0, 0x06, 0x0b, 0x2e, 0x32, 0x6b, 0xfc, 0xf0,
-       0x3c, 0xda, 0xce, 0xa2, 0xc5, 0x01, 0x73, 0xa5, 0xfa, 0x6f, 0xf4, 0xd3,
-       0x57, 0x70, 0x24, 0x5d, 0xc4, 0x6b, 0x1f, 0x5a, 0xe9, 0xe7, 0xf9, 0x7d,
-       0xfe, 0x5e, 0xb4, 0xa4, 0x4e, 0xd8, 0xeb, 0x0f, 0xc7, 0x89, 0x8f, 0x83,
-       0x29, 0x29, 0xa3, 0x61, 0x2c, 0xdb, 0x4a, 0x6c, 0x88, 0xe2, 0x9f, 0xb2,
-       0x11, 0xe2, 0x43, 0x98, 0xf8, 0xd0, 0x4c, 0x7c, 0x30, 0x89, 0x0f, 0x4d,
-       0xc4, 0x87, 0x20, 0xf1, 0xc1, 0xb0, 0xd7, 0xd6, 0xd3, 0x47, 0xbf, 0x8b,
-       0x92, 0xe1, 0xb3, 0x70, 0xd1, 0x07, 0xce, 0x98, 0x16, 0xf9, 0x49, 0xa3,
-       0xb6, 0x11, 0xf3, 0x95, 0xa8, 0xe6, 0x45, 0x9a, 0xed, 0x95, 0x0d, 0x6b,
-       0x1c, 0x8b, 0x85, 0x60, 0xa8, 0x3e, 0xdc, 0x4f, 0xac, 0xfe, 0x95, 0xd1,
-       0xd8, 0xef, 0x45, 0xe3, 0x81, 0x99, 0x30, 0x06, 0x17, 0xab, 0x0d, 0x4a,
-       0xf4, 0xe3, 0x5e, 0x8e, 0xb3, 0x16, 0x73, 0xf7, 0x69, 0x98, 0xc7, 0xe3,
-       0x1f, 0x53, 0xf5, 0x93, 0x2f, 0x3b, 0xe0, 0x9d, 0x4d, 0xba, 0x33, 0x87,
-       0x4c, 0x80, 0xac, 0xd6, 0xeb, 0xc3, 0x95, 0xc7, 0x5f, 0x51, 0x15, 0xe4,
-       0x3e, 0x2e, 0x31, 0xaf, 0x31, 0xd8, 0xa7, 0xaa, 0xb2, 0x96, 0x44, 0x0c,
-       0xe7, 0xa1, 0x22, 0x42, 0x16, 0x51, 0xc7, 0xfc, 0xc2, 0xda, 0x68, 0x96,
-       0x61, 0x47, 0x13, 0x39, 0xa7, 0x57, 0x3f, 0x21, 0x31, 0x6a, 0x36, 0x63,
-       0x44, 0x79, 0x32, 0x7e, 0xe7, 0x6c, 0x78, 0x50, 0x96, 0xb4, 0xac, 0xaf,
-       0x86, 0x34, 0x78, 0x22, 0x81, 0xe8, 0x56, 0xa6, 0x91, 0x1f, 0x5f, 0x10,
-       0xc6, 0xea, 0xec, 0x09, 0x0c, 0x73, 0x7c, 0xab, 0xb2, 0xc5, 0x67, 0xc5,
-       0xfe, 0xf8, 0xe7, 0xf2, 0x33, 0x67, 0x57, 0x1e, 0x98, 0x0d, 0x43, 0xbb,
-       0x57, 0x1d, 0xae, 0x22, 0x07, 0x3f, 0xce, 0xb8, 0xa7, 0x4c, 0x7d, 0x42,
-       0x41, 0xc7, 0x70, 0x1c, 0x33, 0x42, 0x2f, 0x28, 0xb1, 0x5a, 0xdd, 0xef,
-       0x57, 0x6a, 0xf1, 0x89, 0x7d, 0xd4, 0xf5, 0xa2, 0x1f, 0x7a, 0xe4, 0xb9,
-       0xb0, 0x6f, 0x1e, 0x15, 0xdd, 0xd6, 0xa7, 0x87, 0x38, 0x8e, 0xc9, 0x86,
-       0x13, 0x82, 0x93, 0x8f, 0xba, 0xe1, 0x78, 0x74, 0x16, 0xa2, 0x68, 0x6a,
-       0xb8, 0xb2, 0xeb, 0x5f, 0x54, 0xd1, 0x8b, 0xf0, 0x6b, 0x7d, 0x30, 0xae,
-       0x18, 0xda, 0xcf, 0x95, 0x13, 0xf6, 0x7d, 0xb8, 0xaf, 0x66, 0x4f, 0x52,
-       0x97, 0xc7, 0x0b, 0xf9, 0xd2, 0x3a, 0x24, 0x06, 0x64, 0x5f, 0xfe, 0x59,
-       0xcc, 0x1d, 0xd6, 0xdb, 0x77, 0x29, 0x46, 0xf0, 0x06, 0xe5, 0x2c, 0xe6,
-       0x0c, 0x07, 0x39, 0x97, 0x1a, 0x56, 0x26, 0x8b, 0xf8, 0x29, 0x18, 0xbc,
-       0x8e, 0x18, 0x6c, 0x2d, 0xfb, 0x89, 0x19, 0xd7, 0x65, 0x4f, 0x82, 0x53,
-       0xd1, 0x3b, 0x1a, 0x94, 0x38, 0x63, 0xa8, 0x71, 0x71, 0x3d, 0xeb, 0x78,
-       0x86, 0x9b, 0x70, 0x3b, 0xc7, 0xdc, 0xc6, 0x79, 0xfb, 0xee, 0x62, 0x0b,
-       0x4b, 0x16, 0xeb, 0x07, 0xca, 0x1c, 0xd1, 0x7b, 0x6b, 0x90, 0xeb, 0x9a,
-       0x49, 0xbb, 0xb9, 0x7b, 0x91, 0x1e, 0x7e, 0x81, 0xb8, 0x4b, 0x9c, 0x46,
-       0x2f, 0xe3, 0xce, 0x46, 0xc6, 0xa2, 0xf2, 0x88, 0xde, 0xcf, 0x1c, 0xf5,
-       0xc2, 0x1d, 0x8e, 0x68, 0x48, 0x9e, 0xff, 0xf8, 0x32, 0x96, 0xc1, 0x1d,
-       0xaa, 0x22, 0x0e, 0xea, 0xb9, 0xef, 0x42, 0x3f, 0x70, 0x3b, 0xfa, 0xf1,
-       0x03, 0xf2, 0xbb, 0x99, 0x57, 0xe5, 0x88, 0x51, 0x19, 0x3c, 0x98, 0x3d,
-       0x89, 0x03, 0xd9, 0x47, 0xb1, 0x37, 0xbb, 0x5b, 0x49, 0xdb, 0xf7, 0x20,
-       0x15, 0x79, 0xee, 0x26, 0x5a, 0xa5, 0x7c, 0x06, 0x95, 0xa1, 0xaf, 0x5b,
-       0xe9, 0x1a, 0x15, 0xd5, 0xa1, 0x20, 0x56, 0x27, 0xe3, 0x70, 0x44, 0xde,
-       0xb6, 0xe4, 0xb9, 0xcf, 0x2d, 0x13, 0x06, 0xae, 0x4f, 0x96, 0x23, 0x76,
-       0xc8, 0xb2, 0xfa, 0x9b, 0x9d, 0xd8, 0x34, 0xd1, 0x84, 0x95, 0xc3, 0x0f,
-       0x59, 0xf3, 0x18, 0x73, 0xde, 0xbd, 0xc6, 0x83, 0x3b, 0x0e, 0x79, 0xb0,
-       0x3e, 0x19, 0x85, 0x2f, 0x52, 0xc1, 0xdf, 0x01, 0x73, 0x39, 0x8c, 0xc9,
-       0x49, 0x18, 0xfd, 0xd7, 0x39, 0x02, 0xc7, 0xc2, 0xaa, 0x07, 0x7f, 0x4d,
-       0x1c, 0x5f, 0x45, 0xdc, 0x89, 0x4d, 0x58, 0xa8, 0x8e, 0x78, 0x71, 0x27,
-       0xeb, 0x7f, 0x8c, 0x73, 0xff, 0xd6, 0x92, 0xe3, 0xc4, 0x02, 0x23, 0x36,
-       0xa1, 0x68, 0xd8, 0x3a, 0xe1, 0xa6, 0xae, 0xdc, 0x88, 0x1d, 0xa9, 0xc5,
-       0xf5, 0xfb, 0xfc, 0xb8, 0x63, 0xc2, 0x83, 0x96, 0xa4, 0xb5, 0xec, 0xb8,
-       0x19, 0x5f, 0xab, 0xc1, 0xc0, 0xfa, 0x09, 0x2f, 0x6e, 0x4b, 0xea, 0xbe,
-       0x1b, 0x98, 0xf3, 0x8f, 0x99, 0x41, 0xfc, 0xed, 0x84, 0x0f, 0xb7, 0x24,
-       0x4f, 0x49, 0x1e, 0xb9, 0xdc, 0xc9, 0xd8, 0x73, 0xff, 0x44, 0x1d, 0xd6,
-       0x26, 0xf5, 0x8b, 0x93, 0xe4, 0x76, 0xdd, 0x47, 0x4c, 0xdc, 0x3b, 0xa1,
-       0xa2, 0x83, 0xed, 0x7c, 0x22, 0x39, 0x17, 0x5d, 0x47, 0x9a, 0x29, 0xc3,
-       0x62, 0xac, 0x1a, 0x76, 0xc2, 0x24, 0x8b, 0xc7, 0x27, 0x81, 0x76, 0xfa,
-       0x47, 0x22, 0xf5, 0x45, 0xec, 0x19, 0x30, 0x71, 0xd7, 0x84, 0x9c, 0x9f,
-       0xb4, 0x9f, 0x95, 0xbb, 0x70, 0x70, 0x31, 0x6e, 0x1c, 0x56, 0x89, 0x03,
-       0xa5, 0x48, 0xaf, 0x55, 0x70, 0x1b, 0xaf, 0xef, 0x4a, 0xd9, 0x7b, 0xab,
-       0x11, 0x1a, 0x0a, 0x1c, 0xab, 0x21, 0x67, 0x58, 0x72, 0x30, 0x7f, 0xfd,
-       0x41, 0xe2, 0x7c, 0x19, 0x71, 0xbe, 0x82, 0x1c, 0xf6, 0xba, 0xd1, 0x93,
-       0x78, 0x80, 0xb8, 0x7c, 0x62, 0xb8, 0x9b, 0x71, 0xa7, 0x12, 0x5f, 0x63,
-       0x1c, 0x48, 0xf2, 0xfc, 0xec, 0x90, 0xd1, 0x55, 0x46, 0x9c, 0x7e, 0x81,
-       0xf8, 0xdb, 0x4f, 0xcc, 0xb8, 0x3b, 0x49, 0xb7, 0x1f, 0x62, 0x0e, 0x70,
-       0x55, 0x74, 0xa1, 0x87, 0x39, 0xd6, 0x0d, 0x4a, 0xc0, 0xf7, 0x1a, 0x2a,
-       0xe1, 0x38, 0x58, 0x8b, 0x96, 0x7d, 0x52, 0x46, 0xf0, 0x4b, 0x85, 0x7a,
-       0xd8, 0x49, 0x9d, 0x9f, 0x84, 0x35, 0xe8, 0xe0, 0x78, 0xeb, 0x4d, 0x32,
-       0x70, 0xfc, 0xd8, 0xd4, 0xb5, 0x7f, 0x22, 0xd6, 0xbe, 0x43, 0x4c, 0xf5,
-       0xcf, 0x6e, 0x46, 0xab, 0x61, 0xf2, 0x38, 0x89, 0x57, 0x06, 0x0d, 0xf3,
-       0x10, 0x9c, 0x78, 0x99, 0x3c, 0x6f, 0x6a, 0x36, 0x63, 0xa6, 0x21, 0x7e,
-       0x98, 0xe1, 0x78, 0x54, 0xc9, 0x4b, 0xe0, 0x18, 0x07, 0xde, 0x38, 0xb8,
-       0x8c, 0xe3, 0x92, 0x58, 0x2a, 0xf1, 0x2e, 0x43, 0x59, 0x97, 0x61, 0x0d,
-       0xf5, 0xd1, 0x9a, 0x54, 0x91, 0x39, 0x12, 0xc1, 0x5d, 0xfb, 0xf3, 0x71,
-       0x78, 0x5b, 0x28, 0x7e, 0x33, 0xe3, 0x70, 0xb8, 0x9c, 0x71, 0xd8, 0x15,
-       0x11, 0xd9, 0x9c, 0x18, 0x65, 0xdc, 0xde, 0x91, 0x0a, 0xa3, 0x8d, 0x73,
-       0x38, 0x99, 0x61, 0xbf, 0xc9, 0x3a, 0x9c, 0xc9, 0x78, 0x18, 0xb3, 0x34,
-       0x1e, 0x44, 0xb5, 0xb1, 0x59, 0x3c, 0xfc, 0x3c, 0xe6, 0xf3, 0x30, 0xec,
-       0x6b, 0x1b, 0x93, 0x0a, 0xe2, 0xed, 0x8a, 0xcd, 0xe7, 0xcf, 0x64, 0x04,
-       0x9b, 0x65, 0x2d, 0x73, 0x7b, 0x95, 0x3c, 0x8b, 0x32, 0x98, 0xfa, 0x1e,
-       0xaa, 0xa9, 0xff, 0xaa, 0x02, 0x0e, 0xfd, 0x34, 0x24, 0xb8, 0x5b, 0x4f,
-       0xdc, 0x95, 0xe7, 0x04, 0x2c, 0x6b, 0x5d, 0x60, 0x3a, 0x1e, 0xfd, 0x9f,
-       0x77, 0xa3, 0xf6, 0x33, 0x17, 0x82, 0x49, 0xc4, 0xbf, 0x14, 0xf1, 0x8f,
-       0x63, 0xe8, 0xb9, 0x96, 0x18, 0x48, 0x99, 0xfe, 0x21, 0x45, 0x0c, 0x24,
-       0x4e, 0x3f, 0x4a, 0x9c, 0xfe, 0x06, 0x71, 0xfa, 0xeb, 0xc4, 0xe9, 0xaf,
-       0x11, 0x13, 0xf2, 0x6b, 0x7a, 0x6d, 0x72, 0xff, 0x85, 0xf3, 0xf1, 0x96,
-       0xbd, 0xb6, 0x38, 0x93, 0xba, 0x9a, 0x3b, 0xac, 0x60, 0x9e, 0xa1, 0x1f,
-       0x13, 0xbb, 0xff, 0x01, 0xe7, 0xc9, 0x3f, 0xa3, 0xce, 0x7e, 0x26, 0xa6,
-       0x35, 0xd9, 0x07, 0x77, 0xb2, 0x51, 0xeb, 0x87, 0xfd, 0x2c, 0xb2, 0x29,
-       0x5c, 0xb4, 0x24, 0xb9, 0x11, 0x8e, 0x64, 0xe3, 0xb1, 0xd3, 0x72, 0x9f,
-       0x77, 0x96, 0xe4, 0xf5, 0x1b, 0xe1, 0x4c, 0xea, 0xc7, 0xe2, 0x94, 0x65,
-       0x25, 0xff, 0x73, 0x25, 0x1b, 0xcd, 0xd7, 0x60, 0x63, 0x9b, 0x7f, 0xca,
-       0xfe, 0xaf, 0xfe, 0xc2, 0x03, 0xd4, 0x57, 0x8e, 0x6d, 0x66, 0xa8, 0xfb,
-       0x72, 0xf2, 0x95, 0x47, 0xb2, 0xf2, 0xbb, 0xb1, 0x23, 0xa1, 0x1e, 0x43,
-       0x6c, 0xa6, 0xf0, 0xf1, 0x30, 0x6e, 0x4a, 0x7a, 0x68, 0x07, 0x71, 0x54,
-       0xd1, 0xb7, 0x3e, 0x37, 0xd1, 0x4c, 0x5f, 0x7b, 0xc8, 0xd2, 0x22, 0x81,
-       0x8e, 0x09, 0x72, 0x9e, 0x2d, 0x13, 0xcb, 0xb0, 0x62, 0xd8, 0xb2, 0x3c,
-       0x4b, 0x8d, 0xf0, 0x56, 0xc5, 0x0f, 0x17, 0x7d, 0xd0, 0x41, 0xbf, 0xda,
-       0x7c, 0x28, 0xa0, 0xbd, 0x46, 0x3c, 0xed, 0x6c, 0x3e, 0x41, 0xfb, 0x30,
-       0x2e, 0xb6, 0x11, 0x4b, 0x9d, 0x91, 0x00, 0xf3, 0x44, 0x0f, 0x6d, 0xdf,
-       0x8b, 0x8b, 0x09, 0xf1, 0x2f, 0xbd, 0xeb, 0x9f, 0x98, 0x9b, 0x74, 0xd1,
-       0x37, 0x7e, 0x9e, 0xa8, 0xa3, 0x0f, 0xb8, 0xf1, 0x46, 0xc2, 0xa0, 0xbf,
-       0x79, 0xf0, 0x56, 0xa2, 0x89, 0x7d, 0x05, 0x59, 0xc6, 0x8f, 0x7b, 0x26,
-       0xc2, 0xf4, 0xb3, 0x6b, 0x79, 0xc8, 0x73, 0x99, 0xf5, 0xf1, 0x6f, 0x2a,
-       0xf5, 0x83, 0x73, 0xd5, 0x1a, 0x44, 0x6b, 0x35, 0x7c, 0x7e, 0xe2, 0x23,
-       0xf8, 0x57, 0xc6, 0xed, 0x4d, 0x49, 0x70, 0x0e, 0x11, 0x22, 0x0f, 0x9c,
-       0x3c, 0x22, 0xf7, 0x1c, 0xd1, 0x18, 0x6d, 0x70, 0xe8, 0xcc, 0x6d, 0xf5,
-       0xdc, 0x79, 0x87, 0x93, 0x7d, 0x92, 0x15, 0xb3, 0xec, 0xcf, 0x07, 0xcb,
-       0x71, 0xef, 0xa1, 0x13, 0xf4, 0x91, 0x12, 0x2c, 0x7a, 0xc0, 0x8d, 0xcf,
-       0x1f, 0xc9, 0x90, 0x3b, 0xa8, 0x90, 0xfd, 0xbc, 0x69, 0x12, 0x85, 0x39,
-       0xa3, 0x11, 0xdc, 0xb9, 0x3f, 0x83, 0xe1, 0x02, 0xcf, 0x0b, 0x85, 0xe2,
-       0xff, 0x43, 0xc5, 0x09, 0xf2, 0x88, 0x40, 0xe7, 0xd5, 0xb4, 0xb1, 0xaa,
-       0x48, 0x20, 0x2e, 0xe3, 0x6e, 0xa7, 0x8d, 0xf5, 0x71, 0x3e, 0x33, 0x1c,
-       0x47, 0x82, 0x36, 0xf6, 0x55, 0xca, 0xbf, 0x87, 0x36, 0x16, 0xa7, 0x8d,
-       0xc5, 0x69, 0x4f, 0x71, 0xda, 0x98, 0x3c, 0xfb, 0x1b, 0xa7, 0x8d, 0xc5,
-       0x69, 0x63, 0xf1, 0xcc, 0x32, 0x1c, 0x25, 0xd3, 0xd8, 0x39, 0xd6, 0x4c,
-       0x1c, 0x53, 0xec, 0xa8, 0x94, 0xbb, 0xf9, 0x23, 0xe4, 0xec, 0xd7, 0xf1,
-       0x50, 0xd0, 0x46, 0x9f, 0xec, 0x4f, 0x67, 0xc8, 0x79, 0xdc, 0xf8, 0x75,
-       0x56, 0x38, 0x7e, 0x33, 0xf3, 0xd8, 0x93, 0xe4, 0xf9, 0x2a, 0x9e, 0x30,
-       0x25, 0x0f, 0x36, 0x79, 0xce, 0x58, 0x93, 0x12, 0xbe, 0x76, 0x12, 0x77,
-       0x0f, 0x02, 0x37, 0x90, 0x17, 0xd6, 0x92, 0x97, 0x1c, 0x5e, 0xc4, 0xdf,
-       0x07, 0x4f, 0xd0, 0xe6, 0x4f, 0xda, 0x7b, 0xbb, 0x54, 0xb6, 0x75, 0x66,
-       0xb0, 0xde, 0x77, 0x3d, 0x7d, 0xf0, 0x7e, 0xd6, 0x75, 0x1e, 0x94, 0x3a,
-       0x27, 0xd8, 0xb6, 0x1e, 0xfe, 0x35, 0xe7, 0xbf, 0xe3, 0x81, 0x5a, 0xbc,
-       0xb1, 0x5f, 0x0f, 0xbf, 0x43, 0xcc, 0xab, 0x75, 0x58, 0xcb, 0xae, 0x0e,
-       0x05, 0xb6, 0x5d, 0xad, 0xe6, 0xf9, 0x5e, 0xfb, 0x90, 0x13, 0xc7, 0x42,
-       0xcb, 0xe0, 0x59, 0x54, 0xe4, 0x7c, 0xb4, 0xa5, 0x5a, 0xe1, 0x58, 0x7a,
-       0xf8, 0x3c, 0xb9, 0x4a, 0x92, 0xed, 0x1f, 0xcd, 0x3c, 0x4e, 0x0c, 0xf9,
-       0x22, 0x9e, 0x63, 0x7e, 0x3e, 0xf6, 0xa1, 0x97, 0xc9, 0x1d, 0xdd, 0x18,
-       0x27, 0x07, 0x3c, 0x3e, 0x18, 0xfd, 0xa8, 0x93, 0xb8, 0xef, 0x59, 0x54,
-       0x89, 0x4c, 0x5a, 0xb8, 0x62, 0x25, 0x9e, 0x19, 0x34, 0xb4, 0x1b, 0x94,
-       0x3c, 0x2f, 0xcc, 0xef, 0xfd, 0x32, 0x2e, 0x8e, 0x22, 0x30, 0x79, 0x9e,
-       0xdc, 0xf0, 0x9d, 0xb4, 0xc4, 0xb0, 0x93, 0xf4, 0x71, 0x3f, 0xc2, 0x49,
-       0x0d, 0x27, 0xc6, 0x0d, 0x2c, 0x4c, 0x7a, 0xf1, 0xf0, 0x78, 0x10, 0x57,
-       0xd3, 0x77, 0xb3, 0xe4, 0x87, 0x1f, 0x4a, 0x8a, 0x2f, 0xd6, 0x61, 0x62,
-       0xbc, 0x8e, 0x3e, 0x22, 0xbc, 0xfc, 0x67, 0xf0, 0xd4, 0x9e, 0xb5, 0xf7,
-       0x36, 0x8f, 0xa6, 0xf4, 0xfe, 0x18, 0xc7, 0x13, 0xf3, 0xea, 0xc7, 0x62,
-       0xd0, 0xd3, 0xc0, 0x87, 0xdf, 0x4d, 0x7f, 0x52, 0xe2, 0xa3, 0xf8, 0xa3,
-       0x86, 0x09, 0xf2, 0x9d, 0x52, 0x62, 0x6a, 0x79, 0xa4, 0xfe, 0xc2, 0xf7,
-       0x15, 0x3d, 0xf7, 0x94, 0x6a, 0x59, 0xdf, 0x5b, 0xac, 0xc1, 0x77, 0x44,
-       0x23, 0xf7, 0x30, 0xed, 0xe7, 0x62, 0xe4, 0x79, 0xf3, 0xd9, 0xfb, 0x6a,
-       0x31, 0x63, 0x5f, 0x12, 0xff, 0xad, 0x36, 0xfe, 0xd1, 0x59, 0x8c, 0xf3,
-       0xb3, 0x64, 0x7f, 0x76, 0xf2, 0xf4, 0x6c, 0xb9, 0x57, 0x34, 0xa9, 0x36,
-       0x76, 0x1c, 0x83, 0x7e, 0xec, 0x15, 0x45, 0xf7, 0x7d, 0x95, 0xb1, 0xc1,
-       0x45, 0x1b, 0x75, 0x4c, 0x68, 0xf4, 0xdd, 0xc6, 0x13, 0x33, 0x60, 0xc4,
-       0xaf, 0x51, 0x5d, 0x16, 0x6c, 0x79, 0x6e, 0xa8, 0xca, 0xe7, 0x45, 0x82,
-       0x3b, 0x12, 0x17, 0xc8, 0x17, 0x89, 0xc1, 0x9d, 0xf4, 0x97, 0x35, 0x76,
-       0x2c, 0x3a, 0x61, 0xef, 0xfd, 0xde, 0x3a, 0x11, 0xa7, 0x8f, 0x2c, 0x43,
-       0xc5, 0xb0, 0x07, 0x9f, 0xb3, 0xe3, 0xd0, 0x43, 0x56, 0x0d, 0xfd, 0xe5,
-       0xae, 0x43, 0x81, 0xce, 0xeb, 0xe9, 0x2f, 0xf5, 0x4b, 0x25, 0x86, 0x31,
-       0x6e, 0xa7, 0x0c, 0x73, 0x94, 0xd8, 0xf2, 0x50, 0xb3, 0x31, 0xf9, 0x32,
-       0xf2, 0x3e, 0xb3, 0x6b, 0xa0, 0x16, 0x7f, 0xff, 0xc0, 0x71, 0x7b, 0x2d,
-       0xe4, 0x4e, 0x9e, 0x27, 0x07, 0x7c, 0xb6, 0x7f, 0xc4, 0xf8, 0xfb, 0x1e,
-       0xc6, 0xbc, 0x18, 0xfd, 0x68, 0xe7, 0x80, 0xb5, 0xec, 0xf9, 0xc5, 0xf1,
-       0xb5, 0x55, 0x08, 0x32, 0x26, 0xb9, 0xd1, 0x3f, 0xa0, 0x0f, 0x76, 0x30,
-       0x06, 0x9d, 0x5d, 0x6c, 0x52, 0x16, 0x0f, 0x86, 0x06, 0x04, 0x53, 0x4f,
-       0xdd, 0x52, 0x8b, 0xf8, 0xff, 0xd0, 0x38, 0xbe, 0xcf, 0xd9, 0xf7, 0x08,
-       0xeb, 0xb0, 0xe9, 0xc8, 0x52, 0xca, 0xdc, 0x44, 0x1f, 0x64, 0x5e, 0xcd,
-       0x7c, 0x67, 0xc3, 0x7e, 0xf1, 0x0b, 0xb4, 0x48, 0x9e, 0xd6, 0x6d, 0x06,
-       0xcc, 0x57, 0xe9, 0x43, 0x25, 0xe4, 0x3a, 0x0f, 0xa6, 0xec, 0xe7, 0x73,
-       0x72, 0x15, 0x46, 0x18, 0x8b, 0x69, 0xa3, 0x25, 0x86, 0x0f, 0x33, 0xc8,
-       0xeb, 0x16, 0x72, 0x3e, 0xca, 0xb2, 0x1e, 0x80, 0x1c, 0x02, 0xc4, 0x27,
-       0x1c, 0x25, 0x08, 0x1e, 0xf5, 0xf3, 0x98, 0xcf, 0x83, 0x8a, 0xc8, 0xaa,
-       0x98, 0x79, 0x94, 0x75, 0x47, 0x33, 0xb6, 0x2d, 0xfe, 0x3d, 0xe7, 0x3d,
-       0x41, 0x5b, 0xff, 0x04, 0xb1, 0x7e, 0x72, 0x2f, 0xd0, 0x7f, 0x30, 0x6f,
-       0xdb, 0x29, 0xb6, 0xdf, 0x4e, 0xcc, 0xbb, 0x40, 0x9b, 0xed, 0xe3, 0x7c,
-       0x0f, 0x8d, 0x18, 0xc1, 0x46, 0x35, 0xa0, 0x4d, 0x70, 0x9e, 0x7b, 0xc6,
-       0x54, 0x0c, 0x0c, 0x2e, 0xc3, 0x28, 0xf3, 0xa0, 0xde, 0xb4, 0xf8, 0x88,
-       0x94, 0x39, 0x89, 0x6e, 0xfa, 0xc8, 0x2f, 0x17, 0x2b, 0x88, 0x7d, 0x5c,
-       0xf6, 0xbe, 0x3b, 0x99, 0xef, 0x7f, 0x11, 0x9b, 0x12, 0x8f, 0x5b, 0x95,
-       0x86, 0xde, 0x9f, 0x56, 0x99, 0x67, 0xd1, 0x36, 0x7b, 0x98, 0x9f, 0x2c,
-       0x67, 0x7e, 0xd2, 0x5b, 0xb0, 0xcb, 0x33, 0xb4, 0xc3, 0x01, 0xc6, 0xb1,
-       0x97, 0xd3, 0xf9, 0xb8, 0xf7, 0x83, 0x21, 0x3f, 0x16, 0x5e, 0x53, 0x89,
-       0xa7, 0x0f, 0xe6, 0x65, 0xdb, 0x4b, 0x9b, 0x7c, 0x8a, 0x7a, 0xbe, 0x83,
-       0x7a, 0x7d, 0x29, 0x25, 0x18, 0x15, 0xc4, 0x33, 0xe4, 0xd1, 0x5b, 0xc8,
-       0x05, 0xbe, 0x97, 0xca, 0xdb, 0xe4, 0xe7, 0x27, 0xd6, 0x68, 0xf9, 0xf8,
-       0xe0, 0x85, 0xba, 0x4f, 0xf6, 0x00, 0x5a, 0xd6, 0x72, 0x33, 0xd7, 0x49,
-       0x5e, 0xc3, 0xb6, 0x23, 0xe4, 0x46, 0x4e, 0xcc, 0x49, 0x46, 0xb0, 0x22,
-       0x55, 0xdf, 0xd6, 0x20, 0x9b, 0x3d, 0xe6, 0xe4, 0x39, 0xa0, 0x2b, 0x29,
-       0xef, 0x0e, 0xd0, 0x50, 0xc1, 0xdc, 0xe9, 0xaf, 0x0b, 0xef, 0x2b, 0xf8,
-       0xc4, 0x9f, 0xc1, 0x1d, 0xd7, 0x50, 0xa6, 0x14, 0xb9, 0xe3, 0x54, 0xe1,
-       0x7d, 0x05, 0x37, 0xdb, 0xef, 0x2b, 0x70, 0x63, 0xc6, 0x84, 0xd3, 0xf9,
-       0xa9, 0x94, 0x07, 0xb3, 0x27, 0x2e, 0x71, 0x50, 0x77, 0x49, 0xa4, 0x15,
-       0x4f, 0x26, 0x14, 0xcc, 0x32, 0xfe, 0x27, 0xbe, 0x6f, 0xaf, 0x09, 0xd4,
-       0xda, 0x7b, 0xf6, 0x5d, 0x91, 0x28, 0x0e, 0x27, 0xf4, 0xb6, 0xc7, 0x78,
-       0x5e, 0x46, 0x3c, 0xad, 0xda, 0xa7, 0xe0, 0xa9, 0x80, 0x17, 0xa5, 0x47,
-       0x64, 0xaf, 0xbb, 0x65, 0x39, 0x17, 0xaf, 0xb2, 0x76, 0xac, 0x13, 0xfb,
-       0xe6, 0x1c, 0x1e, 0x09, 0x54, 0x09, 0x06, 0x1e, 0x36, 0x65, 0xdd, 0xd2,
-       0x40, 0x5f, 0xa2, 0x96, 0xfc, 0xba, 0xbe, 0xb3, 0x15, 0xf5, 0xe6, 0xcf,
-       0x1c, 0xb5, 0x28, 0x39, 0x72, 0x87, 0x26, 0x6b, 0xf6, 0xdf, 0xe0, 0x9c,
-       0xf5, 0x12, 0xbb, 0x7a, 0x52, 0xf9, 0xf8, 0xd9, 0x9a, 0xb1, 0xaa, 0x45,
-       0x2f, 0xbd, 0xe4, 0x27, 0x6a, 0xf2, 0xa2, 0x5d, 0xa6, 0x22, 0x92, 0x23,
-       0xfe, 0xd4, 0xe1, 0x04, 0xf9, 0x82, 0xc4, 0xd2, 0x0a, 0x1e, 0x95, 0xe4,
-       0x8d, 0x3f, 0x67, 0x2c, 0xbd, 0x27, 0x94, 0x0b, 0xca, 0x9b, 0x2c, 0x6a,
-       0xc8, 0xc5, 0xe9, 0x03, 0x38, 0x12, 0xd2, 0xdb, 0x37, 0x38, 0xa2, 0x4f,
-       0x33, 0x07, 0x0b, 0x2f, 0x63, 0x4e, 0xbe, 0x2a, 0x90, 0xc1, 0x2e, 0xf2,
-       0xc0, 0x9d, 0xcc, 0xc5, 0x3b, 0x68, 0x9b, 0x9d, 0xfb, 0x19, 0xdb, 0x1c,
-       0x97, 0x73, 0x71, 0x2d, 0x14, 0xdf, 0x40, 0x0e, 0xd0, 0xe5, 0x51, 0xc5,
-       0x5e, 0xc5, 0x77, 0x02, 0x1d, 0xaf, 0x12, 0xa3, 0x1b, 0x19, 0x37, 0xc4,
-       0xde, 0xf7, 0xa4, 0xf4, 0x4e, 0x2a, 0xa0, 0xa6, 0x92, 0xb9, 0xe3, 0xbd,
-       0xe3, 0xcd, 0xf4, 0x9b, 0xfc, 0x33, 0x73, 0xce, 0x25, 0x75, 0xcc, 0x39,
-       0xaf, 0x43, 0xef, 0x10, 0xed, 0x9f, 0xbe, 0x74, 0xff, 0x00, 0xc8, 0xcf,
-       0xd4, 0x9d, 0x9c, 0xbf, 0xdc, 0x11, 0x04, 0x2e, 0xb6, 0xa3, 0xb1, 0xad,
-       0xc4, 0x21, 0x32, 0xe8, 0xed, 0x6f, 0x90, 0xa7, 0x75, 0x31, 0x3f, 0xdd,
-       0xc2, 0x5c, 0x3e, 0xc6, 0x5c, 0x3e, 0xc6, 0x7a, 0xa9, 0x21, 0xb9, 0x4f,
-       0x64, 0xb4, 0x9f, 0x61, 0xfe, 0xf3, 0x39, 0xf2, 0x9f, 0xa1, 0x07, 0x44,
-       0xae, 0x59, 0xb8, 0xf7, 0xf0, 0x75, 0x48, 0xd2, 0x9e, 0xee, 0xe1, 0xb5,
-       0x81, 0x07, 0xe6, 0xe3, 0x6e, 0xe6, 0xf1, 0xb1, 0xf1, 0x65, 0x18, 0x64,
-       0x26, 0xba, 0xed, 0xf0, 0x47, 0xd0, 0x43, 0x3e, 0xb5, 0x9c, 0x18, 0xbd,
-       0xe1, 0x60, 0xc6, 0xc6, 0x6c, 0xc1, 0xfc, 0x1f, 0x67, 0x80, 0xd7, 0xc8,
-       0xc9, 0x06, 0x53, 0x27, 0x6c, 0x9e, 0xe6, 0x62, 0x7c, 0x28, 0x25, 0x2e,
-       0x85, 0xf7, 0x1b, 0x5d, 0x2b, 0x55, 0x6b, 0x59, 0xd9, 0xe2, 0x40, 0xff,
-       0x1b, 0xf4, 0xd5, 0x9a, 0x23, 0x2a, 0x6a, 0x87, 0x25, 0x57, 0x27, 0x3f,
-       0x22, 0x46, 0x3f, 0x47, 0x8c, 0xae, 0x3c, 0x94, 0xcf, 0xcb, 0x13, 0xcc,
-       0xbb, 0x6a, 0x8d, 0x7c, 0x6e, 0xbe, 0x67, 0x40, 0xf6, 0xe8, 0xb8, 0xf1,
-       0x1d, 0xda, 0xfe, 0xa9, 0x82, 0xed, 0x9f, 0x2e, 0x60, 0xb0, 0xc5, 0xdc,
-       0xfc, 0x35, 0x1b, 0x7f, 0xf3, 0xb9, 0xf9, 0xc2, 0x61, 0xa3, 0x2b, 0x4c,
-       0x8c, 0xbe, 0xfa, 0x90, 0xf4, 0xaf, 0xa1, 0x96, 0x78, 0x32, 0x93, 0x58,
-       0x52, 0x35, 0x2c, 0xeb, 0x33, 0x81, 0xce, 0x09, 0xd5, 0x67, 0xf7, 0xb1,
-       0x9d, 0xb2, 0xf5, 0xd2, 0x07, 0xbe, 0x9a, 0x30, 0xb4, 0xad, 0x4a, 0xc0,
-       0x5c, 0x4d, 0x7d, 0x1e, 0xc9, 0x5c, 0x87, 0xce, 0xc1, 0x3a, 0x1c, 0x4b,
-       0x4b, 0x7c, 0x91, 0xf6, 0x25, 0x17, 0x77, 0xe2, 0x9d, 0xfd, 0x73, 0xf1,
-       0xce, 0xd8, 0xe5, 0x3c, 0x7c, 0x47, 0x2a, 0x7a, 0x3f, 0xc3, 0xeb, 0x2a,
-       0xc9, 0xc3, 0xbf, 0xc7, 0x3c, 0xfc, 0x0d, 0x45, 0xd6, 0x10, 0x55, 0x7c,
-       0x62, 0x91, 0x83, 0xf1, 0x45, 0xf7, 0x7f, 0xd7, 0x11, 0x97, 0xfb, 0xc8,
-       0xfe, 0x07, 0xf8, 0xff, 0xb3, 0x8c, 0xe7, 0xc3, 0x9c, 0x89, 0x68, 0xad,
-       0x03, 0x4f, 0x2f, 0x8e, 0x47, 0x65, 0x9d, 0xb4, 0x9f, 0x3c, 0x65, 0x0e,
-       0xe3, 0xe1, 0xdf, 0xa7, 0xea, 0xc3, 0x0b, 0x1d, 0x0e, 0x5c, 0x34, 0xf5,
-       0xf6, 0x03, 0xbc, 0xf6, 0x4c, 0x56, 0x7c, 0x31, 0x4c, 0xfc, 0x5a, 0x59,
-       0xf0, 0xc5, 0x5a, 0x94, 0xd3, 0xce, 0xe7, 0xd2, 0x5e, 0x7f, 0x9c, 0xd2,
-       0x07, 0x9f, 0xa1, 0x9d, 0xd6, 0x5e, 0xb2, 0x53, 0x59, 0xa3, 0x95, 0xbc,
-       0xa6, 0x9d, 0x79, 0xcd, 0xf4, 0xe7, 0xa5, 0x8f, 0xa3, 0x2f, 0x7b, 0x1f,
-       0xee, 0xdd, 0xab, 0x77, 0x39, 0x1d, 0x71, 0x4b, 0x33, 0xba, 0x99, 0xa3,
-       0x75, 0x23, 0xb0, 0xc8, 0xe8, 0xb8, 0xa0, 0xe8, 0x9d, 0x3f, 0x54, 0xca,
-       0x99, 0xf3, 0x9d, 0xc1, 0xf6, 0x51, 0x3d, 0x98, 0x51, 0x0c, 0xdc, 0x40,
-       0x8c, 0x7b, 0x78, 0xa4, 0x84, 0x76, 0xb8, 0x1e, 0x47, 0x06, 0xf5, 0x70,
-       0x1c, 0x26, 0x31, 0xb4, 0xde, 0x5f, 0xa6, 0x5c, 0xc0, 0x69, 0xf3, 0x2c,
-       0xb6, 0x67, 0xe7, 0x60, 0xbd, 0x26, 0x7b, 0x9a, 0xd6, 0x63, 0x62, 0xf0,
-       0x02, 0x71, 0xa8, 0x9d, 0xdc, 0x4a, 0xf2, 0x06, 0x0b, 0x7b, 0x42, 0x57,
-       0x63, 0x8b, 0xed, 0xbf, 0xa5, 0xf2, 0x4e, 0x0b, 0xcf, 0x3c, 0xc3, 0x20,
-       0x4e, 0x48, 0x6e, 0xee, 0x9b, 0xb6, 0x3f, 0x57, 0xd6, 0x75, 0x1b, 0xab,
-       0xf2, 0xf7, 0x95, 0xff, 0x58, 0x99, 0x29, 0x1c, 0x1a, 0x91, 0xf5, 0x85,
-       0x19, 0xca, 0xe3, 0x83, 0x0d, 0xbe, 0x1e, 0xc6, 0x8f, 0xfb, 0xcd, 0x1c,
-       0x5e, 0x5f, 0x5c, 0x86, 0x29, 0xaf, 0x82, 0xd0, 0xd5, 0x61, 0xe9, 0x83,
-       0x9f, 0x73, 0x96, 0xff, 0x93, 0xd2, 0xce, 0x82, 0xc2, 0x9a, 0xc3, 0x3b,
-       0x35, 0x8c, 0x55, 0x3c, 0x97, 0xe7, 0x03, 0xe5, 0xbc, 0x78, 0xfd, 0x47,
-       0x56, 0xd4, 0x2b, 0xd7, 0x89, 0xd9, 0xb3, 0xc4, 0x7f, 0x67, 0x28, 0x77,
-       0x12, 0x6f, 0xe7, 0x87, 0x66, 0x28, 0xeb, 0xd3, 0xc5, 0x3a, 0x2f, 0x22,
-       0x3b, 0xf2, 0x22, 0xe7, 0x53, 0x0f, 0x4e, 0xc1, 0x55, 0x78, 0x56, 0x5e,
-       0xf6, 0x81, 0xb9, 0xc8, 0x43, 0x65, 0x2d, 0xfe, 0x1c, 0x86, 0xf6, 0x0b,
-       0x6f, 0xb4, 0xac, 0x40, 0xc3, 0x39, 0x6c, 0x3f, 0x7a, 0x42, 0xe9, 0x48,
-       0xbd, 0x6b, 0xa1, 0x74, 0x46, 0x6c, 0x8e, 0xbd, 0xdf, 0x59, 0xda, 0xe8,
-       0x53, 0xda, 0xb3, 0x81, 0xf0, 0xfd, 0x0c, 0xbe, 0x5a, 0x44, 0x9e, 0x63,
-       0x97, 0xb1, 0x9d, 0xe0, 0x35, 0xc3, 0x7e, 0x66, 0xe8, 0xb8, 0x3d, 0xce,
-       0xf7, 0xeb, 0xe1, 0x9b, 0x56, 0xb4, 0x5d, 0xea, 0x16, 0xe5, 0x9a, 0xcf,
-       0x89, 0x16, 0xd9, 0x8a, 0xff, 0x8f, 0x17, 0x64, 0x2f, 0x25, 0x77, 0xce,
-       0x97, 0xe9, 0xa4, 0xec, 0x25, 0xa1, 0x28, 0x4e, 0x35, 0x4f, 0x97, 0xbf,
-       0x38, 0xd6, 0x83, 0xef, 0x69, 0x2f, 0x5f, 0xf6, 0xe3, 0xb5, 0xb2, 0x4f,
-       0xea, 0x54, 0xf3, 0x24, 0xfe, 0xce, 0x5e, 0xd7, 0x78, 0xd3, 0xde, 0xdf,
-       0xb9, 0xcb, 0x6c, 0x89, 0x96, 0xe1, 0xa3, 0x50, 0xaf, 0x8a, 0x2f, 0x2c,
-       0xb3, 0xf9, 0x76, 0xb4, 0xbd, 0x8c, 0x39, 0xb7, 0xdb, 0x88, 0xde, 0xef,
-       0x46, 0x2e, 0x47, 0x9e, 0xd0, 0x71, 0x51, 0x39, 0xa6, 0xdc, 0x11, 0xd0,
-       0xb7, 0xbd, 0x4d, 0xfe, 0xf3, 0x6c, 0x20, 0xce, 0x39, 0x37, 0x7c, 0x03,
-       0x8a, 0x6e, 0x6e, 0x62, 0x8c, 0x7d, 0x86, 0x39, 0xed, 0xc6, 0x40, 0xbf,
-       0x7d, 0xcf, 0x53, 0x89, 0xac, 0xc1, 0x95, 0xf6, 0xfb, 0x26, 0xda, 0x61,
-       0x64, 0x5e, 0x94, 0x35, 0x38, 0xfe, 0x8e, 0x61, 0xa1, 0x7d, 0x6d, 0x23,
-       0x82, 0xf6, 0xf7, 0xba, 0xc2, 0x3b, 0x29, 0x3a, 0x50, 0x6f, 0x7f, 0x7f,
-       0x1a, 0x0d, 0x99, 0x4b, 0x6b, 0xd5, 0xe8, 0x35, 0x2d, 0xeb, 0x49, 0x53,
-       0x9e, 0x57, 0xbb, 0xb4, 0xb7, 0x7c, 0x8d, 0x83, 0x39, 0x10, 0x21, 0x25,
-       0x96, 0x7f, 0x27, 0xcf, 0xe5, 0xe7, 0xc5, 0x56, 0xbc, 0x67, 0x6f, 0xb9,
-       0xfd, 0xac, 0x93, 0xfd, 0xce, 0xa5, 0x05, 0x4b, 0x9c, 0xf8, 0x4e, 0xa2,
-       0x2a, 0xe6, 0xe1, 0xef, 0xed, 0x4b, 0x4a, 0xb0, 0x25, 0x44, 0x0e, 0x7a,
-       0xd5, 0x19, 0x9c, 0xcf, 0x38, 0x71, 0x26, 0x11, 0x0f, 0x8d, 0xb1, 0xbf,
-       0x53, 0x09, 0x15, 0xa7, 0x47, 0xfa, 0x42, 0x87, 0xec, 0xbe, 0x5f, 0x45,
-       0xef, 0x51, 0xb9, 0x0f, 0xd9, 0x8e, 0x0d, 0x89, 0xf3, 0x8c, 0xbb, 0xd2,
-       0x96, 0xac, 0x05, 0xe8, 0xb9, 0x8d, 0xcc, 0x9f, 0x55, 0x47, 0x10, 0xb7,
-       0x30, 0xde, 0x3d, 0x97, 0xe8, 0x86, 0x6b, 0xb1, 0xde, 0xf5, 0x2d, 0x72,
-       0x96, 0xaa, 0x88, 0x1e, 0x7c, 0x4b, 0xe9, 0x20, 0x37, 0x74, 0x63, 0x32,
-       0x21, 0x7e, 0x21, 0xef, 0xac, 0xf9, 0x34, 0x8e, 0x91, 0x23, 0x3f, 0x9b,
-       0xd0, 0x70, 0xbe, 0xd9, 0x83, 0x0c, 0x39, 0xf3, 0x77, 0x12, 0x6e, 0x7c,
-       0x95, 0x9c, 0xf9, 0x91, 0x11, 0x59, 0xb3, 0x6c, 0x45, 0x4b, 0x42, 0xd6,
-       0xab, 0xc9, 0x03, 0xc7, 0xbc, 0xb4, 0x6d, 0xcb, 0xea, 0x35, 0x67, 0xd3,
-       0x9f, 0xce, 0xb2, 0x4f, 0x59, 0xe7, 0x8c, 0x62, 0x35, 0x79, 0xd0, 0x23,
-       0x63, 0x3e, 0x3c, 0xcf, 0x5c, 0x21, 0xc9, 0x7a, 0xcf, 0x25, 0xfc, 0x18,
-       0xc8, 0xf8, 0xf0, 0x14, 0x73, 0x86, 0x9d, 0x3c, 0x97, 0xf7, 0x1f, 0x95,
-       0x18, 0x41, 0xf2, 0xf2, 0x93, 0xa8, 0x18, 0xb8, 0x02, 0x9b, 0xd7, 0x3e,
-       0x0a, 0x75, 0xe0, 0x04, 0x8f, 0x6b, 0xc9, 0x21, 0xae, 0x45, 0x6a, 0x24,
-       0x82, 0xd4, 0xd8, 0x8b, 0xe8, 0x1f, 0x91, 0x71, 0xc9, 0x7b, 0x6c, 0x64,
-       0x0f, 0x12, 0xb9, 0xe7, 0x80, 0x17, 0xe9, 0x31, 0xe9, 0xa7, 0x96, 0x7d,
-       0xff, 0xb9, 0xed, 0xff, 0xab, 0xb5, 0xf9, 0x13, 0xd2, 0xf6, 0xa3, 0x7f,
-       0xa4, 0x7d, 0xd1, 0x95, 0xac, 0xbd, 0xb4, 0x17, 0xd6, 0x5e, 0xdc, 0x6c,
-       0xd3, 0x03, 0x47, 0x24, 0xb7, 0xb6, 0x12, 0x7a, 0x74, 0xb7, 0x62, 0xb4,
-       0x55, 0x28, 0xe7, 0xb1, 0x3b, 0x2b, 0xef, 0x45, 0x28, 0xc5, 0x53, 0xc4,
-       0x6b, 0x57, 0x48, 0xd7, 0xbe, 0x45, 0xdb, 0x59, 0x4e, 0x8c, 0x7b, 0xd5,
-       0xbc, 0x1a, 0x71, 0x4d, 0xf4, 0x57, 0x8a, 0x17, 0x06, 0xdd, 0xc4, 0xa6,
-       0x08, 0xf2, 0xcf, 0xc8, 0x79, 0xf0, 0x83, 0x84, 0x97, 0xf3, 0xd5, 0x98,
-       0x33, 0x1c, 0x0d, 0xf2, 0x0c, 0x9e, 0x7d, 0xed, 0x54, 0x62, 0x23, 0x0e,
-       0x51, 0xde, 0xe7, 0x12, 0x17, 0x39, 0x3f, 0x9d, 0xd4, 0xbf, 0xe8, 0x3b,
-       0x5e, 0xd0, 0x75, 0x1f, 0x75, 0x5d, 0x87, 0x67, 0x12, 0x5f, 0xc4, 0x23,
-       0x94, 0xff, 0xe1, 0x41, 0x23, 0x3a, 0x5f, 0x39, 0x49, 0xfc, 0x2e, 0xc5,
-       0x69, 0xb6, 0x7d, 0x07, 0x33, 0xf7, 0x29, 0xe9, 0x2b, 0x25, 0xeb, 0xa5,
-       0x0a, 0xde, 0x5a, 0x72, 0x12, 0x13, 0xfc, 0xef, 0x07, 0x83, 0xf2, 0x1c,
-       0x5a, 0x35, 0xfb, 0x10, 0xfd, 0xf8, 0xed, 0xdc, 0xa4, 0x87, 0xbc, 0x6b,
-       0x55, 0xf3, 0x49, 0xec, 0x4a, 0xcb, 0xb5, 0xf5, 0xe8, 0x1f, 0xbc, 0x00,
-       0x47, 0xa8, 0x04, 0x77, 0x78, 0x9b, 0x69, 0xeb, 0x39, 0xec, 0xce, 0x34,
-       0xcf, 0xc8, 0x73, 0xe2, 0xaa, 0x19, 0xf2, 0x4c, 0xd6, 0xa9, 0x44, 0x29,
-       0xbe, 0xc3, 0x3a, 0x9b, 0x89, 0x15, 0xf9, 0x7b, 0x38, 0xe4, 0xfe, 0xc4,
-       0xfa, 0x0c, 0xfb, 0x48, 0xd8, 0x6d, 0xcc, 0x50, 0x0e, 0xd0, 0x0f, 0xab,
-       0x17, 0xcf, 0x50, 0x52, 0x69, 0xc9, 0x35, 0x5e, 0xc4, 0x13, 0x0f, 0xe4,
-       0x75, 0x78, 0xc8, 0xdc, 0x88, 0x74, 0xa6, 0xba, 0xd0, 0xde, 0x4b, 0x85,
-       0x7b, 0x6d, 0xf2, 0x3c, 0x88, 0x51, 0x78, 0x17, 0xc0, 0xe5, 0x7b, 0x6c,
-       0xdf, 0xc8, 0x56, 0x91, 0xcf, 0x97, 0xd3, 0xd6, 0x4a, 0x62, 0x5e, 0xc6,
-       0xf9, 0x8d, 0x8b, 0x34, 0xec, 0x5d, 0xfa, 0xd9, 0x5a, 0x54, 0x69, 0xce,
-       0x5f, 0x35, 0xbf, 0xc8, 0x7e, 0xaa, 0x62, 0x35, 0x91, 0x47, 0xec, 0x7d,
-       0x59, 0xa1, 0xa5, 0x33, 0x19, 0xe7, 0xe4, 0x5e, 0x75, 0x0c, 0xaf, 0x27,
-       0x6a, 0x63, 0xb5, 0x91, 0x6a, 0xe6, 0xf6, 0x17, 0x30, 0x30, 0xea, 0x44,
-       0x15, 0x79, 0x7c, 0x65, 0xb2, 0x16, 0x6e, 0x7b, 0x5d, 0xf1, 0x0a, 0xf2,
-       0xa7, 0xb9, 0xe4, 0x48, 0x75, 0xa8, 0x26, 0x4f, 0xf2, 0x84, 0x2c, 0xeb,
-       0xa7, 0x8b, 0x2d, 0xeb, 0x4a, 0x1e, 0x65, 0x3c, 0xce, 0x85, 0xc4, 0x4f,
-       0xa3, 0x68, 0xb4, 0xfd, 0xd5, 0x40, 0x93, 0xfd, 0xdd, 0x4a, 0x5f, 0xef,
-       0x0a, 0x2d, 0x9c, 0xf8, 0x62, 0xa8, 0x61, 0x62, 0x26, 0xd4, 0xe1, 0x59,
-       0x70, 0xb0, 0xad, 0x8f, 0x2f, 0xb5, 0xd0, 0x6a, 0xca, 0xfb, 0x04, 0x84,
-       0xa7, 0x6d, 0x24, 0x4f, 0xeb, 0x0f, 0x19, 0x13, 0x8f, 0xe2, 0x7a, 0xc6,
-       0x5d, 0xf7, 0xb0, 0x8f, 0xfd, 0x48, 0xce, 0xef, 0xcc, 0xcd, 0x23, 0xff,
-       0xbf, 0x7a, 0xb1, 0x70, 0xb6, 0x0e, 0x79, 0x97, 0x08, 0x3a, 0x26, 0x4e,
-       0xe2, 0x26, 0x96, 0xf1, 0x0c, 0xbf, 0x84, 0x64, 0xf6, 0x47, 0x18, 0xc8,
-       0x4a, 0x3c, 0xc9, 0xe1, 0x06, 0xb6, 0x5d, 0x3e, 0xdc, 0x46, 0xae, 0xba,
-       0x06, 0x9b, 0x27, 0x2c, 0xac, 0x0a, 0x4d, 0x62, 0xd5, 0x04, 0x39, 0xf0,
-       0x44, 0xd1, 0x5f, 0x85, 0xbf, 0xad, 0x81, 0x3c, 0x7f, 0xe6, 0x26, 0xb6,
-       0xc8, 0xda, 0x9e, 0x4a, 0x3f, 0x6c, 0xa1, 0x7d, 0x3f, 0x9e, 0x8a, 0x63,
-       0xc3, 0x84, 0x60, 0xee, 0x7d, 0xe8, 0x9d, 0x90, 0xb5, 0xe2, 0xaf, 0x84,
-       0xe6, 0x4f, 0xfc, 0x08, 0x2d, 0x13, 0xe9, 0xd0, 0x82, 0x89, 0x31, 0xca,
-       0x9d, 0xa0, 0x6c, 0x83, 0xa1, 0xfa, 0x89, 0x91, 0x50, 0x70, 0xe2, 0x40,
-       0x28, 0x30, 0xd1, 0x8e, 0x9d, 0x13, 0xeb, 0xb0, 0x63, 0x62, 0x1b, 0xb6,
-       0x4f, 0x08, 0x6e, 0x4f, 0x61, 0xe5, 0xc4, 0xab, 0x58, 0x31, 0xf1, 0x2c,
-       0x5a, 0x27, 0xce, 0x62, 0xf9, 0xc4, 0x8b, 0x68, 0x9b, 0x78, 0x89, 0x63,
-       0x91, 0xb5, 0x67, 0x59, 0x77, 0x2e, 0xde, 0xe7, 0x9b, 0xbe, 0x97, 0x5a,
-       0xd6, 0x56, 0xe4, 0x59, 0x30, 0x99, 0x43, 0x17, 0xd6, 0x6a, 0xe7, 0xd0,
-       0xb7, 0x5f, 0xde, 0xb5, 0xd6, 0xa8, 0xf5, 0x42, 0xee, 0xe1, 0xbe, 0x28,
-       0xcf, 0x06, 0xd0, 0xc6, 0xa6, 0xef, 0x1b, 0xd6, 0xb5, 0xa9, 0x4b, 0xf7,
-       0x3c, 0xe5, 0x99, 0x2c, 0x89, 0x3d, 0xe7, 0xd1, 0x93, 0xfd, 0x8d, 0x15,
-       0xd5, 0xa4, 0xac, 0x3c, 0x2b, 0x26, 0xf6, 0x70, 0x0e, 0x0f, 0xed, 0x3f,
-       0x4f, 0x0e, 0x35, 0x69, 0xaf, 0x1d, 0xbd, 0xbd, 0x40, 0xde, 0xd3, 0xe3,
-       0x27, 0x36, 0x9d, 0x43, 0xea, 0x28, 0x30, 0x71, 0x50, 0xfc, 0x70, 0x23,
-       0xfd, 0x70, 0x52, 0x7c, 0x32, 0x4e, 0x4c, 0xbe, 0xcd, 0x83, 0xfb, 0xc8,
-       0x93, 0x4a, 0x90, 0x1b, 0x2b, 0xc7, 0xd3, 0x23, 0x71, 0x6b, 0x9e, 0x21,
-       0xef, 0x2e, 0x31, 0x72, 0x57, 0x32, 0xee, 0xbf, 0xc4, 0x6b, 0x93, 0x83,
-       0xf0, 0xfb, 0x8c, 0x80, 0x6f, 0x1e, 0xcf, 0x4f, 0xa7, 0x27, 0xc9, 0x71,
-       0xba, 0x30, 0xc5, 0x6f, 0xc9, 0x89, 0x81, 0x5e, 0xa4, 0xd3, 0xa2, 0xcf,
-       0x76, 0xea, 0x53, 0x70, 0x51, 0xef, 0x6a, 0x25, 0x1e, 0x5a, 0x8a, 0xe0,
-       0xa1, 0x8a, 0x8a, 0x7d, 0xc2, 0x25, 0xec, 0x77, 0x9f, 0x98, 0x03, 0xca,
-       0x8b, 0xf8, 0x0e, 0x73, 0x98, 0xf2, 0x7d, 0xe4, 0x43, 0xc4, 0xca, 0xaa,
-       0x88, 0x62, 0xac, 0x0a, 0x9c, 0xc3, 0xd3, 0x63, 0x4e, 0xb8, 0x93, 0x4e,
-       0x4c, 0x12, 0x27, 0x1d, 0x49, 0xd9, 0x3f, 0xa0, 0x51, 0x16, 0x59, 0xa7,
-       0x3a, 0x8b, 0x9c, 0x7d, 0x7f, 0x4f, 0xee, 0xcf, 0x7c, 0xd7, 0xee, 0xc7,
-       0x49, 0xd9, 0xfb, 0x88, 0xa5, 0x3d, 0xa9, 0xef, 0xa1, 0x35, 0xed, 0xb1,
-       0x9f, 0xf3, 0xdb, 0x9d, 0x7a, 0x15, 0xa9, 0xfd, 0x75, 0xb8, 0xdd, 0x7e,
-       0xd6, 0xcf, 0x84, 0x46, 0xbd, 0xdd, 0x32, 0x6e, 0x22, 0x7a, 0x78, 0x1d,
-       0xd6, 0x1e, 0xfe, 0x24, 0x8f, 0x59, 0xb8, 0xe9, 0x70, 0x27, 0x6e, 0x1c,
-       0x8f, 0xa3, 0x63, 0xbc, 0x8f, 0xc7, 0x7a, 0x7c, 0x6c, 0xa8, 0x1a, 0x99,
-       0x90, 0xc6, 0x1c, 0x7f, 0x3d, 0x73, 0x7c, 0xe1, 0x67, 0x1b, 0xf0, 0x34,
-       0x71, 0x27, 0x18, 0xda, 0x80, 0x49, 0xdb, 0x17, 0x65, 0x8f, 0xe5, 0x06,
-       0x6c, 0x67, 0xfe, 0x3e, 0x8a, 0x0d, 0xe8, 0xe1, 0xb5, 0x21, 0x7b, 0x0e,
-       0x4e, 0x62, 0x19, 0xf3, 0xb3, 0x77, 0xae, 0x39, 0x89, 0x0f, 0x1f, 0x92,
-       0xbe, 0x2f, 0x20, 0xb5, 0x77, 0x23, 0xdb, 0xcc, 0xa1, 0x7d, 0xfc, 0x9f,
-       0x71, 0xe3, 0x10, 0xee, 0xac, 0x46, 0x35, 0x9e, 0x0d, 0x05, 0x3a, 0x06,
-       0x94, 0x7f, 0xb6, 0xdb, 0xde, 0x9e, 0xfa, 0x11, 0x76, 0xa5, 0xce, 0xe3,
-       0xe1, 0xcc, 0x4b, 0xe8, 0x4f, 0x4d, 0x9f, 0x53, 0x99, 0xcb, 0x37, 0x19,
-       0x0f, 0xbe, 0x8f, 0x23, 0x63, 0x53, 0xc4, 0xde, 0x57, 0x78, 0xbc, 0xff,
-       0x7e, 0x7a, 0xfe, 0x39, 0xdc, 0xbc, 0xdd, 0x48, 0x3e, 0x55, 0xe4, 0x6f,
-       0x71, 0xab, 0xda, 0xc8, 0xed, 0x9a, 0x03, 0x7d, 0x5b, 0x58, 0x95, 0xfb,
-       0x81, 0x46, 0xec, 0x05, 0x45, 0x6f, 0xff, 0x96, 0xe2, 0x61, 0xae, 0x21,
-       0xcf, 0x45, 0xea, 0xd1, 0x1b, 0xa8, 0xef, 0xb2, 0x07, 0xbe, 0x0f, 0xe7,
-       0x03, 0x4e, 0x94, 0x26, 0x65, 0x2d, 0x47, 0xde, 0x2b, 0x23, 0xef, 0x30,
-       0xc9, 0xe9, 0xa5, 0xf2, 0xae, 0x89, 0xe4, 0x24, 0x63, 0x7f, 0x6e, 0x61,
-       0x09, 0xe4, 0x39, 0xec, 0xeb, 0xb0, 0x71, 0x30, 0x8a, 0x1e, 0x53, 0x9e,
-       0x31, 0xca, 0x8f, 0x7f, 0x5e, 0xf3, 0xf7, 0xd1, 0xcb, 0xf8, 0xb3, 0x9e,
-       0x98, 0x78, 0xbb, 0x7d, 0x6f, 0xf6, 0xfb, 0xe8, 0x1b, 0xf9, 0x47, 0xb7,
-       0xf0, 0x9d, 0x3e, 0x53, 0x9e, 0xe3, 0xd6, 0xcd, 0xf7, 0xbe, 0xc3, 0x66,
-       0xbe, 0xec, 0x69, 0xa3, 0x4d, 0xe4, 0x16, 0xba, 0xb0, 0xbd, 0x36, 0xff,
-       0x1e, 0x95, 0x0f, 0x7a, 0xe7, 0xd0, 0x5f, 0xda, 0xef, 0x1c, 0x92, 0xfb,
-       0xfa, 0xf2, 0xbe, 0xaa, 0x27, 0x12, 0xf2, 0x1e, 0x09, 0x75, 0x99, 0x0b,
-       0xaa, 0xd7, 0x45, 0x5e, 0xf8, 0xaa, 0x39, 0x13, 0xbd, 0x5e, 0x0b, 0xd7,
-       0x53, 0x96, 0x63, 0x4d, 0x1f, 0x63, 0xe6, 0x12, 0xef, 0x70, 0xd9, 0xef,
-       0x26, 0x39, 0xff, 0xa9, 0x7f, 0xff, 0x6e, 0x92, 0x37, 0x89, 0x93, 0x0a,
-       0x2a, 0x8d, 0x5b, 0xf0, 0x9c, 0x1d, 0x13, 0x14, 0x54, 0x34, 0xc8, 0xba,
-       0xa8, 0x1f, 0xcf, 0x18, 0x8d, 0xfe, 0x1a, 0xb9, 0xdf, 0xa5, 0x9c, 0xb3,
-       0xe2, 0xde, 0x3a, 0xc6, 0x97, 0xff, 0x68, 0x2f, 0xfe, 0xf3, 0xd8, 0xb9,
-       0x37, 0x4c, 0xce, 0xe8, 0x95, 0x67, 0x23, 0x67, 0x14, 0x9f, 0xc5, 0xdc,
-       0x91, 0x92, 0x3d, 0xec, 0x0c, 0x8a, 0xe5, 0x6f, 0xd2, 0xcf, 0xde, 0x94,
-       0x3d, 0x58, 0xe4, 0x3c, 0x7f, 0x85, 0x60, 0xcd, 0x8c, 0xfc, 0x73, 0x52,
-       0xf6, 0x5e, 0x5f, 0x59, 0x0f, 0xd8, 0x5e, 0x78, 0xef, 0xa2, 0x94, 0x95,
-       0x7a, 0x6f, 0xda, 0x6b, 0xc2, 0x2e, 0xe3, 0x37, 0xd6, 0x6b, 0xde, 0x5a,
-       0x96, 0xfd, 0x45, 0xe1, 0xff, 0xf3, 0xe2, 0x33, 0x66, 0x14, 0x72, 0x4d,
-       0xea, 0x88, 0xae, 0x2e, 0xd7, 0xe9, 0x4d, 0x39, 0x88, 0x7b, 0x67, 0xad,
-       0x6e, 0xaf, 0x8c, 0x61, 0xec, 0x7d, 0x75, 0x54, 0xfb, 0x1d, 0x84, 0x79,
-       0xfd, 0x8a, 0x3c, 0xff, 0xbe, 0x4f, 0x59, 0x3f, 0x2e, 0x31, 0x2a, 0x70,
-       0xae, 0x26, 0xbf, 0xae, 0x73, 0x59, 0xc6, 0x47, 0xbc, 0xb2, 0xef, 0xaf,
-       0xd4, 0x3e, 0xb7, 0xfb, 0x35, 0x2f, 0xd7, 0xfb, 0x46, 0x61, 0xbc, 0xb5,
-       0xf6, 0xb3, 0x4a, 0x0f, 0xda, 0xbc, 0xc6, 0x31, 0x6d, 0xdc, 0xcb, 0xbc,
-       0xef, 0xed, 0x67, 0xa4, 0xd0, 0xaf, 0x6a, 0x3f, 0xef, 0x75, 0xb9, 0x0f,
-       0x91, 0xeb, 0xa9, 0x42, 0x1d, 0x3d, 0x1c, 0xb5, 0xfb, 0x57, 0x99, 0xbf,
-       0x15, 0xfb, 0xa4, 0x3f, 0x2d, 0x2e, 0xb6, 0x31, 0x29, 0xf6, 0xd5, 0x5d,
-       0xca, 0xd8, 0x74, 0xae, 0xf9, 0x3e, 0x6c, 0x4f, 0x88, 0x9e, 0xe5, 0x1d,
-       0x95, 0xc4, 0x60, 0x9b, 0x6b, 0xb9, 0xe8, 0x6f, 0x4b, 0x91, 0xd6, 0xe2,
-       0x38, 0xd4, 0x24, 0xcf, 0xe6, 0xb9, 0x68, 0xd3, 0x71, 0x94, 0x91, 0xdb,
-       0x46, 0x79, 0x4d, 0xf6, 0xb4, 0x1c, 0x31, 0xf5, 0xe8, 0x13, 0xf8, 0x12,
-       0x1c, 0x57, 0xd9, 0xeb, 0x5f, 0x6d, 0x69, 0xc8, 0x75, 0x93, 0xb9, 0xc9,
-       0xf4, 0x15, 0x83, 0x32, 0xda, 0x8e, 0xbd, 0x17, 0xdb, 0x94, 0x67, 0xf7,
-       0x06, 0x12, 0xf2, 0x0c, 0x59, 0x63, 0x8c, 0xfc, 0x10, 0xcf, 0x65, 0x64,
-       0xff, 0xc3, 0x6f, 0xad, 0xf8, 0x4c, 0xd9, 0x67, 0x39, 0xbd, 0x4e, 0x09,
-       0x71, 0x29, 0x10, 0xae, 0x52, 0x8a, 0xcf, 0x91, 0x5d, 0xfe, 0xdc, 0x44,
-       0x9b, 0x39, 0x6f, 0x3f, 0xfb, 0x27, 0x67, 0x11, 0xb4, 0xa4, 0xe4, 0x5d,
-       0x8c, 0xfa, 0xe4, 0x2a, 0x34, 0xe6, 0xea, 0x1d, 0xce, 0x02, 0xff, 0x08,
-       0x63, 0x0d, 0xed, 0x66, 0x47, 0x20, 0x6c, 0x3f, 0xe3, 0x26, 0xef, 0xdc,
-       0x78, 0x18, 0x7a, 0xe7, 0x1b, 0x2c, 0xff, 0xb1, 0xec, 0xf3, 0x56, 0xda,
-       0x2b, 0x63, 0x2a, 0xfa, 0xb8, 0xbc, 0xdb, 0x87, 0x7a, 0x8c, 0x88, 0x7f,
-       0x78, 0x50, 0x13, 0x09, 0xd3, 0x0f, 0x25, 0x7e, 0xcb, 0xf3, 0x71, 0xfa,
-       0x01, 0xc9, 0xab, 0x5a, 0xb2, 0xf2, 0xfc, 0xb7, 0xec, 0x9b, 0xd6, 0xfd,
-       0x6b, 0x1d, 0xc1, 0xc2, 0xfe, 0xe5, 0x62, 0xbc, 0xb7, 0xbc, 0x85, 0xbd,
-       0xd5, 0xee, 0x79, 0x8c, 0x6f, 0x96, 0xbd, 0x6f, 0x60, 0xa3, 0x8d, 0x0d,
-       0x9a, 0xa1, 0x1f, 0xfb, 0xa5, 0xa3, 0x1b, 0x8f, 0x2d, 0x32, 0xba, 0x8e,
-       0xab, 0xb9, 0xb4, 0x8f, 0x38, 0x71, 0xad, 0x23, 0x3a, 0xc4, 0x6f, 0xff,
-       0x77, 0x89, 0xcd, 0x37, 0xd9, 0x75, 0xf5, 0xe0, 0x3a, 0xb5, 0xf8, 0x6c,
-       0xb5, 0x3c, 0x73, 0xa1, 0x77, 0x7c, 0x43, 0xe9, 0xc6, 0xd6, 0x90, 0xd1,
-       0xbe, 0x4d, 0xd1, 0xdb, 0xbe, 0xac, 0xe8, 0xfe, 0x90, 0x22, 0xe5, 0xec,
-       0x77, 0xe8, 0x5c, 0x8a, 0x9d, 0x2e, 0xf6, 0x71, 0x38, 0xa1, 0x87, 0x67,
-       0xb0, 0xec, 0x39, 0xd3, 0xf0, 0x5d, 0x60, 0x9b, 0x3f, 0xe4, 0x31, 0x84,
-       0x20, 0x96, 0xdb, 0xed, 0x46, 0x17, 0xba, 0xec, 0xf7, 0xa4, 0x76, 0x30,
-       0x26, 0xc8, 0xfb, 0xb0, 0x62, 0xd0, 0x92, 0x75, 0x34, 0x31, 0xbd, 0xff,
-       0x66, 0x48, 0x4e, 0xdd, 0xc3, 0x80, 0xed, 0x81, 0x37, 0xd2, 0x8d, 0x86,
-       0x45, 0x86, 0x6f, 0x89, 0x6a, 0xd7, 0x0f, 0xca, 0xfb, 0x81, 0x96, 0x73,
-       0x9c, 0x23, 0x90, 0x36, 0x72, 0x96, 0xd6, 0x50, 0x6d, 0xd7, 0x59, 0xa4,
-       0x7e, 0x14, 0xae, 0x0f, 0xfd, 0xca, 0x4a, 0x6b, 0xd0, 0x6a, 0x0d, 0xa9,
-       0x13, 0x1f, 0xd2, 0xf0, 0x1f, 0xd5, 0x13, 0x5c, 0xf9, 0xa5, 0x85, 0x59,
-       0x52, 0x4f, 0xf6, 0xac, 0x7d, 0x1a, 0x77, 0x0d, 0xc8, 0x7b, 0x22, 0xc4,
-       0x1f, 0xf5, 0xe8, 0x17, 0xc8, 0x35, 0xcb, 0xed, 0xf7, 0x6f, 0x49, 0x2c,
-       0x59, 0x4f, 0x3c, 0xeb, 0x86, 0x16, 0xd2, 0xfb, 0xaf, 0x50, 0xe5, 0x1d,
-       0x43, 0x8f, 0xc9, 0xbe, 0x9d, 0x03, 0x0b, 0xd4, 0xfc, 0xfe, 0x9e, 0xd8,
-       0x1f, 0x7d, 0x5f, 0x11, 0xfb, 0x2a, 0x97, 0xf7, 0x15, 0xd5, 0xd9, 0xcf,
-       0xa7, 0xac, 0x4f, 0x38, 0x0a, 0xfb, 0x15, 0x2f, 0xbf, 0xc7, 0x73, 0x23,
-       0x79, 0xfd, 0x26, 0x79, 0x67, 0x1f, 0xc7, 0xba, 0x39, 0x21, 0x4b, 0x5a,
-       0xff, 0x0f, 0xdd, 0x0f, 0x6b, 0xf2, 0xd0, 0x56, 0x00, 0x00, 0x00 };
-
-static const u32 bnx2_CP_b06FwData[(0x84/4) + 1] = {
-       0x00000000, 0x0000001b, 0x0000000f, 0x0000000a, 0x00000008, 0x00000006,
-       0x00000005, 0x00000005, 0x00000004, 0x00000004, 0x00000003, 0x00000003,
-       0x00000003, 0x00000003, 0x00000003, 0x00000002, 0x00000002, 0x00000002,
-       0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
-       0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
-       0x00000001, 0x00000001, 0x00000001, 0x00000000 };
-static const u32 bnx2_CP_b06FwRodata[(0x134/4) + 1] = {
-       0x08000f30, 0x08000d88, 0x08000fc4, 0x0800106c, 0x08000f58, 0x08000f98,
-       0x080011a4, 0x08000da4, 0x080011c8, 0x08000df4, 0x08001498, 0x08001440,
-       0x08000da4, 0x08000da4, 0x08000da4, 0x08001254, 0x08001254, 0x08000da4,
-       0x08000da4, 0x080016e0, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
-       0x080013d4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
-       0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
-       0x08000da4, 0x08000da4, 0x08000da4, 0x08000fb8, 0x08000da4, 0x08000da4,
-       0x08001690, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
-       0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
-       0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
-       0x080015bc, 0x08000da4, 0x08000da4, 0x08001348, 0x080012b8, 0x08002e50,
-       0x08002e58, 0x08002e20, 0x08002e2c, 0x08002e38, 0x08002e44, 0x0800532c,
-       0x080052ec, 0x080052b8, 0x0800528c, 0x08005268, 0x08005224, 0x00000000
-};
-
-static struct fw_info bnx2_cp_fw_06 = {
-       /* Firmware version: 4.6.16 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0x10,
-
-       .start_addr                     = 0x08000080,
-
-       .text_addr                      = 0x08000000,
-       .text_len                       = 0x56cc,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_CP_b06FwText,
-       .gz_text_len                    = sizeof(bnx2_CP_b06FwText),
-
-       .data_addr                      = 0x08005820,
-       .data_len                       = 0x84,
-       .data_index                     = 0x0,
-       .data                           = bnx2_CP_b06FwData,
-
-       .sbss_addr                      = 0x080058a4,
-       .sbss_len                       = 0xf1,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08005998,
-       .bss_len                        = 0x5d8,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x080056cc,
-       .rodata_len                     = 0x134,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_CP_b06FwRodata,
-};
-
 /* Initialized Values the Command Processor. */
 static const struct cpu_reg cpu_reg_cp = {
        .mode = BNX2_CP_CPU_MODE,
@@ -2184,771 +39,6 @@ static const struct cpu_reg cpu_reg_cp = {
        .mips_view_base = 0x8000000,
 };
 
-static u8 bnx2_RXP_b06FwText[] = {
-       0xec, 0x5b, 0x5d, 0x6c, 0x1c, 0xd7, 0x75, 0x3e, 0x33, 0x3b, 0x24, 0x57,
-       0x14, 0x45, 0x8e, 0xa8, 0x15, 0xb5, 0xb2, 0x99, 0x64, 0x97, 0x1c, 0x89,
-       0x1b, 0x93, 0x50, 0x86, 0xec, 0x5a, 0x66, 0x92, 0x45, 0xbc, 0x59, 0x52,
-       0x16, 0x53, 0x08, 0xf0, 0xda, 0x56, 0x5c, 0xa3, 0x31, 0x90, 0xc5, 0x92,
-       0x76, 0xd2, 0x37, 0xc9, 0xa9, 0x5d, 0x21, 0xb1, 0xab, 0xf5, 0x92, 0x91,
-       0x15, 0x75, 0xc5, 0x61, 0x24, 0x26, 0x72, 0x1b, 0xb7, 0xa0, 0xf9, 0x23,
-       0xaa, 0xc1, 0x4a, 0xe3, 0x9f, 0xd8, 0xf5, 0x43, 0x64, 0x31, 0xb2, 0xad,
-       0xfa, 0xa5, 0x80, 0xd3, 0x1f, 0xc0, 0x28, 0x8c, 0x56, 0x90, 0x6b, 0xd9,
-       0x68, 0x81, 0x42, 0x6d, 0x51, 0xd4, 0x6d, 0x64, 0x4d, 0xbf, 0xef, 0xce,
-       0x0c, 0xb9, 0x22, 0x94, 0xc6, 0x2f, 0x7d, 0x9b, 0x0b, 0x2c, 0xee, 0xdc,
-       0x3b, 0xe7, 0x9e, 0x7b, 0xce, 0xb9, 0xe7, 0xf7, 0x0e, 0xf9, 0x44, 0x9b,
-       0xb4, 0x4a, 0xd0, 0x36, 0xe1, 0x97, 0x3d, 0x70, 0xe8, 0xb1, 0xc1, 0x5d,
-       0xbb, 0x77, 0xe1, 0x71, 0x77, 0xcc, 0x6c, 0x36, 0x38, 0xaf, 0x49, 0xd4,
-       0xa2, 0x16, 0xb5, 0xa8, 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2,
-       0x16, 0xb5, 0xa8, 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2, 0x16,
-       0xb5, 0xa8, 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2, 0x16, 0xb5,
-       0xa8, 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2, 0x16, 0xb5, 0xa8,
-       0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2, 0x16, 0xb5, 0xa8, 0x45,
-       0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xfe, 0x3f, 0x5a, 0x4c, 0xc4, 0x64,
-       0xbf, 0x29, 0xf8, 0x49, 0x5c, 0xcf, 0xa5, 0x0e, 0x16, 0x2c, 0x89, 0xc7,
-       0x72, 0x6f, 0x3f, 0x3e, 0x6e, 0x89, 0xe4, 0xeb, 0xfd, 0xa9, 0x11, 0xf9,
-       0xc4, 0xab, 0x24, 0x0c, 0xe1, 0xfc, 0x67, 0x72, 0xd7, 0x0f, 0x9f, 0xbf,
-       0x2b, 0x7d, 0x6d, 0x2e, 0x26, 0x71, 0x33, 0xf7, 0xee, 0xa0, 0xb9, 0x53,
-       0xe2, 0xdd, 0x58, 0xf3, 0x5c, 0xdf, 0xc4, 0x66, 0x69, 0x0f, 0x71, 0x79,
-       0xde, 0x92, 0xed, 0xc9, 0x25, 0xbb, 0xa2, 0x8d, 0xf4, 0xbd, 0xa6, 0x15,
-       0x9c, 0x1b, 0x5e, 0xde, 0xd0, 0x45, 0x07, 0xbe, 0x89, 0x7a, 0x5c, 0x1e,
-       0x59, 0x6c, 0x95, 0x47, 0xe7, 0x36, 0x4a, 0x79, 0x4e, 0x4c, 0x3d, 0x97,
-       0x94, 0x6f, 0x61, 0xee, 0x72, 0x0c, 0x70, 0xae, 0x94, 0x62, 0xb9, 0x8f,
-       0xef, 0x2d, 0xd7, 0x08, 0x2f, 0xba, 0x9e, 0x5b, 0xb9, 0x77, 0xa2, 0xfe,
-       0xe6, 0xbd, 0xe5, 0x3a, 0xe1, 0x08, 0x83, 0x77, 0xf5, 0x8f, 0xbc, 0xf3,
-       0x7d, 0x09, 0xb9, 0xe0, 0x9a, 0xf2, 0x82, 0xfb, 0x32, 0xf6, 0x4c, 0x57,
-       0x2a, 0xd2, 0x24, 0xe5, 0x93, 0x37, 0xbc, 0x98, 0x95, 0x4e, 0x61, 0x13,
-       0x73, 0x44, 0xf0, 0xde, 0xc1, 0x7b, 0x07, 0xf3, 0x0b, 0x3f, 0xdf, 0x2c,
-       0xad, 0x49, 0x39, 0xdf, 0xc7, 0x75, 0x5c, 0xc3, 0xb5, 0x8b, 0xed, 0xfe,
-       0x3a, 0xc1, 0xba, 0xa2, 0xc4, 0x2c, 0x4f, 0x0a, 0xb6, 0x21, 0x23, 0x09,
-       0xd1, 0x74, 0xab, 0x02, 0x3a, 0x7e, 0xd1, 0x26, 0xad, 0xc4, 0x55, 0xd1,
-       0xf2, 0x2e, 0xfb, 0x10, 0xdf, 0x53, 0x1d, 0x3e, 0xae, 0x67, 0x81, 0xab,
-       0x24, 0xaf, 0xbb, 0x0f, 0xcb, 0x5f, 0xb8, 0x63, 0xf2, 0x92, 0x3b, 0x01,
-       0x9c, 0x0f, 0xc9, 0xab, 0xee, 0x7e, 0x79, 0xc5, 0x2d, 0xca, 0xcf, 0xdc,
-       0x7d, 0xf2, 0xb2, 0x3b, 0x2a, 0x2f, 0xba, 0x79, 0xec, 0x97, 0xd1, 0x8a,
-       0xce, 0xdd, 0x32, 0x7e, 0x92, 0x34, 0xa6, 0xaf, 0x41, 0x36, 0xf2, 0x98,
-       0xdd, 0x67, 0xea, 0xa2, 0x61, 0xcf, 0xf4, 0x6b, 0x22, 0x8f, 0x4a, 0x3e,
-       0x31, 0x2c, 0x73, 0x6e, 0x97, 0x56, 0x38, 0xd9, 0xa9, 0x8d, 0x9c, 0x24,
-       0x2d, 0x9e, 0x8c, 0xdb, 0xe9, 0x54, 0x21, 0x96, 0x36, 0x47, 0x62, 0x92,
-       0xdf, 0x03, 0xb9, 0x55, 0x9d, 0xa4, 0xe4, 0x4d, 0xc9, 0x1f, 0xb5, 0x0c,
-       0xc8, 0x53, 0x93, 0x58, 0x8e, 0x7c, 0x6e, 0xe1, 0x1c, 0x5a, 0x9b, 0x2c,
-       0xd4, 0x6c, 0x29, 0x3b, 0xf3, 0x5a, 0x39, 0xa1, 0x51, 0x04, 0x18, 0x0f,
-       0x60, 0xfc, 0x67, 0xc1, 0xf8, 0x4b, 0x52, 0x3e, 0x25, 0xf9, 0xc9, 0x59,
-       0xcf, 0x2b, 0xd8, 0x7f, 0x1c, 0xcc, 0x0d, 0x63, 0x4e, 0x97, 0xd8, 0x8f,
-       0x38, 0x37, 0x1b, 0xcc, 0x51, 0x1e, 0x9e, 0x8c, 0xd8, 0x14, 0x23, 0xe8,
-       0x35, 0x8b, 0xe8, 0x9b, 0xd1, 0x73, 0x8f, 0x8d, 0x9b, 0xfc, 0xff, 0x03,
-       0xe2, 0xf9, 0x26, 0xf0, 0x6c, 0x83, 0x66, 0x89, 0x7f, 0x36, 0x77, 0xf4,
-       0xe0, 0x3f, 0xf4, 0xad, 0x8d, 0xf5, 0xdc, 0x7b, 0x52, 0xa8, 0x69, 0x4a,
-       0x57, 0x34, 0x3c, 0xf7, 0xd4, 0x9f, 0xea, 0xf4, 0xf5, 0xc2, 0x69, 0x97,
-       0x56, 0xc8, 0xc9, 0x21, 0xfd, 0x29, 0xd0, 0xbf, 0x49, 0xb6, 0xfc, 0x90,
-       0x3c, 0xf4, 0xa7, 0x74, 0xc9, 0xa7, 0x0d, 0xb1, 0x65, 0xd1, 0x35, 0xb4,
-       0x11, 0x27, 0x2f, 0x7a, 0xce, 0x4a, 0x96, 0x45, 0x97, 0x52, 0x22, 0x2f,
-       0xcf, 0x64, 0xd3, 0xc3, 0x15, 0x49, 0x49, 0x79, 0xc8, 0x96, 0x65, 0x17,
-       0x90, 0x89, 0x8a, 0x5c, 0xcd, 0xa6, 0xed, 0xcb, 0xb2, 0x51, 0x56, 0x4c,
-       0x5b, 0x4e, 0xbb, 0x71, 0x79, 0xeb, 0xe4, 0x3e, 0xf9, 0x96, 0xc3, 0x73,
-       0x92, 0xfe, 0x26, 0x79, 0x5a, 0x96, 0xb2, 0x4f, 0x5f, 0x5b, 0xb2, 0x8f,
-       0xb7, 0x49, 0x3b, 0x75, 0xb0, 0xd6, 0xee, 0xd3, 0xfd, 0x15, 0xf0, 0x96,
-       0x87, 0x6c, 0xdb, 0x21, 0x33, 0x43, 0xf1, 0x55, 0x78, 0xb0, 0x13, 0x3d,
-       0xd7, 0xfd, 0xfd, 0x16, 0xe8, 0x83, 0x2d, 0x5a, 0x48, 0x63, 0x93, 0x14,
-       0xba, 0xb8, 0xe6, 0x25, 0xe0, 0xc0, 0xfb, 0x55, 0xda, 0x6f, 0xd3, 0x0a,
-       0xa7, 0xda, 0xc5, 0xf8, 0xd1, 0x9d, 0x38, 0x4f, 0x43, 0x1e, 0x19, 0xf2,
-       0xbc, 0xaf, 0xdb, 0x46, 0x6a, 0x42, 0x72, 0xa4, 0x5d, 0x36, 0x1f, 0xdf,
-       0x2a, 0x73, 0x66, 0x5c, 0x12, 0xc7, 0xc3, 0xbd, 0x5a, 0x82, 0xf3, 0xf9,
-       0x32, 0xf1, 0xa7, 0x52, 0xfa, 0xa6, 0x60, 0x1c, 0xd2, 0x34, 0x8a, 0x33,
-       0xea, 0x35, 0x7b, 0xf4, 0x21, 0x2d, 0xaf, 0xfe, 0x8f, 0x6a, 0x2c, 0x18,
-       0xef, 0xd2, 0xbe, 0x6a, 0x74, 0x89, 0x61, 0xcd, 0x43, 0xae, 0x86, 0x5c,
-       0x74, 0xc2, 0xf9, 0xb8, 0xf8, 0x70, 0x94, 0xb3, 0x0c, 0xae, 0xc9, 0x59,
-       0x06, 0x7b, 0xea, 0x4f, 0x07, 0x38, 0xf3, 0x01, 0xec, 0x06, 0xc9, 0x27,
-       0xdb, 0x78, 0xa6, 0x01, 0xec, 0x75, 0xf9, 0xce, 0x50, 0xfa, 0x0c, 0xff,
-       0x57, 0x6b, 0x6d, 0x0d, 0xdf, 0xdb, 0x32, 0xef, 0xaa, 0x35, 0xc9, 0xfb,
-       0x70, 0xb6, 0xa5, 0xe4, 0x1d, 0xe6, 0x82, 0x1e, 0xd3, 0xf2, 0x09, 0xe2,
-       0x6a, 0x96, 0xc7, 0x13, 0xbd, 0x18, 0x6b, 0x52, 0xfe, 0x12, 0xf5, 0xf5,
-       0x13, 0xf1, 0xe7, 0x39, 0x97, 0x3e, 0xda, 0xab, 0x1f, 0x03, 0x7d, 0x94,
-       0x41, 0x3a, 0x29, 0x10, 0x7e, 0x79, 0xe8, 0x36, 0xf0, 0x67, 0xa2, 0x0f,
-       0xf9, 0xdf, 0x2c, 0xf9, 0x22, 0xe9, 0x57, 0x76, 0x0a, 0x39, 0x27, 0xb1,
-       0xdf, 0xdd, 0xb0, 0xc9, 0xf5, 0xf6, 0x0a, 0x1b, 0x6d, 0xa7, 0xad, 0x7e,
-       0x11, 0x3c, 0xa7, 0x33, 0x22, 0x16, 0xe4, 0x95, 0x94, 0x66, 0x6b, 0x1a,
-       0x3c, 0x51, 0x2f, 0xb7, 0x61, 0x7e, 0xc3, 0xc7, 0x79, 0xc5, 0x7a, 0x38,
-       0xf7, 0x41, 0x20, 0xcb, 0x7d, 0x32, 0xe1, 0xec, 0x57, 0x3c, 0x57, 0xf5,
-       0xcb, 0x92, 0xef, 0xee, 0x35, 0xa7, 0x40, 0x6f, 0xc1, 0x48, 0xcf, 0x55,
-       0x24, 0x29, 0x0b, 0xf0, 0x13, 0x2f, 0xc2, 0xe6, 0x5f, 0x71, 0x53, 0xb0,
-       0xaf, 0xbc, 0x3c, 0xea, 0xe4, 0x64, 0xe2, 0x14, 0x6d, 0x2c, 0x9d, 0x29,
-       0xc4, 0x72, 0x32, 0xef, 0xa4, 0x33, 0x0b, 0xd0, 0xbd, 0x05, 0xc7, 0xf3,
-       0xa6, 0xec, 0xfe, 0xd4, 0x28, 0x30, 0x5e, 0x74, 0x76, 0x24, 0x27, 0x20,
-       0xc8, 0x25, 0x2b, 0x25, 0x4b, 0x6e, 0x06, 0x3a, 0x86, 0xf7, 0xae, 0x85,
-       0x7e, 0x00, 0x3a, 0x9e, 0x85, 0x7d, 0x93, 0x16, 0x53, 0x16, 0xfb, 0x20,
-       0x3b, 0x47, 0x07, 0x2e, 0x4d, 0xf2, 0xfb, 0x6f, 0x40, 0xbe, 0x21, 0xdf,
-       0x77, 0x81, 0xb6, 0x04, 0x70, 0x92, 0xae, 0xdb, 0xa4, 0xda, 0x05, 0xf9,
-       0x0d, 0x25, 0x94, 0x5d, 0x16, 0x3a, 0xb7, 0x4a, 0xe1, 0x8e, 0x66, 0xbc,
-       0xef, 0xc2, 0x98, 0xf2, 0x6f, 0xc1, 0x1c, 0xdf, 0xff, 0x4b, 0x60, 0x5f,
-       0x4d, 0xeb, 0xc6, 0x57, 0xd1, 0xb7, 0xcb, 0x36, 0x8b, 0xbd, 0x89, 0xfe,
-       0x9f, 0xd1, 0x77, 0xa2, 0xef, 0xc5, 0x5e, 0xe7, 0x21, 0x43, 0xca, 0x0f,
-       0xcf, 0x0b, 0x5c, 0xb3, 0x3d, 0xd8, 0x97, 0x78, 0xdb, 0x81, 0x67, 0x53,
-       0xb0, 0x57, 0x3b, 0xc6, 0xad, 0xc1, 0x5e, 0x16, 0x68, 0x8e, 0x29, 0x19,
-       0x16, 0xac, 0xf8, 0xba, 0xb1, 0x86, 0x3e, 0x0e, 0xdc, 0x84, 0xd7, 0xe5,
-       0x4a, 0x57, 0x17, 0x9e, 0xb9, 0x27, 0x61, 0xf8, 0x1e, 0xbd, 0x4b, 0xfc,
-       0x1c, 0xe7, 0xe5, 0x09, 0x07, 0xfe, 0x89, 0xfa, 0xe6, 0x52, 0x8e, 0xbb,
-       0x65, 0x02, 0xbc, 0x8f, 0x3b, 0xe9, 0x99, 0xaa, 0xee, 0x79, 0x7a, 0xd6,
-       0x30, 0xab, 0x92, 0x86, 0x1d, 0x8f, 0xc9, 0x38, 0xe4, 0x77, 0xda, 0x89,
-       0xcb, 0x45, 0x65, 0x7b, 0xe4, 0xe9, 0x21, 0xc8, 0x05, 0xf1, 0xa4, 0x8b,
-       0xf6, 0x49, 0x9b, 0x82, 0xfc, 0x8a, 0xa6, 0x5c, 0xca, 0xd2, 0x96, 0xb3,
-       0xb2, 0xbc, 0x6a, 0xcb, 0x15, 0xd8, 0x32, 0xed, 0xb8, 0x02, 0x7b, 0xf6,
-       0xf5, 0xfa, 0x41, 0xd9, 0x06, 0xbd, 0x4e, 0x62, 0x3f, 0xea, 0xf5, 0xb3,
-       0xd0, 0x6b, 0xc8, 0xd4, 0x86, 0xae, 0x9b, 0xd4, 0x89, 0x6f, 0xc3, 0xa7,
-       0x81, 0xdf, 0x44, 0xf0, 0xbc, 0xfc, 0x5d, 0x29, 0x9c, 0x6a, 0x05, 0xdd,
-       0x7b, 0xdb, 0x29, 0xb3, 0xf2, 0x32, 0x7f, 0xa1, 0x2e, 0x3e, 0x05, 0xf9,
-       0xc1, 0x8f, 0x2a, 0x1d, 0x04, 0x6f, 0xd9, 0x3d, 0x80, 0x19, 0xc6, 0x39,
-       0xb7, 0x02, 0x3f, 0x69, 0xbc, 0x15, 0x1c, 0xdf, 0x83, 0xee, 0x2c, 0xf5,
-       0x15, 0xf3, 0x0b, 0xe1, 0x79, 0xb7, 0xa9, 0x3d, 0xcb, 0x43, 0xad, 0x01,
-       0x7f, 0x94, 0x03, 0xf5, 0x3e, 0x09, 0xbd, 0xd5, 0x64, 0x5c, 0xe9, 0x6e,
-       0x5e, 0xc9, 0x61, 0xde, 0xa1, 0xfe, 0x02, 0x87, 0x4d, 0x19, 0x98, 0x72,
-       0xbf, 0x82, 0x4f, 0xae, 0xd9, 0x77, 0x37, 0x69, 0xe7, 0x78, 0x83, 0xf4,
-       0x28, 0x1f, 0xd4, 0x1d, 0xe8, 0x76, 0x13, 0x6c, 0x9f, 0xef, 0x1e, 0x92,
-       0xc7, 0xdc, 0x61, 0x9c, 0x43, 0x52, 0x0e, 0xba, 0xdd, 0xf2, 0xfb, 0xee,
-       0x46, 0xb9, 0xdc, 0x09, 0xba, 0x56, 0x6d, 0xec, 0x6e, 0xf9, 0x03, 0xc6,
-       0x3c, 0xf5, 0x0c, 0x3f, 0xa9, 0xdf, 0x05, 0x1a, 0x68, 0x4f, 0xb4, 0x2b,
-       0xc2, 0xc5, 0xa4, 0xa4, 0xf6, 0xfc, 0x89, 0xef, 0xdb, 0x80, 0x77, 0xae,
-       0x93, 0xf6, 0x4b, 0xda, 0x8c, 0xc0, 0x66, 0xd3, 0x66, 0x49, 0xc8, 0x33,
-       0x69, 0xe5, 0x73, 0xa3, 0x2c, 0xd8, 0x37, 0xca, 0x20, 0xc4, 0x13, 0xda,
-       0xe5, 0xa8, 0xe4, 0x5d, 0xf6, 0xf4, 0x97, 0x88, 0x91, 0x0e, 0x62, 0xa4,
-       0x83, 0xd8, 0x08, 0x5b, 0x78, 0xc5, 0x41, 0x6c, 0x74, 0x10, 0x1b, 0xe1,
-       0xcf, 0x5e, 0x72, 0x10, 0x1f, 0xa1, 0x43, 0x2f, 0x38, 0x8c, 0xeb, 0xdf,
-       0x46, 0x4c, 0x35, 0xe4, 0x99, 0x9a, 0xc8, 0x91, 0x5a, 0x1a, 0xd4, 0xa5,
-       0x87, 0x3f, 0x90, 0xfe, 0xcc, 0x07, 0x92, 0xb6, 0x2f, 0xe2, 0xf7, 0x96,
-       0xe0, 0x9d, 0xca, 0x11, 0xf0, 0xbe, 0x1e, 0xe6, 0x13, 0x38, 0x7f, 0x8b,
-       0x39, 0x83, 0x3f, 0x0f, 0x97, 0x88, 0xb8, 0x41, 0x9b, 0x1e, 0x93, 0xf9,
-       0x59, 0xda, 0xf2, 0xed, 0x38, 0x8b, 0x4e, 0x99, 0xb2, 0xfc, 0x71, 0xc1,
-       0xbe, 0xc3, 0x1c, 0xa5, 0xee, 0x98, 0x31, 0xd0, 0x76, 0x1b, 0x7e, 0x29,
-       0xc4, 0xda, 0x3f, 0xd2, 0x0a, 0x0b, 0x71, 0xc4, 0x56, 0xc6, 0x5b, 0xc9,
-       0xfb, 0x7a, 0x74, 0xc3, 0x1b, 0x5f, 0x5d, 0xd3, 0x0f, 0xfd, 0x86, 0xdc,
-       0x13, 0x09, 0xc0, 0xcc, 0x6a, 0x23, 0xcb, 0x6f, 0xfb, 0x76, 0x92, 0xe5,
-       0xf8, 0x46, 0x60, 0x7b, 0xdc, 0x1f, 0x63, 0x97, 0x78, 0xf9, 0x4c, 0x9c,
-       0x97, 0x91, 0x1f, 0x24, 0x91, 0x17, 0x24, 0xe0, 0x7b, 0x98, 0x73, 0x74,
-       0x23, 0x3f, 0xf0, 0xbc, 0x17, 0x6d, 0xcf, 0x7b, 0x07, 0xbf, 0x7f, 0xb7,
-       0x57, 0x79, 0x40, 0xab, 0x68, 0xa3, 0x6e, 0x4a, 0x46, 0xdd, 0x9f, 0xb6,
-       0xfb, 0x72, 0x8c, 0xcb, 0xa4, 0x93, 0x90, 0x29, 0xa7, 0xa6, 0xdd, 0xb7,
-       0x3c, 0xad, 0x15, 0x97, 0x67, 0xb0, 0xaf, 0x81, 0x39, 0xa9, 0x54, 0xed,
-       0x33, 0xda, 0x88, 0x7b, 0x54, 0xbb, 0x7f, 0xb9, 0x5d, 0xd9, 0x79, 0xd5,
-       0x61, 0xce, 0x70, 0x5d, 0xe5, 0x2e, 0x05, 0x2b, 0x6d, 0xfe, 0x2e, 0x14,
-       0xaf, 0x50, 0x23, 0xdd, 0xcd, 0x01, 0xcd, 0xb0, 0xc3, 0x9c, 0x77, 0xb8,
-       0x90, 0xb5, 0x60, 0x8b, 0xa4, 0x51, 0xcd, 0x5d, 0xf0, 0xe9, 0x3e, 0xad,
-       0x15, 0x96, 0xdb, 0xb4, 0x91, 0x53, 0x8c, 0xc7, 0xd2, 0x1d, 0x13, 0xae,
-       0xdb, 0x01, 0x7b, 0xad, 0x63, 0x0f, 0xe6, 0x5b, 0x94, 0x2d, 0xe8, 0x86,
-       0x0e, 0xbf, 0x04, 0x7a, 0x5e, 0x54, 0xf9, 0x0f, 0xf9, 0x4b, 0xe1, 0xac,
-       0x42, 0xfe, 0x3c, 0xef, 0xaf, 0xed, 0x90, 0xfe, 0x74, 0x2a, 0xaf, 0x87,
-       0xfc, 0x7a, 0xde, 0xbf, 0xd9, 0xe4, 0x99, 0x3c, 0x79, 0xde, 0x0b, 0x76,
-       0x02, 0xf4, 0x7b, 0x17, 0x74, 0xab, 0x06, 0x7e, 0x18, 0xdb, 0x29, 0xf3,
-       0x69, 0xf0, 0x71, 0x14, 0x3c, 0x9e, 0x06, 0x7f, 0x33, 0xa0, 0xe5, 0x37,
-       0xed, 0xd9, 0x98, 0x4b, 0x4a, 0x8a, 0xb2, 0x2e, 0x2f, 0x32, 0xa7, 0x64,
-       0x1e, 0x69, 0x4a, 0x69, 0x31, 0x5c, 0x1f, 0xea, 0xc3, 0x01, 0xd9, 0xeb,
-       0x74, 0x42, 0x3e, 0x94, 0xe7, 0x35, 0xd0, 0x4b, 0x9f, 0x5f, 0xcd, 0xe8,
-       0x08, 0x80, 0x65, 0x1b, 0xb1, 0x5e, 0x46, 0x94, 0x2e, 0x2c, 0x5a, 0x92,
-       0x2f, 0xdb, 0x26, 0xed, 0x36, 0x55, 0xb6, 0x2b, 0xc8, 0x0c, 0x7c, 0x39,
-       0x8e, 0xd4, 0x0c, 0xbc, 0xe3, 0x58, 0x60, 0xf3, 0xa1, 0x6c, 0x0d, 0xd8,
-       0x5d, 0x28, 0xf3, 0x70, 0xee, 0xc1, 0x0e, 0xfa, 0xcc, 0x79, 0xf7, 0x0b,
-       0xc0, 0x41, 0xbc, 0xbf, 0x09, 0x47, 0x1c, 0x31, 0x84, 0x78, 0xe2, 0x72,
-       0xc6, 0x21, 0x3c, 0xf3, 0x8b, 0xb8, 0xb4, 0x22, 0x26, 0x6f, 0xc8, 0x89,
-       0xf6, 0xf9, 0x1d, 0x69, 0x73, 0x31, 0x16, 0x93, 0x63, 0x09, 0xb9, 0xc3,
-       0x60, 0x00, 0xd8, 0xec, 0x67, 0xea, 0x85, 0x19, 0x0d, 0xba, 0xdc, 0x26,
-       0x93, 0x03, 0x69, 0x73, 0x1e, 0x7b, 0xe8, 0xd8, 0xe3, 0x6b, 0x9c, 0xaf,
-       0xfd, 0x87, 0x57, 0x4a, 0xec, 0x84, 0x9d, 0x48, 0xdc, 0xc8, 0x19, 0x83,
-       0x53, 0xb5, 0x03, 0xc2, 0xfc, 0x6a, 0x72, 0x60, 0x03, 0xec, 0xbc, 0x77,
-       0x78, 0xaf, 0x30, 0x97, 0x8f, 0x0f, 0x8e, 0x5b, 0x3e, 0x5d, 0x23, 0xb0,
-       0xeb, 0x49, 0xe4, 0x79, 0x7b, 0xeb, 0xcc, 0x01, 0x8c, 0xc1, 0xde, 0xba,
-       0x21, 0x47, 0x60, 0xaf, 0xcd, 0xd0, 0x9f, 0x15, 0xa5, 0xcb, 0x26, 0x64,
-       0x4d, 0xdf, 0x3a, 0x0c, 0xdc, 0xef, 0x40, 0x6e, 0x16, 0x62, 0x67, 0x37,
-       0xf2, 0xd9, 0x0c, 0xce, 0x33, 0x85, 0xd8, 0xd7, 0xa8, 0xd7, 0x12, 0xdf,
-       0x0a, 0xb8, 0x57, 0x76, 0x32, 0x2f, 0xf3, 0xbc, 0x07, 0xac, 0xf4, 0xb3,
-       0xe4, 0x65, 0xca, 0x91, 0x7c, 0xd5, 0x56, 0xbe, 0x10, 0x3a, 0x9b, 0x62,
-       0x3e, 0x07, 0xfd, 0x83, 0x4e, 0x16, 0x39, 0x5e, 0xd5, 0xc1, 0xe4, 0xa4,
-       0xcc, 0x43, 0x76, 0x62, 0x16, 0xb2, 0x84, 0x0d, 0xe1, 0x5a, 0x02, 0xdd,
-       0xf6, 0xbc, 0x18, 0x74, 0x77, 0x3c, 0x4b, 0x38, 0xa9, 0x28, 0x9b, 0x83,
-       0xcc, 0x26, 0xdd, 0x5d, 0x1d, 0x7e, 0x3e, 0x09, 0x5f, 0x99, 0xe0, 0x5e,
-       0x9f, 0x85, 0x0e, 0x77, 0x23, 0x86, 0x78, 0x1e, 0x6c, 0x38, 0xa1, 0x0b,
-       0x75, 0x18, 0xf6, 0xe2, 0xf2, 0x5d, 0x1b, 0xe6, 0xc5, 0x9c, 0x84, 0x4f,
-       0x2b, 0x99, 0x9e, 0x77, 0x0f, 0x68, 0xa9, 0xda, 0x1d, 0x58, 0xd7, 0x24,
-       0x08, 0x7b, 0xa6, 0xbf, 0xdf, 0x46, 0x15, 0x3b, 0x30, 0x6e, 0xc7, 0x7e,
-       0x9b, 0x98, 0x7b, 0x4e, 0xd2, 0x16, 0xb2, 0xb4, 0x7d, 0x23, 0xf0, 0xe7,
-       0x6f, 0x82, 0x4e, 0xae, 0x51, 0x70, 0xf1, 0xa6, 0x5c, 0x56, 0x96, 0x6a,
-       0xdb, 0x65, 0x6e, 0x3f, 0xf7, 0xe8, 0xa6, 0x1d, 0x22, 0xfe, 0xf3, 0x99,
-       0x74, 0xd3, 0x8f, 0x74, 0x06, 0x63, 0xed, 0x73, 0xfe, 0x1e, 0x62, 0x32,
-       0xdf, 0x1d, 0x51, 0xf4, 0x8a, 0x7e, 0xd1, 0xde, 0xe8, 0xc7, 0xa8, 0x5c,
-       0xbb, 0x76, 0x0f, 0x72, 0xf0, 0xbd, 0xbb, 0xa9, 0x03, 0x86, 0x5c, 0xb2,
-       0x3c, 0xef, 0x92, 0xdd, 0x04, 0xfe, 0x74, 0x69, 0xb2, 0x8e, 0x9b, 0xd2,
-       0x0a, 0x99, 0x3b, 0x5a, 0x20, 0x97, 0x36, 0x25, 0x97, 0x49, 0x15, 0xf7,
-       0xde, 0xc5, 0xd9, 0x70, 0x6d, 0x45, 0xc5, 0x97, 0x82, 0x5a, 0xc7, 0x35,
-       0x3c, 0xd3, 0x77, 0x91, 0x73, 0x1f, 0xc3, 0xda, 0x98, 0xb4, 0x28, 0xdd,
-       0x66, 0xfc, 0x27, 0xaf, 0xd2, 0xe1, 0xe3, 0x61, 0xac, 0xa5, 0x0e, 0x87,
-       0xfc, 0x8f, 0x06, 0x3c, 0x12, 0xaf, 0x0d, 0xbc, 0x6d, 0xaa, 0xce, 0x28,
-       0xfb, 0xe7, 0xd7, 0x11, 0x53, 0xf2, 0x40, 0x5d, 0x94, 0x0b, 0x7d, 0x21,
-       0x41, 0x43, 0xba, 0x9f, 0xc1, 0x3e, 0xa4, 0x61, 0x13, 0xf2, 0x5e, 0xd1,
-       0xaa, 0xe4, 0xcb, 0x0c, 0xf7, 0x11, 0x3d, 0x96, 0x6b, 0x91, 0x11, 0x68,
-       0x5d, 0xd5, 0xb1, 0xcc, 0x07, 0xa0, 0x7b, 0x5f, 0x07, 0x8f, 0x85, 0x19,
-       0xfa, 0xaa, 0x2f, 0x61, 0xdd, 0x4a, 0x5a, 0xf7, 0xb7, 0x95, 0x23, 0x0e,
-       0x65, 0xfa, 0x0e, 0x64, 0xaa, 0x77, 0x35, 0x4b, 0x87, 0x14, 0x91, 0x4f,
-       0xcd, 0x0f, 0x83, 0xaf, 0x81, 0x36, 0x89, 0xed, 0xa2, 0xaf, 0x42, 0xed,
-       0x93, 0x58, 0x41, 0x60, 0xb8, 0xee, 0xe9, 0x3b, 0xb1, 0x7e, 0x20, 0x01,
-       0xf9, 0x52, 0x66, 0x7a, 0x00, 0x47, 0x18, 0x14, 0x4a, 0x66, 0xa1, 0xb3,
-       0x59, 0x88, 0x9b, 0xef, 0xfa, 0x93, 0xa6, 0x70, 0x1e, 0x3e, 0xbd, 0xc8,
-       0xb5, 0xa4, 0xd9, 0x5f, 0xd3, 0x64, 0x85, 0xb2, 0xfe, 0x2b, 0xf8, 0xa7,
-       0x5f, 0x79, 0x7b, 0x87, 0xc2, 0xf7, 0xe4, 0x87, 0x7c, 0xe1, 0x0c, 0x41,
-       0xd3, 0xe6, 0x9c, 0x25, 0x83, 0xd3, 0xa2, 0x15, 0x90, 0x7b, 0x50, 0x47,
-       0x7a, 0x86, 0xd2, 0x95, 0x94, 0xbe, 0x0d, 0xbc, 0x1a, 0xb2, 0x7f, 0x88,
-       0xfc, 0x6e, 0x0d, 0xf2, 0x8e, 0x46, 0x9e, 0x3b, 0x02, 0x9e, 0xd5, 0x7e,
-       0xc3, 0x79, 0x7d, 0x8d, 0xf7, 0xd1, 0x99, 0x70, 0x5f, 0x03, 0xb6, 0xbc,
-       0x82, 0x9a, 0x87, 0xfb, 0x93, 0x9e, 0x1b, 0x9e, 0x6e, 0x59, 0x95, 0x1e,
-       0xfd, 0x57, 0xde, 0xfd, 0x43, 0x9a, 0xca, 0xd3, 0x74, 0xe4, 0x8c, 0xfa,
-       0x10, 0x78, 0x1d, 0xe2, 0x79, 0xe9, 0x72, 0xff, 0x6e, 0xe2, 0x3b, 0x42,
-       0xde, 0x80, 0xb3, 0xd5, 0xaf, 0x61, 0x86, 0xc2, 0x3d, 0x1a, 0xf5, 0x27,
-       0xc4, 0x49, 0x5c, 0x84, 0xe1, 0x99, 0xd0, 0xdf, 0x4a, 0xbc, 0x60, 0xc7,
-       0x83, 0xb3, 0x0e, 0xd7, 0x89, 0x66, 0x58, 0xeb, 0xd7, 0xc1, 0x68, 0x1f,
-       0xa4, 0xde, 0xf5, 0x04, 0x76, 0x16, 0xea, 0x21, 0xf7, 0x64, 0x7f, 0x2b,
-       0x9d, 0xe5, 0x3a, 0xae, 0x27, 0x3c, 0x61, 0xe0, 0x33, 0xe0, 0x83, 0x7e,
-       0x06, 0xdb, 0x78, 0xf9, 0x26, 0x5f, 0xce, 0xd8, 0x4e, 0x1f, 0x63, 0xaf,
-       0xf7, 0xe7, 0xac, 0x7d, 0xf0, 0xac, 0xc3, 0x7e, 0x1b, 0xfd, 0x3a, 0xe7,
-       0x50, 0x4f, 0x2c, 0x8e, 0xa2, 0xb7, 0x64, 0xed, 0x1e, 0x80, 0x7e, 0x3e,
-       0xac, 0xe7, 0xdb, 0x4a, 0x46, 0x8e, 0x35, 0xbd, 0x14, 0xab, 0xb5, 0xc3,
-       0x88, 0xc9, 0x52, 0xb9, 0x4d, 0xd5, 0xc6, 0x6d, 0xc3, 0x85, 0x2c, 0xe6,
-       0xea, 0x8c, 0xcb, 0x30, 0x7f, 0xac, 0x43, 0x6c, 0x88, 0xeb, 0xd3, 0xf1,
-       0xca, 0xed, 0x39, 0xda, 0x49, 0x4a, 0x52, 0xf5, 0x6b, 0x88, 0x79, 0xc8,
-       0x1f, 0x95, 0x0e, 0x7d, 0xf1, 0x76, 0xd2, 0x5f, 0x45, 0xec, 0x32, 0x72,
-       0x62, 0xe8, 0xb9, 0xe6, 0xf8, 0x64, 0xb6, 0x0d, 0xb1, 0x7e, 0x6c, 0xbb,
-       0x7e, 0x6e, 0xdf, 0xf6, 0xd8, 0xb9, 0xae, 0x52, 0x53, 0xae, 0xb2, 0x5d,
-       0x9f, 0x86, 0x2f, 0xaf, 0x89, 0x8e, 0x98, 0x8a, 0x1a, 0x01, 0xe3, 0x73,
-       0x0f, 0x3c, 0xa0, 0xe7, 0x62, 0x52, 0x4e, 0xc8, 0x93, 0x8b, 0x59, 0xf8,
-       0xf5, 0x5a, 0x3a, 0x55, 0x94, 0x27, 0xa5, 0x5a, 0x3b, 0x24, 0x93, 0xb5,
-       0xf0, 0xde, 0x80, 0x77, 0x06, 0x49, 0xe5, 0xbf, 0xe8, 0x5f, 0x27, 0x03,
-       0xda, 0x41, 0x73, 0x7e, 0x84, 0x31, 0x3a, 0x4b, 0xdf, 0x7d, 0x0d, 0x3a,
-       0xd1, 0x12, 0xd4, 0xda, 0xbe, 0xfe, 0x19, 0xb9, 0x8f, 0x30, 0x47, 0xfd,
-       0xdb, 0xb0, 0x7a, 0x6e, 0x7b, 0x4e, 0xfd, 0x89, 0x8a, 0xa9, 0x4b, 0x36,
-       0x9f, 0x09, 0xf3, 0xf6, 0xe0, 0x94, 0x75, 0xdd, 0x64, 0x6d, 0x70, 0xc1,
-       0x21, 0x3e, 0x53, 0x9d, 0xb5, 0x91, 0xbb, 0x8c, 0xb5, 0xad, 0xa4, 0x0b,
-       0xcd, 0xc0, 0x3c, 0xf6, 0x77, 0x9a, 0x83, 0x71, 0xb8, 0xf6, 0xb5, 0x86,
-       0xb5, 0x9c, 0x63, 0x4f, 0xdc, 0xd8, 0xa3, 0xe1, 0xce, 0xe4, 0x82, 0x9b,
-       0x51, 0x35, 0x7b, 0xc1, 0x55, 0xb9, 0x02, 0x6a, 0x74, 0xe8, 0x93, 0xba,
-       0x43, 0x81, 0x3f, 0x72, 0xff, 0xce, 0xf4, 0xcf, 0x9d, 0xfe, 0x63, 0x45,
-       0x18, 0xdf, 0xa8, 0x6f, 0x53, 0xca, 0x4f, 0xbd, 0xd9, 0x70, 0x17, 0xf0,
-       0x26, 0xfc, 0xd2, 0x9d, 0x9b, 0xfd, 0x9a, 0xc6, 0x0c, 0x7c, 0x5a, 0xab,
-       0xca, 0x53, 0x7c, 0x9f, 0x96, 0x6a, 0x80, 0x4d, 0xf1, 0xde, 0xa0, 0xc3,
-       0xaf, 0xbd, 0x7f, 0x2b, 0x58, 0xc3, 0xfc, 0xc1, 0x32, 0x99, 0x3b, 0xf8,
-       0xb2, 0xf0, 0x9e, 0x59, 0x1d, 0x27, 0x4a, 0x01, 0xbe, 0xa6, 0xe0, 0xdd,
-       0x5b, 0x6d, 0x3e, 0x4d, 0xe1, 0xda, 0x3f, 0x0d, 0xee, 0xa6, 0x94, 0x2f,
-       0xcc, 0x03, 0x16, 0x3c, 0xa4, 0x4a, 0x3a, 0xf4, 0x66, 0xa4, 0xee, 0xcb,
-       0x1b, 0xf1, 0x8e, 0xf7, 0x4f, 0x8a, 0xb6, 0x0b, 0x2a, 0xe7, 0x68, 0xe4,
-       0x3f, 0x4f, 0xbe, 0xf3, 0x06, 0x69, 0x74, 0xc7, 0xb0, 0x56, 0x0e, 0xf8,
-       0x77, 0x14, 0xa6, 0x4c, 0x98, 0xfd, 0xe6, 0x24, 0xf1, 0x26, 0x04, 0xf8,
-       0x90, 0x97, 0xe4, 0xc2, 0x33, 0xfc, 0x26, 0xf7, 0x06, 0xde, 0x8d, 0x1c,
-       0xa3, 0xff, 0x66, 0x40, 0xcb, 0x8f, 0x03, 0x79, 0x85, 0xef, 0x7f, 0xb1,
-       0xf9, 0xe6, 0xf1, 0x3d, 0xb7, 0x07, 0xf2, 0xc4, 0xf3, 0xa1, 0x5f, 0x43,
-       0x13, 0xf5, 0xfd, 0x34, 0xf0, 0xa8, 0x18, 0x5c, 0xd1, 0x73, 0x88, 0xf9,
-       0x59, 0x64, 0x34, 0x35, 0xd8, 0xb4, 0x20, 0xf6, 0xbb, 0x69, 0xbb, 0x84,
-       0x55, 0x1f, 0xd5, 0xe8, 0x57, 0xaf, 0xc3, 0xaf, 0xf2, 0xac, 0x3f, 0x96,
-       0xa9, 0x5a, 0xaf, 0xdd, 0xac, 0xa9, 0xfc, 0x3a, 0x73, 0x5a, 0xfa, 0xed,
-       0xd3, 0xc8, 0x3d, 0x50, 0xa3, 0xa5, 0x8e, 0x08, 0x65, 0x7e, 0x5d, 0x76,
-       0xa8, 0x9c, 0xe0, 0x63, 0xb1, 0x20, 0x93, 0x22, 0xea, 0x04, 0x7d, 0xe8,
-       0x5f, 0x3d, 0x95, 0xd3, 0x68, 0xa8, 0x42, 0x6f, 0x81, 0xeb, 0x6d, 0x85,
-       0x87, 0xf8, 0x1a, 0x71, 0x69, 0xd2, 0x32, 0x14, 0xe2, 0x4b, 0xc9, 0x51,
-       0x37, 0xc4, 0x69, 0xc8, 0x65, 0x64, 0x2d, 0xfa, 0x90, 0x17, 0xf0, 0xcf,
-       0xe7, 0x5f, 0x7a, 0xcc, 0x09, 0xf4, 0xdc, 0xdd, 0x81, 0x0c, 0x7e, 0x8f,
-       0x32, 0xc0, 0x18, 0x3a, 0xef, 0x7c, 0xc5, 0xaf, 0x45, 0x54, 0x2d, 0x37,
-       0x86, 0x9a, 0x82, 0x73, 0x2b, 0x2d, 0x05, 0x3b, 0x3c, 0xe3, 0x7d, 0x98,
-       0x2b, 0xe2, 0x47, 0xb9, 0x10, 0x66, 0x3f, 0x9e, 0xf3, 0x01, 0x9c, 0x0c,
-       0xfb, 0x35, 0x79, 0x58, 0x8b, 0x84, 0x39, 0xa1, 0xcc, 0xe8, 0x39, 0xe6,
-       0xef, 0x3b, 0x40, 0x2b, 0x73, 0x56, 0x9c, 0xe7, 0xaa, 0xff, 0x59, 0x85,
-       0xa9, 0xac, 0xc1, 0xf8, 0xb9, 0xe7, 0xa8, 0x1b, 0xe6, 0xbb, 0xcc, 0x69,
-       0xc3, 0xdc, 0x27, 0xaf, 0x15, 0x9d, 0x31, 0xed, 0x3e, 0x87, 0xf0, 0xfa,
-       0xec, 0x66, 0xb1, 0x52, 0x3d, 0xba, 0x27, 0x23, 0x43, 0xac, 0x9d, 0x8f,
-       0xe1, 0xcc, 0x3b, 0xa4, 0x9c, 0x41, 0x1e, 0x60, 0xde, 0x85, 0xbe, 0x19,
-       0x73, 0x5f, 0xc6, 0x1c, 0x74, 0x23, 0xc3, 0xfc, 0x66, 0x83, 0xaa, 0x41,
-       0x4a, 0x2a, 0x76, 0xec, 0x08, 0xf4, 0xe5, 0x89, 0x4e, 0x5f, 0x3f, 0xbe,
-       0x87, 0xf1, 0x46, 0xcc, 0x7f, 0x03, 0xbd, 0xe7, 0xf5, 0x0c, 0x85, 0xf3,
-       0xd4, 0xfb, 0x61, 0xcc, 0xdf, 0x09, 0x1c, 0x15, 0x3c, 0x7f, 0x0e, 0xcf,
-       0x7f, 0xb8, 0x6e, 0xed, 0x77, 0x31, 0xae, 0x60, 0xbe, 0xb0, 0x6e, 0x3e,
-       0xf4, 0xb3, 0xdc, 0xaf, 0xa2, 0x15, 0xdd, 0x29, 0x2d, 0xaf, 0xea, 0x88,
-       0x63, 0xa8, 0x55, 0xe8, 0x6b, 0x59, 0xb3, 0xcc, 0x20, 0x17, 0xa7, 0x9f,
-       0x3d, 0x88, 0x35, 0x8b, 0xd0, 0xbb, 0x56, 0x95, 0x65, 0xea, 0xca, 0x1e,
-       0x0f, 0x1d, 0xec, 0x99, 0x63, 0x5f, 0x39, 0x68, 0xd7, 0x09, 0xc3, 0xe7,
-       0x27, 0x0f, 0xf6, 0xd4, 0x0f, 0x01, 0x96, 0xf9, 0x7a, 0xe3, 0x1d, 0xef,
-       0x37, 0xd6, 0xed, 0xe9, 0xd7, 0x38, 0x45, 0x75, 0x37, 0x78, 0xe8, 0x60,
-       0x61, 0x86, 0x71, 0x9a, 0xf5, 0x26, 0xf3, 0xd2, 0xca, 0xc1, 0xf1, 0xda,
-       0x54, 0x50, 0xd3, 0x84, 0xef, 0xf9, 0x8e, 0xf2, 0xbf, 0x15, 0x6d, 0xa4,
-       0xab, 0x11, 0x8f, 0xca, 0x6b, 0x80, 0xe7, 0x49, 0xe0, 0x61, 0x6d, 0xa4,
-       0xee, 0x90, 0x15, 0xbd, 0xa9, 0xb9, 0x5b, 0xd1, 0x46, 0x5c, 0xdc, 0x2b,
-       0xc4, 0x77, 0x02, 0x75, 0xc7, 0x77, 0x48, 0x2f, 0xf0, 0x7c, 0x26, 0xc8,
-       0x6d, 0x78, 0x37, 0x65, 0xf8, 0x77, 0x38, 0x6a, 0x1c, 0xd6, 0xbe, 0x4d,
-       0xeb, 0x6a, 0xdf, 0xa6, 0xe0, 0x1e, 0x8b, 0xb0, 0x7a, 0x00, 0xab, 0xee,
-       0xd0, 0x31, 0x97, 0x0a, 0xee, 0x94, 0xe3, 0xbc, 0x53, 0x6e, 0x90, 0x45,
-       0x53, 0x20, 0x7f, 0xd2, 0x11, 0xd6, 0x2b, 0x8d, 0xf4, 0xf1, 0xbe, 0x79,
-       0x0a, 0xef, 0xc3, 0xb3, 0x09, 0x79, 0x5f, 0xc4, 0x3c, 0xe9, 0x3d, 0x03,
-       0xf8, 0x90, 0xde, 0x4f, 0x7b, 0xa6, 0x5c, 0x7b, 0x06, 0xbf, 0x70, 0xbf,
-       0x50, 0x2e, 0xa4, 0xf5, 0xd7, 0xd5, 0x5a, 0xa1, 0xdf, 0x5b, 0x0c, 0x62,
-       0x3a, 0xe9, 0xa2, 0x0f, 0xa2, 0x3f, 0x0e, 0xef, 0xc0, 0x59, 0x63, 0x33,
-       0x56, 0xf0, 0xbc, 0x5a, 0xa0, 0x2b, 0x84, 0xd3, 0x90, 0x5f, 0xeb, 0xcc,
-       0xc3, 0x52, 0xa8, 0x35, 0x92, 0x8f, 0xc8, 0x0f, 0xb0, 0x57, 0x3e, 0xd3,
-       0xa4, 0xec, 0x88, 0xf7, 0x08, 0xcd, 0xb2, 0x02, 0x9d, 0xbe, 0x84, 0xfa,
-       0x63, 0x1e, 0xb5, 0xd1, 0x12, 0xef, 0xb5, 0xeb, 0x27, 0x3b, 0x79, 0x1f,
-       0x32, 0x65, 0xad, 0xd5, 0xf1, 0x73, 0x80, 0x59, 0xb0, 0x58, 0xeb, 0x4b,
-       0xd0, 0x10, 0x23, 0x91, 0x67, 0x8c, 0x5b, 0xff, 0xe3, 0x95, 0x13, 0x8d,
-       0xb0, 0xb7, 0xaa, 0xb3, 0xdb, 0xa4, 0x3a, 0x9b, 0x3e, 0x3a, 0x87, 0x7a,
-       0x77, 0xc6, 0xd2, 0xb7, 0xe8, 0x7e, 0xad, 0x34, 0x03, 0xdf, 0xa4, 0x6a,
-       0xad, 0x39, 0x79, 0xae, 0x93, 0x67, 0xd7, 0x64, 0xf5, 0x9b, 0x9d, 0xfa,
-       0xef, 0x50, 0x17, 0x15, 0xe5, 0xb1, 0x13, 0x1b, 0xa4, 0x3c, 0x70, 0x1f,
-       0x72, 0x2d, 0xc8, 0xf3, 0x44, 0x05, 0x95, 0x21, 0xf5, 0xea, 0xbd, 0x03,
-       0xe3, 0x16, 0x6b, 0x26, 0xf1, 0xe3, 0x9a, 0xf8, 0x3c, 0xc6, 0x4e, 0xb4,
-       0x29, 0x9f, 0xe4, 0xdf, 0x99, 0xf7, 0x9a, 0x45, 0xe4, 0x63, 0x85, 0x01,
-       0x24, 0x8d, 0xc8, 0x5e, 0xcc, 0x9d, 0x22, 0x3d, 0xcc, 0x19, 0xe1, 0x8f,
-       0x7b, 0xce, 0xc1, 0xcb, 0x9d, 0x20, 0xbc, 0x2e, 0xc6, 0x89, 0x98, 0x34,
-       0x9d, 0x60, 0x9d, 0x2d, 0x5d, 0xa8, 0x51, 0x88, 0xb3, 0xc7, 0x40, 0x3f,
-       0x8a, 0xdf, 0x1e, 0xe4, 0x51, 0x26, 0xf2, 0xda, 0x5b, 0xc0, 0x03, 0x96,
-       0x6b, 0x6e, 0x05, 0xff, 0x6a, 0x27, 0xeb, 0xce, 0x9e, 0x73, 0x84, 0xe7,
-       0x7d, 0x76, 0x17, 0xe8, 0xf1, 0xf7, 0x27, 0x0e, 0xe3, 0x84, 0x48, 0xef,
-       0xb4, 0x74, 0xea, 0x6a, 0x8d, 0x21, 0xe3, 0x59, 0xbe, 0x6b, 0x03, 0xfc,
-       0xab, 0xca, 0x3e, 0x7b, 0xd5, 0x3a, 0xff, 0xce, 0xa2, 0xbc, 0x46, 0x37,
-       0xe6, 0x34, 0x3c, 0x23, 0x57, 0xca, 0x9a, 0xd2, 0x3b, 0xef, 0xc3, 0xf6,
-       0x9c, 0xeb, 0xd8, 0xe2, 0xdf, 0xed, 0xf8, 0xb4, 0xf1, 0x6e, 0xb0, 0x0c,
-       0xa9, 0x1a, 0x3b, 0x59, 0xf3, 0x13, 0x86, 0xdf, 0x52, 0xd8, 0x73, 0x2d,
-       0xe5, 0xe7, 0xcf, 0xe9, 0xfa, 0xff, 0xa5, 0x5f, 0xeb, 0xbf, 0xe1, 0x84,
-       0x77, 0x4b, 0xa9, 0x86, 0xbb, 0xa5, 0x74, 0xc3, 0xb7, 0x97, 0x9f, 0xb4,
-       0x05, 0x7a, 0x27, 0x93, 0xb6, 0x27, 0xe1, 0xf7, 0xa5, 0xbd, 0x37, 0xe5,
-       0x90, 0x19, 0x15, 0xa7, 0xc7, 0x21, 0xfb, 0x2b, 0x75, 0xd2, 0x8b, 0x98,
-       0x53, 0x8f, 0xcb, 0xfb, 0x8b, 0xad, 0x72, 0x65, 0xce, 0xcf, 0x29, 0xaf,
-       0xa8, 0x6f, 0x4e, 0xa6, 0x7c, 0x80, 0xc2, 0xff, 0x72, 0x3d, 0x83, 0x5f,
-       0xa7, 0x5c, 0x5d, 0xbc, 0x39, 0xa7, 0xbc, 0xe0, 0xde, 0x0d, 0x5a, 0x3a,
-       0x03, 0x1b, 0x46, 0xdd, 0x86, 0x18, 0x58, 0x09, 0xee, 0xea, 0x55, 0xce,
-       0x62, 0xd0, 0x16, 0x78, 0x27, 0x1f, 0xde, 0x57, 0xf7, 0x9a, 0x17, 0x21,
-       0xe3, 0xaf, 0x1a, 0x9d, 0xa8, 0xa3, 0x79, 0xd7, 0x16, 0xc6, 0xec, 0x30,
-       0xf6, 0x90, 0xee, 0xb7, 0x81, 0x7b, 0x00, 0x7a, 0x4a, 0xdd, 0xb4, 0xa1,
-       0xb3, 0xa6, 0x2c, 0xf5, 0xa5, 0x67, 0x2a, 0xc2, 0xef, 0x02, 0x59, 0xec,
-       0xb9, 0x0c, 0xbd, 0xcc, 0x40, 0x1e, 0xcc, 0xf5, 0x28, 0x57, 0x9c, 0xed,
-       0xf4, 0x94, 0x94, 0xdd, 0xad, 0xc0, 0x97, 0x97, 0x92, 0x3b, 0x8c, 0xbd,
-       0x8e, 0x43, 0x6f, 0x7f, 0xb9, 0x85, 0x77, 0x99, 0xcd, 0x56, 0x16, 0x34,
-       0xde, 0x25, 0xe3, 0x27, 0xa7, 0x64, 0xc2, 0x59, 0xfd, 0x66, 0x94, 0xe1,
-       0xf7, 0x94, 0x45, 0xd4, 0xb4, 0xbe, 0x3d, 0xe6, 0x64, 0xfc, 0x14, 0x70,
-       0x38, 0xac, 0x8d, 0x7b, 0xa1, 0x37, 0xfd, 0xaa, 0x36, 0x2e, 0x29, 0x9f,
-       0xc4, 0xf9, 0xef, 0x01, 0x57, 0x6f, 0x65, 0x0f, 0xe0, 0xca, 0xa8, 0x9f,
-       0x8b, 0xc8, 0x85, 0x17, 0x1c, 0x43, 0xca, 0x36, 0x7c, 0x6b, 0x31, 0xa9,
-       0xeb, 0xbb, 0xba, 0x65, 0xde, 0xe9, 0x37, 0x75, 0xde, 0x3d, 0x26, 0x7c,
-       0xdf, 0x57, 0x56, 0xf6, 0x9d, 0xd4, 0x0d, 0xab, 0x5b, 0x16, 0x9d, 0x8a,
-       0x54, 0x07, 0x38, 0xe6, 0xf9, 0x55, 0xc4, 0xb4, 0x7c, 0x5f, 0x99, 0xd7,
-       0x35, 0x75, 0xb7, 0x5d, 0x76, 0xd5, 0xfd, 0x68, 0xca, 0x94, 0xc3, 0xa0,
-       0x0f, 0xcf, 0x0b, 0xd0, 0xf1, 0x69, 0xe6, 0x78, 0xfe, 0x9d, 0xf1, 0x81,
-       0xe5, 0x22, 0x68, 0x68, 0x97, 0xde, 0x1f, 0xd3, 0xc6, 0x1e, 0xc2, 0x1c,
-       0xc7, 0x69, 0xe8, 0xeb, 0xc3, 0x78, 0x26, 0x6c, 0x12, 0x3d, 0xe5, 0xd0,
-       0x8d, 0xde, 0x04, 0x2d, 0xd0, 0x4b, 0xd6, 0xa5, 0xfb, 0x53, 0x32, 0x7f,
-       0x72, 0xb7, 0x94, 0x16, 0x76, 0x03, 0xff, 0x3f, 0x22, 0xe7, 0xbf, 0x33,
-       0xb8, 0x8b, 0x65, 0xde, 0xcf, 0x7d, 0x5e, 0xdc, 0xa2, 0x6c, 0x63, 0x9a,
-       0xf3, 0xec, 0xf7, 0x61, 0x3d, 0xea, 0x07, 0x47, 0xdd, 0x4f, 0x03, 0x06,
-       0x67, 0xe7, 0x36, 0x7e, 0xfb, 0xeb, 0x84, 0x9f, 0xae, 0xb0, 0x76, 0x40,
-       0x6c, 0x99, 0x1b, 0x2c, 0xd4, 0xd2, 0x66, 0x41, 0x7d, 0x97, 0xc8, 0x88,
-       0x1f, 0x6f, 0x38, 0x17, 0x17, 0x6b, 0x1a, 0xf5, 0x68, 0x8e, 0xef, 0x0e,
-       0xab, 0xfb, 0x1f, 0xf5, 0x7d, 0x4e, 0xde, 0x95, 0x51, 0xe8, 0x58, 0xef,
-       0x74, 0x06, 0x39, 0xf1, 0x7b, 0xc8, 0x27, 0x7f, 0x1e, 0xc8, 0x60, 0x38,
-       0xd0, 0x8d, 0xd6, 0x06, 0x9d, 0xc0, 0x39, 0x3b, 0x38, 0x7b, 0x07, 0x7a,
-       0xe0, 0xe0, 0xac, 0x57, 0xf5, 0x63, 0xb8, 0xc1, 0xe7, 0x6e, 0x92, 0xbf,
-       0x9c, 0x49, 0x67, 0x56, 0xa0, 0x3f, 0x57, 0xc1, 0xeb, 0x0a, 0xea, 0xbc,
-       0x2b, 0x88, 0x23, 0x0b, 0x35, 0x7e, 0x4b, 0xe0, 0xb7, 0x38, 0x8e, 0xb7,
-       0xe1, 0x3c, 0x42, 0x7f, 0xfc, 0x52, 0x60, 0x17, 0x9b, 0xd4, 0x7d, 0xe7,
-       0xfb, 0x38, 0xc3, 0x15, 0xd3, 0xcf, 0x17, 0xfd, 0x35, 0x9b, 0x24, 0xfc,
-       0xde, 0xe7, 0xeb, 0x0f, 0x69, 0xa1, 0xfe, 0x7c, 0xb2, 0xc5, 0xcf, 0xfb,
-       0xf9, 0x0d, 0x8c, 0xf5, 0x0b, 0x9f, 0xef, 0xdf, 0xe2, 0xe3, 0x6a, 0xd4,
-       0xdb, 0x8f, 0x3d, 0xd6, 0x6a, 0x85, 0x3e, 0xf8, 0x6c, 0xd7, 0x93, 0x63,
-       0xf6, 0xcd, 0xf6, 0x76, 0x8f, 0x13, 0xca, 0x87, 0xf2, 0x2b, 0xca, 0x11,
-       0x37, 0x0d, 0x5b, 0xa0, 0xec, 0xac, 0x06, 0xd9, 0x89, 0xfc, 0xb9, 0x23,
-       0xbc, 0xef, 0xc2, 0x3b, 0x25, 0xbb, 0x64, 0x21, 0xd6, 0xca, 0xfb, 0x5a,
-       0xe8, 0xe3, 0xdf, 0xca, 0xc4, 0xac, 0xc8, 0x32, 0xde, 0x2f, 0x39, 0xb4,
-       0xd1, 0x0c, 0xf2, 0xd7, 0x8d, 0x32, 0x3f, 0x87, 0x3a, 0xcb, 0x91, 0x52,
-       0xe1, 0x4e, 0xc6, 0x99, 0xb8, 0x5c, 0x51, 0xf7, 0x7b, 0x22, 0x3b, 0xcf,
-       0x1a, 0x62, 0x9c, 0x45, 0x41, 0x07, 0x99, 0x9f, 0xef, 0x0b, 0xef, 0xfb,
-       0x7c, 0x5b, 0xaf, 0xd6, 0xb0, 0xd6, 0xe9, 0x55, 0xfe, 0xb1, 0x5a, 0x1f,
-       0x97, 0xf2, 0x0c, 0xf7, 0x42, 0x3f, 0x97, 0xc2, 0x3b, 0x5b, 0x26, 0x4f,
-       0x66, 0xe4, 0xfb, 0xfc, 0x5e, 0x93, 0x1d, 0xc5, 0x1e, 0x05, 0xa9, 0x2c,
-       0x63, 0xbe, 0xfe, 0x4f, 0x32, 0xb7, 0x38, 0x2e, 0xf3, 0x33, 0x17, 0x1a,
-       0xee, 0x73, 0x31, 0x9e, 0x6b, 0xac, 0x4f, 0x8b, 0xac, 0xa9, 0x50, 0x7f,
-       0x5a, 0x18, 0xc3, 0x06, 0xea, 0x93, 0xa5, 0x9b, 0xef, 0x1f, 0x1b, 0xeb,
-       0xd2, 0x51, 0x39, 0x8a, 0x33, 0xae, 0x9e, 0xcc, 0xa8, 0xba, 0xa6, 0x25,
-       0x37, 0xfb, 0xf8, 0x87, 0x88, 0x11, 0x63, 0x42, 0x3d, 0xbb, 0x2e, 0x5f,
-       0xb3, 0x8f, 0xca, 0x23, 0x88, 0x1d, 0x47, 0x90, 0x5f, 0xff, 0x36, 0xea,
-       0xba, 0xd4, 0x66, 0x9e, 0x21, 0xe8, 0xb5, 0x58, 0x57, 0x7a, 0x32, 0x6a,
-       0xdf, 0x61, 0xfe, 0x00, 0x92, 0x7d, 0xbf, 0xce, 0xf8, 0xf8, 0xdf, 0x5e,
-       0x1e, 0xf1, 0xee, 0x43, 0x0b, 0x3e, 0x41, 0xc1, 0x69, 0x3e, 0xdc, 0x0c,
-       0xe1, 0xfa, 0xcd, 0x63, 0x84, 0x9b, 0xd3, 0x02, 0x38, 0x0d, 0x70, 0x31,
-       0xb9, 0x68, 0x1b, 0xd0, 0x8d, 0x51, 0xf0, 0x09, 0xdf, 0x3e, 0x18, 0x7e,
-       0x6f, 0xdc, 0x80, 0x98, 0xba, 0xb6, 0xfe, 0x8d, 0x60, 0xfd, 0xf7, 0x83,
-       0xf5, 0x97, 0x56, 0xd7, 0x87, 0x71, 0xf5, 0x13, 0x4f, 0x1a, 0xe8, 0x7a,
-       0xa3, 0xe6, 0xc3, 0x1f, 0x0d, 0xe8, 0xba, 0xb4, 0x4a, 0x57, 0x08, 0x0f,
-       0x79, 0x2a, 0x9e, 0xe9, 0x93, 0xe9, 0x9b, 0x7b, 0x21, 0x47, 0x7e, 0x47,
-       0x86, 0x4d, 0x38, 0xfc, 0x7e, 0x4b, 0x3b, 0xd1, 0x65, 0x25, 0x71, 0x54,
-       0xc6, 0xac, 0xf4, 0xf0, 0xa4, 0xc4, 0xa0, 0xc3, 0xf4, 0x29, 0x31, 0x99,
-       0xa7, 0xaf, 0x41, 0x5f, 0xb6, 0x6f, 0x4d, 0xeb, 0xfb, 0x0d, 0xb4, 0xc6,
-       0x9e, 0x27, 0x8d, 0x3e, 0xad, 0xf1, 0x1d, 0x6b, 0xb4, 0xfa, 0xf0, 0x3e,
-       0xad, 0xef, 0xd7, 0x1a, 0xe0, 0xcf, 0x1a, 0x01, 0xbc, 0xd1, 0x00, 0x4f,
-       0x7d, 0x66, 0x3e, 0x41, 0x7d, 0x26, 0x6d, 0x5f, 0x50, 0xf7, 0x66, 0x1b,
-       0x72, 0xb3, 0x07, 0x3f, 0xbf, 0xc3, 0x93, 0x38, 0xf2, 0x8c, 0x66, 0xbc,
-       0xbb, 0x32, 0xc3, 0x1c, 0x44, 0xef, 0x69, 0x96, 0x9d, 0xd0, 0x59, 0x9e,
-       0x5d, 0xe3, 0x9d, 0xab, 0x27, 0x8f, 0xd8, 0xa4, 0xe5, 0x3f, 0xbd, 0x33,
-       0x89, 0x9d, 0x76, 0x55, 0xfa, 0xcc, 0x66, 0xe1, 0x9d, 0xae, 0xc2, 0x99,
-       0x21, 0x2d, 0xa7, 0xfb, 0x7a, 0xcd, 0xb7, 0xc0, 0xe7, 0xe8, 0x8c, 0x26,
-       0xf3, 0x56, 0x3a, 0x79, 0x1e, 0x38, 0xf6, 0xe0, 0x6c, 0xe6, 0x07, 0x48,
-       0x8f, 0xc8, 0x04, 0xf4, 0x7b, 0x5e, 0xc5, 0x43, 0xea, 0x71, 0x7a, 0xac,
-       0x82, 0x1c, 0xe7, 0xa7, 0x2a, 0xa6, 0x79, 0xde, 0x87, 0x88, 0x6b, 0x63,
-       0xeb, 0x74, 0x4f, 0x3f, 0xeb, 0xeb, 0x9e, 0x7e, 0x16, 0xb5, 0xf1, 0xf1,
-       0xb8, 0xb4, 0x2c, 0xc1, 0x7e, 0x9e, 0xef, 0x52, 0xfa, 0xa7, 0x3f, 0xcf,
-       0x6f, 0x19, 0xf0, 0x73, 0xc7, 0x0d, 0xb1, 0x8e, 0xab, 0x38, 0x00, 0x79,
-       0x17, 0x64, 0xf2, 0x14, 0x7d, 0xa9, 0x25, 0x3b, 0x8e, 0xf3, 0x3c, 0x98,
-       0xcf, 0xcc, 0x0d, 0x8e, 0xc3, 0x46, 0xa6, 0xf8, 0x7d, 0x70, 0xe9, 0x23,
-       0x19, 0xb7, 0x28, 0x07, 0x94, 0xfa, 0x4b, 0xa6, 0xc4, 0x96, 0xe0, 0x13,
-       0x96, 0x92, 0xd2, 0x04, 0xdb, 0xd2, 0xcf, 0x26, 0xb4, 0xea, 0xec, 0x7f,
-       0xc1, 0x1e, 0xf8, 0x4d, 0x20, 0x83, 0x71, 0x52, 0xab, 0xd6, 0x06, 0xd0,
-       0x53, 0xcf, 0x91, 0x46, 0x9d, 0xa5, 0x9e, 0x93, 0x8e, 0xd0, 0x5e, 0xf0,
-       0x7c, 0x36, 0xa3, 0xee, 0x6c, 0x3f, 0xb4, 0xc9, 0xcb, 0xdf, 0x48, 0x61,
-       0x26, 0xfc, 0x1b, 0x10, 0xd9, 0x8c, 0x1c, 0xa6, 0xa3, 0x60, 0xef, 0x18,
-       0xbe, 0x22, 0x9f, 0x96, 0xaf, 0x6d, 0x9f, 0x82, 0x2f, 0xf2, 0xd1, 0xc8,
-       0x17, 0x79, 0x6a, 0x97, 0x26, 0xc5, 0x57, 0xc8, 0x0f, 0x04, 0x0d, 0x7e,
-       0x7a, 0x8e, 0x27, 0x81, 0xff, 0x61, 0xf8, 0x80, 0x6e, 0xf4, 0x0f, 0xa1,
-       0x47, 0x28, 0x3b, 0x4b, 0xde, 0xc9, 0xeb, 0x55, 0xe4, 0x8b, 0x21, 0x9f,
-       0x25, 0x3c, 0xbf, 0x2e, 0x93, 0xb3, 0xde, 0x61, 0xc4, 0x53, 0xde, 0x27,
-       0x77, 0xea, 0x4a, 0x77, 0xd7, 0xf3, 0xfe, 0xba, 0xf8, 0xf2, 0xe1, 0x5d,
-       0x3c, 0x9e, 0x17, 0xd7, 0xcb, 0xa2, 0xd1, 0x77, 0x24, 0x83, 0xbf, 0x7b,
-       0xa1, 0x9f, 0xa0, 0x8c, 0xae, 0x4a, 0x61, 0x96, 0x77, 0x5a, 0x3e, 0xbe,
-       0xd2, 0xea, 0xdf, 0xbe, 0x34, 0xae, 0x19, 0x00, 0x5c, 0x37, 0xe0, 0x48,
-       0xd7, 0x0a, 0xe5, 0x07, 0x9f, 0xb3, 0xbd, 0xc1, 0xd7, 0x34, 0xae, 0xcb,
-       0xca, 0x33, 0x88, 0xff, 0x6f, 0xd8, 0x37, 0xc9, 0xb5, 0xc4, 0x1c, 0x68,
-       0xbe, 0xbe, 0x0f, 0x36, 0xd9, 0x04, 0x5f, 0x66, 0xca, 0x95, 0x5a, 0xb3,
-       0xcc, 0x23, 0xcf, 0x59, 0x58, 0xa4, 0x2f, 0x24, 0xed, 0xad, 0x98, 0xf7,
-       0xfd, 0x17, 0x7d, 0xed, 0x95, 0x1a, 0xe2, 0x2b, 0x6c, 0xfb, 0x4a, 0x2d,
-       0x81, 0xbe, 0x1b, 0xbd, 0x85, 0x3e, 0x85, 0x3e, 0x83, 0x7e, 0x00, 0xfd,
-       0x00, 0x7a, 0x0b, 0x6b, 0x93, 0xe8, 0xc3, 0x5a, 0x82, 0xb8, 0xd6, 0xf8,
-       0xae, 0xaa, 0xfd, 0xf8, 0xdd, 0x90, 0xb1, 0xcc, 0xb0, 0x47, 0x50, 0x63,
-       0x17, 0x06, 0xc2, 0xbf, 0xb9, 0xb9, 0xe1, 0x99, 0x16, 0x6b, 0xf7, 0x8a,
-       0xb6, 0x47, 0x7d, 0x5f, 0x98, 0x41, 0x5c, 0x78, 0x6e, 0xab, 0xb4, 0x5a,
-       0xe6, 0x3d, 0xea, 0xee, 0x68, 0x16, 0x63, 0x3e, 0xa3, 0x3e, 0x4e, 0x4c,
-       0x21, 0x3e, 0xd1, 0x7f, 0xfe, 0x6f, 0xe7, 0xd6, 0x1b, 0xdb, 0xc6, 0x59,
-       0xc6, 0x1f, 0x9f, 0x9d, 0x34, 0xe9, 0x9a, 0xf6, 0x92, 0x38, 0xa9, 0x93,
-       0x85, 0xcd, 0x8e, 0x2f, 0xad, 0x45, 0xd2, 0x71, 0xed, 0x2c, 0x16, 0xa6,
-       0x8c, 0x78, 0x76, 0x92, 0x76, 0x30, 0xa6, 0xb4, 0x74, 0xd3, 0x84, 0x10,
-       0x58, 0xc9, 0xba, 0x75, 0x13, 0xd2, 0x28, 0x30, 0x34, 0x89, 0xa2, 0x18,
-       0x27, 0x61, 0x19, 0x18, 0xc7, 0x0b, 0x81, 0x4e, 0xf0, 0xc5, 0x38, 0xd1,
-       0x06, 0x22, 0x4a, 0x3a, 0x8d, 0x0f, 0x08, 0x6d, 0x74, 0xb8, 0x83, 0xef,
-       0xfc, 0x11, 0x62, 0x12, 0x1f, 0xaa, 0xa8, 0x63, 0x20, 0x21, 0xe0, 0x23,
-       0xd2, 0x98, 0x8e, 0xdf, 0xef, 0x79, 0xef, 0x12, 0xc7, 0x64, 0x54, 0xf0,
-       0xc1, 0x3a, 0xbf, 0x77, 0xf7, 0xbe, 0xf7, 0xde, 0xfb, 0x3c, 0xef, 0xef,
-       0xf9, 0x3d, 0x7f, 0xce, 0x43, 0x9f, 0x19, 0xe0, 0xf8, 0x11, 0x61, 0x0c,
-       0x36, 0x9b, 0xc6, 0xff, 0xea, 0xc5, 0x1e, 0x63, 0x4b, 0xc1, 0xdb, 0x77,
-       0xb8, 0x61, 0x60, 0xab, 0x46, 0xd0, 0x67, 0x3f, 0x9f, 0x00, 0x36, 0xb0,
-       0x92, 0xa8, 0x54, 0xb1, 0x07, 0x7f, 0xed, 0xce, 0x29, 0xa7, 0xa3, 0x2c,
-       0x16, 0xc1, 0x4d, 0x73, 0x65, 0x72, 0x97, 0xcb, 0xf0, 0x47, 0xe0, 0xcb,
-       0x45, 0xe9, 0xbb, 0xd3, 0x16, 0x90, 0x83, 0xfe, 0x12, 0x73, 0xa3, 0x1d,
-       0xf8, 0x26, 0x9e, 0x87, 0xf7, 0x5a, 0xf3, 0xb0, 0x66, 0xa7, 0xc1, 0x05,
-       0x3d, 0x2f, 0xe2, 0x4c, 0x4a, 0xfc, 0x1c, 0x31, 0x47, 0xd0, 0xdf, 0xc4,
-       0xb2, 0xc8, 0xab, 0x32, 0xd3, 0x9a, 0x83, 0x84, 0x72, 0xfd, 0x0e, 0x7d,
-       0x7b, 0xc4, 0xc4, 0xa7, 0x18, 0x7f, 0x16, 0x99, 0x2c, 0x1b, 0x2e, 0x0b,
-       0xbf, 0xac, 0x61, 0xbc, 0xbb, 0xfd, 0xf1, 0x78, 0xdd, 0xd2, 0x71, 0x6a,
-       0xd2, 0x6b, 0x62, 0xbb, 0x63, 0x23, 0xb0, 0x11, 0x51, 0xa9, 0x43, 0x2e,
-       0xd7, 0x21, 0x93, 0x37, 0x4b, 0xd4, 0xf5, 0x61, 0xe8, 0x7d, 0x0b, 0xf3,
-       0xb3, 0x18, 0x6b, 0x44, 0x9f, 0x5d, 0x2f, 0x01, 0x3b, 0x6d, 0xf5, 0x4f,
-       0x7b, 0xc9, 0x0b, 0x69, 0x07, 0xcd, 0x38, 0x03, 0xe6, 0x3e, 0x09, 0xae,
-       0x75, 0xeb, 0x7c, 0x6a, 0x1a, 0x03, 0xe3, 0x3a, 0x41, 0x07, 0x4b, 0xdd,
-       0xfe, 0x3d, 0x5e, 0x8f, 0xa9, 0x77, 0xe2, 0x39, 0xbe, 0xc7, 0x88, 0x64,
-       0xcb, 0x41, 0xbf, 0x4e, 0xf4, 0x6b, 0x6f, 0x18, 0xeb, 0x68, 0xd3, 0x3b,
-       0x58, 0xfe, 0x3b, 0xf0, 0x7a, 0x33, 0xdf, 0x4f, 0xd8, 0x05, 0x09, 0x38,
-       0x3f, 0xed, 0x2f, 0x65, 0x93, 0xd6, 0xfc, 0xb6, 0x91, 0xcf, 0x80, 0xef,
-       0x03, 0x24, 0x96, 0x0a, 0x02, 0xbe, 0x18, 0xa5, 0x8c, 0xd2, 0xd8, 0xd7,
-       0x3f, 0x89, 0xca, 0x61, 0x57, 0x2a, 0xa5, 0x03, 0x62, 0x75, 0xb5, 0x68,
-       0x8d, 0x4e, 0xdc, 0x6a, 0x7c, 0xe6, 0x67, 0xfd, 0x67, 0xc2, 0xf7, 0x5e,
-       0x69, 0xd7, 0xb8, 0x34, 0xec, 0x0c, 0xee, 0x39, 0xd4, 0x34, 0xb7, 0x87,
-       0xfd, 0xfb, 0x78, 0xdd, 0x91, 0x02, 0xf8, 0x67, 0xae, 0x0c, 0x26, 0x0f,
-       0xfc, 0xb6, 0xc6, 0x98, 0xe3, 0x61, 0x0c, 0x6f, 0x38, 0x3e, 0x8f, 0x39,
-       0x16, 0xec, 0x31, 0xc6, 0xcd, 0x30, 0x46, 0x5f, 0xd3, 0x18, 0x13, 0xfe,
-       0x18, 0x59, 0x29, 0x5e, 0x99, 0xc0, 0x5e, 0x1b, 0x83, 0x7d, 0x4f, 0xda,
-       0xa7, 0xe5, 0x23, 0x22, 0x9d, 0x38, 0xf7, 0x72, 0x0a, 0x72, 0xf2, 0xbc,
-       0x49, 0x77, 0x1a, 0xf3, 0x7e, 0x0d, 0xb6, 0x35, 0xe0, 0x3c, 0xc5, 0x58,
-       0x18, 0x36, 0xec, 0xf3, 0x2e, 0xe3, 0x62, 0x05, 0x30, 0xb2, 0x84, 0x6d,
-       0x85, 0x86, 0x53, 0x35, 0xf0, 0xba, 0x2a, 0x2c, 0x69, 0xd1, 0xe1, 0x7b,
-       0x76, 0x48, 0xd1, 0x0e, 0x8d, 0x87, 0xc1, 0x6b, 0xb2, 0x65, 0xee, 0x23,
-       0x19, 0x0a, 0x8f, 0xb5, 0x82, 0x8b, 0x7a, 0xf2, 0x36, 0xa0, 0xa6, 0x58,
-       0x5a, 0x92, 0xfa, 0x86, 0x8d, 0xe3, 0x05, 0xc8, 0xe1, 0x45, 0xfc, 0x7f,
-       0x3e, 0xaa, 0x75, 0x4a, 0xe0, 0xeb, 0x8b, 0x78, 0x1f, 0xf2, 0x19, 0xf2,
-       0x88, 0x1a, 0xec, 0xad, 0x05, 0x5b, 0x03, 0x5e, 0x35, 0x4a, 0xde, 0xf5,
-       0xdc, 0xda, 0x4d, 0x79, 0x73, 0x35, 0x81, 0x67, 0xd1, 0x2e, 0x9f, 0x21,
-       0x1e, 0xd8, 0x0b, 0x69, 0x9c, 0x5b, 0x37, 0xdc, 0xb7, 0xb8, 0x85, 0x0d,
-       0xd4, 0x05, 0x8e, 0x00, 0x8e, 0xbd, 0x0d, 0x0c, 0x2c, 0xe2, 0xfe, 0xfa,
-       0x6a, 0x44, 0xd6, 0x1c, 0xf2, 0x22, 0x89, 0x67, 0x71, 0x6f, 0x7d, 0x7d,
-       0xb1, 0xd7, 0xe4, 0x51, 0xd8, 0x7f, 0x42, 0x0a, 0xe0, 0x75, 0xa7, 0xb5,
-       0xef, 0xad, 0xe4, 0xcc, 0x39, 0x35, 0xfa, 0x77, 0xb3, 0x52, 0xe7, 0x7e,
-       0xd2, 0xdc, 0x03, 0xb9, 0xc1, 0x65, 0xe8, 0x2c, 0x39, 0x3b, 0xfd, 0x00,
-       0xfc, 0xdf, 0xe0, 0x75, 0xbe, 0x3b, 0x8e, 0xd5, 0x24, 0xd6, 0x86, 0xfb,
-       0xbe, 0x10, 0x9a, 0x3e, 0x0e, 0x3b, 0x6a, 0x71, 0xaf, 0x17, 0x15, 0x0b,
-       0x8a, 0xcb, 0xb3, 0xb0, 0x29, 0xac, 0xb5, 0xe8, 0x83, 0x2e, 0x3e, 0x08,
-       0x59, 0xa6, 0x71, 0x5f, 0x93, 0x2d, 0xd9, 0x2c, 0x2a, 0x2f, 0xb3, 0x5e,
-       0x32, 0xb8, 0x66, 0xd5, 0xc0, 0xd1, 0xb0, 0x7f, 0xac, 0x4d, 0xe8, 0x16,
-       0xf6, 0x90, 0xb5, 0x19, 0xc5, 0x11, 0x78, 0xbc, 0x09, 0xbf, 0x02, 0xf8,
-       0x66, 0x6d, 0xc2, 0x27, 0x00, 0xbe, 0x59, 0x9b, 0x29, 0x1c, 0x81, 0xf1,
-       0x9b, 0x01, 0xae, 0x71, 0xfc, 0x94, 0xe6, 0xe1, 0x0d, 0xbe, 0x90, 0x4b,
-       0x12, 0x5f, 0x02, 0x3e, 0x69, 0x74, 0xe1, 0xeb, 0xcb, 0xc4, 0x10, 0xea,
-       0x75, 0x12, 0xb8, 0x45, 0x5d, 0x30, 0x5c, 0x72, 0xbd, 0x62, 0xd6, 0x6c,
-       0x7e, 0xeb, 0x9a, 0xda, 0x88, 0x29, 0x71, 0xa0, 0x63, 0x5c, 0x3b, 0x5c,
-       0x53, 0x1b, 0xf0, 0xba, 0x64, 0xf4, 0xc8, 0x35, 0xfb, 0xb9, 0x64, 0xd6,
-       0x53, 0xf2, 0x0d, 0xc5, 0xad, 0x00, 0xb3, 0xc8, 0x21, 0x63, 0x58, 0x3f,
-       0x47, 0x9e, 0xff, 0xf6, 0x4d, 0xc9, 0x7e, 0x87, 0xb8, 0x35, 0x1c, 0x6b,
-       0x0f, 0x11, 0xab, 0x3c, 0xd9, 0x80, 0x6d, 0x3a, 0xed, 0x26, 0x1e, 0x65,
-       0xfd, 0x66, 0x1e, 0xba, 0xd2, 0x7a, 0x32, 0xe1, 0xc6, 0x43, 0xc9, 0x47,
-       0xdb, 0x43, 0xb4, 0x8d, 0xc3, 0xf6, 0x45, 0x39, 0xe5, 0xc7, 0xa3, 0x0e,
-       0xc8, 0x45, 0xe5, 0xfe, 0x2c, 0xcf, 0x78, 0x57, 0x73, 0x23, 0xef, 0xa4,
-       0xb9, 0xd6, 0x68, 0x6f, 0x6a, 0xdc, 0xa8, 0xed, 0x9d, 0x74, 0x8b, 0x14,
-       0x7b, 0x3c, 0xef, 0xc2, 0xc9, 0xb7, 0xa2, 0x26, 0xce, 0xd5, 0x7f, 0xd4,
-       0x60, 0x01, 0x00, 0x4c, 0xdb, 0x9f, 0xc0, 0x91, 0xba, 0x4d, 0x7b, 0x4b,
-       0xfb, 0x48, 0xb9, 0xe1, 0xb8, 0xce, 0xff, 0xb4, 0xbd, 0x4b, 0xb0, 0xbd,
-       0xb4, 0x97, 0x47, 0x24, 0xc7, 0x9c, 0x9c, 0xa5, 0xe7, 0x0b, 0x86, 0x4b,
-       0xfb, 0xf7, 0x55, 0xf2, 0x32, 0x5f, 0x21, 0x87, 0xaa, 0xc3, 0x96, 0xb1,
-       0xf6, 0x91, 0x36, 0x6d, 0x0e, 0xf6, 0x9c, 0xb9, 0x5a, 0x5c, 0xab, 0xb2,
-       0x5f, 0x22, 0x15, 0xb7, 0xf0, 0xce, 0x3b, 0x3a, 0x55, 0x82, 0xfe, 0x51,
-       0x9f, 0x20, 0xf7, 0x17, 0xe8, 0x5b, 0x0c, 0xa9, 0x8e, 0x64, 0x7f, 0xc0,
-       0xb5, 0xf7, 0xbc, 0x33, 0x2e, 0xd4, 0xb0, 0xd3, 0xec, 0x01, 0xf2, 0x80,
-       0x8f, 0x63, 0x5d, 0xa6, 0xdc, 0x9b, 0xb4, 0xdd, 0x7f, 0xb7, 0x9c, 0xe1,
-       0xd4, 0xc5, 0x10, 0xf7, 0x36, 0xda, 0xeb, 0x61, 0xa9, 0x46, 0xf9, 0xfe,
-       0x58, 0xaf, 0x10, 0xf7, 0xce, 0x7e, 0xeb, 0xd0, 0xbc, 0x06, 0x59, 0xac,
-       0x01, 0xd7, 0x32, 0x58, 0x03, 0xfe, 0x9f, 0x80, 0xbc, 0xe8, 0x33, 0x10,
-       0x87, 0xf1, 0x7f, 0xcb, 0x3c, 0x9b, 0x75, 0x99, 0xbb, 0x73, 0xe6, 0x7c,
-       0x29, 0xd3, 0xd7, 0x25, 0xa7, 0xf2, 0x5d, 0x92, 0x5c, 0xe5, 0x75, 0x99,
-       0xac, 0x2c, 0xc9, 0x03, 0xce, 0x38, 0xde, 0xf7, 0x86, 0x37, 0xeb, 0xa8,
-       0xaf, 0x32, 0x3a, 0x83, 0x67, 0xcf, 0x8e, 0xf4, 0xc9, 0x9f, 0x5d, 0x47,
-       0x16, 0xd7, 0x6c, 0xc9, 0xdb, 0x69, 0x79, 0x5e, 0x63, 0xf9, 0xf4, 0x4f,
-       0x42, 0xe0, 0xa4, 0xcc, 0xc9, 0xb7, 0x89, 0xf4, 0x38, 0xb1, 0x6d, 0x21,
-       0xa7, 0x6c, 0x81, 0xac, 0xe3, 0x86, 0x37, 0xdb, 0xe6, 0xfa, 0xb1, 0x17,
-       0xc0, 0xdd, 0xdd, 0xb7, 0x7a, 0x83, 0xf8, 0xb0, 0xe1, 0xb7, 0x7f, 0xf0,
-       0xf3, 0x62, 0x69, 0xa9, 0x30, 0x07, 0xa7, 0x38, 0xeb, 0x40, 0x97, 0x98,
-       0xc3, 0x8f, 0x69, 0xdc, 0xa1, 0xa5, 0x4c, 0x8c, 0xba, 0x0a, 0x8c, 0x1a,
-       0x25, 0x76, 0x8d, 0xaf, 0xb9, 0x8c, 0x0b, 0x44, 0xe5, 0xb7, 0x25, 0xe2,
-       0x70, 0x5c, 0x7e, 0x53, 0x7a, 0x16, 0xf3, 0x49, 0x54, 0x19, 0xcf, 0xbc,
-       0x5e, 0x29, 0x90, 0x27, 0x29, 0x9f, 0xcf, 0xba, 0x5f, 0x54, 0x3b, 0x10,
-       0xb7, 0x8a, 0xdd, 0x2d, 0x8a, 0x37, 0x4f, 0x6b, 0x1e, 0x36, 0x6e, 0x0d,
-       0xc8, 0xf5, 0x55, 0xbe, 0x6f, 0x0a, 0x63, 0x47, 0x43, 0xb9, 0x75, 0xda,
-       0xa5, 0x64, 0x6c, 0xc6, 0x3a, 0x20, 0x17, 0xa2, 0x8c, 0x53, 0x8f, 0x11,
-       0x9f, 0x61, 0x0b, 0x87, 0xed, 0x19, 0xd6, 0x38, 0xa9, 0xfd, 0x89, 0x35,
-       0xe1, 0xec, 0xd3, 0x3e, 0xce, 0xf2, 0xda, 0x18, 0x64, 0x4a, 0x5b, 0x94,
-       0xa8, 0x4c, 0x58, 0x49, 0xd8, 0x3c, 0xfc, 0xdf, 0xe0, 0xf8, 0x71, 0xf9,
-       0xc2, 0xc6, 0x45, 0xf0, 0xef, 0x61, 0xfb, 0x1c, 0xed, 0xaa, 0x3d, 0x8a,
-       0x7b, 0xf9, 0xfc, 0x0f, 0x34, 0x8d, 0xf5, 0x69, 0x7f, 0x2c, 0x5e, 0xc7,
-       0x3e, 0x2f, 0x3b, 0x32, 0x5b, 0x62, 0x2e, 0xda, 0xcc, 0x75, 0xef, 0xbd,
-       0x67, 0x77, 0x9e, 0xbb, 0xb0, 0x4c, 0x7e, 0x63, 0xea, 0xdc, 0x8a, 0xe0,
-       0x42, 0x9f, 0xec, 0xe2, 0x33, 0xf9, 0xbc, 0xc3, 0x92, 0x7d, 0x04, 0xf8,
-       0x52, 0xe6, 0xaf, 0xe0, 0xd7, 0xde, 0xc2, 0x5f, 0x89, 0xf6, 0xef, 0x63,
-       0x9b, 0xee, 0xf3, 0xc7, 0xfb, 0x3d, 0x74, 0x28, 0xda, 0x70, 0x3f, 0x63,
-       0x2a, 0x6c, 0xc7, 0xa5, 0xb0, 0xc1, 0xa3, 0xe7, 0x75, 0x39, 0xad, 0x72,
-       0xce, 0xbe, 0xbd, 0x69, 0x8c, 0x13, 0x38, 0x67, 0x38, 0x41, 0xb8, 0x1c,
-       0xf2, 0xb9, 0xc5, 0x9d, 0xe4, 0x4d, 0xfe, 0xff, 0x36, 0x8d, 0xc5, 0xc4,
-       0xad, 0xfe, 0xa6, 0xf7, 0xb8, 0x73, 0xc7, 0x0e, 0xc7, 0x2d, 0x62, 0xe7,
-       0x8f, 0x71, 0x8d, 0x3a, 0xe4, 0x29, 0x8f, 0x8f, 0x80, 0xe7, 0xe7, 0x80,
-       0x05, 0x51, 0xe7, 0xb6, 0x18, 0x8b, 0x4d, 0xae, 0x2d, 0x9b, 0x7a, 0x54,
-       0x72, 0xe0, 0x6b, 0xfb, 0xe6, 0x6a, 0x53, 0xd0, 0x65, 0x8c, 0x7f, 0x90,
-       0xe3, 0x8f, 0xf8, 0xeb, 0x9c, 0x70, 0x0b, 0xd6, 0x87, 0x65, 0x66, 0xd5,
-       0xe8, 0x5f, 0xd6, 0x81, 0xee, 0x1d, 0x46, 0x7b, 0x9d, 0x36, 0xe1, 0xfd,
-       0xc6, 0x09, 0x6c, 0x43, 0x4a, 0x6d, 0xc3, 0xfc, 0x32, 0xf5, 0x93, 0x7a,
-       0x19, 0xe8, 0x63, 0x80, 0x79, 0xd4, 0x51, 0xe2, 0x6c, 0x5a, 0x5e, 0x58,
-       0xe6, 0xda, 0x64, 0x34, 0xa7, 0x35, 0xb4, 0x32, 0xab, 0xf5, 0x3d, 0x83,
-       0xe5, 0xc4, 0x8b, 0x05, 0x19, 0x97, 0xab, 0x2e, 0xd7, 0x2c, 0x51, 0xcd,
-       0x87, 0x3b, 0x1a, 0xde, 0xff, 0x9c, 0xbf, 0x66, 0x29, 0xd5, 0xab, 0xc1,
-       0xf2, 0xe5, 0x1d, 0x79, 0xe7, 0xad, 0xc3, 0x4d, 0xeb, 0x14, 0x70, 0xb8,
-       0xb8, 0x90, 0x3f, 0x44, 0xba, 0xd8, 0x87, 0xcf, 0x25, 0xe7, 0xe3, 0xb3,
-       0x68, 0x5b, 0xef, 0x60, 0x3d, 0x83, 0xd0, 0x8f, 0x8b, 0x3c, 0x62, 0xb8,
-       0x45, 0xde, 0x7a, 0x18, 0xeb, 0x76, 0x50, 0xeb, 0x28, 0xe7, 0xbf, 0xfb,
-       0x1e, 0xfa, 0xe7, 0x7d, 0x7e, 0x9e, 0xc6, 0x78, 0x7c, 0x77, 0xee, 0xa9,
-       0xd2, 0x49, 0xea, 0xe6, 0xa4, 0xe6, 0x03, 0xd9, 0x87, 0xfb, 0x96, 0x6b,
-       0x44, 0x39, 0x5c, 0x8e, 0x19, 0x7b, 0x7a, 0xa2, 0x69, 0x3e, 0x49, 0x7f,
-       0x3e, 0xc1, 0xf5, 0x16, 0x89, 0xf4, 0xa6, 0xb4, 0x96, 0x24, 0x59, 0xa6,
-       0x8f, 0x02, 0x5b, 0x35, 0xcd, 0xb1, 0x6e, 0x8d, 0xbd, 0xf9, 0xff, 0x13,
-       0x7b, 0xf3, 0x56, 0x49, 0xe7, 0xd8, 0xe2, 0xfc, 0x2f, 0x72, 0x6c, 0xac,
-       0xa7, 0x37, 0x72, 0x7b, 0x6e, 0x99, 0xf6, 0x29, 0xa3, 0xb1, 0xe3, 0x3f,
-       0x95, 0xb8, 0x96, 0x9c, 0xe3, 0x55, 0xce, 0x71, 0xbc, 0xae, 0xb5, 0x74,
-       0x0f, 0xe9, 0x9e, 0x5d, 0x5c, 0x26, 0xa6, 0x74, 0xc8, 0x5a, 0x25, 0xc0,
-       0x95, 0x07, 0x7c, 0x4e, 0x5b, 0xec, 0x6e, 0xc5, 0x3e, 0x39, 0xe3, 0x5a,
-       0x5a, 0x47, 0x68, 0x3d, 0xcc, 0x73, 0x03, 0x52, 0x5b, 0xa5, 0x9d, 0x4d,
-       0xc2, 0xaf, 0x88, 0x86, 0x6a, 0xeb, 0xcc, 0x45, 0xb2, 0x4e, 0x64, 0x5c,
-       0x98, 0xbb, 0xcf, 0xd9, 0xf3, 0xd8, 0x5f, 0x31, 0xf8, 0xfd, 0xe4, 0xf0,
-       0x8c, 0x8f, 0x35, 0xcb, 0x7b, 0x74, 0x87, 0x03, 0xee, 0x95, 0xf3, 0x2f,
-       0xb0, 0xde, 0xd4, 0x6b, 0xc7, 0xbe, 0x0e, 0x3b, 0x99, 0x8b, 0xf2, 0xff,
-       0x0c, 0xb8, 0x3f, 0x7d, 0x8d, 0xb8, 0xfa, 0x1a, 0xb5, 0x6a, 0x46, 0x96,
-       0x54, 0xf7, 0x3b, 0xfc, 0x58, 0x52, 0x87, 0xea, 0x07, 0x75, 0x2c, 0xaf,
-       0x9c, 0x7b, 0x54, 0x71, 0xaa, 0x58, 0x1a, 0x36, 0x75, 0x26, 0x76, 0xcc,
-       0xaf, 0x27, 0x6f, 0x7c, 0x7e, 0xcc, 0x7f, 0xfe, 0x5f, 0x7c, 0xf9, 0xda,
-       0x8a, 0x31, 0xba, 0xd6, 0x56, 0x52, 0x7d, 0xcb, 0xf9, 0x65, 0xea, 0x07,
-       0xf5, 0x84, 0x38, 0x17, 0xdc, 0x17, 0xc8, 0x24, 0x68, 0xf3, 0x7e, 0xea,
-       0x7c, 0x63, 0x4d, 0x41, 0xb0, 0x3f, 0x83, 0x73, 0x81, 0x8c, 0x78, 0xad,
-       0xd1, 0x0e, 0x70, 0xaf, 0xc5, 0x21, 0xa7, 0xdd, 0xfd, 0xd6, 0x55, 0xde,
-       0x95, 0x4d, 0xf6, 0x14, 0xe7, 0x7f, 0x99, 0x71, 0x5c, 0xec, 0xb1, 0xfd,
-       0xe4, 0xf3, 0x65, 0x95, 0x4f, 0x1e, 0xf2, 0xe9, 0x52, 0xdc, 0xa7, 0x8f,
-       0x77, 0xc9, 0xd7, 0xb9, 0x0e, 0xac, 0x19, 0xe3, 0xb2, 0xc0, 0xb7, 0xf3,
-       0xc4, 0xf9, 0xbe, 0x3e, 0xe2, 0x0b, 0x63, 0x8a, 0x99, 0xe9, 0x43, 0xc0,
-       0x30, 0xb6, 0x8f, 0x2b, 0x07, 0x31, 0x3e, 0x56, 0x5c, 0x63, 0x8b, 0x61,
-       0x60, 0x72, 0xad, 0x04, 0x7e, 0xc6, 0xba, 0xaf, 0x3d, 0xf2, 0x7a, 0xca,
-       0x5f, 0xaf, 0x89, 0x3e, 0xca, 0x87, 0xfb, 0x80, 0x58, 0xd9, 0x89, 0xf1,
-       0xce, 0x46, 0x53, 0xd0, 0xb1, 0x71, 0x9c, 0x1f, 0x52, 0x1f, 0x22, 0x8c,
-       0x7d, 0xbe, 0x5d, 0xea, 0xf5, 0xfd, 0x36, 0x07, 0x6d, 0xf8, 0xaa, 0xa5,
-       0x2e, 0xfa, 0x11, 0x1a, 0x47, 0x6c, 0x2d, 0xc3, 0x67, 0x05, 0x76, 0xd7,
-       0xd5, 0x06, 0x8d, 0xe0, 0xfa, 0x6d, 0xac, 0x89, 0xd3, 0xda, 0xe0, 0x6d,
-       0x95, 0x19, 0x7d, 0xcd, 0x63, 0xba, 0xa6, 0xb5, 0x52, 0x22, 0xf6, 0xb8,
-       0xf8, 0xe7, 0xa6, 0xf9, 0xdc, 0xc1, 0x86, 0x79, 0x4d, 0xca, 0xd9, 0x1d,
-       0x1b, 0x41, 0xdf, 0x19, 0xbc, 0xbd, 0x62, 0x6c, 0x40, 0xb1, 0x9a, 0xd2,
-       0xfa, 0xa5, 0xf0, 0xd8, 0x06, 0xd6, 0x92, 0x3c, 0xf4, 0x06, 0xb8, 0xf7,
-       0x08, 0xd6, 0x90, 0x5c, 0xdb, 0x9b, 0x5b, 0x70, 0x33, 0xcc, 0x85, 0xc1,
-       0x86, 0xcd, 0x49, 0x0e, 0xbe, 0x40, 0x2e, 0x7c, 0x98, 0x31, 0x64, 0xf0,
-       0xc1, 0x82, 0x1f, 0x6f, 0x1c, 0x61, 0x9c, 0x54, 0x56, 0xd6, 0x39, 0x77,
-       0xee, 0x6f, 0xe3, 0x6f, 0xd7, 0x4a, 0x9c, 0xaf, 0x89, 0x3d, 0xb0, 0x6d,
-       0x95, 0x5d, 0x1c, 0xb9, 0x16, 0x69, 0x1c, 0xef, 0xc5, 0x9e, 0xe0, 0xbd,
-       0x38, 0xae, 0xdf, 0x90, 0x5f, 0xad, 0x06, 0xf6, 0x3c, 0x24, 0x6f, 0x3a,
-       0xde, 0xdc, 0xbc, 0xdb, 0xcd, 0x35, 0x70, 0x0b, 0xcc, 0x65, 0x3b, 0x8e,
-       0x5b, 0x14, 0xcf, 0xab, 0xbb, 0xf5, 0x6e, 0x4b, 0x65, 0x49, 0x0c, 0xf8,
-       0x1a, 0xd6, 0xf0, 0x8d, 0xbb, 0x2d, 0x31, 0xf2, 0xa3, 0x6c, 0xae, 0xfd,
-       0x57, 0xfc, 0x0f, 0x30, 0x90, 0xfa, 0x48, 0xbd, 0xbc, 0x21, 0x53, 0x8a,
-       0xf9, 0xfb, 0xf5, 0x6b, 0xc4, 0x89, 0x80, 0xd3, 0x12, 0xd3, 0xa9, 0x8b,
-       0x31, 0xf5, 0x09, 0x8e, 0x95, 0x9b, 0x71, 0xe1, 0x33, 0x7e, 0x0e, 0x61,
-       0x3f, 0xdd, 0x7b, 0xd4, 0xc7, 0x86, 0x31, 0xe5, 0xcb, 0x19, 0x9b, 0x18,
-       0xc1, 0xf9, 0x1c, 0x94, 0xd9, 0x2b, 0x8d, 0x38, 0x4c, 0x5f, 0xcf, 0xe0,
-       0x87, 0x7e, 0xe3, 0xa1, 0xfc, 0xd7, 0x92, 0xc1, 0x15, 0xf2, 0x25, 0x07,
-       0x58, 0xda, 0x23, 0xf9, 0xe9, 0xb0, 0x24, 0x57, 0x7e, 0xd6, 0x67, 0xf8,
-       0x2d, 0xf5, 0x0f, 0xfb, 0x4d, 0xcf, 0xb1, 0x5d, 0xc7, 0xf9, 0x23, 0xc2,
-       0x67, 0x1b, 0x7d, 0xc6, 0x7e, 0x3e, 0x1f, 0x5c, 0xb3, 0x9b, 0x74, 0xf4,
-       0x5e, 0x5f, 0x47, 0x79, 0xdd, 0x32, 0xb9, 0x0e, 0xdc, 0x3b, 0xb8, 0xc2,
-       0x39, 0x9a, 0x7e, 0x83, 0x2b, 0xc6, 0x47, 0xdf, 0xdb, 0x6f, 0x64, 0xa7,
-       0x1f, 0xae, 0x83, 0xef, 0x9a, 0xb1, 0xa7, 0x46, 0xc1, 0xe3, 0x46, 0x58,
-       0x83, 0x44, 0x9b, 0x3d, 0xe4, 0x4e, 0x09, 0xf5, 0x3d, 0xe1, 0xeb, 0x1c,
-       0xf1, 0xa6, 0xcb, 0xc7, 0x9b, 0x5d, 0x1b, 0x93, 0x33, 0x35, 0x27, 0x8c,
-       0x83, 0x34, 0xd8, 0x18, 0xe9, 0xff, 0x4f, 0x1b, 0x73, 0xc4, 0x1f, 0x27,
-       0xb8, 0x16, 0xe0, 0x4a, 0xd0, 0x0e, 0x70, 0xa5, 0x99, 0xc7, 0x06, 0xb2,
-       0x6f, 0x3c, 0xdf, 0xe8, 0xe7, 0x65, 0x7c, 0x7f, 0xde, 0xd2, 0xfd, 0xf3,
-       0xca, 0x8e, 0x1f, 0x4f, 0x19, 0x27, 0xa0, 0x7a, 0x25, 0xec, 0xed, 0xf7,
-       0xd4, 0x6f, 0x5e, 0xbc, 0x32, 0xa1, 0xb1, 0x9c, 0x9a, 0xca, 0xfa, 0xab,
-       0x58, 0x9f, 0x33, 0xd8, 0x47, 0x0f, 0x46, 0x77, 0xeb, 0x86, 0x56, 0x9f,
-       0xc9, 0xfa, 0xbc, 0x25, 0x23, 0x5d, 0x98, 0x5f, 0x5a, 0xeb, 0xb0, 0xda,
-       0x9d, 0xaf, 0xc8, 0x03, 0x66, 0xee, 0x6d, 0x6d, 0x63, 0xeb, 0xcf, 0xb4,
-       0x7d, 0x2b, 0xd0, 0x73, 0xea, 0xcf, 0xea, 0x33, 0xb3, 0x15, 0x6f, 0x3c,
-       0x72, 0x72, 0xd8, 0x2e, 0x0a, 0x6b, 0xbd, 0xc7, 0xe5, 0x09, 0x97, 0xd7,
-       0x7f, 0x88, 0xeb, 0xd3, 0xf4, 0x21, 0x13, 0x11, 0xfd, 0xfe, 0x20, 0x11,
-       0x7b, 0x0c, 0x7b, 0x6f, 0x46, 0xbf, 0xf7, 0x38, 0xa4, 0x35, 0xe2, 0x35,
-       0x21, 0x97, 0x62, 0x8d, 0xc1, 0xb3, 0xf2, 0xb8, 0x3b, 0xe4, 0xd6, 0xc5,
-       0x70, 0xdc, 0x19, 0xcd, 0xf7, 0x1c, 0x90, 0xc7, 0xdc, 0x48, 0x5b, 0x76,
-       0xcb, 0xe8, 0xfc, 0x44, 0x38, 0xd3, 0xbe, 0xe0, 0x44, 0xdb, 0xa6, 0xb6,
-       0xb0, 0xa7, 0xb7, 0x80, 0xf7, 0x5b, 0xb1, 0x50, 0x6e, 0x83, 0xef, 0x1e,
-       0x36, 0x35, 0x1d, 0xea, 0x5f, 0x11, 0x43, 0xee, 0x93, 0x6d, 0xfb, 0xb8,
-       0x6c, 0xa7, 0xf8, 0x4d, 0xd6, 0x29, 0xb4, 0x07, 0x35, 0xe7, 0xb2, 0x0d,
-       0xbc, 0xd9, 0x4e, 0xb5, 0xa9, 0x0e, 0xaa, 0x1f, 0x06, 0x9c, 0xda, 0xb6,
-       0x89, 0x4f, 0x77, 0xf0, 0x88, 0x77, 0x9e, 0x83, 0x1c, 0x58, 0xef, 0x71,
-       0x02, 0x6d, 0xe2, 0x9a, 0xdd, 0x74, 0xbe, 0x1f, 0xed, 0xbb, 0x31, 0x46,
-       0xab, 0xbe, 0xa3, 0xe5, 0x9c, 0x34, 0x79, 0xcc, 0x3d, 0xf7, 0x74, 0x36,
-       0xb5, 0x3f, 0x77, 0xd4, 0x7c, 0x6f, 0xf4, 0x3d, 0xca, 0xb8, 0x90, 0x91,
-       0xbf, 0xc5, 0xf6, 0xb6, 0x97, 0xfb, 0xf6, 0xb6, 0x0f, 0x4b, 0x7b, 0x0f,
-       0x45, 0xd1, 0xdd, 0x74, 0x5f, 0xa0, 0x43, 0x41, 0xfb, 0x28, 0x71, 0x85,
-       0x76, 0x4b, 0x7d, 0xa6, 0xed, 0x28, 0x9f, 0xb5, 0xd8, 0xd4, 0x87, 0xff,
-       0xd9, 0x87, 0x7d, 0x19, 0xbf, 0xfb, 0xbe, 0xd1, 0x33, 0x8b, 0xbe, 0x3f,
-       0xe3, 0x17, 0xd4, 0xd3, 0xfd, 0xfc, 0xa9, 0x84, 0x7e, 0x1f, 0xb4, 0xbf,
-       0xae, 0x05, 0x38, 0x12, 0xf3, 0x63, 0x0a, 0x26, 0xef, 0x64, 0xe2, 0xbe,
-       0x94, 0x9d, 0xe6, 0x9d, 0x62, 0xd7, 0x21, 0xe7, 0x0b, 0x90, 0xf3, 0x64,
-       0x98, 0xbe, 0x1f, 0xf3, 0x4b, 0x8e, 0xe4, 0xb6, 0x28, 0x6f, 0xda, 0x75,
-       0xea, 0x26, 0x78, 0xc4, 0x16, 0x31, 0xc5, 0x02, 0x07, 0xca, 0x60, 0x8e,
-       0xaf, 0xe1, 0xbc, 0xe5, 0xd7, 0x6f, 0xa4, 0x61, 0xd3, 0x5c, 0xfc, 0x28,
-       0x77, 0xf8, 0xf4, 0x6b, 0x94, 0x31, 0xeb, 0xd9, 0x18, 0x0b, 0xe0, 0xfc,
-       0x98, 0x63, 0x77, 0xa1, 0xd3, 0x13, 0xd0, 0xdd, 0x88, 0x38, 0xe5, 0x13,
-       0x52, 0x98, 0x9e, 0x50, 0xfb, 0x3f, 0x08, 0xfb, 0x34, 0xef, 0x66, 0x65,
-       0xe1, 0xe5, 0x3b, 0xb1, 0x4f, 0xe9, 0xe7, 0x6b, 0x0c, 0xc3, 0x6b, 0x51,
-       0x9d, 0x26, 0xe7, 0x60, 0xdc, 0xcd, 0xe4, 0x92, 0xfd, 0xef, 0xaa, 0xfa,
-       0xe5, 0x70, 0x56, 0x2a, 0x57, 0x6c, 0xad, 0x85, 0xc9, 0xc8, 0x7b, 0x1e,
-       0x65, 0x38, 0x73, 0x3e, 0x0e, 0x9c, 0x22, 0x77, 0xff, 0x60, 0xd4, 0xac,
-       0xe9, 0x5f, 0xfb, 0xe9, 0x03, 0x27, 0xcb, 0x8d, 0x63, 0x68, 0xfd, 0x0c,
-       0xae, 0x3d, 0x74, 0xd4, 0xec, 0x1f, 0xfa, 0xc3, 0x37, 0xbd, 0x4c, 0x94,
-       0xcf, 0xe4, 0xbd, 0xcc, 0xd1, 0x52, 0x57, 0x38, 0xb7, 0x77, 0x7d, 0xbd,
-       0xfe, 0x28, 0xc6, 0x8b, 0xcb, 0xe0, 0xe6, 0x84, 0xfa, 0xf1, 0xf3, 0x7b,
-       0x7c, 0x56, 0x13, 0x1f, 0x30, 0x7e, 0xeb, 0x1b, 0xf2, 0xd8, 0x06, 0xe5,
-       0x44, 0xfb, 0x1e, 0x92, 0x1f, 0x39, 0xc3, 0xf6, 0x93, 0x5a, 0x77, 0x9c,
-       0xc8, 0x30, 0x1f, 0x73, 0xd0, 0x49, 0xda, 0x6b, 0x12, 0x19, 0xfd, 0x98,
-       0xf0, 0x9b, 0x16, 0xd6, 0x7a, 0x0c, 0xbb, 0x4f, 0x4a, 0x50, 0xef, 0x31,
-       0x94, 0x39, 0x10, 0xfa, 0xa7, 0xf7, 0xc6, 0x79, 0xde, 0x63, 0xea, 0x3d,
-       0x24, 0x44, 0xb9, 0xfd, 0xf1, 0x0e, 0x7e, 0xe3, 0xb9, 0x37, 0xde, 0x77,
-       0xff, 0xd3, 0xe7, 0xd2, 0x89, 0x25, 0xfa, 0xac, 0x2d, 0xce, 0xbf, 0xfa,
-       0xcd, 0xbb, 0x16, 0x0a, 0x9d, 0xa2, 0xf9, 0xb2, 0x4b, 0xef, 0x38, 0xac,
-       0x7b, 0x48, 0xc4, 0x0e, 0x58, 0x8c, 0x7b, 0x13, 0xdf, 0x98, 0x43, 0x61,
-       0x8c, 0x0d, 0x6d, 0x70, 0x86, 0x97, 0x46, 0x2c, 0xb9, 0x3f, 0x92, 0x89,
-       0x5b, 0x72, 0x2c, 0xbe, 0x22, 0x78, 0x26, 0xf3, 0x29, 0x1b, 0x89, 0x02,
-       0xef, 0x8f, 0x94, 0x39, 0x5e, 0x5c, 0xfd, 0x93, 0xe4, 0x31, 0xcf, 0xbb,
-       0xe4, 0x4a, 0x28, 0x79, 0xd7, 0xdb, 0x1e, 0x73, 0xde, 0xd6, 0xe6, 0xfb,
-       0xd5, 0x23, 0x10, 0x37, 0x16, 0x9e, 0x32, 0xb5, 0x87, 0x4b, 0x97, 0x06,
-       0x37, 0xf4, 0x9b, 0xb9, 0x69, 0xd3, 0x2e, 0xa1, 0xdd, 0xea, 0xd7, 0x41,
-       0x55, 0x2e, 0x0d, 0x56, 0x8f, 0xdc, 0x6e, 0xfc, 0x6d, 0xf2, 0xab, 0xc0,
-       0x87, 0x89, 0xef, 0xa9, 0x0b, 0x3b, 0xbb, 0x7c, 0x26, 0x74, 0x66, 0xd9,
-       0x5a, 0x6d, 0x63, 0x0e, 0xec, 0x94, 0x27, 0xdd, 0x27, 0x83, 0x38, 0x15,
-       0xe3, 0x5a, 0x22, 0x9d, 0x9b, 0x13, 0x26, 0xe7, 0xb1, 0x69, 0x29, 0x17,
-       0xea, 0x7a, 0x89, 0xb1, 0xaa, 0xa8, 0x62, 0x43, 0xf7, 0x26, 0xeb, 0xc1,
-       0x7a, 0x64, 0x46, 0x31, 0xa3, 0x47, 0xf1, 0xc0, 0xe8, 0x5d, 0x97, 0xc6,
-       0x61, 0xc9, 0x97, 0xae, 0x2d, 0xbb, 0x03, 0xac, 0xe1, 0x79, 0x75, 0xf9,
-       0x09, 0xb4, 0x89, 0x33, 0xf7, 0x34, 0x9d, 0x6f, 0xcc, 0xc9, 0x26, 0xec,
-       0x41, 0xab, 0x39, 0x1f, 0xcb, 0x73, 0xcd, 0x79, 0xd8, 0x57, 0x25, 0xdf,
-       0xcb, 0xdc, 0x6b, 0x10, 0x6f, 0x77, 0xfd, 0x78, 0xfb, 0x87, 0x06, 0xa8,
-       0x83, 0xf0, 0x6f, 0xf2, 0x91, 0xb1, 0xb6, 0x91, 0xf9, 0x52, 0xf8, 0x1f,
-       0xbb, 0xb1, 0x53, 0xb4, 0x37, 0x76, 0xf2, 0xe3, 0xb8, 0xf6, 0x25, 0x70,
-       0x92, 0x22, 0xf8, 0x45, 0xc1, 0xaf, 0xc3, 0xe7, 0xf5, 0x9d, 0xfe, 0xb7,
-       0x98, 0xd3, 0x41, 0xcd, 0xad, 0x0f, 0xee, 0xc9, 0xad, 0xdf, 0x35, 0xc0,
-       0xda, 0xe3, 0xe2, 0xd6, 0x6e, 0xdf, 0x88, 0xdf, 0x77, 0xe2, 0x96, 0xef,
-       0x63, 0xf6, 0x4c, 0x51, 0xf7, 0xcc, 0x65, 0x8d, 0x11, 0xcf, 0x6f, 0x2d,
-       0xc9, 0x8c, 0xd3, 0x25, 0xb9, 0xd5, 0xc0, 0x4e, 0x78, 0xe3, 0xb3, 0x6e,
-       0xa1, 0x2f, 0x2c, 0xec, 0xcf, 0xe7, 0x29, 0x47, 0x8b, 0xe5, 0xc2, 0x1c,
-       0xff, 0x90, 0x44, 0xc6, 0x68, 0x3b, 0x68, 0x13, 0x3e, 0x05, 0x2c, 0x03,
-       0x4f, 0xdf, 0x6a, 0xcc, 0x7d, 0xbf, 0x9f, 0x1c, 0x29, 0xc3, 0xe0, 0x9d,
-       0x0b, 0x5e, 0x2b, 0xf6, 0xdf, 0x31, 0xd6, 0xb4, 0xec, 0xcc, 0x95, 0x36,
-       0x4b, 0x6d, 0x93, 0xbe, 0xc7, 0x94, 0xff, 0x1e, 0x61, 0xcc, 0x67, 0xb6,
-       0x14, 0xdc, 0x33, 0x27, 0xc7, 0x4f, 0x25, 0x62, 0x49, 0x4b, 0xe7, 0xa5,
-       0xf6, 0x2b, 0xeb, 0xce, 0xc1, 0x2e, 0xd1, 0x86, 0x29, 0xae, 0x81, 0xab,
-       0x12, 0xd7, 0x68, 0x9f, 0xd4, 0xa6, 0xc5, 0x8b, 0x98, 0x67, 0x6e, 0x4b,
-       0xf3, 0x0f, 0xb1, 0xd3, 0xe1, 0x44, 0x65, 0x46, 0xb1, 0x0e, 0x7c, 0x55,
-       0xe7, 0x0e, 0x7b, 0x1c, 0x6a, 0xcc, 0x2d, 0xd1, 0xbf, 0x64, 0x1e, 0xa6,
-       0x43, 0xb2, 0x15, 0x91, 0x57, 0xa0, 0xdf, 0x57, 0xd7, 0xb9, 0xe7, 0xc2,
-       0xbd, 0xc6, 0x47, 0xac, 0xdf, 0x63, 0x49, 0xaf, 0xe6, 0x6b, 0x8b, 0x58,
-       0x2f, 0xf0, 0xab, 0xf1, 0xf0, 0x29, 0xf8, 0x09, 0x5a, 0x27, 0xc1, 0x18,
-       0xeb, 0x2c, 0x7c, 0xca, 0xc6, 0xb8, 0x10, 0x30, 0x62, 0x9a, 0xe7, 0x67,
-       0xc0, 0x8b, 0x77, 0x73, 0x35, 0xc5, 0xea, 0x82, 0xc6, 0x63, 0x6b, 0xeb,
-       0x1d, 0x6a, 0x2f, 0x6a, 0xd5, 0x3e, 0xac, 0x8b, 0x1c, 0xb7, 0xc6, 0x8a,
-       0xfe, 0xf9, 0x16, 0xa9, 0x56, 0xd9, 0x96, 0x81, 0x56, 0xd5, 0x97, 0x20,
-       0x1f, 0x65, 0xcb, 0x1a, 0xb8, 0x6e, 0x75, 0xc3, 0xc1, 0x2f, 0x85, 0xdf,
-       0x08, 0x7e, 0x0f, 0x4a, 0xb6, 0x4c, 0xfe, 0xcd, 0xfc, 0x53, 0x47, 0xd3,
-       0xf3, 0x5b, 0xf4, 0xfb, 0x11, 0xd6, 0xb4, 0x15, 0x7d, 0x3f, 0xad, 0x58,
-       0xdd, 0x8f, 0x9b, 0x32, 0xbe, 0x9b, 0xf2, 0xb1, 0xee, 0xa7, 0x7e, 0x6d,
-       0xed, 0xbf, 0x01, 0x17, 0x24, 0x5e, 0x9d, 0xe0, 0x70, 0x00, 0x00, 0x00 };
-
-static const u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x0 };
-static const u32 bnx2_RXP_b06FwRodata[(0x24/4) + 1] = {
-       0x08004c28, 0x08004c28, 0x08004ba0, 0x08004bd8, 0x08004c0c, 0x08004c30,
-       0x08004c30, 0x08004c30, 0x08004b10, 0x00000000 };
-
-static struct fw_info bnx2_rxp_fw_06 = {
-       /* Firmware version: 4.6.16 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0x10,
-
-       .start_addr                     = 0x080031d8,
-
-       .text_addr                      = 0x08000000,
-       .text_len                       = 0x70dc,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_RXP_b06FwText,
-       .gz_text_len                    = sizeof(bnx2_RXP_b06FwText),
-
-       .data_addr                      = 0x00000000,
-       .data_len                       = 0x0,
-       .data_index                     = 0x0,
-       .data                           = bnx2_RXP_b06FwData,
-
-       .sbss_addr                      = 0x08007120,
-       .sbss_len                       = 0x54,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08007178,
-       .bss_len                        = 0x450,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x080070dc,
-       .rodata_len                     = 0x24,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_RXP_b06FwRodata,
-};
-
 /* Initialized Values for the RX Processor. */
 static const struct cpu_reg cpu_reg_rxp = {
        .mode = BNX2_RXP_CPU_MODE,
@@ -2965,595 +55,6 @@ static const struct cpu_reg cpu_reg_rxp = {
        .mips_view_base = 0x8000000,
 };
 
-static u8 bnx2_rv2p_proc1[] = {
-       /* Date:        02/03/2009 14:20 */
-       0xa5, 0x56, 0x4f, 0x68, 0x14, 0x67, 0x14, 0x7f, 0x33, 0xbb, 0xb3, 0xb3,
-       0x99, 0x9d, 0xd9, 0xdd, 0x92, 0x18, 0x96, 0x18, 0xcc, 0x1a, 0x84, 0x92,
-       0x75, 0xb7, 0x6e, 0x6c, 0x0f, 0x42, 0x03, 0x29, 0xb9, 0x08, 0x35, 0x87,
-       0x12, 0x11, 0x8a, 0x2d, 0x68, 0xb7, 0x22, 0x14, 0x0a, 0xa5, 0x07, 0x8f,
-       0xa5, 0x83, 0x71, 0x53, 0x5a, 0xbc, 0xe4, 0xd0, 0x80, 0x42, 0x35, 0x27,
-       0x5b, 0x62, 0x0e, 0x3b, 0xe0, 0xa1, 0x88, 0xe0, 0x41, 0x8f, 0x7a, 0xaa,
-       0x7f, 0x5a, 0x28, 0x46, 0x29, 0xb5, 0x87, 0x82, 0xc7, 0xde, 0x9a, 0xe9,
-       0xf7, 0xfe, 0x7c, 0xbb, 0x33, 0x5f, 0x66, 0x13, 0xa1, 0x42, 0xfc, 0xf1,
-       0xbd, 0x79, 0xef, 0xfb, 0xde, 0x9f, 0xdf, 0x7b, 0x6f, 0xab, 0x00, 0x60,
-       0x43, 0x18, 0x4d, 0x29, 0x04, 0x2b, 0x67, 0x15, 0x11, 0x00, 0x36, 0x81,
-       0xff, 0x39, 0x3e, 0x9d, 0xc3, 0x23, 0x72, 0x3e, 0xcc, 0x10, 0x1e, 0xae,
-       0xaa, 0xff, 0x3f, 0x85, 0xf9, 0x3a, 0x62, 0x0e, 0xe6, 0x0f, 0x22, 0x1e,
-       0x85, 0xbb, 0xf5, 0x9a, 0xc2, 0x7f, 0x63, 0x08, 0xf1, 0x1c, 0xf4, 0x7e,
-       0x8e, 0x4a, 0x74, 0xff, 0x96, 0xd8, 0xff, 0x9a, 0x63, 0x3c, 0xd6, 0xac,
-       0x12, 0x3e, 0x5a, 0xc5, 0xf7, 0x4e, 0x9d, 0x82, 0x02, 0xda, 0x5d, 0x50,
-       0x17, 0x23, 0x96, 0xd4, 0x83, 0x45, 0xb2, 0x03, 0xbb, 0xa2, 0x70, 0x12,
-       0x9e, 0x2f, 0xa0, 0xfe, 0x1b, 0xde, 0xa5, 0x55, 0xc4, 0x12, 0x74, 0x9a,
-       0xa8, 0x77, 0x00, 0xb2, 0xf5, 0x6a, 0x4a, 0x0f, 0xe5, 0x11, 0x84, 0x4d,
-       0xc4, 0x11, 0x80, 0x56, 0xf2, 0x3d, 0xd7, 0x0a, 0x5b, 0x68, 0xff, 0x85,
-       0xbc, 0xb7, 0x4f, 0xee, 0x51, 0x71, 0x47, 0x88, 0x3d, 0xb1, 0x53, 0x7f,
-       0x2d, 0x96, 0xb3, 0xfe, 0x67, 0x4a, 0x4f, 0xc7, 0xe3, 0x73, 0xde, 0xa6,
-       0x38, 0x1e, 0x57, 0xe2, 0x79, 0xb6, 0xaa, 0xf3, 0x86, 0xfa, 0xbf, 0xc7,
-       0x69, 0x7d, 0xd8, 0x43, 0xff, 0x89, 0xd2, 0x4f, 0xdf, 0xcb, 0xf2, 0x5f,
-       0x06, 0xf2, 0x99, 0xf4, 0xf7, 0xad, 0x06, 0xfa, 0xe7, 0x00, 0x34, 0x24,
-       0x8f, 0xa4, 0xff, 0x30, 0xe6, 0x78, 0xe6, 0xe0, 0x90, 0x5d, 0x23, 0xbd,
-       0x3c, 0xd4, 0x28, 0x3f, 0x1c, 0xef, 0x01, 0xc1, 0x25, 0xc1, 0x6b, 0x82,
-       0x3f, 0x08, 0xc2, 0xff, 0xc4, 0xad, 0x21, 0xf2, 0x7d, 0x82, 0xfb, 0x0d,
-       0xf9, 0x2d, 0xc1, 0xb7, 0x0c, 0x7b, 0xcf, 0x62, 0x7c, 0xac, 0xbf, 0xcb,
-       0xf9, 0x5d, 0xc3, 0xfe, 0x4b, 0xe0, 0xfc, 0x58, 0x46, 0xde, 0x36, 0x85,
-       0x87, 0x58, 0x77, 0xf9, 0x3e, 0xa3, 0xf5, 0x84, 0x37, 0x8d, 0xa4, 0xfe,
-       0x8d, 0x5d, 0xf4, 0x59, 0x6d, 0x61, 0x26, 0xcb, 0xee, 0x7a, 0x2c, 0x79,
-       0x14, 0x7b, 0xaf, 0x77, 0x67, 0x08, 0xef, 0xe7, 0x32, 0x79, 0x3f, 0x2e,
-       0x71, 0xa8, 0xa6, 0x23, 0xfb, 0xdb, 0x16, 0xf3, 0xdb, 0x11, 0x5e, 0xee,
-       0xc6, 0x63, 0xe1, 0xd5, 0x8c, 0xe6, 0x57, 0x9a, 0x57, 0xcc, 0x8f, 0x82,
-       0xc1, 0x8f, 0x6f, 0xf7, 0xc8, 0x4b, 0xc9, 0x88, 0x6f, 0x39, 0xd6, 0xf9,
-       0xb6, 0x45, 0x7c, 0xb1, 0x50, 0xa5, 0x7b, 0xbf, 0x8b, 0xe8, 0x38, 0xe6,
-       0xaf, 0xe0, 0x39, 0x0f, 0x97, 0x23, 0x6d, 0x27, 0xfd, 0xd4, 0xd0, 0xef,
-       0xb0, 0x7d, 0x20, 0x9f, 0x6d, 0x47, 0xfb, 0xc9, 0x72, 0x0f, 0xf0, 0x3c,
-       0xda, 0x5b, 0x37, 0xf2, 0x56, 0xa7, 0xb8, 0x41, 0xe2, 0x07, 0x23, 0x7e,
-       0x9d, 0xbf, 0x57, 0xc2, 0xf7, 0x49, 0x95, 0x0f, 0xfe, 0x3e, 0x05, 0xfa,
-       0x7e, 0x9c, 0x0b, 0x45, 0x38, 0x7b, 0xbc, 0x42, 0xfe, 0x94, 0x0b, 0x7c,
-       0xcd, 0x87, 0x15, 0xc6, 0x73, 0x1e, 0xe3, 0x9f, 0x9e, 0xca, 0x2d, 0xc4,
-       0xf1, 0xf9, 0x12, 0x9f, 0x3f, 0x09, 0xf0, 0xde, 0x51, 0xf5, 0xb0, 0xb6,
-       0xd7, 0x7e, 0xed, 0xe6, 0x0f, 0xbe, 0xaf, 0xdf, 0xd1, 0x7e, 0xe8, 0xf7,
-       0xd2, 0x75, 0x19, 0xfe, 0x2e, 0x63, 0xc7, 0x4e, 0xe7, 0x21, 0x3f, 0xcb,
-       0x78, 0xb5, 0x4d, 0x50, 0x5b, 0xf3, 0xd9, 0xee, 0x8a, 0x9f, 0xc7, 0xf3,
-       0x3b, 0x57, 0x1e, 0xe0, 0xfd, 0xf6, 0xd1, 0xb5, 0x48, 0xfc, 0xab, 0xe8,
-       0xba, 0x92, 0x1c, 0xa6, 0x81, 0xcf, 0x4b, 0xc2, 0x93, 0x25, 0xe2, 0x71,
-       0x59, 0x7d, 0x42, 0x9c, 0x80, 0xd0, 0x26, 0x3d, 0xef, 0x3e, 0xd9, 0xe7,
-       0x44, 0xae, 0xea, 0x37, 0x9d, 0xe6, 0xff, 0x16, 0xf3, 0xa2, 0x98, 0xe6,
-       0xd3, 0x7c, 0x62, 0xce, 0x25, 0xf3, 0x61, 0xf5, 0x79, 0xb4, 0xb3, 0x8e,
-       0xe9, 0x7a, 0x3d, 0x5a, 0xd5, 0xf9, 0x61, 0xbe, 0xb2, 0x9e, 0x2a, 0x56,
-       0x8b, 0xd5, 0xc3, 0xb6, 0x24, 0x72, 0x56, 0xbe, 0xb7, 0x4c, 0xde, 0x66,
-       0xf1, 0xbe, 0x6a, 0xf0, 0xb8, 0x21, 0xbc, 0x1f, 0xe9, 0xad, 0xbf, 0xd6,
-       0x7e, 0xb8, 0x29, 0xbc, 0xaf, 0x0e, 0xf6, 0xc3, 0x26, 0xed, 0x27, 0x75,
-       0x26, 0xf5, 0x5e, 0x98, 0x4b, 0xd5, 0xe9, 0x3d, 0xc8, 0xec, 0xef, 0xab,
-       0x72, 0x4f, 0x5b, 0xfa, 0xbc, 0x90, 0xd8, 0x23, 0xa4, 0x5e, 0x06, 0xf2,
-       0xc3, 0x35, 0xfa, 0x74, 0x2c, 0x96, 0x77, 0x54, 0xbf, 0x65, 0xc5, 0xeb,
-       0xc2, 0x5f, 0xc2, 0x83, 0x0e, 0xf5, 0x93, 0x33, 0xf6, 0xf9, 0xed, 0x54,
-       0x9d, 0x00, 0x0e, 0xea, 0xfd, 0x90, 0xf4, 0x2b, 0xb9, 0xdf, 0xf0, 0xbe,
-       0x1a, 0x74, 0x66, 0x93, 0x7b, 0xee, 0x72, 0xbf, 0xdf, 0x03, 0xea, 0xa3,
-       0xf2, 0x8e, 0xbe, 0xd4, 0xf3, 0xac, 0xde, 0x4c, 0xf6, 0xf7, 0x98, 0xcc,
-       0x2f, 0x5b, 0xf6, 0x73, 0xc9, 0x8c, 0x53, 0xed, 0xbd, 0xec, 0x7a, 0x71,
-       0xbc, 0xff, 0x6c, 0xbf, 0xde, 0xbc, 0xdb, 0xab, 0xee, 0x9e, 0x51, 0xf7,
-       0xbf, 0xb7, 0x75, 0x1e, 0x6d, 0x27, 0x6b, 0xbf, 0x7f, 0xa0, 0xee, 0x15,
-       0x7d, 0x99, 0x1b, 0x67, 0xea, 0x59, 0x7c, 0x2d, 0xee, 0xd0, 0x4b, 0xcf,
-       0x2f, 0xed, 0xe7, 0xc6, 0x06, 0xd7, 0xfd, 0xa3, 0xb8, 0xbf, 0x97, 0x52,
-       0xf3, 0x75, 0x44, 0xea, 0xac, 0xf4, 0xc8, 0xbf, 0xa7, 0xdb, 0x83, 0x79,
-       0x9c, 0xe4, 0xcd, 0x49, 0xe1, 0xab, 0x3d, 0xb7, 0x4e, 0xfd, 0xe1, 0x76,
-       0x5e, 0x1a, 0x75, 0x98, 0x6d, 0x62, 0xfd, 0xbf, 0x86, 0x48, 0xfc, 0xfc,
-       0x2d, 0xe5, 0x6f, 0x20, 0xfd, 0x55, 0x80, 0x9f, 0x22, 0x1d, 0x97, 0xae,
-       0x1b, 0xe3, 0x8f, 0x4d, 0xe9, 0x93, 0x7e, 0x7c, 0xf8, 0xee, 0xa2, 0xbc,
-       0x5b, 0x85, 0x1b, 0x91, 0x9e, 0x63, 0x38, 0xd7, 0x5c, 0x68, 0xcb, 0xdc,
-       0x3c, 0x2b, 0xf3, 0xeb, 0x85, 0xc7, 0xf3, 0xb1, 0x73, 0x82, 0x78, 0x08,
-       0xe3, 0x32, 0xc7, 0x3a, 0x01, 0x9f, 0x27, 0x02, 0xfe, 0x7d, 0xd8, 0x76,
-       0x7d, 0xd2, 0x9b, 0x08, 0x18, 0xc7, 0x4b, 0x68, 0x57, 0x83, 0x3f, 0x16,
-       0x49, 0xbd, 0x39, 0x98, 0x63, 0xe6, 0xfc, 0x92, 0x38, 0xdf, 0x46, 0xb9,
-       0xda, 0x93, 0xd3, 0x7c, 0xe6, 0x3a, 0xfb, 0x7d, 0x5e, 0x5f, 0x97, 0xaa,
-       0xd4, 0x2b, 0xc9, 0x3c, 0xeb, 0x3e, 0xba, 0x69, 0xe4, 0x57, 0xd7, 0xe7,
-       0xcd, 0x58, 0xcf, 0xf7, 0xe9, 0xe3, 0xe8, 0x6f, 0x05, 0xca, 0x2e, 0xf3,
-       0x82, 0x51, 0xdd, 0x63, 0xbb, 0x68, 0x36, 0xd9, 0x95, 0x79, 0xd8, 0xbd,
-       0x48, 0xd7, 0x2c, 0x76, 0xb5, 0x7c, 0x81, 0x1a, 0x61, 0x69, 0xe3, 0x1e,
-       0xc9, 0xcb, 0x51, 0x8e, 0xe5, 0xee, 0x09, 0x9d, 0xaf, 0x0a, 0xc5, 0xbf,
-       0xc6, 0xf9, 0xfa, 0xf8, 0x7b, 0xc6, 0xd3, 0xf0, 0x3e, 0xa1, 0x37, 0x98,
-       0xe3, 0x45, 0x42, 0x08, 0x92, 0x73, 0xdc, 0x51, 0xee, 0x55, 0xc9, 0x9f,
-       0x41, 0xfd, 0xcc, 0xfd, 0xb8, 0x5b, 0x1d, 0x47, 0x13, 0xfc, 0xd3, 0x75,
-       0x34, 0xe7, 0x39, 0xf1, 0xc4, 0xe0, 0x63, 0x77, 0x08, 0x1f, 0xad, 0x21,
-       0x7c, 0x36, 0xe7, 0xd6, 0x57, 0xd2, 0xc7, 0x79, 0x70, 0x72, 0xb4, 0x70,
-       0xfd, 0xfc, 0x32, 0xd5, 0xd5, 0xee, 0xf2, 0x0f, 0x08, 0xdf, 0x59, 0xb1,
-       0x28, 0x5f, 0xfe, 0x0a, 0xeb, 0xe5, 0x59, 0x5e, 0xd3, 0xf8, 0xcd, 0xb2,
-       0xfe, 0xbd, 0xf1, 0x1f, 0xb6, 0x34, 0x9b, 0xb9, 0xa0, 0x0c, 0x00, 0x00,
-       0x00 };
-
-static u8 bnx2_rv2p_proc2[] = {
-       /* Date:        02/03/2009 14:20 */
-       0xad, 0x57, 0x4d, 0x68, 0x5c, 0x55, 0x14, 0x3e, 0xf3, 0xe6, 0xef, 0xcd,
-       0xcc, 0x9b, 0xcc, 0x34, 0x8d, 0x93, 0x31, 0x29, 0x26, 0x4d, 0x68, 0xea,
-       0xc8, 0x44, 0xf3, 0x47, 0x05, 0x5d, 0x18, 0x46, 0x48, 0x7f, 0x2c, 0x34,
-       0x8d, 0x2e, 0x8a, 0x9b, 0x36, 0x53, 0x3b, 0x3a, 0x6d, 0xed, 0xc2, 0xec,
-       0xdc, 0xf8, 0xb0, 0x35, 0x41, 0x98, 0x45, 0x53, 0x4c, 0x13, 0x44, 0xa8,
-       0xe8, 0xce, 0xdd, 0x88, 0x9a, 0xd6, 0x8d, 0x50, 0x68, 0x28, 0x76, 0x51,
-       0x04, 0x05, 0xed, 0x42, 0x10, 0xad, 0xa1, 0x15, 0x41, 0x51, 0xb3, 0x92,
-       0x8c, 0xf7, 0x9e, 0xef, 0xdc, 0x37, 0xef, 0x4d, 0xa6, 0xa4, 0x0b, 0x67,
-       0xf3, 0xe5, 0xdc, 0x77, 0xee, 0xb9, 0xe7, 0xe7, 0x3b, 0xe7, 0xde, 0x64,
-       0x89, 0x28, 0x42, 0x6e, 0xbd, 0x4f, 0x21, 0x85, 0xc2, 0x21, 0x5b, 0x41,
-       0x83, 0x28, 0x9a, 0xd7, 0x32, 0x59, 0x24, 0xbf, 0x27, 0xb2, 0x0c, 0xdf,
-       0xd6, 0x1d, 0xad, 0x46, 0x6e, 0x41, 0xeb, 0xd9, 0xf4, 0x92, 0x05, 0xbd,
-       0x08, 0x69, 0x54, 0x3a, 0xae, 0xc6, 0x1d, 0x82, 0xcf, 0x08, 0x46, 0x42,
-       0xc0, 0xb0, 0xa0, 0xd5, 0x82, 0x24, 0x7a, 0x5d, 0x22, 0x6f, 0x8a, 0xec,
-       0x08, 0xe6, 0x65, 0xfd, 0xb4, 0xe0, 0xab, 0xb2, 0x7e, 0x47, 0x70, 0x5d,
-       0xa1, 0xf1, 0x53, 0xcb, 0xbf, 0x35, 0x9a, 0xb2, 0x03, 0xf3, 0x05, 0xf8,
-       0xff, 0x62, 0x3f, 0xeb, 0x37, 0x82, 0xfa, 0x77, 0x1b, 0xc6, 0x0f, 0x13,
-       0xaf, 0x15, 0xd5, 0xfa, 0xbb, 0x27, 0x2e, 0x2f, 0x62, 0xdf, 0xf1, 0x7e,
-       0xac, 0x3f, 0x56, 0xd4, 0x71, 0xc7, 0xc8, 0x15, 0xa4, 0x61, 0x9b, 0xe3,
-       0x70, 0x87, 0x4d, 0xa2, 0xa0, 0xff, 0xe3, 0x22, 0xa4, 0xd9, 0x34, 0xec,
-       0x26, 0x03, 0x76, 0x73, 0x5b, 0xec, 0x7e, 0x9f, 0xf0, 0xdb, 0xff, 0x54,
-       0xec, 0x27, 0xb7, 0xb5, 0x5f, 0x4e, 0x03, 0x77, 0x16, 0xdb, 0x9d, 0x93,
-       0xd8, 0xc6, 0xff, 0xd3, 0xdb, 0xda, 0x7f, 0xd3, 0xf3, 0xdf, 0xac, 0x03,
-       0xfb, 0xf0, 0xf9, 0x13, 0xf7, 0x29, 0x93, 0x47, 0x13, 0xaf, 0xf8, 0x15,
-       0x06, 0x4e, 0x16, 0x19, 0x6a, 0x27, 0x25, 0xb1, 0x53, 0x43, 0xfa, 0xbc,
-       0x4e, 0x8a, 0x58, 0xda, 0xce, 0x5e, 0x3b, 0x76, 0x0d, 0xeb, 0xc7, 0x32,
-       0xc0, 0x57, 0x24, 0x80, 0xbb, 0x49, 0x9d, 0x90, 0x46, 0xa3, 0x92, 0x12,
-       0xfb, 0x28, 0x23, 0xb9, 0x29, 0xec, 0x5f, 0x73, 0xb4, 0x5f, 0xb7, 0x54,
-       0xdd, 0xb4, 0x1c, 0x26, 0x37, 0x13, 0xf4, 0xff, 0x0a, 0x41, 0x6f, 0xc7,
-       0x5e, 0xac, 0x5e, 0xac, 0x40, 0xee, 0xfd, 0x38, 0xcb, 0xfa, 0x2b, 0x75,
-       0x13, 0x87, 0x5e, 0x57, 0xfc, 0xcf, 0xc0, 0x0e, 0x0d, 0xd8, 0x7c, 0x18,
-       0xf2, 0xa3, 0x0e, 0x1d, 0x36, 0xf6, 0xf0, 0xbb, 0xbc, 0xc7, 0xf0, 0x09,
-       0x72, 0x25, 0xc6, 0x90, 0x9f, 0x9d, 0xd7, 0xfe, 0x66, 0xe8, 0x84, 0xa5,
-       0x1d, 0xb1, 0x24, 0xbe, 0xb0, 0xed, 0x7c, 0x01, 0xfd, 0xaf, 0xfa, 0x1c,
-       0xf6, 0xad, 0x32, 0x8e, 0x7d, 0x5d, 0x63, 0xc0, 0xa5, 0xb1, 0xa8, 0x86,
-       0x62, 0x65, 0x8e, 0xc5, 0x27, 0x7f, 0x1e, 0xb5, 0x59, 0xcf, 0x1d, 0x36,
-       0x7c, 0x35, 0x79, 0xd7, 0xf1, 0x5e, 0x6c, 0xf2, 0x76, 0x10, 0xf9, 0xf9,
-       0x75, 0x8f, 0xd6, 0x57, 0x49, 0x1a, 0xc0, 0x39, 0x33, 0xd5, 0x76, 0x7c,
-       0x7f, 0x57, 0xed, 0x7b, 0xb8, 0xfa, 0x4d, 0x72, 0xdc, 0x93, 0x12, 0x7f,
-       0xbf, 0xf0, 0x63, 0x57, 0x1b, 0x7e, 0x64, 0xf8, 0xef, 0xfb, 0xa5, 0x2c,
-       0xe7, 0xef, 0x08, 0xd6, 0x2f, 0x4d, 0xad, 0x22, 0xcf, 0x07, 0x39, 0x7e,
-       0x4a, 0x5e, 0xf8, 0x1c, 0xbb, 0x66, 0xd3, 0x5a, 0x7e, 0x79, 0xa2, 0xf2,
-       0x25, 0xe4, 0x72, 0x58, 0xcb, 0xc7, 0x9c, 0x93, 0x57, 0xa1, 0x1f, 0x3d,
-       0x9f, 0xe5, 0xbc, 0x1d, 0x91, 0x53, 0x0e, 0xaa, 0x51, 0xa1, 0x7e, 0xb5,
-       0xd8, 0x79, 0x16, 0x9d, 0x35, 0xfe, 0x9e, 0xa5, 0x85, 0x3a, 0xbe, 0x9f,
-       0x4b, 0xe9, 0xb8, 0xce, 0xa8, 0xb8, 0x58, 0xaf, 0xab, 0x1a, 0xc3, 0xfe,
-       0xda, 0xa2, 0xb6, 0x17, 0xa2, 0x7b, 0x9f, 0x69, 0xf9, 0x70, 0xf1, 0x1e,
-       0xf4, 0x8b, 0xd5, 0x79, 0x31, 0x6c, 0x21, 0x6f, 0xf7, 0x2d, 0xe8, 0x0b,
-       0xad, 0x92, 0x11, 0xae, 0x5b, 0x88, 0x9c, 0x29, 0xe0, 0x3b, 0xfc, 0xfd,
-       0xdf, 0x50, 0x8d, 0xf3, 0xf5, 0x7c, 0x47, 0x64, 0xd5, 0xe4, 0x47, 0x30,
-       0x63, 0xe2, 0x02, 0x3e, 0x2c, 0x6f, 0xe7, 0x1d, 0xc3, 0x57, 0xa9, 0x57,
-       0xe1, 0x41, 0x7c, 0x05, 0x4e, 0x0d, 0x01, 0x63, 0x83, 0x5a, 0x2f, 0xda,
-       0x86, 0xb7, 0xc1, 0xba, 0x48, 0x5d, 0x7d, 0xfc, 0x62, 0x50, 0xbc, 0x0a,
-       0xf0, 0x4c, 0xf1, 0x98, 0xe7, 0x90, 0xca, 0xa7, 0xe1, 0x8b, 0x36, 0x14,
-       0xa7, 0x33, 0x62, 0xaf, 0x2a, 0x71, 0x9d, 0x95, 0xb8, 0x7e, 0x4f, 0x9a,
-       0xbc, 0x9b, 0x78, 0x80, 0x0b, 0x5e, 0x3c, 0x86, 0x6f, 0xb8, 0x1f, 0x66,
-       0xaa, 0x01, 0x7f, 0x6a, 0x37, 0x06, 0xf0, 0x47, 0xef, 0x20, 0xd0, 0x8b,
-       0x73, 0x88, 0xfb, 0xa4, 0xa3, 0xfb, 0xaa, 0xf1, 0x43, 0xd7, 0x75, 0x43,
-       0xf8, 0x6a, 0xa9, 0x78, 0xfd, 0xfd, 0xd9, 0xd3, 0xa6, 0x3f, 0x83, 0xfd,
-       0x62, 0xe2, 0x3f, 0x97, 0xe6, 0x01, 0x34, 0x71, 0x7b, 0x3d, 0xd8, 0x0f,
-       0xe0, 0x7f, 0xdc, 0xe3, 0x51, 0xd7, 0x3e, 0xc9, 0x93, 0x60, 0xee, 0x69,
-       0x6d, 0x6f, 0x5a, 0xec, 0x8f, 0x88, 0x7d, 0xc7, 0xd7, 0x8f, 0xda, 0xbf,
-       0x3e, 0xaf, 0x0f, 0x4d, 0x7d, 0x9a, 0xfd, 0x68, 0xf2, 0xc4, 0xe7, 0x17,
-       0x6f, 0xaf, 0xeb, 0xfd, 0xbd, 0xdb, 0xf4, 0xe7, 0x23, 0x9e, 0xbd, 0xef,
-       0xbc, 0x7e, 0xd4, 0xdf, 0x53, 0xf4, 0x9c, 0x88, 0xc1, 0x39, 0xf3, 0x87,
-       0x9a, 0x33, 0x1c, 0x87, 0xed, 0xac, 0xca, 0x5c, 0x99, 0xd3, 0xe7, 0xe4,
-       0xc5, 0xef, 0xbc, 0x99, 0xeb, 0xca, 0x6f, 0x99, 0x3f, 0xc7, 0xfd, 0x73,
-       0x24, 0xde, 0xe6, 0x3c, 0xc0, 0x64, 0xb1, 0x35, 0x5f, 0xc8, 0x3b, 0xec,
-       0xaa, 0xfc, 0x9b, 0x39, 0x30, 0x6e, 0xec, 0x43, 0x74, 0x47, 0xfd, 0xfa,
-       0xad, 0xf5, 0x89, 0x3c, 0x60, 0x9e, 0x6d, 0x6c, 0xe2, 0xde, 0xfd, 0x67,
-       0xb3, 0x79, 0x1f, 0x07, 0xea, 0xe8, 0x12, 0xd7, 0x3d, 0xae, 0xea, 0xcf,
-       0xef, 0x03, 0xef, 0x9e, 0xb7, 0xa2, 0x7a, 0x5d, 0xe5, 0x42, 0x78, 0xf5,
-       0xfa, 0xe3, 0xb2, 0xbf, 0x80, 0xb9, 0xf4, 0xda, 0x29, 0xce, 0xff, 0x7b,
-       0x67, 0x37, 0x78, 0x3e, 0x7d, 0xf8, 0xc6, 0x35, 0x1d, 0xd7, 0xa3, 0xb4,
-       0x3e, 0xe7, 0xb0, 0x3f, 0xa5, 0xdd, 0x50, 0xdf, 0x78, 0xb6, 0xb5, 0x1e,
-       0x78, 0xd7, 0xa0, 0x5e, 0x4a, 0x6f, 0x36, 0x78, 0xaf, 0x36, 0xfd, 0x43,
-       0xbf, 0xec, 0xcf, 0x40, 0xdf, 0xf4, 0x73, 0xb0, 0xae, 0x77, 0x36, 0x9b,
-       0x73, 0xd7, 0xe4, 0x3b, 0xc8, 0xd3, 0xa3, 0xe3, 0x7e, 0xbb, 0x83, 0xb4,
-       0x56, 0x87, 0xdd, 0x69, 0xe9, 0xc3, 0x13, 0x72, 0xf0, 0x4f, 0xc9, 0x0c,
-       0x9f, 0x53, 0x7e, 0x81, 0x79, 0x46, 0xb9, 0x14, 0xe2, 0x2c, 0x1f, 0xc6,
-       0xf7, 0x72, 0x1a, 0xeb, 0x3d, 0x69, 0xdc, 0x6f, 0xd3, 0x71, 0x87, 0xf5,
-       0x7b, 0xd2, 0xc0, 0x9c, 0xf4, 0xeb, 0x9a, 0x37, 0x8f, 0x80, 0x2b, 0x31,
-       0x7f, 0xff, 0x46, 0xe8, 0x7a, 0x4c, 0x2b, 0xa8, 0xcb, 0xba, 0x80, 0xfe,
-       0x2b, 0x0d, 0x39, 0xfc, 0x7d, 0xa6, 0x80, 0xb9, 0x4a, 0x03, 0xc1, 0xfb,
-       0x50, 0xfa, 0xb9, 0xa7, 0x39, 0xb7, 0xfc, 0x73, 0x2d, 0x31, 0xb6, 0x5c,
-       0x0f, 0xde, 0x97, 0x2b, 0x31, 0xff, 0x9c, 0xd0, 0x76, 0x59, 0x54, 0xf3,
-       0xc1, 0x3f, 0xd7, 0xc2, 0x52, 0xef, 0xbf, 0x64, 0x0e, 0xec, 0xa4, 0x9b,
-       0x75, 0xc4, 0xb5, 0x56, 0x6f, 0xcd, 0xb3, 0x39, 0xcf, 0xd8, 0x83, 0xdf,
-       0x26, 0x8e, 0xa6, 0x7d, 0x9c, 0x7f, 0x4a, 0xfc, 0xfc, 0x85, 0xdf, 0x21,
-       0x39, 0x89, 0x47, 0xdb, 0xc5, 0xfa, 0x01, 0x99, 0xb3, 0xae, 0x27, 0x07,
-       0xe7, 0xe3, 0x34, 0xfb, 0xd5, 0x49, 0x78, 0x77, 0xe4, 0xbc, 0xbe, 0x36,
-       0xf1, 0x75, 0x8d, 0x00, 0x97, 0x46, 0x4c, 0x1d, 0x4c, 0xbd, 0x4c, 0x7d,
-       0x50, 0xc7, 0xdc, 0x28, 0xab, 0x4d, 0x94, 0x47, 0x99, 0xa7, 0x23, 0xe5,
-       0x3f, 0x83, 0xef, 0xb4, 0xa3, 0x45, 0xad, 0xff, 0x16, 0x7d, 0xc3, 0x7d,
-       0x44, 0xf4, 0x83, 0x60, 0x73, 0x1e, 0x49, 0x01, 0x02, 0xef, 0xb2, 0x30,
-       0x5d, 0x8f, 0xca, 0xf2, 0xb8, 0xe9, 0x9b, 0x60, 0xdf, 0x5d, 0xe1, 0x77,
-       0xfa, 0xc2, 0xe6, 0xd6, 0xfe, 0x37, 0xf1, 0x69, 0xbd, 0x61, 0xe1, 0xa1,
-       0x4d, 0xa5, 0xfd, 0x78, 0xd7, 0x74, 0xc4, 0xc1, 0xf3, 0x8e, 0xb8, 0xbf,
-       0x4e, 0x8a, 0x0f, 0x89, 0xb8, 0x16, 0x77, 0x75, 0x26, 0x38, 0x8e, 0x4b,
-       0x5f, 0xdf, 0xe2, 0xcf, 0x1f, 0x2d, 0xa7, 0xb0, 0xde, 0x5d, 0x82, 0xf9,
-       0x08, 0xf3, 0x35, 0x4c, 0x17, 0xc0, 0xe7, 0x0f, 0x96, 0x80, 0xef, 0xd3,
-       0x21, 0xd8, 0xe9, 0x7c, 0x9b, 0xef, 0x71, 0xbb, 0x1b, 0xe9, 0xac, 0x2d,
-       0x0b, 0x4f, 0xf3, 0x16, 0xff, 0x3f, 0xd2, 0xa0, 0xb4, 0xbc, 0x5b, 0xa5,
-       0xcf, 0xc0, 0xcf, 0x88, 0xaf, 0xce, 0xdb, 0xf1, 0x55, 0xa3, 0xa3, 0xf8,
-       0x88, 0xed, 0xc2, 0x5b, 0xbb, 0x95, 0xb7, 0xa6, 0x8e, 0x79, 0xab, 0x2d,
-       0x4f, 0xf7, 0x05, 0x79, 0x1a, 0x13, 0x9e, 0xfe, 0xed, 0xcd, 0xd3, 0xad,
-       0x76, 0x31, 0xc7, 0x6f, 0xfe, 0x6f, 0xbc, 0x05, 0x1e, 0x18, 0xd4, 0xe7,
-       0x77, 0xfb, 0xf8, 0x67, 0xfc, 0xf2, 0xcf, 0x9f, 0x43, 0x6a, 0xae, 0xfe,
-       0x07, 0x92, 0xe2, 0x88, 0x7c, 0xe0, 0x0d, 0x00, 0x00, 0x00 };
-
-static u8 bnx2_TPAT_b06FwText[] = {
-       0xbd, 0x58, 0x6d, 0x70, 0x5c, 0xd5, 0x79, 0x7e, 0xce, 0xbd, 0x77, 0xb5,
-       0xd7, 0xd2, 0x4a, 0xba, 0xb2, 0xd6, 0x66, 0x5d, 0xdc, 0xfa, 0x1e, 0x74,
-       0x57, 0x52, 0x58, 0x01, 0x77, 0x6d, 0x01, 0xeb, 0xe6, 0xb6, 0xbe, 0xc8,
-       0xb2, 0xbc, 0xfe, 0x00, 0xe4, 0xc0, 0x4c, 0xe4, 0x96, 0x8e, 0x37, 0xc6,
-       0x18, 0xd9, 0x90, 0xa9, 0x28, 0xfc, 0x58, 0x37, 0x4c, 0xbd, 0x95, 0x65,
-       0x63, 0xc3, 0x4a, 0x6b, 0x0c, 0xb1, 0x4c, 0xda, 0x99, 0x78, 0x84, 0xb1,
-       0x4c, 0x22, 0x7b, 0x0d, 0xe4, 0x07, 0x49, 0xc3, 0xa0, 0xc1, 0x0e, 0x08,
-       0x06, 0xf3, 0x31, 0x6d, 0x67, 0x98, 0xe9, 0xa4, 0xf5, 0x18, 0xf3, 0x11,
-       0x92, 0x18, 0x87, 0x4e, 0x3a, 0xa2, 0x10, 0x9f, 0x3e, 0x67, 0x77, 0xc5,
-       0x57, 0x32, 0xd3, 0xfe, 0xaa, 0x66, 0x56, 0x7b, 0xf7, 0xec, 0xf9, 0x78,
-       0xcf, 0xfb, 0x3e, 0xef, 0xf3, 0x3e, 0xef, 0x5e, 0x21, 0x50, 0x8f, 0xda,
-       0x5f, 0x23, 0x5f, 0xdd, 0xdf, 0x1a, 0xba, 0x2f, 0x7d, 0xf5, 0x75, 0x57,
-       0xf3, 0xf1, 0x3a, 0xe1, 0xd4, 0x59, 0xf8, 0x7f, 0xfc, 0x33, 0x01, 0x67,
-       0xce, 0x0e, 0xfd, 0x82, 0x6d, 0x04, 0x85, 0xcb, 0x7b, 0x3c, 0xd8, 0x66,
-       0x10, 0x77, 0x6f, 0xf7, 0x80, 0x70, 0x2a, 0xe5, 0xae, 0xc4, 0xef, 0x54,
-       0x21, 0x6e, 0x41, 0x8f, 0xff, 0x71, 0xf0, 0xe9, 0x35, 0xcf, 0x5d, 0x2f,
-       0x2f, 0x1e, 0x36, 0x61, 0x3b, 0xc1, 0x5e, 0xcb, 0x69, 0x87, 0xbd, 0x98,
-       0x6b, 0xfe, 0xb1, 0xe3, 0x2f, 0x04, 0x9a, 0xe6, 0xf6, 0x52, 0x6a, 0xc4,
-       0x8f, 0x62, 0xd8, 0x4f, 0x60, 0x77, 0xc9, 0x40, 0xe8, 0x44, 0xb1, 0xcb,
-       0x9b, 0x55, 0x5b, 0x7c, 0xe9, 0xef, 0x86, 0x5a, 0x72, 0xda, 0x97, 0x89,
-       0x5e, 0x13, 0xe1, 0x77, 0xbc, 0xc5, 0xd8, 0x5d, 0x4e, 0x60, 0xa4, 0x6c,
-       0xe3, 0xac, 0x39, 0x82, 0xde, 0xf2, 0xdc, 0x3a, 0x97, 0xeb, 0x3a, 0xb1,
-       0xe7, 0xcb, 0x6b, 0xdd, 0xdd, 0x48, 0x25, 0xf6, 0xc0, 0x40, 0x2e, 0xee,
-       0x71, 0x5d, 0x9b, 0xbb, 0x07, 0xb2, 0x93, 0xfb, 0x14, 0xea, 0xba, 0x5d,
-       0xee, 0x51, 0xe0, 0x7a, 0xe9, 0x1e, 0x85, 0xde, 0x2b, 0xc3, 0xcf, 0x6f,
-       0xa9, 0xe7, 0x3a, 0x16, 0xe3, 0x19, 0xee, 0xff, 0x74, 0xd9, 0xc1, 0xc9,
-       0xb2, 0x87, 0xe7, 0xcb, 0x2e, 0x7e, 0x54, 0x8e, 0xe3, 0xa9, 0xb2, 0x9d,
-       0xb3, 0x03, 0xf4, 0xc7, 0x47, 0x77, 0xaa, 0x84, 0x87, 0xc2, 0x1f, 0x05,
-       0xde, 0xa1, 0x43, 0x46, 0x2c, 0xf3, 0x37, 0xd7, 0xa1, 0x7f, 0xfe, 0x71,
-       0x1b, 0x1b, 0x4a, 0x8b, 0x73, 0xd1, 0x00, 0x9c, 0x23, 0xe0, 0x5f, 0x67,
-       0xa3, 0x9f, 0x7b, 0x14, 0xb8, 0x7f, 0x58, 0x1e, 0xe1, 0xcb, 0xc6, 0xbb,
-       0x45, 0xdb, 0x6e, 0x1e, 0x5d, 0xa8, 0xe7, 0xe0, 0x57, 0xc5, 0x8b, 0xea,
-       0x42, 0xda, 0xc1, 0x2b, 0xcb, 0x95, 0x6a, 0x0c, 0x50, 0x68, 0xe8, 0x2e,
-       0xc0, 0x0c, 0x64, 0x76, 0x9d, 0x29, 0xd0, 0x7b, 0x95, 0xd7, 0x39, 0x2a,
-       0x6e, 0xb9, 0xc5, 0x08, 0x60, 0x8b, 0xc0, 0xb5, 0xda, 0xa6, 0x32, 0xd8,
-       0x57, 0xe6, 0xbd, 0x68, 0xcf, 0x48, 0x19, 0xe1, 0x5f, 0x76, 0x98, 0x98,
-       0x88, 0xe3, 0xfe, 0xb7, 0xbb, 0x2d, 0x7c, 0x5c, 0x94, 0x89, 0x4e, 0xf3,
-       0x7e, 0xec, 0x2c, 0xe6, 0x71, 0x47, 0x11, 0x05, 0x23, 0x18, 0xc2, 0x37,
-       0xba, 0x03, 0xde, 0x33, 0xc4, 0xf7, 0xcb, 0xb0, 0x5b, 0x83, 0xd3, 0x97,
-       0xdf, 0xdb, 0x2e, 0x0f, 0x87, 0x06, 0x90, 0x1d, 0x03, 0xfa, 0x4a, 0x02,
-       0xa7, 0x32, 0x02, 0x5b, 0xfc, 0xcb, 0x50, 0x70, 0xba, 0xb1, 0xb7, 0x2c,
-       0xb3, 0x05, 0x7e, 0x77, 0xd5, 0x28, 0xec, 0x45, 0xc1, 0x6d, 0xd6, 0xf2,
-       0x12, 0xec, 0x96, 0x60, 0xc0, 0x4a, 0x8f, 0xb5, 0xcd, 0x1e, 0x13, 0x32,
-       0xbf, 0xc2, 0x94, 0x21, 0x20, 0x33, 0x9d, 0x46, 0xaa, 0xa0, 0x84, 0x1c,
-       0xba, 0x08, 0x6d, 0xd3, 0x6d, 0xd6, 0x35, 0x53, 0xfa, 0x7d, 0xc0, 0xba,
-       0x7a, 0x0a, 0x58, 0xcf, 0x3d, 0x1f, 0x5a, 0x2e, 0xb0, 0x3d, 0xfd, 0x6b,
-       0x15, 0x2e, 0x90, 0xe1, 0x61, 0xd1, 0x8d, 0xd1, 0x32, 0x70, 0xd3, 0x18,
-       0xec, 0x18, 0xe7, 0x16, 0xb9, 0x77, 0x3d, 0xe7, 0xae, 0x1d, 0x6d, 0x1b,
-       0x9c, 0x11, 0x92, 0x77, 0x93, 0x03, 0x40, 0xca, 0x3f, 0x0e, 0xe9, 0xae,
-       0x13, 0xd2, 0xd9, 0x53, 0xdb, 0x33, 0x59, 0xdb, 0xf3, 0x8a, 0x29, 0x5b,
-       0xac, 0x2a, 0x41, 0xf4, 0x96, 0xe0, 0x3e, 0xe9, 0x83, 0x77, 0x89, 0xf1,
-       0xde, 0xf5, 0x70, 0x5b, 0xa4, 0x7f, 0x98, 0x73, 0xa3, 0x41, 0x97, 0xf5,
-       0x5e, 0x51, 0xe0, 0x43, 0x4f, 0xcf, 0xef, 0xd2, 0xb6, 0x84, 0x4e, 0x90,
-       0x11, 0xfd, 0xe5, 0xfd, 0x73, 0x39, 0x62, 0x9c, 0xf4, 0xe3, 0xc0, 0x42,
-       0x34, 0xb7, 0x78, 0xf3, 0xf1, 0xb0, 0x83, 0xc6, 0xa8, 0xb7, 0xcc, 0x78,
-       0xc0, 0xa9, 0xc3, 0x49, 0xff, 0xb7, 0x0a, 0xdf, 0xd0, 0xf3, 0x81, 0x6f,
-       0x3f, 0xe2, 0x20, 0xe6, 0x5d, 0xc4, 0xd1, 0xf4, 0x36, 0xe3, 0x55, 0x67,
-       0x08, 0x4d, 0xde, 0xcf, 0x8d, 0xd7, 0x9c, 0x38, 0x1e, 0xe2, 0x7d, 0xee,
-       0x4c, 0xc6, 0xf1, 0x40, 0xf9, 0xab, 0xfb, 0x5a, 0x22, 0x3b, 0xfe, 0x8e,
-       0x42, 0x4b, 0x65, 0x7d, 0xf8, 0xac, 0x3f, 0x01, 0x5c, 0xa6, 0xc7, 0xf3,
-       0x62, 0x63, 0xe9, 0x92, 0x72, 0xa3, 0x19, 0x3c, 0x50, 0xb2, 0x31, 0x8f,
-       0x76, 0x45, 0x3c, 0x1b, 0x6f, 0x17, 0xf3, 0x62, 0x55, 0x39, 0x14, 0x6b,
-       0x26, 0x7b, 0x44, 0x38, 0x69, 0x89, 0x9e, 0x71, 0x10, 0x9b, 0x4a, 0xad,
-       0xf1, 0x05, 0xfe, 0xc3, 0xff, 0x57, 0xe3, 0x6c, 0xab, 0x0c, 0x5d, 0x71,
-       0x49, 0x79, 0x49, 0x03, 0xf5, 0x5e, 0x9f, 0x58, 0x3b, 0xa9, 0xd4, 0x5e,
-       0x3f, 0x2b, 0x7a, 0x27, 0x61, 0x37, 0x04, 0x81, 0x75, 0xd7, 0xe8, 0x69,
-       0x23, 0xb7, 0x20, 0x86, 0x52, 0xc9, 0xc5, 0x29, 0x5f, 0xe3, 0x77, 0x1e,
-       0x2c, 0x4f, 0xf0, 0x85, 0xd8, 0x19, 0x1f, 0x56, 0x8c, 0xcf, 0x53, 0x1b,
-       0x2c, 0x8c, 0x74, 0xaf, 0xad, 0xac, 0x89, 0x10, 0x2b, 0x4f, 0x14, 0xb3,
-       0x30, 0x88, 0xbf, 0x45, 0x41, 0x72, 0x76, 0x82, 0x98, 0x7f, 0xcb, 0x4f,
-       0x76, 0x7e, 0x6c, 0x92, 0x1c, 0x5a, 0x65, 0x82, 0x86, 0x0a, 0x2b, 0x48,
-       0x76, 0x1e, 0x81, 0x80, 0xe9, 0x59, 0x78, 0xc5, 0x8f, 0x20, 0xdc, 0x60,
-       0x63, 0x17, 0x71, 0x55, 0xc7, 0xf1, 0xa3, 0x95, 0x71, 0xfd, 0x19, 0xce,
-       0xaa, 0xf2, 0x57, 0x73, 0x9e, 0xe3, 0xa5, 0x36, 0xe4, 0x2a, 0x79, 0x0f,
-       0x67, 0x1d, 0xef, 0xfb, 0xad, 0x88, 0x7e, 0xfc, 0x93, 0xcf, 0xc6, 0x6e,
-       0xa4, 0x9d, 0x66, 0xe0, 0xe5, 0x1e, 0x17, 0x8b, 0x50, 0x68, 0x01, 0xed,
-       0x36, 0x70, 0x21, 0xbd, 0x10, 0xd3, 0x2d, 0xfa, 0xeb, 0xb8, 0xd3, 0x3f,
-       0xde, 0xaa, 0x63, 0xa2, 0xf7, 0x72, 0x56, 0x8d, 0x2b, 0xf5, 0xbc, 0x5f,
-       0x87, 0xd9, 0x8e, 0xe1, 0x19, 0x66, 0x89, 0xbf, 0x88, 0x39, 0xf9, 0x12,
-       0xcf, 0x6f, 0x59, 0x66, 0xc2, 0x5c, 0xe6, 0x9a, 0xee, 0x7c, 0x60, 0xa2,
-       0xa8, 0x39, 0x41, 0xce, 0xbe, 0xc4, 0xff, 0xe7, 0xca, 0x1a, 0x9f, 0x3e,
-       0xf1, 0x29, 0xd0, 0xde, 0xa1, 0xe3, 0xee, 0x5b, 0xed, 0xc4, 0xde, 0x76,
-       0xfa, 0x33, 0xc2, 0x3c, 0x78, 0x90, 0xf6, 0x9e, 0x2b, 0x7e, 0xcf, 0x58,
-       0xe5, 0x48, 0x57, 0x9f, 0xf0, 0x4e, 0x11, 0xe2, 0x79, 0xff, 0xef, 0xb4,
-       0x8f, 0x5d, 0x6e, 0x4b, 0xcc, 0xdc, 0x47, 0xcc, 0x68, 0xee, 0x59, 0x6f,
-       0x39, 0x63, 0x72, 0xe0, 0x7d, 0x1a, 0x91, 0x08, 0x86, 0xac, 0x44, 0x29,
-       0xb5, 0x77, 0x90, 0xdf, 0xdb, 0x41, 0xd6, 0xb2, 0x47, 0x65, 0x9e, 0xe7,
-       0xe5, 0x2c, 0x43, 0x26, 0x9a, 0xcd, 0xd4, 0xd0, 0x88, 0x90, 0x83, 0xcd,
-       0x42, 0xf6, 0xdf, 0x03, 0xe9, 0x9c, 0x10, 0xfa, 0xcc, 0xf5, 0x56, 0x57,
-       0x05, 0xa3, 0x59, 0x62, 0x54, 0xbf, 0xdf, 0x67, 0xa5, 0x2a, 0xef, 0x43,
-       0xd6, 0x95, 0x53, 0x09, 0x8c, 0x96, 0xa4, 0xef, 0x8a, 0x28, 0xbe, 0x96,
-       0xb6, 0x71, 0x22, 0xa9, 0x96, 0xbc, 0x90, 0x96, 0xb9, 0x1e, 0x73, 0x31,
-       0x73, 0x21, 0x81, 0x61, 0x62, 0xe9, 0x1f, 0x92, 0x23, 0xe8, 0x29, 0x9b,
-       0xc4, 0xb1, 0x8b, 0xfd, 0xa5, 0x28, 0x66, 0xc8, 0x4f, 0x75, 0xe9, 0x4e,
-       0x8c, 0x94, 0x64, 0xe7, 0x1b, 0x48, 0xe5, 0x8f, 0x30, 0x5e, 0x67, 0x17,
-       0x78, 0xd8, 0x5f, 0x6e, 0x63, 0x8c, 0xa4, 0xbb, 0x8a, 0x1c, 0x65, 0x76,
-       0x4b, 0x67, 0x17, 0x7d, 0x5b, 0x17, 0x90, 0xdb, 0xca, 0x19, 0xee, 0x53,
-       0xc0, 0xaa, 0x72, 0x5e, 0xf4, 0x95, 0xe7, 0x70, 0xfa, 0x73, 0x62, 0x53,
-       0x63, 0xd5, 0xc6, 0xe6, 0x12, 0x70, 0x67, 0xc9, 0x47, 0x8b, 0x67, 0xbc,
-       0x18, 0xc5, 0x45, 0xfa, 0x71, 0x02, 0xf7, 0x38, 0x21, 0x16, 0x79, 0xeb,
-       0xd4, 0x8e, 0xb8, 0x9e, 0x9f, 0x17, 0x6b, 0x19, 0xb7, 0x30, 0x02, 0x63,
-       0xd2, 0x37, 0x71, 0x36, 0x3e, 0x3c, 0x3f, 0x52, 0xe1, 0x5d, 0xfd, 0x6e,
-       0xa2, 0xdf, 0xc7, 0x1a, 0x07, 0x72, 0xc8, 0x17, 0x85, 0xc1, 0x26, 0xfa,
-       0xe1, 0xa4, 0x28, 0x0c, 0xc4, 0x20, 0x0b, 0xf7, 0x0a, 0x3a, 0x6b, 0x8c,
-       0x24, 0xb1, 0x60, 0x8e, 0xa7, 0x2d, 0xfc, 0x75, 0xe9, 0x29, 0xe3, 0x5c,
-       0xa4, 0x0e, 0xe6, 0x81, 0x08, 0xa2, 0x07, 0x2c, 0x34, 0x1f, 0x10, 0xc4,
-       0x5d, 0xa1, 0x33, 0xaa, 0xd7, 0x21, 0x81, 0x7d, 0xa3, 0x36, 0xee, 0xe9,
-       0x88, 0xe0, 0x42, 0x52, 0x0e, 0x5e, 0x21, 0x86, 0xfd, 0x26, 0x8e, 0x8d,
-       0x1e, 0x97, 0xae, 0x6b, 0x14, 0x22, 0x68, 0x8a, 0x23, 0xd2, 0x5e, 0x87,
-       0x06, 0xae, 0xdb, 0x59, 0x52, 0x3b, 0xed, 0xa0, 0xe0, 0x36, 0x40, 0xfa,
-       0x0f, 0x73, 0xdf, 0x53, 0x45, 0xa5, 0xea, 0xaf, 0xf5, 0x66, 0x3e, 0x30,
-       0xe5, 0xf4, 0x0e, 0x7e, 0x7e, 0x6b, 0xaa, 0xba, 0xff, 0xbc, 0x03, 0x36,
-       0x1a, 0x0f, 0x56, 0xf6, 0x9f, 0x7d, 0x8a, 0x16, 0x7c, 0x58, 0xd2, 0xf9,
-       0xa4, 0x54, 0x34, 0xf0, 0xfa, 0xdf, 0x13, 0x4a, 0xdd, 0xe4, 0xcb, 0xdc,
-       0xcb, 0xa2, 0x6d, 0x60, 0x94, 0xcf, 0x83, 0xe9, 0xa4, 0x9b, 0xa5, 0xcd,
-       0xe7, 0xcb, 0x51, 0xda, 0xc7, 0x5c, 0xf0, 0xb6, 0x19, 0x3b, 0x1c, 0x13,
-       0x75, 0xde, 0x0e, 0x63, 0x6b, 0x05, 0xab, 0x0e, 0x16, 0x8d, 0xd5, 0x63,
-       0x89, 0x17, 0x8a, 0x4d, 0xcc, 0xcd, 0x8d, 0x93, 0x16, 0xe7, 0xe9, 0xdc,
-       0x14, 0x88, 0x7a, 0xbd, 0x62, 0xe5, 0x64, 0x5f, 0x25, 0x5f, 0x07, 0xc6,
-       0x0d, 0xbc, 0xe9, 0xdf, 0x80, 0x48, 0x90, 0x15, 0x03, 0x93, 0x3a, 0x7f,
-       0xd6, 0x8a, 0xd5, 0x93, 0x8c, 0xdf, 0x7c, 0x9d, 0x3b, 0x37, 0x88, 0x48,
-       0xa0, 0xf3, 0xe5, 0xf3, 0x1c, 0xb2, 0x99, 0x43, 0xc7, 0xfe, 0x97, 0x1c,
-       0x7a, 0xa8, 0x64, 0x21, 0xd7, 0x52, 0xcd, 0x97, 0x5e, 0xc6, 0xe2, 0xef,
-       0x6b, 0x75, 0x7b, 0x3b, 0xc7, 0xa3, 0x07, 0x74, 0x0e, 0xf7, 0x32, 0x87,
-       0x35, 0x9e, 0x2d, 0xb1, 0x69, 0x1c, 0x76, 0x73, 0x10, 0x5a, 0x1f, 0x8e,
-       0x2a, 0xbc, 0xed, 0x2b, 0xf5, 0xf1, 0x32, 0xed, 0x13, 0x39, 0xf8, 0x2c,
-       0xf1, 0x08, 0x12, 0xd2, 0xbb, 0x9e, 0x52, 0x33, 0x7e, 0x2a, 0xfb, 0x2c,
-       0x79, 0xf9, 0x9c, 0xd0, 0xf7, 0x8f, 0xc2, 0x49, 0x6b, 0x3c, 0xf6, 0x5a,
-       0x57, 0x55, 0x70, 0x19, 0x12, 0xaf, 0xac, 0xd5, 0xf3, 0x35, 0x36, 0xa3,
-       0x68, 0x48, 0xce, 0xd2, 0x37, 0x72, 0xa8, 0x51, 0xa8, 0x25, 0xaf, 0xa6,
-       0xab, 0xb8, 0x2c, 0xb2, 0x36, 0xad, 0xe7, 0x59, 0xbd, 0xe3, 0xb2, 0xb0,
-       0xde, 0xac, 0xd6, 0xd1, 0xbd, 0xc4, 0x86, 0xe6, 0xb8, 0xcb, 0xdb, 0xa3,
-       0xd8, 0x47, 0x8c, 0x7a, 0x69, 0x17, 0xc3, 0xac, 0xab, 0xbb, 0x4b, 0xd2,
-       0x1d, 0x26, 0x4e, 0x77, 0xd7, 0x70, 0x3a, 0xcc, 0x5a, 0xba, 0x1b, 0x72,
-       0xaf, 0xae, 0xa5, 0x11, 0xe2, 0x94, 0x34, 0x56, 0xc1, 0xe9, 0x48, 0x0d,
-       0xa7, 0xbd, 0x15, 0x9c, 0xee, 0x36, 0x34, 0x3e, 0x35, 0xf6, 0x36, 0xf1,
-       0xbe, 0x67, 0xa3, 0x30, 0x7e, 0xc0, 0xfd, 0xc3, 0x05, 0xc3, 0x3d, 0x35,
-       0xec, 0xf5, 0x68, 0xec, 0x19, 0x69, 0xdc, 0x63, 0xf0, 0x6e, 0x2f, 0x88,
-       0x42, 0xae, 0x11, 0x32, 0x3b, 0x2c, 0x0a, 0x9d, 0xf3, 0x88, 0xbd, 0x67,
-       0x38, 0xa3, 0x81, 0xd8, 0xab, 0xfa, 0x4c, 0xcf, 0x8f, 0x11, 0x7b, 0xff,
-       0x29, 0xce, 0x46, 0x34, 0xd7, 0xea, 0xd8, 0x02, 0x8b, 0x4e, 0x68, 0xae,
-       0x8d, 0x92, 0x30, 0x2c, 0xe4, 0x4b, 0xc6, 0xe2, 0x04, 0x14, 0xb6, 0x92,
-       0xdb, 0xde, 0xf4, 0x76, 0xf9, 0x2d, 0xb8, 0x01, 0xa7, 0xbb, 0x0c, 0x68,
-       0x1d, 0x62, 0x4e, 0x54, 0xb1, 0x7b, 0x17, 0x39, 0xa3, 0x29, 0x90, 0x9d,
-       0x67, 0xa9, 0x37, 0xb6, 0xa4, 0x1b, 0x50, 0xf2, 0x86, 0xc3, 0x66, 0x56,
-       0x43, 0x9b, 0xe7, 0xae, 0x86, 0xae, 0x85, 0x71, 0x58, 0xed, 0x36, 0x1a,
-       0x8e, 0x7a, 0xb9, 0x13, 0x42, 0xe3, 0x15, 0xe8, 0x3a, 0x6e, 0xd3, 0x7e,
-       0x38, 0xf5, 0x81, 0x97, 0xf9, 0xc0, 0x7c, 0x5c, 0x9c, 0x75, 0xaa, 0xf5,
-       0xa0, 0x6f, 0x5c, 0x63, 0xec, 0x57, 0xea, 0x4d, 0xcf, 0xc0, 0x1d, 0xdd,
-       0x4a, 0x79, 0x4b, 0xa3, 0x88, 0x4c, 0xd8, 0xa8, 0x3b, 0xd8, 0x8a, 0x97,
-       0xba, 0x22, 0x38, 0x7b, 0xab, 0xfe, 0x3e, 0x8a, 0x7a, 0xe2, 0x70, 0xd3,
-       0xb5, 0x51, 0x2c, 0x99, 0xa8, 0x62, 0xb2, 0xc1, 0xfb, 0x89, 0xb8, 0x8b,
-       0x98, 0x9c, 0xe7, 0x9d, 0x11, 0xdb, 0x9c, 0x0c, 0xf6, 0xd2, 0xa6, 0xd7,
-       0xc9, 0xf1, 0xe7, 0x93, 0xbb, 0x66, 0x2c, 0xda, 0xbf, 0x62, 0x59, 0xa1,
-       0x73, 0x09, 0x22, 0x58, 0x34, 0x21, 0x07, 0x8e, 0xe9, 0x0a, 0x33, 0x6a,
-       0x89, 0x0d, 0xc4, 0xbb, 0xe6, 0x57, 0x93, 0x71, 0xba, 0x62, 0x69, 0xdb,
-       0xd0, 0xcd, 0xb8, 0xa4, 0xce, 0x24, 0x93, 0xd9, 0x51, 0x62, 0x7d, 0xdb,
-       0xf1, 0x08, 0xea, 0x0e, 0xfc, 0x97, 0x32, 0x02, 0xe6, 0x42, 0xb7, 0x22,
-       0x3e, 0x0b, 0x99, 0x7a, 0x72, 0xc8, 0x45, 0xc4, 0xf1, 0xd8, 0xfe, 0x9d,
-       0x6a, 0x09, 0xc7, 0xdf, 0xbb, 0xbe, 0x19, 0x6d, 0xcb, 0x64, 0x7e, 0x2b,
-       0xf7, 0x9f, 0x4d, 0x17, 0x3a, 0x13, 0x8c, 0xdd, 0x49, 0xb8, 0xb8, 0x6a,
-       0x4c, 0xe6, 0x8e, 0xa1, 0x0e, 0xcd, 0x13, 0x5e, 0xf6, 0x84, 0x88, 0xa1,
-       0xf1, 0x44, 0x0c, 0xfb, 0x8e, 0xeb, 0xfc, 0x8c, 0xc1, 0x1a, 0xf3, 0x66,
-       0x3b, 0x44, 0xa1, 0x9f, 0xf9, 0x39, 0xd3, 0x2f, 0xda, 0xd1, 0x3e, 0x2e,
-       0xa7, 0xb3, 0xc2, 0x0b, 0x1f, 0x80, 0x87, 0x76, 0xd6, 0x65, 0xfb, 0x84,
-       0x8b, 0x15, 0xba, 0x7e, 0x94, 0x75, 0xfe, 0xe8, 0x7a, 0x6a, 0xf0, 0x4e,
-       0xa1, 0x58, 0x5f, 0xa9, 0x79, 0xbd, 0x7c, 0xf5, 0xb1, 0xfe, 0x59, 0x62,
-       0xdd, 0xb8, 0xce, 0x2d, 0x03, 0x33, 0xfe, 0x25, 0xb5, 0x3d, 0x99, 0x65,
-       0xad, 0x9b, 0xc7, 0xbc, 0xaa, 0xe6, 0x13, 0x5a, 0x74, 0x6e, 0xcd, 0xab,
-       0xe5, 0x93, 0x85, 0x33, 0x8c, 0xdd, 0xe1, 0xff, 0x73, 0x5d, 0xb2, 0x90,
-       0x38, 0x60, 0xa0, 0xa5, 0x23, 0x8a, 0x6b, 0x96, 0xb6, 0x39, 0xcd, 0x88,
-       0xe2, 0x26, 0xdf, 0x41, 0x13, 0x31, 0xb1, 0x9f, 0x39, 0x85, 0xf9, 0xd5,
-       0x5c, 0x5b, 0xa9, 0xeb, 0x55, 0x2d, 0xd7, 0xf2, 0xa5, 0x04, 0x6b, 0x93,
-       0xae, 0x05, 0xbd, 0xac, 0x05, 0x16, 0x0e, 0x95, 0xb5, 0x6f, 0x1d, 0xbc,
-       0x4b, 0xce, 0x7e, 0xc5, 0xd7, 0xbe, 0x5d, 0x8c, 0x12, 0x73, 0xe3, 0x41,
-       0xe6, 0xc6, 0xda, 0xf2, 0x25, 0xb5, 0xc6, 0xd3, 0xf5, 0x38, 0x64, 0x3d,
-       0xb6, 0xc4, 0x4d, 0xe3, 0x72, 0xd0, 0x15, 0xa7, 0xee, 0x24, 0x36, 0x3b,
-       0x1b, 0x0d, 0xa5, 0x5e, 0x4e, 0xa7, 0x42, 0xea, 0x98, 0xcc, 0xdd, 0x42,
-       0xba, 0xef, 0x93, 0x9b, 0xd6, 0x9a, 0x51, 0x2c, 0xaf, 0xe5, 0x60, 0xb2,
-       0x96, 0x83, 0x1e, 0x73, 0xd0, 0x6d, 0x45, 0xf8, 0x09, 0x6d, 0x6c, 0x63,
-       0x0e, 0x6e, 0xa3, 0x4e, 0xfd, 0x7e, 0xa9, 0xc2, 0xfb, 0x99, 0x15, 0x22,
-       0x35, 0x73, 0x9e, 0xf9, 0xe4, 0x5e, 0xe6, 0x51, 0xaf, 0xb5, 0x65, 0xce,
-       0x33, 0x66, 0xab, 0x6b, 0xf9, 0xb4, 0xbb, 0xc6, 0xfb, 0x0f, 0xd4, 0xf2,
-       0x69, 0xf5, 0x97, 0xf2, 0x49, 0xf3, 0xd3, 0x0b, 0xbf, 0x43, 0xab, 0xd6,
-       0x22, 0x79, 0xa1, 0xef, 0x97, 0xb3, 0x10, 0xfe, 0xd8, 0xd7, 0x67, 0xd9,
-       0xb0, 0x82, 0xc6, 0x0a, 0xdf, 0x58, 0x41, 0x28, 0x7a, 0x59, 0x3b, 0x6d,
-       0x2f, 0x2f, 0xb2, 0xf4, 0x9d, 0x5e, 0xb7, 0x96, 0xb1, 0xd8, 0x99, 0xfe,
-       0x05, 0xce, 0xb6, 0x2a, 0xd5, 0x97, 0xbe, 0xa4, 0xde, 0x60, 0x5c, 0x62,
-       0xd4, 0x1f, 0xeb, 0x27, 0xb3, 0xa2, 0x7f, 0x52, 0xfb, 0xa6, 0x11, 0x11,
-       0x6f, 0xad, 0x58, 0x35, 0x09, 0xdc, 0x43, 0x3d, 0x73, 0x8e, 0x7e, 0x59,
-       0xe3, 0xcb, 0xa1, 0x35, 0xbc, 0xdb, 0x19, 0xdf, 0xc2, 0xc3, 0xe5, 0xaa,
-       0x7f, 0xf6, 0x95, 0x65, 0x66, 0x1a, 0x23, 0x58, 0xc3, 0x9a, 0x76, 0x98,
-       0x7c, 0xf1, 0x6f, 0xc9, 0x28, 0x5e, 0x24, 0x5f, 0xbc, 0xc4, 0xfb, 0x1d,
-       0xaa, 0xde, 0xcf, 0x9f, 0x45, 0x2a, 0x73, 0x5a, 0xf3, 0x05, 0xb5, 0xf7,
-       0xa1, 0x72, 0x9b, 0x7f, 0x9a, 0x78, 0x7c, 0xb0, 0x24, 0x07, 0xfa, 0x78,
-       0x47, 0xbb, 0x5b, 0xce, 0x0e, 0x0a, 0x81, 0x8d, 0x49, 0x38, 0x66, 0xa0,
-       0xef, 0xe1, 0x52, 0xe3, 0x66, 0xe8, 0x87, 0x02, 0xfa, 0x78, 0xd7, 0x95,
-       0xac, 0x71, 0x8f, 0x95, 0xbf, 0xa4, 0xeb, 0xb0, 0xad, 0xa4, 0xb9, 0x4a,
-       0xa9, 0x8e, 0xb4, 0xd6, 0x4a, 0x79, 0x71, 0xb3, 0xe6, 0x94, 0x48, 0x14,
-       0xca, 0x6f, 0x4b, 0x2c, 0x61, 0xec, 0xf3, 0xc4, 0xd7, 0xbb, 0x5e, 0x3d,
-       0x79, 0x21, 0x24, 0xaf, 0xf7, 0x90, 0xb7, 0x7b, 0x45, 0x5f, 0x85, 0xcf,
-       0xb3, 0x22, 0x3b, 0x69, 0x8b, 0x1e, 0x6a, 0x94, 0x0d, 0xcc, 0x33, 0x77,
-       0xe1, 0x3c, 0x62, 0x4a, 0xe3, 0xca, 0xc0, 0x0f, 0xfc, 0xb5, 0xe4, 0xfc,
-       0x1b, 0xe8, 0x2b, 0xf2, 0x52, 0x05, 0x8b, 0x37, 0x50, 0x27, 0x55, 0xb1,
-       0xf8, 0x43, 0x62, 0x31, 0x57, 0xc3, 0x62, 0x24, 0x48, 0x92, 0xef, 0x3e,
-       0xc7, 0x62, 0xef, 0x1f, 0xe0, 0xf7, 0x2f, 0x62, 0x6e, 0xbd, 0xe6, 0xf7,
-       0xc8, 0x1c, 0xe6, 0x58, 0x9f, 0x3b, 0x02, 0xf2, 0xb0, 0xc6, 0x9b, 0x8d,
-       0xbe, 0x47, 0xeb, 0xb1, 0xe1, 0xd1, 0x18, 0x6e, 0x7e, 0x54, 0xa9, 0xd7,
-       0x7c, 0x78, 0x2d, 0xe4, 0xa2, 0x5f, 0xa4, 0x27, 0x70, 0xa6, 0x25, 0xe9,
-       0xee, 0x83, 0xee, 0xa3, 0x7a, 0xad, 0xdb, 0x8b, 0x5a, 0xa3, 0x84, 0xd4,
-       0x28, 0xb2, 0xff, 0x7d, 0xe6, 0xfa, 0xa6, 0xa4, 0xcc, 0xef, 0xac, 0x70,
-       0x7f, 0xca, 0xa7, 0x16, 0xdf, 0x6b, 0x98, 0x32, 0xdb, 0x6e, 0x54, 0xb1,
-       0x76, 0x4d, 0x0d, 0x6b, 0x5f, 0x9b, 0xb2, 0xf1, 0x4b, 0xd6, 0x85, 0xcd,
-       0xe9, 0x28, 0x56, 0xeb, 0x1a, 0xef, 0xe8, 0x5e, 0x2a, 0x8a, 0x7e, 0xc6,
-       0xc5, 0x58, 0xaa, 0xa8, 0x37, 0xa8, 0x3b, 0x18, 0xcb, 0x55, 0xec, 0xa7,
-       0xce, 0x50, 0x9f, 0xdc, 0x68, 0x56, 0x7b, 0xa9, 0xd1, 0x9a, 0x3e, 0xb9,
-       0xb1, 0xac, 0xf3, 0xd1, 0x25, 0x06, 0xa2, 0x38, 0xcd, 0x35, 0x7b, 0xfc,
-       0xaa, 0x3e, 0x79, 0x1d, 0xa9, 0xac, 0xd6, 0x27, 0x2e, 0x79, 0xbf, 0x54,
-       0xd1, 0x27, 0x5a, 0x8f, 0x68, 0x2d, 0xa2, 0xfb, 0x85, 0x6e, 0xf6, 0x0b,
-       0x72, 0x5a, 0xeb, 0x15, 0xa3, 0x5b, 0xfa, 0x86, 0x19, 0x61, 0x8d, 0xcc,
-       0x30, 0x96, 0x97, 0x61, 0xd7, 0x23, 0x4d, 0x8c, 0x45, 0x23, 0x76, 0x38,
-       0x2b, 0xac, 0x25, 0x9e, 0xe6, 0x4f, 0x6a, 0x90, 0xdf, 0xd3, 0x2e, 0x47,
-       0x35, 0xc7, 0x32, 0xfe, 0x73, 0xe3, 0xff, 0x5e, 0x1b, 0xd7, 0xf3, 0xb3,
-       0xac, 0xd1, 0x7a, 0xcd, 0x8f, 0xac, 0x2a, 0xee, 0xd1, 0xdc, 0xe4, 0xfd,
-       0x19, 0x2e, 0xd0, 0xc6, 0x37, 0xbf, 0x14, 0x47, 0x9b, 0x79, 0xa1, 0xe3,
-       0xf8, 0x09, 0xd7, 0xea, 0x78, 0xdb, 0x78, 0x87, 0x3e, 0x3e, 0x47, 0x1f,
-       0xff, 0xf2, 0xd1, 0x80, 0xdc, 0x84, 0x4f, 0x0d, 0xfa, 0x78, 0x3b, 0x71,
-       0xf3, 0x63, 0xff, 0x7a, 0xb4, 0xb7, 0x26, 0xdd, 0x0f, 0xcc, 0xb9, 0x7a,
-       0x0b, 0x7b, 0x09, 0x7d, 0xa7, 0xe8, 0x67, 0xdd, 0xeb, 0x1c, 0xa3, 0x7f,
-       0x99, 0xcb, 0x15, 0x0d, 0xd2, 0x6e, 0x56, 0xfd, 0xdb, 0x51, 0xf3, 0x6f,
-       0x66, 0x6a, 0x1b, 0xcf, 0xd1, 0xf5, 0x54, 0xeb, 0xd1, 0xfb, 0x2b, 0xfd,
-       0x92, 0x19, 0xdc, 0x5a, 0x89, 0x55, 0x5d, 0x90, 0xb7, 0x5e, 0x2c, 0xea,
-       0x9a, 0xdd, 0xcf, 0x9a, 0xcd, 0x9e, 0xc9, 0x94, 0x83, 0x83, 0x48, 0x4d,
-       0x73, 0xaf, 0xbd, 0xa7, 0x91, 0x0a, 0xd9, 0x4f, 0x0d, 0x9d, 0x67, 0xef,
-       0x93, 0x31, 0x64, 0x6e, 0xa6, 0xa2, 0x27, 0x6f, 0xad, 0xd5, 0xe9, 0xfe,
-       0x9a, 0xae, 0xbc, 0xbf, 0x76, 0x4e, 0x9e, 0xba, 0x72, 0xee, 0x1c, 0x7d,
-       0x97, 0xcb, 0x2d, 0xfd, 0xac, 0xfb, 0x80, 0x37, 0xfc, 0x9f, 0x29, 0x2c,
-       0x6c, 0xac, 0xe8, 0x8e, 0xcf, 0xef, 0x6c, 0x89, 0x8d, 0xe3, 0x17, 0x55,
-       0xa6, 0xe3, 0x2e, 0x13, 0xf5, 0x4a, 0x59, 0xcb, 0x42, 0x14, 0x4b, 0x33,
-       0xaa, 0x18, 0x97, 0x05, 0x0d, 0xca, 0x96, 0xe0, 0x6e, 0xc6, 0x07, 0xb6,
-       0x15, 0x0c, 0x5a, 0x23, 0x45, 0x39, 0xc4, 0x5e, 0x2e, 0xcf, 0x3e, 0x2c,
-       0xdc, 0x0f, 0xad, 0x6f, 0xf5, 0x79, 0x77, 0xeb, 0x3e, 0x8e, 0xef, 0x83,
-       0xb4, 0x67, 0xee, 0xdc, 0x10, 0x8f, 0x95, 0xfe, 0x4a, 0x3d, 0x16, 0x97,
-       0x39, 0xbd, 0x47, 0x84, 0x73, 0x9e, 0xa8, 0xe8, 0xe7, 0x41, 0xad, 0x9f,
-       0x5d, 0x8d, 0xc7, 0x31, 0x4f, 0xce, 0x9e, 0x40, 0x6a, 0xe0, 0x82, 0x29,
-       0xfb, 0x63, 0xd4, 0xcc, 0xeb, 0x6a, 0x7b, 0xad, 0xa8, 0xed, 0xd5, 0x36,
-       0xf5, 0x10, 0xed, 0xd6, 0x78, 0xac, 0xd6, 0x37, 0x23, 0x88, 0xa1, 0x69,
-       0xd4, 0x63, 0x8d, 0x4f, 0xe6, 0x8e, 0xb0, 0xce, 0xc4, 0x8e, 0xef, 0xa8,
-       0xd8, 0xfb, 0xba, 0xff, 0xa4, 0x59, 0xc9, 0xef, 0x13, 0xba, 0x4e, 0x58,
-       0xb0, 0x58, 0x77, 0xae, 0x1c, 0x93, 0xe1, 0x16, 0xf1, 0x91, 0x5a, 0x92,
-       0xf4, 0x12, 0xab, 0x85, 0xd6, 0x3e, 0x49, 0x6a, 0x9f, 0x18, 0x32, 0x27,
-       0xfe, 0x85, 0xf6, 0x69, 0xfd, 0xa6, 0x6b, 0xa1, 0x83, 0x96, 0x51, 0xaf,
-       0xb3, 0xcd, 0x48, 0x52, 0x3b, 0x3b, 0x68, 0xfe, 0x6c, 0x3f, 0x4b, 0xac,
-       0xe2, 0x3e, 0x75, 0x07, 0x1c, 0x5c, 0x33, 0x26, 0x9d, 0xa3, 0xb8, 0x40,
-       0x0e, 0xf7, 0x06, 0xb5, 0x4e, 0xbc, 0x3a, 0x9d, 0x64, 0x4d, 0x77, 0xd0,
-       0xf5, 0xd9, 0x3e, 0x31, 0xd4, 0x8d, 0xe9, 0xb3, 0x0b, 0xd3, 0x26, 0xe3,
-       0xe4, 0x98, 0x47, 0x39, 0xee, 0xa2, 0xfd, 0x44, 0x23, 0xfb, 0x2d, 0xa5,
-       0xfa, 0x59, 0x0f, 0x2c, 0xd6, 0xdc, 0x5e, 0xb4, 0x0f, 0x8e, 0x88, 0xd4,
-       0x40, 0x23, 0x52, 0xfd, 0x31, 0x78, 0xce, 0x3a, 0xa1, 0x7f, 0x63, 0x98,
-       0xd3, 0x24, 0xc0, 0xe3, 0xc5, 0x3f, 0xe7, 0xba, 0xa4, 0xb3, 0x85, 0x18,
-       0x6b, 0xf9, 0xd3, 0x54, 0xbe, 0x05, 0xa9, 0x21, 0x07, 0x9e, 0xfb, 0x3a,
-       0xe7, 0x15, 0xbe, 0x30, 0xef, 0xd9, 0xca, 0x3c, 0xfa, 0xe2, 0x7a, 0xad,
-       0xb5, 0x94, 0x7a, 0x82, 0x7a, 0xab, 0xe0, 0x68, 0xce, 0x11, 0x18, 0xf6,
-       0xf5, 0x9e, 0x3d, 0xae, 0x05, 0x99, 0xb8, 0x03, 0x9f, 0xa8, 0x42, 0x3c,
-       0xec, 0x8c, 0x54, 0x7e, 0x97, 0x90, 0x4e, 0x8e, 0xdc, 0x36, 0x5d, 0xed,
-       0xb3, 0xd8, 0x17, 0x29, 0xf5, 0x22, 0xb9, 0xe9, 0x09, 0x6a, 0x9f, 0xe1,
-       0xa9, 0x4f, 0xd4, 0x34, 0xb5, 0xcd, 0x88, 0xa7, 0xe7, 0x55, 0x39, 0xe8,
-       0xb0, 0xa3, 0xd4, 0xe3, 0xfc, 0x6e, 0xcf, 0xd4, 0x1c, 0x2f, 0xf1, 0x3c,
-       0x72, 0xc2, 0xed, 0xde, 0x7f, 0xab, 0xcd, 0x5f, 0x9a, 0xab, 0xd4, 0x18,
-       0x6d, 0x78, 0xcb, 0xc7, 0xfd, 0x11, 0x24, 0x73, 0xb3, 0xf4, 0xcf, 0x99,
-       0xe5, 0xb2, 0x7f, 0x8a, 0xf7, 0x5c, 0x2f, 0x64, 0x96, 0x77, 0xec, 0x9d,
-       0x07, 0xcd, 0xb5, 0x92, 0xf9, 0x60, 0x78, 0x75, 0x7c, 0xfe, 0x99, 0x2f,
-       0x13, 0x47, 0xf8, 0xbe, 0x39, 0xa3, 0xf7, 0x50, 0xaa, 0xc7, 0xd7, 0x3d,
-       0xfe, 0x08, 0x7b, 0xfc, 0x82, 0x6a, 0xf0, 0xde, 0x50, 0xcf, 0x75, 0xc8,
-       0xfe, 0x11, 0xe1, 0x71, 0xad, 0xcb, 0xba, 0xa0, 0xfb, 0xaa, 0x11, 0xf6,
-       0x55, 0x2e, 0x9e, 0x26, 0xc7, 0x9c, 0x2c, 0x77, 0xe2, 0xf9, 0xb2, 0x87,
-       0x67, 0x58, 0x3f, 0x9e, 0x2a, 0x5b, 0xd8, 0xfa, 0x88, 0xcc, 0x58, 0x62,
-       0x27, 0xce, 0xfb, 0xd2, 0xf9, 0x1e, 0xed, 0x36, 0x03, 0xb9, 0x7f, 0x25,
-       0x79, 0x85, 0x67, 0x14, 0x72, 0x66, 0x8b, 0xb0, 0x03, 0x1b, 0xdf, 0xe9,
-       0x30, 0x70, 0x38, 0x3e, 0x84, 0xbe, 0xf6, 0xbb, 0xf9, 0xb2, 0xd0, 0x7a,
-       0x40, 0xd7, 0x6a, 0xdd, 0x6f, 0x34, 0xe3, 0x4e, 0xf2, 0xd9, 0xd5, 0x4b,
-       0x43, 0xfc, 0x3a, 0xdd, 0xd6, 0xf9, 0x92, 0xa0, 0x66, 0x68, 0x91, 0x59,
-       0xe0, 0xa7, 0xd8, 0xc8, 0x7e, 0x21, 0xb3, 0x6c, 0x7f, 0xad, 0x37, 0xff,
-       0x29, 0x56, 0xea, 0x3e, 0xc3, 0x6f, 0x66, 0xbd, 0xab, 0xc6, 0xe1, 0x70,
-       0xc5, 0x8f, 0x06, 0x9a, 0x0e, 0x16, 0x54, 0xbd, 0x27, 0x73, 0x93, 0x15,
-       0x1d, 0xb5, 0xd0, 0xb9, 0x91, 0x7d, 0x40, 0xc3, 0x01, 0xcf, 0x5d, 0x27,
-       0x14, 0x63, 0xb1, 0x9b, 0xb1, 0x48, 0x86, 0x31, 0xb6, 0xdb, 0xcd, 0x41,
-       0x32, 0x6c, 0x16, 0x79, 0x71, 0x8b, 0xae, 0xb1, 0x75, 0xf5, 0xec, 0xbf,
-       0x59, 0x53, 0x27, 0x0d, 0xf6, 0x23, 0xba, 0x1f, 0x8f, 0x62, 0x2a, 0xdd,
-       0xc6, 0x3e, 0x29, 0x8a, 0xed, 0xe9, 0x1e, 0xea, 0x1a, 0x03, 0xc6, 0xc1,
-       0x4b, 0x6a, 0xe5, 0x17, 0xfa, 0x88, 0x4d, 0xe3, 0x9a, 0xc3, 0x6c, 0xb1,
-       0x91, 0xf9, 0x9b, 0x59, 0x46, 0xb1, 0x76, 0x8b, 0xee, 0xe1, 0xf5, 0x1d,
-       0x1c, 0xf6, 0xc7, 0x06, 0xa6, 0x17, 0x38, 0xd8, 0xd5, 0x2d, 0x13, 0x05,
-       0xe8, 0x5c, 0xfe, 0x6a, 0x4d, 0x81, 0x93, 0xfd, 0xbd, 0x3a, 0x03, 0x67,
-       0x03, 0x6d, 0x91, 0x75, 0x4a, 0xb5, 0xa6, 0x4d, 0xe4, 0x2a, 0xf5, 0x26,
-       0xe1, 0x64, 0xd9, 0xff, 0xcd, 0x4c, 0xb1, 0x27, 0x3b, 0xa8, 0xd4, 0x4e,
-       0x62, 0xe9, 0xe3, 0x8e, 0xe1, 0x43, 0xec, 0xc4, 0xf7, 0xb6, 0xb2, 0xb7,
-       0xfa, 0x3a, 0xdb, 0xb7, 0xb7, 0x8a, 0xdf, 0x24, 0x7f, 0x1b, 0xdd, 0x09,
-       0xe8, 0x7e, 0xa7, 0xa0, 0x22, 0x9e, 0x37, 0xfb, 0x38, 0xb5, 0xe0, 0x6f,
-       0x96, 0x75, 0xc1, 0x9d, 0x5f, 0xf5, 0xd5, 0x6a, 0x6a, 0xa9, 0x8f, 0xc8,
-       0xf9, 0x61, 0xe5, 0x73, 0xcc, 0x59, 0x37, 0x7e, 0x49, 0x6d, 0xa6, 0x6f,
-       0x7a, 0xaa, 0x76, 0x59, 0xf5, 0x01, 0x9b, 0xc4, 0x6b, 0xe1, 0xac, 0xf9,
-       0x03, 0x36, 0x7d, 0x5e, 0xef, 0x62, 0xce, 0x9a, 0xf1, 0xc5, 0xb4, 0x51,
-       0xba, 0xd3, 0x15, 0xfc, 0xf8, 0xf8, 0xc8, 0x1b, 0x4e, 0xcc, 0x47, 0xa1,
-       0x93, 0x39, 0x36, 0xfb, 0x4f, 0x1c, 0x6b, 0x5f, 0x0a, 0xfc, 0xa6, 0xfc,
-       0x5d, 0xf2, 0xbe, 0xd1, 0xd5, 0x82, 0xc2, 0x0c, 0x6d, 0x3c, 0xf4, 0x75,
-       0x62, 0x32, 0x3f, 0x86, 0xfb, 0xd8, 0x46, 0xe0, 0x59, 0xd6, 0xdb, 0x63,
-       0xe4, 0x8c, 0xe6, 0xb4, 0x83, 0x32, 0x9f, 0x8f, 0x94, 0x92, 0x83, 0xa7,
-       0x99, 0xb7, 0xc7, 0xf9, 0x7c, 0x94, 0xf7, 0xdc, 0x4a, 0x7d, 0x77, 0xef,
-       0x78, 0x3d, 0xbe, 0x3d, 0x1e, 0xc3, 0xd6, 0xf1, 0x80, 0x9a, 0x02, 0xb7,
-       0x35, 0x72, 0xdf, 0x57, 0x89, 0xe7, 0xcd, 0x4b, 0xaf, 0xc3, 0x5a, 0x27,
-       0xe9, 0xde, 0xcd, 0xdc, 0xab, 0x3b, 0x08, 0xc7, 0x21, 0x8e, 0xfe, 0xd9,
-       0x5b, 0x2e, 0xd0, 0x44, 0xbd, 0xbf, 0xd4, 0x12, 0xeb, 0xc7, 0x57, 0x57,
-       0x9e, 0x47, 0xd2, 0x79, 0x6a, 0x0b, 0x62, 0xb2, 0x44, 0x4c, 0x32, 0x36,
-       0x4f, 0x97, 0x88, 0x4b, 0x6a, 0xc3, 0x93, 0x25, 0x8d, 0x6d, 0x1f, 0xcf,
-       0x75, 0x0c, 0xa9, 0x2a, 0x56, 0x3e, 0x55, 0x4f, 0x78, 0xaf, 0x45, 0x50,
-       0x6f, 0xe9, 0xdf, 0x76, 0xf0, 0x66, 0x31, 0xe1, 0x6c, 0x28, 0x6b, 0x3c,
-       0xfc, 0x6d, 0x0d, 0x0f, 0x6f, 0x47, 0xaa, 0xfa, 0x44, 0xce, 0x4c, 0x42,
-       0x73, 0xdd, 0x62, 0xe7, 0xa6, 0xd2, 0xf0, 0x34, 0x7d, 0x9f, 0xa7, 0xc6,
-       0x76, 0xdf, 0x67, 0xc8, 0xc7, 0xa6, 0x8c, 0x2e, 0xf6, 0xd4, 0xf4, 0x87,
-       0xbe, 0x33, 0xf3, 0x37, 0x2d, 0x3b, 0x75, 0x4c, 0x8e, 0x17, 0x71, 0x2b,
-       0xfb, 0x1e, 0x3f, 0x44, 0xf5, 0x6e, 0x53, 0xbc, 0xf3, 0x43, 0xbc, 0xf3,
-       0x0f, 0xf9, 0x3c, 0x51, 0x4a, 0x66, 0x7b, 0x78, 0xe7, 0x27, 0xf9, 0x3c,
-       0x59, 0x6a, 0xad, 0xd3, 0x67, 0x4c, 0x4e, 0x85, 0xac, 0x03, 0x2f, 0xab,
-       0x52, 0xbc, 0x12, 0x0e, 0xf6, 0xc0, 0x06, 0x1a, 0x0e, 0xce, 0xf1, 0xb3,
-       0xfe, 0x6d, 0x49, 0xd7, 0x38, 0xcd, 0xf9, 0x83, 0xba, 0x26, 0x67, 0xae,
-       0x14, 0x97, 0xd4, 0x47, 0x9e, 0x0c, 0x9f, 0xc6, 0x29, 0x35, 0x1f, 0xa9,
-       0x99, 0xf9, 0x42, 0x4e, 0xaf, 0x30, 0xa4, 0xbb, 0xc8, 0xac, 0x72, 0x75,
-       0x67, 0x8d, 0xab, 0xbd, 0xa9, 0x1b, 0xeb, 0xaa, 0x77, 0x48, 0x39, 0x47,
-       0x30, 0x8f, 0xd8, 0xd7, 0x35, 0x55, 0xf3, 0x8f, 0xfe, 0x4c, 0x7d, 0x67,
-       0x85, 0x09, 0x93, 0x7e, 0x08, 0x6f, 0xd5, 0x63, 0xd1, 0xda, 0x6f, 0x3e,
-       0x29, 0x5f, 0xf7, 0x82, 0xd3, 0xf1, 0x1e, 0x7e, 0xa7, 0x7b, 0xc1, 0x4f,
-       0x54, 0x2e, 0xde, 0xf3, 0x19, 0x67, 0x15, 0xd0, 0x45, 0xed, 0xf1, 0x3e,
-       0x39, 0xa1, 0x83, 0x2a, 0x4a, 0xe0, 0x14, 0xfb, 0xb0, 0x23, 0x5d, 0x49,
-       0x67, 0x17, 0xf7, 0x0b, 0x1d, 0x87, 0x5c, 0xb0, 0x93, 0x3a, 0x93, 0x73,
-       0xca, 0x1d, 0x5c, 0xa3, 0xb9, 0xf0, 0x3e, 0xfa, 0xe6, 0xb7, 0xed, 0x96,
-       0xe7, 0x63, 0x57, 0xe9, 0x39, 0xc3, 0xf2, 0xb4, 0x5f, 0x52, 0x99, 0x5d,
-       0xb4, 0xe7, 0x2c, 0xed, 0x89, 0x78, 0x21, 0xb9, 0x31, 0x55, 0x59, 0x5f,
-       0xb0, 0xb4, 0x1d, 0x15, 0x7b, 0x38, 0xa6, 0x39, 0x4f, 0xf6, 0x9f, 0x62,
-       0x8d, 0xdd, 0x02, 0xfd, 0x3b, 0x85, 0xb6, 0xa1, 0x2d, 0xb1, 0x85, 0xf6,
-       0x1c, 0x8e, 0x57, 0xf8, 0x94, 0xdf, 0xf1, 0xbc, 0x92, 0xb1, 0xbe, 0x9e,
-       0x78, 0xbf, 0x22, 0x9d, 0x60, 0x6c, 0xbb, 0xa8, 0xef, 0xab, 0x71, 0xde,
-       0x57, 0xc1, 0xf2, 0xff, 0x00, 0xb0, 0x60, 0x72, 0xf9, 0x60, 0x17, 0x00,
-       0x00, 0x00 };
-
-static const u32 bnx2_TPAT_b06FwData[(0x0/4) + 1] = { 0x0 };
-static const u32 bnx2_TPAT_b06FwRodata[(0x0/4) + 1] = { 0x0 };
-
-static struct fw_info bnx2_tpat_fw_06 = {
-       /* Firmware version: 4.6.16 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0x10,
-
-       .start_addr                     = 0x08000488,
-
-       .text_addr                      = 0x08000400,
-       .text_len                       = 0x175c,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_TPAT_b06FwText,
-       .gz_text_len                    = sizeof(bnx2_TPAT_b06FwText),
-
-       .data_addr                      = 0x00000000,
-       .data_len                       = 0x0,
-       .data_index                     = 0x0,
-       .data                           = bnx2_TPAT_b06FwData,
-
-       .sbss_addr                      = 0x08001b80,
-       .sbss_len                       = 0x44,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08001bc4,
-       .bss_len                        = 0x450,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x00000000,
-       .rodata_len                     = 0x0,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_TPAT_b06FwRodata,
-};
-
 /* Initialized Values for the TX Patch-up Processor. */
 static const struct cpu_reg cpu_reg_tpat = {
        .mode = BNX2_TPAT_CPU_MODE,
@@ -3570,882 +71,6 @@ static const struct cpu_reg cpu_reg_tpat = {
        .mips_view_base = 0x8000000,
 };
 
-static u8 bnx2_TXP_b06FwText[] = {
-       0xad, 0x7b, 0x0f, 0x70, 0x54, 0xe7, 0x75, 0xef, 0xef, 0xee, 0x1f, 0x69,
-       0x57, 0x5a, 0xad, 0x2e, 0x78, 0xc1, 0xab, 0x54, 0x29, 0x7b, 0xd9, 0xbb,
-       0xd2, 0x1a, 0x09, 0xb8, 0x0b, 0xc2, 0x88, 0xe8, 0xd6, 0x6c, 0x85, 0x00,
-       0x21, 0x64, 0x2c, 0x63, 0x25, 0x15, 0x7d, 0x9e, 0x5a, 0x0f, 0x64, 0x23,
-       0xdb, 0xd8, 0x16, 0x35, 0x6d, 0xe5, 0xd4, 0xad, 0xd6, 0x92, 0xc0, 0xc2,
-       0xac, 0xb8, 0x22, 0x0b, 0x11, 0xee, 0xf4, 0xbd, 0xc8, 0x96, 0xb0, 0xb0,
-       0xb3, 0x62, 0xed, 0xa4, 0xaf, 0xd3, 0xcc, 0x34, 0xe3, 0x7d, 0xfe, 0x83,
-       0x49, 0x1e, 0xb6, 0xd3, 0x4e, 0xe7, 0x3d, 0xa7, 0xf3, 0xde, 0x84, 0x17,
-       0x63, 0x62, 0xa7, 0x89, 0xed, 0xe6, 0xa5, 0xf3, 0x44, 0xea, 0xf8, 0xbe,
-       0xdf, 0xb9, 0x77, 0x17, 0x88, 0x9b, 0x4e, 0x67, 0x3a, 0x4f, 0x33, 0x9a,
-       0xd5, 0xde, 0x3f, 0xdf, 0x77, 0xce, 0xf9, 0xce, 0xf9, 0x9d, 0xdf, 0x39,
-       0xdf, 0xa7, 0x06, 0xa0, 0x0a, 0xa5, 0x9f, 0x1a, 0xfe, 0xb6, 0x0c, 0x0d,
-       0x1f, 0x4a, 0xad, 0xb9, 0x75, 0x0d, 0xff, 0xbc, 0x15, 0x6a, 0x85, 0x4f,
-       0x6e, 0xde, 0xaa, 0x00, 0xfd, 0x3f, 0xc6, 0xbf, 0xeb, 0xe7, 0xf3, 0xff,
-       0xbe, 0xd7, 0x9c, 0x1f, 0x2f, 0xa0, 0x96, 0xe5, 0x92, 0x5f, 0x04, 0x3c,
-       0xe6, 0xcc, 0x17, 0xda, 0x75, 0x04, 0xbc, 0x66, 0xaf, 0xb9, 0x4f, 0x07,
-       0xd2, 0xf9, 0xa6, 0xd8, 0x16, 0xfc, 0xd2, 0xce, 0x44, 0x7c, 0x90, 0xeb,
-       0x9f, 0x37, 0x3f, 0x19, 0xf9, 0xf6, 0x46, 0xed, 0xe3, 0x19, 0x2f, 0x02,
-       0xaa, 0x79, 0x1a, 0x6a, 0x03, 0x02, 0xf5, 0x7c, 0xe7, 0xcf, 0x1b, 0xfd,
-       0x5e, 0x84, 0xcb, 0x63, 0xb5, 0x62, 0xcc, 0x42, 0x26, 0x60, 0x0e, 0xa1,
-       0x72, 0x03, 0xf0, 0x5e, 0x36, 0x61, 0x8c, 0x01, 0x53, 0x1e, 0x33, 0x11,
-       0x7b, 0x05, 0x06, 0x0e, 0x17, 0x62, 0xe8, 0xe0, 0xef, 0x0e, 0xeb, 0x53,
-       0x3b, 0xe6, 0x47, 0xc6, 0xcb, 0xe7, 0xf6, 0xb6, 0x00, 0x5b, 0xb3, 0x06,
-       0x8e, 0x58, 0x08, 0xd4, 0x99, 0x8f, 0x63, 0x13, 0x3f, 0xc3, 0xe6, 0x30,
-       0xde, 0x9a, 0x8c, 0xc7, 0x9e, 0x83, 0xd6, 0xa7, 0x7b, 0xb5, 0x61, 0xa0,
-       0x69, 0x70, 0x40, 0xd1, 0xfa, 0xdf, 0x56, 0xb4, 0x9e, 0x49, 0x05, 0x01,
-       0x85, 0xcf, 0x35, 0xe5, 0xe5, 0x73, 0x18, 0xab, 0xf2, 0x01, 0x5c, 0xf2,
-       0xca, 0xfc, 0xbf, 0x45, 0x7b, 0x2b, 0xf0, 0xe9, 0xad, 0x18, 0xa7, 0x0c,
-       0x7e, 0x53, 0xc1, 0xb3, 0x2d, 0x89, 0xe8, 0x28, 0xe4, 0x7e, 0x0c, 0x5b,
-       0x0a, 0xf2, 0xa9, 0x51, 0x6b, 0xdb, 0x1e, 0x37, 0x6c, 0xfb, 0x8c, 0x51,
-       0x89, 0x8c, 0xaa, 0x45, 0x01, 0x05, 0xa3, 0x86, 0x07, 0x69, 0xb5, 0x3d,
-       0xe6, 0x83, 0x16, 0xbd, 0x17, 0xff, 0x4c, 0x9d, 0xd3, 0x49, 0x3f, 0xdc,
-       0xe7, 0xfb, 0x51, 0x89, 0xa2, 0xea, 0x5a, 0xed, 0xd9, 0xac, 0x6d, 0x9f,
-       0xd7, 0x7d, 0x38, 0x43, 0xfb, 0x8c, 0xe6, 0xff, 0xd9, 0x2e, 0xd2, 0x36,
-       0xe3, 0x7a, 0x79, 0xfe, 0x00, 0x66, 0x54, 0xdb, 0x9e, 0xe5, 0xbd, 0x23,
-       0xf9, 0xb2, 0x9d, 0x6d, 0xdb, 0xa3, 0xdb, 0xf6, 0x3e, 0xfd, 0x17, 0xf6,
-       0xde, 0x5f, 0x79, 0xd6, 0xb6, 0x9f, 0x32, 0x6e, 0xc2, 0xd9, 0x5c, 0x87,
-       0xd2, 0x35, 0xbf, 0x3c, 0xbc, 0x63, 0xda, 0xc6, 0x79, 0x03, 0xaa, 0xc7,
-       0xdc, 0xa6, 0xec, 0x98, 0xef, 0x54, 0xb6, 0x16, 0x76, 0x2b, 0xdb, 0x66,
-       0x7f, 0x57, 0xe9, 0x9c, 0xef, 0x57, 0xb6, 0x17, 0xa2, 0x98, 0xb3, 0x22,
-       0x98, 0xb5, 0xfa, 0x94, 0x8e, 0xf9, 0x5e, 0xc5, 0xd5, 0x63, 0x58, 0x69,
-       0x2f, 0x94, 0xc7, 0xba, 0x6e, 0xc7, 0x1d, 0x59, 0x13, 0x13, 0x56, 0x25,
-       0xe7, 0x59, 0xb4, 0xbf, 0xdd, 0xb8, 0x48, 0x3d, 0x0d, 0x1c, 0x2d, 0x3c,
-       0x85, 0xdb, 0xa7, 0x6d, 0x3b, 0x9f, 0x02, 0xf2, 0x05, 0xe0, 0xeb, 0x56,
-       0xbc, 0x67, 0x50, 0xb1, 0xed, 0xed, 0x09, 0x7b, 0xc5, 0x15, 0xa3, 0x29,
-       0xf9, 0x1a, 0xfe, 0xaf, 0x3d, 0x13, 0x41, 0x26, 0xc4, 0x31, 0x8e, 0x71,
-       0xcd, 0x1e, 0x98, 0x44, 0xa0, 0xd2, 0x1c, 0xc7, 0x8f, 0xb2, 0x08, 0x54,
-       0x98, 0x19, 0x9c, 0xcf, 0x8e, 0xaa, 0x01, 0xc4, 0xa3, 0x3b, 0x94, 0xcc,
-       0xb0, 0x07, 0xda, 0xd0, 0xbb, 0xd0, 0x62, 0x5c, 0x8f, 0x0b, 0xaf, 0x2a,
-       0x5a, 0xf1, 0x35, 0x68, 0xe9, 0x5f, 0x28, 0x5a, 0x67, 0x9d, 0x17, 0x69,
-       0x4f, 0x22, 0x80, 0x6f, 0x37, 0xca, 0x9a, 0x8c, 0x63, 0x8d, 0xb3, 0x36,
-       0x19, 0xdc, 0x72, 0x6d, 0x6d, 0x4c, 0x8c, 0x52, 0xae, 0x23, 0x94, 0xeb,
-       0x75, 0x43, 0x8b, 0x3e, 0x0b, 0x7b, 0xc5, 0x80, 0x21, 0xf7, 0x4c, 0x8c,
-       0x17, 0xec, 0x58, 0xd8, 0xbc, 0x44, 0x79, 0x91, 0xf9, 0x9c, 0x19, 0xc8,
-       0xd4, 0x9a, 0xbf, 0xb4, 0xdf, 0xdc, 0x10, 0xc5, 0xcb, 0x85, 0x08, 0x5e,
-       0x2a, 0xa8, 0x78, 0xb1, 0xd0, 0x01, 0xab, 0x80, 0xf0, 0xed, 0x85, 0x5f,
-       0xe7, 0xc7, 0x36, 0x42, 0x7c, 0x9e, 0x72, 0x87, 0x77, 0x16, 0x7c, 0xfd,
-       0x15, 0x26, 0x7a, 0xbe, 0x93, 0x1d, 0xb1, 0xab, 0x74, 0xf4, 0x2f, 0x31,
-       0xf5, 0xf4, 0x2a, 0x25, 0xd4, 0x4a, 0x3f, 0xec, 0x79, 0x23, 0xdf, 0xea,
-       0xd3, 0x8f, 0x07, 0xe1, 0xa7, 0xfd, 0xb7, 0x16, 0x6c, 0x7b, 0xcc, 0x38,
-       0xb8, 0x76, 0x6f, 0xeb, 0x37, 0x8b, 0x3d, 0x7a, 0x37, 0x32, 0x85, 0x01,
-       0x20, 0x6c, 0xf2, 0x93, 0xa1, 0xb8, 0xbb, 0xb9, 0x23, 0x76, 0xae, 0xdf,
-       0xe7, 0xfa, 0x33, 0x65, 0xa0, 0xdd, 0x5f, 0xb2, 0x28, 0x83, 0xf5, 0x47,
-       0x61, 0x54, 0xc5, 0xa8, 0xdf, 0xf7, 0x28, 0x67, 0x12, 0xdf, 0x28, 0xe8,
-       0x94, 0xad, 0x99, 0x32, 0xc6, 0x28, 0x5f, 0x00, 0x7b, 0x73, 0xda, 0x54,
-       0x06, 0xda, 0xc4, 0x0c, 0x56, 0x23, 0x1d, 0x51, 0xe9, 0x83, 0x7f, 0x06,
-       0x77, 0x8c, 0x6e, 0x1c, 0xb7, 0xb0, 0x4e, 0x35, 0xb9, 0xbe, 0x29, 0x3c,
-       0x5e, 0x81, 0x44, 0xff, 0xc7, 0x8a, 0x82, 0x37, 0x13, 0xdd, 0x98, 0xa4,
-       0x3e, 0xdd, 0xf9, 0x20, 0x1e, 0xcc, 0x55, 0xe1, 0xfe, 0x9c, 0x8d, 0x07,
-       0x52, 0x30, 0xab, 0xa8, 0x4f, 0x32, 0x95, 0x88, 0xbd, 0x0f, 0x1f, 0x3a,
-       0xf2, 0xdd, 0x8c, 0xa5, 0x2d, 0x48, 0x57, 0x04, 0xb0, 0x25, 0x1f, 0x62,
-       0x3c, 0xa6, 0x71, 0x7a, 0x3a, 0x00, 0xff, 0x7a, 0x0f, 0x66, 0x22, 0x15,
-       0x48, 0x36, 0x78, 0xf8, 0x1b, 0x09, 0xb7, 0x4f, 0xd7, 0x87, 0xb7, 0x5a,
-       0x3e, 0xec, 0xb7, 0x3c, 0x18, 0xc9, 0xd9, 0x76, 0x87, 0x61, 0xe3, 0xea,
-       0x7a, 0x15, 0xdf, 0xa2, 0xfd, 0x0e, 0x5a, 0x51, 0x9c, 0x2d, 0x3c, 0x49,
-       0x59, 0x22, 0xae, 0xbc, 0x16, 0x65, 0xb7, 0x28, 0xbb, 0x45, 0xb9, 0x2d,
-       0x91, 0xf3, 0x55, 0xc6, 0x8c, 0x41, 0xbd, 0x82, 0x94, 0xa1, 0x1a, 0x83,
-       0x94, 0x23, 0x9e, 0xb2, 0xe1, 0x49, 0x69, 0x99, 0xbd, 0x04, 0xaf, 0x15,
-       0x0d, 0xb6, 0xfd, 0xf1, 0x7a, 0xd1, 0x85, 0x6b, 0xee, 0xe9, 0x96, 0x18,
-       0xfd, 0xed, 0x1a, 0xc6, 0xd5, 0xf7, 0x69, 0xb7, 0xa7, 0x0b, 0x41, 0x0c,
-       0xe7, 0x1c, 0xbf, 0x3d, 0x54, 0x41, 0xb9, 0x45, 0xae, 0x82, 0x9e, 0x60,
-       0x8c, 0x26, 0xfa, 0x18, 0xa3, 0xd8, 0x49, 0x99, 0x1f, 0xb0, 0x22, 0xe1,
-       0x8e, 0xe9, 0x44, 0xeb, 0x6e, 0xc5, 0x87, 0xed, 0xf9, 0xeb, 0x72, 0x52,
-       0x5f, 0x89, 0x41, 0xea, 0xaa, 0x52, 0xbe, 0x08, 0xf6, 0x51, 0xce, 0x97,
-       0x4a, 0x72, 0xce, 0x16, 0x64, 0xae, 0xcf, 0xca, 0x5a, 0x96, 0x13, 0x99,
-       0xa5, 0x66, 0x44, 0x41, 0x55, 0x08, 0xbb, 0xf3, 0xef, 0x70, 0x2d, 0xea,
-       0xf1, 0x4d, 0xae, 0xc1, 0xcb, 0x8c, 0x91, 0x6f, 0x5c, 0xf3, 0x17, 0x59,
-       0x8f, 0x27, 0xb8, 0x0e, 0xda, 0xe9, 0x0c, 0x42, 0xe8, 0x2f, 0xa4, 0x71,
-       0x78, 0x1a, 0xe9, 0x39, 0xe3, 0x18, 0xe3, 0x7d, 0x39, 0xbc, 0x7a, 0x65,
-       0x5a, 0xd5, 0xab, 0xb0, 0x6f, 0x36, 0x82, 0xa1, 0x42, 0x3b, 0xac, 0x5c,
-       0x04, 0x07, 0xe8, 0x9b, 0x1f, 0xa6, 0xd2, 0x0f, 0x84, 0x21, 0xb2, 0x47,
-       0xf0, 0x20, 0xdf, 0x79, 0x6a, 0x3a, 0x82, 0x41, 0xda, 0x68, 0x47, 0x2a,
-       0xd1, 0x1a, 0xe4, 0xb5, 0xfd, 0xbc, 0x76, 0x84, 0xf6, 0x7f, 0xd5, 0x98,
-       0x44, 0x7f, 0x8f, 0x96, 0x04, 0x22, 0xb8, 0xcf, 0x82, 0x4a, 0x17, 0x7e,
-       0x82, 0xf8, 0x96, 0x7c, 0x95, 0xdf, 0xef, 0x2d, 0x54, 0x51, 0xdf, 0x30,
-       0xa2, 0xfa, 0x27, 0xb6, 0xbf, 0xc5, 0xb6, 0xbf, 0x66, 0x24, 0x2e, 0xfc,
-       0xd0, 0xeb, 0xc3, 0x63, 0x05, 0x0f, 0x86, 0x67, 0xab, 0xf0, 0xfb, 0x39,
-       0x1f, 0xee, 0x6c, 0xa8, 0xc2, 0xc1, 0xd9, 0x34, 0xc6, 0xa6, 0xab, 0x30,
-       0x90, 0xc3, 0x8a, 0xfb, 0x8c, 0xb1, 0x25, 0x15, 0xd0, 0x16, 0x3b, 0x90,
-       0xc4, 0x55, 0xae, 0xc3, 0x63, 0xb3, 0xa1, 0x70, 0xdf, 0xb4, 0x8a, 0xe1,
-       0xf9, 0x20, 0x9f, 0xf7, 0xf0, 0xf9, 0x4a, 0x18, 0xeb, 0xe2, 0xc3, 0x2a,
-       0x44, 0xc6, 0x6a, 0x3c, 0x3c, 0x1b, 0xc4, 0x43, 0x39, 0x15, 0x07, 0xa6,
-       0x5b, 0x30, 0x65, 0xa5, 0x71, 0x94, 0xd8, 0xf1, 0xf5, 0x94, 0xd6, 0x73,
-       0x40, 0xd1, 0xd2, 0x5b, 0x95, 0x34, 0x1a, 0x53, 0x7e, 0x5c, 0x22, 0x0e,
-       0xf9, 0x53, 0x4d, 0xad, 0x2f, 0x12, 0x1b, 0x2a, 0xcc, 0x08, 0xbf, 0x6b,
-       0x13, 0x8c, 0xd9, 0xb4, 0xdf, 0xb3, 0x1e, 0x58, 0x26, 0xf1, 0x1b, 0x09,
-       0x77, 0x59, 0x6a, 0xb8, 0xab, 0x50, 0x1f, 0xde, 0x61, 0x45, 0xc3, 0x3b,
-       0x18, 0x5f, 0x5b, 0xc5, 0x1f, 0xad, 0x00, 0x8e, 0xa5, 0x7e, 0x69, 0xf7,
-       0x2f, 0x71, 0xf0, 0x2c, 0x7c, 0xfb, 0xb4, 0x96, 0x99, 0x81, 0x66, 0x30,
-       0x1b, 0x60, 0x72, 0xde, 0xc7, 0xf5, 0x53, 0xb0, 0x44, 0x6f, 0x21, 0x8e,
-       0xab, 0x78, 0x98, 0x98, 0xf2, 0xb7, 0xc4, 0x94, 0x81, 0xe3, 0x71, 0x75,
-       0x0a, 0x41, 0xda, 0x1b, 0xd8, 0x7b, 0x2e, 0xc2, 0x35, 0xef, 0xc4, 0x93,
-       0x94, 0x6b, 0xc7, 0x86, 0x08, 0xee, 0x2f, 0xa8, 0xe1, 0x4e, 0xae, 0xdf,
-       0xfb, 0xf9, 0x68, 0x78, 0x0b, 0xd7, 0xf2, 0xdd, 0xbc, 0x16, 0x2b, 0xe2,
-       0x9f, 0xc4, 0x9f, 0x92, 0xf0, 0x00, 0xf7, 0x1d, 0xf7, 0xa3, 0x18, 0x91,
-       0xb9, 0x68, 0x73, 0xeb, 0x65, 0x3b, 0xa4, 0xeb, 0xa7, 0x0f, 0xd0, 0xd6,
-       0x8f, 0x16, 0x42, 0x78, 0xc8, 0xd2, 0x92, 0xdf, 0x50, 0x42, 0xb4, 0x69,
-       0x80, 0x76, 0x20, 0xc0, 0x2c, 0x97, 0xe7, 0x52, 0x88, 0x2d, 0x77, 0xb1,
-       0xf6, 0xe0, 0xac, 0xf8, 0x09, 0xd7, 0xde, 0xa2, 0x0f, 0xd0, 0x7f, 0xbe,
-       0x71, 0x2d, 0x56, 0x35, 0x35, 0xe3, 0x60, 0x77, 0x92, 0xfe, 0xe2, 0xda,
-       0xe8, 0xc4, 0xb4, 0xd8, 0x41, 0x9b, 0x82, 0x27, 0x8d, 0xb5, 0xeb, 0xfe,
-       0xd6, 0xbe, 0xb4, 0x4c, 0xec, 0xa1, 0x62, 0x84, 0x36, 0x3c, 0x6d, 0xd9,
-       0xf6, 0xd5, 0xf5, 0x3f, 0xb5, 0x5b, 0x6f, 0x16, 0xbb, 0x88, 0xae, 0xdf,
-       0x52, 0x24, 0x8f, 0x2c, 0xd1, 0xc3, 0xff, 0x1f, 0x7c, 0xe5, 0x0f, 0xed,
-       0x7e, 0x47, 0x3f, 0xf1, 0x17, 0x1f, 0x7d, 0xf1, 0x49, 0x8e, 0xed, 0x41,
-       0x3f, 0xc7, 0x7b, 0xc4, 0xb2, 0x3f, 0xaa, 0x33, 0x3f, 0xb5, 0x5b, 0x37,
-       0xea, 0x43, 0x8b, 0xca, 0xff, 0xe0, 0xf5, 0x08, 0x1e, 0x2e, 0xb4, 0xd2,
-       0x76, 0x1d, 0x78, 0xca, 0x12, 0x3c, 0xec, 0x64, 0xbc, 0x45, 0xe9, 0xcf,
-       0xf5, 0xf4, 0x6f, 0x9f, 0xb2, 0xd5, 0xca, 0x63, 0xc7, 0x64, 0x06, 0xdb,
-       0xe9, 0xef, 0x17, 0xb2, 0xf1, 0xd6, 0xe7, 0xa1, 0x65, 0xa8, 0x43, 0xb8,
-       0x93, 0x36, 0xee, 0xb0, 0xb4, 0x4e, 0x59, 0xd3, 0x0e, 0xe2, 0xd2, 0x2b,
-       0xd9, 0x68, 0xb8, 0xbd, 0x20, 0xf6, 0xae, 0x0f, 0x6f, 0x29, 0xdc, 0xca,
-       0xb5, 0x57, 0xb0, 0x69, 0x75, 0x80, 0x38, 0x73, 0x07, 0xdc, 0x75, 0x75,
-       0xd7, 0xee, 0xcd, 0x54, 0x53, 0xff, 0x4f, 0xd1, 0x85, 0xcc, 0x32, 0xf7,
-       0xda, 0x30, 0xaf, 0xd5, 0xae, 0x47, 0xf8, 0x0e, 0xfa, 0xc1, 0x3d, 0xf4,
-       0x83, 0xab, 0xeb, 0x7f, 0x69, 0xc7, 0x6e, 0x72, 0xfd, 0xa0, 0x7d, 0xda,
-       0x17, 0xde, 0x46, 0x3b, 0x6d, 0x35, 0x14, 0xcc, 0x1a, 0x4f, 0xa1, 0xff,
-       0x1a, 0x77, 0x48, 0xcf, 0x9c, 0x35, 0xd2, 0xc4, 0x91, 0x36, 0xf8, 0x96,
-       0x60, 0xe6, 0x79, 0xe3, 0x30, 0x62, 0xae, 0xef, 0xe0, 0x40, 0x2e, 0x88,
-       0xcc, 0x9d, 0x2a, 0xe6, 0x1a, 0x55, 0x3c, 0xc2, 0xb1, 0x3f, 0x4c, 0x35,
-       0x0d, 0xbe, 0x45, 0x1b, 0xcc, 0x2c, 0x91, 0x6b, 0x69, 0xfc, 0x95, 0xf1,
-       0x65, 0xe0, 0x26, 0x77, 0xee, 0x79, 0x89, 0xd1, 0xf9, 0x16, 0x1c, 0x29,
-       0xf4, 0x29, 0x2e, 0x6e, 0x6a, 0x9d, 0x69, 0x7c, 0xcf, 0x16, 0x2c, 0x9d,
-       0x27, 0x86, 0xb4, 0xd3, 0xa7, 0xc6, 0xe9, 0x47, 0xa3, 0xc4, 0x90, 0xed,
-       0xf4, 0xa3, 0x27, 0xf3, 0xa2, 0x53, 0xc2, 0x30, 0xbc, 0x37, 0x33, 0x37,
-       0xd3, 0x3e, 0x96, 0x93, 0xf3, 0x6b, 0x55, 0xfd, 0x30, 0xa6, 0x1c, 0xd9,
-       0x86, 0x95, 0x3b, 0xc8, 0x31, 0x2e, 0xf9, 0x51, 0x1b, 0xd5, 0x1f, 0xc1,
-       0x69, 0xe7, 0x5a, 0x84, 0xef, 0xa6, 0x3d, 0x1e, 0x1d, 0xaa, 0x6a, 0x76,
-       0x30, 0xaf, 0x8a, 0xef, 0x77, 0x2a, 0x3b, 0x98, 0x6b, 0xd3, 0xcc, 0xb5,
-       0x69, 0xe6, 0xda, 0x34, 0xe7, 0x4f, 0x33, 0xc7, 0xb6, 0x17, 0x86, 0x95,
-       0x1e, 0xb1, 0xbb, 0xd8, 0xdf, 0x72, 0xf9, 0x03, 0xb1, 0x27, 0xbc, 0xbd,
-       0xb0, 0xc6, 0xe3, 0x72, 0xba, 0x61, 0xa5, 0xc4, 0x61, 0x02, 0x55, 0x3a,
-       0x73, 0x98, 0x35, 0xac, 0x74, 0x31, 0xcf, 0xf6, 0x39, 0x36, 0x8c, 0x0f,
-       0x5d, 0x66, 0x7e, 0x7d, 0x93, 0xf9, 0x35, 0x9f, 0x62, 0x3c, 0xad, 0xbe,
-       0x6a, 0xf7, 0x2f, 0x73, 0x73, 0xc1, 0x18, 0xe5, 0xfc, 0x1a, 0xd7, 0xaa,
-       0xc8, 0x1c, 0xda, 0xe1, 0x55, 0x70, 0x9f, 0x8e, 0xda, 0x3a, 0x62, 0xe9,
-       0x91, 0x02, 0xf1, 0xdf, 0x88, 0xb7, 0x7e, 0x40, 0x83, 0x1e, 0xd1, 0xfd,
-       0xb8, 0x7a, 0x13, 0x49, 0x8e, 0xde, 0x8e, 0x63, 0xb9, 0x4a, 0x0c, 0xa6,
-       0xd2, 0x4b, 0x03, 0xe4, 0x28, 0x9d, 0x2d, 0x78, 0x9c, 0x53, 0x2b, 0x51,
-       0x33, 0x41, 0x7f, 0x41, 0xfa, 0x38, 0xf3, 0xc3, 0xa4, 0x75, 0x2b, 0xf2,
-       0xcc, 0xa3, 0x73, 0x86, 0x0f, 0x6f, 0xe6, 0xd7, 0x10, 0xdf, 0x12, 0x46,
-       0x48, 0xa9, 0x62, 0xdc, 0x9a, 0xc8, 0x5a, 0x82, 0x4b, 0xb6, 0x3d, 0x27,
-       0x32, 0x24, 0x12, 0xe9, 0x51, 0x08, 0x56, 0xd9, 0x2b, 0xee, 0x4d, 0x55,
-       0x60, 0x53, 0x22, 0x8c, 0x15, 0x7a, 0xbf, 0xd2, 0x59, 0x48, 0x18, 0xaf,
-       0xe2, 0x77, 0x95, 0x7b, 0xe6, 0x4d, 0xc6, 0x74, 0x9f, 0xb2, 0x67, 0xbe,
-       0x0a, 0x97, 0x22, 0x22, 0x23, 0x6a, 0xfd, 0xba, 0x07, 0xef, 0xdd, 0xa5,
-       0x40, 0xd5, 0xd3, 0x38, 0xdf, 0xa2, 0xd2, 0x9f, 0x3a, 0xc9, 0x2d, 0x62,
-       0xf0, 0x2e, 0x44, 0xc3, 0x3b, 0xb9, 0x06, 0xd5, 0x0b, 0xb2, 0x2e, 0x1d,
-       0xb4, 0x55, 0x3d, 0xfd, 0xaf, 0x53, 0xe9, 0xa0, 0x1d, 0xbb, 0x66, 0xa1,
-       0x56, 0x99, 0xbd, 0xca, 0xb6, 0x82, 0x46, 0x3b, 0x89, 0x4d, 0x86, 0xc9,
-       0x91, 0xc4, 0x47, 0xca, 0x6b, 0x28, 0x7e, 0x7a, 0xe3, 0x3a, 0xf6, 0x79,
-       0x24, 0xd6, 0x36, 0xad, 0x36, 0x19, 0x87, 0x1e, 0xca, 0x25, 0x32, 0x04,
-       0x50, 0xdb, 0x68, 0xaf, 0xf8, 0x30, 0xb5, 0xc0, 0x7b, 0x26, 0x8e, 0x17,
-       0xba, 0xb9, 0x2e, 0xcd, 0x25, 0xbf, 0x52, 0xe9, 0x87, 0x1d, 0x1c, 0x5f,
-       0xfc, 0x3b, 0x0d, 0x77, 0x2d, 0x3b, 0xc9, 0x89, 0xfe, 0xb5, 0x35, 0x3c,
-       0xc8, 0x31, 0x64, 0x1d, 0x2b, 0xca, 0x7e, 0x19, 0xbe, 0x67, 0x3a, 0x8d,
-       0xf7, 0x9c, 0x1c, 0x5a, 0xf6, 0xe1, 0x61, 0xa5, 0x93, 0x6b, 0x09, 0xbf,
-       0x3b, 0xfe, 0xae, 0x69, 0xf8, 0x6b, 0x4c, 0xc4, 0xbc, 0xe4, 0x6d, 0x17,
-       0x53, 0x09, 0x75, 0x52, 0xe9, 0xe6, 0x58, 0x8c, 0x2d, 0x62, 0x7d, 0x35,
-       0xfd, 0xa6, 0x83, 0xfa, 0x76, 0x51, 0xdf, 0x2e, 0x67, 0x4e, 0xf1, 0xbb,
-       0x5f, 0x9d, 0x77, 0x4b, 0xe1, 0x1e, 0x47, 0xf7, 0x9d, 0x7c, 0x67, 0x0f,
-       0x65, 0xdd, 0xc3, 0xe7, 0xb7, 0x58, 0xdf, 0xe7, 0x35, 0x91, 0x57, 0xe2,
-       0xfa, 0xc6, 0x5c, 0x25, 0xb1, 0xfd, 0xdd, 0x12, 0x57, 0x40, 0xc6, 0x63,
-       0x4a, 0xec, 0x0f, 0xa1, 0xa7, 0x05, 0x81, 0xa5, 0xe6, 0x50, 0xdb, 0xee,
-       0x06, 0xe2, 0x14, 0x71, 0x32, 0x70, 0x9c, 0x1c, 0x99, 0xd8, 0x3b, 0xd7,
-       0xaa, 0x60, 0xcc, 0xb8, 0x99, 0xf1, 0x67, 0x60, 0xa2, 0xa0, 0x75, 0xc6,
-       0x78, 0xaf, 0x79, 0x52, 0xb8, 0xfb, 0x01, 0xb4, 0x93, 0xaf, 0x45, 0xcd,
-       0x41, 0x44, 0xad, 0x78, 0x74, 0x42, 0xd1, 0x06, 0xb7, 0x40, 0xbb, 0x40,
-       0xcc, 0x1f, 0x9e, 0x55, 0xb4, 0xa1, 0x3a, 0xaf, 0x96, 0x7e, 0xdb, 0xe1,
-       0xcd, 0x07, 0xb0, 0xda, 0xe1, 0x66, 0x83, 0x48, 0x92, 0xa3, 0xee, 0xe4,
-       0x98, 0xfb, 0x37, 0x29, 0xb8, 0x62, 0xfc, 0x94, 0xeb, 0xa4, 0xa5, 0x33,
-       0x8a, 0x81, 0x2c, 0xe3, 0x3f, 0x7a, 0x5c, 0x38, 0xf8, 0x01, 0x72, 0x70,
-       0x04, 0x42, 0x7c, 0x36, 0x3b, 0x19, 0x1f, 0x0e, 0x78, 0xb5, 0x24, 0xf9,
-       0x77, 0x9a, 0x63, 0x1a, 0x05, 0xf2, 0x72, 0xce, 0x11, 0xbb, 0xaf, 0x34,
-       0x66, 0xa2, 0x34, 0xa6, 0x9e, 0x07, 0xe3, 0x62, 0x02, 0xdb, 0x13, 0xcc,
-       0x01, 0xc4, 0xb2, 0xa3, 0xc2, 0xf5, 0x39, 0x5e, 0xe5, 0x71, 0x83, 0xdf,
-       0x87, 0x95, 0x3d, 0x12, 0x33, 0x95, 0x2e, 0x73, 0xab, 0xe5, 0x1c, 0x35,
-       0xe6, 0x21, 0x2c, 0x38, 0x73, 0x0c, 0xc9, 0x1c, 0x43, 0x3f, 0x52, 0xb4,
-       0xe4, 0x39, 0x45, 0x30, 0xb8, 0xa9, 0xef, 0x1c, 0x63, 0xe4, 0x88, 0xa2,
-       0xb5, 0x1e, 0xa3, 0xfa, 0x41, 0x5d, 0xc6, 0x3f, 0x54, 0x9a, 0x67, 0x08,
-       0x8d, 0x79, 0xc6, 0x5f, 0x21, 0xa0, 0x6c, 0xc9, 0xb5, 0x63, 0x6c, 0xb6,
-       0x1d, 0xa3, 0x39, 0x05, 0xf7, 0x18, 0xcb, 0x70, 0xe9, 0x66, 0xa7, 0xfe,
-       0xa8, 0x59, 0xa1, 0xd7, 0x61, 0x44, 0x45, 0xad, 0x47, 0xff, 0x3c, 0xf6,
-       0x96, 0xb8, 0xfb, 0xf6, 0x13, 0x3d, 0xc4, 0x73, 0x1b, 0x1f, 0x30, 0x56,
-       0xe2, 0x4b, 0x90, 0xf6, 0x9b, 0xad, 0xe4, 0xd9, 0x4b, 0xbd, 0x6e, 0x3c,
-       0xff, 0x7d, 0xc0, 0x5d, 0x03, 0xb1, 0xff, 0x67, 0xef, 0xb5, 0xe3, 0xe9,
-       0x5c, 0x05, 0x5a, 0xd7, 0xe3, 0xce, 0x28, 0x6a, 0x3c, 0xcc, 0x5d, 0xef,
-       0xec, 0x56, 0x1e, 0xe6, 0x3d, 0xe7, 0xd9, 0xc0, 0x6f, 0x98, 0x1f, 0xb7,
-       0xfd, 0x71, 0xa3, 0x5c, 0x97, 0x67, 0x6f, 0xbc, 0xae, 0x9a, 0xff, 0xf2,
-       0xba, 0x82, 0x17, 0x08, 0x50, 0x5f, 0x67, 0xae, 0xc8, 0x67, 0x6d, 0x78,
-       0x4d, 0x1f, 0x06, 0x27, 0x63, 0x38, 0xb0, 0x10, 0xc1, 0x42, 0x56, 0xeb,
-       0xbf, 0xc4, 0xba, 0x60, 0x6f, 0x8b, 0x8e, 0x87, 0x16, 0xa2, 0x98, 0xcf,
-       0xc2, 0x0e, 0x9a, 0x7a, 0x31, 0xa8, 0x24, 0xb1, 0x7f, 0xa1, 0x1e, 0xe7,
-       0xb2, 0xfa, 0x85, 0x51, 0x25, 0x31, 0x5c, 0x47, 0x3e, 0xf1, 0xc8, 0x42,
-       0x33, 0x1e, 0x5e, 0x08, 0xf0, 0x1d, 0x1b, 0x5d, 0xa9, 0x7a, 0x3e, 0xef,
-       0xc1, 0xf3, 0x27, 0x6d, 0x5b, 0xf8, 0xd4, 0xe0, 0x02, 0x30, 0x3f, 0xc5,
-       0x1c, 0x73, 0x86, 0xf9, 0xe6, 0x19, 0x60, 0xff, 0x33, 0x1e, 0xcc, 0x4e,
-       0xd9, 0xd8, 0x6b, 0x8c, 0xd6, 0x79, 0xe8, 0xe4, 0xfd, 0xcc, 0x07, 0x7e,
-       0xe6, 0xb6, 0x7b, 0x55, 0x17, 0xa7, 0x2f, 0x11, 0x87, 0x1e, 0x78, 0x26,
-       0x89, 0x77, 0xb2, 0x19, 0x74, 0x91, 0x77, 0x0f, 0x53, 0x96, 0xb7, 0xb3,
-       0xcc, 0x4f, 0x0b, 0x06, 0xde, 0xca, 0x06, 0x38, 0x4f, 0x33, 0x5e, 0xcb,
-       0xca, 0x33, 0xf2, 0x6c, 0x08, 0x03, 0x94, 0xe5, 0xcd, 0x6c, 0x94, 0x73,
-       0x46, 0xf0, 0x1d, 0x3e, 0x77, 0xff, 0x82, 0xce, 0x7c, 0x14, 0xe0, 0xbc,
-       0x31, 0xbc, 0x91, 0x0d, 0x51, 0xd6, 0x08, 0x73, 0xd0, 0x00, 0xc6, 0xb2,
-       0x4d, 0x17, 0xb6, 0x90, 0xb3, 0xb8, 0x39, 0x44, 0xae, 0x5d, 0xb6, 0xbb,
-       0x9d, 0x98, 0x93, 0x79, 0xca, 0xf3, 0x0e, 0x60, 0x34, 0xfb, 0x9a, 0xb7,
-       0x5c, 0x27, 0xbf, 0x30, 0xb5, 0xe8, 0x70, 0xba, 0xe7, 0x2d, 0xfe, 0x3d,
-       0x0b, 0x9c, 0xb3, 0x32, 0x76, 0xad, 0x49, 0x0e, 0xcb, 0xdc, 0xf3, 0xc3,
-       0x0d, 0xcd, 0x9c, 0x57, 0xef, 0x7f, 0x45, 0x91, 0x3a, 0xc6, 0x87, 0xd8,
-       0x33, 0x62, 0x2f, 0xc6, 0xf1, 0x3c, 0xf0, 0x57, 0xe4, 0x95, 0x8d, 0x93,
-       0x9a, 0xf8, 0x7d, 0x1f, 0xf9, 0x4a, 0x4f, 0x11, 0x0d, 0xc9, 0x87, 0x30,
-       0x62, 0x57, 0x90, 0x77, 0xd7, 0x92, 0xaf, 0x2e, 0x34, 0x33, 0xff, 0x6c,
-       0xb0, 0xed, 0xef, 0xb7, 0xc0, 0xf6, 0x98, 0xba, 0x51, 0xe7, 0x2d, 0x7e,
-       0xbe, 0x06, 0xfa, 0x85, 0xb0, 0xa2, 0x17, 0x7f, 0x88, 0xc4, 0xd0, 0xab,
-       0x10, 0xbb, 0x02, 0x6b, 0x16, 0x7c, 0x58, 0x4b, 0x7d, 0xb6, 0x4e, 0x72,
-       0x6e, 0xf2, 0x8e, 0x04, 0x75, 0xba, 0x7d, 0x92, 0x5c, 0x4a, 0x0f, 0x61,
-       0x35, 0x6d, 0x3c, 0x78, 0xca, 0xb6, 0x2b, 0x69, 0xe3, 0x46, 0xae, 0xcf,
-       0x7d, 0x27, 0x6c, 0xbc, 0x62, 0xbc, 0x42, 0x9b, 0x2a, 0xe4, 0x83, 0x2d,
-       0x7c, 0x27, 0xc2, 0xe7, 0x03, 0xd8, 0x3f, 0x29, 0x75, 0x50, 0x3d, 0x9f,
-       0xb9, 0x88, 0x63, 0xd9, 0x24, 0x9a, 0x69, 0xbf, 0x18, 0xc7, 0x6c, 0xe2,
-       0x3b, 0xb1, 0x05, 0x37, 0x97, 0xc4, 0x16, 0x7e, 0x1d, 0x0e, 0x00, 0xa7,
-       0xa7, 0xb4, 0x89, 0x22, 0xb9, 0x74, 0x8d, 0x39, 0x02, 0xe6, 0x62, 0xbc,
-       0x3d, 0xa3, 0xe0, 0xf8, 0x14, 0x6b, 0xb7, 0x0d, 0xb0, 0xab, 0xa8, 0xc7,
-       0x5b, 0x33, 0xbf, 0x89, 0xe7, 0x4e, 0x52, 0xf7, 0x67, 0x23, 0xf8, 0x7a,
-       0xd6, 0x87, 0x5b, 0x8e, 0x0b, 0x3f, 0xd3, 0x93, 0x07, 0x14, 0xa9, 0x75,
-       0xa4, 0x06, 0x49, 0xc4, 0xfc, 0x8a, 0x07, 0x0d, 0xcf, 0xf9, 0xa0, 0x9f,
-       0x8b, 0xc1, 0xdf, 0x10, 0x80, 0xde, 0xf0, 0xfb, 0xc4, 0x17, 0x0f, 0x2a,
-       0x58, 0x97, 0x6e, 0xff, 0x4a, 0x92, 0xd7, 0x22, 0xbc, 0x86, 0xdf, 0xac,
-       0x84, 0x77, 0xb9, 0x97, 0xf9, 0xb8, 0x42, 0x27, 0xb7, 0xf2, 0xd9, 0xb6,
-       0x97, 0x78, 0xbf, 0xe7, 0xab, 0xb6, 0x1d, 0x5f, 0x2f, 0xcf, 0xab, 0x88,
-       0x9f, 0xd3, 0xf9, 0x9c, 0x9b, 0x03, 0xaf, 0x73, 0x2b, 0x2f, 0x7d, 0x47,
-       0xe2, 0xf3, 0x71, 0xb8, 0xf5, 0x90, 0xcb, 0xc1, 0x5f, 0x2a, 0x08, 0x4f,
-       0x89, 0x39, 0x3a, 0x9c, 0x9d, 0x52, 0x88, 0x73, 0x26, 0x9f, 0xdd, 0x0c,
-       0x6f, 0x4a, 0x9b, 0xc8, 0x70, 0xed, 0xf7, 0xaa, 0xad, 0x78, 0xc1, 0xf2,
-       0xa3, 0x5a, 0x5f, 0x8e, 0x07, 0x7b, 0x54, 0xbc, 0x40, 0x8e, 0xcf, 0x75,
-       0x4a, 0x16, 0x51, 0xc9, 0x5a, 0x8b, 0xe3, 0x79, 0xfe, 0x1a, 0xfa, 0x57,
-       0x3c, 0xc4, 0x36, 0xaf, 0x83, 0x6d, 0x15, 0x0d, 0x40, 0x31, 0xef, 0xc3,
-       0x79, 0xdd, 0xe5, 0x77, 0x2f, 0x39, 0x79, 0x58, 0x53, 0x8b, 0xd7, 0x78,
-       0x9d, 0xd6, 0x9a, 0x56, 0x0e, 0x7b, 0x45, 0xce, 0x17, 0x0b, 0x3b, 0x7d,
-       0xae, 0xff, 0x5c, 0xf4, 0x4a, 0xfd, 0x70, 0xfd, 0x7b, 0x15, 0x3c, 0xa6,
-       0x16, 0x6d, 0xf7, 0x22, 0xe0, 0x33, 0x03, 0x6d, 0xe3, 0xfa, 0xe7, 0x6e,
-       0x90, 0xbd, 0x19, 0x63, 0x85, 0xeb, 0x75, 0x73, 0x67, 0xd6, 0xf1, 0x9b,
-       0x4e, 0xb1, 0xfd, 0x53, 0x86, 0x60, 0xeb, 0xb0, 0xd2, 0x41, 0xac, 0xca,
-       0xf8, 0xdc, 0xba, 0xf8, 0x08, 0xeb, 0xe2, 0xd7, 0xb3, 0xd2, 0x1b, 0x39,
-       0x84, 0x7d, 0x0e, 0xce, 0x0e, 0x09, 0xce, 0xc6, 0xce, 0x42, 0x1b, 0x1c,
-       0x28, 0xe1, 0xec, 0x9c, 0x8b, 0xb3, 0xfd, 0x2e, 0xce, 0x1e, 0x2a, 0xe1,
-       0xec, 0x10, 0x9a, 0xf3, 0x11, 0x72, 0xe0, 0x0e, 0xe6, 0xda, 0x6e, 0x72,
-       0x0e, 0xc9, 0x91, 0x7d, 0xca, 0xce, 0xf9, 0x80, 0xb2, 0x2d, 0x17, 0xc0,
-       0xeb, 0xe4, 0x53, 0x33, 0xbd, 0x50, 0x6f, 0xd9, 0x80, 0xe0, 0xce, 0x5c,
-       0x0f, 0x2a, 0x75, 0xa9, 0x03, 0x2b, 0xb1, 0xdd, 0xc9, 0x55, 0x52, 0x2f,
-       0x49, 0x2f, 0xa0, 0x97, 0x58, 0x07, 0x35, 0x68, 0xba, 0x75, 0xbf, 0xe0,
-       0xde, 0xed, 0x7c, 0xf7, 0x2c, 0xfd, 0x10, 0x6e, 0x4e, 0x53, 0xee, 0x60,
-       0x3d, 0xf0, 0x61, 0x4a, 0x41, 0xf1, 0xce, 0x00, 0x38, 0x16, 0xf5, 0x3d,
-       0xd0, 0x36, 0x3e, 0xd5, 0xa3, 0x74, 0xcc, 0xce, 0x05, 0x99, 0xb7, 0x99,
-       0x93, 0x66, 0x82, 0x6e, 0xae, 0xfe, 0xec, 0x58, 0xd2, 0x73, 0x49, 0xb6,
-       0x6d, 0x22, 0xc7, 0x69, 0x5d, 0xff, 0x8f, 0x36, 0x7e, 0x47, 0xde, 0xff,
-       0xcf, 0x25, 0xfb, 0xa5, 0x29, 0x4f, 0x24, 0xb0, 0xbd, 0xa0, 0x06, 0xd2,
-       0x85, 0x0e, 0xbe, 0xdf, 0xc3, 0xb1, 0x7a, 0x83, 0x1d, 0xd6, 0xdd, 0xc1,
-       0xad, 0x56, 0x77, 0x70, 0x9b, 0xc5, 0xd8, 0x2d, 0xf4, 0xd2, 0x8e, 0x3d,
-       0xac, 0xe1, 0xef, 0x26, 0x7f, 0x90, 0x31, 0xfb, 0xc9, 0x65, 0x82, 0xd4,
-       0x6d, 0x84, 0xba, 0x15, 0xa3, 0x7e, 0xa4, 0x35, 0x3f, 0x34, 0x75, 0xcc,
-       0x59, 0xb7, 0x09, 0xa7, 0x8f, 0x54, 0x65, 0xae, 0x6e, 0xeb, 0x3a, 0x41,
-       0x4c, 0x37, 0x1b, 0xda, 0x6e, 0x39, 0x85, 0x25, 0x7e, 0x53, 0xea, 0x5e,
-       0xd6, 0xb2, 0x89, 0x84, 0xf1, 0x3e, 0x12, 0xd1, 0xd7, 0xf9, 0xec, 0x28,
-       0x7d, 0x75, 0xcc, 0xe9, 0x1d, 0x70, 0x01, 0xf2, 0xcd, 0xe8, 0xb2, 0x02,
-       0xc1, 0xdb, 0x59, 0x57, 0x85, 0x4d, 0xad, 0x75, 0x97, 0x57, 0x7a, 0x19,
-       0xc5, 0xdf, 0x0e, 0xa1, 0x19, 0x9d, 0x85, 0x40, 0x70, 0xcb, 0xf4, 0xe7,
-       0xf0, 0x0f, 0x27, 0x99, 0xbb, 0x20, 0x7e, 0x67, 0xdb, 0xf7, 0xb3, 0x26,
-       0x39, 0x9a, 0xaf, 0xc7, 0x15, 0x67, 0x4d, 0x7d, 0x38, 0x92, 0x8f, 0xe1,
-       0x32, 0xf1, 0xc9, 0xb7, 0x50, 0x87, 0x77, 0xa7, 0xbc, 0xd8, 0x67, 0xdc,
-       0x56, 0xca, 0x09, 0x1e, 0xdc, 0x9b, 0x3c, 0x48, 0x1e, 0xe0, 0x41, 0x2d,
-       0x39, 0xd8, 0x23, 0xce, 0x35, 0x2f, 0x6b, 0xb7, 0x2f, 0x62, 0xd8, 0xcd,
-       0x19, 0x94, 0xb1, 0x9e, 0x32, 0xb6, 0x04, 0xb7, 0xe4, 0xb4, 0xe0, 0x1d,
-       0x39, 0x04, 0xfc, 0xe6, 0xca, 0xb6, 0x33, 0x27, 0x6d, 0x0c, 0x18, 0xab,
-       0xf0, 0xe1, 0xc9, 0xd1, 0x41, 0x1f, 0xfd, 0xe5, 0x27, 0xa9, 0x3e, 0x58,
-       0xd3, 0x38, 0x4f, 0x26, 0x71, 0x31, 0x44, 0xfc, 0x6e, 0x24, 0x67, 0xa0,
-       0x1f, 0x18, 0xf3, 0x8c, 0xc5, 0x6d, 0xf4, 0x0f, 0xfa, 0x43, 0xda, 0x6b,
-       0x26, 0xfa, 0xc7, 0x48, 0x00, 0x6b, 0x28, 0x4f, 0x90, 0xf8, 0x1c, 0x5a,
-       0x88, 0x05, 0xf7, 0x30, 0xa7, 0x44, 0x59, 0x9b, 0x05, 0x13, 0xb8, 0xad,
-       0x0e, 0x89, 0xe4, 0x22, 0xf5, 0xf6, 0x2f, 0x34, 0x07, 0x77, 0x31, 0x47,
-       0x5c, 0x49, 0xd8, 0x23, 0xaf, 0x18, 0x21, 0x84, 0x17, 0x0c, 0xda, 0xbb,
-       0x0f, 0xa3, 0xf3, 0x2c, 0x97, 0x12, 0xac, 0xd7, 0x17, 0x5a, 0x83, 0xb7,
-       0x33, 0x16, 0x6b, 0x88, 0x53, 0x4d, 0x0b, 0xe9, 0xa0, 0xd4, 0x6b, 0xcd,
-       0x0b, 0x1b, 0x29, 0x9f, 0xac, 0x63, 0x73, 0xdb, 0x26, 0xfa, 0x41, 0x6c,
-       0x01, 0xdb, 0x09, 0x65, 0xaf, 0x71, 0xcc, 0xbe, 0x28, 0x79, 0xe8, 0xfe,
-       0x0d, 0x21, 0x62, 0x91, 0xd8, 0x92, 0x76, 0x2c, 0x94, 0x75, 0x92, 0xdc,
-       0xdb, 0xd0, 0xb6, 0x70, 0x4a, 0x72, 0x6f, 0xb4, 0x2d, 0x7b, 0x4a, 0xc7,
-       0x65, 0xe6, 0x8f, 0x35, 0x29, 0xcd, 0x38, 0xa7, 0xc4, 0xa3, 0x17, 0xa9,
-       0x8b, 0x0f, 0x3f, 0xb3, 0xf7, 0xea, 0x89, 0xe2, 0x4a, 0xc6, 0x4f, 0x2d,
-       0xf1, 0x2f, 0x4a, 0x5c, 0xaf, 0x5d, 0xa0, 0x61, 0x16, 0x7e, 0x46, 0xff,
-       0x88, 0x22, 0x90, 0xd0, 0xf1, 0xde, 0xc9, 0x24, 0xed, 0x70, 0x6d, 0xcc,
-       0x03, 0xa4, 0x50, 0x03, 0x4c, 0x77, 0x4f, 0x3c, 0x47, 0x1f, 0x1c, 0xe7,
-       0xbc, 0x15, 0x0b, 0x22, 0xb3, 0x3c, 0x1f, 0xe1, 0xf3, 0xd7, 0xe7, 0xae,
-       0xe5, 0xdc, 0x1f, 0x9d, 0x92, 0xfe, 0x52, 0xb4, 0xed, 0xfc, 0x49, 0x77,
-       0xee, 0x44, 0x2a, 0x89, 0x9f, 0x9e, 0xd4, 0x86, 0xde, 0x53, 0xe2, 0xfd,
-       0xe7, 0x15, 0x99, 0x1f, 0xf5, 0x35, 0xf8, 0xd0, 0x1e, 0x4d, 0x24, 0x86,
-       0xf7, 0x72, 0xcc, 0xd6, 0x8d, 0xb4, 0xbf, 0x23, 0x07, 0x13, 0x3b, 0xb1,
-       0xd4, 0x4f, 0x79, 0x5c, 0x59, 0xea, 0x39, 0xf6, 0xc9, 0x52, 0x9d, 0xc5,
-       0x1a, 0xf3, 0xba, 0x3c, 0x11, 0xda, 0x21, 0xb0, 0xa7, 0x25, 0x84, 0x3a,
-       0xe7, 0x39, 0x95, 0xcf, 0x89, 0x1d, 0x7e, 0xae, 0x78, 0xf4, 0xf7, 0x89,
-       0x5b, 0x82, 0x1d, 0x11, 0x62, 0xd6, 0xdd, 0x52, 0x8f, 0x66, 0x32, 0xf4,
-       0x77, 0x3f, 0xfd, 0x7d, 0xab, 0xf8, 0xb4, 0x45, 0x9f, 0xb6, 0xe8, 0xd3,
-       0x96, 0x16, 0x1d, 0x42, 0x5c, 0x1d, 0xe0, 0xba, 0xa5, 0xa3, 0xe2, 0xeb,
-       0xbd, 0xd8, 0xc7, 0xdf, 0xfb, 0x78, 0xff, 0x08, 0x6b, 0x54, 0x2c, 0x95,
-       0x39, 0x0f, 0xa1, 0xc3, 0x7a, 0x02, 0x83, 0x39, 0xfc, 0x22, 0xd8, 0x52,
-       0x89, 0xca, 0xd5, 0x52, 0x7f, 0x6b, 0xea, 0x51, 0x3c, 0xc1, 0x1a, 0xe8,
-       0xe7, 0x4a, 0xb5, 0xee, 0xeb, 0x39, 0xa6, 0x68, 0x6a, 0x07, 0x6b, 0xd9,
-       0xbd, 0x85, 0xbb, 0xb9, 0xbe, 0xf1, 0xc1, 0xd7, 0x15, 0xd6, 0x41, 0x75,
-       0x9c, 0x9b, 0xb1, 0x74, 0x07, 0xe7, 0xb1, 0x44, 0x0e, 0x07, 0x5f, 0x7f,
-       0x0f, 0x62, 0xdb, 0x6f, 0x37, 0x0e, 0x70, 0x7e, 0x57, 0x8e, 0x51, 0xd6,
-       0x83, 0x03, 0x8c, 0xb1, 0x7d, 0x4e, 0x7c, 0xf5, 0x72, 0x8c, 0xeb, 0xb8,
-       0xb5, 0x25, 0x2b, 0xf9, 0xd2, 0xc6, 0x93, 0x86, 0x8d, 0xe7, 0xf9, 0x7b,
-       0x81, 0xd8, 0x35, 0x76, 0x03, 0x76, 0x79, 0xf8, 0xdc, 0x1e, 0x3e, 0xd7,
-       0x4a, 0xdc, 0x9e, 0x9f, 0x95, 0xbe, 0xde, 0x21, 0xe9, 0xeb, 0x21, 0x6f,
-       0x89, 0xed, 0x87, 0x70, 0x3e, 0x1b, 0x1f, 0xf6, 0x7a, 0xed, 0x11, 0xc6,
-       0xd5, 0x85, 0x8f, 0xe8, 0xbb, 0x6f, 0x6e, 0xd0, 0x7a, 0x68, 0xc3, 0xe4,
-       0xa4, 0xa2, 0x45, 0xbf, 0x8b, 0xe2, 0xf6, 0x00, 0x9a, 0x62, 0x6b, 0xbd,
-       0x09, 0x95, 0x38, 0x57, 0x1c, 0xa0, 0xa6, 0xcf, 0x16, 0x5c, 0x6c, 0xdb,
-       0x54, 0xc2, 0xb6, 0xd6, 0x7c, 0x15, 0xb1, 0x87, 0x39, 0x78, 0xd6, 0xce,
-       0x84, 0x99, 0x9f, 0x0a, 0xb3, 0x32, 0xf6, 0x08, 0x9a, 0x52, 0x32, 0x96,
-       0xde, 0x39, 0xa9, 0xe0, 0x4b, 0xd5, 0x48, 0x30, 0x37, 0xc1, 0xa8, 0xd4,
-       0x33, 0x36, 0x73, 0x90, 0xea, 0x37, 0x25, 0x3f, 0x76, 0x13, 0x0f, 0x7b,
-       0x89, 0x87, 0xc2, 0x99, 0xa5, 0xd7, 0xe9, 0xe2, 0xd1, 0xd6, 0x82, 0xac,
-       0x8b, 0xac, 0x89, 0xac, 0xcd, 0x21, 0xdc, 0x6b, 0x49, 0xdd, 0x6e, 0x63,
-       0xca, 0x48, 0xc4, 0x9e, 0x83, 0xac, 0xd3, 0x21, 0xda, 0xc2, 0x8f, 0x7d,
-       0xc4, 0xbf, 0xbd, 0x2d, 0xb4, 0x55, 0xd8, 0x8f, 0xbd, 0x4e, 0x1f, 0xa0,
-       0x6c, 0x3f, 0x3f, 0xd7, 0x50, 0x61, 0x4e, 0xfb, 0xaa, 0xdf, 0xb5, 0xa3,
-       0xdb, 0x57, 0xf4, 0x9a, 0x32, 0x5e, 0xb9, 0xa7, 0xe8, 0xda, 0x6e, 0x7b,
-       0x56, 0xc6, 0xb5, 0x71, 0xd6, 0x70, 0xb9, 0x69, 0xd9, 0x66, 0x82, 0xed,
-       0x4b, 0x36, 0x02, 0x6b, 0x6f, 0xe0, 0xa7, 0x55, 0xbc, 0xd6, 0x75, 0x9d,
-       0x9f, 0xf6, 0x09, 0x07, 0x26, 0x3f, 0xed, 0xdc, 0x49, 0x7e, 0xda, 0xa0,
-       0x94, 0xb9, 0xa9, 0xf4, 0x14, 0xca, 0xfc, 0xb4, 0xb6, 0x84, 0xcd, 0x87,
-       0xb0, 0x97, 0xdc, 0xa5, 0xae, 0x61, 0x04, 0x81, 0x75, 0x9e, 0x4f, 0x3d,
-       0x18, 0x61, 0xed, 0x51, 0x01, 0x2c, 0xb3, 0xb1, 0x72, 0x7d, 0xc6, 0xae,
-       0xd4, 0x1b, 0x62, 0x95, 0x1e, 0xe9, 0x19, 0x27, 0x32, 0x63, 0xc4, 0x12,
-       0xcf, 0x3a, 0x2d, 0x93, 0x46, 0x40, 0x5d, 0xa2, 0xdf, 0x5d, 0xaa, 0x09,
-       0xa2, 0x81, 0x1d, 0xe4, 0x36, 0x89, 0xd4, 0x2f, 0xed, 0x99, 0xc8, 0x08,
-       0xa2, 0xeb, 0x8a, 0xc3, 0x51, 0xa4, 0x0f, 0x46, 0x1d, 0x5c, 0x99, 0x40,
-       0x3e, 0x11, 0x0d, 0x74, 0x17, 0x32, 0xc1, 0xae, 0xc6, 0x18, 0x76, 0x4e,
-       0x76, 0xb0, 0xe6, 0xd0, 0xb1, 0x6d, 0xb2, 0x93, 0xf5, 0x51, 0x8f, 0xd2,
-       0x33, 0x2b, 0xf6, 0x11, 0xfb, 0x6a, 0x6a, 0xcc, 0x73, 0x63, 0x2f, 0xb3,
-       0x5c, 0xcf, 0xbe, 0xef, 0xf8, 0xce, 0xb8, 0xa1, 0xd2, 0x2e, 0xff, 0xdb,
-       0x8f, 0xb0, 0x8d, 0x33, 0x86, 0xf8, 0x1c, 0xbf, 0xb3, 0xb6, 0xda, 0xda,
-       0x32, 0x65, 0xfb, 0x74, 0xe9, 0x49, 0x47, 0x9d, 0xf5, 0x92, 0x1a, 0xab,
-       0x63, 0xb6, 0x97, 0x6b, 0x54, 0xee, 0x3f, 0xdf, 0xb8, 0x56, 0x9b, 0x83,
-       0x5b, 0x89, 0x67, 0xac, 0xc7, 0x02, 0x01, 0x62, 0x64, 0xe0, 0x94, 0x8d,
-       0x59, 0xe3, 0x1d, 0xfb, 0x49, 0xdd, 0xc7, 0xf5, 0xb8, 0x95, 0x78, 0x2b,
-       0xfc, 0xc3, 0x0c, 0xee, 0x9a, 0xf6, 0x79, 0x58, 0x5b, 0xb5, 0x54, 0xc0,
-       0xa9, 0xad, 0x9c, 0x3e, 0xe1, 0xb1, 0xfc, 0x6d, 0xc1, 0xae, 0x1c, 0xeb,
-       0x04, 0xd6, 0xa9, 0x6e, 0x8d, 0x76, 0x6b, 0xf0, 0x9e, 0x9c, 0x57, 0xa9,
-       0x33, 0xe1, 0x6d, 0xdd, 0x68, 0xe3, 0xe3, 0xf5, 0x89, 0xe1, 0xa8, 0x87,
-       0xd8, 0xc8, 0xb1, 0xac, 0x7c, 0x4b, 0xb0, 0x8f, 0x58, 0x7c, 0x7b, 0x0e,
-       0x69, 0xe9, 0xa9, 0x86, 0xd7, 0x8f, 0xf6, 0x87, 0x21, 0xfd, 0x2f, 0x7c,
-       0x89, 0xd1, 0x18, 0xa1, 0xaf, 0x45, 0xdb, 0x95, 0xc4, 0xe2, 0x20, 0x12,
-       0x17, 0x3e, 0xf6, 0xbe, 0x63, 0x3f, 0x9d, 0xdf, 0xc8, 0xe7, 0x3b, 0x89,
-       0x93, 0x69, 0xe2, 0xe6, 0xe8, 0xb0, 0x1f, 0xf2, 0x8e, 0xd6, 0xf7, 0xb6,
-       0x12, 0xa7, 0x8f, 0xe3, 0x77, 0xf8, 0xbc, 0xba, 0x8d, 0x18, 0x39, 0x6b,
-       0x24, 0xd2, 0x5b, 0x90, 0xe9, 0xac, 0x85, 0x66, 0x34, 0x2a, 0xd2, 0xaf,
-       0x12, 0xfb, 0x27, 0xf1, 0x3d, 0xce, 0xe9, 0xd3, 0xc5, 0x8e, 0x9b, 0x31,
-       0x30, 0xab, 0xa9, 0xd7, 0xfd, 0x4c, 0x6c, 0x20, 0x76, 0xe9, 0xa8, 0x40,
-       0xd5, 0x52, 0xea, 0xf6, 0x3d, 0x07, 0x4f, 0x82, 0xba, 0x8e, 0xff, 0x42,
-       0x1e, 0xf4, 0x17, 0x05, 0xe9, 0x4b, 0x96, 0xb9, 0x9d, 0xf8, 0x44, 0x73,
-       0xdb, 0x2d, 0x33, 0xc9, 0x52, 0x9f, 0x32, 0x10, 0xec, 0x9c, 0xb6, 0x71,
-       0xd2, 0x08, 0x43, 0xea, 0xf3, 0xca, 0x54, 0x91, 0x19, 0xbf, 0x19, 0xdb,
-       0x78, 0xbd, 0x63, 0xba, 0x5a, 0xe9, 0xc8, 0xd9, 0xf8, 0xa6, 0xa1, 0x65,
-       0xda, 0xbd, 0x8c, 0x65, 0x43, 0x3b, 0x0b, 0x5c, 0x26, 0x27, 0x12, 0xdf,
-       0xf2, 0x21, 0xa4, 0xbb, 0x63, 0x35, 0xcf, 0xdc, 0x46, 0xbe, 0x20, 0xb1,
-       0xe5, 0x5d, 0x53, 0x85, 0x94, 0x32, 0xe3, 0x13, 0xbb, 0x75, 0x22, 0x5d,
-       0xa8, 0x56, 0x76, 0xd3, 0x96, 0x77, 0xac, 0xab, 0xc0, 0x25, 0xc7, 0x96,
-       0xb7, 0xd1, 0x96, 0x78, 0x6b, 0x05, 0xbc, 0xe7, 0xeb, 0xd0, 0xa9, 0xc0,
-       0xa9, 0xbd, 0xaa, 0x99, 0x9f, 0xd3, 0xe4, 0xae, 0xe4, 0x7d, 0x6a, 0x2f,
-       0xbe, 0x42, 0x9c, 0x79, 0x92, 0x3e, 0xfa, 0x33, 0xbd, 0x19, 0x55, 0x5f,
-       0x6d, 0xe1, 0x3a, 0x6e, 0x0c, 0xee, 0xc8, 0xf5, 0xe1, 0xa9, 0x79, 0x1b,
-       0xcf, 0x31, 0x3e, 0x1a, 0x53, 0x19, 0xb5, 0x92, 0xb5, 0x18, 0x73, 0xd9,
-       0xe2, 0x09, 0xc7, 0xbf, 0x57, 0xb6, 0x6d, 0x9e, 0x8b, 0xc2, 0xfb, 0x15,
-       0xf9, 0xbb, 0xbe, 0x2d, 0x36, 0x27, 0x9f, 0x51, 0x7e, 0xda, 0x18, 0x32,
-       0xb4, 0xf4, 0xc7, 0xde, 0x2a, 0x54, 0x27, 0x6c, 0x7b, 0x28, 0x25, 0xd7,
-       0xf5, 0xb6, 0xa4, 0x73, 0xbf, 0x81, 0x9f, 0xe5, 0x3e, 0xf2, 0xeb, 0xc2,
-       0xf9, 0x62, 0x69, 0xea, 0xbc, 0x93, 0x79, 0xbd, 0x8f, 0x79, 0xbd, 0xce,
-       0xd4, 0xd2, 0x7b, 0xbc, 0xd2, 0x3b, 0x29, 0x1e, 0xac, 0xe5, 0xf5, 0x5d,
-       0xa5, 0xbc, 0x5e, 0x73, 0x4a, 0xfa, 0x70, 0xe4, 0x7a, 0x70, 0xf7, 0x2f,
-       0xba, 0x99, 0xd7, 0xab, 0x26, 0x7d, 0xe8, 0x62, 0x4e, 0xf7, 0x93, 0x67,
-       0x6f, 0xcd, 0xd7, 0x21, 0x78, 0xc2, 0x8b, 0x78, 0xea, 0xdb, 0x38, 0x48,
-       0x1f, 0x3b, 0x98, 0xf4, 0x2a, 0xb1, 0xe5, 0x1e, 0xda, 0xe9, 0x9f, 0x70,
-       0x40, 0xf5, 0xa2, 0x46, 0xff, 0x2e, 0x1e, 0xfa, 0x35, 0xb9, 0xbc, 0x2f,
-       0x27, 0x31, 0xbd, 0xb2, 0xad, 0xeb, 0x94, 0x9b, 0xcb, 0x43, 0xa7, 0x46,
-       0x17, 0x25, 0x97, 0xd7, 0xad, 0xef, 0xc3, 0xe9, 0x69, 0xfc, 0xe1, 0x0a,
-       0x92, 0xc4, 0x3a, 0xce, 0xd9, 0x90, 0x4a, 0xb0, 0x6e, 0xd6, 0x06, 0xb7,
-       0x29, 0x89, 0x89, 0x1a, 0xc6, 0xfe, 0x69, 0xe6, 0xf2, 0x80, 0x99, 0x50,
-       0x93, 0x1e, 0x74, 0xfb, 0xb9, 0x1e, 0x1f, 0xb0, 0x86, 0xfe, 0x61, 0x3e,
-       0xc6, 0x31, 0x2b, 0xe0, 0x63, 0x2e, 0xff, 0x40, 0xc7, 0xa7, 0x5e, 0xfa,
-       0xde, 0x65, 0x6f, 0x00, 0x57, 0xf3, 0x6e, 0x2e, 0xaf, 0x6d, 0xb4, 0x47,
-       0xae, 0xa4, 0x42, 0xf8, 0x30, 0x6f, 0xd0, 0x07, 0xfb, 0x70, 0x84, 0xb9,
-       0xfc, 0x8a, 0xae, 0xe2, 0xa7, 0xf9, 0x56, 0xfa, 0x65, 0x04, 0x3f, 0x21,
-       0xcf, 0x5d, 0xc7, 0x5c, 0x7e, 0x27, 0x7d, 0x2a, 0xc5, 0x5c, 0xde, 0xee,
-       0xf0, 0x8c, 0xe6, 0xb6, 0x33, 0x53, 0x4e, 0x2e, 0x6f, 0x64, 0x89, 0x5f,
-       0xef, 0x47, 0x62, 0x91, 0xf8, 0x60, 0xff, 0x6c, 0x63, 0x88, 0xcf, 0xd2,
-       0x6e, 0x85, 0xf5, 0x98, 0x71, 0x72, 0xcf, 0xe6, 0xe0, 0x6e, 0xce, 0xbd,
-       0xcc, 0x89, 0x33, 0x1b, 0x3b, 0xd7, 0xbd, 0x89, 0x3f, 0x58, 0xe2, 0xa1,
-       0x1f, 0x9a, 0xc1, 0x3b, 0x18, 0x6b, 0x61, 0xfa, 0xd7, 0x4f, 0x53, 0x89,
-       0xfe, 0x73, 0xac, 0x21, 0x7f, 0xc2, 0x38, 0xbb, 0x93, 0xbe, 0xb1, 0x72,
-       0x5d, 0x80, 0xeb, 0xee, 0xc6, 0x59, 0x07, 0xe3, 0x2c, 0xca, 0x38, 0x5b,
-       0xc1, 0x38, 0x7b, 0xda, 0x48, 0x24, 0x37, 0x93, 0x6f, 0xbd, 0x9e, 0x97,
-       0x58, 0x6b, 0xe1, 0xb8, 0x1a, 0xf5, 0x1a, 0xed, 0x97, 0x98, 0xd9, 0xb9,
-       0x6e, 0xf4, 0x6c, 0x35, 0xc4, 0x56, 0xf8, 0x74, 0x19, 0xb9, 0x05, 0x11,
-       0xe9, 0xc2, 0xa2, 0x37, 0x31, 0xbc, 0xca, 0x9b, 0x18, 0x7a, 0x5f, 0x79,
-       0xc7, 0x7e, 0x8b, 0x71, 0x76, 0x3b, 0xe3, 0x6c, 0x37, 0xe3, 0xac, 0xdd,
-       0xb2, 0xf1, 0x52, 0x4a, 0xeb, 0x6b, 0xf6, 0xc4, 0x8d, 0x76, 0x0f, 0x56,
-       0x54, 0x33, 0x25, 0x04, 0x91, 0xe8, 0xfc, 0x03, 0xca, 0x7f, 0xc1, 0x48,
-       0xf4, 0x24, 0x15, 0x89, 0xad, 0x18, 0x7e, 0x4c, 0xbd, 0x2b, 0x4b, 0xb1,
-       0xb5, 0x7f, 0xf6, 0xd5, 0x92, 0x6f, 0x94, 0x75, 0xf7, 0xe2, 0x45, 0x83,
-       0x18, 0xba, 0x54, 0x8b, 0x65, 0x3c, 0xbd, 0x98, 0xa0, 0x1d, 0x83, 0x89,
-       0x5e, 0x1c, 0x65, 0x1e, 0xbc, 0x9f, 0xf9, 0xf7, 0x01, 0x2b, 0xde, 0xba,
-       0x83, 0x75, 0xce, 0xa5, 0xa8, 0x16, 0x8b, 0x29, 0xbd, 0x18, 0xa0, 0x0f,
-       0x0f, 0x30, 0x5f, 0xb4, 0x5b, 0x3f, 0x57, 0xb6, 0x91, 0x23, 0xdc, 0x57,
-       0x90, 0xf7, 0xb4, 0x64, 0xbf, 0x67, 0x10, 0xfd, 0xf3, 0x82, 0x6d, 0x50,
-       0x6f, 0x32, 0x7b, 0x71, 0xdc, 0xaa, 0x40, 0x6f, 0x4b, 0xb7, 0xb2, 0xab,
-       0x20, 0xbd, 0x33, 0xc6, 0xa3, 0xc5, 0x78, 0x75, 0xe4, 0x55, 0x88, 0xa5,
-       0xdd, 0xc8, 0x4a, 0x7c, 0x5a, 0xbb, 0x95, 0x3b, 0x67, 0x25, 0xc6, 0x7b,
-       0x95, 0x5e, 0x89, 0x61, 0x6b, 0x58, 0xb9, 0x4b, 0x62, 0xda, 0xe9, 0x33,
-       0x4b, 0xdc, 0xcb, 0x3e, 0xc4, 0x6d, 0xe4, 0x6f, 0x60, 0x4c, 0x79, 0xbf,
-       0x1a, 0x65, 0xdc, 0xb5, 0x57, 0x78, 0xe8, 0xa7, 0x71, 0xae, 0x9d, 0x07,
-       0x1d, 0xc6, 0x6f, 0xda, 0x19, 0xb5, 0x9f, 0x31, 0xd5, 0x8b, 0x23, 0xd6,
-       0x6f, 0xd8, 0x57, 0x1c, 0x5e, 0x52, 0xc6, 0xf3, 0xcd, 0xb8, 0x37, 0xb7,
-       0x1c, 0x01, 0x5d, 0xf2, 0x75, 0x08, 0xc9, 0x25, 0x01, 0x54, 0xe9, 0x92,
-       0x67, 0x9a, 0xdb, 0x16, 0x4e, 0x50, 0x86, 0x0d, 0xe5, 0xf8, 0xde, 0x8c,
-       0x07, 0x89, 0x03, 0xfb, 0x52, 0xf7, 0xe2, 0x01, 0xb5, 0x0a, 0x61, 0xda,
-       0xe9, 0x61, 0x35, 0x44, 0x7c, 0xfd, 0xbd, 0xd2, 0x38, 0xff, 0xa9, 0xa2,
-       0x54, 0x33, 0x5f, 0xe3, 0x54, 0x75, 0x8c, 0xb1, 0x4d, 0xd3, 0x52, 0x9b,
-       0x44, 0xdb, 0xa2, 0xd3, 0x3a, 0xc2, 0xac, 0x55, 0x37, 0xa7, 0xb4, 0xe1,
-       0xcd, 0xde, 0xf8, 0xe0, 0xa2, 0x82, 0x6c, 0x98, 0x7c, 0x2e, 0x9f, 0x48,
-       0xf4, 0x34, 0x8b, 0x8d, 0xf5, 0x28, 0xb6, 0xd3, 0x4e, 0x5d, 0xf9, 0x08,
-       0x63, 0xe8, 0xbd, 0x0a, 0xe1, 0x46, 0xe9, 0xfc, 0xf5, 0xb1, 0xa2, 0x1c,
-       0x2b, 0x3a, 0x2d, 0x3c, 0x2d, 0x4a, 0x9e, 0xa6, 0x33, 0x0e, 0x6d, 0x7b,
-       0x13, 0xf9, 0x59, 0xe8, 0x94, 0xd4, 0x38, 0xf1, 0x09, 0x72, 0xda, 0x66,
-       0xf2, 0xdd, 0x5e, 0x7a, 0xb5, 0xbd, 0xb2, 0x21, 0x61, 0xb4, 0x2b, 0x78,
-       0x62, 0xae, 0x85, 0xf5, 0x11, 0xc7, 0xbc, 0x9c, 0x57, 0x71, 0x25, 0x1f,
-       0xc5, 0xbb, 0x1c, 0xfb, 0x92, 0x33, 0x76, 0x3d, 0x7e, 0x54, 0xc2, 0xad,
-       0x14, 0x71, 0x6b, 0x4b, 0x4e, 0xa1, 0xbf, 0xc6, 0x30, 0x62, 0xfc, 0xdd,
-       0xa7, 0x97, 0x6e, 0x0e, 0xd0, 0x6e, 0xa2, 0x8b, 0x8f, 0x9f, 0xe3, 0x78,
-       0xd8, 0xc1, 0xe9, 0x37, 0x3f, 0x9d, 0x59, 0xc2, 0xb5, 0xa2, 0xed, 0x6b,
-       0x4b, 0xef, 0xad, 0x9d, 0xf9, 0xf3, 0x92, 0xbe, 0x3a, 0x3c, 0xa7, 0x92,
-       0xa8, 0x38, 0x75, 0x4d, 0x56, 0x5d, 0xe2, 0x83, 0x19, 0xf5, 0x89, 0xaf,
-       0x71, 0xfe, 0xc7, 0xc8, 0xf5, 0x6c, 0xce, 0x7f, 0xd5, 0x99, 0x37, 0xc2,
-       0x79, 0x95, 0x6b, 0xbc, 0x30, 0x7a, 0xed, 0x1d, 0x95, 0xba, 0xe3, 0xf1,
-       0x28, 0x6d, 0xf7, 0xe1, 0x06, 0x79, 0x2e, 0x84, 0x5d, 0xf9, 0x15, 0x95,
-       0x82, 0xe3, 0x41, 0xd6, 0x01, 0xae, 0x2f, 0x91, 0xe7, 0x59, 0xcf, 0xf1,
-       0x9e, 0xf0, 0xae, 0xcd, 0xe4, 0x18, 0x9f, 0xb5, 0x7b, 0x84, 0x6b, 0xf1,
-       0x7f, 0xf8, 0x8e, 0xdc, 0xfb, 0x75, 0x79, 0xf4, 0x4f, 0x31, 0xcc, 0x1a,
-       0xe8, 0xb1, 0x5c, 0x06, 0x0f, 0xe7, 0xbe, 0xec, 0xec, 0xab, 0xad, 0x5d,
-       0x8f, 0xfb, 0x38, 0xe7, 0x81, 0x5a, 0xc6, 0xd1, 0x7f, 0x4b, 0x25, 0x84,
-       0x1b, 0xed, 0xae, 0x86, 0xe4, 0xda, 0x44, 0xeb, 0x2a, 0xc5, 0x46, 0x45,
-       0x0a, 0x43, 0x1d, 0x2d, 0x89, 0xe4, 0x15, 0x3c, 0x61, 0x4b, 0x5f, 0xd3,
-       0x5b, 0xca, 0xbb, 0x52, 0xff, 0x49, 0x6f, 0xb5, 0xbd, 0xc4, 0x91, 0xb6,
-       0x14, 0xde, 0xf9, 0x4c, 0xef, 0x40, 0xea, 0x6e, 0xc9, 0x37, 0x41, 0xa5,
-       0x9d, 0xf3, 0x1c, 0x21, 0x66, 0xbf, 0x68, 0xbc, 0x12, 0x65, 0x36, 0x86,
-       0x6f, 0x9d, 0x82, 0x83, 0x86, 0x1f, 0x99, 0x88, 0x8d, 0xdd, 0xfc, 0xdc,
-       0x4f, 0xde, 0xf4, 0x9e, 0x51, 0x83, 0x19, 0x55, 0x25, 0x57, 0x24, 0x06,
-       0x7b, 0xde, 0xf4, 0xcb, 0x5e, 0x4c, 0xcc, 0x23, 0xfb, 0xe6, 0xff, 0xd6,
-       0x5e, 0xca, 0x3a, 0xf2, 0x16, 0xd1, 0x3d, 0xa8, 0x10, 0x43, 0x93, 0x20,
-       0x97, 0xd9, 0x6b, 0x14, 0x63, 0x1e, 0xa4, 0xaf, 0x7a, 0xa0, 0x9d, 0xbe,
-       0xcc, 0xfa, 0xee, 0xb1, 0x06, 0xed, 0x74, 0x9b, 0x57, 0xc7, 0xf0, 0xf1,
-       0x00, 0x1e, 0x39, 0xbe, 0x0d, 0xb5, 0x4e, 0xef, 0x67, 0x9c, 0x36, 0xf5,
-       0xb0, 0xae, 0x1a, 0xfd, 0xa5, 0x8f, 0xf5, 0xd5, 0xd5, 0xf5, 0x8f, 0xa3,
-       0xd5, 0xb9, 0x3e, 0x86, 0xfb, 0x72, 0x41, 0xa5, 0x2b, 0xe7, 0xc3, 0xb6,
-       0x3b, 0x1f, 0x87, 0x7f, 0x5d, 0x3f, 0xe5, 0x92, 0xeb, 0xf2, 0xf7, 0x5d,
-       0xac, 0xcb, 0x44, 0xbe, 0x0a, 0xc4, 0x96, 0x53, 0xb6, 0x75, 0x3a, 0x46,
-       0x8e, 0xfb, 0x94, 0x3d, 0xd6, 0x7f, 0xb7, 0xaf, 0x3a, 0xfb, 0x34, 0x72,
-       0xad, 0x4a, 0xf6, 0xef, 0xf9, 0x8c, 0x60, 0xce, 0x00, 0x72, 0x8c, 0xed,
-       0xbb, 0x9c, 0xf7, 0xff, 0xb8, 0xc2, 0xd5, 0x29, 0xcd, 0x7a, 0xb5, 0x83,
-       0xeb, 0x27, 0xcf, 0x24, 0x4b, 0xd7, 0x9a, 0x03, 0xee, 0x19, 0x01, 0xf1,
-       0x85, 0x01, 0xdc, 0xc2, 0x45, 0x68, 0x48, 0x88, 0x8f, 0x0d, 0xa0, 0x21,
-       0x4f, 0x40, 0x5d, 0xee, 0xca, 0xfb, 0x90, 0x55, 0x64, 0xad, 0xa9, 0x13,
-       0x37, 0x69, 0xbb, 0x65, 0xf2, 0xfe, 0x2f, 0x2a, 0x7f, 0xf5, 0x7d, 0xc1,
-       0x5b, 0x72, 0xcc, 0xb0, 0x70, 0xcd, 0x5f, 0x77, 0xff, 0xb7, 0x20, 0xf7,
-       0x7c, 0xfa, 0x9f, 0x30, 0x8e, 0x13, 0x3d, 0xd5, 0x1e, 0xf1, 0x9f, 0x3f,
-       0xc1, 0x03, 0xb3, 0x8f, 0xf0, 0xbe, 0x8c, 0x7f, 0x88, 0x35, 0x84, 0x4f,
-       0xe9, 0x24, 0xfe, 0xec, 0x3f, 0xee, 0xd9, 0x55, 0x81, 0xbf, 0xb4, 0x2b,
-       0x97, 0x8d, 0xa0, 0x21, 0x35, 0xc6, 0xe7, 0x15, 0x74, 0x90, 0x2f, 0x3e,
-       0x65, 0x6c, 0xc1, 0xb6, 0x25, 0x82, 0x01, 0x2f, 0xda, 0x03, 0xbd, 0x62,
-       0x43, 0x05, 0x5b, 0x79, 0xfd, 0x25, 0xae, 0xef, 0xb3, 0x86, 0x0f, 0x0d,
-       0x4b, 0xa5, 0x8f, 0xa7, 0x4d, 0xa5, 0xd1, 0x1e, 0x70, 0xf7, 0xab, 0x32,
-       0x76, 0xad, 0xae, 0x0f, 0xdd, 0xe1, 0x69, 0x98, 0x7a, 0x9b, 0xfe, 0xd4,
-       0xbe, 0xee, 0xc6, 0x7b, 0x65, 0x9b, 0x18, 0xe4, 0x90, 0x2f, 0xd8, 0xb8,
-       0x69, 0x14, 0xea, 0xba, 0x1b, 0xd7, 0xbf, 0x2c, 0xf7, 0x21, 0xc6, 0x20,
-       0x32, 0xb5, 0xa6, 0xf4, 0x79, 0x12, 0x1c, 0xe7, 0x10, 0x7e, 0xbf, 0x30,
-       0x86, 0x83, 0xb9, 0x12, 0xa7, 0xa6, 0x6f, 0xeb, 0xeb, 0xae, 0xeb, 0xf6,
-       0x50, 0x2e, 0xd1, 0x5f, 0x53, 0xd2, 0xed, 0x00, 0xeb, 0x8b, 0x6a, 0x62,
-       0xec, 0x83, 0xb4, 0xe9, 0x90, 0x63, 0xd3, 0x5e, 0x18, 0xf9, 0xeb, 0xe3,
-       0x0e, 0x72, 0xdc, 0xa0, 0x29, 0x76, 0x93, 0x3d, 0xb2, 0x43, 0xd8, 0xcf,
-       0x71, 0xf7, 0xdd, 0x30, 0xee, 0x80, 0x71, 0x7d, 0xdc, 0xbd, 0xb9, 0xc4,
-       0x69, 0x4f, 0x69, 0xdc, 0x47, 0x67, 0xcb, 0x63, 0x64, 0x70, 0xfb, 0xba,
-       0x0c, 0xf2, 0x9b, 0x0e, 0xd8, 0x07, 0x1c, 0x7b, 0x9c, 0x72, 0xae, 0x6f,
-       0x6d, 0x10, 0xee, 0xc5, 0x3f, 0x4d, 0xd9, 0x8f, 0x4f, 0x92, 0x7b, 0xe9,
-       0xce, 0x9e, 0xf0, 0x37, 0x0a, 0xe5, 0xbe, 0x94, 0xf6, 0x4e, 0x97, 0x37,
-       0xcd, 0xd8, 0x8e, 0x04, 0x76, 0x7c, 0xa6, 0x97, 0xb1, 0x8d, 0xf5, 0xd7,
-       0x76, 0xab, 0x3b, 0xd8, 0x69, 0x05, 0xc8, 0xbb, 0xaa, 0x95, 0xad, 0x39,
-       0xe9, 0x69, 0x48, 0x2c, 0x97, 0xb8, 0x70, 0x41, 0xea, 0xbc, 0xbb, 0x59,
-       0x1f, 0x2c, 0x0f, 0x20, 0xdc, 0x8f, 0x89, 0xc2, 0xef, 0x2a, 0xe9, 0x88,
-       0xec, 0x4d, 0x4b, 0x5e, 0x01, 0x73, 0x5e, 0x0f, 0xaa, 0xe9, 0x4b, 0x11,
-       0xd3, 0x30, 0x4f, 0x36, 0xd8, 0x20, 0x47, 0x09, 0x2c, 0x35, 0xd3, 0xe6,
-       0xee, 0x06, 0x2f, 0x8e, 0x39, 0xfc, 0x4b, 0x9b, 0xe1, 0xef, 0x94, 0xc4,
-       0xcc, 0x1d, 0x39, 0xc9, 0x63, 0xa4, 0x90, 0xfa, 0x08, 0xfe, 0x31, 0x55,
-       0x1c, 0x5a, 0x82, 0xf4, 0xfd, 0x4b, 0x20, 0xf5, 0xc4, 0x04, 0xfe, 0x4a,
-       0x8f, 0x06, 0xfa, 0x0a, 0x3e, 0xa5, 0xcb, 0x9a, 0x0b, 0xee, 0xb4, 0xc2,
-       0x08, 0xb1, 0x1e, 0xeb, 0xf6, 0xc6, 0x59, 0x5f, 0x88, 0x1d, 0x03, 0x6d,
-       0xb7, 0xe4, 0xfb, 0x82, 0x1d, 0x96, 0x8b, 0x85, 0x2b, 0x67, 0x02, 0xc1,
-       0x6d, 0xd3, 0xf1, 0xe8, 0x84, 0xc3, 0xc5, 0x42, 0x6d, 0xf1, 0xbc, 0x6d,
-       0xbf, 0x61, 0x14, 0xaf, 0x56, 0x3a, 0xdf, 0x8d, 0xb6, 0x64, 0xbe, 0x19,
-       0xf7, 0x90, 0x3f, 0xb5, 0x4f, 0x37, 0xc3, 0x98, 0x06, 0x4e, 0x1c, 0x8f,
-       0x62, 0x6d, 0x4e, 0x3b, 0x3d, 0xec, 0xed, 0xc3, 0xd4, 0x7c, 0x27, 0x72,
-       0x85, 0xe0, 0x62, 0xcc, 0x43, 0x5e, 0x9d, 0xf2, 0x60, 0x97, 0x71, 0x5c,
-       0x29, 0x2e, 0x53, 0x70, 0x17, 0x11, 0xbc, 0xdf, 0xe1, 0x13, 0x73, 0xac,
-       0x47, 0x15, 0xdc, 0xe4, 0xe0, 0x6e, 0x4b, 0xdb, 0x5a, 0xf2, 0xed, 0x3b,
-       0xc9, 0x07, 0x77, 0x11, 0x57, 0x12, 0xeb, 0x6c, 0xbc, 0x99, 0xca, 0xf4,
-       0xd7, 0x40, 0xeb, 0x39, 0xcc, 0x1a, 0xa8, 0x47, 0x71, 0xf9, 0x5d, 0xd3,
-       0x9c, 0xcb, 0x09, 0x57, 0xcd, 0xb5, 0x90, 0x37, 0xb2, 0xae, 0x49, 0x69,
-       0x31, 0x8f, 0x47, 0xc5, 0x94, 0x33, 0x46, 0xac, 0xcd, 0x98, 0xab, 0x60,
-       0xbe, 0xeb, 0xc5, 0xd3, 0x8e, 0xfc, 0x49, 0xca, 0x77, 0x37, 0xbe, 0x66,
-       0xf5, 0x05, 0xfb, 0x2c, 0xd9, 0xbf, 0x8c, 0x27, 0xaf, 0x7a, 0x4d, 0xf2,
-       0xd7, 0x78, 0xac, 0xce, 0xfb, 0x05, 0x25, 0xe3, 0x6b, 0x6a, 0x9d, 0x83,
-       0xa9, 0x5c, 0x2a, 0x71, 0x36, 0xd1, 0x2f, 0x41, 0x8e, 0xd5, 0x7e, 0x3c,
-       0xb8, 0x98, 0x86, 0xdb, 0xb3, 0xd9, 0x66, 0xfc, 0x2f, 0x14, 0x23, 0xda,
-       0x44, 0x9a, 0x18, 0xb0, 0x85, 0x98, 0xdb, 0xdf, 0xeb, 0xe3, 0x7d, 0xe9,
-       0x79, 0xa9, 0x6d, 0xe3, 0x59, 0x14, 0x83, 0x66, 0x22, 0x73, 0x94, 0x9e,
-       0xd3, 0x53, 0x90, 0xfd, 0x8d, 0x00, 0x1e, 0x60, 0xed, 0x94, 0x2e, 0xed,
-       0xfd, 0x6c, 0x9d, 0x76, 0xf7, 0xb3, 0x0e, 0xcf, 0xfb, 0xc2, 0xdd, 0x56,
-       0x0b, 0xf3, 0xbd, 0xef, 0x86, 0xb1, 0x13, 0x13, 0x2b, 0x3d, 0x1e, 0xac,
-       0x5e, 0xb7, 0x47, 0x99, 0x59, 0x56, 0xce, 0xad, 0x51, 0x27, 0x1f, 0x56,
-       0x50, 0xcf, 0xf3, 0x27, 0x65, 0x8e, 0xcf, 0xb5, 0x8d, 0x9f, 0x94, 0x5c,
-       0xab, 0xb6, 0x6d, 0xb2, 0xb4, 0x3e, 0xa9, 0xfd, 0xa2, 0xb4, 0x53, 0x94,
-       0xba, 0xad, 0x30, 0xd7, 0xb4, 0xd9, 0xd3, 0x5a, 0x74, 0x40, 0x49, 0x93,
-       0xf7, 0x69, 0xc9, 0x5b, 0xbc, 0x1e, 0x3c, 0xa2, 0x6b, 0x83, 0xd2, 0x13,
-       0x7c, 0x19, 0x2e, 0x07, 0x6e, 0x9a, 0x1b, 0x60, 0x5e, 0x73, 0x6d, 0xeb,
-       0xf6, 0x07, 0xeb, 0xdb, 0x9a, 0x1d, 0x5e, 0x6c, 0xdb, 0x97, 0x53, 0xdd,
-       0xe4, 0x0c, 0xc2, 0x8b, 0xe5, 0xfa, 0xea, 0xb6, 0xc6, 0x99, 0x00, 0x65,
-       0x53, 0xf0, 0x3e, 0x73, 0xd2, 0x44, 0xa1, 0x2c, 0xa3, 0xcb, 0x99, 0x77,
-       0x90, 0x33, 0x57, 0x99, 0x5a, 0x6b, 0x17, 0x39, 0xb3, 0x9e, 0x2a, 0xd6,
-       0xf9, 0xd0, 0x8b, 0xa7, 0xac, 0x66, 0x39, 0xe3, 0xe4, 0xf0, 0xe6, 0x2b,
-       0x27, 0xb5, 0xb4, 0x70, 0xe6, 0x1f, 0x18, 0xc0, 0x3d, 0xe4, 0xcc, 0x57,
-       0xb3, 0x3e, 0xec, 0x21, 0x67, 0x5e, 0xcc, 0x06, 0xd0, 0x47, 0xce, 0xfc,
-       0x11, 0xf9, 0xd5, 0xbb, 0xa9, 0x2b, 0x78, 0xb4, 0xd4, 0x07, 0xdb, 0x9b,
-       0xf4, 0xd0, 0xaf, 0x85, 0x37, 0xff, 0xbc, 0xc4, 0x9b, 0xe7, 0xff, 0x05,
-       0x6f, 0xde, 0x4a, 0x3e, 0xd8, 0x9d, 0x13, 0x4e, 0xb0, 0x92, 0x9c, 0xc0,
-       0xc6, 0xcb, 0xa5, 0x1e, 0xd8, 0x0a, 0xe6, 0xb3, 0xa7, 0x53, 0x7d, 0xc8,
-       0x4e, 0x63, 0x79, 0x8d, 0xd3, 0x77, 0x12, 0x99, 0x34, 0xe3, 0xb2, 0x92,
-       0xe8, 0xec, 0x43, 0x82, 0xf5, 0xb1, 0x96, 0xbc, 0xe8, 0xf6, 0xc0, 0x16,
-       0xdf, 0x85, 0xf4, 0x88, 0x7c, 0xa8, 0x59, 0x00, 0x56, 0xdc, 0xd0, 0x03,
-       0xab, 0x49, 0xe0, 0x4f, 0xeb, 0x20, 0xfb, 0x9a, 0x0c, 0xb3, 0x85, 0x66,
-       0xc6, 0xa7, 0x82, 0x23, 0x89, 0x10, 0xba, 0x8f, 0x93, 0xf3, 0x38, 0x3d,
-       0x30, 0x7b, 0xe4, 0x3b, 0x46, 0x1f, 0x8e, 0xce, 0xbb, 0x3d, 0xb0, 0xed,
-       0xe4, 0x6e, 0xbe, 0x44, 0x04, 0x95, 0x0b, 0x3e, 0xbc, 0x40, 0xee, 0xbc,
-       0x95, 0xeb, 0x7c, 0xa6, 0xd4, 0x07, 0x5b, 0xc1, 0x18, 0xb1, 0x73, 0x2a,
-       0x66, 0x16, 0xf0, 0x86, 0x17, 0xb8, 0xb8, 0xc2, 0xe9, 0xed, 0x4b, 0xff,
-       0x3f, 0x84, 0x73, 0x0e, 0x77, 0x0e, 0x2e, 0x66, 0x14, 0x57, 0xb7, 0x0a,
-       0xae, 0x89, 0xac, 0xab, 0x87, 0xeb, 0xda, 0x7e, 0x52, 0xeb, 0x7c, 0x85,
-       0xb6, 0x68, 0x4a, 0xbc, 0xea, 0xac, 0xc7, 0x40, 0x4a, 0x6a, 0xd9, 0x40,
-       0x5b, 0xc0, 0x39, 0x0f, 0xa5, 0xb6, 0xfd, 0x28, 0x1b, 0xef, 0xa9, 0x2c,
-       0xc5, 0xe3, 0xaa, 0x7c, 0x05, 0xd2, 0x25, 0x1f, 0x09, 0xd0, 0xa7, 0x03,
-       0x93, 0x69, 0x54, 0x6d, 0x70, 0xfd, 0x7b, 0x55, 0x7e, 0x9c, 0xbc, 0xb5,
-       0x53, 0xea, 0xe8, 0xf0, 0x76, 0xab, 0x13, 0x53, 0x56, 0x0c, 0x95, 0xe7,
-       0x4a, 0x7b, 0xa6, 0xe7, 0xe4, 0xec, 0x5c, 0x7d, 0x9b, 0xfa, 0xd5, 0x32,
-       0x1f, 0x4c, 0x93, 0xe3, 0x44, 0x02, 0x77, 0x14, 0x84, 0x2b, 0xf6, 0xe0,
-       0xa8, 0xa5, 0x45, 0xbf, 0x87, 0xf8, 0xd0, 0xfd, 0xb4, 0x51, 0xb1, 0xee,
-       0x7a, 0xbf, 0x69, 0x40, 0xfa, 0x51, 0x9f, 0xe9, 0x37, 0x0d, 0xe7, 0xf0,
-       0x8b, 0xba, 0x96, 0x4a, 0x78, 0xd6, 0xfa, 0xc9, 0xe7, 0xb5, 0xe8, 0xd3,
-       0x78, 0x02, 0x23, 0xb9, 0x9f, 0x2b, 0x21, 0xdd, 0x37, 0xf8, 0x13, 0xaf,
-       0x16, 0x9d, 0x53, 0x42, 0x7c, 0xf7, 0xee, 0x60, 0x97, 0x75, 0x37, 0x71,
-       0x27, 0x9e, 0xec, 0x54, 0xbc, 0x98, 0x89, 0x3a, 0x5c, 0x34, 0xd8, 0xc3,
-       0x6b, 0x53, 0x85, 0x32, 0xa7, 0x71, 0x6b, 0xfe, 0xed, 0xc7, 0x5d, 0xfc,
-       0x88, 0xe7, 0x83, 0x8b, 0x97, 0xe0, 0xea, 0x56, 0x4d, 0x5d, 0x1f, 0x9c,
-       0x54, 0xed, 0xfe, 0x65, 0x12, 0xc3, 0x3a, 0xf6, 0xd0, 0xf7, 0xee, 0x99,
-       0x1e, 0xa0, 0x9c, 0xc2, 0xa5, 0x57, 0x10, 0xa7, 0xfa, 0x30, 0x4e, 0x9c,
-       0xb1, 0x28, 0x5f, 0x8e, 0x35, 0xe4, 0xe2, 0xfa, 0x8c, 0x3d, 0xb9, 0x41,
-       0x37, 0x56, 0x7b, 0x8b, 0x4b, 0xa2, 0xe4, 0x36, 0xeb, 0x98, 0xb7, 0xdb,
-       0x0b, 0xcd, 0xb8, 0x7c, 0x46, 0x67, 0x7d, 0xdb, 0x41, 0xee, 0xde, 0x83,
-       0x87, 0xa9, 0xcf, 0xa3, 0x85, 0xc7, 0x91, 0xfe, 0x92, 0x0f, 0x87, 0x8f,
-       0xa7, 0xb1, 0x6a, 0x5d, 0x0a, 0xe9, 0x2f, 0x06, 0x88, 0x53, 0x21, 0x4c,
-       0x30, 0x16, 0xa1, 0xb8, 0x7e, 0x2e, 0xe7, 0x7f, 0xfe, 0x82, 0x36, 0xfb,
-       0x26, 0xed, 0xf7, 0x8d, 0x6b, 0x7b, 0x00, 0x65, 0xfe, 0x7d, 0x9d, 0xab,
-       0x7a, 0xb9, 0x86, 0xfb, 0x9c, 0xd8, 0x8c, 0x32, 0x36, 0x75, 0x5c, 0x2d,
-       0xf5, 0x12, 0x17, 0x4f, 0x6a, 0x8b, 0xf7, 0x22, 0x3e, 0x7c, 0xd9, 0x8b,
-       0x81, 0x3a, 0xfa, 0x5d, 0x94, 0x5c, 0xf5, 0xc3, 0x44, 0xc2, 0x38, 0x47,
-       0xae, 0x3a, 0xba, 0xc1, 0xe5, 0xaa, 0x9e, 0x05, 0x15, 0x15, 0x0b, 0xac,
-       0x65, 0x9d, 0x5e, 0xe2, 0x37, 0x83, 0x6e, 0x2f, 0x51, 0xf8, 0x4d, 0xab,
-       0x9c, 0x75, 0xba, 0x8d, 0xb5, 0x5c, 0xfa, 0x0a, 0x32, 0xe8, 0x2c, 0xcc,
-       0x04, 0xef, 0x21, 0x36, 0xf7, 0x49, 0x6f, 0xa4, 0x10, 0x09, 0xdf, 0x43,
-       0xde, 0xf5, 0x2d, 0xae, 0xaf, 0xec, 0xed, 0xf6, 0x15, 0x56, 0xf3, 0xbd,
-       0x28, 0x3f, 0x05, 0x57, 0x45, 0xf6, 0x1b, 0xf5, 0xe8, 0xa9, 0x92, 0xbd,
-       0x86, 0x97, 0xa9, 0x43, 0xff, 0xdc, 0x4a, 0x3c, 0x3a, 0xe7, 0xaf, 0x12,
-       0xc2, 0xff, 0x68, 0xde, 0xc5, 0xb6, 0x58, 0xfe, 0xae, 0xa0, 0xf0, 0xc9,
-       0xf6, 0xe3, 0xee, 0x77, 0xfd, 0x86, 0xef, 0x65, 0xfd, 0x56, 0x50, 0x3f,
-       0x7b, 0x5a, 0xea, 0xa2, 0x68, 0xdb, 0x19, 0xea, 0xb7, 0x78, 0xd2, 0x89,
-       0x2f, 0xd6, 0x98, 0xf1, 0xe1, 0x84, 0x57, 0xf4, 0xfa, 0x99, 0xe8, 0x45,
-       0xae, 0xc2, 0x78, 0xe1, 0xb8, 0x1e, 0x3d, 0xe2, 0xe8, 0xe5, 0xea, 0xe3,
-       0xf6, 0x69, 0xaf, 0x9c, 0x4c, 0xde, 0xd8, 0x17, 0xd5, 0xc9, 0x97, 0x3f,
-       0x61, 0x6c, 0x3c, 0x71, 0x98, 0x9c, 0xf9, 0x2a, 0x6b, 0x4a, 0x3f, 0x9f,
-       0xaf, 0x73, 0x9e, 0x97, 0x3e, 0xad, 0xe7, 0x1a, 0x67, 0x5e, 0xbc, 0xfe,
-       0x4e, 0x89, 0x2f, 0x4b, 0x4f, 0x5a, 0x9e, 0x53, 0x1d, 0x3b, 0xed, 0x76,
-       0x78, 0xa0, 0x70, 0x2b, 0x1b, 0x1d, 0xeb, 0xfe, 0xad, 0x35, 0x0b, 0x2e,
-       0xce, 0x38, 0x6e, 0xd5, 0x55, 0x25, 0x7b, 0xe1, 0xab, 0xd6, 0x3d, 0x68,
-       0xbb, 0xfe, 0x1c, 0x09, 0xef, 0x62, 0x9c, 0x7c, 0x85, 0xef, 0xec, 0x3a,
-       0x57, 0x1f, 0xbe, 0xcb, 0x6a, 0x71, 0x6c, 0x74, 0xd7, 0xb9, 0x28, 0x46,
-       0x2d, 0xe9, 0xeb, 0x43, 0xf1, 0x99, 0x87, 0xb1, 0x7d, 0x2a, 0x86, 0x77,
-       0x8d, 0x60, 0xe9, 0xec, 0x89, 0xc4, 0xa4, 0xc1, 0x98, 0x8c, 0xd0, 0x77,
-       0xe3, 0xb1, 0x77, 0xc9, 0x51, 0x33, 0x3e, 0xe0, 0x68, 0x8e, 0xb8, 0x46,
-       0xde, 0x08, 0xc5, 0x3d, 0xbb, 0xe9, 0xbe, 0x5b, 0xfe, 0xbb, 0x1a, 0xb1,
-       0x25, 0xf1, 0xd6, 0xfd, 0xa8, 0x47, 0x96, 0xd8, 0x1f, 0xd4, 0xff, 0x1a,
-       0xc7, 0x4e, 0x78, 0x98, 0x1f, 0x08, 0x4e, 0x77, 0x1a, 0xfc, 0xde, 0x34,
-       0xf8, 0x01, 0xfe, 0xd1, 0x9e, 0x91, 0xf3, 0x51, 0x8a, 0x9c, 0xc5, 0xf8,
-       0xc4, 0xae, 0xd3, 0xf5, 0xe2, 0xb7, 0xa0, 0x0f, 0x5f, 0x45, 0xd3, 0xd0,
-       0x22, 0x7e, 0x6c, 0x17, 0x79, 0xef, 0x7d, 0xc6, 0xd1, 0x2b, 0x46, 0x3c,
-       0xea, 0xa1, 0xf0, 0xc5, 0x88, 0x17, 0xf7, 0x1b, 0xb2, 0xa7, 0xa4, 0x0d,
-       0x3d, 0x0f, 0x6d, 0xf0, 0xbc, 0x22, 0x67, 0x6a, 0x2e, 0xd9, 0x99, 0x25,
-       0x32, 0xaf, 0x82, 0xb5, 0xab, 0x9b, 0x3a, 0x2b, 0xa0, 0xb5, 0xfa, 0x15,
-       0xdd, 0xf8, 0x40, 0xf9, 0x7b, 0xbb, 0x18, 0xf9, 0xc4, 0xbe, 0xac, 0x97,
-       0xc7, 0xd5, 0x62, 0x01, 0x6f, 0x59, 0xb6, 0x7a, 0x1c, 0xb3, 0x64, 0x2f,
-       0xee, 0xaf, 0xf1, 0xc0, 0x09, 0x1f, 0x3a, 0x52, 0x3f, 0xb1, 0x33, 0x11,
-       0x19, 0xf3, 0x13, 0xda, 0x42, 0xc6, 0x77, 0xfb, 0xd5, 0x2f, 0x17, 0xa0,
-       0x6c, 0xb3, 0x84, 0x33, 0x8b, 0x5f, 0x4c, 0xc1, 0xb6, 0xa4, 0x87, 0x68,
-       0xe3, 0x8e, 0xd4, 0x08, 0xde, 0x4f, 0xa5, 0xff, 0x63, 0x00, 0xda, 0x85,
-       0x2b, 0x5e, 0xad, 0xd8, 0xec, 0x8d, 0x29, 0xc1, 0x46, 0x7d, 0xa8, 0xd1,
-       0xdd, 0x9f, 0x67, 0xfd, 0x14, 0x0a, 0xec, 0x2a, 0x48, 0x9d, 0x39, 0x85,
-       0x85, 0xc9, 0x0c, 0x7c, 0xe4, 0x77, 0xa3, 0x2d, 0x5a, 0xdf, 0x73, 0x8a,
-       0x16, 0x3d, 0xa0, 0xc4, 0x94, 0x7b, 0xf5, 0x61, 0xbc, 0x60, 0x24, 0xd2,
-       0xed, 0x4a, 0x7d, 0xa0, 0xb3, 0x50, 0x1e, 0xbb, 0x83, 0xb8, 0xa1, 0x15,
-       0xaf, 0x78, 0x2b, 0x51, 0xb7, 0x5e, 0xef, 0xac, 0xf4, 0x6a, 0xc3, 0x5f,
-       0x60, 0x1d, 0xb0, 0xa3, 0x50, 0x0c, 0x7e, 0x90, 0xf0, 0x60, 0x8d, 0xb3,
-       0x87, 0x90, 0x2d, 0xf5, 0x47, 0xa7, 0xd0, 0x35, 0x69, 0x6f, 0xbe, 0x98,
-       0xd2, 0xa2, 0xcf, 0x29, 0x99, 0x3d, 0x21, 0xf2, 0x9a, 0x07, 0xa1, 0xc7,
-       0xe6, 0x19, 0xc7, 0x1d, 0x05, 0x0f, 0x56, 0x3a, 0x7e, 0x9c, 0xe5, 0x98,
-       0x87, 0x51, 0x79, 0xc2, 0xde, 0xbc, 0xc7, 0xd0, 0x86, 0xaf, 0x78, 0x33,
-       0xff, 0xb5, 0x8e, 0x76, 0xdb, 0xa6, 0x68, 0xac, 0x4f, 0x47, 0x70, 0x91,
-       0x3a, 0x7c, 0x3d, 0xa5, 0x25, 0xff, 0x4c, 0xd1, 0x7a, 0xbe, 0x4c, 0x5f,
-       0xf6, 0x9a, 0x61, 0xca, 0xa9, 0x25, 0x67, 0x21, 0xbd, 0xf3, 0x18, 0xae,
-       0x18, 0x99, 0xe0, 0xf6, 0xc6, 0x24, 0xf9, 0x59, 0x94, 0xf9, 0x30, 0x86,
-       0xa3, 0xe4, 0x77, 0x87, 0x0b, 0x15, 0x28, 0xaa, 0x3a, 0xf9, 0x59, 0x0f,
-       0x3c, 0x93, 0x21, 0x65, 0x2e, 0x1b, 0x37, 0x3a, 0xf0, 0x47, 0x28, 0x3a,
-       0x38, 0x77, 0x18, 0xa1, 0x13, 0x3f, 0xb0, 0x6b, 0x74, 0xbd, 0x75, 0x52,
-       0xe1, 0xbc, 0xcf, 0x44, 0x69, 0x63, 0xbe, 0x27, 0xe7, 0x4e, 0xac, 0x6e,
-       0xdc, 0x3b, 0x19, 0xe1, 0xfb, 0x35, 0x58, 0x7b, 0x22, 0x86, 0x0f, 0x53,
-       0x37, 0xa3, 0xe8, 0x70, 0x04, 0x85, 0x7e, 0x40, 0x3f, 0x62, 0xad, 0x95,
-       0x21, 0x8f, 0x94, 0x7d, 0xa3, 0xc3, 0x96, 0xd4, 0xe8, 0x3e, 0x7e, 0x0f,
-       0xf1, 0x57, 0xec, 0xf9, 0x39, 0x72, 0x1d, 0xf9, 0x5c, 0xd3, 0x16, 0x9b,
-       0xfb, 0x5e, 0x95, 0xb3, 0x7f, 0x89, 0x18, 0x9f, 0x53, 0x9d, 0xde, 0xe0,
-       0x28, 0xc7, 0x3c, 0x3b, 0x25, 0xb5, 0x5b, 0xfb, 0xa6, 0x40, 0x69, 0x7f,
-       0xfd, 0x87, 0x86, 0x07, 0x9b, 0x59, 0xdf, 0x47, 0x75, 0x39, 0x9b, 0x39,
-       0xaa, 0xd5, 0x61, 0x13, 0x4e, 0xab, 0x2c, 0xc4, 0xf5, 0xff, 0x80, 0x09,
-       0x35, 0x49, 0xac, 0xd1, 0xf1, 0x5e, 0xf6, 0x37, 0x58, 0xf3, 0xd4, 0xcb,
-       0xd9, 0x1b, 0xac, 0x3c, 0xe1, 0xe7, 0x9c, 0x9b, 0xc9, 0x75, 0xb6, 0xe3,
-       0xbb, 0xaa, 0x5b, 0x6f, 0x10, 0x8f, 0x30, 0x3e, 0x1b, 0x22, 0x1f, 0x0d,
-       0xf0, 0xf7, 0x46, 0xd9, 0x7e, 0x9d, 0x4c, 0xa2, 0xcb, 0xbf, 0x25, 0x53,
-       0x80, 0x7c, 0x80, 0x78, 0x99, 0x7d, 0x0d, 0x1f, 0x72, 0xec, 0xcc, 0xac,
-       0x3b, 0xe6, 0xf1, 0x82, 0x8c, 0x2b, 0xf3, 0xc5, 0x99, 0x37, 0x65, 0xfc,
-       0x90, 0x9c, 0xbf, 0xfd, 0x77, 0xce, 0x41, 0x86, 0x77, 0x82, 0x35, 0xb2,
-       0xd1, 0x88, 0x0e, 0x95, 0xeb, 0x65, 0xc9, 0x1c, 0x1a, 0xeb, 0x51, 0x79,
-       0x37, 0x8a, 0x35, 0x93, 0xf6, 0x48, 0xd4, 0x94, 0xeb, 0xb6, 0x5d, 0xbb,
-       0x51, 0x8f, 0xbe, 0xad, 0xf8, 0x98, 0xf3, 0x7c, 0xb4, 0xc1, 0x38, 0xce,
-       0x66, 0x9b, 0x2e, 0xbc, 0x4f, 0x0e, 0x15, 0x63, 0xbd, 0x77, 0xc9, 0x3b,
-       0x8e, 0xb9, 0xec, 0xb1, 0x6a, 0xe9, 0x13, 0x30, 0x0f, 0x2a, 0xb3, 0xd9,
-       0xfb, 0xab, 0x05, 0xab, 0xc6, 0xe8, 0x0b, 0xcd, 0x93, 0x22, 0xab, 0x3d,
-       0x52, 0xc3, 0x71, 0x8e, 0x72, 0x9c, 0xd9, 0x0d, 0x7a, 0xdf, 0x98, 0x22,
-       0x36, 0x0b, 0xe1, 0x58, 0xe1, 0xa2, 0xf4, 0xd0, 0x68, 0xb7, 0x69, 0x3e,
-       0x2f, 0x76, 0x8b, 0xe0, 0xbb, 0xa5, 0x71, 0x9e, 0x2a, 0x5c, 0xc0, 0x6c,
-       0xf6, 0x2d, 0xe7, 0xef, 0x31, 0xd6, 0x0d, 0xe3, 0xac, 0x21, 0xf3, 0xc4,
-       0x93, 0xc9, 0x6c, 0x53, 0xdf, 0x24, 0xe5, 0x70, 0xcf, 0xca, 0x0d, 0xe0,
-       0xd9, 0xd2, 0x33, 0xa3, 0x7c, 0x77, 0xf4, 0xda, 0xdf, 0x62, 0x23, 0x77,
-       0x0f, 0xdf, 0xdd, 0x53, 0xa8, 0xe4, 0xda, 0xb9, 0xb5, 0xf8, 0x11, 0xcb,
-       0x2f, 0x7d, 0x70, 0xbc, 0x36, 0xb5, 0x19, 0x63, 0xc6, 0x5f, 0x62, 0x2f,
-       0xf5, 0x1e, 0xa7, 0x3d, 0x4f, 0x58, 0xce, 0x5e, 0xbd, 0x9c, 0xcb, 0x22,
-       0x96, 0x87, 0xda, 0xce, 0x90, 0x93, 0x1d, 0x63, 0xcc, 0xdc, 0x97, 0x6a,
-       0xea, 0x79, 0x9d, 0x7e, 0x97, 0xfe, 0xa2, 0xec, 0x87, 0x03, 0x93, 0xb9,
-       0x47, 0x31, 0xb3, 0xa4, 0x69, 0xf1, 0x45, 0x62, 0xc2, 0x69, 0xe2, 0x94,
-       0x8f, 0x98, 0x50, 0x9b, 0xf3, 0x94, 0xf6, 0x77, 0x0d, 0x7e, 0x6f, 0xba,
-       0x30, 0x87, 0xbf, 0xa1, 0x5d, 0x44, 0xbe, 0x78, 0x72, 0x0e, 0xf2, 0xac,
-       0xdb, 0x83, 0xd5, 0xe7, 0x06, 0x71, 0xe9, 0x66, 0xb7, 0x8f, 0xe6, 0x65,
-       0xee, 0xde, 0x97, 0x6d, 0x52, 0xc7, 0x64, 0xec, 0x5e, 0x2d, 0x9a, 0xe1,
-       0x5a, 0x4d, 0x38, 0x1c, 0x5c, 0x65, 0x8e, 0x97, 0x73, 0x58, 0x35, 0xf0,
-       0xd1, 0xf7, 0xc7, 0x0c, 0x39, 0xbf, 0x10, 0x0d, 0xef, 0xe0, 0x1a, 0x8e,
-       0x59, 0x4d, 0xad, 0x71, 0x65, 0x0f, 0xca, 0xfc, 0xdb, 0xe5, 0xd4, 0x5a,
-       0xdf, 0x51, 0x34, 0xf5, 0x3c, 0x88, 0x2f, 0x21, 0xbd, 0xa4, 0xa9, 0x7f,
-       0x0a, 0x71, 0xe3, 0x7e, 0xc8, 0x39, 0x4e, 0x77, 0xac, 0x86, 0x3c, 0x33,
-       0xc9, 0xd2, 0x4f, 0xec, 0x15, 0xfa, 0x53, 0x98, 0x22, 0x77, 0x6c, 0x5c,
-       0xa7, 0x5f, 0xf8, 0x5a, 0xe9, 0x9e, 0xbb, 0x4f, 0x24, 0xfe, 0x12, 0xa0,
-       0x0d, 0x2a, 0xe1, 0x5b, 0x5a, 0xcf, 0x39, 0x68, 0x0b, 0xe7, 0x8c, 0xef,
-       0x45, 0x1c, 0xa4, 0xbf, 0x4d, 0x15, 0x14, 0x18, 0x0d, 0x17, 0x31, 0x24,
-       0xb9, 0x8b, 0xef, 0xb4, 0x67, 0x43, 0xe4, 0xb2, 0x51, 0x54, 0xea, 0xf1,
-       0xd8, 0x28, 0xf5, 0x6b, 0x27, 0x96, 0x8f, 0x13, 0x43, 0x32, 0x6a, 0xc8,
-       0x39, 0x77, 0x5a, 0xa9, 0x47, 0x9d, 0xff, 0x15, 0x90, 0x5a, 0xa8, 0x71,
-       0x46, 0xf6, 0xa8, 0x0f, 0xe3, 0xe2, 0x54, 0x11, 0xc7, 0x52, 0x69, 0xec,
-       0x5f, 0xa2, 0x62, 0xd2, 0x5a, 0xe6, 0xf4, 0x0e, 0xa4, 0xe6, 0xea, 0xca,
-       0x1d, 0x72, 0xfa, 0x91, 0x5b, 0x53, 0x9e, 0x06, 0x39, 0xa7, 0x31, 0xcb,
-       0xda, 0x6b, 0xca, 0x18, 0xc1, 0x41, 0xe3, 0xcb, 0x30, 0x96, 0x0a, 0x76,
-       0x8e, 0xe1, 0xd5, 0x19, 0xc9, 0x71, 0xc9, 0xb6, 0x5b, 0x26, 0xc5, 0x3e,
-       0x1e, 0x72, 0xdf, 0x00, 0x9a, 0x1d, 0x2e, 0xf7, 0x50, 0xdb, 0xea, 0x19,
-       0x97, 0xd3, 0x35, 0xe7, 0xe5, 0xac, 0x74, 0x0d, 0xc2, 0xb4, 0xd7, 0xf9,
-       0x94, 0x9f, 0x98, 0x23, 0xf6, 0x94, 0x33, 0x7a, 0xae, 0x9e, 0xc9, 0xbc,
-       0x82, 0xb1, 0x96, 0x1b, 0xf7, 0x58, 0xe4, 0xff, 0x06, 0xae, 0x9d, 0x1b,
-       0x2c, 0xf5, 0xc7, 0xff, 0xcc, 0xbe, 0x74, 0x93, 0xe8, 0xbd, 0x22, 0x44,
-       0x4c, 0x8f, 0xcd, 0x5c, 0xb3, 0xaf, 0xd8, 0xf4, 0x9c, 0xe4, 0x0c, 0xc7,
-       0xe6, 0x6e, 0xcf, 0x4d, 0x1b, 0xba, 0xac, 0x34, 0x31, 0x9f, 0xd0, 0xaf,
-       0x96, 0xd0, 0xdf, 0x9a, 0xd1, 0xbf, 0xc2, 0xf4, 0xf5, 0x5e, 0xb5, 0x36,
-       0xa3, 0x75, 0xfd, 0x7b, 0x36, 0x6e, 0x6e, 0x87, 0x57, 0x97, 0xeb, 0x33,
-       0x76, 0x5a, 0x95, 0xbf, 0xff, 0x24, 0x24, 0xb9, 0xfe, 0x65, 0xab, 0x68,
-       0xaf, 0x5e, 0xe6, 0x72, 0xc4, 0x1f, 0x64, 0x65, 0xdf, 0x2b, 0x63, 0xb3,
-       0xde, 0xbe, 0xf0, 0xae, 0xf7, 0x10, 0xbe, 0x9f, 0x3f, 0x8c, 0x77, 0xa6,
-       0x7c, 0x08, 0xeb, 0xa2, 0xcb, 0x66, 0xd4, 0xae, 0x4f, 0xa4, 0xdf, 0x23,
-       0x2e, 0x5e, 0x98, 0x29, 0xfb, 0xc5, 0x43, 0x6d, 0x6b, 0x66, 0x14, 0x8e,
-       0x55, 0x83, 0x0a, 0xea, 0xf9, 0x1d, 0xc3, 0x8b, 0x58, 0x89, 0xe3, 0x7a,
-       0x29, 0xa7, 0x9c, 0x7b, 0x10, 0xee, 0x1b, 0xcf, 0x1f, 0x0a, 0xb9, 0x3d,
-       0xb0, 0x10, 0x71, 0x74, 0x1c, 0x13, 0xd9, 0xa6, 0xe4, 0xfb, 0x72, 0x0e,
-       0x87, 0x35, 0xd9, 0x25, 0x8c, 0xe3, 0x44, 0xb6, 0x8c, 0xa1, 0x51, 0x39,
-       0x97, 0x9a, 0x8c, 0x79, 0x5c, 0x8c, 0x8c, 0x79, 0xb4, 0x4c, 0xcc, 0xe3,
-       0x0f, 0x09, 0x77, 0x18, 0x2d, 0xc4, 0xa3, 0x95, 0xf0, 0xe2, 0x3e, 0xc3,
-       0xf5, 0x8f, 0x86, 0x39, 0x3f, 0x62, 0x4b, 0x25, 0x2f, 0x4b, 0x4e, 0xf6,
-       0x31, 0x27, 0x2f, 0x23, 0xbf, 0xf6, 0xe1, 0x4d, 0x5d, 0xec, 0xb1, 0xa6,
-       0x6c, 0x0f, 0xe3, 0x1c, 0x1e, 0xb6, 0x8b, 0x3d, 0xe2, 0x4b, 0x7e, 0x1c,
-       0x6e, 0x9e, 0xb5, 0x67, 0x22, 0xa2, 0xbb, 0x17, 0xa7, 0x89, 0xaf, 0xb8,
-       0x39, 0x1e, 0x3d, 0xcd, 0x9c, 0x3d, 0xa6, 0x97, 0x7d, 0xfc, 0xb7, 0x4b,
-       0x72, 0xea, 0x7d, 0xf3, 0xb8, 0x9f, 0x7f, 0x37, 0x44, 0xf7, 0x2b, 0xee,
-       0x7c, 0xab, 0xe7, 0xfe, 0x26, 0x54, 0xee, 0x9f, 0xca, 0xb3, 0xb1, 0xfc,
-       0xe3, 0xfc, 0x2e, 0x63, 0x85, 0xe8, 0x9f, 0x95, 0xe8, 0x8f, 0xc8, 0xff,
-       0x89, 0x88, 0x5d, 0x64, 0x3f, 0x11, 0xb4, 0x87, 0x8d, 0xd7, 0x68, 0x8f,
-       0xc3, 0xd7, 0xce, 0x4c, 0xb9, 0xf8, 0x55, 0xc5, 0xeb, 0x3b, 0x52, 0xaf,
-       0x6c, 0x0a, 0xe2, 0x17, 0xf6, 0xa5, 0x48, 0x94, 0x98, 0x50, 0xe6, 0xa1,
-       0x62, 0x33, 0xc3, 0xb1, 0x99, 0x5b, 0x2b, 0x5e, 0xd3, 0xa3, 0x38, 0x40,
-       0xbe, 0xbd, 0x90, 0x2d, 0x9f, 0x15, 0x89, 0x13, 0x6b, 0x3e, 0x8f, 0xfe,
-       0x3a, 0x19, 0xaf, 0x9e, 0xfe, 0x95, 0xa4, 0x0d, 0xd4, 0xf0, 0xce, 0x69,
-       0xa9, 0xb5, 0xc9, 0x8f, 0x27, 0xe3, 0xc6, 0x43, 0xe4, 0x91, 0x13, 0x93,
-       0xb6, 0xfd, 0x96, 0x81, 0x3b, 0xc3, 0xcc, 0xef, 0x2f, 0x90, 0x4f, 0x90,
-       0x6f, 0xc4, 0x2a, 0x95, 0xa6, 0xe8, 0x2a, 0xe6, 0xfa, 0x31, 0xd6, 0x0a,
-       0x4f, 0x13, 0xe3, 0x4e, 0x2f, 0x54, 0xc1, 0x3a, 0x21, 0xfb, 0x82, 0x55,
-       0x98, 0x7c, 0x26, 0x49, 0xd9, 0x97, 0x72, 0x9c, 0x00, 0xaa, 0xcf, 0xb4,
-       0xa2, 0xea, 0x94, 0x82, 0x1d, 0x89, 0x56, 0x04, 0xcf, 0xd4, 0x30, 0xff,
-       0x06, 0x70, 0xa5, 0x85, 0x6b, 0xfc, 0x4c, 0x59, 0x0f, 0x67, 0x8f, 0x14,
-       0x4f, 0xe6, 0x62, 0xe4, 0xf1, 0x11, 0x2c, 0x58, 0xb2, 0x1f, 0x1c, 0x70,
-       0xb0, 0xf4, 0xc2, 0x86, 0x7a, 0x67, 0xcf, 0xea, 0xc5, 0x82, 0x1e, 0x3d,
-       0xab, 0xd4, 0xe0, 0xc7, 0x27, 0x8a, 0x37, 0x57, 0xc2, 0x7e, 0x79, 0x85,
-       0x99, 0xe8, 0xdb, 0x4b, 0xff, 0x5f, 0xb3, 0x3a, 0xc2, 0xfa, 0xc6, 0xb6,
-       0xaf, 0x6e, 0x94, 0x3a, 0xd8, 0x70, 0xea, 0x60, 0x77, 0x6f, 0x5f, 0x1f,
-       0x7c, 0x4c, 0xc9, 0x6c, 0x0f, 0xc3, 0xfe, 0xa8, 0xd2, 0xb4, 0x3f, 0xf6,
-       0x9b, 0x09, 0xbe, 0x2f, 0x7b, 0x7c, 0xb6, 0xfd, 0xc3, 0x16, 0xdb, 0xce,
-       0xb7, 0xc4, 0xfb, 0x54, 0xaf, 0x8a, 0x33, 0x8d, 0xb2, 0x2f, 0xe8, 0xc1,
-       0x8f, 0x13, 0x7a, 0x74, 0x2f, 0x64, 0x0f, 0x9e, 0x78, 0xbf, 0x4c, 0xce,
-       0x18, 0xd6, 0x87, 0x3b, 0xad, 0xa5, 0x78, 0x61, 0x7e, 0x23, 0xfa, 0xfd,
-       0x70, 0xce, 0xc5, 0xd8, 0x06, 0xde, 0x5e, 0x01, 0xc9, 0xe1, 0x89, 0xd6,
-       0xc7, 0x10, 0xc1, 0x7c, 0xe1, 0x30, 0x1e, 0x39, 0x21, 0xf5, 0xd7, 0xea,
-       0xb6, 0xc0, 0x09, 0xfb, 0x07, 0x51, 0xb3, 0x48, 0x8c, 0xb4, 0xed, 0xaa,
-       0x8d, 0x4d, 0x51, 0xa6, 0x26, 0xf2, 0x8d, 0x18, 0x79, 0xb3, 0x3e, 0xf8,
-       0x63, 0x2c, 0xc1, 0xd9, 0xd9, 0xf4, 0xcd, 0xe4, 0xf2, 0x9d, 0xcf, 0x2a,
-       0xc2, 0xdb, 0x23, 0x78, 0xbe, 0x20, 0x9c, 0x65, 0x6d, 0x5b, 0xd7, 0x89,
-       0xe5, 0x78, 0x79, 0x3e, 0x82, 0xb3, 0x96, 0x4e, 0xce, 0x04, 0xa5, 0xda,
-       0xb4, 0x6b, 0x6b, 0x29, 0x6b, 0xb5, 0xd7, 0x8b, 0xed, 0x29, 0xa9, 0x19,
-       0xf5, 0xc1, 0x90, 0x82, 0xe5, 0x95, 0xd0, 0x17, 0x1f, 0x06, 0x86, 0x82,
-       0x66, 0xe2, 0xc2, 0xb3, 0x4a, 0xa2, 0xef, 0x03, 0x6f, 0x04, 0xdf, 0x22,
-       0x16, 0x7d, 0xbd, 0x20, 0x67, 0xa5, 0x88, 0x37, 0xb3, 0x31, 0xae, 0x5b,
-       0x00, 0x9e, 0x86, 0x1a, 0x1c, 0x61, 0xec, 0xbc, 0x66, 0x54, 0x10, 0xaf,
-       0xe4, 0xec, 0x94, 0x60, 0x7d, 0xbd, 0x9c, 0x19, 0xb1, 0x5f, 0xd4, 0xdd,
-       0x7a, 0xdf, 0x98, 0xbb, 0xf1, 0x4c, 0xb1, 0x4a, 0x8c, 0x6f, 0xea, 0x89,
-       0x2a, 0x6f, 0xd8, 0xe9, 0x2f, 0x2a, 0xd4, 0xb3, 0xb7, 0x06, 0x55, 0x8e,
-       0xae, 0x18, 0xcd, 0x95, 0xf3, 0x4b, 0xad, 0xd4, 0x77, 0x3d, 0x99, 0x92,
-       0x3f, 0x56, 0x33, 0xee, 0x8f, 0x32, 0x5f, 0x57, 0x9e, 0x90, 0xbc, 0x42,
-       0xfe, 0xad, 0x6c, 0x26, 0x2f, 0x16, 0x0e, 0x11, 0xc0, 0x83, 0xaa, 0xf8,
-       0x86, 0x4a, 0xfd, 0x36, 0xf9, 0xe4, 0x2c, 0xd4, 0x0b, 0x05, 0xc9, 0xeb,
-       0x82, 0x0b, 0xe5, 0xf9, 0xa2, 0xa8, 0x9b, 0x94, 0x35, 0x52, 0xdb, 0x3e,
-       0x9a, 0x0c, 0xc9, 0xd9, 0xf7, 0x11, 0x0f, 0xeb, 0xef, 0x00, 0xfd, 0xeb,
-       0x9e, 0x16, 0x7d, 0x70, 0xb3, 0x57, 0x63, 0x0d, 0x1e, 0x67, 0x2d, 0xa1,
-       0xb5, 0x4e, 0x28, 0x37, 0x8e, 0xf3, 0x6c, 0x8d, 0xc4, 0x4b, 0x86, 0x7a,
-       0x3e, 0xe9, 0xe8, 0xb4, 0x86, 0x3a, 0x09, 0x5e, 0x27, 0x89, 0xd7, 0x35,
-       0xb8, 0x32, 0x05, 0x9d, 0x11, 0x8c, 0x57, 0x0d, 0x02, 0x95, 0x9a, 0x48,
-       0x77, 0x40, 0x62, 0x41, 0xeb, 0x17, 0x3e, 0x55, 0x4d, 0x7c, 0x9e, 0x9d,
-       0x92, 0x7c, 0xa3, 0x08, 0x57, 0xc9, 0xd4, 0x9a, 0x43, 0xf8, 0x70, 0x03,
-       0xf0, 0xc6, 0xa4, 0xbb, 0xef, 0xde, 0x27, 0x67, 0x6f, 0x2b, 0xdd, 0x33,
-       0x0d, 0x8f, 0x39, 0x67, 0x15, 0x64, 0xfc, 0x43, 0x38, 0x93, 0x15, 0x7e,
-       0x39, 0x44, 0x7e, 0x19, 0x1f, 0x26, 0xf7, 0x6c, 0x2d, 0x40, 0x62, 0xb2,
-       0xc9, 0xf8, 0x88, 0xbe, 0xff, 0x2c, 0x79, 0xeb, 0x11, 0xb8, 0xfb, 0xee,
-       0x8d, 0xa5, 0xb3, 0x08, 0xf1, 0x7c, 0xa7, 0xb2, 0xd3, 0x39, 0xcf, 0x64,
-       0x30, 0xde, 0x3a, 0x94, 0x1d, 0xf3, 0xdb, 0x94, 0xae, 0xf9, 0x6e, 0x65,
-       0x4f, 0x41, 0xea, 0xd8, 0xd5, 0x6d, 0x0f, 0x9e, 0xd8, 0xad, 0xec, 0x9c,
-       0xed, 0x55, 0xc8, 0x6f, 0xd5, 0x80, 0xd9, 0xa7, 0x74, 0xcf, 0xbb, 0xfd,
-       0xf4, 0x4e, 0xd6, 0x70, 0x3b, 0x2d, 0xf1, 0x07, 0xb5, 0xad, 0x6b, 0x52,
-       0xfe, 0x17, 0x2b, 0x22, 0xff, 0xf7, 0xd0, 0xbf, 0x55, 0xb1, 0xed, 0x55,
-       0xa9, 0xd7, 0x65, 0x3d, 0xec, 0xe7, 0x53, 0xcc, 0x93, 0x56, 0x0d, 0x06,
-       0x58, 0x83, 0x8c, 0x1a, 0xb7, 0x94, 0xf6, 0xcf, 0x44, 0x27, 0x39, 0x2f,
-       0x21, 0xfe, 0x8a, 0x4c, 0x25, 0x65, 0xf8, 0x07, 0xca, 0xbf, 0xbf, 0xa4,
-       0x57, 0xb7, 0x9c, 0x27, 0xf0, 0x23, 0x23, 0x3a, 0xe4, 0xa9, 0xef, 0xb1,
-       0xc9, 0xeb, 0x7a, 0xf9, 0x78, 0x6d, 0x9c, 0x5c, 0x75, 0xbf, 0xa2, 0x0d,
-       0x3f, 0xe7, 0xea, 0x75, 0xe1, 0x8a, 0xa2, 0x15, 0x47, 0x21, 0xb8, 0xe0,
-       0xea, 0xb5, 0xb6, 0xa4, 0xd7, 0x9a, 0x7c, 0xa7, 0x73, 0x4e, 0xab, 0x86,
-       0x7a, 0x2d, 0x4c, 0x76, 0x28, 0x9d, 0xf3, 0xd2, 0xcb, 0x14, 0xdd, 0x44,
-       0x8f, 0x13, 0x76, 0x95, 0xde, 0xad, 0xdc, 0xee, 0x9c, 0x2b, 0x93, 0xb3,
-       0x5d, 0xb2, 0xdf, 0x5f, 0xd6, 0x4b, 0x72, 0xfa, 0xd2, 0xf0, 0xb6, 0x69,
-       0x35, 0xbc, 0x75, 0xda, 0xb6, 0xbf, 0x6b, 0xfc, 0xb3, 0xa3, 0xcb, 0x59,
-       0x43, 0x74, 0x91, 0x73, 0x23, 0x65, 0x7d, 0xbe, 0x50, 0xd2, 0x47, 0xd6,
-       0xea, 0xfa, 0x3a, 0x95, 0xff, 0x87, 0xef, 0xdd, 0xac, 0x7b, 0xa6, 0xa4,
-       0xac, 0x4f, 0xd8, 0x2c, 0x9f, 0x2f, 0x1b, 0xc2, 0x1b, 0xbc, 0xff, 0x93,
-       0x6c, 0x59, 0x2f, 0x2f, 0xe6, 0x66, 0xc5, 0xfe, 0x43, 0xf2, 0x3f, 0x7c,
-       0xc4, 0x91, 0xb8, 0x31, 0x46, 0x3f, 0x72, 0xf5, 0xd3, 0x86, 0x57, 0x7a,
-       0x9b, 0x8a, 0x57, 0xa0, 0xf5, 0x2f, 0x2a, 0x89, 0x34, 0x6b, 0x70, 0x9c,
-       0x2d, 0xfc, 0xea, 0xfa, 0x35, 0xe7, 0xab, 0x94, 0x6d, 0x39, 0x19, 0xfb,
-       0x21, 0x8e, 0x2d, 0x67, 0x4a, 0x14, 0x3c, 0x37, 0x0b, 0xcc, 0x5a, 0x9c,
-       0xd6, 0x1c, 0xc1, 0xd3, 0x86, 0x6d, 0x3f, 0xdb, 0xa2, 0xcb, 0x59, 0xa0,
-       0xf3, 0x6e, 0xaf, 0x08, 0x46, 0x8d, 0x2e, 0x7b, 0x79, 0x72, 0x9e, 0xa4,
-       0x97, 0x36, 0x10, 0xdd, 0xc5, 0x07, 0xca, 0x6b, 0x2f, 0xe7, 0xdc, 0x32,
-       0xb4, 0x8f, 0xd8, 0xa6, 0x7c, 0xde, 0x4d, 0xfa, 0x30, 0x37, 0xda, 0x64,
-       0x6d, 0xd8, 0x59, 0x5f, 0x43, 0xfc, 0x95, 0xe8, 0x43, 0x5f, 0x9d, 0x23,
-       0x97, 0x18, 0x33, 0xfc, 0x0e, 0x6f, 0x3b, 0x42, 0xae, 0x32, 0xc1, 0xd8,
-       0x79, 0xd2, 0xba, 0x80, 0x0b, 0xf9, 0xd7, 0xf0, 0xc6, 0xb5, 0xff, 0x67,
-       0x13, 0x7f, 0xb9, 0xb8, 0xb1, 0xcb, 0x39, 0xd3, 0x74, 0xba, 0xf5, 0x96,
-       0x84, 0xe0, 0x50, 0x77, 0xb3, 0x9c, 0x71, 0xaa, 0x34, 0xf3, 0x9b, 0x64,
-       0xbf, 0xab, 0xc2, 0x34, 0x6f, 0x3d, 0xaf, 0x8b, 0x6d, 0xfe, 0x62, 0xfd,
-       0x19, 0x5d, 0xf4, 0xfa, 0x9f, 0x6b, 0xc7, 0x9d, 0xff, 0xaf, 0xfc, 0xbb,
-       0x5b, 0xf7, 0xe9, 0x12, 0x3b, 0x67, 0x5b, 0xda, 0x1d, 0x4c, 0x68, 0x35,
-       0x57, 0x39, 0x36, 0x68, 0x31, 0x6f, 0x71, 0x3e, 0x0d, 0x33, 0xe9, 0x7c,
-       0x9a, 0xa6, 0x6b, 0x9b, 0x6e, 0xb3, 0xc1, 0xf9, 0xec, 0x30, 0xdd, 0xf3,
-       0xcf, 0x69, 0x53, 0x77, 0x3e, 0x7b, 0xcc, 0xb8, 0xf3, 0xd9, 0x69, 0xae,
-       0xbc, 0x2e, 0x17, 0x7f, 0xfe, 0x1f, 0x9b, 0x97, 0x53, 0xd9, 0x78, 0x3a,
-       0x00, 0x00, 0x00 };
-
-static const u32 bnx2_TXP_b06FwData[(0x0/4) + 1] = { 0x0 };
-static const u32 bnx2_TXP_b06FwRodata[(0x0/4) + 1] = { 0x0 };
-
-static struct fw_info bnx2_txp_fw_06 = {
-       /* Firmware version: 4.6.16 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0x10,
-
-       .start_addr                     = 0x08000098,
-
-       .text_addr                      = 0x08000000,
-       .text_len                       = 0x3a74,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_TXP_b06FwText,
-       .gz_text_len                    = sizeof(bnx2_TXP_b06FwText),
-
-       .data_addr                      = 0x00000000,
-       .data_len                       = 0x0,
-       .data_index                     = 0x0,
-       .data                           = bnx2_TXP_b06FwData,
-
-       .sbss_addr                      = 0x08003aa0,
-       .sbss_len                       = 0x68,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08003b08,
-       .bss_len                        = 0x14c,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x00000000,
-       .rodata_len                     = 0x0,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_TXP_b06FwRodata,
-};
-
 /* Initialized Values for the TX Processor. */
 static const struct cpu_reg cpu_reg_txp = {
        .mode = BNX2_TXP_CPU_MODE,
@@ -4461,4 +86,3 @@ static const struct cpu_reg cpu_reg_txp = {
        .spad_base = BNX2_TXP_SCRATCH,
        .mips_view_base = 0x8000000,
 };
-
diff --git a/drivers/net/bnx2_fw2.h b/drivers/net/bnx2_fw2.h
deleted file mode 100644 (file)
index c54e488..0000000
+++ /dev/null
@@ -1,4547 +0,0 @@
-/* bnx2_fw2.h: Broadcom NX2 network driver.
- *
- * Copyright (c) 2004, 2005, 2006, 2007 Broadcom 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, except as noted below.
- *
- * This file contains firmware data derived from proprietary unpublished
- * source code, Copyright (c) 2004, 2005, 2006, 2007 Broadcom Corporation.
- *
- * Permission is hereby granted for the distribution of this firmware data
- * in hexadecimal or equivalent format, provided this copyright notice is
- * accompanying it.
- */
-
-static u8 bnx2_COM_b09FwText[] = {
-       0xcd, 0x7c, 0x7b, 0x6c, 0x5c, 0xd7, 0x99, 0xdf, 0x77, 0xef, 0xcc, 0x90,
-       0x43, 0x6a, 0x44, 0x5d, 0x32, 0x13, 0x66, 0x1c, 0x33, 0xcd, 0x3c, 0x2e,
-       0x29, 0xda, 0x64, 0x92, 0x31, 0x77, 0xa4, 0xd0, 0xc9, 0xad, 0x3d, 0x99,
-       0x19, 0xc9, 0x4c, 0xa8, 0x0d, 0xe8, 0x44, 0x2e, 0x52, 0x54, 0x28, 0xd8,
-       0x21, 0xe5, 0x28, 0x8b, 0xec, 0xae, 0xf2, 0x28, 0x9a, 0x2e, 0xd2, 0xd5,
-       0x64, 0x48, 0x29, 0xca, 0x62, 0xc4, 0x19, 0xd3, 0x34, 0x93, 0xa2, 0x01,
-       0x32, 0x19, 0x92, 0x72, 0x76, 0x31, 0x12, 0x15, 0xdb, 0xcd, 0x1a, 0x41,
-       0xe2, 0xb0, 0xd4, 0x23, 0xde, 0x20, 0x2d, 0xb4, 0x1b, 0x17, 0x4d, 0xd3,
-       0x45, 0x21, 0xc8, 0x4e, 0x6c, 0x6c, 0xb3, 0x6d, 0x50, 0x2c, 0x10, 0x77,
-       0x91, 0x64, 0xfa, 0xfb, 0x9d, 0x73, 0xee, 0x70, 0x44, 0x31, 0x4e, 0xba,
-       0x7f, 0x95, 0xc0, 0xe0, 0xdc, 0x7b, 0x9e, 0xdf, 0xf9, 0xce, 0xf7, 0x3e,
-       0xdf, 0xe5, 0x43, 0x22, 0xbd, 0x62, 0xfe, 0xf6, 0xe3, 0x97, 0xf9, 0xfd,
-       0x3f, 0x9c, 0x7b, 0xe0, 0x9d, 0x87, 0xdf, 0x89, 0xc7, 0x43, 0xf6, 0x81,
-       0xae, 0x20, 0xeb, 0x03, 0xf8, 0x45, 0xf1, 0x9b, 0x30, 0xcf, 0x7b, 0xfd,
-       0x39, 0xf8, 0x1d, 0xb6, 0x44, 0x66, 0xff, 0x46, 0xc4, 0xda, 0xd5, 0x16,
-       0xfe, 0x35, 0x63, 0xde, 0xe8, 0xcf, 0xfe, 0x2d, 0xfb, 0x39, 0xff, 0x80,
-       0xb9, 0xfd, 0xbf, 0x80, 0x19, 0xbe, 0xdf, 0xfc, 0x24, 0x6c, 0x7b, 0xb7,
-       0x3e, 0x90, 0x73, 0x25, 0x1c, 0xf0, 0x7e, 0x38, 0x3d, 0xe7, 0x8a, 0x64,
-       0x9b, 0x63, 0xf1, 0xbc, 0xfc, 0xb2, 0x55, 0x8a, 0x06, 0x85, 0xf5, 0x6f,
-       0xf3, 0x7e, 0xf1, 0x95, 0x6f, 0xbf, 0x3b, 0xf1, 0xb3, 0x7a, 0x40, 0xc2,
-       0x8e, 0xf7, 0xba, 0x38, 0x23, 0x12, 0x1e, 0xc2, 0x98, 0x2f, 0x1f, 0x9c,
-       0xb5, 0xa5, 0xcf, 0x9f, 0xeb, 0xb5, 0xd6, 0xb7, 0x0f, 0x4a, 0xc9, 0xf6,
-       0x1c, 0xb9, 0xb2, 0x19, 0x95, 0xef, 0x6c, 0x8a, 0x35, 0x93, 0xe9, 0x11,
-       0x7b, 0xf9, 0xad, 0x92, 0x75, 0x2c, 0x09, 0xb8, 0x5c, 0x27, 0x2e, 0xb9,
-       0xca, 0x20, 0xde, 0x13, 0x31, 0x91, 0x7f, 0xbe, 0x5f, 0x8f, 0x0d, 0x4b,
-       0x60, 0x55, 0xc2, 0x5d, 0xde, 0x0b, 0xd3, 0x37, 0x56, 0x62, 0x12, 0x5c,
-       0x1a, 0x97, 0x72, 0x35, 0x22, 0xa1, 0x55, 0x19, 0x0a, 0xc8, 0x70, 0xec,
-       0x71, 0xf4, 0x28, 0x34, 0x83, 0x72, 0xa4, 0x69, 0x49, 0xd0, 0x0d, 0x03,
-       0xb6, 0x08, 0x7e, 0x0e, 0x7e, 0x51, 0xfc, 0x62, 0xf8, 0x9d, 0xc5, 0x3c,
-       0x43, 0x92, 0x6f, 0x72, 0x4e, 0xac, 0x5b, 0xc5, 0xfa, 0xd5, 0x84, 0x33,
-       0x8b, 0x79, 0x6f, 0x05, 0x62, 0xf2, 0xed, 0x83, 0x84, 0xcb, 0x21, 0x3c,
-       0x80, 0x2d, 0x6c, 0xe5, 0x56, 0xe4, 0x74, 0x3e, 0x2d, 0x71, 0xdb, 0xed,
-       0x95, 0xa2, 0x63, 0xc5, 0xe7, 0x47, 0x07, 0xa4, 0x74, 0x1c, 0xed, 0x55,
-       0xc9, 0xda, 0x98, 0xbf, 0xe8, 0xc8, 0xac, 0x6e, 0x63, 0xdd, 0x17, 0x41,
-       0x27, 0x09, 0x87, 0x08, 0xfb, 0x4e, 0xf5, 0x31, 0x3c, 0x73, 0xbe, 0x78,
-       0x50, 0xc3, 0xbd, 0x8a, 0x77, 0xd6, 0xff, 0x41, 0x44, 0xbf, 0xf3, 0x99,
-       0x7d, 0xfd, 0x75, 0xfd, 0xfd, 0x72, 0xfd, 0x51, 0xec, 0x99, 0x30, 0xf8,
-       0x7b, 0x96, 0x52, 0x08, 0xb0, 0x34, 0x56, 0x22, 0xd6, 0xda, 0xca, 0xb8,
-       0x9c, 0xab, 0x3e, 0x24, 0xb9, 0x74, 0xab, 0x35, 0x97, 0x96, 0xa8, 0x2d,
-       0xc3, 0x4e, 0x1e, 0x1d, 0xb6, 0x9b, 0x62, 0x35, 0x2a, 0x12, 0xee, 0x06,
-       0x5e, 0x5e, 0x5d, 0xe1, 0xdc, 0x41, 0xd4, 0x0d, 0xa2, 0x7f, 0x9f, 0xb5,
-       0xbe, 0x02, 0xf8, 0x3d, 0xe2, 0xa7, 0xd5, 0x5a, 0x4c, 0x0f, 0xc7, 0xe6,
-       0xb1, 0xe6, 0xd5, 0xe6, 0xf0, 0xe4, 0x6d, 0x71, 0x30, 0xe7, 0x00, 0xfa,
-       0x10, 0x57, 0x9c, 0x8b, 0x73, 0x72, 0xbe, 0x08, 0xc6, 0x46, 0xd1, 0x46,
-       0xb8, 0x5a, 0xad, 0x5c, 0xda, 0xe1, 0xbb, 0x6c, 0x01, 0x7f, 0x5b, 0xc4,
-       0x5f, 0xef, 0x90, 0x7c, 0xb7, 0xc9, 0x35, 0xda, 0xb0, 0x97, 0xba, 0xbc,
-       0xe7, 0xed, 0xed, 0x0a, 0xcf, 0x2d, 0x2c, 0xef, 0x0b, 0x26, 0x46, 0x4b,
-       0x8a, 0x4e, 0x66, 0xb1, 0x1f, 0x4b, 0xd1, 0x84, 0x85, 0xe7, 0x64, 0x93,
-       0xfd, 0x89, 0xeb, 0xb8, 0x2c, 0xe0, 0x5c, 0xcb, 0x2b, 0x25, 0xfb, 0x6a,
-       0xf3, 0x17, 0xad, 0x9c, 0xbb, 0x68, 0x6f, 0xaf, 0xb3, 0xff, 0x09, 0xf4,
-       0x0f, 0xca, 0x62, 0xa5, 0x4f, 0x08, 0x93, 0x1e, 0x77, 0x02, 0xe3, 0xc4,
-       0xb1, 0xbd, 0x73, 0xf6, 0xd5, 0xf5, 0xf3, 0xf6, 0x35, 0x75, 0x6e, 0x58,
-       0xab, 0x3d, 0x57, 0x27, 0xde, 0xc6, 0xfe, 0x3f, 0xc4, 0x5b, 0x0c, 0xf3,
-       0x47, 0x51, 0xee, 0xb3, 0x1a, 0xb5, 0x16, 0xd6, 0x8f, 0xe1, 0x79, 0x2f,
-       0x1c, 0xde, 0x52, 0x74, 0x77, 0x05, 0x74, 0xe7, 0x78, 0x31, 0x79, 0x66,
-       0x73, 0x08, 0xfb, 0x88, 0xca, 0xd7, 0xc1, 0x17, 0x03, 0x87, 0xf7, 0x49,
-       0x1e, 0x7c, 0x41, 0x7a, 0x7b, 0x74, 0xf5, 0x9f, 0x49, 0x31, 0x9a, 0x18,
-       0xa5, 0xfc, 0x48, 0x4e, 0x80, 0x9e, 0x0d, 0x6b, 0xe7, 0x96, 0xb2, 0x29,
-       0x5b, 0x1e, 0x16, 0xdb, 0xc3, 0xba, 0x99, 0x31, 0xa7, 0x20, 0x41, 0xb4,
-       0x65, 0x25, 0xe0, 0x45, 0x25, 0xb7, 0xfa, 0x5e, 0x0b, 0x74, 0x19, 0x5f,
-       0xc0, 0xa0, 0xc0, 0x92, 0x58, 0xb6, 0xdb, 0x25, 0xc5, 0xe3, 0xac, 0x0f,
-       0x83, 0xc6, 0xc1, 0xb3, 0x2b, 0x07, 0x00, 0x97, 0x0c, 0xdb, 0xc2, 0xba,
-       0x61, 0xa7, 0x2c, 0x25, 0xb1, 0x2f, 0xff, 0xa1, 0x65, 0x64, 0x9e, 0xc1,
-       0xef, 0xa8, 0x59, 0xab, 0xcd, 0x87, 0x96, 0xbd, 0x1a, 0xb1, 0x02, 0xab,
-       0xe3, 0x72, 0x76, 0x0f, 0xbc, 0x36, 0x80, 0x57, 0x7b, 0xc9, 0xe7, 0xd3,
-       0x20, 0xde, 0x07, 0xd1, 0xb7, 0xcf, 0x0a, 0xae, 0xde, 0x8d, 0xd3, 0xb5,
-       0xe6, 0x70, 0x7a, 0x1b, 0x38, 0xb5, 0x57, 0x07, 0xd0, 0xe7, 0x6e, 0x9c,
-       0x36, 0x80, 0x53, 0x7b, 0x55, 0xe3, 0xb3, 0x01, 0x7c, 0xda, 0x4b, 0x51,
-       0x94, 0xfb, 0x2c, 0x7b, 0x59, 0xe3, 0xb3, 0x61, 0x78, 0xfa, 0x62, 0x93,
-       0xb0, 0x66, 0x3b, 0x68, 0x2e, 0x4b, 0xda, 0x81, 0x9c, 0x2a, 0xc8, 0x5c,
-       0xc5, 0x06, 0xbe, 0x82, 0xe2, 0x4e, 0x58, 0x32, 0xa7, 0xda, 0x0a, 0x92,
-       0x02, 0x0d, 0x95, 0x9c, 0xb1, 0x51, 0x5b, 0x12, 0xf1, 0xac, 0x0d, 0x7c,
-       0x57, 0x81, 0xf7, 0x2a, 0x70, 0xae, 0x64, 0xc2, 0x8b, 0xe0, 0xd7, 0x38,
-       0xce, 0x65, 0x77, 0x7d, 0xc2, 0xa9, 0x2b, 0x9e, 0x8d, 0x9b, 0x33, 0x23,
-       0xed, 0xf3, 0x9c, 0x62, 0x38, 0x2f, 0x75, 0x7e, 0xd6, 0x5f, 0x66, 0xf6,
-       0x49, 0x6a, 0x39, 0xa0, 0xce, 0x2b, 0xbd, 0xfa, 0xae, 0xf6, 0x79, 0xd9,
-       0x13, 0x94, 0x65, 0x3c, 0x23, 0x91, 0xd4, 0x12, 0xcf, 0x29, 0x9b, 0x0a,
-       0x08, 0xcf, 0x2a, 0x24, 0xd9, 0x19, 0x9e, 0x4b, 0x54, 0x92, 0xab, 0x3c,
-       0xb3, 0x0d, 0x73, 0x5e, 0xfa, 0x9c, 0x92, 0x7b, 0x9c, 0x53, 0xd2, 0x9c,
-       0xd3, 0x76, 0xf3, 0x8a, 0x39, 0xa7, 0x7f, 0x2b, 0x86, 0xe6, 0xdf, 0x10,
-       0x07, 0x36, 0x70, 0x10, 0xbc, 0x03, 0x07, 0xdd, 0x6d, 0x1c, 0xc4, 0x6d,
-       0xec, 0xe1, 0xae, 0xfd, 0x77, 0xd6, 0x75, 0xee, 0x5d, 0x4a, 0x41, 0x4f,
-       0xac, 0x85, 0x0a, 0xe1, 0x0e, 0x48, 0x71, 0x86, 0x30, 0x52, 0xae, 0x6b,
-       0x58, 0xf3, 0x2b, 0x94, 0x6d, 0x07, 0x04, 0x34, 0xf1, 0xb6, 0x80, 0x1a,
-       0x53, 0x92, 0x85, 0x26, 0xdb, 0x4a, 0x92, 0xcb, 0x80, 0x5e, 0x6b, 0xac,
-       0x03, 0x83, 0x6e, 0x6a, 0x3e, 0xde, 0xd1, 0x07, 0xd1, 0x36, 0x1e, 0xf3,
-       0x95, 0x38, 0xe4, 0x74, 0x10, 0xe5, 0xd7, 0x50, 0xee, 0xb3, 0x66, 0x6a,
-       0x7f, 0x65, 0x49, 0x5f, 0x4b, 0x9c, 0x09, 0xee, 0x31, 0x36, 0x9d, 0x73,
-       0x4b, 0x31, 0x47, 0xde, 0x26, 0xce, 0x3b, 0x43, 0x22, 0x83, 0x09, 0xa7,
-       0x28, 0xff, 0x05, 0xed, 0x89, 0x58, 0x56, 0xfe, 0xb7, 0x4f, 0xbb, 0xc0,
-       0x43, 0xcf, 0xeb, 0x59, 0xf5, 0xc4, 0x7a, 0x8e, 0xcb, 0xa0, 0x2e, 0x24,
-       0xb3, 0xd0, 0x31, 0x05, 0x97, 0xeb, 0x71, 0xfe, 0xf8, 0x2c, 0xd7, 0xcd,
-       0x37, 0x7d, 0x7d, 0x20, 0xd9, 0x80, 0xc7, 0x36, 0xf2, 0xe5, 0xa4, 0x95,
-       0x6f, 0x12, 0x57, 0x19, 0x71, 0x9b, 0x1a, 0x66, 0x0d, 0x6b, 0x1b, 0x4e,
-       0xf0, 0x6b, 0x16, 0x34, 0x49, 0xd8, 0xe2, 0xe0, 0x9b, 0x73, 0x01, 0xff,
-       0x1c, 0x82, 0xde, 0xa4, 0x2c, 0x42, 0x3f, 0x96, 0x2b, 0x9c, 0xef, 0x33,
-       0x56, 0xe0, 0xb2, 0x3f, 0x3f, 0xcf, 0x86, 0x73, 0xeb, 0xf9, 0xca, 0xcd,
-       0xd7, 0x0c, 0xef, 0x2b, 0x3d, 0x88, 0xf9, 0x4a, 0x1d, 0xf3, 0x95, 0xc8,
-       0xb3, 0x07, 0x94, 0xae, 0x39, 0x4e, 0xfc, 0x9d, 0x47, 0xdb, 0x2d, 0xd0,
-       0x08, 0xf9, 0x81, 0xfc, 0x41, 0x5e, 0x7d, 0xb7, 0x8d, 0xfd, 0x76, 0xe0,
-       0x76, 0x06, 0x72, 0x98, 0xbc, 0x11, 0x96, 0x7c, 0x94, 0xf5, 0x8f, 0x1b,
-       0x98, 0x20, 0x13, 0xd4, 0xfb, 0xf1, 0x1e, 0x5f, 0x3e, 0x82, 0x16, 0x01,
-       0xdb, 0xf3, 0x6a, 0x8f, 0xb6, 0xe7, 0x01, 0x37, 0x9d, 0x30, 0x72, 0xdf,
-       0x9e, 0x91, 0xdb, 0x3e, 0xbc, 0x3c, 0x2b, 0xca, 0x55, 0xb1, 0xd6, 0x33,
-       0x61, 0xc8, 0x70, 0x5b, 0xf2, 0x69, 0xd0, 0x66, 0x3a, 0x60, 0xe4, 0xc3,
-       0x8b, 0xc6, 0x56, 0xd2, 0x38, 0x0e, 0x2a, 0x3d, 0xbe, 0x88, 0x79, 0x4f,
-       0x00, 0x46, 0xce, 0x19, 0xb4, 0xd6, 0x2a, 0x11, 0xe8, 0x6c, 0xc0, 0xe6,
-       0x24, 0xe2, 0x80, 0x09, 0xef, 0x7e, 0x9f, 0x88, 0x2c, 0x6c, 0xfa, 0xeb,
-       0x2e, 0xb6, 0xf5, 0x45, 0x49, 0xe1, 0xdb, 0x99, 0x0d, 0xec, 0xd0, 0xc6,
-       0xcc, 0xc9, 0xca, 0x99, 0x96, 0xed, 0x92, 0x06, 0xdd, 0xd1, 0x86, 0x44,
-       0x26, 0x37, 0x32, 0xef, 0x06, 0xbf, 0xa1, 0x1e, 0x63, 0xca, 0xcd, 0x52,
-       0xc4, 0x76, 0x5d, 0x94, 0x94, 0x3f, 0x27, 0xba, 0x6f, 0xb8, 0x3e, 0xbd,
-       0x0c, 0x49, 0xc8, 0x6d, 0xb5, 0x36, 0x70, 0x26, 0x47, 0x9b, 0xbf, 0x6c,
-       0x7d, 0x35, 0xa8, 0xed, 0x15, 0xdb, 0xfb, 0xa9, 0xa5, 0xd7, 0x8c, 0x4f,
-       0x27, 0x15, 0x1e, 0x62, 0x5d, 0xfa, 0xdd, 0x35, 0xef, 0xd7, 0x22, 0x46,
-       0x87, 0x99, 0xf7, 0xf9, 0xa0, 0xb6, 0x7f, 0xc2, 0x3d, 0xe4, 0xa3, 0xa0,
-       0xe7, 0xf4, 0xe0, 0x9c, 0xc3, 0x21, 0x6f, 0x6a, 0x7c, 0x43, 0xf5, 0x2b,
-       0x99, 0x7e, 0xd1, 0x6e, 0x3d, 0xee, 0xd4, 0xf4, 0x88, 0xa2, 0xa1, 0x4f,
-       0x4f, 0x0f, 0xab, 0xf2, 0xb3, 0xd3, 0x29, 0x55, 0x2e, 0x4e, 0xbb, 0xaa,
-       0x3c, 0xaf, 0xfa, 0x5b, 0xde, 0x90, 0xa9, 0x1f, 0x9d, 0x8e, 0xab, 0x72,
-       0xdc, 0x94, 0x69, 0x53, 0x66, 0x4c, 0x39, 0x69, 0x4a, 0xcf, 0x94, 0x59,
-       0x53, 0x16, 0xcc, 0x7c, 0x53, 0xe6, 0xfd, 0x98, 0x29, 0x67, 0x4c, 0x79,
-       0xdc, 0x94, 0x1f, 0x31, 0xe5, 0x09, 0x03, 0xd7, 0xbc, 0x29, 0x3f, 0x6e,
-       0xea, 0x4f, 0x1b, 0x38, 0x3f, 0x03, 0x78, 0x1e, 0x09, 0xed, 0xd0, 0xca,
-       0x69, 0x4d, 0x5f, 0x15, 0x47, 0xca, 0x9b, 0xdc, 0x7f, 0x1c, 0x32, 0x25,
-       0x88, 0xb3, 0x04, 0xbf, 0x3b, 0xa4, 0x09, 0x17, 0x72, 0x38, 0x88, 0x33,
-       0xe4, 0xf3, 0x69, 0xf9, 0x53, 0xf4, 0x1d, 0xbd, 0xe0, 0xc8, 0x62, 0x95,
-       0xfa, 0xf5, 0x5b, 0xf2, 0x6a, 0x85, 0xe7, 0xf1, 0xbc, 0xdc, 0xa8, 0xa4,
-       0xe2, 0x41, 0x8b, 0x74, 0x94, 0x98, 0x7c, 0x45, 0x12, 0x90, 0xfd, 0x63,
-       0x71, 0x96, 0xd7, 0xa8, 0x54, 0xd0, 0xef, 0xa0, 0x5a, 0xfb, 0x79, 0x01,
-       0x4c, 0x72, 0xa5, 0xd2, 0x0d, 0x99, 0xf5, 0x4a, 0x8b, 0x7a, 0xfd, 0xfc,
-       0xa6, 0xc8, 0xc8, 0x05, 0xe2, 0xf9, 0x5b, 0xb2, 0x51, 0x21, 0xde, 0x9f,
-       0x87, 0xad, 0x90, 0x4a, 0xbf, 0x28, 0x89, 0xd1, 0x8b, 0xc2, 0xf9, 0xc6,
-       0xd2, 0x28, 0xe3, 0x65, 0xfc, 0xce, 0x41, 0xde, 0x76, 0x4f, 0xe8, 0xf9,
-       0x86, 0xcd, 0x7c, 0x2e, 0xec, 0xc2, 0x5b, 0x0e, 0x65, 0xe0, 0x7f, 0xb5,
-       0xf4, 0x9e, 0xb4, 0x3c, 0xcc, 0x3a, 0x41, 0x96, 0xb6, 0xcf, 0x23, 0xf6,
-       0xc4, 0xf5, 0x16, 0xe4, 0x31, 0xf9, 0xdf, 0xd4, 0x6d, 0x1b, 0xfe, 0x92,
-       0x9a, 0xed, 0x81, 0x3e, 0x33, 0xc3, 0x58, 0x83, 0xef, 0x71, 0xd8, 0x9a,
-       0x52, 0x22, 0x1e, 0x8a, 0x95, 0x5f, 0xb5, 0xb2, 0x41, 0x6d, 0x9f, 0x6a,
-       0x19, 0xc1, 0x76, 0x4b, 0xf2, 0xe8, 0xbb, 0x60, 0x64, 0x66, 0xa1, 0x79,
-       0x4b, 0xc9, 0x8d, 0xaf, 0x2b, 0x1a, 0x4e, 0x9c, 0x2f, 0x09, 0x75, 0x86,
-       0x1d, 0xa0, 0x4c, 0xbb, 0x92, 0xae, 0xb7, 0x16, 0xaa, 0x94, 0xc1, 0xc3,
-       0x52, 0xac, 0x0d, 0x97, 0x6c, 0x94, 0xa7, 0xeb, 0x31, 0x39, 0x5d, 0xe1,
-       0x3c, 0xfb, 0xd1, 0xc7, 0x45, 0x1d, 0x18, 0x6b, 0x90, 0xf2, 0x98, 0x6b,
-       0xbe, 0x6e, 0xe9, 0x35, 0xb1, 0x07, 0x77, 0xcb, 0xfa, 0x44, 0xf3, 0x9a,
-       0x55, 0xac, 0xd3, 0x4e, 0x42, 0x7d, 0xb3, 0x53, 0x66, 0xfb, 0xf2, 0xfa,
-       0x79, 0xac, 0x5d, 0xc0, 0x7a, 0x59, 0x25, 0xb3, 0xba, 0x21, 0xf7, 0x7e,
-       0x52, 0xf9, 0x72, 0xab, 0x5c, 0x1d, 0x95, 0x8b, 0x9b, 0x71, 0x39, 0x52,
-       0x19, 0x97, 0x8d, 0x4d, 0x4f, 0x0a, 0x95, 0xb4, 0xac, 0xa3, 0x4f, 0xbe,
-       0x92, 0x91, 0xb5, 0xcd, 0x63, 0xea, 0xac, 0x2f, 0x42, 0x2e, 0x6d, 0xa0,
-       0x4f, 0x63, 0x73, 0x12, 0x3f, 0xdf, 0x1e, 0x88, 0xa1, 0xdf, 0x10, 0xfa,
-       0x88, 0xf5, 0xb3, 0xca, 0x3d, 0xc0, 0x21, 0xe6, 0xae, 0xfa, 0xb6, 0xc1,
-       0xb8, 0x2c, 0x54, 0x79, 0x4e, 0x2f, 0x4c, 0x6f, 0xac, 0xc4, 0xb2, 0xd4,
-       0x77, 0xa7, 0x9b, 0xc3, 0xe0, 0x53, 0xe8, 0xef, 0x2a, 0x65, 0x42, 0x50,
-       0x8a, 0x90, 0xb5, 0x0d, 0xc0, 0x46, 0x58, 0x1b, 0xb0, 0xdf, 0x8b, 0xcd,
-       0x21, 0x94, 0x0e, 0x4a, 0xac, 0x03, 0xd8, 0x8b, 0x4d, 0x17, 0x65, 0x0c,
-       0xa5, 0xd6, 0xed, 0x27, 0x9b, 0x9c, 0x3f, 0xab, 0x74, 0x90, 0xc6, 0xf1,
-       0xd4, 0x1d, 0xb6, 0x7a, 0xc0, 0x5b, 0xb4, 0x8a, 0x2b, 0x62, 0xe7, 0xd2,
-       0x21, 0xfa, 0x0b, 0x90, 0x2b, 0x37, 0x0f, 0x68, 0x58, 0x3e, 0x1b, 0xa0,
-       0xdc, 0x09, 0xba, 0xe7, 0x81, 0xaf, 0x5e, 0xc9, 0x06, 0x69, 0x73, 0xf1,
-       0x59, 0x5a, 0x01, 0xcf, 0xa5, 0xad, 0x12, 0x0c, 0x50, 0x5f, 0x45, 0xd9,
-       0xa7, 0xde, 0xa2, 0x5c, 0xca, 0xd5, 0xb4, 0x6d, 0x5e, 0x6a, 0xdb, 0xe6,
-       0xeb, 0xa8, 0xb7, 0x20, 0x3b, 0xe0, 0x9b, 0xd4, 0x79, 0x1e, 0x03, 0x98,
-       0x33, 0x6b, 0x15, 0x2a, 0xfe, 0x79, 0xd6, 0x5b, 0x4f, 0x54, 0x69, 0xaf,
-       0xd1, 0x6e, 0x53, 0xf2, 0x49, 0x92, 0xcb, 0x71, 0x23, 0x83, 0x23, 0x8a,
-       0x37, 0x88, 0x83, 0xe4, 0x72, 0xda, 0xd4, 0x75, 0x77, 0xd4, 0xf9, 0xb2,
-       0xfa, 0x73, 0x80, 0x61, 0x48, 0x9d, 0xad, 0xed, 0x4d, 0x59, 0x39, 0x65,
-       0x2b, 0xb6, 0x5a, 0x79, 0x37, 0x24, 0xc5, 0xf1, 0x3f, 0xc2, 0x9e, 0xd8,
-       0x56, 0x72, 0x40, 0x5a, 0xe0, 0xbb, 0xca, 0x07, 0xe6, 0xdc, 0x84, 0xb2,
-       0xb3, 0x72, 0x15, 0xf8, 0x38, 0x5a, 0xd5, 0x95, 0xfa, 0xa1, 0x87, 0xdc,
-       0x25, 0xd2, 0x53, 0xbd, 0xb5, 0x0c, 0x9c, 0xce, 0x2c, 0x15, 0xac, 0xe4,
-       0x12, 0xe8, 0x63, 0x10, 0xb6, 0x87, 0x1b, 0x91, 0xdc, 0x65, 0xd2, 0x11,
-       0xfb, 0xb0, 0xbe, 0x4b, 0x66, 0xa2, 0xbb, 0x6d, 0x9b, 0x87, 0x0e, 0x68,
-       0x9d, 0x8f, 0xbe, 0x4b, 0x70, 0xe6, 0x7a, 0xb5, 0x9f, 0x92, 0x5c, 0xa5,
-       0x9c, 0x2d, 0x40, 0xd7, 0x53, 0xe7, 0xf4, 0xc0, 0x9e, 0x61, 0x3d, 0xe7,
-       0x44, 0xdb, 0xc5, 0xac, 0x05, 0xfd, 0x66, 0x97, 0x95, 0x8d, 0x3e, 0x89,
-       0xf2, 0xde, 0x20, 0x6d, 0x5b, 0xea, 0x90, 0xe4, 0xaa, 0x3f, 0x47, 0x27,
-       0x3e, 0xf6, 0x29, 0x9d, 0x34, 0xe0, 0x0d, 0xa8, 0x79, 0x61, 0x97, 0x58,
-       0x73, 0x6a, 0xde, 0x58, 0xc7, 0xbc, 0x68, 0xbb, 0xf8, 0xb7, 0x01, 0x3d,
-       0x0f, 0xf0, 0xac, 0xf6, 0xc4, 0x36, 0x8e, 0x29, 0x58, 0x79, 0xd8, 0x4e,
-       0x33, 0x69, 0x5b, 0x02, 0x83, 0x7e, 0x5f, 0xbd, 0xaf, 0x02, 0xf6, 0x95,
-       0xc3, 0xbe, 0xec, 0xc1, 0xdd, 0xfb, 0x2a, 0x05, 0xf4, 0xbe, 0x06, 0x3a,
-       0x60, 0x8a, 0xee, 0x5a, 0xbf, 0x73, 0x5f, 0x68, 0xbb, 0xb8, 0x7b, 0x8e,
-       0xc7, 0x06, 0xf4, 0x1c, 0xd1, 0x8e, 0x39, 0x06, 0x77, 0xcd, 0x01, 0x7a,
-       0x8e, 0x72, 0xfc, 0xe0, 0x1e, 0xe3, 0x5f, 0xef, 0xd5, 0xe3, 0x39, 0xa6,
-       0x0b, 0x7a, 0x58, 0x9d, 0x75, 0x58, 0xc9, 0xd4, 0xb6, 0xad, 0x76, 0x1a,
-       0x3a, 0xaf, 0x73, 0xcc, 0x9d, 0x76, 0xa6, 0xad, 0xec, 0xcc, 0x3b, 0xe8,
-       0xcc, 0x7a, 0x14, 0x3e, 0x73, 0x6a, 0x19, 0xbe, 0x73, 0xe5, 0xed, 0x58,
-       0xf7, 0xcf, 0xe0, 0x87, 0x42, 0x16, 0x8d, 0xd2, 0x2f, 0x98, 0x14, 0xe5,
-       0x97, 0x8e, 0xc2, 0xff, 0x75, 0xf6, 0x29, 0x5b, 0xb4, 0x38, 0x3a, 0xee,
-       0xfb, 0x0b, 0xd6, 0x2c, 0xe4, 0x46, 0x71, 0x14, 0x36, 0x7d, 0x14, 0xf8,
-       0x72, 0x47, 0x30, 0x8e, 0xf0, 0xbc, 0x3b, 0x44, 0x9f, 0xf5, 0x99, 0xea,
-       0x2c, 0xde, 0xf7, 0xa1, 0xfd, 0xe7, 0x06, 0xce, 0x3e, 0xf4, 0xf9, 0x57,
-       0xa8, 0x63, 0x1b, 0xfb, 0x70, 0x8a, 0x1f, 0xe0, 0xfd, 0x41, 0xf4, 0x01,
-       0x4f, 0x81, 0x53, 0x6c, 0xf7, 0x30, 0x7e, 0x2f, 0xa3, 0xee, 0xdd, 0xa8,
-       0xbb, 0x8e, 0xba, 0x43, 0x78, 0xff, 0xe1, 0xae, 0x79, 0xdf, 0x81, 0xf7,
-       0xcf, 0xa1, 0x1d, 0xfb, 0x77, 0x5e, 0x44, 0xfb, 0x83, 0xf8, 0xfd, 0xc5,
-       0xae, 0x3e, 0x8d, 0x5d, 0xef, 0xbe, 0xbc, 0x79, 0xc9, 0xf0, 0xc0, 0x8e,
-       0x6f, 0x07, 0xfe, 0xb1, 0xa8, 0x8f, 0x0a, 0x15, 0xca, 0x9b, 0xb0, 0x3c,
-       0xb2, 0xe2, 0xcb, 0x1c, 0x91, 0x79, 0xc8, 0xfa, 0x42, 0x45, 0xbc, 0x6e,
-       0x19, 0x9e, 0xfc, 0x31, 0x64, 0xfa, 0x3c, 0xf0, 0x5a, 0x80, 0x7d, 0x71,
-       0x74, 0x25, 0x8c, 0xe7, 0x21, 0xc8, 0x3b, 0xc9, 0x74, 0x09, 0x79, 0x3e,
-       0x02, 0xd9, 0xd2, 0x0b, 0x9e, 0x57, 0x3e, 0x88, 0x3c, 0x0e, 0xb9, 0x34,
-       0x8b, 0xbe, 0xb3, 0xe8, 0xf3, 0xd1, 0xe6, 0xff, 0x31, 0xb4, 0xec, 0xc3,
-       0xf0, 0xec, 0x2e, 0x18, 0xc2, 0xe2, 0xae, 0x92, 0x1f, 0x5f, 0x98, 0x9e,
-       0x5b, 0x89, 0xc8, 0xf0, 0xaa, 0x9d, 0xa4, 0xb3, 0x3f, 0xb2, 0xca, 0x98,
-       0x84, 0x8c, 0x04, 0x85, 0xb2, 0x5f, 0xc6, 0x43, 0xb0, 0xd1, 0x02, 0xde,
-       0x30, 0x74, 0x94, 0x7a, 0x97, 0x2c, 0x60, 0xcb, 0x36, 0x77, 0x62, 0x13,
-       0x47, 0xda, 0xb1, 0x89, 0x21, 0xe8, 0x88, 0xd7, 0x83, 0x5a, 0x5e, 0x45,
-       0x40, 0x27, 0x6f, 0x01, 0xfe, 0x29, 0x5b, 0x42, 0xe0, 0x1f, 0x07, 0xbc,
-       0xf3, 0x26, 0xda, 0x6f, 0xd4, 0x5b, 0xa0, 0x77, 0xc8, 0x38, 0x9b, 0xf5,
-       0x2c, 0xd1, 0x96, 0x21, 0x0f, 0xe0, 0xbd, 0xd1, 0xc9, 0x6b, 0xe7, 0xb4,
-       0x8d, 0x75, 0x97, 0x6f, 0xf3, 0xa0, 0xa3, 0x69, 0x91, 0xf6, 0xfa, 0xe1,
-       0xd0, 0x9d, 0x7b, 0xfc, 0xa3, 0x5d, 0x7b, 0x0c, 0x4a, 0x72, 0x89, 0xf8,
-       0x8d, 0xa8, 0xbd, 0xfa, 0xf8, 0x2d, 0x2a, 0x5b, 0x7e, 0x1c, 0x3e, 0x89,
-       0x40, 0x9a, 0x2b, 0x5b, 0x14, 0x3a, 0xb1, 0x0f, 0xb2, 0x9e, 0x72, 0x9e,
-       0xf8, 0x0e, 0x03, 0x87, 0x11, 0xfc, 0x1c, 0xfc, 0x76, 0x70, 0x7a, 0xb2,
-       0xbd, 0x3f, 0x7f, 0x0f, 0xeb, 0x90, 0x55, 0x2c, 0x09, 0x3f, 0xf0, 0x71,
-       0x91, 0xcf, 0x90, 0xaf, 0x7d, 0x94, 0xb7, 0x3e, 0x4c, 0x8f, 0xed, 0x82,
-       0x89, 0xb8, 0x21, 0x4c, 0xf5, 0x16, 0x6c, 0x8b, 0x28, 0xa3, 0x60, 0xa7,
-       0x9b, 0xd4, 0x29, 0x5c, 0x73, 0x92, 0xf6, 0xb6, 0x81, 0x93, 0x7a, 0xc5,
-       0x93, 0x73, 0x95, 0xb7, 0x1b, 0xb8, 0x78, 0xbe, 0xb0, 0xf9, 0x96, 0xb8,
-       0x7e, 0x54, 0xe9, 0x1e, 0x0d, 0xd3, 0x6e, 0xfc, 0xd0, 0x3f, 0x27, 0x7e,
-       0xa8, 0x0f, 0x88, 0x4b, 0xda, 0xd4, 0xc4, 0xe7, 0xef, 0x00, 0x9f, 0xec,
-       0xeb, 0x1a, 0xdd, 0xf2, 0x2e, 0x03, 0xd7, 0xdd, 0xfa, 0xf8, 0xf4, 0x1d,
-       0xfa, 0xd8, 0xc7, 0xf1, 0x5e, 0x67, 0xf1, 0xfb, 0x7d, 0xbe, 0xcc, 0x1d,
-       0x5e, 0xdd, 0xab, 0x7d, 0xd9, 0xb4, 0xb3, 0xad, 0xb3, 0xfe, 0xdb, 0x7d,
-       0xfe, 0x19, 0x0e, 0x2f, 0xef, 0x6e, 0xeb, 0x3b, 0xb0, 0x33, 0x66, 0xf7,
-       0x7c, 0x3f, 0xee, 0xdb, 0xdb, 0xaf, 0xdd, 0xf1, 0xeb, 0xe0, 0xab, 0xd8,
-       0x3b, 0x7b, 0xc9, 0xda, 0xf3, 0xcd, 0x82, 0xad, 0xf7, 0xc2, 0x3e, 0x68,
-       0x6b, 0x6e, 0xf5, 0x07, 0x95, 0x6e, 0xcc, 0xda, 0xf4, 0x63, 0x4a, 0x6b,
-       0x7c, 0xbe, 0x07, 0x65, 0xe7, 0xd8, 0x21, 0xf0, 0x40, 0x16, 0x7d, 0x39,
-       0xc7, 0xee, 0xf1, 0xbe, 0x8d, 0x94, 0x96, 0x85, 0x5a, 0x08, 0xed, 0x89,
-       0x6c, 0x49, 0x1e, 0x86, 0xaf, 0x98, 0x98, 0xa2, 0xdf, 0x00, 0x7f, 0x79,
-       0x46, 0xe4, 0x98, 0x94, 0x6b, 0x1f, 0x94, 0x85, 0x95, 0x96, 0xbc, 0x1f,
-       0x7a, 0xf0, 0xf7, 0xa0, 0x47, 0xe5, 0x12, 0x84, 0xd7, 0x25, 0x1c, 0xc6,
-       0xa5, 0xa8, 0xd8, 0x4f, 0xc1, 0x96, 0xbf, 0x10, 0x93, 0xe0, 0x05, 0xd2,
-       0x5e, 0xca, 0x79, 0xbf, 0x48, 0xbf, 0x2d, 0x57, 0xe1, 0x08, 0x25, 0x26,
-       0xb3, 0x92, 0x82, 0xfd, 0x37, 0xe6, 0x34, 0x50, 0x96, 0x25, 0x35, 0xfa,
-       0xb4, 0xa0, 0xef, 0x25, 0xf4, 0xc5, 0xb8, 0x9e, 0x8d, 0x38, 0x7e, 0x83,
-       0xd2, 0xbb, 0x41, 0x18, 0x92, 0xa6, 0x24, 0x2c, 0x3f, 0x6c, 0xd1, 0xd7,
-       0x7d, 0x66, 0x33, 0x0c, 0xdd, 0x14, 0x97, 0xe7, 0x20, 0x67, 0x9f, 0x55,
-       0xf1, 0x17, 0xb7, 0xed, 0x8f, 0x3e, 0x7a, 0x18, 0x74, 0xb7, 0x2c, 0xe1,
-       0xa8, 0xf7, 0x73, 0x59, 0x59, 0x6e, 0xc1, 0xef, 0xa1, 0xac, 0x7f, 0x00,
-       0xf2, 0x2a, 0xf1, 0xa5, 0x12, 0x6d, 0x49, 0x37, 0x03, 0xd8, 0x4b, 0x32,
-       0x73, 0xf8, 0x5d, 0x03, 0x9a, 0x3e, 0x8e, 0x49, 0x70, 0xb9, 0x00, 0xfb,
-       0xf9, 0x8c, 0x2c, 0xa6, 0xe1, 0x9f, 0xda, 0xa5, 0x56, 0xc0, 0x75, 0x63,
-       0xd0, 0xdb, 0xd0, 0xa7, 0x2b, 0xf4, 0x87, 0xe5, 0xc8, 0x32, 0xfb, 0x9c,
-       0x01, 0x6d, 0x75, 0x01, 0x77, 0xdd, 0x72, 0x36, 0x9a, 0x28, 0xe5, 0xc1,
-       0x4f, 0xb6, 0xdb, 0x0f, 0x5e, 0x66, 0x49, 0xfd, 0xf6, 0x34, 0xe8, 0x87,
-       0xcf, 0x38, 0xce, 0x55, 0xd6, 0x27, 0x51, 0xb2, 0xde, 0x15, 0x7b, 0x29,
-       0x8c, 0xb9, 0xa0, 0x93, 0x2e, 0x97, 0xe4, 0x6c, 0xe6, 0x98, 0x34, 0x6a,
-       0xf0, 0xc9, 0x33, 0xb0, 0xa3, 0xea, 0x9e, 0x34, 0x2a, 0xb4, 0x9f, 0x4e,
-       0x81, 0x1f, 0x5e, 0x41, 0x39, 0x8f, 0xf2, 0x16, 0xca, 0x8f, 0xa3, 0x7c,
-       0x0d, 0x25, 0x61, 0x3f, 0x25, 0x8d, 0xfa, 0x55, 0xcc, 0xcd, 0x39, 0xa6,
-       0x0c, 0xcc, 0xf0, 0x21, 0x0f, 0x9f, 0x82, 0x9d, 0xe3, 0xd7, 0x9f, 0x12,
-       0x69, 0x7c, 0x0c, 0xbf, 0x96, 0x7a, 0xa7, 0x8f, 0xb9, 0x90, 0x99, 0x84,
-       0xbd, 0x2b, 0xd6, 0xd9, 0xcc, 0xc7, 0xcd, 0x3c, 0x1f, 0xc3, 0x7a, 0xd7,
-       0xb1, 0x76, 0x18, 0xe7, 0xd9, 0x92, 0x47, 0xd3, 0x67, 0xe4, 0x93, 0xe9,
-       0x7b, 0x65, 0x62, 0x20, 0x5c, 0x0a, 0x7b, 0xdc, 0x3f, 0xed, 0xda, 0xbd,
-       0xf6, 0xef, 0xef, 0x9b, 0x7b, 0x8e, 0x60, 0x2f, 0xfb, 0xb5, 0xed, 0x66,
-       0xff, 0x13, 0xe3, 0x73, 0x58, 0x92, 0x1c, 0xe1, 0x7c, 0x9e, 0x04, 0x96,
-       0x47, 0x9c, 0x8c, 0x3d, 0x06, 0xeb, 0x3d, 0x85, 0xdf, 0x19, 0xd0, 0x8a,
-       0x7b, 0x3e, 0x69, 0xff, 0x47, 0xc0, 0x84, 0xb6, 0x06, 0xd7, 0x11, 0x2b,
-       0x78, 0xe8, 0x26, 0xf6, 0x56, 0x92, 0xee, 0x43, 0x9e, 0xdc, 0x6e, 0xf2,
-       0x19, 0x92, 0xf2, 0xd2, 0x31, 0xf9, 0x71, 0xed, 0xba, 0x9c, 0xab, 0x1d,
-       0x93, 0x97, 0x51, 0x2e, 0xd6, 0x4a, 0xc0, 0x23, 0x7d, 0x46, 0xce, 0xd1,
-       0xc2, 0xb9, 0x50, 0x2e, 0xdf, 0x1f, 0x9b, 0xc7, 0xf9, 0xcd, 0x3a, 0x2d,
-       0xd9, 0x48, 0x97, 0x64, 0x63, 0x12, 0x63, 0xea, 0x3d, 0x12, 0xfa, 0x2a,
-       0xf7, 0xdb, 0x27, 0xf9, 0x5a, 0x49, 0x0a, 0x19, 0xfa, 0x34, 0xbd, 0x92,
-       0x87, 0x4d, 0x0e, 0x3b, 0xe8, 0x8c, 0x8e, 0xb3, 0xb9, 0xb1, 0x22, 0x6c,
-       0xf8, 0x85, 0xe6, 0xeb, 0x56, 0xa3, 0x6d, 0xff, 0x6f, 0x59, 0xcf, 0xc2,
-       0x76, 0xfd, 0x0e, 0xe4, 0xc6, 0x73, 0xb0, 0x09, 0x9f, 0xbd, 0x83, 0xc7,
-       0x48, 0x23, 0xd7, 0xac, 0x46, 0x7d, 0x94, 0x7c, 0x66, 0xf8, 0x01, 0x63,
-       0xe1, 0xe7, 0x34, 0x6a, 0xb7, 0x0c, 0xfd, 0x29, 0x5b, 0x00, 0xe7, 0x42,
-       0xbd, 0xf2, 0x77, 0xf0, 0xaf, 0x28, 0x77, 0x7c, 0xbd, 0xaf, 0xfd, 0x86,
-       0x3a, 0x60, 0xcd, 0x47, 0x13, 0x80, 0x4a, 0xa4, 0x5e, 0x2f, 0x28, 0x5c,
-       0xb9, 0xcb, 0x43, 0x52, 0xab, 0x12, 0xbf, 0x09, 0xc7, 0xb6, 0x95, 0x5d,
-       0x0b, 0xbc, 0xba, 0x38, 0x1f, 0xbf, 0x3d, 0x01, 0xff, 0xe1, 0x8c, 0x38,
-       0x13, 0xbd, 0xd8, 0x13, 0x9f, 0x45, 0x66, 0x2e, 0xff, 0x3a, 0x19, 0xd0,
-       0x05, 0xbf, 0x3e, 0x84, 0xb3, 0x8c, 0xc8, 0x59, 0xd8, 0xff, 0xe7, 0x40,
-       0x47, 0x9f, 0xaf, 0x0c, 0xc9, 0xf9, 0x4a, 0x1c, 0xfe, 0x16, 0xed, 0x94,
-       0xe5, 0xe9, 0xe4, 0x3a, 0xcb, 0x27, 0xa6, 0x53, 0x75, 0x96, 0x5f, 0x32,
-       0xfe, 0xe2, 0x97, 0x8d, 0x1f, 0xb9, 0x3e, 0xad, 0x7d, 0xb8, 0xaf, 0x4d,
-       0x8f, 0xaa, 0xb2, 0x39, 0xbd, 0x13, 0x3b, 0x09, 0x1b, 0xbd, 0x9d, 0xa1,
-       0x7e, 0x06, 0x8c, 0x12, 0x3c, 0x09, 0x7a, 0x9a, 0x87, 0xdc, 0xce, 0xc1,
-       0xf7, 0x38, 0x0b, 0x1f, 0xa4, 0xd8, 0x84, 0x4c, 0xf0, 0xd2, 0x28, 0xc5,
-       0xfc, 0xf9, 0x63, 0xbb, 0x18, 0xdf, 0xe4, 0x99, 0x19, 0xff, 0x2b, 0x4d,
-       0xff, 0xab, 0xf3, 0x8f, 0xf3, 0x81, 0x36, 0xa9, 0x2b, 0x7f, 0x09, 0x9f,
-       0x51, 0x82, 0xc5, 0x0c, 0xc7, 0xa6, 0xe9, 0xaf, 0xca, 0x36, 0xec, 0x83,
-       0xb0, 0xf7, 0x3d, 0x09, 0x3f, 0xd5, 0x6a, 0xbd, 0x0a, 0x59, 0x53, 0x82,
-       0xcf, 0x68, 0x5b, 0xa8, 0x5f, 0x67, 0x1b, 0xe5, 0xc8, 0x98, 0x73, 0x1b,
-       0x34, 0x97, 0x3d, 0x2e, 0xf2, 0x5d, 0xd4, 0x35, 0x56, 0x78, 0x06, 0xdf,
-       0xc7, 0x19, 0x98, 0x33, 0x51, 0x75, 0xec, 0x07, 0xfb, 0x3d, 0xca, 0x7d,
-       0x8c, 0x39, 0xdd, 0x18, 0x5f, 0x5f, 0xe7, 0x98, 0xc4, 0x24, 0xaf, 0x74,
-       0xbe, 0xbb, 0xae, 0xf7, 0x77, 0x34, 0x33, 0x2a, 0x57, 0x2b, 0x6a, 0x0e,
-       0xd0, 0xfa, 0xaf, 0x30, 0x66, 0x0b, 0x74, 0xcb, 0x18, 0x95, 0x27, 0x65,
-       0xe8, 0xa4, 0x72, 0x25, 0x05, 0xda, 0x09, 0xca, 0x6c, 0x8c, 0x60, 0xbb,
-       0xb2, 0x5d, 0xf9, 0x72, 0x97, 0x8e, 0x8f, 0xf0, 0x19, 0x3a, 0xac, 0x39,
-       0x23, 0xbc, 0x1b, 0x81, 0x7d, 0x83, 0x3d, 0x75, 0xe2, 0x42, 0xff, 0x15,
-       0x71, 0x16, 0x66, 0x8f, 0xea, 0x4f, 0xaf, 0x83, 0xf1, 0x66, 0x9d, 0x02,
-       0x14, 0x77, 0x1e, 0xeb, 0xa7, 0x2e, 0x05, 0x83, 0x8c, 0xa9, 0x27, 0x2f,
-       0x81, 0xad, 0x3c, 0x83, 0x8b, 0xa6, 0x4f, 0x6b, 0xbe, 0x2f, 0x4a, 0xda,
-       0x22, 0x0e, 0x12, 0xa5, 0x2d, 0x20, 0x7b, 0xc0, 0xbb, 0x21, 0x1f, 0x5a,
-       0xd5, 0x7b, 0xb6, 0x2f, 0x0a, 0xef, 0x5b, 0xe4, 0xf6, 0x4a, 0x22, 0x7d,
-       0x0b, 0xb2, 0x39, 0x1f, 0x4d, 0x83, 0x56, 0x3e, 0xd1, 0x05, 0x9e, 0x9e,
-       0xcc, 0xda, 0x3f, 0xe8, 0xd2, 0xb6, 0x20, 0x7c, 0x7e, 0xc6, 0x01, 0x2a,
-       0x59, 0x8c, 0xe9, 0x96, 0x7f, 0x11, 0xc4, 0x73, 0x93, 0xef, 0xb0, 0x73,
-       0x82, 0x1a, 0xbe, 0xb2, 0xc1, 0x21, 0xfc, 0x04, 0xd1, 0xb1, 0x5c, 0x4b,
-       0x3e, 0x04, 0x29, 0x2f, 0x98, 0x3f, 0x69, 0xd6, 0x4a, 0x5e, 0x0c, 0xb7,
-       0x6d, 0xba, 0xd4, 0xaa, 0x07, 0xdb, 0x22, 0x68, 0x7c, 0x22, 0xca, 0x18,
-       0xd9, 0xc3, 0xa6, 0xee, 0xb4, 0x8f, 0xc3, 0x2a, 0x5e, 0xc7, 0x7b, 0x24,
-       0xd2, 0xd6, 0x94, 0xa1, 0xad, 0x8f, 0x81, 0xb6, 0x4e, 0x29, 0xda, 0x6a,
-       0xc9, 0xab, 0xe9, 0xb4, 0x7c, 0x61, 0x4f, 0xfa, 0xda, 0xfd, 0x17, 0x01,
-       0xbc, 0xfc, 0x0d, 0xca, 0xc2, 0x17, 0xb1, 0x2e, 0xf4, 0x4e, 0xb9, 0x92,
-       0xc8, 0xce, 0xd2, 0x16, 0x82, 0x1e, 0x29, 0xc3, 0xe7, 0x4a, 0x5e, 0x1a,
-       0x52, 0x7d, 0x92, 0xd0, 0x29, 0x0d, 0xd0, 0x1b, 0xf1, 0x5b, 0xae, 0x40,
-       0x0e, 0x5f, 0x0a, 0x41, 0x6f, 0x91, 0x67, 0x65, 0xc0, 0x86, 0x6c, 0x60,
-       0xff, 0x06, 0x78, 0x27, 0x79, 0x29, 0x82, 0x32, 0xae, 0xe6, 0x6a, 0x54,
-       0x5c, 0x35, 0xbe, 0x51, 0x19, 0x55, 0xe3, 0x1a, 0xb0, 0x5f, 0x93, 0x97,
-       0x20, 0xdf, 0x33, 0x69, 0x19, 0xb9, 0x94, 0x91, 0xf8, 0x25, 0x4b, 0x8a,
-       0x33, 0xad, 0x56, 0x18, 0xb0, 0x8f, 0x5e, 0xea, 0x97, 0x5b, 0x2a, 0xb6,
-       0x1a, 0x56, 0xf1, 0xd6, 0xc5, 0xcc, 0x0c, 0x78, 0x93, 0xf8, 0xf3, 0x30,
-       0xa6, 0x00, 0xfd, 0x58, 0x90, 0xb3, 0x2b, 0xc4, 0x0f, 0xe3, 0xe5, 0xdb,
-       0xb1, 0x80, 0x24, 0x20, 0xcb, 0x8e, 0xcb, 0x7c, 0xad, 0x1b, 0xb2, 0x2c,
-       0x08, 0x1d, 0xf8, 0x50, 0xb7, 0xf4, 0x0e, 0x93, 0x1e, 0x80, 0x17, 0x0f,
-       0x73, 0x17, 0x24, 0x8f, 0x31, 0x85, 0x95, 0x9d, 0xfe, 0x45, 0xe9, 0x06,
-       0x4f, 0x1d, 0x97, 0x93, 0x35, 0xce, 0x13, 0x74, 0xca, 0x72, 0x10, 0x34,
-       0xe4, 0x3a, 0x47, 0x30, 0x0f, 0xf4, 0x76, 0xc7, 0x1f, 0xf9, 0x2f, 0xfb,
-       0x06, 0x34, 0xe9, 0xf3, 0x5d, 0xb8, 0xd4, 0xe5, 0xcd, 0x58, 0xdb, 0x19,
-       0x09, 0xce, 0x65, 0x3e, 0x60, 0x7d, 0x37, 0x93, 0xb1, 0xae, 0x65, 0xb2,
-       0xd6, 0xf5, 0x4c, 0xc1, 0xba, 0x01, 0xdd, 0xd4, 0xd8, 0x7c, 0x0e, 0xf4,
-       0x03, 0xdd, 0xcf, 0x98, 0x79, 0xfb, 0x0c, 0xa3, 0x26, 0x66, 0xf0, 0x9a,
-       0x6c, 0x54, 0x68, 0x3b, 0xb4, 0x1e, 0x9e, 0x4b, 0x97, 0xee, 0x01, 0x7c,
-       0x80, 0x83, 0xbe, 0xee, 0x8e, 0xee, 0x08, 0x79, 0xa3, 0xb2, 0xa6, 0x74,
-       0x47, 0x84, 0xba, 0x23, 0x9d, 0x97, 0xfd, 0xb2, 0x5d, 0x03, 0xff, 0x89,
-       0xb2, 0x83, 0x65, 0xbb, 0x1e, 0x95, 0x2f, 0x54, 0x7d, 0x5a, 0xe2, 0x7e,
-       0xcb, 0x6f, 0xea, 0x91, 0x80, 0x4c, 0x29, 0x7d, 0xdd, 0x27, 0x57, 0xd7,
-       0xe1, 0x0f, 0xc1, 0x5a, 0xb0, 0xef, 0x63, 0xac, 0xc0, 0x56, 0xbe, 0xb1,
-       0xf4, 0xf3, 0xee, 0xea, 0x2c, 0x70, 0xc5, 0xfb, 0x25, 0xec, 0xb3, 0x9f,
-       0x3b, 0xf2, 0xdf, 0xc7, 0xc1, 0x93, 0x7c, 0xb6, 0x24, 0x0f, 0xbb, 0x91,
-       0xf7, 0x5c, 0x79, 0xd8, 0x3d, 0xdb, 0x95, 0x31, 0xc0, 0x15, 0x80, 0x4d,
-       0x1e, 0x06, 0x1c, 0x55, 0xd5, 0xde, 0xed, 0x8a, 0x35, 0x07, 0x3d, 0x5c,
-       0x54, 0xf7, 0x57, 0x28, 0xd7, 0xf5, 0xda, 0x79, 0xf8, 0xab, 0xc5, 0xf1,
-       0x1e, 0xea, 0xb7, 0xd1, 0x12, 0xf9, 0x5e, 0xd9, 0xf1, 0x19, 0xf0, 0xdc,
-       0x57, 0xba, 0xa9, 0xdb, 0x8f, 0xa6, 0x27, 0xe5, 0x46, 0x85, 0xcf, 0x6c,
-       0x4f, 0xa4, 0x45, 0xc5, 0x8f, 0x2b, 0xd3, 0x8b, 0xee, 0x6b, 0x86, 0xc7,
-       0x6a, 0xa0, 0xf1, 0x53, 0xf2, 0x8d, 0xcd, 0x79, 0xf9, 0xf7, 0x9b, 0xb3,
-       0xb0, 0x4f, 0x4e, 0xc0, 0x3e, 0xf9, 0x08, 0x78, 0xf8, 0x38, 0x78, 0xf8,
-       0xe3, 0xa0, 0xfb, 0x19, 0x15, 0x77, 0xa8, 0x55, 0x12, 0x57, 0x4a, 0x2a,
-       0xce, 0xfd, 0x1a, 0x68, 0x7e, 0x42, 0x82, 0xab, 0x43, 0xc0, 0x6b, 0xa9,
-       0x15, 0x75, 0x5b, 0x0f, 0xc3, 0x06, 0xc1, 0x59, 0x97, 0x12, 0x41, 0x45,
-       0x23, 0xae, 0xf3, 0x69, 0xe0, 0xf2, 0x4d, 0x5e, 0xa2, 0xc6, 0x23, 0xde,
-       0xa8, 0x8d, 0x4a, 0xf1, 0x32, 0xfa, 0x2f, 0x47, 0x80, 0x37, 0xea, 0xc6,
-       0xc4, 0xf9, 0xa2, 0x6c, 0x81, 0x2e, 0xb2, 0xc0, 0xcf, 0x3b, 0xa4, 0x1c,
-       0x4d, 0x7c, 0x4d, 0x64, 0x52, 0x0e, 0x2d, 0x81, 0xa6, 0x97, 0x6c, 0xec,
-       0x99, 0xb8, 0xc4, 0xf3, 0x65, 0x4f, 0xec, 0x65, 0xca, 0xa2, 0x03, 0xc6,
-       0x37, 0xd1, 0xfa, 0xbe, 0x2e, 0x5c, 0x97, 0xeb, 0x7d, 0x46, 0xe6, 0xa1,
-       0x53, 0x61, 0x7f, 0x43, 0x66, 0xbb, 0x31, 0xac, 0x19, 0x9e, 0xbb, 0xec,
-       0x84, 0xe7, 0x2f, 0x73, 0x9e, 0xb0, 0x04, 0x96, 0x78, 0xb6, 0x9c, 0x07,
-       0x3c, 0x80, 0xb9, 0x53, 0x4b, 0xc4, 0xdb, 0x18, 0xc6, 0xfd, 0x63, 0xe8,
-       0x63, 0x4d, 0x57, 0xb9, 0x65, 0x2d, 0x1f, 0x72, 0x8d, 0x4e, 0x9d, 0x88,
-       0x33, 0x80, 0xfc, 0xc8, 0x36, 0xb4, 0x7e, 0x2b, 0x28, 0xfd, 0xa7, 0x75,
-       0xdf, 0x71, 0x81, 0x51, 0xd7, 0xeb, 0xaa, 0xfd, 0x04, 0x96, 0xb7, 0xa8,
-       0xef, 0xb1, 0x06, 0xc7, 0x84, 0x3a, 0xe0, 0xce, 0x40, 0xee, 0xdc, 0x1b,
-       0x26, 0xee, 0x1f, 0x83, 0x7e, 0x4d, 0x2e, 0xe9, 0x98, 0x7c, 0xf2, 0x72,
-       0x1a, 0xfb, 0x91, 0x41, 0x46, 0x17, 0x6c, 0xec, 0xe1, 0x7d, 0x4a, 0x7e,
-       0x4d, 0x40, 0x66, 0x39, 0xb2, 0x7e, 0x90, 0x67, 0x33, 0x28, 0x8d, 0xa7,
-       0xf9, 0xce, 0x33, 0xe2, 0x79, 0x93, 0x17, 0xa3, 0xd0, 0x2f, 0x38, 0xa7,
-       0xbe, 0x21, 0xa9, 0x6f, 0xb2, 0x6d, 0x48, 0xd1, 0x72, 0x10, 0x67, 0xb0,
-       0x58, 0x69, 0x3d, 0x9c, 0x4b, 0x97, 0x40, 0x6d, 0xc4, 0x39, 0xf1, 0x41,
-       0xbc, 0x8f, 0x03, 0x36, 0xe2, 0xb8, 0x8f, 0xba, 0x18, 0x75, 0xfb, 0xa5,
-       0x58, 0x23, 0x3d, 0xa3, 0xac, 0xef, 0x37, 0xbe, 0xde, 0x67, 0x78, 0x27,
-       0x84, 0xbd, 0x6b, 0x3a, 0x2e, 0x80, 0xa6, 0xca, 0xf0, 0xbb, 0xae, 0x2e,
-       0x49, 0xf8, 0x4d, 0x90, 0xcf, 0x9f, 0xa2, 0x0c, 0x05, 0x7d, 0x95, 0xd7,
-       0x27, 0x40, 0x6b, 0x7d, 0x90, 0x97, 0xad, 0xd6, 0x71, 0xd8, 0xc9, 0xa7,
-       0xd3, 0xc4, 0xd1, 0x4d, 0xe0, 0xa8, 0x3b, 0x76, 0x1a, 0xe7, 0xb5, 0xf6,
-       0xf4, 0x43, 0x4a, 0x5e, 0xc0, 0xd6, 0x51, 0x7a, 0x4b, 0xc7, 0x38, 0xd2,
-       0xb4, 0x8d, 0x14, 0x0f, 0xe7, 0x5c, 0xca, 0xc3, 0x3c, 0xf0, 0x30, 0xae,
-       0xe4, 0xb7, 0x96, 0x2d, 0x3d, 0x52, 0x3c, 0x9e, 0xc5, 0x7e, 0x27, 0x77,
-       0xf5, 0xcb, 0xe0, 0x1d, 0xb6, 0x5f, 0xf3, 0x43, 0x61, 0xc6, 0x43, 0x03,
-       0xde, 0xa4, 0x6c, 0x1c, 0x9c, 0x92, 0x8b, 0x07, 0x13, 0x93, 0xb3, 0x36,
-       0x75, 0xc2, 0x94, 0xd4, 0x9f, 0xce, 0xca, 0x5a, 0x55, 0xeb, 0xe6, 0x39,
-       0x77, 0x52, 0xf2, 0xcd, 0x02, 0xde, 0x3d, 0x94, 0xec, 0xef, 0xcb, 0x5d,
-       0x7f, 0x4f, 0x39, 0xee, 0x09, 0x32, 0x42, 0xeb, 0x5e, 0xdb, 0xee, 0xc6,
-       0xf9, 0x50, 0x2e, 0x7c, 0x10, 0xf5, 0x39, 0xc8, 0x36, 0x9e, 0x67, 0x0a,
-       0x67, 0x77, 0x4a, 0x9d, 0x53, 0x3e, 0x4d, 0x7f, 0x80, 0x63, 0x12, 0xb1,
-       0x39, 0xd4, 0xcf, 0x08, 0x75, 0x28, 0xf7, 0xe6, 0xcf, 0xe7, 0x19, 0xf8,
-       0x03, 0x8c, 0x31, 0xe1, 0xef, 0x33, 0x61, 0xf2, 0x64, 0xc0, 0xf5, 0xeb,
-       0xc7, 0xa0, 0x7f, 0x43, 0x6a, 0x8d, 0x72, 0x95, 0x75, 0x29, 0x87, 0xe3,
-       0xf3, 0x69, 0xbe, 0x8b, 0x3c, 0x66, 0xfc, 0xf2, 0xe3, 0xf0, 0x5b, 0xf3,
-       0xcd, 0xae, 0xdf, 0xa0, 0x7f, 0x77, 0x64, 0x9d, 0x96, 0xcb, 0xdb, 0x31,
-       0xc7, 0xc8, 0xde, 0x93, 0x35, 0xc6, 0xac, 0x2d, 0xe9, 0x82, 0x2c, 0x3d,
-       0x2a, 0xc3, 0x46, 0x8e, 0x72, 0x3f, 0x7d, 0x4a, 0xd7, 0xe5, 0x67, 0x62,
-       0x72, 0x6e, 0xed, 0xff, 0x85, 0xae, 0x7f, 0xbd, 0x5d, 0x57, 0xd8, 0xc3,
-       0xae, 0xbb, 0x79, 0x19, 0xf2, 0xa0, 0x0a, 0x59, 0x51, 0x85, 0xac, 0xa8,
-       0x42, 0x56, 0x54, 0x21, 0x2b, 0xaa, 0x90, 0x15, 0x55, 0xc8, 0x8a, 0xea,
-       0x8c, 0xd1, 0x9b, 0xa7, 0x21, 0x73, 0xe9, 0xf3, 0xd0, 0xcf, 0xe9, 0xb4,
-       0x05, 0xe2, 0x90, 0x25, 0xf4, 0x67, 0x12, 0xa5, 0x5b, 0xc0, 0xcd, 0xd7,
-       0xd3, 0xf4, 0xb9, 0x5b, 0xf2, 0x57, 0xe9, 0xce, 0xdd, 0xab, 0xf8, 0x86,
-       0x3c, 0x0a, 0x7c, 0x7d, 0x08, 0xf8, 0xfa, 0xf0, 0x5d, 0x39, 0x16, 0x7e,
-       0x4c, 0x64, 0xb8, 0x14, 0x80, 0xff, 0x39, 0x73, 0x07, 0xee, 0xe8, 0x7b,
-       0x63, 0x8d, 0xbb, 0x6c, 0x63, 0xfa, 0xdc, 0xa3, 0xea, 0xde, 0x7c, 0x03,
-       0x76, 0xf9, 0x8d, 0x74, 0x29, 0x12, 0x50, 0xf7, 0x73, 0x2e, 0x69, 0x67,
-       0x8f, 0xbf, 0x6f, 0x84, 0xb5, 0x5c, 0xd4, 0x67, 0x9f, 0xcf, 0xf4, 0x81,
-       0x0f, 0x68, 0xdf, 0xdd, 0x50, 0xf6, 0xdd, 0xd1, 0x74, 0x50, 0xb6, 0xa2,
-       0xd4, 0xa9, 0x3f, 0x92, 0x93, 0x2b, 0x91, 0x1e, 0xfa, 0xdf, 0x8b, 0xd5,
-       0x83, 0xb2, 0xad, 0x64, 0xca, 0x07, 0xd1, 0xd7, 0x93, 0x79, 0xd0, 0xc4,
-       0x11, 0xf8, 0x8e, 0x17, 0x65, 0x2c, 0x76, 0x11, 0x7b, 0xfd, 0x3c, 0xc6,
-       0xc0, 0x07, 0x68, 0x15, 0x50, 0x77, 0x1d, 0x7e, 0xc6, 0x6d, 0xe1, 0xf3,
-       0x98, 0x73, 0x1e, 0x88, 0xce, 0x3a, 0x29, 0xe7, 0x35, 0xf1, 0xe9, 0x8c,
-       0x34, 0xc5, 0xbb, 0xb6, 0x41, 0xc9, 0xaf, 0xd3, 0x2f, 0xeb, 0x03, 0x1f,
-       0xfe, 0x08, 0x7a, 0x98, 0x6b, 0x50, 0x2e, 0x70, 0x0f, 0xff, 0x0d, 0xf0,
-       0xc5, 0x67, 0xbb, 0xbd, 0xfb, 0xa1, 0x7b, 0x29, 0xf7, 0xb5, 0xef, 0x94,
-       0xc7, 0x18, 0xa5, 0x1b, 0xd2, 0xbc, 0x77, 0xe0, 0xfe, 0xfe, 0x18, 0x76,
-       0x4e, 0x14, 0x74, 0x80, 0xfa, 0x75, 0xdf, 0xce, 0xf5, 0xed, 0x19, 0x1d,
-       0xeb, 0xbb, 0xa2, 0x6c, 0x9a, 0x1c, 0xf4, 0xd8, 0x31, 0xf4, 0x65, 0xac,
-       0xbd, 0xd5, 0x3a, 0x95, 0x86, 0xdf, 0xf1, 0x24, 0x65, 0xd9, 0x7d, 0xe0,
-       0x69, 0xda, 0x45, 0xd4, 0xb9, 0x62, 0xdd, 0xcc, 0x6c, 0x3b, 0x61, 0xe8,
-       0xcb, 0x19, 0xd0, 0x5c, 0x0e, 0x74, 0x18, 0x78, 0x60, 0x0a, 0xfa, 0x57,
-       0xc5, 0x9c, 0x41, 0xeb, 0x5c, 0xf7, 0x83, 0xd6, 0x5f, 0x64, 0xc6, 0xa1,
-       0x8f, 0x1f, 0x82, 0x3e, 0xe6, 0x7d, 0x74, 0x0e, 0x3a, 0x99, 0xfa, 0xd8,
-       0x91, 0x3f, 0xdd, 0xcc, 0x41, 0x76, 0xdd, 0xd7, 0x43, 0x5e, 0x9b, 0x6a,
-       0xf3, 0x54, 0xc1, 0xf0, 0xdc, 0x01, 0x13, 0xfb, 0x28, 0x28, 0xde, 0x2c,
-       0xaf, 0xd3, 0x0e, 0x01, 0x9f, 0xae, 0x53, 0x46, 0xd0, 0xa6, 0xa4, 0xec,
-       0x80, 0xac, 0x59, 0xff, 0x00, 0xca, 0x29, 0x94, 0xda, 0x56, 0xbb, 0x52,
-       0x7d, 0x35, 0xec, 0xdf, 0x23, 0xef, 0xd8, 0x6b, 0x75, 0xec, 0xef, 0x18,
-       0x73, 0x1b, 0x4a, 0xfd, 0xde, 0x47, 0xb0, 0xc7, 0xe3, 0xa0, 0xc1, 0x19,
-       0xd0, 0xe0, 0x14, 0xf6, 0x7a, 0xde, 0x1a, 0x39, 0x1c, 0x80, 0x3e, 0x3f,
-       0x23, 0x85, 0x34, 0x64, 0xee, 0x5a, 0xc9, 0x9a, 0x58, 0x12, 0xf5, 0x9e,
-       0x4f, 0xf3, 0x4e, 0xfd, 0xbd, 0x2a, 0x3e, 0xb8, 0xbc, 0x19, 0x34, 0x71,
-       0xc4, 0x20, 0xea, 0xa8, 0xc3, 0x21, 0xb3, 0x1c, 0xcc, 0x55, 0xfd, 0x59,
-       0xaf, 0xf4, 0x62, 0xbe, 0xea, 0x34, 0xde, 0x19, 0x5b, 0x38, 0x66, 0xdd,
-       0x59, 0xcf, 0xd8, 0x45, 0xc2, 0xc9, 0xc1, 0x17, 0x0d, 0xba, 0x8c, 0x5f,
-       0xb8, 0x38, 0x9f, 0xac, 0xe4, 0x47, 0x60, 0x93, 0x29, 0x99, 0xdc, 0x6b,
-       0x64, 0x32, 0xe4, 0x5d, 0xcd, 0x93, 0xb5, 0x4d, 0xda, 0x4e, 0x9e, 0xf2,
-       0xa7, 0x29, 0xc7, 0x8a, 0x35, 0xd8, 0x3f, 0xe9, 0xdf, 0xb3, 0xb2, 0x6a,
-       0xce, 0xb0, 0xca, 0xd5, 0x28, 0xad, 0x89, 0xe5, 0x1c, 0xbe, 0x09, 0xff,
-       0x35, 0x03, 0x1e, 0xf6, 0x20, 0x37, 0x1d, 0xc8, 0x45, 0xea, 0xb5, 0xaf,
-       0x76, 0x4b, 0x1f, 0xea, 0x2f, 0xc3, 0xe6, 0x79, 0x92, 0x7c, 0x7b, 0x5d,
-       0xec, 0xc6, 0x1b, 0xc5, 0x47, 0x18, 0x1b, 0x19, 0x32, 0x77, 0xb3, 0xff,
-       0x0b, 0xf0, 0xea, 0x35, 0x42, 0xb0, 0xeb, 0xaf, 0xd6, 0xf6, 0xc1, 0x47,
-       0x3c, 0x66, 0xe5, 0xa3, 0xac, 0x2b, 0xc9, 0x7a, 0x86, 0x76, 0x28, 0x63,
-       0x24, 0x61, 0xd4, 0xef, 0xf6, 0x49, 0xa9, 0xff, 0x9f, 0x53, 0x77, 0x34,
-       0x0b, 0x4a, 0xee, 0xfa, 0xf1, 0xe5, 0xe7, 0x24, 0xd9, 0xf4, 0xe3, 0x54,
-       0x5c, 0x7f, 0xcb, 0x2a, 0x36, 0xff, 0x1c, 0xeb, 0x10, 0x06, 0xee, 0x45,
-       0xaf, 0x63, 0x2f, 0x4f, 0x98, 0x75, 0x1c, 0x2b, 0x74, 0x38, 0x86, 0xfd,
-       0xec, 0xef, 0x93, 0xbe, 0x00, 0xe4, 0xd9, 0x28, 0x9e, 0x6f, 0xa1, 0x6e,
-       0xe7, 0xbd, 0x51, 0x15, 0x2b, 0x70, 0x18, 0xde, 0x33, 0xf4, 0x77, 0x03,
-       0x32, 0xc7, 0x86, 0xfe, 0x6c, 0x54, 0x3f, 0x8e, 0x12, 0xe3, 0x9e, 0xbc,
-       0x2e, 0x73, 0xda, 0xdf, 0x86, 0x4d, 0x39, 0xac, 0x74, 0xf0, 0x4c, 0x9a,
-       0xb1, 0x90, 0x33, 0x90, 0x8f, 0xf7, 0xa3, 0x8e, 0x7e, 0x53, 0x49, 0x9c,
-       0xf7, 0x14, 0x8c, 0xbf, 0xaf, 0xcf, 0x25, 0xa0, 0xf4, 0xf5, 0x0a, 0xce,
-       0x83, 0x73, 0x50, 0xdf, 0xfd, 0x5c, 0x3e, 0xd5, 0x11, 0x47, 0xc9, 0xd9,
-       0xed, 0xb8, 0x41, 0x36, 0x0f, 0x1d, 0xbd, 0x56, 0x25, 0x0f, 0x66, 0x70,
-       0xde, 0x59, 0xf9, 0xda, 0xe6, 0x3d, 0xc0, 0x75, 0x54, 0x02, 0x4f, 0xb5,
-       0x40, 0x3f, 0xd4, 0x0d, 0x63, 0x90, 0xc9, 0x8e, 0xb1, 0x25, 0xa2, 0x12,
-       0x7c, 0x6a, 0x48, 0xba, 0x2f, 0xc4, 0xa4, 0xeb, 0x02, 0xf3, 0x4f, 0x52,
-       0x71, 0xd8, 0xc5, 0xb4, 0x87, 0x78, 0x0f, 0xc9, 0xfb, 0xc3, 0xb8, 0xbe,
-       0x8f, 0xe4, 0x5d, 0x24, 0xfa, 0xc1, 0x76, 0xef, 0xba, 0xe4, 0x00, 0x3f,
-       0x7a, 0xce, 0xdd, 0x63, 0xcb, 0x7a, 0x2c, 0xef, 0x31, 0x63, 0x25, 0x49,
-       0x99, 0x7b, 0xcc, 0x14, 0xc6, 0xa6, 0x26, 0x5f, 0x6e, 0x8f, 0xe7, 0x58,
-       0xea, 0xc4, 0x28, 0xf8, 0xfb, 0xad, 0xd2, 0xf8, 0x22, 0xf9, 0xdc, 0xbf,
-       0xeb, 0x1a, 0x32, 0x77, 0x5f, 0xec, 0x13, 0x37, 0xed, 0x49, 0xd3, 0xee,
-       0x2a, 0x3d, 0x19, 0x6c, 0xc7, 0x5b, 0x78, 0x2f, 0x96, 0x38, 0xcf, 0xe4,
-       0x11, 0x7d, 0x47, 0x46, 0x5f, 0x0a, 0xbe, 0xc5, 0x93, 0xb0, 0x31, 0xeb,
-       0x2c, 0x7b, 0xa4, 0x5c, 0x3f, 0x25, 0xb3, 0xea, 0xf9, 0x43, 0xf2, 0xa8,
-       0x43, 0xdc, 0x9d, 0x91, 0xf4, 0x84, 0xb6, 0xc7, 0xc4, 0xd6, 0xb8, 0xed,
-       0x76, 0xcf, 0xc8, 0xd1, 0xb4, 0xd2, 0x21, 0xce, 0x23, 0xc0, 0x71, 0xb1,
-       0xd9, 0x45, 0x7a, 0x07, 0xec, 0x1e, 0x78, 0x2c, 0x2b, 0x17, 0x37, 0xd1,
-       0x17, 0x67, 0xf5, 0x08, 0xdf, 0xeb, 0xc0, 0x27, 0x63, 0x16, 0x4f, 0x11,
-       0x9f, 0xdc, 0x3b, 0x75, 0x28, 0x71, 0x4a, 0x1c, 0x50, 0x2f, 0x33, 0xe6,
-       0x96, 0x98, 0xbc, 0x2d, 0xf4, 0x9b, 0x89, 0x33, 0xce, 0xe3, 0xef, 0x5b,
-       0x8f, 0xb3, 0x37, 0x06, 0x85, 0xe6, 0x98, 0x7d, 0xc1, 0x11, 0xfb, 0x12,
-       0xcb, 0x08, 0x4a, 0xb6, 0x01, 0xa4, 0x8d, 0xa4, 0x69, 0x73, 0x51, 0x07,
-       0x3b, 0xf2, 0x09, 0xf2, 0x96, 0xce, 0xff, 0x4b, 0x8e, 0x4c, 0xca, 0x95,
-       0xb5, 0xbb, 0xf9, 0x2b, 0x70, 0x41, 0xdb, 0x25, 0x77, 0xf2, 0xd7, 0xe4,
-       0x3f, 0x80, 0xbf, 0xb8, 0xc6, 0x19, 0x95, 0xbb, 0xf0, 0xa9, 0x68, 0x22,
-       0x9e, 0xd5, 0xfe, 0x85, 0x93, 0xb2, 0x47, 0xe2, 0xb4, 0x47, 0x1b, 0x4f,
-       0x8e, 0xe3, 0xdc, 0x5b, 0xf2, 0x44, 0xda, 0xa7, 0x2f, 0xe6, 0xf8, 0xb5,
-       0xa4, 0x06, 0xfd, 0x5c, 0x76, 0x2d, 0x59, 0x70, 0xcf, 0x28, 0x7b, 0xf2,
-       0xc3, 0xd1, 0x96, 0x9c, 0x4e, 0xeb, 0xb1, 0x0b, 0x32, 0x62, 0x68, 0x5c,
-       0xf9, 0x6b, 0x90, 0xbf, 0x3c, 0x2f, 0xbe, 0xdf, 0x23, 0xe9, 0x81, 0x33,
-       0x92, 0x9c, 0xd8, 0x22, 0xbe, 0x70, 0x0e, 0x94, 0x3b, 0xbf, 0x36, 0x16,
-       0xa6, 0x72, 0x9e, 0xf2, 0x15, 0xc2, 0xb4, 0x0f, 0x74, 0x9b, 0x85, 0xbf,
-       0xb4, 0x13, 0x0f, 0x4b, 0x8d, 0x94, 0x5a, 0x21, 0xac, 0x5d, 0x84, 0x3f,
-       0xf1, 0xe1, 0xa8, 0x1b, 0x1f, 0xb6, 0x47, 0x62, 0x67, 0xa5, 0xa6, 0x60,
-       0xfd, 0x44, 0x5a, 0xd3, 0xcb, 0x62, 0x66, 0xaf, 0x18, 0x55, 0x67, 0x8c,
-       0x9a, 0x73, 0x6d, 0x59, 0x9f, 0x6c, 0xea, 0x78, 0xd4, 0x4e, 0x9c, 0x7a,
-       0x47, 0xe6, 0x04, 0x8d, 0x2c, 0x28, 0xd7, 0xde, 0x25, 0xbe, 0xcc, 0xa9,
-       0x65, 0x70, 0x56, 0xcb, 0x3c, 0xa3, 0xb8, 0xb9, 0x47, 0x0a, 0x77, 0xd8,
-       0xca, 0x21, 0xe6, 0xfd, 0xc5, 0xb3, 0xf6, 0x32, 0x64, 0xc3, 0x93, 0x12,
-       0x72, 0xfd, 0xb9, 0x98, 0xd3, 0x19, 0x33, 0xf7, 0x11, 0xfb, 0x19, 0xb7,
-       0x42, 0x9f, 0x07, 0xd1, 0x7e, 0x3f, 0xfa, 0x51, 0x57, 0xf2, 0x1e, 0x80,
-       0x7a, 0x93, 0xb1, 0xf6, 0x01, 0xf4, 0xeb, 0x91, 0x7c, 0x7d, 0xbf, 0xa9,
-       0xf3, 0xe7, 0x38, 0xdc, 0xd1, 0xdf, 0xaf, 0xd3, 0xf7, 0x07, 0x59, 0x1b,
-       0x32, 0x7e, 0x99, 0x7d, 0xe3, 0xed, 0x3b, 0x10, 0xbb, 0xf1, 0xa0, 0xa3,
-       0xc7, 0xb3, 0x1f, 0x65, 0x3e, 0x74, 0x4b, 0x15, 0xfa, 0xa6, 0x3a, 0xc5,
-       0xbb, 0x40, 0x63, 0x57, 0xcc, 0x9a, 0x7c, 0x16, 0xda, 0x17, 0xaf, 0x19,
-       0x7d, 0xbb, 0x93, 0x8b, 0x7a, 0x24, 0xe3, 0xe7, 0xf5, 0x30, 0x17, 0x91,
-       0xeb, 0xf2, 0x3c, 0x40, 0x53, 0x9b, 0xda, 0x96, 0xb6, 0x33, 0x5d, 0xbc,
-       0x6b, 0x83, 0x7e, 0xd7, 0xfa, 0xbf, 0x01, 0xfd, 0xbf, 0xb1, 0x02, 0x9d,
-       0xdf, 0x47, 0xdd, 0xaf, 0xf3, 0x4f, 0xec, 0x76, 0xbe, 0x8f, 0x7f, 0x8f,
-       0xbc, 0xa5, 0xee, 0xf1, 0x7a, 0x3c, 0xca, 0xf4, 0x8c, 0xfc, 0x39, 0x6c,
-       0xad, 0x67, 0x36, 0x27, 0xb1, 0x5e, 0x1a, 0x7e, 0xdd, 0x38, 0xfc, 0xba,
-       0x51, 0xf8, 0x75, 0x2e, 0x74, 0xe1, 0x90, 0xca, 0x27, 0xa3, 0xde, 0x9f,
-       0x38, 0x24, 0xd6, 0xd7, 0x32, 0x62, 0x1d, 0xbc, 0x00, 0x1b, 0x61, 0xe9,
-       0x25, 0xd0, 0x7f, 0xe2, 0x79, 0x11, 0xf2, 0x04, 0xf9, 0xef, 0x31, 0xc9,
-       0xc6, 0x86, 0xe4, 0xf3, 0x9b, 0x6c, 0x23, 0x3d, 0x65, 0xe5, 0x15, 0xf7,
-       0x25, 0xc5, 0x67, 0x17, 0x6b, 0xd7, 0x25, 0xf4, 0x84, 0x96, 0xb5, 0x3f,
-       0x80, 0x3d, 0xd5, 0x48, 0x6b, 0xda, 0xbb, 0x2d, 0xa4, 0x3d, 0xe8, 0xa7,
-       0x35, 0xca, 0xd8, 0x9b, 0x12, 0xbd, 0xf0, 0x92, 0xbc, 0xf9, 0x82, 0xab,
-       0xe2, 0x12, 0x6b, 0x4f, 0x2a, 0xdd, 0x07, 0xb9, 0x16, 0x95, 0xf5, 0xcd,
-       0xdf, 0x91, 0x4f, 0x39, 0x89, 0x2b, 0x94, 0x99, 0x94, 0x5d, 0x5a, 0xa7,
-       0x41, 0xc6, 0x56, 0x12, 0xa5, 0x32, 0x6c, 0xef, 0x2b, 0xf6, 0x98, 0x64,
-       0x83, 0xa5, 0x56, 0x3f, 0xfd, 0x82, 0x9a, 0xeb, 0x24, 0x6d, 0x9e, 0xef,
-       0xbd, 0xb0, 0xad, 0x13, 0x75, 0x25, 0xa3, 0xa8, 0x27, 0x33, 0xd4, 0x9b,
-       0xd4, 0x7d, 0xd4, 0x3f, 0x8c, 0x97, 0xe3, 0x79, 0x8d, 0xba, 0xe9, 0xef,
-       0xd4, 0x9d, 0x67, 0x71, 0xc6, 0x91, 0xfa, 0x1a, 0xe5, 0x13, 0xf4, 0xfc,
-       0x93, 0xb4, 0x73, 0x45, 0xd1, 0x3f, 0xed, 0xdc, 0x47, 0xc5, 0xb7, 0x71,
-       0xd9, 0xb6, 0xdb, 0xc6, 0xfd, 0x83, 0x7d, 0xd2, 0x1b, 0x05, 0x7e, 0xc8,
-       0xff, 0x3b, 0x36, 0x60, 0x2e, 0x73, 0x13, 0xb6, 0x26, 0xf7, 0x61, 0xc9,
-       0xa0, 0x7b, 0x1d, 0x74, 0xc4, 0xb5, 0x6f, 0xb6, 0x3e, 0x1c, 0xe5, 0x1e,
-       0x2c, 0x65, 0x23, 0x6c, 0x0f, 0xfe, 0xa6, 0x3b, 0x0a, 0xca, 0x88, 0x7d,
-       0xb0, 0xcd, 0x6d, 0x43, 0xb3, 0x9f, 0x34, 0xbe, 0x04, 0xf8, 0x79, 0x95,
-       0x7b, 0x28, 0xf3, 0x4e, 0x04, 0x36, 0xd7, 0x22, 0x63, 0x52, 0x6a, 0xdd,
-       0xf7, 0x67, 0x22, 0x92, 0xbc, 0xd0, 0x25, 0xa9, 0xa7, 0xec, 0x41, 0x9d,
-       0xb7, 0xf8, 0x30, 0x74, 0xcf, 0x41, 0xb4, 0x1f, 0x90, 0xb2, 0x13, 0x85,
-       0x3f, 0x33, 0x2a, 0xe5, 0xd1, 0x30, 0x78, 0xe6, 0x01, 0xde, 0x75, 0x28,
-       0x38, 0xca, 0xce, 0x30, 0xca, 0x6e, 0x94, 0xf7, 0x48, 0xf9, 0xc9, 0x4b,
-       0xfb, 0xb4, 0x2d, 0xbb, 0xfb, 0xfd, 0x9f, 0x76, 0xab, 0xd8, 0xb9, 0xf5,
-       0x8e, 0x88, 0xb9, 0x47, 0xff, 0x2d, 0x60, 0xf7, 0xfb, 0x12, 0x9e, 0x90,
-       0xb8, 0x4f, 0x44, 0x64, 0x18, 0xb2, 0x77, 0x04, 0x7a, 0xeb, 0xe0, 0x85,
-       0x21, 0x19, 0xbd, 0x10, 0x97, 0xfb, 0x2e, 0xf8, 0xf6, 0xc0, 0xf2, 0x74,
-       0xca, 0xc4, 0x71, 0xdd, 0xdf, 0x32, 0x8e, 0x7b, 0x9f, 0x9a, 0x1f, 0x30,
-       0xae, 0x41, 0x1e, 0x46, 0x3f, 0xa7, 0xec, 0x06, 0x8d, 0xfb, 0x1f, 0xc9,
-       0x91, 0x95, 0x90, 0x1c, 0x55, 0xbc, 0xe8, 0xdb, 0xf0, 0xff, 0x13, 0xfb,
-       0x48, 0x80, 0x47, 0x4e, 0x18, 0xbf, 0xb3, 0x17, 0x78, 0x25, 0x0e, 0xa1,
-       0xeb, 0xe0, 0x8b, 0x32, 0x3f, 0xb5, 0x98, 0xee, 0x1c, 0xcf, 0xb1, 0x3f,
-       0xc5, 0x98, 0x2c, 0x6c, 0x0b, 0xb6, 0xcb, 0x60, 0x40, 0xf6, 0x6a, 0x7f,
-       0x1f, 0xda, 0x29, 0x73, 0x8e, 0x42, 0xe6, 0xec, 0x6e, 0xcf, 0xa1, 0x8d,
-       0xeb, 0xdf, 0x83, 0x75, 0xc9, 0x8f, 0x5c, 0xd7, 0xc7, 0x09, 0xcf, 0x75,
-       0x10, 0xfe, 0x07, 0xcf, 0xb5, 0x4b, 0x0a, 0x0e, 0x73, 0x37, 0x59, 0xf7,
-       0x16, 0x73, 0xd6, 0x13, 0xe6, 0xac, 0x05, 0xb6, 0x31, 0xed, 0x2d, 0x9d,
-       0xaf, 0x50, 0x88, 0x26, 0x4a, 0x22, 0x71, 0x15, 0xbf, 0x5b, 0xaf, 0xf8,
-       0xf6, 0x49, 0xb6, 0x9f, 0xf7, 0x10, 0x8b, 0x69, 0x15, 0x5b, 0x8b, 0x07,
-       0x3c, 0xda, 0x37, 0xe9, 0x30, 0xf3, 0x92, 0x1b, 0x2b, 0xbc, 0x93, 0x0c,
-       0xe0, 0x07, 0x3c, 0x07, 0x2d, 0x71, 0x5c, 0xd6, 0x95, 0xb4, 0x6e, 0x9b,
-       0x01, 0xff, 0xda, 0xaa, 0x4f, 0x3c, 0x97, 0x1e, 0x34, 0xef, 0x31, 0x59,
-       0xab, 0xbc, 0x63, 0xc8, 0xf6, 0xfe, 0xf6, 0x9e, 0x5c, 0xa6, 0x9f, 0xf7,
-       0x49, 0xa8, 0x23, 0x9f, 0xbc, 0xa4, 0x72, 0x15, 0xb5, 0xef, 0x10, 0xe4,
-       0x3d, 0x24, 0xf6, 0xf9, 0x53, 0xd0, 0xf5, 0xee, 0x3d, 0x77, 0x99, 0x3d,
-       0x73, 0xbf, 0xc4, 0x37, 0xc7, 0xfb, 0x7a, 0x8e, 0x38, 0x0f, 0x77, 0xf8,
-       0x1b, 0x91, 0x81, 0x9d, 0xfb, 0x73, 0xca, 0x42, 0xca, 0xbf, 0x49, 0x95,
-       0xef, 0x72, 0xcb, 0x86, 0x1c, 0xaa, 0x42, 0x2e, 0x55, 0x21, 0x8b, 0xaa,
-       0x90, 0x45, 0xb0, 0x41, 0x9e, 0x85, 0x5c, 0x7d, 0x06, 0xbe, 0xda, 0xd7,
-       0xab, 0xbe, 0xfd, 0x9e, 0x85, 0x1c, 0x53, 0x36, 0x1d, 0xed, 0x9f, 0x9a,
-       0xed, 0x75, 0xff, 0xd6, 0xf9, 0x50, 0x01, 0xcf, 0x1f, 0xd7, 0x2d, 0x45,
-       0x35, 0x26, 0x2e, 0xf3, 0xcd, 0xbd, 0xfa, 0x72, 0x7f, 0xa1, 0x8e, 0xfd,
-       0x9a, 0xbb, 0x7e, 0x15, 0x8b, 0xa0, 0x0c, 0xfe, 0x4d, 0x3c, 0xd0, 0x99,
-       0xa7, 0xc9, 0x33, 0x56, 0x39, 0x42, 0x38, 0x53, 0xe2, 0x9d, 0x76, 0x61,
-       0x59, 0x16, 0x26, 0x17, 0xa5, 0x3c, 0x69, 0xc9, 0xdc, 0x38, 0xce, 0x68,
-       0x7c, 0x18, 0x3a, 0x32, 0x0d, 0x5d, 0xbb, 0x80, 0x79, 0xc8, 0x7f, 0x0f,
-       0xe2, 0x5c, 0x1c, 0x73, 0x27, 0xfe, 0xa5, 0xe9, 0x5c, 0x4d, 0xac, 0x6b,
-       0x2a, 0x47, 0x7c, 0x79, 0xfa, 0xd5, 0x95, 0x87, 0x61, 0x3f, 0x4d, 0xc8,
-       0xd5, 0xc9, 0x87, 0x65, 0xfb, 0x8e, 0xf1, 0x38, 0x07, 0xc8, 0xe1, 0xcf,
-       0x6f, 0xf2, 0x1e, 0xb4, 0x4b, 0x66, 0xa3, 0x8c, 0x81, 0xc1, 0xc6, 0x71,
-       0xfb, 0x65, 0x5b, 0xf9, 0xa1, 0x07, 0xe4, 0xb6, 0xa2, 0x2d, 0xd6, 0x85,
-       0x50, 0xa7, 0xed, 0xd1, 0xb5, 0x8a, 0x6f, 0x5b, 0x28, 0x1c, 0x99, 0x98,
-       0x1f, 0xf5, 0x0d, 0xe3, 0x49, 0x8c, 0x2f, 0xad, 0x45, 0x76, 0x64, 0x01,
-       0x4b, 0xff, 0x5c, 0x3b, 0xfd, 0xe3, 0xbf, 0x8e, 0xe8, 0x6f, 0x0b, 0xba,
-       0xa4, 0x1c, 0x2d, 0xb5, 0xca, 0x6e, 0xd0, 0xba, 0xda, 0xce, 0x69, 0xf5,
-       0xdb, 0x48, 0xcb, 0x36, 0x60, 0x25, 0x1d, 0x24, 0x55, 0xee, 0xce, 0x77,
-       0xaa, 0x03, 0xfb, 0xf4, 0x37, 0x0a, 0x01, 0x8c, 0xe3, 0xfb, 0x89, 0x88,
-       0x7e, 0xf7, 0xef, 0xdd, 0xdf, 0x86, 0xbe, 0x31, 0x25, 0xaf, 0xd6, 0x6a,
-       0x01, 0xf0, 0xf0, 0x20, 0x9e, 0x5f, 0x44, 0x9f, 0x30, 0xce, 0x86, 0xb1,
-       0xa4, 0xb7, 0xa8, 0xfc, 0x9b, 0x80, 0xeb, 0xe7, 0xf5, 0x52, 0x77, 0xff,
-       0x67, 0xd5, 0xfe, 0xf4, 0x4a, 0x37, 0xf3, 0x55, 0x51, 0x52, 0xaf, 0xff,
-       0x0a, 0xbe, 0x56, 0x48, 0xf2, 0x35, 0x17, 0xb6, 0x78, 0x88, 0xf4, 0x8b,
-       0xfa, 0x7b, 0xa1, 0xa3, 0x04, 0xfc, 0xd4, 0x05, 0xbd, 0xa9, 0x70, 0x0d,
-       0x4a, 0xa2, 0x4f, 0xef, 0xe7, 0x99, 0x6a, 0x38, 0x42, 0xde, 0xf7, 0x98,
-       0x6f, 0x10, 0x0e, 0x78, 0x2f, 0x4d, 0xcf, 0x55, 0x68, 0x2b, 0xb5, 0x5a,
-       0xd0, 0x65, 0xd8, 0xc9, 0xcf, 0x94, 0x5f, 0xb1, 0x2d, 0xda, 0x57, 0x5b,
-       0x50, 0xf9, 0x96, 0x37, 0xa7, 0x35, 0x8d, 0x74, 0xde, 0x9f, 0xbc, 0xd1,
-       0xdd, 0x49, 0x58, 0xb6, 0xd3, 0x3d, 0x86, 0x2f, 0xc2, 0xc1, 0x62, 0x25,
-       0x12, 0x9c, 0x53, 0xf7, 0x5b, 0x5b, 0x26, 0x1f, 0xf3, 0xda, 0x74, 0xaa,
-       0x19, 0x56, 0xb9, 0x00, 0xbc, 0x4b, 0xc8, 0x57, 0x78, 0x97, 0xa2, 0xdb,
-       0x53, 0xa6, 0x3d, 0xd9, 0x54, 0x6d, 0x2a, 0xde, 0xc5, 0x18, 0x57, 0x37,
-       0xca, 0xdb, 0x15, 0xca, 0x07, 0xcc, 0xaf, 0x65, 0x09, 0x60, 0x7f, 0x71,
-       0x7a, 0x6e, 0x85, 0xf0, 0x7d, 0x7f, 0x3a, 0xb7, 0xc2, 0x1c, 0xc8, 0xff,
-       0x34, 0x7d, 0x63, 0xc5, 0x92, 0x0d, 0x37, 0xa1, 0xe2, 0x57, 0xeb, 0x8c,
-       0xb1, 0x72, 0x9c, 0x9a, 0xf3, 0x45, 0x23, 0x93, 0xbf, 0x37, 0x3d, 0xbc,
-       0x1e, 0x90, 0x73, 0x66, 0x0e, 0xbe, 0xc7, 0xd7, 0xef, 0xa0, 0x6b, 0xd0,
-       0xca, 0x15, 0xd0, 0x4a, 0x2f, 0x6c, 0x09, 0xd2, 0x37, 0x7d, 0xb2, 0x5e,
-       0xc8, 0x01, 0xae, 0xf3, 0x8c, 0x5a, 0x27, 0x80, 0x75, 0xe6, 0x54, 0xce,
-       0x78, 0x80, 0x79, 0xb7, 0xb0, 0x35, 0x61, 0x13, 0xba, 0x8c, 0x59, 0xdb,
-       0xd8, 0xf3, 0x28, 0xf4, 0x12, 0xf3, 0x3f, 0xfe, 0x7b, 0x64, 0x27, 0x6f,
-       0xfc, 0x39, 0x33, 0xee, 0x9b, 0x18, 0xc7, 0x33, 0x51, 0xf9, 0xe6, 0x6f,
-       0xb6, 0x65, 0x58, 0xd9, 0x90, 0x3a, 0x07, 0x89, 0x30, 0xd4, 0xb1, 0x57,
-       0xea, 0xe2, 0x2e, 0xc9, 0xab, 0x7d, 0x7d, 0x53, 0x8d, 0xb3, 0xbc, 0x6f,
-       0x00, 0x76, 0xda, 0x25, 0x98, 0xbb, 0xaa, 0xe3, 0x6d, 0x79, 0xc5, 0xd3,
-       0xe0, 0x91, 0x49, 0x3f, 0x57, 0x4f, 0x8f, 0xf3, 0xfb, 0x27, 0xd7, 0x8f,
-       0x98, 0x9c, 0x8e, 0xbf, 0x6f, 0x65, 0x8f, 0xf7, 0x2a, 0x1b, 0x6c, 0xe7,
-       0x9b, 0x08, 0x7f, 0x8c, 0xdf, 0xc7, 0xcf, 0x31, 0x7e, 0x74, 0xff, 0x0e,
-       0xcc, 0x5b, 0xe6, 0xcc, 0x39, 0x8e, 0xb1, 0x49, 0x95, 0xaf, 0xcb, 0xba,
-       0xe0, 0x7c, 0x86, 0x73, 0x74, 0xde, 0xf7, 0x8c, 0x83, 0x47, 0xb5, 0xcd,
-       0x57, 0x82, 0x9d, 0x55, 0x06, 0xbf, 0x04, 0x3c, 0xca, 0xf1, 0x61, 0x13,
-       0x57, 0x7b, 0xa3, 0x38, 0x1f, 0xef, 0x12, 0xc7, 0x21, 0x7b, 0xfc, 0xf1,
-       0x3c, 0xc7, 0x6b, 0xd3, 0x37, 0x2a, 0xae, 0x9c, 0xad, 0xea, 0x7c, 0x47,
-       0x8d, 0x07, 0xc6, 0x6e, 0x78, 0xb6, 0x71, 0x99, 0x73, 0xa9, 0x67, 0xe3,
-       0xf2, 0x5d, 0xd7, 0x8f, 0xad, 0xf1, 0x7e, 0x0a, 0xfd, 0x61, 0xeb, 0x2d,
-       0x6c, 0x72, 0xff, 0xdf, 0xc4, 0xfe, 0xe9, 0x53, 0x68, 0x5a, 0x3a, 0x08,
-       0xb9, 0xf5, 0x1f, 0x82, 0xf0, 0x19, 0xa0, 0xbb, 0x6f, 0x05, 0x3b, 0xf7,
-       0xe7, 0xeb, 0x6b, 0x4d, 0x97, 0x41, 0xd0, 0xc8, 0x62, 0x1b, 0xef, 0x96,
-       0x04, 0xde, 0x39, 0x02, 0x1d, 0x64, 0x49, 0x61, 0xdc, 0x8d, 0x2d, 0xf0,
-       0x6e, 0xc1, 0x19, 0x73, 0x1c, 0x95, 0xc7, 0x16, 0x07, 0xbc, 0x7c, 0xe6,
-       0xb7, 0x02, 0xcc, 0x39, 0x8b, 0xab, 0x5c, 0xdd, 0x6c, 0xd4, 0x05, 0xbc,
-       0x8e, 0xb2, 0x4f, 0xb4, 0x5e, 0xfe, 0x97, 0xfb, 0x29, 0x6b, 0xfa, 0x5d,
-       0xff, 0xec, 0x39, 0xf7, 0x8b, 0x98, 0x3b, 0x60, 0xda, 0x7d, 0x1a, 0x09,
-       0x30, 0xe5, 0x4d, 0x76, 0xbe, 0x01, 0xf1, 0xe3, 0x7c, 0xec, 0xff, 0x2d,
-       0x05, 0xcb, 0x1c, 0xf4, 0xd0, 0xbc, 0xda, 0xcf, 0x0b, 0xa0, 0x05, 0xca,
-       0x15, 0x9f, 0x7e, 0x5f, 0x00, 0xfd, 0xee, 0x63, 0x0a, 0xdf, 0x1e, 0xb4,
-       0xe6, 0xd3, 0x18, 0xe9, 0x8b, 0xb4, 0xf5, 0x8a, 0xe2, 0xb9, 0x52, 0xfb,
-       0xdc, 0x29, 0xb3, 0x12, 0x4e, 0xdc, 0xf6, 0xcf, 0x9d, 0xcf, 0x7b, 0xe5,
-       0xb8, 0xfa, 0xfc, 0x91, 0xf9, 0x07, 0x9c, 0x6d, 0xda, 0x9c, 0x6d, 0xa6,
-       0xe3, 0x9b, 0x04, 0x7f, 0x3e, 0xfa, 0xfb, 0xd4, 0xaf, 0xbc, 0x0b, 0xe2,
-       0xf7, 0x12, 0xca, 0x44, 0x90, 0x72, 0x9a, 0x7c, 0x94, 0x8b, 0xf3, 0x3e,
-       0xe5, 0xa4, 0x04, 0xfa, 0x60, 0xb7, 0x8c, 0x86, 0xc4, 0xff, 0x2e, 0xa9,
-       0x4b, 0xb6, 0x9c, 0x56, 0xeb, 0x06, 0xef, 0x8d, 0x2b, 0x41, 0xd9, 0x50,
-       0x77, 0x9f, 0xe0, 0xd1, 0xde, 0xa0, 0x2c, 0xba, 0x6d, 0x3d, 0x27, 0x75,
-       0xf4, 0x59, 0x43, 0xdb, 0xb9, 0x36, 0x6c, 0xd4, 0x07, 0xb0, 0x21, 0xdd,
-       0xbf, 0x6f, 0x15, 0xa3, 0x77, 0xf4, 0x35, 0x32, 0x96, 0xb1, 0x47, 0xc6,
-       0xa7, 0x1d, 0xc9, 0xaf, 0x0f, 0xe0, 0x07, 0x19, 0xaf, 0xe4, 0x02, 0x63,
-       0x91, 0x8c, 0xe7, 0x96, 0xe0, 0x9f, 0x6a, 0x3f, 0x9f, 0xf6, 0xf6, 0x95,
-       0xcd, 0x44, 0xa9, 0x24, 0x6e, 0xfc, 0x91, 0xf6, 0x77, 0x3c, 0x7d, 0xa5,
-       0xb0, 0xd7, 0x19, 0xf3, 0x8d, 0xab, 0xfc, 0xd9, 0x1e, 0x2f, 0x11, 0x3b,
-       0x05, 0xdf, 0xf5, 0xeb, 0x69, 0xc6, 0x7a, 0xef, 0x23, 0xbe, 0xbf, 0xc4,
-       0x4d, 0xda, 0x23, 0xe3, 0xe2, 0x5e, 0x72, 0x47, 0x1f, 0x11, 0xfa, 0xa7,
-       0x89, 0xf8, 0x14, 0xf1, 0xd6, 0xfe, 0xbe, 0x20, 0x68, 0xec, 0xa5, 0x71,
-       0x19, 0xbe, 0xf4, 0x23, 0x15, 0x63, 0xff, 0x70, 0x7a, 0x37, 0x6d, 0xa8,
-       0x58, 0xf1, 0x78, 0xbf, 0x0c, 0x8f, 0xae, 0x89, 0x40, 0x5b, 0xf0, 0x7b,
-       0x03, 0x0b, 0x3e, 0xaa, 0x7a, 0x87, 0xbd, 0x1e, 0x57, 0xdf, 0x5c, 0x65,
-       0x55, 0xde, 0x23, 0x63, 0xc9, 0x3c, 0xd3, 0x88, 0xca, 0x85, 0x7b, 0x16,
-       0x67, 0x5b, 0x68, 0xf2, 0x7c, 0x19, 0x57, 0x66, 0xdc, 0x98, 0xb1, 0x65,
-       0xc6, 0x88, 0xf5, 0xf7, 0x53, 0x47, 0x9a, 0x7b, 0xc5, 0x91, 0x89, 0x8b,
-       0x51, 0xf3, 0x4d, 0x9a, 0x58, 0xdb, 0xd0, 0xbb, 0xf9, 0x9a, 0xa3, 0xee,
-       0xfd, 0x8a, 0x4e, 0xbf, 0x9c, 0x1c, 0xed, 0x06, 0xce, 0x07, 0x54, 0x3e,
-       0xa4, 0xed, 0xbe, 0x07, 0x7e, 0x25, 0xfd, 0x38, 0xea, 0x5b, 0x1f, 0xcf,
-       0x87, 0x50, 0xf7, 0x0b, 0xe0, 0x9e, 0x75, 0xf0, 0x39, 0x95, 0xee, 0xfd,
-       0xb4, 0x6c, 0x57, 0x98, 0x9f, 0x5d, 0x3f, 0x90, 0x53, 0xe7, 0xc1, 0x98,
-       0x8d, 0x2f, 0x9b, 0xfc, 0x5c, 0x35, 0xfa, 0xcc, 0x8e, 0xb9, 0xab, 0x66,
-       0xcc, 0x66, 0x40, 0x8a, 0xeb, 0x94, 0x3f, 0x96, 0x5a, 0xeb, 0x56, 0xe0,
-       0xad, 0x52, 0xaa, 0xef, 0x75, 0xef, 0xde, 0x6a, 0x3d, 0x93, 0x56, 0xbe,
-       0xec, 0xf9, 0x92, 0x39, 0x63, 0xfd, 0x1d, 0x64, 0x70, 0x27, 0x7f, 0x38,
-       0xaa, 0xe3, 0x09, 0xd9, 0x81, 0x5e, 0xfa, 0x0f, 0x7d, 0x1a, 0xbf, 0xf4,
-       0x7b, 0x7f, 0x65, 0x6c, 0x51, 0xfa, 0xbc, 0x03, 0x4a, 0x4f, 0xdb, 0x0d,
-       0x9f, 0x4e, 0x98, 0x73, 0x43, 0x7f, 0xf8, 0xa0, 0x64, 0xeb, 0x90, 0x9b,
-       0x83, 0x7c, 0x3f, 0x6b, 0xc6, 0xf2, 0xb9, 0x25, 0x47, 0x27, 0x76, 0xdf,
-       0xa7, 0x4f, 0x6a, 0x3f, 0xbb, 0xd7, 0xbf, 0x53, 0xf7, 0x73, 0x4d, 0x7d,
-       0x78, 0x15, 0x9c, 0xa0, 0x27, 0x1f, 0x06, 0xbd, 0xd6, 0x11, 0xc0, 0xcb,
-       0x18, 0xe4, 0x80, 0xcb, 0x5c, 0x9d, 0x80, 0x4c, 0x0c, 0x24, 0x98, 0xc3,
-       0xa7, 0xe0, 0x69, 0xd4, 0x43, 0x68, 0xf3, 0xe1, 0xd4, 0xfe, 0x79, 0xa3,
-       0xce, 0xf6, 0x38, 0xd6, 0xea, 0x96, 0x89, 0x41, 0xe2, 0x79, 0x37, 0x1c,
-       0x03, 0x81, 0xbd, 0x73, 0xd4, 0x1e, 0xec, 0x80, 0xef, 0xee, 0xef, 0x47,
-       0x73, 0xf0, 0xc3, 0x72, 0x2b, 0x8c, 0x15, 0x10, 0xc6, 0x01, 0xc8, 0x39,
-       0xec, 0x31, 0xed, 0xe7, 0x0e, 0xfb, 0x78, 0xf1, 0x63, 0x0c, 0x21, 0x45,
-       0x17, 0x73, 0x19, 0xee, 0x25, 0x64, 0x62, 0x0e, 0x84, 0x2b, 0x61, 0xf2,
-       0x0f, 0x09, 0x9f, 0x7d, 0x40, 0x9f, 0xff, 0xfd, 0x66, 0xbf, 0x7e, 0xce,
-       0x22, 0xe7, 0xba, 0x17, 0xe3, 0xbf, 0xd2, 0xc2, 0x5a, 0x34, 0xe8, 0xc0,
-       0xff, 0xbe, 0xaf, 0x7f, 0xaf, 0x9e, 0xab, 0xd7, 0xff, 0xa6, 0x2f, 0x66,
-       0xbe, 0xe3, 0x23, 0x9c, 0xe4, 0x2f, 0x1f, 0x87, 0x9c, 0x63, 0xc0, 0xdc,
-       0x23, 0x10, 0x86, 0x9e, 0x5d, 0x30, 0x24, 0xd2, 0x77, 0xca, 0xb8, 0x43,
-       0x1d, 0x7b, 0x27, 0xad, 0xf5, 0xc9, 0x42, 0xad, 0x57, 0xca, 0x35, 0xe6,
-       0x53, 0xf3, 0xfb, 0x32, 0xda, 0x59, 0xe4, 0x4b, 0x95, 0x37, 0x69, 0xf2,
-       0x15, 0x7d, 0xfe, 0xec, 0x43, 0x3f, 0xea, 0x10, 0x94, 0x75, 0x2d, 0x9f,
-       0xea, 0x72, 0x77, 0xce, 0xe2, 0x7c, 0x3b, 0x67, 0x51, 0xe7, 0x25, 0x15,
-       0xdb, 0x79, 0x22, 0xcc, 0x89, 0xeb, 0xcc, 0x41, 0x2a, 0xc9, 0xa3, 0x87,
-       0x7b, 0x24, 0xb9, 0xdc, 0x6b, 0x68, 0xf4, 0x3d, 0x66, 0x1d, 0xac, 0xb7,
-       0x34, 0x29, 0xc9, 0xa5, 0x3f, 0x86, 0x6f, 0xaf, 0xf2, 0x22, 0x3b, 0xf2,
-       0xdb, 0x87, 0xcd, 0xb7, 0x48, 0x59, 0x8b, 0xf9, 0x28, 0xf9, 0x25, 0x9c,
-       0xd7, 0xe1, 0xc4, 0x68, 0xdc, 0xe6, 0xb7, 0xb8, 0x27, 0x24, 0xb9, 0x3a,
-       0xa9, 0xbf, 0x89, 0x4b, 0xf3, 0x46, 0x3e, 0xa1, 0xec, 0xe9, 0xd4, 0x65,
-       0x3d, 0x9f, 0xbb, 0xc4, 0xf6, 0x14, 0x6c, 0x47, 0xb6, 0xe7, 0x63, 0x01,
-       0x75, 0x6b, 0x7f, 0x3f, 0xe8, 0xa9, 0xcb, 0xd8, 0x03, 0xcc, 0xe9, 0xe4,
-       0x78, 0xda, 0x1e, 0xa7, 0x71, 0x66, 0xf9, 0xb8, 0x2d, 0x1c, 0xa3, 0xe6,
-       0xc3, 0xb3, 0x7f, 0x47, 0x44, 0x5c, 0x8f, 0xcb, 0x7a, 0xd3, 0x05, 0x4f,
-       0xe8, 0x9c, 0xf8, 0x62, 0xdd, 0xcf, 0xe5, 0x7c, 0xb4, 0x9d, 0xcb, 0x49,
-       0x18, 0x0b, 0x95, 0xdd, 0xb4, 0x77, 0xc8, 0xe4, 0x54, 0xf6, 0xa8, 0xfb,
-       0xd9, 0x0e, 0xf9, 0x67, 0xfa, 0x3f, 0x73, 0x80, 0x77, 0xf7, 0x22, 0x6c,
-       0x1f, 0x34, 0xed, 0xb0, 0x8f, 0xa2, 0x51, 0xc5, 0x07, 0xc9, 0x86, 0xdf,
-       0xef, 0xfa, 0x01, 0x9d, 0x0b, 0x4a, 0x3c, 0x79, 0x06, 0xe6, 0x09, 0xf8,
-       0xb1, 0xac, 0x3b, 0x88, 0xb1, 0x3c, 0x27, 0x94, 0x8d, 0x83, 0x2a, 0xd7,
-       0x30, 0xe0, 0x4d, 0x99, 0x7b, 0xc1, 0x41, 0xb5, 0x96, 0xe3, 0x71, 0x7e,
-       0x5f, 0x36, 0xf4, 0x74, 0xac, 0xbf, 0x1b, 0x5e, 0xc6, 0xe0, 0xfc, 0xdc,
-       0x51, 0xb6, 0xf3, 0x7d, 0x77, 0x1f, 0x3f, 0x4f, 0x34, 0x6b, 0x05, 0xdb,
-       0x39, 0xf6, 0xc4, 0x25, 0xef, 0x96, 0x51, 0x5e, 0xf6, 0x00, 0x23, 0x9f,
-       0x51, 0x9a, 0x6f, 0x07, 0x82, 0x4b, 0xfc, 0xed, 0x9e, 0x27, 0x88, 0xb9,
-       0x7d, 0x9e, 0xdd, 0x3b, 0xa7, 0xb4, 0xcb, 0x3b, 0x6f, 0x6d, 0x57, 0x98,
-       0x27, 0x51, 0x92, 0x93, 0x99, 0x3e, 0x99, 0xab, 0xd9, 0xfc, 0xc6, 0x93,
-       0x31, 0x7a, 0xde, 0x83, 0xcb, 0xbc, 0x92, 0x71, 0x23, 0xc6, 0xe7, 0xee,
-       0x81, 0x6f, 0x4e, 0x7a, 0x1e, 0x91, 0xf5, 0xfa, 0x4c, 0x47, 0xfe, 0x6d,
-       0x97, 0xa1, 0xb3, 0x7f, 0x1d, 0x92, 0xde, 0x12, 0x7c, 0x32, 0x9f, 0xa7,
-       0x47, 0xa4, 0x50, 0xef, 0xbc, 0x3b, 0x63, 0xae, 0x4f, 0xe7, 0x37, 0xb4,
-       0x4a, 0x0f, 0xd6, 0x4a, 0xb4, 0xab, 0xa2, 0x8c, 0x4b, 0xb0, 0xdf, 0x7e,
-       0xa3, 0x6f, 0xe1, 0x08, 0xf5, 0xbe, 0xc5, 0x12, 0x97, 0xb0, 0x41, 0x47,
-       0xa8, 0x75, 0x52, 0x72, 0x34, 0x5a, 0x82, 0x8f, 0x3a, 0x62, 0xd6, 0x7d,
-       0x3b, 0xde, 0xd9, 0xf7, 0x80, 0x69, 0xbf, 0xd7, 0xbc, 0xf7, 0x9a, 0xf7,
-       0x00, 0xde, 0xeb, 0xad, 0x5a, 0x95, 0x73, 0xb2, 0xe4, 0xf7, 0x22, 0xbc,
-       0xdb, 0xf2, 0x24, 0x74, 0x59, 0xa0, 0xa7, 0x7a, 0xe5, 0xf1, 0xba, 0xc2,
-       0xaf, 0xe5, 0x2e, 0xd1, 0x20, 0xd8, 0x6f, 0x9e, 0xef, 0xe6, 0xc1, 0x4f,
-       0xde, 0x91, 0x37, 0x3c, 0xec, 0x98, 0xdc, 0xec, 0x0e, 0x78, 0xb3, 0x80,
-       0xf5, 0xd7, 0xe5, 0x41, 0x51, 0x47, 0x69, 0x5f, 0xb9, 0x50, 0xd1, 0xf9,
-       0x3e, 0x27, 0x2b, 0x80, 0xb5, 0xf6, 0x3f, 0x0e, 0xe8, 0xdc, 0x14, 0x3f,
-       0x9f, 0x91, 0xf9, 0xee, 0x23, 0x26, 0x27, 0x82, 0x63, 0x99, 0x57, 0xe9,
-       0xdf, 0x39, 0x76, 0xda, 0xaa, 0xd4, 0x45, 0xd4, 0x33, 0xfc, 0x6e, 0x25,
-       0x8d, 0xbe, 0x8b, 0x94, 0x35, 0xd0, 0x53, 0xbe, 0x2d, 0xf1, 0x39, 0xe5,
-       0x1f, 0x76, 0x7e, 0xf7, 0x73, 0x0e, 0xb0, 0xfe, 0x65, 0x93, 0x71, 0xe1,
-       0x1e, 0x09, 0x2c, 0xfb, 0x79, 0x50, 0x3c, 0x63, 0xda, 0x61, 0xfc, 0xb6,
-       0xfa, 0x77, 0x77, 0xc5, 0x8c, 0x7d, 0x5b, 0x81, 0x74, 0x3e, 0xe7, 0x30,
-       0xc7, 0xd4, 0xf1, 0xfc, 0x38, 0x33, 0x73, 0x6b, 0x68, 0x73, 0x1d, 0x14,
-       0x5b, 0xc5, 0x8d, 0xd8, 0x56, 0x92, 0xfe, 0xc3, 0xbf, 0x4b, 0xde, 0xf8,
-       0x47, 0xfc, 0x16, 0x46, 0xe7, 0x79, 0xab, 0x75, 0xa2, 0xda, 0x86, 0xe4,
-       0x37, 0xda, 0x69, 0xf0, 0xd5, 0xbe, 0x2d, 0x9d, 0xf3, 0x1d, 0xc1, 0x7b,
-       0x06, 0x74, 0x0c, 0x99, 0x2a, 0xfc, 0x1e, 0x9b, 0x7c, 0xc7, 0xef, 0xb1,
-       0x3d, 0x95, 0x6f, 0xb2, 0x6d, 0xbe, 0x2f, 0xba, 0xde, 0x0c, 0x8a, 0xbd,
-       0x34, 0xce, 0x6f, 0xd5, 0xf8, 0x6d, 0x23, 0x6c, 0xb5, 0x38, 0xda, 0x99,
-       0xc7, 0x36, 0xa4, 0xf2, 0x54, 0xca, 0xcd, 0x8f, 0xa0, 0xfc, 0x34, 0xfc,
-       0x75, 0x1d, 0x9f, 0x2f, 0x37, 0x99, 0xaf, 0xe2, 0xa8, 0x7b, 0xcf, 0xe4,
-       0x52, 0x01, 0xeb, 0xf9, 0xdf, 0x3e, 0x47, 0x51, 0x47, 0xf8, 0x4a, 0x86,
-       0x47, 0xfd, 0x5c, 0x84, 0x0d, 0x87, 0x3a, 0xa1, 0xd4, 0x8c, 0xa8, 0x1c,
-       0x17, 0x6d, 0x8f, 0xd0, 0xd6, 0x0b, 0xa3, 0x2f, 0xf7, 0xda, 0x4b, 0x7d,
-       0xd5, 0xa2, 0x4c, 0x4a, 0x61, 0x9d, 0x86, 0xca, 0x0f, 0x24, 0x9e, 0x5d,
-       0xa7, 0x48, 0x7f, 0x4d, 0xc9, 0xf8, 0xc4, 0xe8, 0xac, 0xe4, 0x9d, 0x10,
-       0x7c, 0xb1, 0xb2, 0xf2, 0x73, 0x5e, 0x80, 0x0d, 0x1d, 0xd9, 0x0a, 0x78,
-       0xdc, 0x1b, 0xd7, 0xa6, 0x1f, 0xa2, 0xf7, 0xa3, 0xef, 0x8e, 0xc4, 0x2a,
-       0xab, 0xef, 0xf5, 0x58, 0xcf, 0x7b, 0x01, 0xff, 0x7b, 0x6c, 0xe6, 0xef,
-       0xc3, 0x4f, 0x68, 0x4e, 0xc9, 0xd9, 0xca, 0x7e, 0xe6, 0xc6, 0xa7, 0xb7,
-       0x81, 0xb7, 0x93, 0xed, 0x7c, 0x7d, 0xe6, 0xb0, 0xf9, 0xba, 0x87, 0x67,
-       0xc5, 0x5c, 0x79, 0xd2, 0x19, 0xf3, 0xe5, 0x69, 0x87, 0x0d, 0xc9, 0xe3,
-       0x4d, 0x3f, 0x47, 0x7e, 0x2f, 0x3b, 0x9c, 0x34, 0xf8, 0x59, 0xf8, 0x86,
-       0x7e, 0x2e, 0x24, 0x73, 0x36, 0x5b, 0xad, 0x93, 0x69, 0xde, 0xc7, 0xce,
-       0x1c, 0x5d, 0xc3, 0x1e, 0xaf, 0xd5, 0x81, 0xc3, 0xe3, 0xac, 0x63, 0xee,
-       0x56, 0xb7, 0xe4, 0xc6, 0x55, 0xbc, 0xaf, 0x77, 0xcd, 0xdd, 0x2f, 0x57,
-       0x6b, 0x51, 0x95, 0x87, 0x56, 0x84, 0x9d, 0xdf, 0x90, 0xdb, 0x0e, 0xef,
-       0xa3, 0x8f, 0xa8, 0xf1, 0x3e, 0xbf, 0x73, 0x9d, 0xa8, 0x1c, 0x59, 0xd7,
-       0xf2, 0xe4, 0x54, 0x06, 0x76, 0xcb, 0x25, 0xb1, 0x3e, 0x9a, 0x19, 0x82,
-       0xef, 0xcd, 0xb5, 0x52, 0x18, 0x07, 0xda, 0x89, 0x91, 0xd7, 0x7f, 0xd1,
-       0x6a, 0x00, 0xde, 0xdb, 0x4d, 0xda, 0xeb, 0xb0, 0xa1, 0x66, 0x38, 0xc6,
-       0x13, 0xfb, 0x02, 0xfb, 0x0c, 0x80, 0xfe, 0x42, 0xfa, 0x7b, 0xb4, 0xca,
-       0x01, 0x69, 0x38, 0x6c, 0xe3, 0x73, 0x4c, 0x1a, 0x51, 0xdf, 0x4f, 0xf9,
-       0x21, 0xf0, 0x17, 0x57, 0x32, 0xc9, 0xbf, 0xc3, 0x67, 0x4e, 0xe9, 0x5c,
-       0xed, 0x18, 0x78, 0x28, 0x68, 0x6c, 0xb3, 0x20, 0xe6, 0xf8, 0xbe, 0xa3,
-       0x6d, 0x05, 0xde, 0xf1, 0x6b, 0x5b, 0x44, 0xeb, 0x18, 0xde, 0xfb, 0x05,
-       0xe1, 0x0b, 0xf8, 0x7c, 0x79, 0xc8, 0xd8, 0x14, 0x9d, 0xbe, 0x7c, 0x2a,
-       0x76, 0x91, 0xff, 0x0f, 0x62, 0xf3, 0x83, 0x32, 0x0b, 0x98, 0xcf, 0x9b,
-       0x7d, 0x3e, 0x92, 0x71, 0xe5, 0x56, 0x9d, 0x77, 0xf0, 0x07, 0x51, 0x32,
-       0xdf, 0x90, 0x30, 0x8f, 0x99, 0x9c, 0x4a, 0x0f, 0x7b, 0x3d, 0x21, 0x2f,
-       0xc3, 0xbe, 0x7e, 0xa5, 0x92, 0x4a, 0x1f, 0x51, 0x71, 0xe7, 0x44, 0xec,
-       0xaa, 0x8c, 0xc5, 0xe9, 0x03, 0x96, 0x9c, 0x44, 0xec, 0x16, 0xe8, 0xe1,
-       0x76, 0xe5, 0x50, 0x3f, 0xff, 0x27, 0x45, 0x03, 0xfa, 0xf0, 0xb6, 0xca,
-       0x81, 0x49, 0x30, 0x66, 0x82, 0xf7, 0x21, 0x93, 0x87, 0xc3, 0x75, 0xd8,
-       0x36, 0x24, 0x2f, 0x57, 0xda, 0xfa, 0x97, 0xeb, 0xe8, 0xdc, 0x36, 0xa5,
-       0x5f, 0x8f, 0xf6, 0x53, 0x0e, 0x71, 0x3d, 0x3d, 0x87, 0xdf, 0x87, 0x78,
-       0xf5, 0x63, 0x91, 0x8e, 0xfe, 0xbe, 0xc1, 0x62, 0xde, 0x0b, 0xf7, 0xfe,
-       0x13, 0x47, 0xdb, 0x40, 0x1c, 0x97, 0x72, 0x8e, 0xaa, 0xf9, 0x78, 0xdf,
-       0x3b, 0x24, 0x3f, 0x6e, 0xfa, 0xf3, 0x30, 0x1f, 0x87, 0x39, 0x3f, 0x94,
-       0x7d, 0x9d, 0x30, 0x68, 0xfd, 0xff, 0xb2, 0x8a, 0xeb, 0x4d, 0xa2, 0x3f,
-       0x75, 0x34, 0xe8, 0xa5, 0x1e, 0xd3, 0xff, 0xdf, 0xa1, 0x2d, 0xe3, 0xf8,
-       0x4c, 0x7c, 0x72, 0x1d, 0xd8, 0xf8, 0x0f, 0x38, 0xa6, 0xdd, 0xb7, 0x4b,
-       0x87, 0xc0, 0xaf, 0x27, 0xa4, 0xb1, 0x92, 0x8a, 0x3d, 0x2e, 0xfe, 0xbc,
-       0xad, 0x87, 0x79, 0x2f, 0x56, 0xc8, 0x8c, 0x39, 0x0b, 0x0a, 0x1e, 0xde,
-       0xdd, 0x26, 0x9c, 0xab, 0x58, 0xaf, 0xd1, 0xdc, 0x1d, 0x7b, 0x48, 0x64,
-       0xb7, 0x24, 0x95, 0xd6, 0x67, 0x33, 0x22, 0x5b, 0x38, 0x9b, 0x3f, 0x31,
-       0x67, 0xf3, 0x7e, 0xcc, 0xed, 0x5e, 0x18, 0x97, 0xd4, 0x85, 0x54, 0xfc,
-       0xbc, 0xf0, 0x8e, 0xf9, 0x00, 0xef, 0x98, 0xad, 0x47, 0x32, 0x71, 0xec,
-       0x37, 0x81, 0xfd, 0xa2, 0x6c, 0xf2, 0x99, 0xdf, 0xf7, 0xef, 0x23, 0x6f,
-       0x3f, 0x4c, 0x99, 0x49, 0x5c, 0x14, 0x54, 0x1b, 0xec, 0x93, 0xa7, 0x08,
-       0xd3, 0xbf, 0xe3, 0xf9, 0xa8, 0x58, 0xe8, 0xad, 0x26, 0xbf, 0x5b, 0xd5,
-       0xf0, 0xe5, 0x01, 0xdf, 0xbc, 0x86, 0x2f, 0x3e, 0xdb, 0xb6, 0x5d, 0x13,
-       0xb1, 0xb3, 0x42, 0x7b, 0x89, 0xf6, 0x0b, 0xed, 0xfa, 0xbf, 0xe9, 0xd7,
-       0xb1, 0x3d, 0xf8, 0xb1, 0x0f, 0x64, 0xdb, 0x7b, 0xef, 0x42, 0xdf, 0x6b,
-       0x19, 0x95, 0x63, 0xec, 0x4c, 0xc9, 0x7b, 0x25, 0xfb, 0x91, 0x44, 0x3c,
-       0x6b, 0xb9, 0xc6, 0x06, 0x44, 0x59, 0xe7, 0x33, 0x65, 0xae, 0x6b, 0x6c,
-       0x0b, 0x9e, 0x4d, 0x06, 0x6b, 0x29, 0xdc, 0xc2, 0x67, 0x1a, 0x02, 0xcd,
-       0x93, 0xd6, 0xde, 0x05, 0x1e, 0xd2, 0xff, 0x13, 0xe3, 0x2a, 0xf0, 0x58,
-       0x06, 0x1e, 0x4f, 0xdd, 0x65, 0x83, 0x85, 0xda, 0x36, 0xd8, 0xb6, 0x5a,
-       0xef, 0x26, 0x60, 0xca, 0x3b, 0xb4, 0xbf, 0xca, 0x6d, 0x5a, 0x21, 0x4c,
-       0xe3, 0xfc, 0x2e, 0x5b, 0xae, 0x67, 0x78, 0x1e, 0xb0, 0xc1, 0x30, 0xdf,
-       0xda, 0x0e, 0x2d, 0x61, 0xff, 0x8a, 0x7e, 0x41, 0xbb, 0x09, 0x27, 0x68,
-       0xf1, 0x2c, 0x38, 0x9f, 0x58, 0x37, 0x00, 0xcb, 0xb6, 0xa2, 0x03, 0x4d,
-       0x03, 0xdb, 0xf5, 0xde, 0x37, 0xa0, 0x01, 0xee, 0x93, 0xf4, 0xe7, 0xd3,
-       0x5e, 0xfb, 0xbb, 0x75, 0xf8, 0xb7, 0x25, 0xb9, 0xff, 0x90, 0x27, 0xb9,
-       0x0b, 0x2d, 0x59, 0x48, 0x8b, 0x35, 0x76, 0x88, 0x34, 0x49, 0x3b, 0x01,
-       0x36, 0x64, 0x8c, 0x38, 0xd6, 0xf6, 0xe0, 0xec, 0x57, 0xf7, 0xe3, 0xf7,
-       0x6f, 0xfa, 0x79, 0xbf, 0x94, 0xdb, 0xa0, 0xbc, 0x12, 0xeb, 0xbe, 0x43,
-       0xda, 0x3f, 0xbc, 0x1d, 0x05, 0xce, 0xd1, 0x9e, 0x7c, 0xa2, 0xcb, 0xc4,
-       0x51, 0xb5, 0x5e, 0x4e, 0x3e, 0x41, 0xbc, 0xa2, 0xfc, 0xea, 0x4f, 0x1c,
-       0x3f, 0x27, 0x49, 0xc7, 0x04, 0xc9, 0x17, 0x25, 0x99, 0xcf, 0x30, 0x27,
-       0xb4, 0x57, 0x8e, 0x40, 0xae, 0x4d, 0x55, 0x26, 0xe5, 0x0b, 0x95, 0x88,
-       0xb2, 0x1b, 0xfe, 0x2c, 0x9d, 0x8a, 0x8d, 0x5a, 0x2d, 0x79, 0x04, 0xf6,
-       0xcf, 0xec, 0x50, 0x97, 0xbc, 0x32, 0xae, 0xf3, 0x6f, 0x6f, 0x33, 0xb9,
-       0xce, 0x61, 0xce, 0x28, 0xf7, 0x03, 0xb9, 0x6f, 0xc1, 0x17, 0xb0, 0xba,
-       0x65, 0x36, 0x1a, 0x91, 0xe9, 0x34, 0xca, 0x37, 0xa7, 0xd5, 0x37, 0xa4,
-       0xd9, 0x68, 0xa7, 0x1c, 0x21, 0xcc, 0x2c, 0xdf, 0x62, 0xca, 0x9f, 0xf5,
-       0x77, 0xc0, 0x62, 0xcd, 0x67, 0x02, 0x6a, 0x7f, 0xe5, 0x3a, 0xe5, 0x1b,
-       0xc7, 0x40, 0x9e, 0x34, 0x79, 0x0f, 0x59, 0x92, 0x35, 0xc8, 0x97, 0x62,
-       0x4d, 0xac, 0x8d, 0x0c, 0x2c, 0x6a, 0x57, 0xdb, 0x9f, 0x45, 0xd0, 0xd7,
-       0x5c, 0x8d, 0xf2, 0x6f, 0x4a, 0xe5, 0x4e, 0xcf, 0xc1, 0xd6, 0x85, 0x4f,
-       0x3c, 0xdb, 0xed, 0x99, 0x7b, 0xce, 0x5e, 0xc6, 0x43, 0x3a, 0x65, 0x98,
-       0xff, 0x3f, 0x73, 0x0e, 0x0f, 0x48, 0x5f, 0x09, 0xe7, 0xe2, 0xdb, 0xdc,
-       0xc0, 0x29, 0xd6, 0xcc, 0xa9, 0x73, 0xf2, 0xcf, 0x84, 0xb2, 0xa7, 0x33,
-       0x67, 0xdb, 0xb7, 0x39, 0xc8, 0xb3, 0xd4, 0x17, 0x52, 0x0a, 0xc3, 0xa6,
-       0xed, 0xb9, 0x00, 0xdd, 0x5d, 0xf3, 0x40, 0x2b, 0x93, 0xd0, 0x87, 0x93,
-       0x52, 0x86, 0xed, 0xf6, 0xd1, 0xf4, 0x67, 0xc5, 0x7e, 0xea, 0xa0, 0xac,
-       0xd5, 0x7a, 0x80, 0x0f, 0xea, 0x85, 0x90, 0xf2, 0xaf, 0x6f, 0x1f, 0xa7,
-       0xbe, 0xa3, 0x2e, 0xd1, 0x67, 0xb1, 0x5d, 0xff, 0xc4, 0x80, 0xfe, 0x7e,
-       0x65, 0xbf, 0x6c, 0xd5, 0x7d, 0x5d, 0x08, 0xff, 0xb0, 0x16, 0x32, 0x7a,
-       0xb9, 0x17, 0xb2, 0xfb, 0xaf, 0x43, 0x0d, 0xe5, 0xab, 0x73, 0xff, 0xd4,
-       0x41, 0xea, 0xff, 0x70, 0xf4, 0x36, 0x5c, 0xee, 0xbd, 0x53, 0x07, 0x69,
-       0xbb, 0xc3, 0x39, 0xcc, 0xf5, 0x78, 0x1f, 0xc7, 0x3d, 0x46, 0x25, 0x74,
-       0xf1, 0x84, 0xd8, 0xf0, 0x5b, 0x02, 0x4b, 0xb4, 0xf5, 0xee, 0xf4, 0x5d,
-       0x02, 0x97, 0x6d, 0xf3, 0xad, 0xed, 0xb0, 0xb6, 0x65, 0x32, 0x28, 0x1b,
-       0xfe, 0xf7, 0xb7, 0xfc, 0xdd, 0xe1, 0xdb, 0x1d, 0x78, 0x03, 0x5d, 0x8a,
-       0xbf, 0xff, 0x0b, 0xc4, 0xbf, 0x6d, 0x24, 0x80, 0x4a, 0x00, 0x00, 0x00 };
-
-static const u32 bnx2_COM_b09FwData[(0x0/4) + 1] = { 0x0 };
-static const u32 bnx2_COM_b09FwRodata[(0x30/4) + 1] = {
-       0x80080100, 0x80080080, 0x80080000, 0x80080240, 0x08000ea4, 0x08000efc,
-       0x08000f40, 0x08000fd4, 0x08001018, 0x80080100, 0x80080080, 0x80080000,
-       0x00000000 };
-
-static struct fw_info bnx2_com_fw_09 = {
-       /* Firmware version: 4.6.15 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0xf,
-
-       .start_addr                     = 0x080000f8,
-
-       .text_addr                      = 0x08000000,
-       .text_len                       = 0x4a7c,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_COM_b09FwText,
-       .gz_text_len                    = sizeof(bnx2_COM_b09FwText),
-
-       .data_addr                      = 0x00000000,
-       .data_len                       = 0x0,
-       .data_index                     = 0x0,
-       .data                           = bnx2_COM_b09FwData,
-
-       .sbss_addr                      = 0x08004ae0,
-       .sbss_len                       = 0x38,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08004b18,
-       .bss_len                        = 0xc0,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x08004a7c,
-       .rodata_len                     = 0x30,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_COM_b09FwRodata,
-};
-
-static u8 bnx2_CP_b09FwText[] = {
-       0xa5, 0xbc, 0x0d, 0x74, 0x1c, 0xe5, 0x95, 0x26, 0xfc, 0x54, 0x75, 0xb7,
-       0xd4, 0x92, 0x5a, 0x52, 0x49, 0x6e, 0x8b, 0x36, 0x68, 0x70, 0xb5, 0x55,
-       0x2d, 0x0b, 0x4b, 0x40, 0xb5, 0x24, 0x3b, 0xed, 0x6c, 0x83, 0x3b, 0xb6,
-       0x6c, 0x64, 0x63, 0x40, 0x36, 0x06, 0xc4, 0xb7, 0xfe, 0x3e, 0x7a, 0xfc,
-       0x03, 0x86, 0x38, 0x19, 0x91, 0xcd, 0xce, 0x0a, 0xd6, 0x59, 0x55, 0xe4,
-       0x3f, 0xd9, 0x6e, 0x75, 0x4b, 0x42, 0xfe, 0xe1, 0xec, 0x9c, 0xa5, 0x2d,
-       0xcb, 0x96, 0x21, 0xad, 0x16, 0x24, 0x6c, 0xc6, 0x39, 0x27, 0x09, 0x1a,
-       0x63, 0x83, 0x0d, 0x18, 0xc8, 0x24, 0xf9, 0x86, 0xc9, 0xd9, 0x5d, 0x34,
-       0xc6, 0xfc, 0x19, 0x70, 0x1c, 0x92, 0xc9, 0x9a, 0x19, 0x4c, 0xed, 0x73,
-       0xab, 0xd5, 0xb6, 0xec, 0x30, 0xc9, 0xcc, 0x59, 0x9d, 0xd3, 0xa7, 0xab,
-       0xab, 0xde, 0x9f, 0xfb, 0xde, 0xf7, 0xde, 0xe7, 0x3e, 0xf7, 0x7d, 0xdf,
-       0x92, 0x0e, 0x14, 0x63, 0xf2, 0xaf, 0x94, 0x9f, 0x9b, 0x9a, 0x3b, 0xd6,
-       0xce, 0x0d, 0xdf, 0x34, 0x4f, 0x7e, 0xbb, 0xcb, 0x0b, 0xdc, 0xf8, 0xb2,
-       0xbf, 0x28, 0x22, 0x57, 0xdf, 0xd2, 0xbf, 0xb4, 0xe0, 0xbf, 0xf0, 0x17,
-       0x41, 0x50, 0xe1, 0x57, 0xfd, 0xe4, 0x4f, 0x17, 0xa0, 0xe5, 0xfb, 0x97,
-       0x0f, 0xbc, 0x6a, 0xd4, 0xb8, 0x77, 0xa1, 0x01, 0xaf, 0x2b, 0xba, 0xaa,
-       0x7d, 0xad, 0x01, 0xc4, 0x32, 0xf5, 0xfa, 0x22, 0x5c, 0xb4, 0x2d, 0xbf,
-       0x1b, 0x72, 0xff, 0xcf, 0xa2, 0x9f, 0x3f, 0xf5, 0x93, 0xaf, 0x04, 0xcf,
-       0xa7, 0x5d, 0xf0, 0x6a, 0x51, 0x0b, 0x5a, 0x2d, 0xbc, 0xd5, 0xac, 0xf3,
-       0x57, 0xb3, 0xb7, 0xa9, 0x28, 0xcb, 0xb7, 0x15, 0x0c, 0xa4, 0x11, 0xd4,
-       0x2c, 0x04, 0xeb, 0x2c, 0x20, 0xee, 0x8e, 0x22, 0x5e, 0x18, 0xf5, 0xa2,
-       0xc0, 0x28, 0x40, 0x5c, 0xeb, 0xd4, 0xb7, 0x34, 0x03, 0x0b, 0x13, 0x5e,
-       0xfd, 0x74, 0x06, 0x58, 0x9b, 0xf0, 0x62, 0xc2, 0xe5, 0xd3, 0xdf, 0xc9,
-       0x44, 0xca, 0x72, 0xfa, 0x88, 0xc1, 0x65, 0x20, 0xae, 0x46, 0xe5, 0x3e,
-       0xf4, 0x45, 0x19, 0xa9, 0x0b, 0x6c, 0x4b, 0x7d, 0x5b, 0x7f, 0x37, 0x11,
-       0xd4, 0xb6, 0xa1, 0x3e, 0x30, 0x84, 0x42, 0xc4, 0xfd, 0xc1, 0x3a, 0xe0,
-       0xf3, 0x8b, 0x3b, 0x53, 0x0a, 0x3c, 0xc6, 0x34, 0xb4, 0xec, 0x07, 0x76,
-       0xa4, 0x82, 0x31, 0x83, 0xc3, 0xeb, 0x19, 0x93, 0xba, 0x41, 0x2d, 0xcd,
-       0xe7, 0x5b, 0x52, 0xc0, 0xd6, 0xd4, 0x34, 0x6c, 0xeb, 0xb3, 0xf1, 0xa2,
-       0x59, 0xa3, 0x1d, 0x60, 0x0f, 0xdd, 0xce, 0xf3, 0x69, 0xb0, 0xd2, 0xf2,
-       0xfc, 0x03, 0xfb, 0x27, 0xb3, 0x35, 0x3c, 0x3b, 0xe6, 0xc7, 0x0b, 0x63,
-       0x15, 0xd8, 0xd1, 0x57, 0x81, 0xed, 0x7d, 0x75, 0x50, 0x0d, 0x1b, 0x75,
-       0xe1, 0x3a, 0x14, 0xcc, 0xb7, 0xf1, 0x8e, 0xd9, 0x80, 0xad, 0x6c, 0xf8,
-       0xcd, 0x86, 0x2a, 0xac, 0xd1, 0xaa, 0xb1, 0xc5, 0xf8, 0x0a, 0x72, 0x63,
-       0xfd, 0xfc, 0x62, 0x2a, 0x85, 0xb8, 0x27, 0xea, 0x56, 0x55, 0xe3, 0x56,
-       0x9c, 0xdb, 0x1d, 0xc5, 0x27, 0xbb, 0xb1, 0xba, 0x0c, 0xb6, 0x9d, 0x09,
-       0x87, 0xda, 0x36, 0x2a, 0x9a, 0xfe, 0x4c, 0x86, 0x02, 0xad, 0x74, 0xb3,
-       0x3d, 0xe8, 0x43, 0x99, 0xa9, 0x53, 0xc1, 0xfe, 0x52, 0xec, 0x37, 0x25,
-       0xb2, 0x04, 0xf0, 0x93, 0xd9, 0x7f, 0x41, 0x7b, 0xc8, 0x8d, 0x69, 0x6b,
-       0xea, 0x2d, 0xca, 0xa4, 0x53, 0x9e, 0x6a, 0xfc, 0x60, 0x2c, 0x80, 0xef,
-       0x53, 0xb6, 0xe7, 0xc6, 0x44, 0xc6, 0xe0, 0x3e, 0x0b, 0x15, 0x18, 0xee,
-       0xab, 0xc6, 0xb3, 0x46, 0x03, 0x9e, 0xa3, 0x8c, 0x9b, 0xcd, 0x3a, 0xac,
-       0x89, 0xdc, 0x4f, 0x79, 0x14, 0xac, 0x6c, 0xf8, 0xf3, 0x49, 0xb9, 0x82,
-       0x3a, 0x54, 0x15, 0xb1, 0xca, 0x60, 0x9d, 0xae, 0x4a, 0x9b, 0x97, 0xe5,
-       0xed, 0x4d, 0xc1, 0xf2, 0x46, 0x45, 0xe6, 0x5b, 0x91, 0xa1, 0xbc, 0xdf,
-       0xdb, 0x1d, 0x32, 0x37, 0xa8, 0x58, 0xee, 0xa3, 0xcc, 0x8f, 0x84, 0x43,
-       0x91, 0x39, 0x94, 0x79, 0x24, 0xa3, 0x72, 0x3c, 0x7e, 0xfd, 0x10, 0x65,
-       0x8f, 0xad, 0x54, 0x29, 0x3b, 0x65, 0x49, 0x51, 0x96, 0x14, 0x65, 0x49,
-       0x51, 0x16, 0x47, 0xee, 0x3a, 0xca, 0x9c, 0x9b, 0xa3, 0xa1, 0xcc, 0x04,
-       0xe5, 0x9d, 0x2a, 0x67, 0x35, 0x65, 0x47, 0xbc, 0x22, 0xfa, 0x6d, 0xbd,
-       0x26, 0x49, 0x7d, 0xa7, 0x6c, 0xfb, 0x4d, 0xd3, 0xb6, 0x3f, 0x35, 0x7d,
-       0xd4, 0x5f, 0x8a, 0x76, 0x90, 0x97, 0x67, 0xa6, 0x55, 0x10, 0x45, 0x0b,
-       0x4d, 0xd0, 0x3e, 0xde, 0x1c, 0x8a, 0x54, 0x2a, 0x2a, 0xdc, 0x86, 0xa6,
-       0xcf, 0xce, 0x06, 0x4d, 0xea, 0x47, 0x0f, 0x65, 0xa1, 0x1b, 0x59, 0xb6,
-       0x75, 0x45, 0xbf, 0x41, 0x6d, 0x1c, 0xd2, 0xaf, 0xce, 0xfe, 0x27, 0x26,
-       0xe7, 0x4e, 0xda, 0x0f, 0xb0, 0x4f, 0xe9, 0x5f, 0xda, 0xb6, 0xed, 0xdf,
-       0x98, 0x30, 0x34, 0x84, 0xac, 0x7e, 0xda, 0x9f, 0x2b, 0xaa, 0xe9, 0x1d,
-       0x19, 0x3e, 0xbf, 0xd4, 0x46, 0x6e, 0x3e, 0xd6, 0x64, 0xf4, 0xc9, 0x31,
-       0x04, 0x29, 0x82, 0xd8, 0x41, 0x20, 0xee, 0x8b, 0x6a, 0x22, 0x7b, 0xdb,
-       0xbe, 0xde, 0x2e, 0x7b, 0x86, 0x21, 0xba, 0x32, 0x3a, 0x67, 0xb8, 0x7c,
-       0x91, 0x73, 0x73, 0x1f, 0xb5, 0x4a, 0x9b, 0xc3, 0x28, 0x36, 0xe0, 0x2b,
-       0x32, 0xd0, 0x96, 0x1c, 0x2d, 0xb6, 0x4a, 0xa2, 0x3f, 0xbe, 0xbb, 0x77,
-       0xd4, 0x8b, 0xe2, 0x51, 0x03, 0x45, 0xa3, 0x4f, 0xbb, 0x51, 0xd6, 0x80,
-       0x5d, 0x63, 0x0f, 0xb9, 0x73, 0x63, 0x5b, 0x32, 0x39, 0x46, 0xc7, 0xf6,
-       0xbd, 0xef, 0x26, 0xce, 0xdb, 0x05, 0x46, 0xd1, 0x7d, 0xae, 0xa8, 0xa1,
-       0x1f, 0x02, 0xce, 0xaf, 0x69, 0x5e, 0x84, 0x6e, 0x4d, 0xc1, 0x4c, 0xe3,
-       0x95, 0x12, 0x94, 0x45, 0x60, 0x8d, 0x55, 0xc5, 0x0b, 0xa2, 0xfe, 0x38,
-       0xe7, 0x06, 0x2f, 0x27, 0xd2, 0xf0, 0xf4, 0xda, 0xb6, 0x94, 0x7d, 0x07,
-       0x77, 0xdf, 0xad, 0x46, 0x8f, 0xde, 0xec, 0x41, 0x0b, 0xcb, 0x63, 0xd3,
-       0x89, 0xe6, 0x4f, 0x15, 0x75, 0x77, 0x1b, 0xac, 0x11, 0x17, 0x62, 0x5a,
-       0x9c, 0xdf, 0xd7, 0x5f, 0xbf, 0x3c, 0xd2, 0x86, 0xc4, 0xc8, 0x05, 0xde,
-       0x77, 0xf3, 0x5e, 0x04, 0xc9, 0xd4, 0xf5, 0xd7, 0xdf, 0x11, 0x89, 0xa3,
-       0x77, 0x44, 0xae, 0xdd, 0x18, 0xaf, 0x88, 0x63, 0xfb, 0x5e, 0x1d, 0xe5,
-       0x46, 0x1b, 0x52, 0x23, 0x72, 0x6d, 0xdb, 0x67, 0xcc, 0xef, 0x62, 0x5f,
-       0x03, 0xfd, 0xff, 0x9a, 0x36, 0x6c, 0xdb, 0x6b, 0xa1, 0xd0, 0xb0, 0xa8,
-       0x7b, 0xc5, 0xfd, 0xf7, 0x0d, 0x0a, 0xf4, 0xbb, 0xe1, 0x2e, 0x30, 0x44,
-       0x6f, 0x11, 0xf7, 0xfa, 0x44, 0x54, 0x9b, 0x69, 0xd8, 0xf6, 0x90, 0x39,
-       0x07, 0x0f, 0xb4, 0xad, 0x81, 0x75, 0xc0, 0x07, 0x6b, 0x95, 0x7c, 0xb7,
-       0x51, 0x87, 0x6b, 0xd0, 0x7d, 0x60, 0x0d, 0x7a, 0x9e, 0xa0, 0xe3, 0x56,
-       0x68, 0xce, 0x3c, 0xfd, 0x64, 0xb6, 0xc8, 0x24, 0xf2, 0xb5, 0xf3, 0x23,
-       0xba, 0xfd, 0x4b, 0x7e, 0x4b, 0x99, 0x0b, 0x36, 0xa6, 0x5f, 0x2e, 0xb3,
-       0x9d, 0x65, 0xb6, 0x5d, 0x51, 0x26, 0x82, 0xa7, 0xc6, 0x44, 0x17, 0xa2,
-       0xb2, 0x3f, 0xa5, 0x8b, 0x9f, 0xda, 0xdd, 0x7e, 0xd1, 0x85, 0xd5, 0xee,
-       0x41, 0xb0, 0xed, 0x41, 0xc5, 0x8d, 0xa5, 0xbd, 0x60, 0x1d, 0x3a, 0x41,
-       0x71, 0x30, 0x56, 0xab, 0x44, 0x51, 0xdc, 0xab, 0x60, 0x69, 0xb8, 0x08,
-       0x7a, 0x85, 0xb4, 0xf7, 0x4b, 0xdb, 0xd2, 0x44, 0xde, 0x13, 0x28, 0xe1,
-       0xfd, 0x75, 0xe1, 0x9f, 0x13, 0xcf, 0x44, 0xa6, 0x30, 0xcb, 0xaf, 0xe0,
-       0xfd, 0x37, 0xa6, 0xfc, 0x96, 0x72, 0xb6, 0xbd, 0x99, 0x3e, 0xdf, 0x43,
-       0x1b, 0xdf, 0x9e, 0x8a, 0x05, 0xa9, 0x25, 0xcb, 0x13, 0xe5, 0xfd, 0x68,
-       0xa8, 0xb5, 0x1b, 0xd2, 0x0f, 0x94, 0xe2, 0x28, 0xdc, 0x99, 0xe6, 0x09,
-       0xef, 0xa9, 0x84, 0xd1, 0xfe, 0x8c, 0xe2, 0xa1, 0xb1, 0x4b, 0x3f, 0x13,
-       0xde, 0x37, 0x12, 0x0a, 0xde, 0x37, 0x42, 0x1d, 0x67, 0x95, 0x09, 0xef,
-       0xeb, 0x19, 0x0d, 0x33, 0x7a, 0x83, 0xed, 0x96, 0x12, 0xc1, 0x8f, 0x32,
-       0x7e, 0x04, 0x7a, 0xa3, 0x38, 0x92, 0x31, 0xf1, 0xf4, 0x15, 0x38, 0xf0,
-       0xa5, 0x7f, 0x96, 0x8b, 0x63, 0x5f, 0x97, 0xd0, 0xd1, 0x6d, 0x5e, 0xb4,
-       0x63, 0x1a, 0xe2, 0xe5, 0xd1, 0x09, 0xef, 0x27, 0xbd, 0x50, 0xca, 0xa2,
-       0x46, 0x20, 0xab, 0xfc, 0x83, 0x1d, 0xf7, 0x4b, 0x31, 0xca, 0xe7, 0x60,
-       0x59, 0x94, 0x76, 0x47, 0x8c, 0x4a, 0x9d, 0xb7, 0x4b, 0x68, 0xb3, 0x05,
-       0xd1, 0x6b, 0x31, 0x32, 0x68, 0xe0, 0xe9, 0x84, 0x6d, 0x7f, 0x6c, 0x8e,
-       0x47, 0x7c, 0x30, 0xda, 0x3e, 0x42, 0x30, 0x36, 0x87, 0x7a, 0x39, 0x91,
-       0x31, 0x30, 0x9c, 0x88, 0xe2, 0xc5, 0x44, 0x8d, 0xb6, 0x19, 0x4d, 0x88,
-       0x05, 0x72, 0x31, 0x64, 0x94, 0x72, 0x0f, 0x85, 0xda, 0x50, 0x1e, 0x8d,
-       0xe0, 0x28, 0xe5, 0x3e, 0x37, 0x57, 0xda, 0x31, 0xf1, 0xfa, 0xbf, 0x42,
-       0x56, 0xe2, 0x3b, 0x9e, 0xa4, 0xac, 0x91, 0xa6, 0x8b, 0x36, 0xa6, 0x79,
-       0x71, 0xda, 0xbc, 0x86, 0x76, 0x08, 0xab, 0x28, 0xea, 0x75, 0xf7, 0x24,
-       0x34, 0x1c, 0xce, 0xf8, 0xdc, 0x9b, 0x13, 0x7e, 0x1c, 0xa0, 0xbf, 0xcd,
-       0x88, 0xc2, 0x0a, 0xb0, 0xdd, 0x19, 0xc4, 0xb5, 0xec, 0x60, 0x35, 0xc6,
-       0x06, 0x83, 0xe6, 0x1b, 0x4a, 0x00, 0x87, 0x86, 0xaf, 0xc5, 0xe8, 0xa0,
-       0x82, 0x91, 0x10, 0x65, 0xe7, 0xf5, 0xf7, 0x06, 0xaf, 0x47, 0x66, 0xd0,
-       0x85, 0x5d, 0x8e, 0x5e, 0x1d, 0x9c, 0x99, 0xfc, 0xbe, 0x16, 0xe9, 0x61,
-       0xb8, 0xe7, 0xf4, 0x6a, 0x78, 0x26, 0xe3, 0x76, 0x1b, 0xbd, 0x7e, 0x0c,
-       0x67, 0x7e, 0xca, 0x79, 0x93, 0xb6, 0x75, 0x0c, 0x25, 0x0e, 0x39, 0x73,
-       0x58, 0x1e, 0x65, 0x63, 0xb9, 0xf8, 0xca, 0x58, 0xa6, 0x33, 0xce, 0x34,
-       0x13, 0x87, 0xc4, 0xc7, 0xbd, 0xc4, 0x20, 0xf1, 0xf1, 0xb7, 0x14, 0x94,
-       0x35, 0x63, 0xf3, 0x58, 0xfe, 0xb9, 0x42, 0xfb, 0x77, 0x63, 0x9d, 0xd6,
-       0x80, 0x44, 0x4a, 0xec, 0x34, 0x8f, 0xcb, 0x72, 0x2d, 0xf3, 0x5f, 0x0c,
-       0xeb, 0x60, 0x31, 0x76, 0xd1, 0xc7, 0x76, 0xee, 0x96, 0xfb, 0xb6, 0xfd,
-       0x50, 0xb8, 0x9c, 0x36, 0x86, 0xc5, 0x45, 0x08, 0x99, 0x1f, 0x38, 0xb2,
-       0x59, 0x38, 0x94, 0x91, 0x18, 0xaa, 0x33, 0xbe, 0x9d, 0x60, 0x5f, 0xcd,
-       0xec, 0xc7, 0xc4, 0x4f, 0x39, 0x37, 0x7f, 0x3d, 0x56, 0x87, 0x1f, 0x8e,
-       0x19, 0xf8, 0xef, 0x63, 0x3a, 0x9e, 0xbf, 0x02, 0xd7, 0xef, 0xa6, 0xae,
-       0x04, 0xc3, 0x1a, 0xb0, 0x25, 0x55, 0x80, 0x6d, 0x83, 0xc5, 0xd8, 0x3c,
-       0x58, 0x53, 0xf7, 0x22, 0xf1, 0xf8, 0x87, 0xe6, 0x1d, 0x18, 0xaf, 0x6c,
-       0x76, 0x7c, 0x66, 0x07, 0xef, 0xef, 0x1c, 0xac, 0xe1, 0x1c, 0xda, 0xb6,
-       0x1a, 0xae, 0x8f, 0x1c, 0x25, 0xbe, 0x4f, 0xf8, 0x83, 0xfa, 0xb8, 0x1a,
-       0xd4, 0x63, 0xf0, 0x20, 0xd1, 0xa0, 0xc2, 0x9a, 0x1e, 0x4c, 0xd3, 0x8b,
-       0xe1, 0x37, 0x1e, 0xe2, 0xd8, 0x82, 0xba, 0xa5, 0x36, 0xd0, 0x7e, 0x19,
-       0x33, 0x54, 0x93, 0xf8, 0x52, 0x8c, 0x4f, 0x06, 0x83, 0x3d, 0x96, 0xba,
-       0x02, 0x56, 0xa5, 0x6d, 0x7f, 0x3f, 0x8c, 0x8e, 0x6b, 0xa2, 0x88, 0x4d,
-       0x67, 0x2c, 0xb8, 0x3e, 0x1a, 0x05, 0xe3, 0x18, 0xce, 0xf5, 0x1a, 0x81,
-       0xbf, 0x53, 0xee, 0xc6, 0x7f, 0x6c, 0x0b, 0xea, 0xba, 0x5a, 0x6f, 0x1d,
-       0x50, 0x49, 0x36, 0xaa, 0xa0, 0x07, 0xa2, 0xcb, 0xd0, 0xe9, 0xf0, 0x04,
-       0x05, 0x9a, 0x61, 0x62, 0x73, 0x8a, 0x95, 0xfc, 0x35, 0xed, 0xfd, 0x6a,
-       0xcd, 0x05, 0x53, 0x0d, 0x9e, 0x68, 0x53, 0x89, 0xb7, 0x4d, 0xe7, 0x6c,
-       0xbd, 0xca, 0xb6, 0x1b, 0x9b, 0xa4, 0x4f, 0x1d, 0x95, 0x9c, 0xe7, 0x0a,
-       0xce, 0x73, 0x63, 0xb6, 0x18, 0x67, 0x07, 0x61, 0x5d, 0x13, 0x0d, 0xb6,
-       0x3e, 0xa2, 0x16, 0xe3, 0xc3, 0xe1, 0x62, 0xbc, 0x33, 0xe8, 0xc6, 0x07,
-       0x83, 0xb6, 0xbd, 0xde, 0x2c, 0x47, 0x41, 0x18, 0xd3, 0x0b, 0x10, 0x3a,
-       0x3f, 0x04, 0x0b, 0x5f, 0xb0, 0xec, 0xef, 0x06, 0x03, 0xf8, 0xc7, 0xc1,
-       0xaf, 0xe2, 0xf9, 0xca, 0xd8, 0xc9, 0x69, 0x8c, 0x91, 0x17, 0x68, 0x3f,
-       0xe7, 0x12, 0xc1, 0xf6, 0x19, 0xae, 0x60, 0x27, 0x79, 0xcb, 0x86, 0xc7,
-       0x94, 0x60, 0xfc, 0x0d, 0x25, 0xa8, 0xf7, 0x2a, 0x7e, 0x7c, 0x44, 0x3b,
-       0x3d, 0x93, 0xa9, 0x89, 0xfc, 0x9c, 0xfd, 0xff, 0xde, 0xfc, 0xa1, 0x3d,
-       0x5e, 0x25, 0x3a, 0x14, 0x7d, 0x51, 0xe7, 0x29, 0xea, 0x9c, 0xfe, 0xfb,
-       0xc3, 0x14, 0x75, 0x4e, 0x79, 0x9e, 0xff, 0x83, 0xf8, 0x25, 0xf3, 0x15,
-       0xe1, 0x3c, 0x5e, 0x87, 0xff, 0xe2, 0x8c, 0xed, 0xa4, 0xfd, 0x9f, 0xfc,
-       0x32, 0xbe, 0xcf, 0xfd, 0x39, 0x0c, 0x92, 0x71, 0x9e, 0xb0, 0xe3, 0x9a,
-       0x8c, 0x51, 0xc6, 0xea, 0xe8, 0x52, 0xef, 0x50, 0x1e, 0x55, 0x51, 0x6c,
-       0xdb, 0x4f, 0x98, 0x93, 0xcf, 0xfd, 0xf9, 0xb1, 0x7e, 0x95, 0xf7, 0x65,
-       0xbc, 0x67, 0x5d, 0xa2, 0x7b, 0x5d, 0xbd, 0x89, 0xbf, 0x83, 0x56, 0x0c,
-       0xa7, 0x0b, 0xf9, 0xbb, 0x2e, 0x76, 0xe9, 0xf7, 0x93, 0xa5, 0x57, 0x3e,
-       0xa7, 0x9d, 0x3a, 0xfd, 0xdd, 0xcd, 0xdf, 0x32, 0x96, 0x37, 0x69, 0x37,
-       0x5f, 0x66, 0x27, 0x62, 0x23, 0x75, 0xb4, 0xa7, 0x33, 0x12, 0x57, 0x2c,
-       0x7f, 0xd4, 0x6b, 0xa9, 0x51, 0xe8, 0x74, 0x7d, 0xaf, 0x12, 0xed, 0x80,
-       0x9e, 0xb1, 0x70, 0x4f, 0xb3, 0x0b, 0xdf, 0x6a, 0x56, 0x30, 0xcd, 0xe8,
-       0x40, 0xdf, 0x3c, 0xcb, 0xae, 0x30, 0xf6, 0xab, 0xe2, 0x03, 0x05, 0x49,
-       0x58, 0xf4, 0x3b, 0x44, 0xc8, 0x95, 0xca, 0xff, 0x9d, 0x82, 0xd3, 0xe1,
-       0x10, 0x6d, 0x6e, 0x0b, 0x39, 0x15, 0x50, 0x98, 0x84, 0xb7, 0x94, 0xf3,
-       0x3f, 0xda, 0x0b, 0x6f, 0x31, 0x7d, 0x7f, 0x59, 0x6f, 0x4d, 0xc7, 0x7b,
-       0xc4, 0x8a, 0xac, 0x12, 0x6c, 0xa7, 0xbe, 0xcd, 0x32, 0x25, 0xd8, 0x7a,
-       0x3b, 0xf5, 0x5d, 0xab, 0x48, 0x3f, 0x51, 0xd4, 0x65, 0xb6, 0x10, 0x73,
-       0xe4, 0x3a, 0x02, 0x23, 0xf3, 0xab, 0x49, 0xd9, 0xe1, 0xf5, 0x50, 0x86,
-       0x83, 0x89, 0x77, 0xed, 0xb4, 0x16, 0xd4, 0xd3, 0xce, 0xef, 0x0d, 0xfc,
-       0x0d, 0x6f, 0x41, 0x74, 0x23, 0x5e, 0x4a, 0x3c, 0xe5, 0xcf, 0x97, 0xcb,
-       0xc9, 0x7a, 0xb5, 0x3c, 0xff, 0xd3, 0x8e, 0xf9, 0x73, 0xf2, 0xf8, 0x92,
-       0x5b, 0x40, 0x8e, 0xe2, 0x2d, 0x64, 0x5f, 0xef, 0x3b, 0xf5, 0x23, 0xac,
-       0x5f, 0xd3, 0xde, 0xab, 0x04, 0xeb, 0x3e, 0x42, 0xbd, 0xfe, 0x3d, 0x04,
-       0x5b, 0x8f, 0x92, 0x5b, 0x1a, 0x93, 0xf2, 0x84, 0x32, 0x0e, 0x9f, 0x71,
-       0xe4, 0x99, 0x95, 0x81, 0xe2, 0xea, 0x85, 0x6f, 0xa6, 0x51, 0x8b, 0x2e,
-       0x67, 0x4e, 0xa1, 0x04, 0x7a, 0x75, 0x94, 0x91, 0xbf, 0x04, 0x46, 0x81,
-       0xb1, 0x01, 0x72, 0xb9, 0x70, 0x0d, 0xbe, 0xc9, 0x58, 0x30, 0x83, 0x65,
-       0x1e, 0xd3, 0x2e, 0xe1, 0x97, 0xd2, 0x93, 0x20, 0xc0, 0x4c, 0xcf, 0xf1,
-       0xb2, 0xf8, 0xbd, 0x88, 0xc9, 0xbd, 0x27, 0x13, 0x50, 0x52, 0x89, 0xe0,
-       0x3e, 0xc0, 0x18, 0x0f, 0xbb, 0x62, 0x0f, 0x07, 0xd0, 0x85, 0x73, 0xe1,
-       0x50, 0x3c, 0xab, 0x84, 0xda, 0x07, 0x14, 0xd3, 0xbb, 0x8b, 0xfd, 0x6d,
-       0x67, 0x99, 0x1d, 0xfc, 0x9c, 0x35, 0x0c, 0x73, 0x85, 0x12, 0xbb, 0xa1,
-       0x80, 0x65, 0x6a, 0xc2, 0x21, 0xf2, 0xcc, 0xd0, 0x85, 0x95, 0x30, 0xbd,
-       0x4f, 0x65, 0xa4, 0xad, 0x88, 0xb2, 0x25, 0xfb, 0xa4, 0x9a, 0xc3, 0xa3,
-       0xdf, 0x4f, 0xea, 0xec, 0x1d, 0xf9, 0xed, 0xf4, 0xed, 0xee, 0xfd, 0xaf,
-       0x85, 0x7f, 0x78, 0xef, 0xaf, 0xa7, 0x5d, 0x79, 0xaf, 0x5e, 0x1b, 0xa6,
-       0xff, 0xb9, 0x8c, 0x22, 0xce, 0x9d, 0xf0, 0xa3, 0x58, 0x9d, 0x07, 0x72,
-       0xcf, 0x85, 0xb4, 0x3b, 0x16, 0x70, 0xe1, 0x73, 0x3b, 0xb6, 0x4a, 0xee,
-       0x15, 0x23, 0xde, 0x56, 0x1f, 0x70, 0xa3, 0x3e, 0xb2, 0x95, 0x58, 0x30,
-       0xb1, 0x6a, 0x21, 0x9f, 0x85, 0xcc, 0x17, 0x51, 0xa3, 0x6f, 0x85, 0x5c,
-       0x7f, 0x46, 0x9b, 0x5d, 0x28, 0x75, 0x59, 0x26, 0xc7, 0x7d, 0x04, 0x6b,
-       0xb6, 0x98, 0x36, 0x5e, 0x22, 0x4c, 0x14, 0x46, 0x8f, 0x28, 0xa7, 0x13,
-       0x5f, 0xd8, 0x31, 0x37, 0x96, 0xd3, 0x2f, 0x4d, 0xea, 0x59, 0xf7, 0x46,
-       0x43, 0xfa, 0x09, 0x66, 0x0a, 0xae, 0xa8, 0xa5, 0x4c, 0x64, 0xb6, 0x28,
-       0xef, 0x66, 0x7a, 0x94, 0x33, 0x19, 0xa9, 0x7b, 0x44, 0x79, 0x27, 0x23,
-       0xf1, 0xb0, 0x5a, 0x3f, 0x4e, 0x7e, 0x43, 0x4e, 0xa5, 0x6e, 0x36, 0xa1,
-       0x6c, 0x33, 0xcb, 0xc8, 0xf3, 0x8d, 0xba, 0x21, 0xca, 0x7b, 0xb0, 0x19,
-       0xe6, 0x76, 0xd3, 0x83, 0x09, 0x0d, 0xbe, 0xcd, 0xa6, 0x5b, 0x7e, 0x33,
-       0x1f, 0x90, 0xba, 0xd5, 0xfa, 0xd6, 0xcc, 0x45, 0xfa, 0x57, 0xee, 0xf7,
-       0xc1, 0xe6, 0xfc, 0xbd, 0xdf, 0xda, 0xe3, 0xab, 0x54, 0xfe, 0xfe, 0x77,
-       0x2e, 0x0e, 0x85, 0x75, 0xa7, 0xf2, 0x73, 0xe1, 0x52, 0x2a, 0xf9, 0x63,
-       0x05, 0x2c, 0x2d, 0x68, 0xa5, 0x99, 0x0e, 0x6d, 0x4e, 0x35, 0xd2, 0xdf,
-       0x02, 0x8c, 0x95, 0x51, 0xe2, 0x3b, 0x79, 0x2f, 0xfb, 0x2c, 0x30, 0x7c,
-       0x58, 0x9c, 0xa8, 0x71, 0xe5, 0xf4, 0xa7, 0x12, 0xc3, 0x5c, 0x8c, 0xe9,
-       0xc2, 0xf1, 0xae, 0xe6, 0xdc, 0xd5, 0xfa, 0x07, 0x94, 0xbb, 0xc8, 0x30,
-       0xea, 0x8a, 0x94, 0x6a, 0xfd, 0xdd, 0x4c, 0x94, 0x3e, 0xde, 0xce, 0x7e,
-       0x7d, 0x78, 0x37, 0x51, 0xc6, 0x1c, 0x24, 0x18, 0xb3, 0xd8, 0xe0, 0x92,
-       0xe6, 0x00, 0xc8, 0xf9, 0xa6, 0xfc, 0xb5, 0x81, 0xf1, 0x5f, 0x62, 0xb4,
-       0x7a, 0xdb, 0xdc, 0x08, 0x36, 0x64, 0xe0, 0x5e, 0xd7, 0x1c, 0xc5, 0x7a,
-       0xc6, 0xf6, 0x87, 0x18, 0x2f, 0x37, 0x32, 0x16, 0xee, 0x0a, 0x73, 0x6c,
-       0x15, 0xb6, 0x5d, 0x68, 0x74, 0x49, 0x3e, 0x83, 0x5e, 0xc6, 0xe2, 0xb5,
-       0x8c, 0x2f, 0x5b, 0x78, 0x7d, 0x2a, 0xf3, 0xcf, 0xf6, 0x43, 0xcc, 0xa7,
-       0x5e, 0xba, 0xa2, 0x4d, 0xa8, 0xc3, 0x46, 0x7d, 0xdd, 0x56, 0xc6, 0x62,
-       0xb6, 0x6b, 0x95, 0x45, 0x6d, 0xfb, 0x86, 0x50, 0x30, 0xe6, 0x51, 0x4c,
-       0xbc, 0x38, 0x3a, 0x61, 0xeb, 0xd3, 0x25, 0x97, 0xca, 0xc7, 0x41, 0x19,
-       0xab, 0xe4, 0x08, 0x82, 0x0f, 0x92, 0x27, 0x4c, 0xc5, 0x08, 0x15, 0x4b,
-       0x06, 0x25, 0x4f, 0x08, 0x60, 0x65, 0xe2, 0xbb, 0x78, 0xb1, 0xc1, 0x8d,
-       0x56, 0xe6, 0x58, 0xb7, 0x25, 0x7c, 0x58, 0x41, 0x2c, 0x5d, 0x9a, 0x60,
-       0xee, 0xa4, 0xf9, 0xb1, 0x2c, 0xe1, 0xc6, 0xb1, 0x06, 0xe6, 0x40, 0xfe,
-       0x42, 0x7c, 0x64, 0xba, 0x70, 0xdc, 0xd4, 0x90, 0x76, 0xfc, 0x61, 0x17,
-       0x31, 0x90, 0x7a, 0x54, 0x25, 0x77, 0x10, 0x1d, 0xba, 0xa8, 0x4f, 0x15,
-       0xf1, 0x4b, 0x3a, 0xfc, 0xb2, 0x5c, 0x40, 0xe4, 0x92, 0x7c, 0xe0, 0x37,
-       0x76, 0x7c, 0xba, 0xd4, 0x87, 0xe5, 0x8b, 0xca, 0x38, 0x84, 0xdf, 0x12,
-       0x27, 0x47, 0x4d, 0x72, 0xbb, 0xa9, 0x43, 0x3d, 0x4f, 0x6e, 0x5d, 0x8e,
-       0xb7, 0x0c, 0xe1, 0xd6, 0x6f, 0x42, 0xa3, 0xef, 0xf6, 0x8c, 0x86, 0x3a,
-       0xce, 0x2b, 0x2e, 0x9c, 0x32, 0xca, 0xc8, 0xfb, 0x38, 0x0f, 0xa3, 0x70,
-       0x6f, 0x9d, 0x6b, 0x22, 0x39, 0xda, 0x1d, 0x29, 0xe5, 0x78, 0xdd, 0x73,
-       0x73, 0x9c, 0xe8, 0xeb, 0xd4, 0xed, 0x9a, 0xb0, 0xc3, 0x89, 0x72, 0x7c,
-       0x40, 0xb3, 0xed, 0x77, 0x0c, 0xd1, 0x33, 0x70, 0x78, 0x52, 0xc7, 0x07,
-       0x79, 0xdd, 0x33, 0xa9, 0xe3, 0x2d, 0x6c, 0x8f, 0xfe, 0x87, 0x6d, 0x57,
-       0xf0, 0x18, 0x1d, 0xcc, 0x29, 0xc9, 0x6f, 0x88, 0xc3, 0xc4, 0x95, 0x18,
-       0x75, 0xfc, 0x72, 0x66, 0x83, 0xe0, 0x36, 0xa7, 0xbb, 0xd1, 0xc1, 0xef,
-       0x98, 0x7a, 0x98, 0x76, 0x20, 0x7a, 0x78, 0x6b, 0x32, 0xb7, 0xb1, 0xed,
-       0x01, 0x53, 0x74, 0x9c, 0xcf, 0xcb, 0x44, 0xd7, 0x37, 0x4a, 0x8e, 0xd5,
-       0x03, 0x7c, 0xc1, 0xb2, 0x2e, 0xe2, 0xee, 0x42, 0xfc, 0xa0, 0x4d, 0x6c,
-       0xa7, 0xd4, 0x89, 0x95, 0xf3, 0x6b, 0x6d, 0x3b, 0xdc, 0xa4, 0xe3, 0x82,
-       0x51, 0x1f, 0x69, 0x54, 0x67, 0x51, 0xd6, 0x28, 0xf6, 0x91, 0x0f, 0x74,
-       0xa7, 0x66, 0x22, 0xe6, 0x17, 0x5b, 0x43, 0x47, 0x41, 0x0e, 0xc3, 0x71,
-       0x26, 0x61, 0xd4, 0x6d, 0xc3, 0x0c, 0x1c, 0xf0, 0xb7, 0x90, 0xc7, 0xa9,
-       0x2d, 0x4c, 0xff, 0xc9, 0x9f, 0x0c, 0x6b, 0x07, 0xce, 0xda, 0x69, 0xbf,
-       0xcd, 0x38, 0x49, 0x18, 0xa0, 0x2e, 0x5f, 0xd1, 0x5c, 0x78, 0xb5, 0xee,
-       0x9a, 0x49, 0xbe, 0x29, 0x9c, 0xe5, 0x3d, 0xfb, 0x98, 0x5f, 0xfa, 0x62,
-       0x9e, 0xa7, 0x2e, 0x73, 0x49, 0x1e, 0xe8, 0x36, 0xa4, 0x6d, 0xe6, 0x0b,
-       0x63, 0x57, 0xcb, 0x30, 0x61, 0x4f, 0xf8, 0x45, 0x86, 0xa0, 0xa6, 0xab,
-       0x7f, 0x6c, 0x1e, 0xaf, 0xc3, 0xcf, 0x35, 0x37, 0x7c, 0xe4, 0xc5, 0xaf,
-       0xf9, 0x73, 0x6d, 0xf4, 0x9a, 0xe3, 0x33, 0x4a, 0x1d, 0xac, 0x3c, 0xa2,
-       0x24, 0x89, 0x0f, 0xe3, 0x1e, 0x68, 0xe5, 0x51, 0xb7, 0xae, 0x11, 0x13,
-       0x36, 0x13, 0x13, 0x2c, 0x62, 0x42, 0x5f, 0xe6, 0x88, 0x92, 0xca, 0x7c,
-       0x46, 0x5d, 0x48, 0x1d, 0xb1, 0x9d, 0x2d, 0x94, 0xe5, 0x27, 0x36, 0xaa,
-       0x44, 0x9e, 0x0b, 0xbc, 0xdf, 0x42, 0x1e, 0x92, 0x97, 0x53, 0x7c, 0x95,
-       0x10, 0x54, 0x2c, 0xcf, 0x52, 0xb9, 0xdf, 0xaa, 0x5c, 0xcf, 0x70, 0x4b,
-       0xb9, 0xee, 0xb1, 0xa3, 0x4b, 0xdd, 0x58, 0x80, 0xd9, 0xe1, 0x85, 0x8b,
-       0x44, 0x17, 0x6a, 0x34, 0xa6, 0x7b, 0x61, 0x55, 0xb9, 0x88, 0xe5, 0xef,
-       0x35, 0x34, 0x60, 0x11, 0x73, 0xce, 0xb3, 0x04, 0xa7, 0x6e, 0xc3, 0x85,
-       0x71, 0xea, 0xe7, 0x69, 0x53, 0xd6, 0x1b, 0x6c, 0xdc, 0x16, 0xb6, 0xe2,
-       0xf4, 0x78, 0xab, 0x94, 0xb6, 0x57, 0x6c, 0x08, 0x4f, 0x28, 0x43, 0x49,
-       0xd4, 0x5d, 0x77, 0x16, 0x41, 0x73, 0x17, 0x79, 0x92, 0x5e, 0x31, 0x3b,
-       0xe2, 0xa1, 0xe6, 0x5e, 0x4f, 0x84, 0x22, 0xc7, 0x95, 0x9c, 0x3f, 0xbd,
-       0x4c, 0xdb, 0x78, 0x2b, 0x61, 0x74, 0x16, 0xba, 0x72, 0xbf, 0xdf, 0x70,
-       0xf2, 0xd9, 0xbc, 0x3f, 0x05, 0x26, 0x71, 0xc7, 0xeb, 0x3d, 0x93, 0xc0,
-       0x79, 0xb5, 0x59, 0xf2, 0x5a, 0x9c, 0xdf, 0x6c, 0x8e, 0x2b, 0x1e, 0xa3,
-       0x8c, 0xfa, 0x10, 0x2c, 0x2e, 0x20, 0xa7, 0x14, 0xee, 0xe0, 0xf5, 0x9e,
-       0x65, 0x19, 0x72, 0xc2, 0x89, 0xba, 0xf9, 0xf5, 0x11, 0x2f, 0x62, 0x56,
-       0x21, 0xfd, 0xba, 0x34, 0xea, 0xf7, 0xde, 0x98, 0xb5, 0xaa, 0x7c, 0xf4,
-       0x8b, 0x12, 0xe6, 0xbb, 0xb3, 0x93, 0x0b, 0xcb, 0x24, 0x57, 0xdc, 0x38,
-       0xca, 0x91, 0x55, 0xf6, 0x57, 0xa9, 0x51, 0x59, 0xc3, 0xd0, 0xe0, 0xa9,
-       0xdc, 0x78, 0x8b, 0x1a, 0x9d, 0x40, 0x7b, 0xb3, 0xb7, 0x25, 0x92, 0x85,
-       0xb7, 0x22, 0xba, 0x09, 0xe1, 0xa4, 0xe4, 0xad, 0x82, 0xb1, 0xb1, 0xad,
-       0x44, 0xbd, 0xaa, 0xf2, 0x79, 0xf9, 0xb9, 0x82, 0x5a, 0x16, 0x95, 0xfc,
-       0x55, 0x6f, 0x79, 0xc3, 0xc1, 0x62, 0x8d, 0xf9, 0xc6, 0xaf, 0x02, 0xff,
-       0x77, 0xf5, 0x5b, 0xdd, 0x32, 0x77, 0x1e, 0x43, 0xbe, 0x65, 0xdd, 0x00,
-       0x6e, 0x95, 0x58, 0xda, 0x3d, 0xe2, 0x66, 0x7e, 0x26, 0xf3, 0x25, 0xf1,
-       0xf8, 0xc8, 0xbd, 0x2f, 0xd1, 0xdf, 0x3c, 0xd4, 0xfd, 0x0e, 0xc3, 0x62,
-       0x98, 0xb0, 0x6d, 0x23, 0x1c, 0x0c, 0x14, 0x28, 0x3a, 0xb6, 0x37, 0xfc,
-       0x13, 0xed, 0x0b, 0xc4, 0x41, 0x90, 0x98, 0x97, 0x61, 0xcb, 0x48, 0xc1,
-       0x94, 0x7a, 0x91, 0xfb, 0xf2, 0xf5, 0x7a, 0x0d, 0x2b, 0x2e, 0xf5, 0x86,
-       0xc3, 0xc1, 0xf6, 0x6d, 0xac, 0xb7, 0x93, 0xf5, 0x62, 0x8c, 0xbd, 0xeb,
-       0x47, 0x35, 0x27, 0x1f, 0xb4, 0x46, 0x8a, 0xa7, 0xf6, 0x77, 0xa9, 0xde,
-       0x93, 0x86, 0x35, 0xee, 0xf4, 0xd7, 0x14, 0xec, 0x2c, 0x70, 0xb9, 0x91,
-       0x64, 0xbd, 0x71, 0xd6, 0x7b, 0x77, 0x54, 0xd6, 0x33, 0x70, 0xcb, 0x48,
-       0x22, 0x35, 0xe1, 0x32, 0x0c, 0xed, 0x1d, 0xc4, 0x88, 0xd9, 0xce, 0x5c,
-       0xde, 0x72, 0x28, 0xd3, 0x85, 0xed, 0xc6, 0xd1, 0x70, 0x21, 0xeb, 0x1d,
-       0x37, 0x8e, 0x06, 0x3c, 0xf4, 0x99, 0x75, 0x6c, 0xaf, 0x9b, 0x79, 0x91,
-       0x4a, 0x8c, 0xdc, 0x32, 0x22, 0xdc, 0xc1, 0xc4, 0x6c, 0xe6, 0x67, 0x8e,
-       0x6d, 0xca, 0xda, 0x09, 0x64, 0x4e, 0x65, 0x7c, 0xc1, 0xba, 0x11, 0x67,
-       0x7c, 0xca, 0x35, 0x87, 0x25, 0x57, 0xae, 0xb0, 0xb0, 0xb9, 0x41, 0xe2,
-       0xa7, 0x42, 0xec, 0x0e, 0xd6, 0x8d, 0x33, 0x9e, 0x6c, 0x1b, 0xfb, 0x33,
-       0x8c, 0x6b, 0x95, 0xcc, 0x65, 0x6d, 0xfb, 0x15, 0x63, 0x61, 0x05, 0x43,
-       0xbc, 0xd7, 0x4b, 0x99, 0xbd, 0xa1, 0x62, 0x89, 0xd3, 0x4e, 0x5b, 0x31,
-       0x08, 0x3e, 0x29, 0x48, 0x1a, 0xd6, 0x06, 0x91, 0xff, 0x58, 0x38, 0x18,
-       0x3f, 0xac, 0xd4, 0xb7, 0x6f, 0xc3, 0x3f, 0x11, 0x2f, 0x41, 0xac, 0x9b,
-       0x89, 0x21, 0x93, 0xd6, 0xd2, 0x66, 0x31, 0x42, 0x4a, 0x8c, 0x77, 0x9f,
-       0x58, 0xc4, 0x08, 0xe7, 0x46, 0xb0, 0xb3, 0x95, 0xe5, 0x23, 0xb9, 0x75,
-       0x16, 0x5c, 0x18, 0x0d, 0x32, 0x0e, 0x8b, 0x2e, 0x80, 0xad, 0x99, 0x7c,
-       0x2c, 0xb0, 0xed, 0x83, 0xa6, 0x6d, 0xbf, 0x64, 0xce, 0xc4, 0x61, 0x33,
-       0x18, 0x17, 0x1f, 0x78, 0xdf, 0x5c, 0x78, 0x83, 0xe4, 0xc5, 0x80, 0xc8,
-       0xa6, 0x30, 0x76, 0x29, 0x28, 0xe1, 0x27, 0x10, 0x72, 0xeb, 0x25, 0x8a,
-       0x0d, 0x6f, 0x53, 0x6d, 0x67, 0x2d, 0xf5, 0x5e, 0x36, 0x5f, 0xc1, 0x27,
-       0x37, 0x2a, 0x38, 0x7a, 0x63, 0x28, 0x30, 0xa4, 0x94, 0x32, 0x2e, 0x84,
-       0xda, 0x5a, 0x14, 0xeb, 0x04, 0xeb, 0xc6, 0x1a, 0x5c, 0xc1, 0x00, 0x94,
-       0x72, 0x62, 0xd6, 0x6c, 0x5d, 0x68, 0x8b, 0xbb, 0x37, 0x14, 0xd8, 0xc9,
-       0x6f, 0xd7, 0xa8, 0x82, 0x51, 0x23, 0x18, 0x83, 0xd3, 0x3e, 0xfb, 0x66,
-       0xca, 0x7c, 0x53, 0xc8, 0xb6, 0x4f, 0x86, 0xeb, 0xb5, 0x93, 0x78, 0x9f,
-       0xb8, 0x2c, 0xfd, 0xe4, 0x65, 0x03, 0xf3, 0x70, 0x23, 0xd6, 0xa2, 0xdc,
-       0x24, 0xb4, 0x84, 0x71, 0x52, 0x62, 0x79, 0x5e, 0xde, 0x7c, 0x4c, 0xb7,
-       0xed, 0xf7, 0xcd, 0x5c, 0x5b, 0x5a, 0x73, 0x30, 0x0e, 0xcc, 0xc4, 0x98,
-       0x11, 0x6c, 0x1d, 0xa7, 0x1e, 0x02, 0xf4, 0xf5, 0x19, 0x46, 0x15, 0x26,
-       0x3c, 0x41, 0x6d, 0x42, 0x59, 0xf4, 0x99, 0x8a, 0x39, 0x1b, 0x9e, 0x52,
-       0xea, 0x3b, 0x8a, 0x60, 0x90, 0x9f, 0x5e, 0x23, 0xf3, 0x11, 0xf0, 0x91,
-       0x0b, 0xae, 0x83, 0xc3, 0x2f, 0x70, 0x7b, 0xc2, 0x1d, 0xbb, 0x80, 0x1a,
-       0xfa, 0x9d, 0xd1, 0xfe, 0x90, 0x12, 0x64, 0xf2, 0xf2, 0x35, 0x26, 0x38,
-       0x22, 0x6b, 0x15, 0xe2, 0xf7, 0xd8, 0xf6, 0xc3, 0x94, 0x75, 0x17, 0x65,
-       0xdd, 0x18, 0xfe, 0xd8, 0xfe, 0x07, 0xa7, 0xcd, 0x5b, 0x31, 0x64, 0x5c,
-       0xdd, 0xee, 0x47, 0x36, 0xa6, 0x4b, 0xbb, 0x1e, 0x2c, 0x99, 0xce, 0x5c,
-       0xab, 0x59, 0xf0, 0xaa, 0xd2, 0x43, 0x7c, 0x62, 0x7b, 0x8c, 0x7f, 0xea,
-       0xd5, 0x1c, 0xc2, 0x05, 0xc6, 0xe6, 0x40, 0x5c, 0x51, 0xab, 0x4b, 0xa0,
-       0xc1, 0x6b, 0xd8, 0x78, 0x84, 0x7c, 0x27, 0x36, 0xbd, 0x1c, 0xdf, 0xe4,
-       0x9c, 0x96, 0x86, 0xd4, 0x6b, 0x5d, 0x9c, 0x93, 0xc3, 0x61, 0xf9, 0xed,
-       0xc1, 0xf8, 0x74, 0x17, 0xba, 0x38, 0xcb, 0x5a, 0x48, 0x9d, 0x21, 0xf7,
-       0xbd, 0x8d, 0xf2, 0x9b, 0xf2, 0x5f, 0xa3, 0xe0, 0x61, 0x5a, 0xa4, 0x1a,
-       0xea, 0x0e, 0xc8, 0xfd, 0x56, 0x53, 0x7e, 0x2b, 0xe4, 0x92, 0x6e, 0xce,
-       0x8b, 0x0d, 0x97, 0x2c, 0x4d, 0x84, 0x78, 0x3f, 0x2c, 0xd7, 0xb1, 0x87,
-       0x39, 0xee, 0xd8, 0x01, 0x45, 0x30, 0xee, 0x97, 0xf6, 0x2b, 0x8c, 0x81,
-       0x1a, 0x9f, 0x7f, 0x93, 0x7d, 0x9f, 0x08, 0xbf, 0x64, 0xcf, 0xa8, 0x50,
-       0x70, 0x32, 0xa2, 0x63, 0xe6, 0x8d, 0xd5, 0x98, 0xb8, 0x5b, 0xc6, 0xac,
-       0xa0, 0xd4, 0x38, 0xe8, 0x91, 0x1c, 0xb9, 0xcc, 0xb8, 0x06, 0x4b, 0x56,
-       0xe4, 0xee, 0x15, 0x85, 0x64, 0x8d, 0x53, 0x47, 0xd1, 0x8d, 0x95, 0xd0,
-       0x27, 0xef, 0x2d, 0x0a, 0xb9, 0xdb, 0x4a, 0x15, 0x43, 0xbb, 0x5d, 0x91,
-       0xe7, 0xbf, 0x23, 0x2f, 0xb7, 0xed, 0x47, 0x38, 0x5f, 0xb3, 0xc3, 0x3e,
-       0x9c, 0x63, 0x3f, 0xdd, 0xd4, 0xdf, 0xf2, 0x4b, 0xf3, 0x95, 0xaf, 0xff,
-       0xa9, 0xad, 0xdf, 0x23, 0x75, 0xa5, 0x8d, 0xda, 0xd6, 0x25, 0xca, 0x03,
-       0x1e, 0xc9, 0x91, 0x36, 0x86, 0x1d, 0x9d, 0xb1, 0xec, 0x73, 0xce, 0x6f,
-       0xad, 0xf9, 0xad, 0x4b, 0xeb, 0x75, 0xe7, 0x9d, 0x58, 0xba, 0x70, 0xbe,
-       0x86, 0x09, 0xbb, 0xa2, 0xd1, 0xd2, 0x0a, 0x21, 0x31, 0xb5, 0xa6, 0xee,
-       0x39, 0xb6, 0xfb, 0x73, 0x33, 0x17, 0x6f, 0x0f, 0x9a, 0xc1, 0x3e, 0x8b,
-       0xfe, 0x13, 0x67, 0x8e, 0xdb, 0x22, 0xbc, 0x63, 0xec, 0x16, 0xce, 0xc3,
-       0x4c, 0x14, 0x36, 0x06, 0x7b, 0x66, 0x31, 0xe7, 0x73, 0x35, 0x4b, 0x9c,
-       0x96, 0xf9, 0x71, 0xca, 0xb0, 0xaf, 0x22, 0x2c, 0xa2, 0x8c, 0xe1, 0xc6,
-       0x3f, 0x15, 0xdf, 0xa4, 0x1d, 0xb1, 0xce, 0x60, 0x4f, 0x0c, 0x7f, 0xaa,
-       0x2c, 0xc8, 0x28, 0x64, 0x2d, 0xcc, 0x7b, 0x4b, 0x3c, 0xa3, 0x92, 0x23,
-       0x15, 0x68, 0xdd, 0xcd, 0x55, 0xfc, 0xc8, 0x73, 0xf7, 0x2d, 0x6b, 0x32,
-       0x97, 0xd6, 0x20, 0xd1, 0x67, 0x16, 0x40, 0xbd, 0x49, 0xe2, 0x05, 0x7d,
-       0x59, 0x93, 0xf1, 0x59, 0xb4, 0x72, 0x59, 0x5f, 0x30, 0x56, 0xad, 0x25,
-       0x5e, 0xbc, 0xc8, 0x1e, 0x87, 0xc9, 0xc5, 0x2c, 0xc7, 0x33, 0x9c, 0xf8,
-       0x37, 0x65, 0x4d, 0x52, 0xe2, 0x57, 0x7e, 0x5d, 0xb3, 0x12, 0xfd, 0x7b,
-       0x57, 0x40, 0xaf, 0xca, 0x61, 0xa0, 0x1a, 0x6d, 0xc2, 0xc2, 0xbe, 0x40,
-       0x41, 0x2e, 0x7f, 0x28, 0x43, 0xef, 0xde, 0x30, 0xd2, 0xd3, 0x9d, 0xfa,
-       0xbc, 0xe7, 0x85, 0x60, 0xf4, 0xf6, 0xbd, 0xd7, 0xca, 0x7a, 0x40, 0x40,
-       0xda, 0x8d, 0xd3, 0x77, 0x54, 0xe3, 0x43, 0xdb, 0xd2, 0xa4, 0xfd, 0xa3,
-       0x37, 0x10, 0x47, 0xcc, 0xc5, 0xa8, 0x6f, 0x3f, 0x84, 0x33, 0xe4, 0xa4,
-       0x4e, 0xbe, 0xa4, 0x17, 0x46, 0xc7, 0x1f, 0xf6, 0x20, 0x14, 0x1f, 0x21,
-       0x0e, 0xf8, 0x46, 0xbd, 0xe4, 0x56, 0x33, 0x9d, 0x75, 0xaf, 0x85, 0xc4,
-       0x96, 0x38, 0x79, 0xf9, 0xd7, 0xdc, 0x6e, 0xac, 0x25, 0x66, 0x1c, 0x34,
-       0xea, 0x3b, 0x0e, 0xe1, 0x1f, 0x89, 0xb3, 0x52, 0x5e, 0x65, 0x7f, 0xd2,
-       0xa6, 0x9b, 0xfd, 0xc1, 0x4b, 0x2e, 0x70, 0x2f, 0xf9, 0xac, 0xdb, 0x63,
-       0xfc, 0xc4, 0x23, 0xbc, 0x43, 0x78, 0xf7, 0xae, 0xbd, 0x0a, 0x5a, 0xd8,
-       0xce, 0x4e, 0xda, 0xcc, 0xc3, 0x21, 0xb8, 0x5b, 0x6f, 0x24, 0xbf, 0x02,
-       0x5d, 0x70, 0xba, 0x0f, 0x3b, 0x46, 0x10, 0xc9, 0x18, 0xe3, 0x33, 0x7c,
-       0xa8, 0x62, 0x3b, 0x12, 0x53, 0x0a, 0x26, 0xdb, 0x89, 0xdc, 0x77, 0x65,
-       0x3b, 0x65, 0x78, 0x72, 0xb2, 0x9d, 0x7d, 0x6c, 0xe7, 0xe6, 0xd9, 0x70,
-       0x97, 0xdd, 0x2c, 0x73, 0xd5, 0x40, 0xff, 0x29, 0x43, 0xca, 0x89, 0x2b,
-       0xe4, 0xa3, 0x5f, 0x85, 0x62, 0xd4, 0x4a, 0xee, 0x72, 0xd6, 0xa9, 0xb7,
-       0xb8, 0x61, 0xfc, 0x02, 0x69, 0x91, 0x72, 0x7e, 0xf6, 0x38, 0x1d, 0x35,
-       0xaf, 0x9b, 0x2a, 0x6c, 0xdd, 0x5b, 0x9c, 0x97, 0x97, 0xfd, 0xe4, 0xfb,
-       0xa8, 0xe4, 0x3d, 0x3f, 0x76, 0x30, 0x07, 0x5d, 0xcc, 0x7e, 0x0e, 0x9b,
-       0xc2, 0x23, 0xeb, 0xcd, 0x22, 0x45, 0x72, 0xf2, 0x00, 0x39, 0x45, 0x25,
-       0x36, 0x3b, 0x71, 0x28, 0xc0, 0xfa, 0x0d, 0x65, 0x39, 0x7e, 0x02, 0xcf,
-       0x32, 0x96, 0x6d, 0x09, 0xe7, 0xfa, 0x23, 0x0e, 0x33, 0xcf, 0x6d, 0xc4,
-       0xc1, 0xc1, 0x4b, 0xcf, 0x83, 0x8b, 0x8d, 0xa9, 0xf3, 0x35, 0x1e, 0xf4,
-       0xa0, 0x8d, 0xdf, 0x05, 0x12, 0x67, 0xae, 0x18, 0xfb, 0x96, 0x91, 0x47,
-       0xf8, 0x5d, 0x8c, 0xad, 0x23, 0x36, 0xb6, 0x38, 0x39, 0x4e, 0x01, 0xba,
-       0x1b, 0x04, 0x0f, 0xc5, 0x96, 0xa6, 0x4b, 0xec, 0x88, 0xa4, 0x21, 0xf1,
-       0x55, 0xec, 0x27, 0xea, 0xd8, 0x8f, 0x4b, 0x99, 0x6a, 0x3f, 0x5d, 0x78,
-       0xcd, 0x38, 0xba, 0xa2, 0x10, 0x47, 0xef, 0x97, 0xb5, 0xfb, 0x8e, 0x30,
-       0x8e, 0xdd, 0x46, 0xdf, 0x7c, 0x97, 0xd8, 0xb2, 0x65, 0x36, 0xe3, 0x97,
-       0x83, 0x59, 0x0a, 0x0a, 0xc9, 0x2b, 0xb6, 0xed, 0x0d, 0xea, 0x05, 0xaa,
-       0xc6, 0x3e, 0xaf, 0xc6, 0x2e, 0x91, 0xdf, 0x64, 0x9e, 0x7e, 0xf4, 0xb1,
-       0x42, 0xf8, 0x24, 0x5f, 0x7a, 0xfb, 0x0c, 0xdb, 0x58, 0x6c, 0xe6, 0x75,
-       0xe5, 0xe8, 0x69, 0xb2, 0x9d, 0x4a, 0x24, 0xf7, 0xe6, 0xeb, 0x2b, 0x38,
-       0x15, 0x0a, 0x4c, 0xae, 0x9d, 0x57, 0xa2, 0x77, 0xe4, 0xe8, 0x49, 0xf2,
-       0x1c, 0xc6, 0xa9, 0xa3, 0x9d, 0x01, 0xca, 0x72, 0x3e, 0x9c, 0x9f, 0x53,
-       0xf1, 0xcd, 0xa9, 0x6d, 0x88, 0xed, 0x42, 0x29, 0xab, 0xc5, 0x96, 0x32,
-       0xda, 0x68, 0x26, 0x84, 0x78, 0x49, 0xb4, 0x0c, 0x89, 0x11, 0xfa, 0xd6,
-       0x68, 0x01, 0xdc, 0xf3, 0x24, 0xee, 0x0a, 0xd7, 0x72, 0xdf, 0x72, 0x3a,
-       0x51, 0x80, 0x07, 0xcc, 0x8b, 0xb6, 0xe0, 0xe2, 0x49, 0x03, 0xd7, 0x15,
-       0x10, 0x13, 0x6b, 0xc3, 0xa1, 0xd8, 0x3a, 0xe6, 0xb4, 0xc7, 0x1b, 0xdc,
-       0xb7, 0x7c, 0x90, 0xf9, 0x3d, 0x79, 0xf1, 0xd5, 0xe3, 0x11, 0x7d, 0xe0,
-       0xc4, 0xd2, 0x90, 0xf4, 0x29, 0xfd, 0xe5, 0x6d, 0x54, 0xfa, 0xb7, 0xed,
-       0x50, 0xd8, 0xe7, 0xcc, 0x79, 0x7e, 0x0c, 0xef, 0x19, 0xf9, 0x31, 0xf8,
-       0x9c, 0xf8, 0xcd, 0x1c, 0x98, 0x98, 0x23, 0x79, 0xc1, 0x11, 0xe5, 0xa8,
-       0x93, 0x03, 0x5b, 0x31, 0xe6, 0xbe, 0x91, 0x9e, 0xc9, 0xdc, 0x77, 0x9c,
-       0x3c, 0xf7, 0x38, 0x79, 0xee, 0xcb, 0x93, 0xb9, 0xef, 0x8b, 0x19, 0xa9,
-       0x33, 0xb5, 0x7c, 0x24, 0x26, 0x6b, 0xd6, 0x23, 0x89, 0x50, 0x5d, 0xbe,
-       0xce, 0xcb, 0x2c, 0x7f, 0xfc, 0x52, 0xf9, 0xd5, 0xcc, 0x57, 0x57, 0x61,
-       0x5b, 0xaa, 0x04, 0x0f, 0x6a, 0x4e, 0x6e, 0xe9, 0x2d, 0x8c, 0x9e, 0xb8,
-       0xef, 0x7d, 0x63, 0xbc, 0xce, 0x45, 0x1c, 0x1a, 0xe1, 0xe0, 0x5b, 0x12,
-       0x0a, 0xfd, 0xce, 0x83, 0x1e, 0xad, 0x1c, 0x6b, 0xcd, 0x7f, 0xb2, 0x1f,
-       0x5c, 0x25, 0xcf, 0xf2, 0x7b, 0x14, 0x52, 0xfe, 0x35, 0x96, 0x0f, 0x9a,
-       0x23, 0x93, 0xb9, 0xe0, 0xd1, 0x04, 0xfa, 0x24, 0xcf, 0x5a, 0xd3, 0x1c,
-       0xd2, 0xbb, 0x9d, 0x75, 0x63, 0x1d, 0xeb, 0x32, 0x3a, 0xd6, 0x53, 0x9e,
-       0xb4, 0x7b, 0x32, 0x47, 0xca, 0xc5, 0x62, 0x4b, 0x78, 0xe6, 0x22, 0x96,
-       0xdb, 0x3c, 0x89, 0x33, 0x2d, 0x97, 0x78, 0xae, 0x6d, 0xf7, 0x9b, 0x79,
-       0xae, 0xcb, 0x58, 0x50, 0x29, 0xb9, 0x35, 0x68, 0x17, 0x15, 0x48, 0xfb,
-       0x65, 0x4f, 0x66, 0xea, 0x18, 0x11, 0x2b, 0x8c, 0x86, 0xf4, 0xd9, 0xea,
-       0x54, 0xec, 0x92, 0xb1, 0x0a, 0x6e, 0x59, 0x8e, 0x7e, 0x8e, 0x5d, 0x1a,
-       0x6f, 0x7d, 0xa1, 0x60, 0xd6, 0xc1, 0x44, 0x77, 0x01, 0x6d, 0x4b, 0x2d,
-       0x10, 0x7b, 0x40, 0xee, 0x1e, 0xb2, 0xb6, 0xbd, 0xfd, 0x0a, 0xdd, 0x15,
-       0xc4, 0x98, 0x0a, 0xe0, 0xe9, 0x44, 0x28, 0x76, 0x16, 0x96, 0x72, 0x32,
-       0xe3, 0xa6, 0xad, 0x4b, 0xbb, 0x5b, 0xd8, 0x5e, 0x8f, 0x72, 0xe2, 0x52,
-       0x9b, 0x17, 0x2e, 0x6e, 0x76, 0xd6, 0x71, 0xf3, 0xbe, 0xe2, 0xc5, 0x43,
-       0x7d, 0xf9, 0xbd, 0xc6, 0x18, 0xde, 0x33, 0x05, 0x17, 0xbd, 0xe4, 0x3d,
-       0xcc, 0xd2, 0x13, 0xdb, 0x90, 0xf3, 0x4b, 0xf9, 0xe4, 0xe7, 0xfd, 0xa0,
-       0x5b, 0x30, 0xec, 0x27, 0xb3, 0x63, 0x93, 0x6b, 0x2e, 0x7f, 0xac, 0x4c,
-       0x1e, 0xdb, 0x2f, 0x5c, 0xec, 0x4b, 0x55, 0x4f, 0xc9, 0xb3, 0x69, 0x5f,
-       0x03, 0xc1, 0x1e, 0x0b, 0x95, 0x6c, 0xc3, 0x8d, 0xbf, 0x65, 0xfc, 0x76,
-       0x0f, 0x1c, 0xbd, 0x41, 0x52, 0x32, 0xcf, 0xa1, 0x18, 0x36, 0x37, 0x7b,
-       0xe0, 0x1a, 0xaa, 0x2e, 0xcc, 0xad, 0xf3, 0x91, 0x3c, 0x3b, 0xdf, 0x8a,
-       0x83, 0xd3, 0x6a, 0x56, 0xf2, 0x6a, 0xd2, 0x88, 0x43, 0xa2, 0xd7, 0x4a,
-       0x7e, 0x8b, 0x5e, 0xfc, 0xfc, 0x16, 0x1d, 0x55, 0xf1, 0xbb, 0x1c, 0xb1,
-       0x2a, 0xd9, 0xf3, 0x6a, 0x47, 0x82, 0x98, 0x55, 0x12, 0xed, 0xc4, 0xd7,
-       0x7b, 0x6d, 0xbb, 0x87, 0x7e, 0x59, 0xc4, 0x18, 0xff, 0x48, 0xa8, 0x3e,
-       0x32, 0x47, 0x29, 0x20, 0xdf, 0x69, 0x47, 0xcf, 0x48, 0x41, 0xbc, 0x3c,
-       0x5a, 0xc5, 0x98, 0xae, 0xe1, 0x93, 0xb9, 0x6d, 0xc8, 0x8e, 0x5e, 0xbd,
-       0x57, 0x36, 0x75, 0x9f, 0x2c, 0xbf, 0x3f, 0x26, 0xe3, 0x11, 0xb9, 0x45,
-       0xfe, 0x0b, 0x17, 0xb7, 0xa6, 0x44, 0x36, 0x0f, 0x0e, 0xf4, 0x89, 0xbc,
-       0x36, 0x3a, 0xcc, 0x5b, 0x29, 0x27, 0x91, 0xbe, 0x72, 0xea, 0xfc, 0xe6,
-       0xdb, 0x91, 0x75, 0xf0, 0x4e, 0x65, 0x98, 0xf3, 0x65, 0xb9, 0x0b, 0xc5,
-       0xbf, 0x34, 0xe6, 0x15, 0xca, 0x73, 0x19, 0x69, 0xa3, 0x45, 0x19, 0x49,
-       0x4f, 0xad, 0xd3, 0xa9, 0x1c, 0xca, 0x3c, 0x5c, 0x28, 0x9c, 0xe3, 0xb2,
-       0x1e, 0xf3, 0x32, 0x90, 0xdc, 0xd2, 0x5e, 0x2a, 0x92, 0xa2, 0x7f, 0xd1,
-       0x8f, 0x0e, 0x77, 0x96, 0xbf, 0xb3, 0x5f, 0xd6, 0xe7, 0xd5, 0x3e, 0x36,
-       0xf7, 0x0a, 0x9f, 0x3c, 0x4e, 0x9f, 0x1c, 0xff, 0xa3, 0x3e, 0x39, 0xef,
-       0x4f, 0x94, 0xcf, 0xaf, 0xb7, 0xda, 0xf6, 0x6e, 0x53, 0xd6, 0xe8, 0x65,
-       0xdd, 0xb5, 0xe1, 0x4b, 0xf6, 0x5e, 0x65, 0x3d, 0x7e, 0x36, 0xd2, 0x95,
-       0xc1, 0xb4, 0xac, 0xbf, 0x0c, 0xa4, 0x80, 0x45, 0x49, 0xe9, 0x27, 0x46,
-       0x7d, 0xa9, 0xb7, 0x32, 0x1a, 0x31, 0x43, 0xe8, 0xc2, 0x19, 0xd3, 0xd8,
-       0xf7, 0x20, 0x79, 0x77, 0x37, 0x73, 0xd2, 0x83, 0xe6, 0x72, 0xfa, 0x7b,
-       0x31, 0x36, 0x34, 0xd0, 0x18, 0x57, 0x98, 0xf4, 0x7b, 0xab, 0x9d, 0xae,
-       0xe8, 0xf5, 0x45, 0xdb, 0x57, 0x25, 0x42, 0xc1, 0xb6, 0x8d, 0xc4, 0xf3,
-       0xa5, 0xbd, 0x5e, 0xe8, 0x8a, 0xc3, 0x07, 0x5a, 0x7f, 0xa1, 0x0a, 0x46,
-       0x9d, 0x29, 0xc8, 0xe5, 0xcd, 0xb2, 0xe6, 0x22, 0xfd, 0x2c, 0x67, 0x5e,
-       0x22, 0x75, 0x75, 0xb4, 0xd7, 0x2a, 0x48, 0xd5, 0x06, 0xfb, 0xe0, 0xb2,
-       0xed, 0xdf, 0x91, 0x17, 0x8e, 0x3b, 0xb9, 0x7c, 0x7d, 0xdd, 0x6e, 0xf5,
-       0x7f, 0x10, 0x0b, 0x9d, 0x36, 0x34, 0x59, 0xf3, 0x7f, 0xe1, 0x4f, 0xae,
-       0x7b, 0x9b, 0x90, 0xbd, 0x89, 0x42, 0x63, 0x89, 0x32, 0xe2, 0xcf, 0x71,
-       0x8a, 0xdb, 0x06, 0x3e, 0xbf, 0xf8, 0x64, 0x4a, 0xec, 0x1c, 0x55, 0x01,
-       0x63, 0x06, 0x66, 0x1f, 0x28, 0xc5, 0xb2, 0x01, 0xe1, 0x0a, 0x3e, 0xab,
-       0x30, 0x1a, 0xc0, 0x9c, 0x03, 0x95, 0x68, 0xd9, 0x23, 0xfb, 0x50, 0x76,
-       0x57, 0x45, 0x74, 0x35, 0xdc, 0x87, 0x34, 0x3c, 0xb0, 0xc7, 0xb6, 0x67,
-       0xcd, 0x23, 0xb5, 0x63, 0x4c, 0x7c, 0xb7, 0x69, 0x15, 0x3c, 0xd9, 0x6a,
-       0x2c, 0x49, 0xd6, 0x39, 0x6b, 0xad, 0x1f, 0x26, 0x5a, 0x5b, 0xce, 0xf5,
-       0xd6, 0x6e, 0xa8, 0x55, 0x82, 0xe6, 0x29, 0x25, 0x82, 0x82, 0x6c, 0x04,
-       0xae, 0xa4, 0x82, 0x57, 0x0d, 0x74, 0x95, 0x45, 0xa3, 0x70, 0x65, 0xa3,
-       0xf0, 0x25, 0xdd, 0x68, 0xa0, 0xbe, 0x4b, 0x38, 0xf7, 0xd3, 0x92, 0xd5,
-       0x98, 0x96, 0xbd, 0x0e, 0xfa, 0x81, 0x06, 0xfa, 0x48, 0x25, 0xfb, 0xf3,
-       0xa3, 0x25, 0xd9, 0x86, 0x69, 0x46, 0x33, 0x6d, 0xa3, 0x19, 0x33, 0x93,
-       0x7e, 0x2c, 0xe0, 0x7c, 0x2c, 0x4e, 0xb6, 0xb2, 0x1f, 0x1f, 0xda, 0x07,
-       0xee, 0x44, 0x60, 0xc8, 0x8b, 0xf2, 0x01, 0x1d, 0x1f, 0xce, 0xf5, 0xa2,
-       0x68, 0x28, 0x80, 0xd2, 0xa4, 0xec, 0x8d, 0x21, 0xb6, 0xb1, 0x39, 0x00,
-       0x5f, 0x16, 0x28, 0x19, 0xb0, 0xf1, 0xad, 0xf0, 0xa8, 0x7a, 0x77, 0xa5,
-       0x65, 0x4f, 0x73, 0x62, 0x41, 0x6b, 0xfb, 0x16, 0xe3, 0xce, 0x49, 0xbf,
-       0x77, 0x33, 0xcf, 0x52, 0xc8, 0xd7, 0x25, 0x06, 0xb6, 0xb6, 0x1f, 0x4c,
-       0xc8, 0xda, 0x46, 0x88, 0x7e, 0xeb, 0x81, 0x77, 0xa8, 0x53, 0xe9, 0xa3,
-       0xed, 0xa0, 0x40, 0xf4, 0xaf, 0xd2, 0xbf, 0xa0, 0x95, 0xd2, 0xce, 0xb7,
-       0x66, 0x5a, 0x94, 0x64, 0xba, 0x53, 0xe9, 0xcd, 0x94, 0x78, 0x51, 0x2c,
-       0xf3, 0xf2, 0x15, 0x8c, 0x36, 0x3c, 0x69, 0xa7, 0x2b, 0x9c, 0xb9, 0xb5,
-       0x3c, 0x90, 0x9c, 0xdb, 0x5a, 0x15, 0xae, 0x0d, 0x76, 0x56, 0xa8, 0xb2,
-       0x9f, 0x42, 0x1c, 0x52, 0x72, 0x7d, 0x69, 0x46, 0x12, 0xcf, 0xfa, 0x65,
-       0x7d, 0x55, 0xe6, 0xbf, 0xb5, 0x3d, 0xd1, 0x7b, 0xe1, 0xa2, 0xcc, 0xe9,
-       0xc7, 0xb4, 0xc3, 0xdb, 0x93, 0x9f, 0x5f, 0xdc, 0x97, 0x6a, 0x63, 0x9e,
-       0x66, 0xe2, 0x55, 0xfe, 0x5e, 0xc4, 0x71, 0xbf, 0x98, 0xf1, 0x61, 0x61,
-       0xb2, 0xd9, 0xd9, 0x8b, 0x5b, 0x96, 0x8c, 0xe0, 0x15, 0x7e, 0xb7, 0x24,
-       0x57, 0xe1, 0x18, 0xf3, 0xd4, 0x07, 0x92, 0x51, 0xbc, 0x9d, 0x09, 0xe0,
-       0x7e, 0xea, 0x6f, 0x06, 0xed, 0xf4, 0xae, 0xa4, 0x8e, 0x37, 0x32, 0xc0,
-       0xcf, 0xfa, 0x6c, 0x84, 0x1a, 0xbf, 0xa3, 0x3e, 0xed, 0xac, 0x8d, 0x35,
-       0xe3, 0x67, 0x09, 0x13, 0x6f, 0x24, 0x6a, 0xcc, 0x9b, 0xd5, 0xdf, 0x62,
-       0xdc, 0x9d, 0xa0, 0x4d, 0x9d, 0x47, 0xbc, 0x52, 0xd6, 0xf1, 0x72, 0xf2,
-       0x77, 0x8f, 0x79, 0x98, 0x63, 0x6d, 0xc0, 0x11, 0xbf, 0xb3, 0x2e, 0x71,
-       0x85, 0x5c, 0xb2, 0x36, 0xb1, 0x88, 0x72, 0x3d, 0x95, 0x22, 0x57, 0x34,
-       0xaa, 0x29, 0x8f, 0x17, 0x0b, 0x07, 0xbc, 0xa8, 0xa4, 0x6d, 0x9c, 0x3e,
-       0x10, 0xc5, 0xce, 0x54, 0x11, 0x5a, 0xfa, 0x03, 0x38, 0xc3, 0xeb, 0xad,
-       0xb4, 0xf1, 0x1f, 0xb1, 0x6f, 0xa3, 0x49, 0xc3, 0x80, 0x56, 0x84, 0x9e,
-       0xba, 0x1f, 0x93, 0xef, 0xa9, 0xcc, 0x39, 0x98, 0x1b, 0x18, 0x25, 0xd8,
-       0xc1, 0xb4, 0xbe, 0xb0, 0x39, 0x88, 0xfe, 0x3a, 0xda, 0x7a, 0x15, 0xe3,
-       0x87, 0x11, 0x43, 0x39, 0x31, 0x26, 0xc5, 0x5c, 0xb1, 0x30, 0x6a, 0x51,
-       0x06, 0x15, 0xfb, 0x34, 0x55, 0xd6, 0xe4, 0xf8, 0x2c, 0x80, 0x63, 0x09,
-       0xd8, 0xc5, 0x51, 0xe3, 0xc2, 0x4e, 0x84, 0x4e, 0xbc, 0xcf, 0xb8, 0xfe,
-       0xf7, 0x99, 0x12, 0x7c, 0xbf, 0x6f, 0x36, 0xfe, 0x36, 0x2d, 0xeb, 0xbd,
-       0x3e, 0xac, 0x1f, 0x0c, 0xab, 0xb9, 0xb5, 0x4a, 0x1f, 0x1e, 0x1a, 0x84,
-       0x35, 0x93, 0xf6, 0xf8, 0xf2, 0x70, 0x19, 0xd6, 0xf4, 0xbd, 0x60, 0x33,
-       0x77, 0xa6, 0x5d, 0x7b, 0x71, 0x34, 0x2d, 0x32, 0x96, 0x53, 0xc6, 0x22,
-       0x1c, 0xe3, 0x75, 0x0f, 0x6d, 0xbf, 0xb2, 0xf7, 0xdb, 0xf8, 0x2c, 0x55,
-       0x53, 0x77, 0xbf, 0xda, 0x8e, 0xe3, 0xce, 0x7e, 0x6c, 0x03, 0xde, 0xa2,
-       0x1e, 0xcb, 0x77, 0xdb, 0xf6, 0x6f, 0xc2, 0x31, 0xfc, 0x2c, 0x73, 0x2d,
-       0x8a, 0x78, 0x6d, 0x86, 0x5b, 0xf0, 0x66, 0xa6, 0x1a, 0x65, 0xbd, 0xad,
-       0x78, 0x9d, 0x9c, 0xbf, 0x74, 0x77, 0x27, 0x4e, 0xb1, 0x7d, 0x5f, 0xbf,
-       0x17, 0xaf, 0xa5, 0xbd, 0x78, 0xb5, 0xcf, 0xd0, 0xd6, 0x2a, 0x7f, 0xa7,
-       0xc4, 0x2b, 0x73, 0xfd, 0x0c, 0xa4, 0x72, 0xfa, 0xdc, 0x3e, 0x56, 0x00,
-       0xc1, 0xf2, 0x43, 0x7e, 0x59, 0xbf, 0x95, 0xf3, 0x31, 0xad, 0xed, 0x5a,
-       0xf2, 0x77, 0x17, 0x13, 0xd4, 0xe7, 0x9b, 0xa3, 0x01, 0xdc, 0x91, 0x14,
-       0xdd, 0x7e, 0x7e, 0x71, 0x17, 0xb1, 0xa3, 0x77, 0x34, 0x82, 0x13, 0x09,
-       0x8f, 0xb3, 0xe7, 0xd8, 0x33, 0x2a, 0xfb, 0xb1, 0xdf, 0xe5, 0xdc, 0x00,
-       0x6b, 0x47, 0x73, 0x6d, 0x6d, 0x19, 0x2b, 0xa4, 0xee, 0x6e, 0xc7, 0xd3,
-       0x5a, 0x81, 0xc4, 0xdf, 0x9c, 0x8d, 0x1a, 0x41, 0xda, 0xee, 0x77, 0x9d,
-       0xf5, 0xbd, 0x81, 0x54, 0xbd, 0x36, 0x0d, 0xf9, 0x79, 0xac, 0xc1, 0x4c,
-       0xe3, 0xf7, 0xf6, 0x0b, 0x7e, 0x59, 0x77, 0x15, 0xbe, 0xd8, 0xda, 0xbe,
-       0x36, 0x21, 0xfd, 0xe8, 0xd8, 0x3c, 0x7a, 0xe1, 0x62, 0x3f, 0xf9, 0xfa,
-       0x12, 0xda, 0xc8, 0xba, 0x90, 0x1f, 0x8b, 0x6b, 0xeb, 0x50, 0x9b, 0x95,
-       0x35, 0xdd, 0x08, 0x39, 0xab, 0x89, 0x8e, 0x50, 0xd4, 0xd9, 0xd7, 0x82,
-       0x9a, 0xbf, 0xe7, 0xc5, 0xbb, 0x7f, 0xe0, 0x2b, 0xc0, 0xac, 0x81, 0x36,
-       0xf6, 0x6b, 0x63, 0x99, 0xf9, 0x0f, 0x76, 0xcb, 0x3d, 0xd2, 0x7f, 0x4d,
-       0x59, 0xee, 0x19, 0x27, 0xbc, 0x58, 0x7e, 0x37, 0xd1, 0x97, 0x1a, 0x71,
-       0xd8, 0x2f, 0x3c, 0x43, 0xfc, 0xa0, 0xb5, 0x3d, 0x4c, 0xfb, 0xd9, 0x41,
-       0x19, 0x56, 0xd0, 0x76, 0x96, 0x11, 0x17, 0xca, 0x8d, 0x0b, 0x17, 0x7b,
-       0x53, 0x26, 0xe6, 0x8c, 0xfa, 0x68, 0xcb, 0x45, 0xec, 0xaf, 0x19, 0xc6,
-       0x28, 0x71, 0x84, 0xf6, 0xbd, 0x60, 0xd4, 0x4f, 0x7b, 0xd6, 0x31, 0x7f,
-       0x54, 0x7c, 0xdc, 0x40, 0x88, 0xb1, 0xac, 0x9d, 0x75, 0x22, 0xa3, 0x15,
-       0xb8, 0x79, 0xbf, 0x1b, 0x77, 0x26, 0xc3, 0xd4, 0x4f, 0x1d, 0x63, 0xdc,
-       0x65, 0x7d, 0x6f, 0x1b, 0x9b, 0x85, 0x0a, 0xe3, 0x88, 0xfd, 0x9c, 0x83,
-       0x61, 0x85, 0x8e, 0x9e, 0x02, 0xec, 0x37, 0x90, 0x82, 0x55, 0xce, 0xf8,
-       0x72, 0x61, 0xf4, 0xb9, 0x2f, 0xe2, 0xf7, 0x8a, 0x2e, 0xa7, 0x8e, 0x47,
-       0x30, 0xe5, 0x02, 0xb1, 0x0e, 0x68, 0x7c, 0xc2, 0xc6, 0xe2, 0xc6, 0x8d,
-       0xca, 0x0f, 0x1c, 0x5b, 0x92, 0x76, 0x85, 0x3b, 0xe4, 0xf5, 0x9f, 0xd7,
-       0xf9, 0x6f, 0x0a, 0x72, 0x3a, 0xcf, 0x8f, 0x33, 0xb8, 0x4f, 0x70, 0x7a,
-       0x7d, 0x63, 0x1e, 0xa7, 0xa5, 0xbc, 0xdc, 0x5f, 0x61, 0xf7, 0x6a, 0x70,
-       0x17, 0x1a, 0x2e, 0x6c, 0xaf, 0x7b, 0x46, 0x99, 0xd0, 0xc4, 0xe7, 0x15,
-       0x62, 0xc7, 0xed, 0x36, 0xdd, 0x96, 0x76, 0xfd, 0x12, 0xcb, 0x41, 0x29,
-       0xbc, 0x34, 0x97, 0xc2, 0x3f, 0xba, 0x27, 0xe7, 0x52, 0x78, 0x6f, 0x7e,
-       0x4c, 0x79, 0x59, 0x23, 0xe4, 0x76, 0x22, 0xaf, 0xd8, 0x86, 0x94, 0x79,
-       0xb0, 0xc8, 0x59, 0x8f, 0x46, 0xf7, 0x14, 0x7b, 0xc8, 0x73, 0x18, 0xa7,
-       0x0d, 0x0d, 0x97, 0xec, 0xc1, 0x8d, 0xb6, 0xa4, 0xcc, 0x3b, 0xac, 0x62,
-       0xea, 0xa1, 0x6d, 0xd4, 0xc3, 0xf9, 0x13, 0x2e, 0xae, 0x62, 0x89, 0xb9,
-       0x5d, 0x19, 0xf7, 0xef, 0x64, 0x1b, 0x9f, 0x5f, 0x64, 0x1d, 0xde, 0xeb,
-       0xe5, 0xf5, 0x75, 0xb8, 0x9d, 0x38, 0xba, 0x36, 0x6c, 0x29, 0xb9, 0x73,
-       0x05, 0x45, 0xb8, 0x71, 0xa0, 0x12, 0x3e, 0x43, 0xd6, 0x2d, 0xfe, 0xb3,
-       0xe2, 0xab, 0x90, 0xf1, 0x3b, 0x9c, 0x81, 0x76, 0x72, 0x1d, 0x16, 0x0f,
-       0x30, 0x64, 0x3b, 0x7b, 0x04, 0x0b, 0xf1, 0x74, 0xf3, 0x75, 0x58, 0xea,
-       0x70, 0x9d, 0x10, 0x6e, 0x1a, 0x12, 0x0c, 0xed, 0x54, 0xfa, 0x89, 0x9d,
-       0x4c, 0x38, 0xe8, 0xd7, 0x31, 0xa5, 0x8f, 0x98, 0xb9, 0xcf, 0xf1, 0x11,
-       0x59, 0x2f, 0xee, 0x54, 0x52, 0x99, 0x0a, 0x8e, 0x43, 0x6c, 0xf7, 0xb2,
-       0x8c, 0x33, 0x29, 0xe3, 0x79, 0x62, 0xd1, 0xfc, 0x49, 0x19, 0x67, 0x37,
-       0x49, 0x2e, 0x2b, 0x32, 0x16, 0xa1, 0x96, 0x72, 0x54, 0x52, 0x8e, 0x63,
-       0x66, 0x85, 0x32, 0xa0, 0xe5, 0x64, 0xab, 0x61, 0xff, 0x8c, 0x39, 0x58,
-       0x63, 0xfa, 0x94, 0x65, 0xce, 0xbd, 0xbc, 0x6c, 0x9f, 0x5f, 0xec, 0x49,
-       0x7d, 0x61, 0xfb, 0x8c, 0x9c, 0x9c, 0x65, 0xfd, 0x3a, 0x4e, 0xcd, 0xbd,
-       0x0e, 0xa5, 0xfb, 0x8b, 0xd0, 0x48, 0x5c, 0xaf, 0x1f, 0x30, 0xfa, 0x36,
-       0x2a, 0x22, 0xab, 0x87, 0xbf, 0x9d, 0x75, 0x03, 0xea, 0xf3, 0xff, 0x2f,
-       0xbc, 0xd2, 0x8e, 0xdd, 0x58, 0x91, 0xcc, 0xd9, 0xb0, 0xe3, 0xbf, 0xb5,
-       0x62, 0xbf, 0xb2, 0x46, 0x48, 0x7b, 0xce, 0xb8, 0xb0, 0x84, 0x7d, 0x1f,
-       0x33, 0x1f, 0x56, 0x2c, 0xed, 0xc2, 0x45, 0xd9, 0xaf, 0x57, 0x29, 0x63,
-       0x77, 0xfa, 0x3a, 0xdc, 0x31, 0x30, 0x6e, 0x7b, 0x8d, 0x05, 0xc8, 0x84,
-       0x43, 0xed, 0x3d, 0x8a, 0x17, 0xbb, 0xd2, 0x2e, 0x2c, 0x1a, 0x20, 0x5f,
-       0x33, 0xe3, 0x4a, 0x6c, 0x7a, 0x8e, 0x87, 0x2f, 0x4c, 0x32, 0x1f, 0xcd,
-       0x4a, 0x7e, 0xd8, 0xd6, 0xbe, 0x30, 0xf1, 0x80, 0x12, 0xd3, 0x3e, 0xbf,
-       0x98, 0x4c, 0x1d, 0xfd, 0xae, 0xea, 0xf0, 0x30, 0x1f, 0xde, 0x3c, 0xe8,
-       0xa3, 0x2f, 0x28, 0xf4, 0x13, 0x3f, 0x7d, 0xbf, 0x01, 0x6f, 0xd3, 0x37,
-       0xee, 0x67, 0x5c, 0xfc, 0xfb, 0xd1, 0x2a, 0xdc, 0xb6, 0x27, 0x8a, 0x97,
-       0x0f, 0xfa, 0xd1, 0xbe, 0xe7, 0x56, 0xbc, 0xc5, 0x72, 0x63, 0x8c, 0x07,
-       0x63, 0xc3, 0x95, 0xfc, 0xf8, 0xf9, 0xa9, 0xe2, 0x67, 0x2d, 0xf1, 0xa8,
-       0x02, 0x27, 0xf7, 0xbb, 0xd0, 0x32, 0xa0, 0x62, 0xc0, 0x54, 0x70, 0xf7,
-       0x4d, 0x32, 0x1e, 0x2f, 0xd6, 0xd4, 0x5e, 0xb6, 0x8b, 0x25, 0x49, 0xe1,
-       0x70, 0x5e, 0xce, 0x93, 0x8e, 0x43, 0xf4, 0xcb, 0xdb, 0xc8, 0xc1, 0x76,
-       0xf4, 0xb5, 0xd1, 0x8f, 0x6c, 0xcc, 0x0a, 0xff, 0x18, 0x2b, 0xb4, 0x1e,
-       0xc9, 0x6b, 0x9d, 0x75, 0xfe, 0x14, 0xe7, 0x71, 0xc2, 0x53, 0x6f, 0x4d,
-       0x43, 0x51, 0x2c, 0x10, 0x0d, 0x69, 0x47, 0xb0, 0x1c, 0x7d, 0x63, 0xd0,
-       0x64, 0xcd, 0x7f, 0x1b, 0x79, 0xd4, 0x76, 0xf2, 0xa8, 0xee, 0xcc, 0x11,
-       0xce, 0xb1, 0xcf, 0x2b, 0x7b, 0xdf, 0xdb, 0xa8, 0xbb, 0xc5, 0x0e, 0x27,
-       0xf2, 0x5a, 0x45, 0x6c, 0xff, 0x38, 0x63, 0xd2, 0x82, 0xfe, 0x1c, 0x6e,
-       0x7c, 0xd6, 0xf4, 0x3c, 0x8c, 0x69, 0x3d, 0xf4, 0xf9, 0x5c, 0xdb, 0x3b,
-       0x85, 0x9b, 0x79, 0xca, 0x62, 0x65, 0xd1, 0xd0, 0x86, 0xd7, 0xa9, 0x7c,
-       0x2f, 0xdb, 0xdc, 0x3a, 0xb9, 0x8f, 0xd0, 0xcb, 0x36, 0x7b, 0x58, 0xb7,
-       0xbe, 0xdf, 0xe2, 0x5c, 0xba, 0x59, 0x3f, 0x14, 0xd8, 0xa8, 0x98, 0xac,
-       0xeb, 0xe4, 0x11, 0xa8, 0xd9, 0x7f, 0x79, 0xae, 0xda, 0x88, 0x31, 0xfd,
-       0x93, 0xfe, 0x7e, 0x7e, 0xf4, 0x3a, 0x84, 0x68, 0x24, 0x4f, 0x9b, 0x9b,
-       0xa0, 0xd3, 0x66, 0x5d, 0x93, 0x7d, 0x6d, 0x97, 0x71, 0xb8, 0x67, 0xc6,
-       0x66, 0xb2, 0x8f, 0xbe, 0x4c, 0x48, 0xeb, 0x42, 0xfd, 0x89, 0x69, 0x90,
-       0x71, 0x48, 0x7f, 0xcb, 0xf1, 0xe4, 0xd8, 0xd5, 0xe3, 0xa8, 0x26, 0x3e,
-       0x5d, 0x2c, 0x98, 0x3c, 0x33, 0xe7, 0xe4, 0xe2, 0x31, 0xc7, 0xc7, 0x76,
-       0x38, 0xf2, 0x7b, 0xd8, 0x66, 0x36, 0xb7, 0x07, 0x22, 0x69, 0x95, 0x32,
-       0xc2, 0x58, 0xd1, 0x96, 0x54, 0x62, 0x15, 0xd1, 0xfa, 0xce, 0x69, 0x08,
-       0x45, 0x7e, 0xc6, 0xb6, 0xa7, 0xb1, 0xed, 0x67, 0xd9, 0x76, 0x8a, 0x6d,
-       0x8f, 0xb0, 0xed, 0x1f, 0x5c, 0x6a, 0x5b, 0xc5, 0xfd, 0x7b, 0xf2, 0xb6,
-       0xe5, 0x46, 0xa4, 0x89, 0x59, 0xdf, 0x34, 0xd9, 0x03, 0xad, 0xe6, 0xdc,
-       0x8b, 0xee, 0x74, 0xc6, 0xf6, 0x9c, 0xbd, 0x2d, 0x60, 0xec, 0xb9, 0x6b,
-       0x8f, 0x82, 0xf7, 0xc3, 0xef, 0x63, 0xc2, 0x9f, 0xe3, 0x11, 0x79, 0x1b,
-       0xd2, 0x68, 0x43, 0x5a, 0xf2, 0x7f, 0xd2, 0xf4, 0xa5, 0x8e, 0xd8, 0x8f,
-       0xec, 0x3f, 0x90, 0x3f, 0x27, 0x44, 0x1f, 0xbf, 0x23, 0xee, 0x86, 0x4e,
-       0xbc, 0xc7, 0xd8, 0xf9, 0xa3, 0x8c, 0x07, 0xe9, 0xb4, 0x0f, 0xcf, 0x66,
-       0x04, 0x1b, 0xdb, 0x88, 0x8d, 0x82, 0xf7, 0xe4, 0x81, 0xc3, 0x47, 0x1f,
-       0x0b, 0xb0, 0xf2, 0xb3, 0xb4, 0x9f, 0x67, 0x69, 0x3f, 0xcf, 0x0e, 0xfb,
-       0x70, 0xf3, 0x21, 0x2f, 0xce, 0x11, 0x6b, 0x7a, 0x59, 0x26, 0x91, 0x6a,
-       0xc0, 0x4d, 0xe4, 0x59, 0x87, 0x7b, 0x19, 0x97, 0x19, 0xff, 0xeb, 0xb2,
-       0x1a, 0x76, 0xf5, 0x57, 0xa0, 0x7e, 0x48, 0x62, 0x70, 0x05, 0x1e, 0xe9,
-       0xf3, 0x62, 0xce, 0x7e, 0xd9, 0x87, 0x24, 0x2f, 0xec, 0xbb, 0x13, 0xc3,
-       0x8e, 0x8f, 0x4f, 0xa3, 0x7f, 0x54, 0xa2, 0x76, 0x48, 0xae, 0xc9, 0x53,
-       0x68, 0xb3, 0x0b, 0x0e, 0x55, 0x71, 0xbc, 0xb7, 0x62, 0xfe, 0xa1, 0x00,
-       0xf1, 0xdc, 0x8f, 0x48, 0x76, 0xf9, 0x45, 0xc1, 0xe4, 0xed, 0x63, 0x53,
-       0x63, 0x9a, 0xf8, 0xa1, 0x83, 0x61, 0x91, 0x3c, 0x86, 0x5d, 0x7e, 0x3e,
-       0x15, 0x27, 0x7f, 0xcb, 0x67, 0x52, 0x26, 0x1f, 0x7b, 0xa6, 0xe2, 0xe2,
-       0x65, 0x7c, 0x6a, 0x1c, 0x90, 0x6f, 0x0d, 0xed, 0xf3, 0xc4, 0xd7, 0xaf,
-       0x43, 0xc4, 0x91, 0xe7, 0xfe, 0x62, 0x96, 0x0b, 0xe4, 0xfc, 0x7d, 0x2a,
-       0x9e, 0xfb, 0x26, 0xfd, 0xd4, 0x85, 0x58, 0x45, 0x8e, 0x0b, 0xdf, 0xbe,
-       0xa7, 0x01, 0xbb, 0xa8, 0x8f, 0x56, 0xfa, 0x91, 0x2f, 0x1c, 0xb5, 0xad,
-       0x0a, 0xc9, 0x5b, 0x2b, 0x71, 0xe7, 0x1e, 0x3f, 0x63, 0xf8, 0xb5, 0x48,
-       0x0e, 0xcf, 0x66, 0x5b, 0xd5, 0xe8, 0x9d, 0xcc, 0xe7, 0xb7, 0xa7, 0x96,
-       0xd9, 0x0f, 0x39, 0x7b, 0xf2, 0xb2, 0xf6, 0xff, 0xda, 0x7d, 0xde, 0xd0,
-       0xb8, 0xce, 0x7c, 0xde, 0x64, 0xce, 0x41, 0x0e, 0x76, 0x02, 0xa1, 0x4a,
-       0xe6, 0xe7, 0x46, 0x39, 0x16, 0x31, 0x9f, 0x7f, 0xc8, 0x2f, 0xcf, 0x6e,
-       0x15, 0x59, 0x9c, 0xf2, 0x97, 0xc7, 0xb8, 0x6b, 0xca, 0x18, 0xeb, 0x23,
-       0xd3, 0x90, 0xe7, 0x63, 0x5f, 0xd8, 0x7f, 0x6f, 0x40, 0xe9, 0x0f, 0xd1,
-       0x6a, 0x1b, 0x83, 0x7d, 0x0f, 0x29, 0x86, 0xd6, 0xa4, 0x12, 0xba, 0x46,
-       0xdf, 0xc4, 0x92, 0xec, 0x2f, 0x10, 0xcb, 0xae, 0xf6, 0x8a, 0x2c, 0xf7,
-       0x67, 0x57, 0x61, 0x9c, 0x73, 0x5c, 0xc4, 0x3a, 0x37, 0xf4, 0xfa, 0x68,
-       0xa3, 0x50, 0x0e, 0x37, 0xd7, 0xe1, 0x43, 0xf2, 0x9c, 0xb6, 0xe4, 0x9b,
-       0xd0, 0x18, 0x5f, 0xef, 0x4c, 0xfe, 0x02, 0x65, 0xc4, 0x94, 0x3b, 0x92,
-       0x5f, 0xd8, 0x23, 0xa1, 0x7d, 0x4e, 0xbd, 0xc2, 0xd1, 0x03, 0x17, 0xfb,
-       0x2e, 0xc7, 0x27, 0xad, 0xd0, 0x78, 0xe5, 0x2a, 0x3c, 0x6c, 0x68, 0xd9,
-       0x9c, 0x18, 0xfd, 0x5f, 0x9e, 0xe8, 0xaf, 0x7f, 0xfa, 0xfd, 0xe6, 0x9c,
-       0x5d, 0xea, 0x99, 0xbb, 0xf0, 0x2d, 0x07, 0x77, 0xd7, 0x6c, 0x74, 0x47,
-       0x3b, 0x1e, 0x93, 0xb5, 0xd0, 0x35, 0xce, 0x3a, 0x41, 0x3b, 0x76, 0xee,
-       0x6d, 0xc3, 0xe6, 0xbd, 0x82, 0xad, 0xf5, 0xad, 0x8b, 0x94, 0x19, 0xf4,
-       0xc3, 0x01, 0x27, 0x97, 0x71, 0x1b, 0x9f, 0xca, 0x9a, 0xab, 0xea, 0x71,
-       0xf6, 0xc0, 0x74, 0xac, 0x19, 0xcd, 0xb5, 0x35, 0x2b, 0x53, 0x4a, 0xff,
-       0x8a, 0x22, 0xc9, 0x9c, 0xc5, 0xc7, 0xd8, 0xc9, 0x79, 0xc1, 0xa9, 0x7e,
-       0x89, 0x3b, 0x0a, 0x7c, 0xf7, 0xc8, 0x5e, 0xe6, 0x32, 0xe4, 0xf9, 0x7a,
-       0x4c, 0xdb, 0xcc, 0xdf, 0x3b, 0x8a, 0x73, 0x72, 0x6d, 0xbe, 0x8a, 0x17,
-       0xe5, 0xed, 0x41, 0x74, 0x97, 0xb7, 0xa1, 0x4f, 0x39, 0x06, 0xe6, 0xd8,
-       0xe4, 0x83, 0x97, 0xfd, 0xf9, 0x8b, 0x22, 0x67, 0x5d, 0x30, 0x3b, 0x35,
-       0xbe, 0x6f, 0x9f, 0xd4, 0xfd, 0x75, 0xc5, 0xf9, 0xd8, 0x94, 0x93, 0xd7,
-       0x24, 0x16, 0x5e, 0x83, 0x98, 0x3f, 0xef, 0xff, 0xdf, 0xe4, 0xf3, 0xcd,
-       0x82, 0x01, 0x93, 0x75, 0xef, 0x2e, 0x41, 0xf1, 0x76, 0x87, 0xc3, 0x5d,
-       0x6e, 0x9f, 0x64, 0xf8, 0x8a, 0xf6, 0xa7, 0xda, 0xaf, 0xb4, 0x2f, 0x71,
-       0x5a, 0x74, 0xda, 0xc8, 0xba, 0xa2, 0x3f, 0x07, 0xa3, 0x65, 0x4d, 0x96,
-       0xdc, 0xad, 0xcd, 0xd9, 0xa7, 0x29, 0x26, 0x6f, 0xee, 0x66, 0x0e, 0x55,
-       0xb2, 0x9f, 0xd7, 0xe4, 0x3e, 0x4b, 0x07, 0x02, 0x28, 0xda, 0xef, 0x21,
-       0xae, 0xcf, 0x80, 0x7b, 0x7f, 0x01, 0xed, 0x55, 0x38, 0xc2, 0x6b, 0xf7,
-       0x6d, 0x31, 0xae, 0x85, 0x6b, 0x7f, 0x21, 0x79, 0xb9, 0x70, 0xbe, 0x13,
-       0xf7, 0xad, 0x65, 0x1c, 0x57, 0xf7, 0x7b, 0x19, 0x9f, 0xab, 0xe1, 0x61,
-       0xcc, 0x5b, 0x32, 0xf0, 0x67, 0x28, 0xd8, 0x5f, 0x8c, 0x07, 0x06, 0xae,
-       0xc7, 0xcc, 0xfd, 0x25, 0xb8, 0x7f, 0x60, 0x26, 0x66, 0xec, 0x97, 0xdc,
-       0x49, 0x47, 0x60, 0x7f, 0x29, 0x56, 0x0c, 0x04, 0x51, 0xb1, 0xbf, 0x0c,
-       0x6d, 0x03, 0xb3, 0xa0, 0xed, 0x2f, 0xc7, 0x5d, 0x03, 0x35, 0x28, 0xdf,
-       0xaf, 0xe1, 0xce, 0x01, 0x03, 0x65, 0xfb, 0x2b, 0x18, 0xd3, 0x42, 0x8c,
-       0x9d, 0x7e, 0x2c, 0xdf, 0xc3, 0xb9, 0x39, 0x58, 0x45, 0xbf, 0x58, 0x45,
-       0x4e, 0xbd, 0x1a, 0xfb, 0x52, 0x73, 0x50, 0x72, 0x30, 0x80, 0xa5, 0x7b,
-       0xc6, 0x35, 0x52, 0x1a, 0x2c, 0x0e, 0x35, 0xa0, 0xe8, 0xa0, 0xe4, 0x7e,
-       0xc1, 0x13, 0x2d, 0x08, 0x5e, 0x58, 0x84, 0x72, 0xe6, 0xbe, 0xc0, 0x7b,
-       0x63, 0xc0, 0xec, 0x31, 0x17, 0x8e, 0x68, 0xab, 0xb0, 0x75, 0xec, 0x9b,
-       0x93, 0x36, 0x2f, 0xfb, 0x47, 0xe5, 0x9c, 0x5f, 0xb9, 0x96, 0x7b, 0xab,
-       0xd1, 0x33, 0x96, 0x5f, 0x07, 0x0b, 0xf6, 0x6d, 0xa7, 0x06, 0xc7, 0x33,
-       0xf2, 0x4c, 0x7c, 0x04, 0xb4, 0x6f, 0xa5, 0x5b, 0xce, 0x8f, 0xbb, 0xa2,
-       0x6a, 0x59, 0x77, 0xf3, 0x86, 0x5b, 0xe2, 0x99, 0x4d, 0xcc, 0xbb, 0x24,
-       0x87, 0xdd, 0x78, 0xcb, 0x9a, 0xcc, 0x07, 0x97, 0xf6, 0x13, 0xfa, 0xcc,
-       0x85, 0x01, 0x0d, 0x5f, 0xc3, 0x1a, 0x67, 0x0d, 0x55, 0xe5, 0x9c, 0xc9,
-       0x79, 0x56, 0xe7, 0x2c, 0x39, 0xed, 0x2c, 0x0e, 0xd3, 0xc1, 0xd4, 0x75,
-       0xa8, 0xc9, 0x38, 0x6b, 0xb5, 0x75, 0x71, 0xbc, 0xa0, 0xb6, 0x1a, 0xd6,
-       0xe4, 0xd9, 0x0f, 0x6b, 0xbe, 0x86, 0x98, 0xa9, 0x5d, 0x3a, 0x1f, 0x12,
-       0xd4, 0x47, 0x10, 0x0c, 0x6c, 0xc3, 0x3a, 0xe7, 0x7c, 0xa0, 0x12, 0x6d,
-       0x97, 0x73, 0x46, 0xfc, 0x5e, 0x0d, 0x23, 0x93, 0x5f, 0x6b, 0x94, 0xb3,
-       0xd7, 0xb2, 0x8f, 0x65, 0x33, 0xe7, 0x97, 0x3c, 0xf9, 0x88, 0xa2, 0xf6,
-       0x3a, 0xeb, 0x63, 0xab, 0x5c, 0x8c, 0x01, 0x2d, 0x0a, 0xe2, 0x45, 0xd1,
-       0x90, 0xfe, 0xe1, 0xe4, 0xba, 0x83, 0x67, 0x74, 0x8b, 0x52, 0x30, 0xda,
-       0xa3, 0xb8, 0x47, 0x73, 0xeb, 0x0e, 0x2e, 0xf2, 0xd8, 0x6d, 0xa9, 0x4a,
-       0x96, 0xd1, 0x30, 0x7b, 0xae, 0x1b, 0xaf, 0x26, 0xca, 0x9c, 0xb3, 0xc7,
-       0x5b, 0xe7, 0x16, 0xe0, 0x11, 0xda, 0x7e, 0xeb, 0x8d, 0xc7, 0xf0, 0x41,
-       0x86, 0x5c, 0x23, 0x61, 0x85, 0x87, 0xd9, 0xe7, 0xd1, 0x84, 0x8a, 0x17,
-       0x07, 0xb7, 0x84, 0x87, 0x9c, 0xfe, 0xbf, 0x8d, 0xcd, 0x23, 0x92, 0x77,
-       0xb5, 0xd9, 0xdb, 0x53, 0xed, 0xb6, 0xc4, 0xdd, 0x6c, 0xa2, 0x92, 0xb9,
-       0xb9, 0x86, 0x0f, 0xe6, 0x6e, 0xc0, 0x39, 0x96, 0x19, 0x4d, 0x6c, 0xc4,
-       0x27, 0xe4, 0x08, 0x99, 0xc4, 0x72, 0xbc, 0xc6, 0x5c, 0xf2, 0x7b, 0x89,
-       0x56, 0xe6, 0x96, 0xab, 0xf0, 0xca, 0xa0, 0xf0, 0x8f, 0x16, 0x2c, 0x4c,
-       0x28, 0x58, 0x1a, 0x5a, 0x85, 0x93, 0xc3, 0xcc, 0x29, 0x07, 0xe5, 0xbc,
-       0xeb, 0x35, 0x58, 0x93, 0x3b, 0x0f, 0xc5, 0xe7, 0x31, 0x3e, 0x5f, 0x89,
-       0xa3, 0xc3, 0x01, 0x1c, 0x60, 0x0e, 0xf9, 0x0e, 0x31, 0x64, 0x28, 0xd1,
-       0x80, 0xd3, 0xcc, 0x95, 0x7e, 0x94, 0x88, 0xe0, 0x33, 0xfe, 0x3e, 0x92,
-       0x90, 0xf5, 0xef, 0x66, 0x5c, 0xc8, 0xfc, 0x18, 0x05, 0xbd, 0x33, 0x70,
-       0xbc, 0xed, 0x79, 0x52, 0xc9, 0x23, 0xfc, 0xb4, 0xe2, 0xf4, 0x70, 0x2b,
-       0xce, 0x0c, 0x2e, 0xc3, 0x99, 0xe1, 0x5f, 0xe1, 0x83, 0x41, 0x91, 0x57,
-       0xce, 0x2c, 0x3a, 0xef, 0x16, 0xb0, 0x5d, 0xe2, 0xd4, 0xf0, 0xbf, 0xa5,
-       0xed, 0x8f, 0xec, 0xe3, 0xab, 0xa4, 0xdd, 0xe7, 0xff, 0x48, 0xdb, 0xa2,
-       0x4b, 0x89, 0xf5, 0x5e, 0x9c, 0x4c, 0x78, 0x99, 0x57, 0x8d, 0xdf, 0x50,
-       0x84, 0xf1, 0xf9, 0xcc, 0x36, 0xb1, 0x3d, 0x53, 0x88, 0x17, 0xfb, 0xdc,
-       0xe4, 0x8a, 0x5f, 0x25, 0x7e, 0x74, 0xd2, 0x0e, 0x0b, 0x99, 0xbf, 0x79,
-       0xa9, 0xe3, 0xf9, 0xc4, 0xfb, 0x55, 0xd4, 0x9f, 0x0f, 0xa7, 0x12, 0x7e,
-       0xbc, 0x9e, 0xa8, 0x8f, 0x67, 0x95, 0x46, 0x58, 0x15, 0xb9, 0xbc, 0xf2,
-       0x68, 0xa2, 0xc3, 0x91, 0xe9, 0xd5, 0x44, 0x9b, 0xbd, 0x95, 0x3a, 0xee,
-       0x49, 0x7d, 0xdb, 0x39, 0x6f, 0xf8, 0x4a, 0xe2, 0x82, 0x2d, 0xe7, 0x88,
-       0x9f, 0xa1, 0x4e, 0x4f, 0x26, 0xe2, 0x28, 0x62, 0x9e, 0x72, 0x2c, 0x31,
-       0x8e, 0x61, 0xda, 0xe5, 0x3b, 0x7d, 0xc6, 0x89, 0x35, 0xd8, 0x84, 0xcf,
-       0xd2, 0x85, 0x78, 0x8b, 0x7d, 0x94, 0x37, 0xb9, 0x31, 0xe1, 0xb4, 0xb7,
-       0x09, 0x9f, 0xf4, 0x29, 0xc8, 0xcc, 0xdd, 0x84, 0x8f, 0xf9, 0xec, 0x0d,
-       0x5e, 0x9f, 0x0b, 0x53, 0xc2, 0xc9, 0x67, 0x67, 0xfa, 0x54, 0x27, 0x07,
-       0xee, 0x6e, 0xde, 0x84, 0xd3, 0xe9, 0x8f, 0x71, 0x80, 0xb9, 0xf4, 0x63,
-       0xe6, 0x34, 0x44, 0xa6, 0x11, 0x70, 0x8d, 0x42, 0x9c, 0xe4, 0xf3, 0x5a,
-       0x59, 0xef, 0xd1, 0x72, 0xe5, 0x3f, 0xe2, 0x78, 0x1e, 0x61, 0x5b, 0x67,
-       0xd3, 0xdf, 0x61, 0xbb, 0xc2, 0x39, 0xbf, 0xc3, 0x76, 0x7f, 0x85, 0x91,
-       0x49, 0x7d, 0x9c, 0x36, 0x65, 0x5c, 0x1b, 0x7c, 0x28, 0xf6, 0x73, 0x1c,
-       0x0f, 0xf3, 0xbb, 0x03, 0x13, 0x99, 0x9d, 0xfc, 0x7e, 0x0d, 0x87, 0x33,
-       0x12, 0xdb, 0xf3, 0x67, 0x87, 0x64, 0x7d, 0x4b, 0xfc, 0x47, 0x9f, 0x5c,
-       0x97, 0x9b, 0x8e, 0x54, 0x7f, 0x59, 0x7c, 0x1a, 0xed, 0xe8, 0x3f, 0xcc,
-       0x2b, 0xc7, 0x47, 0x61, 0x0b, 0xbb, 0x0e, 0xb8, 0x91, 0xea, 0x25, 0x9f,
-       0xed, 0xad, 0xc4, 0x53, 0xbb, 0x35, 0x3c, 0xb9, 0xfb, 0x5a, 0x6c, 0xd9,
-       0x7d, 0x3d, 0xf6, 0xed, 0xae, 0x46, 0x92, 0xb9, 0xf2, 0x27, 0x4d, 0xb6,
-       0x3d, 0x87, 0x9f, 0x1d, 0xf4, 0x05, 0x2f, 0xbf, 0x5f, 0x0e, 0x8b, 0x9f,
-       0x18, 0xb8, 0xd1, 0xf1, 0x97, 0x16, 0xdc, 0xe0, 0x7c, 0xc7, 0x30, 0x27,
-       0xd3, 0x19, 0xde, 0x90, 0xdd, 0x14, 0x7e, 0x28, 0x3b, 0x1d, 0x5b, 0xfb,
-       0xab, 0xd0, 0xbf, 0xbb, 0x32, 0x5e, 0xc9, 0x7e, 0x56, 0xce, 0xb3, 0x31,
-       0xc4, 0xba, 0x66, 0x63, 0x4f, 0x78, 0x4d, 0xf6, 0x79, 0xb4, 0x65, 0xfd,
-       0xd8, 0xdc, 0x1f, 0x60, 0x5f, 0xb2, 0x86, 0xef, 0x3e, 0xf1, 0x20, 0x6c,
-       0xfb, 0x42, 0xd3, 0x11, 0xc6, 0xb7, 0x1f, 0xa3, 0x9d, 0xcf, 0x92, 0xfd,
-       0x1b, 0xc8, 0xa9, 0x0a, 0xe2, 0xde, 0xa8, 0x8d, 0x53, 0xe1, 0x71, 0xdc,
-       0xc1, 0xf6, 0x76, 0xf6, 0x97, 0x51, 0xa6, 0xe2, 0x78, 0x21, 0xef, 0x2d,
-       0x0d, 0x6f, 0xc4, 0xae, 0x31, 0x59, 0x03, 0x3c, 0x81, 0xa5, 0xe4, 0x2c,
-       0x15, 0x73, 0x7f, 0x56, 0x82, 0x32, 0xcd, 0x7d, 0xbe, 0x59, 0xec, 0x2f,
-       0x4e, 0xfb, 0x13, 0xac, 0x5c, 0x87, 0xb5, 0xce, 0xd9, 0xc2, 0x76, 0xbc,
-       0x94, 0x10, 0x9c, 0x5e, 0x8d, 0x83, 0x89, 0x75, 0xd8, 0x92, 0x92, 0x7d,
-       0xc0, 0xe5, 0xa8, 0xc9, 0xfe, 0x55, 0x78, 0x3d, 0xe3, 0xa9, 0x2b, 0xfb,
-       0x3f, 0xb0, 0x38, 0x9b, 0xa6, 0x5c, 0xc3, 0xe1, 0xb5, 0xd9, 0x7d, 0xe1,
-       0x07, 0xb3, 0xad, 0x98, 0x95, 0x95, 0xf5, 0xb4, 0x36, 0xe2, 0xbb, 0xac,
-       0xa7, 0x4d, 0x60, 0x61, 0xf6, 0x0c, 0x16, 0x65, 0xdf, 0x62, 0x2c, 0x16,
-       0xdc, 0x90, 0x75, 0xb6, 0x5f, 0x31, 0x39, 0x91, 0x7d, 0xc3, 0xbf, 0xc4,
-       0xd6, 0xbd, 0x71, 0xc6, 0xc2, 0x3c, 0x46, 0xd5, 0x6b, 0x07, 0x04, 0x5f,
-       0xc6, 0x3c, 0x4e, 0x2c, 0xe8, 0x4b, 0xdd, 0x43, 0x7b, 0x54, 0xc9, 0xf3,
-       0x25, 0xce, 0xac, 0xa3, 0x2f, 0x77, 0x92, 0x9f, 0x4b, 0xfc, 0xbb, 0x6b,
-       0xf2, 0xbe, 0xf0, 0x3a, 0x89, 0x7d, 0x3a, 0x8e, 0x66, 0x9c, 0xbd, 0x0c,
-       0xdd, 0x6b, 0xdc, 0xc1, 0x67, 0x52, 0xff, 0x2f, 0x91, 0xdc, 0xbb, 0xca,
-       0xde, 0xe9, 0xac, 0x19, 0x29, 0x38, 0x1e, 0x62, 0x5f, 0xa4, 0x91, 0x4b,
-       0xf7, 0xcb, 0x59, 0xce, 0x75, 0x72, 0x96, 0xd3, 0x72, 0x19, 0x6d, 0xf6,
-       0x96, 0x14, 0x1e, 0x2c, 0x45, 0x00, 0xcb, 0x47, 0x0b, 0x10, 0x3b, 0x58,
-       0x8c, 0xdb, 0x77, 0xb7, 0xd3, 0x96, 0x2d, 0xda, 0xaf, 0x61, 0xae, 0x55,
-       0x8a, 0xb1, 0x84, 0xf7, 0x1e, 0xe8, 0x0f, 0xb6, 0x02, 0xa1, 0x13, 0xa7,
-       0x5d, 0xc5, 0xb8, 0x9f, 0xb1, 0x23, 0x9d, 0x5e, 0x8e, 0xd8, 0xfe, 0xe3,
-       0xb0, 0xd2, 0xb4, 0xc9, 0x3d, 0xc4, 0x99, 0xbd, 0x6e, 0xa8, 0xd1, 0x5f,
-       0x61, 0xdf, 0xb0, 0x8a, 0xf2, 0x3d, 0x2f, 0xd8, 0x01, 0x43, 0x31, 0xce,
-       0x85, 0xb2, 0xe4, 0x40, 0x6e, 0x94, 0x26, 0x5b, 0x30, 0x4a, 0xac, 0xf1,
-       0x25, 0x63, 0xc8, 0x64, 0xda, 0x90, 0x26, 0x96, 0xa4, 0xc9, 0x9b, 0x4a,
-       0x92, 0x26, 0x63, 0x79, 0x1d, 0x76, 0xd1, 0x5f, 0x0a, 0x98, 0xcb, 0x6f,
-       0xcb, 0xdc, 0x0a, 0x6b, 0xf8, 0x4e, 0x6c, 0x1f, 0x6e, 0xe3, 0x87, 0xfc,
-       0x71, 0xf8, 0xdb, 0x58, 0x38, 0x7a, 0x02, 0x3d, 0x99, 0x38, 0xed, 0xf1,
-       0x63, 0x6c, 0x4f, 0x1f, 0xc3, 0x53, 0x7d, 0x5d, 0xcc, 0x11, 0x8e, 0xe1,
-       0x49, 0x5e, 0xf7, 0xf5, 0x19, 0x9d, 0x01, 0xf5, 0x18, 0x52, 0xe9, 0x4d,
-       0xb8, 0xb3, 0x5f, 0x61, 0x0e, 0xb7, 0x09, 0x77, 0xec, 0xa7, 0x2d, 0x3e,
-       0xd1, 0x81, 0xd6, 0xd1, 0xd7, 0x90, 0xc8, 0xbc, 0xc4, 0xfc, 0x6a, 0x23,
-       0x7a, 0x52, 0x1b, 0xc8, 0xbd, 0x9e, 0x67, 0x3b, 0x47, 0xe8, 0xe7, 0x9d,
-       0x1c, 0xe3, 0xe3, 0xfc, 0x5c, 0xc2, 0x70, 0x4d, 0x57, 0xf2, 0x58, 0x4d,
-       0xbf, 0x4f, 0x49, 0xee, 0xb0, 0x8e, 0x38, 0x71, 0x6f, 0x29, 0x8a, 0x45,
-       0xbf, 0xf9, 0x35, 0x69, 0x99, 0x0b, 0xb1, 0x7d, 0x59, 0x9b, 0x76, 0xa3,
-       0x28, 0x29, 0xeb, 0xd1, 0xe3, 0xc1, 0x22, 0x72, 0x00, 0x6f, 0x52, 0x74,
-       0xd8, 0x6e, 0x77, 0xa7, 0x04, 0x4b, 0x72, 0xdc, 0xfc, 0xe5, 0xcc, 0xaf,
-       0xb0, 0x75, 0x70, 0x1a, 0x16, 0xf5, 0x55, 0x23, 0xee, 0xb7, 0xed, 0xe7,
-       0xe8, 0x6b, 0x09, 0xe6, 0x58, 0xbb, 0xfa, 0x63, 0xc4, 0x94, 0x12, 0xe4,
-       0x72, 0x3d, 0xd1, 0x4d, 0xd0, 0xd4, 0xaf, 0xd8, 0x23, 0x99, 0xc5, 0x79,
-       0x13, 0xee, 0x3a, 0x7e, 0x43, 0x29, 0xce, 0x97, 0xe4, 0xd6, 0xc5, 0xff,
-       0xfc, 0x12, 0xb7, 0xf9, 0xd7, 0x95, 0xbf, 0xff, 0xdf, 0x58, 0x7e, 0x62,
-       0xca, 0xd9, 0xb5, 0xfc, 0x7b, 0x39, 0x32, 0xd6, 0xeb, 0xe5, 0xdc, 0x9a,
-       0x25, 0x7c, 0x49, 0xce, 0xdc, 0x1e, 0x4f, 0x14, 0x30, 0x4e, 0xaa, 0x0b,
-       0x3c, 0x50, 0xfd, 0x1e, 0x14, 0x32, 0x9e, 0x55, 0x61, 0xb3, 0xdf, 0xc6,
-       0x62, 0xb3, 0x00, 0x87, 0x1b, 0x62, 0x72, 0xce, 0xa2, 0xdd, 0xe3, 0xf0,
-       0xd1, 0xd5, 0xf7, 0xfc, 0xe1, 0xba, 0xf5, 0x26, 0x72, 0x37, 0x39, 0x5f,
-       0xd0, 0x86, 0x53, 0x15, 0xf2, 0xae, 0xd0, 0x26, 0xe7, 0xdc, 0x59, 0x51,
-       0xad, 0xac, 0xa3, 0xe9, 0x38, 0x61, 0xd4, 0xeb, 0x95, 0x2a, 0xe3, 0xb9,
-       0xf2, 0xae, 0x6d, 0xf9, 0xa3, 0x8c, 0xf5, 0x72, 0x86, 0xe2, 0x5f, 0xda,
-       0xa7, 0x58, 0x83, 0xed, 0x4f, 0x34, 0x63, 0x62, 0x95, 0xc4, 0xff, 0xff,
-       0xe6, 0xcb, 0x73, 0xba, 0x6d, 0xa9, 0x1f, 0x96, 0xca, 0xb9, 0x24, 0x69,
-       0x7b, 0x3b, 0xf3, 0x27, 0x8f, 0x11, 0xc6, 0xbb, 0xc2, 0xd2, 0x9c, 0xfd,
-       0xa4, 0x1c, 0xa7, 0x28, 0x34, 0xce, 0x4f, 0xbe, 0x3b, 0xf2, 0xd7, 0xa5,
-       0xc2, 0x0f, 0xb7, 0xa5, 0x36, 0x91, 0x9b, 0x8b, 0x3c, 0xbf, 0xb7, 0xd7,
-       0xf8, 0x2b, 0x59, 0xf6, 0xee, 0xc9, 0xf6, 0xc4, 0x16, 0xe4, 0x4c, 0x8e,
-       0xdc, 0x93, 0x3a, 0xa2, 0xb3, 0xa9, 0x75, 0x5c, 0xcc, 0x85, 0x6f, 0xc0,
-       0xa3, 0xf4, 0xc1, 0x99, 0xc6, 0xeb, 0x76, 0x97, 0x9c, 0x9f, 0xa9, 0xd5,
-       0xa6, 0xf4, 0xf5, 0x0b, 0x47, 0x96, 0x42, 0xca, 0xd2, 0x9f, 0x92, 0xb3,
-       0xa8, 0x9f, 0xd9, 0xb5, 0x55, 0xf2, 0xfc, 0xc2, 0x64, 0xfb, 0x35, 0xce,
-       0xd9, 0xbe, 0x7d, 0xa9, 0xbc, 0xdc, 0xb2, 0xde, 0xea, 0xcf, 0xf7, 0x55,
-       0x77, 0x79, 0x3c, 0x22, 0x5b, 0xbc, 0xf4, 0x4a, 0x99, 0xe1, 0xcb, 0x9f,
-       0x59, 0x9d, 0xe1, 0xd4, 0xc9, 0xf7, 0x29, 0x32, 0x6e, 0x62, 0x9e, 0x7a,
-       0xf5, 0x18, 0xb5, 0x29, 0x63, 0x92, 0x3a, 0x32, 0x2e, 0x6d, 0xd2, 0x0e,
-       0x4a, 0xcb, 0x50, 0x2c, 0x75, 0x84, 0xbb, 0x6a, 0x0e, 0x07, 0x2f, 0x17,
-       0x5e, 0x2e, 0xb6, 0x51, 0x66, 0xdb, 0xef, 0x39, 0x31, 0x53, 0xda, 0xe1,
-       0x38, 0xc6, 0x56, 0xd1, 0xce, 0xed, 0x2e, 0xe2, 0xa7, 0xfd, 0x5e, 0x73,
-       0x00, 0x5b, 0x13, 0xa2, 0x6b, 0x23, 0x70, 0x88, 0xd8, 0xb1, 0xd9, 0xe1,
-       0x1b, 0x1e, 0x74, 0xa7, 0xf3, 0xfb, 0xa3, 0x85, 0x72, 0xf6, 0x36, 0x20,
-       0x3a, 0xef, 0x36, 0xc9, 0xb3, 0xb4, 0x85, 0xba, 0x9b, 0x5c, 0x69, 0x3d,
-       0xfe, 0x99, 0xf3, 0x2b, 0xe7, 0x8f, 0x73, 0x7b, 0x95, 0x71, 0xda, 0x51,
-       0x2e, 0x5e, 0x81, 0xf1, 0x9d, 0x3c, 0x69, 0xf2, 0x5c, 0x66, 0x77, 0xe6,
-       0x9f, 0xed, 0x71, 0xe7, 0x5c, 0xe6, 0xe5, 0x77, 0x3a, 0xd2, 0x9a, 0x6d,
-       0x1f, 0xe0, 0xb3, 0xcb, 0x67, 0x34, 0x19, 0xd3, 0x0d, 0x39, 0xcb, 0xf9,
-       0x4f, 0x9c, 0xbb, 0xa9, 0x65, 0xc7, 0x2b, 0x72, 0x67, 0x96, 0x63, 0xea,
-       0x42, 0x23, 0x8f, 0xab, 0x41, 0xcb, 0x72, 0x70, 0xf5, 0x0e, 0x67, 0x0f,
-       0x3e, 0x8d, 0x60, 0x6b, 0x1b, 0x2c, 0xbb, 0xd8, 0xc8, 0xe3, 0x80, 0x61,
-       0xce, 0x51, 0xba, 0x30, 0x3b, 0x5c, 0x2c, 0x1c, 0x3b, 0xe8, 0x8e, 0x06,
-       0xb5, 0x0f, 0x10, 0xaa, 0x3b, 0xe6, 0xec, 0x95, 0x0a, 0x36, 0x18, 0x58,
-       0x9f, 0x21, 0xdf, 0x1e, 0x93, 0x77, 0x1d, 0xe5, 0xda, 0x69, 0x9f, 0xd7,
-       0x82, 0xa5, 0xed, 0xc4, 0x52, 0xeb, 0xcf, 0x3d, 0x4e, 0x7b, 0xc1, 0xf6,
-       0x61, 0x25, 0xd8, 0xba, 0x51, 0xc9, 0xb7, 0xe7, 0xfb, 0x92, 0xf6, 0xea,
-       0x58, 0xbf, 0x7a, 0xf2, 0xfd, 0x42, 0x83, 0x6d, 0x5c, 0xbd, 0x9f, 0x3c,
-       0x3d, 0x2e, 0x7b, 0x51, 0x87, 0x27, 0x39, 0xe1, 0xb1, 0x3f, 0xd8, 0x8b,
-       0xfa, 0xd2, 0x3e, 0x63, 0xec, 0xb3, 0xb5, 0x58, 0x89, 0x91, 0x31, 0x74,
-       0xa1, 0x30, 0x1c, 0xaa, 0x7b, 0x19, 0xd0, 0xdd, 0xd1, 0x50, 0x60, 0xd8,
-       0xd9, 0xd3, 0x35, 0xbd, 0x8b, 0x9c, 0xfa, 0xd5, 0xe4, 0xc5, 0x7f, 0x5c,
-       0x27, 0x25, 0x86, 0xd1, 0x56, 0xaf, 0xc4, 0xe6, 0x17, 0xb3, 0x9d, 0xba,
-       0x30, 0xf4, 0x82, 0x68, 0x5e, 0x47, 0xa1, 0xba, 0x0f, 0x38, 0x9f, 0x47,
-       0x9b, 0x43, 0x81, 0x21, 0xe7, 0x8c, 0xa7, 0xe8, 0xc5, 0xf4, 0xe6, 0xe6,
-       0x5e, 0x17, 0xbe, 0xcd, 0x7c, 0x32, 0x8e, 0x91, 0x84, 0x97, 0x63, 0xa9,
-       0xd7, 0xb6, 0xa3, 0x82, 0x36, 0x8e, 0xd8, 0xe6, 0x06, 0xe2, 0x77, 0x02,
-       0x31, 0xd7, 0x8d, 0xe5, 0x88, 0x93, 0x40, 0xbb, 0x8c, 0x38, 0x39, 0x51,
-       0x7d, 0xdd, 0x0e, 0xda, 0x6f, 0xda, 0x1f, 0x0c, 0x58, 0x88, 0xe3, 0xc5,
-       0xc4, 0xc2, 0xff, 0xc7, 0x05, 0xcb, 0x2c, 0x81, 0xbc, 0x5f, 0x90, 0xbe,
-       0x67, 0x59, 0x28, 0xa8, 0xbf, 0x32, 0xb9, 0x27, 0xdd, 0x9d, 0xf8, 0xad,
-       0xbc, 0xc7, 0xc4, 0x7a, 0x7f, 0xac, 0x8c, 0xf4, 0xed, 0xc5, 0xa1, 0xbe,
-       0x3e, 0x6c, 0x79, 0x82, 0x32, 0x1a, 0x36, 0x16, 0x9a, 0x5d, 0xcc, 0xa5,
-       0x7d, 0x58, 0xa7, 0xcd, 0x8e, 0xa8, 0x2c, 0x37, 0x94, 0xce, 0xad, 0x3b,
-       0x6e, 0x75, 0xf6, 0xbc, 0x7b, 0x98, 0xa3, 0x38, 0xf1, 0x53, 0xf3, 0x46,
-       0x63, 0xca, 0xce, 0x4c, 0x8b, 0xb2, 0x23, 0x2d, 0x6d, 0x75, 0x2a, 0x3d,
-       0x99, 0xbf, 0xa5, 0x4f, 0x58, 0x38, 0x6d, 0xca, 0xbb, 0x39, 0xd2, 0xae,
-       0x85, 0xe1, 0xe6, 0x7f, 0xcd, 0x3b, 0x3a, 0xa2, 0xd3, 0x4e, 0x6c, 0x1e,
-       0x7c, 0x1c, 0xdd, 0x83, 0xa7, 0x9c, 0x33, 0x46, 0x1e, 0xc3, 0x6b, 0x5d,
-       0x1f, 0x0d, 0x1e, 0xb1, 0x90, 0x2d, 0x97, 0xf3, 0xf9, 0x55, 0xd1, 0x13,
-       0xd8, 0xa9, 0xc9, 0xbb, 0x27, 0x3d, 0xe4, 0x11, 0xb2, 0x6f, 0xbb, 0x1a,
-       0x5f, 0xef, 0x95, 0x39, 0x2c, 0xb3, 0x0a, 0xa3, 0xc1, 0xd8, 0x3a, 0x67,
-       0x0e, 0x1b, 0x70, 0x32, 0xfb, 0x38, 0xde, 0xdb, 0xd3, 0x05, 0x35, 0x1c,
-       0x0c, 0xdc, 0x06, 0xbb, 0xeb, 0xb8, 0x19, 0xb3, 0x3c, 0x08, 0x1e, 0x76,
-       0xa9, 0xc0, 0x0b, 0x7b, 0xe0, 0x9d, 0xc1, 0xf9, 0x9f, 0xcf, 0x18, 0x5d,
-       0x6e, 0xd8, 0x0b, 0xfe, 0xb1, 0x29, 0xd8, 0x63, 0xb8, 0xac, 0xbf, 0x99,
-       0x8e, 0x60, 0x5f, 0x44, 0x35, 0xda, 0xef, 0x52, 0xa1, 0xf8, 0xa2, 0xf2,
-       0x5e, 0x69, 0x17, 0xee, 0x6c, 0xf4, 0x59, 0xa5, 0xd1, 0x60, 0xdf, 0x29,
-       0x25, 0x58, 0x67, 0xa9, 0x6d, 0x9c, 0xe7, 0x3a, 0xbc, 0x42, 0x0e, 0xd2,
-       0xca, 0xd8, 0xbb, 0x34, 0xa9, 0x3b, 0xeb, 0x4c, 0xaa, 0x51, 0x13, 0x29,
-       0x52, 0x34, 0xdc, 0x96, 0x05, 0x8e, 0xa6, 0x57, 0xe3, 0x9d, 0x3d, 0x26,
-       0xf3, 0x54, 0x9d, 0xb8, 0xf5, 0xbd, 0x32, 0xc1, 0x80, 0x0e, 0xd3, 0xaa,
-       0x57, 0x19, 0xfb, 0x3d, 0x2a, 0x16, 0xce, 0x8c, 0x86, 0xc6, 0x17, 0xb8,
-       0xdc, 0x88, 0x64, 0x65, 0xfd, 0x53, 0x97, 0xb3, 0xc9, 0xb8, 0x2b, 0xe9,
-       0x25, 0xff, 0xac, 0xc6, 0x6f, 0xc8, 0x83, 0x7f, 0x4d, 0xbe, 0x3b, 0xc1,
-       0x78, 0x3e, 0x91, 0x29, 0x66, 0xbe, 0xe8, 0x91, 0x1c, 0x78, 0xdc, 0xc3,
-       0xb9, 0x28, 0x6b, 0xf4, 0xe3, 0xdc, 0xb0, 0x17, 0x77, 0xec, 0x09, 0xee,
-       0x9b, 0x50, 0xab, 0xf0, 0xc9, 0x70, 0x31, 0x96, 0x0f, 0x78, 0x29, 0x9b,
-       0x8d, 0x5d, 0xc4, 0xff, 0x8f, 0xf8, 0xac, 0x65, 0x0f, 0x94, 0xcc, 0xdc,
-       0x59, 0xe4, 0xec, 0x06, 0xeb, 0x97, 0x60, 0xd9, 0x80, 0xf0, 0x34, 0x15,
-       0x1f, 0x0e, 0x2b, 0xf8, 0x20, 0x6d, 0x62, 0x21, 0xfb, 0xdb, 0x9c, 0x7a,
-       0xc1, 0xf6, 0xd2, 0xcf, 0xd7, 0x64, 0x4c, 0x3c, 0x98, 0xd6, 0x19, 0x53,
-       0xde, 0xb6, 0x5d, 0x46, 0x23, 0xde, 0xde, 0x6d, 0x9c, 0x78, 0xd7, 0x15,
-       0x1a, 0x9f, 0xeb, 0x6a, 0xc4, 0x5b, 0x07, 0x1b, 0xf1, 0xb3, 0xfe, 0x05,
-       0xb8, 0xb9, 0x31, 0x86, 0xf3, 0x73, 0x1b, 0xf1, 0xe6, 0x7e, 0x1d, 0x3b,
-       0x52, 0xcd, 0xd0, 0x47, 0xc7, 0xc9, 0x4f, 0x23, 0xa8, 0x67, 0x4e, 0x65,
-       0xf4, 0xdb, 0x5d, 0x25, 0xd1, 0x2e, 0xec, 0x34, 0xa3, 0x98, 0xb3, 0x5f,
-       0xf4, 0x60, 0xdb, 0xeb, 0xe6, 0x46, 0xf1, 0x72, 0x9f, 0x41, 0x3f, 0x8d,
-       0x52, 0x0f, 0x3a, 0x9e, 0x24, 0x36, 0x87, 0x9e, 0x30, 0x2e, 0x1c, 0xe0,
-       0xef, 0x05, 0x07, 0x9a, 0xd1, 0xce, 0xfe, 0x13, 0xa9, 0x18, 0xf6, 0x8d,
-       0x36, 0x70, 0xcc, 0x26, 0xc7, 0x5f, 0x63, 0xfd, 0x46, 0x69, 0x41, 0xdf,
-       0x68, 0x2b, 0xf9, 0x66, 0x17, 0x79, 0x66, 0x2b, 0x7a, 0xd9, 0xd6, 0xd6,
-       0x94, 0x89, 0x65, 0xc9, 0x56, 0x3c, 0x9d, 0x90, 0x33, 0x8d, 0x46, 0x64,
-       0x9e, 0x22, 0xef, 0x7d, 0xb5, 0xe2, 0x10, 0x75, 0xb2, 0x70, 0x60, 0x39,
-       0xed, 0xd0, 0x8b, 0x45, 0x7b, 0x74, 0x3c, 0x95, 0xba, 0x13, 0xef, 0x8c,
-       0x98, 0x68, 0x4b, 0x8a, 0xbe, 0xe5, 0x5c, 0x4d, 0x1c, 0xc7, 0x19, 0x5b,
-       0x7e, 0x33, 0x10, 0xfb, 0x1b, 0x4e, 0xf3, 0x49, 0x15, 0xc1, 0xce, 0x19,
-       0x9c, 0xf0, 0x9b, 0x1a, 0xe5, 0x6c, 0x94, 0x8b, 0xa8, 0x16, 0xb4, 0xca,
-       0x55, 0x4b, 0xe7, 0x7d, 0xcb, 0xad, 0x6e, 0xc2, 0x37, 0x06, 0xdc, 0xe4,
-       0xf4, 0x2a, 0x73, 0x11, 0xab, 0x83, 0xb6, 0x61, 0x95, 0xa9, 0xb9, 0x79,
-       0xdb, 0x2e, 0xef, 0xa1, 0x19, 0x2e, 0xec, 0x32, 0x6b, 0xda, 0x4a, 0x58,
-       0x6f, 0x69, 0x38, 0x18, 0x2b, 0x52, 0x9b, 0x99, 0x27, 0x3e, 0x8e, 0x75,
-       0x7b, 0x1e, 0xc7, 0x1a, 0x7e, 0x3a, 0xf6, 0xd8, 0x5d, 0x4b, 0x4c, 0x05,
-       0x2f, 0x1a, 0x76, 0x57, 0x97, 0x69, 0x70, 0x6e, 0x65, 0x5e, 0x1f, 0x47,
-       0xe7, 0xa1, 0xc7, 0xf1, 0x28, 0xed, 0xab, 0x92, 0x7e, 0xbc, 0x32, 0x69,
-       0x77, 0xdd, 0xdc, 0x58, 0x87, 0x4f, 0x9d, 0xfc, 0x43, 0xec, 0x75, 0xab,
-       0x93, 0x13, 0xa7, 0x55, 0xb9, 0xde, 0xed, 0x5c, 0x5b, 0xea, 0x2b, 0x65,
-       0xf9, 0xd8, 0xf2, 0x5b, 0xb6, 0xfb, 0xbb, 0x3d, 0xe5, 0x78, 0xa2, 0x52,
-       0xe2, 0x87, 0xac, 0xed, 0x42, 0x31, 0xe6, 0x32, 0xcf, 0x7a, 0xe2, 0x38,
-       0xb6, 0x93, 0xb7, 0xf9, 0xc3, 0x92, 0x03, 0xd7, 0x9b, 0x5b, 0xd4, 0x5b,
-       0x89, 0xed, 0x0a, 0x76, 0xd6, 0xf6, 0xa1, 0x97, 0xbe, 0xba, 0xab, 0x36,
-       0x18, 0xef, 0x45, 0xd4, 0xde, 0x35, 0xbd, 0xe7, 0xdf, 0xf0, 0x5e, 0x96,
-       0xbc, 0xb7, 0x9d, 0x7f, 0x37, 0xeb, 0x71, 0x74, 0xed, 0x91, 0xf9, 0x7f,
-       0x1c, 0x8f, 0x51, 0xfe, 0xce, 0x81, 0xc7, 0xf1, 0x4d, 0xda, 0x4e, 0x45,
-       0xd3, 0xd1, 0xc7, 0x2a, 0x30, 0xbb, 0xaf, 0x1c, 0xe3, 0x0f, 0x57, 0xca,
-       0x39, 0x28, 0x62, 0x62, 0xaf, 0xf2, 0x38, 0xd6, 0x0f, 0x1d, 0xa0, 0x2f,
-       0x3a, 0xfe, 0x47, 0x2c, 0xce, 0xc7, 0xab, 0x00, 0xd6, 0x11, 0x93, 0x73,
-       0xb8, 0xee, 0xc7, 0x9a, 0xc4, 0x61, 0xc7, 0xf7, 0x0b, 0xa2, 0xab, 0xe8,
-       0xf7, 0x6d, 0xf4, 0xfb, 0xe5, 0xf4, 0xfb, 0x56, 0xfa, 0x7d, 0x0b, 0xfd,
-       0x3e, 0x46, 0xbf, 0x8f, 0xd2, 0xef, 0x23, 0xf4, 0xfb, 0x66, 0xfa, 0xbd,
-       0x49, 0xbf, 0x87, 0x72, 0xa2, 0xf9, 0x38, 0x3c, 0xfd, 0x5e, 0xda, 0x50,
-       0xee, 0x3d, 0x99, 0x83, 0xc4, 0x9f, 0xd3, 0xe6, 0x9c, 0xc0, 0x62, 0xc6,
-       0xd5, 0x61, 0x62, 0x44, 0x7a, 0xe4, 0xaf, 0x9c, 0x77, 0x2a, 0xd2, 0xc4,
-       0xfd, 0x57, 0xa8, 0x8f, 0xa5, 0xe1, 0x1a, 0xf3, 0x69, 0xc6, 0xb0, 0x5f,
-       0x18, 0xf5, 0x3d, 0x7e, 0x96, 0xf9, 0x41, 0xaa, 0xbe, 0x6f, 0x1a, 0x0c,
-       0xab, 0x51, 0xdd, 0x0a, 0xac, 0xf4, 0x73, 0xcc, 0x72, 0xde, 0x6e, 0x25,
-       0x1e, 0x1b, 0x6c, 0xc3, 0x7f, 0x19, 0xd4, 0xa8, 0x8b, 0x9a, 0xf1, 0x5b,
-       0x5d, 0xf8, 0x71, 0x00, 0x2e, 0xff, 0x35, 0xc0, 0xe7, 0x55, 0x98, 0x73,
-       0x58, 0xde, 0xef, 0x4b, 0x57, 0xb9, 0x1a, 0x66, 0x42, 0x6c, 0x04, 0x44,
-       0x6a, 0x17, 0x33, 0xc1, 0x39, 0xce, 0x3b, 0x40, 0xb1, 0x55, 0x82, 0xe9,
-       0x45, 0xd8, 0x5a, 0xe7, 0xe0, 0xec, 0xb3, 0x72, 0x6e, 0xb0, 0x8a, 0x78,
-       0xe4, 0x8b, 0xb6, 0x62, 0x5b, 0xaf, 0x75, 0x7f, 0x15, 0x96, 0xa3, 0xa7,
-       0x37, 0xa7, 0x83, 0x87, 0xc3, 0x1a, 0xa9, 0x42, 0x48, 0x9f, 0xa3, 0xc0,
-       0xdd, 0xd1, 0x1c, 0xc1, 0x83, 0x99, 0x04, 0xfa, 0x38, 0xc6, 0x0d, 0xf4,
-       0xb3, 0x75, 0x7f, 0xfa, 0xdd, 0x4e, 0x7c, 0x33, 0xa1, 0xd3, 0xfe, 0x2f,
-       0xda, 0xe9, 0x8a, 0x39, 0x7d, 0x55, 0x30, 0x3a, 0x57, 0xa8, 0xf3, 0x98,
-       0xd3, 0x06, 0x8f, 0xc8, 0xc2, 0xf7, 0xf4, 0xa8, 0xd7, 0xaa, 0x20, 0x36,
-       0xcf, 0x1a, 0x80, 0x32, 0x9c, 0x94, 0xf7, 0x20, 0xba, 0xf0, 0xff, 0x99,
-       0x6d, 0x8e, 0xfd, 0x8c, 0xbb, 0x34, 0xcc, 0x4c, 0xca, 0x7d, 0x7b, 0xc1,
-       0x67, 0x4d, 0xc1, 0x3a, 0xdd, 0xb5, 0x81, 0xf7, 0xab, 0xf1, 0x23, 0xc6,
-       0xd9, 0xc0, 0xc0, 0x02, 0xa8, 0x4d, 0x5e, 0xdc, 0xdd, 0x50, 0x8a, 0xf8,
-       0x4a, 0xe1, 0xa1, 0x92, 0xef, 0xbb, 0xa9, 0xcf, 0xff, 0x17, 0x0f, 0x99,
-       0xcf, 0x61, 0xc2, 0x9f, 0x70, 0xf6, 0xdd, 0xd7, 0x99, 0x77, 0x28, 0x16,
-       0xaf, 0xb7, 0xa5, 0x2c, 0x6c, 0x30, 0x99, 0x0b, 0xdd, 0x53, 0xc9, 0x9c,
-       0x44, 0xca, 0x4b, 0xbb, 0x5b, 0x9d, 0xf6, 0x0e, 0xa6, 0xe4, 0x7a, 0xf7,
-       0x64, 0x9f, 0x77, 0x01, 0x95, 0x5e, 0xe2, 0xad, 0x82, 0x33, 0xb5, 0x09,
-       0xfa, 0x34, 0x7e, 0xec, 0x46, 0x4d, 0xba, 0x5f, 0x75, 0xfd, 0xf8, 0x1a,
-       0xcc, 0x31, 0x7f, 0xaf, 0xca, 0x7c, 0xc4, 0xf0, 0x54, 0x48, 0x41, 0xa5,
-       0x61, 0x9c, 0xff, 0x19, 0x7d, 0x6b, 0xc2, 0x95, 0xc0, 0x53, 0x63, 0xa7,
-       0xec, 0xf1, 0x6b, 0xfc, 0x9c, 0x73, 0xa9, 0xdb, 0x86, 0x0f, 0x06, 0x65,
-       0xce, 0x64, 0x9d, 0x9f, 0xb1, 0x5d, 0xd5, 0x51, 0xca, 0x7b, 0xa7, 0x87,
-       0x4d, 0xe6, 0x3a, 0x6d, 0xf8, 0xc7, 0xc1, 0x95, 0xf8, 0xfd, 0x60, 0x4d,
-       0xdb, 0x7f, 0x52, 0x6d, 0x7b, 0x69, 0xf8, 0x6b, 0xf8, 0x65, 0xa5, 0x86,
-       0xa7, 0x69, 0x43, 0xbf, 0x4f, 0x58, 0x4b, 0xaf, 0x21, 0x16, 0xfc, 0xef,
-       0x44, 0xf0, 0xc2, 0x49, 0x67, 0x5f, 0xa9, 0xde, 0xfc, 0xd0, 0x15, 0x8c,
-       0x9f, 0x51, 0x83, 0xd6, 0x36, 0x65, 0x39, 0xec, 0x4c, 0x2b, 0xce, 0x67,
-       0xa6, 0xda, 0x42, 0x97, 0x8d, 0x2a, 0xb1, 0x03, 0xb1, 0x07, 0xda, 0x22,
-       0x73, 0xb9, 0x9f, 0x92, 0x47, 0x77, 0x7f, 0x95, 0xf6, 0x98, 0xa2, 0x3d,
-       0xa6, 0x68, 0x8f, 0xc4, 0xa4, 0xe7, 0x89, 0x55, 0x3f, 0x48, 0xd1, 0x1e,
-       0xe9, 0x3f, 0xcf, 0xd1, 0x7f, 0x72, 0x5c, 0xb9, 0xdd, 0x39, 0xb7, 0xf6,
-       0x06, 0x63, 0x62, 0xe2, 0x09, 0x79, 0x27, 0xad, 0x66, 0x43, 0x16, 0xc1,
-       0xf6, 0x5e, 0xe5, 0xb3, 0x72, 0x39, 0x67, 0xfb, 0xed, 0x90, 0xf8, 0x40,
-       0x6e, 0x3f, 0xe0, 0xc8, 0xc8, 0x63, 0x65, 0xf2, 0x7e, 0xd4, 0xc1, 0xbd,
-       0xff, 0x92, 0xce, 0xfe, 0x3b, 0xe5, 0x10, 0x7d, 0xfd, 0x5b, 0xc7, 0x2e,
-       0xba, 0xfc, 0x1b, 0xfb, 0x97, 0x55, 0x32, 0xfe, 0x55, 0xf8, 0x62, 0xb0,
-       0x05, 0xe7, 0x19, 0x7f, 0xdf, 0x6a, 0x1a, 0xef, 0x0c, 0x20, 0xd8, 0x51,
-       0xae, 0x46, 0x91, 0xcd, 0xb4, 0xe0, 0xb3, 0x44, 0x14, 0x07, 0x12, 0x35,
-       0xed, 0x35, 0xae, 0xb3, 0x6a, 0x7c, 0x86, 0x58, 0x54, 0x0c, 0x9f, 0x92,
-       0x5f, 0x2e, 0xac, 0x8d, 0x60, 0x88, 0x6d, 0x7a, 0xa2, 0x1a, 0x46, 0x9a,
-       0xc5, 0x56, 0x73, 0xef, 0x4e, 0xfd, 0xa9, 0xbf, 0x2e, 0xda, 0xe3, 0x7b,
-       0x4d, 0x17, 0xed, 0x71, 0xcd, 0x6b, 0x69, 0xf4, 0xe1, 0xd2, 0x3d, 0xf2,
-       0x6e, 0xa9, 0xf8, 0xb3, 0x82, 0x1f, 0x84, 0xc7, 0xdb, 0xa6, 0x21, 0xf8,
-       0xec, 0x7d, 0xb4, 0xf5, 0x93, 0x49, 0x59, 0x53, 0x6c, 0xc1, 0xfb, 0x2c,
-       0xef, 0xa6, 0x5f, 0x9c, 0xcc, 0xb8, 0xdd, 0xbf, 0x4c, 0x2a, 0xcc, 0x4b,
-       0x97, 0xe3, 0x97, 0x99, 0x37, 0xd5, 0x8f, 0x35, 0x13, 0x67, 0xb2, 0x2b,
-       0x69, 0x4f, 0x92, 0xff, 0xc7, 0x98, 0xff, 0x07, 0x3b, 0x8f, 0x60, 0x25,
-       0xca, 0x0f, 0xad, 0x42, 0xd9, 0x1e, 0xe2, 0x67, 0x88, 0xf9, 0x3f, 0xaf,
-       0x67, 0xec, 0x91, 0xf7, 0x0d, 0xca, 0xed, 0xed, 0xab, 0x44, 0x2f, 0x82,
-       0x27, 0x7f, 0x57, 0x8e, 0xb2, 0x55, 0xc0, 0x21, 0xa9, 0x67, 0xb0, 0xde,
-       0x4a, 0x54, 0xee, 0xa9, 0x89, 0x2c, 0x46, 0xcd, 0xf9, 0xdb, 0xd4, 0x95,
-       0xb8, 0xfe, 0xd0, 0x3f, 0x73, 0x0e, 0xa4, 0x6c, 0x35, 0x9e, 0xa0, 0xdd,
-       0x16, 0x92, 0x13, 0xb6, 0x24, 0x7f, 0x6d, 0xcf, 0xa4, 0x2f, 0x7e, 0xf6,
-       0x15, 0x60, 0x5d, 0xd6, 0x60, 0xbc, 0x2b, 0x46, 0x7c, 0xe8, 0x29, 0xbb,
-       0x3c, 0xea, 0xc6, 0x9a, 0x6c, 0x03, 0x16, 0x0f, 0xd8, 0xf6, 0xb9, 0xb9,
-       0x31, 0xf8, 0xa2, 0x3e, 0x62, 0x98, 0x0f, 0x8f, 0x26, 0x4b, 0xf8, 0x2d,
-       0xc7, 0x4f, 0x42, 0xe3, 0xb3, 0x55, 0x63, 0xc3, 0x0c, 0x97, 0xd1, 0x9e,
-       0x55, 0x24, 0xee, 0xfb, 0xf0, 0x08, 0xe3, 0xf3, 0xd2, 0x64, 0x00, 0xf1,
-       0xac, 0x6d, 0xbf, 0xd9, 0xec, 0xc7, 0xc3, 0xac, 0xdf, 0x9a, 0xec, 0x41,
-       0x37, 0xed, 0x22, 0x7e, 0xc8, 0xd0, 0x35, 0xc6, 0xfb, 0x75, 0x59, 0x2f,
-       0x63, 0x58, 0x25, 0x6e, 0x63, 0x2c, 0x7a, 0x54, 0xce, 0xca, 0xd0, 0x07,
-       0xdf, 0x31, 0xad, 0x1b, 0x5c, 0x30, 0xd0, 0x99, 0xf5, 0x63, 0x79, 0x32,
-       0x78, 0x41, 0xde, 0xcd, 0xfb, 0xcc, 0xac, 0xc3, 0xc6, 0x6c, 0x00, 0xb7,
-       0x27, 0x8f, 0x3e, 0x3a, 0x13, 0xd6, 0x7f, 0x9e, 0x81, 0x06, 0x7c, 0x3d,
-       0x5b, 0xcd, 0xf6, 0x83, 0x1b, 0xde, 0x50, 0xaa, 0xf1, 0x8d, 0x43, 0x26,
-       0xdb, 0x57, 0xb1, 0x8c, 0xed, 0x2c, 0x49, 0x5e, 0x8f, 0x47, 0x0e, 0x35,
-       0xe3, 0xc1, 0x6c, 0x13, 0x16, 0x31, 0x3e, 0x75, 0x30, 0x37, 0xc4, 0xbd,
-       0xc0, 0xed, 0x03, 0xa2, 0x7b, 0x28, 0x6f, 0x36, 0x8f, 0x33, 0x5f, 0x36,
-       0x41, 0x43, 0x74, 0xf6, 0x92, 0x77, 0xd2, 0x56, 0x6f, 0xdf, 0xdf, 0x84,
-       0xa5, 0x03, 0x2a, 0x6a, 0xc2, 0x85, 0x88, 0xb7, 0x29, 0x68, 0x19, 0x90,
-       0x38, 0x2b, 0xdc, 0xc6, 0x64, 0x5c, 0x0d, 0xb1, 0x0f, 0x93, 0x71, 0x35,
-       0x77, 0xbf, 0x3b, 0x25, 0x6b, 0x0b, 0x6f, 0x93, 0x2f, 0x85, 0xd1, 0xe2,
-       0xc4, 0x68, 0x59, 0x13, 0xb7, 0xe0, 0x66, 0xec, 0x0e, 0xd3, 0xc6, 0x17,
-       0x34, 0x4a, 0xac, 0xd6, 0x9d, 0xbd, 0xa9, 0xb1, 0x7e, 0xa3, 0xe3, 0x82,
-       0x42, 0xfb, 0xda, 0x2f, 0x31, 0xd1, 0x8f, 0x8d, 0xc9, 0x28, 0xde, 0xe9,
-       0x63, 0xbc, 0xb9, 0x31, 0xb6, 0xb4, 0x04, 0x86, 0xf9, 0x08, 0x42, 0xd6,
-       0x49, 0xc6, 0xf6, 0xf3, 0xe9, 0x4a, 0x2c, 0xde, 0x23, 0x65, 0x1a, 0xf1,
-       0xee, 0xb0, 0xec, 0x4d, 0x6e, 0xc2, 0x53, 0x7d, 0x2e, 0x0c, 0x99, 0x35,
-       0x3d, 0x2a, 0xe3, 0xe7, 0xfc, 0xc6, 0xa0, 0xf6, 0x23, 0x72, 0xd5, 0x0b,
-       0x4d, 0x8c, 0xca, 0xd7, 0x34, 0xa3, 0x85, 0x72, 0xb5, 0x18, 0xe2, 0x93,
-       0x16, 0x1e, 0x6c, 0xde, 0x84, 0x93, 0x7d, 0x86, 0xf5, 0xb4, 0xac, 0x03,
-       0x34, 0xf2, 0xf9, 0x74, 0x37, 0x36, 0x1b, 0xc2, 0x69, 0x75, 0xfa, 0x16,
-       0x59, 0xa7, 0xd1, 0x8c, 0x77, 0x68, 0xaf, 0x3d, 0xe9, 0x05, 0x8c, 0xfd,
-       0x12, 0xf3, 0xbd, 0x56, 0x80, 0xf5, 0xca, 0xbf, 0xa2, 0xe0, 0xf4, 0x01,
-       0xe1, 0x58, 0x0b, 0x70, 0xff, 0x80, 0xec, 0x0b, 0xa8, 0x98, 0x7f, 0x68,
-       0x35, 0xce, 0xed, 0xce, 0x71, 0xae, 0x37, 0xc3, 0xd6, 0xd7, 0xc9, 0xb9,
-       0xda, 0x4b, 0xc9, 0xb9, 0xc8, 0xe5, 0xea, 0x36, 0x2a, 0x6e, 0x84, 0xb2,
-       0x11, 0xf2, 0x0a, 0xe1, 0x17, 0x01, 0x3c, 0x93, 0x69, 0xc6, 0x6d, 0xc9,
-       0x6a, 0x8c, 0x90, 0x6f, 0xa5, 0x89, 0x17, 0xe9, 0x0c, 0xe3, 0xca, 0x70,
-       0x15, 0x3f, 0x3a, 0x3f, 0xb3, 0xf8, 0x31, 0x9c, 0x7b, 0x6b, 0x68, 0xcb,
-       0xb1, 0x36, 0xc5, 0xd9, 0xdb, 0x18, 0xca, 0x48, 0xac, 0x56, 0x98, 0xb7,
-       0xde, 0xa5, 0x49, 0x6e, 0x2a, 0xe7, 0x0e, 0x7e, 0xde, 0xa7, 0xe3, 0x5b,
-       0x8d, 0x3b, 0x95, 0x58, 0xa5, 0xf3, 0x5e, 0x92, 0x55, 0x4c, 0xd9, 0x6e,
-       0x9b, 0x2b, 0x6b, 0x94, 0x62, 0x97, 0x6c, 0x83, 0x39, 0xfa, 0xc3, 0x66,
-       0x05, 0xf4, 0x0a, 0x5d, 0xce, 0x50, 0xd2, 0xdf, 0xfd, 0x78, 0x35, 0x11,
-       0x47, 0x26, 0x51, 0xdf, 0xb3, 0x51, 0x71, 0xc9, 0xd9, 0xf3, 0xba, 0xb8,
-       0x22, 0x3e, 0x16, 0x87, 0x27, 0xe9, 0xb5, 0xca, 0x59, 0xff, 0x9d, 0xb9,
-       0x1d, 0x8c, 0x07, 0xf5, 0x9c, 0x62, 0xd5, 0x39, 0x7f, 0x9e, 0x46, 0x07,
-       0xd6, 0x25, 0x0c, 0xc6, 0xc0, 0xd5, 0x76, 0x37, 0xe7, 0xe1, 0x58, 0xa2,
-       0x03, 0xf7, 0x27, 0xea, 0xc7, 0x9f, 0xa4, 0x6d, 0xe1, 0xee, 0x0e, 0xb4,
-       0xf0, 0xd9, 0x50, 0xaa, 0xe6, 0x42, 0x37, 0x75, 0x3d, 0x31, 0xad, 0xce,
-       0x59, 0x97, 0x77, 0x1b, 0x3a, 0xcb, 0xeb, 0xc4, 0xb3, 0xfa, 0xd8, 0x80,
-       0xfa, 0xef, 0x15, 0x4c, 0x97, 0x5c, 0x32, 0x82, 0xe3, 0x09, 0x1f, 0xbe,
-       0x9e, 0xb4, 0xe8, 0x03, 0xc0, 0xfa, 0x6c, 0x33, 0xf3, 0x88, 0xa7, 0xec,
-       0x0a, 0x87, 0xeb, 0xba, 0x69, 0x83, 0x0b, 0x70, 0x82, 0xb1, 0xb7, 0x66,
-       0x9e, 0xa1, 0x2d, 0x52, 0xe4, 0x7d, 0xeb, 0x5f, 0xdb, 0xee, 0x68, 0x09,
-       0x36, 0x0c, 0x85, 0x22, 0x2b, 0x19, 0x67, 0x9f, 0x6a, 0x36, 0xc6, 0x6d,
-       0xc6, 0xc0, 0x19, 0xd1, 0x04, 0xe7, 0x3a, 0x24, 0xff, 0xaf, 0x03, 0x7f,
-       0x41, 0x3b, 0xff, 0x24, 0x21, 0x7e, 0x62, 0x10, 0x37, 0xfd, 0xf8, 0x06,
-       0xed, 0xfc, 0x7c, 0xa2, 0x0e, 0x59, 0xfa, 0x65, 0x07, 0xfd, 0xe3, 0xdd,
-       0x44, 0x30, 0x7e, 0x93, 0xca, 0x7c, 0x8f, 0xfe, 0xf1, 0x51, 0x22, 0x42,
-       0xdf, 0xf9, 0x2a, 0x3f, 0x0d, 0xf4, 0x87, 0x3a, 0xd6, 0xd1, 0xe9, 0x07,
-       0x7e, 0x9c, 0x65, 0xf9, 0x03, 0xa9, 0x9a, 0xd6, 0x15, 0x4a, 0x8d, 0x59,
-       0xa3, 0x54, 0x30, 0x9f, 0xd5, 0x68, 0xff, 0xb7, 0xe0, 0x43, 0x59, 0x4f,
-       0x4e, 0x12, 0x8b, 0x92, 0xe8, 0x2f, 0x22, 0x97, 0x5b, 0xe9, 0x9c, 0xe5,
-       0xaf, 0x3f, 0xf1, 0xa9, 0x12, 0x1c, 0x3f, 0xe3, 0x0a, 0x76, 0xcc, 0x20,
-       0x8f, 0xfe, 0x0b, 0xfa, 0xc1, 0x37, 0x59, 0xf6, 0x93, 0xbe, 0x62, 0x7c,
-       0x63, 0x88, 0x31, 0x37, 0x55, 0x80, 0x82, 0x3d, 0x5e, 0x3c, 0x78, 0x48,
-       0xc7, 0x3e, 0x27, 0x57, 0x17, 0x9d, 0x52, 0x77, 0xc4, 0x88, 0x73, 0x73,
-       0x81, 0x19, 0x07, 0x56, 0xe3, 0xd4, 0x6e, 0x9d, 0x71, 0x2f, 0x67, 0x27,
-       0xcf, 0x86, 0x1d, 0x6e, 0x1e, 0x17, 0x6e, 0x5e, 0xc0, 0x71, 0x6d, 0x4d,
-       0x85, 0xda, 0xb7, 0x51, 0x17, 0xb7, 0x67, 0xc5, 0xfe, 0x22, 0x78, 0x8e,
-       0x63, 0xeb, 0xa7, 0xad, 0x1c, 0x48, 0x54, 0x33, 0x47, 0xf7, 0xc1, 0xa2,
-       0xad, 0x58, 0xf2, 0x0e, 0x13, 0x6d, 0xc5, 0xa2, 0xad, 0x58, 0xb4, 0x15,
-       0x8b, 0xb6, 0x62, 0x65, 0x16, 0xe0, 0x99, 0x3e, 0x03, 0x23, 0xec, 0x73,
-       0xe7, 0x30, 0x39, 0xbc, 0xf3, 0x3e, 0x50, 0x9d, 0xe4, 0x29, 0xca, 0xc4,
-       0xdd, 0xb7, 0x60, 0xa8, 0xef, 0x56, 0x7e, 0x14, 0xb4, 0xd2, 0x66, 0x7a,
-       0xd2, 0x62, 0x83, 0x22, 0x93, 0x17, 0xc3, 0x99, 0x9b, 0x2b, 0x51, 0x2c,
-       0xf1, 0x5d, 0xc1, 0x0e, 0xe7, 0x7e, 0xde, 0xd6, 0xe4, 0x9e, 0x85, 0x9a,
-       0x79, 0x9b, 0xf0, 0x48, 0x9f, 0x8a, 0xdb, 0xc2, 0xf2, 0x7f, 0x08, 0x9a,
-       0x99, 0x0f, 0xc8, 0xfe, 0x7c, 0x82, 0xfe, 0x99, 0xb3, 0x15, 0x19, 0x53,
-       0xa6, 0x7f, 0x13, 0x4e, 0xf4, 0x1b, 0x8c, 0x59, 0x26, 0x32, 0xe9, 0x04,
-       0x7d, 0x42, 0xfc, 0xdc, 0xc0, 0x33, 0x6c, 0x6b, 0xf6, 0x80, 0x0b, 0x95,
-       0x8d, 0x6e, 0x94, 0xd0, 0xdf, 0x6f, 0x4b, 0xd7, 0x04, 0xbe, 0xa5, 0x24,
-       0x9c, 0xf5, 0xd7, 0x5d, 0x29, 0x8c, 0xcf, 0x34, 0x2a, 0xb1, 0x6f, 0xb0,
-       0x11, 0x8f, 0xed, 0x76, 0xd1, 0x46, 0xed, 0x05, 0xe5, 0x4d, 0x46, 0xc7,
-       0x02, 0x97, 0xe0, 0x45, 0x23, 0xbe, 0xc1, 0x1c, 0x60, 0x7d, 0x7f, 0xd0,
-       0x7c, 0x05, 0x41, 0xf3, 0x24, 0x16, 0xe0, 0x59, 0x93, 0xb8, 0x39, 0xaf,
-       0x11, 0x1b, 0xf7, 0x1b, 0xb4, 0x29, 0x37, 0xf3, 0x63, 0xf9, 0xbf, 0x37,
-       0xba, 0xb3, 0xc6, 0xf3, 0x32, 0xe4, 0x9c, 0x43, 0xb3, 0xfc, 0x4f, 0x06,
-       0xa5, 0x87, 0xf8, 0x34, 0xa3, 0xd7, 0xe0, 0xb8, 0x5f, 0xb0, 0x4b, 0x0d,
-       0xf9, 0x7f, 0x1c, 0xc4, 0x11, 0x8e, 0xfb, 0xc2, 0xcd, 0x6f, 0xdb, 0x95,
-       0x86, 0xc4, 0x50, 0xe2, 0x49, 0x5a, 0xfa, 0x8f, 0xed, 0x08, 0x10, 0x3b,
-       0x3a, 0xfa, 0x8d, 0x78, 0x29, 0x63, 0xd8, 0x46, 0x07, 0x63, 0x04, 0x5f,
-       0x8c, 0xb6, 0x6f, 0x21, 0xa4, 0xad, 0x20, 0xee, 0x9c, 0xe6, 0x58, 0x7a,
-       0x52, 0x82, 0x51, 0x3a, 0x8a, 0x7a, 0x63, 0xb8, 0x81, 0x39, 0x63, 0x41,
-       0x6f, 0x0b, 0x6a, 0x99, 0x3f, 0xba, 0x7b, 0x5b, 0x61, 0x30, 0x97, 0x9c,
-       0xd9, 0xbb, 0x1c, 0x0b, 0xc6, 0xf2, 0x1c, 0x5a, 0xc7, 0x11, 0x67, 0xdd,
-       0xea, 0x29, 0x78, 0xee, 0xd3, 0x69, 0x53, 0x72, 0xe6, 0xc5, 0x6b, 0x55,
-       0x12, 0x37, 0xcf, 0x50, 0xd7, 0xed, 0x03, 0xab, 0xed, 0x81, 0x94, 0xf0,
-       0xa6, 0x2e, 0x78, 0x9a, 0x24, 0xf7, 0xd1, 0x31, 0x46, 0x8e, 0x3c, 0xcc,
-       0x1c, 0xec, 0x8d, 0xfd, 0xab, 0x71, 0xff, 0x9e, 0xcb, 0x39, 0x9b, 0xd9,
-       0x64, 0xfd, 0x7b, 0xda, 0xc5, 0x86, 0x12, 0xda, 0x85, 0x97, 0x76, 0xb1,
-       0x2b, 0x15, 0x32, 0x0f, 0xd3, 0x2e, 0x6a, 0x89, 0x21, 0x1d, 0xbd, 0x92,
-       0xef, 0x38, 0xef, 0xed, 0x55, 0x78, 0x10, 0xc0, 0x9b, 0xb4, 0x8f, 0x8d,
-       0xbd, 0x76, 0x97, 0x9b, 0xb1, 0xa7, 0xa7, 0xb9, 0x1a, 0xaf, 0x65, 0x6e,
-       0xc5, 0xa3, 0xfd, 0xd5, 0x78, 0x85, 0xb6, 0xf3, 0x76, 0x02, 0xf3, 0x2b,
-       0xa0, 0xce, 0xac, 0x60, 0xac, 0xbe, 0x4d, 0x09, 0xb5, 0x2e, 0x42, 0xfd,
-       0xf8, 0xcb, 0x4a, 0xb0, 0x93, 0x9c, 0xe5, 0xc4, 0x05, 0x62, 0xff, 0xeb,
-       0x19, 0x39, 0x77, 0xe7, 0xc3, 0x38, 0xed, 0x6a, 0x9c, 0xf5, 0xbe, 0xd1,
-       0x5f, 0xc7, 0x79, 0xf3, 0xa0, 0xd0, 0xf0, 0xe3, 0x14, 0xb1, 0xb4, 0x63,
-       0x37, 0xc6, 0x03, 0x86, 0x71, 0xa2, 0x55, 0xa9, 0xc2, 0x9b, 0xc3, 0xb7,
-       0x62, 0x63, 0x7f, 0x50, 0x8f, 0xd1, 0x37, 0x5f, 0xe3, 0xb3, 0xf5, 0xbb,
-       0x67, 0xe1, 0x38, 0x6d, 0x6f, 0x9c, 0xb6, 0xb7, 0xb6, 0x5f, 0xc5, 0x8b,
-       0xc3, 0xb7, 0xb0, 0x5f, 0x05, 0xb3, 0x6a, 0x15, 0x27, 0xff, 0xda, 0x91,
-       0x72, 0xfe, 0x77, 0x81, 0xf3, 0x8e, 0xde, 0x9c, 0x51, 0x13, 0xb3, 0xf7,
-       0xcb, 0xf8, 0xc8, 0xc3, 0x9c, 0xb5, 0xe9, 0x46, 0xdc, 0xbc, 0xa7, 0x12,
-       0xe7, 0xf6, 0x1a, 0x56, 0xb9, 0xcb, 0x5e, 0x70, 0x2a, 0x1c, 0xe2, 0x3c,
-       0x34, 0xa2, 0xe1, 0x50, 0x23, 0x42, 0x03, 0xb9, 0x18, 0xa1, 0x19, 0x0b,
-       0xf0, 0x3d, 0xce, 0xfb, 0x5a, 0xe6, 0x80, 0x35, 0x43, 0x82, 0xbd, 0x36,
-       0x73, 0xc5, 0x66, 0x4c, 0x8c, 0x8d, 0x73, 0x6c, 0x11, 0x9c, 0x25, 0xbf,
-       0x7d, 0x9f, 0x31, 0xe3, 0x43, 0xe6, 0x80, 0x1f, 0x3a, 0x31, 0x43, 0xde,
-       0xa5, 0xbd, 0x32, 0x6e, 0xec, 0xe2, 0x9c, 0x6e, 0xec, 0x37, 0xea, 0xfa,
-       0xf8, 0x7b, 0xbd, 0x33, 0xc7, 0x31, 0xe2, 0xb9, 0x60, 0x85, 0xe0, 0x7f,
-       0x0b, 0x73, 0xde, 0x56, 0x9c, 0xed, 0x0b, 0x99, 0x0b, 0x95, 0x56, 0xbc,
-       0x47, 0x99, 0xfb, 0x28, 0x5f, 0x92, 0xbc, 0x6c, 0x66, 0xd2, 0x18, 0xff,
-       0xd0, 0x25, 0x18, 0xd3, 0x8a, 0xf2, 0xec, 0xad, 0x38, 0xd5, 0xbf, 0x1c,
-       0xa5, 0x43, 0xc2, 0x35, 0xa5, 0x4d, 0x37, 0xb6, 0xee, 0xbe, 0x13, 0xeb,
-       0x0f, 0xe6, 0x72, 0xbe, 0xf5, 0x89, 0x4d, 0xcc, 0x75, 0x85, 0xbf, 0xd7,
-       0xe1, 0x50, 0x2a, 0x26, 0x47, 0x42, 0x77, 0x30, 0x9f, 0x8b, 0xac, 0x20,
-       0x7e, 0x2e, 0x0d, 0x13, 0x63, 0x2b, 0x82, 0x81, 0x97, 0x61, 0xe9, 0xbc,
-       0x17, 0x58, 0x07, 0xd1, 0x89, 0x85, 0x65, 0x8c, 0x3b, 0xb7, 0xf5, 0xbb,
-       0x29, 0xbb, 0x3c, 0xaf, 0xc3, 0x8f, 0x52, 0x56, 0x5c, 0x9e, 0x6f, 0x84,
-       0xf8, 0x8a, 0xe8, 0xc9, 0x05, 0xb3, 0xa9, 0x26, 0xd6, 0x41, 0x8c, 0x2e,
-       0x0d, 0x07, 0xcd, 0x6f, 0xa0, 0x99, 0x73, 0x2f, 0x32, 0x47, 0xb0, 0xfe,
-       0x10, 0x9c, 0x7d, 0x7f, 0x79, 0x47, 0xe4, 0x3f, 0xf4, 0xed, 0x76, 0xec,
-       0x69, 0x7d, 0xe3, 0x65, 0x1b, 0x3c, 0x90, 0xaa, 0xef, 0x74, 0xa1, 0xc6,
-       0x2a, 0x87, 0x91, 0xee, 0x23, 0x2f, 0x8d, 0x23, 0xd8, 0x13, 0x87, 0xc4,
-       0x8c, 0x7a, 0x4b, 0x43, 0x35, 0xdb, 0x8e, 0xe0, 0xad, 0x84, 0x4b, 0xb0,
-       0x09, 0xf2, 0x4f, 0x8a, 0x22, 0xc4, 0xe1, 0x37, 0x12, 0xc5, 0xd0, 0x87,
-       0x12, 0xce, 0xff, 0x11, 0xba, 0x39, 0x6b, 0x91, 0xaf, 0x2d, 0xc0, 0xab,
-       0xfd, 0x3e, 0xcc, 0x27, 0x4f, 0xa9, 0x4b, 0x3e, 0x65, 0x97, 0x12, 0x87,
-       0xeb, 0x87, 0x42, 0x9a, 0x47, 0xb1, 0xed, 0x03, 0x73, 0x7f, 0x6d, 0x4f,
-       0x8b, 0x4a, 0x59, 0x23, 0xb2, 0x48, 0xfe, 0x9f, 0xd4, 0x3c, 0xa3, 0xf5,
-       0x2c, 0x7c, 0xb8, 0x81, 0x58, 0x7a, 0xac, 0xb7, 0x12, 0x6f, 0xed, 0xee,
-       0x91, 0x35, 0x4b, 0x18, 0xfc, 0xfd, 0x5a, 0x6f, 0x00, 0x3a, 0xb1, 0x4c,
-       0xe7, 0x75, 0x03, 0x31, 0x5a, 0x27, 0x3e, 0xbf, 0xdd, 0x6b, 0x2f, 0xf0,
-       0x35, 0x59, 0x6c, 0xbd, 0x0e, 0x0b, 0x88, 0xd1, 0x6f, 0xf4, 0x06, 0x4f,
-       0x2c, 0x51, 0x15, 0x94, 0x34, 0x99, 0xec, 0xdb, 0x87, 0x17, 0x69, 0xdf,
-       0x4f, 0xa4, 0x8e, 0x7e, 0x6d, 0x06, 0xac, 0xfa, 0x12, 0x04, 0x37, 0x78,
-       0x14, 0x59, 0xe3, 0x90, 0xd8, 0x56, 0x8d, 0x1b, 0xc9, 0x4d, 0x74, 0xe2,
-       0x77, 0x4d, 0x56, 0xe2, 0x1c, 0xb0, 0x66, 0x68, 0x35, 0x3e, 0x1c, 0x14,
-       0x1f, 0xc5, 0x42, 0xb1, 0xff, 0x05, 0xe1, 0x90, 0x79, 0x86, 0xb8, 0x5c,
-       0x3b, 0x96, 0x20, 0xfe, 0xca, 0xb9, 0x3c, 0x8c, 0xab, 0xc4, 0x81, 0xca,
-       0x94, 0x60, 0x57, 0x00, 0x8d, 0xcc, 0xf7, 0xca, 0x53, 0xe2, 0x93, 0x96,
-       0x9c, 0x1b, 0xc1, 0xcd, 0x63, 0x3e, 0xe8, 0x63, 0x1a, 0x3f, 0x7e, 0xe8,
-       0x23, 0x55, 0xfc, 0x50, 0xd6, 0x91, 0x59, 0xfc, 0x50, 0x56, 0xc6, 0x31,
-       0x73, 0x44, 0xc1, 0x4d, 0x8e, 0x6d, 0x89, 0x0f, 0x7a, 0xf1, 0xec, 0x28,
-       0xb0, 0xa1, 0xdf, 0xc4, 0xe1, 0xfd, 0x39, 0x9c, 0xdb, 0xcc, 0x3e, 0x42,
-       0x03, 0x61, 0xac, 0x4f, 0x8b, 0x7d, 0x36, 0xe2, 0xb7, 0x7b, 0x8d, 0xb6,
-       0x35, 0x6a, 0x28, 0xb2, 0x9c, 0x18, 0xf6, 0xfe, 0x48, 0x23, 0x3e, 0x7c,
-       0x62, 0x01, 0x8c, 0x70, 0x23, 0xce, 0x1c, 0xd8, 0x84, 0xf2, 0x27, 0x54,
-       0xe2, 0x8f, 0x8a, 0xf1, 0xe9, 0x82, 0xed, 0x82, 0xa3, 0x5e, 0xab, 0x8c,
-       0xb8, 0xb5, 0x8d, 0xb8, 0xf5, 0xb3, 0xb9, 0xe3, 0x98, 0x9f, 0x94, 0x73,
-       0xad, 0xcc, 0xaf, 0xd4, 0x08, 0x9e, 0x24, 0x6e, 0xed, 0xea, 0x93, 0xf9,
-       0xe2, 0xdc, 0x12, 0xb3, 0xb6, 0xa6, 0x73, 0x9c, 0xe8, 0x70, 0xbf, 0xa1,
-       0xb9, 0x68, 0xcb, 0x43, 0x93, 0x78, 0xf5, 0x5b, 0xc6, 0xff, 0x47, 0xe6,
-       0x45, 0x71, 0x36, 0x2d, 0x7e, 0x25, 0x71, 0x45, 0xc7, 0x87, 0xb4, 0xf1,
-       0xa5, 0xd4, 0xf5, 0x19, 0xe6, 0x16, 0x2d, 0x8c, 0x73, 0x1f, 0xd3, 0x9e,
-       0x97, 0x93, 0x3f, 0xbe, 0x97, 0x12, 0x1b, 0x59, 0x8e, 0x25, 0x59, 0xb1,
-       0x05, 0x67, 0x9d, 0x95, 0xdf, 0x31, 0x9c, 0x4e, 0xfc, 0xb1, 0xb8, 0xb0,
-       0x12, 0xaf, 0x0e, 0xca, 0x79, 0x17, 0x03, 0xde, 0xde, 0xa0, 0x56, 0xa2,
-       0xc8, 0x9e, 0x6e, 0x9e, 0xfb, 0x4e, 0x38, 0x39, 0x76, 0x69, 0x34, 0xbf,
-       0xbf, 0x98, 0xdf, 0x77, 0xb0, 0xf0, 0xfd, 0xb9, 0x01, 0xf2, 0x4f, 0x28,
-       0x87, 0xe7, 0x16, 0xe0, 0xf6, 0x3d, 0x6d, 0x18, 0xd9, 0xfd, 0x31, 0x8a,
-       0xfa, 0xd5, 0x7b, 0x7d, 0xa8, 0xa9, 0x7b, 0x48, 0xe9, 0xc2, 0xa2, 0xb0,
-       0xbc, 0xe7, 0x23, 0x6b, 0xe6, 0x7d, 0xd8, 0x7c, 0x80, 0x79, 0xcc, 0xd8,
-       0x75, 0x38, 0xaa, 0x31, 0x1e, 0x9a, 0x1f, 0xa3, 0xa0, 0xdf, 0xe3, 0x9c,
-       0x05, 0x3c, 0x6a, 0x36, 0x61, 0xe5, 0xe4, 0x59, 0x40, 0x54, 0x5d, 0xbd,
-       0x97, 0x00, 0x5f, 0xe9, 0xe4, 0xff, 0x1f, 0xc8, 0xbd, 0xdb, 0x63, 0xa0,
-       0x77, 0xf4, 0x7f, 0x95, 0xe7, 0xce, 0x06, 0xfd, 0x6b, 0xca, 0x76, 0xa2,
-       0x7d, 0xcf, 0xe3, 0x58, 0xb1, 0xe7, 0x3b, 0xb8, 0x73, 0xa0, 0xb6, 0x33,
-       0xc2, 0x5c, 0xe7, 0x83, 0xf0, 0x38, 0x8e, 0x85, 0x8b, 0x60, 0xf9, 0xc9,
-       0xb1, 0x6e, 0xfc, 0x8a, 0xbc, 0x4e, 0xca, 0xbf, 0xd3, 0xb6, 0x7e, 0xaf,
-       0xb4, 0xf7, 0xf6, 0xa4, 0x7f, 0xfd, 0x7c, 0x9a, 0x9c, 0xa7, 0x79, 0x21,
-       0xf5, 0x2b, 0x5b, 0x77, 0x9e, 0xe7, 0xef, 0xbf, 0x65, 0xc7, 0xfc, 0x72,
-       0x7f, 0xd6, 0x64, 0xbd, 0xef, 0xe0, 0x01, 0xe6, 0xbf, 0xa7, 0x9b, 0xbe,
-       0x83, 0x85, 0x43, 0x97, 0xea, 0xa0, 0x68, 0xf7, 0x3a, 0x07, 0xbb, 0xe9,
-       0x61, 0xe4, 0x48, 0xb2, 0x57, 0x25, 0xfb, 0x27, 0x7f, 0x89, 0xcd, 0x7b,
-       0x65, 0x6d, 0xd3, 0xb6, 0xd7, 0x1b, 0xb2, 0xc7, 0x97, 0x3f, 0x37, 0x27,
-       0xed, 0x58, 0x8a, 0x95, 0x91, 0xba, 0x5b, 0x94, 0xbe, 0xcc, 0xd4, 0x31,
-       0x4d, 0x93, 0xff, 0x97, 0xa7, 0x95, 0x44, 0xa7, 0x8e, 0xad, 0x47, 0xd9,
-       0x9e, 0x39, 0xa2, 0xec, 0xca, 0x5c, 0xad, 0x8f, 0xe7, 0xec, 0x58, 0x9b,
-       0xb4, 0x21, 0x32, 0xc1, 0x8f, 0x62, 0x91, 0x2b, 0xff, 0xec, 0x99, 0x49,
-       0xb9, 0x0b, 0xa1, 0x57, 0xe6, 0xe4, 0xbe, 0x9f, 0x72, 0x9b, 0x4d, 0x31,
-       0xa8, 0xf3, 0xa6, 0xca, 0x9e, 0x1f, 0xe7, 0x7f, 0xbb, 0xd4, 0x56, 0xae,
-       0xdc, 0xcd, 0x7e, 0xb1, 0x21, 0x75, 0xde, 0xd4, 0x35, 0xfb, 0x02, 0xe2,
-       0x47, 0x48, 0xdb, 0x8a, 0x5c, 0xbe, 0xb7, 0xe6, 0xca, 0x7c, 0x4f, 0xb0,
-       0x0b, 0x23, 0x09, 0x0d, 0xef, 0x99, 0x92, 0xdf, 0xc9, 0xad, 0x28, 0xbe,
-       0xc7, 0xfc, 0xf1, 0x99, 0x44, 0xb0, 0x75, 0x9d, 0x52, 0x1f, 0x9b, 0xc3,
-       0x38, 0x87, 0x0a, 0x59, 0x4f, 0x8f, 0x38, 0xff, 0xaf, 0x2a, 0x13, 0x8a,
-       0x20, 0x43, 0x7f, 0x78, 0x23, 0x11, 0xec, 0x38, 0xa3, 0xe4, 0xfe, 0x0f,
-       0xd6, 0xeb, 0xce, 0xfb, 0x1c, 0x79, 0xbb, 0x13, 0xce, 0x39, 0x75, 0x3d,
-       0x57, 0x6c, 0x30, 0xd8, 0x97, 0x46, 0xa5, 0xac, 0x9b, 0x58, 0x16, 0xf3,
-       0xa1, 0xee, 0x94, 0x15, 0x50, 0xf1, 0x15, 0xc4, 0xfd, 0xb2, 0x47, 0x72,
-       0xcb, 0xe4, 0xff, 0xa9, 0x11, 0x7e, 0xf4, 0x2f, 0xaf, 0x4f, 0xc9, 0xff,
-       0x06, 0xca, 0xdb, 0x8b, 0x35, 0x76, 0x3d, 0xd2, 0x9a, 0xac, 0x7d, 0xc0,
-       0x9a, 0x46, 0x5d, 0xfb, 0x8d, 0x4d, 0x1c, 0xb7, 0x07, 0xd3, 0x99, 0xdb,
-       0x85, 0x6b, 0xeb, 0xdb, 0x1a, 0xd5, 0x6b, 0x10, 0xab, 0x08, 0x6a, 0x31,
-       0x72, 0xcd, 0x1e, 0xe7, 0xff, 0xed, 0xc8, 0xb9, 0x14, 0xab, 0xd5, 0x4b,
-       0x4c, 0x6f, 0x52, 0x14, 0x14, 0x84, 0xe0, 0x7e, 0x28, 0xe3, 0x86, 0x56,
-       0xfb, 0x5b, 0xfb, 0x17, 0x7e, 0x03, 0xdb, 0xc6, 0x6e, 0xb9, 0xf4, 0xff,
-       0x87, 0xfe, 0x63, 0xf6, 0xea, 0xec, 0x37, 0xdf, 0xe6, 0xc7, 0x76, 0x6c,
-       0xba, 0xf4, 0x2d, 0xed, 0xfe, 0x31, 0x59, 0xf3, 0xef, 0x7a, 0xd4, 0xe8,
-       0x2e, 0x94, 0x63, 0xab, 0xb9, 0xde, 0x2f, 0x67, 0xe5, 0xd6, 0x43, 0xf6,
-       0xff, 0x65, 0x0e, 0xe4, 0x1d, 0xc3, 0x08, 0xf3, 0x6e, 0xd1, 0x4b, 0x14,
-       0x0f, 0x66, 0xe4, 0x9d, 0xa0, 0x59, 0x90, 0xff, 0xfb, 0xf5, 0x60, 0x26,
-       0xa7, 0xbf, 0x47, 0x33, 0x3e, 0xe6, 0x00, 0x3e, 0xda, 0x60, 0x07, 0xf9,
-       0x0b, 0xf9, 0xd3, 0x25, 0x5d, 0xde, 0xeb, 0x97, 0x75, 0x85, 0xef, 0xd3,
-       0xa7, 0xdd, 0xb5, 0x72, 0x6d, 0xc9, 0xb9, 0x51, 0x25, 0x77, 0x7d, 0xde,
-       0x79, 0x37, 0x52, 0x8d, 0xae, 0xc3, 0xc2, 0xc4, 0x34, 0x39, 0x3f, 0x29,
-       0x6b, 0x36, 0x96, 0x3f, 0x2a, 0xef, 0x61, 0xf8, 0x88, 0xb1, 0x5f, 0xf5,
-       0x4f, 0xbe, 0x73, 0xd5, 0xba, 0x82, 0x38, 0x36, 0x27, 0x6c, 0xc4, 0x9a,
-       0x94, 0xa0, 0xbe, 0x52, 0x69, 0x63, 0xbd, 0x3a, 0xf4, 0x64, 0xa5, 0x0d,
-       0xc5, 0xf9, 0xdf, 0x92, 0x1e, 0xb6, 0x71, 0x30, 0x51, 0xaf, 0x7b, 0xd4,
-       0x4f, 0x6d, 0xcb, 0x39, 0x03, 0x29, 0xfb, 0xf6, 0x71, 0xbc, 0x94, 0x98,
-       0x4e, 0x94, 0xba, 0xba, 0xdd, 0x4b, 0xeb, 0xe7, 0x7f, 0xa3, 0x21, 0xc6,
-       0xb6, 0x82, 0x9d, 0x61, 0x57, 0x70, 0xc3, 0x05, 0xe2, 0x4a, 0x36, 0x6c,
-       0xc4, 0x7f, 0xc0, 0x3e, 0xfe, 0x56, 0xa9, 0x43, 0x62, 0x4a, 0xfb, 0xb9,
-       0xb6, 0xea, 0xdb, 0x0b, 0xd4, 0xf3, 0xce, 0xbb, 0xf8, 0xd2, 0xbe, 0x16,
-       0x5d, 0x0d, 0x2d, 0x69, 0xd9, 0x7e, 0xb6, 0x39, 0x33, 0x1a, 0xdc, 0x57,
-       0x41, 0x30, 0xfa, 0xb6, 0xda, 0x85, 0x35, 0x72, 0x3c, 0x24, 0x1a, 0xd4,
-       0x1f, 0xa0, 0x7d, 0x34, 0x3a, 0x6d, 0xc4, 0xea, 0x0a, 0x20, 0x9c, 0xf2,
-       0x4b, 0xed, 0x84, 0x39, 0x81, 0x70, 0x31, 0x96, 0x73, 0xce, 0x03, 0xc8,
-       0xb9, 0x49, 0xe6, 0x0d, 0x09, 0xf9, 0xbf, 0x7d, 0x4e, 0x37, 0x93, 0x7b,
-       0x5a, 0xcc, 0xd7, 0x19, 0xaf, 0xd7, 0xcb, 0xff, 0x48, 0x2a, 0xf6, 0xe1,
-       0xc1, 0x84, 0xac, 0x81, 0xfc, 0x1f, 0x05, 0x3f, 0x96, 0xb4, 0x1c, 0x54,
-       0x00, 0x00, 0x00 };
-
-static const u32 bnx2_CP_b09FwData[(0x84/4) + 1] = {
-       0x00000000, 0x0000001b, 0x0000000f, 0x0000000a, 0x00000008, 0x00000006,
-       0x00000005, 0x00000005, 0x00000004, 0x00000004, 0x00000003, 0x00000003,
-       0x00000003, 0x00000003, 0x00000003, 0x00000002, 0x00000002, 0x00000002,
-       0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
-       0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
-       0x00000001, 0x00000001, 0x00000001, 0x00000000 };
-static const u32 bnx2_CP_b09FwRodata[(0x16c/4) + 1] = {
-       0x80080100, 0x80080080, 0x80080000, 0x08001800, 0x08001800, 0x08001838,
-       0x08001838, 0x0800184c, 0x0800181c, 0x08001a74, 0x08001a40, 0x08001acc,
-       0x08001acc, 0x08001b54, 0x08001a84, 0x80080240, 0x080021c4, 0x08002010,
-       0x080021ec, 0x08002284, 0x080023d4, 0x08002420, 0x08002544, 0x0800244c,
-       0x080024d0, 0x08002080, 0x080029f8, 0x0800299c, 0x0800202c, 0x0800202c,
-       0x0800202c, 0x080025b8, 0x080025b8, 0x0800202c, 0x0800202c, 0x08002874,
-       0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x080028d4, 0x0800202c,
-       0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c,
-       0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c,
-       0x0800202c, 0x08002440, 0x0800202c, 0x0800202c, 0x08002944, 0x0800202c,
-       0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c,
-       0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c,
-       0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x08002798, 0x0800202c,
-       0x0800202c, 0x08002700, 0x0800265c, 0x080037c0, 0x08003794, 0x08003760,
-       0x08003734, 0x08003714, 0x080036c8, 0x80080100, 0x80080080, 0x80080000,
-       0x80080080, 0x00000000 };
-
-static struct fw_info bnx2_cp_fw_09 = {
-       /* Firmware version: 4.6.15 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0xf,
-
-       .start_addr                     = 0x08000080,
-
-       .text_addr                      = 0x08000000,
-       .text_len                       = 0x5418,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_CP_b09FwText,
-       .gz_text_len                    = sizeof(bnx2_CP_b09FwText),
-
-       .data_addr                      = 0x080055a0,
-       .data_len                       = 0x84,
-       .data_index                     = 0x0,
-       .data                           = bnx2_CP_b09FwData,
-
-       .sbss_addr                      = 0x08005624,
-       .sbss_len                       = 0x91,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x080056b8,
-       .bss_len                        = 0x19c,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x08005418,
-       .rodata_len                     = 0x16c,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_CP_b09FwRodata,
-};
-
-static u8 bnx2_RXP_b09FwText[] = {
-       0xec, 0x5c, 0x7d, 0x70, 0x1c, 0xe5, 0x79, 0xff, 0xbd, 0x7b, 0x7b, 0xd2,
-       0x4a, 0x3a, 0x9d, 0x56, 0xa7, 0x93, 0x7c, 0x22, 0x04, 0xef, 0xa2, 0x3d,
-       0xf9, 0xb0, 0x0c, 0xec, 0x9d, 0x4f, 0xb6, 0xa0, 0xdb, 0xb2, 0x83, 0x0d,
-       0x11, 0x21, 0x13, 0x84, 0x4d, 0x52, 0x33, 0x49, 0x27, 0x37, 0xc6, 0x18,
-       0x81, 0x4d, 0x70, 0x0d, 0x6d, 0x55, 0x86, 0x19, 0x6f, 0x2c, 0x7f, 0x01,
-       0x27, 0x9d, 0x62, 0x64, 0x63, 0xd2, 0x0e, 0x68, 0x6c, 0x59, 0x08, 0x7c,
-       0xd2, 0x61, 0x20, 0xad, 0xe8, 0x84, 0xfa, 0x26, 0xd8, 0xe0, 0x94, 0xcf,
-       0x21, 0x0c, 0xc3, 0x1f, 0xcd, 0xa0, 0x62, 0x3e, 0xcc, 0x94, 0xa1, 0x26,
-       0x38, 0xa9, 0xdd, 0xb8, 0x7e, 0xfb, 0x3c, 0x7b, 0x3a, 0x9b, 0x90, 0x26,
-       0x9d, 0xfc, 0xd1, 0xff, 0xf6, 0x99, 0xb9, 0xb9, 0xbd, 0x77, 0xdf, 0xf7,
-       0xf9, 0xfe, 0x7c, 0x3d, 0xf2, 0x5f, 0x47, 0x50, 0x8f, 0x39, 0x68, 0xa4,
-       0x4f, 0x76, 0xc3, 0xc0, 0xc6, 0xf4, 0x65, 0x4b, 0x2e, 0xa3, 0xc7, 0xee,
-       0x50, 0x53, 0x8d, 0xca, 0xeb, 0x02, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01,
-       0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10,
-       0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00,
-       0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04,
-       0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40,
-       0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0xfc, 0x7f, 0x40, 0x08, 0xd0,
-       0xf9, 0xbb, 0x71, 0xee, 0x03, 0x4d, 0x71, 0xdc, 0x7b, 0xaf, 0xb6, 0xa0,
-       0x85, 0x9c, 0x99, 0x7b, 0x6f, 0xb1, 0x00, 0xb7, 0xd8, 0x65, 0x2c, 0xc3,
-       0x7f, 0x4b, 0x2f, 0xae, 0x82, 0xd7, 0xbf, 0xea, 0x9c, 0x79, 0xec, 0xf9,
-       0xa5, 0xe6, 0x89, 0xb1, 0x10, 0x34, 0xdd, 0x79, 0x27, 0xad, 0x77, 0x42,
-       0xbb, 0x90, 0xce, 0xfc, 0xfd, 0x82, 0x95, 0x31, 0x44, 0xab, 0xb8, 0xe0,
-       0x29, 0x8e, 0x94, 0xfb, 0x6d, 0x89, 0x17, 0x6d, 0x4f, 0x2c, 0xcb, 0xc2,
-       0xd3, 0x9c, 0x19, 0x51, 0x37, 0x74, 0x56, 0x1a, 0xe1, 0x0a, 0xe5, 0x35,
-       0x45, 0x05, 0xaa, 0xa5, 0xe1, 0xd6, 0xf1, 0x7a, 0xac, 0x1d, 0x6b, 0xc0,
-       0x9a, 0xb1, 0x04, 0x6e, 0x2b, 0x42, 0x0f, 0x39, 0x1a, 0x66, 0x43, 0x33,
-       0x22, 0x34, 0x85, 0x5c, 0xd8, 0x39, 0x75, 0xc3, 0xde, 0xfc, 0x59, 0xe9,
-       0xfa, 0x7f, 0x63, 0x52, 0xbe, 0x61, 0xdc, 0x7f, 0x0f, 0x45, 0x75, 0x0e,
-       0xd3, 0x33, 0xef, 0x3b, 0x75, 0xc3, 0xbe, 0xe2, 0x71, 0xf9, 0xfc, 0x82,
-       0x38, 0x0e, 0x95, 0x74, 0x3c, 0x55, 0xda, 0x4f, 0x3c, 0x98, 0x9e, 0x07,
-       0xcd, 0x53, 0x1d, 0x0f, 0x5b, 0xb3, 0x61, 0x4c, 0x8c, 0x9c, 0x95, 0x21,
-       0xcb, 0x34, 0xa0, 0x58, 0xfa, 0x0b, 0xa0, 0x7d, 0x05, 0xda, 0x57, 0x08,
-       0x63, 0xef, 0x58, 0x29, 0x86, 0xfa, 0x04, 0x9e, 0x5f, 0xc0, 0xe7, 0xf9,
-       0x2c, 0xe3, 0x78, 0x3b, 0x5a, 0x3d, 0x5f, 0x43, 0xe7, 0x8f, 0x64, 0x81,
-       0xf1, 0x91, 0x3e, 0x3a, 0x2a, 0x31, 0x68, 0xd7, 0x62, 0xb5, 0x0e, 0xaf,
-       0xce, 0x61, 0x5c, 0x55, 0x3c, 0x9e, 0x30, 0xa6, 0x8e, 0x34, 0x55, 0xf0,
-       0x40, 0x68, 0x16, 0xbc, 0xda, 0x2f, 0xbd, 0x3f, 0x5e, 0xac, 0xbe, 0xdf,
-       0x41, 0x74, 0x34, 0xd2, 0xc3, 0x06, 0xfc, 0x73, 0xa9, 0x1f, 0xff, 0x50,
-       0xca, 0xe1, 0xd9, 0x52, 0x1f, 0xd1, 0xbd, 0x87, 0xe8, 0xae, 0xc7, 0x3f,
-       0x96, 0xd6, 0xe0, 0xc7, 0xa5, 0xef, 0xe2, 0x99, 0xd2, 0x2a, 0x3c, 0x5d,
-       0xba, 0x09, 0x07, 0x4b, 0x1e, 0xc2, 0xdd, 0x8c, 0x2f, 0x25, 0x3e, 0xcb,
-       0xd7, 0x11, 0x1f, 0x5b, 0x30, 0x5b, 0x64, 0x79, 0x24, 0x46, 0x6c, 0x73,
-       0x0c, 0x58, 0x90, 0xa8, 0x81, 0xc0, 0x6a, 0xdb, 0x7c, 0x0a, 0xb8, 0x0d,
-       0x6e, 0xdc, 0x3c, 0xc1, 0x5a, 0x7a, 0x62, 0xc4, 0x40, 0x98, 0xf8, 0xb5,
-       0xd2, 0x6d, 0xd8, 0xaa, 0xf7, 0xa1, 0xde, 0x1a, 0xc2, 0x03, 0xbe, 0x8d,
-       0xa1, 0x45, 0x9c, 0x7f, 0x45, 0x7e, 0x48, 0xe0, 0xc1, 0x24, 0x34, 0x41,
-       0xcf, 0x5d, 0xc5, 0xbf, 0x6b, 0xa9, 0xd8, 0x8c, 0x78, 0x28, 0x10, 0x5f,
-       0x05, 0xe2, 0xa3, 0x40, 0xbc, 0x15, 0x88, 0x97, 0x02, 0xf1, 0x57, 0x20,
-       0x7e, 0x0a, 0xc4, 0x4f, 0x81, 0xf8, 0x29, 0x10, 0xaf, 0x05, 0xd6, 0xf9,
-       0x00, 0xc9, 0x52, 0xb1, 0x71, 0xab, 0x63, 0x63, 0xac, 0xd4, 0x26, 0xf6,
-       0xee, 0x56, 0xc5, 0x73, 0xc3, 0x06, 0xe6, 0x3b, 0x88, 0x3c, 0xbd, 0xc4,
-       0x2a, 0x5f, 0x15, 0xea, 0x9a, 0x49, 0xc0, 0x4d, 0xcf, 0x83, 0x8d, 0x89,
-       0x92, 0x2a, 0xa6, 0x87, 0xa5, 0x5c, 0x69, 0xbb, 0x68, 0x72, 0xcc, 0x9e,
-       0x8d, 0x8a, 0xd5, 0xff, 0xba, 0x68, 0xc4, 0x2f, 0x47, 0x7a, 0x31, 0xd6,
-       0xec, 0xe2, 0x70, 0xd6, 0xc0, 0xb2, 0x8c, 0x82, 0x5c, 0xdc, 0xc3, 0xb6,
-       0xac, 0x69, 0x7b, 0x18, 0x45, 0x39, 0xce, 0xe7, 0x34, 0xd2, 0xb5, 0x87,
-       0x64, 0xb7, 0x86, 0xc9, 0x11, 0x17, 0x35, 0xe9, 0x1a, 0x94, 0xfb, 0x58,
-       0x7f, 0x2a, 0xc9, 0xb4, 0x0f, 0xf5, 0xb1, 0x18, 0x1a, 0xac, 0x4b, 0xd0,
-       0x10, 0xe3, 0x35, 0x88, 0x56, 0xd2, 0xd5, 0x3c, 0xe7, 0x02, 0xf1, 0xf9,
-       0xee, 0x28, 0x3e, 0x1d, 0xd5, 0x50, 0xda, 0xa9, 0xe2, 0x1b, 0x19, 0x29,
-       0xff, 0x2a, 0xa3, 0xf6, 0x7f, 0x2a, 0x1c, 0x4c, 0x95, 0x54, 0x7c, 0x9e,
-       0x4f, 0xc3, 0x6b, 0xd6, 0xf0, 0x9f, 0x79, 0x0f, 0x21, 0xc2, 0x3b, 0x40,
-       0x78, 0x6b, 0x17, 0xa7, 0x30, 0x1b, 0x67, 0x71, 0xfa, 0xb0, 0x31, 0xdf,
-       0xb1, 0x63, 0xa3, 0x52, 0x03, 0xa3, 0x06, 0x64, 0xff, 0x2c, 0x36, 0xe5,
-       0x3b, 0x8e, 0x6e, 0x52, 0xb6, 0xe0, 0xe2, 0x5a, 0x0d, 0x9b, 0x87, 0x79,
-       0x6d, 0x39, 0xca, 0x45, 0x41, 0xfe, 0xf0, 0xc7, 0xea, 0x6b, 0x26, 0x42,
-       0x7e, 0x65, 0xfc, 0xf1, 0x7a, 0x4e, 0x34, 0xa2, 0xde, 0x34, 0xca, 0x58,
-       0x1f, 0xe7, 0xf3, 0x39, 0xe5, 0x5d, 0xe9, 0xc6, 0x99, 0x0f, 0xcd, 0x0b,
-       0x91, 0x6e, 0x6e, 0xc9, 0x66, 0xb1, 0x26, 0xdf, 0xa1, 0xaf, 0x51, 0x48,
-       0xdb, 0x6a, 0xc5, 0xc6, 0x71, 0x07, 0xe9, 0xd1, 0x61, 0x81, 0x91, 0x4e,
-       0xb6, 0x31, 0xd2, 0x76, 0xd1, 0x8f, 0x09, 0xc3, 0x50, 0x2a, 0x31, 0xf1,
-       0x58, 0x36, 0x89, 0xb3, 0x0f, 0xf1, 0x6f, 0x15, 0x3f, 0x5b, 0x9a, 0xc4,
-       0xc7, 0xfb, 0x4a, 0x73, 0x71, 0xfb, 0x68, 0xa4, 0xb2, 0xef, 0x1a, 0xa2,
-       0xc9, 0x32, 0x32, 0xae, 0xc9, 0x7b, 0x47, 0x3b, 0x6b, 0xe9, 0x77, 0xc5,
-       0xd6, 0xfd, 0xf9, 0x0e, 0xbb, 0x5f, 0xd1, 0x50, 0x4e, 0x44, 0x48, 0xf7,
-       0xd0, 0xea, 0x08, 0xff, 0x25, 0x43, 0x67, 0xb0, 0x22, 0x63, 0x4e, 0xf2,
-       0xdf, 0x80, 0x25, 0x93, 0x15, 0x9a, 0xc9, 0xa2, 0x8d, 0x03, 0x25, 0x1b,
-       0x77, 0xe4, 0x3b, 0xdc, 0x95, 0x62, 0x16, 0x68, 0x5f, 0x98, 0x9b, 0x54,
-       0x7e, 0x21, 0xbd, 0x56, 0xa6, 0xb3, 0x10, 0x93, 0xb1, 0x8e, 0x81, 0x49,
-       0xc5, 0xdc, 0xd3, 0xaf, 0x48, 0xf9, 0xab, 0xb4, 0x82, 0xaf, 0x65, 0xb2,
-       0x98, 0xd5, 0x75, 0xdc, 0x9c, 0xd1, 0xbc, 0x16, 0xe2, 0x71, 0xc3, 0x12,
-       0x0d, 0x17, 0xed, 0x74, 0xf1, 0xf6, 0xe2, 0x9f, 0xa3, 0xbc, 0x82, 0x75,
-       0xcf, 0x7c, 0xb1, 0x1c, 0x09, 0xc4, 0xac, 0x3a, 0xc4, 0xf6, 0x86, 0x31,
-       0x6f, 0xe7, 0x59, 0x99, 0xb0, 0x78, 0xdd, 0x9a, 0x3c, 0xa5, 0xb0, 0x0c,
-       0x61, 0xb4, 0xee, 0xbd, 0x82, 0x72, 0x8a, 0x99, 0x02, 0xbe, 0x16, 0xe7,
-       0xbd, 0x35, 0x56, 0x55, 0x96, 0x08, 0x76, 0xef, 0xac, 0xc8, 0xff, 0x68,
-       0xb6, 0x07, 0x2f, 0x15, 0xb0, 0xaf, 0x0d, 0x3f, 0xc0, 0xc8, 0x12, 0xce,
-       0x4f, 0x8c, 0x63, 0x88, 0x64, 0xff, 0xc1, 0x89, 0x70, 0xa6, 0x6a, 0xe3,
-       0xea, 0x39, 0x81, 0x6f, 0x5e, 0x29, 0xf0, 0x6a, 0x7a, 0x5a, 0x8e, 0xb5,
-       0x32, 0xbf, 0x0f, 0x37, 0x56, 0xfe, 0x16, 0xae, 0xee, 0x94, 0x8b, 0x36,
-       0xa2, 0x55, 0xdd, 0xc7, 0x38, 0x2e, 0x69, 0x25, 0xfd, 0xa5, 0x66, 0xf1,
-       0x5f, 0x11, 0xd4, 0xb3, 0x9d, 0xef, 0x96, 0x46, 0x4b, 0x85, 0xe6, 0xfd,
-       0x44, 0xb3, 0x63, 0x48, 0xc5, 0xe6, 0x7c, 0xc7, 0xa9, 0xf7, 0x94, 0xef,
-       0xcb, 0xd9, 0xf9, 0x4c, 0xa7, 0xc3, 0x3e, 0xa6, 0x08, 0xfc, 0x54, 0x35,
-       0x67, 0x72, 0x48, 0x60, 0xb2, 0x04, 0xaf, 0xdd, 0xd1, 0x29, 0xfe, 0xe3,
-       0x94, 0x07, 0x0c, 0xd1, 0xf9, 0xb0, 0x8d, 0x85, 0x43, 0xdf, 0x85, 0xb5,
-       0xcb, 0xc1, 0x4c, 0xc1, 0xc6, 0x54, 0x41, 0xca, 0xed, 0xb6, 0x94, 0xef,
-       0xda, 0xe6, 0x86, 0xe3, 0x21, 0xb8, 0x97, 0x2f, 0xed, 0x4a, 0xd5, 0x86,
-       0x54, 0xd6, 0x4d, 0xee, 0x75, 0x91, 0x5c, 0xb5, 0x5f, 0xf4, 0xe2, 0x89,
-       0x92, 0x81, 0x62, 0x29, 0x85, 0x27, 0x4b, 0xac, 0x7f, 0x8b, 0xbe, 0x17,
-       0x51, 0x7c, 0x66, 0x29, 0xb7, 0x30, 0xbf, 0x3a, 0xc6, 0x17, 0xd8, 0x98,
-       0x2c, 0x28, 0x08, 0x91, 0xce, 0x73, 0x3a, 0xed, 0x2f, 0x9c, 0x25, 0xdb,
-       0x69, 0xe8, 0xf8, 0xa1, 0x8b, 0xdb, 0xed, 0x16, 0x18, 0x37, 0x5a, 0x18,
-       0x2f, 0x68, 0x94, 0xbb, 0x55, 0xf4, 0xe6, 0xc7, 0x31, 0xaf, 0x39, 0x4e,
-       0xb1, 0x26, 0xb0, 0x2a, 0x13, 0x01, 0x56, 0xf2, 0xbb, 0x08, 0xda, 0xad,
-       0x32, 0xda, 0x63, 0x8d, 0x98, 0xbf, 0xf0, 0x9f, 0x30, 0xdb, 0x12, 0x25,
-       0x1d, 0xd7, 0x93, 0x1e, 0x04, 0x54, 0xb2, 0x53, 0x9b, 0x65, 0x11, 0x4e,
-       0x01, 0x2b, 0x49, 0x7b, 0x29, 0x7e, 0x13, 0x24, 0x7b, 0x78, 0x69, 0x1c,
-       0x8f, 0x13, 0xff, 0xa5, 0xbc, 0x94, 0x91, 0xac, 0xb9, 0x61, 0x3b, 0xe5,
-       0x84, 0xe9, 0x62, 0x0f, 0x4a, 0xa5, 0x6f, 0x62, 0x6a, 0x84, 0xf8, 0xcc,
-       0x3b, 0xc4, 0x93, 0xaa, 0x17, 0x85, 0xd9, 0xb7, 0x5a, 0x64, 0xf1, 0x24,
-       0xf9, 0xce, 0x44, 0xc1, 0x34, 0x8e, 0x93, 0x9f, 0xbd, 0x60, 0x37, 0x10,
-       0x9f, 0x2e, 0xe1, 0x32, 0xf0, 0x5c, 0xbe, 0x00, 0xab, 0x85, 0xed, 0x15,
-       0xc1, 0xfd, 0x3b, 0xb3, 0x84, 0x13, 0x83, 0x75, 0xf0, 0xa0, 0x2e, 0xf1,
-       0x4e, 0x6c, 0xb5, 0x87, 0x22, 0x55, 0x1f, 0xaf, 0x27, 0x9a, 0x7d, 0xdd,
-       0x36, 0x42, 0xc3, 0x3d, 0x84, 0x97, 0xfc, 0x15, 0xb7, 0x92, 0xbf, 0x7a,
-       0xb8, 0x9c, 0xe2, 0x21, 0xea, 0xec, 0x49, 0xbf, 0x36, 0xe4, 0xc9, 0x5a,
-       0xcb, 0xea, 0xff, 0x48, 0x6c, 0xc2, 0x27, 0x69, 0xb6, 0x83, 0x4a, 0xf2,
-       0xea, 0x78, 0x39, 0x3d, 0x82, 0x57, 0x8b, 0x7f, 0x82, 0x5c, 0xb3, 0x99,
-       0xda, 0x2c, 0xd6, 0x61, 0x66, 0xe4, 0x0a, 0xe0, 0xcf, 0xd9, 0x7e, 0x02,
-       0xf3, 0xad, 0x75, 0x38, 0x34, 0x76, 0x2f, 0x8e, 0x8c, 0xd6, 0xe3, 0x39,
-       0x2b, 0x86, 0xf6, 0x89, 0x0a, 0x9d, 0x6b, 0xe6, 0x72, 0x93, 0x9e, 0xa6,
-       0xe0, 0x6b, 0xe3, 0x98, 0x14, 0xb8, 0x3e, 0xb3, 0x0e, 0x39, 0xdf, 0xcf,
-       0x3d, 0xac, 0xa1, 0xdc, 0x96, 0xcf, 0xbb, 0x14, 0xd7, 0x75, 0xd8, 0xd9,
-       0x0c, 0x71, 0x0b, 0xd5, 0x93, 0x3b, 0x29, 0x5e, 0xef, 0x54, 0x62, 0x70,
-       0x13, 0x2e, 0xd9, 0x55, 0xe0, 0x22, 0xcb, 0xc0, 0x9e, 0x22, 0x70, 0x77,
-       0x51, 0xc5, 0xdf, 0x14, 0x2f, 0x45, 0xb9, 0x8d, 0xcf, 0x2e, 0x40, 0x79,
-       0x1e, 0x7f, 0x87, 0x31, 0x16, 0x33, 0x13, 0x20, 0x9d, 0xed, 0x2f, 0xa8,
-       0xf8, 0xb1, 0xbd, 0xeb, 0xec, 0xd8, 0x0a, 0x53, 0xcf, 0x51, 0xac, 0x85,
-       0xac, 0xd3, 0xe4, 0x67, 0xfc, 0x0c, 0x7c, 0x3f, 0xff, 0x99, 0xfc, 0xb9,
-       0x4f, 0x53, 0xc5, 0x6d, 0xf9, 0x8e, 0x81, 0x8f, 0x94, 0x8f, 0xe5, 0xbf,
-       0x85, 0x19, 0xff, 0x77, 0xa2, 0x15, 0x7f, 0xdd, 0xc3, 0x79, 0xc4, 0xad,
-       0xf8, 0xed, 0xbc, 0x2f, 0xf8, 0x6d, 0xc5, 0x3f, 0x47, 0xb2, 0xcc, 0x47,
-       0x35, 0xc6, 0x62, 0xb8, 0x68, 0x22, 0x89, 0xba, 0x9d, 0xfc, 0x9b, 0xd7,
-       0x05, 0x2e, 0xee, 0xe6, 0xf8, 0x4a, 0x42, 0xd9, 0x7b, 0x2d, 0xe1, 0x63,
-       0xd9, 0xab, 0xb9, 0xe2, 0x7b, 0x73, 0xf8, 0xcf, 0xe7, 0x98, 0x76, 0xc2,
-       0xb7, 0x74, 0x29, 0x3f, 0xf3, 0x99, 0x3a, 0xfc, 0x7a, 0xaf, 0x69, 0x97,
-       0x95, 0xa5, 0x44, 0x93, 0x63, 0x92, 0x63, 0xf3, 0x2f, 0xe6, 0xce, 0x24,
-       0xc8, 0xce, 0xd3, 0xb2, 0xbc, 0x8a, 0xf1, 0x55, 0xcf, 0x27, 0x11, 0x3a,
-       0x47, 0x57, 0xc5, 0xea, 0xec, 0x97, 0xe9, 0xda, 0x94, 0xf7, 0x5b, 0xd1,
-       0xb0, 0xd0, 0x22, 0x3b, 0xb5, 0xa1, 0x91, 0xe2, 0x3a, 0x62, 0xad, 0x92,
-       0x91, 0x6f, 0xb3, 0x8f, 0x6a, 0x5e, 0xd8, 0xf9, 0x0a, 0x4a, 0x23, 0xcf,
-       0x93, 0x7d, 0xa3, 0xec, 0x8b, 0x1b, 0x3e, 0x12, 0x5f, 0xc1, 0xf4, 0x98,
-       0x88, 0xb2, 0xac, 0xab, 0x28, 0xb6, 0xe7, 0x53, 0x7d, 0xf8, 0xe0, 0xe1,
-       0xbb, 0xe4, 0x58, 0x9f, 0x8e, 0x17, 0xb3, 0x49, 0x5a, 0x67, 0x5f, 0xb2,
-       0xf1, 0x4c, 0x5e, 0xc3, 0xee, 0xe1, 0x84, 0xef, 0xc7, 0xf7, 0x74, 0xd6,
-       0x9d, 0x2a, 0x2b, 0x36, 0x9e, 0x25, 0x3f, 0x3c, 0x58, 0x60, 0x1d, 0xab,
-       0xb8, 0x38, 0xf3, 0x75, 0x59, 0xd3, 0xc6, 0xbe, 0x1d, 0xa1, 0x33, 0x3a,
-       0xe1, 0x8e, 0x42, 0xb7, 0x96, 0xcb, 0x37, 0x56, 0xf0, 0x73, 0x03, 0xad,
-       0xb5, 0xd1, 0xf7, 0x12, 0xd9, 0xf8, 0x3b, 0x7c, 0xe8, 0xff, 0x1b, 0x1f,
-       0xf4, 0x1d, 0xa3, 0x75, 0x90, 0xbf, 0xcc, 0x88, 0xd5, 0x95, 0xfe, 0x46,
-       0x53, 0xad, 0x19, 0xb1, 0xc6, 0xef, 0x69, 0xfc, 0x34, 0x4e, 0x38, 0x7a,
-       0xb1, 0x77, 0x54, 0xca, 0x2d, 0x76, 0x3b, 0x5c, 0x3d, 0x86, 0x2d, 0x16,
-       0xc5, 0xeb, 0x28, 0x9f, 0x91, 0x32, 0x95, 0x5e, 0xd8, 0xa3, 0x8a, 0x16,
-       0xca, 0x99, 0x9e, 0x58, 0x9b, 0x35, 0xc4, 0x9d, 0xa3, 0x2a, 0xf2, 0x85,
-       0x0b, 0x28, 0x27, 0x4b, 0xf9, 0x64, 0x1a, 0xee, 0x60, 0xba, 0x01, 0x2f,
-       0x8f, 0xe9, 0x14, 0x3b, 0x67, 0xe5, 0xf2, 0x64, 0x2f, 0x4a, 0x84, 0xe7,
-       0xd3, 0x74, 0x57, 0xea, 0xb0, 0x88, 0x60, 0x2c, 0x1e, 0xc1, 0x9e, 0x42,
-       0x1c, 0x87, 0xc7, 0x23, 0xd8, 0x46, 0xfe, 0xf7, 0xd3, 0x2c, 0xd3, 0x8c,
-       0x60, 0x73, 0x89, 0x7b, 0x8d, 0x10, 0xe9, 0xc0, 0x13, 0xef, 0xf9, 0x6b,
-       0x0d, 0x58, 0x3e, 0xc6, 0x7b, 0xcf, 0xca, 0x76, 0xcb, 0xd2, 0xdb, 0x43,
-       0xd5, 0x7d, 0xef, 0x50, 0x1f, 0x63, 0x50, 0xef, 0x72, 0x21, 0xe5, 0xaa,
-       0x04, 0xf5, 0x2a, 0x71, 0xea, 0x55, 0xac, 0xb9, 0xfe, 0xcb, 0xa4, 0x48,
-       0x93, 0xf2, 0x19, 0xca, 0x53, 0x6f, 0xd2, 0xe7, 0xa4, 0x4d, 0xe5, 0x96,
-       0x64, 0xbc, 0x78, 0x98, 0x65, 0xf4, 0x84, 0xbd, 0x84, 0x3a, 0xce, 0x69,
-       0xd3, 0x70, 0x95, 0x5f, 0x50, 0x9f, 0x65, 0xa0, 0x63, 0x9a, 0x79, 0x50,
-       0xb1, 0xb5, 0x00, 0x0c, 0x16, 0xe0, 0x1d, 0xa6, 0xd8, 0x6e, 0x99, 0x88,
-       0x22, 0x36, 0xa1, 0x23, 0x3c, 0x91, 0xa2, 0xbd, 0x1a, 0xe2, 0xf4, 0xdb,
-       0xa3, 0xbe, 0xab, 0xc9, 0x69, 0x13, 0x8b, 0x76, 0x9f, 0x91, 0x0f, 0x52,
-       0xac, 0xdd, 0x91, 0x34, 0x7b, 0x6f, 0x14, 0x70, 0x53, 0x43, 0x52, 0xd6,
-       0xa6, 0x6b, 0xa9, 0x7e, 0xcb, 0x43, 0x71, 0x92, 0x3d, 0xea, 0xc8, 0x4d,
-       0xaf, 0x76, 0x5b, 0xf6, 0xab, 0x20, 0xbc, 0x25, 0x3e, 0xc3, 0xeb, 0x9e,
-       0xf8, 0xac, 0xdb, 0xda, 0xf3, 0x16, 0x3a, 0xb1, 0x78, 0x42, 0x15, 0xbf,
-       0x1c, 0x5a, 0x84, 0xcc, 0x34, 0xf4, 0x1a, 0xe2, 0xeb, 0xc3, 0x29, 0xe2,
-       0xbb, 0x40, 0xb2, 0x14, 0x48, 0x96, 0x02, 0xc9, 0x42, 0x7a, 0x39, 0xe8,
-       0xf7, 0x6d, 0x2c, 0x6b, 0x8a, 0xea, 0xef, 0x3b, 0x7e, 0x6f, 0x79, 0xb0,
-       0xc4, 0x72, 0x98, 0xae, 0x07, 0x96, 0x9b, 0xe5, 0x94, 0xf2, 0x2d, 0x9b,
-       0xe5, 0x31, 0x0d, 0x4f, 0x21, 0x6b, 0x4d, 0x1b, 0x48, 0x4d, 0x57, 0xf5,
-       0x21, 0xe5, 0xe7, 0x36, 0xeb, 0x83, 0x65, 0x94, 0xf2, 0x69, 0x92, 0x69,
-       0x2b, 0xc9, 0x38, 0x58, 0x90, 0x87, 0x6a, 0x2c, 0xcb, 0x98, 0x20, 0xde,
-       0x62, 0x24, 0x53, 0x7c, 0x42, 0x23, 0x59, 0x3b, 0xa1, 0x92, 0xac, 0xa1,
-       0x09, 0xe8, 0x0a, 0xeb, 0x69, 0xfa, 0xff, 0xe2, 0x87, 0xfb, 0x6a, 0x4f,
-       0x5c, 0x43, 0xfd, 0xb4, 0x4a, 0xfb, 0x07, 0xc9, 0x77, 0x72, 0x2a, 0x8c,
-       0x5a, 0x4b, 0xa1, 0x3c, 0xac, 0xe1, 0xf1, 0xf1, 0x06, 0x4c, 0x90, 0xdd,
-       0xc7, 0xc6, 0xa1, 0x87, 0xe9, 0xfd, 0xd6, 0x73, 0xfe, 0x04, 0xf2, 0xa7,
-       0x0d, 0x18, 0xa7, 0xfc, 0xf3, 0x40, 0x3e, 0x26, 0x26, 0x46, 0x54, 0x6c,
-       0x29, 0x9c, 0x20, 0xd9, 0x24, 0xe5, 0xd8, 0xcd, 0x09, 0xda, 0x22, 0x36,
-       0xdb, 0x66, 0x0f, 0x70, 0x05, 0xf9, 0x5a, 0x08, 0x6b, 0x2d, 0xb8, 0xdb,
-       0xed, 0x2b, 0x30, 0xdb, 0x07, 0x63, 0x87, 0xed, 0xe9, 0x35, 0x30, 0x8f,
-       0x5e, 0x43, 0xa3, 0xc0, 0xe5, 0x24, 0xc7, 0x80, 0xe5, 0x6d, 0xa0, 0x84,
-       0x44, 0xf9, 0xdb, 0xec, 0x3f, 0x42, 0x36, 0x28, 0x52, 0x5d, 0x2b, 0x52,
-       0x0f, 0x78, 0x60, 0xf4, 0x8c, 0xbc, 0x3d, 0x6d, 0xba, 0x49, 0x5a, 0x0b,
-       0x0f, 0x69, 0xd8, 0x5f, 0xd2, 0x28, 0x5e, 0x4c, 0x1b, 0xe0, 0x98, 0x87,
-       0x56, 0x4b, 0x3d, 0xda, 0x47, 0xd6, 0xa3, 0xd4, 0x0b, 0x6b, 0xa0, 0x3e,
-       0x19, 0x57, 0x8f, 0x08, 0xec, 0xa7, 0xf8, 0x9d, 0x5a, 0x64, 0x1e, 0x5d,
-       0x0d, 0xaf, 0xdc, 0x0e, 0x73, 0xa0, 0x96, 0x18, 0xf9, 0x74, 0xa8, 0x86,
-       0xfa, 0xc2, 0x4e, 0xfb, 0x35, 0x98, 0xfa, 0xfe, 0xd0, 0xaf, 0xe4, 0x64,
-       0x1c, 0x17, 0x84, 0x71, 0x52, 0x1a, 0xdf, 0xe2, 0x33, 0x2c, 0xf7, 0x06,
-       0x6c, 0xcf, 0x42, 0x0b, 0x3b, 0x6a, 0x7a, 0x7f, 0x1e, 0x38, 0x96, 0x37,
-       0x30, 0xb9, 0xa8, 0x0e, 0x68, 0xee, 0xe8, 0xb9, 0x03, 0xde, 0xaa, 0xb0,
-       0xdf, 0xe7, 0x6a, 0xe9, 0x3c, 0xf9, 0xc8, 0x7a, 0x21, 0xf0, 0x24, 0xd1,
-       0x5a, 0x30, 0xc5, 0x7d, 0x89, 0x9a, 0x5e, 0x48, 0x79, 0x76, 0x5b, 0x49,
-       0xa0, 0xd6, 0x32, 0xf5, 0x59, 0xb0, 0x6e, 0x74, 0xd2, 0xe9, 0x19, 0x89,
-       0x66, 0x96, 0xdd, 0xcb, 0x91, 0x9c, 0xab, 0xb6, 0x12, 0xff, 0x6b, 0x48,
-       0xa6, 0xdb, 0x2d, 0xaf, 0x87, 0xb0, 0x52, 0xed, 0x31, 0x13, 0x1f, 0x90,
-       0xec, 0x6b, 0x29, 0x47, 0x8c, 0x95, 0x86, 0x9b, 0x38, 0x1f, 0x4c, 0x94,
-       0x78, 0x4e, 0xea, 0xc1, 0xd5, 0xf9, 0x6a, 0x2c, 0xb0, 0xdd, 0xd9, 0xe6,
-       0x17, 0xfa, 0xf5, 0xfb, 0xa0, 0xef, 0x23, 0xdc, 0x3f, 0xf5, 0x60, 0xb4,
-       0x53, 0xa1, 0xde, 0x5c, 0xca, 0x15, 0x96, 0x39, 0xc2, 0xf9, 0x99, 0x7c,
-       0xdd, 0xdd, 0x67, 0x37, 0x51, 0x6c, 0xc2, 0x7b, 0xc2, 0x36, 0x50, 0xe3,
-       0xb0, 0x4f, 0x34, 0x90, 0x8f, 0x47, 0xb0, 0x9d, 0x7c, 0x44, 0xb3, 0xac,
-       0x14, 0x35, 0x53, 0xfa, 0xb1, 0x2c, 0xed, 0x2d, 0xc1, 0x28, 0xd9, 0xf5,
-       0x98, 0x6d, 0x55, 0xd1, 0xec, 0x1c, 0x92, 0x2d, 0xd6, 0x7f, 0x10, 0x7d,
-       0x4b, 0xbf, 0x1b, 0xab, 0x61, 0xb4, 0x1a, 0x68, 0x70, 0xf8, 0xfd, 0x69,
-       0x39, 0xdb, 0x1c, 0x21, 0xff, 0xe2, 0x3d, 0x96, 0x77, 0x10, 0xbf, 0x96,
-       0x88, 0xf1, 0x5e, 0x97, 0xf2, 0x27, 0xc4, 0x0c, 0xd1, 0x42, 0x0b, 0xc7,
-       0x2d, 0xf7, 0xe7, 0xd6, 0xd1, 0x43, 0x54, 0x53, 0x8c, 0x16, 0x50, 0x2e,
-       0x55, 0x11, 0x72, 0x2c, 0x7d, 0x1f, 0x8e, 0x92, 0xcd, 0xd9, 0x45, 0x2e,
-       0x12, 0xd7, 0xed, 0xba, 0x50, 0xf4, 0xee, 0x92, 0xb2, 0x33, 0x0d, 0x9a,
-       0xc2, 0x92, 0xc6, 0x4b, 0xb4, 0xba, 0x85, 0x7c, 0xbf, 0xd1, 0x89, 0x88,
-       0xe2, 0x2e, 0xe8, 0x07, 0x6c, 0x8d, 0xf2, 0xae, 0x94, 0xdb, 0xd2, 0x06,
-       0xa6, 0x6d, 0xea, 0xc7, 0x5b, 0xc3, 0x68, 0xb6, 0xa0, 0xeb, 0x8e, 0x35,
-       0xf0, 0x14, 0xee, 0x26, 0x3e, 0x11, 0x99, 0x4f, 0x35, 0x90, 0xd6, 0xc4,
-       0x5e, 0xbb, 0x0e, 0xee, 0x4d, 0x02, 0x11, 0x27, 0x4e, 0xbc, 0xd5, 0x20,
-       0xe7, 0x3f, 0xb3, 0x8c, 0x70, 0xdf, 0xb7, 0x7f, 0x44, 0xf2, 0x8a, 0xf9,
-       0xf5, 0x0e, 0xaf, 0x59, 0x76, 0x11, 0xeb, 0xa9, 0xe7, 0xa7, 0x25, 0x7a,
-       0xbf, 0x85, 0xde, 0x3f, 0x44, 0xb8, 0x73, 0x31, 0x7f, 0xd6, 0x6b, 0x6a,
-       0x77, 0xac, 0xf2, 0x73, 0x78, 0x90, 0x64, 0xe0, 0xfc, 0xcd, 0x6b, 0xcc,
-       0xf3, 0x22, 0xe6, 0x99, 0x6a, 0x37, 0xfb, 0x95, 0x8d, 0x8f, 0xf2, 0x77,
-       0x73, 0x0f, 0xef, 0xee, 0xb0, 0x21, 0x26, 0xec, 0x3d, 0x28, 0xeb, 0x68,
-       0x8a, 0x3a, 0x56, 0xff, 0x34, 0xa0, 0x44, 0x9c, 0x51, 0x14, 0x9b, 0x81,
-       0x87, 0x0a, 0x96, 0xb7, 0x51, 0x31, 0x07, 0xe2, 0xd4, 0xf7, 0x9e, 0xfc,
-       0xa1, 0x8a, 0x9d, 0x9d, 0x65, 0x33, 0x46, 0x46, 0x8f, 0x3a, 0x51, 0xf1,
-       0xe2, 0x2e, 0x05, 0x0b, 0x96, 0xa8, 0x78, 0x8b, 0x72, 0xc8, 0x36, 0x9a,
-       0x45, 0xc2, 0x96, 0xda, 0x54, 0xe9, 0x89, 0x7f, 0x5f, 0x3c, 0x9a, 0xa4,
-       0xb1, 0x6a, 0x4c, 0x5a, 0x7d, 0x07, 0xf0, 0xa8, 0x74, 0x9b, 0xd9, 0x16,
-       0x11, 0xca, 0xc3, 0xe7, 0xf2, 0x50, 0x6a, 0x8a, 0xf0, 0x0f, 0x76, 0xbf,
-       0xeb, 0xfb, 0x0c, 0xd9, 0xd2, 0x7d, 0x23, 0x0f, 0xd1, 0x94, 0x71, 0x30,
-       0xdb, 0xcc, 0x76, 0xe1, 0xf9, 0x99, 0x94, 0x37, 0x4c, 0xc3, 0x47, 0x8b,
-       0x8a, 0xc5, 0x19, 0x34, 0x29, 0x8e, 0x75, 0x6a, 0x2f, 0xf1, 0xdc, 0xee,
-       0x34, 0xe1, 0x74, 0x0b, 0xe7, 0xc4, 0xa8, 0xf8, 0xd9, 0xa8, 0xd9, 0x43,
-       0x3d, 0xee, 0xaa, 0x8d, 0x30, 0xfb, 0xee, 0x11, 0xd4, 0x97, 0x11, 0xef,
-       0x56, 0x92, 0xf8, 0xb4, 0x55, 0xc4, 0x93, 0x65, 0x33, 0x8e, 0x2a, 0xbf,
-       0x67, 0x65, 0xcc, 0xb2, 0xbc, 0x98, 0xf2, 0x1b, 0x99, 0xce, 0xb0, 0x8f,
-       0xdf, 0x85, 0xda, 0x98, 0x40, 0x4d, 0x66, 0xc4, 0xd7, 0x6d, 0x94, 0xec,
-       0xdd, 0x94, 0x51, 0x89, 0xb6, 0x4a, 0x39, 0x9d, 0x68, 0x2f, 0x1e, 0xa0,
-       0x9e, 0x85, 0x75, 0xfa, 0x92, 0xcc, 0x7d, 0x9b, 0xe5, 0xbc, 0x65, 0x4e,
-       0x66, 0xd2, 0x6c, 0x3d, 0xff, 0x96, 0x0d, 0xac, 0xfb, 0x43, 0x94, 0xcf,
-       0x17, 0x2f, 0xed, 0xda, 0x31, 0xa0, 0x3c, 0x20, 0x8d, 0x15, 0x6c, 0xdb,
-       0x46, 0x7a, 0xef, 0xdb, 0x9d, 0xfa, 0xa9, 0x77, 0xf0, 0xda, 0x50, 0x54,
-       0x34, 0xed, 0xf6, 0xfc, 0xda, 0xf9, 0x2a, 0xf1, 0xf5, 0x61, 0x9a, 0xf9,
-       0xe1, 0x78, 0x7b, 0x07, 0x97, 0x16, 0xff, 0x94, 0xf6, 0x86, 0x88, 0x17,
-       0x68, 0x31, 0x92, 0x75, 0x05, 0xcd, 0x25, 0x57, 0x67, 0x0e, 0x48, 0x57,
-       0x67, 0xfc, 0xa4, 0xf7, 0x51, 0xd6, 0x3b, 0xcf, 0x45, 0x55, 0xdd, 0xf3,
-       0x7e, 0x3e, 0x3f, 0x4c, 0x31, 0xc9, 0xb6, 0x44, 0x53, 0x83, 0xc3, 0xfa,
-       0x85, 0xa8, 0x73, 0xba, 0x8c, 0x85, 0x62, 0x87, 0xf4, 0xe2, 0xd5, 0x7c,
-       0x16, 0x15, 0x13, 0xfe, 0x79, 0xa6, 0xfd, 0xe5, 0xf3, 0x6d, 0xe2, 0xd8,
-       0xc3, 0x54, 0x7c, 0xeb, 0x7d, 0x7f, 0xe9, 0x7d, 0x92, 0xe2, 0x49, 0x73,
-       0x6e, 0x95, 0xa9, 0x56, 0xf6, 0x37, 0x28, 0x2f, 0xdb, 0xb7, 0xc8, 0x5c,
-       0x2b, 0xfb, 0x1d, 0xbc, 0x38, 0xe1, 0xd9, 0xb9, 0xfb, 0x3c, 0x1f, 0xd7,
-       0x74, 0x4a, 0x39, 0x61, 0x5f, 0x45, 0xba, 0x60, 0x3c, 0x55, 0x5d, 0xfc,
-       0xe5, 0x9c, 0x6e, 0xa8, 0x89, 0xae, 0xaf, 0xd4, 0x2b, 0xce, 0x69, 0x35,
-       0xce, 0x1b, 0x78, 0x31, 0xaf, 0xb4, 0x85, 0xd1, 0x84, 0x3e, 0x5b, 0xe0,
-       0xdd, 0x1e, 0x81, 0xd3, 0x97, 0x47, 0x10, 0xba, 0xcc, 0x2a, 0x77, 0x84,
-       0xfa, 0x25, 0xe6, 0x95, 0xc9, 0x51, 0xce, 0x48, 0xad, 0x53, 0x45, 0xed,
-       0xa5, 0x5c, 0xa7, 0xd8, 0x0e, 0x0a, 0xfe, 0x85, 0xf6, 0x5d, 0x77, 0xa9,
-       0x65, 0x74, 0x50, 0x4b, 0xe0, 0xf5, 0x5d, 0x9d, 0x09, 0x9f, 0xf3, 0x43,
-       0xe6, 0xe1, 0x4a, 0x5f, 0x06, 0xf6, 0xc7, 0xc5, 0x64, 0xc7, 0xdc, 0x0a,
-       0x05, 0xe9, 0x25, 0xf0, 0x22, 0xf4, 0x7e, 0xdb, 0x2e, 0xf6, 0x85, 0x47,
-       0x74, 0x9e, 0x09, 0x81, 0xae, 0x84, 0x0e, 0x6b, 0xd5, 0x0b, 0x44, 0x9b,
-       0xfa, 0x4d, 0xd2, 0x07, 0xd3, 0xaa, 0xe2, 0xa9, 0xe2, 0x88, 0x8a, 0xd3,
-       0x0f, 0xf3, 0x19, 0x08, 0xd6, 0x51, 0x7a, 0x01, 0xc5, 0x76, 0x46, 0x9d,
-       0x93, 0x6d, 0x40, 0xaf, 0xf4, 0x61, 0x51, 0x31, 0x35, 0xca, 0xf8, 0x7c,
-       0x3f, 0x42, 0x91, 0x7d, 0x2b, 0xcd, 0x7b, 0x7e, 0x23, 0x17, 0x64, 0xfe,
-       0x9d, 0xf6, 0x30, 0xde, 0xa8, 0x38, 0xe2, 0xd3, 0xae, 0xe8, 0x68, 0x8a,
-       0x74, 0x3d, 0x91, 0xae, 0xe2, 0xd9, 0x48, 0x7b, 0xd8, 0xe7, 0x98, 0x87,
-       0x5e, 0xf1, 0x78, 0x9e, 0xf2, 0x0a, 0xd5, 0xdc, 0x89, 0xac, 0x62, 0xd5,
-       0x42, 0x62, 0xb3, 0xad, 0x63, 0x99, 0x5e, 0xa9, 0x57, 0xf7, 0xe7, 0xab,
-       0xf7, 0x3f, 0xbd, 0xa2, 0x90, 0x57, 0xa8, 0x7f, 0x83, 0x5e, 0xef, 0x28,
-       0xf7, 0x34, 0x51, 0x2c, 0xbd, 0x46, 0xb5, 0xeb, 0xd5, 0xb1, 0x5e, 0x91,
-       0xcf, 0xeb, 0x78, 0x65, 0x7c, 0xb9, 0x78, 0x30, 0x6f, 0xe1, 0xe5, 0x62,
-       0xe5, 0x2e, 0xe8, 0x81, 0xa2, 0x2b, 0xc6, 0xf3, 0xdc, 0xfb, 0x98, 0xa9,
-       0x32, 0x66, 0xc4, 0x5a, 0xc2, 0x53, 0x56, 0x2f, 0xf4, 0xeb, 0xc8, 0x78,
-       0xb1, 0x01, 0x93, 0x63, 0x95, 0x7a, 0x77, 0xeb, 0xb9, 0x7a, 0xf7, 0xc5,
-       0x3b, 0x9d, 0x48, 0x4e, 0x77, 0xd0, 0xd7, 0x38, 0xbc, 0x49, 0x46, 0xad,
-       0x10, 0xd5, 0x49, 0x2b, 0x37, 0x2d, 0x22, 0x3d, 0x3b, 0xba, 0x99, 0x5f,
-       0xf4, 0x69, 0xd4, 0x63, 0x4c, 0x14, 0xd9, 0x5f, 0x0d, 0x18, 0xc5, 0x6f,
-       0xb5, 0x56, 0xec, 0xdc, 0x96, 0xd3, 0x1c, 0xa0, 0x9e, 0xfa, 0x8b, 0x06,
-       0x9a, 0x0d, 0xea, 0x9c, 0x1b, 0xbd, 0x8e, 0x6e, 0xe4, 0x54, 0xc7, 0xea,
-       0xb9, 0x5e, 0xac, 0x5c, 0xa9, 0x38, 0xf7, 0xad, 0x0c, 0x4d, 0x1b, 0xc6,
-       0x16, 0xbf, 0x0e, 0x9d, 0x1c, 0xd8, 0x4f, 0x33, 0x50, 0x0d, 0xcd, 0xa5,
-       0xef, 0xe9, 0xb8, 0x2f, 0xd4, 0x7d, 0x1f, 0x36, 0xe5, 0x07, 0xf0, 0xb7,
-       0x79, 0xce, 0x13, 0x3a, 0x1e, 0x63, 0x1e, 0x0a, 0x7c, 0xff, 0x73, 0xb0,
-       0x85, 0x6b, 0xdf, 0x23, 0x25, 0x8a, 0xc3, 0x21, 0xe4, 0x12, 0x8e, 0x9f,
-       0x47, 0x12, 0xa7, 0xc4, 0xf9, 0xfd, 0xbf, 0xbb, 0x97, 0xf5, 0x46, 0xfd,
-       0x1c, 0xcd, 0x4e, 0x4a, 0xf6, 0x4a, 0xbe, 0x7f, 0xf2, 0x03, 0x74, 0x3b,
-       0xe5, 0x91, 0x0f, 0x6c, 0x13, 0x63, 0x7a, 0xc5, 0x7e, 0xdb, 0x47, 0xb9,
-       0x1e, 0x7d, 0x42, 0xf5, 0x28, 0x2a, 0xb6, 0xd2, 0x73, 0xa3, 0xf3, 0x4a,
-       0x7a, 0x8a, 0x78, 0x3f, 0x46, 0x39, 0x26, 0xe1, 0x1c, 0x47, 0xa2, 0xc0,
-       0xb3, 0xfa, 0x51, 0x9a, 0xd5, 0xcd, 0xdc, 0x32, 0x8a, 0xe7, 0x03, 0x76,
-       0xd7, 0xc0, 0xa0, 0x30, 0x8f, 0x52, 0x6d, 0x4e, 0x1c, 0xa0, 0xb9, 0x8b,
-       0xbe, 0x37, 0xb4, 0x87, 0xba, 0xec, 0x75, 0x30, 0xdd, 0x85, 0xc2, 0x34,
-       0x5e, 0x17, 0xa6, 0x5e, 0x23, 0x58, 0x27, 0x9f, 0x60, 0x91, 0xaf, 0x9b,
-       0xe3, 0xb0, 0xfc, 0xef, 0x57, 0xd2, 0x1d, 0xfe, 0xf7, 0xd1, 0xf4, 0xc5,
-       0xe7, 0x7b, 0x0b, 0x77, 0x07, 0xd5, 0xc6, 0x7c, 0x21, 0x83, 0x48, 0x33,
-       0xd7, 0x8a, 0xa8, 0x38, 0xb0, 0x0b, 0x5a, 0xbd, 0xf3, 0x3e, 0xbe, 0x3e,
-       0x04, 0x4d, 0x73, 0xa8, 0xd2, 0x12, 0x2f, 0xd4, 0x1b, 0xa4, 0xae, 0x13,
-       0xdc, 0x0f, 0x74, 0xe5, 0x9e, 0x80, 0xd9, 0x53, 0x43, 0x34, 0x3e, 0x01,
-       0xe3, 0x7a, 0x1f, 0x49, 0x1f, 0xe7, 0x2c, 0xce, 0xe3, 0x8c, 0x8a, 0xc1,
-       0xd1, 0xa8, 0xd8, 0x4c, 0xb2, 0xb4, 0x3b, 0x27, 0x71, 0x85, 0xcf, 0xff,
-       0x2b, 0xc4, 0x3f, 0xe7, 0x9c, 0x13, 0x94, 0x73, 0x18, 0xef, 0xd1, 0x34,
-       0xe3, 0x1d, 0xa0, 0x3e, 0xf3, 0x7a, 0xdb, 0x4c, 0xf5, 0x84, 0xcc, 0x44,
-       0x97, 0x30, 0x29, 0xa9, 0xb1, 0x3c, 0x5d, 0xfd, 0x33, 0xe0, 0xb9, 0xd8,
-       0x97, 0xa9, 0xa7, 0x9e, 0x64, 0x1a, 0x22, 0x7a, 0x1f, 0xfa, 0xf4, 0x4e,
-       0xce, 0xd1, 0x3b, 0xf1, 0x07, 0x64, 0x52, 0xdd, 0xfb, 0xc9, 0x1e, 0xdb,
-       0x0a, 0xaf, 0xc8, 0xce, 0xd6, 0x8a, 0x4c, 0x83, 0x3e, 0x2f, 0x3f, 0x49,
-       0x33, 0x2f, 0x51, 0x67, 0x86, 0xe6, 0x48, 0xa6, 0x6d, 0xae, 0x22, 0xba,
-       0x44, 0xb3, 0xcb, 0x18, 0x10, 0x66, 0x3f, 0xe9, 0xad, 0x6f, 0xdc, 0xd7,
-       0xdb, 0x4f, 0xd2, 0x5d, 0x3e, 0xce, 0x19, 0xea, 0x39, 0xbe, 0xe8, 0x93,
-       0xec, 0x73, 0xd5, 0xbb, 0xca, 0x94, 0x78, 0x8a, 0x7a, 0x97, 0xa7, 0x8a,
-       0xaa, 0xd8, 0x47, 0xf6, 0x1c, 0xa7, 0xb8, 0x19, 0xf4, 0xef, 0x1f, 0xa9,
-       0x06, 0x96, 0xbe, 0xd7, 0x3c, 0x97, 0x6f, 0xc8, 0xae, 0x65, 0xb2, 0x6b,
-       0x27, 0x65, 0x65, 0xee, 0xd9, 0xb8, 0xde, 0x1d, 0xa6, 0x7a, 0x27, 0xf0,
-       0xa1, 0x9f, 0x63, 0x0f, 0xa3, 0xb3, 0xc8, 0x3d, 0xa1, 0x25, 0x96, 0xe7,
-       0x8d, 0xdc, 0x7c, 0xc2, 0xfd, 0x7e, 0xa9, 0x92, 0x1f, 0xa9, 0x36, 0xba,
-       0x21, 0xa7, 0x47, 0xbc, 0x50, 0xe4, 0x9f, 0x54, 0x4c, 0x62, 0xec, 0x5b,
-       0xae, 0x68, 0xea, 0xf4, 0xd0, 0xde, 0xe9, 0x49, 0xd5, 0xb2, 0xca, 0xef,
-       0x0b, 0xeb, 0x94, 0x15, 0x72, 0x6f, 0x9f, 0x8f, 0x4d, 0xb8, 0x6c, 0xb1,
-       0x7b, 0x73, 0x02, 0xfe, 0x4c, 0x6c, 0x50, 0x4c, 0xa2, 0xb7, 0x3b, 0xd9,
-       0x33, 0x2d, 0x92, 0xd4, 0x43, 0x25, 0xbd, 0x94, 0x48, 0xa6, 0x8e, 0xc3,
-       0xd6, 0x8e, 0x14, 0x6d, 0xed, 0x8d, 0x62, 0xf5, 0x6e, 0x93, 0xe5, 0x62,
-       0x5f, 0xe5, 0xf8, 0xb0, 0xdc, 0xfb, 0x29, 0x0f, 0xc1, 0xef, 0x43, 0xe4,
-       0xa1, 0x46, 0x8a, 0xb1, 0x3b, 0x51, 0x4b, 0x4d, 0xb3, 0xdc, 0xde, 0x44,
-       0xf3, 0xcf, 0x5d, 0x44, 0xbf, 0xdc, 0x9a, 0x03, 0xd7, 0x93, 0x47, 0xf8,
-       0xc2, 0xb9, 0x85, 0x79, 0x7a, 0x33, 0x52, 0x91, 0x91, 0xca, 0x70, 0xe5,
-       0xff, 0x17, 0xd2, 0x1a, 0x28, 0x06, 0xd7, 0x0d, 0x09, 0xea, 0xef, 0x2b,
-       0xf1, 0xb8, 0x90, 0xef, 0x4e, 0xfd, 0x7b, 0xb3, 0x57, 0x64, 0xa5, 0xde,
-       0x7f, 0xdc, 0xcc, 0x77, 0x51, 0x8a, 0x33, 0x1c, 0xfb, 0xed, 0xb3, 0x15,
-       0xdd, 0xf2, 0x1c, 0x7f, 0xa8, 0xe4, 0x8a, 0x6b, 0xf3, 0xd8, 0x40, 0xbd,
-       0x83, 0x1b, 0x26, 0x1c, 0xd7, 0x16, 0x7b, 0x49, 0x37, 0x96, 0x31, 0x48,
-       0x44, 0xb7, 0xea, 0x5d, 0xfa, 0x38, 0xf5, 0x5a, 0x84, 0xcb, 0xa0, 0x7e,
-       0x94, 0x62, 0x7c, 0x1e, 0x76, 0xcc, 0xc5, 0x54, 0xbd, 0xc3, 0x77, 0xbb,
-       0x03, 0x62, 0xe1, 0x54, 0x25, 0xcd, 0x1f, 0x3a, 0x27, 0xdf, 0x69, 0xb9,
-       0xfd, 0x26, 0x7e, 0x5f, 0x3f, 0x67, 0x93, 0x2b, 0x99, 0x26, 0xfd, 0x7e,
-       0x76, 0x8e, 0x87, 0x3f, 0x74, 0xf6, 0x8e, 0xaf, 0xfe, 0xf6, 0x99, 0x59,
-       0xe2, 0x93, 0x7b, 0x45, 0x78, 0x31, 0x87, 0xfb, 0xc4, 0x0b, 0xe7, 0x7c,
-       0xe1, 0x52, 0xc2, 0xbd, 0x01, 0x37, 0xd2, 0x7c, 0xd4, 0x49, 0x73, 0x28,
-       0xcd, 0x2e, 0x48, 0x0d, 0xb3, 0x3e, 0xce, 0x90, 0x3e, 0xd8, 0xe6, 0xa7,
-       0xc8, 0xe6, 0x1d, 0x39, 0x8a, 0x99, 0xd4, 0x7a, 0x61, 0xf6, 0x92, 0xbf,
-       0x51, 0xed, 0x32, 0x13, 0x1f, 0xc3, 0x34, 0xd6, 0xfa, 0x3e, 0x7d, 0x66,
-       0xce, 0xa7, 0x4f, 0xb1, 0x4f, 0xa3, 0x6f, 0x38, 0x04, 0x25, 0xf3, 0x29,
-       0xe9, 0x8c, 0xe2, 0x4d, 0x30, 0x4e, 0xce, 0x53, 0x67, 0x40, 0xfd, 0xb2,
-       0x36, 0x9f, 0xf6, 0xc8, 0x42, 0x47, 0xe2, 0x28, 0xf5, 0xdb, 0xfb, 0xc0,
-       0x25, 0xa3, 0xeb, 0xe8, 0x31, 0x61, 0x96, 0xdf, 0x0b, 0x71, 0x0e, 0x10,
-       0x68, 0xcc, 0x54, 0xf0, 0x5d, 0x5e, 0x4c, 0x60, 0x47, 0xa9, 0x82, 0xf3,
-       0x32, 0xf2, 0xe1, 0x31, 0xff, 0x7e, 0x41, 0x81, 0x96, 0x79, 0x9b, 0x6b,
-       0x33, 0xc1, 0x25, 0x73, 0xf2, 0x7f, 0x67, 0xce, 0x06, 0x6f, 0xce, 0xe9,
-       0x67, 0x4b, 0x8c, 0x6b, 0x8f, 0x96, 0xe1, 0x7c, 0x0d, 0xb1, 0x26, 0xff,
-       0x67, 0x54, 0x03, 0x34, 0xea, 0x81, 0xfd, 0xbc, 0x8f, 0x5c, 0x11, 0x94,
-       0xbf, 0xcb, 0xb5, 0x47, 0xec, 0xf0, 0x5c, 0xfe, 0xfa, 0x06, 0xad, 0xf5,
-       0xd1, 0x87, 0x75, 0xc6, 0x77, 0x12, 0x37, 0xd1, 0xb3, 0xeb, 0xef, 0xeb,
-       0xcf, 0xa3, 0xa7, 0x36, 0x4d, 0xfd, 0xad, 0xbf, 0xcf, 0xbf, 0xaf, 0xa0,
-       0x3d, 0xcb, 0xf9, 0xdd, 0x08, 0xdf, 0xb5, 0xac, 0xce, 0x26, 0x8d, 0xcd,
-       0x60, 0x3a, 0x06, 0xd6, 0x14, 0x0d, 0xdc, 0x4a, 0x75, 0x61, 0xcc, 0xbf,
-       0x07, 0x3d, 0x3f, 0xf7, 0x28, 0xb4, 0x6f, 0x19, 0xed, 0x1b, 0xf4, 0xd7,
-       0x0c, 0x2c, 0x2f, 0x9e, 0x9f, 0xe9, 0x54, 0x3a, 0x77, 0xe8, 0xdc, 0x1c,
-       0xcb, 0x76, 0x70, 0xc5, 0xce, 0x7c, 0xaf, 0x18, 0xc9, 0x47, 0x89, 0x96,
-       0x42, 0x19, 0x40, 0xa2, 0x23, 0x73, 0x33, 0xe5, 0x5d, 0x2b, 0xa5, 0x2a,
-       0x4d, 0x58, 0x9b, 0x22, 0x3f, 0xd6, 0x97, 0xe2, 0x8e, 0x54, 0x0d, 0xf5,
-       0x34, 0xc3, 0xb8, 0x4d, 0xaf, 0x45, 0x7f, 0xea, 0x52, 0xe0, 0xc6, 0x3a,
-       0xea, 0x41, 0x06, 0xfc, 0x9e, 0xbe, 0x86, 0xe8, 0xd5, 0x59, 0x4f, 0xe1,
-       0xf6, 0x73, 0xff, 0xae, 0x42, 0x34, 0x7e, 0xef, 0x3c, 0x77, 0x33, 0xdc,
-       0xe6, 0x1e, 0xaa, 0x83, 0xdd, 0x58, 0x97, 0x0a, 0x53, 0x6f, 0xcd, 0xf9,
-       0x61, 0x3e, 0x22, 0xd6, 0x67, 0x72, 0xfd, 0xb9, 0x3e, 0x67, 0x46, 0xcc,
-       0x90, 0x5c, 0xa8, 0xf5, 0xc4, 0x73, 0x34, 0xbf, 0x65, 0x4a, 0x7c, 0x1f,
-       0xa5, 0x20, 0x66, 0xf1, 0xcc, 0x48, 0xc3, 0x1f, 0xcd, 0x59, 0xe9, 0xc7,
-       0xeb, 0x71, 0xd5, 0xbe, 0x06, 0x64, 0xf6, 0xe9, 0xb0, 0x1f, 0xb7, 0x68,
-       0x2d, 0x45, 0x9f, 0x19, 0xb1, 0xb7, 0xf8, 0x87, 0x68, 0x77, 0x60, 0x8d,
-       0xfe, 0x3f, 0x95, 0x7d, 0x0b, 0x70, 0x54, 0xe7, 0x95, 0xe6, 0x77, 0xfb,
-       0x21, 0xb5, 0x9e, 0x5c, 0x09, 0x09, 0x5a, 0x20, 0x9b, 0x6e, 0xf7, 0x6d,
-       0xa9, 0x8d, 0x3a, 0xe1, 0x36, 0x88, 0xb5, 0x9c, 0xed, 0x2d, 0x1a, 0x2c,
-       0x8c, 0x08, 0x60, 0xcb, 0xb6, 0x3c, 0x83, 0x77, 0x32, 0x6b, 0xc5, 0x36,
-       0x18, 0x3f, 0x92, 0x91, 0x09, 0x5b, 0x25, 0x53, 0x53, 0xd1, 0x1d, 0x01,
-       0x42, 0x40, 0xbf, 0x24, 0xc1, 0x00, 0x33, 0x53, 0xe3, 0x46, 0x0f, 0x20,
-       0xb8, 0x5b, 0xc2, 0x71, 0x66, 0x4a, 0xc9, 0xd4, 0x56, 0x34, 0x20, 0x0c,
-       0x04, 0x63, 0x3c, 0x93, 0x99, 0x29, 0xb2, 0xeb, 0x2d, 0x13, 0x1c, 0xc0,
-       0x0f, 0xfc, 0x4c, 0xb2, 0x16, 0xf1, 0xc4, 0x77, 0xbf, 0x73, 0xbb, 0x1b,
-       0x04, 0x45, 0x3c, 0x35, 0x54, 0x75, 0xb5, 0x6e, 0xdf, 0xff, 0xfe, 0x8f,
-       0xf3, 0x9f, 0xf3, 0x9d, 0xef, 0x9c, 0xf3, 0xdf, 0xa2, 0x84, 0xfe, 0xfb,
-       0xdf, 0xcc, 0x75, 0x8c, 0x4f, 0xdc, 0x0b, 0x69, 0x66, 0xb3, 0x65, 0xbc,
-       0x0b, 0x5f, 0x0e, 0x24, 0x9c, 0xe8, 0xea, 0x77, 0xe0, 0xda, 0xa2, 0x73,
-       0xa6, 0x67, 0xf6, 0x8d, 0xfc, 0x4e, 0xc4, 0xe6, 0xc4, 0x33, 0xfd, 0xf2,
-       0xed, 0x40, 0x60, 0x71, 0x36, 0xe7, 0xba, 0x61, 0xd0, 0x89, 0xa7, 0xd9,
-       0xf6, 0xa2, 0x6e, 0xcb, 0xed, 0xb1, 0x55, 0x1b, 0xc0, 0x73, 0xfd, 0x8c,
-       0x6d, 0x34, 0x13, 0xcf, 0x86, 0x8a, 0x71, 0x7f, 0x75, 0x76, 0x1d, 0xc3,
-       0x5c, 0x87, 0xe1, 0x30, 0x94, 0x4c, 0xa3, 0x13, 0xe5, 0x9c, 0x3f, 0xb9,
-       0x18, 0x7e, 0x98, 0x29, 0xc1, 0xe8, 0x81, 0x71, 0x25, 0x9d, 0xce, 0xb6,
-       0x19, 0xb2, 0x62, 0x5a, 0x43, 0x19, 0x6b, 0xb4, 0x61, 0x26, 0xfd, 0xfb,
-       0x85, 0x8c, 0x03, 0x9f, 0x65, 0x5c, 0xf8, 0x74, 0xa4, 0x18, 0xbf, 0x3e,
-       0x50, 0xc2, 0x8f, 0x8a, 0x4f, 0x46, 0x34, 0xfe, 0xde, 0xac, 0xbc, 0x12,
-       0x95, 0xd8, 0x23, 0x80, 0x4f, 0x33, 0xe3, 0xca, 0xd1, 0xaf, 0x5c, 0x6b,
-       0xc6, 0xfc, 0x8e, 0x6a, 0x70, 0xcc, 0xbf, 0x36, 0xbf, 0x3b, 0x4d, 0xae,
-       0xd3, 0xc7, 0xaa, 0xd4, 0x4a, 0xf0, 0xd9, 0x01, 0x19, 0x47, 0xfa, 0x6f,
-       0x56, 0x5e, 0x8d, 0x8a, 0x7c, 0x2b, 0xf1, 0xeb, 0x11, 0x91, 0xe3, 0x27,
-       0xd4, 0x69, 0xe9, 0x7f, 0x5c, 0x39, 0x9e, 0x7b, 0xe6, 0xe7, 0xdc, 0x8b,
-       0x8d, 0xa3, 0x0e, 0x90, 0x4c, 0xf0, 0x59, 0x17, 0x5e, 0x38, 0x68, 0x23,
-       0x27, 0x2e, 0xc6, 0xc6, 0xc1, 0x12, 0xbc, 0x30, 0xa8, 0xa2, 0xe3, 0x60,
-       0xb3, 0x42, 0xbe, 0xaf, 0xce, 0x20, 0xef, 0xed, 0x18, 0x0d, 0xb0, 0xdd,
-       0xb8, 0x72, 0x2e, 0xdd, 0x30, 0x33, 0xdb, 0x4f, 0x36, 0xf7, 0x93, 0xe5,
-       0x31, 0x86, 0xc2, 0x38, 0x8d, 0x5c, 0x72, 0xdf, 0xe6, 0xd7, 0x18, 0x21,
-       0x3e, 0x9c, 0xb6, 0x53, 0xc7, 0x24, 0x1e, 0x15, 0xbb, 0x4f, 0x6d, 0xbe,
-       0x12, 0x95, 0xb9, 0x1a, 0xca, 0x91, 0x46, 0x9b, 0xc5, 0xb1, 0x5f, 0x67,
-       0x5c, 0xb8, 0x82, 0xb6, 0xf2, 0x10, 0xe5, 0xb1, 0x9a, 0xf2, 0x68, 0xa6,
-       0x3c, 0x5a, 0x39, 0xdf, 0x97, 0xa3, 0x82, 0x93, 0xde, 0x40, 0x44, 0xd1,
-       0xb0, 0x2a, 0x23, 0x7d, 0x58, 0xe3, 0xb8, 0x1c, 0xe1, 0xbf, 0xd9, 0xbc,
-       0x35, 0x7a, 0xab, 0x5c, 0xa0, 0x96, 0x87, 0xc5, 0xaf, 0x89, 0x6c, 0x02,
-       0xe4, 0x50, 0xe3, 0xca, 0xa8, 0x15, 0x23, 0xef, 0xdb, 0xec, 0x49, 0xe5,
-       0x6d, 0xa7, 0x44, 0xec, 0x53, 0xf2, 0xe1, 0xca, 0x3e, 0x72, 0xb5, 0x1a,
-       0x2d, 0x7b, 0xff, 0xde, 0x94, 0x7c, 0xa7, 0x36, 0x2f, 0xb4, 0xf0, 0xe6,
-       0x6f, 0x36, 0x37, 0x5d, 0x5f, 0xd3, 0xb8, 0xf2, 0x36, 0xd7, 0x73, 0x81,
-       0x7a, 0x7a, 0x92, 0x73, 0x2d, 0x92, 0xbd, 0x4b, 0x73, 0xef, 0x38, 0xd7,
-       0x4f, 0x87, 0x8b, 0xf1, 0x5e, 0xaa, 0x84, 0x1f, 0xca, 0x76, 0x98, 0x7b,
-       0x97, 0x6e, 0x56, 0x4e, 0x59, 0xf2, 0x0d, 0xe0, 0x5d, 0x8e, 0x7d, 0xec,
-       0x7a, 0x1f, 0x59, 0xde, 0x96, 0xad, 0xc3, 0xe5, 0xed, 0x57, 0xf0, 0x54,
-       0xd6, 0x66, 0x28, 0x91, 0xeb, 0xb5, 0x34, 0xc9, 0x8b, 0x49, 0x7d, 0x91,
-       0x3e, 0x46, 0x95, 0xfc, 0xa8, 0x42, 0x8c, 0xa1, 0xfe, 0xa9, 0xcb, 0x3c,
-       0x0e, 0xe2, 0xe2, 0x3a, 0x7c, 0xc1, 0x38, 0x21, 0x42, 0x8b, 0x92, 0xb5,
-       0x48, 0x8e, 0xb4, 0x50, 0x62, 0x42, 0xeb, 0xdf, 0x20, 0xb9, 0xd4, 0x6b,
-       0xe4, 0xb9, 0x54, 0x21, 0x74, 0xa7, 0xbf, 0x30, 0x27, 0xaa, 0xe8, 0x57,
-       0xb5, 0xeb, 0x79, 0x37, 0xae, 0xd9, 0x34, 0x87, 0x78, 0xaf, 0x27, 0x8d,
-       0xdc, 0x3f, 0x72, 0x2f, 0xf2, 0xdd, 0x27, 0xb5, 0xdf, 0x99, 0x4f, 0xdc,
-       0xd4, 0x36, 0x8f, 0xe5, 0xf9, 0x78, 0x5f, 0xb0, 0xbc, 0x14, 0x3d, 0xbb,
-       0xbd, 0xc9, 0x14, 0xaa, 0x90, 0xd4, 0x6c, 0x73, 0x0b, 0x38, 0x3b, 0x3b,
-       0xbc, 0xbd, 0xcd, 0xb0, 0xf2, 0x20, 0x9e, 0x14, 0xfe, 0x61, 0xa6, 0xd8,
-       0x8c, 0x53, 0x6b, 0xf0, 0x54, 0xd8, 0x2a, 0x65, 0xee, 0xd6, 0xac, 0xec,
-       0xfd, 0x45, 0x58, 0x17, 0x2c, 0x42, 0xaa, 0x95, 0x18, 0xd7, 0x6f, 0xb4,
-       0xb0, 0x7b, 0xf2, 0xa7, 0xc0, 0x8b, 0xdf, 0xf4, 0x0b, 0x1f, 0x03, 0x0a,
-       0x63, 0x1c, 0x13, 0x39, 0x0c, 0xec, 0xf7, 0x1a, 0x36, 0x9b, 0x3c, 0xff,
-       0x99, 0x69, 0xb4, 0xc9, 0xb3, 0xd2, 0x47, 0xad, 0xc5, 0x1b, 0x6f, 0xd6,
-       0x7b, 0x0f, 0xe5, 0xf4, 0xaf, 0x33, 0x25, 0xe7, 0xa8, 0xd6, 0x31, 0xee,
-       0xe9, 0x97, 0x9a, 0x4d, 0x04, 0xbb, 0xaa, 0x7d, 0x1d, 0xba, 0xad, 0x18,
-       0x67, 0xbf, 0xf6, 0xdf, 0x88, 0xe9, 0x05, 0x70, 0xd5, 0x01, 0xf7, 0xc5,
-       0x6d, 0xb0, 0xd5, 0x11, 0xab, 0xa9, 0xd3, 0xcd, 0xa3, 0x36, 0xcc, 0xeb,
-       0x57, 0xf0, 0x58, 0xd2, 0x86, 0x07, 0x92, 0x76, 0xac, 0x4a, 0xe2, 0xfb,
-       0xf3, 0x80, 0xc9, 0x1a, 0xf8, 0xdb, 0xa7, 0xe8, 0x9a, 0xcb, 0xe1, 0x6f,
-       0x8d, 0x91, 0x17, 0xac, 0x62, 0x2c, 0xba, 0x72, 0x94, 0x38, 0xc8, 0xb6,
-       0xce, 0x3e, 0xea, 0x66, 0x9f, 0x1d, 0x35, 0x7d, 0xb8, 0xb3, 0x10, 0xa0,
-       0x75, 0xfb, 0xa7, 0xe8, 0x97, 0x2a, 0x1d, 0xf0, 0xd3, 0xaf, 0xf8, 0x3b,
-       0x6b, 0xec, 0x0c, 0xc4, 0xea, 0xfe, 0xd5, 0xe2, 0xb4, 0x0f, 0xd2, 0x5e,
-       0xe6, 0xf5, 0xb3, 0x7d, 0x9d, 0x0d, 0x2a, 0xf5, 0xf9, 0x93, 0x3f, 0x96,
-       0x7c, 0xaf, 0xdc, 0x93, 0xba, 0xab, 0x82, 0xf2, 0x7e, 0x3b, 0xf1, 0xf0,
-       0x8c, 0x79, 0xb6, 0xda, 0xaa, 0x41, 0xe1, 0x31, 0xce, 0xcd, 0xcd, 0xdf,
-       0xd4, 0x3a, 0x17, 0x16, 0xdc, 0xa3, 0x62, 0xed, 0xa0, 0xb4, 0x85, 0xd5,
-       0x8f, 0x93, 0xb8, 0x53, 0xa0, 0x4d, 0x98, 0x07, 0xab, 0xa4, 0xad, 0x8d,
-       0x6b, 0xb4, 0xa3, 0xa4, 0x1f, 0x58, 0x19, 0xc7, 0xc3, 0xa5, 0xf0, 0x47,
-       0x64, 0x8e, 0xf5, 0x8b, 0x1d, 0x7c, 0xb6, 0x14, 0x2d, 0xa3, 0xd9, 0xe7,
-       0x56, 0x8c, 0xbe, 0x37, 0x33, 0x9b, 0xfb, 0xfe, 0xc3, 0x75, 0xe3, 0x2d,
-       0x8d, 0x7e, 0xac, 0x4b, 0x52, 0xe7, 0x6c, 0x1e, 0x0c, 0xe6, 0x72, 0xd0,
-       0x4f, 0xa4, 0xbc, 0xd3, 0xea, 0xba, 0x7f, 0x5b, 0x9a, 0xab, 0xf9, 0xd2,
-       0x8e, 0xa7, 0xd8, 0x8f, 0x65, 0xc3, 0x18, 0x1c, 0x33, 0x11, 0xd5, 0x4d,
-       0x64, 0xf8, 0x79, 0x43, 0x87, 0x51, 0x42, 0x1b, 0x7f, 0x2a, 0x26, 0x98,
-       0x97, 0xd5, 0xa4, 0x1f, 0x24, 0x02, 0xca, 0x86, 0x18, 0x70, 0x84, 0xf1,
-       0xe3, 0x21, 0x7e, 0x86, 0x13, 0x5c, 0x03, 0xe7, 0x6d, 0x23, 0x6e, 0x6c,
-       0x4b, 0x01, 0x43, 0x09, 0x44, 0xf6, 0x2f, 0x96, 0x58, 0xa6, 0x84, 0xe3,
-       0x01, 0xe3, 0x6c, 0x93, 0xe6, 0xe7, 0x20, 0x3f, 0x63, 0xdc, 0x53, 0x8e,
-       0x87, 0x00, 0xf1, 0x30, 0x92, 0xd1, 0x60, 0x64, 0x02, 0x98, 0xa0, 0x6d,
-       0x5d, 0x1b, 0x56, 0x51, 0x76, 0xa8, 0x12, 0x1f, 0x8d, 0x64, 0x63, 0xa5,
-       0x75, 0x19, 0xa9, 0x5d, 0xcb, 0xda, 0xa4, 0x7e, 0x2d, 0xb6, 0x54, 0x84,
-       0x43, 0xc9, 0x4a, 0xab, 0x86, 0xfd, 0x8e, 0xce, 0x7e, 0x55, 0xa9, 0xb1,
-       0xb6, 0xe2, 0x70, 0xd4, 0xe7, 0xe9, 0xa5, 0xbe, 0x1b, 0x0e, 0xb1, 0xaf,
-       0x46, 0x1c, 0x89, 0xe6, 0x6b, 0x67, 0xbe, 0x96, 0x9f, 0x49, 0x8e, 0xc8,
-       0x59, 0x49, 0xd9, 0xca, 0xbd, 0xbc, 0xdf, 0x95, 0xf5, 0x4a, 0x0e, 0x3f,
-       0xcf, 0x71, 0xa6, 0xff, 0x7e, 0x8a, 0xe3, 0x05, 0x69, 0x07, 0xde, 0xde,
-       0x14, 0x74, 0xcb, 0x97, 0x8e, 0xd4, 0x7b, 0x93, 0x06, 0x64, 0x6f, 0x1b,
-       0x39, 0x87, 0xd7, 0xa8, 0xf7, 0x01, 0xca, 0xf9, 0x2f, 0xe8, 0x23, 0x5c,
-       0x8c, 0x65, 0x2b, 0xb0, 0xab, 0xaf, 0x12, 0x3b, 0xfb, 0x0c, 0xf4, 0x2c,
-       0x6e, 0xc3, 0xa9, 0xa8, 0x89, 0x75, 0x21, 0x13, 0x2b, 0x19, 0x23, 0xfc,
-       0x00, 0x0d, 0x4d, 0x87, 0xf1, 0x20, 0x63, 0x65, 0x95, 0xf2, 0xf8, 0x16,
-       0xde, 0xde, 0xed, 0xc0, 0x7a, 0xfd, 0x8f, 0x68, 0xbf, 0xa6, 0xf9, 0xab,
-       0x45, 0xb5, 0x18, 0x4c, 0x34, 0xa8, 0xdd, 0x9c, 0x5f, 0xa4, 0x8d, 0xfb,
-       0x14, 0x74, 0xe0, 0x69, 0xfd, 0xfb, 0x6c, 0xeb, 0xb6, 0x39, 0x34, 0xb9,
-       0x96, 0xba, 0x96, 0xec, 0xa3, 0x41, 0xdd, 0xca, 0xfb, 0xac, 0x6c, 0xad,
-       0x74, 0x7d, 0xa3, 0xe4, 0x44, 0x4a, 0x71, 0x92, 0x32, 0x3b, 0x96, 0x8c,
-       0xd0, 0x55, 0x43, 0x79, 0xba, 0xb1, 0x0b, 0x8f, 0x93, 0x9b, 0xbc, 0x4d,
-       0xd2, 0x70, 0x6f, 0x5c, 0x41, 0x53, 0xbd, 0x8e, 0xf3, 0xe9, 0x6f, 0xe1,
-       0xcd, 0xe1, 0x30, 0xde, 0x20, 0x07, 0x58, 0xf0, 0x97, 0xc2, 0xe9, 0x3d,
-       0x38, 0x9b, 0x0e, 0xe3, 0x4c, 0xd4, 0xdb, 0xfa, 0xbc, 0x52, 0x8b, 0x9f,
-       0x11, 0xd3, 0xee, 0x8e, 0x03, 0xef, 0xb1, 0x1f, 0x7f, 0xdc, 0x81, 0x4b,
-       0x69, 0x15, 0x87, 0xb9, 0x37, 0x8e, 0xd0, 0x02, 0x18, 0x6d, 0x1e, 0x1c,
-       0x1c, 0x78, 0x00, 0x13, 0xa9, 0x07, 0x70, 0x22, 0xf9, 0xb6, 0xe9, 0xd2,
-       0xa4, 0x06, 0xe6, 0xc2, 0x25, 0x62, 0xea, 0x24, 0xa5, 0x51, 0x7a, 0x4f,
-       0x2b, 0x71, 0x51, 0x33, 0x44, 0xee, 0x6f, 0xf2, 0xb7, 0x7b, 0xe3, 0x4d,
-       0xd8, 0x9f, 0xa1, 0x48, 0x13, 0x3a, 0x12, 0x31, 0x19, 0xab, 0x11, 0x31,
-       0x72, 0xc8, 0x5d, 0x7d, 0xe2, 0x37, 0xef, 0xc6, 0xca, 0x0a, 0x28, 0x2d,
-       0x75, 0x63, 0xb9, 0x75, 0x34, 0x4d, 0xab, 0x6d, 0x4a, 0xbc, 0x49, 0xb9,
-       0xf2, 0xb9, 0x1f, 0x26, 0x28, 0xf7, 0x04, 0x65, 0x7b, 0x7d, 0x3f, 0x9a,
-       0xb8, 0x1f, 0xdf, 0xc2, 0xf9, 0xdd, 0x6d, 0x78, 0x93, 0x58, 0x57, 0xbe,
-       0xc8, 0xd7, 0xe9, 0xb4, 0x35, 0xb0, 0xef, 0xb4, 0x99, 0xaa, 0x16, 0x99,
-       0xb6, 0xe1, 0x17, 0x51, 0x91, 0x69, 0x9a, 0xd8, 0xe7, 0xf3, 0xf8, 0xed,
-       0x23, 0x55, 0xd4, 0x65, 0x5b, 0x77, 0x30, 0x5b, 0xaf, 0x2b, 0xbd, 0xc7,
-       0x85, 0xcb, 0xd6, 0xdc, 0x64, 0xae, 0x5f, 0x35, 0xbf, 0x5f, 0x98, 0x2b,
-       0xab, 0x65, 0x7e, 0x86, 0xc9, 0x98, 0x3a, 0xc0, 0x78, 0x91, 0xb6, 0x13,
-       0x80, 0xe4, 0x9c, 0xeb, 0xe3, 0x5d, 0xb0, 0x87, 0x4a, 0x0d, 0x35, 0xec,
-       0x9d, 0xea, 0xc0, 0x9b, 0xb8, 0x42, 0x8e, 0x72, 0x57, 0x5c, 0x63, 0x7c,
-       0x7b, 0x81, 0x63, 0xfd, 0x0b, 0x2e, 0xf2, 0xda, 0x17, 0xcf, 0xda, 0x5a,
-       0x77, 0x63, 0x1b, 0xee, 0x4b, 0xcb, 0xfa, 0xfe, 0x0b, 0x07, 0xd2, 0x11,
-       0x49, 0xcb, 0x3a, 0x63, 0xb4, 0x0b, 0x59, 0x67, 0xe5, 0x7f, 0xb0, 0xce,
-       0x23, 0xec, 0xaf, 0x96, 0x76, 0x94, 0xf7, 0x1b, 0x65, 0x38, 0x98, 0x54,
-       0x71, 0x52, 0x2f, 0xc5, 0x05, 0x55, 0xf2, 0xf5, 0xd9, 0x5a, 0x66, 0x33,
-       0xe3, 0xd3, 0x21, 0x7e, 0x9e, 0x62, 0x0c, 0x75, 0x5a, 0x77, 0xe0, 0x84,
-       0x5e, 0x4b, 0x9c, 0xbf, 0x55, 0x87, 0xe5, 0x1e, 0x03, 0x83, 0x8a, 0x4a,
-       0x9c, 0x91, 0x9c, 0xaa, 0x75, 0x5f, 0xce, 0x16, 0xb8, 0x20, 0x39, 0x8d,
-       0x82, 0xd8, 0x6f, 0xcd, 0xcb, 0x16, 0xce, 0xdc, 0x3a, 0xbf, 0x5b, 0xfb,
-       0x21, 0x55, 0xd0, 0xde, 0x33, 0x9f, 0xad, 0xce, 0xf9, 0x2d, 0x65, 0x47,
-       0x55, 0x16, 0x2b, 0xc4, 0x87, 0x8d, 0xe7, 0x71, 0x83, 0x7c, 0x7c, 0xdf,
-       0xa3, 0xf4, 0x41, 0xf4, 0xcf, 0xcd, 0xdf, 0xdb, 0xaa, 0x49, 0x9c, 0x97,
-       0x7a, 0x74, 0x99, 0x56, 0x00, 0xbb, 0xe5, 0x67, 0x0f, 0x6f, 0xce, 0xf2,
-       0xf9, 0xf4, 0xe6, 0x6c, 0x8c, 0x7a, 0x74, 0xf3, 0x5d, 0xd6, 0xf7, 0x8f,
-       0x36, 0xfb, 0x52, 0x37, 0x7c, 0x55, 0x96, 0x2f, 0x5b, 0x67, 0x6d, 0xd0,
-       0xab, 0x1b, 0xca, 0x8a, 0x46, 0xf1, 0xd7, 0x79, 0x8e, 0x22, 0x6d, 0x02,
-       0xca, 0x89, 0xa8, 0x61, 0xba, 0xb5, 0x62, 0xfa, 0x7a, 0x28, 0x63, 0x8c,
-       0xc5, 0xa6, 0xac, 0xba, 0xa7, 0x86, 0x37, 0xd2, 0x12, 0x13, 0x83, 0xfa,
-       0xfb, 0xbf, 0xb1, 0x6b, 0x37, 0xda, 0x8b, 0x16, 0x93, 0xb3, 0xd3, 0xcf,
-       0x3d, 0x1b, 0x72, 0xe0, 0xfd, 0x74, 0x76, 0x3d, 0xef, 0x0d, 0x97, 0xe0,
-       0xdd, 0x94, 0xf8, 0x6b, 0xa8, 0x85, 0xec, 0xf7, 0x64, 0x5a, 0x63, 0x6c,
-       0x2a, 0xe3, 0xb6, 0x61, 0xdb, 0x98, 0x03, 0xfb, 0xa3, 0x1a, 0x62, 0x89,
-       0x9f, 0x9a, 0x45, 0x9a, 0x6f, 0xc2, 0x6f, 0x77, 0x60, 0x5f, 0x7a, 0x12,
-       0x63, 0x7d, 0x1f, 0x9b, 0x76, 0xad, 0x0b, 0x1f, 0x85, 0x26, 0xc9, 0xeb,
-       0xa4, 0xfe, 0xa9, 0x63, 0xd7, 0x80, 0xc6, 0x58, 0xda, 0x86, 0x9d, 0x8b,
-       0x5b, 0xb0, 0x6b, 0xac, 0x19, 0xc6, 0x21, 0x0f, 0x76, 0x92, 0xf0, 0x4d,
-       0x0c, 0x4f, 0xe2, 0x54, 0x52, 0x6b, 0x2a, 0x52, 0x26, 0x71, 0x92, 0xe3,
-       0x6c, 0x4d, 0xbc, 0x05, 0x83, 0x7d, 0x6c, 0x4b, 0x4a, 0x8e, 0x57, 0xc6,
-       0x99, 0x44, 0x77, 0xea, 0x76, 0x35, 0x8f, 0x36, 0xec, 0x48, 0x6c, 0x69,
-       0xcf, 0xd6, 0x3d, 0x88, 0xab, 0x69, 0x4d, 0xe9, 0xe5, 0x1e, 0x1d, 0x4e,
-       0xe7, 0x6b, 0x20, 0x82, 0xa1, 0x59, 0x3c, 0xdc, 0x96, 0xd6, 0xd1, 0x3b,
-       0xd0, 0xc2, 0xf6, 0x1a, 0xba, 0x13, 0x52, 0x3f, 0xf6, 0x71, 0x3c, 0x13,
-       0xef, 0xe9, 0x5e, 0xf7, 0x5d, 0xfc, 0x1e, 0xd1, 0x3b, 0xb1, 0x81, 0xfd,
-       0x08, 0xe7, 0xd2, 0x14, 0x6f, 0x93, 0x01, 0x3b, 0x7e, 0xa5, 0xdb, 0x61,
-       0x54, 0xd9, 0x71, 0x44, 0x2f, 0x23, 0x3f, 0xb7, 0xa3, 0x21, 0x44, 0xdf,
-       0x9c, 0xf3, 0xd5, 0x1f, 0x26, 0x15, 0x3c, 0x40, 0x2c, 0x3d, 0x16, 0x6a,
-       0x68, 0x5f, 0x2e, 0x6c, 0xf7, 0x80, 0x82, 0x2b, 0xda, 0x35, 0xd3, 0xa0,
-       0xbf, 0x72, 0xf9, 0xf3, 0x7b, 0xf3, 0x6b, 0x33, 0x5b, 0x03, 0xfe, 0xc2,
-       0xcc, 0x3f, 0x37, 0xc5, 0xf9, 0x3d, 0xc6, 0xe7, 0xee, 0x5a, 0xd4, 0xd0,
-       0x29, 0xcf, 0xb9, 0x89, 0xe3, 0xf2, 0x9c, 0xe4, 0xf6, 0x6f, 0x3c, 0xa7,
-       0x63, 0xdb, 0x40, 0xc4, 0x9a, 0xef, 0xf6, 0x04, 0x16, 0x3a, 0x20, 0x76,
-       0xd4, 0xa0, 0x5e, 0x02, 0xba, 0x26, 0xf5, 0x19, 0xe4, 0x37, 0xfe, 0xc0,
-       0x53, 0x10, 0x39, 0x49, 0xbc, 0xf9, 0x16, 0x76, 0x46, 0x87, 0xc1, 0x98,
-       0x93, 0xf8, 0xe6, 0x5f, 0x3b, 0x84, 0x14, 0x9e, 0x4b, 0xa7, 0xf0, 0xbc,
-       0x70, 0x6c, 0x2b, 0xc7, 0x96, 0xc6, 0x77, 0xa2, 0x6f, 0x21, 0x66, 0xc5,
-       0x55, 0x87, 0xf1, 0x44, 0xf4, 0xdd, 0x6a, 0xc9, 0x65, 0x6e, 0x4d, 0x2c,
-       0x65, 0xff, 0x22, 0x53, 0x6f, 0xab, 0x81, 0x2f, 0xd9, 0xff, 0x52, 0x6c,
-       0x19, 0x92, 0x9c, 0x90, 0x89, 0xd7, 0xc9, 0xa9, 0xae, 0x50, 0x8f, 0x5a,
-       0x1a, 0xa5, 0xff, 0x71, 0x45, 0xb3, 0x7c, 0x57, 0x1b, 0xf7, 0x78, 0x16,
-       0xdc, 0x94, 0x73, 0x59, 0x46, 0x53, 0xee, 0x8a, 0xc9, 0x9e, 0x3b, 0x60,
-       0xcb, 0x78, 0xf0, 0x18, 0x79, 0x49, 0xe1, 0xc8, 0x8f, 0x14, 0xf1, 0x5f,
-       0x35, 0xe4, 0xa2, 0xee, 0x03, 0x1e, 0x65, 0xc1, 0x1e, 0x17, 0x1e, 0x88,
-       0x91, 0xa3, 0xc6, 0x9a, 0xb1, 0x65, 0xaf, 0xc6, 0x36, 0x5e, 0xfd, 0x1c,
-       0xe3, 0xd6, 0x93, 0xf0, 0x79, 0x86, 0xc8, 0xa5, 0xdc, 0xc4, 0x60, 0xc7,
-       0x48, 0x39, 0x4a, 0xc8, 0xb3, 0xa5, 0xdc, 0x5c, 0x3a, 0xe2, 0x46, 0x0d,
-       0xfd, 0x99, 0x3b, 0x73, 0x1e, 0x63, 0x7b, 0xa0, 0x96, 0x84, 0x3f, 0x37,
-       0x0b, 0x35, 0xa9, 0x57, 0x06, 0x50, 0x9e, 0xd9, 0x84, 0x74, 0x2c, 0x88,
-       0x52, 0xf2, 0xfb, 0x06, 0x8e, 0x77, 0x7f, 0x4c, 0x63, 0x3f, 0x59, 0x6e,
-       0xb3, 0x9c, 0xcf, 0xf4, 0x26, 0xbc, 0x6b, 0xa5, 0xde, 0x78, 0x45, 0x7f,
-       0x0d, 0x45, 0x7d, 0x37, 0xce, 0x9c, 0x69, 0x21, 0xcc, 0x21, 0xf7, 0x68,
-       0x7d, 0x1a, 0xd9, 0xf3, 0x67, 0x2b, 0x72, 0xeb, 0x09, 0xca, 0x7a, 0x9c,
-       0x6d, 0xd4, 0x83, 0xd9, 0x98, 0xc1, 0xf5, 0x5c, 0xa4, 0xde, 0xdc, 0xcb,
-       0xb9, 0x5e, 0x63, 0xec, 0xd0, 0xc9, 0xb5, 0xbc, 0x3f, 0xfc, 0x23, 0xa5,
-       0x86, 0x6b, 0x99, 0x22, 0x57, 0xfd, 0x38, 0xe5, 0x51, 0x7c, 0x5c, 0xcb,
-       0x77, 0x79, 0xff, 0x3b, 0x5c, 0xcb, 0xd6, 0xbd, 0xde, 0xd6, 0xe3, 0x8a,
-       0xb7, 0x7d, 0x8d, 0xe2, 0x53, 0xb7, 0x2a, 0xa5, 0xb8, 0x38, 0x5c, 0x8e,
-       0x4b, 0xf4, 0xbd, 0xd7, 0x86, 0x2b, 0x71, 0x79, 0xb8, 0x8a, 0x36, 0xa2,
-       0xb1, 0x0f, 0xd3, 0x2c, 0xd3, 0xdc, 0x98, 0x4a, 0x3f, 0x8f, 0x19, 0xb1,
-       0x5a, 0x7c, 0x9c, 0xde, 0x80, 0xf2, 0x98, 0xc4, 0x00, 0x1e, 0x7c, 0xc4,
-       0xfb, 0x1f, 0xa6, 0x47, 0x51, 0xbc, 0xe7, 0x73, 0xb6, 0x31, 0xcd, 0xfb,
-       0xb9, 0xbe, 0xcb, 0xe9, 0x0e, 0x94, 0xee, 0xd9, 0x08, 0xc7, 0x1e, 0xb3,
-       0x6b, 0x4b, 0x08, 0x3f, 0xb3, 0x73, 0x2d, 0xdd, 0xba, 0x77, 0xe2, 0x2e,
-       0x7b, 0x90, 0x7d, 0x8c, 0x2b, 0x0b, 0x32, 0x1b, 0x51, 0xbe, 0xc7, 0x83,
-       0x67, 0x29, 0xc3, 0x51, 0x68, 0x81, 0x35, 0xca, 0x46, 0x14, 0x8c, 0x64,
-       0xd7, 0xbf, 0x2e, 0x93, 0xb5, 0x8b, 0xfb, 0x1b, 0xa7, 0xc7, 0x32, 0x6e,
-       0x8b, 0x77, 0x4f, 0xa6, 0x4b, 0x70, 0x3a, 0x25, 0xf2, 0x81, 0xea, 0x08,
-       0x8f, 0xa2, 0x70, 0x0f, 0x31, 0x71, 0x58, 0xb7, 0xf8, 0x82, 0xd8, 0xc4,
-       0x70, 0xfa, 0x76, 0x36, 0x15, 0xc4, 0xce, 0x44, 0x0d, 0xed, 0xa9, 0x16,
-       0x2b, 0xf7, 0x48, 0x8d, 0x79, 0xe2, 0x5e, 0x17, 0xb5, 0xe8, 0x50, 0xfa,
-       0x56, 0x7b, 0x6a, 0xa4, 0x6e, 0x0a, 0xb6, 0x9a, 0x98, 0xd4, 0xb3, 0x78,
-       0x73, 0xcc, 0xaa, 0x61, 0x8b, 0x4d, 0xb6, 0x62, 0xcb, 0x00, 0xda, 0xf7,
-       0x37, 0x8a, 0x4d, 0x3a, 0x31, 0x44, 0xbe, 0x7f, 0x91, 0xb1, 0xc3, 0x0c,
-       0xed, 0x73, 0x62, 0x42, 0x01, 0x06, 0x87, 0x5d, 0xf8, 0xf1, 0xb0, 0x07,
-       0xee, 0x58, 0x31, 0xc6, 0x29, 0xe3, 0x31, 0x72, 0x9c, 0x8f, 0x18, 0x65,
-       0x8f, 0xd2, 0xa7, 0x7e, 0x18, 0xad, 0x42, 0x26, 0x5d, 0x8b, 0xab, 0xc4,
-       0x94, 0x34, 0xf7, 0xe3, 0x83, 0x68, 0x00, 0x2f, 0xa7, 0x83, 0x78, 0x3f,
-       0x2a, 0xd8, 0x13, 0xc4, 0x11, 0xca, 0xaf, 0x28, 0xe6, 0x66, 0xbf, 0x82,
-       0x43, 0x1e, 0x38, 0x63, 0x9a, 0x67, 0x28, 0xa7, 0x0b, 0x8e, 0x4c, 0x2b,
-       0xed, 0x46, 0xce, 0x44, 0x88, 0x1f, 0x70, 0xe8, 0x43, 0x8c, 0xb9, 0x07,
-       0x83, 0xf9, 0xfc, 0xaf, 0xd7, 0x3d, 0x81, 0x99, 0xb4, 0x9d, 0x2f, 0x4d,
-       0x55, 0x93, 0x98, 0x2a, 0x19, 0xba, 0x12, 0xd5, 0x24, 0x17, 0x48, 0x6c,
-       0x37, 0x14, 0xe7, 0x62, 0x72, 0x89, 0xaa, 0xad, 0x92, 0x17, 0xe6, 0xfc,
-       0xe5, 0x6c, 0x99, 0xc9, 0x76, 0x57, 0x31, 0xff, 0xc0, 0xd6, 0x59, 0xb9,
-       0x1c, 0x93, 0x7a, 0x83, 0xf7, 0xe5, 0x31, 0x5e, 0xe2, 0xb5, 0xdd, 0xa1,
-       0xd7, 0xa2, 0x7f, 0x3f, 0x4b, 0xea, 0x71, 0xc7, 0x11, 0xa4, 0x4c, 0x6e,
-       0x17, 0x0f, 0x98, 0x78, 0x93, 0x18, 0x72, 0x39, 0x29, 0xbc, 0x48, 0xf8,
-       0x50, 0x17, 0x7d, 0x4f, 0x19, 0xf9, 0x80, 0x86, 0x6d, 0xe4, 0xeb, 0xbe,
-       0xf8, 0x04, 0xe3, 0x91, 0xaf, 0x93, 0x93, 0x95, 0xb3, 0x9b, 0x1f, 0x70,
-       0xbc, 0x56, 0xec, 0xa4, 0x2d, 0x16, 0x69, 0x77, 0x61, 0x25, 0xf9, 0x8e,
-       0x43, 0xa3, 0xcb, 0x78, 0x58, 0xfc, 0x86, 0xe4, 0x70, 0x54, 0xa9, 0x95,
-       0xad, 0x7d, 0x1d, 0xf7, 0xa2, 0xbd, 0xda, 0x05, 0xa9, 0x6f, 0xbd, 0x81,
-       0x25, 0x48, 0x3d, 0x2a, 0xbe, 0x93, 0x1c, 0x39, 0xac, 0x19, 0xe7, 0x31,
-       0xcf, 0x62, 0xdd, 0xc5, 0x61, 0x99, 0x4f, 0x15, 0x65, 0xaf, 0xe2, 0x1d,
-       0xca, 0xf5, 0x52, 0xd4, 0x37, 0x75, 0x1f, 0x1a, 0x4e, 0x5d, 0xb2, 0x4b,
-       0xed, 0x4f, 0xda, 0x07, 0xa1, 0xb1, 0xbf, 0x4f, 0xa3, 0x21, 0xf4, 0xa9,
-       0x72, 0x2d, 0xfc, 0xb0, 0x15, 0xdd, 0x43, 0x32, 0x07, 0xd3, 0xac, 0x24,
-       0x1e, 0x3e, 0x6c, 0x8d, 0x2f, 0x63, 0xdf, 0x1a, 0x5b, 0x78, 0x19, 0x49,
-       0xe7, 0xe3, 0x8b, 0x49, 0x1c, 0x4e, 0x52, 0xfe, 0x8b, 0xdf, 0xa6, 0x1c,
-       0x26, 0x31, 0x9c, 0xd2, 0xc8, 0x1d, 0x4b, 0xe0, 0xa9, 0x0e, 0x62, 0x17,
-       0xfd, 0x75, 0x8c, 0xed, 0xd3, 0xb1, 0x12, 0x18, 0xd5, 0xd9, 0x31, 0xbf,
-       0x1e, 0xbf, 0x6a, 0x4e, 0x3c, 0x64, 0xc5, 0xa9, 0xbc, 0xfe, 0x1d, 0x9f,
-       0x99, 0x2d, 0xc7, 0x32, 0xb1, 0x3e, 0x76, 0xd9, 0x9c, 0x68, 0x9d, 0xfe,
-       0x7b, 0x85, 0x75, 0xa6, 0x2a, 0x62, 0xab, 0xe6, 0x77, 0x56, 0x2e, 0xdd,
-       0x94, 0xcb, 0x0c, 0xed, 0x2d, 0xf3, 0x41, 0x6b, 0x5e, 0xef, 0xcd, 0x12,
-       0x2e, 0x5f, 0x17, 0xf7, 0xcc, 0x46, 0x71, 0x15, 0xdb, 0x10, 0x43, 0xc3,
-       0x5a, 0xd3, 0x29, 0xfc, 0x8b, 0x79, 0xe1, 0xa6, 0x7e, 0x66, 0xf2, 0x9e,
-       0xf8, 0x9e, 0x0b, 0xb9, 0x9c, 0x8f, 0x3b, 0xc7, 0xf7, 0x27, 0x71, 0x3c,
-       0x29, 0xd8, 0xef, 0xc1, 0x13, 0x92, 0x9b, 0x52, 0xbd, 0xbd, 0x06, 0x26,
-       0xc8, 0xf1, 0xde, 0xa6, 0xec, 0x25, 0xff, 0x38, 0x41, 0x9e, 0x37, 0xdd,
-       0x37, 0x45, 0x90, 0xaa, 0x92, 0x1a, 0x8c, 0xe0, 0xe7, 0x24, 0xb6, 0x27,
-       0x7f, 0x4a, 0x1c, 0xfb, 0x98, 0xbc, 0xa7, 0x8b, 0x9c, 0x7a, 0x12, 0x5b,
-       0x52, 0xcd, 0x78, 0x69, 0x6f, 0x0b, 0x71, 0x45, 0xb0, 0xd1, 0x77, 0xea,
-       0xa2, 0xbd, 0x19, 0xfb, 0x0f, 0xa5, 0x91, 0x1a, 0x11, 0x7f, 0x28, 0x3e,
-       0x57, 0x7c, 0xa1, 0x86, 0x68, 0xe2, 0x24, 0x0c, 0x7e, 0xef, 0x4c, 0x6c,
-       0x44, 0x64, 0xe4, 0x2d, 0xf2, 0xf8, 0x49, 0x2c, 0xef, 0xd3, 0xd6, 0x1e,
-       0xc4, 0x24, 0x56, 0xd1, 0x57, 0x26, 0x13, 0x2d, 0xec, 0xbf, 0x19, 0x3d,
-       0x7b, 0xbd, 0x56, 0xbe, 0x49, 0x62, 0xf8, 0x6d, 0x63, 0x11, 0x18, 0x43,
-       0x72, 0x36, 0xc3, 0x85, 0x60, 0xdc, 0xa3, 0x7c, 0x48, 0x3e, 0xdc, 0x10,
-       0xf7, 0x32, 0x06, 0xf3, 0x1a, 0xab, 0x14, 0x9f, 0xa7, 0xc0, 0x26, 0xb5,
-       0xc0, 0x19, 0x38, 0xa5, 0x2b, 0x28, 0xba, 0x57, 0x41, 0x88, 0xbe, 0xca,
-       0x33, 0x8b, 0x3e, 0x64, 0x48, 0x47, 0xcf, 0x00, 0xd7, 0x7b, 0x7d, 0xdf,
-       0x64, 0xbf, 0x56, 0xb3, 0x3f, 0xd9, 0xbb, 0x16, 0xf4, 0x8c, 0xf9, 0x3a,
-       0x4e, 0xc1, 0x6d, 0x71, 0xab, 0x9e, 0x81, 0xeb, 0x79, 0x81, 0xd2, 0x8f,
-       0x1b, 0xbd, 0x81, 0x19, 0x8a, 0xb4, 0xdd, 0x4a, 0xcc, 0x9a, 0xde, 0xde,
-       0x50, 0x92, 0x8b, 0xc9, 0x3f, 0x6d, 0x62, 0x17, 0xdd, 0x96, 0xbd, 0x88,
-       0x2c, 0x7a, 0x92, 0x11, 0xea, 0xf4, 0x4f, 0xcc, 0x54, 0x6b, 0x2b, 0xe7,
-       0xd9, 0x28, 0xb5, 0x31, 0x0b, 0x13, 0xce, 0x4a, 0x2e, 0xce, 0x29, 0x98,
-       0xd0, 0xdd, 0xee, 0xa2, 0x3e, 0x15, 0x12, 0x97, 0x8a, 0x46, 0x5d, 0x70,
-       0x1d, 0x2c, 0x41, 0xe1, 0xa0, 0xf0, 0x31, 0xc9, 0x41, 0xa8, 0xb0, 0x8f,
-       0x96, 0xd2, 0x06, 0xb8, 0x87, 0xa3, 0xb4, 0xb1, 0xa8, 0x1b, 0xf3, 0x46,
-       0xdd, 0xf8, 0x31, 0x31, 0xa0, 0x66, 0x54, 0xc3, 0x38, 0x31, 0xc0, 0x3d,
-       0x1a, 0xc0, 0x58, 0x34, 0x88, 0x19, 0xa3, 0xe3, 0xca, 0x1b, 0xe9, 0x66,
-       0xee, 0xb7, 0x8c, 0x23, 0x32, 0xcc, 0xef, 0xa9, 0xec, 0x67, 0x0b, 0xb1,
-       0x4e, 0xf6, 0x36, 0x80, 0x1d, 0x03, 0x69, 0x2c, 0xdb, 0x63, 0xe2, 0x9f,
-       0xf4, 0x06, 0x77, 0x91, 0x22, 0xb1, 0x80, 0x89, 0x34, 0xfd, 0xda, 0x0a,
-       0xdd, 0xbb, 0x56, 0xce, 0x3b, 0xb7, 0x57, 0x99, 0x28, 0x08, 0x79, 0x75,
-       0xa2, 0xfb, 0xda, 0x22, 0x45, 0x7c, 0x54, 0x83, 0x67, 0x03, 0xe6, 0x22,
-       0x5b, 0x57, 0xbc, 0x0f, 0x1b, 0x54, 0x85, 0xb6, 0xd8, 0x82, 0x9d, 0x15,
-       0x86, 0xeb, 0x4a, 0xa3, 0x69, 0xae, 0x0b, 0xd5, 0xcd, 0xb2, 0x72, 0xd0,
-       0xb6, 0xf5, 0xfc, 0x6e, 0xe3, 0x9a, 0x65, 0xdd, 0x1d, 0x88, 0xed, 0x56,
-       0x90, 0xf6, 0x77, 0x20, 0x3a, 0xdc, 0x21, 0xfc, 0x89, 0x78, 0xd0, 0x4b,
-       0x3c, 0x30, 0xbb, 0x9e, 0x0e, 0x3d, 0x88, 0xcb, 0x96, 0xc7, 0x97, 0x67,
-       0xbc, 0x01, 0x8f, 0x6d, 0xfa, 0x1e, 0xe8, 0xb3, 0x25, 0xcf, 0x21, 0x76,
-       0xd3, 0xdc, 0x27, 0xbc, 0xd9, 0xdf, 0xdb, 0xc3, 0xbd, 0x7f, 0xe8, 0x80,
-       0xf8, 0x17, 0xd3, 0xec, 0x25, 0x2f, 0x45, 0x85, 0xac, 0x41, 0x43, 0x3c,
-       0x61, 0x7e, 0x5c, 0xa3, 0xf9, 0xa6, 0x76, 0xd1, 0x8f, 0x9f, 0xdf, 0xd3,
-       0xb0, 0x61, 0x83, 0x70, 0x96, 0x45, 0x1a, 0x63, 0xe9, 0x34, 0xce, 0x8d,
-       0xcc, 0x47, 0xea, 0x21, 0xae, 0x87, 0xfb, 0xe4, 0x8c, 0x7f, 0xc1, 0x38,
-       0x43, 0xb0, 0x4f, 0x53, 0x0f, 0x13, 0xf7, 0x6c, 0xa3, 0x7e, 0x6c, 0xa9,
-       0x80, 0x71, 0xa5, 0x51, 0xc6, 0xbf, 0x3e, 0x7f, 0xae, 0xb7, 0x19, 0xbb,
-       0xf6, 0x0a, 0xaf, 0x10, 0xfe, 0xe5, 0x33, 0x3e, 0x40, 0x0b, 0x92, 0x63,
-       0xd9, 0xb1, 0xa2, 0x89, 0x5b, 0xf5, 0x44, 0xf6, 0xfc, 0x24, 0x76, 0x50,
-       0x27, 0x5d, 0xec, 0x9f, 0x3e, 0x85, 0xfd, 0x69, 0x81, 0x22, 0x19, 0x6f,
-       0xf4, 0x27, 0xe6, 0xce, 0x6a, 0x91, 0x8d, 0xf4, 0xff, 0x9b, 0x6a, 0xc1,
-       0x8b, 0x75, 0xa1, 0xaf, 0x5a, 0xeb, 0x15, 0x7e, 0x4b, 0xce, 0x3a, 0x3f,
-       0x1f, 0x79, 0xe6, 0x76, 0xf3, 0xf9, 0x9c, 0xed, 0x64, 0x4e, 0x1d, 0xd8,
-       0xb1, 0x1b, 0x46, 0xb1, 0xa6, 0x45, 0xe6, 0x2b, 0x1d, 0xe8, 0xa5, 0x7c,
-       0xb7, 0x25, 0x3b, 0xb0, 0x9f, 0xf6, 0x3a, 0xa8, 0x1f, 0xab, 0xb1, 0xa1,
-       0x7e, 0xca, 0x8e, 0x89, 0x7f, 0x94, 0x9a, 0xc5, 0x82, 0x45, 0x7e, 0xda,
-       0x56, 0x07, 0xe2, 0xa9, 0x73, 0xb3, 0xad, 0x9a, 0xa8, 0x4d, 0x7c, 0x9e,
-       0xc8, 0xa2, 0x13, 0xc5, 0x7d, 0x27, 0xe1, 0xec, 0xeb, 0x44, 0x91, 0x7f,
-       0x09, 0x56, 0x84, 0x2e, 0x98, 0x97, 0x35, 0x87, 0xfb, 0x38, 0xe5, 0x73,
-       0x2c, 0x58, 0xc3, 0x98, 0x91, 0x71, 0xca, 0xd0, 0x1c, 0xda, 0x7d, 0x23,
-       0x76, 0x8c, 0xc9, 0x59, 0x08, 0x1b, 0x56, 0x2d, 0x96, 0x58, 0x5c, 0xa1,
-       0x5e, 0xcf, 0x62, 0x3c, 0xa9, 0xa9, 0xcf, 0x59, 0xe7, 0x56, 0xc8, 0xb9,
-       0xaa, 0x3c, 0x78, 0xd2, 0x3a, 0xaf, 0x21, 0xf7, 0x37, 0x31, 0x0e, 0xd8,
-       0x84, 0x9a, 0x98, 0x61, 0x8a, 0xbc, 0x8f, 0x23, 0xf2, 0xa2, 0x8d, 0xf3,
-       0x68, 0x5a, 0xe4, 0xdf, 0x30, 0xa5, 0x88, 0x3e, 0xfb, 0xdb, 0x47, 0x15,
-       0xdd, 0xb5, 0x3a, 0xa3, 0x20, 0xd0, 0xc7, 0xbe, 0x42, 0x23, 0xb3, 0xb3,
-       0xb9, 0xf1, 0x3c, 0xbf, 0xdb, 0x44, 0x5e, 0xb0, 0x09, 0x65, 0x31, 0xe1,
-       0xe4, 0x82, 0x0b, 0x91, 0xa5, 0xe5, 0x7c, 0x3e, 0x1d, 0xf2, 0xb7, 0x96,
-       0x2a, 0xc2, 0x7d, 0xfc, 0x4d, 0xab, 0x14, 0xe1, 0x2a, 0xf2, 0x9c, 0xee,
-       0xaa, 0xcf, 0x9c, 0xcf, 0xd5, 0x31, 0x1b, 0x89, 0x0d, 0x72, 0xce, 0x24,
-       0x7f, 0xd6, 0xea, 0x46, 0xce, 0xda, 0x19, 0x97, 0xd8, 0xe1, 0x68, 0x68,
-       0x59, 0xb4, 0x89, 0x38, 0x67, 0x2e, 0x39, 0x44, 0xbd, 0xbf, 0x88, 0x2a,
-       0xfc, 0x73, 0x54, 0x30, 0xcd, 0x83, 0x9f, 0x47, 0x0b, 0x25, 0x26, 0x4e,
-       0x49, 0x5e, 0xf6, 0x4c, 0xd2, 0x30, 0x29, 0xd7, 0x96, 0x55, 0xd4, 0xa5,
-       0x40, 0xa8, 0x14, 0xa8, 0xee, 0x7e, 0xd2, 0x69, 0xc5, 0xe8, 0x65, 0xa8,
-       0x20, 0xfe, 0xf7, 0x0d, 0xfd, 0xa1, 0xf3, 0x0e, 0xc4, 0xe0, 0x62, 0xc9,
-       0x15, 0xda, 0xb1, 0x2d, 0xf4, 0x1b, 0x33, 0xd5, 0x26, 0xcf, 0xd4, 0xe2,
-       0xdc, 0x6e, 0xd1, 0xd3, 0x00, 0x0a, 0xe3, 0xe7, 0xa9, 0x93, 0x2a, 0xce,
-       0x46, 0x7d, 0xfa, 0x1a, 0xdb, 0xb7, 0xa8, 0xff, 0xf3, 0x6e, 0xc2, 0xed,
-       0x79, 0xda, 0x03, 0x78, 0xdc, 0xc2, 0xed, 0x30, 0xb6, 0xd0, 0x2f, 0x90,
-       0xb7, 0xed, 0x7b, 0xd2, 0xa6, 0xd2, 0x9f, 0xfb, 0x54, 0x1f, 0x63, 0xea,
-       0x2d, 0x1c, 0x43, 0xf8, 0xe4, 0x4c, 0xf2, 0xbd, 0xa7, 0xa3, 0x0d, 0x9e,
-       0x5f, 0xe3, 0x09, 0xda, 0xa3, 0x8c, 0x21, 0x6b, 0xd2, 0x50, 0xca, 0xd8,
-       0xf1, 0x04, 0xd7, 0xb1, 0xad, 0x22, 0x3b, 0x6e, 0x79, 0xae, 0xef, 0xf8,
-       0x90, 0xf0, 0xad, 0x7b, 0xb0, 0xc6, 0xea, 0x3b, 0x68, 0xd9, 0xe6, 0xbe,
-       0xa8, 0x82, 0x19, 0xf5, 0x1a, 0x12, 0xe9, 0x66, 0x6c, 0xac, 0xac, 0xc5,
-       0xfe, 0xc4, 0x26, 0x2c, 0x24, 0xe7, 0x7d, 0xa4, 0xd2, 0xa0, 0x5f, 0x24,
-       0x06, 0xc5, 0x35, 0x75, 0xbe, 0xf2, 0x8d, 0x5c, 0xae, 0xba, 0x0a, 0x8e,
-       0xb8, 0xf8, 0xbb, 0x02, 0xf4, 0xab, 0x73, 0x51, 0x62, 0x9d, 0x81, 0xcc,
-       0xf6, 0xbd, 0x6b, 0xc8, 0x9b, 0xf3, 0x81, 0x44, 0x8d, 0xb8, 0x75, 0x4e,
-       0x25, 0xf0, 0x3c, 0x79, 0x44, 0x8a, 0xde, 0xaf, 0x20, 0xac, 0xa5, 0xd6,
-       0xa3, 0x08, 0xc6, 0x2c, 0xc1, 0x43, 0x79, 0x66, 0xce, 0x2d, 0x73, 0xaa,
-       0xcc, 0xcd, 0x29, 0x7f, 0xff, 0x34, 0xef, 0x89, 0x6e, 0x09, 0xb7, 0x90,
-       0xdf, 0x8b, 0xd1, 0x4a, 0x7d, 0xaa, 0xe2, 0x9c, 0x13, 0x09, 0xb9, 0xef,
-       0xd5, 0x0d, 0x5b, 0x23, 0x3e, 0xdb, 0x93, 0xd5, 0xc1, 0xb5, 0x75, 0xdc,
-       0xff, 0xf2, 0x46, 0x4c, 0x8d, 0x88, 0x2f, 0xfb, 0xc3, 0x67, 0x50, 0x8c,
-       0xeb, 0x67, 0x50, 0x44, 0xae, 0xde, 0x53, 0xef, 0xa0, 0x61, 0xe2, 0x31,
-       0xdb, 0x61, 0x13, 0x33, 0x45, 0xc6, 0x71, 0xb7, 0xc4, 0x9a, 0x36, 0x72,
-       0x08, 0x23, 0x3d, 0xee, 0x16, 0x3f, 0xe9, 0x88, 0x03, 0xf3, 0xe2, 0x06,
-       0x0a, 0xc3, 0xda, 0xbe, 0x2b, 0xf6, 0x6b, 0x66, 0xfb, 0xac, 0x39, 0x8c,
-       0xf9, 0x6e, 0xac, 0xb9, 0x97, 0x73, 0xb7, 0x6b, 0x3f, 0x31, 0xef, 0xab,
-       0x92, 0x39, 0xfe, 0xd2, 0x9d, 0x3d, 0xfb, 0x70, 0x07, 0xe5, 0x92, 0x97,
-       0x89, 0x49, 0xfd, 0xf9, 0x2b, 0xf3, 0x9b, 0x37, 0xdd, 0x17, 0x2e, 0x23,
-       0x7a, 0x3a, 0xfd, 0x3c, 0xa0, 0xe8, 0xac, 0xd4, 0x56, 0x26, 0x71, 0x28,
-       0x29, 0xba, 0x2b, 0x32, 0x8e, 0xe0, 0x22, 0x79, 0x61, 0x41, 0xff, 0x24,
-       0x06, 0xc9, 0x0b, 0xed, 0x71, 0xef, 0x3e, 0x4a, 0x12, 0x1b, 0xd5, 0x25,
-       0xc4, 0xea, 0x32, 0xce, 0x23, 0x3f, 0x87, 0x3a, 0x4b, 0xee, 0xe2, 0x5f,
-       0x76, 0x72, 0xbd, 0x45, 0xe4, 0x48, 0xcd, 0xb1, 0x42, 0x68, 0x15, 0xe5,
-       0x28, 0xd5, 0xe4, 0x0c, 0x7c, 0xb6, 0x5d, 0x94, 0x73, 0x29, 0xd1, 0xe6,
-       0x62, 0x95, 0xd5, 0xd6, 0x63, 0x9d, 0x01, 0xd1, 0x2a, 0xc5, 0xff, 0x8a,
-       0xcf, 0x25, 0xdf, 0x5e, 0x2c, 0x3e, 0x37, 0xcc, 0xb9, 0xcd, 0xc9, 0xd5,
-       0x99, 0x56, 0x59, 0xf7, 0xf7, 0x25, 0x2e, 0x7c, 0xd9, 0x9f, 0xf8, 0x3d,
-       0x9f, 0xe9, 0x80, 0xba, 0xb7, 0x18, 0x0f, 0xfd, 0x65, 0x09, 0xf4, 0xca,
-       0x6c, 0xae, 0x7c, 0x5e, 0x38, 0x1a, 0x32, 0x13, 0xc2, 0x93, 0xee, 0x84,
-       0x67, 0xb6, 0x8c, 0x25, 0x18, 0x20, 0x7b, 0x21, 0x7b, 0x27, 0x39, 0xdc,
-       0xdb, 0xd5, 0x18, 0xbc, 0xea, 0xc4, 0xf5, 0x7d, 0x98, 0x0f, 0xed, 0xe1,
-       0x2a, 0xae, 0x2d, 0xeb, 0x23, 0x76, 0xd0, 0x47, 0x04, 0xfc, 0x59, 0x0c,
-       0x93, 0x1a, 0xbd, 0x93, 0x3e, 0x62, 0x84, 0x3e, 0xe2, 0xa2, 0x5e, 0x8e,
-       0xe5, 0x39, 0x1f, 0xd1, 0x6e, 0xd3, 0xad, 0xfe, 0x9d, 0xda, 0x7d, 0x35,
-       0xc4, 0x30, 0x8e, 0xf1, 0xb5, 0x9b, 0xb8, 0xd8, 0x4c, 0xed, 0x97, 0xe6,
-       0x23, 0x55, 0xb2, 0xc6, 0xe6, 0x9a, 0x6c, 0x8e, 0xbc, 0x03, 0xfb, 0x88,
-       0x8f, 0x35, 0x9a, 0x3c, 0xa3, 0x25, 0x6b, 0xec, 0x1d, 0xe8, 0x67, 0xff,
-       0x7d, 0xc4, 0xc8, 0x18, 0x31, 0x52, 0x5f, 0x78, 0xec, 0x45, 0x15, 0xf5,
-       0x1d, 0x64, 0x0f, 0xdf, 0x16, 0x6c, 0x79, 0x99, 0xd8, 0xf2, 0x3c, 0x31,
-       0x72, 0x67, 0x4a, 0xc6, 0x91, 0xf1, 0xf2, 0xe3, 0x48, 0x9f, 0xff, 0x66,
-       0xae, 0xaf, 0x92, 0xb9, 0xde, 0x6e, 0x1e, 0xf2, 0xdb, 0x9f, 0xf2, 0xef,
-       0x62, 0x8b, 0x43, 0xf5, 0x26, 0xa6, 0x9f, 0xa9, 0x98, 0x24, 0xbe, 0x5a,
-       0x71, 0x00, 0xfd, 0x6b, 0x04, 0x2b, 0x17, 0xab, 0xb8, 0x1c, 0x9d, 0x44,
-       0xd1, 0x81, 0x3c, 0x16, 0x99, 0x4b, 0x4e, 0x10, 0x87, 0x06, 0x21, 0xd8,
-       0xd3, 0xc4, 0x3d, 0x30, 0x68, 0x13, 0x65, 0x18, 0x4d, 0xca, 0xd9, 0x0b,
-       0x13, 0xbb, 0x42, 0x2e, 0x72, 0xd8, 0xee, 0xe3, 0x05, 0x96, 0x4f, 0x28,
-       0x23, 0x5e, 0xe7, 0xf9, 0xb5, 0x70, 0x6b, 0xc1, 0x1a, 0xc6, 0x11, 0x43,
-       0x76, 0x14, 0x2c, 0xca, 0xc6, 0x0e, 0xe7, 0xda, 0xa4, 0x5d, 0x2d, 0x06,
-       0x77, 0x8b, 0xae, 0xf9, 0x50, 0xa3, 0x9d, 0x67, 0x2c, 0x01, 0xbc, 0x1b,
-       0xb5, 0xdd, 0xe9, 0x22, 0x07, 0xee, 0xd2, 0x17, 0xe3, 0xda, 0xcc, 0x2d,
-       0xb4, 0x6f, 0x37, 0x7f, 0x9b, 0xc0, 0xc1, 0xa8, 0x0b, 0x05, 0x56, 0x8d,
-       0xb2, 0x9c, 0xeb, 0xc9, 0xea, 0xcb, 0x36, 0xea, 0x4b, 0x21, 0x63, 0xb3,
-       0x15, 0x96, 0x5d, 0x4a, 0x3f, 0x93, 0xd6, 0xbb, 0x32, 0xda, 0x62, 0xe1,
-       0xad, 0x41, 0xfa, 0xc0, 0x32, 0xc4, 0xfb, 0xba, 0x70, 0x36, 0x54, 0x86,
-       0xd8, 0x01, 0xb1, 0xa7, 0x5a, 0xc1, 0x4d, 0x8e, 0xdb, 0x44, 0xf9, 0xa8,
-       0xc4, 0x95, 0x86, 0x4e, 0xbb, 0xbd, 0x0c, 0x17, 0x2a, 0x18, 0xaf, 0x5a,
-       0xef, 0x13, 0xb5, 0x62, 0x7f, 0x6e, 0x8f, 0x54, 0xf2, 0x9b, 0xd6, 0xeb,
-       0x7c, 0x39, 0xbf, 0x96, 0xbc, 0x7d, 0x66, 0x6b, 0xe4, 0x3d, 0xe4, 0x30,
-       0x2f, 0x49, 0x3e, 0xc8, 0xe6, 0xa3, 0xdf, 0x60, 0x5c, 0x34, 0x26, 0xb2,
-       0xce, 0xeb, 0xd6, 0xeb, 0x35, 0xd9, 0x33, 0x3d, 0xf9, 0x3d, 0xc8, 0x5f,
-       0x6b, 0x6b, 0x8b, 0x95, 0x5f, 0x98, 0xcf, 0x56, 0xcb, 0xfc, 0xae, 0x32,
-       0x0e, 0xfb, 0x31, 0x7f, 0x5f, 0x86, 0x9e, 0xa1, 0xe9, 0x7e, 0x41, 0x6c,
-       0xce, 0x73, 0xd3, 0xd9, 0xc3, 0x8a, 0xb8, 0xbc, 0xbf, 0x75, 0x34, 0xf4,
-       0x24, 0xf7, 0xc1, 0xbf, 0xb0, 0xc1, 0xca, 0xa5, 0x90, 0xe3, 0x32, 0xfe,
-       0x10, 0x3c, 0x35, 0xe8, 0xcf, 0xcb, 0xf0, 0xb3, 0xa4, 0xf8, 0x57, 0x13,
-       0x85, 0xa1, 0x12, 0xfa, 0xbb, 0xee, 0xe7, 0x2a, 0x2c, 0xce, 0x5c, 0x86,
-       0x4a, 0xea, 0x5e, 0xff, 0xd0, 0xed, 0xf4, 0xfc, 0x86, 0x0f, 0x48, 0x87,
-       0x14, 0x62, 0xc2, 0x6f, 0xcc, 0x5d, 0x8f, 0x66, 0x9f, 0x39, 0x97, 0x74,
-       0xe1, 0xa3, 0x50, 0x3b, 0x26, 0x2a, 0xc2, 0x18, 0x48, 0x14, 0xa1, 0x7d,
-       0x56, 0xbd, 0xf5, 0xce, 0x45, 0x4d, 0xdc, 0x83, 0xf3, 0x51, 0x27, 0x9a,
-       0x66, 0x7b, 0xac, 0x7c, 0x92, 0x8d, 0x76, 0xf1, 0x76, 0x34, 0x42, 0x5f,
-       0xe0, 0xb9, 0xc9, 0x3f, 0x14, 0x68, 0x8b, 0x70, 0x7f, 0x0e, 0xc3, 0xf7,
-       0x27, 0x3e, 0x27, 0xc6, 0x94, 0x1b, 0x33, 0xc3, 0x65, 0xb8, 0x7b, 0x40,
-       0xce, 0x29, 0x48, 0x9d, 0x4a, 0x9b, 0x9a, 0xaf, 0x94, 0x61, 0xc9, 0x90,
-       0xe0, 0xb9, 0x9c, 0xfd, 0x48, 0x87, 0x5c, 0xb1, 0x36, 0xee, 0x51, 0x27,
-       0xea, 0xf7, 0x5a, 0x72, 0x55, 0xed, 0x8a, 0xd9, 0x75, 0x49, 0x8f, 0xe8,
-       0xf4, 0x67, 0x9d, 0xf7, 0x53, 0xef, 0xa7, 0x42, 0xde, 0xf6, 0x99, 0x76,
-       0xad, 0xe3, 0x57, 0x4a, 0x10, 0xa3, 0x19, 0xa0, 0x6f, 0x24, 0x80, 0x0f,
-       0x12, 0xc2, 0xed, 0x03, 0x78, 0x7f, 0x2c, 0x88, 0x77, 0xe8, 0x87, 0x8a,
-       0xe2, 0xde, 0xc8, 0x33, 0x8c, 0xdd, 0xde, 0xe5, 0x75, 0x61, 0x5c, 0xc7,
-       0x15, 0xca, 0xcf, 0x19, 0x6f, 0xc4, 0xa5, 0xb1, 0x6f, 0xe0, 0xf2, 0x5e,
-       0x05, 0xc7, 0xb4, 0x6f, 0xe0, 0xe2, 0xa1, 0x4e, 0x2c, 0xda, 0x2b, 0x67,
-       0xf5, 0x8e, 0x86, 0x54, 0xfa, 0x81, 0x27, 0xeb, 0xcc, 0xae, 0x17, 0xf4,
-       0x7a, 0x62, 0x86, 0x57, 0x6f, 0x67, 0x6c, 0x24, 0xf8, 0x1d, 0xb1, 0xc9,
-       0x9e, 0xc9, 0xde, 0x75, 0xe2, 0xb2, 0x85, 0xd9, 0xb7, 0xc7, 0x89, 0x1b,
-       0x78, 0x2d, 0xe3, 0x88, 0x6d, 0xdf, 0x81, 0x57, 0x19, 0x94, 0x6e, 0x61,
-       0x3b, 0x17, 0x71, 0xee, 0xe9, 0x68, 0x11, 0x0a, 0xab, 0xcb, 0x2d, 0x7b,
-       0x2b, 0x8e, 0x07, 0x70, 0x9a, 0xb2, 0x5b, 0x59, 0xed, 0xe5, 0xb5, 0xf8,
-       0xd8, 0x20, 0xe3, 0x93, 0x99, 0xf8, 0xe0, 0x26, 0xdf, 0xfa, 0xaa, 0x85,
-       0x0d, 0x0e, 0xed, 0x81, 0x39, 0x59, 0x6c, 0x20, 0xa0, 0x13, 0x93, 0x25,
-       0x27, 0x58, 0xae, 0x69, 0x1b, 0xbe, 0x4b, 0x1b, 0x4f, 0x87, 0x8e, 0xfd,
-       0x49, 0x29, 0x39, 0xf0, 0x0b, 0xa1, 0x7a, 0xa3, 0x02, 0x2b, 0x78, 0x7f,
-       0x62, 0x91, 0x8a, 0x75, 0xfc, 0xf6, 0xb3, 0x5d, 0x90, 0xf3, 0xb8, 0x6a,
-       0xa6, 0x54, 0x1f, 0xff, 0xae, 0xa5, 0x2f, 0xdf, 0x84, 0xb3, 0xb1, 0x86,
-       0xf6, 0x11, 0xe5, 0x8a, 0x69, 0x54, 0xd7, 0xf1, 0xb7, 0x2a, 0x9c, 0x8b,
-       0x7a, 0x27, 0x0e, 0xa1, 0xc1, 0x33, 0xa5, 0xec, 0x37, 0x0d, 0x55, 0xf6,
-       0x47, 0xd6, 0x2b, 0xcf, 0xdf, 0xc5, 0xfb, 0x17, 0xa6, 0xe9, 0xe1, 0x8d,
-       0xf8, 0xca, 0x79, 0x5d, 0xff, 0x84, 0x83, 0x98, 0x4b, 0x86, 0xf5, 0x06,
-       0x75, 0x0b, 0xb1, 0x20, 0xa2, 0xde, 0x4e, 0xff, 0x8a, 0xa8, 0x7f, 0x61,
-       0xc6, 0x8b, 0x65, 0x50, 0x2d, 0x5f, 0xd4, 0x8a, 0xe4, 0xd0, 0x74, 0x1e,
-       0x29, 0x7a, 0x97, 0xe5, 0xa4, 0xed, 0x15, 0xdd, 0xc7, 0x9d, 0xf4, 0x87,
-       0x09, 0x62, 0x78, 0x9c, 0x18, 0x5e, 0x48, 0x0c, 0xbf, 0xba, 0xa7, 0x18,
-       0x67, 0xf7, 0x34, 0x21, 0x5d, 0x21, 0xcf, 0xd8, 0xe1, 0xe4, 0xea, 0x52,
-       0x96, 0x6f, 0xb7, 0xa1, 0xa6, 0x7f, 0xa9, 0x9c, 0x75, 0x85, 0xf8, 0xd0,
-       0x82, 0x38, 0x11, 0xb1, 0xd5, 0x0e, 0x87, 0xf5, 0x7e, 0xc1, 0x8c, 0x9b,
-       0xf4, 0xcf, 0xa5, 0x15, 0xa2, 0xa5, 0x4a, 0xf0, 0xe1, 0xe2, 0x1c, 0xf1,
-       0x99, 0x3f, 0xe5, 0x5c, 0x8e, 0x53, 0xa7, 0x9f, 0xd2, 0xef, 0x91, 0x1a,
-       0x1d, 0xdb, 0xcb, 0x73, 0x12, 0xc3, 0x98, 0xd8, 0x41, 0x0d, 0xab, 0xaf,
-       0x36, 0x91, 0xd0, 0xc3, 0xf4, 0x4f, 0x21, 0x44, 0x2a, 0x82, 0xf4, 0x4b,
-       0x72, 0xad, 0xe2, 0x12, 0xe3, 0xaf, 0x4c, 0x50, 0xc1, 0x47, 0x5f, 0x13,
-       0xbf, 0xef, 0xd7, 0xcf, 0x2a, 0xa7, 0x67, 0x65, 0xdf, 0x6b, 0x10, 0x8c,
-       0x28, 0xb7, 0x30, 0xa2, 0xd0, 0xe2, 0x40, 0xb3, 0x2d, 0x6c, 0xf1, 0xd8,
-       0xe4, 0x4c, 0x51, 0x34, 0x74, 0x6f, 0xa2, 0x61, 0xc2, 0x67, 0x27, 0x1f,
-       0xfb, 0xe3, 0xaf, 0x91, 0x87, 0x59, 0x7c, 0x60, 0xba, 0xdf, 0x69, 0x02,
-       0xa6, 0xcb, 0x23, 0x7f, 0x76, 0xd9, 0x93, 0xc5, 0xca, 0x72, 0xe1, 0x6d,
-       0xff, 0xcf, 0x6c, 0xbd, 0x69, 0xfe, 0x79, 0x1c, 0xf9, 0x25, 0xaf, 0xe5,
-       0x79, 0xb1, 0x3b, 0xea, 0x45, 0xfc, 0x1f, 0xcd, 0xc7, 0x2d, 0xee, 0x76,
-       0x6c, 0x8e, 0x9c, 0xcb, 0x74, 0xf4, 0xff, 0xfd, 0x1c, 0x79, 0x9f, 0xc1,
-       0x36, 0x8d, 0x03, 0x64, 0xfd, 0xea, 0x3b, 0xe6, 0x2a, 0x6b, 0xae, 0xa7,
-       0x73, 0xed, 0x24, 0x56, 0x96, 0xb9, 0x28, 0xf8, 0x81, 0xd6, 0xa0, 0x9e,
-       0x46, 0xa9, 0xe0, 0x49, 0x44, 0xea, 0x91, 0xc5, 0x9a, 0xcf, 0x7d, 0x90,
-       0xdf, 0xbb, 0x78, 0xff, 0x35, 0xcd, 0xd1, 0xf4, 0x2c, 0xa4, 0x06, 0x6b,
-       0xe3, 0x5e, 0x35, 0xb8, 0x4f, 0xc3, 0x1f, 0x29, 0x54, 0xa6, 0xcc, 0xf6,
-       0x2a, 0x69, 0x93, 0xad, 0xc5, 0x42, 0x39, 0x6f, 0xe5, 0x49, 0xb2, 0x3a,
-       0x53, 0x4b, 0x9d, 0x11, 0xec, 0x12, 0xde, 0xb1, 0x80, 0x6b, 0x57, 0x31,
-       0x34, 0x26, 0x1c, 0xc1, 0x65, 0xf1, 0x20, 0xb5, 0xae, 0xce, 0xb3, 0x1e,
-       0xca, 0x5c, 0x62, 0x2c, 0xb6, 0xea, 0xb8, 0xd3, 0x86, 0xb7, 0xee, 0xb4,
-       0x85, 0x97, 0xfe, 0xd9, 0xfd, 0x8d, 0x77, 0xcf, 0x95, 0x77, 0x5f, 0xc8,
-       0xe6, 0x24, 0x2f, 0xeb, 0x96, 0xba, 0xe1, 0x72, 0xf2, 0xaa, 0x41, 0xc6,
-       0xf2, 0xcb, 0x83, 0xbf, 0x33, 0xbf, 0xed, 0x88, 0x78, 0xec, 0xa8, 0xf3,
-       0xf4, 0xe0, 0x9a, 0x99, 0xaa, 0xb2, 0xee, 0xcf, 0x95, 0xf7, 0x0d, 0x9c,
-       0xd2, 0x3f, 0xb9, 0xc8, 0xdd, 0x75, 0x26, 0xe3, 0x64, 0xdb, 0x32, 0x3b,
-       0xed, 0x82, 0x32, 0x33, 0xeb, 0x67, 0xd5, 0xb9, 0x6d, 0x4a, 0x3d, 0xb5,
-       0xa3, 0x0a, 0x47, 0xa8, 0xbf, 0x47, 0xc6, 0xc4, 0xff, 0xa9, 0x38, 0x4c,
-       0x3b, 0x3d, 0x54, 0xef, 0xeb, 0xbc, 0xcc, 0xb8, 0xf1, 0x43, 0xf2, 0xf9,
-       0x37, 0x34, 0x6f, 0xfb, 0x29, 0xc9, 0x29, 0x86, 0x1c, 0x38, 0x13, 0xbc,
-       0x66, 0xe5, 0x78, 0x63, 0x07, 0x54, 0x0c, 0x26, 0xb2, 0xf6, 0xfe, 0x0a,
-       0xed, 0xf8, 0xc6, 0x99, 0x03, 0x1d, 0x5b, 0x06, 0xc4, 0x3e, 0x1a, 0x2d,
-       0x3b, 0xba, 0x91, 0x13, 0x12, 0xbc, 0x16, 0xbb, 0x78, 0x42, 0x6a, 0x71,
-       0x46, 0x0a, 0x0e, 0xca, 0x77, 0x39, 0xf9, 0xae, 0xf8, 0xd8, 0x00, 0x63,
-       0x5b, 0x07, 0xed, 0xe7, 0x14, 0xe3, 0x0c, 0xce, 0x2d, 0x6c, 0x9a, 0xef,
-       0x30, 0xee, 0x1a, 0x42, 0x83, 0x7a, 0x02, 0x6b, 0xc8, 0x59, 0xc9, 0x67,
-       0xc6, 0x9a, 0xb1, 0xd3, 0x8a, 0x9b, 0x7c, 0xea, 0x0a, 0x65, 0x21, 0xd7,
-       0xdf, 0x8c, 0xee, 0x43, 0xb5, 0xe4, 0x35, 0xa6, 0xb9, 0x5a, 0xff, 0x73,
-       0x54, 0x0e, 0x74, 0x77, 0x56, 0x52, 0x1e, 0x9f, 0x86, 0x8c, 0x0e, 0x62,
-       0xfa, 0x86, 0x13, 0x4a, 0xc3, 0xda, 0x98, 0xf2, 0x6d, 0xee, 0x87, 0xe4,
-       0x41, 0x3c, 0x8c, 0xc7, 0x57, 0xd3, 0x9f, 0xfd, 0x0f, 0xec, 0x50, 0x95,
-       0x25, 0xb6, 0xb0, 0xf0, 0x41, 0xf8, 0xd5, 0xb0, 0x76, 0xea, 0xa2, 0x7d,
-       0x33, 0xbd, 0x4f, 0x23, 0xef, 0x89, 0x5f, 0x97, 0xb6, 0x72, 0xb6, 0xbe,
-       0x13, 0xc7, 0xd3, 0xd4, 0xeb, 0x68, 0x2f, 0x4e, 0xa4, 0x65, 0x4c, 0xe1,
-       0x53, 0x01, 0xc4, 0x06, 0xec, 0x18, 0xd5, 0x7d, 0x91, 0x72, 0xca, 0xa5,
-       0x38, 0xe4, 0x8d, 0xac, 0x51, 0x02, 0xe4, 0x6d, 0x69, 0x9c, 0xd9, 0xed,
-       0x6d, 0xaf, 0x67, 0x8c, 0x18, 0x1d, 0x83, 0xfa, 0xcc, 0xe2, 0x34, 0x4e,
-       0x0f, 0x3f, 0x04, 0xcf, 0x2c, 0xaf, 0x67, 0xb9, 0xd2, 0x82, 0xad, 0x63,
-       0xff, 0x51, 0x2e, 0xc9, 0xc3, 0xb1, 0x5b, 0x60, 0x50, 0xf6, 0xdb, 0xd1,
-       0x3f, 0x57, 0x6c, 0xbe, 0x67, 0xac, 0x14, 0xf3, 0xe8, 0x8f, 0x5e, 0xb2,
-       0xfc, 0x6c, 0xd6, 0x8e, 0x6a, 0xb4, 0x8f, 0xcc, 0xc7, 0x72, 0x3e, 0xfc,
-       0xab, 0xe5, 0xf5, 0x77, 0x66, 0x44, 0x15, 0x79, 0xc9, 0x73, 0x35, 0x28,
-       0x62, 0x3f, 0x3b, 0x72, 0xfe, 0xba, 0x42, 0xfb, 0xbf, 0xe6, 0x43, 0x56,
-       0x1f, 0x4f, 0xcd, 0x95, 0xa0, 0x60, 0x9b, 0x15, 0xd3, 0xcb, 0xba, 0x75,
-       0x7c, 0x16, 0x95, 0x9c, 0x86, 0x8a, 0x13, 0xba, 0xe0, 0x48, 0x0b, 0x6d,
-       0xd5, 0x89, 0x0d, 0x41, 0x9a, 0xa3, 0x95, 0xcf, 0x9f, 0xc4, 0xce, 0xe4,
-       0xbf, 0x9b, 0xcf, 0x51, 0x8f, 0x56, 0x92, 0xc3, 0x78, 0x88, 0x03, 0x4f,
-       0x85, 0x56, 0x93, 0x73, 0x72, 0xcd, 0x09, 0x07, 0x31, 0x48, 0x41, 0xa2,
-       0x89, 0xf6, 0x1f, 0x5a, 0x80, 0x09, 0xab, 0x7d, 0xd5, 0xdc, 0x6c, 0x0e,
-       0xf1, 0x83, 0xb9, 0xd9, 0x38, 0x50, 0xe4, 0xff, 0x9f, 0x91, 0xdf, 0x2b,
-       0xa6, 0xa7, 0x52, 0xe4, 0xe7, 0x80, 0x9b, 0x7e, 0x6b, 0x1f, 0xdb, 0x9c,
-       0xdb, 0xed, 0x40, 0xbf, 0xd6, 0x82, 0xfe, 0x31, 0x78, 0x3e, 0x65, 0x9b,
-       0x7f, 0x1a, 0x1e, 0x98, 0x9b, 0xe5, 0x0a, 0x6f, 0xa1, 0x3b, 0xfa, 0xbc,
-       0xb9, 0xac, 0x52, 0xd6, 0xeb, 0x84, 0x9b, 0xeb, 0xdd, 0x77, 0x3d, 0x9f,
-       0xb7, 0xde, 0x7c, 0xd8, 0xf2, 0x13, 0xbb, 0xe7, 0x4a, 0xbd, 0xec, 0xa7,
-       0x09, 0x13, 0x97, 0xf4, 0xa3, 0x56, 0x1c, 0x2e, 0xd8, 0xd0, 0x93, 0x90,
-       0xbd, 0x95, 0xb9, 0x6d, 0xcd, 0xc9, 0xe3, 0xff, 0x54, 0xdf, 0x3c, 0xef,
-       0x65, 0x39, 0x5d, 0x96, 0x5a, 0x75, 0x9e, 0xe3, 0x8b, 0x2e, 0x8b, 0x1e,
-       0x5b, 0xef, 0xfd, 0x24, 0xe5, 0xfd, 0xd9, 0x27, 0xd4, 0xdf, 0x73, 0x0c,
-       0xc9, 0xa9, 0xb4, 0xb0, 0x0f, 0xd3, 0x5c, 0xaf, 0x37, 0x78, 0x4e, 0xe0,
-       0x8f, 0xa8, 0xdb, 0x3a, 0xb6, 0x0f, 0x48, 0xbe, 0xd5, 0xa3, 0x38, 0xf6,
-       0xac, 0xc1, 0x25, 0xfa, 0xff, 0x9d, 0x96, 0x1e, 0x0a, 0xae, 0xc8, 0x3c,
-       0x04, 0x5b, 0xda, 0xe8, 0xc7, 0xad, 0xb3, 0x2e, 0x91, 0x9a, 0x70, 0xa7,
-       0xf2, 0x61, 0x7d, 0x27, 0x8e, 0x86, 0x0c, 0xb3, 0x5c, 0xf3, 0xaf, 0x65,
-       0xd0, 0x5f, 0x34, 0xd6, 0x58, 0x88, 0xf1, 0x90, 0xf0, 0x47, 0xb8, 0xd2,
-       0x69, 0xaf, 0x31, 0xc3, 0xae, 0xba, 0x5e, 0x4e, 0xe7, 0xb0, 0xd2, 0xf6,
-       0xc0, 0x5c, 0x89, 0x97, 0x92, 0x16, 0x8e, 0x7c, 0x1d, 0xf7, 0x59, 0x7b,
-       0xab, 0xd2, 0x87, 0x4a, 0xbe, 0xf7, 0x68, 0xe8, 0x4a, 0x54, 0x30, 0xc5,
-       0x5c, 0xd2, 0x1c, 0x6a, 0x50, 0xb7, 0xe3, 0x4e, 0x62, 0xd7, 0x12, 0x9c,
-       0xd1, 0xa5, 0xae, 0x61, 0x7c, 0xdb, 0x01, 0xa9, 0xc1, 0x1d, 0x0e, 0x6d,
-       0x8d, 0x2e, 0xc5, 0xbe, 0x01, 0x43, 0x71, 0x86, 0xbd, 0x91, 0x18, 0xb9,
-       0x10, 0xe3, 0x71, 0x2b, 0xdf, 0x27, 0xf9, 0x84, 0xc1, 0xc6, 0x4e, 0x6c,
-       0xd7, 0x0b, 0xd1, 0xa3, 0x47, 0x8a, 0xb6, 0x2c, 0xee, 0xc2, 0x7e, 0xbd,
-       0xd4, 0x98, 0x17, 0x36, 0x88, 0xe9, 0xda, 0x86, 0x24, 0xfc, 0x2d, 0x17,
-       0xc9, 0x39, 0x8e, 0xc3, 0xdb, 0xb1, 0xc4, 0x4e, 0xcc, 0xbd, 0xc7, 0xe1,
-       0x8a, 0x65, 0x9a, 0x90, 0x18, 0xab, 0x72, 0xed, 0xc8, 0x04, 0x11, 0x1f,
-       0xe3, 0x7e, 0x33, 0xae, 0x75, 0x64, 0x96, 0x92, 0x83, 0x8a, 0x1c, 0xed,
-       0xd4, 0xc5, 0x7a, 0x3c, 0xd3, 0x7a, 0xc1, 0x7c, 0xd2, 0x2f, 0xf8, 0x59,
-       0x8b, 0x67, 0x55, 0x9f, 0xc5, 0x29, 0x23, 0xb6, 0xaf, 0xb2, 0x0f, 0x3b,
-       0x75, 0xee, 0x55, 0xd3, 0xf3, 0xa8, 0xc8, 0x8d, 0xc1, 0x56, 0xf1, 0x6a,
-       0xe2, 0xa7, 0xfc, 0x2d, 0xb2, 0x13, 0x19, 0x9a, 0x58, 0xa7, 0x4b, 0x2e,
-       0xaf, 0x91, 0x36, 0xe3, 0xc6, 0xdb, 0xea, 0x8d, 0x7d, 0x78, 0x5a, 0xf7,
-       0xe9, 0x87, 0x20, 0x39, 0xbc, 0xff, 0xce, 0xe7, 0x24, 0xdf, 0xd2, 0x84,
-       0x17, 0x2b, 0xb2, 0xf1, 0x87, 0xc7, 0x56, 0x42, 0xdc, 0xcd, 0xfb, 0x11,
-       0xb9, 0xef, 0x4d, 0x46, 0xa8, 0xa7, 0x1b, 0x83, 0x53, 0x66, 0xa4, 0xd2,
-       0xe8, 0x94, 0xb3, 0x28, 0xee, 0xf0, 0xea, 0x17, 0xdd, 0xf5, 0xde, 0x8e,
-       0x29, 0x05, 0x38, 0x13, 0xa3, 0x1f, 0xb6, 0xfe, 0xbb, 0x47, 0xe9, 0xdb,
-       0x89, 0xa1, 0xe0, 0x1d, 0x68, 0x6f, 0x93, 0xb1, 0x9a, 0xd1, 0xbb, 0xd7,
-       0x34, 0x4b, 0x43, 0x3e, 0x35, 0x0d, 0x27, 0x56, 0x04, 0xed, 0xb8, 0xa0,
-       0x9a, 0x70, 0x84, 0xfe, 0xdd, 0xcc, 0xd0, 0x3f, 0x0e, 0xd3, 0x4e, 0x76,
-       0x50, 0xc7, 0xe4, 0x5d, 0x28, 0x3f, 0xed, 0x24, 0x4e, 0x3b, 0x39, 0x13,
-       0x9a, 0x9f, 0x7b, 0x57, 0x52, 0x23, 0xaf, 0x98, 0xc4, 0x92, 0x01, 0x15,
-       0x9f, 0xde, 0x33, 0x89, 0xd0, 0x50, 0x7e, 0xee, 0x62, 0x97, 0xf9, 0xf9,
-       0x4b, 0x6d, 0x50, 0xe6, 0x2e, 0x73, 0x94, 0xb5, 0xc8, 0xdf, 0xf9, 0x7b,
-       0xf9, 0xdf, 0xc4, 0xcf, 0x3a, 0xd1, 0x6a, 0xad, 0xed, 0x2f, 0x6a, 0xb2,
-       0x98, 0x91, 0x5f, 0x93, 0xeb, 0x96, 0xeb, 0x4b, 0xb7, 0x5c, 0x3f, 0xee,
-       0xbe, 0xf9, 0x7a, 0xfb, 0x9c, 0x9b, 0xaf, 0xf3, 0x36, 0x71, 0x43, 0xae,
-       0x1d, 0xba, 0x6f, 0xe2, 0x28, 0xd7, 0x3a, 0x63, 0xc1, 0x21, 0xf3, 0x42,
-       0x85, 0xcc, 0x45, 0x62, 0xd6, 0xec, 0x5c, 0x97, 0x65, 0xa6, 0xcf, 0xf5,
-       0xcd, 0x5c, 0x6d, 0xc0, 0x3a, 0xf7, 0x4b, 0xbb, 0xd1, 0xe4, 0x1d, 0xdf,
-       0xdc, 0x3b, 0x74, 0xd9, 0xb3, 0x88, 0xa5, 0xe1, 0x80, 0xd2, 0x1b, 0x33,
-       0xcc, 0x19, 0x5a, 0xb1, 0x21, 0xef, 0x4a, 0xa9, 0x7e, 0x03, 0x25, 0x7e,
-       0x6d, 0xc3, 0x0c, 0x5b, 0x17, 0x9c, 0x0b, 0xb5, 0x8e, 0x3f, 0x53, 0x92,
-       0x88, 0x67, 0xbc, 0x81, 0x43, 0x94, 0x55, 0x2c, 0x73, 0x95, 0x71, 0x75,
-       0x17, 0x9e, 0x09, 0x39, 0x8c, 0xe2, 0xb0, 0xd7, 0x3d, 0x5f, 0x59, 0x86,
-       0xed, 0x43, 0x7f, 0x8e, 0xf5, 0x49, 0xe1, 0xf8, 0xb5, 0xd8, 0x32, 0x66,
-       0xc3, 0x31, 0xea, 0x77, 0x2f, 0xc7, 0x21, 0xfe, 0xb9, 0x53, 0x90, 0xb3,
-       0x79, 0x8d, 0x8c, 0x91, 0x75, 0xeb, 0xb3, 0x75, 0xe8, 0x75, 0xac, 0x8f,
-       0x9a, 0xf8, 0x54, 0xa7, 0xef, 0xd1, 0x64, 0x7e, 0x12, 0x3b, 0xb7, 0x5a,
-       0x58, 0xfa, 0x48, 0x9c, 0xfb, 0x39, 0x4b, 0x6c, 0x75, 0x29, 0x6d, 0x56,
-       0xc1, 0x67, 0x52, 0x77, 0xac, 0xe4, 0x9c, 0xc9, 0x0d, 0xc7, 0xa3, 0x9b,
-       0x30, 0x1c, 0x35, 0xe4, 0x7d, 0xc0, 0xde, 0x1a, 0x7b, 0xe4, 0x85, 0x0a,
-       0xf2, 0xec, 0x84, 0xee, 0x6f, 0x3f, 0xa7, 0xc0, 0x53, 0x16, 0xf6, 0xd3,
-       0xcf, 0x7c, 0x89, 0xdf, 0xea, 0x92, 0x4f, 0xd3, 0x5d, 0xab, 0xa8, 0xef,
-       0x7b, 0x86, 0x02, 0x56, 0x7e, 0xe0, 0xef, 0x6e, 0x9b, 0xbf, 0x90, 0x1a,
-       0xb3, 0x9e, 0xcb, 0x35, 0xbe, 0x8e, 0x83, 0x69, 0x17, 0x1e, 0x8b, 0x7b,
-       0x94, 0x79, 0x7b, 0x54, 0xdc, 0x1f, 0xf7, 0x4e, 0x2c, 0xb1, 0x93, 0x7f,
-       0x2c, 0x9a, 0xc1, 0xfe, 0x14, 0xfc, 0x68, 0xa1, 0xf8, 0x82, 0xff, 0x0a,
-       0x63, 0x56, 0x84, 0x7d, 0xa2, 0xb4, 0x60, 0xb1, 0x57, 0x3d, 0x68, 0xf3,
-       0xb9, 0x7f, 0x8b, 0xad, 0xb0, 0x67, 0x56, 0xa3, 0x9b, 0xf3, 0x5f, 0x19,
-       0x97, 0x9a, 0x55, 0x03, 0x50, 0xd1, 0x8c, 0x1d, 0x87, 0xc4, 0x36, 0xe5,
-       0x9d, 0x75, 0x78, 0xaa, 0xc2, 0x2d, 0x77, 0xa0, 0xf8, 0x4b, 0x72, 0xed,
-       0x49, 0x89, 0x3f, 0x37, 0x94, 0xdb, 0x4c, 0xc6, 0x2f, 0xf3, 0x73, 0x35,
-       0x89, 0xa5, 0xd8, 0x3a, 0x20, 0xf9, 0x76, 0xe2, 0xb6, 0xce, 0x38, 0xa8,
-       0x42, 0x0b, 0x3c, 0x65, 0x93, 0x3a, 0xd0, 0x26, 0xf8, 0x62, 0x9b, 0x10,
-       0x88, 0x89, 0xcd, 0x6a, 0x6a, 0x07, 0x22, 0xa7, 0x25, 0xcf, 0x37, 0x2f,
-       0xe4, 0xe7, 0xbc, 0xfc, 0xbd, 0x55, 0x76, 0xdd, 0xf5, 0xca, 0xa8, 0x8a,
-       0x09, 0x35, 0x1b, 0x47, 0x1e, 0x4a, 0x6a, 0x6b, 0x0b, 0x6d, 0x72, 0x26,
-       0xe2, 0xb2, 0x19, 0xb1, 0xfa, 0x55, 0x6a, 0x51, 0xde, 0x8c, 0xbe, 0xbd,
-       0xef, 0xd2, 0x07, 0xc9, 0x18, 0xbf, 0x37, 0x9d, 0xd4, 0xcb, 0xe5, 0x6d,
-       0x1e, 0xdc, 0x17, 0x97, 0x3c, 0x69, 0x4f, 0x75, 0xf6, 0x4c, 0x87, 0x5c,
-       0x3b, 0xd0, 0xa1, 0x13, 0x64, 0x67, 0x7d, 0x61, 0x56, 0x59, 0x71, 0xe9,
-       0x97, 0x59, 0x9d, 0x49, 0xdc, 0x7d, 0x87, 0xd8, 0x78, 0xcf, 0x58, 0x83,
-       0x3b, 0xab, 0x77, 0x4d, 0xbc, 0x96, 0xbe, 0xb4, 0x7d, 0x9b, 0xe4, 0x34,
-       0x2e, 0xf9, 0xcc, 0x23, 0xa3, 0xd3, 0xdb, 0xe7, 0x73, 0x30, 0x55, 0x39,
-       0x4e, 0x95, 0xd7, 0x37, 0xa9, 0xf5, 0x45, 0x94, 0x87, 0xa3, 0x2d, 0xca,
-       0xaa, 0xa8, 0xd4, 0xfb, 0x6c, 0xd1, 0x12, 0xeb, 0x5c, 0xab, 0x89, 0xef,
-       0x85, 0xc6, 0x95, 0x6d, 0xd6, 0x99, 0x59, 0x43, 0x49, 0x36, 0x02, 0x95,
-       0xa3, 0xcd, 0xca, 0xf6, 0xe8, 0x27, 0xe6, 0x53, 0x56, 0x5d, 0x7d, 0xa6,
-       0x75, 0xbe, 0xa6, 0x70, 0xd4, 0x85, 0x8a, 0x83, 0x25, 0x28, 0x18, 0xd4,
-       0x30, 0x73, 0xf4, 0x41, 0xf2, 0x56, 0xe1, 0x3a, 0x46, 0x8b, 0xc3, 0x3a,
-       0xa3, 0xf6, 0xfa, 0xf5, 0x33, 0x6a, 0x0e, 0xe2, 0x82, 0x01, 0xeb, 0x1f,
-       0x63, 0xa5, 0xc3, 0x8c, 0x95, 0xcc, 0x25, 0xdf, 0x0b, 0x19, 0x3b, 0x66,
-       0xc2, 0x1b, 0xa8, 0xb4, 0x19, 0xa6, 0xe4, 0x6e, 0x5e, 0x21, 0x61, 0x5c,
-       0x53, 0x67, 0x60, 0x45, 0x9d, 0xbc, 0x9b, 0xe9, 0x30, 0xec, 0xe1, 0x2e,
-       0x1c, 0x0e, 0x75, 0xe1, 0x3d, 0xbd, 0x0b, 0x3b, 0xf5, 0x62, 0xa3, 0x3c,
-       0x5c, 0x2a, 0x67, 0xd9, 0x27, 0xa2, 0xd0, 0xf4, 0xb4, 0xa2, 0x9d, 0xba,
-       0x0a, 0xef, 0x3e, 0x9f, 0xe2, 0x35, 0x96, 0x29, 0x1a, 0x2e, 0x67, 0xbc,
-       0x53, 0xe5, 0xb4, 0x81, 0x6b, 0x99, 0x00, 0xa6, 0x88, 0xab, 0xc9, 0x31,
-       0x39, 0x4f, 0x52, 0x8b, 0x81, 0xb1, 0xff, 0x29, 0xdc, 0xc0, 0x20, 0x26,
-       0x59, 0x67, 0x2a, 0x9f, 0x93, 0x5a, 0xa6, 0x33, 0x98, 0xe3, 0x30, 0x86,
-       0xb2, 0xae, 0xb1, 0x0c, 0xd7, 0xe8, 0x9d, 0x7e, 0x98, 0xee, 0x64, 0x3c,
-       0x87, 0xd7, 0x6a, 0x60, 0xff, 0xbe, 0x1b, 0xf5, 0xc9, 0x19, 0x38, 0x56,
-       0x5f, 0x89, 0x02, 0x1c, 0x1d, 0xee, 0x20, 0xc7, 0xef, 0x6e, 0x2f, 0x67,
-       0x7c, 0x3a, 0x3a, 0xec, 0x44, 0x2a, 0x25, 0x39, 0x07, 0xab, 0x36, 0x39,
-       0xe9, 0xa0, 0x2d, 0xed, 0x4a, 0xa0, 0xbe, 0x26, 0xec, 0x4f, 0xd6, 0xd8,
-       0x55, 0xf6, 0x51, 0x85, 0x54, 0x5a, 0xe3, 0x27, 0xc0, 0x4f, 0x90, 0x9f,
-       0x26, 0x7c, 0x8f, 0x36, 0x5b, 0x41, 0xbc, 0x7d, 0x35, 0x5d, 0x86, 0x4f,
-       0x92, 0x5a, 0x40, 0xa7, 0x1e, 0x0c, 0x33, 0x46, 0x30, 0x2c, 0x39, 0x95,
-       0xe1, 0x2a, 0xed, 0xf4, 0xa5, 0x50, 0x19, 0xcc, 0xd4, 0xed, 0x62, 0x42,
-       0x79, 0xff, 0x25, 0x7f, 0x0e, 0x33, 0x5b, 0x5f, 0x3d, 0x92, 0x81, 0xf2,
-       0x78, 0x9d, 0x41, 0x7d, 0x61, 0x0c, 0xbb, 0x48, 0x6a, 0x29, 0x5a, 0xe7,
-       0x25, 0x7b, 0xb1, 0x51, 0x13, 0xf6, 0x7a, 0x6a, 0xec, 0x1a, 0xce, 0xa5,
-       0x27, 0x11, 0x4f, 0xca, 0xbb, 0x6d, 0xa2, 0xc7, 0xef, 0x9b, 0x46, 0x85,
-       0x9c, 0xc9, 0xe8, 0x44, 0x5c, 0xab, 0x64, 0x1c, 0x24, 0xef, 0x3e, 0x1e,
-       0x0e, 0x45, 0x63, 0xa5, 0xf2, 0x9e, 0xf0, 0x92, 0x97, 0x43, 0xde, 0x96,
-       0x7e, 0xc5, 0x78, 0xa8, 0xc4, 0x7a, 0xaf, 0xa3, 0x8b, 0x58, 0xac, 0xa9,
-       0x4e, 0xc5, 0xdb, 0xb4, 0x05, 0x01, 0x1c, 0x4b, 0x8b, 0xdc, 0x28, 0xa7,
-       0xb1, 0xac, 0xdc, 0x6e, 0x9c, 0x9d, 0xce, 0xea, 0xc1, 0xc6, 0xa8, 0x83,
-       0xdf, 0xb2, 0xf7, 0x72, 0xae, 0x95, 0x3e, 0xc2, 0xda, 0xff, 0x9f, 0xdf,
-       0x91, 0x3b, 0xbf, 0xda, 0x5e, 0x19, 0x76, 0x05, 0x97, 0xc7, 0xed, 0x9f,
-       0xc8, 0xfb, 0xc8, 0x4f, 0x34, 0xca, 0x7b, 0x6b, 0xae, 0xe0, 0xe3, 0xa3,
-       0xae, 0xe0, 0xda, 0xf8, 0x51, 0x85, 0xf2, 0xda, 0x57, 0x63, 0x77, 0x05,
-       0x1f, 0xb9, 0xd1, 0x9e, 0xfb, 0xde, 0x85, 0xb1, 0x50, 0xb1, 0xa1, 0x86,
-       0xc5, 0xa7, 0x7b, 0x03, 0x9f, 0x28, 0x96, 0x2f, 0x37, 0x4a, 0xe8, 0x63,
-       0x9f, 0xcf, 0x8c, 0x9b, 0xed, 0xb3, 0x04, 0xab, 0xec, 0x1c, 0xeb, 0x2a,
-       0x5e, 0x49, 0xdd, 0x78, 0xae, 0x85, 0xcf, 0x15, 0xf3, 0xb9, 0x92, 0xb0,
-       0xc4, 0x8d, 0x5e, 0x7d, 0x95, 0xa2, 0x79, 0x8a, 0x14, 0xa9, 0x87, 0x69,
-       0xf8, 0x55, 0xfa, 0x9f, 0xef, 0x90, 0x78, 0xb7, 0x67, 0xac, 0x12, 0x6b,
-       0x76, 0x9b, 0x4b, 0xe6, 0x2d, 0x34, 0x97, 0xa4, 0x43, 0x31, 0xf3, 0xa5,
-       0x6a, 0xd9, 0x4f, 0xa9, 0xf1, 0xc9, 0x33, 0x9a, 0xea, 0x63, 0x9c, 0xf9,
-       0x4d, 0x7d, 0xbb, 0xbc, 0xa3, 0x07, 0x79, 0x7f, 0xa9, 0x90, 0x63, 0x9c,
-       0x4c, 0x89, 0x8e, 0x6c, 0x6d, 0x77, 0x31, 0x16, 0x95, 0x77, 0x67, 0x0f,
-       0x73, 0xef, 0x0f, 0xa6, 0xfe, 0xd7, 0x1d, 0x72, 0x76, 0x5d, 0xce, 0x06,
-       0x00, 0xff, 0x1f, 0x17, 0x23, 0xca, 0x76, 0xf8, 0x78, 0x00, 0x00, 0x00 };
-
-static const u32 bnx2_RXP_b09FwData[(0x0/4) + 1] = { 0x0 };
-static const u32 bnx2_RXP_b09FwRodata[(0x124/4) + 1] = {
-       0x5f865437, 0xe4ac62cc, 0x50103a45, 0x36621985, 0xbf14c0e8, 0x1bc27a1e,
-       0x84f4b556, 0x094ea6fe, 0x7dda01e7, 0xc04d7481, 0x80080100, 0x80080080,
-       0x80080000, 0x08004fbc, 0x08004fbc, 0x08005098, 0x0800506c, 0x08005050,
-       0x08004f8c, 0x08004f8c, 0x08004f8c, 0x08004fc4, 0x080072ac, 0x080072f8,
-       0x080072b8, 0x080071dc, 0x080072b8, 0x080072e8, 0x080072b8, 0x080071dc,
-       0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc,
-       0x080071dc, 0x080071dc, 0x080071dc, 0x080072d8, 0x080072c8, 0x080071dc,
-       0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc,
-       0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080072c8,
-       0x0800787c, 0x08007748, 0x08007844, 0x08007748, 0x08007814, 0x08007630,
-       0x08007748, 0x08007748, 0x08007748, 0x08007748, 0x08007748, 0x08007748,
-       0x08007748, 0x08007748, 0x08007748, 0x08007748, 0x08007748, 0x08007748,
-       0x08007770, 0x00000000 };
-
-static struct fw_info bnx2_rxp_fw_09 = {
-       /* Firmware version: 4.6.15 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0xf,
-
-       .start_addr                     = 0x080031d8,
-
-       .text_addr                      = 0x08000000,
-       .text_len                       = 0x78f4,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_RXP_b09FwText,
-       .gz_text_len                    = sizeof(bnx2_RXP_b09FwText),
-
-       .data_addr                      = 0x00000000,
-       .data_len                       = 0x0,
-       .data_index                     = 0x0,
-       .data                           = bnx2_RXP_b09FwData,
-
-       .sbss_addr                      = 0x08007a40,
-       .sbss_len                       = 0x58,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08007a98,
-       .bss_len                        = 0x20,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x080078f4,
-       .rodata_len                     = 0x124,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_RXP_b09FwRodata,
-};
-
-static u8 bnx2_xi_rv2p_proc1[] = {
-       /* Date:        01/27/2009 19:01 */
-#define XI_RV2P_PROC1_POST_WAIT_TIMEOUT_MSK    0xffff
-       0xa5, 0x56, 0xdd, 0x6b, 0x1c, 0x55, 0x14, 0x3f, 0x33, 0xbb, 0x33, 0xb3,
-       0xd9, 0x9d, 0xd9, 0x5d, 0x9a, 0x34, 0x8e, 0xb1, 0x34, 0xdb, 0x20, 0xca,
-       0xa6, 0x13, 0xdd, 0x68, 0x1f, 0x04, 0x03, 0x2d, 0x01, 0x29, 0x98, 0xe2,
-       0x43, 0xa0, 0x52, 0x8a, 0x60, 0x5c, 0xb4, 0x08, 0xf6, 0x2f, 0x10, 0xc1,
-       0x21, 0x31, 0x11, 0xc4, 0xaf, 0x7d, 0xe8, 0x42, 0x02, 0x6a, 0x40, 0x50,
-       0x09, 0x11, 0x77, 0xdf, 0x24, 0x16, 0x7c, 0x68, 0xf1, 0x41, 0xda, 0xa7,
-       0x16, 0xd4, 0x97, 0x46, 0x11, 0xbf, 0x5e, 0x04, 0xd1, 0xc7, 0x9a, 0xf1,
-       0x9e, 0x8f, 0xbb, 0x3b, 0x73, 0xb3, 0x9b, 0x14, 0x5c, 0x48, 0x7e, 0x9c,
-       0x7b, 0xcf, 0x39, 0xf7, 0x7c, 0x9f, 0xa9, 0x02, 0x80, 0x0d, 0x71, 0x77,
-       0x52, 0x21, 0x58, 0xb9, 0x5c, 0x01, 0x01, 0x60, 0x1b, 0xf8, 0xe7, 0xf8,
-       0x44, 0xc7, 0x8f, 0x0a, 0x7d, 0x92, 0x21, 0x3e, 0x59, 0x55, 0xff, 0x2f,
-       0xc3, 0xe9, 0x1a, 0x62, 0x0e, 0x4e, 0x9f, 0x40, 0x7c, 0x12, 0xbe, 0xae,
-       0x85, 0x0a, 0xff, 0x4d, 0x20, 0x46, 0xfa, 0x68, 0xe7, 0xcb, 0x6e, 0x89,
-       0xf4, 0xef, 0x8a, 0xfc, 0xf7, 0x39, 0xc6, 0x27, 0xa2, 0x02, 0xeb, 0x11,
-       0x84, 0x99, 0x2a, 0xc1, 0xed, 0x16, 0xd2, 0xe7, 0xcf, 0x83, 0x8b, 0x7a,
-       0xde, 0x53, 0x0c, 0x48, 0x1f, 0xb3, 0xe2, 0x19, 0xb1, 0xcb, 0x66, 0xbe,
-       0x3b, 0xad, 0x0a, 0x9e, 0xc3, 0x8f, 0xf3, 0x48, 0xdf, 0x57, 0x7c, 0xa3,
-       0x85, 0x38, 0x0e, 0x97, 0x0a, 0x3e, 0xfb, 0x53, 0x17, 0x9c, 0x64, 0xf5,
-       0xbb, 0xd3, 0x28, 0xaf, 0x64, 0xa6, 0x45, 0xbf, 0x83, 0xfa, 0x7f, 0x4f,
-       0x58, 0x3f, 0xea, 0x4d, 0xeb, 0xbb, 0x5f, 0xe9, 0xc3, 0x73, 0x57, 0xec,
-       0x73, 0x0d, 0xfb, 0x5c, 0x65, 0x0f, 0xca, 0xaf, 0x00, 0xfb, 0x39, 0xaa,
-       0xde, 0x45, 0xfa, 0xaf, 0xbe, 0xbe, 0x2e, 0xa2, 0x6f, 0xb1, 0xbc, 0xfa,
-       0x13, 0xfb, 0x59, 0xee, 0x35, 0x25, 0xa7, 0xe3, 0x92, 0xb5, 0xd3, 0x8b,
-       0xb4, 0x7f, 0x3a, 0xfe, 0xc8, 0x7f, 0x2b, 0xc9, 0xf2, 0xc3, 0x21, 0xfc,
-       0x37, 0x15, 0x7f, 0x56, 0x2f, 0x9f, 0x7f, 0xdb, 0x3f, 0x1f, 0x18, 0x1f,
-       0xc7, 0x88, 0xcf, 0x75, 0xf1, 0xe7, 0x29, 0x78, 0xd0, 0x0e, 0x89, 0x2f,
-       0x0f, 0x21, 0xc5, 0x09, 0x62, 0xc4, 0xe3, 0x82, 0x2f, 0x09, 0x7e, 0x2e,
-       0xb8, 0x2d, 0x08, 0xff, 0x13, 0xff, 0x1e, 0x72, 0x7e, 0x54, 0xf0, 0x01,
-       0xe3, 0xfc, 0x9a, 0xe0, 0x23, 0x86, 0xfc, 0x71, 0x8b, 0xf1, 0x0f, 0xa1,
-       0xe7, 0x85, 0x7e, 0xc6, 0x90, 0x8f, 0x81, 0xe3, 0x63, 0x19, 0x71, 0xfb,
-       0x58, 0xea, 0x19, 0xf3, 0x2f, 0xf7, 0x75, 0xcd, 0x57, 0xa0, 0x38, 0xc2,
-       0x74, 0x9a, 0xff, 0x83, 0x03, 0xf8, 0x99, 0x6d, 0xbe, 0x3e, 0x48, 0xae,
-       0x9d, 0xb0, 0x1d, 0x57, 0x44, 0xbe, 0xd8, 0xb9, 0x3a, 0xa4, 0x7f, 0xe6,
-       0xa2, 0x41, 0xfd, 0x52, 0x17, 0x3f, 0xbe, 0x92, 0xba, 0xdc, 0xb1, 0x9a,
-       0x51, 0xc8, 0x79, 0xa5, 0x3c, 0x06, 0x52, 0x8f, 0x23, 0x46, 0x3d, 0x7b,
-       0xaa, 0x9e, 0xa5, 0xae, 0xea, 0xba, 0xbe, 0xb2, 0x75, 0xc5, 0xf5, 0xe1,
-       0x1a, 0xf5, 0x11, 0x1f, 0x12, 0x97, 0x92, 0xe1, 0xdf, 0xab, 0x09, 0x86,
-       0x18, 0x7f, 0xb6, 0xcd, 0xb8, 0xc1, 0x18, 0xf9, 0x6e, 0x1e, 0xf1, 0x94,
-       0xff, 0x0d, 0xeb, 0x9b, 0x04, 0x44, 0x3f, 0x6c, 0x53, 0x1f, 0xe5, 0xa1,
-       0xed, 0x2a, 0x9b, 0xe1, 0x6e, 0xf2, 0x0e, 0xf3, 0x4d, 0x38, 0x37, 0x09,
-       0xc3, 0x8d, 0x1b, 0xcc, 0xff, 0x5d, 0x8d, 0xed, 0x7e, 0x56, 0xe6, 0x53,
-       0xff, 0xa7, 0xef, 0xa5, 0xff, 0x2a, 0x48, 0xff, 0x63, 0xc5, 0x5d, 0xfd,
-       0x8e, 0xc8, 0xbd, 0xa2, 0xeb, 0x9b, 0x7f, 0xcb, 0x6e, 0x95, 0xfc, 0x7d,
-       0xab, 0x4b, 0xe4, 0x98, 0xbf, 0x56, 0xa5, 0xdb, 0xb7, 0xbb, 0xda, 0x1f,
-       0xe9, 0xf3, 0x69, 0xed, 0x3f, 0xcb, 0x07, 0x72, 0x6d, 0x3b, 0x3a, 0x7e,
-       0x7c, 0x5e, 0x24, 0x3b, 0x46, 0x3b, 0x9b, 0x46, 0x3e, 0x6b, 0xf7, 0x34,
-       0x07, 0xff, 0x4c, 0xfa, 0x73, 0x30, 0x1d, 0x1f, 0x3d, 0x07, 0x0b, 0xb0,
-       0x74, 0xb6, 0x42, 0xf6, 0x94, 0x5d, 0x56, 0x73, 0xa1, 0xc2, 0xf8, 0x62,
-       0x91, 0xf1, 0x97, 0x22, 0xc6, 0x2f, 0x49, 0x2e, 0x95, 0x98, 0x7e, 0x21,
-       0x40, 0xbd, 0xa3, 0xea, 0x61, 0x2d, 0xaf, 0xed, 0x3a, 0xc8, 0x1e, 0x7c,
-       0x5f, 0xbf, 0xa3, 0xed, 0xd0, 0xef, 0x65, 0xeb, 0x65, 0xf8, 0xbb, 0x8c,
-       0x4d, 0x3b, 0x1b, 0x87, 0xfc, 0x2c, 0xe3, 0x46, 0x03, 0xed, 0xba, 0x9a,
-       0xf4, 0xfa, 0xb0, 0x5e, 0x25, 0xbe, 0x29, 0x60, 0x7a, 0x51, 0xea, 0x73,
-       0x91, 0xfa, 0xa7, 0xac, 0xae, 0x10, 0x27, 0x20, 0xa6, 0xbd, 0x60, 0x17,
-       0xaf, 0x53, 0xbd, 0xe4, 0xe4, 0x5c, 0xe5, 0x67, 0x2a, 0xdb, 0x77, 0xbb,
-       0x5c, 0x8f, 0x85, 0x6c, 0x1d, 0x3f, 0x9c, 0x9a, 0xaf, 0x69, 0x7f, 0xad,
-       0x5e, 0xfd, 0xee, 0xcf, 0x53, 0x36, 0x1f, 0xb7, 0x5b, 0xda, 0x7f, 0x73,
-       0x6f, 0x30, 0x7b, 0xdc, 0x90, 0x40, 0xcd, 0xca, 0xfd, 0x8c, 0xd9, 0x2f,
-       0x83, 0xfa, 0xad, 0x6a, 0xf4, 0xcf, 0x11, 0xe9, 0xb7, 0x91, 0xce, 0x66,
-       0xeb, 0xb0, 0x7e, 0x46, 0xfe, 0x2f, 0x64, 0x9e, 0x54, 0xa1, 0xb7, 0x97,
-       0xb6, 0x91, 0x2e, 0x81, 0xf4, 0x61, 0x27, 0xce, 0x65, 0xf2, 0x70, 0x06,
-       0x06, 0xce, 0x95, 0x0f, 0x45, 0x4f, 0x43, 0xe6, 0x8b, 0x9b, 0xda, 0x5f,
-       0xc4, 0x5e, 0x06, 0xb2, 0xc3, 0x33, 0xe6, 0xc3, 0xdd, 0x3d, 0xdd, 0xef,
-       0xcb, 0xee, 0x20, 0x7f, 0x3d, 0xf8, 0xcd, 0xe7, 0xfa, 0x68, 0x52, 0xbf,
-       0x38, 0x63, 0x97, 0x77, 0x32, 0x79, 0x02, 0x38, 0xa1, 0xf7, 0x52, 0xda,
-       0xae, 0xf4, 0x5e, 0x45, 0x7d, 0x21, 0x34, 0x67, 0xd3, 0xfb, 0xf5, 0xfd,
-       0x44, 0xcf, 0xf5, 0x80, 0xfa, 0xa4, 0xbc, 0xaf, 0xef, 0xf4, 0x1c, 0xad,
-       0x45, 0xe9, 0xfe, 0x1d, 0x93, 0xb9, 0x69, 0x03, 0xcf, 0xcd, 0x92, 0xe9,
-       0xa7, 0xda, 0xb7, 0x83, 0xf3, 0xc5, 0xfe, 0xde, 0xd9, 0xbb, 0xb7, 0x39,
-       0x7b, 0x58, 0xde, 0x8b, 0x46, 0xde, 0x6f, 0xf5, 0xe2, 0x68, 0x3b, 0x83,
-       0xbe, 0x2b, 0x4e, 0x29, 0xbd, 0xc2, 0x2f, 0x73, 0xe1, 0x79, 0x9a, 0x77,
-       0x67, 0x84, 0x6f, 0x2e, 0x55, 0xaf, 0x83, 0xf8, 0x62, 0xa3, 0xae, 0x0b,
-       0xfb, 0xf8, 0xb2, 0x73, 0x4c, 0xfb, 0xb3, 0xb5, 0xc5, 0xf5, 0x71, 0x31,
-       0xd5, 0xaf, 0xe9, 0xf9, 0x3f, 0x22, 0xf5, 0xa0, 0xf8, 0xc8, 0x8f, 0x9d,
-       0xbd, 0xfe, 0xbe, 0x48, 0xd7, 0xd7, 0xa2, 0xd4, 0xb5, 0x3d, 0xb7, 0x49,
-       0x7d, 0xe4, 0x35, 0x7f, 0x35, 0xf2, 0x35, 0x1b, 0x61, 0x9d, 0xbc, 0x0e,
-       0x5d, 0xb1, 0xf3, 0x87, 0x8c, 0xbd, 0x81, 0xf4, 0xa1, 0x0b, 0x9f, 0x75,
-       0xb5, 0x5f, 0x7c, 0x5d, 0x8b, 0x18, 0x3f, 0x8d, 0xa4, 0x9f, 0x7a, 0xfe,
-       0xe1, 0xbb, 0x0b, 0xf2, 0x6e, 0x15, 0x3e, 0xe9, 0xed, 0x03, 0x9c, 0x6f,
-       0x1e, 0x34, 0x64, 0x7e, 0x2e, 0xc9, 0x1c, 0xfb, 0xa9, 0xc8, 0x73, 0xb2,
-       0xb9, 0x40, 0xf5, 0x0a, 0xe3, 0x32, 0xcf, 0x9a, 0x01, 0xd3, 0x13, 0x01,
-       0x7f, 0x07, 0x37, 0x3c, 0x9f, 0xf8, 0x26, 0x02, 0xc6, 0xf1, 0x12, 0xca,
-       0x85, 0xf0, 0xf3, 0x39, 0x62, 0x8f, 0xd6, 0x7d, 0xde, 0x73, 0xeb, 0x37,
-       0x64, 0x9e, 0x54, 0x74, 0xdc, 0xc4, 0xcf, 0xc7, 0xf1, 0x7c, 0x5c, 0xcd,
-       0x2d, 0xa6, 0xb9, 0x1e, 0xfc, 0x5e, 0xfd, 0x7f, 0x24, 0x59, 0xa9, 0x55,
-       0xd2, 0x71, 0xd6, 0xfd, 0xf6, 0xae, 0x11, 0x5f, 0x9d, 0x9f, 0x87, 0x12,
-       0x3d, 0xe7, 0xa7, 0xce, 0xa2, 0xbd, 0x15, 0x28, 0x7b, 0x5c, 0x3f, 0x8c,
-       0x4a, 0x8f, 0xed, 0xa1, 0xd8, 0xb1, 0x55, 0x99, 0x9b, 0xab, 0xcb, 0xa4,
-       0xe6, 0xdc, 0xaa, 0x3e, 0x9f, 0xa7, 0x86, 0x59, 0xdc, 0xba, 0x46, 0xe7,
-       0xe5, 0x6e, 0x8e, 0xcf, 0xbd, 0x05, 0x1d, 0xaf, 0x0a, 0xf9, 0xdf, 0xe6,
-       0x78, 0x3d, 0x77, 0x85, 0xf1, 0x22, 0x3c, 0x4d, 0x58, 0x6c, 0x4b, 0x9f,
-       0xaf, 0xfb, 0x05, 0x42, 0xa0, 0x78, 0xd9, 0x8f, 0xf1, 0x7e, 0x77, 0x64,
-       0x2f, 0x17, 0x52, 0xf9, 0x33, 0xf7, 0xe4, 0x41, 0x79, 0x3c, 0x62, 0xec,
-       0x0b, 0xbd, 0xd7, 0x2d, 0xe3, 0xfb, 0x36, 0x30, 0xea, 0xf1, 0xe5, 0x21,
-       0xf5, 0x08, 0x43, 0xea, 0xd9, 0x9c, 0x6f, 0x4b, 0xd2, 0xef, 0x79, 0x70,
-       0x72, 0xb4, 0x78, 0xfd, 0xfc, 0x0a, 0xe5, 0xd5, 0x5e, 0xe5, 0xef, 0x1a,
-       0xdf, 0x59, 0xb3, 0x28, 0x5e, 0xfe, 0x1a, 0xf3, 0xe5, 0xf9, 0x3c, 0xd4,
-       0xf8, 0xe6, 0x0a, 0xf7, 0x95, 0x0d, 0xff, 0x01, 0xd7, 0x0e, 0x41, 0x60,
-       0x88, 0x0d, 0x00, 0x00, 0x00 };
-
-static u8 bnx2_xi_rv2p_proc2[] = {
-       /* Date:        01/27/2009 19:01 */
-#define XI_RV2P_PROC2_MAX_BD_PAGE_LOC   5
-#define XI_RV2P_PROC2_BD_PAGE_SIZE_MSK 0xffff
-#define XI_RV2P_PROC2_BD_PAGE_SIZE     ((BCM_PAGE_SIZE / 16) - 1)
-       0xad, 0x57, 0x4d, 0x68, 0x5c, 0x55, 0x14, 0xbe, 0x33, 0x6f, 0x7e, 0xde,
-       0xcc, 0xbc, 0xc9, 0x4c, 0x93, 0x38, 0x99, 0x26, 0xc5, 0xa4, 0x09, 0x8d,
-       0x4e, 0x9d, 0x69, 0x27, 0x3f, 0x44, 0xb0, 0x42, 0x43, 0x90, 0xb4, 0xb5,
-       0x4a, 0xd3, 0x28, 0xc5, 0x5d, 0x92, 0xa9, 0x1d, 0x8c, 0x69, 0x23, 0x18,
-       0x70, 0xe1, 0xc6, 0x47, 0x5a, 0xd3, 0xcd, 0x2c, 0x4c, 0x31, 0x3f, 0x8a,
-       0xa0, 0xd8, 0x9d, 0xb8, 0x19, 0x50, 0xdb, 0x8a, 0x22, 0x14, 0x0c, 0x52,
-       0x17, 0x45, 0xb0, 0x58, 0x37, 0x8a, 0x58, 0x1b, 0x1a, 0x11, 0x8d, 0x8b,
-       0xae, 0x24, 0xe3, 0xbd, 0xe7, 0x3b, 0xf7, 0xcd, 0xbc, 0xc9, 0x8b, 0x89,
-       0x62, 0x36, 0x27, 0xe7, 0xbe, 0x73, 0xcf, 0x39, 0xf7, 0x9c, 0xef, 0x7c,
-       0xf7, 0x4e, 0x52, 0x08, 0x11, 0x10, 0x76, 0xb9, 0x5d, 0x4a, 0xe1, 0x33,
-       0x0c, 0x53, 0x8a, 0x8a, 0x10, 0xc1, 0xb4, 0xd2, 0x85, 0x5f, 0xf0, 0xdf,
-       0xfe, 0x24, 0x89, 0x6f, 0xcb, 0x96, 0x32, 0x13, 0x76, 0x46, 0xd9, 0x45,
-       0xc4, 0xb3, 0xfe, 0x88, 0x94, 0x87, 0xc5, 0x68, 0x06, 0xf6, 0x01, 0xa1,
-       0xa4, 0xb4, 0xb5, 0x95, 0xdc, 0xc5, 0xf2, 0x38, 0xcb, 0xc7, 0x7d, 0x90,
-       0x87, 0x58, 0x3e, 0x56, 0x27, 0x05, 0xdb, 0x3d, 0xcd, 0xfa, 0x00, 0x4b,
-       0x8b, 0xd7, 0x47, 0x59, 0xff, 0x90, 0xa5, 0xcd, 0xeb, 0x61, 0xd6, 0x1f,
-       0xf0, 0xa9, 0x25, 0xe4, 0xab, 0xf4, 0xb5, 0x4a, 0x55, 0xb7, 0xe0, 0x3e,
-       0x83, 0x73, 0x3c, 0xd3, 0xa1, 0xbe, 0xdf, 0xad, 0xb8, 0xed, 0xef, 0x38,
-       0xfa, 0xac, 0xa1, 0xf4, 0x1f, 0xa5, 0xee, 0x53, 0x6a, 0x73, 0x0a, 0xdb,
-       0x9b, 0xd3, 0x25, 0xb5, 0xdf, 0x10, 0xcb, 0xf3, 0x26, 0x55, 0x67, 0xd1,
-       0x82, 0x6e, 0x97, 0x4d, 0xaa, 0xcb, 0xa2, 0xc5, 0xfe, 0x58, 0xee, 0x8e,
-       0x23, 0xde, 0xa9, 0x0e, 0xd4, 0xed, 0xbb, 0x47, 0x60, 0x67, 0x27, 0x74,
-       0x61, 0xf1, 0xbd, 0x5d, 0xf0, 0xf7, 0x29, 0xa5, 0xaf, 0xfb, 0x9a, 0x7c,
-       0xa8, 0x47, 0x98, 0xad, 0xfc, 0x41, 0xb5, 0xbe, 0xb7, 0x7f, 0x71, 0x1e,
-       0xf6, 0x63, 0x1d, 0x58, 0x7f, 0x30, 0xab, 0xfc, 0x85, 0x84, 0xcd, 0x52,
-       0xe4, 0x28, 0x2f, 0x9f, 0x9d, 0x73, 0xfb, 0xff, 0x61, 0x1e, 0xda, 0x44,
-       0x1c, 0x7e, 0xa3, 0x2e, 0xbf, 0xa9, 0x4d, 0x7e, 0x6f, 0x47, 0x6a, 0xfd,
-       0x37, 0xf8, 0xe0, 0x3f, 0xba, 0xad, 0xff, 0x42, 0x1c, 0xb2, 0x29, 0xeb,
-       0x15, 0x27, 0xb2, 0x4d, 0xfe, 0x2f, 0x6e, 0xeb, 0xff, 0x55, 0x27, 0x7f,
-       0xbd, 0x5e, 0x5f, 0x3f, 0x52, 0x3f, 0xb0, 0x0f, 0xf2, 0xf6, 0xfd, 0xfa,
-       0xdc, 0x9c, 0x9f, 0x01, 0x39, 0x98, 0x25, 0x51, 0x3a, 0xcd, 0x00, 0x1f,
-       0xee, 0x56, 0x71, 0x1b, 0x45, 0xc0, 0xaf, 0xfc, 0x1d, 0x30, 0x43, 0xd7,
-       0xb0, 0xfe, 0x1c, 0xf7, 0xe9, 0x79, 0x3e, 0xc8, 0x2f, 0x51, 0x55, 0x98,
-       0x4a, 0xa5, 0x18, 0x63, 0xff, 0xdc, 0x67, 0x3b, 0x86, 0xfd, 0x2b, 0x96,
-       0xca, 0xef, 0x86, 0xc4, 0x8d, 0x57, 0xdf, 0x8d, 0x7f, 0xe8, 0x3b, 0xf6,
-       0xef, 0x7a, 0x08, 0x5f, 0xdf, 0x28, 0x42, 0x6f, 0xbb, 0x9c, 0xa4, 0xfa,
-       0x2c, 0x97, 0xbd, 0x70, 0x52, 0xef, 0x5f, 0xce, 0x71, 0x02, 0x71, 0x44,
-       0xa7, 0x49, 0xc9, 0xa1, 0xae, 0xd2, 0x26, 0xe7, 0x59, 0x27, 0xb1, 0xb8,
-       0x4f, 0xcf, 0x05, 0xf4, 0x62, 0x88, 0x44, 0x7a, 0x62, 0x4e, 0x9d, 0x33,
-       0x21, 0xc6, 0xfd, 0x2a, 0x61, 0x3f, 0xd7, 0xc5, 0x30, 0xad, 0x4f, 0x60,
-       0xff, 0x45, 0xbb, 0x45, 0x67, 0x28, 0xf6, 0x61, 0x5f, 0x73, 0x2f, 0xe4,
-       0x42, 0x6f, 0x50, 0x89, 0x6c, 0x71, 0x86, 0xd4, 0x03, 0x3f, 0xf7, 0x98,
-       0x64, 0x67, 0xe7, 0xf4, 0xdc, 0xe9, 0xbe, 0xa9, 0x3a, 0xbd, 0x52, 0x9d,
-       0xbf, 0x2e, 0xd4, 0xf5, 0xee, 0x3e, 0x65, 0x2f, 0x8b, 0xdb, 0x89, 0x38,
-       0xa3, 0x93, 0x5e, 0x73, 0xfb, 0x92, 0x53, 0xdf, 0x9d, 0xf6, 0x7f, 0x90,
-       0xea, 0x30, 0xc8, 0xf5, 0xe8, 0x60, 0x9c, 0xed, 0xf1, 0xc0, 0x59, 0x82,
-       0xfe, 0x5f, 0x1b, 0x4a, 0x52, 0x3d, 0x4f, 0x60, 0xfd, 0xd2, 0xf0, 0x15,
-       0xf4, 0xe3, 0x18, 0xd5, 0x41, 0x44, 0x2f, 0x7c, 0x8c, 0x5d, 0x13, 0x34,
-       0xdf, 0xe7, 0xfa, 0x8b, 0x9f, 0x42, 0x2f, 0x18, 0x4a, 0x9f, 0xb2, 0x4e,
-       0x5f, 0x85, 0x7d, 0xf0, 0x7c, 0x92, 0xea, 0x77, 0x82, 0xa3, 0x1c, 0x33,
-       0x88, 0x4f, 0x4a, 0xa1, 0xf3, 0xa4, 0x5a, 0x2b, 0xf4, 0x3d, 0x29, 0x2e,
-       0x96, 0xf1, 0x7d, 0x3a, 0xa6, 0xce, 0x37, 0xe2, 0xf0, 0xce, 0x64, 0x08,
-       0xfb, 0x4b, 0xf3, 0xe0, 0x8d, 0x7b, 0x1f, 0x29, 0x7d, 0x2c, 0x7b, 0x0f,
-       0xf6, 0xd9, 0xc9, 0x39, 0x76, 0xec, 0x47, 0xfd, 0xd6, 0xfc, 0xb0, 0x67,
-       0x58, 0x46, 0x03, 0xd4, 0x3f, 0x9f, 0xb0, 0x86, 0x21, 0x5f, 0xa7, 0xef,
-       0x7f, 0xf9, 0x4a, 0x54, 0xb7, 0x53, 0x0d, 0x81, 0x2b, 0xba, 0x3e, 0x2c,
-       0x13, 0xfa, 0x5c, 0x90, 0x3b, 0xc5, 0xfd, 0x9c, 0xb5, 0x15, 0xde, 0xb9,
-       0x8f, 0x99, 0xed, 0xf0, 0x0e, 0x39, 0xdc, 0x0d, 0x19, 0xea, 0x22, 0xbe,
-       0xf8, 0x17, 0xb8, 0xe7, 0xbc, 0x36, 0xcd, 0x15, 0x56, 0xab, 0xf8, 0x24,
-       0x21, 0x71, 0xe9, 0xc2, 0xa9, 0x9c, 0x03, 0xe2, 0x57, 0xd9, 0x07, 0x8d,
-       0x37, 0xe5, 0x30, 0x2c, 0xa6, 0xd8, 0xef, 0x24, 0xd7, 0xe3, 0x2c, 0xd7,
-       0xe3, 0x37, 0x96, 0xd3, 0x31, 0x5d, 0x07, 0xc8, 0x8b, 0x34, 0xff, 0x69,
-       0x8f, 0x7b, 0x43, 0xdf, 0x0f, 0xe8, 0xcf, 0x32, 0xf7, 0xf3, 0x2d, 0xe7,
-       0x9e, 0xd0, 0x75, 0xdd, 0xea, 0xbe, 0xd0, 0xf8, 0xc7, 0xfa, 0xe8, 0xa4,
-       0xe7, 0x39, 0x4b, 0x5f, 0x76, 0xc2, 0x4d, 0x63, 0x17, 0xa4, 0x53, 0xdf,
-       0x6e, 0x9a, 0xdf, 0x86, 0x96, 0xab, 0xfa, 0x7c, 0x2a, 0xcf, 0x5f, 0xf5,
-       0xfc, 0x35, 0x2c, 0xcd, 0x92, 0x8c, 0x36, 0x5e, 0x56, 0xf1, 0x5a, 0x3d,
-       0xf8, 0xc3, 0x3d, 0xc7, 0xf5, 0xf5, 0x9d, 0x8e, 0x13, 0xb1, 0xf6, 0xdf,
-       0x5c, 0x75, 0xcf, 0x2b, 0xe6, 0x33, 0xec, 0xe0, 0xbb, 0x79, 0x80, 0xfb,
-       0xc0, 0x32, 0xf5, 0xa8, 0xf2, 0x3b, 0xc2, 0x71, 0xf2, 0x1c, 0xc7, 0xaa,
-       0xe1, 0x0b, 0x95, 0xe7, 0xfa, 0x86, 0xe6, 0x09, 0x8d, 0x8f, 0x2a, 0x5f,
-       0xe8, 0x3e, 0x50, 0xfc, 0xec, 0xcd, 0x55, 0xb5, 0xbf, 0x6d, 0x1b, 0xfe,
-       0x58, 0x75, 0xfc, 0xdd, 0x72, 0x78, 0x22, 0x49, 0x71, 0x0f, 0xb3, 0xea,
-       0xe6, 0xc1, 0x3f, 0x24, 0x0f, 0xaa, 0xef, 0xa6, 0x69, 0x39, 0xf3, 0xc2,
-       0xfc, 0x37, 0xa3, 0xe2, 0xa5, 0x39, 0xff, 0xb4, 0xbe, 0xbf, 0x64, 0xfe,
-       0xcc, 0x93, 0x63, 0xb5, 0x7c, 0x77, 0xdb, 0x23, 0xee, 0x7f, 0xf5, 0xc7,
-       0xf3, 0x95, 0x65, 0xbe, 0xcf, 0x51, 0x9e, 0x95, 0xf1, 0x3c, 0xe3, 0x25,
-       0x57, 0xdf, 0x07, 0xf4, 0x15, 0xf6, 0xb2, 0xbf, 0x9a, 0xf7, 0xfa, 0xb4,
-       0x7f, 0xa8, 0x76, 0x4f, 0xad, 0x7d, 0x7d, 0xff, 0x03, 0x5b, 0xf0, 0xf8,
-       0xe7, 0x1b, 0x78, 0x7f, 0x7d, 0xb6, 0x51, 0x7d, 0x4f, 0x79, 0xe2, 0xc4,
-       0x16, 0x74, 0x3f, 0x85, 0x25, 0x9e, 0xe9, 0xbd, 0x26, 0xb4, 0xbd, 0x3f,
-       0x88, 0xf7, 0xa4, 0x60, 0xfc, 0x9e, 0x7b, 0x98, 0xfd, 0x64, 0xc0, 0xc7,
-       0x2f, 0x9c, 0xa1, 0xfe, 0xbe, 0x79, 0xf6, 0x3e, 0xf1, 0xf2, 0x7b, 0x2f,
-       0x5f, 0x53, 0x7e, 0x77, 0x8b, 0xd5, 0x19, 0x8b, 0xf2, 0x1a, 0xda, 0x0b,
-       0xf3, 0xfb, 0x87, 0xea, 0xfb, 0xad, 0xfc, 0x9a, 0x8c, 0x07, 0x69, 0x37,
-       0xe1, 0x7e, 0x97, 0x6c, 0xce, 0x13, 0x73, 0x7f, 0x24, 0x81, 0x7d, 0x9a,
-       0xbf, 0xdc, 0xf8, 0x79, 0x77, 0xa3, 0x7a, 0xff, 0xc0, 0xcd, 0xad, 0x83,
-       0xde, 0x73, 0x71, 0xb2, 0xaf, 0x36, 0x4e, 0x46, 0xac, 0x94, 0xe1, 0x7f,
-       0x84, 0x79, 0x65, 0x9c, 0x13, 0xf9, 0x29, 0x9a, 0xa0, 0x78, 0x85, 0xe3,
-       0x84, 0x6b, 0x91, 0x8a, 0xe1, 0xdc, 0x85, 0xa7, 0xf0, 0xbd, 0x10, 0xc7,
-       0x7a, 0x6b, 0x1c, 0xef, 0xcd, 0x91, 0xb0, 0x45, 0xf6, 0xad, 0x71, 0xc8,
-       0x14, 0xf3, 0xcf, 0x8a, 0xc3, 0xcb, 0x90, 0xcb, 0xa1, 0xad, 0x78, 0x19,
-       0xf7, 0xdb, 0xf5, 0x90, 0x5a, 0x97, 0x8f, 0xa0, 0x0c, 0x78, 0x69, 0xa8,
-       0xdb, 0xa2, 0xef, 0xa3, 0x19, 0xe0, 0x48, 0x74, 0x7a, 0x9f, 0xab, 0x0d,
-       0xfc, 0xd2, 0x5a, 0xe5, 0xef, 0x5a, 0x9e, 0xb7, 0x7a, 0x97, 0x1c, 0x1e,
-       0x75, 0xe7, 0x01, 0xfe, 0x52, 0xfe, 0x49, 0x95, 0x7c, 0xb5, 0x13, 0x7e,
-       0x37, 0x18, 0x2f, 0xbf, 0xf3, 0xbd, 0xdf, 0x24, 0xbe, 0x2a, 0xa3, 0x0e,
-       0x2b, 0xe5, 0xfa, 0xfe, 0xe8, 0x3c, 0x74, 0x1c, 0x9c, 0x4b, 0x9f, 0xb3,
-       0x1a, 0x17, 0x79, 0x9d, 0xe1, 0xfc, 0xef, 0xd0, 0xfb, 0x2f, 0xc5, 0xe7,
-       0x55, 0x7e, 0xb1, 0x7e, 0x94, 0xee, 0xa1, 0xa0, 0x7c, 0xdf, 0x6b, 0xdd,
-       0x7d, 0x3f, 0x8c, 0x50, 0x5e, 0x8d, 0x72, 0x41, 0xef, 0x77, 0x9f, 0xbb,
-       0x39, 0x0f, 0xb9, 0x90, 0xd7, 0x7d, 0xd3, 0xfd, 0xd5, 0xfd, 0x44, 0xdf,
-       0x53, 0x3d, 0x64, 0xd6, 0x5f, 0xe8, 0x21, 0x9c, 0xe7, 0x0b, 0xeb, 0xee,
-       0x77, 0xf2, 0xc9, 0xac, 0xb2, 0x7f, 0x4d, 0x7c, 0x43, 0xf3, 0x28, 0xc4,
-       0xf7, 0x2c, 0xab, 0x7c, 0x29, 0xf8, 0xaf, 0x96, 0x77, 0x0d, 0x71, 0x3d,
-       0xc8, 0xcb, 0x7d, 0x7a, 0xee, 0xdc, 0xf3, 0x5b, 0xad, 0xbb, 0x3a, 0xc7,
-       0x13, 0x1e, 0xfc, 0xa4, 0xcf, 0xa9, 0xec, 0xf3, 0x8c, 0x5f, 0x53, 0x0c,
-       0x1d, 0xc1, 0xfb, 0xb0, 0x21, 0x8c, 0x39, 0x69, 0x08, 0x7b, 0xdd, 0xef,
-       0x12, 0x3f, 0x11, 0xfa, 0x05, 0xb3, 0xa7, 0x31, 0x42, 0xe7, 0xba, 0x74,
-       0xe3, 0x6b, 0x32, 0x7b, 0x7f, 0x29, 0x86, 0xf5, 0x96, 0x21, 0x84, 0x09,
-       0x10, 0xde, 0x0d, 0x71, 0x01, 0xf3, 0xf0, 0xce, 0x02, 0xe4, 0xdb, 0xe2,
-       0x49, 0xf8, 0x69, 0x9c, 0xa5, 0xfb, 0xd4, 0x6c, 0x41, 0x79, 0x4b, 0x4b,
-       0x8c, 0xf3, 0xb4, 0x9f, 0x7e, 0xaf, 0x56, 0x44, 0x9c, 0x7f, 0x47, 0xf0,
-       0xbc, 0x02, 0xcf, 0x81, 0x9a, 0xbe, 0xef, 0x14, 0xdf, 0x4a, 0x8f, 0x4b,
-       0xfc, 0xc2, 0x0d, 0xe3, 0xdc, 0xac, 0xc7, 0xb9, 0xee, 0x6f, 0xda, 0xef,
-       0x89, 0xeb, 0x81, 0xcd, 0xb8, 0xd6, 0xf9, 0xa9, 0x3a, 0xff, 0xe9, 0xbc,
-       0x7b, 0x37, 0xfb, 0x57, 0xfb, 0x62, 0x12, 0xdf, 0xff, 0x17, 0xae, 0x21,
-       0x8f, 0x76, 0xa9, 0xf8, 0x2d, 0x35, 0xf8, 0xf4, 0x9e, 0x3b, 0xf0, 0x9b,
-       0x21, 0x79, 0xfc, 0x6f, 0x6a, 0x8c, 0x09, 0xd0, 0x18, 0x10, 0x00, 0x00,
-       0x00 };
-
-static u8 bnx2_TPAT_b09FwText[] = {
-       0xbd, 0x58, 0x5d, 0x6c, 0x1c, 0x57, 0x15, 0x3e, 0x73, 0xe7, 0xee, 0xee,
-       0x78, 0xb1, 0xe3, 0x71, 0x3b, 0xa4, 0xdb, 0x62, 0xc8, 0x8c, 0x7d, 0xfd,
-       0x03, 0xb6, 0xc2, 0x94, 0x6e, 0xdb, 0xad, 0x18, 0x45, 0xc3, 0xec, 0xda,
-       0xb1, 0xa2, 0x3c, 0xb8, 0x52, 0xa4, 0x46, 0x6a, 0x04, 0x66, 0x1d, 0x93,
-       0x3e, 0xa6, 0x88, 0x07, 0xa4, 0x3e, 0x64, 0x59, 0x3b, 0xa9, 0x1f, 0x96,
-       0x2c, 0xb8, 0xc8, 0x7e, 0x41, 0x28, 0x72, 0x6a, 0xbb, 0x48, 0x8b, 0x37,
-       0x11, 0x48, 0x3c, 0x45, 0x8d, 0x1c, 0x14, 0x55, 0xea, 0x0b, 0x0f, 0xfc,
-       0x3d, 0x46, 0x6a, 0x45, 0xfb, 0x50, 0x90, 0x55, 0xa9, 0xa8, 0x82, 0xe0,
-       0xcb, 0x77, 0x66, 0x67, 0x9c, 0x4d, 0xec, 0x08, 0x9e, 0xb0, 0xb4, 0xba,
-       0x33, 0x73, 0xef, 0x39, 0xf7, 0xdc, 0x73, 0xbe, 0xef, 0x9c, 0x73, 0x3d,
-       0x64, 0x50, 0x9e, 0x92, 0xbf, 0x3e, 0xfc, 0x8a, 0xdf, 0xbd, 0xf8, 0x83,
-       0x67, 0x8f, 0xbf, 0x70, 0x1c, 0x8f, 0xcf, 0x1b, 0xfd, 0x59, 0x49, 0xff,
-       0xc7, 0x3f, 0x93, 0xc8, 0x4e, 0xed, 0xe0, 0x1f, 0x59, 0x22, 0xb8, 0xfd,
-       0x54, 0xa4, 0xc8, 0x32, 0x83, 0xdf, 0x7c, 0x6d, 0x5e, 0x11, 0x85, 0xad,
-       0x09, 0xb7, 0x4c, 0xff, 0xd6, 0x35, 0x47, 0x12, 0x7f, 0xff, 0x72, 0x70,
-       0xff, 0xeb, 0xb7, 0x5e, 0xf4, 0x76, 0xaf, 0x99, 0x64, 0xd9, 0xc1, 0xb2,
-       0xb4, 0x47, 0xc9, 0x1a, 0x84, 0xcc, 0xcf, 0xc7, 0xbe, 0x2d, 0xe8, 0x48,
-       0xaa, 0xab, 0xa6, 0x85, 0xba, 0xa7, 0x6f, 0x8d, 0x29, 0xbb, 0x8e, 0x0d,
-       0x6e, 0xb4, 0x5d, 0x8a, 0xda, 0x05, 0x7a, 0xb7, 0xed, 0xd0, 0xcd, 0xb6,
-       0xa4, 0x85, 0xb7, 0x2e, 0xd1, 0x92, 0xef, 0x15, 0x2a, 0xa6, 0x45, 0x22,
-       0xf0, 0x0a, 0x55, 0x72, 0x69, 0xc3, 0xf7, 0x6a, 0x73, 0xe6, 0x80, 0x61,
-       0x05, 0x16, 0xbd, 0x31, 0x26, 0xe8, 0x9a, 0x73, 0x8e, 0xbe, 0xa7, 0xce,
-       0xe2, 0x27, 0x49, 0xac, 0x48, 0xa3, 0xbc, 0x26, 0x49, 0xae, 0xf4, 0xd3,
-       0x49, 0x5f, 0xeb, 0x79, 0x3f, 0x84, 0xfc, 0xf0, 0xf8, 0x05, 0xea, 0xa1,
-       0x9a, 0xed, 0xcd, 0x10, 0x65, 0x78, 0x0d, 0x45, 0x7e, 0x86, 0x42, 0xbb,
-       0x73, 0xae, 0x6b, 0xf1, 0x78, 0x5f, 0x6f, 0x40, 0xbe, 0x47, 0xa5, 0xf3,
-       0x4f, 0x24, 0xf3, 0x76, 0x32, 0x2f, 0x48, 0xac, 0x7a, 0xee, 0x16, 0x8d,
-       0x84, 0xd2, 0xd8, 0xd3, 0x91, 0x3a, 0x6a, 0x47, 0x5b, 0x92, 0xcc, 0x15,
-       0xb6, 0x5f, 0xd9, 0x65, 0xd2, 0x90, 0x31, 0x59, 0x46, 0x8a, 0xe0, 0xfb,
-       0x88, 0xdb, 0x48, 0x28, 0x0c, 0xa2, 0x9d, 0x46, 0xc1, 0x8e, 0xda, 0x3f,
-       0x34, 0xa2, 0xe6, 0x9e, 0x0e, 0x65, 0x9e, 0x84, 0x0a, 0x8d, 0x68, 0x8b,
-       0x75, 0xf5, 0x90, 0x54, 0x39, 0xc8, 0x0c, 0xdb, 0x82, 0x78, 0x8c, 0x92,
-       0xef, 0xac, 0xbb, 0x82, 0xe7, 0x69, 0x23, 0xdc, 0x92, 0x46, 0xb4, 0x36,
-       0x83, 0x67, 0x0b, 0xf2, 0xf0, 0x8b, 0x6f, 0x50, 0x38, 0x6b, 0x40, 0x8e,
-       0xcf, 0x69, 0xe3, 0x5d, 0x50, 0xe8, 0xd8, 0xb4, 0x58, 0xf4, 0x0a, 0x35,
-       0x3a, 0x65, 0x94, 0xb7, 0x0e, 0x04, 0xcd, 0x9e, 0x69, 0x1f, 0xfc, 0xc6,
-       0xb6, 0x7c, 0x4b, 0x6a, 0x2d, 0x9e, 0xcd, 0x25, 0x67, 0x64, 0x7d, 0x61,
-       0xc7, 0x7e, 0x87, 0xdf, 0x61, 0x73, 0x13, 0xb6, 0xb7, 0xb2, 0xb0, 0x47,
-       0x6b, 0xde, 0x27, 0x52, 0x65, 0xd8, 0x19, 0xe2, 0xe7, 0x2d, 0x57, 0x01,
-       0x85, 0xa1, 0xd5, 0x3e, 0x72, 0x07, 0xb4, 0xae, 0xf8, 0x9e, 0xbd, 0x45,
-       0x01, 0x2d, 0x36, 0x07, 0xed, 0xa9, 0x66, 0x1d, 0xf3, 0x35, 0x5e, 0x03,
-       0x7f, 0x10, 0x4d, 0xb5, 0xb4, 0xde, 0xf4, 0x7f, 0x9b, 0xa1, 0x23, 0x62,
-       0x32, 0x43, 0x9e, 0x1b, 0xe2, 0xdb, 0xd0, 0xe6, 0xa3, 0x3e, 0x3b, 0x96,
-       0xd8, 0xc0, 0x7e, 0xc7, 0x3e, 0xfe, 0x97, 0x92, 0xf7, 0x5e, 0x3b, 0x5a,
-       0x4b, 0xfd, 0x1c, 0xdb, 0x0d, 0xbf, 0xfa, 0x14, 0x15, 0x61, 0xff, 0x63,
-       0xcf, 0x94, 0xca, 0xb1, 0x2d, 0x6c, 0x37, 0xd6, 0xab, 0x07, 0x36, 0xbd,
-       0x7a, 0xc0, 0x26, 0xb6, 0x47, 0x90, 0x5c, 0xb5, 0x68, 0x49, 0x7d, 0x64,
-       0xd0, 0x11, 0xad, 0x97, 0x7c, 0x69, 0x54, 0xd6, 0x3e, 0x4b, 0x9e, 0x81,
-       0xc3, 0x26, 0x70, 0xd8, 0x04, 0x2e, 0x9b, 0x64, 0x8b, 0xc0, 0xa5, 0x5b,
-       0x63, 0x16, 0xdd, 0x33, 0x11, 0xcf, 0x36, 0xcf, 0xe7, 0xa8, 0xee, 0x2b,
-       0xba, 0xdc, 0x64, 0xcf, 0xe4, 0x68, 0x51, 0x7d, 0xae, 0xcf, 0xc3, 0x1f,
-       0x6f, 0x93, 0x3e, 0x16, 0x01, 0xb3, 0x11, 0xdc, 0xf9, 0x86, 0x1a, 0xa7,
-       0xcb, 0x6d, 0x45, 0xf5, 0x36, 0xcb, 0x2d, 0x51, 0x47, 0xae, 0x1f, 0x72,
-       0x93, 0x90, 0x2b, 0xd2, 0x95, 0x58, 0xb6, 0x1f, 0xb2, 0xbb, 0x89, 0xec,
-       0x44, 0x61, 0x9a, 0x7c, 0xc8, 0x0c, 0xbb, 0xd3, 0xc0, 0xdc, 0x9c, 0x33,
-       0x09, 0xd9, 0x49, 0x5a, 0xc2, 0xaf, 0xde, 0xa4, 0x9a, 0x2c, 0xb2, 0x5e,
-       0xaf, 0x70, 0x9e, 0x7d, 0x1e, 0xeb, 0xac, 0x41, 0xa7, 0x83, 0x39, 0x0b,
-       0x7a, 0x24, 0xc6, 0x0f, 0x75, 0xbd, 0x09, 0x6c, 0x3b, 0xfc, 0xfc, 0xae,
-       0x16, 0x01, 0xfc, 0x50, 0x54, 0x6e, 0x9d, 0xf8, 0x3d, 0x4b, 0x65, 0xc4,
-       0x52, 0xa8, 0x7e, 0xaa, 0xda, 0x86, 0x21, 0x02, 0x93, 0xaa, 0xf0, 0x42,
-       0x38, 0x2b, 0xe3, 0x6f, 0x73, 0xb6, 0x01, 0x8e, 0x1d, 0x17, 0x9d, 0x9c,
-       0x93, 0xc1, 0x1a, 0xc4, 0x5f, 0xf5, 0x52, 0xd5, 0x19, 0xc0, 0x5a, 0x10,
-       0x2d, 0x3f, 0x02, 0x8e, 0x0e, 0x60, 0x0d, 0x8f, 0x1c, 0x07, 0xac, 0x57,
-       0xbc, 0xbe, 0x17, 0x36, 0xa6, 0xdf, 0x7a, 0xa9, 0xf6, 0x50, 0x7c, 0xd8,
-       0xc6, 0x38, 0x2e, 0xd8, 0x5f, 0x26, 0xb1, 0xed, 0x8e, 0x57, 0x3a, 0x6f,
-       0x63, 0x7e, 0xe7, 0xab, 0x82, 0x76, 0xf5, 0x75, 0x15, 0x15, 0xf0, 0xe9,
-       0xf3, 0x8a, 0x0a, 0x07, 0xcc, 0x18, 0x4b, 0x29, 0xa6, 0x78, 0xe4, 0x7c,
-       0x43, 0x85, 0x79, 0x65, 0x98, 0x4b, 0x93, 0x4f, 0x52, 0xcd, 0xf1, 0xfc,
-       0x32, 0x15, 0x68, 0xa9, 0x39, 0x01, 0xdf, 0xf5, 0xe3, 0xdc, 0x9e, 0x4f,
-       0x34, 0x8c, 0xe7, 0xf0, 0x69, 0xc8, 0x20, 0x5f, 0xd4, 0xa0, 0x8b, 0xc7,
-       0x41, 0xe8, 0xf7, 0x60, 0x23, 0xfc, 0xa1, 0x26, 0xec, 0x29, 0xf8, 0x23,
-       0x74, 0x78, 0x8e, 0xf3, 0x98, 0xf3, 0x4c, 0xa4, 0x3c, 0xbf, 0x1a, 0xdb,
-       0xe2, 0xd9, 0xb7, 0x89, 0xf3, 0x51, 0x9a, 0x83, 0x38, 0x27, 0x59, 0x73,
-       0x32, 0xa0, 0xd9, 0x7a, 0xe3, 0x92, 0x36, 0x15, 0xcd, 0x65, 0x03, 0xc6,
-       0x6e, 0x6f, 0x09, 0x58, 0x9c, 0xad, 0xb7, 0x06, 0x4f, 0xef, 0x34, 0xa8,
-       0xf6, 0x4c, 0x20, 0x8e, 0x0a, 0xec, 0x1f, 0xf9, 0xcc, 0x29, 0xec, 0xd5,
-       0x1e, 0x3c, 0x7d, 0xa7, 0x71, 0x0c, 0xbe, 0xa2, 0xfb, 0xf0, 0x3f, 0xf6,
-       0xdf, 0x79, 0xda, 0x84, 0x9d, 0x1c, 0x33, 0x70, 0x2b, 0x7c, 0x75, 0xcc,
-       0x00, 0x96, 0xf1, 0x0c, 0x6c, 0xd4, 0xda, 0x83, 0x73, 0x22, 0xa8, 0x51,
-       0xd8, 0x5e, 0xc2, 0xcf, 0xa2, 0xa9, 0x86, 0x65, 0xdd, 0x81, 0x4e, 0x51,
-       0xf4, 0xdc, 0xc8, 0xdc, 0x65, 0xae, 0xf0, 0x39, 0x58, 0x97, 0x65, 0x04,
-       0xae, 0x1c, 0x6a, 0xf5, 0xbc, 0x22, 0x82, 0x00, 0x98, 0x90, 0x88, 0x4d,
-       0x11, 0x58, 0xe1, 0x38, 0x5c, 0x45, 0x1c, 0x80, 0x03, 0xd8, 0x0c, 0xff,
-       0xd7, 0x44, 0x70, 0x91, 0x2a, 0x45, 0xa2, 0xc5, 0x06, 0x61, 0x3f, 0xec,
-       0x55, 0xc2, 0x0f, 0x78, 0x0e, 0xed, 0x12, 0x6c, 0xf0, 0xc2, 0x1a, 0x79,
-       0xfe, 0x1c, 0xbc, 0x9e, 0xfb, 0x31, 0x59, 0x99, 0xe0, 0x9c, 0xdc, 0x68,
-       0x90, 0x25, 0x83, 0xb3, 0x72, 0xa9, 0x31, 0xec, 0xff, 0x15, 0xbe, 0x26,
-       0xf2, 0xc6, 0x37, 0x69, 0xc2, 0xdf, 0x04, 0x6f, 0xeb, 0xf8, 0x5d, 0x21,
-       0xde, 0xfb, 0x9c, 0x1c, 0x69, 0xf1, 0x78, 0x56, 0xaa, 0x56, 0xb7, 0xde,
-       0xbf, 0x69, 0xf6, 0xfb, 0x3d, 0x2a, 0xd1, 0x9b, 0xc9, 0xde, 0xf0, 0x0d,
-       0x9d, 0x6c, 0x94, 0x80, 0xef, 0x03, 0xfa, 0x4b, 0xa9, 0xfe, 0xad, 0x58,
-       0x37, 0x63, 0x77, 0xc2, 0xdf, 0x3a, 0x74, 0x8f, 0xa3, 0x69, 0x7e, 0x42,
-       0x1e, 0xec, 0xe4, 0xeb, 0xc5, 0x66, 0x0e, 0x9c, 0xd0, 0xba, 0xaa, 0x7e,
-       0x8f, 0xf3, 0xe6, 0x81, 0x5f, 0x1b, 0x3f, 0xc4, 0x72, 0x96, 0xe7, 0x0c,
-       0xaa, 0xa2, 0x0e, 0xd5, 0xdb, 0xfc, 0xcc, 0x73, 0x9c, 0xcf, 0x72, 0x18,
-       0xff, 0x8c, 0xb5, 0x1f, 0xea, 0x5a, 0x9b, 0xb9, 0xc6, 0xbe, 0x02, 0x47,
-       0xda, 0x96, 0x51, 0x6e, 0x92, 0x51, 0x69, 0x92, 0x5b, 0xf5, 0x65, 0x1c,
-       0x97, 0xd0, 0xb6, 0xe1, 0x53, 0xc6, 0xc3, 0xa4, 0x8c, 0x1a, 0x46, 0x5c,
-       0xc3, 0x0c, 0x3c, 0x0f, 0xb5, 0x7e, 0x9d, 0x01, 0x27, 0x42, 0xf8, 0x5f,
-       0x2c, 0x20, 0x47, 0x5e, 0x73, 0xa8, 0x5f, 0xa8, 0x39, 0x51, 0x77, 0xa8,
-       0x4f, 0x28, 0xb6, 0xed, 0x3d, 0x01, 0xdb, 0x78, 0x3e, 0xac, 0xfa, 0xbf,
-       0xc2, 0x9e, 0x41, 0xcc, 0xc7, 0x4a, 0x23, 0xcd, 0xfb, 0xd0, 0xa9, 0x38,
-       0x67, 0x58, 0x49, 0xfe, 0x8f, 0x92, 0xdc, 0x2e, 0x81, 0x5b, 0xad, 0x5f,
-       0x46, 0x5e, 0xaf, 0xc7, 0xb8, 0xf1, 0x6a, 0xae, 0xd8, 0xd3, 0xc3, 0xa3,
-       0xcc, 0x51, 0xad, 0x2f, 0xfa, 0xd3, 0x58, 0x2b, 0x4d, 0xca, 0xcf, 0x20,
-       0xb7, 0x73, 0x3d, 0x60, 0xdb, 0x02, 0xd8, 0xd6, 0xd7, 0xc9, 0xfb, 0xa8,
-       0x09, 0xf5, 0xb8, 0x06, 0xf4, 0x90, 0xa9, 0x0c, 0xfc, 0x3c, 0x77, 0x8e,
-       0xf8, 0x3b, 0xf5, 0x08, 0xbc, 0x57, 0xc1, 0xeb, 0xa5, 0xe2, 0x29, 0xa3,
-       0xb2, 0x75, 0xcc, 0x4c, 0xfa, 0x08, 0xd8, 0x0d, 0x5e, 0x3b, 0x2c, 0x97,
-       0x85, 0x5c, 0x1f, 0x64, 0xbe, 0x82, 0xb9, 0x0c, 0xc6, 0x6e, 0x3d, 0x71,
-       0x2d, 0xc1, 0x5e, 0x2e, 0xf6, 0x9a, 0x21, 0x19, 0xe4, 0x51, 0xaf, 0x47,
-       0xdc, 0x0a, 0x3d, 0x97, 0xd4, 0x6d, 0xe6, 0xf2, 0x89, 0x2e, 0x2e, 0xbb,
-       0x64, 0xc6, 0x9c, 0x78, 0x29, 0xc9, 0x41, 0x9c, 0xc7, 0x5f, 0x48, 0xe6,
-       0x1d, 0xe4, 0xe3, 0xe7, 0x92, 0xba, 0x62, 0xe1, 0x39, 0xa0, 0xe5, 0x38,
-       0x37, 0x67, 0x39, 0x37, 0x17, 0x90, 0x9b, 0x4b, 0xe0, 0xa7, 0xff, 0x31,
-       0x19, 0xc8, 0x4d, 0x44, 0xbf, 0x6b, 0x48, 0xe4, 0x21, 0x13, 0xf2, 0xdc,
-       0x1b, 0xcc, 0xc1, 0x36, 0xcf, 0xfe, 0x18, 0x67, 0x0a, 0xcf, 0x70, 0xde,
-       0xd4, 0x3a, 0x13, 0x28, 0xf7, 0x32, 0x8d, 0x16, 0x2e, 0x23, 0x4f, 0x9a,
-       0x34, 0x81, 0xdd, 0x78, 0xdf, 0xb4, 0x96, 0xa7, 0x3d, 0x05, 0xff, 0xbd,
-       0x6f, 0x90, 0xe2, 0xfa, 0xfb, 0x1d, 0xe8, 0x18, 0x71, 0xa7, 0xc0, 0xfb,
-       0xc5, 0xd2, 0x7f, 0x93, 0xf9, 0x43, 0x22, 0x83, 0xba, 0x56, 0xe4, 0x7d,
-       0x89, 0x2a, 0x2d, 0xf6, 0x83, 0xdf, 0x85, 0x07, 0x1f, 0x78, 0x20, 0xaa,
-       0x36, 0xc1, 0x3f, 0xc4, 0x38, 0xc6, 0x1a, 0xd6, 0x8b, 0x22, 0x72, 0xaa,
-       0xc3, 0xb8, 0x66, 0xbc, 0x9f, 0x49, 0xf0, 0x3e, 0x0b, 0xbc, 0x7b, 0xe3,
-       0x37, 0xc0, 0xa3, 0x1b, 0x0f, 0xf1, 0xe8, 0x4c, 0x82, 0xf1, 0x59, 0x60,
-       0xfc, 0x97, 0xc0, 0x96, 0x85, 0x9a, 0x0e, 0xdc, 0x36, 0xc8, 0x88, 0x50,
-       0x1b, 0x80, 0x83, 0x44, 0xcf, 0xe9, 0x44, 0xcf, 0xcc, 0x63, 0xf4, 0x9c,
-       0x4e, 0xf4, 0xcc, 0x74, 0xeb, 0x81, 0x5c, 0x25, 0x91, 0x0b, 0x1f, 0x23,
-       0x57, 0x49, 0xe4, 0xc2, 0x2e, 0x39, 0x0b, 0x67, 0xe2, 0x73, 0x71, 0x1e,
-       0xdb, 0x45, 0x2c, 0x7c, 0x8a, 0xb1, 0x62, 0x87, 0x18, 0xef, 0x61, 0x04,
-       0x66, 0x9a, 0x37, 0xb1, 0x96, 0xfd, 0x90, 0x61, 0x0e, 0x3c, 0xe2, 0xbb,
-       0x3d, 0xf8, 0x6e, 0x1f, 0xef, 0xf8, 0xfb, 0x66, 0x82, 0x15, 0xae, 0x45,
-       0x5e, 0x2d, 0x7c, 0x68, 0x6d, 0x46, 0xb0, 0x9f, 0xc5, 0xd5, 0xc3, 0x62,
-       0x60, 0x61, 0x0e, 0x35, 0xa7, 0x69, 0x52, 0x59, 0x32, 0x57, 0x5f, 0x91,
-       0x31, 0x76, 0xb7, 0xb1, 0x7e, 0xbb, 0xc3, 0xab, 0x99, 0x46, 0x8e, 0x68,
-       0xbd, 0x97, 0x16, 0x50, 0x4f, 0xce, 0x03, 0x4b, 0xd7, 0x7d, 0xb0, 0x90,
-       0x86, 0x81, 0x0b, 0x0d, 0x5c, 0x7b, 0x71, 0x6c, 0x23, 0xb5, 0x08, 0x66,
-       0xfc, 0x88, 0x76, 0x26, 0xf3, 0x94, 0xd9, 0xec, 0xd4, 0x43, 0xb9, 0xde,
-       0xbd, 0x8f, 0x8b, 0x7d, 0x02, 0xd4, 0xe0, 0x3f, 0xa2, 0x17, 0x70, 0x48,
-       0x8e, 0x22, 0x97, 0x36, 0x39, 0x27, 0x80, 0xa3, 0x9b, 0x5c, 0xeb, 0x39,
-       0xe7, 0x5a, 0xc0, 0x62, 0x9a, 0x7f, 0x72, 0xe8, 0x5b, 0x3e, 0x41, 0xed,
-       0x10, 0x34, 0x5f, 0xd4, 0x7a, 0xca, 0xff, 0x04, 0xb8, 0xc2, 0xb7, 0x75,
-       0x9e, 0xdb, 0xc5, 0x77, 0xfe, 0x66, 0x51, 0x76, 0xf5, 0x49, 0xec, 0x89,
-       0xfd, 0xce, 0xf0, 0xfa, 0x1c, 0x7a, 0x1a, 0xce, 0xf3, 0x18, 0xd7, 0xf9,
-       0xdd, 0x48, 0x7c, 0x6a, 0x62, 0xfc, 0x02, 0x46, 0x3e, 0x4f, 0x0f, 0xce,
-       0xa7, 0xf5, 0x5d, 0x9f, 0x9f, 0xb5, 0x96, 0x41, 0x2f, 0x95, 0x1b, 0x0a,
-       0xf5, 0x7d, 0xa4, 0xb0, 0x00, 0x9e, 0x95, 0x5b, 0xe9, 0x3c, 0xcf, 0xd9,
-       0x5d, 0x73, 0x78, 0x6e, 0xf1, 0x77, 0x41, 0x3b, 0x6a, 0x11, 0x75, 0x11,
-       0xfd, 0xd3, 0x3a, 0xf7, 0x61, 0xdc, 0x53, 0xc5, 0xf5, 0x72, 0x9c, 0x7b,
-       0xb0, 0x77, 0x90, 0xff, 0xd7, 0xc1, 0x29, 0xf0, 0xfb, 0x29, 0x41, 0x4f,
-       0x50, 0xd9, 0x49, 0xcf, 0xa3, 0x35, 0x38, 0x5b, 0x30, 0x0d, 0xe6, 0xe2,
-       0xb0, 0x3d, 0x4d, 0xdc, 0x6b, 0x8d, 0x84, 0x55, 0x96, 0x69, 0x21, 0x1f,
-       0xac, 0x68, 0xaa, 0x76, 0xf4, 0xd8, 0xb3, 0xc8, 0xd1, 0xd1, 0x4f, 0xb8,
-       0xb6, 0xb1, 0x6f, 0x4f, 0xc0, 0x1e, 0xf4, 0x05, 0xeb, 0x92, 0xde, 0x6e,
-       0xb0, 0x9e, 0x3c, 0x99, 0xe8, 0x11, 0x97, 0xfd, 0x54, 0xcf, 0x9f, 0xa0,
-       0x87, 0x1c, 0x41, 0xdc, 0xff, 0x4a, 0xe8, 0x62, 0x1f, 0x64, 0xd0, 0x8f,
-       0x8f, 0xd3, 0xbc, 0x5a, 0x8c, 0x6b, 0xf1, 0x79, 0xd4, 0xde, 0xa8, 0x98,
-       0x85, 0xef, 0x72, 0xb1, 0x9e, 0x7a, 0xf3, 0x5f, 0x9a, 0xf3, 0x0f, 0xea,
-       0x24, 0xf4, 0xe3, 0xbd, 0x8d, 0xb9, 0x95, 0x80, 0xde, 0x6c, 0xc6, 0xb5,
-       0xdb, 0xbe, 0x88, 0x9e, 0xbf, 0xd2, 0xf8, 0x47, 0xda, 0xcb, 0x84, 0xc0,
-       0x71, 0xe1, 0x02, 0x7c, 0x23, 0xb7, 0x7b, 0xe9, 0x35, 0xf4, 0xa8, 0x99,
-       0x15, 0xd4, 0x65, 0xf8, 0x4d, 0x5c, 0xad, 0x8d, 0x73, 0x9f, 0x79, 0x03,
-       0x5c, 0x9f, 0x2f, 0x2a, 0xdf, 0x34, 0x46, 0x69, 0xf9, 0x67, 0x5c, 0x67,
-       0xe2, 0x7a, 0x0d, 0xfc, 0xb8, 0x74, 0xa5, 0xa5, 0x68, 0xb9, 0x65, 0xc3,
-       0x2e, 0xfb, 0x41, 0x2f, 0xae, 0x38, 0x1f, 0x57, 0xf0, 0x8b, 0xf3, 0x2d,
-       0xce, 0x04, 0x3e, 0x04, 0xec, 0x0f, 0xee, 0xbd, 0x39, 0x66, 0x9c, 0xff,
-       0x4e, 0xe1, 0x99, 0xcf, 0xca, 0xbd, 0x32, 0xfb, 0x81, 0x7b, 0xe2, 0xee,
-       0xfe, 0x9d, 0x73, 0x23, 0x74, 0x6e, 0x33, 0x87, 0xb8, 0x47, 0xa9, 0xc8,
-       0xf9, 0x86, 0x1d, 0xf3, 0xaa, 0xde, 0xee, 0xf8, 0x3b, 0xf2, 0x59, 0xa7,
-       0x57, 0x0a, 0xe9, 0xce, 0x8b, 0x22, 0xee, 0x3b, 0x42, 0xe4, 0x15, 0x3e,
-       0xcb, 0x04, 0xee, 0x27, 0x1e, 0x7c, 0xe7, 0xa1, 0x2f, 0xe9, 0xf0, 0x73,
-       0x38, 0xe1, 0xe7, 0x50, 0xeb, 0x44, 0x26, 0xed, 0xc7, 0x0e, 0x72, 0xee,
-       0x17, 0xe2, 0x7f, 0xe7, 0xdc, 0x46, 0xc2, 0xb9, 0x6c, 0x8c, 0x4d, 0xb1,
-       0xd2, 0x3d, 0xf7, 0x0e, 0xe6, 0x72, 0x5d, 0xf7, 0xa2, 0xc3, 0x62, 0x12,
-       0xf3, 0x03, 0x9c, 0xe4, 0x75, 0x88, 0xff, 0x4a, 0x2f, 0x99, 0x57, 0x99,
-       0x97, 0x29, 0x46, 0x5c, 0xe0, 0x31, 0xd5, 0xd1, 0x83, 0x3d, 0x70, 0xd7,
-       0x59, 0xcd, 0xc4, 0xf8, 0x37, 0x83, 0x74, 0x4d, 0x81, 0xa6, 0x1b, 0x9e,
-       0x7f, 0x87, 0xc7, 0x16, 0xcf, 0x4b, 0xca, 0xae, 0x58, 0xf4, 0xfa, 0x98,
-       0xe7, 0xba, 0xc2, 0xf3, 0x77, 0x60, 0xf7, 0x5d, 0xe5, 0x50, 0x66, 0x94,
-       0x39, 0xc9, 0x15, 0x2a, 0x0b, 0xdc, 0xe0, 0x0e, 0xd8, 0xd4, 0x97, 0xd0,
-       0x1f, 0xb9, 0x12, 0xb1, 0xfd, 0x29, 0x6c, 0xe1, 0x7c, 0x0b, 0xbb, 0xc6,
-       0xd7, 0x81, 0x83, 0x05, 0x7e, 0xdf, 0xc7, 0x18, 0xdf, 0x2d, 0x78, 0x7f,
-       0x07, 0x67, 0xb0, 0x28, 0xb7, 0xaa, 0x71, 0xf7, 0x7b, 0x20, 0x77, 0x25,
-       0xc1, 0x6b, 0x06, 0xdf, 0xe7, 0x63, 0xbc, 0x72, 0x1c, 0xd9, 0xe7, 0x5a,
-       0x7f, 0x80, 0x38, 0x96, 0xe9, 0x2f, 0x31, 0x8f, 0xef, 0xfa, 0x31, 0x7e,
-       0x61, 0x0f, 0x64, 0x5a, 0x9f, 0xca, 0x98, 0xe7, 0xe0, 0xc3, 0x65, 0x3f,
-       0xc6, 0xd7, 0xf8, 0x4d, 0x1c, 0xbb, 0x83, 0xfd, 0x6e, 0x3d, 0xc3, 0xf6,
-       0x49, 0x8a, 0x39, 0xe5, 0x2e, 0x72, 0x8f, 0xe9, 0x8f, 0x20, 0xdf, 0x62,
-       0x5d, 0x2b, 0xe5, 0x7d, 0x16, 0x7c, 0x67, 0x5f, 0x33, 0xf7, 0x07, 0x92,
-       0xe7, 0x2f, 0x22, 0xb6, 0x36, 0xfc, 0xd8, 0xe9, 0x05, 0xcc, 0x15, 0xb6,
-       0xad, 0x97, 0xd4, 0xd5, 0xd4, 0xae, 0x4f, 0x63, 0x7b, 0x1e, 0xd6, 0x89,
-       0xf9, 0xed, 0xc3, 0xe4, 0xec, 0x2e, 0xb9, 0xbf, 0x1f, 0x22, 0x87, 0xf9,
-       0x6d, 0x96, 0xc9, 0xef, 0xf7, 0x20, 0xe5, 0x7d, 0x3c, 0x87, 0xc0, 0x3b,
-       0xcb, 0x3e, 0x7a, 0xef, 0xec, 0xc6, 0x7e, 0x5a, 0xfb, 0x19, 0xdf, 0xbc,
-       0xa7, 0xe7, 0x72, 0xef, 0xde, 0xc1, 0x76, 0x1e, 0x79, 0x2f, 0xf6, 0x03,
-       0x72, 0xa6, 0x37, 0x3e, 0x47, 0x29, 0xfe, 0x1f, 0x60, 0x7c, 0x01, 0x76,
-       0x55, 0x68, 0xa2, 0xc4, 0xe3, 0xc9, 0x03, 0x18, 0xe7, 0xfb, 0x3a, 0xd7,
-       0xa6, 0x3c, 0xee, 0x61, 0x5c, 0xe7, 0xf9, 0x2e, 0xd6, 0xc9, 0x53, 0x95,
-       0x35, 0x7e, 0xff, 0x2c, 0x79, 0xe7, 0xbc, 0xcc, 0x7d, 0xd4, 0x0d, 0x9c,
-       0x9f, 0xeb, 0xd1, 0x18, 0xd5, 0x1d, 0xf8, 0xd5, 0x67, 0x1b, 0x2e, 0xd0,
-       0x83, 0x1e, 0xec, 0xb0, 0xba, 0xb2, 0x6a, 0x76, 0x71, 0xe5, 0xb0, 0x7e,
-       0x8c, 0xef, 0x27, 0x46, 0x79, 0xcd, 0x48, 0x7a, 0x78, 0xee, 0xbf, 0xf6,
-       0xb4, 0x19, 0xf7, 0x62, 0x9c, 0x17, 0xb8, 0x07, 0x7b, 0x0d, 0xfb, 0xf6,
-       0xc5, 0xef, 0xe1, 0x16, 0x8f, 0xec, 0x17, 0x8a, 0x79, 0xd1, 0xe1, 0x79,
-       0x6a, 0x77, 0x84, 0x75, 0xf0, 0x8f, 0x88, 0x52, 0x9b, 0xa8, 0xfa, 0x16,
-       0xd7, 0x54, 0x3b, 0xc9, 0xff, 0x17, 0x31, 0x3e, 0x9f, 0x60, 0x20, 0x3d,
-       0x4b, 0xec, 0x57, 0xec, 0xaf, 0xf5, 0x2c, 0x30, 0xf5, 0xba, 0x9f, 0xda,
-       0x0a, 0x6c, 0x7f, 0x23, 0xcd, 0x31, 0x88, 0x97, 0xda, 0xd3, 0x72, 0x34,
-       0x84, 0x2d, 0xfc, 0xff, 0x82, 0x0a, 0x7a, 0x3b, 0xb6, 0x65, 0xc6, 0x78,
-       0x79, 0xff, 0x7f, 0x04, 0x8f, 0xf6, 0x71, 0x1c, 0x3f, 0x8e, 0xef, 0x7e,
-       0xfc, 0xac, 0x1c, 0x7c, 0xff, 0x51, 0xc3, 0xb3, 0x07, 0x04, 0xe7, 0x23,
-       0xb2, 0xb2, 0x88, 0xc1, 0x5d, 0xc4, 0x28, 0x24, 0xaf, 0xf4, 0x41, 0xdc,
-       0x9b, 0x13, 0x38, 0x37, 0x11, 0xe2, 0x19, 0x1c, 0xc0, 0xd9, 0x46, 0x3d,
-       0xff, 0x3d, 0xe2, 0x38, 0x58, 0xb8, 0x6b, 0x74, 0x62, 0x37, 0x96, 0xc4,
-       0x6e, 0xb4, 0xf5, 0xf0, 0x99, 0x5d, 0xf1, 0x52, 0xf2, 0xce, 0x67, 0xe2,
-       0x5e, 0xc1, 0xe5, 0x1e, 0x09, 0x3e, 0x28, 0x19, 0x9d, 0x7b, 0x7b, 0x93,
-       0xef, 0x97, 0x35, 0xce, 0xe5, 0xdc, 0xcf, 0x81, 0x6b, 0xa8, 0x96, 0x23,
-       0xb8, 0x6b, 0x68, 0x5d, 0x2f, 0x31, 0x76, 0x27, 0xc6, 0xa7, 0x62, 0x0c,
-       0x8b, 0x41, 0x41, 0x29, 0xb7, 0xba, 0x9f, 0x31, 0x96, 0xf8, 0x9e, 0xc6,
-       0xef, 0x1d, 0x1d, 0x1b, 0xc0, 0x1d, 0x6e, 0x32, 0xb8, 0x1d, 0xb2, 0x7e,
-       0xa3, 0xd3, 0x13, 0xdb, 0x11, 0xf3, 0x1e, 0xb8, 0x7b, 0x1f, 0x76, 0x85,
-       0xe0, 0x6d, 0xe7, 0x6e, 0x37, 0x87, 0x9c, 0x72, 0x1b, 0xb1, 0xbd, 0xab,
-       0x3a, 0x75, 0x71, 0x83, 0xfb, 0xae, 0x16, 0xf2, 0x4d, 0x1e, 0xbd, 0xb2,
-       0x4a, 0xef, 0xa2, 0x16, 0x5d, 0xc3, 0x9a, 0xeb, 0x98, 0xbb, 0xd2, 0x4a,
-       0x71, 0x84, 0x1e, 0x0f, 0xd8, 0x9c, 0x57, 0xff, 0xd4, 0x55, 0xa7, 0x7b,
-       0x2d, 0xff, 0xfd, 0x07, 0x5d, 0xe7, 0x92, 0xbb, 0xa8, 0x13, 0x00, 0x00,
-       0x00 };
-
-static const u32 bnx2_TPAT_b09FwData[(0x0/4) + 1] = { 0x0 };
-static const u32 bnx2_TPAT_b09FwRodata[(0x4/4) + 1] = {
-       0x00000001, 0x00000000 };
-
-static struct fw_info bnx2_tpat_fw_09 = {
-       /* Firmware version: 4.6.15 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0xf,
-
-       .start_addr                     = 0x08000488,
-
-       .text_addr                      = 0x08000400,
-       .text_len                       = 0x13a4,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_TPAT_b09FwText,
-       .gz_text_len                    = sizeof(bnx2_TPAT_b09FwText),
-
-       .data_addr                      = 0x00000000,
-       .data_len                       = 0x0,
-       .data_index                     = 0x0,
-       .data                           = bnx2_TPAT_b09FwData,
-
-       .sbss_addr                      = 0x080017c0,
-       .sbss_len                       = 0x40,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08001800,
-       .bss_len                        = 0x12b4,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x080017a4,
-       .rodata_len                     = 0x4,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_TPAT_b09FwRodata,
-};
-
-static u8 bnx2_TXP_b09FwText[] = {
-       0xc5, 0x7b, 0x7d, 0x70, 0x1b, 0xe7, 0x79, 0xe7, 0xef, 0xc5, 0x02, 0xe4,
-       0x02, 0x04, 0x41, 0x90, 0x82, 0x64, 0xf0, 0xca, 0x44, 0x58, 0x61, 0x41,
-       0xc1, 0x26, 0x2d, 0x2f, 0x28, 0x50, 0x82, 0xcb, 0x55, 0x85, 0x4a, 0xb4,
-       0x44, 0xc7, 0x74, 0x43, 0x3b, 0x6a, 0x4b, 0x67, 0x3c, 0x09, 0x2a, 0x51,
-       0x16, 0x2d, 0xcb, 0x16, 0xed, 0xf8, 0x7a, 0xec, 0x9c, 0x27, 0xda, 0x50,
-       0x1f, 0x96, 0x25, 0x10, 0x00, 0x3f, 0x64, 0xca, 0x9d, 0xce, 0x19, 0x26,
-       0x29, 0x51, 0xb6, 0xf1, 0x21, 0xc7, 0x4a, 0x6a, 0xcf, 0x24, 0x11, 0x4e,
-       0x96, 0x65, 0xd9, 0x89, 0x3f, 0x92, 0xf8, 0x7a, 0x4e, 0xa7, 0x37, 0xd5,
-       0x48, 0xfe, 0x90, 0x2c, 0xf9, 0xa3, 0x69, 0x6f, 0x2a, 0xb5, 0x4e, 0xf7,
-       0x9e, 0x67, 0x17, 0x94, 0x15, 0xd7, 0x9d, 0x9b, 0xf6, 0xfe, 0x38, 0xce,
-       0x70, 0x00, 0xec, 0xbe, 0xfb, 0xbe, 0xcf, 0xf7, 0xf3, 0x7b, 0x9e, 0xf7,
-       0xdd, 0x56, 0xc0, 0x83, 0xea, 0x5f, 0x3d, 0xfd, 0xc7, 0x87, 0x86, 0x1f,
-       0x8e, 0x2d, 0x5b, 0xb1, 0x8c, 0xbe, 0x76, 0xa2, 0xa1, 0xc6, 0xc9, 0x37,
-       0x57, 0x08, 0x20, 0xf5, 0x21, 0xfe, 0x43, 0x7f, 0x5f, 0xf9, 0x8f, 0x3d,
-       0x66, 0xfd, 0x49, 0x80, 0x7f, 0x9e, 0x2e, 0xfe, 0x87, 0xec, 0xd0, 0x93,
-       0x5d, 0x6b, 0x54, 0xc8, 0x92, 0x7e, 0x79, 0xd5, 0x26, 0x15, 0x48, 0x16,
-       0xda, 0x42, 0x6b, 0xf1, 0x1b, 0xd3, 0x08, 0x38, 0xc1, 0xd7, 0xbf, 0xa2,
-       0x7f, 0xb6, 0xe3, 0xc7, 0x2b, 0x95, 0x4f, 0xf3, 0x12, 0x64, 0xbf, 0x7e,
-       0x10, 0xfe, 0x56, 0xc8, 0x2d, 0xf4, 0xcc, 0x5f, 0x2c, 0x2d, 0x39, 0xe1,
-       0x9b, 0x9f, 0x0b, 0x86, 0x4b, 0xd7, 0xb0, 0x33, 0x3b, 0x84, 0x23, 0x71,
-       0xa0, 0x76, 0x34, 0xa2, 0xed, 0x04, 0x72, 0x0e, 0x3d, 0x12, 0x3a, 0x81,
-       0x10, 0x66, 0x0b, 0x2a, 0x1e, 0x2d, 0xc3, 0x70, 0xea, 0x21, 0x3c, 0x96,
-       0xfe, 0x17, 0x33, 0xe4, 0xe2, 0x47, 0x86, 0xb0, 0x8b, 0xc6, 0xee, 0x4e,
-       0x43, 0x0e, 0xea, 0x8f, 0x20, 0x98, 0x85, 0x5c, 0xaf, 0x0f, 0xa3, 0x38,
-       0x1a, 0x3e, 0x3d, 0x07, 0xa5, 0xaf, 0x59, 0x52, 0x86, 0x80, 0xb6, 0xd4,
-       0x5d, 0x42, 0xe9, 0x2f, 0x09, 0x25, 0xb1, 0x4d, 0x40, 0x16, 0x34, 0xee,
-       0x86, 0x02, 0x7f, 0x0e, 0x63, 0x69, 0x41, 0xc6, 0x19, 0x89, 0xe7, 0x59,
-       0x45, 0xf2, 0x16, 0x70, 0xaa, 0x1a, 0x76, 0x67, 0x79, 0x0d, 0x81, 0x9d,
-       0xf1, 0x88, 0x7f, 0x06, 0x7c, 0x3f, 0x84, 0x11, 0x6b, 0x9c, 0x42, 0x5c,
-       0x9b, 0xe6, 0x2e, 0xcd, 0x34, 0x0f, 0x69, 0xb5, 0x30, 0xfc, 0x4a, 0x10,
-       0x10, 0x18, 0xd1, 0x1c, 0x48, 0xfa, 0xd7, 0x84, 0x9c, 0x50, 0x82, 0x9b,
-       0xf1, 0xcf, 0xc4, 0x73, 0x32, 0xea, 0x82, 0x3d, 0x3e, 0x85, 0x5a, 0x54,
-       0xfc, 0xb6, 0xd4, 0xa6, 0xd3, 0xa6, 0x79, 0x4a, 0x75, 0xe2, 0x10, 0xc9,
-       0x67, 0xa4, 0xf0, 0xcf, 0x66, 0x85, 0x64, 0xb3, 0x4b, 0x9d, 0x5f, 0x5f,
-       0x46, 0xde, 0x6f, 0x9a, 0x33, 0x74, 0x6f, 0x4f, 0x61, 0x5e, 0xce, 0xa6,
-       0xe9, 0x50, 0x4d, 0x73, 0x93, 0xfa, 0x4f, 0xe6, 0xc6, 0xdf, 0x1a, 0x1b,
-       0xc3, 0x33, 0x39, 0x3f, 0x9e, 0xcd, 0x26, 0x51, 0x48, 0x9b, 0x90, 0x74,
-       0x27, 0x06, 0x47, 0x43, 0xd8, 0x56, 0xec, 0x46, 0x31, 0xad, 0xa4, 0xce,
-       0xd0, 0x73, 0x1b, 0xe3, 0x2a, 0xee, 0x2f, 0xf6, 0x60, 0x2e, 0x0d, 0xd3,
-       0xad, 0xab, 0x15, 0xb7, 0x88, 0x62, 0x4b, 0xb1, 0x17, 0xa5, 0xb4, 0x7a,
-       0x7a, 0x44, 0x44, 0x86, 0x9b, 0x25, 0x27, 0xb6, 0x17, 0xdb, 0xf1, 0x40,
-       0x31, 0x41, 0xcf, 0x98, 0xf8, 0x5a, 0xac, 0x85, 0xc6, 0x77, 0xe0, 0xe9,
-       0x49, 0xd3, 0x8c, 0xc6, 0xfc, 0x18, 0x2c, 0x6a, 0x98, 0xcb, 0x39, 0x90,
-       0x3a, 0xe4, 0x44, 0xea, 0x29, 0x60, 0xcb, 0x53, 0x1d, 0x98, 0xc9, 0x99,
-       0xd8, 0xa8, 0x8d, 0x34, 0x3b, 0xe0, 0x42, 0xca, 0x2f, 0xe0, 0x52, 0x7d,
-       0xd8, 0xec, 0xb7, 0x69, 0x3f, 0x23, 0x09, 0x6c, 0x7d, 0x2a, 0x8a, 0x77,
-       0xd2, 0x06, 0xbe, 0xd6, 0x19, 0xc4, 0x70, 0x31, 0x80, 0x37, 0xd3, 0x01,
-       0x5a, 0x43, 0xc3, 0x1b, 0x69, 0x99, 0xd6, 0x69, 0xc7, 0xc9, 0x34, 0x8f,
-       0xe1, 0xb1, 0x5e, 0x0c, 0x14, 0x5b, 0xf0, 0x7a, 0x3a, 0x48, 0x6b, 0x06,
-       0xf0, 0x2a, 0x8d, 0xbb, 0xb7, 0xa8, 0xe2, 0x34, 0x8d, 0x1b, 0x2c, 0x86,
-       0xf0, 0x4a, 0xda, 0x4b, 0xb4, 0x06, 0x70, 0x22, 0x3d, 0x84, 0x9d, 0xe9,
-       0xb6, 0xd3, 0x6b, 0x49, 0x86, 0xa1, 0x05, 0xbc, 0x0e, 0x5f, 0x7b, 0xd7,
-       0xec, 0x0d, 0x58, 0xa6, 0x42, 0xeb, 0xcc, 0xaf, 0x3b, 0x84, 0x91, 0xf4,
-       0xa9, 0xaa, 0xbf, 0x68, 0x78, 0x2c, 0x77, 0xd9, 0xfc, 0xf1, 0xd2, 0x16,
-       0x1c, 0xc9, 0x02, 0x4f, 0xcf, 0x00, 0x33, 0x59, 0xc3, 0xac, 0xd7, 0x4d,
-       0x73, 0xba, 0xb3, 0x9d, 0xe4, 0xa5, 0xf6, 0x6f, 0xa4, 0x51, 0xcf, 0x96,
-       0x9d, 0xc0, 0x53, 0x4a, 0x7f, 0x05, 0x0e, 0xe4, 0xe7, 0x9c, 0xa8, 0x19,
-       0x55, 0x7a, 0xf2, 0x50, 0x4e, 0x6f, 0x21, 0x8f, 0x3a, 0x94, 0x55, 0xfa,
-       0x0c, 0xec, 0x30, 0x83, 0x7a, 0x6b, 0xa8, 0x5d, 0x32, 0xe1, 0x23, 0x5b,
-       0x48, 0xb7, 0x9b, 0x66, 0xc3, 0x4a, 0xd3, 0x7c, 0xbd, 0x13, 0xa6, 0x43,
-       0x57, 0x4f, 0x97, 0xa1, 0x56, 0x3e, 0x82, 0x3a, 0x7c, 0x02, 0x95, 0xaf,
-       0x78, 0x11, 0x19, 0x0c, 0x4b, 0x91, 0xa1, 0xcb, 0xf4, 0x6c, 0x7d, 0x91,
-       0xcc, 0x99, 0x78, 0x51, 0x47, 0x81, 0x62, 0x59, 0x86, 0x93, 0xf8, 0x69,
-       0x1f, 0x35, 0x4d, 0xa7, 0xea, 0x85, 0x97, 0xe4, 0xbb, 0xfe, 0x80, 0x69,
-       0xbe, 0xaf, 0xf9, 0x51, 0x43, 0xba, 0xb9, 0x65, 0xcc, 0xc4, 0xb4, 0x76,
-       0x82, 0xe4, 0x29, 0x90, 0xea, 0x8b, 0xd3, 0x33, 0x01, 0x1a, 0x9f, 0xc0,
-       0xfa, 0xd1, 0x20, 0x9e, 0xc9, 0xca, 0xf8, 0xf1, 0xd2, 0x28, 0xea, 0x68,
-       0x2e, 0x0f, 0xc9, 0xaa, 0x96, 0xe4, 0x87, 0x22, 0x99, 0x5b, 0xd1, 0xb6,
-       0x47, 0x14, 0xcf, 0x10, 0x8f, 0x41, 0x7c, 0xbf, 0x1c, 0xc0, 0x73, 0x65,
-       0x3f, 0x8e, 0x96, 0x5b, 0x70, 0xbc, 0xac, 0xe1, 0x60, 0x4e, 0xd9, 0x5b,
-       0x81, 0x89, 0x7a, 0x7d, 0x07, 0x1a, 0x96, 0x03, 0x6f, 0xe6, 0x63, 0xc8,
-       0xe4, 0x4c, 0xb3, 0x40, 0x74, 0x7b, 0x88, 0x8f, 0x37, 0xf2, 0x5f, 0xc5,
-       0xe1, 0x49, 0x27, 0x42, 0xd3, 0x01, 0x3c, 0x9b, 0x76, 0xe2, 0xfa, 0x8c,
-       0x62, 0xe4, 0xa1, 0x46, 0xb7, 0x09, 0x35, 0x79, 0x83, 0x50, 0x72, 0x06,
-       0x22, 0x21, 0x97, 0x70, 0xa0, 0xf5, 0xb0, 0x13, 0x6a, 0x29, 0x04, 0x57,
-       0xab, 0x0c, 0xb5, 0xf5, 0x21, 0xc0, 0xe7, 0x40, 0x0d, 0xf9, 0xc6, 0xfa,
-       0xf1, 0x28, 0x5d, 0x0b, 0xd0, 0x35, 0x7c, 0xb5, 0x16, 0xd2, 0x22, 0x09,
-       0x24, 0x3b, 0x55, 0x42, 0xd2, 0x69, 0x9a, 0x92, 0xda, 0x81, 0xbb, 0x1e,
-       0x37, 0xcd, 0xf0, 0x72, 0x1e, 0xef, 0x47, 0xb8, 0x44, 0x72, 0x68, 0x25,
-       0xba, 0xb2, 0x44, 0x67, 0x96, 0xe8, 0xcc, 0x12, 0x9d, 0x59, 0x89, 0xec,
-       0x46, 0xd1, 0x80, 0x47, 0x48, 0x5f, 0x21, 0xe2, 0xf1, 0x1d, 0x4b, 0x57,
-       0xcf, 0x95, 0x83, 0xc4, 0x43, 0xc8, 0xe2, 0xe1, 0xe9, 0x9c, 0x80, 0x43,
-       0x55, 0xfa, 0xce, 0x60, 0x35, 0xc2, 0x31, 0x25, 0x99, 0x47, 0x92, 0x9e,
-       0x53, 0xf6, 0x1a, 0x50, 0x7a, 0x2a, 0x64, 0x03, 0x1b, 0xfd, 0x09, 0xcc,
-       0x65, 0x5d, 0xa8, 0x53, 0x95, 0x10, 0xe9, 0x2c, 0x5a, 0xc1, 0x02, 0xdc,
-       0xe7, 0xa7, 0x39, 0x1d, 0xb2, 0xb0, 0x63, 0xc9, 0x23, 0x88, 0x8c, 0x3b,
-       0x30, 0xab, 0x49, 0xe4, 0xa3, 0x1a, 0xa4, 0x56, 0x5a, 0xae, 0x14, 0xa7,
-       0x4f, 0x9a, 0x3f, 0x4b, 0x6b, 0x11, 0x3d, 0x34, 0x1f, 0xf9, 0x26, 0xcb,
-       0x32, 0x4a, 0x34, 0x3c, 0x6a, 0xd1, 0x7b, 0xb4, 0xfc, 0x75, 0x61, 0xdb,
-       0x90, 0x4e, 0x36, 0xa3, 0x84, 0x20, 0x94, 0x68, 0x48, 0x28, 0x5a, 0x52,
-       0xf8, 0x31, 0x53, 0x7e, 0x83, 0xc6, 0x04, 0xae, 0x19, 0xd3, 0x87, 0x91,
-       0xac, 0xc0, 0x5a, 0xd5, 0xc4, 0x1a, 0xad, 0x0f, 0x3b, 0xcb, 0xf3, 0xbe,
-       0xc9, 0x31, 0xcc, 0xef, 0x9b, 0x49, 0x77, 0x63, 0x57, 0x36, 0x84, 0x9d,
-       0x85, 0xa0, 0x6f, 0x3a, 0xcd, 0xf7, 0x54, 0xf2, 0x79, 0xbe, 0x17, 0xb8,
-       0xe6, 0x5e, 0xcb, 0x35, 0xf7, 0x12, 0x18, 0x99, 0xf8, 0x1d, 0x8a, 0x23,
-       0x0d, 0xd8, 0xa9, 0x7e, 0x4a, 0xf6, 0xa2, 0x26, 0x06, 0xd0, 0x8c, 0x33,
-       0xfe, 0x76, 0xec, 0x9f, 0xea, 0xc5, 0xae, 0xa9, 0x65, 0x78, 0x6c, 0xa2,
-       0x25, 0xe5, 0xd1, 0x49, 0x38, 0x9e, 0x70, 0x72, 0x40, 0x28, 0x43, 0x92,
-       0x08, 0x47, 0x07, 0xc8, 0x7e, 0x5b, 0x1b, 0x4d, 0xf3, 0x44, 0x8c, 0xec,
-       0x5b, 0x6b, 0xd3, 0xd6, 0x93, 0x00, 0x2a, 0x7d, 0x4a, 0xcf, 0xbb, 0xf0,
-       0xe2, 0x76, 0xb2, 0xbb, 0x99, 0x18, 0x06, 0x24, 0x48, 0xed, 0x5e, 0xfc,
-       0xbd, 0xf9, 0x94, 0x93, 0xe5, 0x6e, 0xee, 0xd8, 0xa4, 0xed, 0x15, 0x1c,
-       0xeb, 0x6a, 0xae, 0xc6, 0x13, 0x9e, 0x9f, 0x9f, 0x21, 0xdd, 0xd1, 0x3c,
-       0x83, 0xb1, 0xb6, 0xc4, 0x20, 0x2e, 0x9b, 0x67, 0x36, 0xf4, 0x62, 0xe7,
-       0xdc, 0x32, 0xec, 0x9b, 0x70, 0x21, 0xd9, 0x28, 0xd0, 0xa0, 0x86, 0x2b,
-       0xf7, 0x61, 0x19, 0x8c, 0x19, 0x7e, 0xae, 0x17, 0x07, 0xe7, 0xec, 0xdf,
-       0xd9, 0xab, 0xbf, 0xe7, 0xe7, 0x3b, 0x4f, 0x3a, 0x65, 0x79, 0x72, 0xac,
-       0x24, 0x15, 0xe8, 0x6d, 0x38, 0x32, 0x11, 0x20, 0xdd, 0x76, 0x0b, 0xe7,
-       0xe1, 0x45, 0x3e, 0xcf, 0xe3, 0x26, 0x4e, 0x69, 0xa4, 0xe7, 0xec, 0x3a,
-       0xe1, 0x39, 0xdc, 0x23, 0x5c, 0xa5, 0x3b, 0x45, 0xcd, 0xf4, 0x37, 0x85,
-       0x7c, 0x38, 0x25, 0x6a, 0x4b, 0xed, 0x24, 0xfb, 0x7e, 0xe1, 0x3e, 0xac,
-       0x84, 0x42, 0xe2, 0x11, 0xd2, 0xe7, 0x06, 0x21, 0x95, 0xe0, 0x77, 0xe8,
-       0xc3, 0xc2, 0x51, 0xa2, 0x39, 0x2c, 0x1b, 0xe2, 0x75, 0x82, 0xa4, 0x37,
-       0x18, 0x92, 0x3e, 0x84, 0x8d, 0x14, 0xff, 0x6f, 0x4d, 0xeb, 0x78, 0x34,
-       0x5b, 0x4b, 0x31, 0x92, 0x7d, 0xff, 0x32, 0xad, 0xab, 0xe2, 0x31, 0xca,
-       0x15, 0xb2, 0xbe, 0x0f, 0x3e, 0xf2, 0xb9, 0xd7, 0x63, 0xec, 0x8f, 0x40,
-       0x21, 0x1b, 0xee, 0x7f, 0x54, 0x98, 0xe6, 0xd6, 0x88, 0xb9, 0x78, 0x5d,
-       0xac, 0x2d, 0x7a, 0x12, 0xff, 0x68, 0xe6, 0x03, 0x43, 0xa8, 0xef, 0xa4,
-       0x7b, 0xa3, 0x90, 0x5d, 0xfa, 0x2e, 0x1c, 0xa2, 0x5c, 0xe2, 0xd1, 0x29,
-       0xbe, 0x8c, 0x86, 0xfb, 0x1f, 0x13, 0x1c, 0xf3, 0x95, 0xca, 0xb3, 0x18,
-       0x39, 0x5d, 0x0b, 0x25, 0xb4, 0x46, 0xb4, 0x69, 0x75, 0x92, 0x91, 0x68,
-       0xa6, 0x14, 0xe7, 0xee, 0x54, 0x86, 0xf7, 0x40, 0xf1, 0x5f, 0x00, 0xfb,
-       0x2a, 0xe7, 0x93, 0x5d, 0x48, 0x58, 0x79, 0xc5, 0xc0, 0x4d, 0x57, 0xf3,
-       0x8a, 0x4e, 0x76, 0x52, 0x8b, 0x3d, 0x44, 0xd7, 0xcb, 0x9a, 0x12, 0x9c,
-       0x86, 0xb9, 0x78, 0x40, 0xe3, 0x7b, 0x3a, 0x76, 0x95, 0xcd, 0x90, 0xa4,
-       0xb3, 0xac, 0x90, 0xaa, 0xd5, 0x99, 0x56, 0x3f, 0xf9, 0xc6, 0x6f, 0xcc,
-       0x81, 0xb8, 0xac, 0xbd, 0x57, 0xf0, 0x93, 0xbc, 0xe0, 0x73, 0x16, 0xbf,
-       0x2c, 0xff, 0x9a, 0x70, 0xe8, 0xbf, 0x31, 0xbf, 0x1d, 0x87, 0x6f, 0x71,
-       0xd1, 0x99, 0xaa, 0xd3, 0xd1, 0x37, 0x3c, 0xba, 0xc3, 0x6c, 0x56, 0x1d,
-       0x14, 0xab, 0x54, 0x8a, 0xed, 0xde, 0xc4, 0xa5, 0x4e, 0xb7, 0x78, 0xbd,
-       0x33, 0xd8, 0xfb, 0x51, 0xc1, 0x4d, 0x7a, 0x46, 0xdf, 0xb6, 0x62, 0xc2,
-       0xf9, 0x21, 0xd9, 0x5a, 0x0d, 0xc5, 0x55, 0x14, 0x5b, 0x7a, 0x2f, 0x50,
-       0x2e, 0xba, 0x25, 0xe6, 0xfe, 0xe3, 0x1a, 0xdd, 0xf1, 0x55, 0x37, 0x1e,
-       0xbc, 0x69, 0x36, 0xd1, 0x40, 0xb1, 0xdd, 0x8f, 0xd3, 0xf1, 0x1e, 0x8c,
-       0x94, 0x6b, 0xc9, 0x0e, 0x9f, 0xaf, 0xec, 0x56, 0x5b, 0x7a, 0x2f, 0xa6,
-       0x17, 0x53, 0x2c, 0xc1, 0x67, 0x85, 0x4e, 0xb5, 0x6f, 0x9b, 0x38, 0x71,
-       0xab, 0x07, 0x71, 0x92, 0xab, 0x2c, 0x5f, 0x49, 0xe3, 0xd3, 0xc5, 0xaa,
-       0x5a, 0x59, 0x2d, 0xb5, 0x0e, 0xc9, 0x52, 0xeb, 0x70, 0x0d, 0xc5, 0xe1,
-       0xf3, 0x37, 0x0a, 0x9c, 0xba, 0x31, 0x92, 0xa8, 0x11, 0x6e, 0x9c, 0xe9,
-       0x4b, 0x90, 0x9d, 0xb4, 0xa4, 0xdc, 0x3a, 0xc5, 0x8f, 0x51, 0x01, 0x49,
-       0x4d, 0x60, 0xe7, 0x0c, 0x1e, 0x19, 0xd1, 0x7a, 0x61, 0xcc, 0xb1, 0x0d,
-       0xb5, 0x63, 0x64, 0xae, 0x0f, 0x46, 0x59, 0x42, 0x3e, 0x40, 0xcc, 0x97,
-       0x91, 0x72, 0xe9, 0xed, 0xdd, 0xf9, 0xc2, 0x5d, 0x2e, 0xdb, 0x87, 0x89,
-       0xff, 0xec, 0xa4, 0x0f, 0x1e, 0xd6, 0xf3, 0x69, 0x92, 0x51, 0x3b, 0x9e,
-       0x2f, 0x47, 0x29, 0xde, 0x69, 0x24, 0x17, 0x95, 0xe2, 0x45, 0x88, 0xec,
-       0x4b, 0xc6, 0xc6, 0x09, 0xe5, 0x20, 0xc5, 0x85, 0x5c, 0x9e, 0x40, 0x51,
-       0x32, 0xe0, 0xa7, 0xfc, 0xfd, 0x6a, 0x35, 0x06, 0x0c, 0xd2, 0xa7, 0x62,
-       0x24, 0x81, 0x93, 0x0e, 0xa0, 0xa3, 0x59, 0x8f, 0xec, 0x6d, 0x26, 0x7d,
-       0x34, 0x96, 0xdc, 0xd8, 0x3e, 0xd1, 0x84, 0x07, 0xa6, 0x3c, 0xd8, 0x3a,
-       0x61, 0xe2, 0x52, 0x8c, 0x6d, 0x43, 0xe9, 0x27, 0x12, 0xbb, 0xeb, 0x48,
-       0xae, 0xb7, 0xc6, 0x22, 0x09, 0xb7, 0x70, 0xa2, 0xb6, 0xd4, 0x47, 0x38,
-       0x20, 0xc9, 0x7e, 0xa1, 0xd1, 0x1c, 0xa1, 0x9d, 0xda, 0xed, 0x48, 0x05,
-       0x64, 0xb8, 0x4a, 0x5e, 0x8a, 0x25, 0xec, 0xc7, 0x7c, 0xef, 0xeb, 0xd8,
-       0x58, 0xe3, 0x85, 0x94, 0x91, 0x91, 0x23, 0x0c, 0x80, 0x45, 0x35, 0xe8,
-       0x69, 0x75, 0xd0, 0x7f, 0xc0, 0x37, 0x3b, 0xd9, 0xe2, 0x3b, 0x44, 0xf1,
-       0x75, 0x4b, 0xd6, 0xc1, 0xeb, 0x30, 0x66, 0xa0, 0xb9, 0xfd, 0x78, 0x9a,
-       0xe2, 0xf5, 0x43, 0x14, 0x7f, 0x8e, 0x94, 0xcb, 0x82, 0xe3, 0x89, 0xc5,
-       0x4f, 0x96, 0x78, 0xcb, 0x12, 0x6f, 0x59, 0xe2, 0x8b, 0xe2, 0xc2, 0xd1,
-       0x2c, 0xf3, 0xf1, 0x6b, 0xf2, 0xd1, 0x04, 0xf1, 0xee, 0xc6, 0x66, 0xa2,
-       0xf7, 0xc1, 0xa9, 0x3a, 0x6c, 0x23, 0x7a, 0x8b, 0x9a, 0xa2, 0x3d, 0x27,
-       0x4c, 0xec, 0x8f, 0x29, 0xc6, 0x4f, 0x29, 0x10, 0x39, 0x5a, 0x4d, 0xb3,
-       0x4f, 0x63, 0x9e, 0x29, 0x5e, 0x39, 0x2c, 0x9e, 0xf7, 0x26, 0xe1, 0xc6,
-       0x20, 0x3d, 0x33, 0x30, 0x85, 0xcf, 0x1c, 0xc4, 0x93, 0x9b, 0x78, 0xdc,
-       0xa7, 0x29, 0x89, 0x1b, 0x28, 0xae, 0x9f, 0x53, 0x23, 0x95, 0x73, 0x12,
-       0x7e, 0x9f, 0xe4, 0x31, 0xcc, 0xf2, 0xb8, 0x89, 0xf8, 0x79, 0x80, 0xf0,
-       0x4e, 0x3d, 0xc5, 0xa5, 0xc2, 0x81, 0x48, 0xf4, 0x97, 0xc4, 0x7b, 0xa4,
-       0x44, 0xb4, 0x8f, 0xda, 0xb4, 0xdf, 0xc7, 0xb4, 0xc7, 0x4c, 0xdc, 0x43,
-       0xb4, 0x1f, 0x26, 0xda, 0x07, 0xb3, 0x2c, 0x0f, 0xce, 0x3b, 0x36, 0xfd,
-       0x47, 0xca, 0xbc, 0xee, 0x97, 0xf1, 0x30, 0x4f, 0x7f, 0x13, 0x36, 0x4e,
-       0xcd, 0xcb, 0xcb, 0x34, 0xbf, 0xad, 0x1d, 0x33, 0xff, 0x84, 0x64, 0xb6,
-       0xb8, 0xc4, 0x72, 0x83, 0x51, 0xab, 0x47, 0x0e, 0x6e, 0xc1, 0x7d, 0x0e,
-       0x78, 0xbc, 0x58, 0x50, 0xe2, 0x5c, 0x10, 0xc2, 0x31, 0xd2, 0xef, 0x71,
-       0xca, 0x67, 0xcf, 0x97, 0xaf, 0xcd, 0x6f, 0xac, 0xeb, 0x49, 0xd2, 0xb1,
-       0x92, 0x37, 0x28, 0xb6, 0xa5, 0xca, 0x49, 0xec, 0x9e, 0x42, 0x72, 0x56,
-       0xfb, 0x6f, 0x14, 0x60, 0x16, 0x91, 0x7d, 0xd5, 0x26, 0xfd, 0xaa, 0x07,
-       0x9b, 0x66, 0x02, 0x18, 0x2a, 0xaf, 0x41, 0x96, 0xe2, 0xcd, 0x36, 0x8a,
-       0xcf, 0x1f, 0xc7, 0x92, 0x5b, 0x7d, 0x88, 0x90, 0x7e, 0x03, 0xb8, 0x8f,
-       0x9e, 0xd9, 0x37, 0xc5, 0x3c, 0xf8, 0xab, 0x7a, 0x0e, 0x60, 0x0b, 0x5d,
-       0xdb, 0x33, 0x25, 0xe3, 0x25, 0xed, 0x49, 0xc2, 0x34, 0x36, 0xc6, 0xb8,
-       0x27, 0x0b, 0x3f, 0xb9, 0x27, 0x61, 0xc0, 0x48, 0xf4, 0x25, 0xfa, 0xbd,
-       0xb9, 0xec, 0xf1, 0x8d, 0x4c, 0xe2, 0x7b, 0x8b, 0x75, 0x1f, 0x16, 0x10,
-       0x1e, 0xbb, 0x4b, 0x8b, 0x90, 0xdd, 0x3b, 0x31, 0x5c, 0x76, 0xe0, 0x3b,
-       0x33, 0x1e, 0x3c, 0x34, 0xf1, 0x99, 0x59, 0x13, 0x77, 0xe2, 0x8e, 0x56,
-       0x0f, 0x1e, 0x9c, 0x49, 0x62, 0xef, 0x14, 0x42, 0xb5, 0xb1, 0x31, 0x8a,
-       0xdd, 0x76, 0x3e, 0xa8, 0x23, 0xde, 0x1f, 0x9b, 0xf2, 0xfa, 0x06, 0x0f,
-       0xb0, 0x0c, 0xd6, 0x04, 0xdd, 0x40, 0xa5, 0x36, 0x26, 0x61, 0xb3, 0x26,
-       0x2d, 0xa8, 0x25, 0x43, 0x7f, 0x92, 0xe6, 0x9b, 0x86, 0xf4, 0xda, 0x62,
-       0x44, 0x0e, 0x36, 0x4b, 0x95, 0xdc, 0x02, 0x34, 0xe1, 0xa1, 0xb9, 0x24,
-       0xc6, 0xc8, 0x46, 0xb7, 0x4f, 0x8c, 0x7c, 0xaf, 0x91, 0x62, 0x88, 0xaf,
-       0x43, 0x19, 0x7c, 0x53, 0xe8, 0x28, 0x44, 0xdc, 0xd8, 0x36, 0xe3, 0xf5,
-       0x6d, 0x3d, 0x60, 0xae, 0x66, 0x7b, 0xba, 0x77, 0xae, 0x09, 0xf7, 0x4f,
-       0xd1, 0xb5, 0x09, 0xb6, 0x61, 0xb2, 0xb5, 0x48, 0x2d, 0xf1, 0x16, 0x4e,
-       0xba, 0x09, 0x33, 0x49, 0xb1, 0x3a, 0x92, 0x87, 0x1b, 0x5b, 0x2c, 0x5b,
-       0xf0, 0x63, 0xf3, 0x94, 0x89, 0xb3, 0x5a, 0x14, 0x39, 0xb2, 0xeb, 0x83,
-       0x53, 0xca, 0xe5, 0x6e, 0xc2, 0x3b, 0xef, 0x49, 0xca, 0xc1, 0x56, 0x29,
-       0x89, 0xa6, 0xe5, 0x14, 0xe3, 0x9b, 0x4c, 0xf3, 0x9e, 0x8e, 0xb6, 0xa1,
-       0xb7, 0x88, 0xe6, 0x46, 0x7d, 0x11, 0x2a, 0x8d, 0x4a, 0x8e, 0xb0, 0xf3,
-       0x70, 0x8d, 0xe3, 0x46, 0x9c, 0x59, 0x48, 0x7a, 0x06, 0xc7, 0xf2, 0x80,
-       0xaf, 0x29, 0x63, 0xe7, 0xb8, 0x26, 0xb2, 0x93, 0xc6, 0x4c, 0xd0, 0xd7,
-       0x58, 0x82, 0xaf, 0xa6, 0x04, 0xbc, 0x40, 0xf1, 0x65, 0xc1, 0xf2, 0xdf,
-       0x98, 0xa9, 0x26, 0x0b, 0x13, 0xfa, 0x5e, 0x9c, 0x54, 0x8c, 0x0a, 0x94,
-       0xbd, 0x14, 0x2a, 0xf1, 0xc4, 0x9c, 0xd3, 0x77, 0x98, 0xf0, 0x5f, 0x93,
-       0x1a, 0xc5, 0x1e, 0xd2, 0xe7, 0x0e, 0xb2, 0x85, 0xbf, 0x27, 0x7c, 0xf2,
-       0x58, 0x26, 0x1c, 0xd2, 0x44, 0x3f, 0x4d, 0x0c, 0xec, 0x2a, 0x51, 0xcc,
-       0x77, 0xac, 0xa5, 0x20, 0xa6, 0x44, 0x29, 0xad, 0x21, 0x9d, 0x71, 0xc1,
-       0x58, 0x68, 0xeb, 0xe4, 0xfe, 0xec, 0x71, 0xd3, 0xa7, 0xaa, 0xf9, 0x12,
-       0xe9, 0xec, 0xe1, 0xb2, 0x17, 0xc3, 0x84, 0x07, 0x16, 0x10, 0x8e, 0x7c,
-       0x90, 0xec, 0x62, 0xfb, 0x84, 0x44, 0xf4, 0xf1, 0xb8, 0x24, 0x92, 0x8b,
-       0x6c, 0x3c, 0xfa, 0xd0, 0x0c, 0xdb, 0x25, 0xd9, 0x11, 0xd9, 0xe2, 0x31,
-       0xca, 0xf9, 0xcf, 0xff, 0x16, 0x06, 0x51, 0xfc, 0xc6, 0xd5, 0xdc, 0x6f,
-       0xcb, 0x63, 0x64, 0x8a, 0x79, 0x56, 0x0e, 0xc2, 0x91, 0xc4, 0x2d, 0xda,
-       0xaf, 0x28, 0x27, 0x30, 0xef, 0x84, 0x83, 0xa7, 0xa2, 0x94, 0x57, 0x08,
-       0xdb, 0xc4, 0x2e, 0x99, 0x5b, 0x02, 0x2c, 0x03, 0xe6, 0xe7, 0x66, 0x89,
-       0xf3, 0x67, 0x13, 0xe1, 0xdf, 0xff, 0x77, 0xbb, 0xdb, 0x64, 0xa6, 0x2c,
-       0x3c, 0x4b, 0x38, 0x9b, 0xec, 0x29, 0x75, 0xd5, 0x7e, 0x1e, 0x34, 0xcf,
-       0x04, 0x38, 0x5f, 0x37, 0x21, 0x75, 0xd5, 0x16, 0xd8, 0x96, 0xb0, 0x58,
-       0xeb, 0xd8, 0xf9, 0xa0, 0x1f, 0x6c, 0x0f, 0xd1, 0x6b, 0xec, 0xc1, 0x43,
-       0x34, 0xf9, 0xb1, 0x75, 0x8e, 0xed, 0xd7, 0xfc, 0x64, 0xb1, 0xfe, 0x2f,
-       0xe6, 0x95, 0x95, 0xea, 0xc1, 0x5f, 0xe1, 0xeb, 0x74, 0x3d, 0x80, 0xef,
-       0x90, 0x1f, 0xdd, 0x47, 0x7c, 0x6e, 0xed, 0x7c, 0xc0, 0xf2, 0xdb, 0xad,
-       0xe5, 0xdf, 0xa3, 0xeb, 0x2c, 0xef, 0x6e, 0x8a, 0x73, 0x1a, 0xf6, 0x65,
-       0x2b, 0x9c, 0x87, 0xc8, 0xe6, 0xe3, 0xf8, 0x4b, 0x8a, 0xb3, 0xc7, 0xca,
-       0x8c, 0xc9, 0x12, 0x16, 0x1e, 0xfb, 0x61, 0xb9, 0x1d, 0x3f, 0x20, 0x9f,
-       0x7c, 0x9e, 0x62, 0xee, 0xf7, 0x2d, 0x9c, 0xe6, 0x14, 0x8f, 0xa6, 0x55,
-       0x3c, 0x4d, 0x58, 0x7f, 0x5f, 0x21, 0x84, 0x23, 0xe9, 0xf0, 0xde, 0x0b,
-       0x50, 0x5e, 0x20, 0x79, 0xf9, 0xf6, 0x52, 0x8d, 0x76, 0x38, 0xad, 0xe4,
-       0x81, 0xa0, 0x6f, 0x4f, 0xc1, 0xef, 0x1b, 0x49, 0x07, 0x7c, 0x23, 0x84,
-       0x81, 0x76, 0xa6, 0x5b, 0x7c, 0x3b, 0x0b, 0xcb, 0x11, 0x6a, 0x82, 0xb1,
-       0x88, 0x72, 0xc2, 0x7d, 0x13, 0x1b, 0x90, 0x6a, 0xb4, 0xe3, 0xfc, 0x03,
-       0x53, 0x1c, 0x83, 0xdb, 0x52, 0x37, 0x3a, 0xbe, 0x5e, 0xd5, 0xb7, 0x1f,
-       0x43, 0x74, 0xad, 0xa1, 0x03, 0xbe, 0x37, 0xad, 0x58, 0x0b, 0x3c, 0x4f,
-       0xb6, 0xf5, 0x50, 0xc7, 0x6f, 0xcc, 0x64, 0xd5, 0xb6, 0x7e, 0x30, 0xe9,
-       0xa4, 0xf8, 0x6a, 0x9a, 0x47, 0x3b, 0x04, 0x02, 0x1d, 0xdd, 0x30, 0x9a,
-       0xe6, 0x6b, 0xc8, 0x64, 0xbe, 0xb9, 0x83, 0x22, 0x94, 0x7a, 0x0b, 0x12,
-       0x0b, 0x28, 0xb5, 0x74, 0xac, 0xae, 0xde, 0x93, 0xf1, 0x9d, 0x09, 0x37,
-       0x52, 0x4d, 0x7e, 0xcc, 0x12, 0x36, 0xd9, 0x68, 0xc5, 0xa2, 0xb6, 0xd3,
-       0xc7, 0xa9, 0x96, 0x09, 0x7d, 0xc3, 0x4f, 0xbc, 0x26, 0x21, 0x77, 0x10,
-       0x90, 0xa8, 0xd2, 0xc4, 0xbf, 0x73, 0x73, 0x51, 0xec, 0x2e, 0xff, 0xd8,
-       0x61, 0xe7, 0x13, 0x25, 0x9f, 0xc4, 0x4f, 0x28, 0x2f, 0xd2, 0xbd, 0xec,
-       0x9b, 0x66, 0xc8, 0xb2, 0x33, 0x81, 0xc7, 0x97, 0x45, 0xf6, 0xfe, 0x4f,
-       0xc7, 0x75, 0xc4, 0x17, 0xc9, 0x2a, 0x6b, 0xd5, 0x8e, 0x0d, 0xd7, 0xa9,
-       0x0f, 0xe2, 0x2f, 0xfd, 0x2c, 0xcb, 0x61, 0x91, 0xa5, 0x3a, 0xf5, 0x8c,
-       0x0b, 0x0d, 0x41, 0x35, 0x8b, 0x17, 0xfa, 0xf8, 0x5a, 0xc0, 0xf7, 0x44,
-       0x3a, 0xe9, 0x08, 0xa8, 0xf0, 0xbb, 0xf4, 0x6e, 0xf1, 0x04, 0x61, 0xc0,
-       0x89, 0x74, 0x8f, 0x98, 0x28, 0xdc, 0x29, 0x8c, 0xfc, 0x37, 0x85, 0x31,
-       0x9b, 0x12, 0x46, 0xa1, 0x9f, 0x3e, 0x37, 0x88, 0xc9, 0xc2, 0xb0, 0xd8,
-       0x5d, 0xe0, 0x79, 0x49, 0x27, 0x34, 0xf7, 0x0f, 0x29, 0xc6, 0xfe, 0x80,
-       0x62, 0xec, 0x31, 0x8a, 0xb1, 0xcf, 0x93, 0x5d, 0x7f, 0xff, 0x2a, 0x96,
-       0x65, 0x5b, 0x4e, 0x32, 0x06, 0xf1, 0xfd, 0xbc, 0xf4, 0x12, 0xe9, 0x95,
-       0x65, 0xf6, 0x13, 0xb2, 0x61, 0x96, 0xc5, 0x7f, 0xe6, 0x9c, 0x40, 0xfa,
-       0xf8, 0xd0, 0xb2, 0xd9, 0xc7, 0x97, 0x31, 0x66, 0x1a, 0x16, 0x3b, 0x98,
-       0xae, 0x5a, 0xaa, 0xdb, 0x55, 0xc2, 0x21, 0xd9, 0x61, 0xb1, 0xb1, 0xc0,
-       0xd7, 0xf7, 0xe1, 0x3e, 0xaa, 0xff, 0xb6, 0xc6, 0xc2, 0x89, 0x6e, 0xc2,
-       0x48, 0x17, 0x54, 0x73, 0x71, 0x34, 0x46, 0x98, 0xe1, 0xc6, 0x2b, 0x54,
-       0xab, 0x22, 0xb9, 0x2d, 0xae, 0xe4, 0xf3, 0x76, 0x5e, 0xcd, 0xa5, 0xc1,
-       0x75, 0x3a, 0x1a, 0x9c, 0xaa, 0x72, 0x24, 0x89, 0xf0, 0xde, 0xb8, 0x03,
-       0x46, 0x8d, 0xee, 0xc2, 0x80, 0x55, 0x17, 0xae, 0x41, 0x66, 0x42, 0xe0,
-       0x65, 0xf2, 0x01, 0x17, 0xc9, 0xe8, 0x50, 0x27, 0x3e, 0x23, 0xb5, 0x0a,
-       0xaa, 0xe3, 0x4f, 0x9f, 0xa5, 0x9c, 0x73, 0x17, 0xe5, 0xd6, 0x89, 0xec,
-       0x0a, 0x04, 0x3b, 0x64, 0x34, 0x74, 0x38, 0xf1, 0x8d, 0xd2, 0xef, 0xe3,
-       0x4c, 0x63, 0xe4, 0xe0, 0x0b, 0xf0, 0xf8, 0x5e, 0x9a, 0x64, 0x7a, 0xf0,
-       0xbd, 0x3a, 0xaa, 0xd7, 0xb6, 0x12, 0x4e, 0x1a, 0x27, 0x1a, 0x7a, 0x3a,
-       0x22, 0x3d, 0xb7, 0x09, 0xf8, 0x6b, 0xf5, 0x1a, 0x8c, 0xb7, 0xfa, 0xe0,
-       0x57, 0x53, 0xe2, 0xd5, 0x02, 0xe5, 0x0d, 0xc7, 0x37, 0xc5, 0x5b, 0xb3,
-       0x3a, 0xf6, 0x96, 0xfb, 0xc5, 0x2f, 0x66, 0x65, 0x90, 0x4e, 0x28, 0x3e,
-       0x69, 0xc8, 0x10, 0x5d, 0x2e, 0xc2, 0x42, 0x2f, 0xdf, 0x21, 0x70, 0x9d,
-       0x9a, 0xc4, 0x77, 0x56, 0xb0, 0xcd, 0xdb, 0xb1, 0x2b, 0x98, 0x51, 0x42,
-       0x49, 0x47, 0xb7, 0x08, 0x52, 0xec, 0x6a, 0xc8, 0xf4, 0x88, 0x06, 0xc2,
-       0x9e, 0x0b, 0xa7, 0x37, 0x88, 0x05, 0x25, 0xc6, 0x9a, 0xf0, 0x2f, 0x24,
-       0xd9, 0x2c, 0x2c, 0x7d, 0x20, 0xd9, 0x18, 0xdf, 0xc5, 0xb6, 0x43, 0x39,
-       0x4a, 0xf6, 0xfd, 0x7a, 0x32, 0x89, 0x5b, 0x3b, 0xd6, 0x20, 0x64, 0xd9,
-       0xc7, 0xb0, 0xd8, 0x47, 0xf2, 0x4b, 0x5a, 0xfd, 0x07, 0xbf, 0xef, 0xc0,
-       0x24, 0x5c, 0x7e, 0x1d, 0x21, 0x89, 0x72, 0x43, 0xa9, 0x23, 0x32, 0xf8,
-       0x96, 0xe8, 0x15, 0xa3, 0x85, 0x80, 0x2f, 0x9d, 0x86, 0xbf, 0x8e, 0x74,
-       0x9c, 0x26, 0x1d, 0xef, 0x21, 0x1d, 0xef, 0xf9, 0x12, 0x1d, 0xef, 0x24,
-       0x1d, 0xef, 0x2f, 0xfc, 0x9d, 0xa5, 0x33, 0xa7, 0xae, 0x63, 0x94, 0x72,
-       0xee, 0x78, 0xab, 0xcd, 0x4f, 0x81, 0x30, 0xea, 0x9e, 0x58, 0xaf, 0x13,
-       0x1e, 0x9d, 0x62, 0x66, 0x2f, 0x3d, 0xd3, 0x5c, 0xb5, 0x65, 0xbf, 0xef,
-       0xc9, 0x74, 0xb7, 0x78, 0xd2, 0xf2, 0x2b, 0xc6, 0x8d, 0x49, 0x34, 0xaa,
-       0x3d, 0x34, 0x17, 0xdb, 0xca, 0x9d, 0x02, 0x4f, 0xb1, 0xbd, 0x7c, 0x93,
-       0x04, 0xcf, 0x36, 0x93, 0x12, 0x28, 0xb2, 0xdd, 0xf4, 0xd3, 0x6f, 0xb6,
-       0x9d, 0x0d, 0xa2, 0xb1, 0xf8, 0x45, 0xfb, 0x81, 0xdf, 0xa9, 0xb3, 0xfd,
-       0xb0, 0x1d, 0x0d, 0x0b, 0x67, 0x91, 0x7c, 0x96, 0xe6, 0x1f, 0x21, 0xba,
-       0x77, 0xa6, 0xf7, 0x3b, 0x99, 0x36, 0x59, 0x67, 0x3b, 0x62, 0xfb, 0xb9,
-       0x48, 0xb4, 0xb2, 0xcd, 0x5f, 0xed, 0xd9, 0xd0, 0xdf, 0xef, 0x4a, 0x50,
-       0xb7, 0x38, 0x6d, 0x1e, 0x38, 0x87, 0x73, 0xce, 0xe6, 0x78, 0xea, 0xb7,
-       0x6a, 0xba, 0x63, 0x57, 0x73, 0x39, 0xe7, 0x75, 0xc8, 0x0b, 0xf4, 0x80,
-       0xfe, 0x9d, 0xd6, 0x2b, 0x34, 0xdf, 0x10, 0xb4, 0x15, 0x90, 0x03, 0xfa,
-       0xa4, 0x3e, 0xd9, 0x4a, 0xf1, 0x96, 0xe6, 0x94, 0x33, 0x80, 0x9a, 0x11,
-       0xd8, 0x99, 0x10, 0x84, 0x47, 0x17, 0x91, 0xbf, 0xc1, 0xf0, 0xe8, 0x4a,
-       0x4f, 0x92, 0xee, 0x2d, 0x25, 0x7c, 0xbe, 0x58, 0xdf, 0x06, 0x33, 0x0b,
-       0xb9, 0x41, 0x1f, 0xc4, 0x27, 0xa3, 0x61, 0xff, 0x79, 0x28, 0xa9, 0xb3,
-       0x92, 0x52, 0xa1, 0x3c, 0x35, 0x34, 0x22, 0x94, 0xc1, 0xcb, 0x42, 0x49,
-       0x96, 0xac, 0x1e, 0xcf, 0x36, 0xb4, 0x5b, 0x58, 0x7c, 0x10, 0xd1, 0x02,
-       0x70, 0x1b, 0x01, 0xbc, 0x7b, 0x6e, 0x26, 0x9b, 0xd4, 0x3e, 0xe2, 0xd8,
-       0x9e, 0x3c, 0x43, 0x54, 0x2f, 0xce, 0x70, 0xcf, 0x68, 0x5b, 0xb5, 0x67,
-       0x34, 0x68, 0xf5, 0x8c, 0xce, 0x4b, 0x4a, 0x62, 0xbe, 0x67, 0x74, 0x05,
-       0x3c, 0x97, 0xd2, 0xef, 0xad, 0xce, 0xb7, 0xb4, 0x3a, 0x5f, 0x5b, 0x01,
-       0x22, 0x9a, 0x31, 0xcc, 0x1a, 0xd5, 0x43, 0xfc, 0x26, 0x1d, 0xae, 0x88,
-       0xda, 0x73, 0x18, 0x21, 0x44, 0xa9, 0xde, 0xbd, 0x9e, 0xf2, 0xa0, 0x3b,
-       0xb3, 0x03, 0x33, 0x9a, 0xd2, 0x37, 0x00, 0xb6, 0x9d, 0x6e, 0xec, 0xa3,
-       0x18, 0xba, 0xb7, 0xcc, 0xf5, 0xc8, 0xb0, 0x38, 0xcb, 0x76, 0xe3, 0xb4,
-       0xa5, 0x66, 0xaf, 0xff, 0x70, 0x75, 0xfd, 0x21, 0x6b, 0xfd, 0x0b, 0x92,
-       0xd2, 0x5f, 0x5d, 0x5f, 0xfb, 0x33, 0xa1, 0xa4, 0x68, 0xfd, 0x9e, 0x3d,
-       0xb4, 0xbe, 0x4b, 0xe5, 0xb5, 0x1f, 0xe6, 0xb5, 0xe9, 0x73, 0x08, 0xd7,
-       0x93, 0xdd, 0xbc, 0x57, 0x90, 0xc5, 0xbb, 0xb9, 0x35, 0xd8, 0x35, 0xb3,
-       0x06, 0x3b, 0xc9, 0xdf, 0xb6, 0x6a, 0x0d, 0x54, 0xa7, 0xa1, 0xde, 0xa7,
-       0xe2, 0xb2, 0x23, 0x22, 0xa4, 0xf5, 0xed, 0x2d, 0x84, 0x41, 0x4e, 0x34,
-       0xcb, 0xf8, 0xd4, 0x1c, 0x50, 0xd7, 0xf4, 0x39, 0x91, 0xfc, 0x7d, 0x0f,
-       0xfe, 0x5c, 0x22, 0xff, 0x7d, 0x67, 0x81, 0x40, 0xd2, 0x63, 0xd5, 0x1c,
-       0x09, 0xe1, 0x29, 0xfe, 0xd8, 0x69, 0xdb, 0x7b, 0x2b, 0x7c, 0x8d, 0x68,
-       0x68, 0x50, 0x6f, 0x40, 0x43, 0xa3, 0x6c, 0x38, 0xa8, 0x8e, 0x59, 0x4f,
-       0x21, 0xd1, 0xcc, 0xf5, 0x51, 0x3c, 0x35, 0x71, 0x65, 0xf9, 0xdf, 0x9b,
-       0x89, 0xeb, 0xf8, 0x39, 0x02, 0x15, 0x56, 0x4c, 0xfc, 0xb2, 0x39, 0xe2,
-       0xe4, 0xbf, 0x6d, 0x54, 0x97, 0xd6, 0x51, 0xf0, 0xed, 0xc1, 0x9e, 0xac,
-       0x92, 0xda, 0x43, 0x75, 0xe5, 0xfe, 0x48, 0x5b, 0xcf, 0x26, 0x51, 0x83,
-       0xd0, 0xc2, 0xf0, 0xe0, 0x00, 0x92, 0xcd, 0xf5, 0x55, 0x3a, 0x1e, 0x46,
-       0xb3, 0x8b, 0x9e, 0xe3, 0x79, 0xae, 0xb1, 0xa7, 0x22, 0xd9, 0x13, 0xdf,
-       0xe7, 0xef, 0x57, 0xef, 0xcb, 0xbf, 0xa3, 0x4f, 0xae, 0xfa, 0xaf, 0x4b,
-       0xbf, 0xec, 0xfa, 0xb1, 0x2f, 0xb9, 0xfe, 0x6f, 0xd5, 0xe7, 0x95, 0x46,
-       0xa7, 0x95, 0xfb, 0x93, 0x0e, 0xee, 0x4b, 0x3a, 0xf5, 0x42, 0xd7, 0x2e,
-       0xf5, 0x3f, 0x51, 0xcc, 0xe2, 0x7e, 0x04, 0xe7, 0xdb, 0x33, 0x56, 0x3f,
-       0xe2, 0xf8, 0x6f, 0x61, 0x4f, 0x8e, 0x1d, 0x6e, 0x51, 0x37, 0x6e, 0x98,
-       0x4d, 0xea, 0x1f, 0x51, 0x7d, 0xb2, 0x03, 0x03, 0x31, 0x0d, 0x63, 0x59,
-       0xa5, 0xef, 0x0e, 0xa8, 0xc9, 0x3b, 0x05, 0x4d, 0x54, 0x72, 0x0b, 0x69,
-       0xbc, 0x7a, 0x4f, 0x33, 0xa8, 0xe6, 0xaa, 0xa0, 0x96, 0x62, 0x8f, 0x53,
-       0xf5, 0xcb, 0x28, 0x05, 0x64, 0x67, 0x29, 0x28, 0xd7, 0x94, 0x5a, 0xe4,
-       0x5a, 0x1a, 0xe7, 0x1d, 0x57, 0x2e, 0xdf, 0x81, 0x1d, 0xb8, 0xbc, 0xdc,
-       0x63, 0x34, 0xeb, 0x8a, 0xbf, 0x59, 0xda, 0x81, 0x5d, 0x31, 0x7e, 0xb6,
-       0x9b, 0x6a, 0x2f, 0x88, 0xc6, 0x0c, 0x21, 0x5c, 0x5d, 0x60, 0x37, 0xd5,
-       0x97, 0x4b, 0x1c, 0x6a, 0xcf, 0xaf, 0x85, 0x53, 0x76, 0x97, 0x20, 0x7c,
-       0x19, 0x07, 0x0e, 0x76, 0xc2, 0xed, 0x5e, 0xa1, 0x0c, 0x9e, 0x10, 0xc3,
-       0x78, 0x36, 0x16, 0xe9, 0xdb, 0x2c, 0x42, 0xb2, 0x87, 0xee, 0xb9, 0x32,
-       0x10, 0x72, 0xc6, 0x70, 0xbb, 0x56, 0x28, 0x41, 0x87, 0x48, 0x62, 0x40,
-       0x55, 0xb5, 0x71, 0xc8, 0xb4, 0x26, 0x44, 0x6d, 0x46, 0xb9, 0x7c, 0x96,
-       0xb0, 0xd1, 0x95, 0xa5, 0xc3, 0xe8, 0x58, 0x1e, 0xd9, 0xdb, 0xef, 0x50,
-       0x65, 0xc2, 0x6c, 0xc2, 0x99, 0xf1, 0xe2, 0xa6, 0x03, 0xf3, 0xfd, 0x19,
-       0xd3, 0xfc, 0x38, 0x56, 0xb9, 0x97, 0x44, 0x28, 0xd7, 0x97, 0xa2, 0xb2,
-       0x97, 0xf0, 0x79, 0xdb, 0x01, 0xc6, 0x4b, 0x9c, 0x0f, 0x2a, 0x64, 0x37,
-       0xed, 0xc4, 0x63, 0x1f, 0x66, 0xd2, 0x8c, 0x9f, 0x74, 0x4c, 0x53, 0x6d,
-       0xa3, 0x8e, 0xb6, 0x50, 0xae, 0x4f, 0x60, 0x2e, 0xcd, 0x7d, 0x9c, 0x41,
-       0x92, 0x71, 0x3f, 0xd1, 0xbf, 0x81, 0xea, 0xda, 0x14, 0xc5, 0x2b, 0x96,
-       0xf1, 0x00, 0xf7, 0x6b, 0xa9, 0x96, 0xfe, 0x79, 0xd7, 0xd7, 0xc6, 0x20,
-       0xbb, 0xf5, 0xd7, 0xba, 0xae, 0x3f, 0x80, 0x46, 0xca, 0xe7, 0x3a, 0x55,
-       0x2e, 0x88, 0x46, 0x22, 0xda, 0x79, 0x44, 0x82, 0x2f, 0x93, 0x3e, 0x46,
-       0x54, 0x60, 0xa7, 0x55, 0x33, 0x3b, 0x61, 0x14, 0xd8, 0xa6, 0xe0, 0xae,
-       0xed, 0x6c, 0xc4, 0xfb, 0xb9, 0xa8, 0xd5, 0x0b, 0x32, 0xa8, 0x8e, 0x79,
-       0x49, 0x53, 0x52, 0x79, 0x7a, 0x6e, 0xa3, 0xff, 0x7f, 0xed, 0xa9, 0x8b,
-       0x43, 0xae, 0x53, 0xd9, 0xbf, 0xfe, 0xdc, 0x73, 0x96, 0x6c, 0xf4, 0xae,
-       0xc9, 0xbf, 0xf0, 0x7c, 0x12, 0xcf, 0x7b, 0x3e, 0x8a, 0x9b, 0x66, 0x82,
-       0x70, 0x65, 0x3f, 0xd5, 0xcd, 0x1f, 0x8f, 0x1a, 0x9e, 0xf3, 0x71, 0xee,
-       0xe9, 0x3a, 0xf1, 0x07, 0xf4, 0xfb, 0xe9, 0x51, 0x19, 0xb7, 0x16, 0x9b,
-       0xe1, 0x1a, 0x93, 0xc8, 0x3f, 0xd7, 0x52, 0xae, 0x72, 0xe0, 0x9e, 0xe8,
-       0x51, 0x54, 0x02, 0x0e, 0x1a, 0xb3, 0x9f, 0x7e, 0x73, 0x6f, 0xea, 0x71,
-       0x6c, 0xf6, 0xcf, 0x7a, 0xde, 0x8f, 0x33, 0xbd, 0x15, 0xa6, 0x97, 0x72,
-       0xe4, 0xed, 0xd8, 0x78, 0x07, 0x0c, 0x9f, 0x6e, 0xfd, 0xbb, 0x5f, 0xee,
-       0x6c, 0xc2, 0xe1, 0x5c, 0x33, 0x5e, 0xcc, 0x19, 0xee, 0x9f, 0x76, 0x46,
-       0x31, 0x38, 0x6a, 0xe2, 0x15, 0xcd, 0x18, 0xae, 0x25, 0x3b, 0x4f, 0x50,
-       0xad, 0x14, 0x5e, 0xae, 0xf8, 0x2f, 0x0b, 0x44, 0x24, 0x44, 0x86, 0x08,
-       0x2c, 0xde, 0x4d, 0xa1, 0x2b, 0x55, 0xaf, 0x47, 0xb4, 0xd7, 0x85, 0x59,
-       0x73, 0x6f, 0xa7, 0x93, 0x68, 0x00, 0xd6, 0x51, 0x4c, 0x9e, 0x4b, 0x47,
-       0x71, 0x6b, 0x44, 0xc6, 0xfa, 0xa2, 0x86, 0x17, 0xd3, 0x5e, 0xdc, 0x55,
-       0x8c, 0x13, 0x86, 0xf6, 0x13, 0xed, 0x09, 0x94, 0xd3, 0x01, 0x7c, 0xbd,
-       0xd8, 0x42, 0xf2, 0x0e, 0x62, 0x6d, 0x91, 0x31, 0x16, 0xe7, 0x67, 0xdd,
-       0xbd, 0x31, 0xde, 0x82, 0x1e, 0x8a, 0xdf, 0xb3, 0x69, 0xb8, 0xb7, 0xc7,
-       0x43, 0xe8, 0x2e, 0x46, 0x51, 0x24, 0x2c, 0x76, 0x3b, 0xcd, 0x79, 0x17,
-       0xe9, 0xa4, 0x9d, 0xea, 0xfb, 0x25, 0x11, 0x42, 0xa8, 0x45, 0xaf, 0x18,
-       0x26, 0xcc, 0x94, 0x28, 0x36, 0xe1, 0xfc, 0x18, 0xdb, 0xf9, 0x5b, 0x5d,
-       0xbb, 0x72, 0x7e, 0x84, 0x8a, 0xb8, 0x49, 0x06, 0xb6, 0x51, 0x95, 0x97,
-       0x2a, 0x12, 0xbd, 0xfb, 0x3a, 0xed, 0x7e, 0xec, 0x0d, 0xc5, 0xcf, 0xf9,
-       0x6d, 0x20, 0x3d, 0x7d, 0x72, 0x60, 0xd6, 0x73, 0x85, 0x64, 0xe0, 0xd3,
-       0x7f, 0xd4, 0xf5, 0xc6, 0x01, 0x20, 0x3a, 0xc5, 0xbc, 0x71, 0x7c, 0x0d,
-       0x27, 0x28, 0xbe, 0xb6, 0xcb, 0xf8, 0xb5, 0x49, 0xb5, 0x64, 0x68, 0x86,
-       0x7b, 0xff, 0xaa, 0x97, 0xe8, 0xf0, 0x23, 0x49, 0x6b, 0xdf, 0x56, 0xfc,
-       0xa1, 0xb9, 0x71, 0x61, 0x10, 0x5f, 0x8b, 0xd8, 0xb2, 0x7a, 0x9d, 0x74,
-       0x38, 0x3d, 0xd6, 0x8c, 0xb9, 0x31, 0xee, 0xad, 0x9c, 0xea, 0x3a, 0x34,
-       0x69, 0x62, 0x9d, 0x66, 0x78, 0x7e, 0xda, 0x79, 0x03, 0x1e, 0x38, 0x30,
-       0x72, 0xba, 0x86, 0xf4, 0x7a, 0x59, 0xbb, 0x1b, 0x8f, 0x4e, 0xe1, 0xab,
-       0xcd, 0xc0, 0x23, 0x41, 0x70, 0xff, 0x59, 0x09, 0x1d, 0x41, 0xa4, 0x67,
-       0x3b, 0x22, 0x7e, 0x55, 0x28, 0xda, 0x2b, 0x14, 0xab, 0xea, 0x08, 0x3b,
-       0xdc, 0x46, 0xb5, 0x7c, 0x0d, 0x79, 0xf0, 0x5d, 0x45, 0x27, 0xc9, 0x28,
-       0x88, 0xf2, 0x58, 0x0d, 0x24, 0xf2, 0x93, 0x0b, 0x2a, 0xd6, 0x35, 0x90,
-       0xac, 0x25, 0x21, 0x93, 0x9e, 0xdb, 0x71, 0x68, 0x74, 0x5e, 0x56, 0x5e,
-       0xdc, 0x42, 0x32, 0x7c, 0x76, 0xd4, 0xdc, 0xa1, 0xc6, 0x02, 0x24, 0x6b,
-       0x3f, 0xd1, 0x37, 0x2f, 0x27, 0x96, 0xdf, 0xbc, 0x9c, 0xee, 0xc6, 0xae,
-       0x39, 0x96, 0xdb, 0xbf, 0x47, 0x5e, 0xb3, 0x96, 0xdd, 0xad, 0x9b, 0x8c,
-       0xa2, 0xf9, 0xc0, 0x55, 0xd9, 0x31, 0x7d, 0x8f, 0x10, 0x1f, 0xdf, 0xf3,
-       0xad, 0x8c, 0x0c, 0x5e, 0x14, 0x5e, 0xa2, 0xc7, 0x4f, 0xba, 0x39, 0xeb,
-       0x62, 0x0c, 0x4e, 0x32, 0xb9, 0x2a, 0xe3, 0x20, 0xc9, 0x38, 0x38, 0xc5,
-       0xb2, 0xfe, 0x11, 0xc9, 0x1a, 0x78, 0x83, 0x70, 0xd7, 0xcd, 0xb1, 0x28,
-       0xea, 0x0f, 0x28, 0xc9, 0x66, 0x29, 0x9c, 0x68, 0x10, 0xa0, 0xea, 0x02,
-       0xed, 0xf5, 0xf8, 0x98, 0xe5, 0xac, 0x91, 0x9c, 0xbf, 0x37, 0x42, 0xfc,
-       0xac, 0xa1, 0xf9, 0xd6, 0x91, 0x9c, 0x93, 0xc4, 0xff, 0x6d, 0xd6, 0xbc,
-       0x2d, 0x34, 0xef, 0x06, 0xaa, 0x21, 0x66, 0x3d, 0x17, 0x88, 0x9e, 0xe8,
-       0xe7, 0xb4, 0x10, 0xca, 0x8e, 0x04, 0x2f, 0x52, 0xad, 0xbc, 0xd6, 0x1a,
-       0xe7, 0xa7, 0x71, 0x4c, 0xfb, 0x5b, 0xb5, 0x0e, 0xf5, 0xcb, 0x7a, 0xc7,
-       0x77, 0x83, 0x7b, 0x07, 0x06, 0xfa, 0xb1, 0x37, 0xbb, 0x81, 0x6a, 0x1e,
-       0x99, 0x30, 0xa4, 0x81, 0xef, 0xc7, 0x95, 0x68, 0xa3, 0xe0, 0xf8, 0x67,
-       0x90, 0x1f, 0x56, 0xa8, 0xde, 0x09, 0x87, 0xe6, 0x10, 0x94, 0x1d, 0x25,
-       0x99, 0xf0, 0x5e, 0x8b, 0x2c, 0x95, 0xc8, 0x5f, 0x83, 0xfd, 0x84, 0x93,
-       0x9d, 0x78, 0xb9, 0xe0, 0xc4, 0xab, 0xe9, 0x0d, 0x94, 0xe7, 0xdc, 0x84,
-       0x87, 0x0d, 0xb7, 0x73, 0xc5, 0x81, 0x1a, 0x3b, 0x26, 0x2f, 0x45, 0xef,
-       0xf8, 0xc3, 0xa8, 0xcb, 0x38, 0xfb, 0x28, 0x47, 0x6b, 0xb7, 0x91, 0x5c,
-       0xd6, 0x95, 0xf8, 0x7e, 0x0b, 0x32, 0xe9, 0x14, 0xb2, 0xd9, 0x30, 0xd5,
-       0x32, 0x4e, 0xe4, 0x9b, 0x5b, 0xac, 0xfe, 0x6c, 0x8e, 0xae, 0xe5, 0xca,
-       0x5f, 0xec, 0x1b, 0x7f, 0xab, 0xda, 0x2f, 0x1e, 0xa4, 0x9c, 0xd2, 0x4f,
-       0xd8, 0x73, 0x03, 0xc5, 0x77, 0x9b, 0xc6, 0xd9, 0x78, 0x1f, 0xf6, 0x14,
-       0xf4, 0xab, 0xf1, 0x63, 0xba, 0x60, 0xf7, 0x05, 0xb7, 0x90, 0x3c, 0xce,
-       0xa5, 0x4d, 0x3c, 0xaa, 0xb1, 0x3e, 0x29, 0x2e, 0xa5, 0xb9, 0x37, 0x68,
-       0xe2, 0x19, 0x4d, 0x70, 0xbc, 0xa1, 0x3c, 0xba, 0x01, 0x4b, 0x0a, 0x26,
-       0x4e, 0x6b, 0x2a, 0xc5, 0x2e, 0x18, 0x6e, 0xc2, 0x7e, 0x91, 0xd1, 0x7f,
-       0x31, 0xf3, 0xce, 0x21, 0xb4, 0x75, 0x02, 0x9b, 0x47, 0x25, 0xcc, 0xcd,
-       0x5c, 0xcd, 0xd1, 0x78, 0xf1, 0xf3, 0x3c, 0x9d, 0x98, 0x81, 0xb9, 0xc3,
-       0xa9, 0x2b, 0xc3, 0xbc, 0xd7, 0x32, 0x12, 0x57, 0x12, 0xb5, 0x56, 0xce,
-       0x56, 0xfb, 0x97, 0x48, 0x8a, 0x56, 0x12, 0x6d, 0xa9, 0x4f, 0x50, 0x59,
-       0x2f, 0x43, 0x09, 0xfe, 0x0c, 0x91, 0xe8, 0x20, 0xef, 0x29, 0x94, 0xed,
-       0xfc, 0xbd, 0xb4, 0x9a, 0xbf, 0xc3, 0x05, 0x8f, 0x50, 0xc7, 0x1c, 0xc8,
-       0xcf, 0x98, 0x94, 0x67, 0x05, 0x66, 0x49, 0xc1, 0x2f, 0x64, 0x77, 0xe0,
-       0xeb, 0x31, 0xd3, 0xbc, 0x2b, 0xae, 0x0e, 0x36, 0x4b, 0xf8, 0xd3, 0x06,
-       0xc2, 0x14, 0x64, 0xf7, 0x84, 0x01, 0x10, 0xda, 0xda, 0x69, 0x98, 0x32,
-       0xd5, 0x0c, 0x35, 0x3a, 0xf7, 0x1a, 0x7b, 0x45, 0x7b, 0x71, 0x83, 0xb8,
-       0xa1, 0xd8, 0x2f, 0x42, 0x87, 0xee, 0x14, 0xd1, 0xa7, 0x6c, 0xdc, 0xd6,
-       0x5a, 0xfc, 0xbc, 0x1f, 0xda, 0x43, 0x7c, 0xef, 0xd3, 0x4c, 0x3c, 0x4d,
-       0xbc, 0xed, 0x2d, 0xdb, 0xb5, 0xc8, 0xee, 0xb4, 0xcd, 0xdb, 0xa3, 0x74,
-       0xff, 0x62, 0x9a, 0xfd, 0xf1, 0x61, 0xab, 0xd7, 0xd9, 0x4c, 0xcf, 0xdc,
-       0x9c, 0x0d, 0x87, 0x06, 0x85, 0x32, 0x34, 0x0b, 0xee, 0x77, 0xb6, 0x55,
-       0x4e, 0x0a, 0xca, 0x3d, 0x12, 0xc7, 0x57, 0xf6, 0x79, 0x9b, 0xf6, 0x65,
-       0x05, 0x58, 0x71, 0x91, 0xe9, 0xbf, 0x91, 0xea, 0xbe, 0x9f, 0xa5, 0xdb,
-       0xfa, 0xdd, 0x24, 0xb6, 0xf3, 0xf1, 0x6e, 0x71, 0x89, 0xea, 0xbe, 0x57,
-       0xd3, 0xc9, 0x85, 0x75, 0xe8, 0x11, 0x17, 0x0a, 0x7d, 0xe2, 0xc3, 0x7c,
-       0x2f, 0x9c, 0x63, 0xf7, 0x8b, 0x77, 0xf3, 0x4c, 0x5b, 0xbf, 0x38, 0x33,
-       0x7b, 0xde, 0x92, 0xfd, 0x2e, 0x8d, 0xfb, 0x9a, 0xf5, 0xb5, 0xf0, 0x99,
-       0x04, 0x4f, 0x59, 0x8f, 0xdc, 0xe7, 0xb3, 0xfb, 0x43, 0xeb, 0xe2, 0x39,
-       0xd3, 0xa9, 0x72, 0xaf, 0x37, 0x68, 0xf1, 0x38, 0x43, 0x78, 0x79, 0x36,
-       0xbf, 0x41, 0x1c, 0x2e, 0xd8, 0xfc, 0x4d, 0x17, 0xd8, 0x6e, 0x65, 0xca,
-       0x0d, 0x5f, 0xcc, 0xcf, 0x06, 0xfc, 0x9d, 0x41, 0xd4, 0x58, 0xfd, 0x24,
-       0x13, 0xe3, 0x5a, 0x24, 0xf4, 0x0a, 0x82, 0x70, 0x96, 0xd8, 0xa6, 0x4d,
-       0x3c, 0xa7, 0xb9, 0x20, 0x8d, 0xcb, 0x24, 0x17, 0xb2, 0x21, 0x9f, 0x0b,
-       0x8e, 0x69, 0xae, 0x01, 0xe2, 0xb5, 0xdc, 0x67, 0x08, 0x39, 0xf8, 0xfb,
-       0x17, 0x6d, 0xcd, 0x45, 0x79, 0x80, 0xfb, 0xe3, 0x6f, 0xd6, 0xd8, 0x36,
-       0xc7, 0xf9, 0x68, 0xbe, 0xa7, 0x4d, 0x39, 0xb6, 0x93, 0x7b, 0xd9, 0x6e,
-       0xcc, 0xe5, 0x6a, 0xb8, 0xc5, 0xe0, 0xae, 0xe9, 0x34, 0x71, 0x4e, 0x73,
-       0x52, 0x5d, 0xf2, 0x10, 0xe5, 0x26, 0x07, 0x64, 0xf5, 0x6e, 0x94, 0x26,
-       0x9d, 0x0e, 0xde, 0x73, 0xfa, 0x59, 0x8c, 0x7b, 0x00, 0xc0, 0x7e, 0xe2,
-       0xe1, 0x99, 0x5c, 0x88, 0xea, 0x7f, 0xb9, 0x5a, 0x43, 0xfc, 0x01, 0x8e,
-       0xe7, 0x24, 0xd1, 0xac, 0x43, 0x4a, 0xac, 0x34, 0xf1, 0xc9, 0xf2, 0x48,
-       0xf4, 0x32, 0xc5, 0x2f, 0x3f, 0xe5, 0xaa, 0xdd, 0x85, 0x46, 0xfc, 0x2c,
-       0xd7, 0x88, 0x57, 0x73, 0xa4, 0xc3, 0xd8, 0x48, 0xbf, 0x87, 0x62, 0xe4,
-       0xd2, 0x98, 0x0b, 0x5b, 0x23, 0x86, 0xdf, 0x83, 0x28, 0xce, 0x25, 0xae,
-       0x47, 0x2a, 0x10, 0xee, 0x19, 0x41, 0x13, 0xde, 0xcc, 0x81, 0x30, 0x04,
-       0xdc, 0x4b, 0x68, 0x8e, 0xf7, 0x62, 0xc6, 0x90, 0x0b, 0x0a, 0xd5, 0x1f,
-       0x88, 0xd7, 0xc3, 0xac, 0x39, 0x19, 0xa7, 0x1c, 0x5d, 0x6c, 0x44, 0x6f,
-       0xae, 0x09, 0xfd, 0x94, 0xab, 0x56, 0xaf, 0x8c, 0xe3, 0xdd, 0xac, 0x57,
-       0xdc, 0x94, 0x1d, 0xe9, 0xf7, 0xd3, 0x9c, 0xae, 0xe5, 0xca, 0xd0, 0xb3,
-       0x04, 0xd8, 0x64, 0x84, 0xd9, 0xbc, 0xb7, 0xfb, 0x28, 0xde, 0x1e, 0x16,
-       0x9f, 0xe1, 0x49, 0xb2, 0xc1, 0x2d, 0x9a, 0x52, 0xb9, 0x20, 0x45, 0x4e,
-       0xaf, 0x87, 0x32, 0x7c, 0x9b, 0x30, 0xa2, 0x0d, 0x14, 0x47, 0x9a, 0xed,
-       0x18, 0x61, 0x44, 0x84, 0x4c, 0x98, 0xdc, 0x09, 0xb7, 0x6a, 0xa0, 0xa7,
-       0x93, 0x65, 0xea, 0x86, 0xfb, 0x29, 0xb2, 0x1b, 0xc7, 0x17, 0xfb, 0xf3,
-       0x8d, 0x78, 0x83, 0xf2, 0xe4, 0xeb, 0x39, 0xc8, 0xb5, 0x14, 0xfb, 0x3f,
-       0xa0, 0xd8, 0x7f, 0x2a, 0x36, 0x12, 0xe2, 0x98, 0x5f, 0x88, 0xe1, 0x5b,
-       0x04, 0x83, 0x5b, 0xbc, 0xb4, 0xe6, 0x26, 0xc1, 0xeb, 0x20, 0xb9, 0x58,
-       0xe7, 0xbe, 0x9a, 0xc5, 0x0f, 0xc5, 0x61, 0xe6, 0xe9, 0xff, 0x27, 0xed,
-       0xdb, 0x6b, 0xe1, 0x69, 0x22, 0x5d, 0xce, 0xf7, 0x24, 0xaf, 0xed, 0x47,
-       0x72, 0x1d, 0x63, 0xe3, 0xc2, 0x1a, 0xbd, 0x4e, 0xbc, 0x94, 0x63, 0x9b,
-       0x33, 0xf1, 0xbc, 0xa6, 0x51, 0xcd, 0xc2, 0xb5, 0xf6, 0x10, 0xd5, 0x2d,
-       0xdc, 0x27, 0x32, 0xdc, 0x27, 0x89, 0xc2, 0xbd, 0x39, 0xfc, 0x9e, 0x0c,
-       0x69, 0x59, 0x2d, 0xa6, 0x90, 0x77, 0x3a, 0x09, 0x6b, 0x70, 0x8c, 0x65,
-       0x3f, 0x7a, 0xab, 0x4b, 0xcd, 0xc3, 0xf0, 0xea, 0x3d, 0x30, 0x2c, 0xdf,
-       0xad, 0x13, 0x0f, 0x90, 0x8d, 0xbc, 0x1c, 0xab, 0x45, 0x9e, 0xea, 0x1e,
-       0xc2, 0xdf, 0xee, 0x3f, 0xa3, 0xe7, 0x13, 0x13, 0xd8, 0x13, 0x84, 0xf4,
-       0x5d, 0x3f, 0xfe, 0x02, 0x67, 0x5d, 0x8c, 0xcb, 0xe1, 0xee, 0x8b, 0x1b,
-       0x9e, 0xf5, 0xf1, 0x3a, 0x71, 0x7b, 0xae, 0x1d, 0x17, 0x27, 0x1b, 0xc9,
-       0xbe, 0x9b, 0xb0, 0x78, 0x3c, 0x88, 0xf7, 0x88, 0x96, 0x61, 0x8d, 0xb1,
-       0xba, 0x31, 0xdc, 0x0c, 0x65, 0x88, 0xea, 0xa1, 0xbe, 0x9f, 0x0b, 0xf6,
-       0x01, 0xa5, 0xe7, 0x0e, 0xe1, 0x81, 0x1a, 0x49, 0x92, 0xec, 0x4d, 0x73,
-       0x4c, 0x6b, 0xd3, 0xbc, 0xe0, 0xfe, 0xcf, 0xdd, 0xd8, 0x3f, 0xc7, 0xb4,
-       0x9c, 0xea, 0xba, 0x61, 0x96, 0x3f, 0x4f, 0x77, 0x5d, 0x6f, 0x7d, 0xbe,
-       0x56, 0xfd, 0xac, 0x74, 0x85, 0xac, 0xcf, 0x1f, 0xd1, 0x27, 0xf7, 0x99,
-       0xc3, 0x46, 0x8d, 0xf8, 0xbe, 0x8b, 0xfb, 0xcd, 0x49, 0xf0, 0xff, 0x71,
-       0x97, 0xdd, 0xaf, 0xbb, 0x1b, 0x86, 0xd5, 0x13, 0xf9, 0xb5, 0xd5, 0x8b,
-       0x0e, 0x91, 0x1b, 0xc8, 0xc4, 0x9f, 0x4c, 0x58, 0x2b, 0x10, 0xa3, 0xc2,
-       0xbc, 0x49, 0x36, 0x16, 0xeb, 0xfd, 0x54, 0x1b, 0xc8, 0xc4, 0xaf, 0x81,
-       0x3d, 0x9d, 0x02, 0xfb, 0x55, 0x1d, 0x3f, 0x2d, 0x70, 0x0c, 0x77, 0xe2,
-       0x99, 0xb4, 0x12, 0x4a, 0x89, 0x30, 0xd5, 0xf9, 0x0e, 0x84, 0x9a, 0xfb,
-       0xb1, 0x9f, 0xf2, 0xc9, 0x6c, 0x9a, 0xf3, 0x07, 0x7d, 0x52, 0x3c, 0x6f,
-       0xa0, 0xf8, 0xf3, 0xf1, 0xa8, 0x1d, 0xef, 0x8b, 0x71, 0x65, 0xef, 0x1f,
-       0x90, 0x4e, 0x9f, 0x2b, 0xf2, 0x9c, 0x06, 0xae, 0xac, 0x64, 0x1f, 0x56,
-       0xa2, 0x29, 0xc7, 0x7d, 0x08, 0xcd, 0x70, 0x6c, 0xa1, 0xe5, 0x68, 0xad,
-       0x83, 0xd9, 0x1a, 0xf4, 0xc5, 0x7b, 0x45, 0x7f, 0xa9, 0x8f, 0xf7, 0x14,
-       0xfc, 0x0b, 0xf4, 0x3b, 0xc5, 0x9a, 0x69, 0xee, 0x09, 0x6e, 0x10, 0x7d,
-       0x25, 0xee, 0x0b, 0x0e, 0x8b, 0x6f, 0x94, 0xd8, 0xe7, 0xe7, 0xfb, 0x83,
-       0xf3, 0xfa, 0xe7, 0xbe, 0xa0, 0xe1, 0x7e, 0x89, 0x64, 0xbf, 0x3d, 0xc7,
-       0x71, 0x58, 0x7a, 0xc0, 0x87, 0xe5, 0xc8, 0xbb, 0xe0, 0x3e, 0x11, 0xff,
-       0x1d, 0xdc, 0x45, 0xb8, 0x60, 0xb1, 0x6a, 0xeb, 0x6f, 0x75, 0xde, 0x81,
-       0xc4, 0x72, 0x12, 0xfa, 0x02, 0xd6, 0xe9, 0x00, 0xc5, 0xb3, 0x8c, 0x39,
-       0x18, 0x60, 0x5d, 0xb2, 0xbd, 0x59, 0x7d, 0x27, 0xca, 0x2b, 0x06, 0x22,
-       0x9d, 0x6e, 0xcc, 0xe6, 0x16, 0x51, 0x4d, 0x60, 0x62, 0xaf, 0x56, 0x8f,
-       0x5a, 0x2b, 0x06, 0xb8, 0x09, 0x47, 0x42, 0xf6, 0xd2, 0x3c, 0xe9, 0x31,
-       0x19, 0x1e, 0xba, 0x77, 0x92, 0x72, 0xd3, 0xfe, 0x4e, 0x7b, 0xee, 0xb6,
-       0xfc, 0x4d, 0xd8, 0x47, 0x1e, 0x5f, 0xaf, 0x46, 0x31, 0xea, 0xf7, 0x52,
-       0xac, 0xf9, 0x56, 0x75, 0xce, 0xcf, 0xc8, 0x36, 0x79, 0xbd, 0x4d, 0xb5,
-       0xb6, 0x1e, 0x96, 0xc9, 0x76, 0xed, 0x25, 0x1b, 0x75, 0xb4, 0xd6, 0xd6,
-       0xce, 0x0d, 0xe8, 0x19, 0xf5, 0x8a, 0x57, 0xd3, 0xf7, 0x98, 0xa1, 0x46,
-       0x1a, 0x47, 0x36, 0x5b, 0x53, 0xa5, 0xb7, 0x35, 0xff, 0xcf, 0xb5, 0x5c,
-       0xa7, 0x7b, 0x29, 0x8f, 0x3c, 0x98, 0x73, 0x20, 0x50, 0xbd, 0x1e, 0xcf,
-       0x87, 0xa0, 0x75, 0xd4, 0x01, 0x4d, 0x82, 0xae, 0xf1, 0xdc, 0xbc, 0x86,
-       0x8c, 0x46, 0xf2, 0x93, 0x6f, 0xc7, 0x13, 0xf8, 0x20, 0xeb, 0xc4, 0x7a,
-       0xca, 0xef, 0x6b, 0xd3, 0x3a, 0xce, 0x95, 0x6b, 0x79, 0x3d, 0xb2, 0xc3,
-       0xf9, 0x71, 0x4e, 0x1a, 0xe7, 0xc6, 0x74, 0xfe, 0x8b, 0xf4, 0x05, 0x88,
-       0xe6, 0x22, 0x8d, 0xe5, 0x7b, 0xe7, 0xad, 0xbe, 0xc0, 0xf1, 0x6b, 0xea,
-       0x29, 0xc7, 0x38, 0xf7, 0x8a, 0xec, 0x5c, 0xd0, 0xad, 0xb1, 0x2e, 0x7d,
-       0xb8, 0x3c, 0x61, 0xe0, 0xdc, 0xca, 0x06, 0x5c, 0x99, 0x68, 0xc5, 0x03,
-       0x39, 0x0f, 0x2e, 0x4c, 0x98, 0xb8, 0x69, 0x39, 0xee, 0x09, 0x12, 0x06,
-       0x6b, 0x20, 0xbf, 0xff, 0x29, 0xd5, 0x3c, 0x14, 0x4f, 0x89, 0xd2, 0x48,
-       0x62, 0x1d, 0xd9, 0x75, 0x34, 0x86, 0xd4, 0x2d, 0xf1, 0x48, 0xe8, 0x3c,
-       0xbe, 0x67, 0x52, 0x2c, 0xf6, 0x4b, 0x7a, 0xaf, 0x70, 0x5a, 0xfb, 0x84,
-       0x1b, 0xac, 0x7d, 0x45, 0xc7, 0xf4, 0xb0, 0x90, 0x4a, 0xd7, 0xfa, 0xf5,
-       0x97, 0xe5, 0x21, 0xce, 0x3d, 0x9c, 0x23, 0xc7, 0x4d, 0x97, 0xba, 0xc1,
-       0xea, 0xd3, 0xec, 0xce, 0x5f, 0xcd, 0x4d, 0x57, 0xf3, 0xd1, 0xce, 0x6a,
-       0x1e, 0x1a, 0x29, 0xbc, 0xf3, 0x05, 0xfc, 0x14, 0xaa, 0xee, 0x57, 0x70,
-       0xfe, 0x71, 0x8b, 0xb3, 0x64, 0x0e, 0x7b, 0xc8, 0x07, 0x8f, 0x6a, 0x27,
-       0x82, 0x94, 0x21, 0xe0, 0xec, 0x10, 0x78, 0x90, 0xcf, 0x8b, 0x04, 0x4c,
-       0xdc, 0xa9, 0xd9, 0xf6, 0xb0, 0xbc, 0xd3, 0x85, 0x41, 0xca, 0x49, 0xae,
-       0x98, 0x97, 0x7c, 0xdd, 0x8f, 0xd7, 0x34, 0xb6, 0xe1, 0x5b, 0xaa, 0x39,
-       0x89, 0xf7, 0xbf, 0xed, 0xbd, 0xea, 0xdf, 0xee, 0x5b, 0xcf, 0xdb, 0xa6,
-       0x86, 0xe4, 0x42, 0x78, 0xde, 0x8b, 0xab, 0x54, 0x37, 0xc8, 0x54, 0x33,
-       0xac, 0x47, 0x62, 0x81, 0x92, 0x64, 0xfd, 0xfb, 0x68, 0xee, 0x5f, 0x76,
-       0x0e, 0xe2, 0xfe, 0x71, 0x07, 0xea, 0x54, 0x8e, 0xb3, 0x06, 0xf6, 0x37,
-       0x72, 0x9c, 0xea, 0xc5, 0x8e, 0x71, 0xb7, 0x38, 0x99, 0x73, 0xe2, 0xc9,
-       0xbe, 0x47, 0xb0, 0xa0, 0x63, 0x4b, 0xb5, 0xd7, 0xc9, 0xdf, 0xbf, 0x89,
-       0xd4, 0x22, 0x5e, 0x9f, 0x7b, 0x68, 0x02, 0xde, 0x0e, 0xe6, 0x03, 0x9e,
-       0x8b, 0x34, 0xff, 0xe6, 0x51, 0xa7, 0x38, 0x9f, 0xfe, 0x1b, 0xf3, 0x48,
-       0x80, 0x71, 0x01, 0xdf, 0xab, 0x87, 0xd1, 0xc8, 0x63, 0x59, 0x87, 0x5e,
-       0xaa, 0x49, 0x07, 0x31, 0x4a, 0x74, 0xbd, 0x6e, 0xcd, 0x75, 0xb6, 0x4a,
-       0xbf, 0x57, 0x34, 0x64, 0x64, 0x23, 0x48, 0xb4, 0xf8, 0x57, 0xf6, 0xa1,
-       0xa1, 0x74, 0x6d, 0xbe, 0x25, 0xa3, 0xf7, 0x30, 0x7f, 0x9c, 0x13, 0x06,
-       0xf0, 0x41, 0x5a, 0xe0, 0x7d, 0xcb, 0x06, 0x07, 0xd0, 0x5a, 0xa0, 0xfa,
-       0xdf, 0x8a, 0x21, 0x3c, 0x2e, 0x6e, 0xdb, 0xb6, 0x63, 0x10, 0xdb, 0x89,
-       0x97, 0x7a, 0xe2, 0xe5, 0xe3, 0xd8, 0x12, 0x5a, 0x87, 0xaf, 0x1d, 0x93,
-       0xab, 0xfd, 0x87, 0xea, 0x5c, 0xab, 0xc0, 0xbd, 0x29, 0xa7, 0x1a, 0xc1,
-       0xb6, 0xf1, 0x48, 0xbf, 0xd7, 0xc1, 0x76, 0x18, 0xc1, 0x7d, 0xd3, 0x49,
-       0xba, 0xcf, 0x73, 0x05, 0xb1, 0x29, 0xe3, 0x14, 0xef, 0x52, 0x9d, 0x74,
-       0x3c, 0xed, 0x58, 0x24, 0xe1, 0x07, 0xe6, 0x93, 0x81, 0x1d, 0xb8, 0x45,
-       0xeb, 0xc5, 0xbd, 0x64, 0x83, 0xdd, 0xad, 0x3b, 0x30, 0x41, 0x36, 0xb0,
-       0xb9, 0x89, 0x6a, 0xb7, 0x58, 0xd9, 0x1c, 0x08, 0xb0, 0x1c, 0x05, 0x7a,
-       0xe8, 0x7a, 0x23, 0xd5, 0x73, 0x8e, 0x18, 0x59, 0x1b, 0xf9, 0x85, 0xac,
-       0x2a, 0xb9, 0x24, 0xea, 0xad, 0x35, 0x1b, 0x29, 0x4f, 0xbb, 0x18, 0x1f,
-       0xf8, 0x18, 0x27, 0x7c, 0x91, 0x1e, 0xc3, 0xac, 0x55, 0xd5, 0xe8, 0x7a,
-       0x47, 0x6b, 0x6e, 0x8e, 0x6c, 0x76, 0x4d, 0xc7, 0xb5, 0xcf, 0xcd, 0xcb,
-       0x48, 0x43, 0x4d, 0xc7, 0x8c, 0x59, 0xf1, 0x8f, 0xc0, 0xdf, 0x71, 0xad,
-       0xee, 0xe7, 0xe7, 0x60, 0x9a, 0xed, 0xb8, 0x16, 0x72, 0x44, 0xfc, 0xf7,
-       0xe0, 0xaf, 0x68, 0x8d, 0x20, 0x36, 0x96, 0x7a, 0x31, 0x30, 0x2e, 0x7d,
-       0x8e, 0x4f, 0x7c, 0x6c, 0xcb, 0x9f, 0xf3, 0xbf, 0x75, 0x3c, 0xd2, 0xe3,
-       0xa9, 0xf2, 0x7f, 0xef, 0xf4, 0xe7, 0x73, 0x0d, 0x67, 0x38, 0xaf, 0xf2,
-       0x7c, 0xbc, 0xef, 0x37, 0x2f, 0xdf, 0x20, 0xb6, 0x5b, 0xf3, 0xed, 0x75,
-       0xb3, 0x0f, 0xbb, 0xc8, 0xd7, 0xd7, 0x75, 0x18, 0x78, 0x2d, 0xf1, 0x80,
-       0xb9, 0xd5, 0x92, 0xc1, 0x9f, 0x58, 0xcf, 0xf7, 0xb4, 0x56, 0x2c, 0x7b,
-       0xb7, 0xfd, 0x96, 0xf7, 0x04, 0x78, 0x8f, 0x60, 0x7e, 0x5f, 0x20, 0x6a,
-       0xed, 0xd7, 0xd9, 0x7b, 0x03, 0xdf, 0xa2, 0x38, 0xcb, 0xfb, 0x06, 0xb2,
-       0x70, 0x8e, 0xd7, 0x09, 0xd7, 0x38, 0xd3, 0xf6, 0x81, 0x6c, 0xfb, 0xd8,
-       0x5f, 0x21, 0x19, 0xe0, 0xfe, 0xa4, 0x6d, 0xff, 0xd1, 0xce, 0xfb, 0x80,
-       0xa7, 0x0c, 0x77, 0xed, 0x0a, 0x50, 0x8d, 0xdf, 0x67, 0xd9, 0xc3, 0x75,
-       0xfa, 0xdb, 0xab, 0xfe, 0xb1, 0x95, 0xeb, 0x7c, 0xee, 0x09, 0xbe, 0xbb,
-       0x6a, 0xb2, 0x55, 0x22, 0x3c, 0xc5, 0x6b, 0xf2, 0xde, 0x02, 0xe7, 0x55,
-       0x2b, 0xee, 0x7a, 0x1a, 0x57, 0x18, 0xee, 0x05, 0x2b, 0x9c, 0x62, 0x51,
-       0xa6, 0x9f, 0x6c, 0x4f, 0x45, 0x22, 0x63, 0x78, 0x9a, 0x57, 0x84, 0xf0,
-       0x50, 0x66, 0x3e, 0x26, 0xb7, 0xa3, 0x7d, 0x0a, 0xf8, 0xdf, 0x99, 0x20,
-       0xda, 0x26, 0xc2, 0x43, 0xb7, 0x3b, 0xc2, 0xc3, 0xef, 0x38, 0xf8, 0x5e,
-       0xa1, 0xeb, 0x26, 0x0b, 0x7f, 0x1f, 0xed, 0x5a, 0x66, 0x7d, 0xbe, 0xdd,
-       0x75, 0x63, 0xe1, 0x6e, 0xa4, 0xe7, 0xdc, 0x97, 0xf3, 0x0e, 0x13, 0x0f,
-       0xc5, 0x1c, 0xf8, 0x9a, 0xf6, 0xd7, 0xe4, 0x5b, 0x82, 0x6c, 0xe3, 0x18,
-       0xe7, 0x60, 0x4b, 0xa7, 0xae, 0x15, 0x2a, 0xda, 0x32, 0x8d, 0x84, 0xd7,
-       0x9a, 0xa8, 0xe6, 0x6f, 0xc4, 0x0f, 0x73, 0x8c, 0xd7, 0x4c, 0x8a, 0xfb,
-       0x26, 0x5e, 0xef, 0x30, 0x86, 0x82, 0x50, 0x8c, 0x37, 0x85, 0x92, 0xba,
-       0xdd, 0xa1, 0x1c, 0x69, 0x72, 0xf8, 0xb1, 0x2f, 0x62, 0xe7, 0xd1, 0x4e,
-       0x2b, 0x6f, 0xbe, 0xd3, 0x65, 0xf7, 0xec, 0x4e, 0x56, 0xf3, 0xeb, 0xa9,
-       0x2e, 0x6d, 0x56, 0x39, 0x9a, 0x22, 0xff, 0x59, 0x48, 0xf1, 0x73, 0x3c,
-       0x9b, 0xb2, 0xce, 0x82, 0xfc, 0x32, 0x53, 0x43, 0xb6, 0x11, 0xd6, 0xc6,
-       0x11, 0x8e, 0x3e, 0x64, 0xd1, 0xfa, 0xb3, 0xae, 0x58, 0xa1, 0x8c, 0x8a,
-       0x53, 0x39, 0x08, 0x14, 0x09, 0x37, 0xb4, 0xf9, 0x5f, 0x46, 0x99, 0xfb,
-       0xa1, 0x56, 0xa0, 0x67, 0x1e, 0x5a, 0x0b, 0x40, 0x2e, 0xe3, 0xbe, 0x0c,
-       0xab, 0x17, 0xeb, 0xc0, 0x5a, 0x6d, 0x3b, 0xe1, 0x42, 0xde, 0xff, 0x15,
-       0x54, 0x63, 0x37, 0xa2, 0xb2, 0xc1, 0x89, 0xf1, 0x0c, 0xe7, 0xe1, 0x63,
-       0x5d, 0xf2, 0x28, 0x2a, 0x6e, 0x7b, 0x4f, 0x33, 0xe1, 0xa6, 0x0c, 0x3d,
-       0x57, 0x22, 0x4c, 0x4a, 0xb1, 0x63, 0x6b, 0xec, 0x37, 0x66, 0xb2, 0xd1,
-       0xde, 0x53, 0x19, 0x9d, 0x14, 0x58, 0xa0, 0x26, 0x31, 0x3a, 0xe7, 0xf4,
-       0xa5, 0xd3, 0x51, 0xa4, 0xcb, 0xfc, 0xbc, 0xfb, 0x72, 0xd2, 0x9a, 0x3f,
-       0xb2, 0x77, 0x89, 0xc3, 0x81, 0x65, 0x1d, 0x87, 0x50, 0x59, 0x68, 0xd3,
-       0x10, 0x24, 0x4c, 0xc0, 0x35, 0x6c, 0x13, 0xf1, 0x7a, 0xe7, 0xe3, 0x5c,
-       0x47, 0xfc, 0xa4, 0xeb, 0xe6, 0x29, 0xf6, 0xeb, 0x63, 0x5d, 0x1f, 0xa4,
-       0x95, 0x64, 0x93, 0x04, 0xb9, 0x8e, 0xf8, 0xbf, 0x6f, 0x94, 0xfb, 0x08,
-       0xbf, 0xe0, 0x3e, 0x02, 0xe5, 0x65, 0x65, 0xb8, 0x59, 0x78, 0xc5, 0xba,
-       0x0c, 0xd5, 0x15, 0x44, 0xf3, 0xa5, 0x88, 0xd2, 0x53, 0x22, 0x8c, 0xb2,
-       0x45, 0x50, 0x5d, 0x57, 0xb6, 0xe5, 0x65, 0x9f, 0xcd, 0xab, 0x5c, 0xc5,
-       0x21, 0x51, 0x0b, 0x77, 0xf0, 0x3e, 0x34, 0xe7, 0x71, 0x6b, 0x4f, 0x9f,
-       0xae, 0xff, 0xbc, 0x6b, 0x09, 0xd5, 0x16, 0x23, 0x4c, 0x1f, 0x78, 0xaf,
-       0x8f, 0x6a, 0xd0, 0xec, 0xf1, 0x2a, 0x2e, 0xf1, 0x56, 0xe5, 0xc2, 0xdf,
-       0xf9, 0x4c, 0xe2, 0x6b, 0x5d, 0x9b, 0x26, 0xf9, 0x8c, 0xe2, 0x4f, 0xba,
-       0xd6, 0x4c, 0x2a, 0xa1, 0x8d, 0xb4, 0xee, 0x6e, 0xde, 0x5f, 0xa7, 0x39,
-       0x67, 0x35, 0xa6, 0xbb, 0xd0, 0x75, 0x73, 0x96, 0x7b, 0xcb, 0xc7, 0xba,
-       0xcc, 0x6c, 0x98, 0x31, 0xa8, 0x65, 0x2b, 0x89, 0x02, 0x55, 0xf3, 0xd7,
-       0xd9, 0xbc, 0xba, 0x48, 0x1f, 0x87, 0xd2, 0x84, 0x76, 0xe2, 0xb6, 0x6e,
-       0x56, 0x17, 0xd6, 0x20, 0xd5, 0xd4, 0x4d, 0x35, 0xa8, 0xdf, 0xb7, 0x36,
-       0xd3, 0x8d, 0x09, 0xd2, 0xe1, 0xa6, 0x52, 0xd0, 0xd7, 0x9d, 0x51, 0x31,
-       0x50, 0xe2, 0x7a, 0xb3, 0xd2, 0xb5, 0x6b, 0x72, 0xaa, 0x5a, 0xff, 0xf6,
-       0x53, 0xcd, 0x4a, 0x76, 0x91, 0xb1, 0x6d, 0xae, 0xb5, 0x40, 0x34, 0x0b,
-       0x7b, 0x5e, 0x37, 0xad, 0x73, 0xfd, 0xe8, 0x77, 0xcd, 0xd0, 0x42, 0xb6,
-       0x85, 0xbb, 0xf1, 0xf8, 0x94, 0xcf, 0x08, 0xe8, 0x7e, 0x74, 0x76, 0x9c,
-       0xa2, 0x67, 0xdb, 0xf1, 0xf8, 0xe1, 0x5b, 0x90, 0xff, 0x23, 0x27, 0x2e,
-       0x66, 0x92, 0x58, 0xda, 0xf1, 0x55, 0x9c, 0xd9, 0x20, 0xe3, 0xef, 0x32,
-       0x5e, 0x5c, 0x22, 0xfe, 0x0c, 0x6b, 0x8e, 0x7f, 0xcf, 0xfe, 0x90, 0x5b,
-       0xb8, 0xc7, 0x35, 0xc6, 0x9e, 0xbf, 0xe7, 0x06, 0xf7, 0xde, 0x0c, 0xd4,
-       0x10, 0x0e, 0x0a, 0x13, 0xcd, 0x6a, 0x86, 0xcf, 0x38, 0x05, 0x7c, 0x9c,
-       0x2b, 0xa7, 0x89, 0x27, 0x47, 0xa9, 0xc5, 0xe7, 0x24, 0x7e, 0x9c, 0xa5,
-       0x73, 0x14, 0x03, 0xd8, 0x07, 0xdc, 0x97, 0x43, 0x96, 0x1d, 0x5c, 0xbb,
-       0xf6, 0x7e, 0x0f, 0xef, 0xf1, 0x1f, 0xcf, 0x72, 0x6c, 0x14, 0x54, 0xbb,
-       0x84, 0x90, 0x9c, 0x5d, 0x82, 0x9e, 0xd9, 0xed, 0x74, 0x5d, 0x45, 0x5f,
-       0xd5, 0xd7, 0x42, 0x05, 0x8f, 0x87, 0xf1, 0x49, 0x2e, 0x63, 0xff, 0x8e,
-       0x5c, 0xfd, 0xed, 0x16, 0x8d, 0xe3, 0x84, 0x1d, 0x11, 0xb7, 0xf2, 0xb0,
-       0xda, 0xf1, 0xef, 0xe2, 0xe5, 0x72, 0xca, 0xa2, 0x61, 0x37, 0xcd, 0xc5,
-       0xb2, 0x79, 0xce, 0x4c, 0xdd, 0xc9, 0xf2, 0x0b, 0xf8, 0x7e, 0x48, 0xfa,
-       0x98, 0xa4, 0x67, 0x1e, 0x27, 0x1e, 0xca, 0xc4, 0x5b, 0xb6, 0xf4, 0x5d,
-       0x1a, 0xc3, 0xf7, 0x40, 0xfa, 0x32, 0x14, 0x67, 0xf5, 0x6c, 0xe6, 0x08,
-       0xe5, 0xcb, 0x5a, 0x8a, 0x45, 0x67, 0xe3, 0xf7, 0x62, 0x6d, 0x4e, 0x49,
-       0x1a, 0x14, 0x2e, 0x53, 0x7e, 0x08, 0xa7, 0xce, 0x36, 0xfc, 0x36, 0xd9,
-       0x70, 0x0b, 0x61, 0x80, 0x70, 0xe8, 0x1c, 0x8d, 0x37, 0x9c, 0x32, 0x1e,
-       0x9b, 0x90, 0x70, 0x8e, 0xf7, 0x80, 0x85, 0xfd, 0xbc, 0x01, 0x1e, 0x3b,
-       0xff, 0xbd, 0x8e, 0xea, 0xba, 0x70, 0x82, 0xb2, 0xaa, 0x51, 0x4f, 0xb8,
-       0xbd, 0xd0, 0xf9, 0x08, 0xf6, 0x53, 0x7d, 0xbf, 0x35, 0x46, 0x32, 0x69,
-       0x8c, 0x53, 0xbd, 0xd1, 0x36, 0x74, 0x01, 0x7f, 0x67, 0x56, 0x78, 0x1f,
-       0x5d, 0x84, 0x13, 0x17, 0xf0, 0x99, 0x29, 0xa9, 0xea, 0xe9, 0x19, 0xa8,
-       0x95, 0x73, 0x68, 0x1b, 0xbe, 0x82, 0x0f, 0x4d, 0xde, 0x63, 0x97, 0x25,
-       0x89, 0x30, 0x60, 0xd8, 0xef, 0x44, 0x00, 0x95, 0x80, 0x84, 0x5b, 0x35,
-       0xee, 0x49, 0x2b, 0xc3, 0x4f, 0x13, 0x96, 0x7f, 0x5f, 0xb4, 0x0d, 0x7e,
-       0x8c, 0x33, 0x66, 0xbe, 0x91, 0xd7, 0x15, 0x48, 0xdc, 0xd8, 0x76, 0xba,
-       0x06, 0x4a, 0x8f, 0x4b, 0xa8, 0x89, 0x66, 0xe9, 0xaf, 0xcd, 0x33, 0x81,
-       0xcf, 0x4c, 0x35, 0xf2, 0x19, 0xe1, 0x20, 0x35, 0x38, 0x4d, 0x3e, 0x31,
-       0x88, 0x79, 0xda, 0xfe, 0x81, 0xf8, 0xd7, 0x88, 0x06, 0xc6, 0x7d, 0x86,
-       0x7b, 0x0f, 0xd1, 0xf6, 0x53, 0xc2, 0x01, 0x5b, 0x63, 0x17, 0xcc, 0xe4,
-       0x42, 0xeb, 0xfc, 0x5e, 0x9d, 0xdd, 0xfb, 0x66, 0x5f, 0xb9, 0x1b, 0x9b,
-       0xd2, 0x4e, 0x92, 0xd3, 0x3c, 0x5e, 0x73, 0x51, 0x0c, 0x66, 0x8c, 0x53,
-       0xb9, 0x9e, 0x4a, 0x33, 0xc7, 0xac, 0x0a, 0xec, 0xa2, 0xb8, 0xb0, 0xd3,
-       0xca, 0x05, 0xf0, 0x2c, 0x5e, 0xd1, 0x81, 0x2b, 0x53, 0xff, 0xc3, 0x43,
-       0xfa, 0x5b, 0xad, 0x2e, 0x87, 0x08, 0x66, 0x0c, 0xd1, 0xa0, 0x4b, 0xf8,
-       0xb8, 0x53, 0xe9, 0x71, 0x48, 0xc3, 0xb8, 0x31, 0x66, 0x98, 0x5e, 0x55,
-       0xed, 0x6f, 0x17, 0x91, 0xbe, 0x92, 0x88, 0xa2, 0xae, 0xe4, 0x95, 0xeb,
-       0x4a, 0xed, 0xb2, 0xa7, 0x64, 0xb8, 0xfd, 0x2b, 0xee, 0xa5, 0xba, 0x65,
-       0x07, 0xd5, 0xb6, 0x5e, 0xaa, 0xaf, 0x15, 0xb2, 0xc7, 0x1a, 0x92, 0x7f,
-       0x88, 0xe2, 0x80, 0x0e, 0x67, 0x66, 0x1b, 0x5c, 0x99, 0xb0, 0x7f, 0x37,
-       0x76, 0x20, 0x19, 0xb4, 0xb1, 0xad, 0x4c, 0xba, 0xaa, 0xed, 0x64, 0x2c,
-       0x73, 0x2f, 0xce, 0xe4, 0x19, 0x9f, 0x27, 0xb0, 0x31, 0xcd, 0xbf, 0xe1,
-       0x79, 0x39, 0xae, 0xe3, 0x28, 0xd5, 0x4e, 0xee, 0x8e, 0x66, 0xd2, 0x43,
-       0x0b, 0x46, 0xca, 0x82, 0x4d, 0x90, 0x74, 0x01, 0xcf, 0xd1, 0x4e, 0x19,
-       0xfb, 0x66, 0x28, 0x91, 0x50, 0x9e, 0x72, 0x92, 0x9d, 0xef, 0x26, 0x1b,
-       0xf2, 0xaa, 0x5e, 0xfa, 0x1d, 0xe0, 0x73, 0x47, 0x64, 0x93, 0x3f, 0xe9,
-       0x6a, 0xb7, 0x62, 0xcd, 0x2f, 0xa8, 0xc6, 0xf9, 0x15, 0xf1, 0xc2, 0xb2,
-       0xd0, 0x51, 0x37, 0x3e, 0x5f, 0x13, 0xae, 0xb9, 0xa3, 0x0e, 0x41, 0x9a,
-       0x33, 0x58, 0xdd, 0x23, 0x13, 0x58, 0x13, 0xeb, 0x40, 0x31, 0x27, 0xaa,
-       0x18, 0x6b, 0x44, 0xf1, 0x62, 0x35, 0xf6, 0x53, 0xed, 0xef, 0x53, 0x37,
-       0x22, 0xe3, 0xaf, 0x78, 0xde, 0x89, 0x73, 0x0d, 0x00, 0xcf, 0x00, 0x61,
-       0xa8, 0xd1, 0xf4, 0x57, 0x90, 0x5f, 0x08, 0xf7, 0x3d, 0x71, 0x3e, 0x9f,
-       0x49, 0x21, 0x4a, 0x5d, 0x8d, 0x86, 0xe5, 0xbd, 0xf8, 0xb8, 0x91, 0xf1,
-       0xaf, 0x97, 0x62, 0x83, 0x8c, 0xdd, 0x33, 0x01, 0xeb, 0x5c, 0x04, 0xc5,
-       0xc0, 0x2a, 0xcd, 0xd7, 0xd2, 0xfa, 0x65, 0x34, 0xb2, 0x4c, 0xfe, 0x6f,
-       0x34, 0x92, 0xcd, 0x12, 0xe6, 0xc9, 0xa5, 0x07, 0xf0, 0x4a, 0x9a, 0xe7,
-       0x0d, 0x27, 0x35, 0xe1, 0xe7, 0x9e, 0xbc, 0x25, 0x13, 0x63, 0x86, 0xd7,
-       0xf0, 0x5a, 0xb1, 0xc9, 0x5e, 0x27, 0xc0, 0xbd, 0xa2, 0xff, 0xe0, 0x5a,
-       0x1a, 0xe5, 0xc7, 0xd5, 0x54, 0x77, 0x46, 0xa1, 0x7e, 0xa3, 0x42, 0xfa,
-       0xe0, 0x1e, 0xf5, 0x12, 0xc2, 0xbc, 0x70, 0xbf, 0x1a, 0xe7, 0x73, 0xc8,
-       0xe6, 0x0e, 0x59, 0x37, 0x4d, 0x57, 0xa7, 0xea, 0x7f, 0x0f, 0x6c, 0x87,
-       0x5e, 0xde, 0xeb, 0x70, 0xef, 0xee, 0xf4, 0x62, 0x1f, 0xe5, 0xc0, 0x67,
-       0xd3, 0x6d, 0x06, 0xd7, 0x7e, 0x60, 0x1c, 0x2a, 0x52, 0xf4, 0xec, 0x50,
-       0x1d, 0x9f, 0x09, 0xda, 0x55, 0xde, 0x06, 0x47, 0xe6, 0xb6, 0x3a, 0xae,
-       0x37, 0x6a, 0xa8, 0x4e, 0x1e, 0x49, 0x33, 0xbd, 0xdc, 0x7b, 0x33, 0xcd,
-       0x9d, 0x71, 0xf5, 0xf2, 0x5a, 0xb2, 0x8b, 0x66, 0x9d, 0xe5, 0x18, 0xc0,
-       0x93, 0x34, 0x36, 0x54, 0x66, 0x59, 0x7e, 0xb7, 0x8e, 0xfb, 0x9d, 0x7b,
-       0x48, 0xbf, 0x0d, 0x59, 0x7b, 0x9e, 0x6c, 0x79, 0x10, 0x4b, 0x46, 0x5f,
-       0xa8, 0xb3, 0x6b, 0x1f, 0xae, 0xcb, 0x87, 0xb0, 0x27, 0x1d, 0xc0, 0x4c,
-       0xba, 0xcd, 0xff, 0x12, 0x9c, 0xd5, 0xbc, 0xca, 0xe7, 0x88, 0xe7, 0xc7,
-       0x04, 0x30, 0x7d, 0xf5, 0x3b, 0xcb, 0xc7, 0xee, 0x99, 0x1e, 0xb7, 0x30,
-       0xbf, 0x8c, 0x7c, 0xc0, 0xae, 0x63, 0x28, 0x56, 0x78, 0x1e, 0x25, 0xbd,
-       0xbe, 0x4f, 0x7a, 0x75, 0x90, 0x5e, 0x5f, 0xd2, 0xfe, 0x92, 0x31, 0x8b,
-       0x7b, 0x57, 0xdc, 0xcb, 0xfb, 0x43, 0x06, 0x81, 0x16, 0x6b, 0x4c, 0x26,
-       0xee, 0xc4, 0xeb, 0x94, 0x07, 0x6b, 0x28, 0xfe, 0x9d, 0x4a, 0x9b, 0xab,
-       0xe7, 0x62, 0x6d, 0xa9, 0xf7, 0x29, 0x4f, 0x1b, 0x7f, 0xa8, 0x68, 0x67,
-       0xc8, 0x4f, 0xb3, 0x13, 0x7f, 0x8a, 0x33, 0x8d, 0x6d, 0xfe, 0xb7, 0x60,
-       0xb8, 0x9f, 0x88, 0x3f, 0x42, 0x35, 0x3f, 0xd5, 0x0d, 0xcb, 0xff, 0x0b,
-       0x39, 0x59, 0x1c, 0x92, 0xda, 0x76, 0xf9, 0x25, 0xfc, 0x15, 0xce, 0x5c,
-       0x17, 0xd6, 0x5e, 0x02, 0x8f, 0xb1, 0xeb, 0xf1, 0xf0, 0xec, 0xfd, 0x7c,
-       0x1e, 0x2a, 0x48, 0xe9, 0xcc, 0xde, 0xc7, 0x4a, 0xf3, 0xbe, 0x9b, 0x40,
-       0x7e, 0x03, 0xd5, 0xd2, 0xd6, 0x39, 0x54, 0x78, 0x9e, 0x26, 0xbf, 0x88,
-       0x8e, 0xf1, 0xf8, 0x63, 0x5d, 0x6a, 0x21, 0x04, 0x89, 0x30, 0x0e, 0x61,
-       0x84, 0x1e, 0x3e, 0x9f, 0xf1, 0x74, 0x3a, 0x48, 0xb9, 0xa0, 0xad, 0x2f,
-       0x2a, 0xbe, 0x0d, 0x1b, 0x03, 0x70, 0x9e, 0x3b, 0x46, 0x79, 0x4e, 0x49,
-       0x3d, 0x8d, 0xb6, 0x7e, 0xaf, 0xb8, 0x1b, 0xa9, 0xc6, 0xb6, 0xc1, 0xa3,
-       0x08, 0x13, 0x66, 0x50, 0xa2, 0x67, 0x60, 0xcf, 0xb3, 0xb4, 0x20, 0x51,
-       0x9d, 0xc8, 0x71, 0x26, 0x8d, 0xa3, 0x7e, 0x09, 0x37, 0x74, 0xa8, 0x97,
-       0xa7, 0x31, 0x6f, 0x2f, 0xf6, 0x98, 0xd5, 0x05, 0x1a, 0x2f, 0xf9, 0x09,
-       0xdb, 0xd4, 0xc0, 0x49, 0xb5, 0xbf, 0xa4, 0x6f, 0xc3, 0xd6, 0x34, 0xe7,
-       0x69, 0x92, 0x0b, 0xf9, 0x66, 0x5f, 0x64, 0x1b, 0x86, 0x0a, 0x01, 0xec,
-       0xcf, 0x86, 0xf7, 0xee, 0x26, 0x5c, 0x37, 0x56, 0x0e, 0x87, 0x36, 0x8b,
-       0x00, 0xe9, 0x9b, 0xea, 0xff, 0xa6, 0x20, 0xd5, 0xc9, 0x7e, 0xfa, 0xb7,
-       0xeb, 0x99, 0x53, 0x54, 0xcf, 0xbc, 0x4e, 0xbe, 0xe6, 0xad, 0xd6, 0xaa,
-       0x4b, 0xf3, 0x26, 0xe6, 0x62, 0xeb, 0x71, 0xc9, 0xd2, 0x59, 0x90, 0x6c,
-       0x8c, 0x73, 0x08, 0x9f, 0x8d, 0x71, 0x8b, 0xcd, 0x63, 0x86, 0xfb, 0xc1,
-       0xce, 0x20, 0xe5, 0x34, 0xc6, 0x9c, 0x8e, 0x3f, 0x92, 0x48, 0x1e, 0x33,
-       0xea, 0x0e, 0xac, 0x8b, 0xed, 0xc0, 0x90, 0xf6, 0x5d, 0xd4, 0x34, 0x71,
-       0x3c, 0x92, 0x8d, 0x06, 0x9a, 0xf7, 0x42, 0x67, 0x2f, 0xc2, 0x4f, 0x31,
-       0x3e, 0xfa, 0x19, 0xe1, 0x23, 0xf6, 0x5d, 0x9e, 0xbf, 0x51, 0x5f, 0x46,
-       0xb8, 0xa2, 0xbe, 0xd3, 0xce, 0xf3, 0x37, 0x16, 0xf8, 0x4c, 0x26, 0xa8,
-       0x36, 0x85, 0xe7, 0xdd, 0x95, 0x3a, 0x9e, 0xa0, 0x18, 0x93, 0x58, 0xee,
-       0x02, 0x16, 0xf0, 0xd9, 0x63, 0xbb, 0x8e, 0x61, 0x7e, 0x97, 0x14, 0x04,
-       0x66, 0xe3, 0x64, 0x1f, 0xff, 0xea, 0x8c, 0x51, 0xa8, 0x7a, 0x36, 0x94,
-       0xfb, 0x27, 0x07, 0xcc, 0x24, 0xbf, 0x33, 0xe0, 0xa8, 0xf3, 0x52, 0xbc,
-       0x0d, 0x56, 0x20, 0x79, 0x39, 0x2e, 0x4b, 0xea, 0xbc, 0xdc, 0x59, 0xd6,
-       0x47, 0x38, 0xbe, 0x5b, 0xba, 0x70, 0xd2, 0x33, 0xbb, 0x26, 0x95, 0xe1,
-       0xdd, 0x68, 0x1b, 0xfa, 0x40, 0xd4, 0x5a, 0x3b, 0x97, 0xd3, 0xed, 0x48,
-       0x2d, 0xd6, 0x9d, 0x1b, 0xae, 0x64, 0x57, 0x13, 0x1d, 0xe7, 0x4c, 0x5c,
-       0xb7, 0xc6, 0xda, 0xdf, 0x9a, 0x6e, 0xff, 0x73, 0x9a, 0x9b, 0xbf, 0x3f,
-       0xe0, 0xe5, 0x33, 0x93, 0xc7, 0xb3, 0x2f, 0x9a, 0xd1, 0x85, 0xb6, 0x7c,
-       0x4e, 0x90, 0xef, 0x07, 0x75, 0x07, 0x9a, 0xd5, 0xc8, 0xe5, 0x7e, 0xfa,
-       0xfd, 0xb7, 0x05, 0x42, 0xfb, 0x2b, 0x07, 0xf1, 0xab, 0xbc, 0x8e, 0xc7,
-       0x28, 0x0f, 0x34, 0xa8, 0x8a, 0x3f, 0xcf, 0xfb, 0xd7, 0x31, 0x9b, 0xff,
-       0x9b, 0xf2, 0xe4, 0x87, 0x8d, 0x7e, 0xab, 0xc6, 0xb0, 0xf9, 0x2b, 0x10,
-       0x7f, 0x03, 0x5e, 0xf6, 0x85, 0xc5, 0xe4, 0x17, 0x7b, 0xc9, 0x5f, 0x1f,
-       0x23, 0x5b, 0xa3, 0x0a, 0x9e, 0xfc, 0x40, 0xd9, 0x0b, 0xf2, 0xd7, 0xb1,
-       0x34, 0xcb, 0x3f, 0xe8, 0x1b, 0x18, 0xe5, 0xb8, 0x6b, 0xf5, 0x55, 0xb5,
-       0x90, 0x83, 0xe3, 0xae, 0x15, 0x4f, 0x8d, 0x90, 0xe3, 0xd7, 0x75, 0x4c,
-       0xd7, 0x48, 0x39, 0x1c, 0xf4, 0xf0, 0x79, 0x7e, 0x02, 0x87, 0x03, 0x9a,
-       0x9d, 0x2b, 0xe7, 0x28, 0x1f, 0x5d, 0x22, 0x3a, 0xf6, 0xc7, 0x9a, 0x91,
-       0xa2, 0x7c, 0x94, 0x51, 0x6d, 0x5b, 0x52, 0x67, 0x19, 0x63, 0xfe, 0x82,
-       0x30, 0xa6, 0x12, 0x72, 0x49, 0x6d, 0xc3, 0x27, 0xb1, 0xcd, 0x3c, 0xd3,
-       0xc8, 0x36, 0xe5, 0xc2, 0xe1, 0xf6, 0x59, 0xb3, 0x12, 0x60, 0x7e, 0x25,
-       0xbc, 0xa8, 0x91, 0xcd, 0x5c, 0x17, 0x0e, 0xbe, 0x48, 0x39, 0x75, 0xa6,
-       0xaa, 0x8f, 0x70, 0x61, 0xde, 0x1e, 0x63, 0x2c, 0xeb, 0x68, 0x0a, 0x6a,
-       0xa2, 0x80, 0x3f, 0xa6, 0xef, 0xad, 0xc1, 0x4b, 0x55, 0x5b, 0x5d, 0x36,
-       0xfb, 0xdf, 0xbd, 0xd5, 0x77, 0x6c, 0xac, 0x67, 0x42, 0x85, 0xfb, 0xe9,
-       0x37, 0xcf, 0x19, 0xe0, 0xb3, 0x2d, 0x7c, 0xd6, 0xca, 0xb3, 0xb5, 0xb3,
-       0x86, 0xfd, 0xc5, 0xcf, 0xef, 0x15, 0xac, 0x1b, 0xe3, 0xbe, 0x30, 0xf7,
-       0x68, 0x24, 0xec, 0xbe, 0xfa, 0xde, 0x03, 0x7f, 0xf6, 0xe0, 0xd6, 0x31,
-       0xee, 0x45, 0x9c, 0xb8, 0x59, 0xc6, 0x3f, 0x51, 0x1e, 0x96, 0xd9, 0xe7,
-       0xc9, 0xd7, 0x7f, 0xd4, 0x75, 0x6a, 0x92, 0x73, 0xea, 0xdb, 0x5d, 0x9b,
-       0xd2, 0xf3, 0x3a, 0xbe, 0xca, 0xd3, 0xe9, 0x7b, 0x28, 0xee, 0x64, 0xd2,
-       0xca, 0x70, 0x44, 0xb2, 0xf6, 0xd5, 0x52, 0x25, 0xf1, 0x15, 0x2a, 0xd2,
-       0x78, 0xbe, 0x5e, 0xf4, 0x8f, 0x85, 0xa8, 0xb6, 0xf1, 0xfb, 0x1e, 0x38,
-       0x60, 0x52, 0xae, 0x70, 0xe2, 0xe9, 0xd1, 0xb0, 0xf6, 0x26, 0xe1, 0x9d,
-       0x67, 0x46, 0x4d, 0xf3, 0x4d, 0x0d, 0x7f, 0xd2, 0x40, 0x35, 0x72, 0xbb,
-       0x50, 0x12, 0x84, 0x0d, 0x42, 0xeb, 0x45, 0x5b, 0xb0, 0x00, 0xe5, 0xf4,
-       0x4e, 0x9a, 0xef, 0x50, 0x11, 0x78, 0xb1, 0xe8, 0xc1, 0x0b, 0x63, 0xdc,
-       0xfb, 0xf3, 0xa0, 0xf4, 0x54, 0x93, 0x6f, 0xdb, 0x81, 0x10, 0xc5, 0x58,
-       0x19, 0xbd, 0x87, 0x12, 0xb8, 0xf5, 0x80, 0x40, 0x34, 0x92, 0x40, 0xcf,
-       0xa1, 0x7a, 0xac, 0x1f, 0x93, 0x71, 0x31, 0x5e, 0x8f, 0xdb, 0x9e, 0x9a,
-       0xe7, 0xe3, 0x9d, 0x6a, 0x9d, 0x27, 0x5b, 0xe7, 0xd8, 0x8e, 0x66, 0x39,
-       0x66, 0x53, 0xbe, 0xc8, 0x72, 0x0c, 0x34, 0xcd, 0x60, 0xa7, 0xdd, 0xe7,
-       0x78, 0x8e, 0xf2, 0xc7, 0x13, 0x9d, 0x6a, 0x30, 0xe8, 0xd0, 0x71, 0xc3,
-       0x44, 0xe5, 0xdb, 0x0d, 0x30, 0x8f, 0xf3, 0x1e, 0xc6, 0xa7, 0xed, 0xa6,
-       0x79, 0x6b, 0x3c, 0x72, 0x99, 0x2a, 0x3b, 0xf2, 0xa9, 0xb7, 0xc9, 0xa7,
-       0x5a, 0xf0, 0x44, 0x76, 0x7e, 0xaf, 0x4b, 0xed, 0xbf, 0x20, 0x19, 0x3b,
-       0xfc, 0x30, 0x3f, 0xa9, 0xd5, 0xcd, 0x4f, 0x5d, 0x7a, 0x24, 0xb8, 0x5d,
-       0xf0, 0x19, 0x11, 0xee, 0x89, 0x9b, 0xe6, 0xd9, 0xb8, 0x69, 0x16, 0xe3,
-       0x86, 0x7b, 0xd9, 0x0a, 0x3f, 0x0e, 0x2d, 0xe5, 0x77, 0x0d, 0xc2, 0xc9,
-       0x66, 0xb2, 0x2f, 0xcf, 0x52, 0x35, 0xb8, 0x91, 0xea, 0x2b, 0x83, 0x82,
-       0x5c, 0x68, 0xa1, 0xd2, 0x0f, 0xb4, 0xf8, 0xf6, 0x8f, 0x36, 0xe1, 0x99,
-       0xb9, 0xdf, 0xe5, 0xe3, 0x39, 0x56, 0x3f, 0xed, 0x13, 0x0d, 0xab, 0x1b,
-       0x10, 0x49, 0x6e, 0x01, 0xf7, 0x46, 0xf9, 0x4c, 0xaa, 0x81, 0xdb, 0xe2,
-       0x83, 0xd8, 0x3a, 0xc6, 0xfb, 0x6b, 0x3f, 0xef, 0xfa, 0x64, 0xcc, 0xfc,
-       0x5b, 0x37, 0xd1, 0xbf, 0xba, 0xb3, 0x2d, 0xe5, 0xb1, 0xde, 0x55, 0x3a,
-       0x49, 0x75, 0x40, 0x23, 0xca, 0x33, 0x6a, 0x65, 0xb1, 0x48, 0xbe, 0xe9,
-       0x45, 0x24, 0xd8, 0x4c, 0xb1, 0x6a, 0x8e, 0x7c, 0x77, 0xa6, 0xcc, 0x75,
-       0xc0, 0x2f, 0xbb, 0xcc, 0x89, 0x45, 0x98, 0x9e, 0xa3, 0xb9, 0xb2, 0x6a,
-       0xcf, 0x47, 0x84, 0xf3, 0xea, 0x74, 0xb3, 0xc1, 0xa3, 0x47, 0x4e, 0xb7,
-       0x09, 0x09, 0x97, 0x97, 0x9b, 0x66, 0x6f, 0xa7, 0x3a, 0x5c, 0x2f, 0x30,
-       0xe4, 0xd0, 0xd5, 0x44, 0xbb, 0x84, 0xaf, 0x06, 0x11, 0xe9, 0x39, 0x8b,
-       0x48, 0xff, 0x39, 0x8a, 0x61, 0xcf, 0x96, 0xf9, 0x9c, 0xef, 0x23, 0xf8,
-       0xdb, 0xb1, 0x85, 0x38, 0x3e, 0xf3, 0x50, 0xb5, 0x27, 0x06, 0xcf, 0x8d,
-       0x2b, 0x74, 0x1c, 0x26, 0xbd, 0x9e, 0xd4, 0x6a, 0x28, 0xae, 0xcb, 0x70,
-       0xb4, 0x42, 0x6e, 0xa4, 0x3a, 0x21, 0xf6, 0xb8, 0x69, 0x2e, 0x6b, 0xb5,
-       0x6b, 0x9e, 0x65, 0xb3, 0xd7, 0xbe, 0xa3, 0x30, 0xdf, 0xef, 0x09, 0x92,
-       0xfe, 0xda, 0x52, 0x5b, 0xc5, 0x49, 0xd3, 0xf8, 0x43, 0x41, 0x3c, 0xdf,
-       0x56, 0x0f, 0x0f, 0xf3, 0x2d, 0x63, 0xe7, 0x04, 0xf7, 0xe1, 0x58, 0x6f,
-       0xf0, 0xf4, 0xc4, 0x79, 0x9f, 0x9c, 0x75, 0x54, 0xf1, 0xac, 0x8b, 0x53,
-       0x4c, 0x14, 0x3e, 0xc2, 0x53, 0x86, 0xbb, 0x9b, 0xf2, 0x53, 0xed, 0x18,
-       0xbf, 0x2f, 0xe1, 0xc5, 0x63, 0x14, 0x37, 0x2e, 0x69, 0x75, 0xd8, 0xdf,
-       0xc8, 0xb6, 0xc3, 0x74, 0x72, 0xcf, 0x70, 0x1b, 0xee, 0xe5, 0x77, 0x4e,
-       0xca, 0xbf, 0x6b, 0x9d, 0x0d, 0xa4, 0x6b, 0x84, 0x0d, 0x98, 0x8e, 0xf9,
-       0xf5, 0x7b, 0xb0, 0x78, 0x94, 0xf5, 0x78, 0xac, 0x2b, 0x48, 0x32, 0x7a,
-       0x82, 0xec, 0xc2, 0xa1, 0x77, 0x43, 0x26, 0x5b, 0x5c, 0x1b, 0xbf, 0x76,
-       0x0e, 0x75, 0xe8, 0x9c, 0x44, 0xf5, 0x9d, 0xc4, 0xfb, 0x79, 0x4a, 0xe2,
-       0x88, 0xb8, 0x76, 0xce, 0x7c, 0x3d, 0xf7, 0x13, 0x8d, 0x19, 0x3b, 0x2f,
-       0x1d, 0xa6, 0xbc, 0xf4, 0x4a, 0x8e, 0x7d, 0xe4, 0x17, 0x96, 0x8f, 0x38,
-       0x28, 0xd6, 0xae, 0x49, 0x87, 0x70, 0x4e, 0x83, 0x5a, 0x83, 0x18, 0xd1,
-       0x1d, 0xe9, 0xe9, 0xae, 0x62, 0x3e, 0x17, 0xc5, 0xff, 0x99, 0x9c, 0x32,
-       0x68, 0xf5, 0x9f, 0x54, 0xa5, 0x8f, 0x3f, 0x79, 0xef, 0x3f, 0xa8, 0x0f,
-       0xa1, 0x61, 0x25, 0x70, 0x7e, 0x94, 0xfb, 0x55, 0xbc, 0xcf, 0x35, 0x2c,
-       0xae, 0xf0, 0x7b, 0x61, 0xb5, 0x43, 0x78, 0x2f, 0xce, 0xef, 0x5b, 0xb1,
-       0xef, 0x3d, 0x0c, 0xf6, 0xbd, 0x06, 0x1a, 0xfb, 0xc9, 0x68, 0x38, 0xd4,
-       0x43, 0x7e, 0x33, 0x00, 0xeb, 0xbc, 0x90, 0x36, 0x6b, 0xf7, 0xc7, 0x93,
-       0xa7, 0xaa, 0xfb, 0x5b, 0x91, 0xea, 0xde, 0x5c, 0xb4, 0xd0, 0x23, 0x2e,
-       0x15, 0x98, 0xa6, 0xb7, 0x89, 0xa6, 0x6e, 0xf1, 0xe1, 0xec, 0x3a, 0x71,
-       0x71, 0xb6, 0x57, 0x9c, 0x2d, 0x70, 0x4c, 0xfe, 0x79, 0xd7, 0xae, 0x1c,
-       0xe7, 0xb3, 0x3b, 0xc5, 0xbb, 0xf9, 0x0d, 0xe2, 0x42, 0xa1, 0x5f, 0x7c,
-       0x34, 0x6b, 0xe0, 0xfe, 0x78, 0x2f, 0x0a, 0x63, 0xf0, 0xbb, 0xf5, 0xfb,
-       0xc5, 0xa5, 0xbc, 0xdd, 0x27, 0xbc, 0x50, 0x68, 0xf1, 0x15, 0xd2, 0x5c,
-       0x03, 0x1f, 0xa3, 0x1a, 0x78, 0x91, 0xef, 0x99, 0xc9, 0x80, 0xaf, 0x34,
-       0xa9, 0x0c, 0xde, 0x23, 0x4c, 0xf3, 0xb6, 0xd8, 0x69, 0xd6, 0xa1, 0xf9,
-       0x5a, 0xcc, 0xc6, 0x07, 0x3b, 0x49, 0x1e, 0x9b, 0x29, 0xb7, 0x4c, 0x6b,
-       0x6d, 0x55, 0x2c, 0xc2, 0xb6, 0xce, 0xbc, 0x72, 0xae, 0xe6, 0xfd, 0xa7,
-       0x21, 0x38, 0x3b, 0x81, 0xbd, 0xe9, 0xcf, 0x79, 0xbd, 0x44, 0xbc, 0x1a,
-       0xae, 0x21, 0x7c, 0x4c, 0xbc, 0xbe, 0x3e, 0xfa, 0xf9, 0x7e, 0x9e, 0x93,
-       0xc6, 0xee, 0x4a, 0x87, 0x53, 0x47, 0x84, 0x52, 0x29, 0xd8, 0xfb, 0x79,
-       0x9a, 0x57, 0x52, 0x4e, 0x8f, 0x50, 0x1d, 0xd1, 0x2a, 0xd9, 0xbc, 0x26,
-       0xaa, 0xbc, 0xde, 0x44, 0xbc, 0x5e, 0x2c, 0x70, 0x7d, 0xfe, 0x76, 0xd7,
-       0x1b, 0xa3, 0x63, 0x66, 0x3d, 0xd5, 0xff, 0x75, 0x6a, 0xb7, 0xb8, 0x40,
-       0x3c, 0x7f, 0x48, 0x3c, 0x7f, 0x5c, 0xb8, 0x53, 0x7c, 0x44, 0x7c, 0x5e,
-       0x2c, 0xf0, 0x1e, 0x9e, 0x5b, 0x7c, 0x98, 0xb3, 0x79, 0xfc, 0xf0, 0x2a,
-       0x8f, 0x41, 0xdf, 0xfe, 0x74, 0x93, 0xef, 0xd1, 0x49, 0xbf, 0x6f, 0xcf,
-       0xa4, 0x69, 0x7e, 0xa8, 0x49, 0x3e, 0xe6, 0xeb, 0x55, 0xed, 0x8b, 0x7c,
-       0xdd, 0x4c, 0x7c, 0xf1, 0xfe, 0xeb, 0x6f, 0xeb, 0x70, 0x9e, 0xaf, 0xc7,
-       0xac, 0x73, 0x6c, 0xf6, 0x19, 0xa9, 0x7a, 0xde, 0x83, 0x25, 0xbe, 0x7c,
-       0x74, 0xfd, 0x95, 0x7f, 0xcd, 0xd7, 0xe0, 0x05, 0xd2, 0x5f, 0xb1, 0xca,
-       0x57, 0xfd, 0xbf, 0xc9, 0x17, 0xd5, 0xba, 0x63, 0xcc, 0x57, 0xa3, 0xfe,
-       0xc6, 0x98, 0x49, 0xfa, 0x92, 0xac, 0x77, 0xc1, 0x8a, 0xd9, 0x1d, 0x78,
-       0x25, 0xc6, 0xef, 0xc7, 0x45, 0x42, 0x47, 0x28, 0x9e, 0xce, 0x96, 0x3d,
-       0xa2, 0xc6, 0xda, 0x87, 0xc5, 0x1b, 0xb5, 0x44, 0xd3, 0xe1, 0x19, 0x7e,
-       0xff, 0x0b, 0x1a, 0x61, 0x01, 0x3f, 0xbf, 0x37, 0x37, 0x0d, 0xee, 0x97,
-       0xf5, 0x8a, 0x86, 0x22, 0xef, 0xbb, 0x6e, 0x10, 0xbe, 0x22, 0x9f, 0xa3,
-       0xeb, 0x11, 0xde, 0x62, 0xb7, 0xf0, 0x1c, 0x32, 0x4c, 0x8f, 0xba, 0x4e,
-       0xd4, 0x1d, 0xba, 0x53, 0x78, 0xaa, 0x7b, 0xb0, 0xee, 0x62, 0xd0, 0x97,
-       0xbe, 0x46, 0x1e, 0x17, 0xb5, 0x9b, 0x2d, 0x79, 0xbc, 0xa6, 0xcd, 0xef,
-       0x1f, 0x5a, 0xe7, 0x10, 0xf9, 0x1c, 0x9c, 0x27, 0x48, 0xb5, 0x53, 0x43,
-       0xb5, 0x76, 0x7a, 0x37, 0xc6, 0xe7, 0x7b, 0x0c, 0x92, 0x3f, 0x42, 0x4e,
-       0x5d, 0xe9, 0x3f, 0x21, 0xd4, 0xd4, 0xfd, 0x22, 0x79, 0xab, 0x97, 0xea,
-       0x9f, 0xad, 0xb1, 0x48, 0xf2, 0x06, 0x11, 0x49, 0x38, 0x05, 0xe7, 0x15,
-       0x4d, 0xae, 0x2d, 0x19, 0xd8, 0x43, 0xf1, 0xed, 0xe5, 0x9c, 0x83, 0xb0,
-       0x03, 0xbf, 0x43, 0xe6, 0xc4, 0x5a, 0xbf, 0x17, 0x4f, 0x12, 0xee, 0x78,
-       0x22, 0x3b, 0x88, 0x27, 0x0b, 0x03, 0x78, 0xa2, 0xf0, 0xaf, 0xde, 0x95,
-       0x91, 0x3d, 0xfa, 0xf9, 0x95, 0xd5, 0x33, 0x08, 0x89, 0xeb, 0x23, 0x1c,
-       0xa3, 0x1f, 0x6e, 0x97, 0x23, 0x5c, 0xeb, 0xbe, 0x75, 0xf3, 0x07, 0x2a,
-       0xfb, 0xa2, 0xba, 0xe2, 0x94, 0x85, 0x45, 0x1e, 0x59, 0x7e, 0xc8, 0x3a,
-       0x1b, 0x95, 0xbe, 0x69, 0x97, 0xf5, 0x4e, 0xe7, 0x3b, 0x2b, 0x36, 0xa9,
-       0xec, 0x0f, 0x0f, 0xc7, 0xd7, 0x58, 0xf9, 0xf5, 0x6f, 0x56, 0xd9, 0x3d,
-       0x9a, 0x77, 0x56, 0x5d, 0x6f, 0xf7, 0xd1, 0x56, 0x45, 0xad, 0xcf, 0x33,
-       0xab, 0xec, 0xfd, 0xed, 0x4f, 0x57, 0xb5, 0x5a, 0x9f, 0xe7, 0x57, 0xd9,
-       0x3e, 0xf5, 0xee, 0x2a, 0xd5, 0xfa, 0xfc, 0x87, 0x55, 0x76, 0x5e, 0xbe,
-       0xb4, 0x6a, 0xc9, 0xd5, 0xf7, 0x63, 0xf8, 0xef, 0xff, 0x00, 0x88, 0xf4,
-       0x23, 0x6f, 0xec, 0x3a, 0x00, 0x00, 0x00 };
-
-static const u32 bnx2_TXP_b09FwData[(0x0/4) + 1] = { 0x0 };
-static const u32 bnx2_TXP_b09FwRodata[(0x30/4) + 1] = {
-       0x80000940, 0x80000900, 0x80080100, 0x80080080, 0x80080000, 0x800e0000,
-       0x80080080, 0x80080000, 0x80000a80, 0x80000a00, 0x80000980, 0x80000900,
-       0x00000000 };
-
-static struct fw_info bnx2_txp_fw_09 = {
-       /* Firmware version: 4.6.15 */
-       .ver_major                      = 0x4,
-       .ver_minor                      = 0x6,
-       .ver_fix                        = 0xf,
-
-       .start_addr                     = 0x08000098,
-
-       .text_addr                      = 0x08000000,
-       .text_len                       = 0x3ae8,
-       .text_index                     = 0x0,
-       .gz_text                        = bnx2_TXP_b09FwText,
-       .gz_text_len                    = sizeof(bnx2_TXP_b09FwText),
-
-       .data_addr                      = 0x00000000,
-       .data_len                       = 0x0,
-       .data_index                     = 0x0,
-       .data                           = bnx2_TXP_b09FwData,
-
-       .sbss_addr                      = 0x08003b40,
-       .sbss_len                       = 0x6c,
-       .sbss_index                     = 0x0,
-
-       .bss_addr                       = 0x08003bac,
-       .bss_len                        = 0x24c,
-       .bss_index                      = 0x0,
-
-       .rodata_addr                    = 0x08003ae8,
-       .rodata_len                     = 0x30,
-       .rodata_index                   = 0x0,
-       .rodata                         = bnx2_TXP_b09FwRodata,
-};
-
index 00a78e8677b01431a30bff2690884ca005e43bdb..ad5ef25add3e0dde70a1ab8c7f2d01c5116dd81d 100644 (file)
@@ -10979,16 +10979,16 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
                goto err_out_release;
        }
 
-       if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
                bp->flags |= USING_DAC_FLAG;
-               if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK) != 0) {
+               if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
                        printk(KERN_ERR PFX "pci_set_consistent_dma_mask"
                               " failed, aborting\n");
                        rc = -EIO;
                        goto err_out_release;
                }
 
-       } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) {
+       } else if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
                printk(KERN_ERR PFX "System does not support DMA,"
                       " aborting\n");
                rc = -EIO;
index 0effefa1b882036813a3b5e2401ed4b4fc126888..f5222764061c4677b8e9ac2f2661d3f5b7eb0107 100644 (file)
@@ -5074,10 +5074,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
 
 
        /* Configure DMA attributes. */
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                pci_using_dac = 1;
                err = pci_set_consistent_dma_mask(pdev,
-                                                 DMA_64BIT_MASK);
+                                                 DMA_BIT_MASK(64));
                if (err < 0) {
                        dev_err(&pdev->dev, "Unable to obtain 64-bit DMA "
                               "for consistent allocations\n");
@@ -5085,7 +5085,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
                }
 
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        dev_err(&pdev->dev, "No usable DMA configuration, "
                               "aborting.\n");
index 9b6011e7678e3552d51b9692d53aad4477724519..fa06994f973770e4f46c27d902e8fc0c7a28ed10 100644 (file)
@@ -1056,17 +1056,17 @@ static int __devinit init_one(struct pci_dev *pdev,
                goto out_disable_pdev;
        }
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                pci_using_dac = 1;
 
-               if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) {
+               if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
                        CH_ERR("%s: unable to obtain 64-bit DMA for "
                               "consistent allocations\n", pci_name(pdev));
                        err = -ENODEV;
                        goto out_disable_pdev;
                }
 
-       } else if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) != 0) {
+       } else if ((err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) != 0) {
                CH_ERR("%s: no usable DMA configuration\n", pci_name(pdev));
                goto out_disable_pdev;
        }
index 2c2aaa741450a9e57e1101be652782386dee22d6..ab0e5febef83302f1b19fdda095a8e54e7029a60 100644 (file)
@@ -3038,15 +3038,15 @@ static int __devinit init_one(struct pci_dev *pdev,
                goto out_release_regions;
        }
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                pci_using_dac = 1;
-               err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (err) {
                        dev_err(&pdev->dev, "unable to obtain 64-bit DMA for "
                               "coherent allocations\n");
                        goto out_disable_device;
                }
-       } else if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) != 0) {
+       } else if ((err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) != 0) {
                dev_err(&pdev->dev, "no usable DMA configuration\n");
                goto out_disable_device;
        }
index c749e9fb47ef9d99922946f42013ab21951b5eb4..4a1b554654ebe573a159e515a7795b22af049a88 100644 (file)
@@ -714,7 +714,7 @@ rio_interrupt (int irq, void *dev_instance)
 
 static inline dma_addr_t desc_to_dma(struct netdev_desc *desc)
 {
-       return le64_to_cpu(desc->fraginfo) & DMA_48BIT_MASK;
+       return le64_to_cpu(desc->fraginfo) & DMA_BIT_MASK(48);
 }
 
 static void
index 0504db9ad6434c50bf1e9585b5a00b2090f7db26..5c0b457c7868aa40b527c845ad34a16ea9804a12 100644 (file)
@@ -2604,7 +2604,7 @@ static int __devinit e100_probe(struct pci_dev *pdev,
                goto err_out_disable_pdev;
        }
 
-       if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
+       if ((err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) {
                DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
                goto err_out_free_res;
        }
index 93b861d032b50cf1284d444bcb1132811dd5df94..ddc5c533e89c41d6e9468c7b3051301ffd0b2429 100644 (file)
@@ -962,13 +962,13 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        if (err)
                return err;
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK) &&
-           !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
+           !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
                pci_using_dac = 1;
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
-                       err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (err) {
                                E1000_ERR("No usable DMA configuration, "
                                          "aborting\n");
@@ -2335,6 +2335,12 @@ static void e1000_set_rx_mode(struct net_device *netdev)
        int mta_reg_count = (hw->mac_type == e1000_ich8lan) ?
                                E1000_NUM_MTA_REGISTERS_ICH8LAN :
                                E1000_NUM_MTA_REGISTERS;
+       u32 *mcarray = kcalloc(mta_reg_count, sizeof(u32), GFP_ATOMIC);
+
+       if (!mcarray) {
+               DPRINTK(PROBE, ERR, "memory allocation failed\n");
+               return;
+       }
 
        if (hw->mac_type == e1000_ich8lan)
                rar_entries = E1000_RAR_ENTRIES_ICH8LAN;
@@ -2401,22 +2407,34 @@ static void e1000_set_rx_mode(struct net_device *netdev)
        }
        WARN_ON(uc_ptr != NULL);
 
-       /* clear the old settings from the multicast hash table */
-
-       for (i = 0; i < mta_reg_count; i++) {
-               E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
-               E1000_WRITE_FLUSH();
-       }
-
        /* load any remaining addresses into the hash table */
 
        for (; mc_ptr; mc_ptr = mc_ptr->next) {
+               u32 hash_reg, hash_bit, mta;
                hash_value = e1000_hash_mc_addr(hw, mc_ptr->da_addr);
-               e1000_mta_set(hw, hash_value);
+               hash_reg = (hash_value >> 5) & 0x7F;
+               hash_bit = hash_value & 0x1F;
+               mta = (1 << hash_bit);
+               mcarray[hash_reg] |= mta;
        }
 
+       /* write the hash table completely, write from bottom to avoid
+        * both stupid write combining chipsets, and flushing each write */
+       for (i = mta_reg_count - 1; i >= 0 ; i--) {
+               /*
+                * If we are on an 82544 has an errata where writing odd
+                * offsets overwrites the previous even offset, but writing
+                * backwards over the range solves the issue by always
+                * writing the odd offset first
+                */
+               E1000_WRITE_REG_ARRAY(hw, MTA, i, mcarray[i]);
+       }
+       E1000_WRITE_FLUSH();
+
        if (hw->mac_type == e1000_82542_rev2_0)
                e1000_leave_82542_rst(adapter);
+
+       kfree(mcarray);
 }
 
 /* Need to wait a few seconds after link up to get diagnostic information from
index bfb2d6c85c544cb8fa856f7b34900bac7c44756f..409b58cad0e50df0c34e77f6f31a943b0c306029 100644 (file)
@@ -2203,7 +2203,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
        /* Setup the HW Tx Head and Tail descriptor pointers */
        tdba = tx_ring->dma;
        tdlen = tx_ring->count * sizeof(struct e1000_tx_desc);
-       ew32(TDBAL, (tdba & DMA_32BIT_MASK));
+       ew32(TDBAL, (tdba & DMA_BIT_MASK(32)));
        ew32(TDBAH, (tdba >> 32));
        ew32(TDLEN, tdlen);
        ew32(TDH, 0);
@@ -2459,7 +2459,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
         * the Base and Length of the Rx Descriptor Ring
         */
        rdba = rx_ring->dma;
-       ew32(RDBAL, (rdba & DMA_32BIT_MASK));
+       ew32(RDBAL, (rdba & DMA_BIT_MASK(32)));
        ew32(RDBAH, (rdba >> 32));
        ew32(RDLEN, rdlen);
        ew32(RDH, 0);
@@ -4763,16 +4763,16 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
                return err;
 
        pci_using_dac = 0;
-       err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (!err) {
-               err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (!err)
                        pci_using_dac = 1;
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        err = pci_set_consistent_dma_mask(pdev,
-                                                         DMA_32BIT_MASK);
+                                                         DMA_BIT_MASK(32));
                        if (err) {
                                dev_err(&pdev->dev, "No usable DMA "
                                        "configuration, aborting\n");
index 03403a51f7eae0f95cb26a3517c2b4d22536a149..9080f07da8fe01f23e81a52eef0690151017b47c 100644 (file)
@@ -1685,15 +1685,15 @@ static int __devinit enic_probe(struct pci_dev *pdev,
         * fail to 32-bit.
         */
 
-       err = pci_set_dma_mask(pdev, DMA_40BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(40));
        if (err) {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        printk(KERN_ERR PFX
                                "No usable DMA configuration, aborting.\n");
                        goto err_out_release_regions;
                }
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        printk(KERN_ERR PFX
                                "Unable to obtain 32-bit DMA "
@@ -1701,7 +1701,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
                        goto err_out_release_regions;
                }
        } else {
-               err = pci_set_consistent_dma_mask(pdev, DMA_40BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(40));
                if (err) {
                        printk(KERN_ERR PFX
                                "Unable to obtain 40-bit DMA "
index a858c6ff80ddd7517df1fac3ef90eafc64d81a28..d37465020bccf3bab911986409c19cccdf4e1885 100644 (file)
@@ -5632,12 +5632,12 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                np->desc_ver = DESC_VER_3;
                np->txrxctl_bits = NVREG_TXRXCTL_DESC_3;
                if (dma_64bit) {
-                       if (pci_set_dma_mask(pci_dev, DMA_39BIT_MASK))
+                       if (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(39)))
                                dev_printk(KERN_INFO, &pci_dev->dev,
                                        "64-bit DMA failed, using 32-bit addressing\n");
                        else
                                dev->features |= NETIF_F_HIGHDMA;
-                       if (pci_set_consistent_dma_mask(pci_dev, DMA_39BIT_MASK)) {
+                       if (pci_set_consistent_dma_mask(pci_dev, DMA_BIT_MASK(39))) {
                                dev_printk(KERN_INFO, &pci_dev->dev,
                                        "64-bit DMA (consistent) failed, using 32-bit ring buffers\n");
                        }
@@ -6117,6 +6117,9 @@ static int nv_resume(struct pci_dev *pdev)
 
        pci_write_config_dword(pdev, NV_MSI_PRIV_OFFSET, NV_MSI_PRIV_VALUE);
 
+       /* restore phy state, including autoneg */
+       phy_init(dev);
+
        netif_device_attach(dev);
        if (netif_running(dev)) {
                rc = nv_open(dev);
index ad8be7e78290da315d4a8a2d649dc6334f3d2855..de3f49f991a3d61c3f25362414b649c673cf2612 100644 (file)
@@ -580,7 +580,7 @@ static int __devinit hp100_probe1(struct net_device *dev, int ioaddr,
                         * Also, we can have EISA Busmaster cards (not tested),
                         * so beware !!! - Jean II */
                        if((bus == HP100_BUS_PCI) &&
-                          (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK))) {
+                          (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32)))) {
                                /* Gracefully fallback to shared memory */
                                goto busmasterfail;
                        }
index a815e17a0ab407a4dabd4a86af4beb47a679d853..77e4b5b52fc808f0c2b5bfdfd17435b74ed6de4f 100644 (file)
@@ -1229,7 +1229,7 @@ static int emac_link_differs(struct emac_instance *dev)
 static void emac_link_timer(struct work_struct *work)
 {
        struct emac_instance *dev =
-               container_of((struct delayed_work *)work,
+               container_of(to_delayed_work(work),
                             struct emac_instance, link_work);
        int link_poll_interval;
 
index 03aa9593dd9e2d0e9efdc3660a5c25c5e88570ab..6b0697c565b95bbd055b35b995eed55eaa9a73c8 100644 (file)
@@ -1154,15 +1154,15 @@ static int __devinit igb_probe(struct pci_dev *pdev,
                return err;
 
        pci_using_dac = 0;
-       err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (!err) {
-               err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (!err)
                        pci_using_dac = 1;
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
-                       err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (err) {
                                dev_err(&pdev->dev, "No usable DMA "
                                        "configuration, aborting\n");
index 170b12d1d70e49e2ab02918b41e1236bd9544a84..cbc63ff13add7be86cbf22aca2c00ea61ec2b83b 100644 (file)
@@ -1226,17 +1226,17 @@ static int __devinit ioc3_probe(struct pci_dev *pdev,
        int err, pci_using_dac;
 
        /* Configure DMA attributes. */
-       err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (!err) {
                pci_using_dac = 1;
-               err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (err < 0) {
                        printk(KERN_ERR "%s: Unable to obtain 64 bit DMA "
                               "for consistent allocations\n", pci_name(pdev));
                        goto out;
                }
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        printk(KERN_ERR "%s: No usable DMA configuration, "
                               "aborting.\n", pci_name(pdev));
index 360aa5e35fda8fae42198d6e2250bd3d15bf226b..43019461b7766fbbba0b03ec433715ae44c8af8d 100644 (file)
@@ -2240,9 +2240,9 @@ static int __devinit ipg_probe(struct pci_dev *pdev,
 
        pci_set_master(pdev);
 
-       rc = pci_set_dma_mask(pdev, DMA_40BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(40));
        if (rc < 0) {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc < 0) {
                        printk(KERN_ERR "%s: DMA config failed.\n",
                               pci_name(pdev));
index 4b0ea66d7a445e4345db9575745778acf9ce67bf..4a0826b8f6f2bda1498f72fe5d9314ec33f07210 100644 (file)
@@ -365,12 +365,12 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (err)
                return err;
 
-       if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) &&
-           !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) {
+       if (!(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) &&
+           !(err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))) {
                pci_using_dac = 1;
        } else {
-               if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) ||
-                   (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) {
+               if ((err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) ||
+                   (err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))) {
                        printk(KERN_ERR
                         "ixgb: No usable DMA configuration, aborting\n");
                        goto err_dma_mask;
index 286ecc0e6ab75148c8ff08513c1776fe68f5cf04..9ef128ae6458e7fd0a913e496ec4364789d3b879 100644 (file)
@@ -1643,7 +1643,7 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter)
                tdba = ring->dma;
                tdlen = ring->count * sizeof(union ixgbe_adv_tx_desc);
                IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
-                               (tdba & DMA_32BIT_MASK));
+                               (tdba & DMA_BIT_MASK(32)));
                IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
                IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j), tdlen);
                IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0);
@@ -1782,7 +1782,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
        for (i = 0; i < adapter->num_rx_queues; i++) {
                rdba = adapter->rx_ring[i].dma;
                j = adapter->rx_ring[i].reg_idx;
-               IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j), (rdba & DMA_32BIT_MASK));
+               IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j), (rdba & DMA_BIT_MASK(32)));
                IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
                IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j), rdlen);
                IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
@@ -4509,13 +4509,13 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
        if (err)
                return err;
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK) &&
-           !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
+           !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
                pci_using_dac = 1;
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
-                       err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (err) {
                                dev_err(&pdev->dev, "No usable DMA "
                                        "configuration, aborting\n");
index 860dcd98a07c1c036d3aa97286152ea5a061f05f..ece35040288c5de1e6344ae0d4367ca1378ef2e4 100644 (file)
@@ -2600,8 +2600,8 @@ jme_pci_dma64(struct pci_dev *pdev)
                if (!pci_set_consistent_dma_mask(pdev, DMA_40BIT_MASK))
                        return 1;
 
-       if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK))
-               if (!pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))
+               if (!pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))
                        return 0;
 
        return -1;
index a66f5b2fd288333d11e70f03cd64420e5b30ccab..102bac90a302fcdecccead75e03e3c5ade175b55 100644 (file)
@@ -1076,20 +1076,20 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        pci_set_master(pdev);
 
-       err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (err) {
                dev_warn(&pdev->dev, "Warning: couldn't set 64-bit PCI DMA mask.\n");
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        dev_err(&pdev->dev, "Can't set PCI DMA mask, aborting.\n");
                        goto err_release_bar2;
                }
        }
-       err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
        if (err) {
                dev_warn(&pdev->dev, "Warning: couldn't set 64-bit "
                         "consistent PCI DMA mask.\n");
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        dev_err(&pdev->dev, "Can't set consistent PCI DMA mask, "
                                "aborting.\n");
index aea9fdaa3cd50db7e9ba983bf7174f0b302eb0f1..9eed126a82f0009e30464d432eb5e43670e02b99 100644 (file)
@@ -1130,7 +1130,7 @@ myri10ge_submit_8rx(struct mcp_kreq_ether_recv __iomem * dst,
        __be32 low;
 
        low = src->addr_low;
-       src->addr_low = htonl(DMA_32BIT_MASK);
+       src->addr_low = htonl(DMA_BIT_MASK(32));
        myri10ge_pio_copy(dst, src, 4 * sizeof(*src));
        mb();
        myri10ge_pio_copy(dst + 4, src + 4, 4 * sizeof(*src));
@@ -3792,19 +3792,19 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        pci_set_master(pdev);
        dac_enabled = 1;
-       status = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       status = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (status != 0) {
                dac_enabled = 0;
                dev_err(&pdev->dev,
                        "64-bit pci address mask was refused, "
                        "trying 32-bit\n");
-               status = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               status = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        }
        if (status != 0) {
                dev_err(&pdev->dev, "Error %d setting DMA mask\n", status);
                goto abort_with_enabled;
        }
-       (void)pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+       (void)pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
        mgp->cmd = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->cmd),
                                      &mgp->cmd_bus, GFP_KERNEL);
        if (mgp->cmd == NULL)
diff --git a/drivers/net/myri_code.h b/drivers/net/myri_code.h
deleted file mode 100644 (file)
index ba7b865..0000000
+++ /dev/null
@@ -1,5006 +0,0 @@
-/* This is the Myrinet MCP code for LANai4.x */
-/* Generated by  cat $MYRI_HOME/lib/lanai/mcp4.dat > myri_code4.h */
-
-static unsigned int __devinitdata lanai4_code_off = 0x0000; /* half-word offset */
-static unsigned char __devinitdata lanai4_code[76256] = {
-0xF2,0x0E,
-0xFE,0x00, 0xC2,0x90, 0x00,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x01,0x4C, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x00,0x00, 0x00,0x00, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x2A,0x6C, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x2C,0x10, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x02, 0x05,0x3C, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02, 0x00,0x03, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x29,0xE0, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x2B,0x84, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x2C,0x1C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x02, 0x0A,0xBC, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02, 0x00,0x02, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x2A,0xF8, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF7,0x04, 0x4A,0x9C, 0x85,0x16, 0x00,0x00, 0x20,0x3A, 0x00,0x01, 0xEE,0x00,
-0x01,0x01, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x01,0x00, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x01,0x2D, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39,
-0x00,0x02, 0xF4,0x82, 0x00,0x12, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x01,0xE0, 0xB4,0xBA,
-0x68,0x02, 0xE0,0x00, 0x01,0xE0, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x3B,0x64, 0xF5,0x84,
-0x4F,0x54, 0xF7,0x05, 0x7A,0x10, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x01,0x99, 0x97,0x2A,
-0x00,0x20, 0x95,0xAA, 0x00,0x1C, 0xF6,0x06, 0x4A,0x98, 0x26,0xAC, 0x00,0x01, 0x77,0x35,
-0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0x07,0x38, 0x00,0x0C, 0xA4,0xBA,
-0x60,0x02, 0x00,0x00, 0x00,0x01, 0x94,0xAA, 0x00,0x10, 0xC7,0x38, 0x60,0x00, 0x87,0x3A,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x97,0x2A, 0x00,0x14, 0xF7,0x04, 0x4A,0x9C, 0x00,0x00,
-0x00,0x01, 0x27,0x38, 0x00,0x01, 0xC0,0x2E, 0x72,0x00, 0xD7,0x00, 0x0A,0x01, 0xE0,0x00,
-0x01,0xD0, 0xF7,0x05, 0x7A,0x18, 0x95,0xAA, 0x00,0x1C, 0xF6,0x06, 0x4A,0x98, 0x06,0xAC,
-0x00,0x01, 0x77,0x35, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0x07,0x38,
-0x00,0x0C, 0xA4,0xBA, 0x60,0x02, 0x00,0x00, 0x00,0x01, 0x94,0xAA, 0x00,0x10, 0xC7,0x38,
-0x60,0x00, 0x87,0x3A, 0x00,0x04, 0xF0,0x05, 0x7A,0x18, 0x97,0x2A, 0x00,0x14, 0xF5,0x05,
-0x79,0xD8, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x01,0xF4, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x38, 0xF7,0x04,
-0x7A,0x10, 0xF6,0x84, 0x3B,0x64, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0x47,0x0C,
-0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x02,0x4C, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x02,0x4C, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x02,0x85, 0xF4,0x82, 0x00,0x00, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86,
-0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02,
-0x00,0x12, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x02,0x74, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF3,0x06, 0x2A,0x6C, 0xF3,0x05, 0x2C,0x10, 0xE0,0x00, 0x05,0x28, 0xF0,0x05,
-0x7A,0x18, 0xF3,0x84, 0x79,0xD8, 0xF6,0x84, 0x4A,0xA0, 0x23,0x14, 0x00,0x20, 0x93,0x16,
-0xFF,0xC4, 0x84,0x1E, 0x00,0x10, 0x96,0x96, 0xFF,0xD4, 0xF7,0x04, 0x4A,0x9C, 0x94,0x16,
-0xFF,0xE0, 0x85,0x1E, 0x00,0x14, 0xC0,0x36, 0x72,0x00, 0xEC,0x00, 0x03,0x6C, 0x95,0x16,
-0xFF,0xE4, 0x77,0x35, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0xF3,0x06,
-0x4A,0x98, 0xC6,0xB8, 0x30,0x00, 0x06,0xB4, 0x00,0x0C, 0xC5,0x84, 0x00,0x00, 0x87,0x36,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x42,0x00, 0xE6,0x00, 0x02,0xFC, 0xC6,0x24,
-0x00,0x00, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x52,0x00, 0xE6,0x00,
-0x03,0x00, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x03,0x0D, 0x00,0x00, 0x00,0x01, 0xF5,0x82, 0x00,0x00, 0x86,0x36, 0x00,0x00, 0x87,0x16,
-0xFF,0xE0, 0x00,0x00, 0x00,0x01, 0xC0,0x32, 0x72,0x00, 0xE2,0x00, 0x03,0x48, 0xF5,0x02,
-0x00,0x00, 0xC0,0x32, 0x72,0x00, 0xE6,0x00, 0x03,0x50, 0x20,0x2A, 0x00,0x00, 0x86,0xB6,
-0x00,0x04, 0x87,0x16, 0xFF,0xE4, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0x03,0x51, 0x20,0x2A, 0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00,
-0x03,0x61, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00,
-0x03,0x70, 0x20,0x26, 0x00,0x00, 0xF4,0x82, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00,
-0x03,0xA5, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xD4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9,
-0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4,
-0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xD8, 0xE0,0x00, 0x04,0x18, 0x96,0x96,
-0xFF,0xDC, 0x27,0x14, 0x00,0x2C, 0x97,0x13, 0xFF,0xFC, 0x83,0x16, 0xFF,0xC4, 0x00,0x00,
-0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0xF3,0x06, 0x4A,0x98, 0x93,0x13, 0xFF,0xFC, 0x93,0x96,
-0xFF,0xCC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96,
-0xFF,0xCC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x04,0x15, 0xF6,0x02, 0x00,0x01, 0x87,0x16,
-0xFF,0xD4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16,
-0xFF,0xD8, 0x96,0x96, 0xFF,0xDC, 0xF7,0x05, 0x4A,0xA0, 0xE0,0x00, 0x04,0x1C, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x04,0x2C, 0xF4,0x82,
-0x00,0x01, 0xE0,0x00, 0x04,0x84, 0xF4,0x82, 0x00,0x00, 0x86,0x96, 0xFF,0xD8, 0x00,0x00,
-0x00,0x01, 0x77,0x35, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0xF6,0x86,
-0x42,0xC8, 0xA6,0x3A, 0x68,0x02, 0xC7,0x38, 0x68,0x00, 0x75,0x39, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0x05,0xB8, 0x00,0x02, 0x86,0xAE, 0x00,0x00, 0x07,0x38, 0x00,0x04, 0x97,0x16,
-0xFF,0xEC, 0xC6,0x30, 0x57,0xC0, 0x76,0x30, 0xFF,0xF0, 0x96,0x16, 0xFF,0xF4, 0x75,0xAD,
-0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0xC6,0xB4, 0x5F,0xC0, 0x76,0xB4, 0xFF,0xF0, 0x96,0x96,
-0xFF,0xF0, 0x20,0x26, 0x00,0x00, 0xE6,0x00, 0x05,0x25, 0xF3,0x06, 0x29,0xE0, 0x86,0x96,
-0xFF,0xF0, 0xF5,0x82, 0x00,0x00, 0xC7,0x34, 0x68,0x00, 0xC4,0x9C, 0x72,0x00, 0xC0,0x2E,
-0x6A,0x00, 0xEC,0x00, 0x04,0xF0, 0xC5,0x24, 0x00,0x00, 0xC6,0x2C, 0x00,0x00, 0x87,0x16,
-0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0xA6,0xB2, 0x70,0x02, 0x05,0xAC, 0x00,0x01, 0xC7,0x30,
-0x70,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB4,
-0xFF,0xF0, 0xF6,0xAB, 0x28,0x00, 0x05,0x28, 0x00,0x02, 0x87,0x16, 0xFF,0xF0, 0x00,0x00,
-0x00,0x01, 0xC0,0x2E, 0x72,0x00, 0xEC,0x00, 0x04,0xB1, 0x06,0x30, 0x00,0x02, 0xF3,0x02,
-0x00,0x03, 0xF3,0x05, 0x76,0xF4, 0x87,0x16, 0xFF,0xF0, 0x86,0x9E, 0x00,0x04, 0xC7,0x38,
-0x70,0x00, 0xC7,0x38, 0x48,0x00, 0xC6,0xB4, 0x70,0x00, 0x87,0x16, 0xFF,0xF4, 0x06,0xB4,
-0x00,0x20, 0x97,0x02, 0xFF,0x6C, 0x94,0x82, 0xFF,0x50, 0x96,0x82, 0xFF,0x58, 0xF3,0x06,
-0x29,0xE0, 0xF3,0x05, 0x2C,0x10, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF7,0x04, 0x7A,0x18, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x05,0xCD, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x7A,0x10, 0xF6,0x84, 0x3B,0x64, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x05,0xCD, 0xF5,0x86, 0x4A,0x98, 0xF6,0x04, 0x79,0xD8, 0xF6,0x84, 0x4F,0x54, 0x00,0x00,
-0x00,0x01, 0x96,0xB2, 0x00,0x1C, 0x06,0xB4, 0x00,0x01, 0x77,0x35, 0x00,0x01, 0xC7,0x38,
-0x68,0x00, 0x77,0x39, 0x00,0x02, 0x07,0x38, 0x00,0x0C, 0xA5,0x3A, 0x58,0x02, 0x00,0x00,
-0x00,0x01, 0x95,0x32, 0x00,0x10, 0xC7,0x38, 0x58,0x00, 0x87,0x3A, 0x00,0x04, 0xF0,0x05,
-0x7A,0x18, 0x97,0x32, 0x00,0x14, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x01,0xF4, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0x05,0xFC, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86,
-0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x02,
-0x00,0x12, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x05,0xF4, 0xB5,0x3A, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF5,0x06, 0x2A,0x6C, 0xF5,0x05, 0x2C,0x10, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x85,0x96, 0x00,0x00, 0xF7,0x04, 0x75,0xEC, 0x85,0x2E,
-0x00,0x20, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x06,0xCC, 0xF5,0x05, 0x7A,0x08, 0xF7,0x04,
-0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x06,0xCC, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x7A,0x08, 0xF6,0x84, 0x3B,0x64, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0x47,0x0C, 0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x06,0xCC, 0x00,0x00, 0x00,0x01, 0x87,0x2E, 0x00,0x1C, 0xF6,0x84, 0x4F,0x54, 0xF7,0x05,
-0x7A,0x00, 0xC7,0x34, 0x72,0x00, 0x20,0x3A, 0x00,0x00, 0xEE,0x00, 0x06,0x8D, 0xF5,0x02,
-0x00,0x01, 0xE0,0x00, 0x06,0x90, 0xF5,0x05, 0x79,0xF8, 0xF0,0x85, 0x79,0xF8, 0xF6,0x84,
-0x7A,0x00, 0xC7,0x38, 0x70,0x00, 0xC6,0xB4, 0x70,0x00, 0xF7,0x04, 0x79,0xF8, 0xF6,0x85,
-0x79,0xE8, 0xC7,0x38, 0x70,0x00, 0xC6,0x34, 0x70,0x00, 0xF7,0x04, 0x4A,0x9C, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xEC,0x00, 0x06,0xCC, 0xF6,0x05, 0x79,0xF0, 0x20,0x36,
-0x00,0x00, 0xEC,0x00, 0x06,0xF8, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86,
-0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x02,
-0x00,0x13, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x07,0x38, 0xB5,0x3A, 0x68,0x02, 0xE0,0x00,
-0x07,0x38, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x4A,0x9C, 0x00,0x00, 0x00,0x01, 0xC0,0x32,
-0x72,0x00, 0xEE,0x00, 0x07,0x19, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x4A,0x9C, 0xE0,0x00,
-0x07,0x28, 0xF7,0x05, 0x79,0xF0, 0x20,0x32, 0x00,0x00, 0xEC,0x00, 0x07,0x28, 0x00,0x00,
-0x00,0x01, 0xF0,0x85, 0x79,0xF0, 0xF5,0x85, 0x79,0xE0, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x07,0x4C, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x38, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x07,0xA4, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x07,0xA4, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x7A,0x08, 0xF6,0x84, 0x3B,0x64, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0x47,0x0C,
-0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x07,0xD5, 0xF4,0x02,
-0x00,0x00, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x13, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x07,0xCC, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xE0,0x00, 0x0A,0xA4, 0xF3,0x06,
-0x2B,0x84, 0xF6,0x84, 0x79,0xE8, 0xF6,0x06, 0x4A,0x98, 0x77,0x35, 0x00,0x01, 0xC7,0x38,
-0x68,0x00, 0x77,0x39, 0x00,0x02, 0xF6,0x84, 0x79,0xE0, 0x07,0x38, 0x00,0x0C, 0xA3,0x3A,
-0x60,0x02, 0xC3,0xB4, 0x00,0x00, 0x93,0x36, 0x00,0x10, 0xC7,0x38, 0x60,0x00, 0x87,0x3A,
-0x00,0x04, 0x23,0x14, 0x00,0x20, 0x93,0x16, 0xFF,0xC4, 0x97,0x36, 0x00,0x14, 0x84,0x9E,
-0x00,0x10, 0xF6,0x84, 0x4A,0xA0, 0x94,0x96, 0xFF,0xE0, 0x96,0x96, 0xFF,0xD4, 0x85,0x1E,
-0x00,0x14, 0xF7,0x04, 0x4A,0x9C, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xEC,0x00,
-0x08,0xEC, 0x95,0x16, 0xFF,0xE4, 0x77,0x35, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x77,0x39,
-0x00,0x02, 0xC6,0xB8, 0x60,0x00, 0x06,0xB4, 0x00,0x0C, 0xC5,0x84, 0x00,0x00, 0x87,0x36,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x00, 0x08,0x7C, 0xC6,0x20,
-0x00,0x00, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x52,0x00, 0xE6,0x00,
-0x08,0x80, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x08,0x8D, 0x00,0x00, 0x00,0x01, 0xF5,0x82, 0x00,0x00, 0x86,0x36, 0x00,0x00, 0x87,0x16,
-0xFF,0xE0, 0x00,0x00, 0x00,0x01, 0xC0,0x32, 0x72,0x00, 0xE2,0x00, 0x08,0xC8, 0xF5,0x02,
-0x00,0x00, 0xC0,0x32, 0x72,0x00, 0xE6,0x00, 0x08,0xD0, 0x20,0x2A, 0x00,0x00, 0x86,0xB6,
-0x00,0x04, 0x87,0x16, 0xFF,0xE4, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0x08,0xD1, 0x20,0x2A, 0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00,
-0x08,0xE1, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00,
-0x08,0xF0, 0x20,0x22, 0x00,0x00, 0xF4,0x02, 0x00,0x01, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x09,0x25, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xD4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9,
-0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4,
-0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xD8, 0xE0,0x00, 0x09,0x98, 0x96,0x96,
-0xFF,0xDC, 0x27,0x14, 0x00,0x2C, 0x97,0x13, 0xFF,0xFC, 0x83,0x16, 0xFF,0xC4, 0x00,0x00,
-0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0xF3,0x06, 0x4A,0x98, 0x93,0x13, 0xFF,0xFC, 0x93,0x96,
-0xFF,0xCC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96,
-0xFF,0xCC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x09,0x95, 0xF6,0x02, 0x00,0x01, 0x87,0x16,
-0xFF,0xD4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16,
-0xFF,0xD8, 0x96,0x96, 0xFF,0xDC, 0xF7,0x05, 0x4A,0xA0, 0xE0,0x00, 0x09,0x9C, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x09,0xAC, 0xF4,0x82,
-0x00,0x01, 0xE0,0x00, 0x0A,0x04, 0xF4,0x82, 0x00,0x00, 0x86,0x96, 0xFF,0xD8, 0x00,0x00,
-0x00,0x01, 0x77,0x35, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0xF6,0x86,
-0x42,0xC8, 0xA6,0x3A, 0x68,0x02, 0xC7,0x38, 0x68,0x00, 0x75,0x39, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0x05,0xB8, 0x00,0x02, 0x86,0xAE, 0x00,0x00, 0x07,0x38, 0x00,0x04, 0x97,0x16,
-0xFF,0xEC, 0xC6,0x30, 0x57,0xC0, 0x76,0x30, 0xFF,0xF0, 0x96,0x16, 0xFF,0xF4, 0x75,0xAD,
-0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0xC6,0xB4, 0x5F,0xC0, 0x76,0xB4, 0xFF,0xF0, 0x96,0x96,
-0xFF,0xF0, 0x20,0x26, 0x00,0x00, 0xE6,0x00, 0x0A,0xA5, 0xF3,0x06, 0x2A,0xF8, 0x86,0x96,
-0xFF,0xF0, 0xF5,0x82, 0x00,0x00, 0xC7,0x34, 0x68,0x00, 0xC4,0x9C, 0x72,0x00, 0xC0,0x2E,
-0x6A,0x00, 0xEC,0x00, 0x0A,0x70, 0xC5,0x24, 0x00,0x00, 0xC6,0x2C, 0x00,0x00, 0x87,0x16,
-0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0xA6,0xB2, 0x70,0x02, 0x05,0xAC, 0x00,0x01, 0xC7,0x30,
-0x70,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB4,
-0xFF,0xF0, 0xF6,0xAB, 0x28,0x00, 0x05,0x28, 0x00,0x02, 0x87,0x16, 0xFF,0xF0, 0x00,0x00,
-0x00,0x01, 0xC0,0x2E, 0x72,0x00, 0xEC,0x00, 0x0A,0x31, 0x06,0x30, 0x00,0x02, 0xF3,0x02,
-0x00,0x02, 0xF3,0x05, 0x76,0xF4, 0x87,0x16, 0xFF,0xF0, 0x86,0x9E, 0x00,0x04, 0xC7,0x38,
-0x70,0x00, 0xC7,0x38, 0x48,0x00, 0xC6,0xB4, 0x70,0x00, 0x87,0x16, 0xFF,0xF4, 0x06,0xB4,
-0x00,0x20, 0x97,0x02, 0xFF,0x6C, 0x94,0x82, 0xFF,0x50, 0x96,0x82, 0xFF,0x58, 0xF3,0x06,
-0x2A,0xF8, 0xF3,0x05, 0x2C,0x1C, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF6,0x84, 0x79,0xE8, 0xF7,0x04, 0x79,0xF8, 0x00,0x00, 0x00,0x01, 0xC6,0xB4,
-0x70,0x00, 0xF7,0x04, 0x7A,0x20, 0xF6,0x85, 0x79,0xE8, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x7A,0x20, 0xF7,0x04, 0x79,0xF0, 0xF6,0x04, 0x7A,0x20, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x0B,0x2C, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x82, 0x00,0x13, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x0B,0x20, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x86,
-0x2B,0x84, 0xE0,0x00, 0x0B,0x38, 0xF5,0x85, 0x2C,0x1C, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x07,0x4C, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF7,0x06, 0x2C,0x10, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x29,0xE0, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06,
-0x2C,0x10, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x2A,0x6C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x2C,0x1C, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x2A,0xF8, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x2C,0x1C, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x2B,0x84, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF0,0x05,
-0x2D,0x38, 0xF0,0x05, 0x2D,0x3C, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x18, 0xFF,0x85, 0x2E,0xDC, 0xF7,0x06, 0x0C,0x3E, 0xC7,0x7C,
-0x74,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x14,0x29, 0x97,0x16, 0xFF,0xF4, 0x47,0x38,
-0xFF,0xFB, 0xF6,0x84, 0x6F,0x50, 0xCF,0xB8, 0x00,0x00, 0x83,0x96, 0xFF,0xF4, 0xF7,0x02,
-0x00,0x3F, 0xC3,0x9C, 0x6D,0x80, 0xC7,0x1C, 0x74,0x00, 0x20,0x3A, 0x00,0x3F, 0xE2,0x00,
-0x12,0x60, 0x93,0x96, 0xFF,0xF4, 0x77,0x39, 0x00,0x02, 0xF6,0x82, 0x0C,0x5C, 0xA6,0xB6,
-0x70,0x02, 0x00,0x00, 0x00,0x01, 0xC1,0x34, 0x00,0x00, 0x00,0x00, 0x12,0x60, 0x00,0x00,
-0x12,0x60, 0x00,0x00, 0x0D,0x68, 0x00,0x00, 0x0D,0x68, 0x00,0x00, 0x0D,0x5C, 0x00,0x00,
-0x0D,0x5C, 0x00,0x00, 0x0D,0x68, 0x00,0x00, 0x0D,0x68, 0x00,0x00, 0x12,0x50, 0x00,0x00,
-0x12,0x50, 0x00,0x00, 0x12,0x3C, 0x00,0x00, 0x12,0x3C, 0x00,0x00, 0x0D,0xE0, 0x00,0x00,
-0x0D,0xE0, 0x00,0x00, 0x12,0x3C, 0x00,0x00, 0x12,0x3C, 0x00,0x00, 0x0D,0xE8, 0x00,0x00,
-0x0D,0xF4, 0x00,0x00, 0x0E,0x00, 0x00,0x00, 0x0E,0x20, 0x00,0x00, 0x0E,0x40, 0x00,0x00,
-0x0E,0x60, 0x00,0x00, 0x0E,0x80, 0x00,0x00, 0x0E,0xA0, 0x00,0x00, 0x0E,0xC0, 0x00,0x00,
-0x0E,0xC8, 0x00,0x00, 0x0E,0xD0, 0x00,0x00, 0x12,0x28, 0x00,0x00, 0x0E,0xD8, 0x00,0x00,
-0x0E,0xF4, 0x00,0x00, 0x0F,0x10, 0x00,0x00, 0x12,0x28, 0x00,0x00, 0x0F,0x18, 0x00,0x00,
-0x0F,0x18, 0x00,0x00, 0x0F,0x24, 0x00,0x00, 0x0F,0x24, 0x00,0x00, 0x0F,0x44, 0x00,0x00,
-0x0F,0x44, 0x00,0x00, 0x0F,0x64, 0x00,0x00, 0x0F,0x64, 0x00,0x00, 0x0F,0x84, 0x00,0x00,
-0x0F,0x84, 0x00,0x00, 0x0F,0x8C, 0x00,0x00, 0x0F,0x8C, 0x00,0x00, 0x0F,0x94, 0x00,0x00,
-0x0F,0x94, 0x00,0x00, 0x0F,0xB0, 0x00,0x00, 0x0F,0xB0, 0x00,0x00, 0x0F,0xB8, 0x00,0x00,
-0x0F,0xD8, 0x00,0x00, 0x0F,0xF8, 0x00,0x00, 0x10,0x2C, 0x00,0x00, 0x10,0x60, 0x00,0x00,
-0x10,0x94, 0x00,0x00, 0x10,0xC8, 0x00,0x00, 0x10,0xFC, 0x00,0x00, 0x11,0x30, 0x00,0x00,
-0x11,0x4C, 0x00,0x00, 0x11,0x68, 0x00,0x00, 0x12,0x14, 0x00,0x00, 0x11,0x84, 0x00,0x00,
-0x11,0xB4, 0x00,0x00, 0x11,0xE4, 0x00,0x00, 0x12,0x14, 0xF3,0x82, 0x00,0x06, 0xE0,0x00,
-0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF6,0x02, 0x00,0x05, 0x20,0x32, 0x00,0x14, 0xE6,0x00,
-0x0D,0xB5, 0x27,0x00, 0x00,0x10, 0x20,0x3A, 0x00,0x01, 0xE2,0x00, 0x0D,0xB5, 0xF7,0x06,
-0x2D,0xCC, 0xF6,0x84, 0x2E,0xCC, 0x00,0x00, 0x00,0x01, 0x75,0xB5, 0x00,0x02, 0xB6,0x2E,
-0x70,0x02, 0x06,0xB4, 0x00,0x01, 0xF6,0x85, 0x2E,0xCC, 0x86,0x02, 0xFF,0x34, 0xF7,0x06,
-0x2E,0x4C, 0x20,0x36, 0x00,0x1F, 0xE2,0x00, 0x0D,0xB5, 0xB6,0x2E, 0x70,0x02, 0xF0,0x05,
-0x2E,0xCC, 0xF7,0x04, 0x2D,0x58, 0x00,0x00, 0x00,0x01, 0x87,0x3A, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x87,0x3A, 0x00,0x18, 0x00,0x00, 0x00,0x01, 0x07,0x88, 0x00,0x08, 0xC1,0x38,
-0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x12,0x60, 0x00,0x00, 0x00,0x01, 0xE0,0x00,
-0x12,0x40, 0xF3,0x82, 0x00,0x06, 0xF3,0x82, 0x00,0x0B, 0xE0,0x00, 0x12,0x54, 0x93,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x07, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x0B, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x0B, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x06, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x06, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x0B, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xE0,0x00,
-0x12,0x40, 0xF3,0x82, 0x00,0x0B, 0xE0,0x00, 0x12,0x40, 0xF3,0x82, 0x00,0x07, 0xE0,0x00,
-0x12,0x2C, 0xF3,0x82, 0x00,0x0B, 0xF3,0x82, 0x00,0x0B, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x12,0x40, 0xF3,0x82,
-0x00,0x06, 0xF3,0x82, 0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x12,0x40, 0xF3,0x82, 0x00,0x06, 0xE0,0x00,
-0x12,0x2C, 0xF3,0x82, 0x00,0x0B, 0xF3,0x82, 0x00,0x14, 0xE0,0x00, 0x12,0x54, 0x93,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x06, 0xE0,0x00, 0x12,0x54, 0x93,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93,
-0xFF,0xFC, 0xE0,0x00, 0x12,0x40, 0xF3,0x82, 0x00,0x14, 0xE0,0x00, 0x12,0x2C, 0xF3,0x82,
-0x00,0x14, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x12,0x40, 0xF3,0x82, 0x00,0x06, 0xE0,0x00,
-0x12,0x2C, 0xF3,0x82, 0x00,0x14, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x0B, 0xE0,0x00,
-0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x07, 0xE0,0x00,
-0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x0B, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x0B, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x06, 0xE0,0x00, 0x12,0x54, 0x93,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x06, 0xE0,0x00,
-0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x0B, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x14, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0xE0,0x00, 0x12,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0x12,0x40, 0xF3,0x82, 0x00,0x0B, 0xF3,0x82, 0x00,0x14, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00,
-0x12,0x40, 0xF3,0x82, 0x00,0x07, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x12,0x2C, 0xF3,0x82,
-0x00,0x0B, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x0B, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x12,0x40, 0xF3,0x82,
-0x00,0x06, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x12,0x40, 0xF3,0x82,
-0x00,0x06, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x12,0x2C, 0xF3,0x82, 0x00,0x0B, 0xF7,0x04,
-0x35,0x28, 0xF6,0x82, 0x00,0x01, 0x07,0x38, 0x00,0x08, 0xE0,0x00, 0x13,0xCC, 0xF7,0x05,
-0x35,0x44, 0xF3,0x82, 0x00,0x14, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x07, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x05, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0x90,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0x83,0x96,
-0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x77,0x9C, 0x00,0x14, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00,
-0x12,0x9D, 0xF7,0x06, 0x04,0x00, 0xF7,0x04, 0x6F,0x5C, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x6F,0x5C, 0xF7,0x04, 0x6F,0x5C, 0xE0,0x00, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x83,0x96, 0xFF,0xF4, 0xF7,0x06, 0x04,0x00, 0xC0,0x1E, 0x74,0x00, 0xE6,0x00,
-0x14,0x29, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x2E,0xD0, 0xF6,0x84, 0x35,0x24, 0x07,0x38,
-0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x14,0x05, 0xF7,0x05, 0x2E,0xD0, 0xF7,0x04,
-0xE0,0x14, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x14,0x05, 0xF6,0x82,
-0x00,0x00, 0xF6,0x85, 0xE0,0x14, 0xF7,0x04, 0x2E,0xD8, 0xC5,0x34, 0x00,0x00, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x2E,0xD8, 0x20,0x2A, 0x00,0x02, 0xEE,0x00, 0x13,0xCC, 0xF6,0x82,
-0x00,0x00, 0xF6,0x84, 0x35,0x28, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00, 0x13,0xA0, 0x05,0xB4, 0x00,0x08, 0x95,0x93,
-0xFF,0xFC, 0x95,0x16, 0xFF,0xE8, 0x95,0x96, 0xFF,0xE4, 0x96,0x96, 0xFF,0xE0, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x64, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0xE8, 0x85,0x96,
-0xFF,0xE4, 0x86,0x96, 0xFF,0xE0, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x13,0x90, 0xF7,0x02,
-0x00,0x00, 0x86,0x36, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x0F, 0xE2,0x00,
-0x13,0x75, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0x97,0x36, 0x00,0x14, 0x87,0x36, 0x00,0x14, 0xE0,0x00, 0x13,0x90, 0xF7,0x02,
-0x00,0x00, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35, 0x00,0x05, 0xC7,0x38,
-0x6A,0x00, 0xC7,0x38, 0x60,0x00, 0x07,0x38, 0x00,0x10, 0xC7,0x2C, 0x70,0x00, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x12,0x00, 0xF7,0x05, 0x35,0x2C, 0xF6,0x84, 0x35,0x28, 0xF7,0x04,
-0x6F,0x4C, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x13,0xC0, 0x07,0x34,
-0x14,0x94, 0xF3,0x84, 0x6F,0x44, 0xE0,0x00, 0x13,0xC4, 0xF3,0x85, 0x35,0x28, 0xF7,0x05,
-0x35,0x28, 0xE0,0x00, 0x12,0xE8, 0x05,0x28, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00,
-0x14,0x29, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0xF0,0x05, 0x35,0x24, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x82, 0x00,0x0D, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x14,0x28, 0xB3,0xBA, 0x68,0x02, 0xE0,0x00, 0x14,0x28, 0xF0,0x05,
-0x2D,0x38, 0xF7,0x04, 0xE0,0x10, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x14,0x29, 0xF7,0x02, 0x00,0x00, 0xF7,0x05, 0xE0,0x10, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x02,0x98, 0x97,0x93, 0xFF,0xFC, 0xF4,0x84, 0x2D,0x38, 0xF7,0x04, 0x2D,0x3C, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x00, 0x0C,0x09, 0xF6,0x86, 0x2C,0x28, 0x77,0x39,
-0x00,0x02, 0xA5,0x3A, 0x68,0x02, 0x00,0x00, 0x00,0x01, 0x20,0x2A, 0x00,0x14, 0xE6,0x00,
-0x14,0x91, 0x27,0x28, 0x00,0x15, 0x20,0x3A, 0x00,0x01, 0xE2,0x00, 0x14,0x91, 0xF7,0x06,
-0x2D,0xCC, 0xF6,0x84, 0x2E,0xCC, 0x86,0x02, 0xFF,0x34, 0x75,0xB5, 0x00,0x02, 0xB5,0x2E,
-0x70,0x02, 0x06,0xB4, 0x00,0x01, 0xF6,0x85, 0x2E,0xCC, 0xF7,0x06, 0x2E,0x4C, 0x20,0x36,
-0x00,0x1F, 0xE2,0x00, 0x14,0x91, 0xB6,0x2E, 0x70,0x02, 0xF0,0x05, 0x2E,0xCC, 0xF7,0x06,
-0x2D,0x44, 0x76,0xA9, 0x00,0x02, 0xA7,0x36, 0x70,0x02, 0x00,0x00, 0x00,0x01, 0x87,0x3A,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x87,0x36, 0x00,0x04, 0x94,0x96,
-0xFF,0xEC, 0x07,0x88, 0x00,0x08, 0xC1,0x38, 0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0xF7,0x04,
-0x2D,0x3C, 0x84,0x96, 0xFF,0xEC, 0x07,0x38, 0x00,0x01, 0x20,0x3A, 0x00,0x44, 0xE6,0x00,
-0x14,0x2C, 0xF7,0x05, 0x2D,0x3C, 0xE0,0x00, 0x14,0x2C, 0xF0,0x05, 0x2D,0x3C, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x84,0x16, 0x00,0x00, 0xF7,0x02,
-0x00,0x00, 0x85,0x96, 0x00,0x04, 0x20,0x3A, 0x00,0x21, 0xEE,0x00, 0x15,0x34, 0x95,0xA2,
-0x00,0x00, 0xF6,0x06, 0x23,0x38, 0x07,0x20, 0x00,0x84, 0xC6,0xA0, 0x00,0x00, 0x96,0x3A,
-0x00,0x04, 0x27,0x38, 0x00,0x04, 0xC0,0x3A, 0x6A,0x00, 0xEC,0x00, 0x15,0x20, 0x00,0x00,
-0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x96,
-0x00,0x00, 0x87,0x16, 0x00,0x04, 0xF6,0x04, 0x2D,0x40, 0x97,0x36, 0x00,0x00, 0x97,0x36,
-0x00,0x04, 0x07,0x30, 0x00,0x01, 0xF7,0x05, 0x2D,0x40, 0x96,0x36, 0x00,0x08, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x85,0x16, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x20,0x2A, 0x00,0x14, 0xE6,0x00, 0x15,0xD9, 0x27,0x28, 0x00,0x15, 0x20,0x3A,
-0x00,0x01, 0xE2,0x00, 0x15,0xD9, 0xF7,0x06, 0x2D,0xCC, 0xF6,0x84, 0x2E,0xCC, 0x86,0x02,
-0xFF,0x34, 0x75,0xB5, 0x00,0x02, 0xB5,0x2E, 0x70,0x02, 0x06,0xB4, 0x00,0x01, 0xF6,0x85,
-0x2E,0xCC, 0xF7,0x06, 0x2E,0x4C, 0x20,0x36, 0x00,0x1F, 0xE2,0x00, 0x15,0xD9, 0xB6,0x2E,
-0x70,0x02, 0xF0,0x05, 0x2E,0xCC, 0xF6,0x86, 0x2D,0x44, 0x77,0x29, 0x00,0x02, 0xA6,0xBA,
-0x68,0x02, 0x00,0x00, 0x00,0x01, 0x86,0xB6, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC7,0x38,
-0x68,0x00, 0x87,0x3A, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x07,0x88, 0x00,0x08, 0xC1,0x38,
-0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x87,0x16, 0x00,0x00, 0x86,0x96, 0x00,0x04, 0xF6,0x06, 0x2D,0x44, 0x76,0xB5,
-0x00,0x02, 0x85,0xBA, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xB5,0xB6, 0x60,0x02, 0xC6,0xB4,
-0x70,0x00, 0x85,0x96, 0x00,0x08, 0x00,0x00, 0x00,0x01, 0x95,0xB6, 0x00,0x04, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x16, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x87,0x32, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x0F, 0x86,0xB2,
-0x00,0x00, 0xC5,0x38, 0x00,0x00, 0xEE,0x00, 0x16,0xB4, 0xC5,0xB4, 0x00,0x00, 0x20,0x36,
-0x00,0x0F, 0xEE,0x00, 0x16,0xB4, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xEC,0x00,
-0x16,0xB5, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xEC,0x00, 0x16,0xD0, 0x00,0x00,
-0x00,0x01, 0x87,0x32, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x32,
-0x00,0x0C, 0x87,0x32, 0x00,0x0C, 0xE0,0x00, 0x16,0xD8, 0xF4,0x02, 0x00,0x00, 0xC0,0x2A,
-0x5A,0x00, 0x44,0x0C, 0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x00,0x00, 0x00,0x00, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x2E,0xE0, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x32,0xD4, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x02, 0x18,0x2C, 0x97,0x13, 0xFF,0xFC, 0xF7,0x82, 0x00,0x09, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x06, 0x2E,0xE0, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02, 0x34,0x58, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02,
-0x00,0x0C, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x2F,0x6C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02, 0x3F,0x94, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x0B, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x2F,0xF8, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02,
-0x3B,0x84, 0x97,0x13, 0xFF,0xFC, 0xF7,0x82, 0x00,0x0B, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06,
-0x32,0x28, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x02, 0x26,0xE4, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02, 0x00,0x13, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x30,0x84, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02, 0x26,0xA0, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02,
-0x00,0x11, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x31,0x10, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02, 0x18,0x2C, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x09, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x31,0x9C, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF0,0x05,
-0x7A,0x78, 0xF0,0x05, 0x32,0xE8, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x50, 0xF7,0x04, 0x71,0xC8, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x18,0x55, 0xF6,0x86, 0x71,0xC4, 0xE0,0x00, 0x18,0x6C, 0xF6,0x02,
-0x00,0x00, 0xF7,0x04, 0x71,0xD4, 0x00,0x00, 0x00,0x01, 0x77,0x39, 0x00,0x02, 0xC7,0x38,
-0x68,0x00, 0x86,0x3A, 0x00,0x18, 0x00,0x00, 0x00,0x01, 0xF6,0x05, 0x32,0xC4, 0x86,0xB2,
-0x00,0x08, 0x07,0x01, 0x80,0x00, 0xC5,0xB4, 0x74,0x00, 0xF5,0x85, 0x32,0xD0, 0x87,0x32,
-0x00,0x18, 0xF6,0x86, 0x6F,0x44, 0x77,0x39, 0x00,0x02, 0xA7,0x3A, 0x68,0x02, 0x20,0x2E,
-0x00,0x00, 0xF7,0x05, 0x32,0xC0, 0x07,0x38, 0x09,0xD8, 0x86,0xB2, 0x00,0x04, 0xF7,0x05,
-0x32,0xCC, 0xE6,0x00, 0x19,0x41, 0xF6,0x85, 0x32,0xC8, 0xF7,0x04, 0x71,0x98, 0xF6,0x84,
-0x7A,0x78, 0x27,0x38, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x19,0x10, 0xF7,0x05,
-0x71,0x98, 0xF7,0x04, 0x76,0xFC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x18,0xE8, 0xF3,0x02, 0x00,0x11, 0xF3,0x06, 0x32,0xD4, 0xF3,0x05, 0x76,0xFC, 0xE0,0x00,
-0x18,0xF8, 0xF7,0x02, 0x00,0x01, 0xF3,0x05, 0x76,0xF8, 0xF3,0x06, 0x32,0xD4, 0xF3,0x05,
-0x77,0x00, 0xF7,0x02, 0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x19,0x14, 0xF3,0x02,
-0x00,0x01, 0xF3,0x06, 0x31,0x10, 0xE0,0x00, 0x26,0x8C, 0xF3,0x05, 0x32,0xD4, 0xF3,0x02,
-0x00,0x01, 0xF3,0x05, 0x7A,0x78, 0xF3,0x06, 0x30,0x84, 0xF3,0x05, 0x32,0xD4, 0xF3,0x04,
-0x32,0xC4, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x06,0x10, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x26,0x8C, 0x00,0x00, 0x00,0x01, 0xF3,0x02,
-0x00,0x00, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x1C,0xB9, 0x93,0x16, 0xFF,0xE4, 0x87,0x32,
-0x00,0x08, 0x86,0x96, 0xFF,0xE4, 0xC3,0x04, 0x00,0x00, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00,
-0x19,0x84, 0x20,0x36, 0x00,0x00, 0x87,0x32, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x32,0x00, 0xE6,0x00, 0x19,0x84, 0x20,0x36, 0x00,0x00, 0xF6,0x82, 0x00,0x01, 0x20,0x36,
-0x00,0x00, 0xE6,0x00, 0x1C,0xB8, 0xF3,0x02, 0x00,0x00, 0xF7,0x04, 0x32,0xC0, 0x93,0x16,
-0xFF,0xAC, 0xF5,0x84, 0x32,0xC4, 0x86,0x3A, 0x14,0x28, 0x03,0xB8, 0x14,0x20, 0x04,0x2C,
-0x00,0x08, 0x86,0xBA, 0x14,0x24, 0x00,0x00, 0x00,0x01, 0xC0,0x32, 0x6A,0x00, 0xEC,0x00,
-0x1A,0x70, 0x96,0x16, 0xFF,0xEC, 0x77,0x31, 0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x77,0x39,
-0x00,0x02, 0xC6,0x38, 0x38,0x00, 0x06,0x30, 0x00,0x0C, 0x86,0xB2, 0x00,0x00, 0x87,0x2E,
-0x00,0x08, 0x85,0x16, 0xFF,0xAC, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x1A,0x00, 0xC4,0x84,
-0x00,0x00, 0x86,0xB2, 0x00,0x04, 0x87,0x2E, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x1A,0x04, 0x20,0x2A, 0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A,
-0x00,0x00, 0xE6,0x00, 0x1A,0x11, 0x00,0x00, 0x00,0x01, 0xF4,0x82, 0x00,0x00, 0x86,0xB2,
-0x00,0x00, 0x87,0x22, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0x1A,0x4C, 0xF5,0x82, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x1A,0x54, 0x20,0x2E,
-0x00,0x00, 0x86,0xB2, 0x00,0x04, 0x87,0x22, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0x1A,0x55, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E,
-0x00,0x00, 0xE6,0x00, 0x1A,0x65, 0x20,0x26, 0x00,0x00, 0xF4,0x82, 0x00,0x01, 0x20,0x26,
-0x00,0x00, 0xE6,0x00, 0x1A,0x70, 0xF3,0x02, 0x00,0x01, 0x93,0x16, 0xFF,0xAC, 0x83,0x16,
-0xFF,0xAC, 0x00,0x00, 0x00,0x01, 0x20,0x1A, 0x00,0x00, 0xE6,0x00, 0x1A,0xB1, 0xF6,0x02,
-0x00,0x01, 0x87,0x16, 0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4,
-0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x38,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6,
-0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xE0,0x00, 0x1B,0x18, 0x96,0x96, 0xFF,0xF4, 0x27,0x14,
-0x00,0x14, 0x97,0x13, 0xFF,0xFC, 0x94,0x13, 0xFF,0xFC, 0x93,0x93, 0xFF,0xFC, 0x93,0x96,
-0xFF,0xBC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96,
-0xFF,0xBC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x1B,0x15, 0xF6,0x02, 0x00,0x01, 0x87,0x16,
-0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x38,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16,
-0xFF,0xF0, 0x96,0x96, 0xFF,0xF4, 0x97,0x1E, 0x00,0x08, 0xE0,0x00, 0x1B,0x1C, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x1C,0xB8, 0xF3,0x02,
-0x00,0x00, 0xF6,0x04, 0x32,0xC0, 0x93,0x16, 0xFF,0xAC, 0x86,0xB2, 0x14,0x28, 0x03,0xB0,
-0x14,0x20, 0x04,0x30, 0x14,0x8C, 0x87,0x32, 0x14,0x24, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xEC,0x00, 0x1C,0x04, 0x96,0x96, 0xFF,0xEC, 0x77,0x35, 0x00,0x01, 0xC7,0x38,
-0x68,0x00, 0x77,0x39, 0x00,0x02, 0xC5,0xB8, 0x38,0x00, 0x05,0xAC, 0x00,0x0C, 0x86,0xAE,
-0x00,0x00, 0x87,0x32, 0x14,0x8C, 0x85,0x16, 0xFF,0xAC, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x1B,0x94, 0xC4,0x84, 0x00,0x00, 0x86,0xAE, 0x00,0x04, 0x87,0x32, 0x14,0x90, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x1B,0x98, 0x20,0x2A, 0x00,0x00, 0xF5,0x02,
-0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00, 0x1B,0xA5, 0x00,0x00, 0x00,0x01, 0xF4,0x82,
-0x00,0x00, 0x86,0xAE, 0x00,0x00, 0x87,0x22, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0x1B,0xE0, 0xF6,0x02, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x1B,0xE8, 0x20,0x32, 0x00,0x00, 0x86,0xAE, 0x00,0x04, 0x87,0x22, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x1B,0xE9, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x1B,0xF9, 0x20,0x26, 0x00,0x00, 0xF4,0x82,
-0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00, 0x1C,0x04, 0xF3,0x02, 0x00,0x01, 0x93,0x16,
-0xFF,0xAC, 0x83,0x16, 0xFF,0xAC, 0x00,0x00, 0x00,0x01, 0x20,0x1A, 0x00,0x00, 0xE6,0x00,
-0x1C,0x45, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x76,0xB9,
-0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x38,0x00, 0x06,0xB4,
-0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xE0,0x00, 0x1C,0xAC, 0x96,0x96,
-0xFF,0xF4, 0x27,0x14, 0x00,0x14, 0x97,0x13, 0xFF,0xFC, 0x94,0x13, 0xFF,0xFC, 0x93,0x93,
-0xFF,0xFC, 0x93,0x96, 0xFF,0xBC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93,
-0xFF,0xFC, 0x83,0x96, 0xFF,0xBC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x1C,0xA9, 0xF6,0x02,
-0x00,0x01, 0x87,0x16, 0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4,
-0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x38,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6,
-0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0x96,0x96, 0xFF,0xF4, 0x97,0x1E, 0x00,0x08, 0xE0,0x00,
-0x1C,0xB0, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x1E,0x15, 0xF3,0x02, 0x00,0x01, 0xF6,0x84, 0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x85,0xB6,
-0x0E,0xF4, 0x86,0x36, 0x0E,0xF8, 0x20,0x2E, 0x00,0x10, 0xE2,0x00, 0x1C,0xDC, 0x20,0x32,
-0x00,0x10, 0xE2,0x00, 0x1C,0xF9, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x0F,0x00, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x0F,0x00, 0x87,0x36, 0x0F,0x00, 0xE0,0x00,
-0x1D,0x24, 0xF7,0x02, 0x00,0x00, 0x07,0x30, 0x00,0x01, 0xC0,0x3A, 0x5A,0x00, 0xE6,0x00,
-0x1D,0x1D, 0xF6,0x82, 0x00,0x00, 0x20,0x32, 0x00,0x10, 0xE6,0x00, 0x1D,0x20, 0x20,0x2E,
-0x00,0x00, 0xE6,0x00, 0x1D,0x24, 0xC7,0x34, 0x00,0x00, 0xF6,0x82, 0x00,0x01, 0xC7,0x34,
-0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x1E,0x14, 0xF3,0x02, 0x00,0x01, 0xF3,0x04,
-0x32,0xCC, 0x00,0x00, 0x00,0x01, 0x93,0x16, 0xFF,0xDC, 0x93,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x43,0x68, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x1D,0xFC, 0xF3,0x02, 0x00,0x00, 0x83,0x16, 0xFF,0xDC, 0x00,0x00, 0x00,0x01, 0x86,0x1A,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x1D,0x91, 0x76,0xB1,
-0x00,0x02, 0x87,0x1A, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x1A,
-0x00,0x0C, 0x87,0x1A, 0x00,0x0C, 0xE0,0x00, 0x1D,0xFC, 0xF3,0x02, 0x00,0x00, 0xF3,0x02,
-0x00,0x4C, 0x93,0x13, 0xFF,0xFC, 0xC6,0xB4, 0x60,0x00, 0x77,0x35, 0x00,0x04, 0xC7,0x38,
-0x6A,0x00, 0x83,0x16, 0xFF,0xDC, 0xC7,0x38, 0x60,0x00, 0xC7,0x38, 0x30,0x00, 0x07,0x38,
-0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0xF3,0x06, 0x7A,0x28, 0x93,0x13, 0xFF,0xFC, 0x96,0x16,
-0xFF,0xB4, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0x86,0x16,
-0xFF,0xB4, 0x00,0x00, 0x00,0x01, 0x06,0x30, 0x00,0x01, 0x20,0x32, 0x00,0x11, 0xE6,0x00,
-0x1D,0xEC, 0x00,0x00, 0x00,0x01, 0xF6,0x02, 0x00,0x00, 0x83,0x16, 0xFF,0xDC, 0x00,0x00,
-0x00,0x01, 0x96,0x1A, 0x00,0x00, 0xF3,0x02, 0x00,0x01, 0x93,0x16, 0xFF,0xD4, 0x83,0x16,
-0xFF,0xD4, 0x00,0x00, 0x00,0x01, 0x20,0x1A, 0x00,0x00, 0xE6,0x00, 0x1E,0x18, 0xF3,0x02,
-0x00,0x01, 0x93,0x16, 0xFF,0xE4, 0x83,0x16, 0xFF,0xE4, 0x00,0x00, 0x00,0x01, 0x20,0x1A,
-0x00,0x00, 0xE6,0x00, 0x1F,0x35, 0xF6,0x82, 0x0C,0xAB, 0xF7,0x04, 0x32,0xB4, 0x83,0x16,
-0xFF,0xD4, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x32,0xB4, 0xF7,0x04, 0x32,0xB4, 0x20,0x1A,
-0x00,0x00, 0xE6,0x00, 0x1E,0x70, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x32,0xC0, 0xF3,0x06,
-0xE0,0x30, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00, 0x1E,0x70, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x32,0xE8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x32,0xE8, 0xF7,0x04,
-0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x1E,0xAD, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0A, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x1E,0xAC, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x71,0xD4, 0xF6,0x84,
-0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00, 0x1E,0xC8, 0xF7,0x05,
-0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84, 0x71,0xD4, 0xF7,0x04, 0x71,0xD0, 0xF0,0x05,
-0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0xF6,0x84, 0x32,0xD0, 0x00,0x00,
-0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x25,0xD9, 0xF7,0x05, 0x71,0xC8, 0xF7,0x04,
-0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x25,0x79, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x25,0x78, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x25,0x78, 0x00,0x00, 0x00,0x01, 0xE0,0x00, 0x25,0xDC, 0xF3,0x06,
-0x31,0x9C, 0xF0,0x05, 0x32,0xE8, 0xF7,0x04, 0x32,0xC0, 0xF6,0x04, 0x6F,0x54, 0x96,0xBA,
-0x00,0x04, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x1F,0x60, 0xF3,0x02, 0x00,0x0C, 0xF3,0x02,
-0x00,0x01, 0xF3,0x05, 0x6F,0x54, 0xE0,0x00, 0x1F,0x68, 0xF7,0x02, 0x00,0x01, 0xF3,0x05,
-0x6F,0x58, 0xF7,0x02, 0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x1F,0x7C, 0xF3,0x06,
-0x2F,0x6C, 0xE0,0x00, 0x26,0x8C, 0xF3,0x05, 0x32,0xD4, 0xF5,0x84, 0x7A,0x70, 0x24,0x94,
-0x00,0x10, 0x20,0x2E, 0x00,0x01, 0xE6,0x00, 0x22,0x84, 0xF5,0x85, 0x7A,0xA0, 0xF7,0x02,
-0x00,0x01, 0xF6,0x04, 0x32,0xC8, 0xF7,0x05, 0x7A,0x70, 0xF7,0x04, 0x32,0xC4, 0xF6,0x84,
-0x32,0xC0, 0xF6,0x05, 0x7A,0x2C, 0x90,0x02, 0xFF,0x80, 0x90,0x02, 0xFF,0x38, 0xF5,0x84,
-0x7A,0x28, 0x07,0x38, 0x00,0x24, 0x95,0x82, 0xFF,0x3C, 0x97,0x02, 0xFF,0x40, 0x96,0x02,
-0xFF,0x44, 0x87,0x36, 0x14,0x10, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x97,0x36,
-0x14,0x10, 0x87,0x36, 0x14,0x18, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x14,0x18, 0x87,0x36, 0x14,0x18, 0xF0,0x05, 0x6F,0x50, 0xF7,0x04, 0x32,0xB8, 0x95,0x96,
-0xFF,0xEC, 0xC7,0x38, 0x60,0x00, 0xF7,0x05, 0x32,0xB8, 0xF7,0x04, 0x32,0xBC, 0xF3,0x06,
-0x2F,0xF8, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x32,0xBC, 0xF7,0x04, 0x32,0xBC, 0xF3,0x05,
-0x32,0xD4, 0xF7,0x06, 0x0C,0x3E, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x20,0x34, 0x00,0x00,
-0x00,0x01, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x20,0x25, 0x00,0x00, 0x00,0x01, 0xF7,0x06,
-0x0C,0x3E, 0xC7,0x7C, 0x74,0x00, 0x20,0x3A, 0x00,0x10, 0xE6,0x00, 0x26,0x8C, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x32,0xE4, 0xFF,0x82, 0x00,0x10, 0xF5,0x84, 0x6F,0x58, 0x07,0x38,
-0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x20,0x90, 0xF7,0x05, 0x32,0xE4, 0xF7,0x04,
-0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39,
-0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x20,0x84, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF3,0x02, 0x00,0x22, 0xE0,0x00, 0x20,0x94, 0xF3,0x05, 0x6F,0x58, 0xF0,0x05,
-0x6F,0x54, 0xF5,0x84, 0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x90,0x2E, 0x00,0x04, 0x87,0x2E,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00, 0x21,0xC0, 0x00,0x00,
-0x00,0x01, 0x87,0x02, 0xFF,0x38, 0x03,0x2C, 0x0E,0xF4, 0x93,0x16, 0xFF,0xCC, 0xF7,0x05,
-0x7A,0x68, 0x93,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xB8, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x43,0xA0, 0x97,0x93, 0xFF,0xFC, 0x85,0x96, 0xFF,0xB8, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x21,0x7C, 0x00,0x00, 0x00,0x01, 0x86,0x2E, 0x0E,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x32,
-0x00,0x10, 0xE2,0x00, 0x21,0x19, 0xF3,0x02, 0x00,0x4C, 0x87,0x2E, 0x0F,0x00, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E, 0x0F,0x00, 0x87,0x2E, 0x0F,0x00, 0xE0,0x00,
-0x21,0x7C, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0xF3,0x06, 0x7A,0x28, 0x93,0x13,
-0xFF,0xFC, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35, 0x00,0x04, 0xC7,0x38,
-0x6A,0x00, 0x83,0x16, 0xFF,0xCC, 0xC7,0x38, 0x60,0x00, 0xC7,0x38, 0x30,0x00, 0x07,0x38,
-0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xB8, 0x96,0x16, 0xFF,0xB4, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0x86,0x16, 0xFF,0xB4, 0x85,0x96,
-0xFF,0xB8, 0x06,0x30, 0x00,0x01, 0x20,0x32, 0x00,0x11, 0xE6,0x00, 0x21,0x78, 0x00,0x00,
-0x00,0x01, 0xF6,0x02, 0x00,0x00, 0x96,0x2E, 0x0E,0xF8, 0xF7,0x04, 0x32,0xC0, 0xF3,0x06,
-0xE0,0x30, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00, 0x21,0xC0, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8, 0x00,0x1E, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00,
-0x21,0xC1, 0x00,0x00, 0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0xF7,0x04,
-0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x21,0xFD, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0A, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x21,0xFC, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x71,0xD4, 0xF6,0x84,
-0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00, 0x22,0x18, 0xF7,0x05,
-0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84, 0x71,0xD4, 0xF7,0x04, 0x71,0xD0, 0xF0,0x05,
-0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0xF6,0x84, 0x32,0xD0, 0x00,0x00,
-0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x25,0xD9, 0xF7,0x05, 0x71,0xC8, 0xF7,0x04,
-0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x25,0x79, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x25,0x78, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x25,0x78, 0x00,0x00, 0x00,0x01, 0xE0,0x00, 0x25,0xDC, 0xF3,0x06,
-0x31,0x9C, 0xF0,0x05, 0x7A,0x88, 0x90,0x02, 0xFF,0x38, 0xF0,0x05, 0x6F,0x50, 0x90,0x02,
-0xFF,0x80, 0xF7,0x04, 0x32,0xC4, 0xF3,0x06, 0x32,0x28, 0xF3,0x05, 0x32,0xD4, 0xF6,0x04,
-0x32,0xC8, 0xF6,0x84, 0x7A,0x2C, 0xF5,0x02, 0x00,0x00, 0x07,0x38, 0x00,0x24, 0xF7,0x05,
-0x7A,0x98, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x22,0xD5, 0xF6,0x05, 0x7A,0x90, 0xC0,0x2A,
-0x5A,0x00, 0xE6,0x00, 0x26,0x20, 0xC0,0x32, 0x6A,0x00, 0xEE,0x00, 0x26,0x21, 0x00,0x00,
-0x00,0x01, 0xF6,0x84, 0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x14,0x10, 0x00,0x00,
-0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x97,0x36, 0x14,0x10, 0x87,0x36, 0x14,0x18, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x14,0x18, 0x87,0x36, 0x14,0x18, 0xF7,0x04,
-0x32,0xB8, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x60,0x00, 0xF7,0x05, 0x32,0xB8, 0xF7,0x04,
-0x32,0xBC, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x32,0xBC, 0xF7,0x04,
-0x32,0xBC, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x23,0x45, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x32,0xE0, 0xF5,0x05, 0x7A,0x70, 0x07,0x38, 0x00,0x01, 0xE0,0x00, 0x23,0x48, 0xF7,0x05,
-0x32,0xE0, 0xF5,0x05, 0x7A,0x70, 0xF5,0x84, 0x6F,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x2E,
-0x00,0x21, 0xE2,0x00, 0x23,0x8C, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x23,0x80, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02,
-0x00,0x22, 0xE0,0x00, 0x23,0x90, 0xF3,0x05, 0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF5,0x84,
-0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x90,0x2E, 0x00,0x04, 0x87,0x2E, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00, 0x24,0xBC, 0x00,0x00, 0x00,0x01, 0x87,0x02,
-0xFF,0x38, 0x03,0x2C, 0x0E,0xF4, 0x93,0x16, 0xFF,0xC4, 0xF7,0x05, 0x7A,0x68, 0x93,0x13,
-0xFF,0xFC, 0x95,0x96, 0xFF,0xB8, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x43,0xA0, 0x97,0x93,
-0xFF,0xFC, 0x85,0x96, 0xFF,0xB8, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x24,0x78, 0x00,0x00,
-0x00,0x01, 0x86,0x2E, 0x0E,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x10, 0xE2,0x00,
-0x24,0x15, 0xF3,0x02, 0x00,0x4C, 0x87,0x2E, 0x0F,0x00, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0x97,0x2E, 0x0F,0x00, 0x87,0x2E, 0x0F,0x00, 0xE0,0x00, 0x24,0x78, 0x00,0x00,
-0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0xF3,0x06, 0x7A,0x28, 0x93,0x13, 0xFF,0xFC, 0x76,0xB1,
-0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35, 0x00,0x04, 0xC7,0x38, 0x6A,0x00, 0x83,0x16,
-0xFF,0xC4, 0xC7,0x38, 0x60,0x00, 0xC7,0x38, 0x30,0x00, 0x07,0x38, 0x00,0x10, 0x97,0x13,
-0xFF,0xFC, 0x95,0x96, 0xFF,0xB8, 0x96,0x16, 0xFF,0xB4, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0x86,0x16, 0xFF,0xB4, 0x85,0x96, 0xFF,0xB8, 0x06,0x30,
-0x00,0x01, 0x20,0x32, 0x00,0x11, 0xE6,0x00, 0x24,0x74, 0x00,0x00, 0x00,0x01, 0xF6,0x02,
-0x00,0x00, 0x96,0x2E, 0x0E,0xF8, 0xF7,0x04, 0x32,0xC0, 0xF3,0x06, 0xE0,0x30, 0xC0,0x3A,
-0x32,0x00, 0xE6,0x00, 0x24,0xBC, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0xE0,0x18, 0x00,0x00,
-0x00,0x01, 0x77,0xB8, 0x00,0x1E, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00, 0x24,0xBD, 0x00,0x00,
-0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0xF7,0x04, 0x71,0xC4, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x24,0xF9, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04,
-0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39,
-0x00,0x02, 0xF3,0x02, 0x00,0x0A, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x24,0xF8, 0xB3,0x3A,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x71,0xD4, 0xF6,0x84, 0x71,0xCC, 0x07,0x38,
-0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00, 0x25,0x14, 0xF7,0x05, 0x71,0xD4, 0xF0,0x05,
-0x71,0xD4, 0xF6,0x84, 0x71,0xD4, 0xF7,0x04, 0x71,0xD0, 0xF0,0x05, 0x71,0xC4, 0xC0,0x36,
-0x72,0x00, 0x47,0x0C, 0x00,0x01, 0xF6,0x84, 0x32,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x36,
-0x00,0x00, 0xE6,0x00, 0x25,0xD9, 0xF7,0x05, 0x71,0xC8, 0xF7,0x04, 0x71,0x98, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x25,0x79, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x25,0x78, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x25,0xD1, 0x00,0x00, 0x00,0x01, 0xF5,0x84, 0x76,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x2E,
-0x00,0x21, 0xE2,0x00, 0x25,0xC4, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x25,0xB0, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02,
-0x00,0x22, 0xF3,0x05, 0x76,0xF8, 0xF3,0x04, 0x77,0x00, 0xE0,0x00, 0x25,0xC8, 0xF3,0x05,
-0x76,0xFC, 0xF0,0x05, 0x76,0xFC, 0xE0,0x00, 0x25,0xD8, 0xF0,0x05, 0x7A,0x78, 0xE0,0x00,
-0x25,0xDC, 0xF3,0x06, 0x31,0x9C, 0xF3,0x06, 0x2E,0xE0, 0xF3,0x05, 0x32,0xD4, 0xF7,0x04,
-0x71,0xC8, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x26,0x8C, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x09, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x26,0x8C, 0xB3,0x3A, 0x68,0x02, 0xE0,0x00, 0x26,0x8C, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04,
-0x7A,0x90, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xEE,0x00, 0x26,0x41, 0xC5,0xB4,
-0x00,0x00, 0xC7,0x38, 0x5A,0x00, 0xE0,0x00, 0x26,0x48, 0xF7,0x05, 0x7A,0x90, 0xC5,0xB8,
-0x00,0x00, 0xF0,0x05, 0x7A,0x90, 0xF6,0x84, 0x7A,0x88, 0xF7,0x06, 0x7A,0x28, 0x76,0x35,
-0x00,0x03, 0xA7,0x32, 0x70,0x02, 0x06,0xB4, 0x00,0x01, 0x97,0x16, 0xFF,0xEC, 0x84,0xA6,
-0xFF,0xFC, 0xF7,0x06, 0x7A,0x2C, 0xF3,0x04, 0x7A,0x98, 0x94,0x82, 0xFF,0x3C, 0x93,0x02,
-0xFF,0x40, 0x95,0x82, 0xFF,0x44, 0xB5,0xB2, 0x70,0x02, 0xF7,0x04, 0x7A,0x98, 0xF6,0x85,
-0x7A,0x88, 0xC7,0x38, 0x58,0x00, 0xF7,0x05, 0x7A,0x98, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x02, 0x00,0x01, 0xF7,0x05, 0x7A,0x78, 0xF7,0x06,
-0x30,0x84, 0xF7,0x05, 0x32,0xD4, 0xF7,0x04, 0x32,0xC4, 0x00,0x00, 0x00,0x01, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x06,0x10, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x50, 0xF7,0x04,
-0x32,0xD0, 0xF3,0x02, 0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x2A,0x71, 0x93,0x16,
-0xFF,0xE4, 0xF6,0x84, 0x32,0xC4, 0x86,0x16, 0xFF,0xE4, 0x87,0x36, 0x00,0x08, 0xC3,0x04,
-0x00,0x00, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00, 0x27,0x3C, 0x20,0x32, 0x00,0x00, 0x87,0x36,
-0x00,0x0C, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00, 0x27,0x3C, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x2A,0x70, 0xF3,0x02,
-0x00,0x00, 0xF7,0x04, 0x32,0xC0, 0x93,0x16, 0xFF,0xAC, 0xF5,0x84, 0x32,0xC4, 0x86,0x3A,
-0x14,0x28, 0x03,0xB8, 0x14,0x20, 0x04,0x2C, 0x00,0x08, 0x86,0xBA, 0x14,0x24, 0x00,0x00,
-0x00,0x01, 0xC0,0x32, 0x6A,0x00, 0xEC,0x00, 0x28,0x28, 0x96,0x16, 0xFF,0xEC, 0x77,0x31,
-0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x77,0x39, 0x00,0x02, 0xC6,0x38, 0x38,0x00, 0x06,0x30,
-0x00,0x0C, 0x86,0xB2, 0x00,0x00, 0x87,0x2E, 0x00,0x08, 0x85,0x16, 0xFF,0xAC, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x27,0xB8, 0xC4,0x84, 0x00,0x00, 0x86,0xB2, 0x00,0x04, 0x87,0x2E,
-0x00,0x0C, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x27,0xBC, 0x20,0x2A,
-0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00, 0x27,0xC9, 0x00,0x00,
-0x00,0x01, 0xF4,0x82, 0x00,0x00, 0x86,0xB2, 0x00,0x00, 0x87,0x22, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x28,0x04, 0xF5,0x82, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x28,0x0C, 0x20,0x2E, 0x00,0x00, 0x86,0xB2, 0x00,0x04, 0x87,0x22,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x28,0x0D, 0x20,0x2E,
-0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x28,0x1D, 0x20,0x26,
-0x00,0x00, 0xF4,0x82, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00, 0x28,0x28, 0xF3,0x02,
-0x00,0x01, 0x93,0x16, 0xFF,0xAC, 0x83,0x16, 0xFF,0xAC, 0x00,0x00, 0x00,0x01, 0x20,0x1A,
-0x00,0x00, 0xE6,0x00, 0x28,0x69, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xEC, 0x00,0x00,
-0x00,0x01, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4,
-0x38,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xE0,0x00,
-0x28,0xD0, 0x96,0x96, 0xFF,0xF4, 0x27,0x14, 0x00,0x14, 0x97,0x13, 0xFF,0xFC, 0x94,0x13,
-0xFF,0xFC, 0x93,0x93, 0xFF,0xFC, 0x93,0x96, 0xFF,0xBC, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0xBC, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x28,0xCD, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x76,0xB9,
-0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x38,0x00, 0x06,0xB4,
-0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0x96,0x96, 0xFF,0xF4, 0x97,0x1E,
-0x00,0x08, 0xE0,0x00, 0x28,0xD4, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x00, 0x20,0x32,
-0x00,0x00, 0xE6,0x00, 0x2A,0x70, 0xF3,0x02, 0x00,0x00, 0xF6,0x04, 0x32,0xC0, 0x93,0x16,
-0xFF,0xAC, 0x86,0xB2, 0x14,0x28, 0x03,0xB0, 0x14,0x20, 0x04,0x30, 0x14,0x8C, 0x87,0x32,
-0x14,0x24, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xEC,0x00, 0x29,0xBC, 0x96,0x96,
-0xFF,0xEC, 0x77,0x35, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0xC5,0xB8,
-0x38,0x00, 0x05,0xAC, 0x00,0x0C, 0x86,0xAE, 0x00,0x00, 0x87,0x32, 0x14,0x8C, 0x85,0x16,
-0xFF,0xAC, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x29,0x4C, 0xC4,0x84, 0x00,0x00, 0x86,0xAE,
-0x00,0x04, 0x87,0x32, 0x14,0x90, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x29,0x50, 0x20,0x2A, 0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00,
-0x29,0x5D, 0x00,0x00, 0x00,0x01, 0xF4,0x82, 0x00,0x00, 0x86,0xAE, 0x00,0x00, 0x87,0x22,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x29,0x98, 0xF6,0x02,
-0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x29,0xA0, 0x20,0x32, 0x00,0x00, 0x86,0xAE,
-0x00,0x04, 0x87,0x22, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0x29,0xA1, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x29,0xB1, 0x20,0x26, 0x00,0x00, 0xF4,0x82, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00,
-0x29,0xBC, 0xF3,0x02, 0x00,0x01, 0x93,0x16, 0xFF,0xAC, 0x83,0x16, 0xFF,0xAC, 0x00,0x00,
-0x00,0x01, 0x20,0x1A, 0x00,0x00, 0xE6,0x00, 0x29,0xFD, 0xF6,0x02, 0x00,0x01, 0x87,0x16,
-0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x38,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16,
-0xFF,0xF0, 0xE0,0x00, 0x2A,0x64, 0x96,0x96, 0xFF,0xF4, 0x27,0x14, 0x00,0x14, 0x97,0x13,
-0xFF,0xFC, 0x94,0x13, 0xFF,0xFC, 0x93,0x93, 0xFF,0xFC, 0x93,0x96, 0xFF,0xBC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0xBC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x2A,0x61, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xEC, 0x00,0x00,
-0x00,0x01, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4,
-0x38,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0x96,0x96,
-0xFF,0xF4, 0x97,0x1E, 0x00,0x08, 0xE0,0x00, 0x2A,0x68, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x2B,0xCD, 0xF3,0x02, 0x00,0x01, 0xF6,0x84,
-0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x85,0xB6, 0x0E,0xF4, 0x86,0x36, 0x0E,0xF8, 0x20,0x2E,
-0x00,0x10, 0xE2,0x00, 0x2A,0x94, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x2A,0xB1, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x0F,0x00, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x0F,0x00, 0x87,0x36, 0x0F,0x00, 0xE0,0x00, 0x2A,0xDC, 0xF7,0x02, 0x00,0x00, 0x07,0x30,
-0x00,0x01, 0xC0,0x3A, 0x5A,0x00, 0xE6,0x00, 0x2A,0xD5, 0xF6,0x82, 0x00,0x00, 0x20,0x32,
-0x00,0x10, 0xE6,0x00, 0x2A,0xD8, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x2A,0xDC, 0xC7,0x34,
-0x00,0x00, 0xF6,0x82, 0x00,0x01, 0xC7,0x34, 0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x2B,0xCC, 0xF3,0x02, 0x00,0x01, 0xF3,0x04, 0x32,0xCC, 0x00,0x00, 0x00,0x01, 0x93,0x16,
-0xFF,0xDC, 0x93,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x43,0x68, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x2B,0xB4, 0xF3,0x02, 0x00,0x00, 0x83,0x16,
-0xFF,0xDC, 0x00,0x00, 0x00,0x01, 0x86,0x1A, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x32,
-0x00,0x10, 0xE2,0x00, 0x2B,0x49, 0x76,0xB1, 0x00,0x02, 0x87,0x1A, 0x00,0x0C, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x1A, 0x00,0x0C, 0x87,0x1A, 0x00,0x0C, 0xE0,0x00,
-0x2B,0xB4, 0xF3,0x02, 0x00,0x00, 0xF3,0x02, 0x00,0x4C, 0x93,0x13, 0xFF,0xFC, 0xC6,0xB4,
-0x60,0x00, 0x77,0x35, 0x00,0x04, 0xC7,0x38, 0x6A,0x00, 0x83,0x16, 0xFF,0xDC, 0xC7,0x38,
-0x60,0x00, 0xC7,0x38, 0x30,0x00, 0x07,0x38, 0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0xF3,0x06,
-0x7A,0x28, 0x93,0x13, 0xFF,0xFC, 0x96,0x16, 0xFF,0xB4, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0x86,0x16, 0xFF,0xB4, 0x00,0x00, 0x00,0x01, 0x06,0x30,
-0x00,0x01, 0x20,0x32, 0x00,0x11, 0xE6,0x00, 0x2B,0xA4, 0x00,0x00, 0x00,0x01, 0xF6,0x02,
-0x00,0x00, 0x83,0x16, 0xFF,0xDC, 0x00,0x00, 0x00,0x01, 0x96,0x1A, 0x00,0x00, 0xF3,0x02,
-0x00,0x01, 0x93,0x16, 0xFF,0xD4, 0x83,0x16, 0xFF,0xD4, 0x00,0x00, 0x00,0x01, 0x20,0x1A,
-0x00,0x00, 0xE6,0x00, 0x2B,0xD0, 0xF3,0x02, 0x00,0x01, 0x93,0x16, 0xFF,0xE4, 0x83,0x16,
-0xFF,0xE4, 0x00,0x00, 0x00,0x01, 0x20,0x1A, 0x00,0x00, 0xE6,0x00, 0x2C,0xED, 0xF6,0x82,
-0x0C,0xAB, 0xF7,0x04, 0x32,0xB4, 0x83,0x16, 0xFF,0xD4, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x32,0xB4, 0xF7,0x04, 0x32,0xB4, 0x20,0x1A, 0x00,0x00, 0xE6,0x00, 0x2C,0x28, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x32,0xC0, 0xF3,0x06, 0xE0,0x30, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00,
-0x2C,0x28, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x32,0xE8, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x32,0xE8, 0xF7,0x04, 0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x2C,0x65, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02,
-0x00,0x0A, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x2C,0x64, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF7,0x04, 0x71,0xD4, 0xF6,0x84, 0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0xE6,0x00, 0x2C,0x80, 0xF7,0x05, 0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84,
-0x71,0xD4, 0xF7,0x04, 0x71,0xD0, 0xF0,0x05, 0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C,
-0x00,0x01, 0xF6,0x84, 0x32,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00,
-0x33,0x91, 0xF7,0x05, 0x71,0xC8, 0xF7,0x04, 0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x33,0x31, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x33,0x30, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x33,0x30, 0x00,0x00,
-0x00,0x01, 0xE0,0x00, 0x33,0x94, 0xF3,0x06, 0x31,0x9C, 0xF0,0x05, 0x32,0xE8, 0xF7,0x04,
-0x32,0xC0, 0xF6,0x04, 0x6F,0x54, 0x96,0xBA, 0x00,0x04, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x2D,0x18, 0xF3,0x02, 0x00,0x0C, 0xF3,0x02, 0x00,0x01, 0xF3,0x05, 0x6F,0x54, 0xE0,0x00,
-0x2D,0x20, 0xF7,0x02, 0x00,0x01, 0xF3,0x05, 0x6F,0x58, 0xF7,0x02, 0x00,0x00, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x2D,0x34, 0xF3,0x06, 0x2F,0x6C, 0xE0,0x00, 0x34,0x44, 0xF3,0x05,
-0x32,0xD4, 0xF5,0x84, 0x7A,0x70, 0x24,0x94, 0x00,0x10, 0x20,0x2E, 0x00,0x01, 0xE6,0x00,
-0x30,0x3C, 0xF5,0x85, 0x7A,0xA0, 0xF7,0x02, 0x00,0x01, 0xF6,0x04, 0x32,0xC8, 0xF7,0x05,
-0x7A,0x70, 0xF7,0x04, 0x32,0xC4, 0xF6,0x84, 0x32,0xC0, 0xF6,0x05, 0x7A,0x2C, 0x90,0x02,
-0xFF,0x80, 0x90,0x02, 0xFF,0x38, 0xF5,0x84, 0x7A,0x28, 0x07,0x38, 0x00,0x24, 0x95,0x82,
-0xFF,0x3C, 0x97,0x02, 0xFF,0x40, 0x96,0x02, 0xFF,0x44, 0x87,0x36, 0x14,0x10, 0x00,0x00,
-0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x97,0x36, 0x14,0x10, 0x87,0x36, 0x14,0x18, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x14,0x18, 0x87,0x36, 0x14,0x18, 0xF0,0x05,
-0x6F,0x50, 0xF7,0x04, 0x32,0xB8, 0x95,0x96, 0xFF,0xEC, 0xC7,0x38, 0x60,0x00, 0xF7,0x05,
-0x32,0xB8, 0xF7,0x04, 0x32,0xBC, 0xF3,0x06, 0x2F,0xF8, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x32,0xBC, 0xF7,0x04, 0x32,0xBC, 0xF3,0x05, 0x32,0xD4, 0xF7,0x06, 0x0C,0x3E, 0xC0,0x7E,
-0x74,0x00, 0xE6,0x00, 0x2D,0xEC, 0x00,0x00, 0x00,0x01, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00,
-0x2D,0xDD, 0x00,0x00, 0x00,0x01, 0xF7,0x06, 0x0C,0x3E, 0xC7,0x7C, 0x74,0x00, 0x20,0x3A,
-0x00,0x10, 0xE6,0x00, 0x34,0x44, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x32,0xE4, 0xFF,0x82,
-0x00,0x10, 0xF5,0x84, 0x6F,0x58, 0x07,0x38, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00,
-0x2E,0x48, 0xF7,0x05, 0x32,0xE4, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x2E,0x3C, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02, 0x00,0x22, 0xE0,0x00,
-0x2E,0x4C, 0xF3,0x05, 0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF5,0x84, 0x32,0xC0, 0x00,0x00,
-0x00,0x01, 0x90,0x2E, 0x00,0x04, 0x87,0x2E, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x02, 0xE6,0x00, 0x2F,0x78, 0x00,0x00, 0x00,0x01, 0x87,0x02, 0xFF,0x38, 0x03,0x2C,
-0x0E,0xF4, 0x93,0x16, 0xFF,0xCC, 0xF7,0x05, 0x7A,0x68, 0x93,0x13, 0xFF,0xFC, 0x95,0x96,
-0xFF,0xB8, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x43,0xA0, 0x97,0x93, 0xFF,0xFC, 0x85,0x96,
-0xFF,0xB8, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x2F,0x34, 0x00,0x00, 0x00,0x01, 0x86,0x2E,
-0x0E,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x2E,0xD1, 0xF3,0x02,
-0x00,0x4C, 0x87,0x2E, 0x0F,0x00, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E,
-0x0F,0x00, 0x87,0x2E, 0x0F,0x00, 0xE0,0x00, 0x2F,0x34, 0x00,0x00, 0x00,0x01, 0x93,0x13,
-0xFF,0xFC, 0xF3,0x06, 0x7A,0x28, 0x93,0x13, 0xFF,0xFC, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4,
-0x60,0x00, 0x77,0x35, 0x00,0x04, 0xC7,0x38, 0x6A,0x00, 0x83,0x16, 0xFF,0xCC, 0xC7,0x38,
-0x60,0x00, 0xC7,0x38, 0x30,0x00, 0x07,0x38, 0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0x95,0x96,
-0xFF,0xB8, 0x96,0x16, 0xFF,0xB4, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93,
-0xFF,0xFC, 0x86,0x16, 0xFF,0xB4, 0x85,0x96, 0xFF,0xB8, 0x06,0x30, 0x00,0x01, 0x20,0x32,
-0x00,0x11, 0xE6,0x00, 0x2F,0x30, 0x00,0x00, 0x00,0x01, 0xF6,0x02, 0x00,0x00, 0x96,0x2E,
-0x0E,0xF8, 0xF7,0x04, 0x32,0xC0, 0xF3,0x06, 0xE0,0x30, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00,
-0x2F,0x78, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8,
-0x00,0x1E, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00, 0x2F,0x79, 0x00,0x00, 0x00,0x01, 0x0F,0x81,
-0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0xF7,0x04, 0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x2F,0xB5, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02,
-0x00,0x0A, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x2F,0xB4, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF7,0x04, 0x71,0xD4, 0xF6,0x84, 0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0xE6,0x00, 0x2F,0xD0, 0xF7,0x05, 0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84,
-0x71,0xD4, 0xF7,0x04, 0x71,0xD0, 0xF0,0x05, 0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C,
-0x00,0x01, 0xF6,0x84, 0x32,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00,
-0x33,0x91, 0xF7,0x05, 0x71,0xC8, 0xF7,0x04, 0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x33,0x31, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x33,0x30, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x33,0x30, 0x00,0x00,
-0x00,0x01, 0xE0,0x00, 0x33,0x94, 0xF3,0x06, 0x31,0x9C, 0xF0,0x05, 0x7A,0x88, 0x90,0x02,
-0xFF,0x38, 0xF0,0x05, 0x6F,0x50, 0x90,0x02, 0xFF,0x80, 0xF7,0x04, 0x32,0xC4, 0xF3,0x06,
-0x32,0x28, 0xF3,0x05, 0x32,0xD4, 0xF6,0x04, 0x32,0xC8, 0xF6,0x84, 0x7A,0x2C, 0xF5,0x02,
-0x00,0x00, 0x07,0x38, 0x00,0x24, 0xF7,0x05, 0x7A,0x98, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x30,0x8D, 0xF6,0x05, 0x7A,0x90, 0xC0,0x2A, 0x5A,0x00, 0xE6,0x00, 0x33,0xD8, 0xC0,0x32,
-0x6A,0x00, 0xEE,0x00, 0x33,0xD9, 0x00,0x00, 0x00,0x01, 0xF6,0x84, 0x32,0xC0, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x14,0x10, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x97,0x36,
-0x14,0x10, 0x87,0x36, 0x14,0x18, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x14,0x18, 0x87,0x36, 0x14,0x18, 0xF7,0x04, 0x32,0xB8, 0x00,0x00, 0x00,0x01, 0xC7,0x38,
-0x60,0x00, 0xF7,0x05, 0x32,0xB8, 0xF7,0x04, 0x32,0xBC, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x32,0xBC, 0xF7,0x04, 0x32,0xBC, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x30,0xFD, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x32,0xE0, 0xF5,0x05, 0x7A,0x70, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0x31,0x00, 0xF7,0x05, 0x32,0xE0, 0xF5,0x05, 0x7A,0x70, 0xF5,0x84,
-0x6F,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x31,0x44, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x31,0x38, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02, 0x00,0x22, 0xE0,0x00, 0x31,0x48, 0xF3,0x05,
-0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF5,0x84, 0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x90,0x2E,
-0x00,0x04, 0x87,0x2E, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00,
-0x32,0x74, 0x00,0x00, 0x00,0x01, 0x87,0x02, 0xFF,0x38, 0x03,0x2C, 0x0E,0xF4, 0x93,0x16,
-0xFF,0xC4, 0xF7,0x05, 0x7A,0x68, 0x93,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xB8, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x43,0xA0, 0x97,0x93, 0xFF,0xFC, 0x85,0x96, 0xFF,0xB8, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x32,0x30, 0x00,0x00, 0x00,0x01, 0x86,0x2E, 0x0E,0xF8, 0x00,0x00,
-0x00,0x01, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x31,0xCD, 0xF3,0x02, 0x00,0x4C, 0x87,0x2E,
-0x0F,0x00, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E, 0x0F,0x00, 0x87,0x2E,
-0x0F,0x00, 0xE0,0x00, 0x32,0x30, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0xF3,0x06,
-0x7A,0x28, 0x93,0x13, 0xFF,0xFC, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35,
-0x00,0x04, 0xC7,0x38, 0x6A,0x00, 0x83,0x16, 0xFF,0xC4, 0xC7,0x38, 0x60,0x00, 0xC7,0x38,
-0x30,0x00, 0x07,0x38, 0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xB8, 0x96,0x16,
-0xFF,0xB4, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0x86,0x16,
-0xFF,0xB4, 0x85,0x96, 0xFF,0xB8, 0x06,0x30, 0x00,0x01, 0x20,0x32, 0x00,0x11, 0xE6,0x00,
-0x32,0x2C, 0x00,0x00, 0x00,0x01, 0xF6,0x02, 0x00,0x00, 0x96,0x2E, 0x0E,0xF8, 0xF7,0x04,
-0x32,0xC0, 0xF3,0x06, 0xE0,0x30, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00, 0x32,0x74, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8, 0x00,0x1E, 0x70,0x3E,
-0xFF,0xE1, 0xE6,0x00, 0x32,0x75, 0x00,0x00, 0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04,
-0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04,
-0x79,0xC8, 0xF7,0x04, 0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x32,0xB1, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0A, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x32,0xB0, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04,
-0x71,0xD4, 0xF6,0x84, 0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00,
-0x32,0xCC, 0xF7,0x05, 0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84, 0x71,0xD4, 0xF7,0x04,
-0x71,0xD0, 0xF0,0x05, 0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0xF6,0x84,
-0x32,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x33,0x91, 0xF7,0x05,
-0x71,0xC8, 0xF7,0x04, 0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x33,0x31, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x33,0x30, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x33,0x89, 0x00,0x00, 0x00,0x01, 0xF5,0x84,
-0x76,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x33,0x7C, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x33,0x68, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02, 0x00,0x22, 0xF3,0x05, 0x76,0xF8, 0xF3,0x04,
-0x77,0x00, 0xE0,0x00, 0x33,0x80, 0xF3,0x05, 0x76,0xFC, 0xF0,0x05, 0x76,0xFC, 0xE0,0x00,
-0x33,0x90, 0xF0,0x05, 0x7A,0x78, 0xE0,0x00, 0x33,0x94, 0xF3,0x06, 0x31,0x9C, 0xF3,0x06,
-0x2E,0xE0, 0xF3,0x05, 0x32,0xD4, 0xF7,0x04, 0x71,0xC8, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x34,0x44, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02,
-0x00,0x09, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x34,0x44, 0xB3,0x3A, 0x68,0x02, 0xE0,0x00,
-0x34,0x44, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x7A,0x90, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0xEE,0x00, 0x33,0xF9, 0xC5,0xB4, 0x00,0x00, 0xC7,0x38, 0x5A,0x00, 0xE0,0x00,
-0x34,0x00, 0xF7,0x05, 0x7A,0x90, 0xC5,0xB8, 0x00,0x00, 0xF0,0x05, 0x7A,0x90, 0xF6,0x84,
-0x7A,0x88, 0xF7,0x06, 0x7A,0x28, 0x76,0x35, 0x00,0x03, 0xA7,0x32, 0x70,0x02, 0x06,0xB4,
-0x00,0x01, 0x97,0x16, 0xFF,0xEC, 0x84,0xA6, 0xFF,0xFC, 0xF7,0x06, 0x7A,0x2C, 0xF3,0x04,
-0x7A,0x98, 0x94,0x82, 0xFF,0x3C, 0x93,0x02, 0xFF,0x40, 0x95,0x82, 0xFF,0x44, 0xB5,0xB2,
-0x70,0x02, 0xF7,0x04, 0x7A,0x98, 0xF6,0x85, 0x7A,0x88, 0xC7,0x38, 0x58,0x00, 0xF7,0x05,
-0x7A,0x98, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x20, 0xF5,0x84, 0x7A,0x70, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x01, 0xE6,0x00,
-0x37,0x6C, 0xF5,0x85, 0x7A,0xA0, 0xF7,0x02, 0x00,0x01, 0xF6,0x04, 0x32,0xC8, 0xF7,0x05,
-0x7A,0x70, 0xF7,0x04, 0x32,0xC4, 0xF6,0x84, 0x32,0xC0, 0xF6,0x05, 0x7A,0x2C, 0x90,0x02,
-0xFF,0x80, 0x90,0x02, 0xFF,0x38, 0xF5,0x84, 0x7A,0x28, 0x07,0x38, 0x00,0x24, 0x95,0x82,
-0xFF,0x3C, 0x97,0x02, 0xFF,0x40, 0x96,0x02, 0xFF,0x44, 0x87,0x36, 0x14,0x10, 0x00,0x00,
-0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x97,0x36, 0x14,0x10, 0x87,0x36, 0x14,0x18, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x14,0x18, 0x87,0x36, 0x14,0x18, 0xF0,0x05,
-0x6F,0x50, 0xF7,0x04, 0x32,0xB8, 0x95,0x96, 0xFF,0xF4, 0xC7,0x38, 0x60,0x00, 0xF7,0x05,
-0x32,0xB8, 0xF7,0x04, 0x32,0xBC, 0xF4,0x86, 0x2F,0xF8, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x32,0xBC, 0xF7,0x04, 0x32,0xBC, 0xF4,0x85, 0x32,0xD4, 0xF7,0x06, 0x0C,0x3E, 0xC0,0x7E,
-0x74,0x00, 0xE6,0x00, 0x35,0x1C, 0x00,0x00, 0x00,0x01, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00,
-0x35,0x0D, 0x00,0x00, 0x00,0x01, 0xF7,0x06, 0x0C,0x3E, 0xC7,0x7C, 0x74,0x00, 0x20,0x3A,
-0x00,0x10, 0xE6,0x00, 0x3B,0x70, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x32,0xE4, 0xFF,0x82,
-0x00,0x10, 0xF5,0x84, 0x6F,0x58, 0x07,0x38, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00,
-0x35,0x78, 0xF7,0x05, 0x32,0xE4, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x35,0x6C, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x22, 0xE0,0x00,
-0x35,0x7C, 0xF4,0x85, 0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF5,0x84, 0x32,0xC0, 0x00,0x00,
-0x00,0x01, 0x90,0x2E, 0x00,0x04, 0x87,0x2E, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x02, 0xE6,0x00, 0x36,0xA8, 0x00,0x00, 0x00,0x01, 0x87,0x02, 0xFF,0x38, 0x04,0xAC,
-0x0E,0xF4, 0x94,0x96, 0xFF,0xEC, 0xF7,0x05, 0x7A,0x68, 0x94,0x93, 0xFF,0xFC, 0x95,0x96,
-0xFF,0xDC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x43,0xA0, 0x97,0x93, 0xFF,0xFC, 0x85,0x96,
-0xFF,0xDC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x36,0x64, 0x00,0x00, 0x00,0x01, 0x86,0x2E,
-0x0E,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x36,0x01, 0xF4,0x82,
-0x00,0x4C, 0x87,0x2E, 0x0F,0x00, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E,
-0x0F,0x00, 0x87,0x2E, 0x0F,0x00, 0xE0,0x00, 0x36,0x64, 0x00,0x00, 0x00,0x01, 0x94,0x93,
-0xFF,0xFC, 0xF4,0x86, 0x7A,0x28, 0x94,0x93, 0xFF,0xFC, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4,
-0x60,0x00, 0x77,0x35, 0x00,0x04, 0xC7,0x38, 0x6A,0x00, 0x84,0x96, 0xFF,0xEC, 0xC7,0x38,
-0x60,0x00, 0xC7,0x38, 0x48,0x00, 0x07,0x38, 0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0x95,0x96,
-0xFF,0xDC, 0x96,0x16, 0xFF,0xD8, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93,
-0xFF,0xFC, 0x86,0x16, 0xFF,0xD8, 0x85,0x96, 0xFF,0xDC, 0x06,0x30, 0x00,0x01, 0x20,0x32,
-0x00,0x11, 0xE6,0x00, 0x36,0x60, 0x00,0x00, 0x00,0x01, 0xF6,0x02, 0x00,0x00, 0x96,0x2E,
-0x0E,0xF8, 0xF7,0x04, 0x32,0xC0, 0xF4,0x86, 0xE0,0x30, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x00,
-0x36,0xA8, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8,
-0x00,0x1E, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00, 0x36,0xA9, 0x00,0x00, 0x00,0x01, 0x0F,0x81,
-0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0xF7,0x04, 0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x36,0xE5, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82,
-0x00,0x0A, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x36,0xE4, 0xB4,0xBA, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF7,0x04, 0x71,0xD4, 0xF6,0x84, 0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0xE6,0x00, 0x37,0x00, 0xF7,0x05, 0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84,
-0x71,0xD4, 0xF7,0x04, 0x71,0xD0, 0xF0,0x05, 0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C,
-0x00,0x01, 0xF6,0x84, 0x32,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00,
-0x3A,0xC1, 0xF7,0x05, 0x71,0xC8, 0xF7,0x04, 0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x3A,0x61, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x3A,0x60, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x3A,0x60, 0x00,0x00,
-0x00,0x01, 0xE0,0x00, 0x3A,0xC4, 0xF4,0x86, 0x31,0x9C, 0xF0,0x05, 0x7A,0x88, 0x90,0x02,
-0xFF,0x38, 0xF0,0x05, 0x6F,0x50, 0x90,0x02, 0xFF,0x80, 0xF7,0x04, 0x32,0xC4, 0xF4,0x86,
-0x32,0x28, 0xF4,0x85, 0x32,0xD4, 0xF6,0x04, 0x32,0xC8, 0xF6,0x84, 0x7A,0x2C, 0xF5,0x02,
-0x00,0x00, 0x07,0x38, 0x00,0x24, 0xF7,0x05, 0x7A,0x98, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x37,0xBD, 0xF6,0x05, 0x7A,0x90, 0xC0,0x2A, 0x5A,0x00, 0xE6,0x00, 0x3B,0x08, 0xC0,0x32,
-0x6A,0x00, 0xEE,0x00, 0x3B,0x09, 0x00,0x00, 0x00,0x01, 0xF6,0x84, 0x32,0xC0, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x14,0x10, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x97,0x36,
-0x14,0x10, 0x87,0x36, 0x14,0x18, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x14,0x18, 0x87,0x36, 0x14,0x18, 0xF7,0x04, 0x32,0xB8, 0x00,0x00, 0x00,0x01, 0xC7,0x38,
-0x60,0x00, 0xF7,0x05, 0x32,0xB8, 0xF7,0x04, 0x32,0xBC, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x32,0xBC, 0xF7,0x04, 0x32,0xBC, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x38,0x2D, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x32,0xE0, 0xF5,0x05, 0x7A,0x70, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0x38,0x30, 0xF7,0x05, 0x32,0xE0, 0xF5,0x05, 0x7A,0x70, 0xF5,0x84,
-0x6F,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x38,0x74, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x38,0x68, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x22, 0xE0,0x00, 0x38,0x78, 0xF4,0x85,
-0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF5,0x84, 0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x90,0x2E,
-0x00,0x04, 0x87,0x2E, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00,
-0x39,0xA4, 0x00,0x00, 0x00,0x01, 0x87,0x02, 0xFF,0x38, 0x04,0xAC, 0x0E,0xF4, 0x94,0x96,
-0xFF,0xE4, 0xF7,0x05, 0x7A,0x68, 0x94,0x93, 0xFF,0xFC, 0x95,0x96, 0xFF,0xDC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x43,0xA0, 0x97,0x93, 0xFF,0xFC, 0x85,0x96, 0xFF,0xDC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x39,0x60, 0x00,0x00, 0x00,0x01, 0x86,0x2E, 0x0E,0xF8, 0x00,0x00,
-0x00,0x01, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x38,0xFD, 0xF4,0x82, 0x00,0x4C, 0x87,0x2E,
-0x0F,0x00, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E, 0x0F,0x00, 0x87,0x2E,
-0x0F,0x00, 0xE0,0x00, 0x39,0x60, 0x00,0x00, 0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0xF4,0x86,
-0x7A,0x28, 0x94,0x93, 0xFF,0xFC, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35,
-0x00,0x04, 0xC7,0x38, 0x6A,0x00, 0x84,0x96, 0xFF,0xE4, 0xC7,0x38, 0x60,0x00, 0xC7,0x38,
-0x48,0x00, 0x07,0x38, 0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xDC, 0x96,0x16,
-0xFF,0xD8, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0x86,0x16,
-0xFF,0xD8, 0x85,0x96, 0xFF,0xDC, 0x06,0x30, 0x00,0x01, 0x20,0x32, 0x00,0x11, 0xE6,0x00,
-0x39,0x5C, 0x00,0x00, 0x00,0x01, 0xF6,0x02, 0x00,0x00, 0x96,0x2E, 0x0E,0xF8, 0xF7,0x04,
-0x32,0xC0, 0xF4,0x86, 0xE0,0x30, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x00, 0x39,0xA4, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8, 0x00,0x1E, 0x70,0x3E,
-0xFF,0xE1, 0xE6,0x00, 0x39,0xA5, 0x00,0x00, 0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04,
-0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04,
-0x79,0xC8, 0xF7,0x04, 0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x39,0xE1, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82, 0x00,0x0A, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x39,0xE0, 0xB4,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04,
-0x71,0xD4, 0xF6,0x84, 0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00,
-0x39,0xFC, 0xF7,0x05, 0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84, 0x71,0xD4, 0xF7,0x04,
-0x71,0xD0, 0xF0,0x05, 0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0xF6,0x84,
-0x32,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x3A,0xC1, 0xF7,0x05,
-0x71,0xC8, 0xF7,0x04, 0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x3A,0x61, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x3A,0x60, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x3A,0xB9, 0x00,0x00, 0x00,0x01, 0xF5,0x84,
-0x76,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x3A,0xAC, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x3A,0x98, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x22, 0xF4,0x85, 0x76,0xF8, 0xF4,0x84,
-0x77,0x00, 0xE0,0x00, 0x3A,0xB0, 0xF4,0x85, 0x76,0xFC, 0xF0,0x05, 0x76,0xFC, 0xE0,0x00,
-0x3A,0xC0, 0xF0,0x05, 0x7A,0x78, 0xE0,0x00, 0x3A,0xC4, 0xF4,0x86, 0x31,0x9C, 0xF4,0x86,
-0x2E,0xE0, 0xF4,0x85, 0x32,0xD4, 0xF7,0x04, 0x71,0xC8, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x3B,0x70, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82,
-0x00,0x09, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x3B,0x70, 0xB4,0xBA, 0x68,0x02, 0xE0,0x00,
-0x3B,0x70, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x7A,0x90, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0xEE,0x00, 0x3B,0x29, 0xC5,0xB4, 0x00,0x00, 0xC7,0x38, 0x5A,0x00, 0xE0,0x00,
-0x3B,0x30, 0xF7,0x05, 0x7A,0x90, 0xC5,0xB8, 0x00,0x00, 0xF0,0x05, 0x7A,0x90, 0xF7,0x04,
-0x7A,0x88, 0xF6,0x86, 0x7A,0x28, 0x76,0x39, 0x00,0x03, 0xA6,0xB2, 0x68,0x02, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x7A,0x88, 0xF7,0x04, 0x7A,0x98, 0x96,0x96, 0xFF,0xF4, 0x96,0x82,
-0xFF,0x3C, 0xF4,0x84, 0x7A,0x98, 0xF6,0x86, 0x7A,0x2C, 0xC7,0x38, 0x58,0x00, 0x94,0x82,
-0xFF,0x40, 0x95,0x82, 0xFF,0x44, 0xB5,0xB2, 0x68,0x02, 0xF7,0x05, 0x7A,0x98, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x18, 0xF5,0x04,
-0x7A,0x88, 0xF7,0x06, 0x7A,0x2C, 0xF5,0x84, 0x7A,0x90, 0x76,0xA9, 0x00,0x03, 0xA6,0xB6,
-0x70,0x02, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x3B,0xCD, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x7A,0xA0, 0x00,0x00, 0x00,0x01, 0xC0,0x2A, 0x72,0x00, 0xE6,0x00, 0x3F,0x18, 0xC0,0x2E,
-0x6A,0x00, 0xEE,0x00, 0x3F,0x19, 0x00,0x00, 0x00,0x01, 0xF6,0x84, 0x32,0xC0, 0xF6,0x04,
-0x32,0xC8, 0x87,0x36, 0x14,0x10, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x97,0x36,
-0x14,0x10, 0x87,0x36, 0x14,0x18, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x14,0x18, 0x87,0x36, 0x14,0x18, 0xF7,0x04, 0x32,0xB8, 0x00,0x00, 0x00,0x01, 0xC7,0x38,
-0x60,0x00, 0xF7,0x05, 0x32,0xB8, 0xF7,0x04, 0x32,0xBC, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x32,0xBC, 0xF7,0x04, 0x32,0xBC, 0x20,0x2E, 0x00,0x00, 0xE6,0x00,
-0x3C,0x3D, 0xF6,0x82, 0x00,0x00, 0xF7,0x04, 0x32,0xE0, 0xF6,0x85, 0x7A,0x70, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0x3C,0x40, 0xF7,0x05, 0x32,0xE0, 0xF5,0x05, 0x7A,0x70, 0xF5,0x84,
-0x6F,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x3C,0x84, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x3C,0x78, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x22, 0xE0,0x00, 0x3C,0x88, 0xF4,0x85,
-0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF5,0x84, 0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x90,0x2E,
-0x00,0x04, 0x87,0x2E, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00,
-0x3D,0xB4, 0x00,0x00, 0x00,0x01, 0x87,0x02, 0xFF,0x38, 0x04,0xAC, 0x0E,0xF4, 0x94,0x96,
-0xFF,0xEC, 0xF7,0x05, 0x7A,0x68, 0x94,0x93, 0xFF,0xFC, 0x95,0x96, 0xFF,0xE4, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x43,0xA0, 0x97,0x93, 0xFF,0xFC, 0x85,0x96, 0xFF,0xE4, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x3D,0x70, 0x00,0x00, 0x00,0x01, 0x86,0x2E, 0x0E,0xF8, 0x00,0x00,
-0x00,0x01, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x3D,0x0D, 0xF4,0x82, 0x00,0x4C, 0x87,0x2E,
-0x0F,0x00, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E, 0x0F,0x00, 0x87,0x2E,
-0x0F,0x00, 0xE0,0x00, 0x3D,0x70, 0x00,0x00, 0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0xF4,0x86,
-0x7A,0x28, 0x94,0x93, 0xFF,0xFC, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35,
-0x00,0x04, 0xC7,0x38, 0x6A,0x00, 0x84,0x96, 0xFF,0xEC, 0xC7,0x38, 0x60,0x00, 0xC7,0x38,
-0x48,0x00, 0x07,0x38, 0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xE4, 0x96,0x16,
-0xFF,0xE0, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0x86,0x16,
-0xFF,0xE0, 0x85,0x96, 0xFF,0xE4, 0x06,0x30, 0x00,0x01, 0x20,0x32, 0x00,0x11, 0xE6,0x00,
-0x3D,0x6C, 0x00,0x00, 0x00,0x01, 0xF6,0x02, 0x00,0x00, 0x96,0x2E, 0x0E,0xF8, 0xF7,0x04,
-0x32,0xC0, 0xF4,0x86, 0xE0,0x30, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x00, 0x3D,0xB4, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8, 0x00,0x1E, 0x70,0x3E,
-0xFF,0xE1, 0xE6,0x00, 0x3D,0xB5, 0x00,0x00, 0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04,
-0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04,
-0x79,0xC8, 0xF7,0x04, 0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x3D,0xF1, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82, 0x00,0x0A, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x3D,0xF0, 0xB4,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04,
-0x71,0xD4, 0xF6,0x84, 0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00,
-0x3E,0x0C, 0xF7,0x05, 0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84, 0x71,0xD4, 0xF7,0x04,
-0x71,0xD0, 0xF0,0x05, 0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0xF6,0x84,
-0x32,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x3E,0xD1, 0xF7,0x05,
-0x71,0xC8, 0xF7,0x04, 0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x3E,0x71, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x3E,0x70, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x3E,0xC9, 0x00,0x00, 0x00,0x01, 0xF5,0x84,
-0x76,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x3E,0xBC, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x3E,0xA8, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x22, 0xF4,0x85, 0x76,0xF8, 0xF4,0x84,
-0x77,0x00, 0xE0,0x00, 0x3E,0xC0, 0xF4,0x85, 0x76,0xFC, 0xF0,0x05, 0x76,0xFC, 0xE0,0x00,
-0x3E,0xD0, 0xF0,0x05, 0x7A,0x78, 0xE0,0x00, 0x3E,0xD4, 0xF4,0x86, 0x31,0x9C, 0xF4,0x86,
-0x2E,0xE0, 0xF4,0x85, 0x32,0xD4, 0xF7,0x04, 0x71,0xC8, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x3F,0x80, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82,
-0x00,0x09, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x3F,0x80, 0xB4,0xBA, 0x68,0x02, 0xE0,0x00,
-0x3F,0x80, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x7A,0x90, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0xEE,0x00, 0x3F,0x39, 0xC5,0xB4, 0x00,0x00, 0xC7,0x38, 0x5A,0x00, 0xE0,0x00,
-0x3F,0x40, 0xF7,0x05, 0x7A,0x90, 0xC5,0xB8, 0x00,0x00, 0xF0,0x05, 0x7A,0x90, 0xF7,0x04,
-0x7A,0x88, 0xF6,0x86, 0x7A,0x28, 0x76,0x39, 0x00,0x03, 0xA6,0xB2, 0x68,0x02, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x7A,0x88, 0xF7,0x04, 0x7A,0x98, 0x96,0x96, 0xFF,0xF4, 0x96,0x82,
-0xFF,0x3C, 0xF4,0x84, 0x7A,0x98, 0xF6,0x86, 0x7A,0x2C, 0xC7,0x38, 0x58,0x00, 0x94,0x82,
-0xFF,0x40, 0x95,0x82, 0xFF,0x44, 0xB5,0xB2, 0x68,0x02, 0xF7,0x05, 0x7A,0x98, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x10, 0xF5,0x84,
-0x6F,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x3F,0xE4, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x3F,0xD8, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02, 0x00,0x22, 0xE0,0x00, 0x3F,0xE8, 0xF5,0x05,
-0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF5,0x84, 0x32,0xC0, 0x00,0x00, 0x00,0x01, 0x90,0x2E,
-0x00,0x04, 0x87,0x2E, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00,
-0x41,0x14, 0x00,0x00, 0x00,0x01, 0x87,0x02, 0xFF,0x38, 0x05,0x2C, 0x0E,0xF4, 0x95,0x16,
-0xFF,0xF4, 0xF7,0x05, 0x7A,0x68, 0x95,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xEC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x43,0xA0, 0x97,0x93, 0xFF,0xFC, 0x85,0x96, 0xFF,0xEC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x40,0xD0, 0x00,0x00, 0x00,0x01, 0x86,0x2E, 0x0E,0xF8, 0x00,0x00,
-0x00,0x01, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x40,0x6D, 0xF5,0x02, 0x00,0x4C, 0x87,0x2E,
-0x0F,0x00, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E, 0x0F,0x00, 0x87,0x2E,
-0x0F,0x00, 0xE0,0x00, 0x40,0xD0, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0xF5,0x06,
-0x7A,0x28, 0x95,0x13, 0xFF,0xFC, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35,
-0x00,0x04, 0xC7,0x38, 0x6A,0x00, 0x85,0x16, 0xFF,0xF4, 0xC7,0x38, 0x60,0x00, 0xC7,0x38,
-0x50,0x00, 0x07,0x38, 0x00,0x10, 0x97,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xEC, 0x96,0x16,
-0xFF,0xE8, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0x86,0x16,
-0xFF,0xE8, 0x85,0x96, 0xFF,0xEC, 0x06,0x30, 0x00,0x01, 0x20,0x32, 0x00,0x11, 0xE6,0x00,
-0x40,0xCC, 0x00,0x00, 0x00,0x01, 0xF6,0x02, 0x00,0x00, 0x96,0x2E, 0x0E,0xF8, 0xF7,0x04,
-0x32,0xC0, 0xF5,0x06, 0xE0,0x30, 0xC0,0x3A, 0x52,0x00, 0xE6,0x00, 0x41,0x14, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8, 0x00,0x1E, 0x70,0x3E,
-0xFF,0xE1, 0xE6,0x00, 0x41,0x15, 0x00,0x00, 0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04,
-0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04,
-0x79,0xC8, 0xF7,0x04, 0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x41,0x51, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x02, 0x00,0x0A, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x41,0x50, 0xB5,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04,
-0x71,0xD4, 0xF6,0x84, 0x71,0xCC, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00,
-0x41,0x6C, 0xF7,0x05, 0x71,0xD4, 0xF0,0x05, 0x71,0xD4, 0xF6,0x84, 0x71,0xD4, 0xF7,0x04,
-0x71,0xD0, 0xF0,0x05, 0x71,0xC4, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0xF6,0x84,
-0x32,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x42,0x31, 0xF7,0x05,
-0x71,0xC8, 0xF7,0x04, 0x71,0x98, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x41,0xD1, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x41,0xD0, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x42,0x29, 0x00,0x00, 0x00,0x01, 0xF5,0x84,
-0x76,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x42,0x1C, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x42,0x08, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02, 0x00,0x22, 0xF5,0x05, 0x76,0xF8, 0xF5,0x04,
-0x77,0x00, 0xE0,0x00, 0x42,0x20, 0xF5,0x05, 0x76,0xFC, 0xF0,0x05, 0x76,0xFC, 0xE0,0x00,
-0x42,0x30, 0xF0,0x05, 0x7A,0x78, 0xE0,0x00, 0x42,0x34, 0xF5,0x06, 0x31,0x9C, 0xF5,0x06,
-0x2E,0xE0, 0xF5,0x05, 0x32,0xD4, 0xF7,0x04, 0x71,0xC8, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x42,0x74, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x02,
-0x00,0x09, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x42,0x74, 0xB5,0x3A, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06,
-0x32,0xD4, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x2E,0xE0, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x32,0xD4, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x2F,0x6C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x32,0xD4, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x2F,0xF8, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x06, 0x32,0xD4, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x30,0x84, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06,
-0x32,0xD4, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x31,0x10, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x32,0xD4, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x31,0x9C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x32,0xD4, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x32,0x28, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x87,0x16,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x86,0xBA, 0x00,0x00, 0x87,0x3A, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0x44,0x0C, 0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x85,0x96, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x86,0x2E,
-0x00,0x00, 0x86,0xAE, 0x00,0x04, 0x20,0x32, 0x00,0x10, 0xE2,0x00, 0x43,0xD0, 0x00,0x00,
-0x00,0x01, 0x20,0x36, 0x00,0x10, 0xE2,0x00, 0x43,0xED, 0x07,0x34, 0x00,0x01, 0x87,0x2E,
-0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E, 0x00,0x0C, 0x87,0x2E,
-0x00,0x0C, 0xE0,0x00, 0x44,0x14, 0xF4,0x02, 0x00,0x00, 0xC0,0x3A, 0x62,0x00, 0xE6,0x00,
-0x44,0x11, 0xF4,0x02, 0x00,0x00, 0x20,0x36, 0x00,0x10, 0xE6,0x00, 0x44,0x14, 0x00,0x00,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x44,0x14, 0x00,0x00, 0x00,0x01, 0xF4,0x02,
-0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x02,
-0x00,0x01, 0xF7,0x05, 0x35,0x24, 0xF7,0x04, 0x6F,0x44, 0x00,0x00, 0x00,0x01, 0xF7,0x05,
-0x35,0x28, 0xF7,0x06, 0x32,0xF4, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x35,0x30, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02,
-0x45,0x04, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02, 0x00,0x0D, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x32,0xF4, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x02, 0x4A,0x04, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02, 0x00,0x0F, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x33,0x80, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02, 0x4E,0xEC, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02,
-0x00,0x08, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x34,0x0C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02, 0x57,0x64, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x02, 0x00,0x07, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x34,0x98, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x14, 0xF7,0x04,
-0x75,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x45,0x2D, 0xF6,0x86,
-0x75,0xF8, 0xE0,0x00, 0x45,0x44, 0xF7,0x02, 0x00,0x00, 0xF7,0x04, 0x76,0x04, 0x00,0x00,
-0x00,0x01, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x87,0x3A, 0x00,0x18, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x45,0x5C, 0xF7,0x05, 0x35,0x48, 0xF4,0x86,
-0x33,0x80, 0xE0,0x00, 0x49,0xF0, 0xF4,0x85, 0x35,0x30, 0xF7,0x04, 0x6F,0x54, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x45,0x80, 0xF4,0x82, 0x00,0x08, 0xF4,0x82,
-0x00,0x01, 0xF4,0x85, 0x6F,0x54, 0xE0,0x00, 0x45,0x88, 0xF7,0x02, 0x00,0x01, 0xF4,0x85,
-0x6F,0x58, 0xF7,0x02, 0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x45,0xA0, 0xF4,0x82,
-0x00,0x04, 0xF4,0x86, 0x34,0x0C, 0xE0,0x00, 0x49,0xF0, 0xF4,0x85, 0x35,0x30, 0xF6,0x84,
-0x35,0x48, 0xF6,0x04, 0x35,0x2C, 0xF4,0xB7, 0x28,0x00, 0x07,0x34, 0x00,0x02, 0xF4,0x82,
-0x00,0x01, 0xF4,0xBB, 0x28,0x00, 0x87,0x32, 0x00,0x8C, 0xF4,0x82, 0x00,0x01, 0x97,0x36,
-0x00,0x18, 0x87,0x32, 0x00,0x90, 0xF4,0x85, 0x6F,0x50, 0x97,0x36, 0x00,0x04, 0x84,0xB2,
-0x00,0x84, 0x00,0x00, 0x00,0x01, 0x94,0xB6, 0x00,0x10, 0x84,0xB2, 0x00,0x88, 0x00,0x00,
-0x00,0x01, 0x94,0xB6, 0x00,0x14, 0x84,0xB6, 0x00,0x10, 0x00,0x00, 0x00,0x01, 0x94,0xB6,
-0x00,0x08, 0x84,0xB6, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x94,0xB6, 0x00,0x0C, 0x84,0xB2,
-0x00,0x98, 0x00,0x00, 0x00,0x01, 0xF4,0x85, 0x35,0x54, 0xF4,0x82, 0x00,0x01, 0x94,0x82,
-0xFF,0x80, 0xF5,0x04, 0x35,0x54, 0xF4,0x86, 0x34,0x98, 0xF4,0x85, 0x35,0x30, 0x95,0x02,
-0xFF,0x38, 0x85,0xB2, 0x00,0x00, 0x06,0xB4, 0x00,0x24, 0x95,0x82, 0xFF,0x3C, 0x96,0x82,
-0xFF,0x40, 0x87,0x32, 0x00,0x04, 0xF6,0x85, 0x35,0x50, 0x97,0x02, 0xFF,0x44, 0x86,0xB2,
-0x00,0x04, 0xF0,0x05, 0x35,0x4C, 0xF7,0x04, 0x35,0x40, 0x95,0x16, 0xFF,0xF4, 0x95,0x96,
-0xFF,0xF4, 0xC7,0x38, 0x68,0x00, 0xF7,0x05, 0x35,0x40, 0xF5,0x84, 0x35,0x28, 0x86,0xB2,
-0x00,0x04, 0x87,0x2E, 0x14,0x14, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x97,0x2E,
-0x14,0x14, 0x87,0x32, 0x00,0x80, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x01, 0xEE,0x00,
-0x49,0xF0, 0xF7,0x06, 0x0C,0x3E, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x46,0xA4, 0x00,0x00,
-0x00,0x01, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x46,0x95, 0x00,0x00, 0x00,0x01, 0xF7,0x06,
-0x0C,0x3E, 0xC7,0x7C, 0x74,0x00, 0x20,0x3A, 0x00,0x10, 0xE6,0x00, 0x49,0xF0, 0x00,0x00,
-0x00,0x01, 0xFF,0x82, 0x00,0x10, 0x86,0x82, 0xFF,0x38, 0xF7,0x04, 0x35,0x58, 0xF5,0x84,
-0x6F,0x58, 0xF6,0x85, 0x35,0x54, 0x07,0x38, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00,
-0x47,0x08, 0xF7,0x05, 0x35,0x58, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x46,0xFC, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x22, 0xE0,0x00,
-0x47,0x0C, 0xF4,0x85, 0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF6,0x84, 0x35,0x2C, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x94, 0xC4,0x84, 0x00,0x00, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x00,
-0x47,0x71, 0x00,0x00, 0x00,0x01, 0x86,0x36, 0x00,0x94, 0xF6,0x84, 0x35,0x54, 0x00,0x00,
-0x00,0x01, 0x76,0xB4, 0xFF,0xF0, 0xF7,0x04, 0x35,0x54, 0x96,0x96, 0xFF,0xF4, 0x47,0x39,
-0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xC6,0xB4, 0x70,0x00, 0xF7,0x04, 0x35,0x48, 0x77,0xB4,
-0x00,0x0F, 0x70,0x3E, 0xFF,0xE1, 0x07,0x38, 0x00,0x24, 0xE6,0x00, 0x47,0x69, 0xC6,0x38,
-0x60,0x00, 0x06,0xB4, 0x00,0x01, 0xC7,0x04, 0x6E,0x00, 0xF7,0x33, 0x28,0x00, 0xF6,0x84,
-0x35,0x44, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x0F, 0xE2,0x00, 0x47,0xBD, 0x07,0x38, 0x00,0x01, 0x87,0x36, 0x00,0x0C, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x00,0x0C, 0x87,0x36, 0x00,0x0C, 0xE0,0x00,
-0x47,0xD0, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x35,0x28, 0xF6,0x82, 0x00,0x01, 0x07,0x38,
-0x00,0x08, 0xE0,0x00, 0x49,0x68, 0xF7,0x05, 0x35,0x44, 0x20,0x3A, 0x00,0x10, 0xE6,0x00,
-0x47,0xCC, 0x00,0x00, 0x00,0x01, 0xF7,0x02, 0x00,0x00, 0x97,0x36, 0x00,0x04, 0xF7,0x04,
-0x35,0x3C, 0xF6,0x84, 0x35,0x28, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x35,0x3C, 0xF7,0x04,
-0x35,0x3C, 0x87,0x36, 0x14,0x1C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x14,0x1C, 0xF7,0x04, 0x76,0x04, 0x86,0xB6, 0x14,0x1C, 0xF6,0x04, 0x75,0xFC, 0x07,0x38,
-0x00,0x01, 0xF6,0x84, 0x76,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00,
-0x48,0x1C, 0xF7,0x05, 0x76,0x04, 0xF0,0x05, 0x76,0x04, 0xF6,0x84, 0x76,0x04, 0xF7,0x04,
-0x76,0x08, 0xF0,0x05, 0x75,0xFC, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0xE6,0x00, 0x48,0x81, 0xF7,0x05, 0x75,0xF8, 0xF7,0x04, 0x76,0x48, 0xF4,0x86,
-0x72,0x18, 0xC0,0x3A, 0x4A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x48,0x81, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82, 0x00,0x0E, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x48,0x80, 0xB4,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02,
-0x00,0x00, 0x20,0x2A, 0x00,0x02, 0xEE,0x00, 0x49,0x68, 0xF6,0x82, 0x00,0x00, 0xF6,0x84,
-0x35,0x28, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x02, 0xE6,0x00, 0x49,0x3C, 0x05,0xB4, 0x00,0x08, 0x95,0x93, 0xFF,0xFC, 0x95,0x16,
-0xFF,0xEC, 0x95,0x96, 0xFF,0xE8, 0x96,0x96, 0xFF,0xE4, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x5E,0xDC, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0xEC, 0x85,0x96, 0xFF,0xE8, 0x86,0x96,
-0xFF,0xE4, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x49,0x2C, 0xF7,0x02, 0x00,0x00, 0x86,0x36,
-0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x0F, 0xE2,0x00, 0x49,0x11, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x00,0x14, 0x87,0x36, 0x00,0x14, 0xE0,0x00, 0x49,0x2C, 0xF7,0x02, 0x00,0x00, 0x76,0xB1,
-0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35, 0x00,0x05, 0xC7,0x38, 0x6A,0x00, 0xC7,0x38,
-0x60,0x00, 0x07,0x38, 0x00,0x10, 0xC7,0x2C, 0x70,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x47,0xA8, 0xF7,0x05, 0x35,0x2C, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x4C, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x49,0x5C, 0x07,0x34, 0x14,0x94, 0xF4,0x84,
-0x6F,0x44, 0xE0,0x00, 0x49,0x60, 0xF4,0x85, 0x35,0x28, 0xF7,0x05, 0x35,0x28, 0xE0,0x00,
-0x48,0x84, 0x05,0x28, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x49,0xA1, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82, 0x00,0x0D, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x49,0xA8, 0xB4,0xBA, 0x68,0x02, 0xE0,0x00, 0x49,0xA8, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82,
-0x00,0x01, 0xF4,0x85, 0x35,0x24, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x44, 0xF4,0x86,
-0x32,0xF4, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x49,0xF0, 0xF4,0x85, 0x35,0x30, 0xF7,0x04,
-0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8, 0x00,0x1F, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00,
-0x49,0xF1, 0x00,0x00, 0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x14, 0xF7,0x04,
-0x75,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x4A,0x2D, 0xF6,0x86,
-0x75,0xF8, 0xE0,0x00, 0x4A,0x40, 0xF6,0x82, 0x00,0x00, 0xF7,0x04, 0x76,0x04, 0x00,0x00,
-0x00,0x01, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x86,0xBA, 0x00,0x18, 0xF7,0x04,
-0x6F,0x54, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x4A,0x64, 0xF6,0x85,
-0x35,0x48, 0xF4,0x82, 0x00,0x01, 0xF4,0x85, 0x6F,0x54, 0xE0,0x00, 0x4A,0x70, 0xF7,0x02,
-0x00,0x01, 0xF4,0x82, 0x00,0x08, 0xF4,0x85, 0x6F,0x58, 0xF7,0x02, 0x00,0x00, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x4A,0x88, 0xF4,0x82, 0x00,0x04, 0xF4,0x86, 0x34,0x0C, 0xE0,0x00,
-0x4E,0xD8, 0xF4,0x85, 0x35,0x30, 0xF6,0x84, 0x35,0x48, 0xF6,0x04, 0x35,0x2C, 0xF4,0xB7,
-0x28,0x00, 0x07,0x34, 0x00,0x02, 0xF4,0x82, 0x00,0x01, 0xF4,0xBB, 0x28,0x00, 0x87,0x32,
-0x00,0x8C, 0xF4,0x82, 0x00,0x01, 0x97,0x36, 0x00,0x18, 0x87,0x32, 0x00,0x90, 0xF4,0x85,
-0x6F,0x50, 0x97,0x36, 0x00,0x04, 0x84,0xB2, 0x00,0x84, 0x00,0x00, 0x00,0x01, 0x94,0xB6,
-0x00,0x10, 0x84,0xB2, 0x00,0x88, 0x00,0x00, 0x00,0x01, 0x94,0xB6, 0x00,0x14, 0x84,0xB6,
-0x00,0x10, 0x00,0x00, 0x00,0x01, 0x94,0xB6, 0x00,0x08, 0x84,0xB6, 0x00,0x14, 0x00,0x00,
-0x00,0x01, 0x94,0xB6, 0x00,0x0C, 0x84,0xB2, 0x00,0x98, 0x00,0x00, 0x00,0x01, 0xF4,0x85,
-0x35,0x54, 0xF4,0x82, 0x00,0x01, 0x94,0x82, 0xFF,0x80, 0xF5,0x04, 0x35,0x54, 0xF4,0x86,
-0x34,0x98, 0xF4,0x85, 0x35,0x30, 0x95,0x02, 0xFF,0x38, 0x85,0xB2, 0x00,0x00, 0x06,0xB4,
-0x00,0x24, 0x95,0x82, 0xFF,0x3C, 0x96,0x82, 0xFF,0x40, 0x87,0x32, 0x00,0x04, 0xF6,0x85,
-0x35,0x50, 0x97,0x02, 0xFF,0x44, 0x86,0xB2, 0x00,0x04, 0xF0,0x05, 0x35,0x4C, 0xF7,0x04,
-0x35,0x40, 0x95,0x16, 0xFF,0xF4, 0x95,0x96, 0xFF,0xF4, 0xC7,0x38, 0x68,0x00, 0xF7,0x05,
-0x35,0x40, 0xF5,0x84, 0x35,0x28, 0x86,0xB2, 0x00,0x04, 0x87,0x2E, 0x14,0x14, 0x00,0x00,
-0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x97,0x2E, 0x14,0x14, 0x87,0x32, 0x00,0x80, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x01, 0xEE,0x00, 0x4E,0xD8, 0xF7,0x06, 0x0C,0x3E, 0xC0,0x7E,
-0x74,0x00, 0xE6,0x00, 0x4B,0x8C, 0x00,0x00, 0x00,0x01, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00,
-0x4B,0x7D, 0x00,0x00, 0x00,0x01, 0xF7,0x06, 0x0C,0x3E, 0xC7,0x7C, 0x74,0x00, 0x20,0x3A,
-0x00,0x10, 0xE6,0x00, 0x4E,0xD8, 0x00,0x00, 0x00,0x01, 0xFF,0x82, 0x00,0x10, 0x86,0x82,
-0xFF,0x38, 0xF7,0x04, 0x35,0x58, 0xF5,0x84, 0x6F,0x58, 0xF6,0x85, 0x35,0x54, 0x07,0x38,
-0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x4B,0xF0, 0xF7,0x05, 0x35,0x58, 0xF7,0x04,
-0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39,
-0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x4B,0xE4, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF4,0x82, 0x00,0x22, 0xE0,0x00, 0x4B,0xF4, 0xF4,0x85, 0x6F,0x58, 0xF0,0x05,
-0x6F,0x54, 0xF6,0x84, 0x35,0x2C, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x94, 0xC4,0x84,
-0x00,0x00, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x00, 0x4C,0x59, 0x00,0x00, 0x00,0x01, 0x86,0x36,
-0x00,0x94, 0xF6,0x84, 0x35,0x54, 0x00,0x00, 0x00,0x01, 0x76,0xB4, 0xFF,0xF0, 0xF7,0x04,
-0x35,0x54, 0x96,0x96, 0xFF,0xF4, 0x47,0x39, 0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xC6,0xB4,
-0x70,0x00, 0xF7,0x04, 0x35,0x48, 0x77,0xB4, 0x00,0x0F, 0x70,0x3E, 0xFF,0xE1, 0x07,0x38,
-0x00,0x24, 0xE6,0x00, 0x4C,0x51, 0xC6,0x38, 0x60,0x00, 0x06,0xB4, 0x00,0x01, 0xC7,0x04,
-0x6E,0x00, 0xF7,0x33, 0x28,0x00, 0xF6,0x84, 0x35,0x44, 0x00,0x00, 0x00,0x01, 0x87,0x36,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x0F, 0xE2,0x00, 0x4C,0xA5, 0x07,0x38,
-0x00,0x01, 0x87,0x36, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x00,0x0C, 0x87,0x36, 0x00,0x0C, 0xE0,0x00, 0x4C,0xB8, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x35,0x28, 0xF6,0x82, 0x00,0x01, 0x07,0x38, 0x00,0x08, 0xE0,0x00, 0x4E,0x50, 0xF7,0x05,
-0x35,0x44, 0x20,0x3A, 0x00,0x10, 0xE6,0x00, 0x4C,0xB4, 0x00,0x00, 0x00,0x01, 0xF7,0x02,
-0x00,0x00, 0x97,0x36, 0x00,0x04, 0xF7,0x04, 0x35,0x3C, 0xF6,0x84, 0x35,0x28, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x35,0x3C, 0xF7,0x04, 0x35,0x3C, 0x87,0x36, 0x14,0x1C, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x14,0x1C, 0xF7,0x04, 0x76,0x04, 0x86,0xB6,
-0x14,0x1C, 0xF6,0x04, 0x75,0xFC, 0x07,0x38, 0x00,0x01, 0xF6,0x84, 0x76,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00, 0x4D,0x04, 0xF7,0x05, 0x76,0x04, 0xF0,0x05,
-0x76,0x04, 0xF6,0x84, 0x76,0x04, 0xF7,0x04, 0x76,0x08, 0xF0,0x05, 0x75,0xFC, 0xC0,0x36,
-0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x4D,0x69, 0xF7,0x05,
-0x75,0xF8, 0xF7,0x04, 0x76,0x48, 0xF4,0x86, 0x72,0x18, 0xC0,0x3A, 0x4A,0x00, 0x47,0x0C,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x4D,0x69, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04,
-0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39,
-0x00,0x02, 0xF4,0x82, 0x00,0x0E, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x4D,0x68, 0xB4,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02, 0x00,0x00, 0x20,0x2A, 0x00,0x02, 0xEE,0x00,
-0x4E,0x50, 0xF6,0x82, 0x00,0x00, 0xF6,0x84, 0x35,0x28, 0x00,0x00, 0x00,0x01, 0x87,0x36,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00, 0x4E,0x24, 0x05,0xB4,
-0x00,0x08, 0x95,0x93, 0xFF,0xFC, 0x95,0x16, 0xFF,0xEC, 0x95,0x96, 0xFF,0xE8, 0x96,0x96,
-0xFF,0xE4, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x5E,0xDC, 0x97,0x93, 0xFF,0xFC, 0x85,0x16,
-0xFF,0xEC, 0x85,0x96, 0xFF,0xE8, 0x86,0x96, 0xFF,0xE4, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x4E,0x14, 0xF7,0x02, 0x00,0x00, 0x86,0x36, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x20,0x32,
-0x00,0x0F, 0xE2,0x00, 0x4D,0xF9, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x14, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x00,0x14, 0x87,0x36, 0x00,0x14, 0xE0,0x00,
-0x4E,0x14, 0xF7,0x02, 0x00,0x00, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35,
-0x00,0x05, 0xC7,0x38, 0x6A,0x00, 0xC7,0x38, 0x60,0x00, 0x07,0x38, 0x00,0x10, 0xC7,0x2C,
-0x70,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x4C,0x90, 0xF7,0x05, 0x35,0x2C, 0xF6,0x84,
-0x35,0x28, 0xF7,0x04, 0x6F,0x4C, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x4E,0x44, 0x07,0x34, 0x14,0x94, 0xF4,0x84, 0x6F,0x44, 0xE0,0x00, 0x4E,0x48, 0xF4,0x85,
-0x35,0x28, 0xF7,0x05, 0x35,0x28, 0xE0,0x00, 0x4D,0x6C, 0x05,0x28, 0x00,0x01, 0x20,0x36,
-0x00,0x00, 0xE6,0x00, 0x4E,0x89, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00,
-0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82,
-0x00,0x0D, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x4E,0x90, 0xB4,0xBA, 0x68,0x02, 0xE0,0x00,
-0x4E,0x90, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x01, 0xF4,0x85, 0x35,0x24, 0xF6,0x84,
-0x35,0x28, 0xF7,0x04, 0x6F,0x44, 0xF4,0x86, 0x32,0xF4, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x4E,0xD8, 0xF4,0x85, 0x35,0x30, 0xF7,0x04, 0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8,
-0x00,0x1F, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00, 0x4E,0xD9, 0x00,0x00, 0x00,0x01, 0x0F,0x81,
-0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x14, 0xF6,0x84, 0x35,0x48, 0xF6,0x04, 0x35,0x2C, 0xF4,0x82,
-0x00,0x04, 0xF4,0xB7, 0x28,0x00, 0x07,0x34, 0x00,0x02, 0xF4,0x82, 0x00,0x01, 0xF4,0xBB,
-0x28,0x00, 0x87,0x32, 0x00,0x8C, 0xF4,0x82, 0x00,0x01, 0x97,0x36, 0x00,0x18, 0x87,0x32,
-0x00,0x90, 0xF4,0x85, 0x6F,0x50, 0x97,0x36, 0x00,0x04, 0x84,0xB2, 0x00,0x84, 0x00,0x00,
-0x00,0x01, 0x94,0xB6, 0x00,0x10, 0x84,0xB2, 0x00,0x88, 0x00,0x00, 0x00,0x01, 0x94,0xB6,
-0x00,0x14, 0x84,0xB6, 0x00,0x10, 0x00,0x00, 0x00,0x01, 0x94,0xB6, 0x00,0x08, 0x84,0xB6,
-0x00,0x14, 0x00,0x00, 0x00,0x01, 0x94,0xB6, 0x00,0x0C, 0x84,0xB2, 0x00,0x98, 0x00,0x00,
-0x00,0x01, 0xF4,0x85, 0x35,0x54, 0xF4,0x82, 0x00,0x01, 0x94,0x82, 0xFF,0x80, 0xF5,0x04,
-0x35,0x54, 0xF4,0x86, 0x34,0x98, 0xF4,0x85, 0x35,0x30, 0x95,0x02, 0xFF,0x38, 0x85,0xB2,
-0x00,0x00, 0x06,0xB4, 0x00,0x24, 0x95,0x82, 0xFF,0x3C, 0x96,0x82, 0xFF,0x40, 0x87,0x32,
-0x00,0x04, 0xF6,0x85, 0x35,0x50, 0x97,0x02, 0xFF,0x44, 0x86,0xB2, 0x00,0x04, 0xF0,0x05,
-0x35,0x4C, 0xF7,0x04, 0x35,0x40, 0x95,0x16, 0xFF,0xF4, 0x95,0x96, 0xFF,0xF4, 0xC7,0x38,
-0x68,0x00, 0xF7,0x05, 0x35,0x40, 0xF5,0x84, 0x35,0x28, 0x86,0xB2, 0x00,0x04, 0x87,0x2E,
-0x14,0x14, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x97,0x2E, 0x14,0x14, 0x87,0x32,
-0x00,0x80, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x01, 0xEE,0x00, 0x53,0x4C, 0xF7,0x06,
-0x0C,0x3E, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x50,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x7E,
-0x74,0x00, 0xE6,0x00, 0x4F,0xF1, 0x00,0x00, 0x00,0x01, 0xF7,0x06, 0x0C,0x3E, 0xC7,0x7C,
-0x74,0x00, 0x20,0x3A, 0x00,0x10, 0xE6,0x00, 0x53,0x4C, 0x00,0x00, 0x00,0x01, 0xFF,0x82,
-0x00,0x10, 0x86,0x82, 0xFF,0x38, 0xF7,0x04, 0x35,0x58, 0xF5,0x84, 0x6F,0x58, 0xF6,0x85,
-0x35,0x54, 0x07,0x38, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00, 0x50,0x64, 0xF7,0x05,
-0x35,0x58, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x50,0x58, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x22, 0xE0,0x00, 0x50,0x68, 0xF4,0x85,
-0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF6,0x84, 0x35,0x2C, 0x00,0x00, 0x00,0x01, 0x87,0x36,
-0x00,0x94, 0xC4,0x84, 0x00,0x00, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x00, 0x50,0xCD, 0x00,0x00,
-0x00,0x01, 0x86,0x36, 0x00,0x94, 0xF6,0x84, 0x35,0x54, 0x00,0x00, 0x00,0x01, 0x76,0xB4,
-0xFF,0xF0, 0xF7,0x04, 0x35,0x54, 0x96,0x96, 0xFF,0xF4, 0x47,0x39, 0x00,0x00, 0x97,0x16,
-0xFF,0xF0, 0xC6,0xB4, 0x70,0x00, 0xF7,0x04, 0x35,0x48, 0x77,0xB4, 0x00,0x0F, 0x70,0x3E,
-0xFF,0xE1, 0x07,0x38, 0x00,0x24, 0xE6,0x00, 0x50,0xC5, 0xC6,0x38, 0x60,0x00, 0x06,0xB4,
-0x00,0x01, 0xC7,0x04, 0x6E,0x00, 0xF7,0x33, 0x28,0x00, 0xF6,0x84, 0x35,0x44, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x0F, 0xE2,0x00,
-0x51,0x19, 0x07,0x38, 0x00,0x01, 0x87,0x36, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0x97,0x36, 0x00,0x0C, 0x87,0x36, 0x00,0x0C, 0xE0,0x00, 0x51,0x2C, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x35,0x28, 0xF6,0x82, 0x00,0x01, 0x07,0x38, 0x00,0x08, 0xE0,0x00,
-0x52,0xC4, 0xF7,0x05, 0x35,0x44, 0x20,0x3A, 0x00,0x10, 0xE6,0x00, 0x51,0x28, 0x00,0x00,
-0x00,0x01, 0xF7,0x02, 0x00,0x00, 0x97,0x36, 0x00,0x04, 0xF7,0x04, 0x35,0x3C, 0xF6,0x84,
-0x35,0x28, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x35,0x3C, 0xF7,0x04, 0x35,0x3C, 0x87,0x36,
-0x14,0x1C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x14,0x1C, 0xF7,0x04,
-0x76,0x04, 0x86,0xB6, 0x14,0x1C, 0xF6,0x04, 0x75,0xFC, 0x07,0x38, 0x00,0x01, 0xF6,0x84,
-0x76,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00, 0x51,0x78, 0xF7,0x05,
-0x76,0x04, 0xF0,0x05, 0x76,0x04, 0xF6,0x84, 0x76,0x04, 0xF7,0x04, 0x76,0x08, 0xF0,0x05,
-0x75,0xFC, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0x51,0xDD, 0xF7,0x05, 0x75,0xF8, 0xF7,0x04, 0x76,0x48, 0xF4,0x86, 0x72,0x18, 0xC0,0x3A,
-0x4A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x51,0xDD, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82, 0x00,0x0E, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x51,0xDC, 0xB4,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02, 0x00,0x00, 0x20,0x2A,
-0x00,0x02, 0xEE,0x00, 0x52,0xC4, 0xF6,0x82, 0x00,0x00, 0xF6,0x84, 0x35,0x28, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x00,
-0x52,0x98, 0x05,0xB4, 0x00,0x08, 0x95,0x93, 0xFF,0xFC, 0x95,0x16, 0xFF,0xEC, 0x95,0x96,
-0xFF,0xE8, 0x96,0x96, 0xFF,0xE4, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x5E,0xDC, 0x97,0x93,
-0xFF,0xFC, 0x85,0x16, 0xFF,0xEC, 0x85,0x96, 0xFF,0xE8, 0x86,0x96, 0xFF,0xE4, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x52,0x88, 0xF7,0x02, 0x00,0x00, 0x86,0x36, 0x00,0x0C, 0x00,0x00,
-0x00,0x01, 0x20,0x32, 0x00,0x0F, 0xE2,0x00, 0x52,0x6D, 0x00,0x00, 0x00,0x01, 0x87,0x36,
-0x00,0x14, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x00,0x14, 0x87,0x36,
-0x00,0x14, 0xE0,0x00, 0x52,0x88, 0xF7,0x02, 0x00,0x00, 0x76,0xB1, 0x00,0x02, 0xC6,0xB4,
-0x60,0x00, 0x77,0x35, 0x00,0x05, 0xC7,0x38, 0x6A,0x00, 0xC7,0x38, 0x60,0x00, 0x07,0x38,
-0x00,0x10, 0xC7,0x2C, 0x70,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x51,0x04, 0xF7,0x05,
-0x35,0x2C, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x4C, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x52,0xB8, 0x07,0x34, 0x14,0x94, 0xF4,0x84, 0x6F,0x44, 0xE0,0x00,
-0x52,0xBC, 0xF4,0x85, 0x35,0x28, 0xF7,0x05, 0x35,0x28, 0xE0,0x00, 0x51,0xE0, 0x05,0x28,
-0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x52,0xFD, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04,
-0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39,
-0x00,0x02, 0xF4,0x82, 0x00,0x0D, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x53,0x04, 0xB4,0xBA,
-0x68,0x02, 0xE0,0x00, 0x53,0x04, 0xF0,0x05, 0x2D,0x38, 0xF4,0x82, 0x00,0x01, 0xF4,0x85,
-0x35,0x24, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x44, 0xF4,0x86, 0x32,0xF4, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x53,0x4C, 0xF4,0x85, 0x35,0x30, 0xF7,0x04, 0xE0,0x18, 0x00,0x00,
-0x00,0x01, 0x77,0xB8, 0x00,0x1F, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00, 0x53,0x4D, 0x00,0x00,
-0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x14, 0xF4,0x84, 0x35,0x54, 0xF6,0x84,
-0x35,0x4C, 0xF5,0x84, 0x35,0x2C, 0x94,0x82, 0xFF,0x38, 0x76,0xB5, 0x00,0x03, 0xA5,0x2E,
-0x68,0x02, 0x00,0x00, 0x00,0x01, 0x95,0x02, 0xFF,0x3C, 0xF3,0x84, 0x35,0x50, 0xC6,0xAC,
-0x68,0x00, 0x93,0x82, 0xFF,0x40, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x97,0x02,
-0xFF,0x44, 0x86,0x36, 0x00,0x04, 0xF7,0x04, 0x35,0x40, 0x00,0x00, 0x00,0x01, 0xC7,0x38,
-0x60,0x00, 0xF7,0x05, 0x35,0x40, 0xF6,0x04, 0x35,0x28, 0x86,0xB6, 0x00,0x04, 0x87,0x32,
-0x14,0x14, 0x94,0x96, 0xFF,0xF4, 0xC7,0x38, 0x68,0x00, 0x97,0x32, 0x14,0x14, 0x87,0x2E,
-0x00,0x80, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x01, 0xEE,0x00, 0x57,0x50, 0x95,0x16,
-0xFF,0xF4, 0xF7,0x06, 0x0C,0x3E, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x54,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x53,0xF5, 0x00,0x00, 0x00,0x01, 0xF7,0x06,
-0x0C,0x3E, 0xC7,0x7C, 0x74,0x00, 0x20,0x3A, 0x00,0x10, 0xE6,0x00, 0x57,0x50, 0x00,0x00,
-0x00,0x01, 0xFF,0x82, 0x00,0x10, 0x86,0x82, 0xFF,0x38, 0xF7,0x04, 0x35,0x58, 0xF5,0x84,
-0x6F,0x58, 0xF6,0x85, 0x35,0x54, 0x07,0x38, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00,
-0x54,0x68, 0xF7,0x05, 0x35,0x58, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x54,0x5C, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x82, 0x00,0x22, 0xE0,0x00,
-0x54,0x6C, 0xF3,0x85, 0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF6,0x84, 0x35,0x2C, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x94, 0xC3,0x84, 0x00,0x00, 0xC0,0x3A, 0x3A,0x00, 0xE6,0x00,
-0x54,0xD1, 0x00,0x00, 0x00,0x01, 0x86,0x36, 0x00,0x94, 0xF6,0x84, 0x35,0x54, 0x00,0x00,
-0x00,0x01, 0x76,0xB4, 0xFF,0xF0, 0xF7,0x04, 0x35,0x54, 0x96,0x96, 0xFF,0xF4, 0x47,0x39,
-0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xC6,0xB4, 0x70,0x00, 0xF7,0x04, 0x35,0x48, 0x77,0xB4,
-0x00,0x0F, 0x70,0x3E, 0xFF,0xE1, 0x07,0x38, 0x00,0x24, 0xE6,0x00, 0x54,0xC9, 0xC6,0x38,
-0x60,0x00, 0x06,0xB4, 0x00,0x01, 0xC7,0x04, 0x6E,0x00, 0xF7,0x33, 0x28,0x00, 0xF6,0x84,
-0x35,0x44, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x0F, 0xE2,0x00, 0x55,0x1D, 0x07,0x38, 0x00,0x01, 0x87,0x36, 0x00,0x0C, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x00,0x0C, 0x87,0x36, 0x00,0x0C, 0xE0,0x00,
-0x55,0x30, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x35,0x28, 0xF6,0x82, 0x00,0x01, 0x07,0x38,
-0x00,0x08, 0xE0,0x00, 0x56,0xC8, 0xF7,0x05, 0x35,0x44, 0x20,0x3A, 0x00,0x10, 0xE6,0x00,
-0x55,0x2C, 0x00,0x00, 0x00,0x01, 0xF7,0x02, 0x00,0x00, 0x97,0x36, 0x00,0x04, 0xF7,0x04,
-0x35,0x3C, 0xF6,0x84, 0x35,0x28, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x35,0x3C, 0xF7,0x04,
-0x35,0x3C, 0x87,0x36, 0x14,0x1C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x14,0x1C, 0xF7,0x04, 0x76,0x04, 0x86,0xB6, 0x14,0x1C, 0xF6,0x04, 0x75,0xFC, 0x07,0x38,
-0x00,0x01, 0xF6,0x84, 0x76,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00,
-0x55,0x7C, 0xF7,0x05, 0x76,0x04, 0xF0,0x05, 0x76,0x04, 0xF6,0x84, 0x76,0x04, 0xF7,0x04,
-0x76,0x08, 0xF0,0x05, 0x75,0xFC, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0xE6,0x00, 0x55,0xE1, 0xF7,0x05, 0x75,0xF8, 0xF7,0x04, 0x76,0x48, 0xF3,0x86,
-0x72,0x18, 0xC0,0x3A, 0x3A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x55,0xE1, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x82, 0x00,0x0E, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x55,0xE0, 0xB3,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02,
-0x00,0x00, 0x20,0x2A, 0x00,0x02, 0xEE,0x00, 0x56,0xC8, 0xF6,0x82, 0x00,0x00, 0xF6,0x84,
-0x35,0x28, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x02, 0xE6,0x00, 0x56,0x9C, 0x05,0xB4, 0x00,0x08, 0x95,0x93, 0xFF,0xFC, 0x95,0x16,
-0xFF,0xEC, 0x95,0x96, 0xFF,0xE8, 0x96,0x96, 0xFF,0xE4, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x5E,0xDC, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0xEC, 0x85,0x96, 0xFF,0xE8, 0x86,0x96,
-0xFF,0xE4, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x56,0x8C, 0xF7,0x02, 0x00,0x00, 0x86,0x36,
-0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x0F, 0xE2,0x00, 0x56,0x71, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x00,0x14, 0x87,0x36, 0x00,0x14, 0xE0,0x00, 0x56,0x8C, 0xF7,0x02, 0x00,0x00, 0x76,0xB1,
-0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35, 0x00,0x05, 0xC7,0x38, 0x6A,0x00, 0xC7,0x38,
-0x60,0x00, 0x07,0x38, 0x00,0x10, 0xC7,0x2C, 0x70,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x55,0x08, 0xF7,0x05, 0x35,0x2C, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x4C, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x56,0xBC, 0x07,0x34, 0x14,0x94, 0xF3,0x84,
-0x6F,0x44, 0xE0,0x00, 0x56,0xC0, 0xF3,0x85, 0x35,0x28, 0xF7,0x05, 0x35,0x28, 0xE0,0x00,
-0x55,0xE4, 0x05,0x28, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x57,0x01, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x82, 0x00,0x0D, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x57,0x08, 0xB3,0xBA, 0x68,0x02, 0xE0,0x00, 0x57,0x08, 0xF0,0x05, 0x2D,0x38, 0xF3,0x82,
-0x00,0x01, 0xF3,0x85, 0x35,0x24, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x44, 0xF3,0x86,
-0x32,0xF4, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x57,0x50, 0xF3,0x85, 0x35,0x30, 0xF7,0x04,
-0xE0,0x18, 0x00,0x00, 0x00,0x01, 0x77,0xB8, 0x00,0x1F, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00,
-0x57,0x51, 0x00,0x00, 0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x14, 0x87,0x02,
-0xFF,0x38, 0xF3,0x84, 0x35,0x2C, 0xF7,0x05, 0x35,0x54, 0x87,0x1E, 0x00,0x80, 0xF5,0x04,
-0x35,0x4C, 0x27,0x38, 0x00,0x01, 0xC0,0x2A, 0x72,0x00, 0xE6,0x00, 0x5A,0x4C, 0x00,0x00,
-0x00,0x01, 0xF5,0x84, 0x6F,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00,
-0x57,0xD8, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x57,0xCC, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02, 0x00,0x22, 0xE0,0x00,
-0x57,0xDC, 0xF3,0x05, 0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF6,0x84, 0x35,0x2C, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x94, 0xC3,0x04, 0x00,0x00, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00,
-0x58,0x41, 0x00,0x00, 0x00,0x01, 0x86,0x36, 0x00,0x94, 0xF6,0x84, 0x35,0x54, 0x00,0x00,
-0x00,0x01, 0x76,0xB4, 0xFF,0xF0, 0xF7,0x04, 0x35,0x54, 0x96,0x96, 0xFF,0xF4, 0x47,0x39,
-0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xC6,0xB4, 0x70,0x00, 0xF7,0x04, 0x35,0x48, 0x77,0xB4,
-0x00,0x0F, 0x70,0x3E, 0xFF,0xE1, 0x07,0x38, 0x00,0x24, 0xE6,0x00, 0x58,0x39, 0xC6,0x38,
-0x60,0x00, 0x06,0xB4, 0x00,0x01, 0xC7,0x04, 0x6E,0x00, 0xF7,0x33, 0x28,0x00, 0xF6,0x84,
-0x35,0x44, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x0F, 0xE2,0x00, 0x58,0x8D, 0x07,0x38, 0x00,0x01, 0x87,0x36, 0x00,0x0C, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x00,0x0C, 0x87,0x36, 0x00,0x0C, 0xE0,0x00,
-0x58,0xA0, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x35,0x28, 0xF6,0x82, 0x00,0x01, 0x07,0x38,
-0x00,0x08, 0xE0,0x00, 0x5A,0x38, 0xF7,0x05, 0x35,0x44, 0x20,0x3A, 0x00,0x10, 0xE6,0x00,
-0x58,0x9C, 0x00,0x00, 0x00,0x01, 0xF7,0x02, 0x00,0x00, 0x97,0x36, 0x00,0x04, 0xF7,0x04,
-0x35,0x3C, 0xF6,0x84, 0x35,0x28, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x35,0x3C, 0xF7,0x04,
-0x35,0x3C, 0x87,0x36, 0x14,0x1C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x14,0x1C, 0xF7,0x04, 0x76,0x04, 0x86,0xB6, 0x14,0x1C, 0xF6,0x04, 0x75,0xFC, 0x07,0x38,
-0x00,0x01, 0xF6,0x84, 0x76,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00,
-0x58,0xEC, 0xF7,0x05, 0x76,0x04, 0xF0,0x05, 0x76,0x04, 0xF6,0x84, 0x76,0x04, 0xF7,0x04,
-0x76,0x08, 0xF0,0x05, 0x75,0xFC, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0xE6,0x00, 0x59,0x51, 0xF7,0x05, 0x75,0xF8, 0xF7,0x04, 0x76,0x48, 0xF3,0x06,
-0x72,0x18, 0xC0,0x3A, 0x32,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x59,0x51, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0E, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x59,0x50, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02,
-0x00,0x00, 0x20,0x2A, 0x00,0x02, 0xEE,0x00, 0x5A,0x38, 0xF6,0x82, 0x00,0x00, 0xF6,0x84,
-0x35,0x28, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x02, 0xE6,0x00, 0x5A,0x0C, 0x05,0xB4, 0x00,0x08, 0x95,0x93, 0xFF,0xFC, 0x95,0x16,
-0xFF,0xEC, 0x95,0x96, 0xFF,0xE8, 0x96,0x96, 0xFF,0xE4, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x5E,0xDC, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0xEC, 0x85,0x96, 0xFF,0xE8, 0x86,0x96,
-0xFF,0xE4, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x59,0xFC, 0xF7,0x02, 0x00,0x00, 0x86,0x36,
-0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x0F, 0xE2,0x00, 0x59,0xE1, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x00,0x14, 0x87,0x36, 0x00,0x14, 0xE0,0x00, 0x59,0xFC, 0xF7,0x02, 0x00,0x00, 0x76,0xB1,
-0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35, 0x00,0x05, 0xC7,0x38, 0x6A,0x00, 0xC7,0x38,
-0x60,0x00, 0x07,0x38, 0x00,0x10, 0xC7,0x2C, 0x70,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x58,0x78, 0xF7,0x05, 0x35,0x2C, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x4C, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x5A,0x2C, 0x07,0x34, 0x14,0x94, 0xF3,0x04,
-0x6F,0x44, 0xE0,0x00, 0x5A,0x30, 0xF3,0x05, 0x35,0x28, 0xF7,0x05, 0x35,0x28, 0xE0,0x00,
-0x59,0x54, 0x05,0x28, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x5D,0xC4, 0xF3,0x02,
-0x00,0x01, 0xE0,0x00, 0x5D,0xF0, 0x00,0x00, 0x00,0x01, 0x77,0x29, 0x00,0x03, 0xC7,0x1C,
-0x70,0x00, 0x87,0x3A, 0x00,0x04, 0x05,0x28, 0x00,0x01, 0x76,0xA9, 0x00,0x03, 0xF4,0x84,
-0x35,0x54, 0xF6,0x04, 0x35,0x50, 0x94,0x82, 0xFF,0x38, 0xA4,0x1E, 0x68,0x02, 0xC6,0x30,
-0x70,0x00, 0x94,0x02, 0xFF,0x3C, 0x96,0x02, 0xFF,0x40, 0xC6,0x9C, 0x68,0x00, 0x87,0x36,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x97,0x02, 0xFF,0x44, 0x85,0xB6, 0x00,0x04, 0xF7,0x04,
-0x35,0x40, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x58,0x00, 0xF7,0x05, 0x35,0x40, 0x85,0xB6,
-0x00,0x04, 0xF5,0x05, 0x35,0x4C, 0xF6,0x84, 0x35,0x28, 0xF6,0x05, 0x35,0x50, 0x87,0x36,
-0x14,0x14, 0x94,0x96, 0xFF,0xF4, 0xC7,0x38, 0x58,0x00, 0x97,0x36, 0x14,0x14, 0x87,0x1E,
-0x00,0x80, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x01, 0xEE,0x00, 0x5E,0x3C, 0x94,0x16,
-0xFF,0xF4, 0xF7,0x06, 0x0C,0x3E, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x5A,0xF4, 0x00,0x00,
-0x00,0x01, 0xC0,0x7E, 0x74,0x00, 0xE6,0x00, 0x5A,0xE5, 0x00,0x00, 0x00,0x01, 0xF7,0x06,
-0x0C,0x3E, 0xC7,0x7C, 0x74,0x00, 0x20,0x3A, 0x00,0x10, 0xE6,0x00, 0x5E,0x3C, 0x00,0x00,
-0x00,0x01, 0xFF,0x82, 0x00,0x10, 0x86,0x82, 0xFF,0x38, 0xF7,0x04, 0x35,0x58, 0xF5,0x84,
-0x6F,0x58, 0xF6,0x85, 0x35,0x54, 0x07,0x38, 0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x00,
-0x5B,0x58, 0xF7,0x05, 0x35,0x58, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x5B,0x4C, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02, 0x00,0x22, 0xE0,0x00,
-0x5B,0x5C, 0xF3,0x05, 0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF6,0x84, 0x35,0x2C, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x94, 0xC3,0x04, 0x00,0x00, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00,
-0x5B,0xC1, 0x00,0x00, 0x00,0x01, 0x86,0x36, 0x00,0x94, 0xF6,0x84, 0x35,0x54, 0x00,0x00,
-0x00,0x01, 0x76,0xB4, 0xFF,0xF0, 0xF7,0x04, 0x35,0x54, 0x96,0x96, 0xFF,0xF4, 0x47,0x39,
-0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xC6,0xB4, 0x70,0x00, 0xF7,0x04, 0x35,0x48, 0x77,0xB4,
-0x00,0x0F, 0x70,0x3E, 0xFF,0xE1, 0x07,0x38, 0x00,0x24, 0xE6,0x00, 0x5B,0xB9, 0xC6,0x38,
-0x60,0x00, 0x06,0xB4, 0x00,0x01, 0xC7,0x04, 0x6E,0x00, 0xF7,0x33, 0x28,0x00, 0xF6,0x84,
-0x35,0x44, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x0F, 0xE2,0x00, 0x5C,0x0D, 0x07,0x38, 0x00,0x01, 0x87,0x36, 0x00,0x0C, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x00,0x0C, 0x87,0x36, 0x00,0x0C, 0xE0,0x00,
-0x5C,0x20, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x35,0x28, 0xF6,0x82, 0x00,0x01, 0x07,0x38,
-0x00,0x08, 0xE0,0x00, 0x5D,0xB8, 0xF7,0x05, 0x35,0x44, 0x20,0x3A, 0x00,0x10, 0xE6,0x00,
-0x5C,0x1C, 0x00,0x00, 0x00,0x01, 0xF7,0x02, 0x00,0x00, 0x97,0x36, 0x00,0x04, 0xF7,0x04,
-0x35,0x3C, 0xF6,0x84, 0x35,0x28, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x35,0x3C, 0xF7,0x04,
-0x35,0x3C, 0x87,0x36, 0x14,0x1C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x14,0x1C, 0xF7,0x04, 0x76,0x04, 0x86,0xB6, 0x14,0x1C, 0xF6,0x04, 0x75,0xFC, 0x07,0x38,
-0x00,0x01, 0xF6,0x84, 0x76,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00,
-0x5C,0x6C, 0xF7,0x05, 0x76,0x04, 0xF0,0x05, 0x76,0x04, 0xF6,0x84, 0x76,0x04, 0xF7,0x04,
-0x76,0x08, 0xF0,0x05, 0x75,0xFC, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0xE6,0x00, 0x5C,0xD1, 0xF7,0x05, 0x75,0xF8, 0xF7,0x04, 0x76,0x48, 0xF3,0x06,
-0x72,0x18, 0xC0,0x3A, 0x32,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x5C,0xD1, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0E, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x5C,0xD0, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02,
-0x00,0x00, 0x20,0x2A, 0x00,0x02, 0xEE,0x00, 0x5D,0xB8, 0xF6,0x82, 0x00,0x00, 0xF6,0x84,
-0x35,0x28, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x02, 0xE6,0x00, 0x5D,0x8C, 0x05,0xB4, 0x00,0x08, 0x95,0x93, 0xFF,0xFC, 0x95,0x16,
-0xFF,0xEC, 0x95,0x96, 0xFF,0xE8, 0x96,0x96, 0xFF,0xE4, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x5E,0xDC, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0xEC, 0x85,0x96, 0xFF,0xE8, 0x86,0x96,
-0xFF,0xE4, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x5D,0x7C, 0xF7,0x02, 0x00,0x00, 0x86,0x36,
-0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x0F, 0xE2,0x00, 0x5D,0x61, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36,
-0x00,0x14, 0x87,0x36, 0x00,0x14, 0xE0,0x00, 0x5D,0x7C, 0xF7,0x02, 0x00,0x00, 0x76,0xB1,
-0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0x77,0x35, 0x00,0x05, 0xC7,0x38, 0x6A,0x00, 0xC7,0x38,
-0x60,0x00, 0x07,0x38, 0x00,0x10, 0xC7,0x2C, 0x70,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x5B,0xF8, 0xF7,0x05, 0x35,0x2C, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x4C, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x5D,0xAC, 0x07,0x34, 0x14,0x94, 0xF3,0x04,
-0x6F,0x44, 0xE0,0x00, 0x5D,0xB0, 0xF3,0x05, 0x35,0x28, 0xF7,0x05, 0x35,0x28, 0xE0,0x00,
-0x5C,0xD4, 0x05,0x28, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x5D,0xF1, 0xF3,0x02,
-0x00,0x01, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0D, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x5D,0xF4, 0xB3,0x3A, 0x68,0x02, 0xE0,0x00, 0x5D,0xF4, 0xF0,0x05, 0x2D,0x38, 0xF3,0x05,
-0x35,0x24, 0xF6,0x84, 0x35,0x28, 0xF7,0x04, 0x6F,0x44, 0xF3,0x06, 0x32,0xF4, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x5E,0x3C, 0xF3,0x05, 0x35,0x30, 0xF7,0x04, 0xE0,0x18, 0x00,0x00,
-0x00,0x01, 0x77,0xB8, 0x00,0x1F, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00, 0x5E,0x3D, 0x00,0x00,
-0x00,0x01, 0x0F,0x81, 0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x35,0x30, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x32,0xF4, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x06, 0x35,0x30, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x33,0x80, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06,
-0x35,0x30, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x34,0x0C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x35,0x30, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x34,0x98, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x86,0x16, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x32, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x0F, 0x86,0xB2, 0x00,0x00, 0xC5,0x38, 0x00,0x00, 0xEE,0x00,
-0x5F,0x2C, 0xC5,0xB4, 0x00,0x00, 0x20,0x36, 0x00,0x0F, 0xEE,0x00, 0x5F,0x2C, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xEC,0x00, 0x5F,0x2D, 0x00,0x00, 0x00,0x01, 0x20,0x36,
-0x00,0x00, 0xEC,0x00, 0x5F,0x48, 0x00,0x00, 0x00,0x01, 0x87,0x32, 0x00,0x0C, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x32, 0x00,0x0C, 0x87,0x32, 0x00,0x0C, 0xE0,0x00,
-0x5F,0x50, 0xF4,0x02, 0x00,0x00, 0xC0,0x2A, 0x5A,0x00, 0x44,0x0C, 0x00,0x01, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x00,0x00, 0x00,0x00, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF6,0x86,
-0x35,0x60, 0x96,0x93, 0xFF,0xFC, 0xF6,0x86, 0x42,0x30, 0x96,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93, 0xFF,0xFC, 0xF6,0x82, 0x66,0xF8, 0x96,0x93,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x17, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86, 0x35,0x60, 0x96,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF6,0x82,
-0x69,0x80, 0x96,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x18, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86,
-0x35,0x60, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF6,0x82, 0x6B,0x50, 0x96,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x16, 0x97,0x93,
-0xFF,0xFC, 0xF6,0x86, 0x35,0x60, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF6,0x82, 0x61,0x78, 0x96,0x93, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x1F, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86, 0x35,0x60, 0x96,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF6,0x82, 0x62,0x7C, 0x96,0x93,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x20, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86, 0x35,0x60, 0x96,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF6,0x82,
-0x66,0xF8, 0x96,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x17, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86,
-0x35,0xEC, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF6,0x82, 0x69,0x80, 0x96,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x18, 0x97,0x93,
-0xFF,0xFC, 0xF6,0x86, 0x35,0xEC, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF6,0x82, 0x6B,0x50, 0x96,0x93, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x16, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86, 0x35,0xEC, 0x96,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF6,0x82, 0x61,0x78, 0x96,0x93,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x1F, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86, 0x35,0xEC, 0x96,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF6,0x82,
-0x62,0x7C, 0x96,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x20, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86,
-0x35,0xEC, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x04, 0xE0,0x28, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x61,0x15, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0xE0,0x28, 0xE0,0x00, 0x61,0x18, 0x77,0x39,
-0x00,0x02, 0xF7,0x02, 0x00,0xF0, 0xF7,0x05, 0x42,0x28, 0xF7,0x06, 0x40,0x8A, 0xF0,0x3B,
-0x28,0x00, 0xF7,0x06, 0x40,0x8C, 0xF0,0x3B, 0x28,0x00, 0xF7,0x02, 0x00,0x00, 0xF7,0x05,
-0x7A,0xC0, 0xF7,0x05, 0x7A,0xB8, 0xF7,0x05, 0x7A,0xB0, 0xF7,0x05, 0x7A,0xC8, 0xF6,0x82,
-0xC3,0x50, 0x96,0x93, 0xFF,0xFC, 0xF6,0x82, 0x00,0x16, 0x96,0x93, 0xFF,0xFC, 0xF6,0x86,
-0x42,0x30, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1E,0xC0, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF6,0x04,
-0x6F,0x34, 0x00,0x00, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x61,0xED, 0x76,0xB1,
-0x00,0x1E, 0x87,0x32, 0x00,0x00, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x20,0x3A, 0x00,0x07, 0xE6,0x00, 0x61,0xEC, 0x06,0xB0, 0x00,0x02, 0x87,0x36,
-0x00,0x00, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x20,0x3A, 0x00,0x01, 0xE6,0x00, 0x61,0xEC, 0xF5,0x06, 0x35,0xEC, 0xF7,0x04,
-0x42,0x30, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x52,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x62,0x11, 0xF5,0x82, 0x00,0x00, 0xF7,0x04, 0x42,0xA0, 0xF6,0x06,
-0x42,0xA2, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xE0,0x00, 0x62,0x68, 0xF7,0x33, 0x28,0x00, 0x87,0x32,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0xF7,0x05, 0xE0,0x00, 0x86,0xB2, 0x00,0x08, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x62,0x3C, 0xF6,0x85, 0xE0,0x04, 0x20,0x36, 0x00,0x00, 0xE6,0x00,
-0x62,0x40, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00,
-0x62,0x65, 0xF6,0x06, 0x42,0xA2, 0xF7,0x04, 0x42,0xA0, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33,
-0x28,0x00, 0xF0,0x05, 0x42,0x28, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF7,0x04, 0x42,0x3C, 0xF6,0x84, 0x6F,0x34, 0x07,0x38, 0x00,0x01, 0x20,0x36,
-0x00,0x00, 0xE6,0x00, 0x62,0xB1, 0xF7,0x05, 0x42,0x3C, 0x87,0x36, 0x00,0x00, 0xF5,0x9E,
-0x00,0x02, 0xC0,0x3A, 0x5A,0x00, 0xE6,0x00, 0x62,0xBD, 0xF5,0x86, 0x35,0xEC, 0xF7,0x04,
-0x42,0xA0, 0xE0,0x00, 0x62,0xDC, 0xF6,0x06, 0x42,0xA2, 0xF7,0x04, 0x42,0x30, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x5A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x62,0xF9, 0xF6,0x06, 0x42,0xA4, 0xF7,0x04, 0x42,0xA4, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xE0,0x00,
-0x63,0x0C, 0xF7,0x33, 0x28,0x00, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x63,0x20, 0x97,0x93, 0xFF,0xFC, 0xF0,0x05, 0x42,0x28, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x20, 0x83,0x16, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x87,0x1A, 0x00,0x18, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x63,0x6C, 0xF7,0x02, 0x00,0x00, 0x83,0x9A, 0x00,0x1C, 0x00,0x00, 0x00,0x01, 0xF3,0x85,
-0x7A,0xC0, 0x84,0x9A, 0x00,0x14, 0xF7,0x05, 0x7A,0xC8, 0xF4,0x85, 0x7A,0xB0, 0xF7,0x05,
-0x7A,0xB8, 0x83,0x16, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x86,0x9A, 0x00,0x14, 0xF7,0x04,
-0x7A,0xB0, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x63,0xD0, 0xF6,0x02,
-0x00,0x00, 0x86,0x9A, 0x00,0x1C, 0xF7,0x04, 0x7A,0xC0, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x63,0xD0, 0x00,0x00, 0x00,0x01, 0x86,0x9A, 0x00,0x18, 0xF7,0x04,
-0x7A,0xB8, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x63,0xD0, 0x00,0x00,
-0x00,0x01, 0x86,0x9A, 0x00,0x20, 0xF7,0x04, 0x7A,0xC8, 0x00,0x00, 0x00,0x01, 0xC7,0x38,
-0x68,0x00, 0x20,0x3A, 0x00,0x64, 0xEE,0x00, 0x63,0xD9, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x64,0x58, 0x00,0x00, 0x00,0x01, 0x83,0x96,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x1E, 0x00,0x18, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x64,0x3C, 0xF7,0x02, 0x00,0x00, 0xF7,0x05, 0x40,0x80, 0xF7,0x05,
-0x40,0x84, 0xF6,0x84, 0x6E,0x50, 0xF4,0x82, 0xFF,0xFF, 0x83,0x1E, 0x00,0x0C, 0xF4,0x85,
-0x4F,0x54, 0x93,0x36, 0x00,0x10, 0x83,0x9E, 0x00,0x10, 0x84,0x96, 0x00,0x00, 0x93,0xB6,
-0x00,0x14, 0x84,0xA6, 0x00,0x08, 0x00,0x00, 0x00,0x01, 0x94,0xB6, 0x1D,0xDC, 0xF6,0x82,
-0x00,0x64, 0xF6,0x85, 0x4A,0x98, 0xF7,0x05, 0x4A,0x9C, 0x83,0x16, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x87,0x1A, 0x00,0x20, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xEE,0x00,
-0x64,0x7C, 0xF3,0x82, 0x00,0x00, 0xF7,0x04, 0x42,0xA4, 0xF6,0x06, 0x42,0xA6, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0x66,0xE4, 0xF7,0x33, 0x28,0x00, 0x93,0x96, 0xFF,0xF4, 0x84,0x16,
-0x00,0x00, 0xF4,0x86, 0x42,0xC8, 0x94,0x96, 0xFF,0xEC, 0xF3,0x02, 0x00,0x0C, 0x93,0x16,
-0xFF,0xE4, 0x83,0x96, 0x00,0x00, 0x84,0x96, 0xFF,0xF4, 0x87,0x1E, 0x00,0x20, 0x00,0x00,
-0x00,0x01, 0xC0,0x26, 0x72,0x00, 0xEC,0x00, 0x66,0x48, 0xF3,0x86, 0x4A,0x98, 0x84,0xA2,
-0x00,0x24, 0x83,0x16, 0xFF,0xE4, 0xC5,0x04, 0x00,0x00, 0xB4,0x9A, 0x38,0x02, 0xC7,0x18,
-0x38,0x00, 0x83,0x22, 0x00,0x28, 0x83,0x96, 0xFF,0xF4, 0x84,0x96, 0xFF,0xE4, 0x93,0x3A,
-0x00,0x04, 0x93,0xBA, 0x00,0x08, 0xF6,0x04, 0xE0,0x00, 0xF3,0x06, 0x4A,0x98, 0xA6,0xA6,
-0x30,0x02, 0xF5,0x82, 0x00,0x00, 0xC0,0x32, 0x6A,0x00, 0xE6,0x00, 0x65,0x10, 0xC6,0x38,
-0x00,0x00, 0xF6,0x84, 0xE0,0x04, 0x87,0x32, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x65,0x14, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E,
-0x00,0x00, 0xE6,0x00, 0x65,0x21, 0x00,0x00, 0x00,0x01, 0xF5,0x02, 0x00,0x00, 0xF6,0x84,
-0xE0,0x00, 0x87,0x32, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0x65,0x5C, 0xF5,0x82, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x65,0x64, 0x20,0x2E,
-0x00,0x00, 0xF6,0x84, 0xE0,0x04, 0x87,0x32, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0x65,0x65, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E,
-0x00,0x00, 0xE6,0x00, 0x65,0x75, 0x20,0x2A, 0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A,
-0x00,0x00, 0xE6,0x00, 0x65,0x88, 0x00,0x00, 0x00,0x01, 0x83,0x96, 0xFF,0xF4, 0x00,0x00,
-0x00,0x01, 0xF3,0x85, 0x4F,0x54, 0x87,0x22, 0x00,0x2C, 0x76,0xA1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x05,0xA0, 0x00,0x2E, 0x76,0x2D, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xF4,0x82,
-0x00,0x00, 0x94,0x96, 0xFF,0xDC, 0x83,0x16, 0xFF,0xEC, 0x20,0x26, 0x00,0x07, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x87,0x2E, 0x00,0x00, 0x06,0x98,
-0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xE2,0x00, 0x66,0x1C, 0xF7,0x37,
-0x28,0x00, 0x85,0x16, 0xFF,0xEC, 0x85,0x96, 0xFF,0xDC, 0x00,0x00, 0x00,0x01, 0xC7,0x2C,
-0x40,0x00, 0x86,0xBA, 0x00,0x30, 0x06,0x28, 0x00,0x04, 0x05,0x28, 0x00,0x02, 0x05,0xAC,
-0x00,0x02, 0x83,0x96, 0xFF,0xDC, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0x03,0x9C,
-0x00,0x01, 0x93,0x96, 0xFF,0xDC, 0x20,0x1E, 0x00,0x07, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB4,
-0xFF,0xF0, 0xE2,0x00, 0x65,0xE1, 0xF6,0xB3, 0x28,0x00, 0x04,0x20, 0x00,0x1C, 0x84,0x96,
-0xFF,0xEC, 0x83,0x16, 0xFF,0xE4, 0x83,0x96, 0xFF,0xF4, 0x04,0xA4, 0x00,0x14, 0x94,0x96,
-0xFF,0xEC, 0x03,0x18, 0x00,0x0C, 0x93,0x16, 0xFF,0xE4, 0x03,0x9C, 0x00,0x01, 0xE0,0x00,
-0x64,0x94, 0x93,0x96, 0xFF,0xF4, 0x84,0x96, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x26,
-0x00,0x20, 0x00,0x00, 0x00,0x01, 0xF7,0x05, 0x4A,0x9C, 0x85,0xA6, 0x00,0x20, 0xF7,0x04,
-0x7A,0xB8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x7A,0xB8, 0xF7,0x04,
-0x7A,0xB8, 0xF6,0x84, 0x7A,0xC8, 0x86,0x26, 0x00,0x18, 0xC6,0xB4, 0x58,0x00, 0x87,0x26,
-0x00,0x1C, 0x00,0x00, 0x00,0x01, 0x27,0x38, 0x00,0x01, 0xC0,0x32, 0x72,0x00, 0x47,0x0C,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x66,0xE5, 0xF6,0x85, 0x7A,0xC8, 0x83,0x26,
-0x00,0x08, 0xF7,0x04, 0x6E,0x50, 0xF3,0x05, 0x3B,0x64, 0x83,0xA6, 0x00,0x08, 0xF6,0x82,
-0x00,0x00, 0x93,0xBA, 0x1D,0xDC, 0x84,0xA6, 0x00,0x0C, 0x83,0x16, 0x00,0x00, 0x94,0xBA,
-0x00,0x10, 0x83,0x1A, 0x00,0x10, 0xF6,0x85, 0x7A,0xC8, 0x93,0x3A, 0x00,0x14, 0xF7,0x02,
-0x00,0x01, 0xF7,0x05, 0x40,0x84, 0xF6,0x85, 0x7A,0xC0, 0xF6,0x85, 0x7A,0xB8, 0xF6,0x85,
-0x7A,0xB0, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x08, 0xF3,0x84, 0x6F,0x34, 0x00,0x00, 0x00,0x01, 0x87,0x1E, 0x00,0x18, 0xF6,0x84,
-0xE0,0x1C, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xEC,0x00, 0x67,0x29, 0xF7,0x02,
-0x00,0x01, 0xF7,0x02, 0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x67,0xE8, 0xF5,0x82,
-0x00,0x01, 0xF7,0x04, 0xE0,0x1C, 0x86,0x9E, 0x00,0x18, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x67,0xE9, 0xC5,0x84,
-0x00,0x00, 0x86,0x9E, 0x00,0x10, 0xF7,0x04, 0xE0,0x00, 0xF6,0x02, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x67,0x88, 0x05,0x1C, 0x00,0x10, 0x86,0x9E, 0x00,0x14, 0xF7,0x04,
-0xE0,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x67,0x8C, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x67,0x99, 0x00,0x00,
-0x00,0x01, 0xF5,0x82, 0x00,0x00, 0x86,0xAA, 0x00,0x00, 0xF7,0x04, 0xE0,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x67,0xD4, 0xF6,0x02, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x67,0xDC, 0x20,0x32, 0x00,0x00, 0x86,0xAA, 0x00,0x04, 0xF7,0x04,
-0xE0,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x67,0xDD, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x67,0xED, 0x20,0x2E,
-0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x68,0x10, 0xF6,0x06,
-0x42,0x9C, 0xF7,0x04, 0x42,0x9C, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33, 0x28,0x00, 0xF7,0x04,
-0x75,0xF4, 0x75,0xAC, 0xFF,0xE1, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x68,0x45, 0x95,0x96,
-0xFF,0xF4, 0xF7,0x04, 0x42,0x98, 0xF6,0x06, 0x42,0x98, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33,
-0x28,0x00, 0x87,0x1E, 0x00,0x20, 0x04,0x1C, 0x00,0x20, 0x76,0xA1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x20,0x3A, 0x00,0x08, 0xEE,0x00,
-0x68,0xC4, 0xF3,0x06, 0x15,0x54, 0xF5,0x02, 0x00,0x00, 0x05,0x9C, 0x00,0x22, 0xC4,0xAC,
-0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x87,0x22, 0x00,0x00, 0x76,0xA1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC0,0x2A, 0x72,0x00, 0xEC,0x00,
-0x68,0xC0, 0xC6,0xA4, 0x60,0x00, 0xA7,0x26, 0x60,0x02, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x05,0x28, 0x00,0x01, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xE8, 0xF7,0x2F,
-0x68,0x00, 0x05,0xAC, 0x00,0x01, 0xE0,0x00, 0x68,0x78, 0x06,0x30, 0x00,0x02, 0xF3,0x06,
-0x15,0x54, 0x93,0x13, 0xFF,0xFC, 0xF7,0x04, 0xE0,0x24, 0x00,0x00, 0x00,0x01, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x04, 0xE0,0x1C, 0x00,0x00, 0x00,0x01, 0x97,0x13, 0xFF,0xFC, 0xF3,0x06,
-0xE0,0x00, 0x93,0x13, 0xFF,0xFC, 0x93,0x93, 0xFF,0xFC, 0xF3,0x02, 0x00,0x01, 0x93,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xEE,0x64, 0x97,0x93, 0xFF,0xFC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x69,0x28, 0xF6,0x06, 0x42,0x9E, 0xF7,0x04, 0x42,0x9C, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x83,0x16, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x20,0x1A,
-0x00,0x00, 0xE6,0x00, 0x69,0x6C, 0xF3,0x06, 0x35,0xEC, 0xF7,0x04, 0x42,0x30, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x32,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x69,0x6D, 0xF0,0x05, 0x42,0x28, 0xF3,0x06, 0x35,0x60, 0xF3,0x05, 0x42,0x30, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x04, 0xF5,0x04, 0x6F,0x34, 0xF7,0x04,
-0x42,0x40, 0x86,0x2A, 0x00,0x18, 0x07,0x38, 0x00,0x01, 0xF6,0x84, 0xE0,0x1C, 0xF7,0x05,
-0x42,0x40, 0xC0,0x36, 0x62,0x00, 0xEC,0x00, 0x69,0xB5, 0xF7,0x02, 0x00,0x01, 0xF7,0x02,
-0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x6A,0x80, 0xF7,0x02, 0x00,0x01, 0xF7,0x04,
-0xE0,0x1C, 0x86,0xAA, 0x00,0x18, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0x47,0x0C,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x6A,0x7D, 0xC5,0x84, 0x00,0x00, 0x86,0xAA,
-0x00,0x10, 0xF7,0x04, 0xE0,0x00, 0xF6,0x02, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x6A,0x14, 0x04,0xA8, 0x00,0x10, 0x86,0xAA, 0x00,0x14, 0xF7,0x04, 0xE0,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x6A,0x18, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x6A,0x25, 0x00,0x00, 0x00,0x01, 0xF5,0x82,
-0x00,0x00, 0x86,0xA6, 0x00,0x00, 0xF7,0x04, 0xE0,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0x6A,0x60, 0xF6,0x02, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x6A,0x68, 0x20,0x32, 0x00,0x00, 0x86,0xA6, 0x00,0x04, 0xF7,0x04, 0xE0,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x6A,0x69, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x6A,0x81, 0xC7,0x2C, 0x00,0x00, 0xF5,0x82,
-0x00,0x01, 0xE0,0x00, 0x6A,0x80, 0xC7,0x2C, 0x00,0x00, 0xC7,0x04, 0x00,0x00, 0x20,0x3A,
-0x00,0x00, 0xEE,0x00, 0x6B,0x3D, 0xF6,0x86, 0x40,0x8A, 0xF7,0x04, 0x40,0x88, 0x76,0xB5,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x6B,0x3C, 0xF6,0x82, 0x00,0x00, 0xF6,0x85, 0x40,0x80, 0xF6,0x85,
-0x40,0x84, 0x96,0x93, 0xFF,0xFC, 0x96,0x93, 0xFF,0xFC, 0xF7,0x04, 0xE0,0x1C, 0x00,0x00,
-0x00,0x01, 0x97,0x13, 0xFF,0xFC, 0xF3,0x86, 0xE0,0x00, 0x93,0x93, 0xFF,0xFC, 0x95,0x13,
-0xFF,0xFC, 0xF3,0x82, 0x00,0x02, 0x93,0x93, 0xFF,0xFC, 0x96,0x96, 0xFF,0xF4, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xEE,0x64, 0x97,0x93, 0xFF,0xFC, 0xF4,0x05, 0x40,0x84, 0x86,0x96,
-0xFF,0xF4, 0xF7,0x04, 0x6E,0x50, 0xF3,0x86, 0x35,0xEC, 0xF6,0x85, 0x40,0x90, 0xF6,0x85,
-0x40,0x94, 0x87,0x3A, 0x1D,0xDC, 0xF6,0x85, 0x42,0x28, 0xF7,0x05, 0x3B,0x64, 0xF7,0x04,
-0x42,0x30, 0xF4,0x05, 0x40,0x80, 0xC0,0x3A, 0x3A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x6B,0x3D, 0xF3,0x86, 0x35,0x60, 0xF3,0x85, 0x42,0x30, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF4,0x86, 0x42,0x30, 0x94,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x20,0xE4, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x6D,0xD9, 0xF5,0x82, 0x00,0x00, 0xF7,0x04, 0x40,0x8C, 0xF6,0x06, 0x40,0x8C, 0x76,0x31,
-0x00,0x1E, 0xF6,0x84, 0x42,0x28, 0x76,0x30, 0xFF,0xE5, 0x06,0xB4, 0x00,0x01, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x6B,0xC8, 0xF6,0x85,
-0x42,0x28, 0xF7,0x04, 0x40,0x88, 0xF6,0x86, 0x40,0x8A, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x6D,0x0D, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x40,0x8C, 0xF6,0x86, 0x40,0x8C, 0x76,0xB5,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x6C,0x35, 0xF6,0x06, 0x40,0x8A, 0xF7,0x04, 0x40,0x88, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x6C,0x34, 0xF4,0x86, 0x36,0x78, 0xF7,0x04, 0x42,0x44, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x4A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x6C,0x35, 0xF4,0x82, 0x00,0x01, 0xF4,0xB3, 0x28,0x00, 0xE0,0x00, 0x6D,0x10, 0xF0,0x05,
-0x42,0x2C, 0xF7,0x04, 0x40,0x8C, 0xF5,0x06, 0x40,0x8C, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x6C,0xC1, 0xF6,0x06, 0x40,0x8A, 0xF7,0x04, 0x40,0x88, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x6C,0xC1, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0x2C, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0x20,0x3A, 0x00,0x09, 0xEE,0x00, 0x6D,0x11, 0xF7,0x05, 0x42,0x2C, 0xF0,0x2B,
-0x28,0x00, 0xF0,0x33, 0x28,0x00, 0xF5,0x82, 0x00,0x01, 0xF7,0x04, 0x42,0x94, 0xF6,0x06,
-0x42,0x94, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xE0,0x00, 0x6D,0x10, 0xF7,0x33, 0x28,0x00, 0xF7,0x04,
-0x40,0x8C, 0xF6,0x86, 0x40,0x8C, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x6D,0x14, 0x20,0x2E,
-0x00,0x00, 0xF7,0x04, 0x40,0x88, 0xF6,0x06, 0x40,0x8A, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x6D,0x15, 0x20,0x2E, 0x00,0x00, 0xF0,0x33, 0x28,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E,
-0x00,0x00, 0xE6,0x00, 0x6D,0xB5, 0xF4,0x86, 0x35,0xEC, 0xF7,0x04, 0x42,0x30, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x4A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x6D,0x59, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0xE0,0x28, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x6D,0x79, 0xF6,0x82, 0x00,0x3C, 0xF6,0x84, 0xE0,0x28, 0xE0,0x00,
-0x6D,0x78, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0xE0,0x28, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x6D,0x79, 0xF6,0x82, 0x00,0xF0, 0xF7,0x04, 0xE0,0x28, 0x00,0x00,
-0x00,0x01, 0x76,0xB9, 0x00,0x02, 0xF7,0x04, 0x42,0x28, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x6A,0x00, 0xEC,0x00, 0x6D,0xB5, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0xF0,0x05,
-0x42,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82,
-0x00,0x19, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x6D,0xB4, 0xB4,0xBA, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF4,0x82, 0xC3,0x50, 0x94,0x93, 0xFF,0xFC, 0xF4,0x82, 0x00,0x16, 0x94,0x93,
-0xFF,0xFC, 0xF4,0x86, 0x42,0x30, 0x94,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x1E,0xC0, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x04, 0xF5,0x86, 0x36,0x78, 0x95,0x93, 0xFF,0xFC, 0xF5,0x86,
-0x42,0x44, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x82, 0x74,0x18, 0x95,0x93, 0xFF,0xFC, 0xF5,0x82, 0x00,0x19, 0x95,0x93,
-0xFF,0xFC, 0xF5,0x86, 0x36,0x78, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0x74,0xAC, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x1D, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x37,0x04, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0x78,0x00, 0x95,0x93,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x1B, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x37,0x04, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82,
-0x78,0xFC, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x1A, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86,
-0x37,0x90, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x82, 0x80,0xD8, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x1B, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x86, 0x37,0x90, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0x81,0x74, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x1D, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x38,0x1C, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0x87,0x74, 0x95,0x93,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x1B, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x38,0x1C, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82,
-0x94,0xF8, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x1B, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86,
-0x39,0x34, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x82, 0x8A,0x00, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x86, 0x39,0x34, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0x8E,0x08, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x1A, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x39,0x34, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0x96,0x9C, 0x95,0x93,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x1E, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x38,0xA8, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82,
-0x9B,0x2C, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x1B, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86,
-0x38,0xA8, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x82, 0xA2,0xDC, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x1E, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x86, 0x3A,0xD8, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0x9E,0x54, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x1B, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x3A,0xD8, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0xA3,0xC0, 0x95,0x93,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x39,0xC0, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82,
-0xA7,0x64, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x1E, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86,
-0x39,0xC0, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x82, 0xAA,0x04, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82, 0x00,0x1B, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x86, 0x39,0xC0, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x82, 0xAE,0xF8, 0x95,0x93, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x3A,0x4C, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x42,0x50, 0xF0,0x3B,
-0x28,0x00, 0xF7,0x06, 0x40,0x88, 0xF0,0x3B, 0x28,0x00, 0xF6,0x02, 0x00,0x00, 0xF6,0x05,
-0x40,0x80, 0xF6,0x05, 0x40,0x84, 0xF7,0x06, 0x3B,0x70, 0xF6,0x3B, 0x28,0x00, 0xF7,0x06,
-0x3B,0x72, 0xF0,0xBB, 0x28,0x00, 0xF5,0x82, 0xCA,0x20, 0xF5,0x85, 0x3B,0x74, 0xF7,0x06,
-0x3B,0x78, 0xF0,0x3B, 0x28,0x00, 0xF7,0x06, 0x3B,0x7A, 0xF0,0xBB, 0x28,0x00, 0xF5,0x82,
-0xB1,0x94, 0xF5,0x85, 0x3B,0x7C, 0xF7,0x06, 0x3B,0x80, 0xF0,0x3B, 0x28,0x00, 0xF7,0x06,
-0x3B,0x82, 0xF0,0xBB, 0x28,0x00, 0xF5,0x82, 0xC7,0x54, 0xF5,0x85, 0x3B,0x84, 0xF7,0x06,
-0x3B,0x88, 0xF0,0x3B, 0x28,0x00, 0xF7,0x06, 0x3B,0x8A, 0xF0,0xBB, 0x28,0x00, 0xF5,0x82,
-0xBE,0xF8, 0xF5,0x85, 0x3B,0x8C, 0xF7,0x06, 0x3B,0x90, 0xF0,0x3B, 0x28,0x00, 0xF7,0x06,
-0x3B,0x92, 0xF0,0xBB, 0x28,0x00, 0xF5,0x82, 0xC8,0xF8, 0xF5,0x85, 0x3B,0x94, 0xF7,0x06,
-0x3B,0x98, 0xF0,0x3B, 0x28,0x00, 0xF7,0x06, 0x3B,0x9A, 0xF0,0xBB, 0x28,0x00, 0xF5,0x82,
-0xC5,0xD8, 0xF5,0x85, 0x3B,0x9C, 0xF7,0x06, 0x3B,0xA0, 0xF0,0x3B, 0x28,0x00, 0xF7,0x06,
-0x3B,0xA2, 0xF0,0xBB, 0x28,0x00, 0xF5,0x82, 0xC7,0x70, 0xF5,0x85, 0x3B,0xA4, 0xF7,0x06,
-0x3B,0xA8, 0xF0,0x3B, 0x28,0x00, 0xF7,0x06, 0x3B,0xAA, 0xF0,0xBB, 0x28,0x00, 0xF5,0x82,
-0xC1,0xB4, 0xF5,0x85, 0x3B,0xAC, 0x96,0x16, 0xFF,0xF4, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD5,0x40, 0x97,0x93, 0xFF,0xFC, 0xF6,0x84, 0x6E,0x50, 0x86,0x16, 0xFF,0xF4, 0x00,0x00,
-0x00,0x01, 0x96,0x36, 0x1D,0xDC, 0xF6,0x05, 0x3B,0x64, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x30, 0x25,0x94, 0x00,0x20, 0xF0,0x2F,
-0x28,0x00, 0x26,0x14, 0x00,0x38, 0xF0,0x33, 0x28,0x00, 0x90,0x13, 0xFF,0xFC, 0xF7,0x04,
-0x42,0x50, 0xF6,0x86, 0x42,0x50, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x97,0x13, 0xFF,0xFC, 0x96,0x13, 0xFF,0xFC, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xF5,0xF4, 0x97,0x93, 0xFF,0xFC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x72,0x1D, 0xF5,0x02, 0x17,0x70, 0xF7,0x04, 0x42,0x54, 0x00,0x00,
-0x00,0x01, 0x27,0x38, 0x00,0x01, 0xF7,0x05, 0x42,0x54, 0x95,0x13, 0xFF,0xFC, 0xF5,0x02,
-0x00,0x1B, 0x95,0x13, 0xFF,0xFC, 0xF5,0x06, 0x42,0x44, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x1E,0xC0, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04, 0xE0,0x04, 0x86,0x16, 0x00,0x00, 0xF6,0x82,
-0x00,0xFF, 0x77,0x39, 0xFF,0xF0, 0xC7,0x38, 0x6C,0x00, 0xF7,0x33, 0x28,0x00, 0xF7,0x06,
-0xE0,0x06, 0x87,0x3A, 0x00,0x00, 0x06,0xB0, 0x00,0x02, 0xF7,0x37, 0x28,0x00, 0xF6,0x84,
-0x3B,0x64, 0x07,0x30, 0x00,0x04, 0xF6,0xBB, 0x28,0x00, 0x87,0x02, 0xFF,0x34, 0x06,0x30,
-0x00,0x06, 0xF7,0x33, 0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x30, 0x26,0x14, 0x00,0x20, 0xF0,0x33, 0x28,0x00, 0x27,0x14,
-0x00,0x38, 0xF0,0x3B, 0x28,0x00, 0x97,0x13, 0xFF,0xFC, 0x90,0x93, 0xFF,0xFC, 0xF7,0x04,
-0x42,0x50, 0xF6,0x86, 0x42,0x50, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x97,0x13, 0xFF,0xFC, 0x96,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xF3,0x38, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x73,0x19, 0xF5,0x82, 0x17,0x70, 0xF7,0x04, 0x42,0x54, 0x00,0x00, 0x00,0x01, 0x27,0x38,
-0x00,0x01, 0xF7,0x05, 0x42,0x54, 0x95,0x93, 0xFF,0xFC, 0xF5,0x82, 0x00,0x1B, 0x95,0x93,
-0xFF,0xFC, 0xF5,0x86, 0x42,0x44, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x1E,0xC0, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x40, 0x26,0x14, 0x00,0x20, 0x96,0x16, 0xFF,0xC4, 0xF0,0x33,
-0x28,0x00, 0x90,0x13, 0xFF,0xFC, 0x96,0x13, 0xFF,0xFC, 0x26,0x14, 0x00,0x38, 0x96,0x16,
-0xFF,0xBC, 0x96,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93,
-0xFF,0xFC, 0x90,0x13, 0xFF,0xFC, 0xF7,0x04, 0x42,0x50, 0xF6,0x86, 0x42,0x50, 0x76,0xB5,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x97,0x13,
-0xFF,0xFC, 0x86,0x16, 0xFF,0xBC, 0x00,0x00, 0x00,0x01, 0x96,0x13, 0xFF,0xFC, 0x86,0x16,
-0xFF,0xC4, 0x00,0x00, 0x00,0x01, 0x96,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xF5,0xF4, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x73,0xE5, 0xF6,0x02,
-0x17,0x70, 0xF7,0x04, 0x42,0x54, 0x00,0x00, 0x00,0x01, 0x27,0x38, 0x00,0x01, 0xF7,0x05,
-0x42,0x54, 0x96,0x13, 0xFF,0xFC, 0xF6,0x02, 0x00,0x1B, 0x96,0x13, 0xFF,0xFC, 0xF6,0x06,
-0x42,0x44, 0x96,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1E,0xC0, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x04, 0xF5,0x82, 0x00,0x00, 0xF5,0x85, 0x40,0x80, 0x95,0x96, 0xFF,0xF4, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xCB,0x50, 0x97,0x93, 0xFF,0xFC, 0x85,0x96, 0xFF,0xF4, 0xF5,0x02,
-0x00,0x64, 0xF5,0x05, 0x3B,0xB4, 0xF7,0x04, 0x42,0x50, 0xF4,0x86, 0x42,0x50, 0x76,0xA5,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF6,0x04, 0x4F,0x5C, 0xF4,0x02, 0x00,0x06, 0xF4,0x05,
-0x42,0x54, 0xF5,0x85, 0x3B,0x6C, 0xF5,0x85, 0x3B,0xB8, 0x95,0x32, 0x00,0x00, 0x95,0xB2,
-0x00,0x04, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x27,
-0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x71,0xB0, 0x97,0x93, 0xFF,0xFC, 0xF4,0x06,
-0x37,0x04, 0xF4,0x05, 0x42,0x44, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x50, 0xF7,0x04, 0x42,0x50, 0xF6,0x86, 0x42,0x50, 0x76,0xB5,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF6,0x04, 0x6F,0x34, 0xC7,0x38, 0x6F,0xC0, 0x86,0xB2,
-0x00,0x0C, 0x77,0x39, 0xFF,0xF0, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x77,0xEC, 0xC5,0x04,
-0x00,0x00, 0x86,0xB2, 0x00,0x10, 0xF7,0x04, 0xE0,0x00, 0xF3,0x02, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x75,0x18, 0x04,0xB0, 0x00,0x10, 0x86,0xB2, 0x00,0x14, 0xF7,0x04,
-0xE0,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x75,0x1C, 0x20,0x1A,
-0x00,0x00, 0xF3,0x02, 0x00,0x01, 0x20,0x1A, 0x00,0x00, 0xE6,0x00, 0x75,0x29, 0x00,0x00,
-0x00,0x01, 0xF5,0x02, 0x00,0x00, 0x86,0xA6, 0x00,0x00, 0xF7,0x04, 0xE0,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x75,0x64, 0xF6,0x02, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x75,0x6C, 0x20,0x32, 0x00,0x00, 0x86,0xA6, 0x00,0x04, 0xF7,0x04,
-0xE0,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x75,0x6D, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x75,0x7D, 0x20,0x2A,
-0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00, 0x77,0xEC, 0x00,0x00,
-0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0x26,0x14,
-0x00,0x20, 0xF0,0x33, 0x28,0x00, 0x04,0xA0, 0x00,0x02, 0xF0,0x27, 0x28,0x00, 0xF5,0x82,
-0x00,0x00, 0x23,0x94, 0x00,0x22, 0xF5,0x9F, 0x28,0x00, 0x03,0xA0, 0x00,0x1A, 0x93,0x96,
-0xFF,0xD4, 0x25,0x94, 0x00,0x22, 0x85,0xAE, 0x00,0x00, 0x77,0xAD, 0x00,0x1E, 0x77,0xBC,
-0xFF,0xE5, 0xC5,0xAC, 0x7F,0xC0, 0x75,0xAD, 0xFF,0xF0, 0x76,0x31, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0x06,0xA4, 0x00,0x02, 0x23,0x14, 0x00,0x1E, 0x75,0x15, 0x00,0x1E, 0xF5,0x9F,
-0x28,0x00, 0xF3,0x84, 0xE0,0x00, 0x75,0x28, 0xFF,0xE5, 0x93,0xA2, 0x00,0x1C, 0xF5,0x84,
-0xE0,0x04, 0x73,0x99, 0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0x93,0x96, 0xFF,0xAC, 0x73,0x95,
-0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0x93,0x96, 0xFF,0xCC, 0x23,0x94, 0x00,0x42, 0x95,0xA2,
-0x00,0x20, 0x87,0x16, 0xFF,0xE0, 0x75,0x95, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0x95,0x96,
-0xFF,0xB4, 0x75,0x95, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0x95,0x96, 0xFF,0xC4, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0xF4,0x84, 0x4F,0x58, 0x87,0x1A,
-0x00,0x00, 0xC4,0xA0, 0x4A,0x00, 0x74,0xA4, 0xFF,0xFA, 0xC5,0xA4, 0x00,0x00, 0xF5,0x9F,
-0x28,0x00, 0x83,0x96, 0xFF,0xAC, 0x23,0x14, 0x00,0x1A, 0x76,0x19, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0x85,0x96, 0xFF,0xB4, 0xC7,0x38, 0x3F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xE4, 0x83,0x96, 0xFF,0xCC, 0xC7,0x38,
-0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xE8, 0x23,0x14, 0x00,0x16, 0x76,0x19, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xEC, 0x23,0x14, 0x00,0x12, 0x76,0x19,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x3F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x85,0x96, 0xFF,0xC4, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x16, 0xFF,0xF0, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0xF3,0x82,
-0x00,0x02, 0xF3,0xA3, 0x28,0x00, 0x04,0x20, 0x00,0x18, 0x25,0x94, 0x00,0x22, 0x85,0xAE,
-0x00,0x00, 0x77,0xAD, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC5,0xAC, 0x7F,0xC0, 0x75,0xAD,
-0xFF,0xF0, 0x83,0x96, 0xFF,0xD4, 0xF5,0xA3, 0x28,0x00, 0xF4,0x9F, 0x28,0x00, 0x25,0x94,
-0x00,0x42, 0x85,0xAE, 0x00,0x00, 0x77,0xAD, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC5,0xAC,
-0x7F,0xC0, 0x75,0xAD, 0xFF,0xF0, 0x44,0xAD, 0x00,0x00, 0x94,0x93, 0xFF,0xFC, 0xF7,0x86,
-0xE0,0x00, 0x97,0x93, 0xFF,0xFC, 0xF3,0x84, 0x4F,0x5C, 0x00,0x00, 0x00,0x01, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x23,0x40, 0x97,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x78,0xD8, 0x97,0x93, 0xFF,0xFC, 0xF0,0x05, 0x40,0x84, 0xF7,0x86,
-0xE0,0x00, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD5,0xA0, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x04, 0x6E,0x50, 0xF4,0x05, 0x40,0x84, 0x87,0x3A, 0x1D,0xDC, 0x00,0x00,
-0x00,0x01, 0xF7,0x05, 0x3B,0x64, 0xF5,0x86, 0x36,0x78, 0xF5,0x85, 0x42,0x44, 0xF3,0x86,
-0x35,0x60, 0xF3,0x85, 0x42,0x30, 0xF5,0x86, 0x42,0x44, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x1F,0x48, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF5,0x86, 0x42,0x44, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x20,0xE4, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x78,0x89, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0x54, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xEE,0x00, 0x78,0x51, 0xF6,0x06, 0x42,0x50, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x71,0xB0, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x78,0x88, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x42,0x50, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF5,0x82, 0x00,0x06, 0xF5,0x85,
-0x42,0x54, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33,
-0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x72,0xAC, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86,
-0x37,0x90, 0xF5,0x85, 0x42,0x44, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF6,0x06, 0x36,0x78, 0xF6,0x05, 0x42,0x44, 0xF7,0x02, 0x00,0x00, 0xF7,0x05,
-0x40,0x80, 0xF7,0x05, 0x40,0x94, 0xF6,0x84, 0x6E,0x50, 0xF7,0x05, 0x40,0x90, 0x97,0x36,
-0x1D,0xDC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x02,
-0x00,0x01, 0xF7,0x05, 0x40,0x80, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0xA8, 0xF7,0x04, 0x42,0x50, 0xF5,0x86, 0x42,0x50, 0x76,0xAD,
-0x00,0x1E, 0xF4,0x84, 0x6F,0x34, 0x76,0xB4, 0xFF,0xE5, 0x94,0x96, 0xFF,0xC4, 0xC7,0x38,
-0x6F,0xC0, 0x86,0xA6, 0x00,0x0C, 0x77,0x39, 0xFF,0xF0, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x79,0x55, 0xF6,0x06, 0x42,0x9A, 0xF7,0x04, 0x42,0x98, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33,
-0x28,0x00, 0xF7,0x04, 0x42,0x50, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x85,0x16,
-0xFF,0xC4, 0xC7,0x38, 0x6F,0xC0, 0x86,0xAA, 0x00,0x0C, 0x77,0x39, 0xFF,0xF0, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x80,0xA8, 0xF6,0x06, 0x42,0x9A, 0x87,0x2A, 0x00,0x10, 0x86,0x2A,
-0x00,0x1C, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x79,0xA8, 0xF6,0x82, 0x00,0x00, 0x87,0x2A,
-0x00,0x14, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x79,0xAC, 0x20,0x36,
-0x00,0x00, 0xF6,0x82, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0x7A,0x05, 0x24,0x94,
-0x00,0x20, 0x94,0x96, 0xFF,0xBC, 0x85,0x16, 0xFF,0xC4, 0xF0,0x27, 0x28,0x00, 0x05,0x28,
-0x00,0x10, 0x95,0x16, 0xFF,0xB4, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x72,0x50, 0x97,0x93, 0xFF,0xFC, 0x84,0x96, 0xFF,0xB4, 0x00,0x00, 0x00,0x01, 0x94,0x93,
-0xFF,0xFC, 0x85,0x16, 0xFF,0xBC, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xF9,0x34, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x80,0xC4, 0x00,0x00,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x80,0x6C, 0x00,0x00, 0x00,0x01, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0x25,0x94, 0x00,0x20, 0xF0,0x2F,
-0x28,0x00, 0x04,0xA0, 0x00,0x02, 0x94,0x96, 0xFF,0x5C, 0xF0,0x27, 0x28,0x00, 0xF4,0x82,
-0x00,0x00, 0x25,0x14, 0x00,0x5A, 0xF4,0xAB, 0x28,0x00, 0x07,0x20, 0x00,0x1A, 0x25,0x14,
-0x00,0x5A, 0x85,0x2A, 0x00,0x00, 0x77,0xA9, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC5,0x28,
-0x7F,0xC0, 0x75,0x29, 0xFF,0xF0, 0x75,0xAD, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0x23,0x14,
-0x00,0x1E, 0x76,0x19, 0x00,0x1E, 0xF5,0x3B, 0x28,0x00, 0xF4,0x84, 0xE0,0x00, 0x76,0x30,
-0xFF,0xE5, 0x94,0xA2, 0x00,0x1C, 0xF5,0x04, 0xE0,0x04, 0x84,0x96, 0xFF,0x5C, 0x95,0x22,
-0x00,0x20, 0x87,0x16, 0xFF,0xE0, 0x06,0xA4, 0x00,0x02, 0x75,0x15, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0x95,0x16, 0xFF,0x54, 0x74,0x95, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96,
-0xFF,0x9C, 0x75,0x15, 0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0x95,0x16, 0xFF,0x94, 0x74,0x95,
-0x00,0x1E, 0x85,0x16, 0xFF,0x5C, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFF,0x8C, 0x84,0x96,
-0xFF,0x54, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x85,0x16, 0xFF,0x9C, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xE4, 0x23,0x14, 0x00,0x1A, 0x76,0x19,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x84,0x96, 0xFF,0x94, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16,
-0xFF,0xE8, 0x23,0x14, 0x00,0x16, 0x76,0x19, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xEC, 0x23,0x14, 0x00,0x12, 0x76,0x19, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x85,0x16, 0xFF,0x8C, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x16, 0xFF,0xF0, 0x06,0xB4, 0x00,0x02, 0xC7,0x38,
-0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0xF4,0x82, 0x00,0x02, 0xF4,0xA3,
-0x28,0x00, 0x25,0x14, 0x00,0x5A, 0x85,0x2A, 0x00,0x00, 0x77,0xA9, 0x00,0x1E, 0x77,0xBC,
-0xFF,0xE5, 0xC5,0x28, 0x7F,0xC0, 0x75,0x29, 0xFF,0xF0, 0x07,0x20, 0x00,0x18, 0xF5,0x3B,
-0x28,0x00, 0x94,0x16, 0xFF,0xAC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93,
-0xFF,0xFC, 0x26,0x14, 0x00,0x38, 0x24,0x94, 0x00,0x5A, 0x84,0xA6, 0x00,0x00, 0x77,0xA5,
-0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC4,0xA4, 0x7F,0xC0, 0x74,0xA5, 0xFF,0xF0, 0x05,0xA0,
-0x00,0x02, 0x06,0xAC, 0x00,0x02, 0x23,0x94, 0x00,0x36, 0x75,0x1D, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0x07,0x20, 0x00,0x1A, 0xF4,0xB3, 0x28,0x00, 0x76,0x31, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0x95,0x16, 0xFF,0x54, 0x74,0x95, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96,
-0xFF,0x5C, 0x75,0x15, 0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0x95,0x16, 0xFF,0x7C, 0x74,0x95,
-0x00,0x1E, 0x85,0x16, 0xFF,0xC4, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFF,0x74, 0x85,0x2A,
-0x00,0x34, 0x24,0x94, 0x00,0x5A, 0x95,0x16, 0xFF,0x84, 0x84,0xA6, 0x00,0x00, 0x77,0xA5,
-0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC4,0xA4, 0x7F,0xC0, 0x74,0xA5, 0xFF,0xF0, 0x25,0x14,
-0x00,0x5A, 0xF4,0xAF, 0x28,0x00, 0x85,0x2A, 0x00,0x00, 0x77,0xA9, 0x00,0x1E, 0x77,0xBC,
-0xFF,0xE5, 0xC5,0x28, 0x7F,0xC0, 0x75,0x29, 0xFF,0xF0, 0x84,0x96, 0xFF,0xC4, 0xF5,0x3B,
-0x28,0x00, 0x84,0xA6, 0x00,0x10, 0x85,0x16, 0xFF,0xC4, 0x94,0xA2, 0x00,0x1C, 0x85,0x2A,
-0x00,0x14, 0x74,0x95, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFF,0x6C, 0x95,0x22,
-0x00,0x20, 0x87,0x16, 0xFF,0xC8, 0x85,0x16, 0xFF,0x54, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x87,0x1E, 0x00,0x00, 0x84,0x96, 0xFF,0x5C, 0xC7,0x38,
-0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16,
-0xFF,0xCC, 0x23,0x94, 0x00,0x32, 0x76,0x1D, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x85,0x16,
-0xFF,0x7C, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1E,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xD0, 0x23,0x94, 0x00,0x2E, 0x76,0x1D,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1E, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x84,0x96, 0xFF,0x74, 0x85,0x16,
-0xFF,0x6C, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xD4, 0x23,0x94, 0x00,0x2A, 0x76,0x1D, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1E,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x16, 0xFF,0xD8, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x57,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0xF4,0x82, 0x00,0x02, 0xF4,0xA3, 0x28,0x00, 0x07,0x20,
-0x00,0x18, 0x25,0x14, 0x00,0x7A, 0x85,0x2A, 0x00,0x00, 0x77,0xA9, 0x00,0x1E, 0x77,0xBC,
-0xFF,0xE5, 0xC5,0x28, 0x7F,0xC0, 0x75,0x29, 0xFF,0xF0, 0x84,0x96, 0xFF,0xC4, 0xF5,0x3B,
-0x28,0x00, 0x87,0x26, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x24, 0xF7,0x04,
-0x4F,0x58, 0xE6,0x00, 0x7E,0xF9, 0x94,0x16, 0xFF,0x54, 0xC7,0x20, 0x72,0x00, 0xF6,0x84,
-0x6E,0x50, 0x86,0x26, 0x00,0x2C, 0x77,0x38, 0xFF,0xFA, 0x25,0x14, 0x00,0x5A, 0x84,0x2A,
-0x00,0x00, 0x77,0xA9, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC4,0x20, 0x7F,0xC0, 0x74,0x21,
-0xFF,0xF0, 0x47,0x39, 0x00,0x00, 0x86,0xB6, 0x1D,0xDC, 0x77,0x39, 0x00,0x02, 0xC0,0x32,
-0x6A,0x00, 0x46,0x8C, 0x00,0x01, 0xD6,0x80, 0x0A,0x68, 0x20,0x36, 0x00,0x00, 0xF6,0x86,
-0x40,0x98, 0xE6,0x00, 0x7E,0xC0, 0xC3,0xB8, 0x68,0x00, 0xC5,0x84, 0x00,0x00, 0x86,0xA6,
-0x00,0x24, 0xF7,0x04, 0xE0,0x00, 0xF6,0x02, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x7E,0x54, 0x03,0x24, 0x00,0x24, 0x86,0xA6, 0x00,0x28, 0xF7,0x04, 0xE0,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x7E,0x58, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x7E,0x65, 0x00,0x00, 0x00,0x01, 0xF5,0x82,
-0x00,0x00, 0x86,0x9A, 0x00,0x00, 0xF7,0x04, 0xE0,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0x7E,0xA0, 0xF6,0x02, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x7E,0xA8, 0x20,0x32, 0x00,0x00, 0x86,0x9A, 0x00,0x04, 0xF7,0x04, 0xE0,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x7E,0xA9, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x7E,0xB9, 0x20,0x2E, 0x00,0x00, 0xF5,0x82,
-0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x7E,0xC5, 0x00,0x00, 0x00,0x01, 0xF4,0x02,
-0x00,0x01, 0xF7,0x04, 0x4F,0x58, 0xF4,0x1F, 0x28,0x00, 0x84,0x96, 0xFF,0x54, 0x85,0x16,
-0xFF,0xC4, 0xF6,0x86, 0x40,0x9A, 0xC7,0x24, 0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0x86,0x2A,
-0x00,0x30, 0x47,0x39, 0x00,0x00, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0xE0,0x00,
-0x7F,0x4C, 0xF6,0x3B, 0x28,0x00, 0x84,0x96, 0xFF,0x54, 0xF6,0x06, 0x40,0x98, 0xC7,0x24,
-0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0xC6,0xB8, 0x00,0x00, 0x46,0xB5, 0x00,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x60,0x00, 0xF5,0x02, 0x00,0x01, 0xF5,0x37, 0x28,0x00, 0x47,0x39,
-0x00,0x00, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x60,0x00, 0x24,0x94, 0x00,0x5A, 0x84,0xA6,
-0x00,0x00, 0x77,0xA5, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC4,0xA4, 0x7F,0xC0, 0x74,0xA5,
-0xFF,0xF0, 0x07,0x38, 0x00,0x02, 0xF4,0xBB, 0x28,0x00, 0xF7,0x04, 0x4F,0x58, 0x85,0x16,
-0xFF,0x54, 0x84,0x96, 0xFF,0xAC, 0xC6,0xA8, 0x72,0x00, 0x76,0xB4, 0xFF,0xFA, 0x06,0x24,
-0x00,0x1A, 0xF6,0xB3, 0x28,0x00, 0xC7,0x24, 0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0x06,0xA8,
-0x00,0x1A, 0xF7,0x37, 0x28,0x00, 0x47,0x39, 0x00,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x24,
-0x00,0x1C, 0x97,0x13, 0xFF,0xFC, 0xF5,0x04, 0x4F,0x5C, 0x00,0x00, 0x00,0x01, 0x95,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x23,0x40, 0x97,0x93, 0xFF,0xFC, 0xF7,0x04,
-0x4F,0x58, 0x84,0x96, 0xFF,0x54, 0x00,0x00, 0x00,0x01, 0xC7,0x24, 0x72,0x00, 0x77,0x38,
-0xFF,0xFA, 0x47,0x39, 0x00,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x24, 0x00,0x1C, 0x97,0x13,
-0xFF,0xFC, 0xF5,0x04, 0x4F,0x5C, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x23,0x40, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x78,0xD8, 0x97,0x93, 0xFF,0xFC, 0xF6,0x84, 0x6E,0x50, 0x00,0x00, 0x00,0x01, 0x87,0x36,
-0x1D,0xDC, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x36, 0x1D,0xDC, 0x87,0x36,
-0x1D,0xDC, 0xF0,0x05, 0x40,0x84, 0xF4,0x86, 0xE0,0x00, 0x94,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xD5,0xA0, 0x97,0x93, 0xFF,0xFC, 0xF4,0x05, 0x40,0x84, 0xF7,0x04,
-0x6E,0x50, 0xF0,0x05, 0x42,0x5C, 0x87,0x3A, 0x1D,0xDC, 0xF6,0x86, 0x2C,0x28, 0xF7,0x05,
-0x3B,0x64, 0xF7,0x04, 0x2D,0x38, 0xF5,0x06, 0x3A,0x4C, 0xF5,0x05, 0x42,0x44, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82, 0x00,0x1C, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x80,0x60, 0xB4,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x06,
-0x35,0xEC, 0xE0,0x00, 0x80,0x8C, 0xF5,0x05, 0x42,0x30, 0x20,0x32, 0x00,0x01, 0xE6,0x00,
-0x80,0xC4, 0x00,0x00, 0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93,
-0xFF,0xFC, 0xF4,0x86, 0x35,0x60, 0xF4,0x85, 0x42,0x30, 0xF5,0x06, 0x42,0x44, 0x95,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1F,0x48, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00,
-0x80,0xC4, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0x98, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33,
-0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF5,0x86,
-0x42,0x44, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x20,0xE4, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x81,0x61, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x42,0x54, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xEE,0x00, 0x81,0x29, 0xF6,0x06,
-0x42,0x50, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x72,0xAC, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00,
-0x81,0x60, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0x50, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xF5,0x82, 0x00,0x06, 0xF5,0x85, 0x42,0x54, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x73,0x4C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x86, 0x38,0x1C, 0xF5,0x85, 0x42,0x44, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x58, 0xF7,0x04,
-0x42,0x50, 0xF6,0x86, 0x42,0x50, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF6,0x04,
-0x6F,0x34, 0xC7,0x38, 0x6F,0xC0, 0x86,0xB2, 0x00,0x0C, 0x77,0x39, 0xFF,0xF0, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x82,0x50, 0xF4,0x82, 0x00,0x00, 0xC5,0x04, 0x00,0x00, 0x86,0xB2,
-0x00,0x10, 0xF7,0x04, 0xE0,0x00, 0xC5,0xA4, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x81,0xE4, 0x04,0x30, 0x00,0x10, 0x86,0xB2, 0x00,0x14, 0xF7,0x04, 0xE0,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x81,0xE8, 0x20,0x2E, 0x00,0x00, 0xF5,0x82,
-0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x81,0xF5, 0x00,0x00, 0x00,0x01, 0xF5,0x02,
-0x00,0x00, 0x86,0xA2, 0x00,0x00, 0xF7,0x04, 0xE0,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0x82,0x30, 0xF6,0x02, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0x82,0x38, 0x20,0x32, 0x00,0x00, 0x86,0xA2, 0x00,0x04, 0xF7,0x04, 0xE0,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x82,0x39, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x82,0x49, 0x20,0x2A, 0x00,0x00, 0xF5,0x02,
-0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00, 0x82,0x59, 0x20,0x26, 0x00,0x00, 0xF4,0x82,
-0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00, 0x87,0x60, 0x00,0x00, 0x00,0x01, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0x07,0x20, 0x00,0x02, 0xF0,0x3B,
-0x28,0x00, 0xF7,0x04, 0x4F,0x58, 0xF4,0x05, 0x3B,0xB0, 0x06,0xA0, 0x00,0x14, 0xC7,0x20,
-0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0xF7,0x37, 0x28,0x00, 0x06,0xA0, 0x00,0x16, 0xF7,0x37,
-0x28,0x00, 0xF3,0x02, 0x00,0x01, 0xF3,0x23, 0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0x26,0x14, 0x00,0x20, 0xF0,0x33, 0x28,0x00, 0x04,0xA0,
-0x00,0x02, 0xF0,0x27, 0x28,0x00, 0xF3,0x02, 0x00,0x00, 0x23,0x94, 0x00,0x2A, 0xF3,0x1F,
-0x28,0x00, 0x07,0x20, 0x00,0x1A, 0x23,0x94, 0x00,0x2A, 0x83,0x9E, 0x00,0x00, 0x77,0x9D,
-0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC3,0x9C, 0x7F,0xC0, 0x73,0x9D, 0xFF,0xF0, 0x76,0x31,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x06,0xA4, 0x00,0x02, 0x75,0x15, 0x00,0x1E, 0xF3,0xBB,
-0x28,0x00, 0xF3,0x04, 0xE0,0x00, 0x75,0x28, 0xFF,0xE5, 0x93,0x22, 0x00,0x1C, 0xF3,0x84,
-0xE0,0x04, 0x23,0x14, 0x00,0x1E, 0x93,0x16, 0xFF,0xA4, 0x75,0x99, 0x00,0x1E, 0x75,0xAC,
-0xFF,0xE5, 0x73,0x15, 0x00,0x1E, 0x73,0x18, 0xFF,0xE5, 0x93,0x16, 0xFF,0xCC, 0x83,0x16,
-0xFF,0xA4, 0x93,0xA2, 0x00,0x20, 0x87,0x16, 0xFF,0xE0, 0x73,0x95, 0x00,0x1E, 0x73,0x9C,
-0xFF,0xE5, 0x93,0x96, 0xFF,0xAC, 0x73,0x95, 0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x93,0x96,
-0xFF,0xC4, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xE4, 0x23,0x94, 0x00,0x1A, 0x93,0x96, 0xFF,0xA4, 0x76,0x1D,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1E, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xE8, 0x23,0x14,
-0x00,0x16, 0x93,0x16, 0xFF,0xA4, 0x76,0x19, 0x00,0x1E, 0x83,0x96, 0xFF,0xAC, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x3F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xEC, 0x23,0x14, 0x00,0x12, 0x93,0x16,
-0xFF,0xA4, 0x76,0x19, 0x00,0x1E, 0x83,0x96, 0xFF,0xCC, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x3F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x16,
-0xFF,0xF0, 0x83,0x16, 0xFF,0xC4, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x37,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0xF3,0x82, 0x00,0x02, 0xF3,0xA3, 0x28,0x00, 0x23,0x14,
-0x00,0x2A, 0x83,0x1A, 0x00,0x00, 0x77,0x99, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC3,0x18,
-0x7F,0xC0, 0x73,0x19, 0xFF,0xF0, 0x07,0x20, 0x00,0x18, 0xF3,0x3B, 0x28,0x00, 0x94,0x16,
-0xFF,0xDC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0x07,0x20,
-0x00,0x02, 0x23,0x94, 0x00,0x2A, 0x83,0x9E, 0x00,0x00, 0x77,0x9D, 0x00,0x1E, 0x77,0xBC,
-0xFF,0xE5, 0xC3,0x9C, 0x7F,0xC0, 0x73,0x9D, 0xFF,0xF0, 0x24,0x80, 0x00,0x07, 0x05,0x20,
-0x00,0x0A, 0xF3,0xBB, 0x28,0x00, 0x20,0x26, 0x00,0x07, 0xEE,0x00, 0x84,0xE0, 0x06,0x28,
-0x00,0x0E, 0x86,0xB2, 0x00,0x00, 0x77,0x31, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0x75,0xB1,
-0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0x05,0x28, 0x00,0x02, 0x04,0xA4, 0x00,0x01, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0xFF,0x00, 0xC6,0xB4, 0x74,0x00, 0xF6,0xB3,
-0x28,0x00, 0x87,0x32, 0x00,0x00, 0xF3,0x02, 0x00,0xFF, 0xC7,0x38, 0x5F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0xC7,0x38, 0x34,0x00, 0xE0,0x00, 0x84,0x88, 0xF7,0x33, 0x28,0x00, 0x05,0x20,
-0x00,0x26, 0x86,0x2A, 0x00,0x00, 0x76,0xA9, 0x00,0x1E, 0xF5,0x84, 0x4F,0x58, 0x76,0xB4,
-0xFF,0xE5, 0x83,0x96, 0xFF,0xDC, 0xF3,0x02, 0x00,0xFF, 0x94,0x16, 0xFF,0xBC, 0xC7,0x1C,
-0x5A,0x00, 0x77,0x38, 0xFF,0xFA, 0xC6,0x30, 0x6F,0xC0, 0x76,0x31, 0xFF,0xF0, 0x47,0x39,
-0x00,0x00, 0xC7,0x38, 0x34,0x00, 0xF6,0x82, 0xFF,0x00, 0xC6,0x30, 0x6C,0x00, 0xC7,0x38,
-0x60,0x00, 0xF6,0x84, 0x3B,0x6C, 0xF7,0x2B, 0x28,0x00, 0xC5,0xA0, 0x5A,0x00, 0x75,0xAC,
-0xFF,0xFA, 0x83,0x16, 0xFF,0xDC, 0x07,0x34, 0x00,0x01, 0xF7,0x05, 0x3B,0x6C, 0x07,0x20,
-0x00,0x3A, 0xF6,0xBB, 0x28,0x00, 0x07,0x20, 0x00,0x36, 0xF0,0x3B, 0x28,0x00, 0xF3,0x82,
-0x00,0x03, 0xF3,0xA3, 0x28,0x00, 0x07,0x18, 0x00,0x1A, 0xF5,0xBB, 0x28,0x00, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0x07,0x20, 0x00,0x02, 0xF0,0x3B,
-0x28,0x00, 0x24,0x80, 0x00,0x07, 0x05,0x20, 0x00,0x0A, 0x20,0x26, 0x00,0x07, 0xEE,0x00,
-0x85,0xD4, 0x06,0x28, 0x00,0x0E, 0x86,0xB2, 0x00,0x00, 0x77,0x31, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0x75,0xB1, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0x05,0x28, 0x00,0x02, 0x04,0xA4,
-0x00,0x01, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0xFF,0x00, 0xC6,0xB4,
-0x74,0x00, 0xF6,0xB3, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0xF3,0x82, 0x00,0xFF, 0xC7,0x38,
-0x5F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC7,0x38, 0x3C,0x00, 0xE0,0x00, 0x85,0x7C, 0xF7,0x33,
-0x28,0x00, 0x05,0xA0, 0x00,0x26, 0x86,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC5,0x20, 0x00,0x00, 0x24,0x00, 0x00,0x07, 0xF3,0x02, 0x00,0x01, 0x93,0x16,
-0xFF,0xA4, 0xF7,0x04, 0x4F,0x58, 0x83,0x96, 0xFF,0xBC, 0x24,0x80, 0x00,0x0E, 0xC7,0x1C,
-0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0xC6,0x30, 0x6F,0xC0, 0x76,0x31, 0xFF,0xF0, 0x47,0x39,
-0x00,0x00, 0xF6,0x82, 0x00,0xFF, 0xC7,0x38, 0x6C,0x00, 0xF6,0x82, 0xFF,0x00, 0xC6,0x30,
-0x6C,0x00, 0xC7,0x38, 0x60,0x00, 0xF6,0x84, 0x3B,0x6C, 0xF7,0x2F, 0x28,0x00, 0x07,0x34,
-0x00,0x01, 0xF7,0x05, 0x3B,0x6C, 0x07,0x28, 0x00,0x3A, 0xF6,0xBB, 0x28,0x00, 0x07,0x28,
-0x00,0x36, 0xF0,0x3B, 0x28,0x00, 0xF3,0x02, 0x00,0x03, 0xF3,0x2B, 0x28,0x00, 0x20,0x22,
-0x00,0x07, 0xEE,0x00, 0x86,0x94, 0xC6,0x28, 0x48,0x00, 0x06,0x30, 0x00,0x26, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x04,0xA4, 0x00,0x02, 0x04,0x20,
-0x00,0x01, 0x83,0x96, 0xFF,0xA4, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xF6,0x82,
-0xFF,0x00, 0xC7,0x38, 0x6C,0x00, 0xC7,0x1C, 0x70,0x00, 0xE0,0x00, 0x86,0x50, 0xF7,0x33,
-0x28,0x00, 0x06,0x28, 0x00,0x26, 0x86,0xB2, 0x00,0x00, 0x77,0x31, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0xFF,0x00, 0xC6,0xB4,
-0x74,0x00, 0xF6,0xB3, 0x28,0x00, 0x95,0x13, 0xFF,0xFC, 0xF3,0x04, 0x3B,0xB0, 0x00,0x00,
-0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x95,0x16, 0xFF,0xB4, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD4,0x2C, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0xB4, 0xF0,0x05, 0x40,0x7C, 0x83,0x96,
-0xFF,0xBC, 0x23,0x00, 0x00,0x07, 0xF3,0x05, 0x42,0x58, 0xF7,0x04, 0x42,0x50, 0xF6,0x06,
-0x42,0x50, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF3,0x06, 0x39,0x34, 0xF3,0x05,
-0x42,0x44, 0xF5,0x05, 0x40,0x74, 0xF3,0x85, 0x42,0x60, 0xF3,0x82, 0x00,0x06, 0xF3,0x85,
-0x42,0x54, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xF6,0x84, 0x2D,0x38, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x06,0x34, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0xF7,0x06,
-0x2C,0x28, 0x76,0xB5, 0x00,0x02, 0xF3,0x82, 0x00,0x1C, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0x87,0x4C, 0xB3,0xB6, 0x70,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x06, 0x42,0x44, 0x93,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1F,0x48, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x48, 0xF3,0x86,
-0x42,0x44, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x20,0xE4, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x89,0xED, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x42,0x54, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xEE,0x00, 0x87,0xC9, 0x00,0x00,
-0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x73,0x4C, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00,
-0x89,0xEC, 0x00,0x00, 0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93,
-0xFF,0xFC, 0x26,0x14, 0x00,0x20, 0xF0,0x33, 0x28,0x00, 0x05,0xA0, 0x00,0x02, 0xF0,0x2F,
-0x28,0x00, 0xF3,0x82, 0x00,0x00, 0x24,0x94, 0x00,0x22, 0xF3,0xA7, 0x28,0x00, 0x04,0xA0,
-0x00,0x1A, 0x94,0x96, 0xFF,0xD4, 0x23,0x94, 0x00,0x22, 0x83,0x9E, 0x00,0x00, 0x77,0x9D,
-0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC3,0x9C, 0x7F,0xC0, 0x73,0x9D, 0xFF,0xF0, 0x76,0x31,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x06,0xAC, 0x00,0x02, 0x23,0x14, 0x00,0x1E, 0x75,0x19,
-0x00,0x1E, 0xF3,0xA7, 0x28,0x00, 0xF4,0x84, 0xE0,0x00, 0x75,0x28, 0xFF,0xE5, 0x94,0xA2,
-0x00,0x1C, 0xF3,0x84, 0xE0,0x04, 0x74,0x95, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96,
-0xFF,0xB4, 0x74,0x95, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFF,0xCC, 0x84,0x96,
-0xFF,0xB4, 0x93,0xA2, 0x00,0x20, 0x87,0x16, 0xFF,0xE0, 0x73,0x95, 0x00,0x1E, 0x73,0x9C,
-0xFF,0xE5, 0x93,0x96, 0xFF,0xBC, 0x73,0x95, 0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0x93,0x96,
-0xFF,0xC4, 0x83,0x96, 0xFF,0xBC, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F,
-0x28,0x00, 0xF5,0x84, 0x4F,0x58, 0x87,0x1A, 0x00,0x00, 0xC5,0xA0, 0x5A,0x00, 0x75,0xAC,
-0xFF,0xFA, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xE4, 0x23,0x14, 0x00,0x1A, 0x76,0x19, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0x45,0xAD, 0x00,0x00, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x84,0x96, 0xFF,0xCC, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16,
-0xFF,0xE8, 0x23,0x14, 0x00,0x16, 0x76,0x19, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x3F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xEC, 0x23,0x14, 0x00,0x12, 0x76,0x19, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x83,0x96, 0xFF,0xC4, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x16, 0xFF,0xF0, 0x06,0xB4, 0x00,0x02, 0xC7,0x38,
-0x3F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0xF4,0x82, 0x00,0x02, 0xF4,0xA3,
-0x28,0x00, 0x04,0x20, 0x00,0x18, 0x23,0x94, 0x00,0x22, 0x83,0x9E, 0x00,0x00, 0x77,0x9D,
-0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC3,0x9C, 0x7F,0xC0, 0x73,0x9D, 0xFF,0xF0, 0x84,0x96,
-0xFF,0xD4, 0xF3,0xA3, 0x28,0x00, 0xF3,0x82, 0x00,0x01, 0xF3,0xA7, 0x28,0x00, 0x95,0x93,
-0xFF,0xFC, 0xF4,0x86, 0xE0,0x00, 0x94,0x93, 0xFF,0xFC, 0xF3,0x84, 0x4F,0x5C, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x23,0x40, 0x97,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x78,0xD8, 0x97,0x93, 0xFF,0xFC, 0xF4,0x86,
-0x36,0x78, 0xF4,0x85, 0x42,0x44, 0xF0,0x05, 0x40,0x84, 0xF6,0x84, 0x4F,0x5C, 0xF7,0x02,
-0x00,0x64, 0x97,0x36, 0x00,0x00, 0x90,0x36, 0x00,0x04, 0xF7,0x02, 0x00,0x01, 0xF7,0x05,
-0x40,0x84, 0xF3,0x86, 0x35,0xEC, 0xF3,0x85, 0x42,0x30, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x90, 0xF7,0x04, 0x42,0x60, 0xF5,0x02,
-0x00,0x00, 0x05,0xB8, 0x00,0x18, 0xF6,0x04, 0x42,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x32,
-0x00,0x07, 0xEE,0x00, 0x8A,0x70, 0xC7,0x30, 0x60,0x00, 0xC7,0x38, 0x58,0x00, 0x07,0x38,
-0x00,0x0E, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0xB4, 0x74,0x00, 0xC0,0x36,
-0x52,0x00, 0x47,0x0C, 0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x8A,0x71, 0x07,0x30, 0x00,0x01, 0xE0,0x00, 0x8A,0x18, 0xF7,0x05, 0x42,0x58, 0xF4,0x04,
-0x42,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x22, 0x00,0x07, 0xEE,0x00, 0x8D,0x94, 0x24,0x94,
-0x00,0x36, 0xF6,0x04, 0x42,0x60, 0x25,0x14, 0x00,0x38, 0x23,0x94, 0x00,0x20, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x06,0x30,
-0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B,
-0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x34, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x32, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x30, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2E, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2C, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2A, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x24,0x94,
-0x00,0x28, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x94,0x13, 0xFF,0xFC, 0x95,0x13, 0xFF,0xFC, 0x93,0x96,
-0xFF,0x7C, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93,
-0xFF,0xFC, 0xF6,0x04, 0x42,0x60, 0x24,0x94, 0x00,0x7E, 0x25,0x14, 0x00,0x80, 0x23,0x94,
-0x00,0x68, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x06,0x30, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38,
-0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x7C, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x7A, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x78, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x76, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x74, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x72, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x24,0x94, 0x00,0x70, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x95,0x13, 0xFF,0xFC, 0x93,0x96,
-0xFF,0x74, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD2,0x58, 0x97,0x93,
-0xFF,0xFC, 0x83,0x96, 0xFF,0x74, 0x00,0x00, 0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0xF7,0x04,
-0x42,0x58, 0x23,0x94, 0x00,0x50, 0xC7,0x00, 0x72,0x00, 0x97,0x13, 0xFF,0xFC, 0x93,0x96,
-0xFF,0x6C, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCF,0x24, 0x97,0x93,
-0xFF,0xFC, 0x83,0x96, 0xFF,0x6C, 0xF6,0x86, 0x42,0x50, 0x93,0x93, 0xFF,0xFC, 0xF3,0x84,
-0x42,0x58, 0x76,0xB5, 0x00,0x1E, 0x93,0x93, 0xFF,0xFC, 0xF7,0x04, 0x42,0x50, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x97,0x13, 0xFF,0xFC, 0x83,0x96,
-0xFF,0x7C, 0x00,0x00, 0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xF3,0x38, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x8D,0x95, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x42,0x58, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x42,0x58, 0xF7,0x04, 0x42,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x07, 0xEE,0x00,
-0x8D,0xD4, 0xF3,0x82, 0x17,0x70, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x82, 0x00,0x1C, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0x8D,0xF4, 0xB3,0xBA, 0x68,0x02, 0xE0,0x00, 0x8D,0xF4, 0xF0,0x05,
-0x2D,0x38, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x1B, 0x93,0x93, 0xFF,0xFC, 0xF3,0x86,
-0x42,0x44, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1E,0xC0, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x88, 0xF7,0x04, 0x42,0x50, 0xF6,0x86, 0x42,0x50, 0x76,0xB5, 0x00,0x1E, 0xF3,0x84,
-0x6F,0x34, 0x76,0xB4, 0xFF,0xE5, 0x93,0x96, 0xFF,0xC4, 0xC7,0x38, 0x6F,0xC0, 0x86,0x9E,
-0x00,0x0C, 0x77,0x39, 0xFF,0xF0, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x8E,0x65, 0xF6,0x06,
-0x42,0xA0, 0xF7,0x04, 0x42,0xA0, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xE0,0x00, 0x94,0xE4, 0xF7,0x33,
-0x28,0x00, 0xF6,0x04, 0x42,0x60, 0x24,0x94, 0x00,0x36, 0x85,0x16, 0xFF,0xC4, 0x23,0x94,
-0x00,0x38, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x85,0x2A, 0x00,0x1C, 0x06,0x30, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x95,0x16, 0xFF,0xBC, 0xF7,0x1F, 0x28,0x00, 0x87,0x32,
-0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0x85,0x16, 0xFF,0xC4, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x34, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x32, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x30, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2E, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2C, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2A, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x24,0x94,
-0x00,0x28, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x87,0x2A, 0x00,0x20, 0x00,0x00, 0x00,0x01, 0x97,0x13,
-0xFF,0xFC, 0x93,0x93, 0xFF,0xFC, 0x27,0x14, 0x00,0x20, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0xC4, 0x00,0x00,
-0x00,0x01, 0x87,0x1E, 0x00,0x10, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0x8F,0xF0, 0xF6,0x82, 0x00,0x00, 0x87,0x1E, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0x8F,0xF4, 0x20,0x36, 0x00,0x00, 0xF6,0x82, 0x00,0x01, 0x20,0x36,
-0x00,0x00, 0xE6,0x00, 0x90,0x41, 0x00,0x00, 0x00,0x01, 0x85,0x16, 0xFF,0xC4, 0x00,0x00,
-0x00,0x01, 0x05,0x28, 0x00,0x10, 0x95,0x16, 0xFF,0xB4, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x72,0x50, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0xB4, 0x27,0x14,
-0x00,0x20, 0x93,0x93, 0xFF,0xFC, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xF9,0x34, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x94,0xE4, 0x00,0x00, 0x00,0x01, 0x85,0x16,
-0xFF,0xBC, 0x00,0x00, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00, 0x94,0xBC, 0x00,0x00,
-0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0xF5,0x02,
-0x00,0x00, 0x23,0x94, 0x00,0x62, 0xF5,0x1F, 0x28,0x00, 0x75,0x95, 0x00,0x1E, 0x75,0xAC,
-0xFF,0xE5, 0x06,0x20, 0x00,0x02, 0x06,0xB0, 0x00,0x02, 0x23,0x14, 0x00,0x1E, 0x73,0x99,
-0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0x93,0x96, 0xFF,0x74, 0x75,0x15, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0x95,0x16, 0xFF,0x7C, 0x73,0x95, 0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0x93,0x96,
-0xFF,0x8C, 0x85,0x16, 0xFF,0xC4, 0x73,0x95, 0x00,0x1E, 0x93,0x96, 0xFF,0x84, 0x85,0x2A,
-0x00,0x34, 0x23,0x94, 0x00,0x62, 0x95,0x16, 0xFF,0xAC, 0xF0,0x33, 0x28,0x00, 0x05,0x20,
-0x00,0x1A, 0x95,0x16, 0xFF,0x94, 0x83,0x9E, 0x00,0x00, 0x77,0x9D, 0x00,0x1E, 0x77,0xBC,
-0xFF,0xE5, 0xC3,0x9C, 0x7F,0xC0, 0x73,0x9D, 0xFF,0xF0, 0x74,0x95, 0x00,0x1E, 0xF3,0xAB,
-0x28,0x00, 0x85,0x16, 0xFF,0xC4, 0x74,0xA4, 0xFF,0xE5, 0x85,0x2A, 0x00,0x10, 0x83,0x96,
-0xFF,0xC4, 0x95,0x22, 0x00,0x1C, 0x83,0x9E, 0x00,0x14, 0x85,0x16, 0xFF,0x84, 0x93,0xA2,
-0x00,0x20, 0x87,0x16, 0xFF,0xE0, 0x75,0x28, 0xFF,0xE5, 0x95,0x16, 0xFF,0x84, 0xF3,0x84,
-0x4F,0x58, 0x85,0x16, 0xFF,0x74, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x93,0x96, 0xFF,0xA4, 0xC0,0x22, 0x3A,0x00, 0x83,0x96,
-0xFF,0x7C, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xE4, 0x23,0x14, 0x00,0x1A, 0x76,0x19, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xE8, 0x23,0x14, 0x00,0x16, 0x76,0x19,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x3F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x85,0x16, 0xFF,0x8C, 0x83,0x96,
-0xFF,0x84, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xEC, 0x23,0x14, 0x00,0x12, 0x76,0x19, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x16, 0xFF,0xF0, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x3F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0xF5,0x02, 0x00,0x02, 0xF5,0x23, 0x28,0x00, 0x23,0x94,
-0x00,0x52, 0x83,0x9E, 0x00,0x00, 0x77,0x9D, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC3,0x9C,
-0x7F,0xC0, 0x73,0x9D, 0xFF,0xF0, 0x03,0x20, 0x00,0x18, 0xE6,0x00, 0x92,0x30, 0xF3,0x9B,
-0x28,0x00, 0xF7,0x04, 0x42,0x70, 0xE0,0x00, 0x92,0x9C, 0xF6,0x06, 0x42,0x72, 0x85,0x16,
-0xFF,0xC4, 0x00,0x00, 0x00,0x01, 0x86,0xAA, 0x00,0x20, 0x00,0x00, 0x00,0x01, 0x07,0x34,
-0x00,0x07, 0x20,0x3A, 0x00,0x0E, 0xE2,0x00, 0x92,0x94, 0xC7,0x34, 0x68,0x00, 0xF5,0x84,
-0x42,0x60, 0xF3,0x82, 0x00,0xFF, 0xC7,0x2C, 0x70,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA,
-0x00,0x00, 0x97,0x16, 0xFF,0x74, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xC6,0xB4, 0x3C,0x00, 0x20,0x36, 0x00,0x00, 0x47,0x0C,
-0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0x92,0xC9, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x42,0x74, 0xF6,0x06, 0x42,0x74, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33,
-0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00,
-0x94,0xE4, 0x00,0x00, 0x00,0x01, 0x85,0x16, 0xFF,0xA4, 0x83,0x96, 0xFF,0x74, 0xC7,0x20,
-0x52,0x00, 0x74,0xB8, 0xFF,0xFA, 0xC6,0x24, 0x00,0x00, 0x87,0x1E, 0x00,0x00, 0x76,0x9D,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC5,0xAC, 0x52,0x00, 0x75,0xAC, 0xFF,0xFA, 0x46,0x31,
-0x00,0x00, 0xF5,0x02, 0x00,0xFF, 0xC6,0x30, 0x54,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0xF6,0x82, 0xFF,0x00, 0xC7,0x38, 0x6C,0x00, 0xC6,0x30, 0x70,0x00, 0xF6,0x1F,
-0x28,0x00, 0x83,0x96, 0xFF,0x94, 0x85,0x16, 0xFF,0xC4, 0xF5,0x9F, 0x28,0x00, 0x87,0x2A,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x24, 0xE6,0x00, 0x94,0x69, 0xF6,0x86,
-0x40,0x98, 0xF7,0x04, 0x6E,0x50, 0x86,0x2A, 0x00,0x2C, 0xC6,0xA4, 0x00,0x00, 0x23,0x94,
-0x00,0x62, 0x84,0x9E, 0x00,0x00, 0x77,0x9D, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC4,0xA4,
-0x7F,0xC0, 0x74,0xA5, 0xFF,0xF0, 0x46,0xB5, 0x00,0x00, 0x87,0x3A, 0x1D,0xDC, 0x76,0xB5,
-0x00,0x02, 0xC0,0x32, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A,
-0x00,0x00, 0xF7,0x06, 0x40,0x98, 0xE6,0x00, 0x94,0x34, 0xC3,0x34, 0x70,0x00, 0xC5,0x84,
-0x00,0x00, 0x86,0xAA, 0x00,0x24, 0xF7,0x04, 0xE0,0x00, 0xF6,0x02, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0x05,0x28, 0x00,0x24, 0xE6,0x00, 0x93,0xC4, 0x95,0x16, 0xFF,0x74, 0x83,0x96,
-0xFF,0xC4, 0x00,0x00, 0x00,0x01, 0x86,0x9E, 0x00,0x28, 0xF7,0x04, 0xE0,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x93,0xC8, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x93,0xD5, 0x00,0x00, 0x00,0x01, 0xF5,0x82,
-0x00,0x00, 0x85,0x16, 0xFF,0x74, 0xF7,0x04, 0xE0,0x00, 0x86,0xAA, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x94,0x14, 0xF6,0x02, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0x94,0x1C, 0x20,0x32, 0x00,0x00, 0x86,0xAA, 0x00,0x04, 0xF7,0x04,
-0xE0,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0x94,0x1D, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0x94,0x2D, 0x20,0x2E,
-0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0x94,0x39, 0x00,0x00,
-0x00,0x01, 0xF4,0x82, 0x00,0x01, 0xF7,0x04, 0x4F,0x58, 0xF4,0x9B, 0x28,0x00, 0x83,0x96,
-0xFF,0xC4, 0xF6,0x86, 0x40,0x9A, 0xC7,0x20, 0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0x86,0x1E,
-0x00,0x30, 0x47,0x39, 0x00,0x00, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0xE0,0x00,
-0x94,0xE4, 0xF6,0x3B, 0x28,0x00, 0x47,0x25, 0x00,0x00, 0x77,0x39, 0x00,0x02, 0xC7,0x38,
-0x68,0x00, 0xF5,0x02, 0x00,0x01, 0xF5,0x3B, 0x28,0x00, 0x07,0x38, 0x00,0x02, 0x23,0x94,
-0x00,0x62, 0x83,0x9E, 0x00,0x00, 0x77,0x9D, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC3,0x9C,
-0x7F,0xC0, 0x73,0x9D, 0xFF,0xF0, 0x25,0x14, 0x00,0x62, 0xF3,0xBB, 0x28,0x00, 0x85,0x2A,
-0x00,0x00, 0x77,0xA9, 0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC5,0x28, 0x7F,0xC0, 0x75,0x29,
-0xFF,0xF0, 0xE0,0x00, 0x94,0xE4, 0xF5,0x1B, 0x28,0x00, 0x83,0x96, 0xFF,0xBC, 0x00,0x00,
-0x00,0x01, 0x20,0x1E, 0x00,0x01, 0xE6,0x00, 0x94,0xE4, 0x00,0x00, 0x00,0x01, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x35,0x60, 0xF5,0x05,
-0x42,0x30, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF5,0x06,
-0x42,0x44, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x20,0xE4, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0x96,0x89, 0x00,0x00, 0x00,0x01, 0xF6,0x84,
-0x42,0x54, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xEE,0x00, 0x95,0x8D, 0xF5,0x86,
-0x42,0x50, 0xF7,0x04, 0x42,0x50, 0x76,0x2D, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x26,0xB4,
-0x00,0x01, 0xF6,0x85, 0x42,0x54, 0x25,0x00, 0x00,0x07, 0xF5,0x05, 0x42,0x58, 0xF6,0x84,
-0x2D,0x38, 0xC7,0x38, 0x67,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x2F,
-0x28,0x00, 0x06,0x34, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0xF7,0x06, 0x2C,0x28, 0x76,0xB5,
-0x00,0x02, 0xF5,0x02, 0x00,0x1C, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x96,0x88, 0xB5,0x36,
-0x70,0x02, 0xE0,0x00, 0x96,0x88, 0xF0,0x05, 0x2D,0x38, 0xF5,0x04, 0x42,0x60, 0x00,0x00,
-0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xB2,0x84, 0x97,0x93,
-0xFF,0xFC, 0xF6,0x84, 0x4F,0x58, 0x00,0x00, 0x00,0x01, 0x07,0x34, 0x00,0x40, 0xC0,0x22,
-0x72,0x00, 0xE6,0x00, 0x95,0xEC, 0xF6,0x06, 0x42,0x76, 0xF7,0x04, 0x42,0x74, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0x96,0x88, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0x60, 0x00,0x00,
-0x00,0x01, 0xC0,0x22, 0x72,0x00, 0xE6,0x00, 0x96,0x24, 0x00,0x00, 0x00,0x01, 0x97,0x13,
-0xFF,0xFC, 0xF5,0x04, 0x3B,0xB0, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xD4,0x2C, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x96,0x40, 0x00,0x00,
-0x00,0x01, 0xC0,0x22, 0x6A,0x00, 0xE6,0x00, 0x96,0x71, 0x00,0x00, 0x00,0x01, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCC,0x60, 0x97,0x93, 0xFF,0xFC, 0xF7,0x04,
-0x40,0x7C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x13, 0xFF,0xFC, 0xF5,0x04,
-0x40,0x74, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xBE,0xF8, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x96,0x88, 0x00,0x00, 0x00,0x01, 0xF5,0x04,
-0x40,0x74, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xC1,0xB4, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x70, 0xF6,0x04, 0x6F,0x34, 0xF7,0x04, 0x42,0x64, 0x86,0xB2,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0x9B,0x18, 0x06,0xB0,
-0x00,0x02, 0x87,0x36, 0x00,0x00, 0xF4,0x04, 0x40,0x7C, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC0,0x3A, 0x42,0x00, 0xE6,0x00,
-0x9B,0x18, 0x24,0x94, 0x00,0x36, 0xF6,0x04, 0x40,0x74, 0x23,0x94, 0x00,0x38, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x06,0x30,
-0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x34, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x32, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x30, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2E, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2C, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2A, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x24,0x94,
-0x00,0x28, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x94,0x13, 0xFF,0xFC, 0x93,0x93, 0xFF,0xFC, 0x27,0x14,
-0x00,0x20, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0xF5,0x04,
-0x40,0x74, 0x94,0x16, 0xFF,0xC4, 0x07,0x20, 0x00,0x02, 0xF0,0x3B, 0x28,0x00, 0x24,0x80,
-0x00,0x07, 0xF4,0x02, 0x00,0xFF, 0x83,0x96, 0xFF,0xC4, 0x95,0x16, 0xFF,0xBC, 0x03,0x1C,
-0x00,0x0A, 0x20,0x26, 0x00,0x07, 0xEE,0x00, 0x98,0xA8, 0x06,0x18, 0x00,0x0E, 0x86,0xB2,
-0x00,0x00, 0x77,0x31, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0x75,0xB1, 0x00,0x1E, 0x75,0xAC,
-0xFF,0xE5, 0x03,0x18, 0x00,0x02, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02,
-0xFF,0x00, 0xC6,0xB4, 0x74,0x00, 0xF6,0xB3, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x04,0xA4,
-0x00,0x01, 0xC7,0x38, 0x5F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC7,0x38, 0x44,0x00, 0xE0,0x00,
-0x98,0x54, 0xF7,0x33, 0x28,0x00, 0x85,0x16, 0xFF,0xC4, 0x74,0x95, 0x00,0x1E, 0x74,0xA4,
-0xFF,0xE5, 0x83,0x96, 0xFF,0xC4, 0x23,0x14, 0x00,0x1E, 0x74,0x19, 0x00,0x1E, 0x74,0x20,
-0xFF,0xE5, 0x05,0x28, 0x00,0x26, 0x95,0x16, 0xFF,0x8C, 0x85,0xAA, 0x00,0x00, 0x76,0xA9,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x03,0x9C, 0x00,0x02, 0x93,0x96, 0xFF,0xB4, 0x06,0x1C,
-0x00,0x02, 0x73,0x95, 0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0x93,0x96, 0xFF,0xAC, 0x73,0x95,
-0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0x93,0x96, 0xFF,0x9C, 0x83,0x96, 0xFF,0xBC, 0x75,0x15,
-0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0x95,0x16, 0xFF,0x94, 0x75,0x15, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0x95,0x16, 0xFF,0xA4, 0x85,0x16, 0xFF,0xC4, 0xC5,0xAC, 0x6F,0xC0, 0x75,0xAD,
-0xFF,0xF0, 0xF5,0x05, 0x42,0x60, 0xF5,0x04, 0x4F,0x58, 0xF6,0x82, 0x00,0xFF, 0xC7,0x1C,
-0x52,0x00, 0x77,0x38, 0xFF,0xFA, 0x47,0x39, 0x00,0x00, 0xC7,0x38, 0x6C,0x00, 0xF6,0x82,
-0xFF,0x00, 0xC5,0xAC, 0x6C,0x00, 0xC7,0x38, 0x58,0x00, 0x83,0x96, 0xFF,0x8C, 0xF5,0x84,
-0x3B,0x6C, 0x85,0x16, 0xFF,0xB4, 0xF7,0x1F, 0x28,0x00, 0x87,0x16, 0xFF,0xE0, 0x06,0xAC,
-0x00,0x01, 0xF6,0x85, 0x3B,0x6C, 0x83,0x96, 0xFF,0xC4, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0xF5,0x04, 0x4F,0x58, 0x87,0x1A, 0x00,0x00, 0xC0,0x1E,
-0x52,0x00, 0xC7,0x38, 0x47,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x06,0x30,
-0x00,0x02, 0x87,0x16, 0xFF,0xE4, 0x23,0x14, 0x00,0x1A, 0x76,0x99, 0x00,0x1E, 0x83,0x96,
-0xFF,0x94, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x3F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0x30, 0x00,0x02, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x16, 0xFF,0xE8, 0x23,0x14,
-0x00,0x16, 0x76,0x99, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x85,0x16, 0xFF,0xAC, 0x83,0x96,
-0xFF,0xA4, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x06,0x30, 0x00,0x02, 0x85,0x16, 0xFF,0x9C, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x16, 0xFF,0xEC, 0x23,0x14,
-0x00,0x12, 0x76,0x99, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x3F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0x30, 0x00,0x02, 0x83,0x96,
-0xFF,0xC4, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x87,0x16,
-0xFF,0xF0, 0x06,0x30, 0x00,0x02, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33,
-0x28,0x00, 0x07,0x1C, 0x00,0x3A, 0xF5,0xBB, 0x28,0x00, 0x07,0x1C, 0x00,0x36, 0xF0,0x3B,
-0x28,0x00, 0xF5,0x02, 0x00,0x03, 0xE6,0x00, 0x9A,0xA4, 0xF5,0x1F, 0x28,0x00, 0xF7,0x04,
-0x42,0x78, 0xF6,0x06, 0x42,0x78, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x9B,0x18, 0x00,0x00,
-0x00,0x01, 0xF3,0x86, 0x42,0x44, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x1F,0x48, 0x97,0x93, 0xFF,0xFC, 0x25,0x00, 0x00,0x07, 0xF5,0x05, 0x42,0x58, 0xF7,0x04,
-0x42,0x50, 0xF6,0x06, 0x42,0x50, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF3,0x82,
-0x00,0x06, 0xF3,0x85, 0x42,0x54, 0xF5,0x06, 0x39,0x34, 0xF5,0x05, 0x42,0x44, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xF6,0x84, 0x2D,0x38, 0x07,0x38, 0x00,0x01, 0xF7,0x33,
-0x28,0x00, 0x06,0x34, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0xF7,0x06, 0x2C,0x28, 0x76,0xB5,
-0x00,0x02, 0xF3,0x82, 0x00,0x1C, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0x9B,0x18, 0xB3,0xB6,
-0x70,0x02, 0xF0,0x05, 0x2D,0x38, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x78, 0xF3,0x86, 0x42,0x44, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x20,0xE4, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0x9E,0x41, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0x54, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xEE,0x00, 0x9D,0x85, 0x24,0x94, 0x00,0x36, 0xF6,0x04, 0x40,0x74, 0x25,0x14,
-0x00,0x38, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x06,0x30, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38,
-0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x34, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x32, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x30, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2E, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2C, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94, 0x00,0x2A, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x24,0x94, 0x00,0x28, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0xF3,0x84, 0x40,0x7C, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x95,0x13, 0xFF,0xFC, 0x23,0x94, 0x00,0x20, 0x93,0x96,
-0xFF,0x94, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93,
-0xFF,0xFC, 0x83,0x96, 0xFF,0x94, 0x00,0x00, 0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x23,0x94,
-0x00,0x68, 0x93,0x96, 0xFF,0x8C, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD2,0x58, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x8C, 0x00,0x00, 0x00,0x01, 0x93,0x93,
-0xFF,0xFC, 0x90,0x13, 0xFF,0xFC, 0x23,0x94, 0x00,0x50, 0x93,0x96, 0xFF,0x84, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCF,0x24, 0x97,0x93, 0xFF,0xFC, 0x87,0x02,
-0xFF,0x34, 0x00,0x00, 0x00,0x01, 0xF7,0x05, 0x42,0x64, 0xF3,0x84, 0x40,0x7C, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x97,0x13, 0xFF,0xFC, 0x83,0x96, 0xFF,0x84, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x94, 0x00,0x00, 0x00,0x01, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xF7,0xC8, 0x97,0x93, 0xFF,0xFC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0x9D,0x5D, 0xF3,0x82, 0x17,0x70, 0xF7,0x04, 0x42,0x54, 0x00,0x00,
-0x00,0x01, 0x27,0x38, 0x00,0x01, 0xF7,0x05, 0x42,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x1B, 0x93,0x93, 0xFF,0xFC, 0xF3,0x86, 0x42,0x44, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x1E,0xC0, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0x9E,0x40, 0x00,0x00,
-0x00,0x01, 0xF5,0x04, 0x40,0x7C, 0xF4,0x84, 0x40,0x74, 0xC7,0x28, 0x50,0x00, 0xC7,0x24,
-0x70,0x00, 0x05,0xB8, 0x00,0x26, 0x86,0xAE, 0x00,0x00, 0x77,0x2D, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x77,0xB4, 0x00,0x08, 0x70,0x3E, 0xFF,0xE8, 0x47,0x0C,
-0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xF7,0x04, 0x4F,0x58, 0xE6,0x00,
-0x9D,0xFD, 0xF6,0x02, 0x00,0xFF, 0xF7,0x04, 0x42,0x78, 0xF6,0x06, 0x42,0x7A, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0x9E,0x40, 0x00,0x00, 0x00,0x01, 0x86,0xAE, 0x00,0x00, 0x77,0x2D,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02,
-0x00,0x01, 0xC7,0x38, 0x64,0x00, 0xF6,0x02, 0xFF,0x00, 0xC6,0xB4, 0x64,0x00, 0xC7,0x38,
-0x68,0x00, 0xF7,0x2F, 0x28,0x00, 0x07,0x28, 0x00,0x01, 0x97,0x13, 0xFF,0xFC, 0x94,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xBE,0xF8, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0xD8, 0xF3,0x86,
-0x42,0x44, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x20,0xE4, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xA2,0xC9, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x42,0x54, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xEE,0x00, 0xA0,0x35, 0x24,0x94,
-0x00,0x36, 0xF6,0x04, 0x40,0x74, 0x25,0x14, 0x00,0x38, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x06,0x30, 0x00,0x02, 0x75,0xB1,
-0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x87,0x32,
-0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x34, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x32, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x30, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x2E, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x2C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x2A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x24,0x94, 0x00,0x28, 0x76,0x31,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0xF3,0x84, 0x40,0x7C, 0x00,0x00, 0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x95,0x13,
-0xFF,0xFC, 0x23,0x94, 0x00,0x20, 0x93,0x96, 0xFF,0x4C, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x4C, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x23,0x94, 0x00,0x50, 0x93,0x96, 0xFF,0x44, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD2,0x58, 0x97,0x93, 0xFF,0xFC, 0x87,0x02,
-0xFF,0x34, 0x00,0x00, 0x00,0x01, 0xF7,0x05, 0x42,0x64, 0xF3,0x84, 0x40,0x7C, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x97,0x13, 0xFF,0xFC, 0x83,0x96, 0xFF,0x44, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x4C, 0xE0,0x00, 0xA2,0x80, 0x93,0x93,
-0xFF,0xFC, 0xF4,0x04, 0x40,0x7C, 0xF6,0x04, 0x40,0x74, 0xF3,0x82, 0x00,0x00, 0xC7,0x20,
-0x40,0x00, 0xC7,0x30, 0x70,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA, 0x00,0x00, 0x77,0x39,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x77,0xB4, 0x00,0x08, 0x70,0x3E,
-0xFF,0xE8, 0x47,0x0C, 0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0xA0,0xAD, 0x93,0x96, 0xFF,0x3C, 0xF7,0x04, 0x42,0xA0, 0xF6,0x06, 0x42,0xA0, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0xA2,0xC8, 0x00,0x00, 0x00,0x01, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x24,0x94, 0x00,0x7E, 0x25,0x14,
-0x00,0x80, 0x23,0x94, 0x00,0x68, 0x06,0x30, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC,
-0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94,
-0x00,0x7C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94,
-0x00,0x7A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94,
-0x00,0x78, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94,
-0x00,0x76, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94,
-0x00,0x74, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x24,0x94,
-0x00,0x72, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x24,0x94, 0x00,0x70, 0x76,0x31, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x94,0x13,
-0xFF,0xFC, 0x95,0x13, 0xFF,0xFC, 0x93,0x96, 0xFF,0x34, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x34, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x23,0x94, 0x00,0xB0, 0x93,0x96, 0xFF,0x2C, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD2,0x58, 0x97,0x93, 0xFF,0xFC, 0x83,0x96,
-0xFF,0x2C, 0x00,0x00, 0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x3C, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x23,0x94, 0x00,0x98, 0x93,0x96, 0xFF,0x24, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCF,0x24, 0x97,0x93, 0xFF,0xFC, 0xF3,0x82,
-0x00,0x06, 0xF3,0x85, 0x42,0x54, 0x87,0x02, 0xFF,0x34, 0xF3,0x86, 0x38,0xA8, 0xF3,0x85,
-0x42,0x44, 0xF7,0x05, 0x42,0x64, 0xF3,0x84, 0x40,0x7C, 0x00,0x00, 0x00,0x01, 0x93,0x93,
-0xFF,0xFC, 0x97,0x13, 0xFF,0xFC, 0x83,0x96, 0xFF,0x24, 0x00,0x00, 0x00,0x01, 0x93,0x93,
-0xFF,0xFC, 0x83,0x96, 0xFF,0x34, 0x00,0x00, 0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xF7,0xC8, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0xA2,0xA9, 0xF3,0x82, 0x17,0x70, 0xF7,0x04, 0x42,0x54, 0x00,0x00, 0x00,0x01, 0x27,0x38,
-0x00,0x01, 0xF7,0x05, 0x42,0x54, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0x1B, 0x93,0x93,
-0xFF,0xFC, 0xF3,0x86, 0x42,0x44, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x1E,0xC0, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF6,0x04, 0x6F,0x34, 0xF7,0x04, 0x42,0x64, 0x86,0xB2, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xA3,0xAC, 0x06,0xB0, 0x00,0x02, 0x87,0x36,
-0x00,0x00, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0xF6,0x84,
-0x40,0x7C, 0x77,0x39, 0xFF,0xF0, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x00, 0xA3,0xAC, 0xC7,0x34,
-0x68,0x00, 0xF5,0x84, 0x40,0x74, 0xF6,0x04, 0x4F,0x58, 0x00,0x00, 0x00,0x01, 0xC6,0x2C,
-0x62,0x00, 0x76,0x30, 0xFF,0xFA, 0xC5,0xAC, 0x70,0x00, 0x05,0xAC, 0x00,0x26, 0x86,0xAE,
-0x00,0x00, 0x77,0x2D, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0x46,0x31, 0x00,0x00, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0x30, 0x74,0x00, 0xF7,0x02,
-0xFF,0x00, 0xC6,0xB4, 0x74,0x00, 0xC6,0x30, 0x68,0x00, 0xF6,0x2F, 0x28,0x00, 0xF5,0x06,
-0x42,0x44, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1F,0x48, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x04, 0x40,0x7C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x13,
-0xFF,0xFC, 0xF5,0x04, 0x40,0x74, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xBE,0xF8, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x80, 0xF7,0x04, 0x42,0x58, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0xA3,0xF4, 0x20,0x3A, 0x00,0x07, 0xF5,0x02,
-0x00,0x01, 0xF5,0x05, 0x42,0x58, 0xF7,0x04, 0x42,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x07, 0xEE,0x00, 0xA6,0xF0, 0x23,0x94, 0x00,0x1E, 0xF6,0x04, 0x42,0x60, 0x23,0x14,
-0x00,0x66, 0xF4,0x84, 0x40,0x78, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x04,0xA4, 0x00,0x02, 0x74,0x25, 0x00,0x1E, 0x74,0x20,
-0xFF,0xE5, 0x06,0x30, 0x00,0x02, 0x75,0x31, 0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0x95,0x16,
-0xFF,0x7C, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x25,0x14, 0x00,0x20, 0x95,0x16,
-0xFF,0x94, 0xF7,0x2B, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x85,0x16, 0xFF,0x7C, 0x05,0xA4,
-0x00,0x02, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F, 0x28,0x00, 0x23,0x94,
-0x00,0x1C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x25,0x14, 0x00,0x50, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x1A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x18, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x16, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x14, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x12, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x10, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x1F, 0x28,0x00, 0x87,0x26, 0x00,0x00, 0x26,0x14, 0x00,0x68, 0xC7,0x38,
-0x47,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x87,0x2E, 0x00,0x00, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x23,0x14,
-0x00,0x64, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x23,0x14,
-0x00,0x62, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x23,0x14,
-0x00,0x60, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x23,0x14,
-0x00,0x5E, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x23,0x14,
-0x00,0x5C, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x23,0x14,
-0x00,0x5A, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x05,0xAC,
-0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x23,0x14, 0x00,0x58, 0x75,0xAD, 0x00,0x1E, 0x75,0xAC,
-0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x96,0x13,
-0xFF,0xFC, 0x95,0x16, 0xFF,0x8C, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD2,0x58, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0x8C, 0x00,0x00, 0x00,0x01, 0x95,0x13,
-0xFF,0xFC, 0xF5,0x04, 0x42,0x58, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x25,0x14,
-0x00,0x38, 0x95,0x16, 0xFF,0x84, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xCF,0x24, 0x97,0x93, 0xFF,0xFC, 0xF5,0x04, 0x42,0x58, 0x00,0x00, 0x00,0x01, 0x95,0x13,
-0xFF,0xFC, 0xF5,0x04, 0x42,0x64, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x85,0x16,
-0xFF,0x84, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x85,0x16, 0xFF,0x94, 0x00,0x00,
-0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xF7,0xC8, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xA6,0xF1, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x42,0x58, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x42,0x58, 0xF7,0x04,
-0x42,0x58, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x07, 0xEE,0x00, 0xA7,0x30, 0xF5,0x02,
-0x17,0x70, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x02, 0x00,0x1C, 0x20,0x32, 0x00,0x44, 0xE6,0x00,
-0xA7,0x50, 0xB5,0x3A, 0x68,0x02, 0xE0,0x00, 0xA7,0x50, 0xF0,0x05, 0x2D,0x38, 0x95,0x13,
-0xFF,0xFC, 0xF5,0x02, 0x00,0x1B, 0x95,0x13, 0xFF,0xFC, 0xF5,0x06, 0x42,0x44, 0x95,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1E,0xC0, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x30, 0xF6,0x04,
-0x6F,0x34, 0xF7,0x04, 0x42,0x64, 0x86,0xB2, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0xA9,0xF0, 0x07,0x30, 0x00,0x02, 0x86,0x3A, 0x00,0x00, 0xF5,0x82,
-0x00,0x00, 0xF6,0x84, 0x40,0x7C, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0x30,
-0x77,0xC0, 0xF7,0x04, 0x40,0x74, 0xC6,0xB4, 0x68,0x00, 0x76,0x31, 0xFF,0xF0, 0xC6,0x00,
-0x62,0x00, 0x96,0x16, 0xFF,0xF4, 0xC7,0x38, 0x68,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA,
-0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x77,0xB4,
-0x00,0x08, 0x70,0x3E, 0xFF,0xE8, 0x47,0x0C, 0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0xA8,0x34, 0xF6,0x02, 0x00,0xFF, 0x83,0x16, 0xFF,0xF4, 0x83,0x96,
-0xFF,0xF4, 0xF7,0x04, 0x40,0x78, 0xC6,0x98, 0x38,0x00, 0xC7,0x38, 0x68,0x00, 0x07,0x38,
-0x00,0x26, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xC6,0xB4, 0x64,0x00, 0xC0,0x36, 0x5A,0x00, 0x47,0x0C,
-0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0xA8,0x3D, 0x20,0x2E,
-0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0xA8,0x75, 0xF6,0x06,
-0x42,0x7C, 0xF7,0x04, 0x42,0x7C, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x78,0x9C, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0xA9,0xF0, 0x00,0x00,
-0x00,0x01, 0xF3,0x04, 0x42,0x60, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xCC,0x60, 0x97,0x93, 0xFF,0xFC, 0xF4,0x04, 0x40,0x78, 0xF7,0x04,
-0x4F,0x58, 0xF5,0x04, 0x40,0x74, 0xF3,0x84, 0x40,0x7C, 0xF3,0x04, 0x40,0x7C, 0xC6,0x20,
-0x72,0x00, 0x76,0x30, 0xFF,0xFA, 0xC5,0x9C, 0x30,0x00, 0xC5,0xA8, 0x58,0x00, 0x05,0xAC,
-0x00,0x26, 0x86,0xAE, 0x00,0x00, 0x74,0xAD, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x73,0xAD,
-0x00,0x1E, 0x73,0x9C, 0xFF,0xE5, 0x93,0x96, 0xFF,0xD4, 0xC5,0x28, 0x72,0x00, 0x75,0x28,
-0xFF,0xFA, 0x83,0x16, 0xFF,0xF4, 0x83,0x96, 0xFF,0xF4, 0x46,0x31, 0x00,0x00, 0x45,0x29,
-0x00,0x00, 0xC7,0x18, 0x38,0x00, 0xC4,0x20, 0x70,0x00, 0x04,0x20, 0x00,0x26, 0x73,0x21,
-0x00,0x1E, 0xC6,0xB4, 0x4F,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF4,0x82, 0x00,0xFF, 0xC6,0x30,
-0x4C,0x00, 0xF3,0x82, 0xFF,0x00, 0xC6,0xB4, 0x3C,0x00, 0xC6,0x30, 0x68,0x00, 0xF6,0x2F,
-0x28,0x00, 0x87,0x2E, 0x00,0x00, 0x73,0x18, 0xFF,0xE5, 0x93,0x16, 0xFF,0xCC, 0x83,0x16,
-0xFF,0xD4, 0x83,0x96, 0xFF,0xF4, 0xC5,0x28, 0x4C,0x00, 0xC7,0x38, 0x37,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x76,0x9D, 0x00,0x10, 0x76,0xB5, 0xFF,0xF8, 0xC7,0x38, 0x4C,0x00, 0xC6,0xB4,
-0x70,0x00, 0xF6,0xAF, 0x28,0x00, 0x87,0x22, 0x00,0x00, 0x76,0xA1, 0x00,0x1E, 0x83,0x16,
-0xFF,0xCC, 0xF3,0x82, 0xFF,0x00, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x37,0xC0, 0x77,0x39,
-0xFF,0xF0, 0xC7,0x38, 0x3C,0x00, 0xC5,0x28, 0x70,0x00, 0xF5,0x23, 0x28,0x00, 0x87,0x22,
-0x00,0x00, 0xF3,0x04, 0x40,0x7C, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x73,0x19,
-0x00,0x10, 0x93,0x16, 0xFF,0xEC, 0x73,0x99, 0xFF,0xF8, 0xC7,0x38, 0x4C,0x00, 0xC7,0x1C,
-0x70,0x00, 0x97,0x16, 0xFF,0xDC, 0x23,0x14, 0x00,0x22, 0x83,0x1A, 0x00,0x00, 0x77,0x99,
-0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC3,0x18, 0x7F,0xC0, 0x73,0x19, 0xFF,0xF0, 0xF3,0x23,
-0x28,0x00, 0xF3,0x86, 0x42,0x44, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x1F,0x48, 0x97,0x93, 0xFF,0xFC, 0xF7,0x04, 0x40,0x7C, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0x97,0x13, 0xFF,0xFC, 0xF3,0x04, 0x40,0x74, 0x00,0x00, 0x00,0x01, 0x93,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xBE,0xF8, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x98, 0xF3,0x06,
-0x42,0x44, 0x93,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x20,0xE4, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xAE,0xE5, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x42,0x54, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xEE,0x00, 0xAD,0x89, 0x27,0x38,
-0x00,0x01, 0xF7,0x05, 0x42,0x54, 0x23,0x94, 0x00,0x1E, 0xF6,0x04, 0x42,0x60, 0x24,0x94,
-0x00,0x66, 0x94,0x96, 0xFF,0x64, 0xF3,0x04, 0x40,0x78, 0x24,0x94, 0x00,0x20, 0x94,0x96,
-0xFF,0x94, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x03,0x18, 0x00,0x02, 0x93,0x16, 0xFF,0x74, 0x74,0x19, 0x00,0x1E, 0x74,0x20,
-0xFF,0xE5, 0x05,0x98, 0x00,0x02, 0x06,0x30, 0x00,0x02, 0x75,0x31, 0x00,0x1E, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0x28,
-0xFF,0xE5, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F, 0x28,0x00, 0x23,0x94,
-0x00,0x1C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x85,0x16, 0xFF,0x64, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x1A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x18, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x16, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x14, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x12, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F,
-0x28,0x00, 0x23,0x94, 0x00,0x10, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x1F, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x26,0x14, 0x00,0x68, 0xC7,0x38,
-0x47,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x87,0x2E, 0x00,0x00, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x23,0x14,
-0x00,0x64, 0x93,0x16, 0xFF,0x64, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x24,0x94, 0x00,0x62, 0x94,0x96, 0xFF,0x64, 0x05,0xAC, 0x00,0x02, 0x87,0x2E,
-0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x25,0x14, 0x00,0x60, 0x95,0x16, 0xFF,0x64, 0x05,0xAC,
-0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x23,0x14, 0x00,0x5E, 0x93,0x16,
-0xFF,0x64, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x24,0x94,
-0x00,0x5C, 0x94,0x96, 0xFF,0x64, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x25,0x14, 0x00,0x5A, 0x95,0x16, 0xFF,0x64, 0x05,0xAC, 0x00,0x02, 0x87,0x2E,
-0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x24,0x94, 0x00,0x50, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x23,0x14, 0x00,0x58, 0x05,0xAC,
-0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x93,0x16, 0xFF,0x64, 0x75,0xAD, 0x00,0x1E, 0x75,0xAC,
-0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x96,0x13,
-0xFF,0xFC, 0x94,0x96, 0xFF,0x8C, 0x94,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD2,0x58, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0x8C, 0x23,0x14, 0x00,0x38, 0x95,0x13,
-0xFF,0xFC, 0x27,0x80, 0x00,0x07, 0x97,0x93, 0xFF,0xFC, 0x93,0x16, 0xFF,0x84, 0x93,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCF,0x24, 0x97,0x93, 0xFF,0xFC, 0x27,0x80,
-0x00,0x07, 0xF7,0x85, 0x42,0x58, 0x27,0x80, 0x00,0x07, 0x97,0x93, 0xFF,0xFC, 0xF4,0x84,
-0x42,0x64, 0x00,0x00, 0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0x84, 0x00,0x00,
-0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x83,0x16, 0xFF,0x94, 0x00,0x00, 0x00,0x01, 0x93,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xF7,0xC8, 0x97,0x93, 0xFF,0xFC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0xAD,0x5D, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0x58, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x42,0x58, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86,
-0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF4,0x82,
-0x00,0x1C, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0xAE,0xE4, 0xB4,0xBA, 0x68,0x02, 0xE0,0x00,
-0xAE,0xE4, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x40,0x78, 0xF5,0x84, 0x4F,0x58, 0x07,0x38,
-0x00,0x16, 0x86,0xBA, 0x00,0x00, 0xF4,0x06, 0x3B,0x90, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB4, 0xFF,0xF0, 0x76,0x35, 0x00,0x06, 0xA7,0x2E,
-0x60,0x02, 0xC5,0x2C, 0x60,0x00, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x40,0x00, 0x07,0x38,
-0x00,0x02, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x73,0xB7, 0xFF,0xF0, 0xEE,0x00, 0xAE,0x55, 0x95,0x16, 0xFF,0x64, 0xA7,0x2E,
-0x60,0x02, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x40,0x00, 0x86,0xBA, 0x00,0x04, 0x23,0x14,
-0x00,0x88, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0xA6,0xAA, 0x68,0x02, 0x77,0x1D, 0x00,0x03, 0xC7,0x38, 0x68,0x00, 0x27,0x38,
-0x00,0x08, 0x85,0x3A, 0x00,0x04, 0x84,0xBA, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x95,0x1A,
-0x00,0x04, 0x94,0x9A, 0x00,0x00, 0x85,0x96, 0xFF,0x7C, 0xE0,0x00, 0xAE,0x78, 0x00,0x00,
-0x00,0x01, 0x84,0x96, 0xFF,0x64, 0xA7,0x2E, 0x60,0x02, 0x76,0xA5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38,
-0x40,0x00, 0x85,0xBA, 0x00,0x04, 0x85,0x16, 0xFF,0x64, 0xF6,0x06, 0x3B,0x90, 0x87,0x2A,
-0x00,0x00, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xA6,0xBA, 0x60,0x02, 0x20,0x1E, 0x00,0x00, 0xC7,0x38,
-0x60,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0xEE,0x00,
-0xAE,0xC9, 0x76,0xB5, 0xFF,0xF0, 0x83,0x16, 0xFF,0x78, 0x00,0x00, 0x00,0x01, 0x77,0x19,
-0xFF,0xF0, 0xC6,0xB8, 0x68,0x00, 0x84,0x96, 0xFF,0x64, 0x00,0x00, 0x00,0x01, 0xC7,0x24,
-0x68,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xC1,0x2C, 0x00,0x00, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x10, 0xF7,0x04, 0x40,0x84, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0xAF,0x3C, 0xF6,0x06, 0x42,0xB8, 0xF7,0x04, 0x42,0xB8, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xF3,0x06, 0x36,0x78, 0xF3,0x05, 0x42,0x44, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33, 0x28,0x00, 0xF7,0x04, 0x4F,0x5C, 0xF3,0x84,
-0x42,0x5C, 0x83,0x3A, 0x00,0x04, 0xC4,0x38, 0x00,0x00, 0x93,0x16, 0xFF,0xEC, 0x77,0x1D,
-0x00,0x01, 0xC7,0x38, 0x38,0x00, 0x77,0x39, 0x00,0x02, 0x04,0xB8, 0x00,0x0C, 0x83,0x16,
-0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0xC0,0x1E, 0x32,0x00, 0xEC,0x00, 0xB0,0x70, 0xC5,0x04,
-0x00,0x00, 0xA6,0xA2, 0x48,0x02, 0xF7,0x04, 0xE0,0x00, 0xF5,0x82, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0xAF,0xA8, 0xC6,0x20, 0x48,0x00, 0x86,0xB2, 0x00,0x04, 0xF7,0x04,
-0xE0,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xAF,0xAC, 0x20,0x2E,
-0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0xAF,0xB9, 0x00,0x00,
-0x00,0x01, 0xF5,0x02, 0x00,0x00, 0x86,0xB2, 0x00,0x00, 0xF7,0x04, 0xE0,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0xAF,0xF4, 0xF5,0x82, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0xAF,0xFC, 0x20,0x2E, 0x00,0x00, 0x86,0xB2, 0x00,0x04, 0xF7,0x04,
-0xE0,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0xAF,0xFD, 0x20,0x2E,
-0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0xB0,0x0D, 0x20,0x2A,
-0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00, 0xB0,0x59, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x7A,0xD0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0xB0,0x64, 0xC7,0x20, 0x48,0x00, 0x87,0x3A, 0x00,0x08, 0xF6,0x06, 0x40,0x98, 0x77,0x39,
-0x00,0x02, 0xA6,0xBA, 0x60,0x02, 0xC7,0x38, 0x60,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0x20,0x36, 0x00,0x00, 0xE6,0x00,
-0xB0,0x64, 0x00,0x00, 0x00,0x01, 0x04,0xA4, 0x00,0x0C, 0xE0,0x00, 0xAF,0x60, 0x03,0x9C,
-0x00,0x01, 0x83,0x16, 0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0xC0,0x1E, 0x32,0x00, 0xEC,0x00,
-0xB1,0x04, 0xF3,0x06, 0x36,0x78, 0xF6,0x84, 0x4F,0x5C, 0x77,0x1D, 0x00,0x01, 0xC7,0x38,
-0x38,0x00, 0x77,0x39, 0x00,0x02, 0x07,0x38, 0x00,0x0C, 0xC6,0xB4, 0x70,0x00, 0x87,0x36,
-0x00,0x08, 0xF6,0x84, 0x4F,0x58, 0x77,0x39, 0x00,0x06, 0xC6,0xB4, 0x70,0x00, 0x96,0x93,
-0xFF,0xFC, 0x93,0x96, 0xFF,0xF4, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xFA,0x98, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xF6,0x84, 0x42,0x6C, 0x83,0x96, 0xFF,0xF4, 0x47,0x0C,
-0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0xC7,0x1C, 0x70,0x00, 0xF7,0x05, 0x42,0x5C, 0x06,0xB4,
-0x00,0x01, 0xF7,0x04, 0x2D,0x38, 0xF6,0x85, 0x42,0x6C, 0xF6,0x86, 0x2C,0x28, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x1C, 0x20,0x32,
-0x00,0x44, 0xE6,0x00, 0xB1,0x08, 0xB3,0x3A, 0x68,0x02, 0xE0,0x00, 0xB1,0x08, 0xF0,0x05,
-0x2D,0x38, 0xF3,0x05, 0x42,0x44, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF4,0x02, 0x00,0x00, 0xC5,0xA0, 0x00,0x00, 0xF6,0x82, 0x07,0x70, 0xF7,0x04,
-0x6E,0x50, 0x20,0x36, 0x00,0x00, 0xE6,0x00, 0xB1,0x6D, 0x06,0x38, 0x00,0x1C, 0x87,0x32,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC4,0x20, 0x70,0x00, 0xC0,0x22, 0x72,0x00, 0xE4,0x00,
-0xB1,0x5D, 0x00,0x00, 0x00,0x01, 0x05,0xAC, 0x00,0x01, 0x26,0xB4, 0x00,0x01, 0x20,0x36,
-0x00,0x00, 0xE6,0x00, 0xB1,0x40, 0x06,0x30, 0x00,0x04, 0xC4,0x20, 0x58,0x00, 0xC0,0x22,
-0x5A,0x00, 0xE4,0x00, 0xB1,0x81, 0x00,0x00, 0x00,0x01, 0x04,0x20, 0x00,0x01, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x78,0xD8, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xB1,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x04, 0x40,0x94, 0x00,0x00, 0x00,0x01, 0xC0,0x22, 0x72,0x00, 0xE6,0x00,
-0xB1,0xED, 0xF4,0x05, 0x40,0x90, 0xF7,0x04, 0x6E,0x50, 0x00,0x00, 0x00,0x01, 0x86,0xBA,
-0x1D,0xDC, 0xF5,0x82, 0x00,0x01, 0x06,0xB4, 0x00,0x01, 0x96,0xBA, 0x1D,0xDC, 0x87,0x3A,
-0x1D,0xDC, 0xE0,0x00, 0xB1,0xF0, 0xF5,0x85, 0x7A,0xD0, 0xF0,0x05, 0x7A,0xD0, 0xF5,0x84,
-0x40,0x90, 0xF0,0x05, 0x40,0x84, 0xF5,0x85, 0x40,0x94, 0xF5,0x86, 0xE0,0x00, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD5,0xA0, 0x97,0x93, 0xFF,0xFC, 0xF7,0x04,
-0x6E,0x50, 0xF4,0x05, 0x40,0x84, 0x85,0xBA, 0x1D,0xDC, 0x00,0x00, 0x00,0x01, 0xF5,0x85,
-0x3B,0x64, 0xF5,0x84, 0xE0,0x00, 0xF0,0x05, 0x42,0x5C, 0x95,0xBA, 0x00,0x10, 0xF5,0x84,
-0xE0,0x04, 0xF6,0x86, 0x2C,0x28, 0x95,0xBA, 0x00,0x14, 0xF7,0x04, 0x2D,0x38, 0xF5,0x86,
-0x3A,0x4C, 0xF5,0x85, 0x42,0x44, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39,
-0x00,0x02, 0xF5,0x82, 0x00,0x1C, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0xB2,0x68, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x86, 0x35,0xEC, 0xF5,0x85, 0x42,0x30, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0xC8, 0xF3,0x02,
-0x00,0x00, 0x93,0x16, 0xFF,0x94, 0x24,0x80, 0x00,0x08, 0x94,0x96, 0xFF,0x84, 0x23,0x80,
-0x00,0x07, 0x83,0x16, 0xFF,0x94, 0x00,0x00, 0x00,0x01, 0x93,0x16, 0xFF,0x54, 0x20,0x1E,
-0x00,0x07, 0xEE,0x00, 0xB5,0x64, 0xC7,0x1C, 0x38,0x00, 0x84,0x96, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0xC7,0x24, 0x70,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA, 0x00,0x00, 0xF5,0x84,
-0x4F,0x58, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0xB6, 0x74,0x00, 0xE6,0x00, 0xB3,0x2D, 0x20,0x36,
-0x00,0x01, 0xE6,0x00, 0xB3,0x2D, 0x77,0x35, 0x00,0x06, 0xA6,0xBA, 0x58,0x02, 0xC7,0x38,
-0x58,0x00, 0x76,0x39, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC6,0xB4, 0x67,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0x20,0x36, 0x00,0x02, 0xE6,0x00, 0xB3,0x31, 0xC6,0xB8, 0x00,0x00, 0xC7,0x2C,
-0x00,0x00, 0xE0,0x00, 0xB3,0x30, 0xC6,0xB8, 0x00,0x00, 0xF6,0x84, 0x4F,0x58, 0xF7,0x04,
-0x4F,0x58, 0xC5,0x34, 0x00,0x00, 0xC0,0x2A, 0x72,0x00, 0xE6,0x00, 0xB5,0x5D, 0x00,0x00,
-0x00,0x01, 0xF6,0x84, 0x3B,0xBC, 0xF3,0x02, 0x00,0x00, 0x93,0x16, 0xFF,0x3C, 0x04,0x28,
-0x00,0x1C, 0xF7,0x04, 0x3B,0xB8, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xEC,0x00,
-0xB4,0x40, 0x96,0x96, 0xFF,0xAC, 0x77,0x35, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x77,0x39,
-0x00,0x02, 0xF4,0x86, 0x3B,0xB4, 0xC6,0x38, 0x48,0x00, 0x06,0x30, 0x00,0x0C, 0xC3,0x04,
-0x00,0x00, 0x93,0x16, 0xFF,0x34, 0x86,0xB2, 0x00,0x00, 0x87,0x2A, 0x00,0x1C, 0x85,0x96,
-0xFF,0x3C, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xB3,0xC0, 0x20,0x2E, 0x00,0x00, 0x86,0xB2,
-0x00,0x04, 0x87,0x2A, 0x00,0x20, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0xB3,0xC0, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00,
-0xB3,0xD1, 0x00,0x00, 0x00,0x01, 0xF4,0x82, 0x00,0x00, 0x94,0x96, 0xFF,0x34, 0x86,0xB2,
-0x00,0x00, 0x87,0x22, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0xB4,0x0C, 0xF5,0x82, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xB4,0x14, 0x20,0x2E,
-0x00,0x00, 0x86,0xB2, 0x00,0x04, 0x87,0x22, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0xB4,0x15, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E,
-0x00,0x00, 0xE6,0x00, 0xB4,0x25, 0x00,0x00, 0x00,0x01, 0xF3,0x02, 0x00,0x01, 0x93,0x16,
-0xFF,0x34, 0x84,0x96, 0xFF,0x34, 0x00,0x00, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00,
-0xB4,0x40, 0x00,0x00, 0x00,0x01, 0xF3,0x02, 0x00,0x01, 0x93,0x16, 0xFF,0x3C, 0x84,0x96,
-0xFF,0x3C, 0x00,0x00, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00, 0xB4,0x81, 0xF6,0x02,
-0x00,0x01, 0x87,0x16, 0xFF,0xAC, 0xF3,0x06, 0x3B,0xB4, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4,
-0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6,
-0x00,0x00, 0x97,0x16, 0xFF,0xB0, 0xE0,0x00, 0xB4,0xF4, 0x96,0x96, 0xFF,0xB4, 0x27,0x14,
-0x00,0x54, 0x97,0x13, 0xFF,0xFC, 0x94,0x13, 0xFF,0xFC, 0xF4,0x86, 0x3B,0xB4, 0x94,0x93,
-0xFF,0xFC, 0x93,0x96, 0xFF,0x4C, 0x95,0x16, 0xFF,0x44, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x4C, 0x85,0x16, 0xFF,0x44, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0xB4,0xF1, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xAC, 0xF3,0x06,
-0x3B,0xB4, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4,
-0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xB0, 0x96,0x96,
-0xFF,0xB4, 0xF7,0x05, 0x3B,0xBC, 0xE0,0x00, 0xB4,0xF8, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0xB5,0x2D, 0x27,0x14, 0x00,0x08, 0x84,0x96,
-0xFF,0x54, 0x00,0x00, 0x00,0x01, 0xC7,0x24, 0x70,0x00, 0x83,0x16, 0xFF,0xB4, 0x04,0xA4,
-0x00,0x04, 0x94,0x96, 0xFF,0x54, 0x84,0x96, 0xFF,0x94, 0x93,0x3A, 0xFF,0xC0, 0x04,0xA4,
-0x00,0x01, 0xE0,0x00, 0xB5,0x54, 0x94,0x96, 0xFF,0x94, 0x83,0x16, 0xFF,0x54, 0x00,0x00,
-0x00,0x01, 0xC7,0x18, 0x70,0x00, 0xF4,0x84, 0x4F,0x58, 0x03,0x18, 0x00,0x04, 0x93,0x16,
-0xFF,0x54, 0x83,0x16, 0xFF,0x94, 0x94,0xBA, 0xFF,0xC0, 0x03,0x18, 0x00,0x01, 0x93,0x16,
-0xFF,0x94, 0x95,0x16, 0xFF,0x3C, 0x93,0x96, 0xFF,0x8C, 0xE0,0x00, 0xB2,0xB0, 0x03,0x9C,
-0x00,0x01, 0x84,0x96, 0xFF,0x94, 0x00,0x00, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00,
-0xB5,0x84, 0xF3,0x82, 0x00,0x01, 0xF4,0x04, 0x4F,0x58, 0xE0,0x00, 0xBE,0xE4, 0x00,0x00,
-0x00,0x01, 0x83,0x16, 0xFF,0xB8, 0x84,0x96, 0xFF,0x94, 0x00,0x00, 0x00,0x01, 0xC0,0x1E,
-0x4A,0x00, 0xEC,0x00, 0xB5,0xCC, 0x93,0x16, 0xFF,0x7C, 0x26,0x94, 0x00,0x04, 0x87,0x36,
-0xFF,0xC0, 0x83,0x16, 0xFF,0x7C, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00,
-0xBB,0x98, 0x03,0x9C, 0x00,0x01, 0x84,0x96, 0xFF,0x94, 0x00,0x00, 0x00,0x01, 0xC0,0x1E,
-0x4A,0x00, 0xEC,0x00, 0xB5,0xA1, 0x06,0xB4, 0x00,0x04, 0xF4,0x04, 0x4F,0x58, 0x83,0x16,
-0xFF,0x7C, 0x00,0x00, 0x00,0x01, 0xC0,0x1A, 0x42,0x00, 0xE6,0x00, 0xBA,0x2D, 0xF4,0x82,
-0x00,0x00, 0x94,0x96, 0xFF,0x74, 0x23,0x80, 0x00,0x07, 0x20,0x1E, 0x00,0x07, 0xEE,0x00,
-0xB7,0x48, 0xC7,0x1C, 0x38,0x00, 0x83,0x16, 0xFF,0x7C, 0x00,0x00, 0x00,0x01, 0xC7,0x18,
-0x70,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA, 0x00,0x00, 0xF5,0x84, 0x4F,0x58, 0x77,0x39,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02,
-0x00,0xFF, 0xC6,0xB6, 0x74,0x00, 0xE6,0x00, 0xB6,0x69, 0x20,0x36, 0x00,0x01, 0xE6,0x00,
-0xB6,0x69, 0x77,0x35, 0x00,0x06, 0xA6,0xBA, 0x58,0x02, 0xC7,0x38, 0x58,0x00, 0x76,0x39,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC6,0xB4, 0x67,0xC0, 0x76,0xB5, 0xFF,0xF0, 0x20,0x36,
-0x00,0x02, 0xE6,0x00, 0xB6,0x6D, 0xC6,0xB8, 0x00,0x00, 0xC7,0x2C, 0x00,0x00, 0xE0,0x00,
-0xB6,0x6C, 0xC6,0xB8, 0x00,0x00, 0xF6,0x84, 0x4F,0x58, 0xF7,0x04, 0x4F,0x58, 0xC5,0x34,
-0x00,0x00, 0xC0,0x2A, 0x72,0x00, 0xE6,0x00, 0xB7,0x41, 0xC5,0x84, 0x00,0x00, 0x84,0x96,
-0xFF,0x74, 0x86,0xAA, 0x00,0x1C, 0x83,0x16, 0xFF,0x3C, 0xF6,0x02, 0x00,0x00, 0x04,0xA4,
-0x00,0x01, 0x94,0x96, 0xFF,0x74, 0x87,0x1A, 0x00,0x1C, 0x04,0xA8, 0x00,0x1C, 0x94,0x96,
-0xFF,0x34, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xB6,0xCC, 0x04,0x18, 0x00,0x1C, 0x86,0xAA,
-0x00,0x20, 0x87,0x1A, 0x00,0x20, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0xB6,0xD0, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0xB6,0xDD, 0x00,0x00, 0x00,0x01, 0xF5,0x82, 0x00,0x00, 0x83,0x16, 0xFF,0x34, 0x87,0x22,
-0x00,0x00, 0x86,0x9A, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0xB7,0x1C, 0xF6,0x02, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xB7,0x24, 0x20,0x32,
-0x00,0x00, 0x86,0x9A, 0x00,0x04, 0x87,0x22, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0xB7,0x25, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0xE6,0x00, 0xB7,0x35, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E,
-0x00,0x00, 0xE6,0x00, 0xB7,0x40, 0x00,0x00, 0x00,0x01, 0x93,0x96, 0xFF,0x84, 0xE0,0x00,
-0xB5,0xEC, 0x03,0x9C, 0x00,0x01, 0x84,0x96, 0xFF,0x74, 0x83,0x16, 0xFF,0x94, 0x00,0x00,
-0x00,0x01, 0xC0,0x26, 0x32,0x00, 0xE6,0x00, 0xBB,0x98, 0x23,0x00, 0x00,0x08, 0x84,0x96,
-0xFF,0x84, 0x00,0x00, 0x00,0x01, 0xC0,0x26, 0x32,0x00, 0xE6,0x00, 0xBB,0x99, 0xF6,0x02,
-0x00,0x00, 0xF6,0x84, 0x40,0x7C, 0xF7,0x04, 0x40,0x74, 0xC6,0xB4, 0x68,0x00, 0xC7,0x38,
-0x68,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x77,0xB4, 0x00,0x08, 0x70,0x3E, 0xFF,0xE8, 0x47,0x0C,
-0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0xB8,0x04, 0xF5,0x82,
-0x00,0xFF, 0x84,0x96, 0xFF,0x84, 0x83,0x16, 0xFF,0x8C, 0x00,0x00, 0x00,0x01, 0xC7,0x24,
-0x32,0x00, 0x84,0x96, 0xFF,0x7C, 0xC7,0x38, 0x70,0x00, 0xC7,0x24, 0x70,0x00, 0x07,0x38,
-0x00,0x26, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xC6,0xB4, 0x5C,0x00, 0xC0,0x36, 0x62,0x00, 0x47,0x0C,
-0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0xB8,0x0D, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0xBB,0x98, 0x23,0x80,
-0x00,0x07, 0x20,0x1E, 0x00,0x07, 0xEE,0x00, 0xB8,0xC8, 0xC7,0x1C, 0x38,0x00, 0x83,0x16,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC7,0x18, 0x70,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA,
-0x00,0x00, 0xF5,0x84, 0x4F,0x58, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0xB6, 0x74,0x00, 0xE6,0x00,
-0xB8,0x91, 0x20,0x36, 0x00,0x01, 0xE6,0x00, 0xB8,0x91, 0x77,0x35, 0x00,0x06, 0xA6,0xBA,
-0x58,0x02, 0xC7,0x38, 0x58,0x00, 0x76,0x39, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC6,0xB4,
-0x67,0xC0, 0x76,0xB5, 0xFF,0xF0, 0x20,0x36, 0x00,0x02, 0xE6,0x00, 0xB8,0x95, 0xC6,0xB8,
-0x00,0x00, 0xC7,0x2C, 0x00,0x00, 0xE0,0x00, 0xB8,0x94, 0xC6,0xB8, 0x00,0x00, 0xF6,0x84,
-0x4F,0x58, 0xF7,0x04, 0x4F,0x58, 0xC5,0x34, 0x00,0x00, 0xC0,0x2A, 0x72,0x00, 0xE6,0x00,
-0xB8,0xC1, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x93,0x96, 0xFF,0x4C, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xCC,0x60, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x4C, 0xE0,0x00,
-0xB8,0x14, 0x03,0x9C, 0x00,0x01, 0x84,0x96, 0xFF,0x84, 0x83,0x16, 0xFF,0x8C, 0xF3,0x84,
-0x40,0x7C, 0xF5,0x04, 0x40,0x74, 0xC4,0xA4, 0x32,0x00, 0x94,0x96, 0xFF,0x34, 0x83,0x16,
-0xFF,0x34, 0xC5,0x9C, 0x38,0x00, 0xC5,0xA8, 0x58,0x00, 0x05,0xAC, 0x00,0x26, 0x86,0xAE,
-0x00,0x00, 0x77,0x2D, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0x74,0x2D, 0x00,0x1E, 0x74,0x20,
-0xFF,0xE5, 0x73,0x9D, 0x00,0x10, 0x73,0x9D, 0xFF,0xF8, 0xC4,0xA4, 0x30,0x00, 0x94,0x96,
-0xFF,0x3C, 0x83,0x16, 0xFF,0x7C, 0xC6,0xB4, 0x77,0xC0, 0xC4,0x98, 0x48,0x00, 0x94,0x96,
-0xFF,0x3C, 0x04,0xA4, 0x00,0x26, 0x94,0x96, 0xFF,0x3C, 0x73,0x25, 0x00,0x1E, 0x73,0x18,
-0xFF,0xE5, 0x93,0x16, 0xFF,0x6C, 0x74,0xA5, 0x00,0x1E, 0x94,0x96, 0xFF,0x64, 0x74,0xA4,
-0xFF,0xE5, 0x94,0x96, 0xFF,0x64, 0x83,0x16, 0xFF,0x7C, 0xF4,0x84, 0x4F,0x58, 0x76,0xB5,
-0xFF,0xF0, 0xC6,0x18, 0x4A,0x00, 0x76,0x30, 0xFF,0xFA, 0x46,0x31, 0x00,0x00, 0xF3,0x02,
-0x00,0xFF, 0xC6,0x30, 0x34,0x00, 0xF4,0x82, 0xFF,0x00, 0xC6,0xB4, 0x4C,0x00, 0xC6,0x30,
-0x68,0x00, 0xF6,0x2F, 0x28,0x00, 0x87,0x2E, 0x00,0x00, 0x83,0x16, 0xFF,0x34, 0xC7,0x38,
-0x47,0xC0, 0x77,0x39, 0xFF,0xF0, 0x73,0x19, 0x00,0x10, 0x93,0x16, 0xFF,0x34, 0x74,0x99,
-0xFF,0xF8, 0xF3,0x02, 0x00,0xFF, 0xC7,0x38, 0x34,0x00, 0xC7,0x24, 0x70,0x00, 0x97,0x16,
-0xFF,0x34, 0x24,0x94, 0x00,0xCA, 0x84,0xA6, 0x00,0x00, 0x77,0xA5, 0x00,0x1E, 0x77,0xBC,
-0xFF,0xE5, 0xC4,0xA4, 0x7F,0xC0, 0x74,0xA5, 0xFF,0xF0, 0x83,0x16, 0xFF,0x3C, 0xF4,0xAF,
-0x28,0x00, 0xF4,0x84, 0x4F,0x58, 0x87,0x1A, 0x00,0x00, 0xC5,0x28, 0x4A,0x00, 0x75,0x28,
-0xFF,0xFA, 0x83,0x16, 0xFF,0x6C, 0x45,0x29, 0x00,0x00, 0xF4,0x82, 0x00,0xFF, 0xC5,0x28,
-0x4C,0x00, 0x84,0x96, 0xFF,0x3C, 0xC7,0x38, 0x37,0xC0, 0x77,0x39, 0xFF,0xF0, 0xF3,0x02,
-0xFF,0x00, 0xC7,0x38, 0x34,0x00, 0xC5,0x28, 0x70,0x00, 0xF5,0x27, 0x28,0x00, 0x87,0x26,
-0x00,0x00, 0x83,0x16, 0xFF,0x64, 0x84,0x16, 0xFF,0x7C, 0xC7,0x38, 0x37,0xC0, 0x77,0x39,
-0xFF,0xF0, 0xF4,0x82, 0x00,0xFF, 0xC7,0x38, 0x4C,0x00, 0x83,0x16, 0xFF,0x3C, 0xC3,0x9C,
-0x70,0x00, 0xE0,0x00, 0xBE,0xE4, 0xF3,0x9B, 0x28,0x00, 0xF7,0x04, 0x40,0x7C, 0xF6,0x04,
-0x40,0x74, 0xC7,0x38, 0x70,0x00, 0xC7,0x30, 0x70,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA,
-0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x77,0xB4,
-0x00,0x08, 0x70,0x3E, 0xFF,0xE8, 0x47,0x0C, 0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0xBA,0x7D, 0x25,0x80, 0x00,0x07, 0xE0,0x00, 0xBE,0xE4, 0x04,0x20,
-0x00,0x40, 0xE0,0x00, 0xBA,0xD8, 0xC4,0x2C, 0x00,0x00, 0xC7,0x30, 0x42,0x00, 0x84,0x96,
-0x00,0x00, 0x75,0x38, 0xFF,0xFA, 0x06,0x24, 0x00,0x0A, 0x20,0x2E, 0x00,0x07, 0xEE,0x00,
-0xBA,0xD4, 0x07,0x30, 0x00,0x0E, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0xB4,
-0x74,0x00, 0x47,0x29, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0xBA,0x74, 0x06,0x30, 0x00,0x02, 0xE0,0x00, 0xBA,0x8C, 0x05,0xAC,
-0x00,0x01, 0xF4,0x02, 0x00,0x08, 0x07,0x20, 0x00,0x07, 0x20,0x3A, 0x00,0x0E, 0xE2,0x00,
-0xBB,0xA4, 0xC5,0xA0, 0x40,0x00, 0x83,0x16, 0x00,0x00, 0xF5,0x04, 0x40,0x7C, 0xF4,0x82,
-0x00,0xFF, 0xF6,0x04, 0x4F,0x58, 0xC5,0x98, 0x58,0x00, 0x05,0xAC, 0x00,0x26, 0x86,0xAE,
-0x00,0x00, 0x77,0x2D, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0x18, 0x62,0x00, 0x76,0x30,
-0xFF,0xFA, 0x46,0x31, 0x00,0x00, 0xC6,0x30, 0x4C,0x00, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0x77,0x29, 0x00,0x10, 0x77,0x39, 0xFF,0xF8, 0xC6,0xB4, 0x4C,0x00, 0xC7,0x38,
-0x68,0x00, 0xF7,0x2F, 0x28,0x00, 0xF5,0x84, 0x40,0x74, 0xC5,0x28, 0x50,0x00, 0xC5,0xAC,
-0x50,0x00, 0x05,0xAC, 0x00,0x26, 0x86,0xAE, 0x00,0x00, 0x77,0x2D, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0x75,0x2D, 0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0xF7,0x02, 0xFF,0x00, 0xC6,0xB4, 0x74,0x00, 0xC6,0x30, 0x68,0x00, 0xF6,0x2F,
-0x28,0x00, 0x87,0x2E, 0x00,0x00, 0x76,0xA1, 0x00,0x10, 0x76,0xB5, 0xFF,0xF8, 0xC7,0x38,
-0x57,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC7,0x38, 0x4C,0x00, 0xC6,0xB4, 0x70,0x00, 0xE0,0x00,
-0xBB,0xF8, 0xF6,0xAF, 0x28,0x00, 0xF4,0x04, 0x4F,0x58, 0xE0,0x00, 0xBE,0xE4, 0x04,0x20,
-0x00,0x40, 0xF6,0x04, 0x4F,0x58, 0x83,0x16, 0x00,0x00, 0xF7,0x04, 0x40,0x7C, 0xF5,0x84,
-0x40,0x74, 0xC6,0x18, 0x62,0x00, 0x76,0x30, 0xFF,0xFA, 0xC7,0x38, 0x70,0x00, 0xC5,0xAC,
-0x70,0x00, 0x05,0xAC, 0x00,0x26, 0x86,0xAE, 0x00,0x00, 0x77,0x2D, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0x46,0x31, 0x00,0x00, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02,
-0x00,0xFF, 0xC6,0x30, 0x74,0x00, 0xF7,0x02, 0xFF,0x00, 0xC6,0xB4, 0x74,0x00, 0xC6,0x30,
-0x68,0x00, 0xF6,0x2F, 0x28,0x00, 0x23,0x80, 0x00,0x07, 0x20,0x1E, 0x00,0x07, 0xEE,0x00,
-0xBE,0xE0, 0xC7,0x1C, 0x38,0x00, 0x84,0x96, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC7,0x24,
-0x70,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA, 0x00,0x00, 0xF5,0x84, 0x4F,0x58, 0x77,0x39,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02,
-0x00,0xFF, 0xC6,0xB6, 0x74,0x00, 0xE6,0x00, 0xBC,0x79, 0x20,0x36, 0x00,0x01, 0xE6,0x00,
-0xBC,0x79, 0x77,0x35, 0x00,0x06, 0xA6,0xBA, 0x58,0x02, 0xC7,0x38, 0x58,0x00, 0x76,0x39,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC6,0xB4, 0x67,0xC0, 0x76,0xB5, 0xFF,0xF0, 0x20,0x36,
-0x00,0x02, 0xE6,0x00, 0xBC,0x7D, 0xC6,0xB8, 0x00,0x00, 0xC7,0x2C, 0x00,0x00, 0xE0,0x00,
-0xBC,0x7C, 0xC6,0xB8, 0x00,0x00, 0xF6,0x84, 0x4F,0x58, 0xF7,0x04, 0x4F,0x58, 0xC5,0x34,
-0x00,0x00, 0xC0,0x2A, 0x72,0x00, 0xE6,0x00, 0xBE,0xD9, 0x06,0xA8, 0x00,0x1C, 0x83,0x16,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x96,0x93, 0xFF,0xFC, 0xF4,0x86,
-0x3B,0xB4, 0x94,0x93, 0xFF,0xFC, 0x93,0x96, 0xFF,0x4C, 0x95,0x16, 0xFF,0x44, 0x96,0x96,
-0xFF,0x40, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x23,0x40, 0x97,0x93, 0xFF,0xFC, 0xF3,0x04,
-0x4F,0x5C, 0xF4,0x82, 0x00,0x00, 0x94,0x96, 0xFF,0x5C, 0x86,0x96, 0xFF,0x40, 0x83,0x96,
-0xFF,0x4C, 0x85,0x16, 0xFF,0x44, 0x93,0x16, 0xFF,0x34, 0x86,0x1A, 0x00,0x08, 0x96,0x96,
-0xFF,0x3C, 0x87,0x1A, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x32, 0x72,0x00, 0xEC,0x00,
-0xBD,0xB8, 0x96,0x16, 0xFF,0x9C, 0x77,0x31, 0x00,0x01, 0xC7,0x38, 0x60,0x00, 0x77,0x39,
-0x00,0x02, 0xC6,0x38, 0x30,0x00, 0x06,0x30, 0x00,0x0C, 0x86,0xB2, 0x00,0x00, 0x87,0x2A,
-0x00,0x1C, 0x85,0x96, 0xFF,0x5C, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xBD,0x40, 0xC4,0x04,
-0x00,0x00, 0x86,0xB2, 0x00,0x04, 0x87,0x2A, 0x00,0x20, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0xBD,0x44, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E,
-0x00,0x00, 0xE6,0x00, 0xBD,0x51, 0x00,0x00, 0x00,0x01, 0xF4,0x02, 0x00,0x00, 0x83,0x16,
-0xFF,0x3C, 0x86,0xB2, 0x00,0x00, 0x87,0x1A, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0xBD,0x90, 0xF5,0x82, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0xBD,0x98, 0x20,0x2E, 0x00,0x00, 0x86,0xB2, 0x00,0x04, 0x87,0x1A, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0xBD,0x99, 0x20,0x2E, 0x00,0x00, 0xF5,0x82,
-0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0xBD,0xA9, 0x20,0x22, 0x00,0x00, 0xF4,0x02,
-0x00,0x01, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xBD,0xB8, 0x00,0x00, 0x00,0x01, 0xF4,0x82,
-0x00,0x01, 0x94,0x96, 0xFF,0x5C, 0x83,0x16, 0xFF,0x5C, 0x00,0x00, 0x00,0x01, 0x20,0x1A,
-0x00,0x00, 0xE6,0x00, 0xBD,0xF9, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0x9C, 0x84,0x96,
-0xFF,0x34, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4,
-0x48,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xA0, 0xE0,0x00,
-0xBE,0x70, 0x96,0x96, 0xFF,0xA4, 0x27,0x14, 0x00,0x64, 0x97,0x13, 0xFF,0xFC, 0x83,0x16,
-0xFF,0x3C, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x84,0x96, 0xFF,0x34, 0x00,0x00,
-0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0x93,0x96, 0xFF,0x4C, 0x95,0x16, 0xFF,0x44, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0x4C, 0x85,0x16,
-0xFF,0x44, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xBE,0x71, 0xF6,0x02, 0x00,0x00, 0x87,0x16,
-0xFF,0x9C, 0x83,0x16, 0xFF,0x34, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16,
-0xFF,0xA0, 0x96,0x96, 0xFF,0xA4, 0x97,0x1A, 0x00,0x08, 0xF6,0x02, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0xE6,0x00, 0xBE,0x99, 0xF6,0x06, 0x42,0x9C, 0xF7,0x04, 0x42,0x9C, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0xF7,0x04, 0x4F,0x58, 0x00,0x00, 0x00,0x01, 0xC7,0x28,
-0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0x47,0x39, 0x00,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x28,
-0x00,0x1C, 0x97,0x13, 0xFF,0xFC, 0xF4,0x84, 0x4F,0x5C, 0x00,0x00, 0x00,0x01, 0x94,0x93,
-0xFF,0xFC, 0x93,0x96, 0xFF,0x4C, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x23,0x40, 0x97,0x93,
-0xFF,0xFC, 0x83,0x96, 0xFF,0x4C, 0xE0,0x00, 0xBB,0xFC, 0x03,0x9C, 0x00,0x01, 0x84,0x16,
-0x00,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x60, 0x85,0x16, 0x00,0x00, 0x86,0x16, 0x00,0x04, 0x06,0xA8, 0x00,0x18, 0xC7,0x30,
-0x60,0x00, 0xC5,0xB8, 0x68,0x00, 0x20,0x32, 0x00,0x07, 0xEE,0x00, 0xBF,0x64, 0x07,0x2C,
-0x00,0x0E, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0xB4, 0x74,0x00, 0x20,0x36,
-0x00,0x00, 0x47,0x0C, 0x00,0x01, 0xD7,0x00, 0x0A,0x70, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0xBF,0x61, 0x05,0xAC, 0x00,0x02, 0xE0,0x00, 0xBF,0x18, 0x06,0x30, 0x00,0x01, 0x20,0x32,
-0x00,0x07, 0xEE,0x00, 0xC0,0x4C, 0x06,0xA8, 0x00,0x16, 0xF5,0x05, 0x40,0x74, 0xF6,0x05,
-0x40,0x7C, 0xF3,0x02, 0x00,0x06, 0xF3,0x05, 0x42,0x54, 0x96,0x13, 0xFF,0xFC, 0x05,0x28,
-0x00,0x02, 0x95,0x16, 0xFF,0xC4, 0x95,0x13, 0xFF,0xFC, 0x23,0x94, 0x00,0x20, 0x93,0x96,
-0xFF,0xBC, 0x93,0x93, 0xFF,0xFC, 0x96,0x16, 0xFF,0xAC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD0,0xDC, 0x97,0x93, 0xFF,0xFC, 0x84,0x96, 0xFF,0xC4, 0x23,0x14, 0x00,0x38, 0x94,0x93,
-0xFF,0xFC, 0x93,0x16, 0xFF,0xB4, 0x93,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD2,0x58, 0x97,0x93, 0xFF,0xFC, 0x87,0x02, 0xFF,0x34, 0x86,0x16, 0xFF,0xAC, 0xF7,0x05,
-0x42,0x64, 0x96,0x13, 0xFF,0xFC, 0x97,0x13, 0xFF,0xFC, 0x83,0x96, 0xFF,0xB4, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x84,0x96, 0xFF,0xBC, 0x00,0x00, 0x00,0x01, 0x94,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xF7,0xC8, 0x97,0x93, 0xFF,0xFC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0xC0,0x1D, 0xF3,0x06, 0x3A,0xD8, 0xF7,0x04, 0x42,0x54, 0x00,0x00,
-0x00,0x01, 0x27,0x38, 0x00,0x01, 0xF7,0x05, 0x42,0x54, 0xF3,0x05, 0x42,0x44, 0xF3,0x82,
-0x17,0x70, 0x93,0x93, 0xFF,0xFC, 0xF4,0x82, 0x00,0x1B, 0x94,0x93, 0xFF,0xFC, 0xF3,0x06,
-0x42,0x44, 0x93,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1E,0xC0, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0xC1,0xA0, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x00, 0xF5,0x84,
-0x4F,0x58, 0xF4,0x06, 0x3B,0x70, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x76,0x39, 0x00,0x06, 0xA7,0x2E, 0x60,0x02, 0xC5,0x2C,
-0x60,0x00, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x40,0x00, 0x07,0x38, 0x00,0x02, 0x86,0xBA,
-0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB7,
-0xFF,0xF0, 0xEE,0x00, 0xC1,0x15, 0x96,0x96, 0xFF,0x9C, 0xA7,0x2E, 0x60,0x02, 0x76,0xA9,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x83,0x96, 0xFF,0x9C, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x40,0x00, 0x86,0xBA, 0x00,0x04, 0x24,0x94,
-0x00,0x60, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0xA6,0xAA, 0x68,0x02, 0x77,0x1D, 0x00,0x03, 0xC7,0x38, 0x68,0x00, 0x27,0x38,
-0x00,0x08, 0x83,0xBA, 0x00,0x04, 0x83,0x3A, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x93,0xA6,
-0x00,0x04, 0x93,0x26, 0x00,0x00, 0x85,0x96, 0xFF,0xA4, 0xE0,0x00, 0xC1,0x38, 0x23,0x00,
-0x00,0x07, 0xA7,0x2E, 0x60,0x02, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x40,0x00, 0x85,0xBA,
-0x00,0x04, 0x23,0x00, 0x00,0x07, 0x93,0x13, 0xFF,0xFC, 0x87,0x2A, 0x00,0x00, 0x76,0xA9,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x83,0x96, 0xFF,0x9C, 0xF6,0x06, 0x3B,0x70, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xA6,0xBA, 0x60,0x02, 0x20,0x1E,
-0x00,0x00, 0xC7,0x38, 0x60,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0xEE,0x00, 0xC1,0x8D, 0x76,0xB5, 0xFF,0xF0, 0x84,0x96, 0xFF,0xA0, 0x00,0x00,
-0x00,0x01, 0x77,0x25, 0xFF,0xF0, 0xC6,0xB8, 0x68,0x00, 0xC7,0x28, 0x68,0x00, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xC1,0x2C, 0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x70, 0x25,0x00,
-0x00,0x07, 0x20,0x2A, 0x00,0x07, 0xEE,0x00, 0xC3,0xB8, 0xC7,0x28, 0x50,0x00, 0x83,0x16,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC7,0x18, 0x70,0x00, 0x07,0x38, 0x00,0x26, 0x86,0xBA,
-0x00,0x00, 0xF5,0x84, 0x4F,0x58, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0xB6, 0x74,0x00, 0xE6,0x00,
-0xC2,0x3D, 0x20,0x36, 0x00,0x01, 0xE6,0x00, 0xC2,0x3D, 0x77,0x35, 0x00,0x06, 0xA6,0xBA,
-0x58,0x02, 0xC7,0x38, 0x58,0x00, 0x76,0x39, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC6,0xB4,
-0x67,0xC0, 0x76,0xB5, 0xFF,0xF0, 0x20,0x36, 0x00,0x02, 0xE6,0x00, 0xC2,0x4D, 0xC0,0x3A,
-0x5A,0x00, 0xE0,0x00, 0xC2,0x48, 0xC7,0x2C, 0x00,0x00, 0xF7,0x04, 0x4F,0x58, 0xF5,0x84,
-0x4F,0x58, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x5A,0x00, 0xE6,0x00, 0xC3,0xB1, 0xF4,0x86,
-0x3B,0x90, 0x83,0x96, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x06,0x9C, 0x00,0x16, 0x87,0x36,
-0x00,0x00, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0x76,0x39, 0x00,0x06, 0xA7,0x2E, 0x60,0x02, 0xC5,0x2C, 0x60,0x00, 0x76,0xA9,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39,
-0x00,0x03, 0xC7,0x38, 0x48,0x00, 0x07,0x38, 0x00,0x02, 0x86,0xBA, 0x00,0x00, 0x77,0x39,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB7, 0xFF,0xF0, 0xEE,0x00,
-0xC3,0x21, 0x96,0x96, 0xFF,0x8C, 0xA7,0x2E, 0x60,0x02, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x83,0x16, 0xFF,0x8C, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39,
-0x00,0x03, 0xC7,0x38, 0x48,0x00, 0x86,0xBA, 0x00,0x04, 0x24,0x94, 0x00,0x70, 0x77,0x39,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xA6,0xAA,
-0x68,0x02, 0x77,0x19, 0x00,0x03, 0xC7,0x38, 0x68,0x00, 0x27,0x38, 0x00,0x08, 0x83,0xBA,
-0x00,0x04, 0x83,0x3A, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x93,0xA6, 0x00,0x04, 0x93,0x26,
-0x00,0x00, 0x86,0x16, 0xFF,0x94, 0xE0,0x00, 0xC3,0x44, 0x00,0x00, 0x00,0x01, 0xA7,0x2E,
-0x60,0x02, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF3,0x06, 0x3B,0x90, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x30,0x00, 0x86,0x3A,
-0x00,0x04, 0x87,0x2A, 0x00,0x00, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x83,0x96,
-0xFF,0x8C, 0xF4,0x86, 0x3B,0x90, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39,
-0x00,0x03, 0xA6,0xBA, 0x48,0x02, 0x20,0x1E, 0x00,0x00, 0xC7,0x38, 0x48,0x00, 0x77,0x39,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0xEE,0x00, 0xC3,0x95, 0x76,0xB5,
-0xFF,0xF0, 0x83,0x16, 0xFF,0x90, 0x00,0x00, 0x00,0x01, 0x77,0x19, 0xFF,0xF0, 0xC6,0xB8,
-0x68,0x00, 0xC7,0x28, 0x68,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xC1,0x30,
-0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0xC5,0xC4, 0x00,0x00, 0x00,0x01, 0xE0,0x00,
-0xC1,0xC4, 0x05,0x28, 0x00,0x01, 0x83,0x96, 0x00,0x00, 0xF4,0x82, 0x00,0x06, 0xF4,0x85,
-0x42,0x54, 0xF6,0x04, 0x42,0x60, 0x25,0x14, 0x00,0x1E, 0x23,0x14, 0x00,0x20, 0x93,0x16,
-0xFF,0xAC, 0xF3,0x85, 0x40,0x78, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x06,0x30, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC,
-0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14,
-0x00,0x1C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14,
-0x00,0x1A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14,
-0x00,0x18, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14,
-0x00,0x16, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14,
-0x00,0x14, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14,
-0x00,0x12, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x25,0x14, 0x00,0x10, 0x76,0x31, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x07,0x1C,
-0x00,0x02, 0x97,0x13, 0xFF,0xFC, 0x23,0x94, 0x00,0x50, 0x93,0x96, 0xFF,0xA4, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD2,0x58, 0x97,0x93, 0xFF,0xFC, 0x84,0x96,
-0xFF,0xA4, 0x23,0x14, 0x00,0x38, 0x94,0x93, 0xFF,0xFC, 0x27,0x80, 0x00,0x07, 0x97,0x93,
-0xFF,0xFC, 0x93,0x16, 0xFF,0x9C, 0x93,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xCF,0x24, 0x97,0x93, 0xFF,0xFC, 0x87,0x02, 0xFF,0x34, 0x27,0x80, 0x00,0x07, 0xF7,0x85,
-0x42,0x58, 0xF7,0x05, 0x42,0x64, 0x27,0x80, 0x00,0x07, 0x97,0x93, 0xFF,0xFC, 0x97,0x13,
-0xFF,0xFC, 0x83,0x96, 0xFF,0x9C, 0x00,0x00, 0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x84,0x96,
-0xFF,0xAC, 0x00,0x00, 0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xF5,0xF4, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xC5,0x95, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x42,0x58, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x42,0x58, 0xF7,0x04, 0x2D,0x38, 0xF3,0x06, 0x39,0xC0, 0xF3,0x05, 0x42,0x44, 0xF6,0x86,
-0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x82,
-0x00,0x1C, 0x20,0x32, 0x00,0x44, 0xE6,0x00, 0xC5,0xC4, 0xB3,0xBA, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x25,0x00,
-0x00,0x07, 0xF7,0x04, 0x40,0x74, 0xF6,0x84, 0x4F,0x58, 0xF6,0x04, 0x42,0x60, 0xC7,0x38,
-0x6A,0x00, 0x75,0xB8, 0xFF,0xFA, 0x06,0x30, 0x00,0x0A, 0x20,0x2A, 0x00,0x07, 0xEE,0x00,
-0xC6,0x48, 0x07,0x30, 0x00,0x0E, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0xB4,
-0x74,0x00, 0x47,0x2D, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0xC6,0x4C, 0xC3,0x28, 0x00,0x00, 0x06,0x30, 0x00,0x02, 0xE0,0x00,
-0xC5,0xFC, 0x05,0x28, 0x00,0x01, 0xF3,0x02, 0x00,0x08, 0xC5,0x18, 0x30,0x00, 0xF3,0x84,
-0x42,0x60, 0xF6,0x04, 0x4F,0x58, 0xF7,0x04, 0x40,0x7C, 0xF4,0x84, 0x40,0x74, 0xC5,0x1C,
-0x50,0x00, 0x05,0x28, 0x00,0x26, 0x85,0xAA, 0x00,0x00, 0x74,0x29, 0x00,0x1E, 0x74,0x20,
-0xFF,0xE5, 0xC6,0x1C, 0x62,0x00, 0x76,0x30, 0xFF,0xFA, 0xC6,0xB8, 0x70,0x00, 0xC4,0xA4,
-0x68,0x00, 0x04,0xA4, 0x00,0x26, 0x76,0xA5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x77,0x39,
-0x00,0x10, 0x77,0x39, 0xFF,0xF8, 0x46,0x31, 0x00,0x00, 0xC5,0xAC, 0x47,0xC0, 0x75,0xAD,
-0xFF,0xF0, 0xF4,0x02, 0x00,0xFF, 0xC5,0xAC, 0x44,0x00, 0xC7,0x38, 0x58,0x00, 0xF7,0x2B,
-0x28,0x00, 0x87,0x26, 0x00,0x00, 0x75,0xA5, 0x00,0x1E, 0xC6,0x30, 0x44,0x00, 0x75,0xAC,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xF6,0x82, 0xFF,0x00, 0xC7,0x38,
-0x6C,0x00, 0xC6,0x30, 0x70,0x00, 0xF6,0x27, 0x28,0x00, 0x87,0x26, 0x00,0x00, 0x76,0x99,
-0x00,0x10, 0x76,0xB5, 0xFF,0xF8, 0xC7,0x38, 0x5F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC7,0x38,
-0x44,0x00, 0xC6,0xB4, 0x70,0x00, 0xF6,0xA7, 0x28,0x00, 0x93,0x93, 0xFF,0xFC, 0xF3,0x84,
-0x3B,0xB0, 0x00,0x00, 0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD4,0x2C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x04, 0x40,0x7C, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0x97,0x13, 0xFF,0xFC, 0xF3,0x84, 0x40,0x74, 0x00,0x00, 0x00,0x01, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xBE,0xF8, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06,
-0x42,0x30, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x35,0x60, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x42,0x30, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x35,0xEC, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x42,0x44, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x36,0x78, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x06, 0x42,0x44, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x37,0x04, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06,
-0x42,0x44, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x37,0x90, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x42,0x44, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x38,0x1C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x42,0x44, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x38,0xA8, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x06, 0x42,0x44, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x39,0x34, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06,
-0x42,0x44, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x39,0xC0, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x42,0x44, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x3A,0x4C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x42,0x44, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x3A,0xD8, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x85,0x96,
-0x00,0x00, 0xF5,0x06, 0x3B,0x90, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38,
-0x50,0x00, 0x07,0x38, 0x00,0x02, 0x86,0xBA, 0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0x37, 0xFF,0xF0, 0xEE,0x00, 0xC9,0x95, 0x00,0x00,
-0x00,0x01, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x50,0x00, 0x86,0xBA,
-0x00,0x04, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0xA6,0xAE, 0x68,0x02, 0x77,0x31, 0x00,0x03, 0xC7,0x38, 0x68,0x00, 0x27,0x38,
-0x00,0x08, 0x84,0xBA, 0x00,0x04, 0x84,0x3A, 0x00,0x00, 0xE0,0x00, 0xC9,0xB4, 0xC5,0x24,
-0x00,0x00, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x50,0x00, 0x85,0x3A,
-0x00,0x04, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x20,0x32,
-0x00,0x00, 0xF6,0x06, 0x3B,0x90, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39,
-0x00,0x03, 0xA6,0xBA, 0x60,0x02, 0xC7,0x38, 0x60,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0xEE,0x00, 0xC9,0xF9, 0x76,0xB5, 0xFF,0xF0, 0x77,0x21,
-0xFF,0xF0, 0xC6,0xB8, 0x68,0x00, 0xC7,0x2C, 0x68,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xC1,0x28, 0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x85,0x96, 0x00,0x00, 0xF5,0x06, 0x3B,0x70, 0x87,0x2E,
-0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x77,0x39, 0x00,0x03, 0xC7,0x38, 0x50,0x00, 0x07,0x38, 0x00,0x02, 0x86,0xBA,
-0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0x37,
-0xFF,0xF0, 0xEE,0x00, 0xCA,0xBD, 0x00,0x00, 0x00,0x01, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39,
-0x00,0x03, 0xC7,0x38, 0x50,0x00, 0x86,0xBA, 0x00,0x04, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xA6,0xAE, 0x68,0x02, 0x77,0x31,
-0x00,0x03, 0xC7,0x38, 0x68,0x00, 0x27,0x38, 0x00,0x08, 0x84,0xBA, 0x00,0x04, 0x84,0x3A,
-0x00,0x00, 0xE0,0x00, 0xCA,0xDC, 0xC5,0x24, 0x00,0x00, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39,
-0x00,0x03, 0xC7,0x38, 0x50,0x00, 0x85,0x3A, 0x00,0x04, 0x83,0x96, 0x00,0x04, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x20,0x32, 0x00,0x00, 0x93,0x93, 0xFF,0xFC, 0x87,0x2E,
-0x00,0x00, 0xF6,0x06, 0x3B,0x70, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0x39,
-0x00,0x03, 0xA6,0xBA, 0x60,0x02, 0xC7,0x38, 0x60,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0xEE,0x00, 0xCB,0x29, 0x76,0xB5, 0xFF,0xF0, 0x77,0x21,
-0xFF,0xF0, 0xC6,0xB8, 0x68,0x00, 0xC7,0x2C, 0x68,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xC1,0x28, 0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF5,0x04, 0x4F,0x58, 0xF5,0x82, 0x00,0x02, 0x06,0x28,
-0x00,0x80, 0x20,0x2E, 0x00,0x62, 0xEE,0x00, 0xCB,0x90, 0x07,0x30, 0x00,0x40, 0xF0,0x33,
-0x28,0x00, 0xC6,0xB8, 0x52,0x00, 0x76,0xB4, 0xFF,0xFA, 0x06,0x30, 0x00,0x14, 0xF6,0xB3,
-0x28,0x00, 0xC6,0x38, 0x00,0x00, 0xE0,0x00, 0xCB,0x64, 0x05,0xAC, 0x00,0x01, 0xF7,0x04,
-0x4F,0x58, 0x00,0x00, 0x00,0x01, 0x06,0xB8, 0x18,0xD4, 0xF4,0x82, 0x00,0x01, 0xF4,0xB7,
-0x28,0x00, 0x07,0x38, 0x18,0xC0, 0xF0,0x3B, 0x28,0x00, 0xF7,0x06, 0x42,0xC0, 0xF4,0x82,
-0x00,0x02, 0xF4,0xBB, 0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF6,0x84, 0x42,0xC0, 0xF6,0x06, 0x42,0xC0, 0x77,0x31, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0x75,0xB1, 0x00,0x1E, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB4, 0xFF,0xF0, 0xF7,0x04,
-0x4F,0x58, 0x76,0xB5, 0x00,0x06, 0xC4,0x38, 0x68,0x00, 0x87,0x22, 0x00,0x14, 0x76,0xA1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33,
-0x28,0x00, 0xF7,0x04, 0x42,0xC0, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0x20,0x3A, 0x00,0x01, 0xE6,0x00, 0xCC,0x4C, 0xF6,0x06, 0x42,0x90, 0xF7,0x04,
-0x42,0x90, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x04, 0x85,0x16, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x95,0x16, 0xFF,0xF4, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xCD,0x00, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0xF4, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0xCC,0xBC, 0xF5,0x86, 0x42,0xC0, 0xF7,0x04, 0x42,0x90, 0xF6,0x06, 0x42,0x92, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0xCC,0xEC, 0xF7,0x33, 0x28,0x00, 0xF0,0x2B, 0x28,0x00, 0xF6,0x84,
-0x42,0xC0, 0x77,0x2D, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0x06,0x28, 0x00,0x14, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB4, 0xFF,0xF0, 0xF7,0x04, 0x4F,0x58, 0xF6,0xB3, 0x28,0x00, 0xC7,0x28,
-0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0xF7,0x2F, 0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x96, 0x00,0x00, 0xF7,0x04, 0x4F,0x58, 0xF4,0x02,
-0x00,0x00, 0xC6,0xB4, 0x72,0x00, 0x77,0x34, 0xFF,0xFA, 0x27,0x38, 0x00,0x02, 0x20,0x3A,
-0x00,0x61, 0xF7,0x02, 0x00,0x3F, 0xE2,0x00, 0xCD,0x40, 0xC6,0xB4, 0x74,0x00, 0x20,0x36,
-0x00,0x00, 0xE6,0x00, 0xCD,0x40, 0x00,0x00, 0x00,0x01, 0xF4,0x02, 0x00,0x01, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x16, 0x00,0x00, 0x87,0x16,
-0x00,0x08, 0x85,0x96, 0x00,0x04, 0xC5,0x30, 0x70,0x00, 0xC0,0x32, 0x52,0x00, 0xE6,0x00,
-0xCD,0xA1, 0x00,0x00, 0x00,0x01, 0x86,0xB2, 0x00,0x00, 0x77,0x31, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xE8, 0xF6,0xAF, 0x68,0x00, 0x06,0x30,
-0x00,0x01, 0xC0,0x32, 0x52,0x00, 0xE6,0x00, 0xCD,0x78, 0x05,0xAC, 0x00,0x01, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x00,0x00, 0x00,0x00, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x84,0x96,
-0x00,0x00, 0x84,0x16, 0x00,0x04, 0x85,0x96, 0x00,0x08, 0x86,0xA6, 0x00,0x00, 0x77,0x25,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x75,0x35, 0xFF,0xF0, 0x20,0x2A,
-0x00,0x10, 0xE2,0x00, 0xCE,0x0D, 0xF6,0x06, 0x42,0x8E, 0xF5,0x02, 0x00,0x10, 0xF7,0x04,
-0x42,0x8C, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x20,0x2E, 0x00,0x01, 0xE6,0x00,
-0xCE,0x70, 0x20,0x2A, 0x00,0x00, 0xEE,0x00, 0xCE,0x71, 0x07,0x24, 0x00,0x02, 0x25,0x28,
-0x00,0x01, 0xA5,0xBA, 0x50,0x02, 0x86,0x22, 0x00,0x00, 0x76,0xA1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x50,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC5,0xAC,
-0x77,0xC0, 0xC6,0x30, 0x6F,0xC0, 0x76,0x31, 0xFF,0xF0, 0x75,0xAD, 0xFF,0xE8, 0xF6,0x82,
-0x00,0xFF, 0xF7,0x02, 0xF1,0x54, 0x75,0xAD, 0x00,0x02, 0xA7,0x2E, 0x70,0x02, 0xC6,0x30,
-0x6C,0x00, 0xC6,0x30, 0x75,0x80, 0xF6,0x23, 0x28,0x00, 0x24,0x20, 0x00,0x02, 0x25,0xA8,
-0x00,0x01, 0xF3,0x02, 0xF2,0x46, 0x03,0xA4, 0x00,0x02, 0xC4,0xAC, 0x38,0x00, 0x25,0x2C,
-0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xEC,0x00, 0xCF,0x11, 0x00,0x00, 0x00,0x01, 0xE6,0x00,
-0xCE,0xA0, 0xC7,0x1C, 0x50,0x00, 0xE0,0x00, 0xCE,0xB4, 0xF6,0x02, 0x00,0x00, 0xA6,0x9E,
-0x50,0x02, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0x35,
-0xFF,0xE8, 0x86,0xA6, 0x00,0x00, 0x77,0x25, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0x25,0x28,
-0x00,0x02, 0x25,0xAC, 0x00,0x02, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xE8, 0x77,0x31,
-0x00,0x04, 0xC7,0x38, 0x62,0x00, 0x77,0x39, 0x00,0x01, 0xC7,0x38, 0x30,0x00, 0xC6,0xB4,
-0x68,0x00, 0xC6,0xB4, 0x70,0x00, 0x06,0xB4, 0x00,0x0E, 0x87,0x36, 0x00,0x00, 0x24,0xA4,
-0x00,0x02, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0xE0,0x00, 0xCE,0x84, 0x24,0x20, 0x00,0x02, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x16, 0x00,0x08, 0x83,0x16,
-0x00,0x04, 0x83,0x96, 0x00,0x00, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x05,0x9C, 0x00,0x02, 0x74,0x9D, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x74,0x1D,
-0x00,0x1E, 0x06,0x30, 0x00,0x02, 0x75,0x31, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x1F, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0x28, 0xFF,0xE5, 0xC7,0x38,
-0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x05,0xAC, 0x00,0x02, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x87,0x1E, 0x00,0x00, 0x74,0x20,
-0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x1F,
-0x28,0x00, 0x87,0x1E, 0x00,0x00, 0x04,0x9C, 0x00,0x02, 0xC7,0x38, 0x47,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x25,0x38, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xEE,0x00, 0xD0,0xBD, 0x26,0x28,
-0x00,0x01, 0xA7,0x26, 0x60,0x02, 0xC6,0xA4, 0x60,0x00, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC5,0xA4, 0x50,0x00, 0xC5,0x30, 0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xE8, 0xE0,0x00, 0xD0,0x88, 0xF7,0x2F, 0x68,0x00, 0x07,0x1C, 0x00,0x02, 0xF3,0x3B,
-0x68,0x00, 0xC4,0x1C, 0x00,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x86,0x16, 0x00,0x04, 0x84,0x16, 0x00,0x00, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x05,0xA0, 0x00,0x02, 0x74,0xA1, 0x00,0x1E, 0x74,0xA4,
-0xFF,0xE5, 0x06,0x30, 0x00,0x02, 0x75,0x31, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0x28, 0xFF,0xE5, 0xC7,0x38,
-0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x06,0xA0, 0x00,0x02, 0x76,0x31, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2F, 0x28,0x00, 0x87,0x22,
-0x00,0x00, 0x76,0x21, 0x00,0x1E, 0x85,0x96, 0x00,0x08, 0xC7,0x38, 0x4F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0xC6,0xB4, 0x70,0x00, 0xF5,0xB7, 0x68,0x00, 0x87,0x22, 0x00,0x00, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x23,
-0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x20, 0x27,0x14, 0x00,0x20, 0xF0,0x3B, 0x28,0x00, 0x84,0x96, 0x00,0x04, 0xF5,0x02,
-0x00,0x00, 0x86,0xA6, 0x00,0x00, 0x76,0x25, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x04,0x24,
-0x00,0x02, 0xC6,0xB4, 0x67,0xC0, 0x76,0xB4, 0xFF,0xF0, 0xF6,0xBB, 0x28,0x00, 0x87,0x26,
-0x00,0x00, 0x76,0xA5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0xC0,0x2A, 0x72,0x00, 0xEC,0x00, 0xD2,0xF8, 0x76,0xA5, 0x00,0x1E, 0x87,0x26,
-0x00,0x00, 0x76,0xB4, 0xFF,0xE5, 0x06,0x28, 0x00,0x01, 0x25,0x94, 0x00,0x1E, 0xC5,0xAC,
-0x50,0x00, 0xC5,0x30, 0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC7,0x38,
-0x52,0x00, 0xA6,0xA2, 0x70,0x02, 0xC7,0x20, 0x70,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xE8, 0xC6,0x80, 0x6A,0x00, 0xE0,0x00,
-0xD2,0x90, 0xF6,0xAF, 0x68,0x00, 0x87,0x16, 0xFF,0xE0, 0x76,0x15, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0x83,0x96, 0x00,0x00, 0x23,0x14, 0x00,0x1E, 0x75,0x99, 0x00,0x1E, 0x75,0xAC,
-0xFF,0xE5, 0x75,0x15, 0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0x74,0x95, 0x00,0x1E, 0x74,0xA4,
-0xFF,0xE5, 0x74,0x15, 0x00,0x1E, 0x74,0x20, 0xFF,0xE5, 0x06,0x9C, 0x00,0x02, 0x73,0x95,
-0x00,0x1E, 0x93,0x96, 0xFF,0xDC, 0xC7,0x38, 0x67,0xC0, 0x83,0x96, 0x00,0x00, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x1F, 0x28,0x00, 0x83,0x96, 0xFF,0xDC, 0x87,0x1A, 0x00,0x00, 0x73,0x9C,
-0xFF,0xE5, 0x93,0x96, 0xFF,0xDC, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xE4, 0x23,0x14, 0x00,0x1A, 0x76,0x19,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xE8, 0x23,0x14,
-0x00,0x16, 0x76,0x19, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16,
-0xFF,0xEC, 0x23,0x14, 0x00,0x12, 0x76,0x19, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x47,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4,
-0x00,0x02, 0x84,0x16, 0x00,0x00, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x16, 0xFF,0xF0, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x3F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x86,0x16, 0x00,0x00, 0x84,0x16, 0x00,0x04, 0xF6,0x84, 0x4F,0x58, 0x87,0x32,
-0x00,0x14, 0x03,0x30, 0x00,0x14, 0x75,0x19, 0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0xC3,0xA0,
-0x6A,0x00, 0x73,0x9C, 0xFF,0xFA, 0x04,0xA0, 0x00,0x14, 0x75,0xA5, 0x00,0x1E, 0xC6,0x30,
-0x6A,0x00, 0x76,0x30, 0xFF,0xFA, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0xF3,0x9B, 0x28,0x00, 0x07,0x20, 0x00,0x16, 0xF6,0x3B, 0x28,0x00, 0x87,0x22,
-0x00,0x14, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x77,0x39,
-0x00,0x06, 0xC6,0xB4, 0x70,0x00, 0x06,0xB4, 0x00,0x16, 0xF3,0xB7, 0x28,0x00, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x16, 0x00,0x00, 0xF5,0x84,
-0x4F,0x58, 0x05,0x30, 0x00,0x16, 0x87,0x2A, 0x00,0x00, 0x76,0xA9, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x77,0x39, 0x00,0x06, 0xC4,0x2C,
-0x70,0x00, 0xC0,0x22, 0x62,0x00, 0xE6,0x00, 0xD5,0x29, 0x06,0xA0, 0x00,0x16, 0x87,0x36,
-0x00,0x00, 0xC6,0x30, 0x5A,0x00, 0x76,0x30, 0xFF,0xFA, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x77,0x39, 0x00,0x06, 0x76,0xB8,
-0xFF,0xFA, 0xF6,0xAB, 0x28,0x00, 0xC7,0x2C, 0x70,0x00, 0x07,0x38, 0x00,0x14, 0xE0,0x00,
-0xD5,0x2C, 0xF6,0x3B, 0x28,0x00, 0xC4,0x2C, 0x00,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x4F,0x84, 0x47,0x38, 0xFF,0xFC, 0xF7,0x05,
-0x6F,0x30, 0xF6,0x86, 0x50,0x5C, 0x46,0xB4, 0xFF,0xFC, 0xF6,0x85, 0x6E,0x50, 0xF7,0x06,
-0x6E,0x7C, 0x47,0x38, 0xFF,0xFC, 0xF7,0x05, 0x6E,0x54, 0x07,0x34, 0x19,0x1C, 0xF7,0x05,
-0x4F,0x5C, 0xF7,0x02, 0x00,0x64, 0x97,0x36, 0x19,0x1C, 0xF7,0x02, 0x00,0x00, 0x97,0x36,
-0x19,0x20, 0x06,0xB4, 0x00,0x1C, 0xF6,0x85, 0x4F,0x58, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x90, 0xF3,0x02, 0xFF,0xFF, 0xF3,0x05,
-0x4F,0x54, 0xF3,0x82, 0x00,0x00, 0x93,0x96, 0xFF,0xAC, 0x23,0x14, 0x00,0x20, 0x93,0x16,
-0xFF,0x9C, 0x23,0x94, 0x00,0x38, 0x93,0x96, 0xFF,0x94, 0x83,0x16, 0xFF,0xAC, 0xF7,0x04,
-0x4F,0x5C, 0xF3,0x82, 0x00,0x0C, 0x93,0x96, 0xFF,0x74, 0x93,0x16, 0xFF,0x8C, 0x87,0x3A,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x97,0x16, 0xFF,0xA4, 0x83,0x16, 0xFF,0xAC, 0x83,0x96,
-0xFF,0xA4, 0x00,0x00, 0x00,0x01, 0xC0,0x1A, 0x3A,0x00, 0xEC,0x00, 0xDB,0x78, 0xF3,0x02,
-0x04,0xBC, 0xF7,0x04, 0x4F,0x5C, 0x83,0x16, 0xFF,0x74, 0x00,0x00, 0x00,0x01, 0xC7,0x38,
-0x30,0x00, 0x87,0x3A, 0x00,0x08, 0xF6,0x84, 0x4F,0x58, 0x77,0x39, 0x00,0x06, 0xC4,0xB4,
-0x70,0x00, 0x94,0x93, 0xFF,0xFC, 0x94,0x96, 0xFF,0x7C, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xCD,0x00, 0x97,0x93, 0xFF,0xFC, 0x84,0x96, 0xFF,0x7C, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0xD6,0x54, 0xC5,0x04, 0x00,0x00, 0xF7,0x04, 0x42,0x88, 0xE0,0x00, 0xD8,0x7C, 0xF6,0x06,
-0x42,0x88, 0xF6,0x04, 0x4F,0x5C, 0x83,0x96, 0x00,0x00, 0x83,0x16, 0xFF,0x74, 0x86,0x9E,
-0x00,0x00, 0xA7,0x32, 0x30,0x02, 0xF5,0x82, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0xD6,0x94, 0xC6,0x30, 0x30,0x00, 0x86,0x9E, 0x00,0x04, 0x87,0x32, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xD6,0x98, 0x20,0x2E, 0x00,0x00, 0xF5,0x82,
-0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0xD6,0xA5, 0x00,0x00, 0x00,0x01, 0xF5,0x02,
-0x00,0x00, 0x83,0x96, 0x00,0x00, 0x87,0x32, 0x00,0x00, 0x86,0x9E, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0xD6,0xE4, 0xF5,0x82, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0xE6,0x00, 0xD6,0xEC, 0x20,0x2E, 0x00,0x00, 0x86,0x9E, 0x00,0x04, 0x87,0x32,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0xD6,0xED, 0x20,0x2E,
-0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0xD6,0xFD, 0x20,0x2A,
-0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00, 0xD7,0x28, 0x04,0xA4,
-0x00,0x02, 0x83,0x16, 0xFF,0xAC, 0xF7,0x06, 0x42,0xC8, 0x83,0x96, 0xFF,0x8C, 0xF3,0x05,
-0x4F,0x54, 0xC7,0x1C, 0x70,0x00, 0xF0,0x3B, 0x28,0x00, 0x07,0x38, 0x00,0x02, 0xE0,0x00,
-0xDB,0x50, 0xF0,0x3B, 0x28,0x00, 0x94,0x96, 0xFF,0x6C, 0x87,0x26, 0x00,0x00, 0x76,0xA5,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x83,0x16, 0xFF,0x6C, 0x83,0x96, 0xFF,0x9C, 0x24,0x94,
-0x00,0x1E, 0x06,0x18, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1F, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0x1D,
-0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x1C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x1A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x18, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x16, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x14, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x24,0x94, 0x00,0x12, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x24,0x94, 0x00,0x10, 0x76,0x31,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x87,0x16, 0xFF,0xE0, 0xF6,0x82, 0xFF,0xFC, 0xC7,0x38, 0x57,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x07,0x38, 0x00,0x03, 0xC4,0xB8, 0x6C,0x00, 0x20,0x26, 0x00,0x10, 0xE2,0x00,
-0xD8,0x9D, 0xF6,0x06, 0x42,0x8A, 0xF7,0x04, 0x42,0x88, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xF4,0x02, 0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0xDB,0xA0, 0xF7,0x33, 0x28,0x00, 0x83,0x16, 0xFF,0x6C, 0x25,0x14,
-0x00,0x36, 0x83,0x96, 0xFF,0x94, 0x87,0x1A, 0x00,0x00, 0x76,0x99, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x06,0x18, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x1F, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38,
-0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x34, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x32, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x30, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x2E, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x2C, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x2A, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x28, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x26,0xA4, 0x00,0x02, 0x74,0xA4, 0xFF,0xFF, 0x76,0x31,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B,
-0x28,0x00, 0x90,0x13, 0xFF,0xFC, 0x83,0x16, 0xFF,0x8C, 0xF7,0x06, 0x42,0xCC, 0xC7,0x18,
-0x70,0x00, 0xC7,0x38, 0x68,0x00, 0x97,0x13, 0xFF,0xFC, 0x93,0x93, 0xFF,0xFC, 0x94,0x96,
-0xFF,0x7C, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0xB8, 0x97,0x93, 0xFF,0xFC, 0x83,0x96,
-0xFF,0x6C, 0x24,0x14, 0x00,0x4E, 0x25,0x14, 0x00,0x50, 0x83,0x16, 0xFF,0x8C, 0x84,0x96,
-0xFF,0x7C, 0x87,0x1E, 0x00,0x00, 0x76,0x9D, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x06,0x1C,
-0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0x29, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x4C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x4A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x48, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x46, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x44, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x42, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x24,0x14, 0x00,0x40, 0x76,0x31, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x86,0x96,
-0xFF,0xB0, 0xF6,0x06, 0x42,0xC8, 0xC6,0x18, 0x60,0x00, 0xF7,0x02, 0x00,0x03, 0xC6,0xB4,
-0x57,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xC6,0xB4, 0x74,0x00, 0xF7,0x02, 0x00,0x04, 0xC7,0x38,
-0x6A,0x00, 0xF7,0x33, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0xF4,0xB3, 0x28,0x00, 0x83,0x96,
-0xFF,0x8C, 0x83,0x16, 0xFF,0x74, 0x03,0x9C, 0x00,0x14, 0x93,0x96, 0xFF,0x8C, 0x03,0x18,
-0x00,0x0C, 0x83,0x96, 0xFF,0xAC, 0x93,0x16, 0xFF,0x74, 0x03,0x9C, 0x00,0x01, 0xE0,0x00,
-0xD5,0xEC, 0x93,0x96, 0xFF,0xAC, 0x93,0x13, 0xFF,0xFC, 0xF3,0x84, 0x4F,0x5C, 0x00,0x00,
-0x00,0x01, 0x93,0x93, 0xFF,0xFC, 0xF3,0x06, 0x4A,0x98, 0x93,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93, 0xFF,0xFC, 0xF4,0x02, 0x00,0x01, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x01,0xA0, 0xF5,0x02,
-0x00,0x00, 0xF3,0x84, 0x6E,0x50, 0xF6,0x02, 0x00,0x1C, 0x20,0x2A, 0x00,0x63, 0xEE,0x00,
-0xDC,0x08, 0xC5,0x9C, 0x60,0x00, 0xA6,0x9E, 0x60,0x02, 0x77,0x2D, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0x20,0x36, 0x00,0x03, 0xE6,0x00,
-0xDB,0xFC, 0x07,0x2C, 0x00,0x36, 0xF0,0x3B, 0x28,0x00, 0x06,0x30, 0x00,0x40, 0xE0,0x00,
-0xDB,0xCC, 0x05,0x28, 0x00,0x01, 0xF5,0x84, 0x4F,0x5C, 0x00,0x00, 0x00,0x01, 0x86,0xAE,
-0x00,0x08, 0xF4,0x02, 0x00,0x00, 0x87,0x2E, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xEC,0x00, 0xDC,0xF0, 0x96,0x96, 0xFF,0xEC, 0x77,0x35, 0x00,0x01, 0xC7,0x38,
-0x68,0x00, 0x77,0x39, 0x00,0x02, 0xC6,0x38, 0x58,0x00, 0x06,0x30, 0x00,0x0C, 0xC3,0x84,
-0x00,0x00, 0x83,0x16, 0x00,0x00, 0x86,0xB2, 0x00,0x00, 0x87,0x1A, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xDC,0x7C, 0xC5,0x20, 0x00,0x00, 0x86,0xB2,
-0x00,0x04, 0x87,0x1A, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0xDC,0x80, 0x20,0x2A, 0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00,
-0xDC,0x8D, 0x00,0x00, 0x00,0x01, 0xF3,0x82, 0x00,0x00, 0x84,0x96, 0x00,0x00, 0x86,0xB2,
-0x00,0x00, 0x87,0x26, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0xDC,0xCC, 0xF5,0x02, 0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xDC,0xD4, 0x20,0x2A,
-0x00,0x00, 0x86,0xB2, 0x00,0x04, 0x87,0x26, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x00, 0xDC,0xD5, 0x20,0x2A, 0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A,
-0x00,0x00, 0xE6,0x00, 0xDC,0xE5, 0x20,0x1E, 0x00,0x00, 0xF3,0x82, 0x00,0x01, 0x20,0x1E,
-0x00,0x00, 0xE6,0x00, 0xDC,0xF4, 0x20,0x22, 0x00,0x00, 0xF4,0x02, 0x00,0x01, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0xDD,0x29, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xEC, 0x00,0x00,
-0x00,0x01, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4,
-0x58,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xF0, 0xE0,0x00,
-0xDD,0x98, 0x96,0x96, 0xFF,0xF4, 0x27,0x14, 0x00,0x14, 0x97,0x13, 0xFF,0xFC, 0x83,0x16,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x95,0x93, 0xFF,0xFC, 0x95,0x96,
-0xFE,0x70, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x85,0x96,
-0xFE,0x70, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xDD,0x95, 0xF6,0x02, 0x00,0x01, 0x87,0x16,
-0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x58,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16,
-0xFF,0xF0, 0x96,0x96, 0xFF,0xF4, 0x97,0x2E, 0x00,0x08, 0xE0,0x00, 0xDD,0x9C, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0xDD,0xB0, 0xF4,0x82,
-0x00,0x00, 0xF7,0x04, 0x42,0x7C, 0xE0,0x00, 0xE0,0x9C, 0xF6,0x06, 0x42,0x7E, 0x94,0x96,
-0xFF,0x44, 0x87,0x16, 0xFF,0xF4, 0xF6,0x04, 0x4F,0x58, 0x77,0x39, 0x00,0x06, 0xC7,0x30,
-0x70,0x00, 0x97,0x16, 0xFF,0x54, 0x06,0xB8, 0x00,0x1A, 0x87,0x36, 0x00,0x00, 0x83,0x16,
-0xFF,0x54, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x93,0x13,
-0xFF,0xFC, 0x77,0x38, 0xFF,0xF0, 0x77,0x39, 0x00,0x06, 0xC6,0x30, 0x70,0x00, 0x96,0x16,
-0xFF,0x4C, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0x00, 0x97,0x93, 0xFF,0xFC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0xDE,0x35, 0xF3,0x02, 0x00,0x01, 0x84,0x96, 0xFF,0x4C, 0x00,0x00,
-0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0x00, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xDE,0x38, 0x00,0x00, 0x00,0x01, 0xF3,0x02,
-0x00,0x01, 0x93,0x16, 0xFF,0x44, 0x84,0x96, 0xFF,0x44, 0x00,0x00, 0x00,0x01, 0x20,0x26,
-0x00,0x00, 0xE6,0x00, 0xDE,0x59, 0xF6,0x06, 0x42,0xA4, 0xF7,0x04, 0x42,0xA4, 0xE0,0x00,
-0xE0,0xA0, 0x76,0xB1, 0x00,0x1E, 0x83,0x16, 0xFF,0x4C, 0x86,0x16, 0xFF,0x4C, 0x87,0x1A,
-0x00,0x00, 0x76,0x99, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x20,0x3A, 0x00,0x02, 0xE6,0x00, 0xDE,0x85, 0x00,0x00, 0x00,0x01, 0xF6,0x04,
-0x4F,0x58, 0xF5,0x84, 0x4F,0x58, 0x00,0x00, 0x00,0x01, 0xC0,0x32, 0x5A,0x00, 0xE6,0x00,
-0xE0,0x25, 0x00,0x00, 0x00,0x01, 0x84,0x96, 0xFF,0x4C, 0x00,0x00, 0x00,0x01, 0x06,0xA4,
-0x00,0x1A, 0x87,0x36, 0x00,0x00, 0x83,0x16, 0xFF,0x54, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x77,0x39, 0x00,0x06, 0xC7,0x2C,
-0x70,0x00, 0xC0,0x3A, 0x32,0x00, 0xE6,0x00, 0xDE,0xDD, 0xF6,0x06, 0x42,0x80, 0xF7,0x04,
-0x42,0x80, 0xE0,0x00, 0xE0,0xA0, 0x76,0xB1, 0x00,0x1E, 0x26,0x14, 0x00,0x30, 0xF0,0x33,
-0x28,0x00, 0x87,0x16, 0xFF,0xD0, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x84,0x96,
-0xFF,0x4C, 0x23,0x14, 0x00,0x2E, 0x93,0x16, 0xFE,0x64, 0x75,0x99, 0x00,0x1E, 0x75,0xAC,
-0xFF,0xE5, 0x75,0x15, 0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0x73,0x15, 0x00,0x1E, 0x73,0x18,
-0xFF,0xE5, 0x93,0x16, 0xFF,0x34, 0x83,0x16, 0xFE,0x64, 0x04,0x24, 0x00,0x02, 0x06,0xA0,
-0x00,0x02, 0x74,0x95, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFF,0x3C, 0x74,0x95,
-0x00,0x1E, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFF,0x2C, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xD4, 0x24,0x94,
-0x00,0x2A, 0x94,0x96, 0xFE,0x64, 0x76,0x25, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x26, 0x00,0x00, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xD8, 0x23,0x14, 0x00,0x26, 0x93,0x16, 0xFE,0x64, 0x76,0x19,
-0x00,0x1E, 0x84,0x96, 0xFF,0x3C, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x84,0x96,
-0xFF,0x34, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0xDC, 0x23,0x14, 0x00,0x22, 0x93,0x16, 0xFE,0x64, 0x76,0x19,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x16, 0xFF,0xE0, 0x83,0x16, 0xFF,0x2C, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x37,0xC0, 0x77,0x38, 0xFF,0xF0, 0xE0,0x00, 0xEA,0xA0, 0xF7,0x37,
-0x28,0x00, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCB,0xCC, 0x97,0x93, 0xFF,0xFC, 0x06,0xA0,
-0x00,0x02, 0xF7,0x04, 0x4F,0x58, 0xF0,0x37, 0x28,0x00, 0x06,0xA0, 0x00,0x14, 0x94,0x16,
-0xFF,0x24, 0xC7,0x20, 0x72,0x00, 0x77,0x38, 0xFF,0xFA, 0xF7,0x37, 0x28,0x00, 0x06,0xA0,
-0x00,0x16, 0xF7,0x37, 0x28,0x00, 0xF4,0x82, 0x00,0x01, 0xF4,0xA3, 0x28,0x00, 0x94,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0x00, 0x97,0x93, 0xFF,0xFC, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0xE0,0xBC, 0x26,0x94, 0x00,0x48, 0xF7,0x04, 0x42,0x80, 0xE0,0x00,
-0xE0,0x9C, 0xF6,0x06, 0x42,0x82, 0x86,0x96, 0xFE,0xF4, 0xE0,0x00, 0xE2,0x94, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x42,0x84, 0xF6,0x06, 0x42,0x84, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xF4,0x02, 0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0xEA,0xA4, 0xF7,0x33, 0x28,0x00, 0x83,0x16, 0xFF,0x4C, 0x75,0x15,
-0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0x93,0x16, 0xFF,0x1C, 0x07,0x18, 0x00,0x36, 0xF4,0x82,
-0x00,0x01, 0xF4,0xBB, 0x28,0x00, 0xF0,0x37, 0x28,0x00, 0x87,0x16, 0xFF,0xB8, 0x76,0xB5,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x04,0x18, 0x00,0x02, 0x06,0x20, 0x00,0x02, 0x23,0x14,
-0x00,0x46, 0x93,0x16, 0xFF,0x14, 0x75,0x99, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0x74,0x95,
-0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFF,0x0C, 0x73,0x15, 0x00,0x1E, 0x73,0x18,
-0xFF,0xE5, 0x93,0x16, 0xFF,0x04, 0x74,0x95, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96,
-0xFE,0xFC, 0x23,0x00, 0x00,0x07, 0x93,0x16, 0xFE,0xF4, 0x84,0x96, 0xFF,0x1C, 0x83,0x16,
-0xFF,0x14, 0x04,0xA4, 0x00,0x0A, 0x94,0x96, 0xFE,0x7C, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0xF6,0x84, 0x4F,0x58, 0x84,0x96, 0xFF,0x54, 0x87,0x1A,
-0x00,0x00, 0xC6,0xA4, 0x6A,0x00, 0x74,0x34, 0xFF,0xFA, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x16, 0xFF,0xBC, 0x23,0x14,
-0x00,0x42, 0x93,0x16, 0xFF,0x14, 0x76,0x99, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0x30,
-0x00,0x02, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x06,0x30,
-0x00,0x02, 0x87,0x16, 0xFF,0xC0, 0x24,0x94, 0x00,0x3E, 0x94,0x96, 0xFF,0x14, 0x76,0xA5,
-0x00,0x1E, 0x83,0x16, 0xFF,0x0C, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x37,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x87,0x26, 0x00,0x00, 0x06,0x30, 0x00,0x02, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x16,
-0xFF,0xC4, 0x24,0x94, 0x00,0x3A, 0x94,0x96, 0xFF,0x14, 0x76,0xA5, 0x00,0x1E, 0x83,0x16,
-0xFF,0x04, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x37,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33,
-0x28,0x00, 0x87,0x26, 0x00,0x00, 0x06,0x30, 0x00,0x02, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x87,0x16, 0xFF,0xC8, 0x84,0x96, 0xFE,0xFC, 0x06,0x30,
-0x00,0x02, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x83,0x16,
-0xFE,0xF4, 0x00,0x00, 0x00,0x01, 0x20,0x1A, 0x00,0x07, 0xEE,0x00, 0xE2,0x94, 0xF6,0x82,
-0x00,0x08, 0x84,0x96, 0xFE,0x7C, 0x00,0x00, 0x00,0x01, 0x07,0x24, 0x00,0x0E, 0x86,0xBA,
-0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0xF7,0x02, 0x00,0xFF, 0xC6,0xB4, 0x74,0x00, 0x47,0x21, 0x00,0x00, 0xC0,0x36,
-0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0xE0,0x88, 0x04,0xA4,
-0x00,0x02, 0x94,0x96, 0xFE,0x7C, 0x03,0x18, 0x00,0x01, 0xE0,0x00, 0xE2,0x30, 0x93,0x16,
-0xFE,0xF4, 0x83,0x16, 0xFF,0x1C, 0x00,0x00, 0x00,0x01, 0x07,0x18, 0x00,0x38, 0xF6,0xBB,
-0x28,0x00, 0x93,0x13, 0xFF,0xFC, 0x84,0x96, 0xFF,0x24, 0x00,0x00, 0x00,0x01, 0x94,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD4,0x2C, 0x97,0x93, 0xFF,0xFC, 0x23,0x14,
-0x00,0x78, 0x93,0x16, 0xFE,0xBC, 0x84,0x96, 0x00,0x00, 0x23,0x14, 0x00,0xA8, 0x86,0xA6,
-0x00,0x04, 0x87,0x26, 0x00,0x00, 0x93,0x16, 0xFE,0x9C, 0xC6,0xB4, 0x70,0x00, 0x96,0x96,
-0xFE,0xEC, 0xF7,0x02, 0x00,0x01, 0xC7,0x34, 0x74,0x00, 0x97,0x16, 0xFE,0xE4, 0x84,0x96,
-0xFF,0x24, 0x00,0x00, 0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD4,0xB4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x04, 0x4F,0x58, 0x00,0x00, 0x00,0x01, 0xC0,0x22,
-0x72,0x00, 0xE6,0x00, 0xEA,0xA1, 0x94,0x16, 0xFF,0x1C, 0x86,0xA2, 0x00,0x38, 0x77,0x21,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xF3,0x02, 0x00,0x00, 0x93,0x16, 0xFE,0xD4, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0x96,0x96, 0xFE,0xDC, 0x84,0x96, 0xFE,0xD4, 0x00,0x00,
-0x00,0x01, 0x20,0x26, 0x00,0x0E, 0xEE,0x00, 0xE2,0xF0, 0xF3,0x02, 0x00,0x0F, 0x93,0x13,
-0xFF,0xFC, 0x83,0x16, 0xFE,0xEC, 0x00,0x00, 0x00,0x01, 0xC7,0x18, 0x48,0x00, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x27,0xE8, 0x97,0x93, 0xFF,0xFC, 0xC3,0xA0,
-0x00,0x00, 0x84,0x96, 0xFE,0xE4, 0x00,0x00, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00,
-0xE3,0x8D, 0x23,0x9C, 0x00,0x07, 0xC3,0x80, 0x3A,0x00, 0xC7,0x1C, 0x38,0x00, 0x83,0x16,
-0xFF,0x1C, 0xF4,0x82, 0x00,0xFF, 0xF6,0x04, 0x4F,0x58, 0xC7,0x18, 0x70,0x00, 0x07,0x38,
-0x00,0x26, 0x86,0xBA, 0x00,0x00, 0x97,0x16, 0xFE,0xC4, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xC6,0xB4, 0x4C,0x00, 0x76,0xB5,
-0x00,0x06, 0xC3,0x30, 0x68,0x00, 0x07,0x30, 0x00,0x40, 0xC0,0x1A, 0x72,0x00, 0xE6,0x00,
-0xE4,0x0D, 0x93,0x16, 0xFE,0xCC, 0x93,0x13, 0xFF,0xFC, 0x93,0x96, 0xFE,0x74, 0x96,0x16,
-0xFE,0x6C, 0x96,0x96, 0xFE,0x68, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0x00, 0x97,0x93,
-0xFF,0xFC, 0x83,0x96, 0xFE,0x74, 0x86,0x16, 0xFE,0x6C, 0x86,0x96, 0xFE,0x68, 0x20,0x22,
-0x00,0x00, 0xE6,0x00, 0xE0,0x95, 0x00,0x00, 0x00,0x01, 0xF5,0x84, 0x4F,0x58, 0x84,0x96,
-0xFE,0xCC, 0x07,0x2C, 0x00,0x40, 0xC0,0x26, 0x72,0x00, 0xE6,0x00, 0xEA,0x8D, 0x00,0x00,
-0x00,0x01, 0xA7,0x32, 0x68,0x02, 0x76,0xA5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x86,0x16,
-0xFE,0xCC, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x20,0x3A, 0x00,0x02, 0xE6,0x00,
-0xE4,0x51, 0xC0,0x32, 0x5A,0x00, 0xC6,0x2C, 0x00,0x00, 0xC0,0x32, 0x5A,0x00, 0xE6,0x00,
-0xE6,0xE5, 0x25,0x14, 0x00,0x76, 0x83,0x16, 0xFF,0x1C, 0x84,0x96, 0xFE,0xBC, 0x06,0x18,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x83,0x16,
-0xFE,0xDC, 0x06,0x30, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38,
-0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x74, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x72, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x70, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x6E, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x6C, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x6A, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x25,0x14, 0x00,0x68, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0xC7,0x1C, 0x32,0x00, 0x97,0x13,
-0xFF,0xFC, 0x94,0x93, 0xFF,0xFC, 0x26,0x14, 0x00,0x60, 0x96,0x13, 0xFF,0xFC, 0x96,0x16,
-0xFE,0x6C, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93, 0xFF,0xFC, 0x87,0x16,
-0xFF,0xA0, 0x86,0x16, 0xFE,0x6C, 0x84,0x96, 0xFE,0xCC, 0x23,0x14, 0x00,0x5E, 0x93,0x16,
-0xFE,0x5C, 0x75,0x99, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0x74,0x15, 0x00,0x1E, 0x74,0x20,
-0xFF,0xE5, 0x73,0x15, 0x00,0x1E, 0x73,0x18, 0xFF,0xE5, 0x93,0x16, 0xFE,0xAC, 0x83,0x16,
-0xFE,0x5C, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x05,0x24, 0x00,0x02, 0x06,0xA8,
-0x00,0x02, 0x74,0x95, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFE,0xB4, 0x74,0x95,
-0x00,0x1E, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x87,0x1A,
-0x00,0x00, 0x74,0xA4, 0xFF,0xE5, 0x94,0x96, 0xFE,0xA4, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xA4, 0x24,0x94,
-0x00,0x5A, 0x94,0x96, 0xFE,0x5C, 0x76,0x25, 0x00,0x1E, 0x83,0x16, 0xFE,0xB4, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x37,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x26,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16, 0xFF,0xA8, 0x24,0x94, 0x00,0x56, 0x94,0x96,
-0xFE,0x5C, 0x76,0x25, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x47,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x26, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16,
-0xFF,0xAC, 0x23,0x14, 0x00,0x52, 0x93,0x16, 0xFE,0x5C, 0x76,0x19, 0x00,0x1E, 0x84,0x96,
-0xFE,0xAC, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1A, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x16, 0xFF,0xB0, 0x83,0x16, 0xFE,0xA4, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x37,0xC0, 0x77,0x38, 0xFF,0xF0, 0xE0,0x00, 0xEA,0x8C, 0xF7,0x37,
-0x28,0x00, 0x84,0x96, 0xFE,0xCC, 0x00,0x00, 0x00,0x01, 0x04,0xA4, 0x00,0x36, 0x94,0x96,
-0xFE,0x5C, 0x87,0x26, 0x00,0x00, 0x76,0xA5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x20,0x3A, 0x00,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0xEA,0x8D, 0x00,0x00, 0x00,0x01, 0x83,0x16, 0xFE,0xCC, 0x84,0x96,
-0xFF,0x1C, 0x06,0x18, 0x00,0x3A, 0x85,0xB2, 0x00,0x00, 0x07,0x24, 0x00,0x3A, 0x86,0xBA,
-0x00,0x00, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC5,0xAC, 0x67,0xC0, 0xC6,0xB4, 0x77,0xC0, 0x75,0xAD, 0xFF,0xF0, 0x76,0xB5,
-0xFF,0xF0, 0xC0,0x2E, 0x6A,0x00, 0xEC,0x00, 0xE7,0x64, 0xF5,0x02, 0x00,0x02, 0xF5,0x02,
-0x00,0x01, 0x83,0x16, 0xFF,0x1C, 0x00,0x00, 0x00,0x01, 0x07,0x18, 0x00,0x36, 0x86,0xBA,
-0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0x20,0x36, 0x00,0x02, 0xE6,0x00, 0xE7,0x9C, 0x00,0x00, 0x00,0x01, 0x20,0x2A,
-0x00,0x01, 0xE6,0x00, 0xEA,0x8D, 0x00,0x00, 0x00,0x01, 0x84,0x96, 0xFE,0x5C, 0x83,0x16,
-0xFF,0x1C, 0xF5,0x27, 0x28,0x00, 0x06,0x18, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x25,0x14, 0x00,0xA6, 0x84,0x96, 0xFE,0x9C, 0x83,0x16,
-0xFE,0xDC, 0x06,0x30, 0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38,
-0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0xA4, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0xA2, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0xA0, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x9E, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x9C, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x25,0x14, 0x00,0x9A, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32,
-0x00,0x00, 0x25,0x14, 0x00,0x98, 0x76,0x31, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B, 0x28,0x00, 0xC7,0x1C, 0x32,0x00, 0x97,0x13,
-0xFF,0xFC, 0x94,0x93, 0xFF,0xFC, 0x26,0x14, 0x00,0x90, 0x96,0x13, 0xFF,0xFC, 0x96,0x16,
-0xFE,0x6C, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xD0,0xDC, 0x97,0x93, 0xFF,0xFC, 0x87,0x16,
-0xFF,0x70, 0x86,0x16, 0xFE,0x6C, 0x84,0x96, 0xFE,0xCC, 0x23,0x94, 0x00,0x8E, 0x75,0x9D,
-0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0x73,0x15, 0x00,0x1E, 0x73,0x18, 0xFF,0xE5, 0x93,0x16,
-0xFE,0x94, 0x74,0x15, 0x00,0x1E, 0x74,0x20, 0xFF,0xE5, 0x73,0x15, 0x00,0x1E, 0x73,0x18,
-0xFF,0xE5, 0x93,0x16, 0xFE,0x84, 0x83,0x16, 0xFE,0x94, 0x76,0x31, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0x05,0x24, 0x00,0x02, 0x06,0xA8, 0x00,0x02, 0x74,0x95, 0x00,0x1E, 0x74,0xA4,
-0xFF,0xE5, 0x94,0x96, 0xFE,0x8C, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x2B,
-0x28,0x00, 0x84,0x96, 0xFE,0xC4, 0x87,0x1E, 0x00,0x00, 0x75,0x25, 0x00,0x1E, 0xC7,0x38,
-0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16,
-0xFF,0x74, 0x23,0x94, 0x00,0x8A, 0x76,0x1D, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x84,0x96,
-0xFE,0x8C, 0x75,0x28, 0xFF,0xE5, 0xC7,0x38, 0x37,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37,
-0x28,0x00, 0x87,0x1E, 0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x83,0x16, 0xFE,0x84, 0xC7,0x38,
-0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4, 0x00,0x02, 0x87,0x16,
-0xFF,0x78, 0x23,0x94, 0x00,0x86, 0x76,0x1D, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x47,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1E, 0x00,0x00, 0x06,0xB4,
-0x00,0x02, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x06,0xB4,
-0x00,0x02, 0x87,0x16, 0xFF,0x7C, 0x23,0x94, 0x00,0x82, 0x76,0x1D, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1E,
-0x00,0x00, 0x06,0xB4, 0x00,0x02, 0x84,0x96, 0xFE,0xC4, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x16, 0xFF,0x80, 0x06,0xB4, 0x00,0x02, 0xC7,0x38,
-0x37,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x26, 0x00,0x00, 0xF3,0x02,
-0x00,0xFF, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xE8, 0xC6,0xB8, 0x34,0x00, 0xF7,0x02,
-0x00,0x80, 0xC7,0x34, 0x74,0x00, 0x77,0x39, 0x00,0x10, 0x77,0x39, 0xFF,0xF0, 0x20,0x3A,
-0x00,0x00, 0xE6,0x00, 0xEA,0x61, 0x27,0x00, 0x01,0x00, 0xC6,0xB4, 0x75,0x80, 0x84,0x96,
-0xFE,0xCC, 0x00,0x00, 0x00,0x01, 0x07,0x24, 0x00,0x38, 0xF6,0xBB, 0x28,0x00, 0x94,0x93,
-0xFF,0xFC, 0x83,0x16, 0xFF,0x24, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xD4,0x2C, 0x97,0x93, 0xFF,0xFC, 0x84,0x96, 0xFE,0xD4, 0x00,0x00,
-0x00,0x01, 0x04,0xA4, 0x00,0x01, 0xE0,0x00, 0xE3,0x3C, 0x94,0x96, 0xFE,0xD4, 0xF4,0x02,
-0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x16,
-0x00,0x08, 0x86,0x96, 0x00,0x0C, 0xF5,0x02, 0xFF,0xFC, 0x85,0x96, 0x00,0x04, 0x84,0x16,
-0x00,0x10, 0xF4,0x84, 0xE0,0x00, 0x07,0x30, 0x00,0x02, 0x94,0xB2, 0x00,0x10, 0xF4,0x84,
-0xE0,0x04, 0x06,0xB4, 0x00,0x03, 0x94,0xB2, 0x00,0x14, 0xF4,0x84, 0xE0,0x1C, 0xC6,0xB4,
-0x54,0x00, 0x94,0xB2, 0x00,0x18, 0xF4,0x82, 0x00,0x05, 0xF4,0xB3, 0x28,0x00, 0xF4,0x82,
-0x00,0x01, 0xF4,0xBB, 0x28,0x00, 0x27,0x34, 0x00,0x08, 0x97,0x32, 0x00,0x04, 0x86,0x16,
-0x00,0x00, 0x07,0x2C, 0x00,0x03, 0xC7,0x38, 0x54,0x00, 0xC6,0xB8, 0x68,0x00, 0x96,0x93,
-0xFF,0xFC, 0xC6,0x30, 0x72,0x00, 0x96,0x13, 0xFF,0xFC, 0xF7,0x02, 0x00,0x03, 0xC5,0xAC,
-0x74,0x00, 0xF7,0x02, 0x00,0x04, 0xC7,0x38, 0x5A,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xC1,0x20, 0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x14, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x18, 0x87,0x16, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0x83,0xBA, 0x00,0x00, 0x84,0x96, 0x00,0x00, 0x93,0x96, 0xFF,0xF0, 0xF3,0x84,
-0x6E,0x54, 0x87,0x3A, 0x00,0x04, 0x93,0x96, 0xFF,0xEC, 0x97,0x16, 0xFF,0xF4, 0x90,0x13,
-0xFF,0xFC, 0x27,0x1C, 0x00,0x02, 0x97,0x13, 0xFF,0xFC, 0x07,0x24, 0x00,0x20, 0x97,0x13,
-0xFF,0xFC, 0x94,0x96, 0xFF,0xE4, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0xB8, 0x97,0x93,
-0xFF,0xFC, 0x84,0x96, 0xFF,0xE4, 0x83,0x96, 0x00,0x08, 0x87,0x26, 0x00,0x18, 0x85,0x16,
-0xFF,0xEC, 0xC0,0x3A, 0x3A,0x00, 0xEE,0x00, 0xEC,0x7C, 0xF5,0x82, 0x00,0x01, 0x87,0x26,
-0x00,0x18, 0x83,0x96, 0x00,0x08, 0x00,0x00, 0x00,0x01, 0xC0,0x1E, 0x72,0x00, 0xE6,0x00,
-0xEC,0x7C, 0xC5,0x84, 0x00,0x00, 0x86,0xA6, 0x00,0x10, 0x87,0x16, 0xFF,0xF0, 0xF6,0x02,
-0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xEC,0x1C, 0x04,0x24, 0x00,0x10, 0x86,0xA6,
-0x00,0x14, 0x87,0x16, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x00,
-0xEC,0x20, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0xEC,0x2D, 0x00,0x00, 0x00,0x01, 0xF5,0x82, 0x00,0x00, 0x86,0xA2, 0x00,0x00, 0x87,0x16,
-0xFF,0xF0, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0xEC,0x68, 0xF6,0x02,
-0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x00, 0xEC,0x70, 0x20,0x32, 0x00,0x00, 0x86,0xA2,
-0x00,0x04, 0x87,0x16, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00,
-0xEC,0x71, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0xEC,0x81, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00,
-0xEC,0xAC, 0xF7,0x02, 0x00,0x01, 0xF7,0x04, 0x42,0x9C, 0xF6,0x06, 0x42,0x9C, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0xF7,0x02, 0x00,0x01, 0x97,0x2A, 0x00,0x08, 0x83,0xA6,
-0x00,0x0C, 0x77,0x2C, 0xFF,0xE1, 0x93,0xAA, 0x00,0x0C, 0x97,0x2A, 0x00,0x1C, 0x83,0xA6,
-0x00,0x1C, 0xF7,0x04, 0x6E,0x50, 0x93,0xAA, 0x00,0x20, 0x83,0xBA, 0x1D,0xDC, 0xF6,0x82,
-0x00,0x00, 0x93,0xAA, 0x00,0x2C, 0x83,0x96, 0x00,0x0C, 0xC5,0xB4, 0x00,0x00, 0x93,0xAA,
-0x00,0x30, 0x83,0xBA, 0x00,0x10, 0xC6,0x34, 0x00,0x00, 0x93,0xAA, 0x00,0x24, 0x87,0x3A,
-0x00,0x14, 0x00,0x00, 0x00,0x01, 0x97,0x2A, 0x00,0x28, 0x20,0x36, 0x00,0x1F, 0xEE,0x00,
-0xED,0x1C, 0xC7,0x30, 0x50,0x00, 0x07,0x38, 0x00,0x34, 0x95,0xBA, 0x00,0x00, 0x06,0x30,
-0x00,0x04, 0xE0,0x00, 0xEC,0xFC, 0x06,0xB4, 0x00,0x01, 0x83,0x96, 0x00,0x10, 0x76,0xA5,
-0x00,0x1E, 0x93,0x93, 0xFF,0xFC, 0xF3,0x82, 0x00,0xB4, 0x93,0x93, 0xFF,0xFC, 0x95,0x13,
-0xFF,0xFC, 0x87,0x26, 0x00,0x20, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x97,0x13, 0xFF,0xFC, 0x83,0x96, 0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xEA,0xB8, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x14, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x18, 0x87,0x16,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x86,0x3A, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x96,0x16,
-0xFF,0xF0, 0x87,0x3A, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x97,0x16, 0xFF,0xF4, 0xF6,0x02,
-0x1D,0xE0, 0x96,0x13, 0xFF,0xFC, 0x86,0x16, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x96,0x13,
-0xFF,0xFC, 0xF6,0x04, 0x6E,0x50, 0x00,0x00, 0x00,0x01, 0x96,0x13, 0xFF,0xFC, 0x26,0x14,
-0x00,0x10, 0x96,0x16, 0xFF,0xEC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x26,0xF8, 0x97,0x93,
-0xFF,0xFC, 0xF6,0x84, 0x6E,0x50, 0xF6,0x02, 0x00,0x00, 0x87,0x36, 0x1D,0xD8, 0x96,0x16,
-0xFF,0xE4, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF6,0x86, 0x42,0xC0, 0xF7,0x37, 0x28,0x00, 0x86,0x16, 0xFF,0xEC, 0x00,0x00,
-0x00,0x01, 0x96,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xDB,0xB4, 0x97,0x93,
-0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xEE,0x4D, 0x00,0x00, 0x00,0x01, 0x86,0x16,
-0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0x96,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xD5,0xA0, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00, 0xEE,0x4D, 0x00,0x00,
-0x00,0x01, 0xF6,0x02, 0x00,0x01, 0x96,0x16, 0xFF,0xE4, 0x84,0x16, 0xFF,0xE4, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x96, 0x00,0x04, 0x86,0x16,
-0x00,0x00, 0x87,0x36, 0x00,0x08, 0x85,0x96, 0x00,0x08, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0xEE,0x99, 0x20,0x3A, 0x00,0x03, 0xE6,0x00, 0xEE,0xE9, 0xF4,0x02, 0x00,0x00, 0xE0,0x00,
-0xEF,0x0C, 0x00,0x00, 0x00,0x01, 0x77,0xB0, 0x00,0x1F, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00,
-0xEF,0x0D, 0xF4,0x02, 0x00,0x00, 0x85,0x16, 0x00,0x14, 0x00,0x00, 0x00,0x01, 0x95,0x13,
-0xFF,0xFC, 0x85,0x16, 0x00,0x10, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x85,0x16,
-0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x95,0x93, 0xFF,0xFC, 0x96,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xEB,0x60, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00,
-0xEF,0x0C, 0x00,0x00, 0x00,0x01, 0x77,0xB0, 0x00,0x1E, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00,
-0xEF,0x0D, 0x00,0x00, 0x00,0x01, 0x95,0x93, 0xFF,0xFC, 0x96,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xED,0x74, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x18, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x18, 0xF4,0x82, 0x00,0x00, 0x86,0x96,
-0x00,0x00, 0xF6,0x04, 0x4A,0xA0, 0x23,0x94, 0x00,0x10, 0x84,0x36, 0x00,0x00, 0x96,0x16,
-0xFF,0xE4, 0xF7,0x04, 0x4A,0x9C, 0x94,0x16, 0xFF,0xF0, 0x85,0x36, 0x00,0x04, 0xC0,0x32,
-0x72,0x00, 0xEC,0x00, 0xF0,0x14, 0x95,0x16, 0xFF,0xF4, 0x77,0x31, 0x00,0x01, 0xC7,0x38,
-0x60,0x00, 0x77,0x39, 0x00,0x02, 0xF3,0x06, 0x4A,0x98, 0xC6,0xB8, 0x30,0x00, 0x06,0xB4,
-0x00,0x0C, 0xC5,0x84, 0x00,0x00, 0x87,0x36, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x42,0x00, 0xE6,0x00, 0xEF,0xA4, 0xC6,0x24, 0x00,0x00, 0x87,0x36, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x52,0x00, 0xE6,0x00, 0xEF,0xA8, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00, 0xEF,0xB5, 0x00,0x00, 0x00,0x01, 0xF5,0x82,
-0x00,0x00, 0x86,0x36, 0x00,0x00, 0x87,0x16, 0xFF,0xF0, 0x00,0x00, 0x00,0x01, 0xC0,0x32,
-0x72,0x00, 0xE2,0x00, 0xEF,0xF0, 0xF5,0x02, 0x00,0x00, 0xC0,0x32, 0x72,0x00, 0xE6,0x00,
-0xEF,0xF8, 0x20,0x2A, 0x00,0x00, 0x86,0xB6, 0x00,0x04, 0x87,0x16, 0xFF,0xF4, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x00, 0xEF,0xF9, 0x20,0x2A, 0x00,0x00, 0xF5,0x02,
-0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x00, 0xF0,0x09, 0x20,0x2E, 0x00,0x00, 0xF5,0x82,
-0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x00, 0xF0,0x18, 0x20,0x26, 0x00,0x00, 0xF4,0x82,
-0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x00, 0xF0,0x4D, 0xF6,0x02, 0x00,0x01, 0x87,0x16,
-0xFF,0xE4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16,
-0xFF,0xE8, 0xE0,0x00, 0xF0,0xB0, 0x96,0x96, 0xFF,0xEC, 0x27,0x14, 0x00,0x1C, 0x97,0x13,
-0xFF,0xFC, 0x93,0x93, 0xFF,0xFC, 0xF3,0x06, 0x4A,0x98, 0x93,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x20,0x22, 0x00,0x00, 0xE6,0x00,
-0xF0,0xAD, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xE4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9,
-0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4,
-0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xE8, 0x96,0x96, 0xFF,0xEC, 0xF7,0x05,
-0x4A,0xA0, 0xE0,0x00, 0xF0,0xB4, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x00, 0x20,0x32,
-0x00,0x00, 0xE6,0x00, 0xF1,0x21, 0xF4,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xE8, 0xF6,0x06,
-0x42,0xC8, 0x76,0xB9, 0x00,0x02, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xA7,0x36,
-0x60,0x02, 0x83,0x16, 0x00,0x04, 0xC6,0xB4, 0x60,0x00, 0x76,0x35, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0x05,0x34, 0x00,0x02, 0x75,0xA9, 0x00,0x1E, 0xC7,0x38, 0x67,0xC0, 0x77,0x38,
-0xFF,0xF0, 0x97,0x1A, 0x00,0x00, 0x87,0x2A, 0x00,0x00, 0x75,0xAC, 0xFF,0xE5, 0x83,0x16,
-0x00,0x08, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x97,0x1A, 0x00,0x00, 0x83,0x16,
-0x00,0x0C, 0x06,0xB4, 0x00,0x04, 0xE0,0x00, 0xF1,0x24, 0x96,0x9A, 0x00,0x00, 0xF4,0x02,
-0x00,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x10, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x00,0x00, 0xB9,0x00, 0x00,0x00, 0xBA,0x00, 0x00,0x00,
-0xBB,0x00, 0x00,0x00, 0xBC,0x00, 0x00,0x00, 0xBD,0x00, 0x00,0x00, 0xBE,0x00, 0x00,0x00,
-0xBF,0x00, 0x00,0x00, 0x80,0x00, 0x00,0x00, 0x81,0x00, 0x00,0x00, 0x82,0x00, 0x00,0x00,
-0x83,0x00, 0x00,0x00, 0x84,0x00, 0x00,0x00, 0x85,0x00, 0x00,0x00, 0x86,0x00, 0x00,0x00,
-0x87,0x00, 0xB9,0xB9, 0xB9,0xBA, 0xB9,0xBB, 0xB9,0xBC, 0xB9,0xBD, 0xB9,0xBE, 0xB9,0xBF,
-0xB9,0x80, 0xB9,0x81, 0xB9,0x82, 0xB9,0x83, 0xB9,0x84, 0xB9,0x85, 0xB9,0x86, 0xB9,0x87,
-0xBA,0xB9, 0xBA,0xBA, 0xBA,0xBB, 0xBA,0xBC, 0xBA,0xBD, 0xBA,0xBE, 0xBA,0xBF, 0xBA,0x80,
-0xBA,0x81, 0xBA,0x82, 0xBA,0x83, 0xBA,0x84, 0xBA,0x85, 0xBA,0x86, 0xBA,0x87, 0xBB,0xB9,
-0xBB,0xBA, 0xBB,0xBB, 0xBB,0xBC, 0xBB,0xBD, 0xBB,0xBE, 0xBB,0xBF, 0xBB,0x80, 0xBB,0x81,
-0xBB,0x82, 0xBB,0x83, 0xBB,0x84, 0xBB,0x85, 0xBB,0x86, 0xBB,0x87, 0xBC,0xB9, 0xBC,0xBA,
-0xBC,0xBB, 0xBC,0xBC, 0xBC,0xBD, 0xBC,0xBE, 0xBC,0xBF, 0xBC,0x80, 0xBC,0x81, 0xBC,0x82,
-0xBC,0x83, 0xBC,0x84, 0xBC,0x85, 0xBC,0x86, 0xBC,0x87, 0xBD,0xB9, 0xBD,0xBA, 0xBD,0xBB,
-0xBD,0xBC, 0xBD,0xBD, 0xBD,0xBE, 0xBD,0xBF, 0xBD,0x80, 0xBD,0x81, 0xBD,0x82, 0xBD,0x83,
-0xBD,0x84, 0xBD,0x85, 0xBD,0x86, 0xBD,0x87, 0xBE,0xB9, 0xBE,0xBA, 0xBE,0xBB, 0xBE,0xBC,
-0xBE,0xBD, 0xBE,0xBE, 0xBE,0xBF, 0xBE,0x80, 0xBE,0x81, 0xBE,0x82, 0xBE,0x83, 0xBE,0x84,
-0xBE,0x85, 0xBE,0x86, 0xBE,0x87, 0xBF,0xB9, 0xBF,0xBA, 0xBF,0xBB, 0xBF,0xBC, 0xBF,0xBD,
-0xBF,0xBE, 0xBF,0xBF, 0xBF,0x80, 0xBF,0x81, 0xBF,0x82, 0xBF,0x83, 0xBF,0x84, 0xBF,0x85,
-0xBF,0x86, 0xBF,0x87, 0x80,0xB9, 0x80,0xBA, 0x80,0xBB, 0x80,0xBC, 0x80,0xBD, 0x80,0xBE,
-0x80,0xBF, 0x80,0x80, 0x80,0x81, 0x80,0x82, 0x80,0x83, 0x80,0x84, 0x80,0x85, 0x80,0x86,
-0x80,0x87, 0x81,0xB9, 0x81,0xBA, 0x81,0xBB, 0x81,0xBC, 0x81,0xBD, 0x81,0xBE, 0x81,0xBF,
-0x81,0x80, 0x81,0x81, 0x81,0x82, 0x81,0x83, 0x81,0x84, 0x81,0x85, 0x81,0x86, 0x81,0x87,
-0x82,0xB9, 0x82,0xBA, 0x82,0xBB, 0x82,0xBC, 0x82,0xBD, 0x82,0xBE, 0x82,0xBF, 0x82,0x80,
-0x82,0x81, 0x82,0x82, 0x82,0x83, 0x82,0x84, 0x82,0x85, 0x82,0x86, 0x82,0x87, 0x83,0xB9,
-0x83,0xBA, 0x83,0xBB, 0x83,0xBC, 0x83,0xBD, 0x83,0xBE, 0x83,0xBF, 0x83,0x80, 0x83,0x81,
-0x83,0x82, 0x83,0x83, 0x83,0x84, 0x83,0x85, 0x83,0x86, 0x83,0x87, 0x84,0xB9, 0x84,0xBA,
-0x84,0xBB, 0x84,0xBC, 0x84,0xBD, 0x84,0xBE, 0x84,0xBF, 0x84,0x80, 0x84,0x81, 0x84,0x82,
-0x84,0x83, 0x84,0x84, 0x84,0x85, 0x84,0x86, 0x84,0x87, 0x85,0xB9, 0x85,0xBA, 0x85,0xBB,
-0x85,0xBC, 0x85,0xBD, 0x85,0xBE, 0x85,0xBF, 0x85,0x80, 0x85,0x81, 0x85,0x82, 0x85,0x83,
-0x85,0x84, 0x85,0x85, 0x85,0x86, 0x85,0x87, 0x86,0xB9, 0x86,0xBA, 0x86,0xBB, 0x86,0xBC,
-0x86,0xBD, 0x86,0xBE, 0x86,0xBF, 0x86,0x80, 0x86,0x81, 0x86,0x82, 0x86,0x83, 0x86,0x84,
-0x86,0x85, 0x86,0x86, 0x86,0x87, 0x87,0xB9, 0x87,0xBA, 0x87,0xBB, 0x87,0xBC, 0x87,0xBD,
-0x87,0xBE, 0x87,0xBF, 0x87,0x80, 0x87,0x81, 0x87,0x82, 0x87,0x83, 0x87,0x84, 0x87,0x85,
-0x87,0x86, 0x87,0x87, 0x00,0x00, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x18, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0xF3,0x7D, 0xF6,0x06, 0x42,0x96, 0xF7,0x04, 0x42,0x94, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xF4,0x02, 0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0xF5,0xE0, 0xF7,0x33, 0x28,0x00, 0xF3,0x84, 0x6F,0x30, 0x90,0x13,
-0xFF,0xFC, 0x27,0x1C, 0x00,0x02, 0x97,0x13, 0xFF,0xFC, 0x83,0x16, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x93,0x96, 0xFF,0xEC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xCD,0xB8, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0xEC, 0xF7,0x02, 0x00,0x00, 0x97,0x1E,
-0x00,0x08, 0x83,0x16, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x93,0x1E, 0x00,0x0C, 0x83,0x16,
-0x00,0x08, 0x04,0x9C, 0x00,0x22, 0x93,0x1E, 0x00,0x1C, 0x83,0x16, 0x00,0x0C, 0x93,0x96,
-0xFF,0xF4, 0x87,0x1A, 0x00,0x00, 0x76,0x99, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x06,0x18,
-0x00,0x02, 0x75,0xB1, 0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0x06,0x9C, 0x00,0x20, 0xF7,0x37, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x96,0x96,
-0xFF,0xE4, 0x75,0x35, 0x00,0x1E, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x04,0x9C, 0x00,0x24, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x04,0x9C, 0x00,0x26, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x04,0x9C, 0x00,0x28, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x04,0x9C, 0x00,0x2A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x04,0x9C, 0x00,0x2C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x04,0x9C, 0x00,0x2E, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x04,0x9C, 0x00,0x30, 0x76,0x31,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27,
-0x28,0x00, 0x87,0x1E, 0x00,0x20, 0x75,0x28, 0xFF,0xE5, 0xC7,0x38, 0x57,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x20,0x3A, 0x00,0x08, 0xEE,0x00, 0xF5,0x98, 0xF3,0x06, 0x14,0xD8, 0x83,0x16,
-0xFF,0xE4, 0x87,0x1E, 0x00,0x20, 0x76,0x99, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x25,0xB8, 0x00,0x01, 0xC4,0xAC, 0x58,0x00, 0x04,0x24,
-0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xEC,0x00, 0xF5,0x95, 0xF5,0x02, 0x00,0x00, 0x83,0x16,
-0xFF,0xE4, 0x00,0x00, 0x00,0x01, 0x06,0x18, 0x00,0x02, 0xA7,0x32, 0x58,0x02, 0xC6,0xB0,
-0x58,0x00, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xE8, 0xC6,0xB0, 0x40,0x00, 0x77,0xB8, 0x00,0x18, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x00,
-0xF5,0x7D, 0xF7,0x37, 0x68,0x00, 0xF5,0x02, 0xFF,0xFF, 0xC7,0x30, 0x48,0x00, 0xF5,0x3B,
-0x68,0x00, 0x24,0xA4, 0x00,0x02, 0x24,0x20, 0x00,0x02, 0xE0,0x00, 0xF5,0x34, 0x25,0xAC,
-0x00,0x01, 0xF3,0x06, 0x14,0xD8, 0x93,0x13, 0xFF,0xFC, 0xF3,0x02, 0x00,0x34, 0x93,0x13,
-0xFF,0xFC, 0x83,0x16, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x83,0x16,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x1A, 0x00,0x00, 0x76,0x99, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x97,0x13, 0xFF,0xFC, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xEA,0xB8, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x10, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x10, 0xF7,0x04,
-0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0xF6,0x39, 0xF6,0x06,
-0x42,0x96, 0xF7,0x04, 0x42,0x94, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF4,0x02,
-0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xE0,0x00,
-0xF7,0x48, 0xF7,0x33, 0x28,0x00, 0xF5,0x04, 0x6F,0x30, 0x00,0x00, 0x00,0x01, 0x95,0x16,
-0xFF,0xF4, 0x90,0x13, 0xFF,0xFC, 0x27,0x28, 0x00,0x02, 0x97,0x13, 0xFF,0xFC, 0x85,0x96,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xCD,0xB8, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0x00,0x04, 0xF6,0x02, 0x00,0x00, 0x86,0xAA,
-0x00,0x00, 0x77,0x29, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0xF7,0x02, 0x00,0x01, 0xC0,0x36, 0x74,0x00, 0xE6,0x00, 0xF6,0x99, 0x96,0x96,
-0xFF,0xEC, 0xC6,0x38, 0x00,0x00, 0x96,0x13, 0xFF,0xFC, 0x85,0x96, 0xFF,0xEC, 0x85,0x16,
-0xFF,0xF4, 0x47,0x2C, 0xFF,0xFE, 0x07,0x38, 0x00,0x02, 0xC7,0x28, 0x72,0x00, 0x97,0x13,
-0xFF,0xFC, 0x85,0x96, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xCD,0xB8, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0xFF,0xF4, 0xF7,0x02,
-0x00,0x02, 0x97,0x2A, 0x00,0x08, 0x85,0x96, 0x00,0x08, 0x00,0x00, 0x00,0x01, 0x95,0xAA,
-0x00,0x0C, 0x85,0x96, 0x00,0x0C, 0x00,0x00, 0x00,0x01, 0x95,0xAA, 0x00,0x1C, 0xF5,0x06,
-0x14,0xD8, 0x95,0x13, 0xFF,0xFC, 0xF5,0x82, 0x00,0x20, 0x95,0x93, 0xFF,0xFC, 0x85,0x16,
-0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x85,0x96, 0x00,0x00, 0x85,0x16,
-0xFF,0xEC, 0x87,0x2E, 0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC7,0x38, 0x50,0x00, 0x97,0x13, 0xFF,0xFC, 0x85,0x96,
-0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xEA,0xB8, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x10, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x85,0x96, 0x00,0x00, 0x85,0x16, 0x00,0x04, 0x87,0x16, 0x00,0x08, 0xF6,0x02,
-0xFF,0xFC, 0x06,0xA8, 0x00,0x03, 0xC6,0xB4, 0x64,0x00, 0x07,0x38, 0x00,0x03, 0xC7,0x38,
-0x64,0x00, 0xC7,0x34, 0x70,0x00, 0x97,0x13, 0xFF,0xFC, 0xC5,0xAC, 0x6A,0x00, 0x95,0x93,
-0xFF,0xFC, 0xF7,0x02, 0x00,0x03, 0xC5,0x28, 0x74,0x00, 0xF7,0x02, 0x00,0x04, 0xC7,0x38,
-0x52,0x00, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x14,0xD8, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x10, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x10, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0xF8,0x0D, 0xF6,0x06, 0x42,0x96, 0xF7,0x04, 0x42,0x94, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xF4,0x02, 0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0xF9,0x20, 0xF7,0x33, 0x28,0x00, 0xF5,0x04, 0x6F,0x30, 0x00,0x00,
-0x00,0x01, 0x95,0x16, 0xFF,0xF4, 0x90,0x13, 0xFF,0xFC, 0x27,0x28, 0x00,0x02, 0x97,0x13,
-0xFF,0xFC, 0x85,0x96, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x95,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xCD,0xB8, 0x97,0x93, 0xFF,0xFC, 0x85,0x16, 0x00,0x04, 0xF6,0x02,
-0x00,0x00, 0x86,0xAA, 0x00,0x00, 0x77,0x29, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB5, 0xFF,0xF0, 0xF7,0x02, 0x00,0x01, 0xC0,0x36, 0x74,0x00, 0xE6,0x00,
-0xF8,0x6D, 0x96,0x96, 0xFF,0xEC, 0xC6,0x38, 0x00,0x00, 0x96,0x13, 0xFF,0xFC, 0x85,0x96,
-0xFF,0xEC, 0x85,0x16, 0xFF,0xF4, 0x47,0x2C, 0xFF,0xFE, 0x07,0x38, 0x00,0x02, 0xC7,0x28,
-0x72,0x00, 0x97,0x13, 0xFF,0xFC, 0x85,0x96, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0xB8, 0x97,0x93, 0xFF,0xFC, 0x85,0x16,
-0xFF,0xF4, 0xF5,0x82, 0x00,0x06, 0xF5,0xAB, 0x28,0x00, 0x85,0x96, 0x00,0x08, 0x07,0x28,
-0x00,0x02, 0x95,0xAA, 0x00,0x04, 0x05,0x14, 0x00,0x0E, 0x85,0x2A, 0x00,0x00, 0x77,0xA9,
-0x00,0x1E, 0x77,0xBC, 0xFF,0xE5, 0xC5,0x28, 0x7F,0xC0, 0x75,0x29, 0xFF,0xF0, 0xF5,0x3B,
-0x28,0x00, 0xF5,0x86, 0x14,0xD8, 0x95,0x93, 0xFF,0xFC, 0xF5,0x02, 0x00,0x08, 0x95,0x13,
-0xFF,0xFC, 0x85,0x96, 0x00,0x00, 0x85,0x16, 0xFF,0xEC, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0xC7,0x38,
-0x50,0x00, 0x97,0x13, 0xFF,0xFC, 0x85,0x96, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xF7,0x5C, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x10, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x08, 0xF7,0x04,
-0x75,0xEC, 0x83,0x96, 0x00,0x04, 0x20,0x3A, 0x00,0x00, 0xE6,0x00, 0xFA,0x64, 0xF6,0x06,
-0x42,0x96, 0xF5,0x04, 0x6F,0x30, 0x90,0x13, 0xFF,0xFC, 0x27,0x28, 0x00,0x02, 0x97,0x13,
-0xFF,0xFC, 0x83,0x16, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0x93,0x96,
-0xFF,0xF4, 0x95,0x16, 0xFF,0xF0, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0xB8, 0x97,0x93,
-0xFF,0xFC, 0x85,0x16, 0xFF,0xF0, 0xF3,0x02, 0x00,0x07, 0x83,0x96, 0xFF,0xF4, 0xF3,0x2B,
-0x28,0x00, 0x07,0x28, 0x00,0x02, 0xF3,0x02, 0x00,0x01, 0xF3,0x3B, 0x28,0x00, 0x87,0x1E,
-0x00,0x00, 0x76,0x9D, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x05,0x9C, 0x00,0x02, 0x76,0x2D,
-0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0x74,0x9D, 0x00,0x1E, 0x74,0xA4, 0xFF,0xE5, 0x04,0x1C,
-0x00,0x06, 0x83,0x16, 0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0x06,0xA8,
-0x00,0x04, 0xF7,0x37, 0x28,0x00, 0x87,0x2E, 0x00,0x00, 0x06,0xA8, 0x00,0x06, 0x75,0xA1,
-0x00,0x1E, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x1E,
-0x00,0x04, 0x75,0xAC, 0xFF,0xE5, 0x06,0xA8, 0x00,0x08, 0x76,0x19, 0x00,0x1E, 0xC7,0x38,
-0x4F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0x87,0x22, 0x00,0x00, 0x06,0xA8,
-0x00,0x0A, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x37, 0x28,0x00, 0xF3,0x06,
-0x14,0xD8, 0x93,0x13, 0xFF,0xFC, 0xF3,0x02, 0x00,0x0C, 0x93,0x13, 0xFF,0xFC, 0x83,0x16,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x1A, 0x00,0x00, 0x76,0x30, 0xFF,0xE5, 0xC7,0x38,
-0x67,0xC0, 0x77,0x39, 0xFF,0xF0, 0x97,0x13, 0xFF,0xFC, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xF7,0x5C, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00, 0xFA,0x84, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x42,0x94, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xF4,0x02,
-0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xF7,0x33,
-0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x48, 0xF7,0x04, 0x75,0xEC, 0x85,0x96, 0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x00,
-0xFD,0x98, 0xF6,0x06, 0x42,0x96, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0x24,0x14, 0x00,0x1E, 0x06,0x2C, 0x00,0x02, 0x75,0x31,
-0x00,0x1E, 0x24,0x94, 0x00,0x20, 0x75,0x28, 0xFF,0xE5, 0xF3,0x84, 0x6E,0x50, 0xC7,0x38,
-0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x87,0x32, 0x00,0x00, 0x93,0x96,
-0xFF,0xC4, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x1C, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x1A, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x18, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x16, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x14, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x24,0x14,
-0x00,0x12, 0x06,0x30, 0x00,0x02, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x06,0x30,
-0x00,0x02, 0x87,0x32, 0x00,0x00, 0x24,0x14, 0x00,0x10, 0x76,0x31, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x23, 0x28,0x00, 0x90,0x13,
-0xFF,0xFC, 0x27,0x1C, 0x00,0x02, 0x97,0x13, 0xFF,0xFC, 0x94,0x93, 0xFF,0xFC, 0x95,0x96,
-0xFF,0xBC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xCD,0xB8, 0x97,0x93, 0xFF,0xFC, 0x85,0x96,
-0xFF,0xBC, 0x23,0x14, 0x00,0x36, 0x24,0x94, 0x00,0x38, 0x73,0xA5, 0x00,0x1E, 0x73,0x9C,
-0xFF,0xE5, 0xF4,0x04, 0x42,0xC0, 0xF6,0x86, 0x42,0xC0, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0x87,0x2E, 0x00,0x00, 0x76,0x2D, 0x00,0x1E, 0x76,0x30, 0xFF,0xE5, 0xC4,0x20,
-0x6F,0xC0, 0x74,0x20, 0xFF,0xF0, 0x05,0xAC, 0x00,0x02, 0x75,0x2D, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0xC7,0x38, 0x67,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x27, 0x28,0x00, 0x87,0x2E,
-0x00,0x00, 0xF6,0x04, 0x6E,0x50, 0xC7,0x38, 0x57,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x23,0x14, 0x00,0x34, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x23,0x14, 0x00,0x32, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x23,0x14, 0x00,0x30, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x23,0x14, 0x00,0x2E, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x23,0x14, 0x00,0x2C, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x23,0x14, 0x00,0x2A, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x76,0xAD,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x05,0xAC, 0x00,0x02, 0x87,0x2E, 0x00,0x00, 0x23,0x14, 0x00,0x28, 0x75,0xAD,
-0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0xC7,0x38, 0x5F,0xC0, 0x77,0x38, 0xFF,0xF0, 0xF7,0x1B,
-0x28,0x00, 0x87,0x16, 0xFF,0xC8, 0xF6,0x82, 0x00,0x03, 0xC7,0x38, 0x3F,0xC0, 0x96,0xB2,
-0x00,0x08, 0x06,0xB0, 0x1D,0xD8, 0xF4,0x37, 0x28,0x00, 0xF3,0x86, 0x14,0xD8, 0x93,0x93,
-0xFF,0xFC, 0xF3,0x82, 0x1D,0xE0, 0x93,0x93, 0xFF,0xFC, 0x96,0x13, 0xFF,0xFC, 0x77,0x39,
-0xFF,0xF0, 0x97,0x13, 0xFF,0xFC, 0x83,0x96, 0xFF,0xC4, 0x00,0x00, 0x00,0x01, 0x93,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xEA,0xB8, 0x97,0x93, 0xFF,0xFC, 0xE0,0x00,
-0xFD,0xB8, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0x94, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xF4,0x02, 0x00,0x00, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x86,0x16, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x32, 0x00,0x00, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x20,0x3A,
-0x00,0x06, 0xE6,0x00, 0xFE,0x21, 0xF5,0x82, 0x00,0x1E, 0xF7,0x04, 0x42,0xA8, 0xF6,0x06,
-0x42,0xA8, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39,
-0xFF,0xF0, 0x07,0x38, 0x00,0x01, 0xE0,0x00, 0xFE,0x34, 0xF7,0x33, 0x28,0x00, 0xF6,0x05,
-0x6F,0x34, 0x95,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x04, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x16,
-0x00,0x00, 0x85,0x96, 0x00,0x04, 0x87,0x32, 0x00,0x00, 0x76,0xB1, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x20,0x3A, 0x00,0x07, 0xE6,0x00,
-0xFE,0x9D, 0xF4,0x02, 0x00,0x00, 0xF7,0x04, 0x42,0xA8, 0xF6,0x06, 0x42,0xAA, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xE0,0x00, 0xFF,0x1C, 0xF7,0x33, 0x28,0x00, 0x07,0x30, 0x00,0x02, 0x86,0xBA,
-0x00,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5,
-0xFF,0xF0, 0x20,0x36, 0x00,0x01, 0xE6,0x00, 0xFE,0xD5, 0xF6,0x05, 0x6F,0x34, 0x20,0x36,
-0x00,0x02, 0xE6,0x00, 0xFE,0xE5, 0xF5,0x02, 0x00,0x20, 0xE0,0x00, 0xFE,0xFC, 0xF6,0x06,
-0x42,0xAC, 0x20,0x2E, 0x00,0x0C, 0xE6,0x00, 0xFF,0x1C, 0xF4,0x02, 0x00,0x00, 0xF5,0x02,
-0x00,0x1F, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0xFF,0x1C, 0xF4,0x02, 0x00,0x01, 0xF7,0x04, 0x42,0xAC, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0xF4,0x02, 0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x86,0x96, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x36,
-0x00,0x04, 0xF6,0x02, 0x00,0x00, 0x07,0x38, 0x00,0x08, 0x97,0x36, 0x00,0x04, 0x87,0x36,
-0x00,0x08, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xEC,0x00, 0xFF,0x7D, 0xF6,0x85,
-0x6F,0x34, 0x87,0x36, 0x00,0x08, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x03, 0xEE,0x00,
-0xFF,0x80, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x00,
-0xFF,0xBD, 0xF6,0x06, 0x42,0xAE, 0xF7,0x04, 0x6F,0x34, 0x00,0x00, 0x00,0x01, 0x87,0x3A,
-0x00,0x08, 0xF6,0x82, 0xFF,0xEC, 0x77,0x39, 0x00,0x02, 0xA7,0x3A, 0x68,0x02, 0x00,0x00,
-0x00,0x01, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x00, 0xFF,0xD8, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x42,0xAC, 0x76,0xB1,
-0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x07,0x38,
-0x00,0x01, 0xF7,0x33, 0x28,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x00,0x00, 0x00,0x17, 0x00,0x00,
-0x00,0x1A, 0x00,0x00, 0x00,0x1D, 0x00,0x00, 0x00,0x18, 0x00,0x00, 0x00,0x00, 0x56,0x65,
-0x72,0x73, 0x69,0x6F, 0x6E,0x53, 0x74,0x72, 0x69,0x6E, 0x67,0x3A, 0x20,0x6D, 0x63,0x70,
-0x2D,0x6C, 0x34,0x76, 0x33,0x20, 0x33,0x2E, 0x30,0x38, 0x63,0x20, 0x44,0x65, 0x63,0x20,
-0x31,0x31, 0x20,0x31, 0x39,0x39, 0x36,0x20, 0x31,0x33, 0x3A,0x30, 0x36,0x3A, 0x31,0x36,
-0x00,0x00, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04, 0xE0,0x0C, 0xFF,0x02,
-0x00,0x00, 0x97,0x02, 0xFF,0x84, 0xF7,0x06, 0x0C,0x3E, 0xCF,0xFC, 0x75,0x80, 0xF6,0x02,
-0x00,0x02, 0x96,0x02, 0xFF,0x8C, 0x90,0x02, 0xFF,0x88, 0xF7,0x04, 0xE0,0x20, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x00,0x74, 0xF6,0x82, 0x00,0x00, 0xF6,0x82,
-0x00,0x03, 0x96,0x82, 0xFF,0x98, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x0C, 0xF5,0x02, 0x14,0x94, 0xF5,0x05, 0x7B,0x00, 0xF5,0x0E,
-0xF0,0x14, 0xF5,0x05, 0x7B,0x08, 0xF7,0x06, 0xE0,0x00, 0xF6,0x86, 0x7B,0x68, 0xC7,0x38,
-0x6A,0x00, 0xF7,0x05, 0x7A,0xF0, 0xF5,0x02, 0x00,0x4C, 0xF6,0x82, 0x00,0x00, 0x20,0x36,
-0x00,0x02, 0xEE,0x01, 0x01,0x24, 0xF5,0x05, 0x7A,0xF8, 0xC5,0xB4, 0x00,0x00, 0xC6,0x34,
-0x00,0x00, 0xF7,0x06, 0xE0,0x30, 0xC7,0x2C, 0x70,0x00, 0xF5,0x06, 0x6F,0x44, 0xB7,0x32,
-0x50,0x02, 0x90,0x13, 0xFF,0xFC, 0x97,0x13, 0xFF,0xFC, 0x95,0x96, 0xFF,0xF4, 0x96,0x16,
-0xFF,0xF0, 0x96,0x96, 0xFF,0xEC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x03,0x1C, 0x97,0x93,
-0xFF,0xFC, 0x85,0x96, 0xFF,0xF4, 0x86,0x16, 0xFF,0xF0, 0x86,0x96, 0xFF,0xEC, 0x05,0xAC,
-0x14,0x94, 0x06,0xB4, 0x00,0x01, 0x20,0x36, 0x00,0x02, 0xEE,0x01, 0x00,0xD5, 0x06,0x30,
-0x00,0x04, 0xF5,0x02, 0x00,0x22, 0xF5,0x05, 0x6F,0x58, 0xF0,0x05, 0x6F,0x54, 0xF0,0x05,
-0x6F,0x50, 0xF0,0x05, 0x2D,0x40, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x29,0x58, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02,
-0x00,0x03, 0xF7,0x05, 0xE0,0x08, 0xF7,0x04, 0x7A,0xD8, 0xF6,0x02, 0x00,0x01, 0x96,0x02,
-0xFF,0x94, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x01,0x91, 0xF7,0x06, 0x7A,0xE8, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x03,0xDC, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x7A,0xE8, 0xF6,0x02,
-0x00,0x05, 0xF6,0x3B, 0x28,0x00, 0xF7,0x06, 0x7A,0xE0, 0x86,0x82, 0xFF,0x44, 0xF6,0x02,
-0x00,0x03, 0x20,0x36, 0x00,0x00, 0xE6,0x01, 0x01,0xC9, 0xF6,0x3B, 0x28,0x00, 0xF7,0x04,
-0x6F,0x64, 0x86,0x82, 0xFF,0x44, 0x07,0x38, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x01,
-0x01,0xB0, 0xF7,0x05, 0x6F,0x64, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x00,0x34, 0x97,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x00,0x8C, 0x97,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x44,0x28, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0xF0, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x0C,0x60, 0x97,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x04,0x08, 0x97,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x00,0x20, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x0B,0xD8, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1D,0x68, 0x97,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1E,0x50, 0x97,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x5F,0x68, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x6D,0xEC, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x21,0xD0, 0x97,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x22,0x2C, 0x97,0x93, 0xFF,0xFC, 0x90,0x02,
-0xFF,0x94, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x0B,0xFC, 0x97,0x93, 0xFF,0xFC, 0xF4,0x02,
-0x00,0x00, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x08, 0xF6,0x02, 0x00,0x00, 0xC5,0xB0, 0x00,0x00, 0x20,0x32, 0x00,0x02, 0xEE,0x01,
-0x03,0x08, 0xF5,0x06, 0x6F,0x44, 0xA6,0xAE, 0x50,0x02, 0x00,0x00, 0x00,0x01, 0x87,0x36,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x01, 0xE6,0x01, 0x02,0xFC, 0xF5,0x02,
-0x00,0x02, 0x95,0x13, 0xFF,0xFC, 0x96,0x93, 0xFF,0xFC, 0x95,0x96, 0xFF,0xF4, 0x96,0x16,
-0xFF,0xF0, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x03,0x1C, 0x97,0x93, 0xFF,0xFC, 0x86,0x16,
-0xFF,0xF0, 0x85,0x96, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x05,0xAC, 0x00,0x04, 0xE0,0x01,
-0x02,0xAC, 0x06,0x30, 0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x87,0x16, 0x00,0x00, 0xF6,0x02, 0x00,0x00, 0xF6,0x82, 0x00,0x08, 0x96,0x3A,
-0x00,0x08, 0x96,0x3A, 0x00,0x0C, 0x96,0x3A, 0x09,0xD8, 0x96,0x3A, 0x09,0xDC, 0x96,0x3A,
-0x0E,0xF4, 0x96,0x3A, 0x0E,0xF8, 0x96,0xBA, 0x14,0x20, 0x96,0x3A, 0x14,0x24, 0x90,0xBA,
-0x14,0x8C, 0x86,0x96, 0x00,0x04, 0x90,0xBA, 0x14,0x90, 0x96,0xBA, 0x00,0x00, 0x96,0x3A,
-0x00,0x04, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x85,0x96,
-0x00,0x00, 0x87,0x16, 0x00,0x08, 0x86,0x16, 0x00,0x04, 0x77,0x38, 0xFF,0xFF, 0xC5,0x30,
-0x70,0x00, 0xC0,0x32, 0x52,0x00, 0xE4,0x01, 0x03,0xC9, 0x00,0x00, 0x00,0x01, 0x87,0x2E,
-0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0xC0,0x32, 0x52,0x00, 0xE4,0x01,
-0x03,0xA0, 0x05,0xAC, 0x00,0x02, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF7,0x02, 0x00,0x01, 0xE0,0x01, 0x03,0xE8, 0xF7,0x05, 0x7A,0xD8, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x00,0x00, 0x00,0x00, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF5,0x02,
-0x00,0x0A, 0xF5,0x05, 0x71,0xCC, 0xF0,0x05, 0x71,0xD4, 0xF0,0x05, 0x71,0xD0, 0xF0,0x05,
-0x71,0xC4, 0xF5,0x02, 0x00,0x01, 0xF6,0x82, 0x00,0x00, 0x20,0x36, 0x00,0x0A, 0xEC,0x01,
-0x04,0x64, 0xF5,0x05, 0x71,0xC8, 0xF5,0x8A, 0x1E,0x00, 0xF6,0x06, 0x71,0xC4, 0x47,0x2C,
-0xFF,0xFC, 0x97,0x32, 0x00,0x18, 0x06,0x30, 0x00,0x04, 0x06,0xB4, 0x00,0x01, 0xF7,0x04,
-0x71,0xCC, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xEC,0x01, 0x04,0x41, 0x05,0xAC,
-0x21,0x4C, 0xF0,0x05, 0x71,0x98, 0xF5,0x06, 0x6F,0x68, 0x95,0x13, 0xFF,0xFC, 0xF5,0x06,
-0x7B,0x18, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x06, 0x05,0xD4, 0x95,0x13, 0xFF,0xFC, 0xF7,0x82, 0x00,0x05, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x06, 0x6F,0x68, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x0B,0x70, 0x95,0x13, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x06, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x6F,0x68, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x0B,0xA0, 0x95,0x13,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x05, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x70,0x80, 0x95,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06,
-0x0B,0x70, 0x95,0x13, 0xFF,0xFC, 0xF7,0x82, 0x00,0x06, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06,
-0x70,0x80, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x06, 0x05,0x58, 0x95,0x13, 0xFF,0xFC, 0xF5,0x02, 0x00,0x0A, 0x95,0x13,
-0xFF,0xFC, 0xF5,0x06, 0x71,0x0C, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x05,0x58, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04,
-0x71,0xC4, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x05,0x7D, 0xF6,0x86,
-0x71,0xC4, 0xE0,0x01, 0x05,0x94, 0xF7,0x02, 0x00,0x00, 0xF7,0x04, 0x71,0xD0, 0x00,0x00,
-0x00,0x01, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x87,0x3A, 0x00,0x18, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x05,0xAC, 0xF7,0x05, 0x7B,0x10, 0xF6,0x06,
-0x71,0x0C, 0xE0,0x01, 0x05,0xC0, 0xF6,0x05, 0x7B,0x18, 0xF6,0x06, 0x6F,0x68, 0xF6,0x05,
-0x7B,0x18, 0x97,0x02, 0xFF,0x48, 0x07,0x38, 0x21,0x28, 0x97,0x02, 0xFF,0x4C, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x10, 0x86,0x82,
-0xFF,0x48, 0xF4,0x86, 0x6F,0x68, 0xF4,0x85, 0x7B,0x18, 0xF5,0x04, 0x7B,0x10, 0x26,0xB4,
-0x00,0x02, 0x85,0xB6, 0x00,0x00, 0x87,0x2A, 0x00,0x00, 0x76,0x29, 0x00,0x1E, 0x76,0x30,
-0xFF,0xE5, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC5,0xAC, 0x6F,0xC0, 0xC7,0x38,
-0x67,0xC0, 0x77,0x39, 0xFF,0xF0, 0x77,0xB8, 0x00,0x10, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01,
-0x06,0x45, 0x75,0xAC, 0xFF,0xF0, 0xF7,0x04, 0x71,0xAC, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x71,0xAC, 0xF7,0x04, 0x71,0xAC, 0xE0,0x01, 0x08,0xC4, 0xF7,0x02,
-0x00,0x01, 0x77,0x2C, 0xFF,0xF8, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x06,0x71, 0x76,0xA9,
-0x00,0x1E, 0xF7,0x04, 0x71,0xA8, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x71,0xA8, 0xF7,0x04, 0x71,0xA8, 0xE0,0x01, 0x08,0xC4, 0xF7,0x02, 0x00,0x01, 0x87,0x2A,
-0x00,0x00, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x27,0x38,
-0x00,0x04, 0x20,0x3A, 0x00,0x03, 0xE2,0x01, 0x08,0xA4, 0x00,0x00, 0x00,0x01, 0x77,0x39,
-0x00,0x02, 0xF6,0x86, 0x06,0xA4, 0xA6,0xB6, 0x70,0x02, 0x00,0x00, 0x00,0x01, 0xC1,0x34,
-0x00,0x00, 0x00,0x01, 0x06,0xB4, 0x00,0x01, 0x07,0x7C, 0x00,0x01, 0x07,0xEC, 0x00,0x01,
-0x08,0x44, 0x87,0x2A, 0x00,0x04, 0xC4,0x84, 0x00,0x00, 0xC0,0x3A, 0x4A,0x00, 0xE6,0x01,
-0x06,0xD8, 0x00,0x00, 0x00,0x01, 0x87,0x02, 0xFF,0x48, 0x00,0x00, 0x00,0x01, 0xC7,0x38,
-0x52,0x00, 0x97,0x2A, 0x00,0x04, 0x87,0x2A, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x21,0x00, 0xEE,0x01, 0x07,0x3C, 0xF6,0x02, 0x00,0x00, 0x86,0xAA, 0x00,0x04, 0x87,0x02,
-0xFF,0x48, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x52,0x00, 0x27,0x38, 0x00,0x28, 0xC0,0x36,
-0x72,0x00, 0xE6,0x01, 0x07,0x3C, 0x00,0x00, 0x00,0x01, 0x77,0xFC, 0x00,0x1D, 0x70,0x3E,
-0xFF,0xE1, 0xE6,0x01, 0x07,0x3C, 0x00,0x00, 0x00,0x01, 0x77,0xFC, 0x00,0x17, 0x70,0x3E,
-0xFF,0xE1, 0xE6,0x01, 0x07,0x3D, 0x00,0x00, 0x00,0x01, 0x77,0xFC, 0x00,0x16, 0x70,0x3E,
-0xFF,0xE1, 0xE6,0x01, 0x07,0x44, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0xE6,0x01, 0x08,0x88, 0x00,0x00, 0x00,0x01, 0x87,0x2A, 0x00,0x18, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xEE,0x01, 0x08,0xC1, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x71,0xA4, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x71,0xA4, 0xF7,0x04,
-0x71,0xA4, 0xE0,0x01, 0x08,0xC4, 0xF7,0x02, 0x00,0x01, 0x87,0x2A, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x21,0x00, 0xEE,0x01, 0x07,0xE0, 0xF6,0x02, 0x00,0x00, 0x86,0xAA,
-0x00,0x04, 0x87,0x02, 0xFF,0x48, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x52,0x00, 0x27,0x38,
-0x00,0x0C, 0xC0,0x36, 0x72,0x00, 0xE6,0x01, 0x07,0xE0, 0x00,0x00, 0x00,0x01, 0x77,0xFC,
-0x00,0x1D, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01, 0x07,0xE0, 0x00,0x00, 0x00,0x01, 0x77,0xFC,
-0x00,0x17, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01, 0x07,0xE1, 0x00,0x00, 0x00,0x01, 0x77,0xFC,
-0x00,0x16, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01, 0x08,0x80, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0xE0,0x01, 0x08,0x80, 0x20,0x32, 0x00,0x00, 0x87,0x02, 0xFF,0x48, 0x00,0x00,
-0x00,0x01, 0xC7,0x38, 0x52,0x00, 0x27,0x38, 0x00,0x04, 0x20,0x3A, 0x00,0x08, 0xE6,0x01,
-0x08,0x38, 0xF6,0x82, 0x00,0x00, 0x77,0xFC, 0x00,0x1D, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01,
-0x08,0x38, 0x00,0x00, 0x00,0x01, 0x77,0xFC, 0x00,0x17, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01,
-0x08,0x39, 0x00,0x00, 0x00,0x01, 0x77,0xFC, 0x00,0x16, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01,
-0x08,0x80, 0x20,0x36, 0x00,0x00, 0xF6,0x82, 0x00,0x01, 0xE0,0x01, 0x08,0x80, 0x20,0x36,
-0x00,0x00, 0xF7,0x02, 0x00,0x00, 0x77,0xFC, 0x00,0x1D, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01,
-0x08,0x78, 0x00,0x00, 0x00,0x01, 0x77,0xFC, 0x00,0x17, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01,
-0x08,0x79, 0x00,0x00, 0x00,0x01, 0x77,0xFC, 0x00,0x16, 0x70,0x3E, 0xFF,0xE1, 0xE6,0x01,
-0x08,0x80, 0x20,0x3A, 0x00,0x00, 0xF7,0x02, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01,
-0x08,0xC1, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x71,0xA0, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x71,0xA0, 0xF7,0x04, 0x71,0xA0, 0xE0,0x01, 0x08,0xC4, 0xF7,0x02,
-0x00,0x01, 0xF7,0x04, 0x71,0x9C, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x71,0x9C, 0xF7,0x04, 0x71,0x9C, 0xE0,0x01, 0x08,0xC4, 0xF7,0x02, 0x00,0x01, 0xF7,0x02,
-0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x09,0x68, 0x00,0x00, 0x00,0x01, 0xF6,0x84,
-0x7B,0x10, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x00, 0x76,0xB5, 0x00,0x1E, 0x76,0xB4,
-0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x39, 0xFF,0xF0, 0x27,0x38, 0x00,0x04, 0x20,0x3A,
-0x00,0x03, 0xE2,0x01, 0x0B,0x50, 0x77,0x39, 0x00,0x02, 0xF6,0x86, 0x09,0x0C, 0xA6,0xB6,
-0x70,0x02, 0x00,0x00, 0x00,0x01, 0xC1,0x34, 0x00,0x00, 0x00,0x01, 0x09,0x1C, 0x00,0x01,
-0x0A,0xE0, 0x00,0x01, 0x0A,0xAC, 0x00,0x01, 0x0B,0x14, 0xF7,0x04, 0x71,0xD0, 0xF6,0x04,
-0x71,0xCC, 0x06,0xB8, 0x00,0x01, 0xC0,0x36, 0x62,0x00, 0xE6,0x01, 0x09,0x38, 0xC7,0x34,
-0x00,0x00, 0xF7,0x02, 0x00,0x00, 0xF5,0x84, 0x71,0xD4, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x5A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x09,0x85, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x71,0xB0, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x71,0xB0, 0xF7,0x04, 0x71,0xB0, 0xF7,0x04, 0x71,0xB4, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x71,0xB4, 0xF7,0x04, 0x71,0xB4, 0xE0,0x01, 0x0B,0x50, 0x00,0x00,
-0x00,0x01, 0xF4,0x84, 0x71,0xC8, 0xF6,0x85, 0x71,0xD0, 0x94,0x96, 0xFF,0xF4, 0xF4,0x84,
-0x7B,0x10, 0xC0,0x36, 0x62,0x00, 0xE6,0x01, 0x09,0xA4, 0x94,0x96, 0xFF,0xEC, 0xF0,0x05,
-0x71,0xD0, 0xF7,0x04, 0x71,0xD0, 0xF0,0x05, 0x71,0xC8, 0x84,0x96, 0xFF,0xEC, 0xC0,0x3A,
-0x5A,0x00, 0x47,0x0C, 0x00,0x01, 0xF7,0x05, 0x71,0xC4, 0x87,0x26, 0x00,0x08, 0x00,0x00,
-0x00,0x01, 0x70,0x3A, 0xFF,0xE1, 0xE6,0x01, 0x09,0xE1, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x71,0x98, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x71,0x98, 0x84,0x96,
-0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x01, 0x0A,0x71, 0x00,0x00,
-0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x05,0x58, 0x97,0x93, 0xFF,0xFC, 0xF6,0x02,
-0x00,0x09, 0x20,0x32, 0x00,0x14, 0xE6,0x01, 0x0A,0x4D, 0x27,0x00, 0x00,0x0C, 0x20,0x3A,
-0x00,0x01, 0xE2,0x01, 0x0A,0x4D, 0xF7,0x06, 0x2D,0xCC, 0xF6,0x84, 0x2E,0xCC, 0x00,0x00,
-0x00,0x01, 0x75,0xB5, 0x00,0x02, 0xB6,0x2E, 0x70,0x02, 0x06,0xB4, 0x00,0x01, 0xF6,0x85,
-0x2E,0xCC, 0x86,0x02, 0xFF,0x34, 0xF7,0x06, 0x2E,0x4C, 0x20,0x36, 0x00,0x1F, 0xE2,0x01,
-0x0A,0x4D, 0xB6,0x2E, 0x70,0x02, 0xF0,0x05, 0x2E,0xCC, 0xF7,0x04, 0x2D,0x68, 0x00,0x00,
-0x00,0x01, 0x87,0x3A, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x3A, 0x00,0x28, 0x00,0x00,
-0x00,0x01, 0x07,0x88, 0x00,0x08, 0xC1,0x38, 0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0xF7,0x04,
-0x71,0xBC, 0x84,0x96, 0xFF,0xEC, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x71,0xBC, 0xF7,0x04,
-0x71,0xBC, 0x86,0xA6, 0x00,0x04, 0x84,0x96, 0xFF,0xF4, 0xF7,0x04, 0x71,0xB8, 0x20,0x26,
-0x00,0x00, 0xC7,0x38, 0x68,0x00, 0xF7,0x05, 0x71,0xB8, 0xE6,0x01, 0x0B,0x51, 0x00,0x00,
-0x00,0x01, 0xE0,0x01, 0x0B,0x5C, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x71,0xC0, 0x00,0x00,
-0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x71,0xC0, 0xF7,0x04, 0x71,0xC0, 0xF4,0x84,
-0x7B,0x10, 0x00,0x00, 0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0xFD,0xCC, 0x97,0x93, 0xFF,0xFC, 0xE0,0x01, 0x0B,0x50, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x71,0xC0, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x71,0xC0, 0xF7,0x04,
-0x71,0xC0, 0xF4,0x84, 0x7B,0x10, 0x00,0x00, 0x00,0x01, 0x94,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0xFF,0x30, 0x97,0x93, 0xFF,0xFC, 0xE0,0x01, 0x0B,0x50, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x71,0xC0, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x71,0xC0, 0xF7,0x04, 0x71,0xC0, 0xF6,0x84, 0x7B,0x10, 0x87,0x02, 0xFF,0x48, 0x00,0x00,
-0x00,0x01, 0xC7,0x38, 0x6A,0x00, 0x27,0x38, 0x00,0x04, 0x97,0x13, 0xFF,0xFC, 0x96,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0xFE,0x48, 0x97,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x05,0x58, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x70,0x80, 0xF7,0x05, 0x7B,0x18, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x05,0x58, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x6F,0x68, 0xF7,0x05, 0x7B,0x18, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x05,0x58, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x7B,0x18, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x6F,0x68, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x06, 0x7B,0x18, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x6F,0xF4, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06,
-0x7B,0x18, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x70,0x80, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x7B,0x18, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x71,0x0C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x00,0x00, 0x00,0x00, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF5,0x02, 0x00,0x04, 0xF5,0x05, 0x76,0x00, 0xF0,0x05,
-0x76,0x08, 0xF0,0x05, 0x76,0x04, 0xF0,0x05, 0x75,0xF8, 0xF5,0x02, 0x00,0x01, 0xF6,0x82,
-0x00,0x00, 0x20,0x36, 0x00,0x04, 0xEC,0x01, 0x0C,0xBC, 0xF5,0x05, 0x75,0xFC, 0xF5,0x8E,
-0x6A,0xF8, 0xF6,0x06, 0x75,0xF8, 0x47,0x2C, 0xFF,0xFC, 0x97,0x32, 0x00,0x18, 0x06,0x30,
-0x00,0x04, 0x06,0xB4, 0x00,0x01, 0xF7,0x04, 0x76,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xEC,0x01, 0x0C,0x99, 0x05,0xAC, 0x21,0x4C, 0xF5,0x06, 0x72,0x18, 0x95,0x13,
-0xFF,0xFC, 0xF5,0x06, 0x76,0x48, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x15,0x48, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x0D,0xF4, 0x95,0x13, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x0E, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x72,0x18, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x0D,0xF4, 0x95,0x13,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x0E, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x72,0xA4, 0x95,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06,
-0x13,0x2C, 0x95,0x13, 0xFF,0xFC, 0xF7,0x82, 0x00,0x01, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06,
-0x73,0x30, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x06, 0x16,0xC8, 0x95,0x13, 0xFF,0xFC, 0xF7,0x82, 0x00,0x01, 0x97,0x93,
-0xFF,0xFC, 0xF5,0x06, 0x73,0xBC, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x18,0x00, 0x95,0x13, 0xFF,0xFC, 0xF7,0x82,
-0x00,0x10, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x74,0x48, 0x95,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x16,0x40, 0x95,0x13,
-0xFF,0xFC, 0xF7,0x82, 0x00,0x10, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06, 0x74,0xD4, 0x95,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF5,0x06,
-0x13,0x2C, 0x95,0x13, 0xFF,0xFC, 0xF5,0x02, 0x00,0x12, 0x95,0x13, 0xFF,0xFC, 0xF5,0x06,
-0x75,0x60, 0x95,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93,
-0xFF,0xFC, 0xF0,0x05, 0x75,0xF0, 0xF0,0x05, 0x75,0xEC, 0xF0,0x05, 0x75,0xF4, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x38, 0xF7,0x04,
-0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x0E,0x28, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01,
-0x0E,0x3D, 0x00,0x00, 0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x15,0xD0, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x01, 0x13,0x18, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x75,0xFC, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x0E,0x59, 0xF6,0x86, 0x75,0xF8, 0xE0,0x01,
-0x0E,0x6C, 0xF6,0x82, 0x00,0x00, 0xF7,0x04, 0x76,0x08, 0x00,0x00, 0x00,0x01, 0x77,0x39,
-0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x86,0xBA, 0x00,0x18, 0xF7,0x04, 0x76,0xFC, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x0E,0x90, 0xF6,0x85, 0x76,0x60, 0xF3,0x06,
-0x76,0x48, 0xF3,0x05, 0x76,0xFC, 0xE0,0x01, 0x0E,0xA4, 0xF7,0x02, 0x00,0x01, 0xF3,0x02,
-0x00,0x10, 0xF3,0x05, 0x76,0xF8, 0xF3,0x06, 0x76,0x48, 0xF3,0x05, 0x77,0x00, 0xF7,0x02,
-0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x13,0x15, 0xF3,0x06, 0x74,0x48, 0xF7,0x04,
-0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x0E,0xD8, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01,
-0x0E,0xED, 0x00,0x00, 0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x16,0x40, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x01, 0x13,0x18, 0x00,0x00, 0x00,0x01, 0xF6,0x84, 0x76,0x60, 0x00,0x00,
-0x00,0x01, 0x87,0x36, 0x00,0x08, 0x00,0x00, 0x00,0x01, 0x70,0x3A, 0xFF,0xE1, 0xE6,0x01,
-0x0F,0x21, 0xF4,0x82, 0x00,0x00, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x00,0xBC, 0x97,0x93, 0xFF,0xFC, 0xE0,0x01, 0x13,0x14, 0xF3,0x06, 0x75,0x60, 0xC3,0xB4,
-0x00,0x00, 0x84,0x1E, 0x00,0x10, 0xF6,0x84, 0x4A,0xA0, 0x23,0x14, 0x00,0x20, 0x93,0x16,
-0xFF,0xC4, 0x94,0x16, 0xFF,0xE0, 0x96,0x96, 0xFF,0xD4, 0x85,0x1E, 0x00,0x14, 0xF7,0x04,
-0x4A,0x9C, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xEC,0x01, 0x10,0x0C, 0x95,0x16,
-0xFF,0xE4, 0x77,0x35, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0xF3,0x06,
-0x4A,0x98, 0xC6,0xB8, 0x30,0x00, 0x06,0xB4, 0x00,0x0C, 0xC5,0x84, 0x00,0x00, 0x87,0x36,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x42,0x00, 0xE6,0x01, 0x0F,0x9C, 0xC6,0x24,
-0x00,0x00, 0x87,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x52,0x00, 0xE6,0x01,
-0x0F,0xA0, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x01,
-0x0F,0xAD, 0x00,0x00, 0x00,0x01, 0xF5,0x82, 0x00,0x00, 0x86,0x36, 0x00,0x00, 0x87,0x16,
-0xFF,0xE0, 0x00,0x00, 0x00,0x01, 0xC0,0x32, 0x72,0x00, 0xE2,0x01, 0x0F,0xE8, 0xF5,0x02,
-0x00,0x00, 0xC0,0x32, 0x72,0x00, 0xE6,0x01, 0x0F,0xF0, 0x20,0x2A, 0x00,0x00, 0x86,0xB6,
-0x00,0x04, 0x87,0x16, 0xFF,0xE4, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x01,
-0x0F,0xF1, 0x20,0x2A, 0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x01,
-0x10,0x01, 0x20,0x2E, 0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x01,
-0x10,0x10, 0x20,0x26, 0x00,0x00, 0xF4,0x82, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x01,
-0x10,0x45, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xD4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9,
-0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4,
-0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xD8, 0xE0,0x01, 0x10,0xB8, 0x96,0x96,
-0xFF,0xDC, 0x27,0x14, 0x00,0x2C, 0x97,0x13, 0xFF,0xFC, 0x83,0x16, 0xFF,0xC4, 0x00,0x00,
-0x00,0x01, 0x93,0x13, 0xFF,0xFC, 0xF3,0x06, 0x4A,0x98, 0x93,0x13, 0xFF,0xFC, 0x93,0x96,
-0xFF,0xCC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96,
-0xFF,0xCC, 0x20,0x22, 0x00,0x00, 0xE6,0x01, 0x10,0xB5, 0xF6,0x02, 0x00,0x01, 0x87,0x16,
-0xFF,0xD4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5,
-0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16,
-0xFF,0xD8, 0x96,0x96, 0xFF,0xDC, 0xF7,0x05, 0x4A,0xA0, 0xE0,0x01, 0x10,0xBC, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x01, 0x10,0xCC, 0xF4,0x82,
-0x00,0x01, 0xE0,0x01, 0x11,0x24, 0xF4,0x82, 0x00,0x00, 0x86,0x96, 0xFF,0xD8, 0x00,0x00,
-0x00,0x01, 0x77,0x35, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0xF6,0x86,
-0x42,0xC8, 0xA6,0x3A, 0x68,0x02, 0xC7,0x38, 0x68,0x00, 0x75,0x39, 0x00,0x1E, 0x75,0x28,
-0xFF,0xE5, 0x05,0xB8, 0x00,0x02, 0x86,0xAE, 0x00,0x00, 0x07,0x38, 0x00,0x04, 0x97,0x16,
-0xFF,0xEC, 0xC6,0x30, 0x57,0xC0, 0x76,0x30, 0xFF,0xF0, 0x96,0x16, 0xFF,0xF4, 0x75,0xAD,
-0x00,0x1E, 0x75,0xAC, 0xFF,0xE5, 0xC6,0xB4, 0x5F,0xC0, 0x76,0xB4, 0xFF,0xF0, 0x96,0x96,
-0xFF,0xF0, 0x20,0x26, 0x00,0x00, 0xE6,0x01, 0x11,0x38, 0xF5,0x82, 0x00,0x00, 0xE0,0x01,
-0x11,0xCC, 0xF6,0x02, 0x00,0x00, 0x86,0x96, 0xFF,0xF0, 0x00,0x00, 0x00,0x01, 0xC7,0x34,
-0x68,0x00, 0xC4,0x9C, 0x72,0x00, 0xC0,0x2E, 0x6A,0x00, 0xEC,0x01, 0x11,0x98, 0xC5,0x24,
-0x00,0x00, 0xC6,0x2C, 0x00,0x00, 0x87,0x16, 0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0xA6,0xB2,
-0x70,0x02, 0x05,0xAC, 0x00,0x01, 0xC7,0x30, 0x70,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38,
-0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB4, 0xFF,0xF0, 0xF6,0xAB, 0x28,0x00, 0x05,0x28,
-0x00,0x02, 0x87,0x16, 0xFF,0xF0, 0x00,0x00, 0x00,0x01, 0xC0,0x2E, 0x72,0x00, 0xEC,0x01,
-0x11,0x59, 0x06,0x30, 0x00,0x02, 0xF3,0x02, 0x00,0x01, 0xF3,0x05, 0x76,0xF4, 0xF6,0x02,
-0x00,0x01, 0x87,0x16, 0xFF,0xF0, 0x86,0x9E, 0x00,0x04, 0xC7,0x38, 0x70,0x00, 0xC7,0x38,
-0x48,0x00, 0xC6,0xB4, 0x70,0x00, 0x87,0x16, 0xFF,0xF4, 0x06,0xB4, 0x00,0x20, 0x97,0x02,
-0xFF,0x6C, 0x94,0x82, 0xFF,0x50, 0x96,0x82, 0xFF,0x58, 0x20,0x32, 0x00,0x00, 0xE6,0x01,
-0x13,0x10, 0x00,0x00, 0x00,0x01, 0xF7,0x04, 0x76,0x5C, 0xF5,0x84, 0x76,0xF8, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x76,0x5C, 0xF7,0x04, 0x76,0x5C, 0x20,0x2E, 0x00,0x21, 0xE2,0x01,
-0x12,0x30, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x01,
-0x12,0x1C, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02, 0x00,0x22, 0xF3,0x05,
-0x76,0xF8, 0xF3,0x04, 0x77,0x00, 0xE0,0x01, 0x12,0x34, 0xF3,0x05, 0x76,0xFC, 0xF0,0x05,
-0x76,0xFC, 0xF7,0x04, 0x75,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01,
-0x12,0x71, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0F, 0x20,0x32,
-0x00,0x44, 0xE6,0x01, 0x12,0x70, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04,
-0x76,0x08, 0xF6,0x84, 0x76,0x00, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x01,
-0x12,0x8C, 0xF7,0x05, 0x76,0x08, 0xF0,0x05, 0x76,0x08, 0xF6,0x84, 0x76,0x08, 0xF7,0x04,
-0x76,0x04, 0xF0,0x05, 0x75,0xF8, 0xF6,0x06, 0x75,0xF8, 0xC0,0x36, 0x72,0x00, 0x47,0x0C,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x12,0xB9, 0xF7,0x05, 0x75,0xFC, 0xE0,0x01,
-0x12,0xC8, 0xF7,0x02, 0x00,0x00, 0x77,0x35, 0x00,0x02, 0xC7,0x38, 0x60,0x00, 0x87,0x3A,
-0x00,0x18, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x13,0x09, 0xF7,0x05,
-0x76,0x60, 0xF7,0x04, 0x2D,0x38, 0xF3,0x06, 0x72,0xA4, 0xF3,0x05, 0x76,0x48, 0xF6,0x86,
-0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02,
-0x00,0x0E, 0x20,0x32, 0x00,0x44, 0xE6,0x01, 0x13,0x18, 0xB3,0x3A, 0x68,0x02, 0xE0,0x01,
-0x13,0x18, 0xF0,0x05, 0x2D,0x38, 0xE0,0x01, 0x13,0x14, 0xF3,0x06, 0x72,0x18, 0xF3,0x06,
-0x73,0x30, 0xF3,0x05, 0x76,0x48, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF7,0x04, 0x76,0x60, 0x00,0x00, 0x00,0x01, 0x86,0xBA, 0x00,0x04, 0xF7,0x04,
-0x76,0x54, 0x00,0x00, 0x00,0x01, 0xC7,0x38, 0x68,0x00, 0xF7,0x05, 0x76,0x54, 0xF7,0x04,
-0x76,0x58, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x76,0x58, 0xF7,0x04,
-0x75,0xF8, 0xF6,0x84, 0x76,0x58, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x13,0x9D, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x02, 0x00,0x0F, 0x20,0x32, 0x00,0x44, 0xE6,0x01,
-0x13,0x9C, 0xB5,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x76,0x08, 0xF6,0x84,
-0x76,0x00, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x01, 0x13,0xB8, 0xF7,0x05,
-0x76,0x08, 0xF0,0x05, 0x76,0x08, 0xF7,0x04, 0x76,0x08, 0xF6,0x84, 0x76,0x04, 0xF0,0x05,
-0x75,0xF8, 0xF5,0x84, 0x76,0xF8, 0xC0,0x3A, 0x6A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x2E,
-0x00,0x21, 0xE2,0x01, 0x14,0x14, 0xF7,0x05, 0x75,0xFC, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86,
-0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32,
-0x00,0x44, 0xE6,0x01, 0x14,0x00, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x02,
-0x00,0x22, 0xF5,0x05, 0x76,0xF8, 0xF5,0x04, 0x77,0x00, 0xE0,0x01, 0x14,0x18, 0xF5,0x05,
-0x76,0xFC, 0xF0,0x05, 0x76,0xFC, 0xF7,0x04, 0x75,0xEC, 0xF5,0x06, 0x72,0x18, 0x20,0x3A,
-0x00,0x00, 0xE6,0x01, 0x14,0x40, 0xF5,0x05, 0x76,0x48, 0xF7,0x04, 0x75,0xF0, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x14,0x55, 0x00,0x00, 0x00,0x01, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x15,0xD0, 0x97,0x93, 0xFF,0xFC, 0xE0,0x01, 0x14,0xC4, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x75,0xFC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01,
-0x14,0x71, 0xF6,0x86, 0x75,0xF8, 0xE0,0x01, 0x14,0x88, 0xF7,0x02, 0x00,0x00, 0xF7,0x04,
-0x76,0x08, 0x00,0x00, 0x00,0x01, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x87,0x3A,
-0x00,0x18, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x14,0xC5, 0xF7,0x05,
-0x76,0x60, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x02, 0x00,0x0E, 0x20,0x32, 0x00,0x44, 0xE6,0x01,
-0x14,0xBC, 0xB5,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF5,0x06, 0x72,0xA4, 0xF5,0x05,
-0x76,0x48, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04,
-0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x15,0x40, 0xF4,0x02,
-0x00,0x00, 0x86,0x96, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xF6,0x85, 0x75,0xEC, 0x86,0x96,
-0x00,0x08, 0x00,0x00, 0x00,0x01, 0xF6,0x85, 0x7B,0x38, 0x86,0x96, 0x00,0x00, 0xF7,0x04,
-0x76,0x48, 0xF6,0x85, 0x7B,0x30, 0xF6,0x86, 0x72,0x18, 0xC0,0x3A, 0x6A,0x00, 0x47,0x0C,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x15,0x41, 0xF4,0x02, 0x00,0x01, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x15,0xD0, 0x97,0x93, 0xFF,0xFC, 0xF4,0x02, 0x00,0x01, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04, 0x75,0xF4, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x15,0xBC, 0xF4,0x02, 0x00,0x00, 0x86,0x96,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0xF6,0x85, 0x75,0xF0, 0x86,0x96, 0x00,0x08, 0x00,0x00,
-0x00,0x01, 0xF6,0x85, 0x7B,0x48, 0x86,0x96, 0x00,0x00, 0xF7,0x04, 0x76,0x48, 0xF6,0x85,
-0x7B,0x40, 0xF6,0x86, 0x72,0x18, 0xC0,0x3A, 0x6A,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x01, 0x15,0xBD, 0xF4,0x02, 0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x15,0xD0, 0x97,0x93, 0xFF,0xFC, 0xF4,0x02, 0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04, 0x76,0xFC, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x01, 0x15,0xFC, 0xF6,0x82, 0x00,0x10, 0xF6,0x86, 0x76,0x48, 0xF6,0x85,
-0x76,0xFC, 0xE0,0x01, 0x16,0x0C, 0xF7,0x02, 0x00,0x01, 0xF6,0x85, 0x76,0xF8, 0xF6,0x86,
-0x76,0x48, 0xF6,0x85, 0x77,0x00, 0xF7,0x02, 0x00,0x00, 0x20,0x3A, 0x00,0x00, 0xE6,0x01,
-0x16,0x20, 0xF6,0x86, 0x74,0xD4, 0xE0,0x01, 0x16,0x2C, 0xF6,0x85, 0x76,0x48, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x16,0x40, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF6,0x04, 0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0xE6,0x01, 0x16,0x85, 0xF7,0x02, 0x00,0x01, 0xF7,0x05, 0x75,0xF4, 0xF6,0x84,
-0x7B,0x48, 0xF7,0x05, 0x76,0xF4, 0xF7,0x04, 0x7B,0x40, 0xC6,0xB0, 0x68,0x00, 0x26,0xB4,
-0x00,0x04, 0x97,0x02, 0xFF,0x6C, 0x96,0x02, 0xFF,0x50, 0xE0,0x01, 0x16,0xA8, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x75,0xEC, 0xF6,0x84, 0x7B,0x38, 0xF5,0x82, 0x00,0x01, 0xF5,0x85,
-0x76,0xF4, 0xF6,0x04, 0x7B,0x30, 0xC6,0xB8, 0x68,0x00, 0x26,0xB4, 0x00,0x04, 0x96,0x02,
-0xFF,0x6C, 0x97,0x02, 0xFF,0x50, 0x96,0x82, 0xFF,0x58, 0xF5,0x86, 0x73,0xBC, 0xF5,0x85,
-0x76,0x48, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04,
-0x7B,0x28, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0xF7,0x05, 0x7B,0x28, 0xF7,0x04,
-0x75,0xF4, 0xF6,0x84, 0x7B,0x28, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x17,0x21, 0x00,0x00,
-0x00,0x01, 0xF0,0x05, 0x75,0xF4, 0xF7,0x04, 0x75,0xEC, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x01, 0x17,0x25, 0xF0,0x05, 0x75,0xF0, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x16,0x40, 0x97,0x93, 0xFF,0xFC, 0xE0,0x01, 0x17,0xEC, 0x00,0x00, 0x00,0x01, 0xF0,0x05,
-0x75,0xEC, 0xF7,0x04, 0x75,0xFC, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01,
-0x17,0x41, 0xF6,0x86, 0x75,0xF8, 0xE0,0x01, 0x17,0x58, 0xF7,0x02, 0x00,0x00, 0xF7,0x04,
-0x76,0x08, 0x00,0x00, 0x00,0x01, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x87,0x3A,
-0x00,0x18, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x17,0x95, 0xF7,0x05,
-0x76,0x60, 0xF7,0x04, 0x2D,0x38, 0xF6,0x86, 0x2C,0x28, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF5,0x02, 0x00,0x0E, 0x20,0x32, 0x00,0x44, 0xE6,0x01,
-0x17,0x8C, 0xB5,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xE0,0x01, 0x17,0x98, 0xF5,0x06,
-0x72,0xA4, 0xF5,0x06, 0x72,0x18, 0xF5,0x05, 0x76,0x48, 0xF5,0x84, 0x76,0xF8, 0x00,0x00,
-0x00,0x01, 0x20,0x2E, 0x00,0x21, 0xE2,0x01, 0x17,0xE8, 0xF6,0x86, 0x2C,0x28, 0xF7,0x04,
-0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39,
-0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x01, 0x17,0xD4, 0xB5,0xBA, 0x68,0x02, 0xF0,0x05,
-0x2D,0x38, 0xF5,0x02, 0x00,0x22, 0xF5,0x05, 0x76,0xF8, 0xF5,0x04, 0x77,0x00, 0xE0,0x01,
-0x17,0xEC, 0xF5,0x05, 0x76,0xFC, 0xF0,0x05, 0x76,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x38, 0xF7,0x04, 0x75,0xEC, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x18,0x34, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x75,0xF0, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x18,0x49, 0x00,0x00,
-0x00,0x01, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x16,0x40, 0x97,0x93, 0xFF,0xFC, 0xE0,0x01,
-0x1C,0x74, 0x00,0x00, 0x00,0x01, 0xF6,0x84, 0x76,0x60, 0x00,0x00, 0x00,0x01, 0x87,0x36,
-0x00,0x08, 0x00,0x00, 0x00,0x01, 0x70,0x3A, 0xFF,0xE1, 0xE6,0x01, 0x18,0x7D, 0xF4,0x82,
-0x00,0x00, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x00,0xBC, 0x97,0x93,
-0xFF,0xFC, 0xE0,0x01, 0x1C,0x70, 0xF3,0x06, 0x75,0x60, 0xC3,0xB4, 0x00,0x00, 0x84,0x1E,
-0x00,0x10, 0xF6,0x84, 0x4A,0xA0, 0x23,0x14, 0x00,0x20, 0x93,0x16, 0xFF,0xC4, 0x94,0x16,
-0xFF,0xE0, 0x96,0x96, 0xFF,0xD4, 0x85,0x1E, 0x00,0x14, 0xF7,0x04, 0x4A,0x9C, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xEC,0x01, 0x19,0x68, 0x95,0x16, 0xFF,0xE4, 0x77,0x35,
-0x00,0x01, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0xF3,0x06, 0x4A,0x98, 0xC6,0xB8,
-0x30,0x00, 0x06,0xB4, 0x00,0x0C, 0xC5,0x84, 0x00,0x00, 0x87,0x36, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0xC0,0x3A, 0x42,0x00, 0xE6,0x01, 0x18,0xF8, 0xC6,0x24, 0x00,0x00, 0x87,0x36,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x52,0x00, 0xE6,0x01, 0x18,0xFC, 0x20,0x32,
-0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x01, 0x19,0x09, 0x00,0x00,
-0x00,0x01, 0xF5,0x82, 0x00,0x00, 0x86,0x36, 0x00,0x00, 0x87,0x16, 0xFF,0xE0, 0x00,0x00,
-0x00,0x01, 0xC0,0x32, 0x72,0x00, 0xE2,0x01, 0x19,0x44, 0xF5,0x02, 0x00,0x00, 0xC0,0x32,
-0x72,0x00, 0xE6,0x01, 0x19,0x4C, 0x20,0x2A, 0x00,0x00, 0x86,0xB6, 0x00,0x04, 0x87,0x16,
-0xFF,0xE4, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE2,0x01, 0x19,0x4D, 0x20,0x2A,
-0x00,0x00, 0xF5,0x02, 0x00,0x01, 0x20,0x2A, 0x00,0x00, 0xE6,0x01, 0x19,0x5D, 0x20,0x2E,
-0x00,0x00, 0xF5,0x82, 0x00,0x01, 0x20,0x2E, 0x00,0x00, 0xE6,0x01, 0x19,0x6C, 0x20,0x26,
-0x00,0x00, 0xF4,0x82, 0x00,0x01, 0x20,0x26, 0x00,0x00, 0xE6,0x01, 0x19,0xA1, 0xF6,0x02,
-0x00,0x01, 0x87,0x16, 0xFF,0xD4, 0xF3,0x06, 0x4A,0x98, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4,
-0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4, 0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6,
-0x00,0x00, 0x97,0x16, 0xFF,0xD8, 0xE0,0x01, 0x1A,0x14, 0x96,0x96, 0xFF,0xDC, 0x27,0x14,
-0x00,0x2C, 0x97,0x13, 0xFF,0xFC, 0x83,0x16, 0xFF,0xC4, 0x00,0x00, 0x00,0x01, 0x93,0x13,
-0xFF,0xFC, 0xF3,0x06, 0x4A,0x98, 0x93,0x13, 0xFF,0xFC, 0x93,0x96, 0xFF,0xCC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x83,0x96, 0xFF,0xCC, 0x20,0x22,
-0x00,0x00, 0xE6,0x01, 0x1A,0x11, 0xF6,0x02, 0x00,0x01, 0x87,0x16, 0xFF,0xD4, 0xF3,0x06,
-0x4A,0x98, 0x76,0xB9, 0x00,0x01, 0xC6,0xB4, 0x70,0x00, 0x76,0xB5, 0x00,0x02, 0xC6,0xB4,
-0x30,0x00, 0x06,0xB4, 0x00,0x14, 0x86,0xB6, 0x00,0x00, 0x97,0x16, 0xFF,0xD8, 0x96,0x96,
-0xFF,0xDC, 0xF7,0x05, 0x4A,0xA0, 0xE0,0x01, 0x1A,0x18, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x00, 0x20,0x32, 0x00,0x00, 0xE6,0x01, 0x1A,0x28, 0xF4,0x82, 0x00,0x01, 0xE0,0x01,
-0x1A,0x80, 0xF4,0x82, 0x00,0x00, 0x86,0x96, 0xFF,0xD8, 0x00,0x00, 0x00,0x01, 0x77,0x35,
-0x00,0x02, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0x00,0x02, 0xF6,0x86, 0x42,0xC8, 0xA6,0x3A,
-0x68,0x02, 0xC7,0x38, 0x68,0x00, 0x75,0x39, 0x00,0x1E, 0x75,0x28, 0xFF,0xE5, 0x05,0xB8,
-0x00,0x02, 0x86,0xAE, 0x00,0x00, 0x07,0x38, 0x00,0x04, 0x97,0x16, 0xFF,0xEC, 0xC6,0x30,
-0x57,0xC0, 0x76,0x30, 0xFF,0xF0, 0x96,0x16, 0xFF,0xF4, 0x75,0xAD, 0x00,0x1E, 0x75,0xAC,
-0xFF,0xE5, 0xC6,0xB4, 0x5F,0xC0, 0x76,0xB4, 0xFF,0xF0, 0x96,0x96, 0xFF,0xF0, 0x20,0x26,
-0x00,0x00, 0xE6,0x01, 0x1A,0x94, 0xF5,0x82, 0x00,0x00, 0xE0,0x01, 0x1B,0x28, 0xF6,0x02,
-0x00,0x00, 0x86,0x96, 0xFF,0xF0, 0x00,0x00, 0x00,0x01, 0xC7,0x34, 0x68,0x00, 0xC4,0x9C,
-0x72,0x00, 0xC0,0x2E, 0x6A,0x00, 0xEC,0x01, 0x1A,0xF4, 0xC5,0x24, 0x00,0x00, 0xC6,0x2C,
-0x00,0x00, 0x87,0x16, 0xFF,0xEC, 0x00,0x00, 0x00,0x01, 0xA6,0xB2, 0x70,0x02, 0x05,0xAC,
-0x00,0x01, 0xC7,0x30, 0x70,0x00, 0x77,0x39, 0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4,
-0x77,0xC0, 0x76,0xB4, 0xFF,0xF0, 0xF6,0xAB, 0x28,0x00, 0x05,0x28, 0x00,0x02, 0x87,0x16,
-0xFF,0xF0, 0x00,0x00, 0x00,0x01, 0xC0,0x2E, 0x72,0x00, 0xEC,0x01, 0x1A,0xB5, 0x06,0x30,
-0x00,0x02, 0xF3,0x02, 0x00,0x01, 0xF3,0x05, 0x76,0xF4, 0xF6,0x02, 0x00,0x01, 0x87,0x16,
-0xFF,0xF0, 0x86,0x9E, 0x00,0x04, 0xC7,0x38, 0x70,0x00, 0xC7,0x38, 0x48,0x00, 0xC6,0xB4,
-0x70,0x00, 0x87,0x16, 0xFF,0xF4, 0x06,0xB4, 0x00,0x20, 0x97,0x02, 0xFF,0x6C, 0x94,0x82,
-0xFF,0x50, 0x96,0x82, 0xFF,0x58, 0x20,0x32, 0x00,0x00, 0xE6,0x01, 0x1C,0x6C, 0x00,0x00,
-0x00,0x01, 0xF7,0x04, 0x76,0x5C, 0xF5,0x84, 0x76,0xF8, 0x07,0x38, 0x00,0x01, 0xF7,0x05,
-0x76,0x5C, 0xF7,0x04, 0x76,0x5C, 0x20,0x2E, 0x00,0x21, 0xE2,0x01, 0x1B,0x8C, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x32, 0x00,0x44, 0xE6,0x01, 0x1B,0x78, 0xB5,0xBA,
-0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF3,0x02, 0x00,0x22, 0xF3,0x05, 0x76,0xF8, 0xF3,0x04,
-0x77,0x00, 0xE0,0x01, 0x1B,0x90, 0xF3,0x05, 0x76,0xFC, 0xF0,0x05, 0x76,0xFC, 0xF7,0x04,
-0x75,0xF8, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x1B,0xCD, 0xF6,0x86,
-0x2C,0x28, 0xF7,0x04, 0x2D,0x38, 0x00,0x00, 0x00,0x01, 0x06,0x38, 0x00,0x01, 0xF6,0x05,
-0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0F, 0x20,0x32, 0x00,0x44, 0xE6,0x01,
-0x1B,0xCC, 0xB3,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0xF7,0x04, 0x76,0x08, 0xF6,0x84,
-0x76,0x00, 0x07,0x38, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0xE6,0x01, 0x1B,0xE8, 0xF7,0x05,
-0x76,0x08, 0xF0,0x05, 0x76,0x08, 0xF6,0x84, 0x76,0x08, 0xF7,0x04, 0x76,0x04, 0xF0,0x05,
-0x75,0xF8, 0xF6,0x06, 0x75,0xF8, 0xC0,0x36, 0x72,0x00, 0x47,0x0C, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x01, 0x1C,0x15, 0xF7,0x05, 0x75,0xFC, 0xE0,0x01, 0x1C,0x24, 0xF7,0x02,
-0x00,0x00, 0x77,0x35, 0x00,0x02, 0xC7,0x38, 0x60,0x00, 0x87,0x3A, 0x00,0x18, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x1C,0x65, 0xF7,0x05, 0x76,0x60, 0xF7,0x04,
-0x2D,0x38, 0xF3,0x06, 0x72,0xA4, 0xF3,0x05, 0x76,0x48, 0xF6,0x86, 0x2C,0x28, 0x06,0x38,
-0x00,0x01, 0xF6,0x05, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0xF3,0x02, 0x00,0x0E, 0x20,0x32,
-0x00,0x44, 0xE6,0x01, 0x1C,0x74, 0xB3,0x3A, 0x68,0x02, 0xE0,0x01, 0x1C,0x74, 0xF0,0x05,
-0x2D,0x38, 0xE0,0x01, 0x1C,0x70, 0xF3,0x06, 0x72,0x18, 0xF3,0x06, 0x73,0x30, 0xF3,0x05,
-0x76,0x48, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06,
-0x76,0x48, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x72,0x18, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x76,0x48, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x72,0xA4, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x76,0x48, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x73,0x30, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x06, 0x76,0x48, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x73,0xBC, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06,
-0x76,0x48, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06, 0x74,0x48, 0x97,0x13, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x76,0x48, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x74,0xD4, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x76,0x48, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x75,0x60, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF6,0x86,
-0x76,0x68, 0x96,0x93, 0xFF,0xFC, 0xF6,0x86, 0x77,0x04, 0x96,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93, 0xFF,0xFC, 0xF6,0x86, 0x1D,0xD4, 0x96,0x93,
-0xFF,0xFC, 0x90,0x13, 0xFF,0xFC, 0xF6,0x86, 0x76,0x68, 0x96,0x93, 0xFF,0xFC, 0x07,0x88,
-0x00,0x08, 0xE0,0x00, 0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF7,0x02, 0x00,0x22, 0xF7,0x05,
-0x76,0xF4, 0xF7,0x05, 0x76,0xF8, 0xF0,0x05, 0x76,0xFC, 0xF0,0x05, 0x77,0x00, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04, 0x76,0xF4, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x22, 0xE6,0x01, 0x1E,0x01, 0x00,0x00, 0x00,0x01, 0x97,0x13,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x84, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x77,0x04, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x76,0x68, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x00,0x00, 0x00,0x00, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF6,0x86, 0x78,0x10, 0x96,0x93, 0xFF,0xFC, 0xF6,0x86,
-0x78,0xA4, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93,
-0xFF,0xFC, 0xF6,0x86, 0x1F,0xBC, 0x96,0x93, 0xFF,0xFC, 0xF6,0x82, 0x00,0x14, 0x96,0x93,
-0xFF,0xFC, 0xF6,0x86, 0x78,0x10, 0x96,0x93, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0xF0,0x05, 0x78,0x9C, 0x90,0x02, 0xFF,0x34, 0xF7,0x02,
-0x7F,0xFF, 0xF7,0x05, 0x78,0xA0, 0x97,0x02, 0xFF,0x30, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF6,0x04, 0x78,0x9C, 0x87,0x16, 0x00,0x00, 0x84,0x96,
-0x00,0x08, 0xF5,0x86, 0x77,0x10, 0x87,0x3A, 0x00,0x08, 0xF6,0x86, 0x21,0x8C, 0x75,0x39,
-0x00,0x04, 0x77,0x39, 0x00,0x02, 0xA7,0x3A, 0x68,0x02, 0x20,0x32, 0x00,0x00, 0xC6,0xA8,
-0x58,0x00, 0x84,0x16, 0x00,0x04, 0xC6,0x30, 0x75,0x80, 0x94,0x36, 0x00,0x04, 0xB4,0xAA,
-0x58,0x02, 0x87,0x36, 0x00,0x08, 0xF6,0x05, 0x78,0x9C, 0x07,0x38, 0x00,0x01, 0xE6,0x01,
-0x1F,0x2D, 0x97,0x36, 0x00,0x08, 0x87,0x02, 0xFF,0x30, 0x00,0x00, 0x00,0x01, 0xC0,0x3A,
-0x4A,0x00, 0xEE,0x01, 0x1F,0x35, 0x00,0x00, 0x00,0x01, 0xF4,0x85, 0x78,0xA0, 0x94,0x82,
-0xFF,0x30, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x85,0x96,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x87,0x2E, 0x00,0x08, 0xF6,0x86, 0x21,0x8C, 0x77,0x39,
-0x00,0x02, 0xA7,0x3A, 0x68,0x02, 0xF6,0x04, 0x78,0x9C, 0xC7,0x04, 0x76,0x00, 0x86,0xAE,
-0x00,0x08, 0xC6,0x30, 0x74,0x00, 0xF7,0x06, 0x77,0x10, 0xF6,0x05, 0x78,0x9C, 0x76,0xB5,
-0x00,0x04, 0xC6,0xB4, 0x70,0x00, 0x87,0x36, 0x00,0x08, 0x20,0x32, 0x00,0x00, 0x07,0x38,
-0x00,0x01, 0xE6,0x01, 0x1F,0xA8, 0x97,0x36, 0x00,0x08, 0xF7,0x02, 0x7F,0xFF, 0xF7,0x05,
-0x78,0xA0, 0x97,0x02, 0xFF,0x30, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0x22,0x10, 0x00,0x08, 0xF7,0x04, 0x78,0x9C, 0x00,0x00, 0x00,0x01, 0x20,0x3A,
-0x00,0x00, 0xE6,0x01, 0x20,0xD1, 0xF6,0x02, 0x7F,0xFF, 0x96,0x16, 0xFF,0xF4, 0xF6,0x84,
-0x2D,0x40, 0xF6,0x06, 0x77,0x10, 0x26,0xB4, 0x00,0x01, 0x77,0x35, 0x00,0x04, 0xC4,0xB8,
-0x60,0x00, 0xC3,0x38, 0x00,0x00, 0x74,0x35, 0x00,0x02, 0xF6,0x06, 0x77,0x10, 0xC0,0x26,
-0x62,0x00, 0xEC,0x01, 0x20,0xC1, 0xF6,0x06, 0x21,0x8C, 0xF3,0x84, 0x78,0x9C, 0xA7,0x22,
-0x60,0x02, 0x00,0x00, 0x00,0x01, 0xC0,0x1E, 0x74,0x00, 0xE6,0x01, 0x20,0xB1, 0x00,0x00,
-0x00,0x01, 0x86,0xA6, 0x00,0x00, 0xF7,0x04, 0x78,0xA0, 0x00,0x00, 0x00,0x01, 0xC6,0xB4,
-0x72,0x00, 0x20,0x36, 0x00,0x00, 0xEE,0x01, 0x20,0x98, 0x96,0xA6, 0x00,0x00, 0xF7,0x04,
-0x2D,0x38, 0xF6,0x06, 0x77,0x10, 0xC5,0x18, 0x60,0x00, 0xF6,0x86, 0x2C,0x28, 0x86,0x2A,
-0x00,0x04, 0x05,0xB8, 0x00,0x01, 0xF5,0x85, 0x2D,0x38, 0x77,0x39, 0x00,0x02, 0x20,0x2E,
-0x00,0x44, 0xE6,0x01, 0x20,0x70, 0xB6,0x3A, 0x68,0x02, 0xF0,0x05, 0x2D,0x38, 0x86,0x2A,
-0x00,0x08, 0x00,0x00, 0x00,0x01, 0x96,0x2A, 0x00,0x0C, 0xF6,0x06, 0x21,0x8C, 0xA7,0x22,
-0x60,0x02, 0x00,0x00, 0x00,0x01, 0xC7,0x04, 0x76,0x00, 0xC7,0x1C, 0x74,0x00, 0xE0,0x01,
-0x20,0xB0, 0xF7,0x05, 0x78,0x9C, 0x86,0x16, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x62,0x00, 0xEC,0x01, 0x20,0xB0, 0x00,0x00, 0x00,0x01, 0x96,0x96, 0xFF,0xF4, 0x24,0xA4,
-0x00,0x10, 0x23,0x18, 0x00,0x10, 0xE0,0x01, 0x1F,0xFC, 0x24,0x20, 0x00,0x04, 0x86,0x16,
-0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0xF6,0x05, 0x78,0xA0, 0x96,0x02, 0xFF,0x30, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x87,0x16, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x87,0x3A, 0x00,0x08, 0xF6,0x86, 0x77,0x10, 0x77,0x39, 0x00,0x04, 0xC7,0x38,
-0x68,0x00, 0x86,0xBA, 0x00,0x0C, 0x87,0x3A, 0x00,0x08, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0x44,0x0C, 0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x04, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF7,0x02, 0x00,0x0F, 0x20,0x3A, 0x00,0x00, 0xEC,0x01, 0x21,0x5D, 0xF6,0x86,
-0x77,0x18, 0x90,0x36, 0x00,0x00, 0x27,0x38, 0x00,0x01, 0xC6,0x04, 0x00,0x00, 0xC0,0x3A,
-0x62,0x00, 0xE6,0x01, 0x21,0x44, 0x06,0xB4, 0x00,0x10, 0xF6,0x06, 0x78,0xA4, 0x96,0x13,
-0xFF,0xFC, 0xF6,0x06, 0x78,0x10, 0x96,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x00,0x00, 0x00,0x01, 0x00,0x00,
-0x00,0x02, 0x00,0x00, 0x00,0x04, 0x00,0x00, 0x00,0x08, 0x00,0x00, 0x00,0x10, 0x00,0x00,
-0x00,0x20, 0x00,0x00, 0x00,0x40, 0x00,0x00, 0x00,0x80, 0x00,0x00, 0x01,0x00, 0x00,0x00,
-0x02,0x00, 0x00,0x00, 0x04,0x00, 0x00,0x00, 0x08,0x00, 0x00,0x00, 0x10,0x00, 0x00,0x00,
-0x20,0x00, 0x00,0x00, 0x40,0x00, 0x00,0x00, 0x80,0x00, 0x00,0x00, 0x00,0x00, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x78,0xB0, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x79,0xCC, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x15,0x48, 0x97,0x93,
-0xFF,0xFC, 0xF7,0x06, 0x22,0x2C, 0x97,0x13, 0xFF,0xFC, 0xF7,0x02, 0x00,0x15, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x78,0xB0, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x16,0x1C, 0x97,0x93, 0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14,
-0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90,
-0x00,0x08, 0xF6,0x84, 0x6F,0x44, 0x00,0x00, 0x00,0x01, 0x87,0x36, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x20,0x3A, 0x00,0x02, 0xE6,0x01, 0x22,0x70, 0xF6,0x02, 0x00,0x00, 0x87,0x36,
-0x0E,0xF4, 0x86,0xB6, 0x0E,0xF8, 0x00,0x00, 0x00,0x01, 0xC0,0x3A, 0x6A,0x00, 0x47,0x0C,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x22,0x78, 0x20,0x32, 0x00,0x00, 0xF6,0x02,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x01, 0x22,0x94, 0x00,0x00, 0x00,0x01, 0xF7,0x04,
-0x32,0xE8, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x22,0xB1, 0xF5,0x82,
-0x03,0xE8, 0x0F,0x81, 0x40,0x00, 0xF7,0x04, 0x79,0xC8, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0xF7,0x05, 0x79,0xC8, 0xF7,0x04, 0x79,0xC8, 0xF5,0x82, 0x03,0xE8, 0x95,0x93,
-0xFF,0xFC, 0xF5,0x82, 0x00,0x15, 0x95,0x93, 0xFF,0xFC, 0xF5,0x86, 0x79,0xCC, 0x95,0x93,
-0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x1E,0xC0, 0x97,0x93, 0xFF,0xFC, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x06, 0x79,0xCC, 0x97,0x13,
-0xFF,0xFC, 0xF7,0x06, 0x78,0xB0, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00,
-0x14,0xF4, 0x97,0x93, 0xFF,0xFC, 0xF7,0x06, 0x79,0xCC, 0x97,0x13, 0xFF,0xFC, 0xF7,0x06,
-0x79,0x3C, 0x97,0x13, 0xFF,0xFC, 0x07,0x88, 0x00,0x08, 0xE0,0x00, 0x14,0xF4, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC1,0x3C, 0x00,0x00, 0x02,0x10, 0x00,0x04, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x0C, 0x85,0x96, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x86,0xAE, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x01,
-0x23,0x84, 0x27,0x14, 0x00,0x0C, 0x87,0x2E, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x01, 0x97,0x2E, 0x00,0x04, 0x87,0x2E, 0x00,0x04, 0xE0,0x01, 0x24,0x34, 0x96,0x96,
-0xFF,0xF4, 0x97,0x13, 0xFF,0xFC, 0x85,0x16, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x95,0x13,
-0xFF,0xFC, 0x95,0x93, 0xFF,0xFC, 0x95,0x96, 0xFF,0xEC, 0x07,0x88, 0x00,0x08, 0xE0,0x01,
-0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x85,0x96, 0xFF,0xEC, 0x20,0x22, 0x00,0x00, 0xE6,0x01,
-0x24,0x34, 0x00,0x00, 0x00,0x01, 0x86,0xAE, 0x00,0x04, 0x86,0x16, 0xFF,0xF4, 0x00,0x00,
-0x00,0x01, 0xC0,0x36, 0x62,0x00, 0xEE,0x01, 0x24,0x21, 0x77,0x35, 0x00,0x01, 0xC7,0x38,
-0x68,0x00, 0x77,0x39, 0x00,0x02, 0xC6,0xB8, 0x58,0x00, 0x77,0x31, 0x00,0x01, 0xC7,0x38,
-0x60,0x00, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x58,0x00, 0x85,0x36, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x95,0x36, 0x00,0x0C, 0x85,0x36, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x95,0x36,
-0x00,0x10, 0x85,0x36, 0x00,0x08, 0x00,0x00, 0x00,0x01, 0x95,0x36, 0x00,0x14, 0x26,0xB4,
-0x00,0x0C, 0xC0,0x36, 0x72,0x00, 0xEE,0x01, 0x23,0xEC, 0x00,0x00, 0x00,0x01, 0x87,0x2E,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x07,0x38, 0x00,0x01, 0x97,0x2E, 0x00,0x04, 0x87,0x2E,
-0x00,0x04, 0x86,0x96, 0xFF,0xF4, 0x85,0x16, 0x00,0x04, 0x77,0x35, 0x00,0x01, 0xC7,0x38,
-0x68,0x00, 0x77,0x39, 0x00,0x02, 0xC7,0x2C, 0x70,0x00, 0x85,0x2A, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x95,0x3A, 0x00,0x0C, 0x85,0x16, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x85,0x2A,
-0x00,0x04, 0x00,0x00, 0x00,0x01, 0x95,0x3A, 0x00,0x10, 0x85,0x16, 0x00,0x08, 0xF4,0x02,
-0x00,0x01, 0x95,0x3A, 0x00,0x14, 0x96,0xAE, 0x00,0x08, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x0C, 0x85,0x96, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x84,0x2E, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x20,0x22, 0x00,0x00, 0xE6,0x01,
-0x25,0x55, 0x27,0x14, 0x00,0x0C, 0x97,0x13, 0xFF,0xFC, 0x85,0x16, 0x00,0x04, 0x00,0x00,
-0x00,0x01, 0x95,0x13, 0xFF,0xFC, 0x95,0x93, 0xFF,0xFC, 0x95,0x96, 0xFF,0xEC, 0x07,0x88,
-0x00,0x08, 0xE0,0x01, 0x25,0x68, 0x97,0x93, 0xFF,0xFC, 0x85,0x96, 0xFF,0xEC, 0x20,0x22,
-0x00,0x00, 0xE6,0x01, 0x25,0x55, 0x00,0x00, 0x00,0x01, 0x86,0x16, 0xFF,0xF4, 0x00,0x00,
-0x00,0x01, 0x20,0x32, 0x00,0x00, 0xEE,0x01, 0x25,0x45, 0x77,0x31, 0x00,0x01, 0xC6,0xAC,
-0x00,0x00, 0xC7,0x38, 0x60,0x00, 0x77,0x39, 0x00,0x02, 0xC7,0x38, 0x58,0x00, 0x85,0x36,
-0x00,0x18, 0x00,0x00, 0x00,0x01, 0x95,0x36, 0x00,0x0C, 0x85,0x36, 0x00,0x1C, 0x00,0x00,
-0x00,0x01, 0x95,0x36, 0x00,0x10, 0x85,0x36, 0x00,0x20, 0x00,0x00, 0x00,0x01, 0x95,0x36,
-0x00,0x14, 0x06,0xB4, 0x00,0x0C, 0xC0,0x36, 0x72,0x00, 0xEC,0x01, 0x25,0x11, 0x00,0x00,
-0x00,0x01, 0x87,0x2E, 0x00,0x04, 0xF4,0x02, 0x00,0x01, 0x27,0x38, 0x00,0x01, 0x97,0x2E,
-0x00,0x04, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x08, 0x83,0x96, 0x00,0x04, 0x83,0x16, 0x00,0x00, 0xC5,0x00, 0x00,0x00, 0x84,0x1A,
-0x00,0x04, 0xC4,0xA8, 0x00,0x00, 0x94,0x16, 0xFF,0xF4, 0xC0,0x26, 0x42,0x00, 0xE6,0x01,
-0x26,0xD1, 0x00,0x00, 0x00,0x01, 0x83,0x16, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0xC0,0x2A,
-0x32,0x00, 0xE6,0x01, 0x26,0xD1, 0xC7,0x20, 0x4A,0x00, 0x95,0x16, 0xFF,0xF4, 0x76,0xB8,
-0xFF,0xE1, 0xC7,0x38, 0x68,0x00, 0x77,0x39, 0xFF,0xFF, 0xC5,0x24, 0x70,0x00, 0x77,0x29,
-0x00,0x01, 0xC7,0x38, 0x50,0x00, 0x77,0x39, 0x00,0x02, 0x83,0x16, 0x00,0x00, 0x86,0x9E,
-0x00,0x00, 0xC5,0xB8, 0x30,0x00, 0x05,0xAC, 0x00,0x0C, 0x87,0x2E, 0x00,0x00, 0xC6,0x00,
-0x00,0x00, 0xC0,0x36, 0x72,0x00, 0xE6,0x01, 0x26,0x10, 0x20,0x32, 0x00,0x00, 0x86,0x9E,
-0x00,0x04, 0x87,0x2E, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36, 0x72,0x00, 0xE6,0x01,
-0x26,0x10, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32, 0x00,0x00, 0xE6,0x01,
-0x26,0x25, 0x00,0x00, 0x00,0x01, 0xC7,0x00, 0x00,0x00, 0xE0,0x01, 0x26,0x78, 0x20,0x3A,
-0x00,0x00, 0x86,0x9E, 0x00,0x00, 0x87,0x2E, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x01, 0x26,0x5C, 0x00,0x00, 0x00,0x01, 0xE6,0x01, 0x26,0x64, 0x20,0x32,
-0x00,0x00, 0x86,0x9E, 0x00,0x04, 0x87,0x2E, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC0,0x36,
-0x72,0x00, 0xE2,0x01, 0x26,0x65, 0x20,0x32, 0x00,0x00, 0xF6,0x02, 0x00,0x01, 0x20,0x32,
-0x00,0x00, 0x47,0x04, 0xFF,0xFF, 0xE6,0x01, 0x26,0x79, 0x20,0x3A, 0x00,0x00, 0xF7,0x02,
-0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x26,0xB1, 0x20,0x3A, 0x00,0x00, 0xEE,0x01,
-0x26,0xA0, 0x20,0x3A, 0x00,0x01, 0x43,0x04, 0xFF,0xFF, 0xC0,0x3A, 0x32,0x00, 0xE6,0x01,
-0x26,0xC9, 0xC0,0x26, 0x42,0x00, 0xE0,0x01, 0x25,0x90, 0x00,0x00, 0x00,0x01, 0xE6,0x01,
-0x26,0xC1, 0xC0,0x26, 0x42,0x00, 0xE0,0x01, 0x25,0x90, 0x00,0x00, 0x00,0x01, 0x83,0x16,
-0x00,0x08, 0xF4,0x02, 0x00,0x01, 0xE0,0x01, 0x26,0xE0, 0x95,0x1A, 0x00,0x00, 0xE0,0x01,
-0x25,0x8C, 0xC4,0xA8, 0x00,0x00, 0xE0,0x01, 0x25,0x8C, 0xC4,0x28, 0x00,0x00, 0x83,0x16,
-0x00,0x08, 0x00,0x00, 0x00,0x01, 0x94,0x1A, 0x00,0x00, 0xC4,0x00, 0x00,0x00, 0x87,0x96,
-0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x00,0x00, 0x00,0x00, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x85,0x96,
-0x00,0x04, 0x84,0x16, 0x00,0x00, 0x84,0x96, 0x00,0x08, 0xF7,0x02, 0x00,0x03, 0xC6,0xA0,
-0x4D,0x80, 0xC6,0xB6, 0x74,0x00, 0xE6,0x01, 0x27,0x71, 0xC6,0x20, 0x00,0x00, 0x20,0x36,
-0x00,0x02, 0xE6,0x01, 0x27,0xA0, 0xC5,0x20, 0x48,0x00, 0xC7,0x20, 0x48,0x00, 0x27,0x38,
-0x00,0x02, 0xC0,0x22, 0x72,0x00, 0xE2,0x01, 0x27,0x9C, 0xC5,0x38, 0x00,0x00, 0x87,0x2E,
-0x00,0x00, 0x76,0xAD, 0x00,0x1E, 0x76,0xB4, 0xFF,0xE5, 0xC7,0x38, 0x6F,0xC0, 0x77,0x38,
-0xFF,0xF0, 0xF7,0x33, 0x28,0x00, 0x06,0x30, 0x00,0x02, 0xC0,0x32, 0x52,0x00, 0xE2,0x01,
-0x27,0x41, 0x05,0xAC, 0x00,0x02, 0xE0,0x01, 0x27,0xA0, 0xC5,0x20, 0x48,0x00, 0xC7,0x20,
-0x48,0x00, 0x27,0x38, 0x00,0x04, 0xC0,0x22, 0x72,0x00, 0xE2,0x01, 0x27,0xA0, 0xC5,0x20,
-0x48,0x00, 0x83,0xAD, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0x93,0xB1, 0x00,0x04, 0xC0,0x32,
-0x72,0x00, 0xE2,0x01, 0x27,0x85, 0x00,0x00, 0x00,0x01, 0xC5,0x20, 0x48,0x00, 0xC0,0x32,
-0x52,0x00, 0xE4,0x01, 0x27,0xD5, 0x00,0x00, 0x00,0x01, 0x86,0xAE, 0x00,0x00, 0x77,0x2D,
-0x00,0x1E, 0x77,0x38, 0xFF,0xE5, 0xC6,0xB4, 0x77,0xC0, 0x76,0xB5, 0xFF,0xE8, 0xF6,0xB3,
-0x68,0x00, 0x06,0x30, 0x00,0x01, 0xC0,0x32, 0x52,0x00, 0xE4,0x01, 0x27,0xAC, 0x05,0xAC,
-0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x0C, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x84,0x16,
-0x00,0x00, 0x86,0x96, 0x00,0x04, 0x00,0x00, 0x00,0x01, 0xC7,0x22, 0x6D,0x80, 0xE6,0x01,
-0x28,0x10, 0x20,0x36, 0x00,0x00, 0xE0,0x01, 0x28,0x74, 0xC4,0x38, 0x00,0x00, 0xF7,0x02,
-0x00,0x01, 0xEE,0x01, 0x28,0x41, 0xF6,0x02, 0x00,0x00, 0x76,0xB5, 0x00,0x01, 0x20,0x36,
-0x00,0x00, 0xEE,0x01, 0x28,0x1C, 0x77,0x39, 0x00,0x01, 0xE0,0x01, 0x28,0x44, 0x20,0x22,
-0x00,0x00, 0x74,0x21, 0x00,0x01, 0x77,0x38, 0xFF,0xFF, 0x06,0x30, 0x00,0x01, 0x20,0x22,
-0x00,0x00, 0xEE,0x01, 0x28,0x34, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x28,0x71, 0x00,0x00,
-0x00,0x01, 0xC0,0x22, 0x6A,0x00, 0xE4,0x01, 0x28,0x64, 0x00,0x00, 0x00,0x01, 0xC4,0x20,
-0x6A,0x00, 0x77,0x3A, 0xFF,0xFF, 0xE6,0x01, 0x28,0x54, 0x76,0xB4, 0xFF,0xFF, 0xD4,0x20,
-0x07,0x62, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x08, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10,
-0x00,0x04, 0xE0,0x01, 0x28,0xCC, 0xF7,0x06, 0x29,0xDC, 0x86,0xBA, 0x00,0x00, 0x00,0x00,
-0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x01, 0x28,0xC9, 0x00,0x00, 0x00,0x01, 0x97,0x16,
-0xFF,0xF4, 0x07,0x88, 0x00,0x08, 0xC1,0x34, 0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0x87,0x16,
-0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x27,0x38, 0x00,0x04, 0xF6,0x06, 0x29,0xE0, 0xC0,0x3A,
-0x62,0x00, 0xE4,0x01, 0x28,0x9D, 0x00,0x00, 0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96,
-0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93,
-0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0x22,0x10, 0x00,0x04, 0xE0,0x01, 0x29,0x34, 0xF7,0x06,
-0x29,0x98, 0x86,0xBA, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x20,0x36, 0x00,0x00, 0xE6,0x01,
-0x29,0x31, 0x00,0x00, 0x00,0x01, 0x97,0x16, 0xFF,0xF4, 0x07,0x88, 0x00,0x08, 0xC1,0x34,
-0x00,0x00, 0x97,0x93, 0xFF,0xFC, 0x87,0x16, 0xFF,0xF4, 0x00,0x00, 0x00,0x01, 0x07,0x38,
-0x00,0x04, 0xF6,0x06, 0x29,0xE0, 0xC0,0x3A, 0x62,0x00, 0xE4,0x01, 0x29,0x04, 0x00,0x00,
-0x00,0x01, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x92,0x93, 0xFF,0xFC, 0x02,0x90, 0x00,0x08, 0xF7,0x04,
-0x7B,0x50, 0x00,0x00, 0x00,0x01, 0x20,0x3A, 0x00,0x00, 0xE6,0x01, 0x29,0x84, 0xF6,0x82,
-0x00,0x01, 0xF6,0x85, 0x7B,0x50, 0x07,0x88, 0x00,0x08, 0xE0,0x01, 0x28,0xF0, 0x97,0x93,
-0xFF,0xFC, 0x87,0x96, 0xFF,0xFC, 0x82,0x96, 0xFF,0xF8, 0x02,0x14, 0x00,0x00, 0x01,0x3C,
-0x00,0x00, 0x00,0x00, 0x00,0x01, 0x00,0x00, 0x0B,0x4C, 0x00,0x00, 0x00,0x00, 0x00,0x00,
-0x42,0x88, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x5E,0x50, 0x00,0x00, 0x00,0x00, 0x00,0x00,
-0xC7,0xA8, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x0B,0xD0, 0x00,0x00, 0x00,0x00, 0x00,0x01,
-0x1C,0x88, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x1E,0x14, 0x00,0x00, 0x00,0x00, 0x00,0x01,
-0x21,0x2C, 0x00,0x00, 0x00,0x00, 0x00,0x01, 0x22,0xE4, 0x00,0x00, 0x00,0x00, } ;
-
-
-/* This is the LANai data */
-
-static unsigned int __devinitdata lanai4_data_off = 0x94F0; /* half-word offset */
-static unsigned char __devinitdata lanai4_data[20472];
-
-
-#ifdef SYMBOL_DEFINES_COMPILED
-/* These are half-word addresses - NOT byte offsets */
-#define MYRI_GenerateMapVersion      0xBD08
-#define MYRI_MoreToGenerate          0xBD0C
-#define MYRI_GenerateMessage         0xBCEC
-#define MYRI_RelayMapVersion         0xBD04
-#define MYRI_RelayStart              0xBD00
-#define MYRI_RelayDirection          0xBCFC
-#define MYRI_RelayIndex              0xBCF4
-#define MYRI_RelayStop               0xBCF8
-#define MYRI_RelayMessage            0xBCF0
-#define MYRI_BroadcastRelayMessagesSent 0xBD10
-#define MYRI_SendMultiplexGrabbed    0xBD3C
-#define MYRI_HostReceiveItem         0xBD14
-#define MYRI_HostReceiveNumScatters  0xBD50
-#define MYRI_HostReceiveScatterIndex 0xBD44
-#define MYRI_HostReceiveScatterPointer 0xBD4C
-#define MYRI_HostReceiveScatterLength 0xBD48
-#define MYRI_HostReceiveChecksum     0xBD40
-#define MYRI_RouteNumFragments       0xBD60
-#define MYRI_RouteFragment           0xBD5C
-#define MYRI_RouteStamp              0xBD58
-#define MYRI_RoutesSoFar             0xBD64
-#define MYRI_MapVersionChanged       0xBD68
-#define MYRI_map_c                   0xBD54
-#define MYRI_pack_list               0x789C
-#define MYRI_pack_table              0x78BA
-#define MYRI_msg2event               0x7FF6
-#define MYRI_VersionString           0xB7A0
-#define MYRI_SizeofChannel           0xBD80
-#define MYRI_EndOfQueueSpace         0xBD84
-#define MYRI_FreeCode                0xBD78
-#define MYRI_FreeData                0xBD7C
-#define MYRI_Asserting               0xBD6C
-#define MYRI_Version                 0xBD74
-#define MYRI_Processor               0xBD70
-#define MYRI_NetReceive              0xBD8C
-#define MYRI_NetReceiveBuffer        0xBD88
-#define MYRI_MapLength               0xBD9C
-#define MYRI_MapSendAlignment        0xBD98
-#define MYRI_HostReplyLength         0xBDA4
-#define MYRI_HostReplySendAlignment  0xBDA0
-#define MYRI_MapSendMessages         0xBD94
-#define MYRI_bitmask                 0x90C6
-#define MYRI_HostSendFull            0x99C0
-#define MYRI_HostReplies             0xA04C
-#define MYRI_Interrupts              0xBCE4
-#define MYRI_NetReceiveDrops         0xB8DA
-#define MYRI_SendMultiplexDoneEvent  0xBB7A
-#define MYRI_bEvents                 0x96E6
-#define MYRI_bHostReceiveShortcuts   0x9972
-#define MYRI_the_map                 0xB728
-#define MYRI_Channels                0xB7A2
-#define MYRI_bEventIndex             0x9766
-#define MYRI_NoBuffersChannel0       0x9974
-#define MYRI_bShakes                 0x976A
-#define MYRI_MAPPER                  0xA122
-#define MYRI_CORE_timeout_counter    0xA114
-#define MYRI_the_map_is_valid        0xA040
-#define MYRI_bBadScatters            0x9970
-#define MYRI_HostReceiveChannel      0x9960
-#define MYRI_send_space              0xA7B0
-#define MYRI_MapReceiveMessages      0xB8E0
-#define MYRI_wakeup_mask             0xBC4E
-#define MYRI_NetSendBuffer           0xBB30
-#define MYRI_HostReceiveMulticast    0x9968
-#define MYRI_HostSendChannel         0x9A94
-#define MYRI_NetReceiveDmaDone       0xB7FA
-#define MYRI_HostSendChecksum        0x9AAA
-#define MYRI_HostReceiveScatter      0x9914
-#define MYRI_compares                0x9DC8
-#define MYRI_NetSendQueue            0xBAFC
-#define MYRI_HostTable               0xA54C
-#define MYRI_map_h                   0x9DB4
-#define MYRI_HostSendBytes           0x9AA0
-#define MYRI_L3_end_loaded_memory    0xBDB4
-#define MYRI_NetSendBytes            0xBB2A
-#define MYRI_map_space               0xA81C
-#define MYRI_MAP_ACK                 0xA045
-#define MYRI_NetReceiveMisroutes     0xB8D6
-#define MYRI_HostReceiveBytes        0x995C
-#define MYRI_BroadcastRelayIdle      0x95C2
-#define MYRI_HostReceiveIdle         0x9770
-#define MYRI_timing                  0xBC08
-#define MYRI_HostReceive             0x996A
-#define MYRI_routeHandleMessage      0x7732
-#define MYRI_Freses                  0xB7AE
-#define MYRI_NextToPut               0x969C
-#define MYRI_HostSendIdle            0x997A
-#define MYRIedata                    0xBCEC
-#define MYRI_SendingHostReply        0xBAFA
-#define MYRI_timing_period           0xBC50
-#define MYRI_debug                   0xA138
-#define MYRI_NetSendBusy             0xB998
-#define MYRI_routeInitialize         0x6AA0
-#define MYRI_HostReceiveQueue        0x9966
-#define MYRI_bWakes                  0x9768
-#define MYRI_NetReceiveBadLengths    0xB8D0
-#define MYRI_NetReceiveQueue         0xB8E2
-#define MYRI_MapBuffer               0xBAF6
-#define MYRI_MapChecksum             0xA048
-#define MYRI_the_routes_are_valid    0xA042
-#define MYRI_MAPPER_probe_stamp      0xA132
-#define MYRI_memory                  0xA7AC
-#define MYRI_Events                  0x9614
-#define MYRI_switches                0x9DB6
-#define MYRI_Hosts                   0xA7AE
-#define MYRI_HostReceiveGoingToBroadcast 0x98CE
-#define MYRI_NetSendIdle             0xB90C
-#define MYRI_host_reply_space        0xB72C
-#define MYRI_HostReceiveWaitingToBroadcast 0x9888
-#define MYRI_bSetRoutes              0xA11E
-#define MYRI_bSends                  0x976C
-#define MYRI_BroadcastGenerateIdle   0x9536
-#define MYRI_WatchdogOff             0xBC9E
-#define MYRI_TIMER                   0xBC52
-#define MYRI_SendMultiplex           0xBB82
-#define MYRI_HostReplyBuffer         0xBAF8
-#define MYRI_the_new_switch          0xA130
-#define MYRI_current_switch          0xA03A
-#define MYRI_memcpy                  0x937C
-#define MYRI_server                  0x9AF6
-#define MYRI_WatchdogOn              0xBC58
-#define MYRI_NetSendContinuing       0xB952
-#define MYRI_NetReceiveBadChannels   0xB8D2
-#define MYRI_SendMultiplexFreeMachine 0xBB80
-#define MYRI_NetReceiveFlush         0xB840
-#define MYRI_NetSendBroadcasting     0xBAB0
-#define MYRI_looking_for_a_loopback  0x9D6C
-#define MYRI_HostSendGatherPointer   0x9AA8
-#define MYRI_HostSendItem            0x9A96
-#define MYRI_MAP_REQ                 0xA046
-#define MYRI_memory_free_list        0xA160
-#define MYRIend                      0xBDB4
-#define MYRI_MapVersion              0x9DB2
-#define MYRI_client                  0x9AB0
-#define MYRI_HostReceiveBroadcasting 0x9842
-#define MYRIetext                    0x94F0
-#define MYRI_NetSendMapBusy          0xB9DE
-#define MYRI_bRouteMessages          0xA134
-#define MYRI_DmaDirection            0xB7A8
-#define MYRI_SendMultiplexFreeEvent  0xBB7C
-#define MYRI_idle_mapper             0x9B3C
-#define MYRI_NetSend                 0xBB24
-#define MYRI_current_port            0xA03E
-#define MYRI_HostConnectedSwitches   0x9DDA
-#define MYRI_try_loopback            0x9B82
-#define MYRI_the_host_reply_message  0xB72A
-#define MYRI_MAPPER_queue            0x9DD8
-#define MYRI_bHostSendShortcuts      0x9AAC
-#define MYRI_BroadcastGenerate       0x9608
-#define MYRI_DmaFreeEvent            0xB7AC
-#define MYRI_host_timeout_counter    0xA116
-#define MYRI_NetReceiveDma           0xB7B4
-#define MYRI_MAPPER_try_port         0xA12C
-#define MYRI_bcopy                   0x66AA
-#define MYRI_queue_h                 0xBB32
-#define MYRI_bUpdates                0xA120
-#define MYRI_SendMultiplexMachine    0xBB7E
-#define MYRI_MAPPER_repeat           0xA12A
-#define MYRI_the_return_port         0xA038
-#define MYRI_NetReceiveFull          0xB886
-#define MYRI_MyHostTableIndex        0xA7AA
-#define MYRI_CORE                    0xA118
-#define MYRI_I_have_a_map            0xA044
-#define MYRI_bWaiting                0xB7B0
-#define MYRI_NetReceiveOverflows     0xB8D8
-#define MYRI_NumMachines             0x96A0
-#define MYRI_MapMessagesSentCounter  0xB79C
-#define MYRI_HostReceiveBuffer       0x9962
-#define MYRI_HostSendDma             0x9A4C
-#define MYRI_NextToGet               0x969E
-#define MYRI_HostReceiveDmaBusy      0x97B6
-#define MYRI_bUpdateMessages         0xA136
-#define MYRI_try_the_switch          0x9C0E
-#define MYRI_BroadcastRelay          0x960E
-#define MYRI_the_msg                 0xB798
-#define MYRI_bEventsRTC              0x9726
-#define MYRI_HostReceiveMessages     0x995E
-#define MYRI_CURRENT_MSG             0xB79A
-#define MYRI_MAPPER_phase            0xA128
-#define MYRI_HostReceiveDma          0x97FC
-#define MYRI_Watchdog                0xBCE6
-#define MYRI_HostSendEmpty           0x9A92
-#define MYRI_abort                   0x63C6
-#define MYRI_SendMultiplexIdle       0xBB34
-#define MYRI_looking_for_a_switch    0x9C54
-#define MYRI_NetSendMessages         0xBB2C
-#define MYRI_updating                0x9D26
-#define MYRI_BroadcastGenerateSending 0x94F0
-#define MYRI_HostSendBuffer          0x9AA4
-#define MYRI_HostSendMessages        0x9A9E
-#define MYRI_BroadcastRelaySending   0x957C
-#define MYRI_HostSendDmaBusy         0x9A06
-#define MYRI_BroadcastsPending       0xB8CC
-#define MYRI_NetSendMapWaiting       0xBA6A
-#define MYRI_NetReceiveBadTypes      0xB8CE
-#define MYRI_looking_for_hosts       0x9C9A
-#define MYRI_bBadHeader              0x9978
-#define MYRI_HostSendGatherIndex     0x9AA6
-#define MYRI_routeLookup             0x7790
-#define MYRI_NetReceiveMessages      0xB8DE
-#define MYRI_DmaInUse                0xB7AA
-#define MYRI_explores                0x9DB8
-#define MYRI_HostSend                0x9A98
-#define MYRI_DmaResetSpin            0xB7B2
-#define MYRIstart                    0x0000
-#define MYRI_RouteTable              0xA164
-#define MYRI_Machines                0x96A2
-#define MYRI_try_the_host            0x9BC8
-#define MYRI_isr_record              0x976E
-#define MYRI_HostReceiveDrops        0x995A
-#define MYRI_HostReceiveLength       0x9964
-#define MYRI_timers                  0xBB88
-#define MYRI_NetSendWaiting          0xBA24
-#define MYRI_NetSendDrops            0xBB2E
-#define MYRI_comparing_a_switch      0x9CE0
-#define MYRI_OldMapChecksum          0xA04A
-#define MYRI_HostSendQueue           0x9AA2
-#define MYRI_MAPPER_host             0xA12E
-#define MYRI_compare_switch          0xA03C
-#define MYRI_main                    0x80A6
-#define MYRI_NetReceiveBadCrcs       0xB8D4
-#define MYRI_NetReceiveBytes         0xB8DC
-
-#endif /* SYMBOL_DEFINES_COMPILED */
index 08534c08d30d669cecd97e9c258c97fbe10acd9c..9a802adba9a328e5047843fc8ba8e5ca31abe9a8 100644 (file)
@@ -25,6 +25,7 @@ static char version[] =
 #include <linux/dma-mapping.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
+#include <linux/firmware.h>
 
 #include <net/dst.h>
 #include <net/arp.h>
@@ -43,7 +44,6 @@ static char version[] =
 #include <asm/irq.h>
 
 #include "myri_sbus.h"
-#include "myri_code.h"
 
 /* #define DEBUG_DETECT */
 /* #define DEBUG_IRQ */
@@ -81,6 +81,9 @@ static char version[] =
 #define DHDR(x)
 #endif
 
+/* Firmware name */
+#define FWNAME         "myricom/lanai.bin"
+
 static void myri_reset_off(void __iomem *lp, void __iomem *cregs)
 {
        /* Clear IRQ mask. */
@@ -171,10 +174,11 @@ static int myri_do_handshake(struct myri_eth *mp)
 
 static int __devinit myri_load_lanai(struct myri_eth *mp)
 {
+       const struct firmware   *fw;
        struct net_device       *dev = mp->dev;
        struct myri_shmem __iomem *shmem = mp->shmem;
        void __iomem            *rptr;
-       int                     i;
+       int                     i, lanai4_data_size;
 
        myri_disable_irq(mp->lregs, mp->cregs);
        myri_reset_on(mp->cregs);
@@ -186,13 +190,27 @@ static int __devinit myri_load_lanai(struct myri_eth *mp)
        if (mp->eeprom.cpuvers >= CPUVERS_3_0)
                sbus_writel(mp->eeprom.cval, mp->lregs + LANAI_CVAL);
 
+       i = request_firmware(&fw, FWNAME, &mp->myri_op->dev);
+       if (i) {
+               printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+                      FWNAME, i);
+               return i;
+       }
+       if (fw->size < 2) {
+               printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+                      fw->size, FWNAME);
+               release_firmware(fw);
+               return -EINVAL;
+       }
+       lanai4_data_size = fw->data[0] << 8 | fw->data[1];
+
        /* Load executable code. */
-       for (i = 0; i < sizeof(lanai4_code); i++)
-               sbus_writeb(lanai4_code[i], rptr + (lanai4_code_off * 2) + i);
+       for (i = 2; i < fw->size; i++)
+               sbus_writeb(fw->data[i], rptr++);
 
        /* Load data segment. */
-       for (i = 0; i < sizeof(lanai4_data); i++)
-               sbus_writeb(lanai4_data[i], rptr + (lanai4_data_off * 2) + i);
+       for (i = 0; i < lanai4_data_size; i++)
+               sbus_writeb(0, rptr++);
 
        /* Set device address. */
        sbus_writeb(0, &shmem->addr[0]);
@@ -228,6 +246,7 @@ static int __devinit myri_load_lanai(struct myri_eth *mp)
        if (mp->eeprom.cpuvers == CPUVERS_4_0)
                sbus_writel(0, mp->lregs + LANAI_VERS);
 
+       release_firmware(fw);
        return i;
 }
 
@@ -1078,7 +1097,10 @@ static int __devinit myri_sbus_probe(struct of_device *op, const struct of_devic
 
        /* Load code onto the LANai. */
        DET(("Loading LANAI firmware\n"));
-       myri_load_lanai(mp);
+       if (myri_load_lanai(mp)) {
+               printk(KERN_ERR "MyriCOM: Cannot Load LANAI firmware.\n");
+               goto err_free_irq;
+       }
 
        if (register_netdev(dev)) {
                printk("MyriCOM: Cannot register device.\n");
@@ -1159,3 +1181,4 @@ module_init(myri_sbus_init);
 module_exit(myri_sbus_exit);
 
 MODULE_LICENSE("GPL");
+MODULE_FIRMWARE(FWNAME);
index 1af47257ba821d9a06c7e37d1a2b77425d01327e..aef77289bd34d0577b7824a609170c537850c6e9 100644 (file)
@@ -207,19 +207,19 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
 
        adapter->pci_using_dac = 0;
 
-       mask = DMA_32BIT_MASK;
+       mask = DMA_BIT_MASK(32);
        /*
         * Consistent DMA mask is set to 32 bit because it cannot be set to
         * 35 bits. For P3 also leave it at 32 bits for now. Only the rings
         * come off this pool.
         */
-       cmask = DMA_32BIT_MASK;
+       cmask = DMA_BIT_MASK(32);
 
 #ifndef CONFIG_IA64
        if (revision_id >= NX_P3_B0)
-               mask = DMA_39BIT_MASK;
+               mask = DMA_BIT_MASK(39);
        else if (revision_id == NX_P2_C1)
-               mask = DMA_35BIT_MASK;
+               mask = DMA_BIT_MASK(35);
 #endif
        if (pci_set_dma_mask(pdev, mask) == 0 &&
                pci_set_consistent_dma_mask(pdev, cmask) == 0) {
index 02c37e2f08a9fadc9dfaaa222193f97b036b0ba3..73cac6c78cb6f97131ec0a52ec56340a93f56594 100644 (file)
@@ -9889,8 +9889,8 @@ static int __devinit niu_pci_init_one(struct pci_dev *pdev,
                        goto err_out_release_parent;
                }
        }
-       if (err || dma_mask == DMA_32BIT_MASK) {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       if (err || dma_mask == DMA_BIT_MASK(32)) {
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        dev_err(&pdev->dev, PFX "No usable DMA configuration, "
                                "aborting.\n");
index 221b0c4c824a36bdb3e0ea1ece9e0e5497517a01..d531614a90b551135de193fb34800a0f7b7a2d60 100644 (file)
@@ -1973,9 +1973,9 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev,
 
        /* See if we can set the dma mask early on; failure is fatal. */
        if (sizeof(dma_addr_t) == 8 &&
-               !pci_set_dma_mask(pci_dev, DMA_64BIT_MASK)) {
+               !pci_set_dma_mask(pci_dev, DMA_BIT_MASK(64))) {
                using_dac = 1;
-       } else if (!pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) {
+       } else if (!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32))) {
                using_dac = 0;
        } else {
                dev_warn(&pci_dev->dev, "pci_set_dma_mask failed!\n");
index 501a8d7ac2beccf70c34a14903c0178dbea07d2c..15b8fe61695bed13cfdcadd3d38cae59d420b9b5 100644 (file)
@@ -339,7 +339,7 @@ static int axnet_config(struct pcmcia_device *link)
 {
     struct net_device *dev = link->priv;
     axnet_dev_t *info = PRIV(dev);
-    int i, j, last_ret, last_fn;
+    int i, j, j2, last_ret, last_fn;
 
     DEBUG(0, "axnet_config(0x%p)\n", link);
 
@@ -388,6 +388,8 @@ static int axnet_config(struct pcmcia_device *link)
 
     for (i = 0; i < 32; i++) {
        j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
+       j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2);
+       if (j == j2) continue;
        if ((j != 0) && (j != 0xffff)) break;
     }
 
@@ -398,6 +400,8 @@ static int axnet_config(struct pcmcia_device *link)
        pcmcia_access_configuration_register(link, &reg);
        for (i = 0; i < 32; i++) {
            j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
+           j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2);
+           if (j == j2) continue;
            if ((j != 0) && (j != 0xffff)) break;
        }
     }
@@ -1767,6 +1771,9 @@ static void AX88190_init(struct net_device *dev, int startp)
        ei_local->tx1 = ei_local->tx2 = 0;
        ei_local->txing = 0;
 
+       if (info->flags & IS_AX88790)   /* select Internal PHY */
+               outb(0x10, e8390_base + AXNET_GPIO);
+
        if (startp) 
        {
                outb_p(0xff,  e8390_base + EN0_ISR);
index 8b2823c8dccfafaf97b3b8c9f698cb25386d34c4..cadc32c94c1e64da93b48ca26fb7ce448be88ef6 100644 (file)
@@ -3934,12 +3934,12 @@ static int __devinit ql3xxx_probe(struct pci_dev *pdev,
 
        pci_set_master(pdev);
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                pci_using_dac = 1;
-               err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
-       } else if (!(err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
+       } else if (!(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) {
                pci_using_dac = 0;
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        }
 
        if (err) {
index 170d3540f9c9fb7185d66c9c0af5ce872a3f66e5..c92ced2479478729e5e329463f7acd1e49599f90 100644 (file)
@@ -3726,13 +3726,13 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
        }
 
        pci_set_master(pdev);
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                set_bit(QL_DMA64, &qdev->flags);
-               err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (!err)
-                      err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                      err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        }
 
        if (err) {
index 0a37f9902a074d0f106db698a8232fb3bce0d2c9..5e8540b6ffa11d7184cbcf1e5ee11f88f1d57043 100644 (file)
@@ -1085,13 +1085,13 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
                goto err_out;
 
        /* this should always be supported */
-       err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err) {
                printk(KERN_ERR DRV_NAME ": 32-bit PCI DMA addresses"
                                "not supported by the card\n");
                goto err_out;
        }
-       err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err) {
                printk(KERN_ERR DRV_NAME ": 32-bit PCI DMA addresses"
                                "not supported by the card\n");
index e1a638a05f8621d15cfb74c6f15806bc33323fe8..0b6e8c89683581efdfc35925adaa018998468db5 100644 (file)
@@ -1148,7 +1148,7 @@ static void rtl8169_update_counters(struct net_device *dev)
                return;
 
        RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
-       cmd = (u64)paddr & DMA_32BIT_MASK;
+       cmd = (u64)paddr & DMA_BIT_MASK(32);
        RTL_W32(CounterAddrLow, cmd);
        RTL_W32(CounterAddrLow, cmd | CounterDump);
 
@@ -2046,11 +2046,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        tp->cp_cmd = PCIMulRW | RxChkSum;
 
        if ((sizeof(dma_addr_t) > 4) &&
-           !pci_set_dma_mask(pdev, DMA_64BIT_MASK) && use_dac) {
+           !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
                tp->cp_cmd |= PCIDAC;
                dev->features |= NETIF_F_HIGHDMA;
        } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc < 0) {
                        if (netif_msg_probe(tp)) {
                                dev_err(&pdev->dev,
@@ -2343,9 +2343,9 @@ static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
         * Switching from MMIO to I/O access fixes the issue as well.
         */
        RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
-       RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_32BIT_MASK);
+       RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
        RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
-       RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_32BIT_MASK);
+       RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
 }
 
 static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
index 16868b7a5d0aad2146b203200298d945947a631d..1a4979f27fb5af83e82c31ad448f4a63774b67e4 100644 (file)
@@ -7775,18 +7775,18 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
                return ret;
        }
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                DBG_PRINT(INIT_DBG, "s2io_init_nic: Using 64bit DMA\n");
                dma_flag = TRUE;
                if (pci_set_consistent_dma_mask
-                   (pdev, DMA_64BIT_MASK)) {
+                   (pdev, DMA_BIT_MASK(64))) {
                        DBG_PRINT(ERR_DBG,
                                  "Unable to obtain 64bit DMA for \
                                        consistent allocations\n");
                        pci_disable_device(pdev);
                        return -ENOMEM;
                }
-       } else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       } else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                DBG_PRINT(INIT_DBG, "s2io_init_nic: Using 32bit DMA\n");
        } else {
                pci_disable_device(pdev);
index c13cbf099b88e6ef61fd51ba2cacc6973f4d8e30..18821f217e19fa286a732973cfc917463638e672 100644 (file)
@@ -1427,11 +1427,11 @@ static int __devinit sc92031_probe(struct pci_dev *pdev,
 
        pci_set_master(pdev);
 
-       err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (unlikely(err < 0))
                goto out_set_dma_mask;
 
-       err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (unlikely(err < 0))
                goto out_set_dma_mask;
 
index a9732686134b844884fd8ab0441070efc636d6c1..55ccd51d247efc3fa20cddd6616ddc8607637e17 100644 (file)
@@ -1467,7 +1467,7 @@ static struct net_device * __devinit sis190_init_board(struct pci_dev *pdev)
                goto err_pci_disable_2;
        }
 
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc < 0) {
                net_probe(tp, KERN_ERR "%s: DMA configuration failed.\n",
                          pci_name(pdev));
index 8a70de72ea2cb8db4471d44299fb590e4dcd430c..2d4617b3e2087c9a7bcc9bf33a83f3e00bbf77cb 100644 (file)
@@ -432,7 +432,7 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
        ret = pci_enable_device(pci_dev);
        if(ret) return ret;
 
-       i = pci_set_dma_mask(pci_dev, DMA_32BIT_MASK);
+       i = pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32));
        if(i){
                printk(KERN_ERR "sis900.c: architecture does not support "
                        "32bit PCI busmaster DMA\n");
index 952d37ffee51f8de796a20b650b946678ca5e333..b8978d4af1b76677bd2f0138089be2605bdd5ab7 100644 (file)
@@ -3912,12 +3912,12 @@ static int __devinit skge_probe(struct pci_dev *pdev,
 
        pci_set_master(pdev);
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                using_dac = 1;
-               err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
-       } else if (!(err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
+       } else if (!(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) {
                using_dac = 0;
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        }
 
        if (err) {
index d01c56eb962759e511cf269a27d4952e85e15cfc..a2ff9cb1e7ac55e4f4a80311d11326268345e87c 100644 (file)
@@ -4374,16 +4374,16 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
        pci_set_master(pdev);
 
        if (sizeof(dma_addr_t) > sizeof(u32) &&
-           !(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {
+           !(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)))) {
                using_dac = 1;
-               err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (err < 0) {
                        dev_err(&pdev->dev, "unable to obtain 64 bit DMA "
                                "for consistent allocations\n");
                        goto err_out_free_regions;
                }
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        dev_err(&pdev->dev, "no usable DMA configuration\n");
                        goto err_out_free_regions;
index af8f60ca0f57235f57abdb82cea9437b03d2d804..6da678129828c1bd764a6b49a1dc77f038090e13 100644 (file)
@@ -43,7 +43,6 @@
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/timer.h>
-#include <linux/version.h>
 #include <linux/bug.h>
 #include <linux/bitops.h>
 #include <linux/irq.h>
index 5959ae86e57dd6575f44c94baab0b02c693fa7c4..60abdb1081ad5277c5044227c59540ff6d4348a1 100644 (file)
@@ -1598,7 +1598,7 @@ smsc9420_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto out_free_netdev_2;
        }
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR "No usable DMA configuration, aborting.\n");
                goto out_free_regions_3;
        }
index c024352c92fd24facec33736b5d9305272e931dc..d2dfe0ab5106eab3b333216d76302ace27490992 100644 (file)
@@ -3042,10 +3042,10 @@ static int __devinit gem_init_one(struct pci_dev *pdev,
         */
        if (pdev->vendor == PCI_VENDOR_ID_SUN &&
            pdev->device == PCI_DEVICE_ID_SUN_GEM &&
-           !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+           !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                pci_using_dac = 1;
        } else {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        printk(KERN_ERR PFX "No usable DMA configuration, "
                               "aborting.\n");
index 7debd1e4e1f7d8c2ef18b3de5ee38d91e931c152..7f4a9683ba1e4962ebcf08025cce066383ec0e0d 100644 (file)
@@ -1941,12 +1941,12 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if ((err = pci_enable_device(pdev)))    /* it trigers interrupt, dunno why. */
                goto err_pci;                   /* it's not a problem though */
 
-       if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) &&
-           !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) {
+       if (!(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) &&
+           !(err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))) {
                pci_using_dac = 1;
        } else {
-               if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) ||
-                   (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) {
+               if ((err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) ||
+                   (err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))) {
                        printk(KERN_ERR "tehuti: No usable DMA configuration"
                                        ", aborting\n");
                        goto err_dma;
index dec67e0a9ca2b491a5a1636acb6eb4f4efe28bf3..4fc875e5dcddfe2617436aa3059515594465714d 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/vmalloc.h>
 #include <linux/firmware.h>
 #include <asm/byteorder.h>
+#include <linux/dma-mapping.h>
 
 /* Compile Time Switches */
 /* start */
 #define READ_REG(pp, reg)         readl(pp->pBdxRegs + reg)
 #define WRITE_REG(pp, reg, val)   writel(val, pp->pBdxRegs + reg)
 
-#ifndef DMA_64BIT_MASK
-#   define DMA_64BIT_MASK  0xffffffffffffffffULL
-#endif
-
-#ifndef DMA_32BIT_MASK
-#   define DMA_32BIT_MASK  0x00000000ffffffffULL
-#endif
-
 #ifndef NET_IP_ALIGN
 #   define NET_IP_ALIGN 2
 #endif
index 437683aab32c8dab18a91fe92b5ae0741bfed03a..6a736dda3ee2e199ef176b2f4ae7ec96fdbc8d25 100644 (file)
@@ -4975,7 +4975,7 @@ static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping,
 {
 #if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64)
        if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG)
-               return (((u64) mapping + len) > DMA_40BIT_MASK);
+               return (((u64) mapping + len) > DMA_BIT_MASK(40));
        return 0;
 #else
        return 0;
@@ -13228,17 +13228,17 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
         * do DMA address check in tg3_start_xmit().
         */
        if (tp->tg3_flags2 & TG3_FLG2_IS_5788)
-               persist_dma_mask = dma_mask = DMA_32BIT_MASK;
+               persist_dma_mask = dma_mask = DMA_BIT_MASK(32);
        else if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) {
-               persist_dma_mask = dma_mask = DMA_40BIT_MASK;
+               persist_dma_mask = dma_mask = DMA_BIT_MASK(40);
 #ifdef CONFIG_HIGHMEM
-               dma_mask = DMA_64BIT_MASK;
+               dma_mask = DMA_BIT_MASK(64);
 #endif
        } else
-               persist_dma_mask = dma_mask = DMA_64BIT_MASK;
+               persist_dma_mask = dma_mask = DMA_BIT_MASK(64);
 
        /* Configure DMA attributes. */
-       if (dma_mask > DMA_32BIT_MASK) {
+       if (dma_mask > DMA_BIT_MASK(32)) {
                err = pci_set_dma_mask(pdev, dma_mask);
                if (!err) {
                        dev->features |= NETIF_F_HIGHDMA;
@@ -13251,8 +13251,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
                        }
                }
        }
-       if (err || dma_mask == DMA_32BIT_MASK) {
-               err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       if (err || dma_mask == DMA_BIT_MASK(32)) {
+               err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (err) {
                        printk(KERN_ERR PFX "No usable DMA configuration, "
                               "aborting.\n");
@@ -13393,8 +13393,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
               (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0);
        printk(KERN_INFO "%s: dma_rwctrl[%08x] dma_mask[%d-bit]\n",
               dev->name, tp->dma_rwctrl,
-              (pdev->dma_mask == DMA_32BIT_MASK) ? 32 :
-               (((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64));
+              (pdev->dma_mask == DMA_BIT_MASK(32)) ? 32 :
+               (((u64) pdev->dma_mask == DMA_BIT_MASK(40)) ? 40 : 64));
 
        return 0;
 
index 68b967b585aa95318389d91e5da5d5199f654c73..aa6964922d5e20b54be7d5c6238b2ca72312a8f3 100644 (file)
@@ -570,7 +570,7 @@ static int __devinit TLan_probe1(struct pci_dev *pdev,
 
                priv->adapter = &board_info[ent->driver_data];
 
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        printk(KERN_ERR "TLAN: No suitable PCI mapping available.\n");
                        goto err_out_free_dev;
index f309b8f703bd9fa828f338f62f234815b22ee54a..2e70ee8f1459981089a73fd4a75b722cc112c46d 100644 (file)
@@ -267,7 +267,7 @@ static int __devinit streamer_init_one(struct pci_dev *pdev,
 #endif
 #endif
 
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc) {
                printk(KERN_ERR "%s: No suitable PCI mapping available.\n",
                                dev->name);
index e2c9d0f5a75507c39ce512824deccee80d002e4c..f2e669974c787e0270a403f85235e0e4375dc0b4 100644 (file)
@@ -383,7 +383,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
                return -ENOMEM;
        SET_NETDEV_DEV(dev, &pdev->dev);
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING DRV_NAME
                        ": 32-bit PCI DMA not available.\n");
                err = -ENODEV;
index c227db0796214b011a2f268bea94ed95f5f33fd9..8761a5a5bd79bdc620d3af577202a9b6e688239e 100644 (file)
@@ -282,7 +282,7 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev,
                return -ENOMEM;
        SET_NETDEV_DEV(dev, &pdev->dev);
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING DRV_NAME ": 32-bit PCI DMA not available.\n");
                err = -ENODEV;
                goto err_out_free;
index c61a01b029af78439addf39c35a2a4e9c6e43346..264e61404f345a8d36d9ee2cdabf2df4ec2a99f9 100644 (file)
@@ -375,7 +375,7 @@ static int __devinit w840_probe1 (struct pci_dev *pdev,
 
        irq = pdev->irq;
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING "Winbond-840: Device %s disabled due to DMA limitations.\n",
                       pci_name(pdev));
                return -EIO;
index 9dd4f76a2ff5846ee4c14f066939593768e2a328..cf25eb41b1ce7023559c90f02422d502703feb1e 100644 (file)
@@ -2406,7 +2406,7 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto error_out_disable;
        }
 
-       err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if(err < 0) {
                printk(ERR_PFX "%s: No usable DMA configuration\n",
                       pci_name(pdev));
index 659654f458806b36eeab21a8f84bb4aa450c0af2..f3a2fce6166ccebc68dc6650e9b7ac8ed6fb4be4 100644 (file)
@@ -1180,7 +1180,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 #if 0
 // dma_supported() is deeply broken on almost all architectures
        // possible with some EHCI controllers
-       if (dma_supported (&udev->dev, DMA_64BIT_MASK))
+       if (dma_supported (&udev->dev, DMA_BIT_MASK(64)))
                net->features |= NETIF_F_HIGHDMA;
 #endif
 
index 880eaf07413b0fc33ce99a404d27bf859a60e207..45daba726b665fd753a1338244536595a00099f6 100644 (file)
@@ -686,7 +686,7 @@ static int __devinit rhine_init_one(struct pci_dev *pdev,
                goto err_out;
 
        /* this should always be supported */
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc) {
                printk(KERN_ERR "32-bit PCI DMA addresses not supported by "
                       "the card!?\n");
index a6f1e19159d8e19b1d581c48cf28f96aec93cffe..9c82a39497e5f9f3aae73b8df04c78cbaf8311df 100644 (file)
@@ -575,8 +575,9 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
        if (ret)
                return ret;
 
-       vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
-                         dev->dev_addr, dev->addr_len);
+       if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC))
+               vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
+                                 dev->dev_addr, dev->addr_len);
 
        return 0;
 }
@@ -876,11 +877,8 @@ static int virtnet_probe(struct virtio_device *vdev)
                vdev->config->get(vdev,
                                  offsetof(struct virtio_net_config, mac),
                                  dev->dev_addr, dev->addr_len);
-       } else {
+       } else
                random_ether_addr(dev->dev_addr);
-               vdev->config->set(vdev, offsetof(struct virtio_net_config, mac),
-                                 dev->dev_addr, dev->addr_len);
-       }
 
        /* Set up our device-specific information */
        vi = netdev_priv(dev);
index 61ef16118157712dec94f3995e9b54d9f738a18f..b7f08f3e524b512331a570de319a1578ea97a88a 100644 (file)
@@ -43,6 +43,7 @@
 
 #include <linux/if_vlan.h>
 #include <linux/pci.h>
+#include <linux/tcp.h>
 #include <net/ip.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index 887acb0dc8075f183925c19225d5d4cf725695dd..8130b79a8a996594209188f79c19512011fa0d08 100644 (file)
@@ -586,8 +586,8 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,
           We set both dma_mask and consistent_dma_mask to 28 bits
           and pray pci_alloc_consistent() will use this info. It should
           work on most platforms */
-       if (pci_set_consistent_dma_mask(pdev, DMA_28BIT_MASK) ||
-           pci_set_dma_mask(pdev, DMA_28BIT_MASK)) {
+       if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(28)) ||
+           pci_set_dma_mask(pdev, DMA_BIT_MASK(28))) {
                printk(KERN_ERR "wanXL: No usable DMA configuration\n");
                return -EIO;
        }
@@ -633,8 +633,8 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,
        /* FIXME when PCI/DMA subsystems are fixed.
           We set both dma_mask and consistent_dma_mask back to 32 bits
           to indicate the card can do 32-bit DMA addressing */
-       if (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) ||
-           pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)) ||
+           pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR "wanXL: No usable DMA configuration\n");
                wanxl_pci_remove_one(pdev);
                return -EIO;
index fc0897fb22390c87d908ceefdc0a4ea05193e383..f7182179501800e31e23ba4f3db5562d87a843bc 100644 (file)
@@ -1804,8 +1804,8 @@ static int __devinit adm8211_probe(struct pci_dev *pdev,
                return err; /* someone else grabbed it? don't disable it */
        }
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) ||
-           pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) ||
+           pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR "%s (adm8211): No suitable DMA available\n",
                       pci_name(pdev));
                goto err_free_reg;
index 5d57d774e466b0308b47df24b5871005dcc4fc51..a08bc8a4fb6916f17850f87d0ee7e651648744dc 100644 (file)
@@ -445,7 +445,7 @@ ath5k_pci_probe(struct pci_dev *pdev,
        }
 
        /* XXX 32-bit addressing only */
-       ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (ret) {
                dev_err(&pdev->dev, "32-bit DMA not available\n");
                goto err_dis;
index 0cc804d0a214fcad833c7dcdbd2afd6e7451aee3..e228c1de6e1153bd8556ed16ce0226442e2942f1 100644 (file)
@@ -772,23 +772,23 @@ static u64 supported_dma_mask(struct b43_wldev *dev)
 
        tmp = b43_read32(dev, SSB_TMSHIGH);
        if (tmp & SSB_TMSHIGH_DMA64)
-               return DMA_64BIT_MASK;
+               return DMA_BIT_MASK(64);
        mmio_base = b43_dmacontroller_base(0, 0);
        b43_write32(dev, mmio_base + B43_DMA32_TXCTL, B43_DMA32_TXADDREXT_MASK);
        tmp = b43_read32(dev, mmio_base + B43_DMA32_TXCTL);
        if (tmp & B43_DMA32_TXADDREXT_MASK)
-               return DMA_32BIT_MASK;
+               return DMA_BIT_MASK(32);
 
-       return DMA_30BIT_MASK;
+       return DMA_BIT_MASK(30);
 }
 
 static enum b43_dmatype dma_mask_to_engine_type(u64 dmamask)
 {
-       if (dmamask == DMA_30BIT_MASK)
+       if (dmamask == DMA_BIT_MASK(30))
                return B43_DMA_30BIT;
-       if (dmamask == DMA_32BIT_MASK)
+       if (dmamask == DMA_BIT_MASK(32))
                return B43_DMA_32BIT;
-       if (dmamask == DMA_64BIT_MASK)
+       if (dmamask == DMA_BIT_MASK(64))
                return B43_DMA_64BIT;
        B43_WARN_ON(1);
        return B43_DMA_30BIT;
@@ -999,13 +999,13 @@ static int b43_dma_set_mask(struct b43_wldev *dev, u64 mask)
                err = ssb_dma_set_mask(dev->dev, mask);
                if (!err)
                        break;
-               if (mask == DMA_64BIT_MASK) {
-                       mask = DMA_32BIT_MASK;
+               if (mask == DMA_BIT_MASK(64)) {
+                       mask = DMA_BIT_MASK(32);
                        fallback = 1;
                        continue;
                }
-               if (mask == DMA_32BIT_MASK) {
-                       mask = DMA_30BIT_MASK;
+               if (mask == DMA_BIT_MASK(32)) {
+                       mask = DMA_BIT_MASK(30);
                        fallback = 1;
                        continue;
                }
index 3649fc3670988219cd99185fc3acfbec6e162b3e..2f90fb9f5367fb9126cc8298f2194015e5bfa8dc 100644 (file)
@@ -846,7 +846,7 @@ static u64 supported_dma_mask(struct b43legacy_wldev *dev)
 
        tmp = b43legacy_read32(dev, SSB_TMSHIGH);
        if (tmp & SSB_TMSHIGH_DMA64)
-               return DMA_64BIT_MASK;
+               return DMA_BIT_MASK(64);
        mmio_base = b43legacy_dmacontroller_base(0, 0);
        b43legacy_write32(dev,
                        mmio_base + B43legacy_DMA32_TXCTL,
@@ -854,18 +854,18 @@ static u64 supported_dma_mask(struct b43legacy_wldev *dev)
        tmp = b43legacy_read32(dev, mmio_base +
                               B43legacy_DMA32_TXCTL);
        if (tmp & B43legacy_DMA32_TXADDREXT_MASK)
-               return DMA_32BIT_MASK;
+               return DMA_BIT_MASK(32);
 
-       return DMA_30BIT_MASK;
+       return DMA_BIT_MASK(30);
 }
 
 static enum b43legacy_dmatype dma_mask_to_engine_type(u64 dmamask)
 {
-       if (dmamask == DMA_30BIT_MASK)
+       if (dmamask == DMA_BIT_MASK(30))
                return B43legacy_DMA_30BIT;
-       if (dmamask == DMA_32BIT_MASK)
+       if (dmamask == DMA_BIT_MASK(32))
                return B43legacy_DMA_32BIT;
-       if (dmamask == DMA_64BIT_MASK)
+       if (dmamask == DMA_BIT_MASK(64))
                return B43legacy_DMA_64BIT;
        B43legacy_WARN_ON(1);
        return B43legacy_DMA_30BIT;
@@ -1042,13 +1042,13 @@ static int b43legacy_dma_set_mask(struct b43legacy_wldev *dev, u64 mask)
                err = ssb_dma_set_mask(dev->dev, mask);
                if (!err)
                        break;
-               if (mask == DMA_64BIT_MASK) {
-                       mask = DMA_32BIT_MASK;
+               if (mask == DMA_BIT_MASK(64)) {
+                       mask = DMA_BIT_MASK(32);
                        fallback = 1;
                        continue;
                }
-               if (mask == DMA_32BIT_MASK) {
-                       mask = DMA_30BIT_MASK;
+               if (mask == DMA_BIT_MASK(32)) {
+                       mask = DMA_BIT_MASK(30);
                        fallback = 1;
                        continue;
                }
index f4e963ba768bd49537186d0c3b2112e0b9213ff3..97e5647ff050d665fb7bd5c9f587d1b64f5be046 100644 (file)
@@ -6207,7 +6207,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
        pci_set_master(pci_dev);
        pci_set_drvdata(pci_dev, priv);
 
-       err = pci_set_dma_mask(pci_dev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32));
        if (err) {
                printk(KERN_WARNING DRV_NAME
                       "Error calling pci_set_dma_mask.\n");
index e17a4593e1f5f1d3c82fa5830b51d7c9bf78628a..bd4dbcfe1bbe9c54b675b07a8a9ed74004894a8f 100644 (file)
@@ -11631,9 +11631,9 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
 
        pci_set_master(pdev);
 
-       err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (!err)
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err) {
                printk(KERN_WARNING DRV_NAME ": No suitable DMA available.\n");
                goto out_pci_disable_device;
index 9d5f97dd7c738508afb731ac1b6ac0fe7fbbe928..ce729281ff62957db12127e095fe3cc96d1559f2 100644 (file)
@@ -4998,9 +4998,9 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
 
        pci_set_master(pdev);
 
-       err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (!err)
-               err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err) {
                IWL_WARN(priv, "No suitable DMA available.\n");
                goto out_pci_disable_device;
index 9a72b1e3e163bb597a075a11c65e9a66a3958312..30876728d7e6ecd4d7a3b64085f9c44c883f33f0 100644 (file)
@@ -120,7 +120,7 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        }
 
        /* enable PCI DMA */
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR "%s: 32-bit PCI DMA not supported", DRV_NAME);
                goto do_pci_disable_device;
         }
index e616c20d4a782c4dd014927057342e779396548a..43fa0f849003f5811c752168d37f9d274ef76705 100644 (file)
@@ -288,7 +288,7 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)
        if (pci_set_mwi(pci_dev))
                ERROR_PROBE("MWI not available.\n");
 
-       if (dma_set_mask(&pci_dev->dev, DMA_32BIT_MASK)) {
+       if (dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32))) {
                ERROR_PROBE("PCI DMA not supported.\n");
                retval = -EIO;
                goto exit_disable_device;
index 0cd5fbc7f2c2390eb31f260d2f5b71838389445f..8fdfa4f537a6ec9b4e189641f61130163c7dfa5c 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/timer.h>
 #include <linux/ioport.h>
 #include <linux/major.h>
+#include <linux/interrupt.h>
 
 #include <linux/parport.h>
 #include <linux/parport_pc.h>
@@ -192,7 +193,7 @@ static int parport_config(struct pcmcia_device *link)
 
     p = parport_pc_probe_port(link->io.BasePort1, link->io.BasePort2,
                              link->irq.AssignedIRQ, PARPORT_DMA_NONE,
-                             &link->dev);
+                             &link->dev, IRQF_SHARED);
     if (p == NULL) {
        printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at "
               "0x%3x, irq %u failed\n", link->io.BasePort1,
index 96f3bdf0ec4bd4a04aaad15647e48c005a31d2d3..4e63cc9e277827bfe74db6a778471dc92196cc25 100644 (file)
@@ -2170,10 +2170,11 @@ static int parport_dma_probe (struct parport *p)
 static LIST_HEAD(ports_list);
 static DEFINE_SPINLOCK(ports_lock);
 
-struct parport *parport_pc_probe_port (unsigned long int base,
-                                      unsigned long int base_hi,
-                                      int irq, int dma,
-                                      struct device *dev)
+struct parport *parport_pc_probe_port(unsigned long int base,
+                                     unsigned long int base_hi,
+                                     int irq, int dma,
+                                     struct device *dev,
+                                     int irqflags)
 {
        struct parport_pc_private *priv;
        struct parport_operations *ops;
@@ -2194,11 +2195,11 @@ struct parport *parport_pc_probe_port (unsigned long int base,
                dev = &pdev->dev;
        }
 
-       ops = kmalloc(sizeof (struct parport_operations), GFP_KERNEL);
+       ops = kmalloc(sizeof(struct parport_operations), GFP_KERNEL);
        if (!ops)
                goto out1;
 
-       priv = kmalloc (sizeof (struct parport_pc_private), GFP_KERNEL);
+       priv = kmalloc(sizeof(struct parport_pc_private), GFP_KERNEL);
        if (!priv)
                goto out2;
 
@@ -2325,8 +2326,8 @@ struct parport *parport_pc_probe_port (unsigned long int base,
                EPP_res = NULL;
        }
        if (p->irq != PARPORT_IRQ_NONE) {
-               if (request_irq (p->irq, parport_irq_handler,
-                                0, p->name, p)) {
+               if (request_irq(p->irq, parport_irq_handler,
+                                irqflags, p->name, p)) {
                        printk (KERN_WARNING "%s: irq %d in use, "
                                "resorting to polled operation\n",
                                p->name, p->irq);
@@ -2530,7 +2531,7 @@ static int __devinit sio_ite_8872_probe (struct pci_dev *pdev, int autoirq,
         */
        release_resource(base_res);
        if (parport_pc_probe_port (ite8872_lpt, ite8872_lpthi,
-                                  irq, PARPORT_DMA_NONE, &pdev->dev)) {
+                                  irq, PARPORT_DMA_NONE, &pdev->dev, 0)) {
                printk (KERN_INFO
                        "parport_pc: ITE 8872 parallel port: io=0x%X",
                        ite8872_lpt);
@@ -2713,7 +2714,7 @@ static int __devinit sio_via_probe (struct pci_dev *pdev, int autoirq,
        }
 
        /* finally, do the probe with values obtained */
-       if (parport_pc_probe_port (port1, port2, irq, dma, &pdev->dev)) {
+       if (parport_pc_probe_port (port1, port2, irq, dma, &pdev->dev, 0)) {
                printk (KERN_INFO
                        "parport_pc: VIA parallel port: io=0x%X", port1);
                if (irq != PARPORT_IRQ_NONE)
@@ -3018,6 +3019,7 @@ static int parport_pc_pci_probe (struct pci_dev *dev,
        for (n = 0; n < cards[i].numports; n++) {
                int lo = cards[i].addr[n].lo;
                int hi = cards[i].addr[n].hi;
+               int irq;
                unsigned long io_lo, io_hi;
                io_lo = pci_resource_start (dev, lo);
                io_hi = 0;
@@ -3028,13 +3030,25 @@ static int parport_pc_pci_probe (struct pci_dev *dev,
                                         "hi" as an offset (see SYBA
                                         def.) */
                /* TODO: test if sharing interrupts works */
-               printk (KERN_DEBUG "PCI parallel port detected: %04x:%04x, "
-                       "I/O at %#lx(%#lx)\n",
-                       parport_pc_pci_tbl[i + last_sio].vendor,
-                       parport_pc_pci_tbl[i + last_sio].device, io_lo, io_hi);
+               irq = dev->irq;
+               if (irq == IRQ_NONE) {
+                       printk (KERN_DEBUG
+       "PCI parallel port detected: %04x:%04x, I/O at %#lx(%#lx)\n",
+                               parport_pc_pci_tbl[i + last_sio].vendor,
+                               parport_pc_pci_tbl[i + last_sio].device,
+                               io_lo, io_hi);
+                       irq = PARPORT_IRQ_NONE;
+               } else {
+                       printk (KERN_DEBUG
+       "PCI parallel port detected: %04x:%04x, I/O at %#lx(%#lx), IRQ %d\n",
+                               parport_pc_pci_tbl[i + last_sio].vendor,
+                               parport_pc_pci_tbl[i + last_sio].device,
+                               io_lo, io_hi, irq);
+               }
                data->ports[count] =
-                       parport_pc_probe_port (io_lo, io_hi, PARPORT_IRQ_NONE,
-                                              PARPORT_DMA_NONE, &dev->dev);
+                       parport_pc_probe_port(io_lo, io_hi, irq,
+                                              PARPORT_DMA_NONE, &dev->dev,
+                                              IRQF_SHARED);
                if (data->ports[count])
                        count++;
        }
@@ -3143,7 +3157,8 @@ static int parport_pc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id
                dma = PARPORT_DMA_NONE;
 
        dev_info(&dev->dev, "reported by %s\n", dev->protocol->name);
-       if (!(pdata = parport_pc_probe_port (io_lo, io_hi, irq, dma, &dev->dev)))
+       if (!(pdata = parport_pc_probe_port(io_lo, io_hi,
+                                       irq, dma, &dev->dev, 0)))
                return -ENODEV;
 
        pnp_set_drvdata(dev,pdata);
@@ -3192,11 +3207,11 @@ parport_pc_find_isa_ports (int autoirq, int autodma)
 {
        int count = 0;
 
-       if (parport_pc_probe_port(0x3bc, 0x7bc, autoirq, autodma, NULL))
+       if (parport_pc_probe_port(0x3bc, 0x7bc, autoirq, autodma, NULL, 0))
                count++;
-       if (parport_pc_probe_port(0x378, 0x778, autoirq, autodma, NULL))
+       if (parport_pc_probe_port(0x378, 0x778, autoirq, autodma, NULL, 0))
                count++;
-       if (parport_pc_probe_port(0x278, 0x678, autoirq, autodma, NULL))
+       if (parport_pc_probe_port(0x278, 0x678, autoirq, autodma, NULL, 0))
                count++;
 
        return count;
@@ -3481,7 +3496,7 @@ static int __init parport_pc_init(void)
                        if ((io_hi[i]) == PARPORT_IOHI_AUTO)
                               io_hi[i] = 0x400 + io[i];
                        parport_pc_probe_port(io[i], io_hi[i],
-                                                 irqval[i], dmaval[i], NULL);
+                                         irqval[i], dmaval[i], NULL, 0);
                }
        } else
                parport_pc_find_ports (irqval[0], dmaval[0]);
index f3492110b1ad31bb8f895f2c2e6bde361221148c..c3bb84ac931ee577645aa13db06c8cdb9778c783 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/pci.h>
+#include <linux/interrupt.h>
 #include <linux/parport.h>
 #include <linux/parport_pc.h>
 #include <linux/8250_pci.h>
@@ -311,6 +312,7 @@ static int __devinit parport_register (struct pci_dev *dev,
                int lo = card->addr[n].lo;
                int hi = card->addr[n].hi;
                unsigned long io_lo, io_hi;
+               int irq;
 
                if (priv->num_par == ARRAY_SIZE (priv->port)) {
                        printk (KERN_WARNING
@@ -329,10 +331,20 @@ static int __devinit parport_register (struct pci_dev *dev,
                                         "hi" as an offset (see SYBA
                                         def.) */
                /* TODO: test if sharing interrupts works */
-               dev_dbg(&dev->dev, "PCI parallel port detected: I/O at "
-                       "%#lx(%#lx)\n", io_lo, io_hi);
-               port = parport_pc_probe_port (io_lo, io_hi, PARPORT_IRQ_NONE,
-                                             PARPORT_DMA_NONE, &dev->dev);
+               irq = dev->irq;
+               if (irq == IRQ_NONE) {
+                       dev_dbg(&dev->dev,
+                       "PCI parallel port detected: I/O at %#lx(%#lx)\n",
+                               io_lo, io_hi);
+                       irq = PARPORT_IRQ_NONE;
+               } else {
+                       dev_dbg(&dev->dev,
+               "PCI parallel port detected: I/O at %#lx(%#lx), IRQ %d\n",
+                               io_lo, io_hi, irq);
+                       irq = PARPORT_IRQ_NONE;
+               }
+               port = parport_pc_probe_port (io_lo, io_hi, irq,
+                             PARPORT_DMA_NONE, &dev->dev, IRQF_SHARED);
                if (port) {
                        priv->port[priv->num_par++] = port;
                        success = 1;
index d313039e2fdf8179dbc3324e7778b7e2e6bed964..25a00ce4f24d3f3a897c159f48d0b931200add54 100644 (file)
@@ -180,6 +180,7 @@ dmar_parse_one_drhd(struct acpi_dmar_header *header)
        dmaru->hdr = header;
        drhd = (struct acpi_dmar_hardware_unit *)header;
        dmaru->reg_base_addr = drhd->address;
+       dmaru->segment = drhd->segment;
        dmaru->include_all = drhd->flags & 0x1; /* BIT0: INCLUDE_ALL */
 
        ret = alloc_iommu(dmaru);
@@ -789,6 +790,35 @@ end:
        spin_unlock_irqrestore(&iommu->register_lock, flags);
 }
 
+/*
+ * Enable queued invalidation.
+ */
+static void __dmar_enable_qi(struct intel_iommu *iommu)
+{
+       u32 cmd, sts;
+       unsigned long flags;
+       struct q_inval *qi = iommu->qi;
+
+       qi->free_head = qi->free_tail = 0;
+       qi->free_cnt = QI_LENGTH;
+
+       spin_lock_irqsave(&iommu->register_lock, flags);
+
+       /* write zero to the tail reg */
+       writel(0, iommu->reg + DMAR_IQT_REG);
+
+       dmar_writeq(iommu->reg + DMAR_IQA_REG, virt_to_phys(qi->desc));
+
+       cmd = iommu->gcmd | DMA_GCMD_QIE;
+       iommu->gcmd |= DMA_GCMD_QIE;
+       writel(cmd, iommu->reg + DMAR_GCMD_REG);
+
+       /* Make sure hardware complete it */
+       IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, (sts & DMA_GSTS_QIES), sts);
+
+       spin_unlock_irqrestore(&iommu->register_lock, flags);
+}
+
 /*
  * Enable Queued Invalidation interface. This is a must to support
  * interrupt-remapping. Also used by DMA-remapping, which replaces
@@ -796,8 +826,6 @@ end:
  */
 int dmar_enable_qi(struct intel_iommu *iommu)
 {
-       u32 cmd, sts;
-       unsigned long flags;
        struct q_inval *qi;
 
        if (!ecap_qis(iommu->ecap))
@@ -835,19 +863,7 @@ int dmar_enable_qi(struct intel_iommu *iommu)
 
        spin_lock_init(&qi->q_lock);
 
-       spin_lock_irqsave(&iommu->register_lock, flags);
-       /* write zero to the tail reg */
-       writel(0, iommu->reg + DMAR_IQT_REG);
-
-       dmar_writeq(iommu->reg + DMAR_IQA_REG, virt_to_phys(qi->desc));
-
-       cmd = iommu->gcmd | DMA_GCMD_QIE;
-       iommu->gcmd |= DMA_GCMD_QIE;
-       writel(cmd, iommu->reg + DMAR_GCMD_REG);
-
-       /* Make sure hardware complete it */
-       IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG, readl, (sts & DMA_GSTS_QIES), sts);
-       spin_unlock_irqrestore(&iommu->register_lock, flags);
+       __dmar_enable_qi(iommu);
 
        return 0;
 }
@@ -1102,3 +1118,28 @@ int __init enable_drhd_fault_handling(void)
 
        return 0;
 }
+
+/*
+ * Re-enable Queued Invalidation interface.
+ */
+int dmar_reenable_qi(struct intel_iommu *iommu)
+{
+       if (!ecap_qis(iommu->ecap))
+               return -ENOENT;
+
+       if (!iommu->qi)
+               return -ENOENT;
+
+       /*
+        * First disable queued invalidation.
+        */
+       dmar_disable_qi(iommu);
+       /*
+        * Then enable queued invalidation again. Since there is no pending
+        * invalidation requests now, it's safe to re-enable queued
+        * invalidation.
+        */
+       __dmar_enable_qi(iommu);
+
+       return 0;
+}
index 23e56a564e05056a208ac41d98828d32987865b7..fb3a3f3fca7a4835aab7fef7bb45edd84a2df182 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/iova.h>
 #include <linux/iommu.h>
 #include <linux/intel-iommu.h>
+#include <linux/sysdev.h>
 #include <asm/cacheflush.h>
 #include <asm/iommu.h>
 #include "pci.h"
@@ -55,8 +56,8 @@
 #define DOMAIN_MAX_ADDR(gaw) ((((u64)1) << gaw) - 1)
 
 #define IOVA_PFN(addr)         ((addr) >> PAGE_SHIFT)
-#define DMA_32BIT_PFN          IOVA_PFN(DMA_32BIT_MASK)
-#define DMA_64BIT_PFN          IOVA_PFN(DMA_64BIT_MASK)
+#define DMA_32BIT_PFN          IOVA_PFN(DMA_BIT_MASK(32))
+#define DMA_64BIT_PFN          IOVA_PFN(DMA_BIT_MASK(64))
 
 /* global iommu list, set NULL for ignored DMAR units */
 static struct intel_iommu **g_iommus;
@@ -247,7 +248,8 @@ struct dmar_domain {
 struct device_domain_info {
        struct list_head link;  /* link to domain siblings */
        struct list_head global; /* link to global list */
-       u8 bus;                 /* PCI bus numer */
+       int segment;            /* PCI domain */
+       u8 bus;                 /* PCI bus number */
        u8 devfn;               /* PCI devfn number */
        struct pci_dev *dev; /* it's NULL for PCIE-to-PCI bridge */
        struct dmar_domain *domain; /* pointer to domain */
@@ -467,7 +469,7 @@ static void domain_update_iommu_cap(struct dmar_domain *domain)
        domain_update_iommu_snooping(domain);
 }
 
-static struct intel_iommu *device_to_iommu(u8 bus, u8 devfn)
+static struct intel_iommu *device_to_iommu(int segment, u8 bus, u8 devfn)
 {
        struct dmar_drhd_unit *drhd = NULL;
        int i;
@@ -475,12 +477,20 @@ static struct intel_iommu *device_to_iommu(u8 bus, u8 devfn)
        for_each_drhd_unit(drhd) {
                if (drhd->ignored)
                        continue;
+               if (segment != drhd->segment)
+                       continue;
 
-               for (i = 0; i < drhd->devices_cnt; i++)
+               for (i = 0; i < drhd->devices_cnt; i++) {
                        if (drhd->devices[i] &&
                            drhd->devices[i]->bus->number == bus &&
                            drhd->devices[i]->devfn == devfn)
                                return drhd->iommu;
+                       if (drhd->devices[i] &&
+                           drhd->devices[i]->subordinate &&
+                           drhd->devices[i]->subordinate->number <= bus &&
+                           drhd->devices[i]->subordinate->subordinate >= bus)
+                               return drhd->iommu;
+               }
 
                if (drhd->include_all)
                        return drhd->iommu;
@@ -1312,7 +1322,7 @@ static void domain_exit(struct dmar_domain *domain)
 }
 
 static int domain_context_mapping_one(struct dmar_domain *domain,
-               u8 bus, u8 devfn)
+                                     int segment, u8 bus, u8 devfn)
 {
        struct context_entry *context;
        unsigned long flags;
@@ -1327,7 +1337,7 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
                bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
        BUG_ON(!domain->pgd);
 
-       iommu = device_to_iommu(bus, devfn);
+       iommu = device_to_iommu(segment, bus, devfn);
        if (!iommu)
                return -ENODEV;
 
@@ -1417,8 +1427,8 @@ domain_context_mapping(struct dmar_domain *domain, struct pci_dev *pdev)
        int ret;
        struct pci_dev *tmp, *parent;
 
-       ret = domain_context_mapping_one(domain, pdev->bus->number,
-               pdev->devfn);
+       ret = domain_context_mapping_one(domain, pci_domain_nr(pdev->bus),
+                                        pdev->bus->number, pdev->devfn);
        if (ret)
                return ret;
 
@@ -1429,18 +1439,23 @@ domain_context_mapping(struct dmar_domain *domain, struct pci_dev *pdev)
        /* Secondary interface's bus number and devfn 0 */
        parent = pdev->bus->self;
        while (parent != tmp) {
-               ret = domain_context_mapping_one(domain, parent->bus->number,
-                       parent->devfn);
+               ret = domain_context_mapping_one(domain,
+                                                pci_domain_nr(parent->bus),
+                                                parent->bus->number,
+                                                parent->devfn);
                if (ret)
                        return ret;
                parent = parent->bus->self;
        }
        if (tmp->is_pcie) /* this is a PCIE-to-PCI bridge */
                return domain_context_mapping_one(domain,
-                       tmp->subordinate->number, 0);
+                                       pci_domain_nr(tmp->subordinate),
+                                       tmp->subordinate->number, 0);
        else /* this is a legacy PCI bridge */
                return domain_context_mapping_one(domain,
-                       tmp->bus->number, tmp->devfn);
+                                                 pci_domain_nr(tmp->bus),
+                                                 tmp->bus->number,
+                                                 tmp->devfn);
 }
 
 static int domain_context_mapped(struct pci_dev *pdev)
@@ -1449,12 +1464,12 @@ static int domain_context_mapped(struct pci_dev *pdev)
        struct pci_dev *tmp, *parent;
        struct intel_iommu *iommu;
 
-       iommu = device_to_iommu(pdev->bus->number, pdev->devfn);
+       iommu = device_to_iommu(pci_domain_nr(pdev->bus), pdev->bus->number,
+                               pdev->devfn);
        if (!iommu)
                return -ENODEV;
 
-       ret = device_context_mapped(iommu,
-               pdev->bus->number, pdev->devfn);
+       ret = device_context_mapped(iommu, pdev->bus->number, pdev->devfn);
        if (!ret)
                return ret;
        /* dependent device mapping */
@@ -1465,17 +1480,17 @@ static int domain_context_mapped(struct pci_dev *pdev)
        parent = pdev->bus->self;
        while (parent != tmp) {
                ret = device_context_mapped(iommu, parent->bus->number,
-                       parent->devfn);
+                                           parent->devfn);
                if (!ret)
                        return ret;
                parent = parent->bus->self;
        }
        if (tmp->is_pcie)
-               return device_context_mapped(iommu,
-                       tmp->subordinate->number, 0);
+               return device_context_mapped(iommu, tmp->subordinate->number,
+                                            0);
        else
-               return device_context_mapped(iommu,
-                       tmp->bus->number, tmp->devfn);
+               return device_context_mapped(iommu, tmp->bus->number,
+                                            tmp->devfn);
 }
 
 static int
@@ -1542,7 +1557,7 @@ static void domain_remove_dev_info(struct dmar_domain *domain)
                        info->dev->dev.archdata.iommu = NULL;
                spin_unlock_irqrestore(&device_domain_lock, flags);
 
-               iommu = device_to_iommu(info->bus, info->devfn);
+               iommu = device_to_iommu(info->segment, info->bus, info->devfn);
                iommu_detach_dev(iommu, info->bus, info->devfn);
                free_devinfo_mem(info);
 
@@ -1577,11 +1592,14 @@ static struct dmar_domain *get_domain_for_dev(struct pci_dev *pdev, int gaw)
        struct pci_dev *dev_tmp;
        unsigned long flags;
        int bus = 0, devfn = 0;
+       int segment;
 
        domain = find_domain(pdev);
        if (domain)
                return domain;
 
+       segment = pci_domain_nr(pdev->bus);
+
        dev_tmp = pci_find_upstream_pcie_bridge(pdev);
        if (dev_tmp) {
                if (dev_tmp->is_pcie) {
@@ -1593,7 +1611,8 @@ static struct dmar_domain *get_domain_for_dev(struct pci_dev *pdev, int gaw)
                }
                spin_lock_irqsave(&device_domain_lock, flags);
                list_for_each_entry(info, &device_domain_list, global) {
-                       if (info->bus == bus && info->devfn == devfn) {
+                       if (info->segment == segment &&
+                           info->bus == bus && info->devfn == devfn) {
                                found = info->domain;
                                break;
                        }
@@ -1631,6 +1650,7 @@ static struct dmar_domain *get_domain_for_dev(struct pci_dev *pdev, int gaw)
                        domain_exit(domain);
                        goto error;
                }
+               info->segment = segment;
                info->bus = bus;
                info->devfn = devfn;
                info->dev = NULL;
@@ -1642,7 +1662,8 @@ static struct dmar_domain *get_domain_for_dev(struct pci_dev *pdev, int gaw)
                found = NULL;
                spin_lock_irqsave(&device_domain_lock, flags);
                list_for_each_entry(tmp, &device_domain_list, global) {
-                       if (tmp->bus == bus && tmp->devfn == devfn) {
+                       if (tmp->segment == segment &&
+                           tmp->bus == bus && tmp->devfn == devfn) {
                                found = tmp->domain;
                                break;
                        }
@@ -1662,6 +1683,7 @@ found_domain:
        info = alloc_devinfo_mem();
        if (!info)
                goto error;
+       info->segment = segment;
        info->bus = pdev->bus->number;
        info->devfn = pdev->devfn;
        info->dev = pdev;
@@ -1946,6 +1968,15 @@ static int __init init_dmars(void)
                }
        }
 
+#ifdef CONFIG_INTR_REMAP
+       if (!intr_remapping_enabled) {
+               ret = enable_intr_remapping(0);
+               if (ret)
+                       printk(KERN_ERR
+                              "IOMMU: enable interrupt remapping failed\n");
+       }
+#endif
+
        /*
         * For each rmrr
         *   for each dev attached to rmrr
@@ -2049,15 +2080,15 @@ __intel_alloc_iova(struct device *dev, struct dmar_domain *domain,
        struct pci_dev *pdev = to_pci_dev(dev);
        struct iova *iova = NULL;
 
-       if (dma_mask <= DMA_32BIT_MASK || dmar_forcedac)
+       if (dma_mask <= DMA_BIT_MASK(32) || dmar_forcedac)
                iova = iommu_alloc_iova(domain, size, dma_mask);
        else {
                /*
                 * First try to allocate an io virtual address in
-                * DMA_32BIT_MASK and if that fails then try allocating
+                * DMA_BIT_MASK(32) and if that fails then try allocating
                 * from higher range
                 */
-               iova = iommu_alloc_iova(domain, size, DMA_32BIT_MASK);
+               iova = iommu_alloc_iova(domain, size, DMA_BIT_MASK(32));
                if (!iova)
                        iova = iommu_alloc_iova(domain, size, dma_mask);
        }
@@ -2597,6 +2628,150 @@ static void __init init_no_remapping_devices(void)
        }
 }
 
+#ifdef CONFIG_SUSPEND
+static int init_iommu_hw(void)
+{
+       struct dmar_drhd_unit *drhd;
+       struct intel_iommu *iommu = NULL;
+
+       for_each_active_iommu(iommu, drhd)
+               if (iommu->qi)
+                       dmar_reenable_qi(iommu);
+
+       for_each_active_iommu(iommu, drhd) {
+               iommu_flush_write_buffer(iommu);
+
+               iommu_set_root_entry(iommu);
+
+               iommu->flush.flush_context(iommu, 0, 0, 0,
+                                               DMA_CCMD_GLOBAL_INVL, 0);
+               iommu->flush.flush_iotlb(iommu, 0, 0, 0,
+                                               DMA_TLB_GLOBAL_FLUSH, 0);
+               iommu_disable_protect_mem_regions(iommu);
+               iommu_enable_translation(iommu);
+       }
+
+       return 0;
+}
+
+static void iommu_flush_all(void)
+{
+       struct dmar_drhd_unit *drhd;
+       struct intel_iommu *iommu;
+
+       for_each_active_iommu(iommu, drhd) {
+               iommu->flush.flush_context(iommu, 0, 0, 0,
+                                               DMA_CCMD_GLOBAL_INVL, 0);
+               iommu->flush.flush_iotlb(iommu, 0, 0, 0,
+                                               DMA_TLB_GLOBAL_FLUSH, 0);
+       }
+}
+
+static int iommu_suspend(struct sys_device *dev, pm_message_t state)
+{
+       struct dmar_drhd_unit *drhd;
+       struct intel_iommu *iommu = NULL;
+       unsigned long flag;
+
+       for_each_active_iommu(iommu, drhd) {
+               iommu->iommu_state = kzalloc(sizeof(u32) * MAX_SR_DMAR_REGS,
+                                                GFP_ATOMIC);
+               if (!iommu->iommu_state)
+                       goto nomem;
+       }
+
+       iommu_flush_all();
+
+       for_each_active_iommu(iommu, drhd) {
+               iommu_disable_translation(iommu);
+
+               spin_lock_irqsave(&iommu->register_lock, flag);
+
+               iommu->iommu_state[SR_DMAR_FECTL_REG] =
+                       readl(iommu->reg + DMAR_FECTL_REG);
+               iommu->iommu_state[SR_DMAR_FEDATA_REG] =
+                       readl(iommu->reg + DMAR_FEDATA_REG);
+               iommu->iommu_state[SR_DMAR_FEADDR_REG] =
+                       readl(iommu->reg + DMAR_FEADDR_REG);
+               iommu->iommu_state[SR_DMAR_FEUADDR_REG] =
+                       readl(iommu->reg + DMAR_FEUADDR_REG);
+
+               spin_unlock_irqrestore(&iommu->register_lock, flag);
+       }
+       return 0;
+
+nomem:
+       for_each_active_iommu(iommu, drhd)
+               kfree(iommu->iommu_state);
+
+       return -ENOMEM;
+}
+
+static int iommu_resume(struct sys_device *dev)
+{
+       struct dmar_drhd_unit *drhd;
+       struct intel_iommu *iommu = NULL;
+       unsigned long flag;
+
+       if (init_iommu_hw()) {
+               WARN(1, "IOMMU setup failed, DMAR can not resume!\n");
+               return -EIO;
+       }
+
+       for_each_active_iommu(iommu, drhd) {
+
+               spin_lock_irqsave(&iommu->register_lock, flag);
+
+               writel(iommu->iommu_state[SR_DMAR_FECTL_REG],
+                       iommu->reg + DMAR_FECTL_REG);
+               writel(iommu->iommu_state[SR_DMAR_FEDATA_REG],
+                       iommu->reg + DMAR_FEDATA_REG);
+               writel(iommu->iommu_state[SR_DMAR_FEADDR_REG],
+                       iommu->reg + DMAR_FEADDR_REG);
+               writel(iommu->iommu_state[SR_DMAR_FEUADDR_REG],
+                       iommu->reg + DMAR_FEUADDR_REG);
+
+               spin_unlock_irqrestore(&iommu->register_lock, flag);
+       }
+
+       for_each_active_iommu(iommu, drhd)
+               kfree(iommu->iommu_state);
+
+       return 0;
+}
+
+static struct sysdev_class iommu_sysclass = {
+       .name           = "iommu",
+       .resume         = iommu_resume,
+       .suspend        = iommu_suspend,
+};
+
+static struct sys_device device_iommu = {
+       .cls    = &iommu_sysclass,
+};
+
+static int __init init_iommu_sysfs(void)
+{
+       int error;
+
+       error = sysdev_class_register(&iommu_sysclass);
+       if (error)
+               return error;
+
+       error = sysdev_register(&device_iommu);
+       if (error)
+               sysdev_class_unregister(&iommu_sysclass);
+
+       return error;
+}
+
+#else
+static int __init init_iommu_sysfs(void)
+{
+       return 0;
+}
+#endif /* CONFIG_PM */
+
 int __init intel_iommu_init(void)
 {
        int ret = 0;
@@ -2632,6 +2807,7 @@ int __init intel_iommu_init(void)
        init_timer(&unmap_timer);
        force_iommu = 1;
        dma_ops = &intel_dma_ops;
+       init_iommu_sysfs();
 
        register_iommu(&intel_iommu_ops);
 
@@ -2648,6 +2824,7 @@ static int vm_domain_add_dev_info(struct dmar_domain *domain,
        if (!info)
                return -ENOMEM;
 
+       info->segment = pci_domain_nr(pdev->bus);
        info->bus = pdev->bus->number;
        info->devfn = pdev->devfn;
        info->dev = pdev;
@@ -2677,15 +2854,15 @@ static void iommu_detach_dependent_devices(struct intel_iommu *iommu,
                parent = pdev->bus->self;
                while (parent != tmp) {
                        iommu_detach_dev(iommu, parent->bus->number,
-                               parent->devfn);
+                                        parent->devfn);
                        parent = parent->bus->self;
                }
                if (tmp->is_pcie) /* this is a PCIE-to-PCI bridge */
                        iommu_detach_dev(iommu,
                                tmp->subordinate->number, 0);
                else /* this is a legacy PCI bridge */
-                       iommu_detach_dev(iommu,
-                               tmp->bus->number, tmp->devfn);
+                       iommu_detach_dev(iommu, tmp->bus->number,
+                                        tmp->devfn);
        }
 }
 
@@ -2698,13 +2875,15 @@ static void vm_domain_remove_one_dev_info(struct dmar_domain *domain,
        int found = 0;
        struct list_head *entry, *tmp;
 
-       iommu = device_to_iommu(pdev->bus->number, pdev->devfn);
+       iommu = device_to_iommu(pci_domain_nr(pdev->bus), pdev->bus->number,
+                               pdev->devfn);
        if (!iommu)
                return;
 
        spin_lock_irqsave(&device_domain_lock, flags);
        list_for_each_safe(entry, tmp, &domain->devices) {
                info = list_entry(entry, struct device_domain_info, link);
+               /* No need to compare PCI domain; it has to be the same */
                if (info->bus == pdev->bus->number &&
                    info->devfn == pdev->devfn) {
                        list_del(&info->link);
@@ -2729,7 +2908,8 @@ static void vm_domain_remove_one_dev_info(struct dmar_domain *domain,
                 * owned by this domain, clear this iommu in iommu_bmp
                 * update iommu count and coherency
                 */
-               if (device_to_iommu(info->bus, info->devfn) == iommu)
+               if (iommu == device_to_iommu(info->segment, info->bus,
+                                           info->devfn))
                        found = 1;
        }
 
@@ -2762,7 +2942,7 @@ static void vm_domain_remove_all_dev_info(struct dmar_domain *domain)
 
                spin_unlock_irqrestore(&device_domain_lock, flags1);
 
-               iommu = device_to_iommu(info->bus, info->devfn);
+               iommu = device_to_iommu(info->segment, info->bus, info->devfn);
                iommu_detach_dev(iommu, info->bus, info->devfn);
                iommu_detach_dependent_devices(iommu, info->dev);
 
@@ -2950,7 +3130,8 @@ static int intel_iommu_attach_device(struct iommu_domain *domain,
                }
        }
 
-       iommu = device_to_iommu(pdev->bus->number, pdev->devfn);
+       iommu = device_to_iommu(pci_domain_nr(pdev->bus), pdev->bus->number,
+                               pdev->devfn);
        if (!iommu)
                return -ENODEV;
 
index b041a409f4a70f84e4a76ed4e0011c758aa31d71..f5e0ea724a6f53a12d26443fba84b01ab898f35d 100644 (file)
@@ -9,6 +9,7 @@
 #include <asm/cpu.h>
 #include <linux/intel-iommu.h>
 #include "intr_remapping.h"
+#include <acpi/acpi.h>
 
 static struct ioapic_scope ir_ioapic[MAX_IO_APICS];
 static int ir_ioapic_num;
@@ -415,12 +416,27 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode)
 
        /* Set interrupt-remapping table pointer */
        cmd = iommu->gcmd | DMA_GCMD_SIRTP;
+       iommu->gcmd |= DMA_GCMD_SIRTP;
        writel(cmd, iommu->reg + DMAR_GCMD_REG);
 
        IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG,
                      readl, (sts & DMA_GSTS_IRTPS), sts);
        spin_unlock_irqrestore(&iommu->register_lock, flags);
 
+       if (mode == 0) {
+               spin_lock_irqsave(&iommu->register_lock, flags);
+
+               /* enable comaptiblity format interrupt pass through */
+               cmd = iommu->gcmd | DMA_GCMD_CFI;
+               iommu->gcmd |= DMA_GCMD_CFI;
+               writel(cmd, iommu->reg + DMAR_GCMD_REG);
+
+               IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG,
+                             readl, (sts & DMA_GSTS_CFIS), sts);
+
+               spin_unlock_irqrestore(&iommu->register_lock, flags);
+       }
+
        /*
         * global invalidation of interrupt entry cache before enabling
         * interrupt-remapping.
@@ -470,7 +486,7 @@ static int setup_intr_remapping(struct intel_iommu *iommu, int mode)
 /*
  * Disable Interrupt Remapping.
  */
-static void disable_intr_remapping(struct intel_iommu *iommu)
+static void iommu_disable_intr_remapping(struct intel_iommu *iommu)
 {
        unsigned long flags;
        u32 sts;
@@ -478,6 +494,12 @@ static void disable_intr_remapping(struct intel_iommu *iommu)
        if (!ecap_ir_support(iommu->ecap))
                return;
 
+       /*
+        * global invalidation of interrupt entry cache before disabling
+        * interrupt-remapping.
+        */
+       qi_global_iec(iommu);
+
        spin_lock_irqsave(&iommu->register_lock, flags);
 
        sts = dmar_readq(iommu->reg + DMAR_GSTS_REG);
@@ -502,6 +524,13 @@ int __init enable_intr_remapping(int eim)
        for_each_drhd_unit(drhd) {
                struct intel_iommu *iommu = drhd->iommu;
 
+               /*
+                * If the queued invalidation is already initialized,
+                * shouldn't disable it.
+                */
+               if (iommu->qi)
+                       continue;
+
                /*
                 * Clear previous faults.
                 */
@@ -511,7 +540,7 @@ int __init enable_intr_remapping(int eim)
                 * Disable intr remapping and queued invalidation, if already
                 * enabled prior to OS handover.
                 */
-               disable_intr_remapping(iommu);
+               iommu_disable_intr_remapping(iommu);
 
                dmar_disable_qi(iommu);
        }
@@ -639,3 +668,54 @@ int __init parse_ioapics_under_ir(void)
 
        return ir_supported;
 }
+
+void disable_intr_remapping(void)
+{
+       struct dmar_drhd_unit *drhd;
+       struct intel_iommu *iommu = NULL;
+
+       /*
+        * Disable Interrupt-remapping for all the DRHD's now.
+        */
+       for_each_iommu(iommu, drhd) {
+               if (!ecap_ir_support(iommu->ecap))
+                       continue;
+
+               iommu_disable_intr_remapping(iommu);
+       }
+}
+
+int reenable_intr_remapping(int eim)
+{
+       struct dmar_drhd_unit *drhd;
+       int setup = 0;
+       struct intel_iommu *iommu = NULL;
+
+       for_each_iommu(iommu, drhd)
+               if (iommu->qi)
+                       dmar_reenable_qi(iommu);
+
+       /*
+        * Setup Interrupt-remapping for all the DRHD's now.
+        */
+       for_each_iommu(iommu, drhd) {
+               if (!ecap_ir_support(iommu->ecap))
+                       continue;
+
+               /* Set up interrupt remapping for iommu.*/
+               iommu_set_intr_remapping(iommu, eim);
+               setup = 1;
+       }
+
+       if (!setup)
+               goto error;
+
+       return 0;
+
+error:
+       /*
+        * handle error condition gracefully here!
+        */
+       return -1;
+}
+
index efea128f02daa22bd59db27064bd58e574ffeee3..4a651f69e17c0c2c26f1e30b1bfb6c187d2b25cb 100644 (file)
@@ -167,7 +167,7 @@ struct pnp_card *pnp_alloc_card(struct pnp_protocol *protocol, int id, char *pnp
        card->dev.parent = &card->protocol->dev;
        dev_set_name(&card->dev, "%02x:%02x", card->protocol->number, card->number);
 
-       card->dev.coherent_dma_mask = DMA_24BIT_MASK;
+       card->dev.coherent_dma_mask = DMA_BIT_MASK(24);
        card->dev.dma_mask = &card->dev.coherent_dma_mask;
 
        dev_id = pnp_add_card_id(card, pnpid);
index 14814f231739fcfb975be5bda1b47b1a29fceb0c..5dba90995d9e1b4532b81341e2c195f620c1046c 100644 (file)
@@ -137,7 +137,7 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid
        INIT_LIST_HEAD(&dev->options);
        dev->protocol = protocol;
        dev->number = id;
-       dev->dma_mask = DMA_24BIT_MASK;
+       dev->dma_mask = DMA_BIT_MASK(24);
 
        dev->dev.parent = &dev->protocol->dev;
        dev->dev.bus = &pnp_bus_type;
index 5c13f61bfb1b5003f67ea3142275444f776242e4..74d0bfa3f3108c020ed9c7b59a0262e8549188df 100644 (file)
@@ -381,9 +381,9 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
        rdev->dev.release = rio_release_dev;
        rio_dev_get(rdev);
 
-       rdev->dma_mask = DMA_32BIT_MASK;
+       rdev->dma_mask = DMA_BIT_MASK(32);
        rdev->dev.dma_mask = &rdev->dma_mask;
-       rdev->dev.coherent_dma_mask = DMA_32BIT_MASK;
+       rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
 
        if ((rdev->pef & RIO_PEF_INB_DOORBELL) &&
            (rdev->dst_ops & RIO_DST_OPS_DOORBELL))
index a12783ebb42d39a829c0a3d1c24c5c87222af302..fdb14ec4fd47aeb156c1adb9558acfb18b3b4ddd 100644 (file)
@@ -2016,10 +2016,10 @@ static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id
        pci_set_master(pdev);
        pci_try_set_mwi(pdev);
 
-       if (pci_set_dma_mask(pdev, DMA_64BIT_MASK)
-           || pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))
-               if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)
-                   || pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
+           || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
+               if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
+                   || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
                        TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
                        retval = -ENODEV;
                        goto out_disable_device;
index 0742e68466565459fffc6a7ae6ffaae4f91c9422..8e71e5e122b37c4b0d60263976abe27acf19a6d2 100644 (file)
@@ -234,7 +234,7 @@ static unsigned char tw_sense_table[][4] =
 #define TW_IOCTL_TIMEOUT                      25 /* 25 seconds */
 #define TW_IOCTL_CHRDEV_TIMEOUT               60 /* 60 seconds */
 #define TW_IOCTL_CHRDEV_FREE                  -1
-#define TW_DMA_MASK                          DMA_32BIT_MASK
+#define TW_DMA_MASK                          DMA_BIT_MASK(32)
 #define TW_MAX_CDB_LEN                       16
 
 /* Bitmask macros to eliminate bitfields */
index 2d689af2466419a70d51afddad85572db31dc507..1ddcf4031d4cf6b21dac5bb95e06ae7117eb577a 100644 (file)
@@ -667,7 +667,7 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd
                if (pci_enable_device(PCI_Device))
                        continue;
 
-               if (pci_set_dma_mask(PCI_Device, DMA_32BIT_MASK ))
+               if (pci_set_dma_mask(PCI_Device, DMA_BIT_MASK(32) ))
                        continue;
 
                Bus = PCI_Device->bus->number;
@@ -834,7 +834,7 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd
                if (pci_enable_device(PCI_Device))
                        continue;
 
-               if (pci_set_dma_mask(PCI_Device, DMA_32BIT_MASK))
+               if (pci_set_dma_mask(PCI_Device, DMA_BIT_MASK(32)))
                        continue;
 
                Bus = PCI_Device->bus->number;
@@ -888,7 +888,7 @@ static int __init BusLogic_InitializeFlashPointProbeInfo(struct BusLogic_HostAda
                if (pci_enable_device(PCI_Device))
                        continue;
 
-               if (pci_set_dma_mask(PCI_Device, DMA_32BIT_MASK))
+               if (pci_set_dma_mask(PCI_Device, DMA_BIT_MASK(32)))
                        continue;
 
                Bus = PCI_Device->bus->number;
index 20297c521e50ed7c968cd40b6779af5e45ea6423..8ed2990c826eb04a5d320088732d6d19bf0ab1c7 100644 (file)
@@ -121,10 +121,11 @@ config BLK_DEV_SR
        tristate "SCSI CDROM support"
        depends on SCSI
        ---help---
-         If you want to use a SCSI or FireWire CD-ROM under Linux,
-         say Y and read the SCSI-HOWTO and the CDROM-HOWTO at
-         <http://www.tldp.org/docs.html#howto>. Also make sure to say
-         Y or M to "ISO 9660 CD-ROM file system support" later.
+         If you want to use a CD or DVD drive attached to your computer
+         by SCSI, FireWire, USB or ATAPI, say Y and read the SCSI-HOWTO
+         and the CDROM-HOWTO at <http://www.tldp.org/docs.html#howto>.
+
+         Make sure to say Y or M to "ISO 9660 CD-ROM file system support".
 
          To compile this driver as a module, choose M here and read
          <file:Documentation/scsi/scsi.txt>.
@@ -614,10 +615,16 @@ config LIBFC
        ---help---
          Fibre Channel library module
 
+config LIBFCOE
+       tristate "LibFCoE module"
+       select LIBFC
+       ---help---
+         Library for Fibre Channel over Ethernet module
+
 config FCOE
        tristate "FCoE module"
        depends on PCI
-       select LIBFC
+       select LIBFCOE
        ---help---
          Fibre Channel over Ethernet module
 
index cf7929634668e83a304d09f2a5d2f552d1c4d28b..e7c861ac417dcd710fbe04dd0e8c598cf449a4e4 100644 (file)
@@ -37,6 +37,7 @@ obj-$(CONFIG_SCSI_SRP_ATTRS)  += scsi_transport_srp.o
 obj-$(CONFIG_SCSI_DH)          += device_handler/
 
 obj-$(CONFIG_LIBFC)            += libfc/
+obj-$(CONFIG_LIBFCOE)          += fcoe/
 obj-$(CONFIG_FCOE)             += fcoe/
 obj-$(CONFIG_ISCSI_TCP)        += libiscsi.o   libiscsi_tcp.o iscsi_tcp.o
 obj-$(CONFIG_INFINIBAND_ISER)  += libiscsi.o
index 964769f66eac98e9bc4ef8423a9e99d112323739..208d6df9ed5905d36b8fa56a82e95ae2f085ac5a 100644 (file)
@@ -1094,7 +1094,7 @@ static int __devinit inia100_probe_one(struct pci_dev *pdev,
 
        if (pci_enable_device(pdev))
                goto out;
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING "Unable to set 32bit DMA "
                                    "on inia100 adapter, ignoring.\n");
                goto out_disable_device;
index 37dd47136fb1104c55e05478cfe1dcd99bc7c507..4b38c4750f77ab2f27af3a4ea9088d25e34cd64f 100644 (file)
@@ -23,6 +23,8 @@
 #define DMA(ptr) ((a2091_scsiregs *)((ptr)->base))
 #define HDATA(ptr) ((struct WD33C93_hostdata *)((ptr)->hostdata))
 
+static int a2091_release(struct Scsi_Host *instance);
+
 static irqreturn_t a2091_intr (int irq, void *_instance)
 {
     unsigned long flags;
@@ -144,7 +146,7 @@ static void dma_stop(struct Scsi_Host *instance, struct scsi_cmnd *SCpnt,
     }
 }
 
-int __init a2091_detect(struct scsi_host_template *tpnt)
+static int __init a2091_detect(struct scsi_host_template *tpnt)
 {
     static unsigned char called = 0;
     struct Scsi_Host *instance;
@@ -233,7 +235,7 @@ static struct scsi_host_template driver_template = {
 
 #include "scsi_module.c"
 
-int a2091_release(struct Scsi_Host *instance)
+static int a2091_release(struct Scsi_Host *instance)
 {
 #ifdef MODULE
        DMA(instance)->CNTR = 0;
index fe809bc88d73bb419e27479f416cfe41a6ad801c..252528f2672e286bf029c766a273f6e8784094ac 100644 (file)
@@ -11,9 +11,6 @@
 
 #include <linux/types.h>
 
-int a2091_detect(struct scsi_host_template *);
-int a2091_release(struct Scsi_Host *);
-
 #ifndef CMD_PER_LUN
 #define CMD_PER_LUN 2
 #endif
index 8b449d8acacdb4f249cfa80480a94c9e8cff4cc3..6970ce82c4ac37a7ca03d1c456596e92fcb81922 100644 (file)
@@ -25,6 +25,8 @@
 
 static struct Scsi_Host *a3000_host = NULL;
 
+static int a3000_release(struct Scsi_Host *instance);
+
 static irqreturn_t a3000_intr (int irq, void *dummy)
 {
        unsigned long flags;
@@ -157,7 +159,7 @@ static void dma_stop(struct Scsi_Host *instance, struct scsi_cmnd *SCpnt,
     }
 }
 
-int __init a3000_detect(struct scsi_host_template *tpnt)
+static int __init a3000_detect(struct scsi_host_template *tpnt)
 {
     wd33c93_regs regs;
 
@@ -232,7 +234,7 @@ static struct scsi_host_template driver_template = {
 
 #include "scsi_module.c"
 
-int a3000_release(struct Scsi_Host *instance)
+static int a3000_release(struct Scsi_Host *instance)
 {
     wd33c93_release();
     DMA(instance)->CNTR = 0;
index 44a4ec7b46503805e4452e1170c32e7daf0d1995..c7afe16fd6e40e8b0873cbce25bf31c88447faf7 100644 (file)
@@ -11,9 +11,6 @@
 
 #include <linux/types.h>
 
-int a3000_detect(struct scsi_host_template *);
-int a3000_release(struct Scsi_Host *);
-
 #ifndef CMD_PER_LUN
 #define CMD_PER_LUN 2
 #endif
index 90d1d0878cb80590e6b040d8f0f23d63983a7628..280261c451d6fbf89a9ee86bb4bb7f2aee9dbd09 100644 (file)
@@ -143,7 +143,7 @@ static char *aac_get_status_string(u32 status);
  */
 
 static int nondasd = -1;
-static int aac_cache;
+static int aac_cache = 2;      /* WCE=0 to avoid performance problems */
 static int dacmode = -1;
 int aac_msi;
 int aac_commit = -1;
@@ -157,7 +157,7 @@ module_param_named(cache, aac_cache, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(cache, "Disable Queue Flush commands:\n"
        "\tbit 0 - Disable FUA in WRITE SCSI commands\n"
        "\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n"
-       "\tbit 2 - Disable only if Battery not protecting Cache");
+       "\tbit 2 - Disable only if Battery is protecting Cache");
 module_param(dacmode, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC."
        " 0=off, 1=on");
@@ -217,6 +217,14 @@ int aac_reset_devices;
 module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization.");
 
+int aac_wwn = 1;
+module_param_named(wwn, aac_wwn, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(wwn, "Select a WWN type for the arrays:\n"
+       "\t0 - Disable\n"
+       "\t1 - Array Meta Data Signature (default)\n"
+       "\t2 - Adapter Serial Number");
+
+
 static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
                struct fib *fibptr) {
        struct scsi_device *device;
@@ -1206,9 +1214,8 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
 
 static int aac_scsi_32_64(struct fib * fib, struct scsi_cmnd * cmd)
 {
-       if ((sizeof(dma_addr_t) > 4) &&
-        (num_physpages > (0xFFFFFFFFULL >> PAGE_SHIFT)) &&
-        (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
+       if ((sizeof(dma_addr_t) > 4) && fib->dev->needs_dac &&
+           (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
                return FAILED;
        return aac_scsi_32(fib, cmd);
 }
@@ -1371,8 +1378,11 @@ int aac_get_adapter_info(struct aac_dev* dev)
        if (dev->nondasd_support && !dev->in_reset)
                printk(KERN_INFO "%s%d: Non-DASD support enabled.\n",dev->name, dev->id);
 
+       if (dma_get_required_mask(&dev->pdev->dev) > DMA_32BIT_MASK)
+               dev->needs_dac = 1;
        dev->dac_support = 0;
-       if( (sizeof(dma_addr_t) > 4) && (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)){
+       if ((sizeof(dma_addr_t) > 4) && dev->needs_dac &&
+           (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) {
                if (!dev->in_reset)
                        printk(KERN_INFO "%s%d: 64bit support enabled.\n",
                                dev->name, dev->id);
@@ -1382,14 +1392,23 @@ int aac_get_adapter_info(struct aac_dev* dev)
        if(dacmode != -1) {
                dev->dac_support = (dacmode!=0);
        }
+
+       /* avoid problems with AAC_QUIRK_SCSI_32 controllers */
+       if (dev->dac_support && (aac_get_driver_ident(dev->cardtype)->quirks
+               & AAC_QUIRK_SCSI_32)) {
+               dev->nondasd_support = 0;
+               dev->jbod = 0;
+               expose_physicals = 0;
+       }
+
        if(dev->dac_support != 0) {
-               if (!pci_set_dma_mask(dev->pdev, DMA_64BIT_MASK) &&
-                       !pci_set_consistent_dma_mask(dev->pdev, DMA_64BIT_MASK)) {
+               if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(64)) &&
+                       !pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(64))) {
                        if (!dev->in_reset)
                                printk(KERN_INFO"%s%d: 64 Bit DAC enabled\n",
                                        dev->name, dev->id);
-               } else if (!pci_set_dma_mask(dev->pdev, DMA_32BIT_MASK) &&
-                       !pci_set_consistent_dma_mask(dev->pdev, DMA_32BIT_MASK)) {
+               } else if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(32)) &&
+                       !pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(32))) {
                        printk(KERN_INFO"%s%d: DMA mask set failed, 64 Bit DAC disabled\n",
                                dev->name, dev->id);
                        dev->dac_support = 0;
@@ -2058,7 +2077,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", cid));
                memset(&inq_data, 0, sizeof (struct inquiry_data));
 
-               if (scsicmd->cmnd[1] & 0x1) {
+               if ((scsicmd->cmnd[1] & 0x1) && aac_wwn) {
                        char *arr = (char *)&inq_data;
 
                        /* EVPD bit set */
@@ -2081,7 +2100,12 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
                                arr[1] = scsicmd->cmnd[2];
                                scsi_sg_copy_from_buffer(scsicmd, &inq_data,
                                                         sizeof(inq_data));
-                               return aac_get_container_serial(scsicmd);
+                               if (aac_wwn != 2)
+                                       return aac_get_container_serial(
+                                               scsicmd);
+                               /* SLES 10 SP1 special */
+                               scsicmd->result = DID_OK << 16 |
+                                 COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
                        } else {
                                /* vpd page not implemented */
                                scsicmd->result = DID_OK << 16 |
index 73916adb8f80f21d587cf1fbe499a14252c042fb..cdbdec9f4fb21930f65ce332f12dfe74d4ec9c5c 100644 (file)
@@ -12,7 +12,7 @@
  *----------------------------------------------------------------------------*/
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 2456
+# define AAC_DRIVER_BUILD 2461
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS 32
@@ -865,7 +865,11 @@ struct aac_supplement_adapter_info
        u8      MfgPcbaSerialNo[12];
        u8      MfgWWNName[8];
        __le32  SupportedOptions2;
-       __le32  ReservedGrowth[1];
+       __le32  StructExpansion;
+       /* StructExpansion == 1 */
+       __le32  FeatureBits3;
+       __le32  SupportedPerformanceModes;
+       __le32  ReservedForFutureGrowth[80];
 };
 #define AAC_FEATURE_FALCON     cpu_to_le32(0x00000010)
 #define AAC_FEATURE_JBOD       cpu_to_le32(0x08000000)
@@ -1020,6 +1024,7 @@ struct aac_dev
        u8                      jbod;
        u8                      cache_protected;
        u8                      dac_support;
+       u8                      needs_dac;
        u8                      raid_scsi_mode;
        u8                      comm_interface;
 #      define AAC_COMM_PRODUCER 0
index 16310443b55a8f2c5b431238b1c0549c5a1e2442..d598eba630d0b5dd7fb0fd8bce1092688b9c3105 100644 (file)
@@ -54,6 +54,7 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
        const unsigned long printfbufsiz = 256;
        struct aac_init *init;
        dma_addr_t phys;
+       unsigned long aac_max_hostphysmempages;
 
        size = fibsize + sizeof(struct aac_init) + commsize + commalign + printfbufsiz;
 
@@ -90,7 +91,18 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
        init->AdapterFibsPhysicalAddress = cpu_to_le32((u32)phys);
        init->AdapterFibsSize = cpu_to_le32(fibsize);
        init->AdapterFibAlign = cpu_to_le32(sizeof(struct hw_fib));
-       init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
+       /*
+        * number of 4k pages of host physical memory. The aacraid fw needs
+        * this number to be less than 4gb worth of pages. New firmware doesn't
+        * have any issues with the mapping system, but older Firmware did, and
+        * had *troubles* dealing with the math overloading past 32 bits, thus
+        * we must limit this field.
+        */
+       aac_max_hostphysmempages = dma_get_required_mask(&dev->pdev->dev) >> 12;
+       if (aac_max_hostphysmempages < AAC_MAX_HOSTPHYSMEMPAGES)
+               init->HostPhysMemPages = cpu_to_le32(aac_max_hostphysmempages);
+       else
+               init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
 
        init->InitFlags = 0;
        if (dev->comm_interface == AAC_COMM_MESSAGE) {
index d24c2670040bd4d09d9f2df14832efc3bb3befa1..956261f251817ea5ab0873a60c96835e1bcf13e1 100644 (file)
@@ -1206,18 +1206,18 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced)
        aac->fsa_dev = NULL;
        quirks = aac_get_driver_ident(index)->quirks;
        if (quirks & AAC_QUIRK_31BIT) {
-               if (((retval = pci_set_dma_mask(aac->pdev, DMA_31BIT_MASK))) ||
-                 ((retval = pci_set_consistent_dma_mask(aac->pdev, DMA_31BIT_MASK))))
+               if (((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(31)))) ||
+                 ((retval = pci_set_consistent_dma_mask(aac->pdev, DMA_BIT_MASK(31)))))
                        goto out;
        } else {
-               if (((retval = pci_set_dma_mask(aac->pdev, DMA_32BIT_MASK))) ||
-                 ((retval = pci_set_consistent_dma_mask(aac->pdev, DMA_32BIT_MASK))))
+               if (((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(32)))) ||
+                 ((retval = pci_set_consistent_dma_mask(aac->pdev, DMA_BIT_MASK(32)))))
                        goto out;
        }
        if ((retval = (*(aac_get_driver_ident(index)->init))(aac)))
                goto out;
        if (quirks & AAC_QUIRK_31BIT)
-               if ((retval = pci_set_dma_mask(aac->pdev, DMA_32BIT_MASK)))
+               if ((retval = pci_set_dma_mask(aac->pdev, DMA_BIT_MASK(32))))
                        goto out;
        if (jafo) {
                aac->thread = kthread_run(aac_command_thread, aac, aac->name);
index 36d8aab97efee48e9986753749a36bb8082540c6..9b97c3e016fe8233b0545ea8adab6bb45ff3985d 100644 (file)
@@ -86,7 +86,13 @@ char aac_driver_version[] = AAC_DRIVER_FULL_VERSION;
  *
  * Note: The last field is used to index into aac_drivers below.
  */
-static struct pci_device_id aac_pci_tbl[] = {
+#ifdef DECLARE_PCI_DEVICE_TABLE
+static DECLARE_PCI_DEVICE_TABLE(aac_pci_tbl) = {
+#elif defined(__devinitconst)
+static const struct pci_device_id aac_pci_tbl[] __devinitconst = {
+#else
+static const struct pci_device_id aac_pci_tbl[] __devinitdata = {
+#endif
        { 0x1028, 0x0001, 0x1028, 0x0001, 0, 0, 0 }, /* PERC 2/Si (Iguana/PERC2Si) */
        { 0x1028, 0x0002, 0x1028, 0x0002, 0, 0, 1 }, /* PERC 3/Di (Opal/PERC3Di) */
        { 0x1028, 0x0003, 0x1028, 0x0003, 0, 0, 2 }, /* PERC 3/Si (SlimFast/PERC3Si */
@@ -1089,16 +1095,16 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
                goto out;
        error = -ENODEV;
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) ||
-                       pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) ||
+                       pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))
                goto out_disable_pdev;
        /*
         * If the quirk31 bit is set, the adapter needs adapter
         * to driver communication memory to be allocated below 2gig
         */
        if (aac_drivers[index].quirks & AAC_QUIRK_31BIT)
-               if (pci_set_dma_mask(pdev, DMA_31BIT_MASK) ||
-                               pci_set_consistent_dma_mask(pdev, DMA_31BIT_MASK))
+               if (pci_set_dma_mask(pdev, DMA_BIT_MASK(31)) ||
+                               pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(31)))
                        goto out_disable_pdev;
 
        pci_set_master(pdev);
@@ -1148,7 +1154,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
         * address space.
         */
        if (aac_drivers[index].quirks & AAC_QUIRK_31BIT)
-               if (pci_set_dma_mask(pdev, DMA_32BIT_MASK))
+               if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))
                        goto out_deinit;
 
        aac->maximum_num_channels = aac_drivers[index].channels;
index 7507d8bc57a196b7e7d9608732789206d5251381..b756041f0b26ed454ad9e85441ec3cfea9456fd1 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/dma-mapping.h>
+#include <linux/firmware.h>
 
 #include <asm/io.h>
 #include <asm/system.h>
@@ -4519,8 +4520,8 @@ static void AscWriteLramByte(PortAddr iop_base, ushort addr, uchar byte_val)
  * and is maintained in little-endian order when written to LRAM.
  */
 static void
-AscMemWordCopyPtrToLram(PortAddr iop_base,
-                       ushort s_addr, uchar *s_buffer, int words)
+AscMemWordCopyPtrToLram(PortAddr iop_base, ushort s_addr,
+                       const uchar *s_buffer, int words)
 {
        int i;
 
@@ -4642,8 +4643,8 @@ static ushort AscInitLram(ASC_DVC_VAR *asc_dvc)
 }
 
 static ASC_DCNT
-AscLoadMicroCode(PortAddr iop_base,
-                ushort s_addr, uchar *mcode_buf, ushort mcode_size)
+AscLoadMicroCode(PortAddr iop_base, ushort s_addr,
+                const uchar *mcode_buf, ushort mcode_size)
 {
        ASC_DCNT chksum;
        ushort mcode_word_size;
@@ -4668,1618 +4669,6 @@ AscLoadMicroCode(PortAddr iop_base,
        return chksum;
 }
 
-/* Microcode buffer is kept after initialization for error recovery. */
-static uchar _asc_mcode_buf[] = {
-       0x01, 0x03, 0x01, 0x19, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x12, 0x0D, 0x05,
-       0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0xFF, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0xE4, 0x88, 0x00, 0x00, 0x00, 0x00, 0x80, 0x73, 0x48, 0x04,
-       0x36, 0x00, 0x00, 0xA2, 0xC2, 0x00, 0x80, 0x73, 0x03, 0x23, 0x36, 0x40,
-       0xB6, 0x00, 0x36, 0x00, 0x05, 0xD6, 0x0C, 0xD2, 0x12, 0xDA, 0x00, 0xA2,
-       0xC2, 0x00, 0x92, 0x80, 0x1E, 0x98, 0x50, 0x00, 0xF5, 0x00, 0x48, 0x98,
-       0xDF, 0x23, 0x36, 0x60, 0xB6, 0x00, 0x92, 0x80, 0x4F, 0x00, 0xF5, 0x00,
-       0x48, 0x98, 0xEF, 0x23, 0x36, 0x60, 0xB6, 0x00, 0x92, 0x80, 0x80, 0x62,
-       0x92, 0x80, 0x00, 0x46, 0x15, 0xEE, 0x13, 0xEA, 0x02, 0x01, 0x09, 0xD8,
-       0xCD, 0x04, 0x4D, 0x00, 0x00, 0xA3, 0xD6, 0x00, 0xA6, 0x97, 0x7F, 0x23,
-       0x04, 0x61, 0x84, 0x01, 0xE6, 0x84, 0xD2, 0xC1, 0x80, 0x73, 0xCD, 0x04,
-       0x4D, 0x00, 0x00, 0xA3, 0xDA, 0x01, 0xA6, 0x97, 0xC6, 0x81, 0xC2, 0x88,
-       0x80, 0x73, 0x80, 0x77, 0x00, 0x01, 0x01, 0xA1, 0xFE, 0x00, 0x4F, 0x00,
-       0x84, 0x97, 0x07, 0xA6, 0x08, 0x01, 0x00, 0x33, 0x03, 0x00, 0xC2, 0x88,
-       0x03, 0x03, 0x01, 0xDE, 0xC2, 0x88, 0xCE, 0x00, 0x69, 0x60, 0xCE, 0x00,
-       0x02, 0x03, 0x4A, 0x60, 0x00, 0xA2, 0x78, 0x01, 0x80, 0x63, 0x07, 0xA6,
-       0x24, 0x01, 0x78, 0x81, 0x03, 0x03, 0x80, 0x63, 0xE2, 0x00, 0x07, 0xA6,
-       0x34, 0x01, 0x00, 0x33, 0x04, 0x00, 0xC2, 0x88, 0x03, 0x07, 0x02, 0x01,
-       0x04, 0xCA, 0x0D, 0x23, 0x68, 0x98, 0x4D, 0x04, 0x04, 0x85, 0x05, 0xD8,
-       0x0D, 0x23, 0x68, 0x98, 0xCD, 0x04, 0x15, 0x23, 0xF8, 0x88, 0xFB, 0x23,
-       0x02, 0x61, 0x82, 0x01, 0x80, 0x63, 0x02, 0x03, 0x06, 0xA3, 0x62, 0x01,
-       0x00, 0x33, 0x0A, 0x00, 0xC2, 0x88, 0x4E, 0x00, 0x07, 0xA3, 0x6E, 0x01,
-       0x00, 0x33, 0x0B, 0x00, 0xC2, 0x88, 0xCD, 0x04, 0x36, 0x2D, 0x00, 0x33,
-       0x1A, 0x00, 0xC2, 0x88, 0x50, 0x04, 0x88, 0x81, 0x06, 0xAB, 0x82, 0x01,
-       0x88, 0x81, 0x4E, 0x00, 0x07, 0xA3, 0x92, 0x01, 0x50, 0x00, 0x00, 0xA3,
-       0x3C, 0x01, 0x00, 0x05, 0x7C, 0x81, 0x46, 0x97, 0x02, 0x01, 0x05, 0xC6,
-       0x04, 0x23, 0xA0, 0x01, 0x15, 0x23, 0xA1, 0x01, 0xBE, 0x81, 0xFD, 0x23,
-       0x02, 0x61, 0x82, 0x01, 0x0A, 0xDA, 0x4A, 0x00, 0x06, 0x61, 0x00, 0xA0,
-       0xB4, 0x01, 0x80, 0x63, 0xCD, 0x04, 0x36, 0x2D, 0x00, 0x33, 0x1B, 0x00,
-       0xC2, 0x88, 0x06, 0x23, 0x68, 0x98, 0xCD, 0x04, 0xE6, 0x84, 0x06, 0x01,
-       0x00, 0xA2, 0xD4, 0x01, 0x57, 0x60, 0x00, 0xA0, 0xDA, 0x01, 0xE6, 0x84,
-       0x80, 0x23, 0xA0, 0x01, 0xE6, 0x84, 0x80, 0x73, 0x4B, 0x00, 0x06, 0x61,
-       0x00, 0xA2, 0x00, 0x02, 0x04, 0x01, 0x0C, 0xDE, 0x02, 0x01, 0x03, 0xCC,
-       0x4F, 0x00, 0x84, 0x97, 0xFC, 0x81, 0x08, 0x23, 0x02, 0x41, 0x82, 0x01,
-       0x4F, 0x00, 0x62, 0x97, 0x48, 0x04, 0x84, 0x80, 0xF0, 0x97, 0x00, 0x46,
-       0x56, 0x00, 0x03, 0xC0, 0x01, 0x23, 0xE8, 0x00, 0x81, 0x73, 0x06, 0x29,
-       0x03, 0x42, 0x06, 0xE2, 0x03, 0xEE, 0x6B, 0xEB, 0x11, 0x23, 0xF8, 0x88,
-       0x04, 0x98, 0xF0, 0x80, 0x80, 0x73, 0x80, 0x77, 0x07, 0xA4, 0x2A, 0x02,
-       0x7C, 0x95, 0x06, 0xA6, 0x34, 0x02, 0x03, 0xA6, 0x4C, 0x04, 0x46, 0x82,
-       0x04, 0x01, 0x03, 0xD8, 0xB4, 0x98, 0x6A, 0x96, 0x46, 0x82, 0xFE, 0x95,
-       0x80, 0x67, 0x83, 0x03, 0x80, 0x63, 0xB6, 0x2D, 0x02, 0xA6, 0x6C, 0x02,
-       0x07, 0xA6, 0x5A, 0x02, 0x06, 0xA6, 0x5E, 0x02, 0x03, 0xA6, 0x62, 0x02,
-       0xC2, 0x88, 0x7C, 0x95, 0x48, 0x82, 0x60, 0x96, 0x48, 0x82, 0x04, 0x23,
-       0xA0, 0x01, 0x14, 0x23, 0xA1, 0x01, 0x3C, 0x84, 0x04, 0x01, 0x0C, 0xDC,
-       0xE0, 0x23, 0x25, 0x61, 0xEF, 0x00, 0x14, 0x01, 0x4F, 0x04, 0xA8, 0x01,
-       0x6F, 0x00, 0xA5, 0x01, 0x03, 0x23, 0xA4, 0x01, 0x06, 0x23, 0x9C, 0x01,
-       0x24, 0x2B, 0x1C, 0x01, 0x02, 0xA6, 0xAA, 0x02, 0x07, 0xA6, 0x5A, 0x02,
-       0x06, 0xA6, 0x5E, 0x02, 0x03, 0xA6, 0x20, 0x04, 0x01, 0xA6, 0xB4, 0x02,
-       0x00, 0xA6, 0xB4, 0x02, 0x00, 0x33, 0x12, 0x00, 0xC2, 0x88, 0x00, 0x0E,
-       0x80, 0x63, 0x00, 0x43, 0x00, 0xA0, 0x8C, 0x02, 0x4D, 0x04, 0x04, 0x01,
-       0x0B, 0xDC, 0xE7, 0x23, 0x04, 0x61, 0x84, 0x01, 0x10, 0x31, 0x12, 0x35,
-       0x14, 0x01, 0xEC, 0x00, 0x6C, 0x38, 0x00, 0x3F, 0x00, 0x00, 0xEA, 0x82,
-       0x18, 0x23, 0x04, 0x61, 0x18, 0xA0, 0xE2, 0x02, 0x04, 0x01, 0xA2, 0xC8,
-       0x00, 0x33, 0x1F, 0x00, 0xC2, 0x88, 0x08, 0x31, 0x0A, 0x35, 0x0C, 0x39,
-       0x0E, 0x3D, 0x7E, 0x98, 0xB6, 0x2D, 0x01, 0xA6, 0x14, 0x03, 0x00, 0xA6,
-       0x14, 0x03, 0x07, 0xA6, 0x0C, 0x03, 0x06, 0xA6, 0x10, 0x03, 0x03, 0xA6,
-       0x20, 0x04, 0x02, 0xA6, 0x6C, 0x02, 0x00, 0x33, 0x33, 0x00, 0xC2, 0x88,
-       0x7C, 0x95, 0xEE, 0x82, 0x60, 0x96, 0xEE, 0x82, 0x82, 0x98, 0x80, 0x42,
-       0x7E, 0x98, 0x64, 0xE4, 0x04, 0x01, 0x2D, 0xC8, 0x31, 0x05, 0x07, 0x01,
-       0x00, 0xA2, 0x54, 0x03, 0x00, 0x43, 0x87, 0x01, 0x05, 0x05, 0x86, 0x98,
-       0x7E, 0x98, 0x00, 0xA6, 0x16, 0x03, 0x07, 0xA6, 0x4C, 0x03, 0x03, 0xA6,
-       0x3C, 0x04, 0x06, 0xA6, 0x50, 0x03, 0x01, 0xA6, 0x16, 0x03, 0x00, 0x33,
-       0x25, 0x00, 0xC2, 0x88, 0x7C, 0x95, 0x32, 0x83, 0x60, 0x96, 0x32, 0x83,
-       0x04, 0x01, 0x10, 0xCE, 0x07, 0xC8, 0x05, 0x05, 0xEB, 0x04, 0x00, 0x33,
-       0x00, 0x20, 0xC0, 0x20, 0x81, 0x62, 0x72, 0x83, 0x00, 0x01, 0x05, 0x05,
-       0xFF, 0xA2, 0x7A, 0x03, 0xB1, 0x01, 0x08, 0x23, 0xB2, 0x01, 0x2E, 0x83,
-       0x05, 0x05, 0x15, 0x01, 0x00, 0xA2, 0x9A, 0x03, 0xEC, 0x00, 0x6E, 0x00,
-       0x95, 0x01, 0x6C, 0x38, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xA6, 0x96, 0x03,
-       0x00, 0xA6, 0x96, 0x03, 0x10, 0x84, 0x80, 0x42, 0x7E, 0x98, 0x01, 0xA6,
-       0xA4, 0x03, 0x00, 0xA6, 0xBC, 0x03, 0x10, 0x84, 0xA8, 0x98, 0x80, 0x42,
-       0x01, 0xA6, 0xA4, 0x03, 0x07, 0xA6, 0xB2, 0x03, 0xD4, 0x83, 0x7C, 0x95,
-       0xA8, 0x83, 0x00, 0x33, 0x2F, 0x00, 0xC2, 0x88, 0xA8, 0x98, 0x80, 0x42,
-       0x00, 0xA6, 0xBC, 0x03, 0x07, 0xA6, 0xCA, 0x03, 0xD4, 0x83, 0x7C, 0x95,
-       0xC0, 0x83, 0x00, 0x33, 0x26, 0x00, 0xC2, 0x88, 0x38, 0x2B, 0x80, 0x32,
-       0x80, 0x36, 0x04, 0x23, 0xA0, 0x01, 0x12, 0x23, 0xA1, 0x01, 0x10, 0x84,
-       0x07, 0xF0, 0x06, 0xA4, 0xF4, 0x03, 0x80, 0x6B, 0x80, 0x67, 0x05, 0x23,
-       0x83, 0x03, 0x80, 0x63, 0x03, 0xA6, 0x0E, 0x04, 0x07, 0xA6, 0x06, 0x04,
-       0x06, 0xA6, 0x0A, 0x04, 0x00, 0x33, 0x17, 0x00, 0xC2, 0x88, 0x7C, 0x95,
-       0xF4, 0x83, 0x60, 0x96, 0xF4, 0x83, 0x20, 0x84, 0x07, 0xF0, 0x06, 0xA4,
-       0x20, 0x04, 0x80, 0x6B, 0x80, 0x67, 0x05, 0x23, 0x83, 0x03, 0x80, 0x63,
-       0xB6, 0x2D, 0x03, 0xA6, 0x3C, 0x04, 0x07, 0xA6, 0x34, 0x04, 0x06, 0xA6,
-       0x38, 0x04, 0x00, 0x33, 0x30, 0x00, 0xC2, 0x88, 0x7C, 0x95, 0x20, 0x84,
-       0x60, 0x96, 0x20, 0x84, 0x1D, 0x01, 0x06, 0xCC, 0x00, 0x33, 0x00, 0x84,
-       0xC0, 0x20, 0x00, 0x23, 0xEA, 0x00, 0x81, 0x62, 0xA2, 0x0D, 0x80, 0x63,
-       0x07, 0xA6, 0x5A, 0x04, 0x00, 0x33, 0x18, 0x00, 0xC2, 0x88, 0x03, 0x03,
-       0x80, 0x63, 0xA3, 0x01, 0x07, 0xA4, 0x64, 0x04, 0x23, 0x01, 0x00, 0xA2,
-       0x86, 0x04, 0x0A, 0xA0, 0x76, 0x04, 0xE0, 0x00, 0x00, 0x33, 0x1D, 0x00,
-       0xC2, 0x88, 0x0B, 0xA0, 0x82, 0x04, 0xE0, 0x00, 0x00, 0x33, 0x1E, 0x00,
-       0xC2, 0x88, 0x42, 0x23, 0xF8, 0x88, 0x00, 0x23, 0x22, 0xA3, 0xE6, 0x04,
-       0x08, 0x23, 0x22, 0xA3, 0xA2, 0x04, 0x28, 0x23, 0x22, 0xA3, 0xAE, 0x04,
-       0x02, 0x23, 0x22, 0xA3, 0xC4, 0x04, 0x42, 0x23, 0xF8, 0x88, 0x4A, 0x00,
-       0x06, 0x61, 0x00, 0xA0, 0xAE, 0x04, 0x45, 0x23, 0xF8, 0x88, 0x04, 0x98,
-       0x00, 0xA2, 0xC0, 0x04, 0xB4, 0x98, 0x00, 0x33, 0x00, 0x82, 0xC0, 0x20,
-       0x81, 0x62, 0xE8, 0x81, 0x47, 0x23, 0xF8, 0x88, 0x04, 0x01, 0x0B, 0xDE,
-       0x04, 0x98, 0xB4, 0x98, 0x00, 0x33, 0x00, 0x81, 0xC0, 0x20, 0x81, 0x62,
-       0x14, 0x01, 0x00, 0xA0, 0x00, 0x02, 0x43, 0x23, 0xF8, 0x88, 0x04, 0x23,
-       0xA0, 0x01, 0x44, 0x23, 0xA1, 0x01, 0x80, 0x73, 0x4D, 0x00, 0x03, 0xA3,
-       0xF4, 0x04, 0x00, 0x33, 0x27, 0x00, 0xC2, 0x88, 0x04, 0x01, 0x04, 0xDC,
-       0x02, 0x23, 0xA2, 0x01, 0x04, 0x23, 0xA0, 0x01, 0x04, 0x98, 0x26, 0x95,
-       0x4B, 0x00, 0xF6, 0x00, 0x4F, 0x04, 0x4F, 0x00, 0x00, 0xA3, 0x22, 0x05,
-       0x00, 0x05, 0x76, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x1C, 0x05, 0x0A, 0x85,
-       0x46, 0x97, 0xCD, 0x04, 0x24, 0x85, 0x48, 0x04, 0x84, 0x80, 0x02, 0x01,
-       0x03, 0xDA, 0x80, 0x23, 0x82, 0x01, 0x34, 0x85, 0x02, 0x23, 0xA0, 0x01,
-       0x4A, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x40, 0x05, 0x1D, 0x01, 0x04, 0xD6,
-       0xFF, 0x23, 0x86, 0x41, 0x4B, 0x60, 0xCB, 0x00, 0xFF, 0x23, 0x80, 0x01,
-       0x49, 0x00, 0x81, 0x01, 0x04, 0x01, 0x02, 0xC8, 0x30, 0x01, 0x80, 0x01,
-       0xF7, 0x04, 0x03, 0x01, 0x49, 0x04, 0x80, 0x01, 0xC9, 0x00, 0x00, 0x05,
-       0x00, 0x01, 0xFF, 0xA0, 0x60, 0x05, 0x77, 0x04, 0x01, 0x23, 0xEA, 0x00,
-       0x5D, 0x00, 0xFE, 0xC7, 0x00, 0x62, 0x00, 0x23, 0xEA, 0x00, 0x00, 0x63,
-       0x07, 0xA4, 0xF8, 0x05, 0x03, 0x03, 0x02, 0xA0, 0x8E, 0x05, 0xF4, 0x85,
-       0x00, 0x33, 0x2D, 0x00, 0xC2, 0x88, 0x04, 0xA0, 0xB8, 0x05, 0x80, 0x63,
-       0x00, 0x23, 0xDF, 0x00, 0x4A, 0x00, 0x06, 0x61, 0x00, 0xA2, 0xA4, 0x05,
-       0x1D, 0x01, 0x06, 0xD6, 0x02, 0x23, 0x02, 0x41, 0x82, 0x01, 0x50, 0x00,
-       0x62, 0x97, 0x04, 0x85, 0x04, 0x23, 0x02, 0x41, 0x82, 0x01, 0x04, 0x85,
-       0x08, 0xA0, 0xBE, 0x05, 0xF4, 0x85, 0x03, 0xA0, 0xC4, 0x05, 0xF4, 0x85,
-       0x01, 0xA0, 0xCE, 0x05, 0x88, 0x00, 0x80, 0x63, 0xCC, 0x86, 0x07, 0xA0,
-       0xEE, 0x05, 0x5F, 0x00, 0x00, 0x2B, 0xDF, 0x08, 0x00, 0xA2, 0xE6, 0x05,
-       0x80, 0x67, 0x80, 0x63, 0x01, 0xA2, 0x7A, 0x06, 0x7C, 0x85, 0x06, 0x23,
-       0x68, 0x98, 0x48, 0x23, 0xF8, 0x88, 0x07, 0x23, 0x80, 0x00, 0x06, 0x87,
-       0x80, 0x63, 0x7C, 0x85, 0x00, 0x23, 0xDF, 0x00, 0x00, 0x63, 0x4A, 0x00,
-       0x06, 0x61, 0x00, 0xA2, 0x36, 0x06, 0x1D, 0x01, 0x16, 0xD4, 0xC0, 0x23,
-       0x07, 0x41, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6, 0x1C, 0x06, 0x00, 0x33,
-       0x37, 0x00, 0xC2, 0x88, 0x1D, 0x01, 0x01, 0xD6, 0x20, 0x23, 0x63, 0x60,
-       0x83, 0x03, 0x80, 0x63, 0x02, 0x23, 0xDF, 0x00, 0x07, 0xA6, 0x7C, 0x05,
-       0xEF, 0x04, 0x6F, 0x00, 0x00, 0x63, 0x4B, 0x00, 0x06, 0x41, 0xCB, 0x00,
-       0x52, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x4E, 0x06, 0x1D, 0x01, 0x03, 0xCA,
-       0xC0, 0x23, 0x07, 0x41, 0x00, 0x63, 0x1D, 0x01, 0x04, 0xCC, 0x00, 0x33,
-       0x00, 0x83, 0xC0, 0x20, 0x81, 0x62, 0x80, 0x23, 0x07, 0x41, 0x00, 0x63,
-       0x80, 0x67, 0x08, 0x23, 0x83, 0x03, 0x80, 0x63, 0x00, 0x63, 0x01, 0x23,
-       0xDF, 0x00, 0x06, 0xA6, 0x84, 0x06, 0x07, 0xA6, 0x7C, 0x05, 0x80, 0x67,
-       0x80, 0x63, 0x00, 0x33, 0x00, 0x40, 0xC0, 0x20, 0x81, 0x62, 0x00, 0x63,
-       0x00, 0x00, 0xFE, 0x95, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6, 0x94, 0x06,
-       0x07, 0xA6, 0x7C, 0x05, 0x00, 0x00, 0x01, 0xA0, 0x14, 0x07, 0x00, 0x2B,
-       0x40, 0x0E, 0x80, 0x63, 0x01, 0x00, 0x06, 0xA6, 0xAA, 0x06, 0x07, 0xA6,
-       0x7C, 0x05, 0x40, 0x0E, 0x80, 0x63, 0x00, 0x43, 0x00, 0xA0, 0xA2, 0x06,
-       0x06, 0xA6, 0xBC, 0x06, 0x07, 0xA6, 0x7C, 0x05, 0x80, 0x67, 0x40, 0x0E,
-       0x80, 0x63, 0x07, 0xA6, 0x7C, 0x05, 0x00, 0x23, 0xDF, 0x00, 0x00, 0x63,
-       0x07, 0xA6, 0xD6, 0x06, 0x00, 0x33, 0x2A, 0x00, 0xC2, 0x88, 0x03, 0x03,
-       0x80, 0x63, 0x89, 0x00, 0x0A, 0x2B, 0x07, 0xA6, 0xE8, 0x06, 0x00, 0x33,
-       0x29, 0x00, 0xC2, 0x88, 0x00, 0x43, 0x00, 0xA2, 0xF4, 0x06, 0xC0, 0x0E,
-       0x80, 0x63, 0xDE, 0x86, 0xC0, 0x0E, 0x00, 0x33, 0x00, 0x80, 0xC0, 0x20,
-       0x81, 0x62, 0x04, 0x01, 0x02, 0xDA, 0x80, 0x63, 0x7C, 0x85, 0x80, 0x7B,
-       0x80, 0x63, 0x06, 0xA6, 0x8C, 0x06, 0x00, 0x33, 0x2C, 0x00, 0xC2, 0x88,
-       0x0C, 0xA2, 0x2E, 0x07, 0xFE, 0x95, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6,
-       0x2C, 0x07, 0x07, 0xA6, 0x7C, 0x05, 0x00, 0x33, 0x3D, 0x00, 0xC2, 0x88,
-       0x00, 0x00, 0x80, 0x67, 0x83, 0x03, 0x80, 0x63, 0x0C, 0xA0, 0x44, 0x07,
-       0x07, 0xA6, 0x7C, 0x05, 0xBF, 0x23, 0x04, 0x61, 0x84, 0x01, 0xE6, 0x84,
-       0x00, 0x63, 0xF0, 0x04, 0x01, 0x01, 0xF1, 0x00, 0x00, 0x01, 0xF2, 0x00,
-       0x01, 0x05, 0x80, 0x01, 0x72, 0x04, 0x71, 0x00, 0x81, 0x01, 0x70, 0x04,
-       0x80, 0x05, 0x81, 0x05, 0x00, 0x63, 0xF0, 0x04, 0xF2, 0x00, 0x72, 0x04,
-       0x01, 0x01, 0xF1, 0x00, 0x70, 0x00, 0x81, 0x01, 0x70, 0x04, 0x71, 0x00,
-       0x81, 0x01, 0x72, 0x00, 0x80, 0x01, 0x71, 0x04, 0x70, 0x00, 0x80, 0x01,
-       0x70, 0x04, 0x00, 0x63, 0xF0, 0x04, 0xF2, 0x00, 0x72, 0x04, 0x00, 0x01,
-       0xF1, 0x00, 0x70, 0x00, 0x80, 0x01, 0x70, 0x04, 0x71, 0x00, 0x80, 0x01,
-       0x72, 0x00, 0x81, 0x01, 0x71, 0x04, 0x70, 0x00, 0x81, 0x01, 0x70, 0x04,
-       0x00, 0x63, 0x00, 0x23, 0xB3, 0x01, 0x83, 0x05, 0xA3, 0x01, 0xA2, 0x01,
-       0xA1, 0x01, 0x01, 0x23, 0xA0, 0x01, 0x00, 0x01, 0xC8, 0x00, 0x03, 0xA1,
-       0xC4, 0x07, 0x00, 0x33, 0x07, 0x00, 0xC2, 0x88, 0x80, 0x05, 0x81, 0x05,
-       0x04, 0x01, 0x11, 0xC8, 0x48, 0x00, 0xB0, 0x01, 0xB1, 0x01, 0x08, 0x23,
-       0xB2, 0x01, 0x05, 0x01, 0x48, 0x04, 0x00, 0x43, 0x00, 0xA2, 0xE4, 0x07,
-       0x00, 0x05, 0xDA, 0x87, 0x00, 0x01, 0xC8, 0x00, 0xFF, 0x23, 0x80, 0x01,
-       0x05, 0x05, 0x00, 0x63, 0xF7, 0x04, 0x1A, 0x09, 0xF6, 0x08, 0x6E, 0x04,
-       0x00, 0x02, 0x80, 0x43, 0x76, 0x08, 0x80, 0x02, 0x77, 0x04, 0x00, 0x63,
-       0xF7, 0x04, 0x1A, 0x09, 0xF6, 0x08, 0x6E, 0x04, 0x00, 0x02, 0x00, 0xA0,
-       0x14, 0x08, 0x16, 0x88, 0x00, 0x43, 0x76, 0x08, 0x80, 0x02, 0x77, 0x04,
-       0x00, 0x63, 0xF3, 0x04, 0x00, 0x23, 0xF4, 0x00, 0x74, 0x00, 0x80, 0x43,
-       0xF4, 0x00, 0xCF, 0x40, 0x00, 0xA2, 0x44, 0x08, 0x74, 0x04, 0x02, 0x01,
-       0xF7, 0xC9, 0xF6, 0xD9, 0x00, 0x01, 0x01, 0xA1, 0x24, 0x08, 0x04, 0x98,
-       0x26, 0x95, 0x24, 0x88, 0x73, 0x04, 0x00, 0x63, 0xF3, 0x04, 0x75, 0x04,
-       0x5A, 0x88, 0x02, 0x01, 0x04, 0xD8, 0x46, 0x97, 0x04, 0x98, 0x26, 0x95,
-       0x4A, 0x88, 0x75, 0x00, 0x00, 0xA3, 0x64, 0x08, 0x00, 0x05, 0x4E, 0x88,
-       0x73, 0x04, 0x00, 0x63, 0x80, 0x7B, 0x80, 0x63, 0x06, 0xA6, 0x76, 0x08,
-       0x00, 0x33, 0x3E, 0x00, 0xC2, 0x88, 0x80, 0x67, 0x83, 0x03, 0x80, 0x63,
-       0x00, 0x63, 0x38, 0x2B, 0x9C, 0x88, 0x38, 0x2B, 0x92, 0x88, 0x32, 0x09,
-       0x31, 0x05, 0x92, 0x98, 0x05, 0x05, 0xB2, 0x09, 0x00, 0x63, 0x00, 0x32,
-       0x00, 0x36, 0x00, 0x3A, 0x00, 0x3E, 0x00, 0x63, 0x80, 0x32, 0x80, 0x36,
-       0x80, 0x3A, 0x80, 0x3E, 0xB4, 0x3D, 0x00, 0x63, 0x38, 0x2B, 0x40, 0x32,
-       0x40, 0x36, 0x40, 0x3A, 0x40, 0x3E, 0x00, 0x63, 0x5A, 0x20, 0xC9, 0x40,
-       0x00, 0xA0, 0xB4, 0x08, 0x5D, 0x00, 0xFE, 0xC3, 0x00, 0x63, 0x80, 0x73,
-       0xE6, 0x20, 0x02, 0x23, 0xE8, 0x00, 0x82, 0x73, 0xFF, 0xFD, 0x80, 0x73,
-       0x13, 0x23, 0xF8, 0x88, 0x66, 0x20, 0xC0, 0x20, 0x04, 0x23, 0xA0, 0x01,
-       0xA1, 0x23, 0xA1, 0x01, 0x81, 0x62, 0xE2, 0x88, 0x80, 0x73, 0x80, 0x77,
-       0x68, 0x00, 0x00, 0xA2, 0x80, 0x00, 0x03, 0xC2, 0xF1, 0xC7, 0x41, 0x23,
-       0xF8, 0x88, 0x11, 0x23, 0xA1, 0x01, 0x04, 0x23, 0xA0, 0x01, 0xE6, 0x84,
-};
-
-static unsigned short _asc_mcode_size = sizeof(_asc_mcode_buf);
-static ADV_DCNT _asc_mcode_chksum = 0x012C453FUL;
-
-/* Microcode buffer is kept after initialization for error recovery. */
-static unsigned char _adv_asc3550_buf[] = {
-       0x00, 0x00, 0x00, 0xf2, 0x00, 0xf0, 0x00, 0x16, 0x18, 0xe4, 0x00, 0xfc,
-       0x01, 0x00, 0x48, 0xe4, 0xbe, 0x18, 0x18, 0x80, 0x03, 0xf6, 0x02, 0x00,
-       0x00, 0xfa, 0xff, 0xff, 0x28, 0x0e, 0x9e, 0xe7, 0xff, 0x00, 0x82, 0xe7,
-       0x00, 0xea, 0x00, 0xf6, 0x01, 0xe6, 0x09, 0xe7, 0x55, 0xf0, 0x01, 0xf6,
-       0x01, 0xfa, 0x08, 0x00, 0x03, 0x00, 0x04, 0x00, 0x18, 0xf4, 0x10, 0x00,
-       0x00, 0xec, 0x85, 0xf0, 0xbc, 0x00, 0xd5, 0xf0, 0x8e, 0x0c, 0x38, 0x54,
-       0x00, 0xe6, 0x1e, 0xf0, 0x86, 0xf0, 0xb4, 0x00, 0x98, 0x57, 0xd0, 0x01,
-       0x0c, 0x1c, 0x3e, 0x1c, 0x0c, 0x00, 0xbb, 0x00, 0xaa, 0x18, 0x02, 0x80,
-       0x32, 0xf0, 0x01, 0xfc, 0x88, 0x0c, 0xc6, 0x12, 0x02, 0x13, 0x18, 0x40,
-       0x00, 0x57, 0x01, 0xea, 0x3c, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x04, 0x12,
-       0x3e, 0x57, 0x00, 0x80, 0x03, 0xe6, 0xb6, 0x00, 0xc0, 0x00, 0x01, 0x01,
-       0x3e, 0x01, 0xda, 0x0f, 0x22, 0x10, 0x08, 0x12, 0x02, 0x4a, 0xb9, 0x54,
-       0x03, 0x58, 0x1b, 0x80, 0x30, 0xe4, 0x4b, 0xe4, 0x20, 0x00, 0x32, 0x00,
-       0x3e, 0x00, 0x80, 0x00, 0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01,
-       0x70, 0x01, 0x72, 0x01, 0x74, 0x01, 0x76, 0x01, 0x78, 0x01, 0x62, 0x0a,
-       0x92, 0x0c, 0x2c, 0x10, 0x2e, 0x10, 0x06, 0x13, 0x4c, 0x1c, 0xbb, 0x55,
-       0x3c, 0x56, 0x04, 0x80, 0x4a, 0xe4, 0x02, 0xee, 0x5b, 0xf0, 0xb1, 0xf0,
-       0x03, 0xf7, 0x06, 0xf7, 0x03, 0xfc, 0x0f, 0x00, 0x40, 0x00, 0xbe, 0x00,
-       0x00, 0x01, 0xb0, 0x08, 0x30, 0x13, 0x64, 0x15, 0x32, 0x1c, 0x38, 0x1c,
-       0x4e, 0x1c, 0x10, 0x44, 0x02, 0x48, 0x00, 0x4c, 0x04, 0xea, 0x5d, 0xf0,
-       0x04, 0xf6, 0x02, 0xfc, 0x05, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00,
-       0xcc, 0x00, 0x20, 0x01, 0x4e, 0x01, 0x4e, 0x0b, 0x1e, 0x0e, 0x0c, 0x10,
-       0x0a, 0x12, 0x04, 0x13, 0x40, 0x13, 0x30, 0x1c, 0x00, 0x4e, 0xbd, 0x56,
-       0x06, 0x83, 0x00, 0xdc, 0x05, 0xf0, 0x09, 0xf0, 0x59, 0xf0, 0xa7, 0xf0,
-       0xb8, 0xf0, 0x0e, 0xf7, 0x06, 0x00, 0x19, 0x00, 0x33, 0x00, 0x9b, 0x00,
-       0xa4, 0x00, 0xb5, 0x00, 0xba, 0x00, 0xd0, 0x00, 0xe1, 0x00, 0xe7, 0x00,
-       0xde, 0x03, 0x56, 0x0a, 0x14, 0x0e, 0x02, 0x10, 0x04, 0x10, 0x0a, 0x10,
-       0x36, 0x10, 0x0a, 0x13, 0x12, 0x13, 0x52, 0x13, 0x10, 0x15, 0x14, 0x15,
-       0xac, 0x16, 0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c, 0x08, 0x44, 0x38, 0x44,
-       0x91, 0x44, 0x0a, 0x45, 0x48, 0x46, 0x01, 0x48, 0x68, 0x54, 0x83, 0x55,
-       0xb0, 0x57, 0x01, 0x58, 0x83, 0x59, 0x05, 0xe6, 0x0b, 0xf0, 0x0c, 0xf0,
-       0x5c, 0xf0, 0x4b, 0xf4, 0x04, 0xf8, 0x05, 0xf8, 0x02, 0xfa, 0x03, 0xfa,
-       0x04, 0xfc, 0x05, 0xfc, 0x07, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x1c, 0x00,
-       0x9e, 0x00, 0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00, 0x22, 0x01,
-       0x26, 0x01, 0x79, 0x01, 0x7a, 0x01, 0xc0, 0x01, 0xc2, 0x01, 0x7c, 0x02,
-       0x5a, 0x03, 0xea, 0x04, 0xe8, 0x07, 0x68, 0x08, 0x69, 0x08, 0xba, 0x08,
-       0xe9, 0x09, 0x06, 0x0b, 0x3a, 0x0e, 0x00, 0x10, 0x1a, 0x10, 0xed, 0x10,
-       0xf1, 0x10, 0x06, 0x12, 0x0c, 0x13, 0x16, 0x13, 0x1e, 0x13, 0x82, 0x13,
-       0x42, 0x14, 0xd6, 0x14, 0x8a, 0x15, 0xc6, 0x17, 0xd2, 0x17, 0x6b, 0x18,
-       0x12, 0x1c, 0x46, 0x1c, 0x9c, 0x32, 0x00, 0x40, 0x0e, 0x47, 0x48, 0x47,
-       0x41, 0x48, 0x89, 0x48, 0x80, 0x4c, 0x00, 0x54, 0x44, 0x55, 0xe5, 0x55,
-       0x14, 0x56, 0x77, 0x57, 0xbf, 0x57, 0x40, 0x5c, 0x06, 0x80, 0x08, 0x90,
-       0x03, 0xa1, 0xfe, 0x9c, 0xf0, 0x29, 0x02, 0xfe, 0xb8, 0x0c, 0xff, 0x10,
-       0x00, 0x00, 0xd0, 0xfe, 0xcc, 0x18, 0x00, 0xcf, 0xfe, 0x80, 0x01, 0xff,
-       0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
-       0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x48, 0x00, 0x4f, 0xff, 0x04, 0x00,
-       0x00, 0x10, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
-       0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x0f,
-       0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
-       0xfe, 0x04, 0xf7, 0xcf, 0x2a, 0x67, 0x0b, 0x01, 0xfe, 0xce, 0x0e, 0xfe,
-       0x04, 0xf7, 0xcf, 0x67, 0x0b, 0x3c, 0x2a, 0xfe, 0x3d, 0xf0, 0xfe, 0x02,
-       0x02, 0xfe, 0x20, 0xf0, 0x9c, 0xfe, 0x91, 0xf0, 0xfe, 0xf0, 0x01, 0xfe,
-       0x90, 0xf0, 0xfe, 0xf0, 0x01, 0xfe, 0x8f, 0xf0, 0x9c, 0x05, 0x51, 0x3b,
-       0x02, 0xfe, 0xd4, 0x0c, 0x01, 0xfe, 0x44, 0x0d, 0xfe, 0xdd, 0x12, 0xfe,
-       0xfc, 0x10, 0xfe, 0x28, 0x1c, 0x05, 0xfe, 0xa6, 0x00, 0xfe, 0xd3, 0x12,
-       0x47, 0x18, 0xfe, 0xa6, 0x00, 0xb5, 0xfe, 0x48, 0xf0, 0xfe, 0x86, 0x02,
-       0xfe, 0x49, 0xf0, 0xfe, 0xa0, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xbe, 0x02,
-       0xfe, 0x46, 0xf0, 0xfe, 0x50, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x56, 0x02,
-       0xfe, 0x43, 0xf0, 0xfe, 0x44, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x48, 0x02,
-       0xfe, 0x45, 0xf0, 0xfe, 0x4c, 0x02, 0x17, 0x0b, 0xa0, 0x17, 0x06, 0x18,
-       0x96, 0x02, 0x29, 0xfe, 0x00, 0x1c, 0xde, 0xfe, 0x02, 0x1c, 0xdd, 0xfe,
-       0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0xfe, 0x20, 0x17, 0xfe, 0xe7, 0x10,
-       0xfe, 0x06, 0xfc, 0xc7, 0x0a, 0x6b, 0x01, 0x9e, 0x02, 0x29, 0x14, 0x4d,
-       0x37, 0x97, 0x01, 0xfe, 0x64, 0x0f, 0x0a, 0x6b, 0x01, 0x82, 0xfe, 0xbd,
-       0x10, 0x0a, 0x6b, 0x01, 0x82, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c, 0xfe,
-       0x58, 0x1c, 0x17, 0x06, 0x18, 0x96, 0x2a, 0x25, 0x29, 0xfe, 0x3d, 0xf0,
-       0xfe, 0x02, 0x02, 0x21, 0xfe, 0x94, 0x02, 0xfe, 0x5a, 0x1c, 0xea, 0xfe,
-       0x14, 0x1c, 0x14, 0xfe, 0x30, 0x00, 0x37, 0x97, 0x01, 0xfe, 0x54, 0x0f,
-       0x17, 0x06, 0x18, 0x96, 0x02, 0xd0, 0x1e, 0x20, 0x07, 0x10, 0x34, 0xfe,
-       0x69, 0x10, 0x17, 0x06, 0x18, 0x96, 0xfe, 0x04, 0xec, 0x20, 0x46, 0x3d,
-       0x12, 0x20, 0xfe, 0x05, 0xf6, 0xc7, 0x01, 0xfe, 0x52, 0x16, 0x09, 0x4a,
-       0x4c, 0x35, 0x11, 0x2d, 0x3c, 0x8a, 0x01, 0xe6, 0x02, 0x29, 0x0a, 0x40,
-       0x01, 0x0e, 0x07, 0x00, 0x5d, 0x01, 0x6f, 0xfe, 0x18, 0x10, 0xfe, 0x41,
-       0x58, 0x0a, 0x99, 0x01, 0x0e, 0xfe, 0xc8, 0x54, 0x64, 0xfe, 0x0c, 0x03,
-       0x01, 0xe6, 0x02, 0x29, 0x2a, 0x46, 0xfe, 0x02, 0xe8, 0x27, 0xf8, 0xfe,
-       0x9e, 0x43, 0xf7, 0xfe, 0x27, 0xf0, 0xfe, 0xdc, 0x01, 0xfe, 0x07, 0x4b,
-       0xfe, 0x20, 0xf0, 0x9c, 0xfe, 0x40, 0x1c, 0x25, 0xd2, 0xfe, 0x26, 0xf0,
-       0xfe, 0x56, 0x03, 0xfe, 0xa0, 0xf0, 0xfe, 0x44, 0x03, 0xfe, 0x11, 0xf0,
-       0x9c, 0xfe, 0xef, 0x10, 0xfe, 0x9f, 0xf0, 0xfe, 0x64, 0x03, 0xeb, 0x0f,
-       0xfe, 0x11, 0x00, 0x02, 0x5a, 0x2a, 0xfe, 0x48, 0x1c, 0xeb, 0x09, 0x04,
-       0x1d, 0xfe, 0x18, 0x13, 0x23, 0x1e, 0x98, 0xac, 0x12, 0x98, 0x0a, 0x40,
-       0x01, 0x0e, 0xac, 0x75, 0x01, 0xfe, 0xbc, 0x15, 0x11, 0xca, 0x25, 0xd2,
-       0xfe, 0x01, 0xf0, 0xd2, 0xfe, 0x82, 0xf0, 0xfe, 0x92, 0x03, 0xec, 0x11,
-       0xfe, 0xe4, 0x00, 0x65, 0xfe, 0xa4, 0x03, 0x25, 0x32, 0x1f, 0xfe, 0xb4,
-       0x03, 0x01, 0x43, 0xfe, 0x06, 0xf0, 0xfe, 0xc4, 0x03, 0x8d, 0x81, 0xfe,
-       0x0a, 0xf0, 0xfe, 0x7a, 0x06, 0x02, 0x22, 0x05, 0x6b, 0x28, 0x16, 0xfe,
-       0xf6, 0x04, 0x14, 0x2c, 0x01, 0x33, 0x8f, 0xfe, 0x66, 0x02, 0x02, 0xd1,
-       0xeb, 0x2a, 0x67, 0x1a, 0xfe, 0x67, 0x1b, 0xf8, 0xf7, 0xfe, 0x48, 0x1c,
-       0x70, 0x01, 0x6e, 0x87, 0x0a, 0x40, 0x01, 0x0e, 0x07, 0x00, 0x16, 0xd3,
-       0x0a, 0xca, 0x01, 0x0e, 0x74, 0x60, 0x59, 0x76, 0x27, 0x05, 0x6b, 0x28,
-       0xfe, 0x10, 0x12, 0x14, 0x2c, 0x01, 0x33, 0x8f, 0xfe, 0x66, 0x02, 0x02,
-       0xd1, 0xbc, 0x7d, 0xbd, 0x7f, 0x25, 0x22, 0x65, 0xfe, 0x3c, 0x04, 0x1f,
-       0xfe, 0x38, 0x04, 0x68, 0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x4e,
-       0x12, 0x2b, 0xff, 0x02, 0x00, 0x10, 0x01, 0x08, 0x1f, 0xfe, 0xe0, 0x04,
-       0x2b, 0x01, 0x08, 0x1f, 0x22, 0x30, 0x2e, 0xd5, 0xfe, 0x4c, 0x44, 0xfe,
-       0x4c, 0x12, 0x60, 0xfe, 0x44, 0x48, 0x13, 0x2c, 0xfe, 0x4c, 0x54, 0x64,
-       0xd3, 0x46, 0x76, 0x27, 0xfa, 0xef, 0xfe, 0x62, 0x13, 0x09, 0x04, 0x1d,
-       0xfe, 0x2a, 0x13, 0x2f, 0x07, 0x7e, 0xa5, 0xfe, 0x20, 0x10, 0x13, 0x2c,
-       0xfe, 0x4c, 0x54, 0x64, 0xd3, 0xfa, 0xef, 0x86, 0x09, 0x04, 0x1d, 0xfe,
-       0x08, 0x13, 0x2f, 0x07, 0x7e, 0x6e, 0x09, 0x04, 0x1d, 0xfe, 0x1c, 0x12,
-       0x14, 0x92, 0x09, 0x04, 0x06, 0x3b, 0x14, 0xc4, 0x01, 0x33, 0x8f, 0xfe,
-       0x70, 0x0c, 0x02, 0x22, 0x2b, 0x11, 0xfe, 0xe6, 0x00, 0xfe, 0x1c, 0x90,
-       0xf9, 0x03, 0x14, 0x92, 0x01, 0x33, 0x02, 0x29, 0xfe, 0x42, 0x5b, 0x67,
-       0x1a, 0xfe, 0x46, 0x59, 0xf8, 0xf7, 0xfe, 0x87, 0x80, 0xfe, 0x31, 0xe4,
-       0x4f, 0x09, 0x04, 0x0b, 0xfe, 0x78, 0x13, 0xfe, 0x20, 0x80, 0x07, 0x1a,
-       0xfe, 0x70, 0x12, 0x49, 0x04, 0x06, 0xfe, 0x60, 0x13, 0x05, 0xfe, 0xa2,
-       0x00, 0x28, 0x16, 0xfe, 0x80, 0x05, 0xfe, 0x31, 0xe4, 0x6a, 0x49, 0x04,
-       0x0b, 0xfe, 0x4a, 0x13, 0x05, 0xfe, 0xa0, 0x00, 0x28, 0xfe, 0x42, 0x12,
-       0x5e, 0x01, 0x08, 0x25, 0x32, 0xf1, 0x01, 0x08, 0x26, 0xfe, 0x98, 0x05,
-       0x11, 0xfe, 0xe3, 0x00, 0x23, 0x49, 0xfe, 0x4a, 0xf0, 0xfe, 0x6a, 0x05,
-       0xfe, 0x49, 0xf0, 0xfe, 0x64, 0x05, 0x83, 0x24, 0xfe, 0x21, 0x00, 0xa1,
-       0x24, 0xfe, 0x22, 0x00, 0xa0, 0x24, 0x4c, 0xfe, 0x09, 0x48, 0x01, 0x08,
-       0x26, 0xfe, 0x98, 0x05, 0xfe, 0xe2, 0x08, 0x49, 0x04, 0xc5, 0x3b, 0x01,
-       0x86, 0x24, 0x06, 0x12, 0xcc, 0x37, 0xfe, 0x27, 0x01, 0x09, 0x04, 0x1d,
-       0xfe, 0x22, 0x12, 0x47, 0x01, 0xa7, 0x14, 0x92, 0x09, 0x04, 0x06, 0x3b,
-       0x14, 0xc4, 0x01, 0x33, 0x8f, 0xfe, 0x70, 0x0c, 0x02, 0x22, 0x05, 0xfe,
-       0x9c, 0x00, 0x28, 0xfe, 0x3e, 0x12, 0x05, 0x50, 0x28, 0xfe, 0x36, 0x13,
-       0x47, 0x01, 0xa7, 0x26, 0xfe, 0x08, 0x06, 0x0a, 0x06, 0x49, 0x04, 0x19,
-       0xfe, 0x02, 0x12, 0x5f, 0x01, 0xfe, 0xaa, 0x14, 0x1f, 0xfe, 0xfe, 0x05,
-       0x11, 0x9a, 0x01, 0x43, 0x11, 0xfe, 0xe5, 0x00, 0x05, 0x50, 0xb4, 0x0c,
-       0x50, 0x05, 0xc6, 0x28, 0xfe, 0x62, 0x12, 0x05, 0x3f, 0x28, 0xfe, 0x5a,
-       0x13, 0x01, 0xfe, 0x14, 0x18, 0x01, 0xfe, 0x66, 0x18, 0xfe, 0x43, 0x48,
-       0xb7, 0x19, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0x1c, 0x3d,
-       0x85, 0xb7, 0x69, 0x47, 0x01, 0xa7, 0x26, 0xfe, 0x72, 0x06, 0x49, 0x04,
-       0x1b, 0xdf, 0x89, 0x0a, 0x4d, 0x01, 0xfe, 0xd8, 0x14, 0x1f, 0xfe, 0x68,
-       0x06, 0x11, 0x9a, 0x01, 0x43, 0x11, 0xfe, 0xe5, 0x00, 0x05, 0x3f, 0xb4,
-       0x0c, 0x3f, 0x17, 0x06, 0x01, 0xa7, 0xec, 0x72, 0x70, 0x01, 0x6e, 0x87,
-       0x11, 0xfe, 0xe2, 0x00, 0x01, 0x08, 0x25, 0x32, 0xfe, 0x0a, 0xf0, 0xfe,
-       0xa6, 0x06, 0x8c, 0xfe, 0x5c, 0x07, 0xfe, 0x06, 0xf0, 0xfe, 0x64, 0x07,
-       0x8d, 0x81, 0x02, 0x22, 0x09, 0x04, 0x0b, 0xfe, 0x2e, 0x12, 0x15, 0x1a,
-       0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00,
-       0x01, 0x08, 0xfe, 0x99, 0xa4, 0x01, 0x08, 0x15, 0x00, 0x02, 0xfe, 0x32,
-       0x08, 0x61, 0x04, 0x1b, 0xfe, 0x38, 0x12, 0x09, 0x04, 0x1b, 0x6e, 0x15,
-       0xfe, 0x1b, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01,
-       0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x06, 0x01, 0x08, 0x15, 0x00, 0x02,
-       0xd9, 0x66, 0x4c, 0xfe, 0x3a, 0x55, 0x5f, 0xfe, 0x9a, 0x81, 0x4b, 0x1d,
-       0xba, 0xfe, 0x32, 0x07, 0x0a, 0x1d, 0xfe, 0x09, 0x6f, 0xaf, 0xfe, 0xca,
-       0x45, 0xfe, 0x32, 0x12, 0x62, 0x2c, 0x85, 0x66, 0x7b, 0x01, 0x08, 0x25,
-       0x32, 0xfe, 0x0a, 0xf0, 0xfe, 0x32, 0x07, 0x8d, 0x81, 0x8c, 0xfe, 0x5c,
-       0x07, 0x02, 0x22, 0x01, 0x43, 0x02, 0xfe, 0x8a, 0x06, 0x15, 0x19, 0x02,
-       0xfe, 0x8a, 0x06, 0xfe, 0x9c, 0xf7, 0xd4, 0xfe, 0x2c, 0x90, 0xfe, 0xae,
-       0x90, 0x77, 0xfe, 0xca, 0x07, 0x0c, 0x54, 0x18, 0x55, 0x09, 0x4a, 0x6a,
-       0x35, 0x1e, 0x20, 0x07, 0x10, 0xfe, 0x0e, 0x12, 0x74, 0xfe, 0x80, 0x80,
-       0x37, 0x20, 0x63, 0x27, 0xfe, 0x06, 0x10, 0xfe, 0x83, 0xe7, 0xc4, 0xa1,
-       0xfe, 0x03, 0x40, 0x09, 0x4a, 0x4f, 0x35, 0x01, 0xa8, 0xad, 0xfe, 0x1f,
-       0x40, 0x12, 0x58, 0x01, 0xa5, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe,
-       0x44, 0x51, 0xfe, 0xc6, 0x51, 0x83, 0xfb, 0xfe, 0x8a, 0x90, 0x0c, 0x52,
-       0x18, 0x53, 0xfe, 0x0c, 0x90, 0xfe, 0x8e, 0x90, 0xfe, 0x40, 0x50, 0xfe,
-       0xc2, 0x50, 0x0c, 0x39, 0x18, 0x3a, 0xfe, 0x4a, 0x10, 0x09, 0x04, 0x6a,
-       0xfe, 0x2a, 0x12, 0xfe, 0x2c, 0x90, 0xfe, 0xae, 0x90, 0x0c, 0x54, 0x18,
-       0x55, 0x09, 0x04, 0x4f, 0x85, 0x01, 0xa8, 0xfe, 0x1f, 0x80, 0x12, 0x58,
-       0xfe, 0x44, 0x90, 0xfe, 0xc6, 0x90, 0x0c, 0x56, 0x18, 0x57, 0xfb, 0xfe,
-       0x8a, 0x90, 0x0c, 0x52, 0x18, 0x53, 0xfe, 0x40, 0x90, 0xfe, 0xc2, 0x90,
-       0x0c, 0x39, 0x18, 0x3a, 0x0c, 0x38, 0x18, 0x4e, 0x09, 0x4a, 0x19, 0x35,
-       0x2a, 0x13, 0xfe, 0x4e, 0x11, 0x65, 0xfe, 0x48, 0x08, 0xfe, 0x9e, 0xf0,
-       0xfe, 0x5c, 0x08, 0xb1, 0x16, 0x32, 0x2a, 0x73, 0xdd, 0xb8, 0xfe, 0x80,
-       0x08, 0xb9, 0xfe, 0x9e, 0x08, 0x8c, 0xfe, 0x74, 0x08, 0xfe, 0x06, 0xf0,
-       0xfe, 0x7a, 0x08, 0x8d, 0x81, 0x02, 0x22, 0x01, 0x43, 0xfe, 0xc9, 0x10,
-       0x15, 0x19, 0xfe, 0xc9, 0x10, 0x61, 0x04, 0x06, 0xfe, 0x10, 0x12, 0x61,
-       0x04, 0x0b, 0x45, 0x09, 0x04, 0x0b, 0xfe, 0x68, 0x12, 0xfe, 0x2e, 0x1c,
-       0x02, 0xfe, 0x24, 0x0a, 0x61, 0x04, 0x06, 0x45, 0x61, 0x04, 0x0b, 0xfe,
-       0x52, 0x12, 0xfe, 0x2c, 0x1c, 0xfe, 0xaa, 0xf0, 0xfe, 0x1e, 0x09, 0xfe,
-       0xac, 0xf0, 0xfe, 0xbe, 0x08, 0xfe, 0x8a, 0x10, 0xaa, 0xfe, 0xf3, 0x10,
-       0xfe, 0xad, 0xf0, 0xfe, 0xca, 0x08, 0x02, 0xfe, 0x24, 0x0a, 0xab, 0xfe,
-       0xe7, 0x10, 0xfe, 0x2b, 0xf0, 0x9d, 0xe9, 0x1c, 0xfe, 0x00, 0xfe, 0xfe,
-       0x1c, 0x12, 0xb5, 0xfe, 0xd2, 0xf0, 0x9d, 0xfe, 0x76, 0x18, 0x1c, 0x1a,
-       0x16, 0x9d, 0x05, 0xcb, 0x1c, 0x06, 0x16, 0x9d, 0xb8, 0x6d, 0xb9, 0x6d,
-       0xaa, 0xab, 0xfe, 0xb1, 0x10, 0x70, 0x5e, 0x2b, 0x14, 0x92, 0x01, 0x33,
-       0x0f, 0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x5a, 0x0f, 0x7c, 0x02, 0x5a,
-       0xfe, 0x74, 0x18, 0x1c, 0xfe, 0x00, 0xf8, 0x16, 0x6d, 0x67, 0x1b, 0x01,
-       0xfe, 0x44, 0x0d, 0x3b, 0x01, 0xe6, 0x1e, 0x27, 0x74, 0x67, 0x1a, 0x02,
-       0x6d, 0x09, 0x04, 0x0b, 0x21, 0xfe, 0x06, 0x0a, 0x09, 0x04, 0x6a, 0xfe,
-       0x82, 0x12, 0x09, 0x04, 0x19, 0xfe, 0x66, 0x13, 0x1e, 0x58, 0xac, 0xfc,
-       0xfe, 0x83, 0x80, 0xfe, 0xc8, 0x44, 0xfe, 0x2e, 0x13, 0xfe, 0x04, 0x91,
-       0xfe, 0x86, 0x91, 0x63, 0x27, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x77,
-       0xd7, 0x05, 0x54, 0x31, 0x55, 0x0c, 0x7b, 0x18, 0x7c, 0xbe, 0x54, 0xbf,
-       0x55, 0x01, 0xa8, 0xad, 0x63, 0x27, 0x12, 0x58, 0xc0, 0x38, 0xc1, 0x4e,
-       0x79, 0x56, 0x68, 0x57, 0xf4, 0xf5, 0xfe, 0x04, 0xfa, 0x38, 0xfe, 0x05,
-       0xfa, 0x4e, 0x01, 0xa5, 0xa2, 0x23, 0x0c, 0x7b, 0x0c, 0x7c, 0x79, 0x56,
-       0x68, 0x57, 0xfe, 0x12, 0x10, 0x09, 0x04, 0x19, 0x16, 0xd7, 0x79, 0x39,
-       0x68, 0x3a, 0x09, 0x04, 0xfe, 0xf7, 0x00, 0x35, 0x05, 0x52, 0x31, 0x53,
-       0xfe, 0x10, 0x58, 0xfe, 0x91, 0x58, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59,
-       0x02, 0x6d, 0x09, 0x04, 0x19, 0x16, 0xd7, 0x09, 0x04, 0xfe, 0xf7, 0x00,
-       0x35, 0xfe, 0x3a, 0x55, 0xfe, 0x19, 0x81, 0x5f, 0xfe, 0x10, 0x90, 0xfe,
-       0x92, 0x90, 0xfe, 0xd7, 0x10, 0x2f, 0x07, 0x9b, 0x16, 0xfe, 0xc6, 0x08,
-       0x11, 0x9b, 0x09, 0x04, 0x0b, 0xfe, 0x14, 0x13, 0x05, 0x39, 0x31, 0x3a,
-       0x77, 0xfe, 0xc6, 0x08, 0xfe, 0x0c, 0x58, 0xfe, 0x8d, 0x58, 0x02, 0x6d,
-       0x23, 0x47, 0xfe, 0x19, 0x80, 0xde, 0x09, 0x04, 0x0b, 0xfe, 0x1a, 0x12,
-       0xfe, 0x6c, 0x19, 0xfe, 0x19, 0x41, 0xe9, 0xb5, 0xfe, 0xd1, 0xf0, 0xd9,
-       0x14, 0x7a, 0x01, 0x33, 0x0f, 0xfe, 0x44, 0x00, 0xfe, 0x8e, 0x10, 0xfe,
-       0x6c, 0x19, 0xbe, 0x39, 0xfe, 0xed, 0x19, 0xbf, 0x3a, 0xfe, 0x0c, 0x51,
-       0xfe, 0x8e, 0x51, 0xe9, 0x1c, 0xfe, 0x00, 0xff, 0x34, 0xfe, 0x74, 0x10,
-       0xb5, 0xfe, 0xd2, 0xf0, 0xfe, 0xb2, 0x0a, 0xfe, 0x76, 0x18, 0x1c, 0x1a,
-       0x84, 0x05, 0xcb, 0x1c, 0x06, 0xfe, 0x08, 0x13, 0x0f, 0xfe, 0x16, 0x00,
-       0x02, 0x5a, 0xfe, 0xd1, 0xf0, 0xfe, 0xc4, 0x0a, 0x14, 0x7a, 0x01, 0x33,
-       0x0f, 0xfe, 0x17, 0x00, 0xfe, 0x42, 0x10, 0xfe, 0xce, 0xf0, 0xfe, 0xca,
-       0x0a, 0xfe, 0x3c, 0x10, 0xfe, 0xcd, 0xf0, 0xfe, 0xd6, 0x0a, 0x0f, 0xfe,
-       0x22, 0x00, 0x02, 0x5a, 0xfe, 0xcb, 0xf0, 0xfe, 0xe2, 0x0a, 0x0f, 0xfe,
-       0x24, 0x00, 0x02, 0x5a, 0xfe, 0xd0, 0xf0, 0xfe, 0xec, 0x0a, 0x0f, 0x93,
-       0xdc, 0xfe, 0xcf, 0xf0, 0xfe, 0xf6, 0x0a, 0x0f, 0x4c, 0xfe, 0x10, 0x10,
-       0xfe, 0xcc, 0xf0, 0xd9, 0x61, 0x04, 0x19, 0x3b, 0x0f, 0xfe, 0x12, 0x00,
-       0x2a, 0x13, 0xfe, 0x4e, 0x11, 0x65, 0xfe, 0x0c, 0x0b, 0xfe, 0x9e, 0xf0,
-       0xfe, 0x20, 0x0b, 0xb1, 0x16, 0x32, 0x2a, 0x73, 0xdd, 0xb8, 0x22, 0xb9,
-       0x22, 0x2a, 0xec, 0x65, 0xfe, 0x2c, 0x0b, 0x25, 0x32, 0x8c, 0xfe, 0x48,
-       0x0b, 0x8d, 0x81, 0xb8, 0xd4, 0xb9, 0xd4, 0x02, 0x22, 0x01, 0x43, 0xfe,
-       0xdb, 0x10, 0x11, 0xfe, 0xe8, 0x00, 0xaa, 0xab, 0x70, 0xbc, 0x7d, 0xbd,
-       0x7f, 0xfe, 0x89, 0xf0, 0x22, 0x30, 0x2e, 0xd8, 0xbc, 0x7d, 0xbd, 0x7f,
-       0x01, 0x08, 0x1f, 0x22, 0x30, 0x2e, 0xd6, 0xb1, 0x45, 0x0f, 0xfe, 0x42,
-       0x00, 0x02, 0x5a, 0x78, 0x06, 0xfe, 0x81, 0x49, 0x16, 0xfe, 0x38, 0x0c,
-       0x09, 0x04, 0x0b, 0xfe, 0x44, 0x13, 0x0f, 0x00, 0x4b, 0x0b, 0xfe, 0x54,
-       0x12, 0x4b, 0xfe, 0x28, 0x00, 0x21, 0xfe, 0xa6, 0x0c, 0x0a, 0x40, 0x01,
-       0x0e, 0x07, 0x00, 0x5d, 0x3e, 0xfe, 0x28, 0x00, 0xfe, 0xe2, 0x10, 0x01,
-       0xe7, 0x01, 0xe8, 0x0a, 0x99, 0x01, 0xfe, 0x32, 0x0e, 0x59, 0x11, 0x2d,
-       0x01, 0x6f, 0x02, 0x29, 0x0f, 0xfe, 0x44, 0x00, 0x4b, 0x0b, 0xdf, 0x3e,
-       0x0b, 0xfe, 0xb4, 0x10, 0x01, 0x86, 0x3e, 0x0b, 0xfe, 0xaa, 0x10, 0x01,
-       0x86, 0xfe, 0x19, 0x82, 0xfe, 0x34, 0x46, 0xa3, 0x3e, 0x0b, 0x0f, 0xfe,
-       0x43, 0x00, 0xfe, 0x96, 0x10, 0x09, 0x4a, 0x0b, 0x35, 0x01, 0xe7, 0x01,
-       0xe8, 0x59, 0x11, 0x2d, 0x01, 0x6f, 0x67, 0x0b, 0x59, 0x3c, 0x8a, 0x02,
-       0xfe, 0x2a, 0x03, 0x09, 0x04, 0x0b, 0x84, 0x3e, 0x0b, 0x0f, 0x00, 0xfe,
-       0x5c, 0x10, 0x61, 0x04, 0x1b, 0xfe, 0x58, 0x12, 0x09, 0x04, 0x1b, 0xfe,
-       0x50, 0x13, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x5c, 0x0c, 0xfe,
-       0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x62, 0x0c, 0x09, 0x4a, 0x1b, 0x35,
-       0xfe, 0xa9, 0x10, 0x0f, 0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0b, 0x5f,
-       0x5c, 0x0f, 0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x0f, 0xfe, 0x47, 0x00,
-       0xa1, 0x0f, 0xfe, 0x41, 0x00, 0xa0, 0x0f, 0xfe, 0x24, 0x00, 0x87, 0xaa,
-       0xab, 0x70, 0x05, 0x6b, 0x28, 0x21, 0xd1, 0x5f, 0xfe, 0x04, 0xe6, 0x1b,
-       0xfe, 0x9d, 0x41, 0xfe, 0x1c, 0x42, 0x59, 0x01, 0xda, 0x02, 0x29, 0xea,
-       0x14, 0x0b, 0x37, 0x95, 0xa9, 0x14, 0xfe, 0x31, 0x00, 0x37, 0x97, 0x01,
-       0xfe, 0x54, 0x0f, 0x02, 0xd0, 0x3c, 0xfe, 0x06, 0xec, 0xc9, 0xee, 0x3e,
-       0x1d, 0xfe, 0xce, 0x45, 0x34, 0x3c, 0xfe, 0x06, 0xea, 0xc9, 0xfe, 0x47,
-       0x4b, 0x89, 0xfe, 0x75, 0x57, 0x05, 0x51, 0xfe, 0x98, 0x56, 0xfe, 0x38,
-       0x12, 0x0a, 0x42, 0x01, 0x0e, 0xfe, 0x44, 0x48, 0x46, 0x09, 0x04, 0x1d,
-       0xfe, 0x1a, 0x13, 0x0a, 0x40, 0x01, 0x0e, 0x47, 0xfe, 0x41, 0x58, 0x0a,
-       0x99, 0x01, 0x0e, 0xfe, 0x49, 0x54, 0x8e, 0xfe, 0x2a, 0x0d, 0x02, 0xfe,
-       0x2a, 0x03, 0x0a, 0x51, 0xfe, 0xee, 0x14, 0xee, 0x3e, 0x1d, 0xfe, 0xce,
-       0x45, 0x34, 0x3c, 0xfe, 0xce, 0x47, 0xfe, 0xad, 0x13, 0x02, 0x29, 0x1e,
-       0x20, 0x07, 0x10, 0xfe, 0x9e, 0x12, 0x23, 0x12, 0x4d, 0x12, 0x94, 0x12,
-       0xce, 0x1e, 0x2d, 0x47, 0x37, 0x2d, 0xb1, 0xe0, 0xfe, 0xbc, 0xf0, 0xfe,
-       0xec, 0x0d, 0x13, 0x06, 0x12, 0x4d, 0x01, 0xfe, 0xe2, 0x15, 0x05, 0xfe,
-       0x38, 0x01, 0x31, 0xfe, 0x3a, 0x01, 0x77, 0xfe, 0xf0, 0x0d, 0xfe, 0x02,
-       0xec, 0xce, 0x62, 0x00, 0x5d, 0xfe, 0x04, 0xec, 0x20, 0x46, 0xfe, 0x05,
-       0xf6, 0xfe, 0x34, 0x01, 0x01, 0xfe, 0x52, 0x16, 0xfb, 0xfe, 0x48, 0xf4,
-       0x0d, 0xfe, 0x18, 0x13, 0xaf, 0xfe, 0x02, 0xea, 0xce, 0x62, 0x7a, 0xfe,
-       0xc5, 0x13, 0x14, 0x1b, 0x37, 0x95, 0xa9, 0x5c, 0x05, 0xfe, 0x38, 0x01,
-       0x1c, 0xfe, 0xf0, 0xff, 0x0c, 0xfe, 0x60, 0x01, 0x05, 0xfe, 0x3a, 0x01,
-       0x0c, 0xfe, 0x62, 0x01, 0x3d, 0x12, 0x20, 0x24, 0x06, 0x12, 0x2d, 0x11,
-       0x2d, 0x8a, 0x13, 0x06, 0x03, 0x23, 0x03, 0x1e, 0x4d, 0xfe, 0xf7, 0x12,
-       0x1e, 0x94, 0xac, 0x12, 0x94, 0x07, 0x7a, 0xfe, 0x71, 0x13, 0xfe, 0x24,
-       0x1c, 0x14, 0x1a, 0x37, 0x95, 0xa9, 0xfe, 0xd9, 0x10, 0xb6, 0xfe, 0x03,
-       0xdc, 0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x03, 0xb6, 0xfe, 0x03, 0xdc,
-       0xfe, 0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x03, 0xfe, 0x03, 0x57, 0xb6, 0x23,
-       0xfe, 0x00, 0xcc, 0x03, 0xfe, 0x03, 0x57, 0xb6, 0x75, 0x03, 0x09, 0x04,
-       0x4c, 0xfe, 0x22, 0x13, 0xfe, 0x1c, 0x80, 0x07, 0x06, 0xfe, 0x1a, 0x13,
-       0xfe, 0x1e, 0x80, 0xe1, 0xfe, 0x1d, 0x80, 0xa4, 0xfe, 0x0c, 0x90, 0xfe,
-       0x0e, 0x13, 0xfe, 0x0e, 0x90, 0xa3, 0xfe, 0x3c, 0x90, 0xfe, 0x30, 0xf4,
-       0x0b, 0xfe, 0x3c, 0x50, 0xa0, 0x01, 0xfe, 0x82, 0x16, 0x2f, 0x07, 0x2d,
-       0xe0, 0x01, 0xfe, 0xbc, 0x15, 0x09, 0x04, 0x1d, 0x45, 0x01, 0xe7, 0x01,
-       0xe8, 0x11, 0xfe, 0xe9, 0x00, 0x09, 0x04, 0x4c, 0xfe, 0x2c, 0x13, 0x01,
-       0xfe, 0x14, 0x16, 0xfe, 0x1e, 0x1c, 0xfe, 0x14, 0x90, 0xfe, 0x96, 0x90,
-       0x0c, 0xfe, 0x64, 0x01, 0x18, 0xfe, 0x66, 0x01, 0x09, 0x04, 0x4f, 0xfe,
-       0x12, 0x12, 0xfe, 0x03, 0x80, 0x74, 0xfe, 0x01, 0xec, 0x20, 0xfe, 0x80,
-       0x40, 0x12, 0x20, 0x63, 0x27, 0x11, 0xc8, 0x59, 0x1e, 0x20, 0xed, 0x76,
-       0x20, 0x03, 0xfe, 0x08, 0x1c, 0x05, 0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58,
-       0x05, 0xfe, 0xae, 0x00, 0xfe, 0x07, 0x58, 0x05, 0xfe, 0xb0, 0x00, 0xfe,
-       0x08, 0x58, 0x05, 0xfe, 0xb2, 0x00, 0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c,
-       0x24, 0x69, 0x12, 0xc9, 0x23, 0x0c, 0x50, 0x0c, 0x3f, 0x13, 0x40, 0x48,
-       0x5f, 0x17, 0x1d, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x21, 0xfe, 0x08,
-       0x0f, 0x3e, 0x10, 0x13, 0x42, 0x48, 0x17, 0x4c, 0xfe, 0x90, 0x4d, 0xfe,
-       0x91, 0x54, 0x21, 0xfe, 0x1e, 0x0f, 0x24, 0x10, 0x12, 0x20, 0x78, 0x2c,
-       0x46, 0x1e, 0x20, 0xed, 0x76, 0x20, 0x11, 0xc8, 0xf6, 0xfe, 0xd6, 0xf0,
-       0xfe, 0x32, 0x0f, 0xea, 0x70, 0xfe, 0x14, 0x1c, 0xfe, 0x10, 0x1c, 0xfe,
-       0x18, 0x1c, 0x03, 0x3c, 0xfe, 0x0c, 0x14, 0xee, 0xfe, 0x07, 0xe6, 0x1d,
-       0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x03, 0x01, 0x86, 0x78, 0x2c, 0x46,
-       0xfa, 0xef, 0xfe, 0x42, 0x13, 0x2f, 0x07, 0x2d, 0xfe, 0x34, 0x13, 0x0a,
-       0x42, 0x01, 0x0e, 0xb0, 0xfe, 0x36, 0x12, 0xf0, 0xfe, 0x45, 0x48, 0x01,
-       0xe3, 0xfe, 0x00, 0xcc, 0xb0, 0xfe, 0xf3, 0x13, 0x3d, 0x75, 0x07, 0x10,
-       0xa3, 0x0a, 0x80, 0x01, 0x0e, 0xfe, 0x80, 0x5c, 0x01, 0x6f, 0xfe, 0x0e,
-       0x10, 0x07, 0x7e, 0x45, 0xf6, 0xfe, 0xd6, 0xf0, 0xfe, 0x6c, 0x0f, 0x03,
-       0xfe, 0x44, 0x58, 0x74, 0xfe, 0x01, 0xec, 0x97, 0xfe, 0x9e, 0x40, 0xfe,
-       0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x1b, 0x76, 0x27, 0x01, 0xda, 0xfe,
-       0xdd, 0x10, 0x2a, 0xbc, 0x7d, 0xbd, 0x7f, 0x30, 0x2e, 0xd5, 0x07, 0x1b,
-       0xfe, 0x48, 0x12, 0x07, 0x0b, 0xfe, 0x56, 0x12, 0x07, 0x1a, 0xfe, 0x30,
-       0x12, 0x07, 0xc2, 0x16, 0xfe, 0x3e, 0x11, 0x07, 0xfe, 0x23, 0x00, 0x16,
-       0xfe, 0x4a, 0x11, 0x07, 0x06, 0x16, 0xfe, 0xa8, 0x11, 0x07, 0x19, 0xfe,
-       0x12, 0x12, 0x07, 0x00, 0x16, 0x22, 0x14, 0xc2, 0x01, 0x33, 0x9f, 0x2b,
-       0x01, 0x08, 0x8c, 0x43, 0x03, 0x2b, 0xfe, 0x62, 0x08, 0x0a, 0xca, 0x01,
-       0xfe, 0x32, 0x0e, 0x11, 0x7e, 0x02, 0x29, 0x2b, 0x2f, 0x07, 0x9b, 0xfe,
-       0xd9, 0x13, 0x79, 0x39, 0x68, 0x3a, 0x77, 0xfe, 0xfc, 0x10, 0x09, 0x04,
-       0x6a, 0xfe, 0x72, 0x12, 0xc0, 0x38, 0xc1, 0x4e, 0xf4, 0xf5, 0x8e, 0xfe,
-       0xc6, 0x10, 0x1e, 0x58, 0xfe, 0x26, 0x13, 0x05, 0x7b, 0x31, 0x7c, 0x77,
-       0xfe, 0x82, 0x0c, 0x0c, 0x54, 0x18, 0x55, 0x23, 0x0c, 0x7b, 0x0c, 0x7c,
-       0x01, 0xa8, 0x24, 0x69, 0x73, 0x12, 0x58, 0x01, 0xa5, 0xc0, 0x38, 0xc1,
-       0x4e, 0xfe, 0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe, 0x04, 0xfa, 0x38, 0xfe,
-       0x05, 0xfa, 0x4e, 0xfe, 0x91, 0x10, 0x05, 0x56, 0x31, 0x57, 0xfe, 0x40,
-       0x56, 0xfe, 0xe1, 0x56, 0x0c, 0x56, 0x18, 0x57, 0x83, 0xc0, 0x38, 0xc1,
-       0x4e, 0xf4, 0xf5, 0x05, 0x52, 0x31, 0x53, 0xfe, 0x00, 0x56, 0xfe, 0xa1,
-       0x56, 0x0c, 0x52, 0x18, 0x53, 0x09, 0x04, 0x6a, 0xfe, 0x1e, 0x12, 0x1e,
-       0x58, 0xfe, 0x1f, 0x40, 0x05, 0x54, 0x31, 0x55, 0xfe, 0x2c, 0x50, 0xfe,
-       0xae, 0x50, 0x05, 0x56, 0x31, 0x57, 0xfe, 0x44, 0x50, 0xfe, 0xc6, 0x50,
-       0x05, 0x52, 0x31, 0x53, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0x05, 0x39,
-       0x31, 0x3a, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x02, 0x5c, 0x24, 0x06,
-       0x12, 0xcd, 0x02, 0x5b, 0x2b, 0x01, 0x08, 0x1f, 0x44, 0x30, 0x2e, 0xd5,
-       0x07, 0x06, 0x21, 0x44, 0x2f, 0x07, 0x9b, 0x21, 0x5b, 0x01, 0x6e, 0x1c,
-       0x3d, 0x16, 0x44, 0x09, 0x04, 0x0b, 0xe2, 0x79, 0x39, 0x68, 0x3a, 0xfe,
-       0x0a, 0x55, 0x34, 0xfe, 0x8b, 0x55, 0xbe, 0x39, 0xbf, 0x3a, 0xfe, 0x0c,
-       0x51, 0xfe, 0x8e, 0x51, 0x02, 0x5b, 0xfe, 0x19, 0x81, 0xaf, 0xfe, 0x19,
-       0x41, 0x02, 0x5b, 0x2b, 0x01, 0x08, 0x25, 0x32, 0x1f, 0xa2, 0x30, 0x2e,
-       0xd8, 0x4b, 0x1a, 0xfe, 0xa6, 0x12, 0x4b, 0x0b, 0x3b, 0x02, 0x44, 0x01,
-       0x08, 0x25, 0x32, 0x1f, 0xa2, 0x30, 0x2e, 0xd6, 0x07, 0x1a, 0x21, 0x44,
-       0x01, 0x08, 0x1f, 0xa2, 0x30, 0x2e, 0xfe, 0xe8, 0x09, 0xfe, 0xc2, 0x49,
-       0x60, 0x05, 0xfe, 0x9c, 0x00, 0x28, 0x84, 0x49, 0x04, 0x19, 0x34, 0x9f,
-       0xfe, 0xbb, 0x45, 0x4b, 0x00, 0x45, 0x3e, 0x06, 0x78, 0x3d, 0xfe, 0xda,
-       0x14, 0x01, 0x6e, 0x87, 0xfe, 0x4b, 0x45, 0xe2, 0x2f, 0x07, 0x9a, 0xe1,
-       0x05, 0xc6, 0x28, 0x84, 0x05, 0x3f, 0x28, 0x34, 0x5e, 0x02, 0x5b, 0xfe,
-       0xc0, 0x5d, 0xfe, 0xf8, 0x14, 0xfe, 0x03, 0x17, 0x05, 0x50, 0xb4, 0x0c,
-       0x50, 0x5e, 0x2b, 0x01, 0x08, 0x26, 0x5c, 0x01, 0xfe, 0xaa, 0x14, 0x02,
-       0x5c, 0x01, 0x08, 0x25, 0x32, 0x1f, 0x44, 0x30, 0x2e, 0xd6, 0x07, 0x06,
-       0x21, 0x44, 0x01, 0xfe, 0x8e, 0x13, 0xfe, 0x42, 0x58, 0xfe, 0x82, 0x14,
-       0xfe, 0xa4, 0x14, 0x87, 0xfe, 0x4a, 0xf4, 0x0b, 0x16, 0x44, 0xfe, 0x4a,
-       0xf4, 0x06, 0xfe, 0x0c, 0x12, 0x2f, 0x07, 0x9a, 0x85, 0x02, 0x5b, 0x05,
-       0x3f, 0xb4, 0x0c, 0x3f, 0x5e, 0x2b, 0x01, 0x08, 0x26, 0x5c, 0x01, 0xfe,
-       0xd8, 0x14, 0x02, 0x5c, 0x13, 0x06, 0x65, 0xfe, 0xca, 0x12, 0x26, 0xfe,
-       0xe0, 0x12, 0x72, 0xf1, 0x01, 0x08, 0x23, 0x72, 0x03, 0x8f, 0xfe, 0xdc,
-       0x12, 0x25, 0xfe, 0xdc, 0x12, 0x1f, 0xfe, 0xca, 0x12, 0x5e, 0x2b, 0x01,
-       0x08, 0xfe, 0xd5, 0x10, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b,
-       0x1c, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x03, 0x13,
-       0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0x1c, 0x3d, 0xfe, 0x30, 0x56,
-       0xfe, 0x00, 0x5c, 0x03, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b,
-       0x03, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0xfe, 0x0b, 0x58,
-       0x03, 0x0a, 0x50, 0x01, 0x82, 0x0a, 0x3f, 0x01, 0x82, 0x03, 0xfc, 0x1c,
-       0x10, 0xff, 0x03, 0x00, 0x54, 0xfe, 0x00, 0xf4, 0x19, 0x48, 0xfe, 0x00,
-       0x7d, 0xfe, 0x01, 0x7d, 0xfe, 0x02, 0x7d, 0xfe, 0x03, 0x7c, 0x63, 0x27,
-       0x0c, 0x52, 0x18, 0x53, 0xbe, 0x56, 0xbf, 0x57, 0x03, 0xfe, 0x62, 0x08,
-       0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x74, 0x03, 0x01,
-       0xfe, 0x14, 0x18, 0xfe, 0x42, 0x48, 0x5f, 0x60, 0x89, 0x01, 0x08, 0x1f,
-       0xfe, 0xa2, 0x14, 0x30, 0x2e, 0xd8, 0x01, 0x08, 0x1f, 0xfe, 0xa2, 0x14,
-       0x30, 0x2e, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x05, 0xc6, 0x28, 0xfe,
-       0xcc, 0x12, 0x49, 0x04, 0x1b, 0xfe, 0xc4, 0x13, 0x23, 0x62, 0x1b, 0xe2,
-       0x4b, 0xc3, 0x64, 0xfe, 0xe8, 0x13, 0x3b, 0x13, 0x06, 0x17, 0xc3, 0x78,
-       0xdb, 0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xa1, 0xff, 0x02, 0x83,
-       0x55, 0x62, 0x1a, 0xa4, 0xbb, 0xfe, 0x30, 0x00, 0x8e, 0xe4, 0x17, 0x2c,
-       0x13, 0x06, 0xfe, 0x56, 0x10, 0x62, 0x0b, 0xe1, 0xbb, 0xfe, 0x64, 0x00,
-       0x8e, 0xe4, 0x0a, 0xfe, 0x64, 0x00, 0x17, 0x93, 0x13, 0x06, 0xfe, 0x28,
-       0x10, 0x62, 0x06, 0xfe, 0x60, 0x13, 0xbb, 0xfe, 0xc8, 0x00, 0x8e, 0xe4,
-       0x0a, 0xfe, 0xc8, 0x00, 0x17, 0x4d, 0x13, 0x06, 0x83, 0xbb, 0xfe, 0x90,
-       0x01, 0xba, 0xfe, 0x4e, 0x14, 0x89, 0xfe, 0x12, 0x10, 0xfe, 0x43, 0xf4,
-       0x94, 0xfe, 0x56, 0xf0, 0xfe, 0x60, 0x14, 0xfe, 0x04, 0xf4, 0x6c, 0xfe,
-       0x43, 0xf4, 0x93, 0xfe, 0xf3, 0x10, 0xf9, 0x01, 0xfe, 0x22, 0x13, 0x1c,
-       0x3d, 0xfe, 0x10, 0x13, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4, 0x69, 0xba,
-       0xfe, 0x9c, 0x14, 0xb7, 0x69, 0xfe, 0x1c, 0x10, 0xfe, 0x00, 0x17, 0xfe,
-       0x4d, 0xe4, 0x19, 0xba, 0xfe, 0x9c, 0x14, 0xb7, 0x19, 0x83, 0x60, 0x23,
-       0xfe, 0x4d, 0xf4, 0x00, 0xdf, 0x89, 0x13, 0x06, 0xfe, 0xb4, 0x56, 0xfe,
-       0xc3, 0x58, 0x03, 0x60, 0x13, 0x0b, 0x03, 0x15, 0x06, 0x01, 0x08, 0x26,
-       0xe5, 0x15, 0x0b, 0x01, 0x08, 0x26, 0xe5, 0x15, 0x1a, 0x01, 0x08, 0x26,
-       0xe5, 0x72, 0xfe, 0x89, 0x49, 0x01, 0x08, 0x03, 0x15, 0x06, 0x01, 0x08,
-       0x26, 0xa6, 0x15, 0x1a, 0x01, 0x08, 0x26, 0xa6, 0x15, 0x06, 0x01, 0x08,
-       0x26, 0xa6, 0xfe, 0x89, 0x49, 0x01, 0x08, 0x26, 0xa6, 0x72, 0xfe, 0x89,
-       0x4a, 0x01, 0x08, 0x03, 0x60, 0x03, 0x1e, 0xcc, 0x07, 0x06, 0xfe, 0x44,
-       0x13, 0xad, 0x12, 0xcc, 0xfe, 0x49, 0xf4, 0x00, 0x3b, 0x72, 0x9f, 0x5e,
-       0xfe, 0x01, 0xec, 0xfe, 0x27, 0x01, 0xf1, 0x01, 0x08, 0x2f, 0x07, 0xfe,
-       0xe3, 0x00, 0xfe, 0x20, 0x13, 0x1f, 0xfe, 0x5a, 0x15, 0x23, 0x12, 0xcd,
-       0x01, 0x43, 0x1e, 0xcd, 0x07, 0x06, 0x45, 0x09, 0x4a, 0x06, 0x35, 0x03,
-       0x0a, 0x42, 0x01, 0x0e, 0xed, 0x88, 0x07, 0x10, 0xa4, 0x0a, 0x80, 0x01,
-       0x0e, 0x88, 0x0a, 0x51, 0x01, 0x9e, 0x03, 0x0a, 0x80, 0x01, 0x0e, 0x88,
-       0xfe, 0x80, 0xe7, 0x10, 0x07, 0x10, 0x84, 0xfe, 0x45, 0x58, 0x01, 0xe3,
-       0x88, 0x03, 0x0a, 0x42, 0x01, 0x0e, 0x88, 0x0a, 0x51, 0x01, 0x9e, 0x03,
-       0x0a, 0x42, 0x01, 0x0e, 0xfe, 0x80, 0x80, 0xf2, 0xfe, 0x49, 0xe4, 0x10,
-       0xa4, 0x0a, 0x80, 0x01, 0x0e, 0xf2, 0x0a, 0x51, 0x01, 0x82, 0x03, 0x17,
-       0x10, 0x71, 0x66, 0xfe, 0x60, 0x01, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde,
-       0xfe, 0x24, 0x1c, 0xfe, 0x1d, 0xf7, 0x1d, 0x90, 0xfe, 0xf6, 0x15, 0x01,
-       0xfe, 0xfc, 0x16, 0xe0, 0x91, 0x1d, 0x66, 0xfe, 0x2c, 0x01, 0xfe, 0x2f,
-       0x19, 0x03, 0xae, 0x21, 0xfe, 0xe6, 0x15, 0xfe, 0xda, 0x10, 0x17, 0x10,
-       0x71, 0x05, 0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x19, 0xfe, 0x18, 0x58,
-       0x05, 0xfe, 0x66, 0x01, 0xfe, 0x19, 0x58, 0x91, 0x19, 0xfe, 0x3c, 0x90,
-       0xfe, 0x30, 0xf4, 0x06, 0xfe, 0x3c, 0x50, 0x66, 0xfe, 0x38, 0x00, 0xfe,
-       0x0f, 0x79, 0xfe, 0x1c, 0xf7, 0x19, 0x90, 0xfe, 0x40, 0x16, 0xfe, 0xb6,
-       0x14, 0x34, 0x03, 0xae, 0x21, 0xfe, 0x18, 0x16, 0xfe, 0x9c, 0x10, 0x17,
-       0x10, 0x71, 0xfe, 0x83, 0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe,
-       0x1d, 0xf7, 0x38, 0x90, 0xfe, 0x62, 0x16, 0xfe, 0x94, 0x14, 0xfe, 0x10,
-       0x13, 0x91, 0x38, 0x66, 0x1b, 0xfe, 0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00,
-       0x03, 0xae, 0x21, 0xfe, 0x56, 0x16, 0xfe, 0x6c, 0x10, 0x17, 0x10, 0x71,
-       0xfe, 0x30, 0xbc, 0xfe, 0xb2, 0xbc, 0x91, 0xc5, 0x66, 0x1b, 0xfe, 0x0f,
-       0x79, 0xfe, 0x1c, 0xf7, 0xc5, 0x90, 0xfe, 0x9a, 0x16, 0xfe, 0x5c, 0x14,
-       0x34, 0x03, 0xae, 0x21, 0xfe, 0x86, 0x16, 0xfe, 0x42, 0x10, 0xfe, 0x02,
-       0xf6, 0x10, 0x71, 0xfe, 0x18, 0xfe, 0x54, 0xfe, 0x19, 0xfe, 0x55, 0xfc,
-       0xfe, 0x1d, 0xf7, 0x4f, 0x90, 0xfe, 0xc0, 0x16, 0xfe, 0x36, 0x14, 0xfe,
-       0x1c, 0x13, 0x91, 0x4f, 0x47, 0xfe, 0x83, 0x58, 0xfe, 0xaf, 0x19, 0xfe,
-       0x80, 0xe7, 0x10, 0xfe, 0x81, 0xe7, 0x10, 0x11, 0xfe, 0xdd, 0x00, 0x63,
-       0x27, 0x03, 0x63, 0x27, 0xfe, 0x12, 0x45, 0x21, 0xfe, 0xb0, 0x16, 0x14,
-       0x06, 0x37, 0x95, 0xa9, 0x02, 0x29, 0xfe, 0x39, 0xf0, 0xfe, 0x04, 0x17,
-       0x23, 0x03, 0xfe, 0x7e, 0x18, 0x1c, 0x1a, 0x5d, 0x13, 0x0d, 0x03, 0x71,
-       0x05, 0xcb, 0x1c, 0x06, 0xfe, 0xef, 0x12, 0xfe, 0xe1, 0x10, 0x78, 0x2c,
-       0x46, 0x2f, 0x07, 0x2d, 0xfe, 0x3c, 0x13, 0xfe, 0x82, 0x14, 0xfe, 0x42,
-       0x13, 0x3c, 0x8a, 0x0a, 0x42, 0x01, 0x0e, 0xb0, 0xfe, 0x3e, 0x12, 0xf0,
-       0xfe, 0x45, 0x48, 0x01, 0xe3, 0xfe, 0x00, 0xcc, 0xb0, 0xfe, 0xf3, 0x13,
-       0x3d, 0x75, 0x07, 0x10, 0xa3, 0x0a, 0x80, 0x01, 0x0e, 0xf2, 0x01, 0x6f,
-       0xfe, 0x16, 0x10, 0x07, 0x7e, 0x85, 0xfe, 0x40, 0x14, 0xfe, 0x24, 0x12,
-       0xf6, 0xfe, 0xd6, 0xf0, 0xfe, 0x24, 0x17, 0x17, 0x0b, 0x03, 0xfe, 0x9c,
-       0xe7, 0x0b, 0x0f, 0xfe, 0x15, 0x00, 0x59, 0x76, 0x27, 0x01, 0xda, 0x17,
-       0x06, 0x03, 0x3c, 0x8a, 0x09, 0x4a, 0x1d, 0x35, 0x11, 0x2d, 0x01, 0x6f,
-       0x17, 0x06, 0x03, 0xfe, 0x38, 0x90, 0xfe, 0xba, 0x90, 0x79, 0xc7, 0x68,
-       0xc8, 0xfe, 0x48, 0x55, 0x34, 0xfe, 0xc9, 0x55, 0x03, 0x1e, 0x98, 0x73,
-       0x12, 0x98, 0x03, 0x0a, 0x99, 0x01, 0x0e, 0xf0, 0x0a, 0x40, 0x01, 0x0e,
-       0xfe, 0x49, 0x44, 0x16, 0xfe, 0xf0, 0x17, 0x73, 0x75, 0x03, 0x0a, 0x42,
-       0x01, 0x0e, 0x07, 0x10, 0x45, 0x0a, 0x51, 0x01, 0x9e, 0x0a, 0x40, 0x01,
-       0x0e, 0x73, 0x75, 0x03, 0xfe, 0x4e, 0xe4, 0x1a, 0x64, 0xfe, 0x24, 0x18,
-       0x05, 0xfe, 0x90, 0x00, 0xfe, 0x3a, 0x45, 0x5b, 0xfe, 0x4e, 0xe4, 0xc2,
-       0x64, 0xfe, 0x36, 0x18, 0x05, 0xfe, 0x92, 0x00, 0xfe, 0x02, 0xe6, 0x1b,
-       0xdc, 0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x64, 0xfe, 0x48, 0x18, 0x05,
-       0xfe, 0x94, 0x00, 0xfe, 0x02, 0xe6, 0x19, 0xfe, 0x08, 0x10, 0x05, 0xfe,
-       0x96, 0x00, 0xfe, 0x02, 0xe6, 0x2c, 0xfe, 0x4e, 0x45, 0xfe, 0x0c, 0x12,
-       0xaf, 0xff, 0x04, 0x68, 0x54, 0xde, 0x1c, 0x69, 0x03, 0x07, 0x7a, 0xfe,
-       0x5a, 0xf0, 0xfe, 0x74, 0x18, 0x24, 0xfe, 0x09, 0x00, 0xfe, 0x34, 0x10,
-       0x07, 0x1b, 0xfe, 0x5a, 0xf0, 0xfe, 0x82, 0x18, 0x24, 0xc3, 0xfe, 0x26,
-       0x10, 0x07, 0x1a, 0x5d, 0x24, 0x2c, 0xdc, 0x07, 0x0b, 0x5d, 0x24, 0x93,
-       0xfe, 0x0e, 0x10, 0x07, 0x06, 0x5d, 0x24, 0x4d, 0x9f, 0xad, 0x03, 0x14,
-       0xfe, 0x09, 0x00, 0x01, 0x33, 0xfe, 0x04, 0xfe, 0x7d, 0x05, 0x7f, 0xf9,
-       0x03, 0x25, 0xfe, 0xca, 0x18, 0xfe, 0x14, 0xf0, 0x08, 0x65, 0xfe, 0xc6,
-       0x18, 0x03, 0xff, 0x1a, 0x00, 0x00,
-};
-
-static unsigned short _adv_asc3550_size = sizeof(_adv_asc3550_buf);    /* 0x13AD */
-static ADV_DCNT _adv_asc3550_chksum = 0x04D52DDDUL;    /* Expanded little-endian checksum. */
-
-/* Microcode buffer is kept after initialization for error recovery. */
-static unsigned char _adv_asc38C0800_buf[] = {
-       0x00, 0x00, 0x00, 0xf2, 0x00, 0xf0, 0x00, 0xfc, 0x00, 0x16, 0x18, 0xe4,
-       0x01, 0x00, 0x48, 0xe4, 0x18, 0x80, 0x03, 0xf6, 0x02, 0x00, 0xce, 0x19,
-       0x00, 0xfa, 0xff, 0xff, 0x1c, 0x0f, 0x00, 0xf6, 0x9e, 0xe7, 0xff, 0x00,
-       0x82, 0xe7, 0x00, 0xea, 0x01, 0xfa, 0x01, 0xe6, 0x09, 0xe7, 0x55, 0xf0,
-       0x01, 0xf6, 0x03, 0x00, 0x04, 0x00, 0x10, 0x00, 0x1e, 0xf0, 0x85, 0xf0,
-       0x18, 0xf4, 0x08, 0x00, 0xbc, 0x00, 0x38, 0x54, 0x00, 0xec, 0xd5, 0xf0,
-       0x82, 0x0d, 0x00, 0xe6, 0x86, 0xf0, 0xb1, 0xf0, 0x98, 0x57, 0x01, 0xfc,
-       0xb4, 0x00, 0xd4, 0x01, 0x0c, 0x1c, 0x3e, 0x1c, 0x3c, 0x00, 0xbb, 0x00,
-       0x00, 0x10, 0xba, 0x19, 0x02, 0x80, 0x32, 0xf0, 0x7c, 0x0d, 0x02, 0x13,
-       0xba, 0x13, 0x18, 0x40, 0x00, 0x57, 0x01, 0xea, 0x02, 0xfc, 0x03, 0xfc,
-       0x3e, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x76, 0x01, 0xb9, 0x54,
-       0x3e, 0x57, 0x00, 0x80, 0x03, 0xe6, 0xb6, 0x00, 0xc0, 0x00, 0x01, 0x01,
-       0x3e, 0x01, 0x7a, 0x01, 0xca, 0x08, 0xce, 0x10, 0x16, 0x11, 0x04, 0x12,
-       0x08, 0x12, 0x02, 0x4a, 0xbb, 0x55, 0x3c, 0x56, 0x03, 0x58, 0x1b, 0x80,
-       0x30, 0xe4, 0x4b, 0xe4, 0x5d, 0xf0, 0x02, 0xfa, 0x20, 0x00, 0x32, 0x00,
-       0x40, 0x00, 0x80, 0x00, 0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01,
-       0x70, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x62, 0x0a, 0x86, 0x0d,
-       0x06, 0x13, 0x4c, 0x1c, 0x04, 0x80, 0x4a, 0xe4, 0x02, 0xee, 0x5b, 0xf0,
-       0x03, 0xf7, 0x0c, 0x00, 0x0f, 0x00, 0x47, 0x00, 0xbe, 0x00, 0x00, 0x01,
-       0x20, 0x11, 0x5c, 0x16, 0x32, 0x1c, 0x38, 0x1c, 0x4e, 0x1c, 0x10, 0x44,
-       0x00, 0x4c, 0x04, 0xea, 0x5c, 0xf0, 0xa7, 0xf0, 0x04, 0xf6, 0x03, 0xfa,
-       0x05, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00, 0xcc, 0x00, 0x20, 0x01,
-       0x4e, 0x01, 0x4a, 0x0b, 0x42, 0x0c, 0x12, 0x0f, 0x0c, 0x10, 0x22, 0x11,
-       0x0a, 0x12, 0x04, 0x13, 0x30, 0x1c, 0x02, 0x48, 0x00, 0x4e, 0x42, 0x54,
-       0x44, 0x55, 0xbd, 0x56, 0x06, 0x83, 0x00, 0xdc, 0x05, 0xf0, 0x09, 0xf0,
-       0x59, 0xf0, 0xb8, 0xf0, 0x4b, 0xf4, 0x06, 0xf7, 0x0e, 0xf7, 0x04, 0xfc,
-       0x05, 0xfc, 0x06, 0x00, 0x19, 0x00, 0x33, 0x00, 0x9b, 0x00, 0xa4, 0x00,
-       0xb5, 0x00, 0xba, 0x00, 0xd0, 0x00, 0xe1, 0x00, 0xe7, 0x00, 0xe2, 0x03,
-       0x08, 0x0f, 0x02, 0x10, 0x04, 0x10, 0x0a, 0x10, 0x0a, 0x13, 0x0c, 0x13,
-       0x12, 0x13, 0x24, 0x14, 0x34, 0x14, 0x04, 0x16, 0x08, 0x16, 0xa4, 0x17,
-       0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c, 0x08, 0x44, 0x38, 0x44, 0x91, 0x44,
-       0x0a, 0x45, 0x48, 0x46, 0x01, 0x48, 0x68, 0x54, 0x3a, 0x55, 0x83, 0x55,
-       0xe5, 0x55, 0xb0, 0x57, 0x01, 0x58, 0x83, 0x59, 0x05, 0xe6, 0x0b, 0xf0,
-       0x0c, 0xf0, 0x04, 0xf8, 0x05, 0xf8, 0x07, 0x00, 0x0a, 0x00, 0x1c, 0x00,
-       0x1e, 0x00, 0x9e, 0x00, 0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00,
-       0x22, 0x01, 0x26, 0x01, 0x79, 0x01, 0x7e, 0x01, 0xc4, 0x01, 0xc6, 0x01,
-       0x80, 0x02, 0x5e, 0x03, 0xee, 0x04, 0x9a, 0x06, 0xf8, 0x07, 0x62, 0x08,
-       0x68, 0x08, 0x69, 0x08, 0xd6, 0x08, 0xe9, 0x09, 0xfa, 0x0b, 0x2e, 0x0f,
-       0x12, 0x10, 0x1a, 0x10, 0xed, 0x10, 0xf1, 0x10, 0x2a, 0x11, 0x06, 0x12,
-       0x0c, 0x12, 0x3e, 0x12, 0x10, 0x13, 0x16, 0x13, 0x1e, 0x13, 0x46, 0x14,
-       0x76, 0x14, 0x82, 0x14, 0x36, 0x15, 0xca, 0x15, 0x6b, 0x18, 0xbe, 0x18,
-       0xca, 0x18, 0xe6, 0x19, 0x12, 0x1c, 0x46, 0x1c, 0x9c, 0x32, 0x00, 0x40,
-       0x0e, 0x47, 0xfe, 0x9c, 0xf0, 0x2b, 0x02, 0xfe, 0xac, 0x0d, 0xff, 0x10,
-       0x00, 0x00, 0xd7, 0xfe, 0xe8, 0x19, 0x00, 0xd6, 0xfe, 0x84, 0x01, 0xff,
-       0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
-       0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x4c, 0x00, 0x5b, 0xff, 0x04, 0x00,
-       0x00, 0x11, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
-       0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x11,
-       0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
-       0xfe, 0x04, 0xf7, 0xd6, 0x2c, 0x99, 0x0a, 0x01, 0xfe, 0xc2, 0x0f, 0xfe,
-       0x04, 0xf7, 0xd6, 0x99, 0x0a, 0x42, 0x2c, 0xfe, 0x3d, 0xf0, 0xfe, 0x06,
-       0x02, 0xfe, 0x20, 0xf0, 0xa7, 0xfe, 0x91, 0xf0, 0xfe, 0xf4, 0x01, 0xfe,
-       0x90, 0xf0, 0xfe, 0xf4, 0x01, 0xfe, 0x8f, 0xf0, 0xa7, 0x03, 0x5d, 0x4d,
-       0x02, 0xfe, 0xc8, 0x0d, 0x01, 0xfe, 0x38, 0x0e, 0xfe, 0xdd, 0x12, 0xfe,
-       0xfc, 0x10, 0xfe, 0x28, 0x1c, 0x03, 0xfe, 0xa6, 0x00, 0xfe, 0xd3, 0x12,
-       0x41, 0x14, 0xfe, 0xa6, 0x00, 0xc2, 0xfe, 0x48, 0xf0, 0xfe, 0x8a, 0x02,
-       0xfe, 0x49, 0xf0, 0xfe, 0xa4, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xc2, 0x02,
-       0xfe, 0x46, 0xf0, 0xfe, 0x54, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x5a, 0x02,
-       0xfe, 0x43, 0xf0, 0xfe, 0x48, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x4c, 0x02,
-       0xfe, 0x45, 0xf0, 0xfe, 0x50, 0x02, 0x18, 0x0a, 0xaa, 0x18, 0x06, 0x14,
-       0xa1, 0x02, 0x2b, 0xfe, 0x00, 0x1c, 0xe7, 0xfe, 0x02, 0x1c, 0xe6, 0xfe,
-       0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0xfe, 0x18, 0x18, 0xfe, 0xe7, 0x10,
-       0xfe, 0x06, 0xfc, 0xce, 0x09, 0x70, 0x01, 0xa8, 0x02, 0x2b, 0x15, 0x59,
-       0x39, 0xa2, 0x01, 0xfe, 0x58, 0x10, 0x09, 0x70, 0x01, 0x87, 0xfe, 0xbd,
-       0x10, 0x09, 0x70, 0x01, 0x87, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c, 0xfe,
-       0x58, 0x1c, 0x18, 0x06, 0x14, 0xa1, 0x2c, 0x1c, 0x2b, 0xfe, 0x3d, 0xf0,
-       0xfe, 0x06, 0x02, 0x23, 0xfe, 0x98, 0x02, 0xfe, 0x5a, 0x1c, 0xf8, 0xfe,
-       0x14, 0x1c, 0x15, 0xfe, 0x30, 0x00, 0x39, 0xa2, 0x01, 0xfe, 0x48, 0x10,
-       0x18, 0x06, 0x14, 0xa1, 0x02, 0xd7, 0x22, 0x20, 0x07, 0x11, 0x35, 0xfe,
-       0x69, 0x10, 0x18, 0x06, 0x14, 0xa1, 0xfe, 0x04, 0xec, 0x20, 0x4f, 0x43,
-       0x13, 0x20, 0xfe, 0x05, 0xf6, 0xce, 0x01, 0xfe, 0x4a, 0x17, 0x08, 0x54,
-       0x58, 0x37, 0x12, 0x2f, 0x42, 0x92, 0x01, 0xfe, 0x82, 0x16, 0x02, 0x2b,
-       0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x66, 0x01, 0x73, 0xfe, 0x18, 0x10,
-       0xfe, 0x41, 0x58, 0x09, 0xa4, 0x01, 0x0e, 0xfe, 0xc8, 0x54, 0x6b, 0xfe,
-       0x10, 0x03, 0x01, 0xfe, 0x82, 0x16, 0x02, 0x2b, 0x2c, 0x4f, 0xfe, 0x02,
-       0xe8, 0x2a, 0xfe, 0xbf, 0x57, 0xfe, 0x9e, 0x43, 0xfe, 0x77, 0x57, 0xfe,
-       0x27, 0xf0, 0xfe, 0xe0, 0x01, 0xfe, 0x07, 0x4b, 0xfe, 0x20, 0xf0, 0xa7,
-       0xfe, 0x40, 0x1c, 0x1c, 0xd9, 0xfe, 0x26, 0xf0, 0xfe, 0x5a, 0x03, 0xfe,
-       0xa0, 0xf0, 0xfe, 0x48, 0x03, 0xfe, 0x11, 0xf0, 0xa7, 0xfe, 0xef, 0x10,
-       0xfe, 0x9f, 0xf0, 0xfe, 0x68, 0x03, 0xf9, 0x10, 0xfe, 0x11, 0x00, 0x02,
-       0x65, 0x2c, 0xfe, 0x48, 0x1c, 0xf9, 0x08, 0x05, 0x1b, 0xfe, 0x18, 0x13,
-       0x21, 0x22, 0xa3, 0xb7, 0x13, 0xa3, 0x09, 0x46, 0x01, 0x0e, 0xb7, 0x78,
-       0x01, 0xfe, 0xb4, 0x16, 0x12, 0xd1, 0x1c, 0xd9, 0xfe, 0x01, 0xf0, 0xd9,
-       0xfe, 0x82, 0xf0, 0xfe, 0x96, 0x03, 0xfa, 0x12, 0xfe, 0xe4, 0x00, 0x27,
-       0xfe, 0xa8, 0x03, 0x1c, 0x34, 0x1d, 0xfe, 0xb8, 0x03, 0x01, 0x4b, 0xfe,
-       0x06, 0xf0, 0xfe, 0xc8, 0x03, 0x95, 0x86, 0xfe, 0x0a, 0xf0, 0xfe, 0x8a,
-       0x06, 0x02, 0x24, 0x03, 0x70, 0x28, 0x17, 0xfe, 0xfa, 0x04, 0x15, 0x6d,
-       0x01, 0x36, 0x7b, 0xfe, 0x6a, 0x02, 0x02, 0xd8, 0xf9, 0x2c, 0x99, 0x19,
-       0xfe, 0x67, 0x1b, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57, 0xfe, 0x48, 0x1c,
-       0x74, 0x01, 0xaf, 0x8c, 0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x17, 0xda,
-       0x09, 0xd1, 0x01, 0x0e, 0x8d, 0x51, 0x64, 0x79, 0x2a, 0x03, 0x70, 0x28,
-       0xfe, 0x10, 0x12, 0x15, 0x6d, 0x01, 0x36, 0x7b, 0xfe, 0x6a, 0x02, 0x02,
-       0xd8, 0xc7, 0x81, 0xc8, 0x83, 0x1c, 0x24, 0x27, 0xfe, 0x40, 0x04, 0x1d,
-       0xfe, 0x3c, 0x04, 0x3b, 0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x4e,
-       0x12, 0x2d, 0xff, 0x02, 0x00, 0x10, 0x01, 0x0b, 0x1d, 0xfe, 0xe4, 0x04,
-       0x2d, 0x01, 0x0b, 0x1d, 0x24, 0x33, 0x31, 0xde, 0xfe, 0x4c, 0x44, 0xfe,
-       0x4c, 0x12, 0x51, 0xfe, 0x44, 0x48, 0x0f, 0x6f, 0xfe, 0x4c, 0x54, 0x6b,
-       0xda, 0x4f, 0x79, 0x2a, 0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x62,
-       0x13, 0x08, 0x05, 0x1b, 0xfe, 0x2a, 0x13, 0x32, 0x07, 0x82, 0xfe, 0x52,
-       0x13, 0xfe, 0x20, 0x10, 0x0f, 0x6f, 0xfe, 0x4c, 0x54, 0x6b, 0xda, 0xfe,
-       0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x40, 0x13, 0x08, 0x05, 0x1b, 0xfe,
-       0x08, 0x13, 0x32, 0x07, 0x82, 0xfe, 0x30, 0x13, 0x08, 0x05, 0x1b, 0xfe,
-       0x1c, 0x12, 0x15, 0x9d, 0x08, 0x05, 0x06, 0x4d, 0x15, 0xfe, 0x0d, 0x00,
-       0x01, 0x36, 0x7b, 0xfe, 0x64, 0x0d, 0x02, 0x24, 0x2d, 0x12, 0xfe, 0xe6,
-       0x00, 0xfe, 0x1c, 0x90, 0xfe, 0x40, 0x5c, 0x04, 0x15, 0x9d, 0x01, 0x36,
-       0x02, 0x2b, 0xfe, 0x42, 0x5b, 0x99, 0x19, 0xfe, 0x46, 0x59, 0xfe, 0xbf,
-       0x57, 0xfe, 0x77, 0x57, 0xfe, 0x87, 0x80, 0xfe, 0x31, 0xe4, 0x5b, 0x08,
-       0x05, 0x0a, 0xfe, 0x84, 0x13, 0xfe, 0x20, 0x80, 0x07, 0x19, 0xfe, 0x7c,
-       0x12, 0x53, 0x05, 0x06, 0xfe, 0x6c, 0x13, 0x03, 0xfe, 0xa2, 0x00, 0x28,
-       0x17, 0xfe, 0x90, 0x05, 0xfe, 0x31, 0xe4, 0x5a, 0x53, 0x05, 0x0a, 0xfe,
-       0x56, 0x13, 0x03, 0xfe, 0xa0, 0x00, 0x28, 0xfe, 0x4e, 0x12, 0x67, 0xff,
-       0x02, 0x00, 0x10, 0x27, 0xfe, 0x48, 0x05, 0x1c, 0x34, 0xfe, 0x89, 0x48,
-       0xff, 0x02, 0x00, 0x10, 0x27, 0xfe, 0x56, 0x05, 0x26, 0xfe, 0xa8, 0x05,
-       0x12, 0xfe, 0xe3, 0x00, 0x21, 0x53, 0xfe, 0x4a, 0xf0, 0xfe, 0x76, 0x05,
-       0xfe, 0x49, 0xf0, 0xfe, 0x70, 0x05, 0x88, 0x25, 0xfe, 0x21, 0x00, 0xab,
-       0x25, 0xfe, 0x22, 0x00, 0xaa, 0x25, 0x58, 0xfe, 0x09, 0x48, 0xff, 0x02,
-       0x00, 0x10, 0x27, 0xfe, 0x86, 0x05, 0x26, 0xfe, 0xa8, 0x05, 0xfe, 0xe2,
-       0x08, 0x53, 0x05, 0xcb, 0x4d, 0x01, 0xb0, 0x25, 0x06, 0x13, 0xd3, 0x39,
-       0xfe, 0x27, 0x01, 0x08, 0x05, 0x1b, 0xfe, 0x22, 0x12, 0x41, 0x01, 0xb2,
-       0x15, 0x9d, 0x08, 0x05, 0x06, 0x4d, 0x15, 0xfe, 0x0d, 0x00, 0x01, 0x36,
-       0x7b, 0xfe, 0x64, 0x0d, 0x02, 0x24, 0x03, 0xfe, 0x9c, 0x00, 0x28, 0xeb,
-       0x03, 0x5c, 0x28, 0xfe, 0x36, 0x13, 0x41, 0x01, 0xb2, 0x26, 0xfe, 0x18,
-       0x06, 0x09, 0x06, 0x53, 0x05, 0x1f, 0xfe, 0x02, 0x12, 0x50, 0x01, 0xfe,
-       0x9e, 0x15, 0x1d, 0xfe, 0x0e, 0x06, 0x12, 0xa5, 0x01, 0x4b, 0x12, 0xfe,
-       0xe5, 0x00, 0x03, 0x5c, 0xc1, 0x0c, 0x5c, 0x03, 0xcd, 0x28, 0xfe, 0x62,
-       0x12, 0x03, 0x45, 0x28, 0xfe, 0x5a, 0x13, 0x01, 0xfe, 0x0c, 0x19, 0x01,
-       0xfe, 0x76, 0x19, 0xfe, 0x43, 0x48, 0xc4, 0xcc, 0x0f, 0x71, 0xff, 0x02,
-       0x00, 0x57, 0x52, 0x93, 0x1e, 0x43, 0x8b, 0xc4, 0x6e, 0x41, 0x01, 0xb2,
-       0x26, 0xfe, 0x82, 0x06, 0x53, 0x05, 0x1a, 0xe9, 0x91, 0x09, 0x59, 0x01,
-       0xfe, 0xcc, 0x15, 0x1d, 0xfe, 0x78, 0x06, 0x12, 0xa5, 0x01, 0x4b, 0x12,
-       0xfe, 0xe5, 0x00, 0x03, 0x45, 0xc1, 0x0c, 0x45, 0x18, 0x06, 0x01, 0xb2,
-       0xfa, 0x76, 0x74, 0x01, 0xaf, 0x8c, 0x12, 0xfe, 0xe2, 0x00, 0x27, 0xdb,
-       0x1c, 0x34, 0xfe, 0x0a, 0xf0, 0xfe, 0xb6, 0x06, 0x94, 0xfe, 0x6c, 0x07,
-       0xfe, 0x06, 0xf0, 0xfe, 0x74, 0x07, 0x95, 0x86, 0x02, 0x24, 0x08, 0x05,
-       0x0a, 0xfe, 0x2e, 0x12, 0x16, 0x19, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b,
-       0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b, 0xfe, 0x99, 0xa4, 0x01,
-       0x0b, 0x16, 0x00, 0x02, 0xfe, 0x42, 0x08, 0x68, 0x05, 0x1a, 0xfe, 0x38,
-       0x12, 0x08, 0x05, 0x1a, 0xfe, 0x30, 0x13, 0x16, 0xfe, 0x1b, 0x00, 0x01,
-       0x0b, 0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01,
-       0x0b, 0x16, 0x06, 0x01, 0x0b, 0x16, 0x00, 0x02, 0xe2, 0x6c, 0x58, 0xbe,
-       0x50, 0xfe, 0x9a, 0x81, 0x55, 0x1b, 0x7a, 0xfe, 0x42, 0x07, 0x09, 0x1b,
-       0xfe, 0x09, 0x6f, 0xba, 0xfe, 0xca, 0x45, 0xfe, 0x32, 0x12, 0x69, 0x6d,
-       0x8b, 0x6c, 0x7f, 0x27, 0xfe, 0x54, 0x07, 0x1c, 0x34, 0xfe, 0x0a, 0xf0,
-       0xfe, 0x42, 0x07, 0x95, 0x86, 0x94, 0xfe, 0x6c, 0x07, 0x02, 0x24, 0x01,
-       0x4b, 0x02, 0xdb, 0x16, 0x1f, 0x02, 0xdb, 0xfe, 0x9c, 0xf7, 0xdc, 0xfe,
-       0x2c, 0x90, 0xfe, 0xae, 0x90, 0x56, 0xfe, 0xda, 0x07, 0x0c, 0x60, 0x14,
-       0x61, 0x08, 0x54, 0x5a, 0x37, 0x22, 0x20, 0x07, 0x11, 0xfe, 0x0e, 0x12,
-       0x8d, 0xfe, 0x80, 0x80, 0x39, 0x20, 0x6a, 0x2a, 0xfe, 0x06, 0x10, 0xfe,
-       0x83, 0xe7, 0xfe, 0x48, 0x00, 0xab, 0xfe, 0x03, 0x40, 0x08, 0x54, 0x5b,
-       0x37, 0x01, 0xb3, 0xb8, 0xfe, 0x1f, 0x40, 0x13, 0x62, 0x01, 0xef, 0xfe,
-       0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe, 0x44, 0x51, 0xfe, 0xc6, 0x51, 0x88,
-       0xfe, 0x08, 0x90, 0xfe, 0x8a, 0x90, 0x0c, 0x5e, 0x14, 0x5f, 0xfe, 0x0c,
-       0x90, 0xfe, 0x8e, 0x90, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x0c, 0x3d,
-       0x14, 0x3e, 0xfe, 0x4a, 0x10, 0x08, 0x05, 0x5a, 0xfe, 0x2a, 0x12, 0xfe,
-       0x2c, 0x90, 0xfe, 0xae, 0x90, 0x0c, 0x60, 0x14, 0x61, 0x08, 0x05, 0x5b,
-       0x8b, 0x01, 0xb3, 0xfe, 0x1f, 0x80, 0x13, 0x62, 0xfe, 0x44, 0x90, 0xfe,
-       0xc6, 0x90, 0x0c, 0x3f, 0x14, 0x40, 0xfe, 0x08, 0x90, 0xfe, 0x8a, 0x90,
-       0x0c, 0x5e, 0x14, 0x5f, 0xfe, 0x40, 0x90, 0xfe, 0xc2, 0x90, 0x0c, 0x3d,
-       0x14, 0x3e, 0x0c, 0x2e, 0x14, 0x3c, 0x21, 0x0c, 0x49, 0x0c, 0x63, 0x08,
-       0x54, 0x1f, 0x37, 0x2c, 0x0f, 0xfe, 0x4e, 0x11, 0x27, 0xdd, 0xfe, 0x9e,
-       0xf0, 0xfe, 0x76, 0x08, 0xbc, 0x17, 0x34, 0x2c, 0x77, 0xe6, 0xc5, 0xfe,
-       0x9a, 0x08, 0xc6, 0xfe, 0xb8, 0x08, 0x94, 0xfe, 0x8e, 0x08, 0xfe, 0x06,
-       0xf0, 0xfe, 0x94, 0x08, 0x95, 0x86, 0x02, 0x24, 0x01, 0x4b, 0xfe, 0xc9,
-       0x10, 0x16, 0x1f, 0xfe, 0xc9, 0x10, 0x68, 0x05, 0x06, 0xfe, 0x10, 0x12,
-       0x68, 0x05, 0x0a, 0x4e, 0x08, 0x05, 0x0a, 0xfe, 0x90, 0x12, 0xfe, 0x2e,
-       0x1c, 0x02, 0xfe, 0x18, 0x0b, 0x68, 0x05, 0x06, 0x4e, 0x68, 0x05, 0x0a,
-       0xfe, 0x7a, 0x12, 0xfe, 0x2c, 0x1c, 0xfe, 0xaa, 0xf0, 0xfe, 0xd2, 0x09,
-       0xfe, 0xac, 0xf0, 0xfe, 0x00, 0x09, 0x02, 0xfe, 0xde, 0x09, 0xfe, 0xb7,
-       0xf0, 0xfe, 0xfc, 0x08, 0xfe, 0x02, 0xf6, 0x1a, 0x50, 0xfe, 0x70, 0x18,
-       0xfe, 0xf1, 0x18, 0xfe, 0x40, 0x55, 0xfe, 0xe1, 0x55, 0xfe, 0x10, 0x58,
-       0xfe, 0x91, 0x58, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0x1c, 0x85, 0xfe,
-       0x8c, 0xf0, 0xfe, 0xfc, 0x08, 0xfe, 0xac, 0xf0, 0xfe, 0xf0, 0x08, 0xb5,
-       0xfe, 0xcb, 0x10, 0xfe, 0xad, 0xf0, 0xfe, 0x0c, 0x09, 0x02, 0xfe, 0x18,
-       0x0b, 0xb6, 0xfe, 0xbf, 0x10, 0xfe, 0x2b, 0xf0, 0x85, 0xf4, 0x1e, 0xfe,
-       0x00, 0xfe, 0xfe, 0x1c, 0x12, 0xc2, 0xfe, 0xd2, 0xf0, 0x85, 0xfe, 0x76,
-       0x18, 0x1e, 0x19, 0x17, 0x85, 0x03, 0xd2, 0x1e, 0x06, 0x17, 0x85, 0xc5,
-       0x4a, 0xc6, 0x4a, 0xb5, 0xb6, 0xfe, 0x89, 0x10, 0x74, 0x67, 0x2d, 0x15,
-       0x9d, 0x01, 0x36, 0x10, 0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x65, 0x10,
-       0x80, 0x02, 0x65, 0xfe, 0x98, 0x80, 0xfe, 0x19, 0xe4, 0x0a, 0xfe, 0x1a,
-       0x12, 0x51, 0xfe, 0x19, 0x82, 0xfe, 0x6c, 0x18, 0xfe, 0x44, 0x54, 0xbe,
-       0xfe, 0x19, 0x81, 0xfe, 0x74, 0x18, 0x8f, 0x90, 0x17, 0xfe, 0xce, 0x08,
-       0x02, 0x4a, 0x08, 0x05, 0x5a, 0xec, 0x03, 0x2e, 0x29, 0x3c, 0x0c, 0x3f,
-       0x14, 0x40, 0x9b, 0x2e, 0x9c, 0x3c, 0xfe, 0x6c, 0x18, 0xfe, 0xed, 0x18,
-       0xfe, 0x44, 0x54, 0xfe, 0xe5, 0x54, 0x3a, 0x3f, 0x3b, 0x40, 0x03, 0x49,
-       0x29, 0x63, 0x8f, 0xfe, 0xe3, 0x54, 0xfe, 0x74, 0x18, 0xfe, 0xf5, 0x18,
-       0x8f, 0xfe, 0xe3, 0x54, 0x90, 0xc0, 0x56, 0xfe, 0xce, 0x08, 0x02, 0x4a,
-       0xfe, 0x37, 0xf0, 0xfe, 0xda, 0x09, 0xfe, 0x8b, 0xf0, 0xfe, 0x60, 0x09,
-       0x02, 0x4a, 0x08, 0x05, 0x0a, 0x23, 0xfe, 0xfa, 0x0a, 0x3a, 0x49, 0x3b,
-       0x63, 0x56, 0xfe, 0x3e, 0x0a, 0x0f, 0xfe, 0xc0, 0x07, 0x41, 0x98, 0x00,
-       0xad, 0xfe, 0x01, 0x59, 0xfe, 0x52, 0xf0, 0xfe, 0x0c, 0x0a, 0x8f, 0x7a,
-       0xfe, 0x24, 0x0a, 0x3a, 0x49, 0x8f, 0xfe, 0xe3, 0x54, 0x57, 0x49, 0x7d,
-       0x63, 0xfe, 0x14, 0x58, 0xfe, 0x95, 0x58, 0x02, 0x4a, 0x3a, 0x49, 0x3b,
-       0x63, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0xbe, 0x57, 0x49, 0x57, 0x63,
-       0x02, 0x4a, 0x08, 0x05, 0x5a, 0xfe, 0x82, 0x12, 0x08, 0x05, 0x1f, 0xfe,
-       0x66, 0x13, 0x22, 0x62, 0xb7, 0xfe, 0x03, 0xa1, 0xfe, 0x83, 0x80, 0xfe,
-       0xc8, 0x44, 0xfe, 0x2e, 0x13, 0xfe, 0x04, 0x91, 0xfe, 0x86, 0x91, 0x6a,
-       0x2a, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x56, 0xe0, 0x03, 0x60, 0x29,
-       0x61, 0x0c, 0x7f, 0x14, 0x80, 0x57, 0x60, 0x7d, 0x61, 0x01, 0xb3, 0xb8,
-       0x6a, 0x2a, 0x13, 0x62, 0x9b, 0x2e, 0x9c, 0x3c, 0x3a, 0x3f, 0x3b, 0x40,
-       0x90, 0xc0, 0xfe, 0x04, 0xfa, 0x2e, 0xfe, 0x05, 0xfa, 0x3c, 0x01, 0xef,
-       0xfe, 0x36, 0x10, 0x21, 0x0c, 0x7f, 0x0c, 0x80, 0x3a, 0x3f, 0x3b, 0x40,
-       0xe4, 0x08, 0x05, 0x1f, 0x17, 0xe0, 0x3a, 0x3d, 0x3b, 0x3e, 0x08, 0x05,
-       0xfe, 0xf7, 0x00, 0x37, 0x03, 0x5e, 0x29, 0x5f, 0xfe, 0x10, 0x58, 0xfe,
-       0x91, 0x58, 0x57, 0x49, 0x7d, 0x63, 0x02, 0xfe, 0xf4, 0x09, 0x08, 0x05,
-       0x1f, 0x17, 0xe0, 0x08, 0x05, 0xfe, 0xf7, 0x00, 0x37, 0xbe, 0xfe, 0x19,
-       0x81, 0x50, 0xfe, 0x10, 0x90, 0xfe, 0x92, 0x90, 0xfe, 0xd3, 0x10, 0x32,
-       0x07, 0xa6, 0x17, 0xfe, 0x08, 0x09, 0x12, 0xa6, 0x08, 0x05, 0x0a, 0xfe,
-       0x14, 0x13, 0x03, 0x3d, 0x29, 0x3e, 0x56, 0xfe, 0x08, 0x09, 0xfe, 0x0c,
-       0x58, 0xfe, 0x8d, 0x58, 0x02, 0x4a, 0x21, 0x41, 0xfe, 0x19, 0x80, 0xe7,
-       0x08, 0x05, 0x0a, 0xfe, 0x1a, 0x12, 0xfe, 0x6c, 0x19, 0xfe, 0x19, 0x41,
-       0xf4, 0xc2, 0xfe, 0xd1, 0xf0, 0xe2, 0x15, 0x7e, 0x01, 0x36, 0x10, 0xfe,
-       0x44, 0x00, 0xfe, 0x8e, 0x10, 0xfe, 0x6c, 0x19, 0x57, 0x3d, 0xfe, 0xed,
-       0x19, 0x7d, 0x3e, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0xf4, 0x1e, 0xfe,
-       0x00, 0xff, 0x35, 0xfe, 0x74, 0x10, 0xc2, 0xfe, 0xd2, 0xf0, 0xfe, 0xa6,
-       0x0b, 0xfe, 0x76, 0x18, 0x1e, 0x19, 0x8a, 0x03, 0xd2, 0x1e, 0x06, 0xfe,
-       0x08, 0x13, 0x10, 0xfe, 0x16, 0x00, 0x02, 0x65, 0xfe, 0xd1, 0xf0, 0xfe,
-       0xb8, 0x0b, 0x15, 0x7e, 0x01, 0x36, 0x10, 0xfe, 0x17, 0x00, 0xfe, 0x42,
-       0x10, 0xfe, 0xce, 0xf0, 0xfe, 0xbe, 0x0b, 0xfe, 0x3c, 0x10, 0xfe, 0xcd,
-       0xf0, 0xfe, 0xca, 0x0b, 0x10, 0xfe, 0x22, 0x00, 0x02, 0x65, 0xfe, 0xcb,
-       0xf0, 0xfe, 0xd6, 0x0b, 0x10, 0xfe, 0x24, 0x00, 0x02, 0x65, 0xfe, 0xd0,
-       0xf0, 0xfe, 0xe0, 0x0b, 0x10, 0x9e, 0xe5, 0xfe, 0xcf, 0xf0, 0xfe, 0xea,
-       0x0b, 0x10, 0x58, 0xfe, 0x10, 0x10, 0xfe, 0xcc, 0xf0, 0xe2, 0x68, 0x05,
-       0x1f, 0x4d, 0x10, 0xfe, 0x12, 0x00, 0x2c, 0x0f, 0xfe, 0x4e, 0x11, 0x27,
-       0xfe, 0x00, 0x0c, 0xfe, 0x9e, 0xf0, 0xfe, 0x14, 0x0c, 0xbc, 0x17, 0x34,
-       0x2c, 0x77, 0xe6, 0xc5, 0x24, 0xc6, 0x24, 0x2c, 0xfa, 0x27, 0xfe, 0x20,
-       0x0c, 0x1c, 0x34, 0x94, 0xfe, 0x3c, 0x0c, 0x95, 0x86, 0xc5, 0xdc, 0xc6,
-       0xdc, 0x02, 0x24, 0x01, 0x4b, 0xfe, 0xdb, 0x10, 0x12, 0xfe, 0xe8, 0x00,
-       0xb5, 0xb6, 0x74, 0xc7, 0x81, 0xc8, 0x83, 0xfe, 0x89, 0xf0, 0x24, 0x33,
-       0x31, 0xe1, 0xc7, 0x81, 0xc8, 0x83, 0x27, 0xfe, 0x66, 0x0c, 0x1d, 0x24,
-       0x33, 0x31, 0xdf, 0xbc, 0x4e, 0x10, 0xfe, 0x42, 0x00, 0x02, 0x65, 0x7c,
-       0x06, 0xfe, 0x81, 0x49, 0x17, 0xfe, 0x2c, 0x0d, 0x08, 0x05, 0x0a, 0xfe,
-       0x44, 0x13, 0x10, 0x00, 0x55, 0x0a, 0xfe, 0x54, 0x12, 0x55, 0xfe, 0x28,
-       0x00, 0x23, 0xfe, 0x9a, 0x0d, 0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x66,
-       0x44, 0xfe, 0x28, 0x00, 0xfe, 0xe2, 0x10, 0x01, 0xf5, 0x01, 0xf6, 0x09,
-       0xa4, 0x01, 0xfe, 0x26, 0x0f, 0x64, 0x12, 0x2f, 0x01, 0x73, 0x02, 0x2b,
-       0x10, 0xfe, 0x44, 0x00, 0x55, 0x0a, 0xe9, 0x44, 0x0a, 0xfe, 0xb4, 0x10,
-       0x01, 0xb0, 0x44, 0x0a, 0xfe, 0xaa, 0x10, 0x01, 0xb0, 0xfe, 0x19, 0x82,
-       0xfe, 0x34, 0x46, 0xac, 0x44, 0x0a, 0x10, 0xfe, 0x43, 0x00, 0xfe, 0x96,
-       0x10, 0x08, 0x54, 0x0a, 0x37, 0x01, 0xf5, 0x01, 0xf6, 0x64, 0x12, 0x2f,
-       0x01, 0x73, 0x99, 0x0a, 0x64, 0x42, 0x92, 0x02, 0xfe, 0x2e, 0x03, 0x08,
-       0x05, 0x0a, 0x8a, 0x44, 0x0a, 0x10, 0x00, 0xfe, 0x5c, 0x10, 0x68, 0x05,
-       0x1a, 0xfe, 0x58, 0x12, 0x08, 0x05, 0x1a, 0xfe, 0x50, 0x13, 0xfe, 0x1c,
-       0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x50, 0x0d, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d,
-       0xf0, 0xfe, 0x56, 0x0d, 0x08, 0x54, 0x1a, 0x37, 0xfe, 0xa9, 0x10, 0x10,
-       0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0a, 0x50, 0xfe, 0x2e, 0x10, 0x10,
-       0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x10, 0x6f, 0xab, 0x10, 0xfe, 0x41,
-       0x00, 0xaa, 0x10, 0xfe, 0x24, 0x00, 0x8c, 0xb5, 0xb6, 0x74, 0x03, 0x70,
-       0x28, 0x23, 0xd8, 0x50, 0xfe, 0x04, 0xe6, 0x1a, 0xfe, 0x9d, 0x41, 0xfe,
-       0x1c, 0x42, 0x64, 0x01, 0xe3, 0x02, 0x2b, 0xf8, 0x15, 0x0a, 0x39, 0xa0,
-       0xb4, 0x15, 0xfe, 0x31, 0x00, 0x39, 0xa2, 0x01, 0xfe, 0x48, 0x10, 0x02,
-       0xd7, 0x42, 0xfe, 0x06, 0xec, 0xd0, 0xfc, 0x44, 0x1b, 0xfe, 0xce, 0x45,
-       0x35, 0x42, 0xfe, 0x06, 0xea, 0xd0, 0xfe, 0x47, 0x4b, 0x91, 0xfe, 0x75,
-       0x57, 0x03, 0x5d, 0xfe, 0x98, 0x56, 0xfe, 0x38, 0x12, 0x09, 0x48, 0x01,
-       0x0e, 0xfe, 0x44, 0x48, 0x4f, 0x08, 0x05, 0x1b, 0xfe, 0x1a, 0x13, 0x09,
-       0x46, 0x01, 0x0e, 0x41, 0xfe, 0x41, 0x58, 0x09, 0xa4, 0x01, 0x0e, 0xfe,
-       0x49, 0x54, 0x96, 0xfe, 0x1e, 0x0e, 0x02, 0xfe, 0x2e, 0x03, 0x09, 0x5d,
-       0xfe, 0xee, 0x14, 0xfc, 0x44, 0x1b, 0xfe, 0xce, 0x45, 0x35, 0x42, 0xfe,
-       0xce, 0x47, 0xfe, 0xad, 0x13, 0x02, 0x2b, 0x22, 0x20, 0x07, 0x11, 0xfe,
-       0x9e, 0x12, 0x21, 0x13, 0x59, 0x13, 0x9f, 0x13, 0xd5, 0x22, 0x2f, 0x41,
-       0x39, 0x2f, 0xbc, 0xad, 0xfe, 0xbc, 0xf0, 0xfe, 0xe0, 0x0e, 0x0f, 0x06,
-       0x13, 0x59, 0x01, 0xfe, 0xda, 0x16, 0x03, 0xfe, 0x38, 0x01, 0x29, 0xfe,
-       0x3a, 0x01, 0x56, 0xfe, 0xe4, 0x0e, 0xfe, 0x02, 0xec, 0xd5, 0x69, 0x00,
-       0x66, 0xfe, 0x04, 0xec, 0x20, 0x4f, 0xfe, 0x05, 0xf6, 0xfe, 0x34, 0x01,
-       0x01, 0xfe, 0x4a, 0x17, 0xfe, 0x08, 0x90, 0xfe, 0x48, 0xf4, 0x0d, 0xfe,
-       0x18, 0x13, 0xba, 0xfe, 0x02, 0xea, 0xd5, 0x69, 0x7e, 0xfe, 0xc5, 0x13,
-       0x15, 0x1a, 0x39, 0xa0, 0xb4, 0xfe, 0x2e, 0x10, 0x03, 0xfe, 0x38, 0x01,
-       0x1e, 0xfe, 0xf0, 0xff, 0x0c, 0xfe, 0x60, 0x01, 0x03, 0xfe, 0x3a, 0x01,
-       0x0c, 0xfe, 0x62, 0x01, 0x43, 0x13, 0x20, 0x25, 0x06, 0x13, 0x2f, 0x12,
-       0x2f, 0x92, 0x0f, 0x06, 0x04, 0x21, 0x04, 0x22, 0x59, 0xfe, 0xf7, 0x12,
-       0x22, 0x9f, 0xb7, 0x13, 0x9f, 0x07, 0x7e, 0xfe, 0x71, 0x13, 0xfe, 0x24,
-       0x1c, 0x15, 0x19, 0x39, 0xa0, 0xb4, 0xfe, 0xd9, 0x10, 0xc3, 0xfe, 0x03,
-       0xdc, 0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x04, 0xc3, 0xfe, 0x03, 0xdc,
-       0xfe, 0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x04, 0xfe, 0x03, 0x57, 0xc3, 0x21,
-       0xfe, 0x00, 0xcc, 0x04, 0xfe, 0x03, 0x57, 0xc3, 0x78, 0x04, 0x08, 0x05,
-       0x58, 0xfe, 0x22, 0x13, 0xfe, 0x1c, 0x80, 0x07, 0x06, 0xfe, 0x1a, 0x13,
-       0xfe, 0x1e, 0x80, 0xed, 0xfe, 0x1d, 0x80, 0xae, 0xfe, 0x0c, 0x90, 0xfe,
-       0x0e, 0x13, 0xfe, 0x0e, 0x90, 0xac, 0xfe, 0x3c, 0x90, 0xfe, 0x30, 0xf4,
-       0x0a, 0xfe, 0x3c, 0x50, 0xaa, 0x01, 0xfe, 0x7a, 0x17, 0x32, 0x07, 0x2f,
-       0xad, 0x01, 0xfe, 0xb4, 0x16, 0x08, 0x05, 0x1b, 0x4e, 0x01, 0xf5, 0x01,
-       0xf6, 0x12, 0xfe, 0xe9, 0x00, 0x08, 0x05, 0x58, 0xfe, 0x2c, 0x13, 0x01,
-       0xfe, 0x0c, 0x17, 0xfe, 0x1e, 0x1c, 0xfe, 0x14, 0x90, 0xfe, 0x96, 0x90,
-       0x0c, 0xfe, 0x64, 0x01, 0x14, 0xfe, 0x66, 0x01, 0x08, 0x05, 0x5b, 0xfe,
-       0x12, 0x12, 0xfe, 0x03, 0x80, 0x8d, 0xfe, 0x01, 0xec, 0x20, 0xfe, 0x80,
-       0x40, 0x13, 0x20, 0x6a, 0x2a, 0x12, 0xcf, 0x64, 0x22, 0x20, 0xfb, 0x79,
-       0x20, 0x04, 0xfe, 0x08, 0x1c, 0x03, 0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58,
-       0x03, 0xfe, 0xae, 0x00, 0xfe, 0x07, 0x58, 0x03, 0xfe, 0xb0, 0x00, 0xfe,
-       0x08, 0x58, 0x03, 0xfe, 0xb2, 0x00, 0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c,
-       0x25, 0x6e, 0x13, 0xd0, 0x21, 0x0c, 0x5c, 0x0c, 0x45, 0x0f, 0x46, 0x52,
-       0x50, 0x18, 0x1b, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x23, 0xfe, 0xfc,
-       0x0f, 0x44, 0x11, 0x0f, 0x48, 0x52, 0x18, 0x58, 0xfe, 0x90, 0x4d, 0xfe,
-       0x91, 0x54, 0x23, 0xe4, 0x25, 0x11, 0x13, 0x20, 0x7c, 0x6f, 0x4f, 0x22,
-       0x20, 0xfb, 0x79, 0x20, 0x12, 0xcf, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0,
-       0xfe, 0x26, 0x10, 0xf8, 0x74, 0xfe, 0x14, 0x1c, 0xfe, 0x10, 0x1c, 0xfe,
-       0x18, 0x1c, 0x04, 0x42, 0xfe, 0x0c, 0x14, 0xfc, 0xfe, 0x07, 0xe6, 0x1b,
-       0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x04, 0x01, 0xb0, 0x7c, 0x6f, 0x4f,
-       0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x42, 0x13, 0x32, 0x07, 0x2f,
-       0xfe, 0x34, 0x13, 0x09, 0x48, 0x01, 0x0e, 0xbb, 0xfe, 0x36, 0x12, 0xfe,
-       0x41, 0x48, 0xfe, 0x45, 0x48, 0x01, 0xf0, 0xfe, 0x00, 0xcc, 0xbb, 0xfe,
-       0xf3, 0x13, 0x43, 0x78, 0x07, 0x11, 0xac, 0x09, 0x84, 0x01, 0x0e, 0xfe,
-       0x80, 0x5c, 0x01, 0x73, 0xfe, 0x0e, 0x10, 0x07, 0x82, 0x4e, 0xfe, 0x14,
-       0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x60, 0x10, 0x04, 0xfe, 0x44, 0x58, 0x8d,
-       0xfe, 0x01, 0xec, 0xa2, 0xfe, 0x9e, 0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe,
-       0x9c, 0xe7, 0x1a, 0x79, 0x2a, 0x01, 0xe3, 0xfe, 0xdd, 0x10, 0x2c, 0xc7,
-       0x81, 0xc8, 0x83, 0x33, 0x31, 0xde, 0x07, 0x1a, 0xfe, 0x48, 0x12, 0x07,
-       0x0a, 0xfe, 0x56, 0x12, 0x07, 0x19, 0xfe, 0x30, 0x12, 0x07, 0xc9, 0x17,
-       0xfe, 0x32, 0x12, 0x07, 0xfe, 0x23, 0x00, 0x17, 0xeb, 0x07, 0x06, 0x17,
-       0xfe, 0x9c, 0x12, 0x07, 0x1f, 0xfe, 0x12, 0x12, 0x07, 0x00, 0x17, 0x24,
-       0x15, 0xc9, 0x01, 0x36, 0xa9, 0x2d, 0x01, 0x0b, 0x94, 0x4b, 0x04, 0x2d,
-       0xdd, 0x09, 0xd1, 0x01, 0xfe, 0x26, 0x0f, 0x12, 0x82, 0x02, 0x2b, 0x2d,
-       0x32, 0x07, 0xa6, 0xfe, 0xd9, 0x13, 0x3a, 0x3d, 0x3b, 0x3e, 0x56, 0xfe,
-       0xf0, 0x11, 0x08, 0x05, 0x5a, 0xfe, 0x72, 0x12, 0x9b, 0x2e, 0x9c, 0x3c,
-       0x90, 0xc0, 0x96, 0xfe, 0xba, 0x11, 0x22, 0x62, 0xfe, 0x26, 0x13, 0x03,
-       0x7f, 0x29, 0x80, 0x56, 0xfe, 0x76, 0x0d, 0x0c, 0x60, 0x14, 0x61, 0x21,
-       0x0c, 0x7f, 0x0c, 0x80, 0x01, 0xb3, 0x25, 0x6e, 0x77, 0x13, 0x62, 0x01,
-       0xef, 0x9b, 0x2e, 0x9c, 0x3c, 0xfe, 0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe,
-       0x04, 0xfa, 0x2e, 0xfe, 0x05, 0xfa, 0x3c, 0xfe, 0x91, 0x10, 0x03, 0x3f,
-       0x29, 0x40, 0xfe, 0x40, 0x56, 0xfe, 0xe1, 0x56, 0x0c, 0x3f, 0x14, 0x40,
-       0x88, 0x9b, 0x2e, 0x9c, 0x3c, 0x90, 0xc0, 0x03, 0x5e, 0x29, 0x5f, 0xfe,
-       0x00, 0x56, 0xfe, 0xa1, 0x56, 0x0c, 0x5e, 0x14, 0x5f, 0x08, 0x05, 0x5a,
-       0xfe, 0x1e, 0x12, 0x22, 0x62, 0xfe, 0x1f, 0x40, 0x03, 0x60, 0x29, 0x61,
-       0xfe, 0x2c, 0x50, 0xfe, 0xae, 0x50, 0x03, 0x3f, 0x29, 0x40, 0xfe, 0x44,
-       0x50, 0xfe, 0xc6, 0x50, 0x03, 0x5e, 0x29, 0x5f, 0xfe, 0x08, 0x50, 0xfe,
-       0x8a, 0x50, 0x03, 0x3d, 0x29, 0x3e, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50,
-       0x02, 0x89, 0x25, 0x06, 0x13, 0xd4, 0x02, 0x72, 0x2d, 0x01, 0x0b, 0x1d,
-       0x4c, 0x33, 0x31, 0xde, 0x07, 0x06, 0x23, 0x4c, 0x32, 0x07, 0xa6, 0x23,
-       0x72, 0x01, 0xaf, 0x1e, 0x43, 0x17, 0x4c, 0x08, 0x05, 0x0a, 0xee, 0x3a,
-       0x3d, 0x3b, 0x3e, 0xfe, 0x0a, 0x55, 0x35, 0xfe, 0x8b, 0x55, 0x57, 0x3d,
-       0x7d, 0x3e, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0x02, 0x72, 0xfe, 0x19,
-       0x81, 0xba, 0xfe, 0x19, 0x41, 0x02, 0x72, 0x2d, 0x01, 0x0b, 0x1c, 0x34,
-       0x1d, 0xe8, 0x33, 0x31, 0xe1, 0x55, 0x19, 0xfe, 0xa6, 0x12, 0x55, 0x0a,
-       0x4d, 0x02, 0x4c, 0x01, 0x0b, 0x1c, 0x34, 0x1d, 0xe8, 0x33, 0x31, 0xdf,
-       0x07, 0x19, 0x23, 0x4c, 0x01, 0x0b, 0x1d, 0xe8, 0x33, 0x31, 0xfe, 0xe8,
-       0x09, 0xfe, 0xc2, 0x49, 0x51, 0x03, 0xfe, 0x9c, 0x00, 0x28, 0x8a, 0x53,
-       0x05, 0x1f, 0x35, 0xa9, 0xfe, 0xbb, 0x45, 0x55, 0x00, 0x4e, 0x44, 0x06,
-       0x7c, 0x43, 0xfe, 0xda, 0x14, 0x01, 0xaf, 0x8c, 0xfe, 0x4b, 0x45, 0xee,
-       0x32, 0x07, 0xa5, 0xed, 0x03, 0xcd, 0x28, 0x8a, 0x03, 0x45, 0x28, 0x35,
-       0x67, 0x02, 0x72, 0xfe, 0xc0, 0x5d, 0xfe, 0xf8, 0x14, 0xfe, 0x03, 0x17,
-       0x03, 0x5c, 0xc1, 0x0c, 0x5c, 0x67, 0x2d, 0x01, 0x0b, 0x26, 0x89, 0x01,
-       0xfe, 0x9e, 0x15, 0x02, 0x89, 0x01, 0x0b, 0x1c, 0x34, 0x1d, 0x4c, 0x33,
-       0x31, 0xdf, 0x07, 0x06, 0x23, 0x4c, 0x01, 0xf1, 0xfe, 0x42, 0x58, 0xf1,
-       0xfe, 0xa4, 0x14, 0x8c, 0xfe, 0x4a, 0xf4, 0x0a, 0x17, 0x4c, 0xfe, 0x4a,
-       0xf4, 0x06, 0xea, 0x32, 0x07, 0xa5, 0x8b, 0x02, 0x72, 0x03, 0x45, 0xc1,
-       0x0c, 0x45, 0x67, 0x2d, 0x01, 0x0b, 0x26, 0x89, 0x01, 0xfe, 0xcc, 0x15,
-       0x02, 0x89, 0x0f, 0x06, 0x27, 0xfe, 0xbe, 0x13, 0x26, 0xfe, 0xd4, 0x13,
-       0x76, 0xfe, 0x89, 0x48, 0x01, 0x0b, 0x21, 0x76, 0x04, 0x7b, 0xfe, 0xd0,
-       0x13, 0x1c, 0xfe, 0xd0, 0x13, 0x1d, 0xfe, 0xbe, 0x13, 0x67, 0x2d, 0x01,
-       0x0b, 0xfe, 0xd5, 0x10, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93,
-       0x1e, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x04, 0x0f,
-       0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0x1e, 0x43, 0xfe, 0x30, 0x56,
-       0xfe, 0x00, 0x5c, 0x04, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93,
-       0x04, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0xfe, 0x0b, 0x58,
-       0x04, 0x09, 0x5c, 0x01, 0x87, 0x09, 0x45, 0x01, 0x87, 0x04, 0xfe, 0x03,
-       0xa1, 0x1e, 0x11, 0xff, 0x03, 0x00, 0x54, 0xfe, 0x00, 0xf4, 0x1f, 0x52,
-       0xfe, 0x00, 0x7d, 0xfe, 0x01, 0x7d, 0xfe, 0x02, 0x7d, 0xfe, 0x03, 0x7c,
-       0x6a, 0x2a, 0x0c, 0x5e, 0x14, 0x5f, 0x57, 0x3f, 0x7d, 0x40, 0x04, 0xdd,
-       0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x8d, 0x04, 0x01,
-       0xfe, 0x0c, 0x19, 0xfe, 0x42, 0x48, 0x50, 0x51, 0x91, 0x01, 0x0b, 0x1d,
-       0xfe, 0x96, 0x15, 0x33, 0x31, 0xe1, 0x01, 0x0b, 0x1d, 0xfe, 0x96, 0x15,
-       0x33, 0x31, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x03, 0xcd, 0x28, 0xfe,
-       0xcc, 0x12, 0x53, 0x05, 0x1a, 0xfe, 0xc4, 0x13, 0x21, 0x69, 0x1a, 0xee,
-       0x55, 0xca, 0x6b, 0xfe, 0xdc, 0x14, 0x4d, 0x0f, 0x06, 0x18, 0xca, 0x7c,
-       0x30, 0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xab, 0xff, 0x02, 0x83,
-       0x55, 0x69, 0x19, 0xae, 0x98, 0xfe, 0x30, 0x00, 0x96, 0xf2, 0x18, 0x6d,
-       0x0f, 0x06, 0xfe, 0x56, 0x10, 0x69, 0x0a, 0xed, 0x98, 0xfe, 0x64, 0x00,
-       0x96, 0xf2, 0x09, 0xfe, 0x64, 0x00, 0x18, 0x9e, 0x0f, 0x06, 0xfe, 0x28,
-       0x10, 0x69, 0x06, 0xfe, 0x60, 0x13, 0x98, 0xfe, 0xc8, 0x00, 0x96, 0xf2,
-       0x09, 0xfe, 0xc8, 0x00, 0x18, 0x59, 0x0f, 0x06, 0x88, 0x98, 0xfe, 0x90,
-       0x01, 0x7a, 0xfe, 0x42, 0x15, 0x91, 0xe4, 0xfe, 0x43, 0xf4, 0x9f, 0xfe,
-       0x56, 0xf0, 0xfe, 0x54, 0x15, 0xfe, 0x04, 0xf4, 0x71, 0xfe, 0x43, 0xf4,
-       0x9e, 0xfe, 0xf3, 0x10, 0xfe, 0x40, 0x5c, 0x01, 0xfe, 0x16, 0x14, 0x1e,
-       0x43, 0xec, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4, 0x6e, 0x7a, 0xfe, 0x90,
-       0x15, 0xc4, 0x6e, 0xfe, 0x1c, 0x10, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4,
-       0xcc, 0x7a, 0xfe, 0x90, 0x15, 0xc4, 0xcc, 0x88, 0x51, 0x21, 0xfe, 0x4d,
-       0xf4, 0x00, 0xe9, 0x91, 0x0f, 0x06, 0xfe, 0xb4, 0x56, 0xfe, 0xc3, 0x58,
-       0x04, 0x51, 0x0f, 0x0a, 0x04, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xf3, 0x16,
-       0x0a, 0x01, 0x0b, 0x26, 0xf3, 0x16, 0x19, 0x01, 0x0b, 0x26, 0xf3, 0x76,
-       0xfe, 0x89, 0x49, 0x01, 0x0b, 0x04, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xb1,
-       0x16, 0x19, 0x01, 0x0b, 0x26, 0xb1, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xb1,
-       0xfe, 0x89, 0x49, 0x01, 0x0b, 0x26, 0xb1, 0x76, 0xfe, 0x89, 0x4a, 0x01,
-       0x0b, 0x04, 0x51, 0x04, 0x22, 0xd3, 0x07, 0x06, 0xfe, 0x48, 0x13, 0xb8,
-       0x13, 0xd3, 0xfe, 0x49, 0xf4, 0x00, 0x4d, 0x76, 0xa9, 0x67, 0xfe, 0x01,
-       0xec, 0xfe, 0x27, 0x01, 0xfe, 0x89, 0x48, 0xff, 0x02, 0x00, 0x10, 0x27,
-       0xfe, 0x2e, 0x16, 0x32, 0x07, 0xfe, 0xe3, 0x00, 0xfe, 0x20, 0x13, 0x1d,
-       0xfe, 0x52, 0x16, 0x21, 0x13, 0xd4, 0x01, 0x4b, 0x22, 0xd4, 0x07, 0x06,
-       0x4e, 0x08, 0x54, 0x06, 0x37, 0x04, 0x09, 0x48, 0x01, 0x0e, 0xfb, 0x8e,
-       0x07, 0x11, 0xae, 0x09, 0x84, 0x01, 0x0e, 0x8e, 0x09, 0x5d, 0x01, 0xa8,
-       0x04, 0x09, 0x84, 0x01, 0x0e, 0x8e, 0xfe, 0x80, 0xe7, 0x11, 0x07, 0x11,
-       0x8a, 0xfe, 0x45, 0x58, 0x01, 0xf0, 0x8e, 0x04, 0x09, 0x48, 0x01, 0x0e,
-       0x8e, 0x09, 0x5d, 0x01, 0xa8, 0x04, 0x09, 0x48, 0x01, 0x0e, 0xfe, 0x80,
-       0x80, 0xfe, 0x80, 0x4c, 0xfe, 0x49, 0xe4, 0x11, 0xae, 0x09, 0x84, 0x01,
-       0x0e, 0xfe, 0x80, 0x4c, 0x09, 0x5d, 0x01, 0x87, 0x04, 0x18, 0x11, 0x75,
-       0x6c, 0xfe, 0x60, 0x01, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x24,
-       0x1c, 0xfe, 0x1d, 0xf7, 0x1b, 0x97, 0xfe, 0xee, 0x16, 0x01, 0xfe, 0xf4,
-       0x17, 0xad, 0x9a, 0x1b, 0x6c, 0xfe, 0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x04,
-       0xb9, 0x23, 0xfe, 0xde, 0x16, 0xfe, 0xda, 0x10, 0x18, 0x11, 0x75, 0x03,
-       0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x1f, 0xfe, 0x18, 0x58, 0x03, 0xfe,
-       0x66, 0x01, 0xfe, 0x19, 0x58, 0x9a, 0x1f, 0xfe, 0x3c, 0x90, 0xfe, 0x30,
-       0xf4, 0x06, 0xfe, 0x3c, 0x50, 0x6c, 0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79,
-       0xfe, 0x1c, 0xf7, 0x1f, 0x97, 0xfe, 0x38, 0x17, 0xfe, 0xb6, 0x14, 0x35,
-       0x04, 0xb9, 0x23, 0xfe, 0x10, 0x17, 0xfe, 0x9c, 0x10, 0x18, 0x11, 0x75,
-       0xfe, 0x83, 0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x1d, 0xf7,
-       0x2e, 0x97, 0xfe, 0x5a, 0x17, 0xfe, 0x94, 0x14, 0xec, 0x9a, 0x2e, 0x6c,
-       0x1a, 0xfe, 0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00, 0x04, 0xb9, 0x23, 0xfe,
-       0x4e, 0x17, 0xfe, 0x6c, 0x10, 0x18, 0x11, 0x75, 0xfe, 0x30, 0xbc, 0xfe,
-       0xb2, 0xbc, 0x9a, 0xcb, 0x6c, 0x1a, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7,
-       0xcb, 0x97, 0xfe, 0x92, 0x17, 0xfe, 0x5c, 0x14, 0x35, 0x04, 0xb9, 0x23,
-       0xfe, 0x7e, 0x17, 0xfe, 0x42, 0x10, 0xfe, 0x02, 0xf6, 0x11, 0x75, 0xfe,
-       0x18, 0xfe, 0x60, 0xfe, 0x19, 0xfe, 0x61, 0xfe, 0x03, 0xa1, 0xfe, 0x1d,
-       0xf7, 0x5b, 0x97, 0xfe, 0xb8, 0x17, 0xfe, 0x36, 0x14, 0xfe, 0x1c, 0x13,
-       0x9a, 0x5b, 0x41, 0xfe, 0x83, 0x58, 0xfe, 0xaf, 0x19, 0xfe, 0x80, 0xe7,
-       0x11, 0xfe, 0x81, 0xe7, 0x11, 0x12, 0xfe, 0xdd, 0x00, 0x6a, 0x2a, 0x04,
-       0x6a, 0x2a, 0xfe, 0x12, 0x45, 0x23, 0xfe, 0xa8, 0x17, 0x15, 0x06, 0x39,
-       0xa0, 0xb4, 0x02, 0x2b, 0xfe, 0x39, 0xf0, 0xfe, 0xfc, 0x17, 0x21, 0x04,
-       0xfe, 0x7e, 0x18, 0x1e, 0x19, 0x66, 0x0f, 0x0d, 0x04, 0x75, 0x03, 0xd2,
-       0x1e, 0x06, 0xfe, 0xef, 0x12, 0xfe, 0xe1, 0x10, 0x7c, 0x6f, 0x4f, 0x32,
-       0x07, 0x2f, 0xfe, 0x3c, 0x13, 0xf1, 0xfe, 0x42, 0x13, 0x42, 0x92, 0x09,
-       0x48, 0x01, 0x0e, 0xbb, 0xeb, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48, 0x01,
-       0xf0, 0xfe, 0x00, 0xcc, 0xbb, 0xfe, 0xf3, 0x13, 0x43, 0x78, 0x07, 0x11,
-       0xac, 0x09, 0x84, 0x01, 0x0e, 0xfe, 0x80, 0x4c, 0x01, 0x73, 0xfe, 0x16,
-       0x10, 0x07, 0x82, 0x8b, 0xfe, 0x40, 0x14, 0xfe, 0x24, 0x12, 0xfe, 0x14,
-       0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x1c, 0x18, 0x18, 0x0a, 0x04, 0xfe, 0x9c,
-       0xe7, 0x0a, 0x10, 0xfe, 0x15, 0x00, 0x64, 0x79, 0x2a, 0x01, 0xe3, 0x18,
-       0x06, 0x04, 0x42, 0x92, 0x08, 0x54, 0x1b, 0x37, 0x12, 0x2f, 0x01, 0x73,
-       0x18, 0x06, 0x04, 0xfe, 0x38, 0x90, 0xfe, 0xba, 0x90, 0x3a, 0xce, 0x3b,
-       0xcf, 0xfe, 0x48, 0x55, 0x35, 0xfe, 0xc9, 0x55, 0x04, 0x22, 0xa3, 0x77,
-       0x13, 0xa3, 0x04, 0x09, 0xa4, 0x01, 0x0e, 0xfe, 0x41, 0x48, 0x09, 0x46,
-       0x01, 0x0e, 0xfe, 0x49, 0x44, 0x17, 0xfe, 0xe8, 0x18, 0x77, 0x78, 0x04,
-       0x09, 0x48, 0x01, 0x0e, 0x07, 0x11, 0x4e, 0x09, 0x5d, 0x01, 0xa8, 0x09,
-       0x46, 0x01, 0x0e, 0x77, 0x78, 0x04, 0xfe, 0x4e, 0xe4, 0x19, 0x6b, 0xfe,
-       0x1c, 0x19, 0x03, 0xfe, 0x90, 0x00, 0xfe, 0x3a, 0x45, 0xfe, 0x2c, 0x10,
-       0xfe, 0x4e, 0xe4, 0xc9, 0x6b, 0xfe, 0x2e, 0x19, 0x03, 0xfe, 0x92, 0x00,
-       0xfe, 0x02, 0xe6, 0x1a, 0xe5, 0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x6b,
-       0xfe, 0x40, 0x19, 0x03, 0xfe, 0x94, 0x00, 0xfe, 0x02, 0xe6, 0x1f, 0xfe,
-       0x08, 0x10, 0x03, 0xfe, 0x96, 0x00, 0xfe, 0x02, 0xe6, 0x6d, 0xfe, 0x4e,
-       0x45, 0xea, 0xba, 0xff, 0x04, 0x68, 0x54, 0xe7, 0x1e, 0x6e, 0xfe, 0x08,
-       0x1c, 0xfe, 0x67, 0x19, 0xfe, 0x0a, 0x1c, 0xfe, 0x1a, 0xf4, 0xfe, 0x00,
-       0x04, 0xea, 0xfe, 0x48, 0xf4, 0x19, 0x7a, 0xfe, 0x74, 0x19, 0x0f, 0x19,
-       0x04, 0x07, 0x7e, 0xfe, 0x5a, 0xf0, 0xfe, 0x84, 0x19, 0x25, 0xfe, 0x09,
-       0x00, 0xfe, 0x34, 0x10, 0x07, 0x1a, 0xfe, 0x5a, 0xf0, 0xfe, 0x92, 0x19,
-       0x25, 0xca, 0xfe, 0x26, 0x10, 0x07, 0x19, 0x66, 0x25, 0x6d, 0xe5, 0x07,
-       0x0a, 0x66, 0x25, 0x9e, 0xfe, 0x0e, 0x10, 0x07, 0x06, 0x66, 0x25, 0x59,
-       0xa9, 0xb8, 0x04, 0x15, 0xfe, 0x09, 0x00, 0x01, 0x36, 0xfe, 0x04, 0xfe,
-       0x81, 0x03, 0x83, 0xfe, 0x40, 0x5c, 0x04, 0x1c, 0xf7, 0xfe, 0x14, 0xf0,
-       0x0b, 0x27, 0xfe, 0xd6, 0x19, 0x1c, 0xf7, 0x7b, 0xf7, 0xfe, 0x82, 0xf0,
-       0xfe, 0xda, 0x19, 0x04, 0xff, 0xcc, 0x00, 0x00,
-};
-
-static unsigned short _adv_asc38C0800_size = sizeof(_adv_asc38C0800_buf);      /* 0x14E1 */
-static ADV_DCNT _adv_asc38C0800_chksum = 0x050D3FD8UL; /* Expanded little-endian checksum. */
-
-/* Microcode buffer is kept after initialization for error recovery. */
-static unsigned char _adv_asc38C1600_buf[] = {
-       0x00, 0x00, 0x00, 0xf2, 0x00, 0x16, 0x00, 0xfc, 0x00, 0x10, 0x00, 0xf0,
-       0x18, 0xe4, 0x01, 0x00, 0x04, 0x1e, 0x48, 0xe4, 0x03, 0xf6, 0xf7, 0x13,
-       0x2e, 0x1e, 0x02, 0x00, 0x07, 0x17, 0xc0, 0x5f, 0x00, 0xfa, 0xff, 0xff,
-       0x04, 0x00, 0x00, 0xf6, 0x09, 0xe7, 0x82, 0xe7, 0x85, 0xf0, 0x86, 0xf0,
-       0x4e, 0x10, 0x9e, 0xe7, 0xff, 0x00, 0x55, 0xf0, 0x01, 0xf6, 0x03, 0x00,
-       0x98, 0x57, 0x01, 0xe6, 0x00, 0xea, 0x00, 0xec, 0x01, 0xfa, 0x18, 0xf4,
-       0x08, 0x00, 0xf0, 0x1d, 0x38, 0x54, 0x32, 0xf0, 0x10, 0x00, 0xc2, 0x0e,
-       0x1e, 0xf0, 0xd5, 0xf0, 0xbc, 0x00, 0x4b, 0xe4, 0x00, 0xe6, 0xb1, 0xf0,
-       0xb4, 0x00, 0x02, 0x13, 0x3e, 0x1c, 0xc8, 0x47, 0x3e, 0x00, 0xd8, 0x01,
-       0x06, 0x13, 0x0c, 0x1c, 0x5e, 0x1e, 0x00, 0x57, 0xc8, 0x57, 0x01, 0xfc,
-       0xbc, 0x0e, 0xa2, 0x12, 0xb9, 0x54, 0x00, 0x80, 0x62, 0x0a, 0x5a, 0x12,
-       0xc8, 0x15, 0x3e, 0x1e, 0x18, 0x40, 0xbd, 0x56, 0x03, 0xe6, 0x01, 0xea,
-       0x5c, 0xf0, 0x0f, 0x00, 0x20, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x04, 0x12,
-       0x04, 0x13, 0xbb, 0x55, 0x3c, 0x56, 0x3e, 0x57, 0x03, 0x58, 0x4a, 0xe4,
-       0x40, 0x00, 0xb6, 0x00, 0xbb, 0x00, 0xc0, 0x00, 0x00, 0x01, 0x01, 0x01,
-       0x3e, 0x01, 0x58, 0x0a, 0x44, 0x10, 0x0a, 0x12, 0x4c, 0x1c, 0x4e, 0x1c,
-       0x02, 0x4a, 0x30, 0xe4, 0x05, 0xe6, 0x0c, 0x00, 0x3c, 0x00, 0x80, 0x00,
-       0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x70, 0x01, 0x72, 0x01,
-       0x74, 0x01, 0x76, 0x01, 0x78, 0x01, 0x7c, 0x01, 0xc6, 0x0e, 0x0c, 0x10,
-       0xac, 0x12, 0xae, 0x12, 0x16, 0x1a, 0x32, 0x1c, 0x6e, 0x1e, 0x02, 0x48,
-       0x3a, 0x55, 0xc9, 0x57, 0x02, 0xee, 0x5b, 0xf0, 0x03, 0xf7, 0x06, 0xf7,
-       0x03, 0xfc, 0x06, 0x00, 0x1e, 0x00, 0xbe, 0x00, 0xe1, 0x00, 0x0c, 0x12,
-       0x18, 0x1a, 0x70, 0x1a, 0x30, 0x1c, 0x38, 0x1c, 0x10, 0x44, 0x00, 0x4c,
-       0xb0, 0x57, 0x40, 0x5c, 0x4d, 0xe4, 0x04, 0xea, 0x5d, 0xf0, 0xa7, 0xf0,
-       0x04, 0xf6, 0x02, 0xfc, 0x05, 0x00, 0x09, 0x00, 0x19, 0x00, 0x32, 0x00,
-       0x33, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xcc, 0x00,
-       0x20, 0x01, 0x4e, 0x01, 0x79, 0x01, 0x3c, 0x09, 0x68, 0x0d, 0x02, 0x10,
-       0x04, 0x10, 0x3a, 0x10, 0x08, 0x12, 0x0a, 0x13, 0x40, 0x16, 0x50, 0x16,
-       0x00, 0x17, 0x4a, 0x19, 0x00, 0x4e, 0x00, 0x54, 0x01, 0x58, 0x00, 0xdc,
-       0x05, 0xf0, 0x09, 0xf0, 0x59, 0xf0, 0xb8, 0xf0, 0x48, 0xf4, 0x0e, 0xf7,
-       0x0a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0xa4, 0x00, 0xb5, 0x00, 0xba, 0x00,
-       0xd0, 0x00, 0xe7, 0x00, 0xf0, 0x03, 0x69, 0x08, 0xe9, 0x09, 0x5c, 0x0c,
-       0xb6, 0x12, 0xbc, 0x19, 0xd8, 0x1b, 0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c,
-       0x42, 0x1d, 0x08, 0x44, 0x38, 0x44, 0x91, 0x44, 0x0a, 0x45, 0x48, 0x46,
-       0x89, 0x48, 0x68, 0x54, 0x83, 0x55, 0x83, 0x59, 0x31, 0xe4, 0x02, 0xe6,
-       0x07, 0xf0, 0x08, 0xf0, 0x0b, 0xf0, 0x0c, 0xf0, 0x4b, 0xf4, 0x04, 0xf8,
-       0x05, 0xf8, 0x02, 0xfa, 0x03, 0xfa, 0x04, 0xfc, 0x05, 0xfc, 0x07, 0x00,
-       0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00, 0xe5, 0x00, 0x22, 0x01,
-       0x26, 0x01, 0x60, 0x01, 0x7a, 0x01, 0x82, 0x01, 0xc8, 0x01, 0xca, 0x01,
-       0x86, 0x02, 0x6a, 0x03, 0x18, 0x05, 0xb2, 0x07, 0x68, 0x08, 0x10, 0x0d,
-       0x06, 0x10, 0x0a, 0x10, 0x0e, 0x10, 0x12, 0x10, 0x60, 0x10, 0xed, 0x10,
-       0xf3, 0x10, 0x06, 0x12, 0x10, 0x12, 0x1e, 0x12, 0x0c, 0x13, 0x0e, 0x13,
-       0x10, 0x13, 0xfe, 0x9c, 0xf0, 0x35, 0x05, 0xfe, 0xec, 0x0e, 0xff, 0x10,
-       0x00, 0x00, 0xe9, 0xfe, 0x34, 0x1f, 0x00, 0xe8, 0xfe, 0x88, 0x01, 0xff,
-       0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
-       0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x4c, 0x00, 0x65, 0xff, 0x04, 0x00,
-       0x00, 0x1a, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
-       0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x13,
-       0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
-       0xfe, 0x04, 0xf7, 0xe8, 0x37, 0x7d, 0x0d, 0x01, 0xfe, 0x4a, 0x11, 0xfe,
-       0x04, 0xf7, 0xe8, 0x7d, 0x0d, 0x51, 0x37, 0xfe, 0x3d, 0xf0, 0xfe, 0x0c,
-       0x02, 0xfe, 0x20, 0xf0, 0xbc, 0xfe, 0x91, 0xf0, 0xfe, 0xf8, 0x01, 0xfe,
-       0x90, 0xf0, 0xfe, 0xf8, 0x01, 0xfe, 0x8f, 0xf0, 0xbc, 0x03, 0x67, 0x4d,
-       0x05, 0xfe, 0x08, 0x0f, 0x01, 0xfe, 0x78, 0x0f, 0xfe, 0xdd, 0x12, 0x05,
-       0xfe, 0x0e, 0x03, 0xfe, 0x28, 0x1c, 0x03, 0xfe, 0xa6, 0x00, 0xfe, 0xd1,
-       0x12, 0x3e, 0x22, 0xfe, 0xa6, 0x00, 0xac, 0xfe, 0x48, 0xf0, 0xfe, 0x90,
-       0x02, 0xfe, 0x49, 0xf0, 0xfe, 0xaa, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xc8,
-       0x02, 0xfe, 0x46, 0xf0, 0xfe, 0x5a, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x60,
-       0x02, 0xfe, 0x43, 0xf0, 0xfe, 0x4e, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x52,
-       0x02, 0xfe, 0x45, 0xf0, 0xfe, 0x56, 0x02, 0x1c, 0x0d, 0xa2, 0x1c, 0x07,
-       0x22, 0xb7, 0x05, 0x35, 0xfe, 0x00, 0x1c, 0xfe, 0xf1, 0x10, 0xfe, 0x02,
-       0x1c, 0xf5, 0xfe, 0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0x5f, 0xfe, 0xe7,
-       0x10, 0xfe, 0x06, 0xfc, 0xde, 0x0a, 0x81, 0x01, 0xa3, 0x05, 0x35, 0x1f,
-       0x95, 0x47, 0xb8, 0x01, 0xfe, 0xe4, 0x11, 0x0a, 0x81, 0x01, 0x5c, 0xfe,
-       0xbd, 0x10, 0x0a, 0x81, 0x01, 0x5c, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c,
-       0xfe, 0x58, 0x1c, 0x1c, 0x07, 0x22, 0xb7, 0x37, 0x2a, 0x35, 0xfe, 0x3d,
-       0xf0, 0xfe, 0x0c, 0x02, 0x2b, 0xfe, 0x9e, 0x02, 0xfe, 0x5a, 0x1c, 0xfe,
-       0x12, 0x1c, 0xfe, 0x14, 0x1c, 0x1f, 0xfe, 0x30, 0x00, 0x47, 0xb8, 0x01,
-       0xfe, 0xd4, 0x11, 0x1c, 0x07, 0x22, 0xb7, 0x05, 0xe9, 0x21, 0x2c, 0x09,
-       0x1a, 0x31, 0xfe, 0x69, 0x10, 0x1c, 0x07, 0x22, 0xb7, 0xfe, 0x04, 0xec,
-       0x2c, 0x60, 0x01, 0xfe, 0x1e, 0x1e, 0x20, 0x2c, 0xfe, 0x05, 0xf6, 0xde,
-       0x01, 0xfe, 0x62, 0x1b, 0x01, 0x0c, 0x61, 0x4a, 0x44, 0x15, 0x56, 0x51,
-       0x01, 0xfe, 0x9e, 0x1e, 0x01, 0xfe, 0x96, 0x1a, 0x05, 0x35, 0x0a, 0x57,
-       0x01, 0x18, 0x09, 0x00, 0x36, 0x01, 0x85, 0xfe, 0x18, 0x10, 0xfe, 0x41,
-       0x58, 0x0a, 0xba, 0x01, 0x18, 0xfe, 0xc8, 0x54, 0x7b, 0xfe, 0x1c, 0x03,
-       0x01, 0xfe, 0x96, 0x1a, 0x05, 0x35, 0x37, 0x60, 0xfe, 0x02, 0xe8, 0x30,
-       0xfe, 0xbf, 0x57, 0xfe, 0x9e, 0x43, 0xfe, 0x77, 0x57, 0xfe, 0x27, 0xf0,
-       0xfe, 0xe4, 0x01, 0xfe, 0x07, 0x4b, 0xfe, 0x20, 0xf0, 0xbc, 0xfe, 0x40,
-       0x1c, 0x2a, 0xeb, 0xfe, 0x26, 0xf0, 0xfe, 0x66, 0x03, 0xfe, 0xa0, 0xf0,
-       0xfe, 0x54, 0x03, 0xfe, 0x11, 0xf0, 0xbc, 0xfe, 0xef, 0x10, 0xfe, 0x9f,
-       0xf0, 0xfe, 0x74, 0x03, 0xfe, 0x46, 0x1c, 0x19, 0xfe, 0x11, 0x00, 0x05,
-       0x70, 0x37, 0xfe, 0x48, 0x1c, 0xfe, 0x46, 0x1c, 0x01, 0x0c, 0x06, 0x28,
-       0xfe, 0x18, 0x13, 0x26, 0x21, 0xb9, 0xc7, 0x20, 0xb9, 0x0a, 0x57, 0x01,
-       0x18, 0xc7, 0x89, 0x01, 0xfe, 0xc8, 0x1a, 0x15, 0xe1, 0x2a, 0xeb, 0xfe,
-       0x01, 0xf0, 0xeb, 0xfe, 0x82, 0xf0, 0xfe, 0xa4, 0x03, 0xfe, 0x9c, 0x32,
-       0x15, 0xfe, 0xe4, 0x00, 0x2f, 0xfe, 0xb6, 0x03, 0x2a, 0x3c, 0x16, 0xfe,
-       0xc6, 0x03, 0x01, 0x41, 0xfe, 0x06, 0xf0, 0xfe, 0xd6, 0x03, 0xaf, 0xa0,
-       0xfe, 0x0a, 0xf0, 0xfe, 0xa2, 0x07, 0x05, 0x29, 0x03, 0x81, 0x1e, 0x1b,
-       0xfe, 0x24, 0x05, 0x1f, 0x63, 0x01, 0x42, 0x8f, 0xfe, 0x70, 0x02, 0x05,
-       0xea, 0xfe, 0x46, 0x1c, 0x37, 0x7d, 0x1d, 0xfe, 0x67, 0x1b, 0xfe, 0xbf,
-       0x57, 0xfe, 0x77, 0x57, 0xfe, 0x48, 0x1c, 0x75, 0x01, 0xa6, 0x86, 0x0a,
-       0x57, 0x01, 0x18, 0x09, 0x00, 0x1b, 0xec, 0x0a, 0xe1, 0x01, 0x18, 0x77,
-       0x50, 0x40, 0x8d, 0x30, 0x03, 0x81, 0x1e, 0xf8, 0x1f, 0x63, 0x01, 0x42,
-       0x8f, 0xfe, 0x70, 0x02, 0x05, 0xea, 0xd7, 0x99, 0xd8, 0x9c, 0x2a, 0x29,
-       0x2f, 0xfe, 0x4e, 0x04, 0x16, 0xfe, 0x4a, 0x04, 0x7e, 0xfe, 0xa0, 0x00,
-       0xfe, 0x9b, 0x57, 0xfe, 0x54, 0x12, 0x32, 0xff, 0x02, 0x00, 0x10, 0x01,
-       0x08, 0x16, 0xfe, 0x02, 0x05, 0x32, 0x01, 0x08, 0x16, 0x29, 0x27, 0x25,
-       0xee, 0xfe, 0x4c, 0x44, 0xfe, 0x58, 0x12, 0x50, 0xfe, 0x44, 0x48, 0x13,
-       0x34, 0xfe, 0x4c, 0x54, 0x7b, 0xec, 0x60, 0x8d, 0x30, 0x01, 0xfe, 0x4e,
-       0x1e, 0xfe, 0x48, 0x47, 0xfe, 0x7c, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xfe,
-       0x32, 0x13, 0x01, 0x43, 0x09, 0x9b, 0xfe, 0x68, 0x13, 0xfe, 0x26, 0x10,
-       0x13, 0x34, 0xfe, 0x4c, 0x54, 0x7b, 0xec, 0x01, 0xfe, 0x4e, 0x1e, 0xfe,
-       0x48, 0x47, 0xfe, 0x54, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xa5, 0x01, 0x43,
-       0x09, 0x9b, 0xfe, 0x40, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xf9, 0x1f, 0x7f,
-       0x01, 0x0c, 0x06, 0x07, 0x4d, 0x1f, 0xfe, 0x0d, 0x00, 0x01, 0x42, 0x8f,
-       0xfe, 0xa4, 0x0e, 0x05, 0x29, 0x32, 0x15, 0xfe, 0xe6, 0x00, 0x0f, 0xfe,
-       0x1c, 0x90, 0x04, 0xfe, 0x9c, 0x93, 0x3a, 0x0b, 0x0e, 0x8b, 0x02, 0x1f,
-       0x7f, 0x01, 0x42, 0x05, 0x35, 0xfe, 0x42, 0x5b, 0x7d, 0x1d, 0xfe, 0x46,
-       0x59, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57, 0x0f, 0xfe, 0x87, 0x80, 0x04,
-       0xfe, 0x87, 0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0xd0, 0x65, 0x01, 0x0c,
-       0x06, 0x0d, 0xfe, 0x98, 0x13, 0x0f, 0xfe, 0x20, 0x80, 0x04, 0xfe, 0xa0,
-       0x83, 0x33, 0x0b, 0x0e, 0x09, 0x1d, 0xfe, 0x84, 0x12, 0x01, 0x38, 0x06,
-       0x07, 0xfe, 0x70, 0x13, 0x03, 0xfe, 0xa2, 0x00, 0x1e, 0x1b, 0xfe, 0xda,
-       0x05, 0xd0, 0x54, 0x01, 0x38, 0x06, 0x0d, 0xfe, 0x58, 0x13, 0x03, 0xfe,
-       0xa0, 0x00, 0x1e, 0xfe, 0x50, 0x12, 0x5e, 0xff, 0x02, 0x00, 0x10, 0x2f,
-       0xfe, 0x90, 0x05, 0x2a, 0x3c, 0xcc, 0xff, 0x02, 0x00, 0x10, 0x2f, 0xfe,
-       0x9e, 0x05, 0x17, 0xfe, 0xf4, 0x05, 0x15, 0xfe, 0xe3, 0x00, 0x26, 0x01,
-       0x38, 0xfe, 0x4a, 0xf0, 0xfe, 0xc0, 0x05, 0xfe, 0x49, 0xf0, 0xfe, 0xba,
-       0x05, 0x71, 0x2e, 0xfe, 0x21, 0x00, 0xf1, 0x2e, 0xfe, 0x22, 0x00, 0xa2,
-       0x2e, 0x4a, 0xfe, 0x09, 0x48, 0xff, 0x02, 0x00, 0x10, 0x2f, 0xfe, 0xd0,
-       0x05, 0x17, 0xfe, 0xf4, 0x05, 0xfe, 0xe2, 0x08, 0x01, 0x38, 0x06, 0xfe,
-       0x1c, 0x00, 0x4d, 0x01, 0xa7, 0x2e, 0x07, 0x20, 0xe4, 0x47, 0xfe, 0x27,
-       0x01, 0x01, 0x0c, 0x06, 0x28, 0xfe, 0x24, 0x12, 0x3e, 0x01, 0x84, 0x1f,
-       0x7f, 0x01, 0x0c, 0x06, 0x07, 0x4d, 0x1f, 0xfe, 0x0d, 0x00, 0x01, 0x42,
-       0x8f, 0xfe, 0xa4, 0x0e, 0x05, 0x29, 0x03, 0xe6, 0x1e, 0xfe, 0xca, 0x13,
-       0x03, 0xb6, 0x1e, 0xfe, 0x40, 0x12, 0x03, 0x66, 0x1e, 0xfe, 0x38, 0x13,
-       0x3e, 0x01, 0x84, 0x17, 0xfe, 0x72, 0x06, 0x0a, 0x07, 0x01, 0x38, 0x06,
-       0x24, 0xfe, 0x02, 0x12, 0x4f, 0x01, 0xfe, 0x56, 0x19, 0x16, 0xfe, 0x68,
-       0x06, 0x15, 0x82, 0x01, 0x41, 0x15, 0xe2, 0x03, 0x66, 0x8a, 0x10, 0x66,
-       0x03, 0x9a, 0x1e, 0xfe, 0x70, 0x12, 0x03, 0x55, 0x1e, 0xfe, 0x68, 0x13,
-       0x01, 0xc6, 0x09, 0x12, 0x48, 0xfe, 0x92, 0x06, 0x2e, 0x12, 0x01, 0xfe,
-       0xac, 0x1d, 0xfe, 0x43, 0x48, 0x62, 0x80, 0x13, 0x58, 0xff, 0x02, 0x00,
-       0x57, 0x52, 0xad, 0x23, 0x3f, 0x4e, 0x62, 0x49, 0x3e, 0x01, 0x84, 0x17,
-       0xfe, 0xea, 0x06, 0x01, 0x38, 0x06, 0x12, 0xf7, 0x45, 0x0a, 0x95, 0x01,
-       0xfe, 0x84, 0x19, 0x16, 0xfe, 0xe0, 0x06, 0x15, 0x82, 0x01, 0x41, 0x15,
-       0xe2, 0x03, 0x55, 0x8a, 0x10, 0x55, 0x1c, 0x07, 0x01, 0x84, 0xfe, 0xae,
-       0x10, 0x03, 0x6f, 0x1e, 0xfe, 0x9e, 0x13, 0x3e, 0x01, 0x84, 0x03, 0x9a,
-       0x1e, 0xfe, 0x1a, 0x12, 0x01, 0x38, 0x06, 0x12, 0xfc, 0x01, 0xc6, 0x01,
-       0xfe, 0xac, 0x1d, 0xfe, 0x43, 0x48, 0x62, 0x80, 0xf0, 0x45, 0x0a, 0x95,
-       0x03, 0xb6, 0x1e, 0xf8, 0x01, 0x38, 0x06, 0x24, 0x36, 0xfe, 0x02, 0xf6,
-       0x07, 0x71, 0x78, 0x8c, 0x00, 0x4d, 0x62, 0x49, 0x3e, 0x2d, 0x93, 0x4e,
-       0xd0, 0x0d, 0x17, 0xfe, 0x9a, 0x07, 0x01, 0xfe, 0xc0, 0x19, 0x16, 0xfe,
-       0x90, 0x07, 0x26, 0x20, 0x9e, 0x15, 0x82, 0x01, 0x41, 0x15, 0xe2, 0x21,
-       0x9e, 0x09, 0x07, 0xfb, 0x03, 0xe6, 0xfe, 0x58, 0x57, 0x10, 0xe6, 0x05,
-       0xfe, 0x2a, 0x06, 0x03, 0x6f, 0x8a, 0x10, 0x6f, 0x1c, 0x07, 0x01, 0x84,
-       0xfe, 0x9c, 0x32, 0x5f, 0x75, 0x01, 0xa6, 0x86, 0x15, 0xfe, 0xe2, 0x00,
-       0x2f, 0xed, 0x2a, 0x3c, 0xfe, 0x0a, 0xf0, 0xfe, 0xce, 0x07, 0xae, 0xfe,
-       0x96, 0x08, 0xfe, 0x06, 0xf0, 0xfe, 0x9e, 0x08, 0xaf, 0xa0, 0x05, 0x29,
-       0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x2e, 0x12, 0x14, 0x1d, 0x01, 0x08, 0x14,
-       0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0xfe,
-       0x99, 0xa4, 0x01, 0x08, 0x14, 0x00, 0x05, 0xfe, 0xc6, 0x09, 0x01, 0x76,
-       0x06, 0x12, 0xfe, 0x3a, 0x12, 0x01, 0x0c, 0x06, 0x12, 0xfe, 0x30, 0x13,
-       0x14, 0xfe, 0x1b, 0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x00,
-       0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x07, 0x01, 0x08, 0x14, 0x00,
-       0x05, 0xef, 0x7c, 0x4a, 0x78, 0x4f, 0x0f, 0xfe, 0x9a, 0x81, 0x04, 0xfe,
-       0x9a, 0x83, 0xfe, 0xcb, 0x47, 0x0b, 0x0e, 0x2d, 0x28, 0x48, 0xfe, 0x6c,
-       0x08, 0x0a, 0x28, 0xfe, 0x09, 0x6f, 0xca, 0xfe, 0xca, 0x45, 0xfe, 0x32,
-       0x12, 0x53, 0x63, 0x4e, 0x7c, 0x97, 0x2f, 0xfe, 0x7e, 0x08, 0x2a, 0x3c,
-       0xfe, 0x0a, 0xf0, 0xfe, 0x6c, 0x08, 0xaf, 0xa0, 0xae, 0xfe, 0x96, 0x08,
-       0x05, 0x29, 0x01, 0x41, 0x05, 0xed, 0x14, 0x24, 0x05, 0xed, 0xfe, 0x9c,
-       0xf7, 0x9f, 0x01, 0xfe, 0xae, 0x1e, 0xfe, 0x18, 0x58, 0x01, 0xfe, 0xbe,
-       0x1e, 0xfe, 0x99, 0x58, 0xfe, 0x78, 0x18, 0xfe, 0xf9, 0x18, 0x8e, 0xfe,
-       0x16, 0x09, 0x10, 0x6a, 0x22, 0x6b, 0x01, 0x0c, 0x61, 0x54, 0x44, 0x21,
-       0x2c, 0x09, 0x1a, 0xf8, 0x77, 0x01, 0xfe, 0x7e, 0x1e, 0x47, 0x2c, 0x7a,
-       0x30, 0xf0, 0xfe, 0x83, 0xe7, 0xfe, 0x3f, 0x00, 0x71, 0xfe, 0x03, 0x40,
-       0x01, 0x0c, 0x61, 0x65, 0x44, 0x01, 0xc2, 0xc8, 0xfe, 0x1f, 0x40, 0x20,
-       0x6e, 0x01, 0xfe, 0x6a, 0x16, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe,
-       0x44, 0x51, 0xfe, 0xc6, 0x51, 0xfe, 0x10, 0x10, 0x01, 0xfe, 0xce, 0x1e,
-       0x01, 0xfe, 0xde, 0x1e, 0x10, 0x68, 0x22, 0x69, 0x01, 0xfe, 0xee, 0x1e,
-       0x01, 0xfe, 0xfe, 0x1e, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x10, 0x4b,
-       0x22, 0x4c, 0xfe, 0x8a, 0x10, 0x01, 0x0c, 0x06, 0x54, 0xfe, 0x50, 0x12,
-       0x01, 0xfe, 0xae, 0x1e, 0x01, 0xfe, 0xbe, 0x1e, 0x10, 0x6a, 0x22, 0x6b,
-       0x01, 0x0c, 0x06, 0x65, 0x4e, 0x01, 0xc2, 0x0f, 0xfe, 0x1f, 0x80, 0x04,
-       0xfe, 0x9f, 0x83, 0x33, 0x0b, 0x0e, 0x20, 0x6e, 0x0f, 0xfe, 0x44, 0x90,
-       0x04, 0xfe, 0xc4, 0x93, 0x3a, 0x0b, 0xfe, 0xc6, 0x90, 0x04, 0xfe, 0xc6,
-       0x93, 0x79, 0x0b, 0x0e, 0x10, 0x6c, 0x22, 0x6d, 0x01, 0xfe, 0xce, 0x1e,
-       0x01, 0xfe, 0xde, 0x1e, 0x10, 0x68, 0x22, 0x69, 0x0f, 0xfe, 0x40, 0x90,
-       0x04, 0xfe, 0xc0, 0x93, 0x3a, 0x0b, 0xfe, 0xc2, 0x90, 0x04, 0xfe, 0xc2,
-       0x93, 0x79, 0x0b, 0x0e, 0x10, 0x4b, 0x22, 0x4c, 0x10, 0x64, 0x22, 0x34,
-       0x01, 0x0c, 0x61, 0x24, 0x44, 0x37, 0x13, 0xfe, 0x4e, 0x11, 0x2f, 0xfe,
-       0xde, 0x09, 0xfe, 0x9e, 0xf0, 0xfe, 0xf2, 0x09, 0xfe, 0x01, 0x48, 0x1b,
-       0x3c, 0x37, 0x88, 0xf5, 0xd4, 0xfe, 0x1e, 0x0a, 0xd5, 0xfe, 0x42, 0x0a,
-       0xd2, 0xfe, 0x1e, 0x0a, 0xd3, 0xfe, 0x42, 0x0a, 0xae, 0xfe, 0x12, 0x0a,
-       0xfe, 0x06, 0xf0, 0xfe, 0x18, 0x0a, 0xaf, 0xa0, 0x05, 0x29, 0x01, 0x41,
-       0xfe, 0xc1, 0x10, 0x14, 0x24, 0xfe, 0xc1, 0x10, 0x01, 0x76, 0x06, 0x07,
-       0xfe, 0x14, 0x12, 0x01, 0x76, 0x06, 0x0d, 0x5d, 0x01, 0x0c, 0x06, 0x0d,
-       0xfe, 0x74, 0x12, 0xfe, 0x2e, 0x1c, 0x05, 0xfe, 0x1a, 0x0c, 0x01, 0x76,
-       0x06, 0x07, 0x5d, 0x01, 0x76, 0x06, 0x0d, 0x41, 0xfe, 0x2c, 0x1c, 0xfe,
-       0xaa, 0xf0, 0xfe, 0xce, 0x0a, 0xfe, 0xac, 0xf0, 0xfe, 0x66, 0x0a, 0xfe,
-       0x92, 0x10, 0xc4, 0xf6, 0xfe, 0xad, 0xf0, 0xfe, 0x72, 0x0a, 0x05, 0xfe,
-       0x1a, 0x0c, 0xc5, 0xfe, 0xe7, 0x10, 0xfe, 0x2b, 0xf0, 0xbf, 0xfe, 0x6b,
-       0x18, 0x23, 0xfe, 0x00, 0xfe, 0xfe, 0x1c, 0x12, 0xac, 0xfe, 0xd2, 0xf0,
-       0xbf, 0xfe, 0x76, 0x18, 0x23, 0x1d, 0x1b, 0xbf, 0x03, 0xe3, 0x23, 0x07,
-       0x1b, 0xbf, 0xd4, 0x5b, 0xd5, 0x5b, 0xd2, 0x5b, 0xd3, 0x5b, 0xc4, 0xc5,
-       0xfe, 0xa9, 0x10, 0x75, 0x5e, 0x32, 0x1f, 0x7f, 0x01, 0x42, 0x19, 0xfe,
-       0x35, 0x00, 0xfe, 0x01, 0xf0, 0x70, 0x19, 0x98, 0x05, 0x70, 0xfe, 0x74,
-       0x18, 0x23, 0xfe, 0x00, 0xf8, 0x1b, 0x5b, 0x7d, 0x12, 0x01, 0xfe, 0x78,
-       0x0f, 0x4d, 0x01, 0xfe, 0x96, 0x1a, 0x21, 0x30, 0x77, 0x7d, 0x1d, 0x05,
-       0x5b, 0x01, 0x0c, 0x06, 0x0d, 0x2b, 0xfe, 0xe2, 0x0b, 0x01, 0x0c, 0x06,
-       0x54, 0xfe, 0xa6, 0x12, 0x01, 0x0c, 0x06, 0x24, 0xfe, 0x88, 0x13, 0x21,
-       0x6e, 0xc7, 0x01, 0xfe, 0x1e, 0x1f, 0x0f, 0xfe, 0x83, 0x80, 0x04, 0xfe,
-       0x83, 0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0xfe, 0xc8, 0x44, 0xfe, 0x42,
-       0x13, 0x0f, 0xfe, 0x04, 0x91, 0x04, 0xfe, 0x84, 0x93, 0xfe, 0xca, 0x57,
-       0x0b, 0xfe, 0x86, 0x91, 0x04, 0xfe, 0x86, 0x93, 0xfe, 0xcb, 0x57, 0x0b,
-       0x0e, 0x7a, 0x30, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x8e, 0x40, 0x03,
-       0x6a, 0x3b, 0x6b, 0x10, 0x97, 0x22, 0x98, 0xd9, 0x6a, 0xda, 0x6b, 0x01,
-       0xc2, 0xc8, 0x7a, 0x30, 0x20, 0x6e, 0xdb, 0x64, 0xdc, 0x34, 0x91, 0x6c,
-       0x7e, 0x6d, 0xfe, 0x44, 0x55, 0xfe, 0xe5, 0x55, 0xfe, 0x04, 0xfa, 0x64,
-       0xfe, 0x05, 0xfa, 0x34, 0x01, 0xfe, 0x6a, 0x16, 0xa3, 0x26, 0x10, 0x97,
-       0x10, 0x98, 0x91, 0x6c, 0x7e, 0x6d, 0xfe, 0x14, 0x10, 0x01, 0x0c, 0x06,
-       0x24, 0x1b, 0x40, 0x91, 0x4b, 0x7e, 0x4c, 0x01, 0x0c, 0x06, 0xfe, 0xf7,
-       0x00, 0x44, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x10, 0x58, 0xfe, 0x91, 0x58,
-       0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0x05, 0x5b, 0x01, 0x0c, 0x06, 0x24,
-       0x1b, 0x40, 0x01, 0x0c, 0x06, 0xfe, 0xf7, 0x00, 0x44, 0x78, 0x01, 0xfe,
-       0x8e, 0x1e, 0x4f, 0x0f, 0xfe, 0x10, 0x90, 0x04, 0xfe, 0x90, 0x93, 0x3a,
-       0x0b, 0xfe, 0x92, 0x90, 0x04, 0xfe, 0x92, 0x93, 0x79, 0x0b, 0x0e, 0xfe,
-       0xbd, 0x10, 0x01, 0x43, 0x09, 0xbb, 0x1b, 0xfe, 0x6e, 0x0a, 0x15, 0xbb,
-       0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x14, 0x13, 0x03, 0x4b, 0x3b, 0x4c, 0x8e,
-       0xfe, 0x6e, 0x0a, 0xfe, 0x0c, 0x58, 0xfe, 0x8d, 0x58, 0x05, 0x5b, 0x26,
-       0x3e, 0x0f, 0xfe, 0x19, 0x80, 0x04, 0xfe, 0x99, 0x83, 0x33, 0x0b, 0x0e,
-       0xfe, 0xe5, 0x10, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x1a, 0x12, 0xfe, 0x6c,
-       0x19, 0xfe, 0x19, 0x41, 0xfe, 0x6b, 0x18, 0xac, 0xfe, 0xd1, 0xf0, 0xef,
-       0x1f, 0x92, 0x01, 0x42, 0x19, 0xfe, 0x44, 0x00, 0xfe, 0x90, 0x10, 0xfe,
-       0x6c, 0x19, 0xd9, 0x4b, 0xfe, 0xed, 0x19, 0xda, 0x4c, 0xfe, 0x0c, 0x51,
-       0xfe, 0x8e, 0x51, 0xfe, 0x6b, 0x18, 0x23, 0xfe, 0x00, 0xff, 0x31, 0xfe,
-       0x76, 0x10, 0xac, 0xfe, 0xd2, 0xf0, 0xfe, 0xba, 0x0c, 0xfe, 0x76, 0x18,
-       0x23, 0x1d, 0x5d, 0x03, 0xe3, 0x23, 0x07, 0xfe, 0x08, 0x13, 0x19, 0xfe,
-       0x16, 0x00, 0x05, 0x70, 0xfe, 0xd1, 0xf0, 0xfe, 0xcc, 0x0c, 0x1f, 0x92,
-       0x01, 0x42, 0x19, 0xfe, 0x17, 0x00, 0x5c, 0xfe, 0xce, 0xf0, 0xfe, 0xd2,
-       0x0c, 0xfe, 0x3e, 0x10, 0xfe, 0xcd, 0xf0, 0xfe, 0xde, 0x0c, 0x19, 0xfe,
-       0x22, 0x00, 0x05, 0x70, 0xfe, 0xcb, 0xf0, 0xfe, 0xea, 0x0c, 0x19, 0xfe,
-       0x24, 0x00, 0x05, 0x70, 0xfe, 0xd0, 0xf0, 0xfe, 0xf4, 0x0c, 0x19, 0x94,
-       0xfe, 0x1c, 0x10, 0xfe, 0xcf, 0xf0, 0xfe, 0xfe, 0x0c, 0x19, 0x4a, 0xf3,
-       0xfe, 0xcc, 0xf0, 0xef, 0x01, 0x76, 0x06, 0x24, 0x4d, 0x19, 0xfe, 0x12,
-       0x00, 0x37, 0x13, 0xfe, 0x4e, 0x11, 0x2f, 0xfe, 0x16, 0x0d, 0xfe, 0x9e,
-       0xf0, 0xfe, 0x2a, 0x0d, 0xfe, 0x01, 0x48, 0x1b, 0x3c, 0x37, 0x88, 0xf5,
-       0xd4, 0x29, 0xd5, 0x29, 0xd2, 0x29, 0xd3, 0x29, 0x37, 0xfe, 0x9c, 0x32,
-       0x2f, 0xfe, 0x3e, 0x0d, 0x2a, 0x3c, 0xae, 0xfe, 0x62, 0x0d, 0xaf, 0xa0,
-       0xd4, 0x9f, 0xd5, 0x9f, 0xd2, 0x9f, 0xd3, 0x9f, 0x05, 0x29, 0x01, 0x41,
-       0xfe, 0xd3, 0x10, 0x15, 0xfe, 0xe8, 0x00, 0xc4, 0xc5, 0x75, 0xd7, 0x99,
-       0xd8, 0x9c, 0xfe, 0x89, 0xf0, 0x29, 0x27, 0x25, 0xbe, 0xd7, 0x99, 0xd8,
-       0x9c, 0x2f, 0xfe, 0x8c, 0x0d, 0x16, 0x29, 0x27, 0x25, 0xbd, 0xfe, 0x01,
-       0x48, 0xa4, 0x19, 0xfe, 0x42, 0x00, 0x05, 0x70, 0x90, 0x07, 0xfe, 0x81,
-       0x49, 0x1b, 0xfe, 0x64, 0x0e, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x44, 0x13,
-       0x19, 0x00, 0x2d, 0x0d, 0xfe, 0x54, 0x12, 0x2d, 0xfe, 0x28, 0x00, 0x2b,
-       0xfe, 0xda, 0x0e, 0x0a, 0x57, 0x01, 0x18, 0x09, 0x00, 0x36, 0x46, 0xfe,
-       0x28, 0x00, 0xfe, 0xfa, 0x10, 0x01, 0xfe, 0xf4, 0x1c, 0x01, 0xfe, 0x00,
-       0x1d, 0x0a, 0xba, 0x01, 0xfe, 0x58, 0x10, 0x40, 0x15, 0x56, 0x01, 0x85,
-       0x05, 0x35, 0x19, 0xfe, 0x44, 0x00, 0x2d, 0x0d, 0xf7, 0x46, 0x0d, 0xfe,
-       0xcc, 0x10, 0x01, 0xa7, 0x46, 0x0d, 0xfe, 0xc2, 0x10, 0x01, 0xa7, 0x0f,
-       0xfe, 0x19, 0x82, 0x04, 0xfe, 0x99, 0x83, 0xfe, 0xcc, 0x47, 0x0b, 0x0e,
-       0xfe, 0x34, 0x46, 0xa5, 0x46, 0x0d, 0x19, 0xfe, 0x43, 0x00, 0xfe, 0xa2,
-       0x10, 0x01, 0x0c, 0x61, 0x0d, 0x44, 0x01, 0xfe, 0xf4, 0x1c, 0x01, 0xfe,
-       0x00, 0x1d, 0x40, 0x15, 0x56, 0x01, 0x85, 0x7d, 0x0d, 0x40, 0x51, 0x01,
-       0xfe, 0x9e, 0x1e, 0x05, 0xfe, 0x3a, 0x03, 0x01, 0x0c, 0x06, 0x0d, 0x5d,
-       0x46, 0x0d, 0x19, 0x00, 0xfe, 0x62, 0x10, 0x01, 0x76, 0x06, 0x12, 0xfe,
-       0x5c, 0x12, 0x01, 0x0c, 0x06, 0x12, 0xfe, 0x52, 0x13, 0xfe, 0x1c, 0x1c,
-       0xfe, 0x9d, 0xf0, 0xfe, 0x8e, 0x0e, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0,
-       0xfe, 0x94, 0x0e, 0x01, 0x0c, 0x61, 0x12, 0x44, 0xfe, 0x9f, 0x10, 0x19,
-       0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0d, 0x4f, 0xfe, 0x2e, 0x10, 0x19,
-       0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x19, 0xfe, 0x47, 0x00, 0xf1, 0x19,
-       0xfe, 0x41, 0x00, 0xa2, 0x19, 0xfe, 0x24, 0x00, 0x86, 0xc4, 0xc5, 0x75,
-       0x03, 0x81, 0x1e, 0x2b, 0xea, 0x4f, 0xfe, 0x04, 0xe6, 0x12, 0xfe, 0x9d,
-       0x41, 0xfe, 0x1c, 0x42, 0x40, 0x01, 0xf4, 0x05, 0x35, 0xfe, 0x12, 0x1c,
-       0x1f, 0x0d, 0x47, 0xb5, 0xc3, 0x1f, 0xfe, 0x31, 0x00, 0x47, 0xb8, 0x01,
-       0xfe, 0xd4, 0x11, 0x05, 0xe9, 0x51, 0xfe, 0x06, 0xec, 0xe0, 0xfe, 0x0e,
-       0x47, 0x46, 0x28, 0xfe, 0xce, 0x45, 0x31, 0x51, 0xfe, 0x06, 0xea, 0xe0,
-       0xfe, 0x47, 0x4b, 0x45, 0xfe, 0x75, 0x57, 0x03, 0x67, 0xfe, 0x98, 0x56,
-       0xfe, 0x38, 0x12, 0x0a, 0x5a, 0x01, 0x18, 0xfe, 0x44, 0x48, 0x60, 0x01,
-       0x0c, 0x06, 0x28, 0xfe, 0x18, 0x13, 0x0a, 0x57, 0x01, 0x18, 0x3e, 0xfe,
-       0x41, 0x58, 0x0a, 0xba, 0xfe, 0xfa, 0x14, 0xfe, 0x49, 0x54, 0xb0, 0xfe,
-       0x5e, 0x0f, 0x05, 0xfe, 0x3a, 0x03, 0x0a, 0x67, 0xfe, 0xe0, 0x14, 0xfe,
-       0x0e, 0x47, 0x46, 0x28, 0xfe, 0xce, 0x45, 0x31, 0x51, 0xfe, 0xce, 0x47,
-       0xfe, 0xad, 0x13, 0x05, 0x35, 0x21, 0x2c, 0x09, 0x1a, 0xfe, 0x98, 0x12,
-       0x26, 0x20, 0x96, 0x20, 0xe7, 0xfe, 0x08, 0x1c, 0xfe, 0x7c, 0x19, 0xfe,
-       0xfd, 0x19, 0xfe, 0x0a, 0x1c, 0x03, 0xe5, 0xfe, 0x48, 0x55, 0xa5, 0x3b,
-       0xfe, 0x62, 0x01, 0xfe, 0xc9, 0x55, 0x31, 0xfe, 0x74, 0x10, 0x01, 0xfe,
-       0xf0, 0x1a, 0x03, 0xfe, 0x38, 0x01, 0x3b, 0xfe, 0x3a, 0x01, 0x8e, 0xfe,
-       0x1e, 0x10, 0xfe, 0x02, 0xec, 0xe7, 0x53, 0x00, 0x36, 0xfe, 0x04, 0xec,
-       0x2c, 0x60, 0xfe, 0x05, 0xf6, 0xfe, 0x34, 0x01, 0x01, 0xfe, 0x62, 0x1b,
-       0x01, 0xfe, 0xce, 0x1e, 0xb2, 0x11, 0xfe, 0x18, 0x13, 0xca, 0xfe, 0x02,
-       0xea, 0xe7, 0x53, 0x92, 0xfe, 0xc3, 0x13, 0x1f, 0x12, 0x47, 0xb5, 0xc3,
-       0xfe, 0x2a, 0x10, 0x03, 0xfe, 0x38, 0x01, 0x23, 0xfe, 0xf0, 0xff, 0x10,
-       0xe5, 0x03, 0xfe, 0x3a, 0x01, 0x10, 0xfe, 0x62, 0x01, 0x01, 0xfe, 0x1e,
-       0x1e, 0x20, 0x2c, 0x15, 0x56, 0x01, 0xfe, 0x9e, 0x1e, 0x13, 0x07, 0x02,
-       0x26, 0x02, 0x21, 0x96, 0xc7, 0x20, 0x96, 0x09, 0x92, 0xfe, 0x79, 0x13,
-       0x1f, 0x1d, 0x47, 0xb5, 0xc3, 0xfe, 0xe1, 0x10, 0xcf, 0xfe, 0x03, 0xdc,
-       0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x02, 0xcf, 0xfe, 0x03, 0xdc, 0xfe,
-       0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x02, 0xfe, 0x03, 0x57, 0xcf, 0x26, 0xfe,
-       0x00, 0xcc, 0x02, 0xfe, 0x03, 0x57, 0xcf, 0x89, 0x02, 0x01, 0x0c, 0x06,
-       0x4a, 0xfe, 0x4e, 0x13, 0x0f, 0xfe, 0x1c, 0x80, 0x04, 0xfe, 0x9c, 0x83,
-       0x33, 0x0b, 0x0e, 0x09, 0x07, 0xfe, 0x3a, 0x13, 0x0f, 0xfe, 0x1e, 0x80,
-       0x04, 0xfe, 0x9e, 0x83, 0x33, 0x0b, 0x0e, 0xfe, 0x2a, 0x13, 0x0f, 0xfe,
-       0x1d, 0x80, 0x04, 0xfe, 0x9d, 0x83, 0xfe, 0xf9, 0x13, 0x0e, 0xfe, 0x1c,
-       0x13, 0x01, 0xfe, 0xee, 0x1e, 0xac, 0xfe, 0x14, 0x13, 0x01, 0xfe, 0xfe,
-       0x1e, 0xfe, 0x81, 0x58, 0xfa, 0x01, 0xfe, 0x0e, 0x1f, 0xfe, 0x30, 0xf4,
-       0x0d, 0xfe, 0x3c, 0x50, 0xa2, 0x01, 0xfe, 0x92, 0x1b, 0x01, 0x43, 0x09,
-       0x56, 0xfb, 0x01, 0xfe, 0xc8, 0x1a, 0x01, 0x0c, 0x06, 0x28, 0xa4, 0x01,
-       0xfe, 0xf4, 0x1c, 0x01, 0xfe, 0x00, 0x1d, 0x15, 0xfe, 0xe9, 0x00, 0x01,
-       0x0c, 0x06, 0x4a, 0xfe, 0x4e, 0x13, 0x01, 0xfe, 0x22, 0x1b, 0xfe, 0x1e,
-       0x1c, 0x0f, 0xfe, 0x14, 0x90, 0x04, 0xfe, 0x94, 0x93, 0x3a, 0x0b, 0xfe,
-       0x96, 0x90, 0x04, 0xfe, 0x96, 0x93, 0x79, 0x0b, 0x0e, 0x10, 0xfe, 0x64,
-       0x01, 0x22, 0xfe, 0x66, 0x01, 0x01, 0x0c, 0x06, 0x65, 0xf9, 0x0f, 0xfe,
-       0x03, 0x80, 0x04, 0xfe, 0x83, 0x83, 0x33, 0x0b, 0x0e, 0x77, 0xfe, 0x01,
-       0xec, 0x2c, 0xfe, 0x80, 0x40, 0x20, 0x2c, 0x7a, 0x30, 0x15, 0xdf, 0x40,
-       0x21, 0x2c, 0xfe, 0x00, 0x40, 0x8d, 0x2c, 0x02, 0xfe, 0x08, 0x1c, 0x03,
-       0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58, 0x03, 0xfe, 0xae, 0x00, 0xfe, 0x07,
-       0x58, 0x03, 0xfe, 0xb0, 0x00, 0xfe, 0x08, 0x58, 0x03, 0xfe, 0xb2, 0x00,
-       0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c, 0x2e, 0x49, 0x20, 0xe0, 0x26, 0x10,
-       0x66, 0x10, 0x55, 0x10, 0x6f, 0x13, 0x57, 0x52, 0x4f, 0x1c, 0x28, 0xfe,
-       0x90, 0x4d, 0xfe, 0x91, 0x54, 0x2b, 0xfe, 0x88, 0x11, 0x46, 0x1a, 0x13,
-       0x5a, 0x52, 0x1c, 0x4a, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x2b, 0xfe,
-       0x9e, 0x11, 0x2e, 0x1a, 0x20, 0x2c, 0x90, 0x34, 0x60, 0x21, 0x2c, 0xfe,
-       0x00, 0x40, 0x8d, 0x2c, 0x15, 0xdf, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0,
-       0xfe, 0xb2, 0x11, 0xfe, 0x12, 0x1c, 0x75, 0xfe, 0x14, 0x1c, 0xfe, 0x10,
-       0x1c, 0xfe, 0x18, 0x1c, 0x02, 0x51, 0xfe, 0x0c, 0x14, 0xfe, 0x0e, 0x47,
-       0xfe, 0x07, 0xe6, 0x28, 0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x02, 0x01,
-       0xa7, 0x90, 0x34, 0x60, 0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x42,
-       0x13, 0xfe, 0x02, 0x80, 0x09, 0x56, 0xfe, 0x34, 0x13, 0x0a, 0x5a, 0x01,
-       0x18, 0xcb, 0xfe, 0x36, 0x12, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48, 0x01,
-       0xfe, 0xb2, 0x16, 0xfe, 0x00, 0xcc, 0xcb, 0xfe, 0xf3, 0x13, 0x3f, 0x89,
-       0x09, 0x1a, 0xa5, 0x0a, 0x9d, 0x01, 0x18, 0xfe, 0x80, 0x5c, 0x01, 0x85,
-       0xf2, 0x09, 0x9b, 0xa4, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0xec,
-       0x11, 0x02, 0xfe, 0x44, 0x58, 0x77, 0xfe, 0x01, 0xec, 0xb8, 0xfe, 0x9e,
-       0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x12, 0x8d, 0x30, 0x01,
-       0xf4, 0xfe, 0xdd, 0x10, 0x37, 0xd7, 0x99, 0xd8, 0x9c, 0x27, 0x25, 0xee,
-       0x09, 0x12, 0xfe, 0x48, 0x12, 0x09, 0x0d, 0xfe, 0x56, 0x12, 0x09, 0x1d,
-       0xfe, 0x30, 0x12, 0x09, 0xdd, 0x1b, 0xfe, 0xc4, 0x13, 0x09, 0xfe, 0x23,
-       0x00, 0x1b, 0xfe, 0xd0, 0x13, 0x09, 0x07, 0x1b, 0xfe, 0x34, 0x14, 0x09,
-       0x24, 0xfe, 0x12, 0x12, 0x09, 0x00, 0x1b, 0x29, 0x1f, 0xdd, 0x01, 0x42,
-       0xa1, 0x32, 0x01, 0x08, 0xae, 0x41, 0x02, 0x32, 0xfe, 0x62, 0x08, 0x0a,
-       0xe1, 0x01, 0xfe, 0x58, 0x10, 0x15, 0x9b, 0x05, 0x35, 0x32, 0x01, 0x43,
-       0x09, 0xbb, 0xfe, 0xd7, 0x13, 0x91, 0x4b, 0x7e, 0x4c, 0x8e, 0xfe, 0x80,
-       0x13, 0x01, 0x0c, 0x06, 0x54, 0xfe, 0x72, 0x12, 0xdb, 0x64, 0xdc, 0x34,
-       0xfe, 0x44, 0x55, 0xfe, 0xe5, 0x55, 0xb0, 0xfe, 0x4a, 0x13, 0x21, 0x6e,
-       0xfe, 0x26, 0x13, 0x03, 0x97, 0x3b, 0x98, 0x8e, 0xfe, 0xb6, 0x0e, 0x10,
-       0x6a, 0x22, 0x6b, 0x26, 0x10, 0x97, 0x10, 0x98, 0x01, 0xc2, 0x2e, 0x49,
-       0x88, 0x20, 0x6e, 0x01, 0xfe, 0x6a, 0x16, 0xdb, 0x64, 0xdc, 0x34, 0xfe,
-       0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe, 0x04, 0xfa, 0x64, 0xfe, 0x05, 0xfa,
-       0x34, 0xfe, 0x8f, 0x10, 0x03, 0x6c, 0x3b, 0x6d, 0xfe, 0x40, 0x56, 0xfe,
-       0xe1, 0x56, 0x10, 0x6c, 0x22, 0x6d, 0x71, 0xdb, 0x64, 0xdc, 0x34, 0xfe,
-       0x44, 0x55, 0xfe, 0xe5, 0x55, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x00, 0x56,
-       0xfe, 0xa1, 0x56, 0x10, 0x68, 0x22, 0x69, 0x01, 0x0c, 0x06, 0x54, 0xf9,
-       0x21, 0x6e, 0xfe, 0x1f, 0x40, 0x03, 0x6a, 0x3b, 0x6b, 0xfe, 0x2c, 0x50,
-       0xfe, 0xae, 0x50, 0x03, 0x6c, 0x3b, 0x6d, 0xfe, 0x44, 0x50, 0xfe, 0xc6,
-       0x50, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0x03,
-       0x4b, 0x3b, 0x4c, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x05, 0x73, 0x2e,
-       0x07, 0x20, 0x9e, 0x05, 0x72, 0x32, 0x01, 0x08, 0x16, 0x3d, 0x27, 0x25,
-       0xee, 0x09, 0x07, 0x2b, 0x3d, 0x01, 0x43, 0x09, 0xbb, 0x2b, 0x72, 0x01,
-       0xa6, 0x23, 0x3f, 0x1b, 0x3d, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x1e, 0x13,
-       0x91, 0x4b, 0x7e, 0x4c, 0xfe, 0x0a, 0x55, 0x31, 0xfe, 0x8b, 0x55, 0xd9,
-       0x4b, 0xda, 0x4c, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0x05, 0x72, 0x01,
-       0xfe, 0x8e, 0x1e, 0xca, 0xfe, 0x19, 0x41, 0x05, 0x72, 0x32, 0x01, 0x08,
-       0x2a, 0x3c, 0x16, 0xc0, 0x27, 0x25, 0xbe, 0x2d, 0x1d, 0xc0, 0x2d, 0x0d,
-       0x83, 0x2d, 0x7f, 0x1b, 0xfe, 0x66, 0x15, 0x05, 0x3d, 0x01, 0x08, 0x2a,
-       0x3c, 0x16, 0xc0, 0x27, 0x25, 0xbd, 0x09, 0x1d, 0x2b, 0x3d, 0x01, 0x08,
-       0x16, 0xc0, 0x27, 0x25, 0xfe, 0xe8, 0x09, 0xfe, 0xc2, 0x49, 0x50, 0x03,
-       0xb6, 0x1e, 0x83, 0x01, 0x38, 0x06, 0x24, 0x31, 0xa1, 0xfe, 0xbb, 0x45,
-       0x2d, 0x00, 0xa4, 0x46, 0x07, 0x90, 0x3f, 0x01, 0xfe, 0xf8, 0x15, 0x01,
-       0xa6, 0x86, 0xfe, 0x4b, 0x45, 0xfe, 0x20, 0x13, 0x01, 0x43, 0x09, 0x82,
-       0xfe, 0x16, 0x13, 0x03, 0x9a, 0x1e, 0x5d, 0x03, 0x55, 0x1e, 0x31, 0x5e,
-       0x05, 0x72, 0xfe, 0xc0, 0x5d, 0x01, 0xa7, 0xfe, 0x03, 0x17, 0x03, 0x66,
-       0x8a, 0x10, 0x66, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73, 0x01, 0xfe, 0x56,
-       0x19, 0x05, 0x73, 0x01, 0x08, 0x2a, 0x3c, 0x16, 0x3d, 0x27, 0x25, 0xbd,
-       0x09, 0x07, 0x2b, 0x3d, 0x01, 0xfe, 0xbe, 0x16, 0xfe, 0x42, 0x58, 0xfe,
-       0xe8, 0x14, 0x01, 0xa6, 0x86, 0xfe, 0x4a, 0xf4, 0x0d, 0x1b, 0x3d, 0xfe,
-       0x4a, 0xf4, 0x07, 0xfe, 0x0e, 0x12, 0x01, 0x43, 0x09, 0x82, 0x4e, 0x05,
-       0x72, 0x03, 0x55, 0x8a, 0x10, 0x55, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73,
-       0x01, 0xfe, 0x84, 0x19, 0x05, 0x73, 0x01, 0x08, 0x2a, 0x3c, 0x16, 0x3d,
-       0x27, 0x25, 0xbd, 0x09, 0x12, 0x2b, 0x3d, 0x01, 0xfe, 0xe8, 0x17, 0x8b,
-       0xfe, 0xaa, 0x14, 0xfe, 0xb6, 0x14, 0x86, 0xa8, 0xb2, 0x0d, 0x1b, 0x3d,
-       0xb2, 0x07, 0xfe, 0x0e, 0x12, 0x01, 0x43, 0x09, 0x82, 0x4e, 0x05, 0x72,
-       0x03, 0x6f, 0x8a, 0x10, 0x6f, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73, 0x01,
-       0xfe, 0xc0, 0x19, 0x05, 0x73, 0x13, 0x07, 0x2f, 0xfe, 0xcc, 0x15, 0x17,
-       0xfe, 0xe2, 0x15, 0x5f, 0xcc, 0x01, 0x08, 0x26, 0x5f, 0x02, 0x8f, 0xfe,
-       0xde, 0x15, 0x2a, 0xfe, 0xde, 0x15, 0x16, 0xfe, 0xcc, 0x15, 0x5e, 0x32,
-       0x01, 0x08, 0xfe, 0xd5, 0x10, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52,
-       0xad, 0x23, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x02,
-       0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xad, 0x23, 0x3f, 0xfe, 0x30,
-       0x56, 0xfe, 0x00, 0x5c, 0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52,
-       0xad, 0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xfe, 0x00, 0x5e,
-       0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xad, 0xfe, 0x0b, 0x58,
-       0x02, 0x0a, 0x66, 0x01, 0x5c, 0x0a, 0x55, 0x01, 0x5c, 0x0a, 0x6f, 0x01,
-       0x5c, 0x02, 0x01, 0xfe, 0x1e, 0x1f, 0x23, 0x1a, 0xff, 0x03, 0x00, 0x54,
-       0xfe, 0x00, 0xf4, 0x24, 0x52, 0x0f, 0xfe, 0x00, 0x7c, 0x04, 0xfe, 0x07,
-       0x7c, 0x3a, 0x0b, 0x0e, 0xfe, 0x00, 0x71, 0xfe, 0xf9, 0x18, 0xfe, 0x7a,
-       0x19, 0xfe, 0xfb, 0x19, 0xfe, 0x1a, 0xf7, 0x00, 0xfe, 0x1b, 0xf7, 0x00,
-       0x7a, 0x30, 0x10, 0x68, 0x22, 0x69, 0xd9, 0x6c, 0xda, 0x6d, 0x02, 0xfe,
-       0x62, 0x08, 0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x77,
-       0x02, 0x01, 0xc6, 0xfe, 0x42, 0x48, 0x4f, 0x50, 0x45, 0x01, 0x08, 0x16,
-       0xfe, 0xe0, 0x17, 0x27, 0x25, 0xbe, 0x01, 0x08, 0x16, 0xfe, 0xe0, 0x17,
-       0x27, 0x25, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x03, 0x9a, 0x1e, 0xfe,
-       0xda, 0x12, 0x01, 0x38, 0x06, 0x12, 0xfe, 0xd0, 0x13, 0x26, 0x53, 0x12,
-       0x48, 0xfe, 0x08, 0x17, 0xd1, 0x12, 0x53, 0x12, 0xfe, 0x1e, 0x13, 0x2d,
-       0xb4, 0x7b, 0xfe, 0x26, 0x17, 0x4d, 0x13, 0x07, 0x1c, 0xb4, 0x90, 0x04,
-       0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xf1, 0xff, 0x02, 0x83, 0x55,
-       0x53, 0x1d, 0xfe, 0x12, 0x13, 0xd6, 0xfe, 0x30, 0x00, 0xb0, 0xfe, 0x80,
-       0x17, 0x1c, 0x63, 0x13, 0x07, 0xfe, 0x56, 0x10, 0x53, 0x0d, 0xfe, 0x16,
-       0x13, 0xd6, 0xfe, 0x64, 0x00, 0xb0, 0xfe, 0x80, 0x17, 0x0a, 0xfe, 0x64,
-       0x00, 0x1c, 0x94, 0x13, 0x07, 0xfe, 0x28, 0x10, 0x53, 0x07, 0xfe, 0x60,
-       0x13, 0xd6, 0xfe, 0xc8, 0x00, 0xb0, 0xfe, 0x80, 0x17, 0x0a, 0xfe, 0xc8,
-       0x00, 0x1c, 0x95, 0x13, 0x07, 0x71, 0xd6, 0xfe, 0x90, 0x01, 0x48, 0xfe,
-       0x8c, 0x17, 0x45, 0xf3, 0xfe, 0x43, 0xf4, 0x96, 0xfe, 0x56, 0xf0, 0xfe,
-       0x9e, 0x17, 0xfe, 0x04, 0xf4, 0x58, 0xfe, 0x43, 0xf4, 0x94, 0xf6, 0x8b,
-       0x01, 0xfe, 0x24, 0x16, 0x23, 0x3f, 0xfc, 0xa8, 0x8c, 0x49, 0x48, 0xfe,
-       0xda, 0x17, 0x62, 0x49, 0xfe, 0x1c, 0x10, 0xa8, 0x8c, 0x80, 0x48, 0xfe,
-       0xda, 0x17, 0x62, 0x80, 0x71, 0x50, 0x26, 0xfe, 0x4d, 0xf4, 0x00, 0xf7,
-       0x45, 0x13, 0x07, 0xfe, 0xb4, 0x56, 0xfe, 0xc3, 0x58, 0x02, 0x50, 0x13,
-       0x0d, 0x02, 0x50, 0x3e, 0x78, 0x4f, 0x45, 0x01, 0x08, 0x16, 0xa9, 0x27,
-       0x25, 0xbe, 0xfe, 0x03, 0xea, 0xfe, 0x7e, 0x01, 0x01, 0x08, 0x16, 0xa9,
-       0x27, 0x25, 0xfe, 0xe9, 0x0a, 0x01, 0x08, 0x16, 0xa9, 0x27, 0x25, 0xfe,
-       0xe9, 0x0a, 0xfe, 0x05, 0xea, 0xfe, 0x7f, 0x01, 0x01, 0x08, 0x16, 0xa9,
-       0x27, 0x25, 0xfe, 0x69, 0x09, 0xfe, 0x02, 0xea, 0xfe, 0x80, 0x01, 0x01,
-       0x08, 0x16, 0xa9, 0x27, 0x25, 0xfe, 0xe8, 0x08, 0x47, 0xfe, 0x81, 0x01,
-       0x03, 0xb6, 0x1e, 0x83, 0x01, 0x38, 0x06, 0x24, 0x31, 0xa2, 0x78, 0xf2,
-       0x53, 0x07, 0x36, 0xfe, 0x34, 0xf4, 0x3f, 0xa1, 0x78, 0x03, 0x9a, 0x1e,
-       0x83, 0x01, 0x38, 0x06, 0x12, 0x31, 0xf0, 0x4f, 0x45, 0xfe, 0x90, 0x10,
-       0xfe, 0x40, 0x5a, 0x23, 0x3f, 0xfb, 0x8c, 0x49, 0x48, 0xfe, 0xaa, 0x18,
-       0x62, 0x49, 0x71, 0x8c, 0x80, 0x48, 0xfe, 0xaa, 0x18, 0x62, 0x80, 0xfe,
-       0xb4, 0x56, 0xfe, 0x40, 0x5d, 0x01, 0xc6, 0x01, 0xfe, 0xac, 0x1d, 0xfe,
-       0x02, 0x17, 0xfe, 0xc8, 0x45, 0xfe, 0x5a, 0xf0, 0xfe, 0xc0, 0x18, 0xfe,
-       0x43, 0x48, 0x2d, 0x93, 0x36, 0xfe, 0x34, 0xf4, 0xfe, 0x00, 0x11, 0xfe,
-       0x40, 0x10, 0x2d, 0xb4, 0x36, 0xfe, 0x34, 0xf4, 0x04, 0xfe, 0x34, 0x10,
-       0x2d, 0xfe, 0x0b, 0x00, 0x36, 0x46, 0x63, 0xfe, 0x28, 0x10, 0xfe, 0xc0,
-       0x49, 0xff, 0x02, 0x00, 0x54, 0xb2, 0xfe, 0x90, 0x01, 0x48, 0xfe, 0xfa,
-       0x18, 0x45, 0xfe, 0x1c, 0xf4, 0x3f, 0xf3, 0xfe, 0x40, 0xf4, 0x96, 0xfe,
-       0x56, 0xf0, 0xfe, 0x0c, 0x19, 0xfe, 0x04, 0xf4, 0x58, 0xfe, 0x40, 0xf4,
-       0x94, 0xf6, 0x3e, 0x2d, 0x93, 0x4e, 0xd0, 0x0d, 0x21, 0xfe, 0x7f, 0x01,
-       0xfe, 0xc8, 0x46, 0xfe, 0x24, 0x13, 0x8c, 0x00, 0x5d, 0x26, 0x21, 0xfe,
-       0x7e, 0x01, 0xfe, 0xc8, 0x45, 0xfe, 0x14, 0x13, 0x21, 0xfe, 0x80, 0x01,
-       0xfe, 0x48, 0x45, 0xfa, 0x21, 0xfe, 0x81, 0x01, 0xfe, 0xc8, 0x44, 0x4e,
-       0x26, 0x02, 0x13, 0x07, 0x02, 0x78, 0x45, 0x50, 0x13, 0x0d, 0x02, 0x14,
-       0x07, 0x01, 0x08, 0x17, 0xfe, 0x82, 0x19, 0x14, 0x0d, 0x01, 0x08, 0x17,
-       0xfe, 0x82, 0x19, 0x14, 0x1d, 0x01, 0x08, 0x17, 0xfe, 0x82, 0x19, 0x5f,
-       0xfe, 0x89, 0x49, 0x01, 0x08, 0x02, 0x14, 0x07, 0x01, 0x08, 0x17, 0xc1,
-       0x14, 0x1d, 0x01, 0x08, 0x17, 0xc1, 0x14, 0x07, 0x01, 0x08, 0x17, 0xc1,
-       0xfe, 0x89, 0x49, 0x01, 0x08, 0x17, 0xc1, 0x5f, 0xfe, 0x89, 0x4a, 0x01,
-       0x08, 0x02, 0x50, 0x02, 0x14, 0x07, 0x01, 0x08, 0x17, 0x74, 0x14, 0x7f,
-       0x01, 0x08, 0x17, 0x74, 0x14, 0x12, 0x01, 0x08, 0x17, 0x74, 0xfe, 0x89,
-       0x49, 0x01, 0x08, 0x17, 0x74, 0x14, 0x00, 0x01, 0x08, 0x17, 0x74, 0xfe,
-       0x89, 0x4a, 0x01, 0x08, 0x17, 0x74, 0xfe, 0x09, 0x49, 0x01, 0x08, 0x17,
-       0x74, 0x5f, 0xcc, 0x01, 0x08, 0x02, 0x21, 0xe4, 0x09, 0x07, 0xfe, 0x4c,
-       0x13, 0xc8, 0x20, 0xe4, 0xfe, 0x49, 0xf4, 0x00, 0x4d, 0x5f, 0xa1, 0x5e,
-       0xfe, 0x01, 0xec, 0xfe, 0x27, 0x01, 0xcc, 0xff, 0x02, 0x00, 0x10, 0x2f,
-       0xfe, 0x3e, 0x1a, 0x01, 0x43, 0x09, 0xfe, 0xe3, 0x00, 0xfe, 0x22, 0x13,
-       0x16, 0xfe, 0x64, 0x1a, 0x26, 0x20, 0x9e, 0x01, 0x41, 0x21, 0x9e, 0x09,
-       0x07, 0x5d, 0x01, 0x0c, 0x61, 0x07, 0x44, 0x02, 0x0a, 0x5a, 0x01, 0x18,
-       0xfe, 0x00, 0x40, 0xaa, 0x09, 0x1a, 0xfe, 0x12, 0x13, 0x0a, 0x9d, 0x01,
-       0x18, 0xaa, 0x0a, 0x67, 0x01, 0xa3, 0x02, 0x0a, 0x9d, 0x01, 0x18, 0xaa,
-       0xfe, 0x80, 0xe7, 0x1a, 0x09, 0x1a, 0x5d, 0xfe, 0x45, 0x58, 0x01, 0xfe,
-       0xb2, 0x16, 0xaa, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0xaa, 0x0a, 0x67, 0x01,
-       0xa3, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0x01, 0xfe, 0x7e, 0x1e, 0xfe, 0x80,
-       0x4c, 0xfe, 0x49, 0xe4, 0x1a, 0xfe, 0x12, 0x13, 0x0a, 0x9d, 0x01, 0x18,
-       0xfe, 0x80, 0x4c, 0x0a, 0x67, 0x01, 0x5c, 0x02, 0x1c, 0x1a, 0x87, 0x7c,
-       0xe5, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x24, 0x1c, 0xfe, 0x1d,
-       0xf7, 0x28, 0xb1, 0xfe, 0x04, 0x1b, 0x01, 0xfe, 0x2a, 0x1c, 0xfa, 0xb3,
-       0x28, 0x7c, 0xfe, 0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x02, 0xc9, 0x2b, 0xfe,
-       0xf4, 0x1a, 0xfe, 0xfa, 0x10, 0x1c, 0x1a, 0x87, 0x03, 0xfe, 0x64, 0x01,
-       0xfe, 0x00, 0xf4, 0x24, 0xfe, 0x18, 0x58, 0x03, 0xfe, 0x66, 0x01, 0xfe,
-       0x19, 0x58, 0xb3, 0x24, 0x01, 0xfe, 0x0e, 0x1f, 0xfe, 0x30, 0xf4, 0x07,
-       0xfe, 0x3c, 0x50, 0x7c, 0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79, 0xfe, 0x1c,
-       0xf7, 0x24, 0xb1, 0xfe, 0x50, 0x1b, 0xfe, 0xd4, 0x14, 0x31, 0x02, 0xc9,
-       0x2b, 0xfe, 0x26, 0x1b, 0xfe, 0xba, 0x10, 0x1c, 0x1a, 0x87, 0xfe, 0x83,
-       0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x1d, 0xf7, 0x54, 0xb1,
-       0xfe, 0x72, 0x1b, 0xfe, 0xb2, 0x14, 0xfc, 0xb3, 0x54, 0x7c, 0x12, 0xfe,
-       0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00, 0x02, 0xc9, 0x2b, 0xfe, 0x66, 0x1b,
-       0xfe, 0x8a, 0x10, 0x1c, 0x1a, 0x87, 0x8b, 0x0f, 0xfe, 0x30, 0x90, 0x04,
-       0xfe, 0xb0, 0x93, 0x3a, 0x0b, 0xfe, 0x18, 0x58, 0xfe, 0x32, 0x90, 0x04,
-       0xfe, 0xb2, 0x93, 0x3a, 0x0b, 0xfe, 0x19, 0x58, 0x0e, 0xa8, 0xb3, 0x4a,
-       0x7c, 0x12, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7, 0x4a, 0xb1, 0xfe, 0xc6,
-       0x1b, 0xfe, 0x5e, 0x14, 0x31, 0x02, 0xc9, 0x2b, 0xfe, 0x96, 0x1b, 0x5c,
-       0xfe, 0x02, 0xf6, 0x1a, 0x87, 0xfe, 0x18, 0xfe, 0x6a, 0xfe, 0x19, 0xfe,
-       0x6b, 0x01, 0xfe, 0x1e, 0x1f, 0xfe, 0x1d, 0xf7, 0x65, 0xb1, 0xfe, 0xee,
-       0x1b, 0xfe, 0x36, 0x14, 0xfe, 0x1c, 0x13, 0xb3, 0x65, 0x3e, 0xfe, 0x83,
-       0x58, 0xfe, 0xaf, 0x19, 0xfe, 0x80, 0xe7, 0x1a, 0xfe, 0x81, 0xe7, 0x1a,
-       0x15, 0xfe, 0xdd, 0x00, 0x7a, 0x30, 0x02, 0x7a, 0x30, 0xfe, 0x12, 0x45,
-       0x2b, 0xfe, 0xdc, 0x1b, 0x1f, 0x07, 0x47, 0xb5, 0xc3, 0x05, 0x35, 0xfe,
-       0x39, 0xf0, 0x75, 0x26, 0x02, 0xfe, 0x7e, 0x18, 0x23, 0x1d, 0x36, 0x13,
-       0x11, 0x02, 0x87, 0x03, 0xe3, 0x23, 0x07, 0xfe, 0xef, 0x12, 0xfe, 0xe1,
-       0x10, 0x90, 0x34, 0x60, 0xfe, 0x02, 0x80, 0x09, 0x56, 0xfe, 0x3c, 0x13,
-       0xfe, 0x82, 0x14, 0xfe, 0x42, 0x13, 0x51, 0xfe, 0x06, 0x83, 0x0a, 0x5a,
-       0x01, 0x18, 0xcb, 0xfe, 0x3e, 0x12, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48,
-       0x01, 0xfe, 0xb2, 0x16, 0xfe, 0x00, 0xcc, 0xcb, 0xfe, 0xf3, 0x13, 0x3f,
-       0x89, 0x09, 0x1a, 0xa5, 0x0a, 0x9d, 0x01, 0x18, 0xfe, 0x80, 0x4c, 0x01,
-       0x85, 0xfe, 0x16, 0x10, 0x09, 0x9b, 0x4e, 0xfe, 0x40, 0x14, 0xfe, 0x24,
-       0x12, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x52, 0x1c, 0x1c, 0x0d,
-       0x02, 0xfe, 0x9c, 0xe7, 0x0d, 0x19, 0xfe, 0x15, 0x00, 0x40, 0x8d, 0x30,
-       0x01, 0xf4, 0x1c, 0x07, 0x02, 0x51, 0xfe, 0x06, 0x83, 0xfe, 0x18, 0x80,
-       0x61, 0x28, 0x44, 0x15, 0x56, 0x01, 0x85, 0x1c, 0x07, 0x02, 0xfe, 0x38,
-       0x90, 0xfe, 0xba, 0x90, 0x91, 0xde, 0x7e, 0xdf, 0xfe, 0x48, 0x55, 0x31,
-       0xfe, 0xc9, 0x55, 0x02, 0x21, 0xb9, 0x88, 0x20, 0xb9, 0x02, 0x0a, 0xba,
-       0x01, 0x18, 0xfe, 0x41, 0x48, 0x0a, 0x57, 0x01, 0x18, 0xfe, 0x49, 0x44,
-       0x1b, 0xfe, 0x1e, 0x1d, 0x88, 0x89, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0x09,
-       0x1a, 0xa4, 0x0a, 0x67, 0x01, 0xa3, 0x0a, 0x57, 0x01, 0x18, 0x88, 0x89,
-       0x02, 0xfe, 0x4e, 0xe4, 0x1d, 0x7b, 0xfe, 0x52, 0x1d, 0x03, 0xfe, 0x90,
-       0x00, 0xfe, 0x3a, 0x45, 0xfe, 0x2c, 0x10, 0xfe, 0x4e, 0xe4, 0xdd, 0x7b,
-       0xfe, 0x64, 0x1d, 0x03, 0xfe, 0x92, 0x00, 0xd1, 0x12, 0xfe, 0x1a, 0x10,
-       0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x7b, 0xfe, 0x76, 0x1d, 0x03, 0xfe,
-       0x94, 0x00, 0xd1, 0x24, 0xfe, 0x08, 0x10, 0x03, 0xfe, 0x96, 0x00, 0xd1,
-       0x63, 0xfe, 0x4e, 0x45, 0x83, 0xca, 0xff, 0x04, 0x68, 0x54, 0xfe, 0xf1,
-       0x10, 0x23, 0x49, 0xfe, 0x08, 0x1c, 0xfe, 0x67, 0x19, 0xfe, 0x0a, 0x1c,
-       0xfe, 0x1a, 0xf4, 0xfe, 0x00, 0x04, 0x83, 0xb2, 0x1d, 0x48, 0xfe, 0xaa,
-       0x1d, 0x13, 0x1d, 0x02, 0x09, 0x92, 0xfe, 0x5a, 0xf0, 0xfe, 0xba, 0x1d,
-       0x2e, 0x93, 0xfe, 0x34, 0x10, 0x09, 0x12, 0xfe, 0x5a, 0xf0, 0xfe, 0xc8,
-       0x1d, 0x2e, 0xb4, 0xfe, 0x26, 0x10, 0x09, 0x1d, 0x36, 0x2e, 0x63, 0xfe,
-       0x1a, 0x10, 0x09, 0x0d, 0x36, 0x2e, 0x94, 0xf2, 0x09, 0x07, 0x36, 0x2e,
-       0x95, 0xa1, 0xc8, 0x02, 0x1f, 0x93, 0x01, 0x42, 0xfe, 0x04, 0xfe, 0x99,
-       0x03, 0x9c, 0x8b, 0x02, 0x2a, 0xfe, 0x1c, 0x1e, 0xfe, 0x14, 0xf0, 0x08,
-       0x2f, 0xfe, 0x0c, 0x1e, 0x2a, 0xfe, 0x1c, 0x1e, 0x8f, 0xfe, 0x1c, 0x1e,
-       0xfe, 0x82, 0xf0, 0xfe, 0x10, 0x1e, 0x02, 0x0f, 0x3f, 0x04, 0xfe, 0x80,
-       0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x18, 0x80, 0x04, 0xfe, 0x98,
-       0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x02, 0x80, 0x04, 0xfe, 0x82,
-       0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x06, 0x80, 0x04, 0xfe, 0x86,
-       0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x1b, 0x80, 0x04, 0xfe, 0x9b,
-       0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x04, 0x80, 0x04, 0xfe, 0x84,
-       0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x80, 0x80, 0x04, 0xfe, 0x80,
-       0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x19, 0x81, 0x04,
-       0xfe, 0x99, 0x83, 0xfe, 0xca, 0x47, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x06,
-       0x83, 0x04, 0xfe, 0x86, 0x83, 0xfe, 0xce, 0x47, 0x0b, 0x0e, 0x02, 0x0f,
-       0xfe, 0x2c, 0x90, 0x04, 0xfe, 0xac, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
-       0xfe, 0xae, 0x90, 0x04, 0xfe, 0xae, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
-       0xfe, 0x08, 0x90, 0x04, 0xfe, 0x88, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
-       0xfe, 0x8a, 0x90, 0x04, 0xfe, 0x8a, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
-       0xfe, 0x0c, 0x90, 0x04, 0xfe, 0x8c, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
-       0xfe, 0x8e, 0x90, 0x04, 0xfe, 0x8e, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
-       0xfe, 0x3c, 0x90, 0x04, 0xfe, 0xbc, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x8b,
-       0x0f, 0xfe, 0x03, 0x80, 0x04, 0xfe, 0x83, 0x83, 0x33, 0x0b, 0x77, 0x0e,
-       0xa8, 0x02, 0xff, 0x66, 0x00, 0x00,
-};
-
-static unsigned short _adv_asc38C1600_size = sizeof(_adv_asc38C1600_buf);      /* 0x1673 */
-static ADV_DCNT _adv_asc38C1600_chksum = 0x0604EF77UL; /* Expanded little-endian checksum. */
-
 static void AscInitQLinkVar(ASC_DVC_VAR *asc_dvc)
 {
        PortAddr iop_base;
@@ -6362,6 +4751,10 @@ static ushort AscInitMicroCodeVar(ASC_DVC_VAR *asc_dvc)
 
 static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
 {
+       const struct firmware *fw;
+       const char fwname[] = "advansys/mcode.bin";
+       int err;
+       unsigned long chksum;
        ushort warn_code;
        PortAddr iop_base;
 
@@ -6383,12 +4776,29 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
        warn_code |= AscInitLram(asc_dvc);
        if (asc_dvc->err_code != 0)
                return UW_ERR;
-       ASC_DBG(1, "_asc_mcode_chksum 0x%lx\n", (ulong)_asc_mcode_chksum);
-       if (AscLoadMicroCode(iop_base, 0, _asc_mcode_buf,
-                            _asc_mcode_size) != _asc_mcode_chksum) {
+
+       err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
+       if (err) {
+               printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+                      fwname, err);
+               return err;
+       }
+       if (fw->size < 4) {
+               printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+                      fw->size, fwname);
+               release_firmware(fw);
+               return -EINVAL;
+       }
+       chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
+                (fw->data[1] << 8) | fw->data[0];
+       ASC_DBG(1, "_asc_mcode_chksum 0x%lx\n", (ulong)chksum);
+       if (AscLoadMicroCode(iop_base, 0, &fw->data[4],
+                            fw->size - 4) != chksum) {
                asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
+               release_firmware(fw);
                return warn_code;
        }
+       release_firmware(fw);
        warn_code |= AscInitMicroCodeVar(asc_dvc);
        asc_dvc->init_state |= ASC_INIT_STATE_END_LOAD_MC;
        AscEnableInterrupt(iop_base);
@@ -6417,8 +4827,8 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
  *
  * Returns 0 or an error if the checksum doesn't match
  */
-static int AdvLoadMicrocode(AdvPortAddr iop_base, unsigned char *buf, int size,
-                           int memsize, int chksum)
+static int AdvLoadMicrocode(AdvPortAddr iop_base, const unsigned char *buf,
+                           int size, int memsize, int chksum)
 {
        int i, j, end, len = 0;
        ADV_DCNT sum;
@@ -6627,6 +5037,8 @@ static int AdvResetSB(ADV_DVC_VAR *asc_dvc)
  */
 static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
 {
+       const struct firmware *fw;
+       const char fwname[] = "advansys/3550.bin";
        AdvPortAddr iop_base;
        ushort warn_code;
        int begin_addr;
@@ -6634,6 +5046,8 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
        ushort code_sum;
        int word;
        int i;
+       int err;
+       unsigned long chksum;
        ushort scsi_cfg1;
        uchar tid;
        ushort bios_mem[ASC_MC_BIOSLEN / 2];    /* BIOS RISC Memory 0x40-0x8F. */
@@ -6692,9 +5106,24 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
                                max_cmd[tid]);
        }
 
-       asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc3550_buf,
-                                       _adv_asc3550_size, ADV_3550_MEMSIZE,
-                                       _adv_asc3550_chksum);
+       err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
+       if (err) {
+               printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+                      fwname, err);
+               return err;
+       }
+       if (fw->size < 4) {
+               printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+                      fw->size, fwname);
+               release_firmware(fw);
+               return -EINVAL;
+       }
+       chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
+                (fw->data[1] << 8) | fw->data[0];
+       asc_dvc->err_code = AdvLoadMicrocode(iop_base, &fw->data[4],
+                                            fw->size - 4, ADV_3550_MEMSIZE,
+                                            chksum);
+       release_firmware(fw);
        if (asc_dvc->err_code)
                return ADV_ERROR;
 
@@ -7065,6 +5494,8 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
  */
 static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
 {
+       const struct firmware *fw;
+       const char fwname[] = "advansys/38C0800.bin";
        AdvPortAddr iop_base;
        ushort warn_code;
        int begin_addr;
@@ -7072,6 +5503,8 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
        ushort code_sum;
        int word;
        int i;
+       int err;
+       unsigned long chksum;
        ushort scsi_cfg1;
        uchar byte;
        uchar tid;
@@ -7187,9 +5620,24 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
        /* We need to reset back to normal mode after LRAM test passes. */
        AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
 
-       asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc38C0800_buf,
-                                _adv_asc38C0800_size, ADV_38C0800_MEMSIZE,
-                                _adv_asc38C0800_chksum);
+       err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
+       if (err) {
+               printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+                      fwname, err);
+               return err;
+       }
+       if (fw->size < 4) {
+               printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+                      fw->size, fwname);
+               release_firmware(fw);
+               return -EINVAL;
+       }
+       chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
+                (fw->data[1] << 8) | fw->data[0];
+       asc_dvc->err_code = AdvLoadMicrocode(iop_base, &fw->data[4],
+                                            fw->size - 4, ADV_38C0800_MEMSIZE,
+                                            chksum);
+       release_firmware(fw);
        if (asc_dvc->err_code)
                return ADV_ERROR;
 
@@ -7544,6 +5992,8 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
  */
 static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
 {
+       const struct firmware *fw;
+       const char fwname[] = "advansys/38C1600.bin";
        AdvPortAddr iop_base;
        ushort warn_code;
        int begin_addr;
@@ -7551,6 +6001,8 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
        ushort code_sum;
        long word;
        int i;
+       int err;
+       unsigned long chksum;
        ushort scsi_cfg1;
        uchar byte;
        uchar tid;
@@ -7668,9 +6120,24 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
        /* We need to reset back to normal mode after LRAM test passes. */
        AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
 
-       asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc38C1600_buf,
-                                _adv_asc38C1600_size, ADV_38C1600_MEMSIZE,
-                                _adv_asc38C1600_chksum);
+       err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
+       if (err) {
+               printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+                      fwname, err);
+               return err;
+       }
+       if (fw->size < 4) {
+               printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+                      fw->size, fwname);
+               release_firmware(fw);
+               return -EINVAL;
+       }
+       chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
+                (fw->data[1] << 8) | fw->data[0];
+       asc_dvc->err_code = AdvLoadMicrocode(iop_base, &fw->data[4],
+                                            fw->size - 4, ADV_38C1600_MEMSIZE,
+                                            chksum);
+       release_firmware(fw);
        if (asc_dvc->err_code)
                return ADV_ERROR;
 
@@ -14353,3 +12820,7 @@ module_init(advansys_init);
 module_exit(advansys_exit);
 
 MODULE_LICENSE("GPL");
+MODULE_FIRMWARE("advansys/mcode.bin");
+MODULE_FIRMWARE("advansys/3550.bin");
+MODULE_FIRMWARE("advansys/38C0800.bin");
+MODULE_FIRMWARE("advansys/38C1600.bin");
index bdad54ec088cc8d0dd6970c7f1cd9618859c6f6a..63b521d615f2bd992ffb030cbb2f04f2b817e18e 100644 (file)
@@ -1034,7 +1034,7 @@ ahd_intr(struct ahd_softc *ahd)
 }
 
 /******************************** Private Inlines *****************************/
-static __inline void
+static inline void
 ahd_assert_atn(struct ahd_softc *ahd)
 {
        ahd_outb(ahd, SCSISIGO, ATNO);
@@ -1069,7 +1069,7 @@ ahd_currently_packetized(struct ahd_softc *ahd)
        return (packetized);
 }
 
-static __inline int
+static inline int
 ahd_set_active_fifo(struct ahd_softc *ahd)
 {
        u_int active_fifo;
@@ -1086,7 +1086,7 @@ ahd_set_active_fifo(struct ahd_softc *ahd)
        }
 }
 
-static __inline void
+static inline void
 ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl)
 {
        ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL);
@@ -1096,7 +1096,7 @@ ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl)
  * Determine whether the sequencer reported a residual
  * for this SCB/transaction.
  */
-static __inline void
+static inline void
 ahd_update_residual(struct ahd_softc *ahd, struct scb *scb)
 {
        uint32_t sgptr;
@@ -1106,7 +1106,7 @@ ahd_update_residual(struct ahd_softc *ahd, struct scb *scb)
                ahd_calc_residual(ahd, scb);
 }
 
-static __inline void
+static inline void
 ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb)
 {
        uint32_t sgptr;
@@ -7987,7 +7987,7 @@ ahd_resume(struct ahd_softc *ahd)
  * scbid that should be restored once manipualtion
  * of the TCL entry is complete.
  */
-static __inline u_int
+static inline u_int
 ahd_index_busy_tcl(struct ahd_softc *ahd, u_int *saved_scbid, u_int tcl)
 {
        /*
index 5f12cf9d99d071344b6929beeb11c3fb11edbe33..09335a3c8691bf364f5b404158dff89218ea45ed 100644 (file)
 #define _AIC79XX_INLINE_H_
 
 /******************************** Debugging ***********************************/
-static __inline char *ahd_name(struct ahd_softc *ahd);
+static inline char *ahd_name(struct ahd_softc *ahd);
 
-static __inline char *
-ahd_name(struct ahd_softc *ahd)
+static inline char *ahd_name(struct ahd_softc *ahd)
 {
        return (ahd->name);
 }
 
 /************************ Sequencer Execution Control *************************/
-static __inline void ahd_known_modes(struct ahd_softc *ahd,
+static inline void ahd_known_modes(struct ahd_softc *ahd,
                                     ahd_mode src, ahd_mode dst);
-static __inline ahd_mode_state ahd_build_mode_state(struct ahd_softc *ahd,
+static inline ahd_mode_state ahd_build_mode_state(struct ahd_softc *ahd,
                                                    ahd_mode src,
                                                    ahd_mode dst);
-static __inline void ahd_extract_mode_state(struct ahd_softc *ahd,
+static inline void ahd_extract_mode_state(struct ahd_softc *ahd,
                                            ahd_mode_state state,
                                            ahd_mode *src, ahd_mode *dst);
 
@@ -73,7 +72,7 @@ int  ahd_is_paused(struct ahd_softc *ahd);
 void ahd_pause(struct ahd_softc *ahd);
 void ahd_unpause(struct ahd_softc *ahd);
 
-static __inline void
+static inline void
 ahd_known_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
 {
        ahd->src_mode = src;
@@ -82,13 +81,13 @@ ahd_known_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
        ahd->saved_dst_mode = dst;
 }
 
-static __inline ahd_mode_state
+static inline ahd_mode_state
 ahd_build_mode_state(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
 {
        return ((src << SRC_MODE_SHIFT) | (dst << DST_MODE_SHIFT));
 }
 
-static __inline void
+static inline void
 ahd_extract_mode_state(struct ahd_softc *ahd, ahd_mode_state state,
                       ahd_mode *src, ahd_mode *dst)
 {
@@ -102,13 +101,12 @@ void      *ahd_sg_setup(struct ahd_softc *ahd, struct scb *scb,
                      bus_size_t len, int last);
 
 /************************** Memory mapping routines ***************************/
-static __inline size_t ahd_sg_size(struct ahd_softc *ahd);
+static inline size_t   ahd_sg_size(struct ahd_softc *ahd);
 
 void   ahd_sync_sglist(struct ahd_softc *ahd,
                        struct scb *scb, int op);
 
-static __inline size_t
-ahd_sg_size(struct ahd_softc *ahd)
+static inline size_t ahd_sg_size(struct ahd_softc *ahd)
 {
        if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0)
                return (sizeof(struct ahd_dma64_seg));
@@ -141,11 +139,9 @@ struct scb *
        ahd_lookup_scb(struct ahd_softc *ahd, u_int tag);
 void   ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb);
 
-static __inline uint8_t *
-                       ahd_get_sense_buf(struct ahd_softc *ahd,
+static inline uint8_t *ahd_get_sense_buf(struct ahd_softc *ahd,
                                          struct scb *scb);
-static __inline uint32_t
-                       ahd_get_sense_bufaddr(struct ahd_softc *ahd,
+static inline uint32_t ahd_get_sense_bufaddr(struct ahd_softc *ahd,
                                              struct scb *scb);
 
 #if 0 /* unused */
@@ -158,13 +154,13 @@ do {                                                              \
 
 #endif
 
-static __inline uint8_t *
+static inline uint8_t *
 ahd_get_sense_buf(struct ahd_softc *ahd, struct scb *scb)
 {
        return (scb->sense_data);
 }
 
-static __inline uint32_t
+static inline uint32_t
 ahd_get_sense_bufaddr(struct ahd_softc *ahd, struct scb *scb)
 {
        return (scb->sense_busaddr);
index 8d6612c19922fe29cfd340992550627131b9897c..55c1fe07969f7c9713c6a45bde24ec3917cb6d56 100644 (file)
@@ -395,19 +395,19 @@ struct info_str {
 };
 
 /******************************** Locking *************************************/
-static __inline void
+static inline void
 ahd_lockinit(struct ahd_softc *ahd)
 {
        spin_lock_init(&ahd->platform_data->spin_lock);
 }
 
-static __inline void
+static inline void
 ahd_lock(struct ahd_softc *ahd, unsigned long *flags)
 {
        spin_lock_irqsave(&ahd->platform_data->spin_lock, *flags);
 }
 
-static __inline void
+static inline void
 ahd_unlock(struct ahd_softc *ahd, unsigned long *flags)
 {
        spin_unlock_irqrestore(&ahd->platform_data->spin_lock, *flags);
@@ -490,29 +490,29 @@ void                       ahd_pci_write_config(ahd_dev_softc_t pci,
                                          int reg, uint32_t value,
                                          int width);
 
-static __inline int ahd_get_pci_function(ahd_dev_softc_t);
-static __inline int
+static inline int ahd_get_pci_function(ahd_dev_softc_t);
+static inline int
 ahd_get_pci_function(ahd_dev_softc_t pci)
 {
        return (PCI_FUNC(pci->devfn));
 }
 
-static __inline int ahd_get_pci_slot(ahd_dev_softc_t);
-static __inline int
+static inline int ahd_get_pci_slot(ahd_dev_softc_t);
+static inline int
 ahd_get_pci_slot(ahd_dev_softc_t pci)
 {
        return (PCI_SLOT(pci->devfn));
 }
 
-static __inline int ahd_get_pci_bus(ahd_dev_softc_t);
-static __inline int
+static inline int ahd_get_pci_bus(ahd_dev_softc_t);
+static inline int
 ahd_get_pci_bus(ahd_dev_softc_t pci)
 {
        return (pci->bus->number);
 }
 
-static __inline void ahd_flush_device_writes(struct ahd_softc *);
-static __inline void
+static inline void ahd_flush_device_writes(struct ahd_softc *);
+static inline void
 ahd_flush_device_writes(struct ahd_softc *ahd)
 {
        /* XXX Is this sufficient for all architectures??? */
@@ -524,81 +524,81 @@ int       ahd_linux_proc_info(struct Scsi_Host *, char *, char **,
                            off_t, int, int);
 
 /*********************** Transaction Access Wrappers **************************/
-static __inline void ahd_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t);
-static __inline void ahd_set_transaction_status(struct scb *, uint32_t);
-static __inline void ahd_cmd_set_scsi_status(struct scsi_cmnd *, uint32_t);
-static __inline void ahd_set_scsi_status(struct scb *, uint32_t);
-static __inline uint32_t ahd_cmd_get_transaction_status(struct scsi_cmnd *cmd);
-static __inline uint32_t ahd_get_transaction_status(struct scb *);
-static __inline uint32_t ahd_cmd_get_scsi_status(struct scsi_cmnd *cmd);
-static __inline uint32_t ahd_get_scsi_status(struct scb *);
-static __inline void ahd_set_transaction_tag(struct scb *, int, u_int);
-static __inline u_long ahd_get_transfer_length(struct scb *);
-static __inline int ahd_get_transfer_dir(struct scb *);
-static __inline void ahd_set_residual(struct scb *, u_long);
-static __inline void ahd_set_sense_residual(struct scb *scb, u_long resid);
-static __inline u_long ahd_get_residual(struct scb *);
-static __inline u_long ahd_get_sense_residual(struct scb *);
-static __inline int ahd_perform_autosense(struct scb *);
-static __inline uint32_t ahd_get_sense_bufsize(struct ahd_softc *,
+static inline void ahd_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t);
+static inline void ahd_set_transaction_status(struct scb *, uint32_t);
+static inline void ahd_cmd_set_scsi_status(struct scsi_cmnd *, uint32_t);
+static inline void ahd_set_scsi_status(struct scb *, uint32_t);
+static inline uint32_t ahd_cmd_get_transaction_status(struct scsi_cmnd *cmd);
+static inline uint32_t ahd_get_transaction_status(struct scb *);
+static inline uint32_t ahd_cmd_get_scsi_status(struct scsi_cmnd *cmd);
+static inline uint32_t ahd_get_scsi_status(struct scb *);
+static inline void ahd_set_transaction_tag(struct scb *, int, u_int);
+static inline u_long ahd_get_transfer_length(struct scb *);
+static inline int ahd_get_transfer_dir(struct scb *);
+static inline void ahd_set_residual(struct scb *, u_long);
+static inline void ahd_set_sense_residual(struct scb *scb, u_long resid);
+static inline u_long ahd_get_residual(struct scb *);
+static inline u_long ahd_get_sense_residual(struct scb *);
+static inline int ahd_perform_autosense(struct scb *);
+static inline uint32_t ahd_get_sense_bufsize(struct ahd_softc *,
                                               struct scb *);
-static __inline void ahd_notify_xfer_settings_change(struct ahd_softc *,
+static inline void ahd_notify_xfer_settings_change(struct ahd_softc *,
                                                     struct ahd_devinfo *);
-static __inline void ahd_platform_scb_free(struct ahd_softc *ahd,
+static inline void ahd_platform_scb_free(struct ahd_softc *ahd,
                                           struct scb *scb);
-static __inline void ahd_freeze_scb(struct scb *scb);
+static inline void ahd_freeze_scb(struct scb *scb);
 
-static __inline
+static inline
 void ahd_cmd_set_transaction_status(struct scsi_cmnd *cmd, uint32_t status)
 {
        cmd->result &= ~(CAM_STATUS_MASK << 16);
        cmd->result |= status << 16;
 }
 
-static __inline
+static inline
 void ahd_set_transaction_status(struct scb *scb, uint32_t status)
 {
        ahd_cmd_set_transaction_status(scb->io_ctx,status);
 }
 
-static __inline
+static inline
 void ahd_cmd_set_scsi_status(struct scsi_cmnd *cmd, uint32_t status)
 {
        cmd->result &= ~0xFFFF;
        cmd->result |= status;
 }
 
-static __inline
+static inline
 void ahd_set_scsi_status(struct scb *scb, uint32_t status)
 {
        ahd_cmd_set_scsi_status(scb->io_ctx, status);
 }
 
-static __inline
+static inline
 uint32_t ahd_cmd_get_transaction_status(struct scsi_cmnd *cmd)
 {
        return ((cmd->result >> 16) & CAM_STATUS_MASK);
 }
 
-static __inline
+static inline
 uint32_t ahd_get_transaction_status(struct scb *scb)
 {
        return (ahd_cmd_get_transaction_status(scb->io_ctx));
 }
 
-static __inline
+static inline
 uint32_t ahd_cmd_get_scsi_status(struct scsi_cmnd *cmd)
 {
        return (cmd->result & 0xFFFF);
 }
 
-static __inline
+static inline
 uint32_t ahd_get_scsi_status(struct scb *scb)
 {
        return (ahd_cmd_get_scsi_status(scb->io_ctx));
 }
 
-static __inline
+static inline
 void ahd_set_transaction_tag(struct scb *scb, int enabled, u_int type)
 {
        /*
@@ -607,43 +607,43 @@ void ahd_set_transaction_tag(struct scb *scb, int enabled, u_int type)
         */
 }
 
-static __inline
+static inline
 u_long ahd_get_transfer_length(struct scb *scb)
 {
        return (scb->platform_data->xfer_len);
 }
 
-static __inline
+static inline
 int ahd_get_transfer_dir(struct scb *scb)
 {
        return (scb->io_ctx->sc_data_direction);
 }
 
-static __inline
+static inline
 void ahd_set_residual(struct scb *scb, u_long resid)
 {
        scsi_set_resid(scb->io_ctx, resid);
 }
 
-static __inline
+static inline
 void ahd_set_sense_residual(struct scb *scb, u_long resid)
 {
        scb->platform_data->sense_resid = resid;
 }
 
-static __inline
+static inline
 u_long ahd_get_residual(struct scb *scb)
 {
        return scsi_get_resid(scb->io_ctx);
 }
 
-static __inline
+static inline
 u_long ahd_get_sense_residual(struct scb *scb)
 {
        return (scb->platform_data->sense_resid);
 }
 
-static __inline
+static inline
 int ahd_perform_autosense(struct scb *scb)
 {
        /*
@@ -654,20 +654,20 @@ int ahd_perform_autosense(struct scb *scb)
        return (1);
 }
 
-static __inline uint32_t
+static inline uint32_t
 ahd_get_sense_bufsize(struct ahd_softc *ahd, struct scb *scb)
 {
        return (sizeof(struct scsi_sense_data));
 }
 
-static __inline void
+static inline void
 ahd_notify_xfer_settings_change(struct ahd_softc *ahd,
                                struct ahd_devinfo *devinfo)
 {
        /* Nothing to do here for linux */
 }
 
-static __inline void
+static inline void
 ahd_platform_scb_free(struct ahd_softc *ahd, struct scb *scb)
 {
        ahd->flags &= ~AHD_RESOURCE_SHORTAGE;
@@ -678,7 +678,7 @@ void        ahd_platform_free(struct ahd_softc *ahd);
 void   ahd_platform_init(struct ahd_softc *ahd);
 void   ahd_platform_freeze_devq(struct ahd_softc *ahd, struct scb *scb);
 
-static __inline void
+static inline void
 ahd_freeze_scb(struct scb *scb)
 {
        if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {
index 6593056867f6d33b9ac472b49f19ff56d9dcd96f..8f686122d54ecc61104b5549f341c97e7e346fb5 100644 (file)
@@ -194,16 +194,16 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (sizeof(dma_addr_t) > 4) {
                const u64 required_mask = dma_get_required_mask(dev);
 
-               if (required_mask > DMA_39BIT_MASK &&
-                   dma_set_mask(dev, DMA_64BIT_MASK) == 0)
+               if (required_mask > DMA_BIT_MASK(39) &&
+                   dma_set_mask(dev, DMA_BIT_MASK(64)) == 0)
                        ahd->flags |= AHD_64BIT_ADDRESSING;
-               else if (required_mask > DMA_32BIT_MASK &&
-                        dma_set_mask(dev, DMA_39BIT_MASK) == 0)
+               else if (required_mask > DMA_BIT_MASK(32) &&
+                        dma_set_mask(dev, DMA_BIT_MASK(39)) == 0)
                        ahd->flags |= AHD_39BIT_ADDRESSING;
                else
-                       dma_set_mask(dev, DMA_32BIT_MASK);
+                       dma_set_mask(dev, DMA_BIT_MASK(32));
        } else {
-               dma_set_mask(dev, DMA_32BIT_MASK);
+               dma_set_mask(dev, DMA_BIT_MASK(32));
        }
        ahd->dev_softc = pci;
        error = ahd_pci_config(ahd, entry);
index a734d77e880efb2430795442d2e3e4c719259946..90a04a37b4f74dd5b40ce609892cfcc4b13d347d 100644 (file)
@@ -51,7 +51,7 @@
 
 #include "aic79xx_pci.h"
 
-static __inline uint64_t
+static inline uint64_t
 ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
 {
        uint64_t id;
@@ -377,14 +377,12 @@ ahd_pci_config(struct ahd_softc *ahd, const struct ahd_pci_identity *entry)
        error = ahd_init(ahd);
        if (error != 0)
                return (error);
+       ahd->init_level++;
 
        /*
         * Allow interrupts now that we are completely setup.
         */
-       error = ahd_pci_map_int(ahd);
-       if (!error)
-               ahd->init_level++;
-       return error;
+       return ahd_pci_map_int(ahd);
 }
 
 #ifdef CONFIG_PM
index 09bf2f4d78d58d953a5b025bf3201aaf8fd76441..0b57b783ef417f484c14334a87db1f6ed0fb9358 100644 (file)
@@ -55,10 +55,9 @@ void ahc_sync_sglist(struct ahc_softc *ahc,
                        struct scb *scb, int op);
 
 /******************************** Debugging ***********************************/
-static __inline char *ahc_name(struct ahc_softc *ahc);
+static inline char *ahc_name(struct ahc_softc *ahc);
 
-static __inline char *
-ahc_name(struct ahc_softc *ahc)
+static inline char *ahc_name(struct ahc_softc *ahc)
 {
        return (ahc->name);
 }
index 3f7238db35e5f129b693ed356e33d37cb6f9d49f..56f07e527b4871fde92ae60e5f6cdcf0581e40d6 100644 (file)
@@ -230,7 +230,7 @@ int ahc_dmamap_unload(struct ahc_softc *, bus_dma_tag_t, bus_dmamap_t);
 #include "aic7xxx.h"
 
 /***************************** Timer Facilities *******************************/
-static __inline void
+static inline void
 ahc_scb_timer_reset(struct scb *scb, u_int usec)
 {
 }
@@ -401,19 +401,19 @@ struct info_str {
 /******************************** Locking *************************************/
 /* Lock protecting internal data structures */
 
-static __inline void
+static inline void
 ahc_lockinit(struct ahc_softc *ahc)
 {
        spin_lock_init(&ahc->platform_data->spin_lock);
 }
 
-static __inline void
+static inline void
 ahc_lock(struct ahc_softc *ahc, unsigned long *flags)
 {
        spin_lock_irqsave(&ahc->platform_data->spin_lock, *flags);
 }
 
-static __inline void
+static inline void
 ahc_unlock(struct ahc_softc *ahc, unsigned long *flags)
 {
        spin_unlock_irqrestore(&ahc->platform_data->spin_lock, *flags);
@@ -493,22 +493,22 @@ void                       ahc_pci_write_config(ahc_dev_softc_t pci,
                                              int reg, uint32_t value,
                                              int width);
 
-static __inline int ahc_get_pci_function(ahc_dev_softc_t);
-static __inline int
+static inline int ahc_get_pci_function(ahc_dev_softc_t);
+static inline int
 ahc_get_pci_function(ahc_dev_softc_t pci)
 {
        return (PCI_FUNC(pci->devfn));
 }
 
-static __inline int ahc_get_pci_slot(ahc_dev_softc_t);
-static __inline int
+static inline int ahc_get_pci_slot(ahc_dev_softc_t);
+static inline int
 ahc_get_pci_slot(ahc_dev_softc_t pci)
 {
        return (PCI_SLOT(pci->devfn));
 }
 
-static __inline int ahc_get_pci_bus(ahc_dev_softc_t);
-static __inline int
+static inline int ahc_get_pci_bus(ahc_dev_softc_t);
+static inline int
 ahc_get_pci_bus(ahc_dev_softc_t pci)
 {
        return (pci->bus->number);
@@ -521,8 +521,8 @@ static inline void ahc_linux_pci_exit(void) {
 }
 #endif
 
-static __inline void ahc_flush_device_writes(struct ahc_softc *);
-static __inline void
+static inline void ahc_flush_device_writes(struct ahc_softc *);
+static inline void
 ahc_flush_device_writes(struct ahc_softc *ahc)
 {
        /* XXX Is this sufficient for all architectures??? */
@@ -535,81 +535,81 @@ int       ahc_linux_proc_info(struct Scsi_Host *, char *, char **,
 
 /*************************** Domain Validation ********************************/
 /*********************** Transaction Access Wrappers *************************/
-static __inline void ahc_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t);
-static __inline void ahc_set_transaction_status(struct scb *, uint32_t);
-static __inline void ahc_cmd_set_scsi_status(struct scsi_cmnd *, uint32_t);
-static __inline void ahc_set_scsi_status(struct scb *, uint32_t);
-static __inline uint32_t ahc_cmd_get_transaction_status(struct scsi_cmnd *cmd);
-static __inline uint32_t ahc_get_transaction_status(struct scb *);
-static __inline uint32_t ahc_cmd_get_scsi_status(struct scsi_cmnd *cmd);
-static __inline uint32_t ahc_get_scsi_status(struct scb *);
-static __inline void ahc_set_transaction_tag(struct scb *, int, u_int);
-static __inline u_long ahc_get_transfer_length(struct scb *);
-static __inline int ahc_get_transfer_dir(struct scb *);
-static __inline void ahc_set_residual(struct scb *, u_long);
-static __inline void ahc_set_sense_residual(struct scb *scb, u_long resid);
-static __inline u_long ahc_get_residual(struct scb *);
-static __inline u_long ahc_get_sense_residual(struct scb *);
-static __inline int ahc_perform_autosense(struct scb *);
-static __inline uint32_t ahc_get_sense_bufsize(struct ahc_softc *,
+static inline void ahc_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t);
+static inline void ahc_set_transaction_status(struct scb *, uint32_t);
+static inline void ahc_cmd_set_scsi_status(struct scsi_cmnd *, uint32_t);
+static inline void ahc_set_scsi_status(struct scb *, uint32_t);
+static inline uint32_t ahc_cmd_get_transaction_status(struct scsi_cmnd *cmd);
+static inline uint32_t ahc_get_transaction_status(struct scb *);
+static inline uint32_t ahc_cmd_get_scsi_status(struct scsi_cmnd *cmd);
+static inline uint32_t ahc_get_scsi_status(struct scb *);
+static inline void ahc_set_transaction_tag(struct scb *, int, u_int);
+static inline u_long ahc_get_transfer_length(struct scb *);
+static inline int ahc_get_transfer_dir(struct scb *);
+static inline void ahc_set_residual(struct scb *, u_long);
+static inline void ahc_set_sense_residual(struct scb *scb, u_long resid);
+static inline u_long ahc_get_residual(struct scb *);
+static inline u_long ahc_get_sense_residual(struct scb *);
+static inline int ahc_perform_autosense(struct scb *);
+static inline uint32_t ahc_get_sense_bufsize(struct ahc_softc *,
                                               struct scb *);
-static __inline void ahc_notify_xfer_settings_change(struct ahc_softc *,
+static inline void ahc_notify_xfer_settings_change(struct ahc_softc *,
                                                     struct ahc_devinfo *);
-static __inline void ahc_platform_scb_free(struct ahc_softc *ahc,
+static inline void ahc_platform_scb_free(struct ahc_softc *ahc,
                                           struct scb *scb);
-static __inline void ahc_freeze_scb(struct scb *scb);
+static inline void ahc_freeze_scb(struct scb *scb);
 
-static __inline
+static inline
 void ahc_cmd_set_transaction_status(struct scsi_cmnd *cmd, uint32_t status)
 {
        cmd->result &= ~(CAM_STATUS_MASK << 16);
        cmd->result |= status << 16;
 }
 
-static __inline
+static inline
 void ahc_set_transaction_status(struct scb *scb, uint32_t status)
 {
        ahc_cmd_set_transaction_status(scb->io_ctx,status);
 }
 
-static __inline
+static inline
 void ahc_cmd_set_scsi_status(struct scsi_cmnd *cmd, uint32_t status)
 {
        cmd->result &= ~0xFFFF;
        cmd->result |= status;
 }
 
-static __inline
+static inline
 void ahc_set_scsi_status(struct scb *scb, uint32_t status)
 {
        ahc_cmd_set_scsi_status(scb->io_ctx, status);
 }
 
-static __inline
+static inline
 uint32_t ahc_cmd_get_transaction_status(struct scsi_cmnd *cmd)
 {
        return ((cmd->result >> 16) & CAM_STATUS_MASK);
 }
 
-static __inline
+static inline
 uint32_t ahc_get_transaction_status(struct scb *scb)
 {
        return (ahc_cmd_get_transaction_status(scb->io_ctx));
 }
 
-static __inline
+static inline
 uint32_t ahc_cmd_get_scsi_status(struct scsi_cmnd *cmd)
 {
        return (cmd->result & 0xFFFF);
 }
 
-static __inline
+static inline
 uint32_t ahc_get_scsi_status(struct scb *scb)
 {
        return (ahc_cmd_get_scsi_status(scb->io_ctx));
 }
 
-static __inline
+static inline
 void ahc_set_transaction_tag(struct scb *scb, int enabled, u_int type)
 {
        /*
@@ -618,43 +618,43 @@ void ahc_set_transaction_tag(struct scb *scb, int enabled, u_int type)
         */
 }
 
-static __inline
+static inline
 u_long ahc_get_transfer_length(struct scb *scb)
 {
        return (scb->platform_data->xfer_len);
 }
 
-static __inline
+static inline
 int ahc_get_transfer_dir(struct scb *scb)
 {
        return (scb->io_ctx->sc_data_direction);
 }
 
-static __inline
+static inline
 void ahc_set_residual(struct scb *scb, u_long resid)
 {
        scsi_set_resid(scb->io_ctx, resid);
 }
 
-static __inline
+static inline
 void ahc_set_sense_residual(struct scb *scb, u_long resid)
 {
        scb->platform_data->sense_resid = resid;
 }
 
-static __inline
+static inline
 u_long ahc_get_residual(struct scb *scb)
 {
        return scsi_get_resid(scb->io_ctx);
 }
 
-static __inline
+static inline
 u_long ahc_get_sense_residual(struct scb *scb)
 {
        return (scb->platform_data->sense_resid);
 }
 
-static __inline
+static inline
 int ahc_perform_autosense(struct scb *scb)
 {
        /*
@@ -665,20 +665,20 @@ int ahc_perform_autosense(struct scb *scb)
        return (1);
 }
 
-static __inline uint32_t
+static inline uint32_t
 ahc_get_sense_bufsize(struct ahc_softc *ahc, struct scb *scb)
 {
        return (sizeof(struct scsi_sense_data));
 }
 
-static __inline void
+static inline void
 ahc_notify_xfer_settings_change(struct ahc_softc *ahc,
                                struct ahc_devinfo *devinfo)
 {
        /* Nothing to do here for linux */
 }
 
-static __inline void
+static inline void
 ahc_platform_scb_free(struct ahc_softc *ahc, struct scb *scb)
 {
 }
@@ -687,7 +687,7 @@ int ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg);
 void   ahc_platform_free(struct ahc_softc *ahc);
 void   ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb);
 
-static __inline void
+static inline void
 ahc_freeze_scb(struct scb *scb)
 {
        if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {
index 00f5b98685749ae567f2e63c444407f6fe644c61..78fc70c24e078638478b8f9defd9dbd801eaea4f 100644 (file)
@@ -241,10 +241,10 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (sizeof(dma_addr_t) > 4
            && ahc->features & AHC_LARGE_SCBS
            && dma_set_mask(dev, mask_39bit) == 0
-           && dma_get_required_mask(dev) > DMA_32BIT_MASK) {
+           && dma_get_required_mask(dev) > DMA_BIT_MASK(32)) {
                ahc->flags |= AHC_39BIT_ADDRESSING;
        } else {
-               if (dma_set_mask(dev, DMA_32BIT_MASK)) {
+               if (dma_set_mask(dev, DMA_BIT_MASK(32))) {
                        ahc_free(ahc);
                        printk(KERN_WARNING "aic7xxx: No suitable DMA available.\n");
                        return (-ENODEV);
index c07cb6eebb0294cac8ae9e93820e14562719c9fd..27014b9de1262273cdf0341ed68ac092292ec177 100644 (file)
@@ -54,7 +54,7 @@
 
 #include "aic7xxx_pci.h"
 
-static __inline uint64_t
+static inline uint64_t
 ahc_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
 {
        uint64_t id;
@@ -960,16 +960,12 @@ ahc_pci_config(struct ahc_softc *ahc, const struct ahc_pci_identity *entry)
        error = ahc_init(ahc);
        if (error != 0)
                return (error);
+       ahc->init_level++;
 
        /*
         * Allow interrupts now that we are completely setup.
         */
-       error = ahc_pci_map_int(ahc);
-       if (error != 0)
-               return (error);
-
-       ahc->init_level++;
-       return (0);
+       return ahc_pci_map_int(ahc);
 }
 
 /*
index 3bfbf0fe1ec2569f1d4b2cea9828f4f058841572..f8fd198aafbcd02fa11d035423e9bce10542cc45 100644 (file)
@@ -133,7 +133,7 @@ struct scsi_sense_data
 #define SCSI_STATUS_TASK_ABORTED       0x40
 
 /************************* Large Disk Handling ********************************/
-static __inline int
+static inline int
 aic_sector_div(sector_t capacity, int heads, int sectors)
 {
        /* ugly, ugly sector_div calling convention.. */
@@ -141,7 +141,7 @@ aic_sector_div(sector_t capacity, int heads, int sectors)
        return (int)capacity;
 }
 
-static __inline uint32_t
+static inline uint32_t
 scsi_4btoul(uint8_t *bytes)
 {
        uint32_t rv;
index 2a730c470f6265abf3d1add4bf77bb8eb4280b96..996f7224f90e2d32e39d9a109b5da16a814237e1 100644 (file)
@@ -790,11 +790,11 @@ static int __devinit asd_pci_probe(struct pci_dev *dev,
                goto Err_remove;
 
        err = -ENODEV;
-       if (!pci_set_dma_mask(dev, DMA_64BIT_MASK)
-           && !pci_set_consistent_dma_mask(dev, DMA_64BIT_MASK))
+       if (!pci_set_dma_mask(dev, DMA_BIT_MASK(64))
+           && !pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(64)))
                ;
-       else if (!pci_set_dma_mask(dev, DMA_32BIT_MASK)
-                && !pci_set_consistent_dma_mask(dev, DMA_32BIT_MASK))
+       else if (!pci_set_dma_mask(dev, DMA_BIT_MASK(32))
+                && !pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(32)))
                ;
        else {
                asd_printk("no suitable DMA mask for %s\n", pci_name(dev));
index 106c04d2d79374e68578c9abfdaf33231ebef3c0..80aac01b5a6f31c2f18e9eb9ae63ae9a21a0425d 100644 (file)
@@ -393,9 +393,9 @@ static int arcmsr_probe(struct pci_dev *pdev,
        acb = (struct AdapterControlBlock *)host->hostdata;
        memset(acb, 0, sizeof (struct AdapterControlBlock));
 
-       error = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+       error = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
        if (error) {
-               error = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               error = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (error) {
                        printk(KERN_WARNING
                               "scsi%d: No suitable DMA mask available\n",
index 20ca0a6374b56a51f52777b18323aecb2e1a825f..b137e561f5bc715951145592d5569bae80e19893 100644 (file)
@@ -2568,7 +2568,7 @@ static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (pci_enable_device(pdev))
                goto err_eio;
 
-        if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+        if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                 printk(KERN_INFO "atp870u: use 32bit DMA mask.\n");
         } else {
                 printk(KERN_ERR "atp870u: DMA mask required but not available.\n");
index ee7d6d2f9c3bf089eed0682ad24ef689d067c4d8..25a2032bfa2615c466de3dc9bcc1f2fbd56e0ec6 100644 (file)
@@ -1,4 +1,4 @@
 EXTRA_CFLAGS += -I$(TOPDIR)/drivers/net/cxgb3
 
-cxgb3i-y := cxgb3i_init.o cxgb3i_iscsi.o cxgb3i_pdu.o cxgb3i_offload.o
-obj-$(CONFIG_SCSI_CXGB3_ISCSI) += cxgb3i_ddp.o cxgb3i.o
+cxgb3i-y := cxgb3i_init.o cxgb3i_iscsi.o cxgb3i_pdu.o cxgb3i_offload.o cxgb3i_ddp.o
+obj-$(CONFIG_SCSI_CXGB3_ISCSI) += cxgb3i.o
index a7cf550b9cca0ba030f7b58a8c81ccc2ef954e41..d362860e75040b9d9b1cbfb4d69186ca7d5185c5 100644 (file)
@@ -66,10 +66,12 @@ struct cxgb3i_hba {
  * @pdev:      pointer to pci dev
  * @hba_cnt:   # of hbas (the same as # of ports)
  * @hba:       all the hbas on this adapter
+ * @flags:     bit flag for adapter event/status
  * @tx_max_size: max. tx packet size supported
  * @rx_max_size: max. rx packet size supported
  * @tag_format: ddp tag format settings
  */
+#define CXGB3I_ADAPTER_FLAG_RESET      0x1
 struct cxgb3i_adapter {
        struct list_head list_head;
        spinlock_t lock;
@@ -78,6 +80,7 @@ struct cxgb3i_adapter {
        unsigned char hba_cnt;
        struct cxgb3i_hba *hba[MAX_NPORTS];
 
+       unsigned int flags;
        unsigned int tx_max_size;
        unsigned int rx_max_size;
 
@@ -137,10 +140,9 @@ struct cxgb3i_task_data {
 int cxgb3i_iscsi_init(void);
 void cxgb3i_iscsi_cleanup(void);
 
-struct cxgb3i_adapter *cxgb3i_adapter_add(struct t3cdev *);
-void cxgb3i_adapter_remove(struct t3cdev *);
-int cxgb3i_adapter_ulp_init(struct cxgb3i_adapter *);
-void cxgb3i_adapter_ulp_cleanup(struct cxgb3i_adapter *);
+struct cxgb3i_adapter *cxgb3i_adapter_find_by_tdev(struct t3cdev *);
+void cxgb3i_adapter_open(struct t3cdev *);
+void cxgb3i_adapter_close(struct t3cdev *);
 
 struct cxgb3i_hba *cxgb3i_hba_find_by_netdev(struct net_device *);
 struct cxgb3i_hba *cxgb3i_hba_host_add(struct cxgb3i_adapter *,
index 4eb6f5593b3e0b0d6b72ab785cacd10339eb8102..d06a661c209f9835eec91e9768aca9a1265473f2 100644 (file)
 
 #include "cxgb3i_ddp.h"
 
-#define DRV_MODULE_NAME         "cxgb3i_ddp"
-#define DRV_MODULE_VERSION      "1.0.0"
-#define DRV_MODULE_RELDATE      "Dec. 1, 2008"
-
-static char version[] =
-       "Chelsio S3xx iSCSI DDP " DRV_MODULE_NAME
-       " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
-
-MODULE_AUTHOR("Karen Xie <kxie@chelsio.com>");
-MODULE_DESCRIPTION("cxgb3i ddp pagepod manager");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(DRV_MODULE_VERSION);
-
 #define ddp_log_error(fmt...) printk(KERN_ERR "cxgb3i_ddp: ERR! " fmt)
 #define ddp_log_warn(fmt...)  printk(KERN_WARNING "cxgb3i_ddp: WARN! " fmt)
 #define ddp_log_info(fmt...)  printk(KERN_INFO "cxgb3i_ddp: " fmt)
@@ -66,9 +53,6 @@ static unsigned char ddp_page_order[DDP_PGIDX_MAX] = {0, 1, 2, 4};
 static unsigned char ddp_page_shift[DDP_PGIDX_MAX] = {12, 13, 14, 16};
 static unsigned char page_idx = DDP_PGIDX_MAX;
 
-static LIST_HEAD(cxgb3i_ddp_list);
-static DEFINE_RWLOCK(cxgb3i_ddp_rwlock);
-
 /*
  * functions to program the pagepod in h/w
  */
@@ -113,8 +97,8 @@ static int set_ddp_map(struct cxgb3i_ddp_info *ddp, struct pagepod_hdr *hdr,
        return 0;
 }
 
-static int clear_ddp_map(struct cxgb3i_ddp_info *ddp, unsigned int idx,
-                        unsigned int npods)
+static void clear_ddp_map(struct cxgb3i_ddp_info *ddp, unsigned int tag,
+                        unsigned int idx, unsigned int npods)
 {
        unsigned int pm_addr = (idx << PPOD_SIZE_SHIFT) + ddp->llimit;
        int i;
@@ -122,13 +106,17 @@ static int clear_ddp_map(struct cxgb3i_ddp_info *ddp, unsigned int idx,
        for (i = 0; i < npods; i++, idx++, pm_addr += PPOD_SIZE) {
                struct sk_buff *skb = ddp->gl_skb[idx];
 
+               if (!skb) {
+                       ddp_log_error("ddp tag 0x%x, 0x%x, %d/%u, skb NULL.\n",
+                                       tag, idx, i, npods);
+                       continue;
+               }
                ddp->gl_skb[idx] = NULL;
                memset((skb->head + sizeof(struct ulp_mem_io)), 0, PPOD_SIZE);
                ulp_mem_io_set_hdr(skb, pm_addr);
                skb->priority = CPL_PRIORITY_CONTROL;
                cxgb3_ofld_send(ddp->tdev, skb);
        }
-       return 0;
 }
 
 static inline int ddp_find_unused_entries(struct cxgb3i_ddp_info *ddp,
@@ -211,7 +199,6 @@ int cxgb3i_ddp_find_page_index(unsigned long pgsz)
        ddp_log_debug("ddp page size 0x%lx not supported.\n", pgsz);
        return DDP_PGIDX_MAX;
 }
-EXPORT_SYMBOL_GPL(cxgb3i_ddp_find_page_index);
 
 static inline void ddp_gl_unmap(struct pci_dev *pdev,
                                struct cxgb3i_gather_list *gl)
@@ -334,7 +321,6 @@ error_out:
        kfree(gl);
        return NULL;
 }
-EXPORT_SYMBOL_GPL(cxgb3i_ddp_make_gl);
 
 /**
  * cxgb3i_ddp_release_gl - release a page buffer list
@@ -348,7 +334,6 @@ void cxgb3i_ddp_release_gl(struct cxgb3i_gather_list *gl,
        ddp_gl_unmap(pdev, gl);
        kfree(gl);
 }
-EXPORT_SYMBOL_GPL(cxgb3i_ddp_release_gl);
 
 /**
  * cxgb3i_ddp_tag_reserve - set up ddp for a data transfer
@@ -430,7 +415,6 @@ unmark_entries:
        ddp_unmark_entries(ddp, idx, npods);
        return err;
 }
-EXPORT_SYMBOL_GPL(cxgb3i_ddp_tag_reserve);
 
 /**
  * cxgb3i_ddp_tag_release - release a ddp tag
@@ -453,22 +437,21 @@ void cxgb3i_ddp_tag_release(struct t3cdev *tdev, u32 tag)
                struct cxgb3i_gather_list *gl = ddp->gl_map[idx];
                unsigned int npods;
 
-               if (!gl) {
-                       ddp_log_error("release ddp 0x%x, idx 0x%x, gl NULL.\n",
-                                     tag, idx);
+               if (!gl || !gl->nelem) {
+                       ddp_log_error("release 0x%x, idx 0x%x, gl 0x%p, %u.\n",
+                                     tag, idx, gl, gl ? gl->nelem : 0);
                        return;
                }
                npods = (gl->nelem + PPOD_PAGES_MAX - 1) >> PPOD_PAGES_SHIFT;
                ddp_log_debug("ddp tag 0x%x, release idx 0x%x, npods %u.\n",
                              tag, idx, npods);
-               clear_ddp_map(ddp, idx, npods);
+               clear_ddp_map(ddp, tag, idx, npods);
                ddp_unmark_entries(ddp, idx, npods);
                cxgb3i_ddp_release_gl(gl, ddp->pdev);
        } else
                ddp_log_error("ddp tag 0x%x, idx 0x%x > max 0x%x.\n",
                              tag, idx, ddp->nppods);
 }
-EXPORT_SYMBOL_GPL(cxgb3i_ddp_tag_release);
 
 static int setup_conn_pgidx(struct t3cdev *tdev, unsigned int tid, int pg_idx,
                            int reply)
@@ -509,7 +492,6 @@ int cxgb3i_setup_conn_host_pagesize(struct t3cdev *tdev, unsigned int tid,
 {
        return setup_conn_pgidx(tdev, tid, page_idx, reply);
 }
-EXPORT_SYMBOL_GPL(cxgb3i_setup_conn_host_pagesize);
 
 /**
  * cxgb3i_setup_conn_pagesize - setup the conn.'s ddp page size
@@ -526,7 +508,6 @@ int cxgb3i_setup_conn_pagesize(struct t3cdev *tdev, unsigned int tid,
 
        return setup_conn_pgidx(tdev, tid, pgidx, reply);
 }
-EXPORT_SYMBOL_GPL(cxgb3i_setup_conn_pagesize);
 
 /**
  * cxgb3i_setup_conn_digest - setup conn. digest setting
@@ -562,26 +543,104 @@ int cxgb3i_setup_conn_digest(struct t3cdev *tdev, unsigned int tid,
        cxgb3_ofld_send(tdev, skb);
        return 0;
 }
-EXPORT_SYMBOL_GPL(cxgb3i_setup_conn_digest);
 
-static int ddp_init(struct t3cdev *tdev)
+
+/**
+ * cxgb3i_adapter_ddp_info - read the adapter's ddp information
+ * @tdev: t3cdev adapter
+ * @tformat: tag format
+ * @txsz: max tx pdu payload size, filled in by this func.
+ * @rxsz: max rx pdu payload size, filled in by this func.
+ * setup the tag format for a given iscsi entity
+ */
+int cxgb3i_adapter_ddp_info(struct t3cdev *tdev,
+                           struct cxgb3i_tag_format *tformat,
+                           unsigned int *txsz, unsigned int *rxsz)
+{
+       struct cxgb3i_ddp_info *ddp;
+       unsigned char idx_bits;
+
+       if (!tformat)
+               return -EINVAL;
+
+       if (!tdev->ulp_iscsi)
+               return -EINVAL;
+
+       ddp = (struct cxgb3i_ddp_info *)tdev->ulp_iscsi;
+
+       idx_bits = 32 - tformat->sw_bits;
+       tformat->rsvd_bits = ddp->idx_bits;
+       tformat->rsvd_shift = PPOD_IDX_SHIFT;
+       tformat->rsvd_mask = (1 << tformat->rsvd_bits) - 1;
+
+       ddp_log_info("tag format: sw %u, rsvd %u,%u, mask 0x%x.\n",
+                     tformat->sw_bits, tformat->rsvd_bits,
+                     tformat->rsvd_shift, tformat->rsvd_mask);
+
+       *txsz = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
+                       ddp->max_txsz - ISCSI_PDU_NONPAYLOAD_LEN);
+       *rxsz = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
+                       ddp->max_rxsz - ISCSI_PDU_NONPAYLOAD_LEN);
+       ddp_log_info("max payload size: %u/%u, %u/%u.\n",
+                    *txsz, ddp->max_txsz, *rxsz, ddp->max_rxsz);
+       return 0;
+}
+
+/**
+ * cxgb3i_ddp_cleanup - release the cxgb3 adapter's ddp resource
+ * @tdev: t3cdev adapter
+ * release all the resource held by the ddp pagepod manager for a given
+ * adapter if needed
+ */
+void cxgb3i_ddp_cleanup(struct t3cdev *tdev)
+{
+       int i = 0;
+       struct cxgb3i_ddp_info *ddp = (struct cxgb3i_ddp_info *)tdev->ulp_iscsi;
+
+       ddp_log_info("t3dev 0x%p, release ddp 0x%p.\n", tdev, ddp);
+
+       if (ddp) {
+               tdev->ulp_iscsi = NULL;
+               while (i < ddp->nppods) {
+                       struct cxgb3i_gather_list *gl = ddp->gl_map[i];
+                       if (gl) {
+                               int npods = (gl->nelem + PPOD_PAGES_MAX - 1)
+                                               >> PPOD_PAGES_SHIFT;
+                               ddp_log_info("t3dev 0x%p, ddp %d + %d.\n",
+                                               tdev, i, npods);
+                               kfree(gl);
+                               ddp_free_gl_skb(ddp, i, npods);
+                               i += npods;
+                       } else
+                               i++;
+               }
+               cxgb3i_free_big_mem(ddp);
+       }
+}
+
+/**
+ * ddp_init - initialize the cxgb3 adapter's ddp resource
+ * @tdev: t3cdev adapter
+ * initialize the ddp pagepod manager for a given adapter
+ */
+static void ddp_init(struct t3cdev *tdev)
 {
        struct cxgb3i_ddp_info *ddp;
        struct ulp_iscsi_info uinfo;
        unsigned int ppmax, bits;
        int i, err;
-       static int vers_printed;
 
-       if (!vers_printed) {
-               printk(KERN_INFO "%s", version);
-               vers_printed = 1;
+       if (tdev->ulp_iscsi) {
+               ddp_log_warn("t3dev 0x%p, ddp 0x%p already set up.\n",
+                               tdev, tdev->ulp_iscsi);
+               return;
        }
 
        err = tdev->ctl(tdev, ULP_ISCSI_GET_PARAMS, &uinfo);
        if (err < 0) {
                ddp_log_error("%s, failed to get iscsi param err=%d.\n",
                                 tdev->name, err);
-               return err;
+               return;
        }
 
        ppmax = (uinfo.ulimit - uinfo.llimit + 1) >> PPOD_SIZE_SHIFT;
@@ -598,7 +657,7 @@ static int ddp_init(struct t3cdev *tdev)
        if (!ddp) {
                ddp_log_warn("%s unable to alloc ddp 0x%d, ddp disabled.\n",
                             tdev->name, ppmax);
-               return 0;
+               return;
        }
        ddp->gl_map = (struct cxgb3i_gather_list **)(ddp + 1);
        ddp->gl_skb = (struct sk_buff **)(((char *)ddp->gl_map) +
@@ -632,142 +691,26 @@ static int ddp_init(struct t3cdev *tdev)
 
        tdev->ulp_iscsi = ddp;
 
-       /* add to the list */
-       write_lock(&cxgb3i_ddp_rwlock);
-       list_add_tail(&ddp->list, &cxgb3i_ddp_list);
-       write_unlock(&cxgb3i_ddp_rwlock);
-
-       ddp_log_info("nppods %u (0x%x ~ 0x%x), bits %u, mask 0x%x,0x%x "
-                       "pkt %u/%u, %u/%u.\n",
-                       ppmax, ddp->llimit, ddp->ulimit, ddp->idx_bits,
-                       ddp->idx_mask, ddp->rsvd_tag_mask,
-                       ddp->max_txsz, uinfo.max_txsz,
+       ddp_log_info("tdev 0x%p, nppods %u, bits %u, mask 0x%x,0x%x pkt %u/%u,"
+                       " %u/%u.\n",
+                       tdev, ppmax, ddp->idx_bits, ddp->idx_mask,
+                       ddp->rsvd_tag_mask, ddp->max_txsz, uinfo.max_txsz,
                        ddp->max_rxsz, uinfo.max_rxsz);
-       return 0;
+       return;
 
 free_ddp_map:
        cxgb3i_free_big_mem(ddp);
-       return err;
-}
-
-/**
- * cxgb3i_adapter_ddp_init - initialize the adapter's ddp resource
- * @tdev: t3cdev adapter
- * @tformat: tag format
- * @txsz: max tx pdu payload size, filled in by this func.
- * @rxsz: max rx pdu payload size, filled in by this func.
- * initialize the ddp pagepod manager for a given adapter if needed and
- * setup the tag format for a given iscsi entity
- */
-int cxgb3i_adapter_ddp_init(struct t3cdev *tdev,
-                           struct cxgb3i_tag_format *tformat,
-                           unsigned int *txsz, unsigned int *rxsz)
-{
-       struct cxgb3i_ddp_info *ddp;
-       unsigned char idx_bits;
-
-       if (!tformat)
-               return -EINVAL;
-
-       if (!tdev->ulp_iscsi) {
-               int err = ddp_init(tdev);
-               if (err < 0)
-                       return err;
-       }
-       ddp = (struct cxgb3i_ddp_info *)tdev->ulp_iscsi;
-
-       idx_bits = 32 - tformat->sw_bits;
-       tformat->rsvd_bits = ddp->idx_bits;
-       tformat->rsvd_shift = PPOD_IDX_SHIFT;
-       tformat->rsvd_mask = (1 << tformat->rsvd_bits) - 1;
-
-       ddp_log_info("tag format: sw %u, rsvd %u,%u, mask 0x%x.\n",
-                     tformat->sw_bits, tformat->rsvd_bits,
-                     tformat->rsvd_shift, tformat->rsvd_mask);
-
-       *txsz = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
-                       ddp->max_txsz - ISCSI_PDU_NONPAYLOAD_LEN);
-       *rxsz = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
-                       ddp->max_rxsz - ISCSI_PDU_NONPAYLOAD_LEN);
-       ddp_log_info("max payload size: %u/%u, %u/%u.\n",
-                    *txsz, ddp->max_txsz, *rxsz, ddp->max_rxsz);
-       return 0;
-}
-EXPORT_SYMBOL_GPL(cxgb3i_adapter_ddp_init);
-
-static void ddp_release(struct cxgb3i_ddp_info *ddp)
-{
-       int i = 0;
-       struct t3cdev *tdev = ddp->tdev;
-
-       tdev->ulp_iscsi = NULL;
-       while (i < ddp->nppods) {
-               struct cxgb3i_gather_list *gl = ddp->gl_map[i];
-               if (gl) {
-                       int npods = (gl->nelem + PPOD_PAGES_MAX - 1)
-                                    >> PPOD_PAGES_SHIFT;
-
-                       kfree(gl);
-                       ddp_free_gl_skb(ddp, i, npods);
-               } else
-                       i++;
-       }
-       cxgb3i_free_big_mem(ddp);
-}
-
-/**
- * cxgb3i_adapter_ddp_cleanup - release the adapter's ddp resource
- * @tdev: t3cdev adapter
- * release all the resource held by the ddp pagepod manager for a given
- * adapter if needed
- */
-void cxgb3i_adapter_ddp_cleanup(struct t3cdev *tdev)
-{
-       struct cxgb3i_ddp_info *ddp;
-
-       /* remove from the list */
-       write_lock(&cxgb3i_ddp_rwlock);
-       list_for_each_entry(ddp, &cxgb3i_ddp_list, list) {
-               if (ddp->tdev == tdev) {
-                       list_del(&ddp->list);
-                       break;
-               }
-       }
-       write_unlock(&cxgb3i_ddp_rwlock);
-
-       if (ddp)
-               ddp_release(ddp);
-}
-EXPORT_SYMBOL_GPL(cxgb3i_adapter_ddp_cleanup);
-
-/**
- * cxgb3i_ddp_init_module - module init entry point
- * initialize any driver wide global data structures
- */
-static int __init cxgb3i_ddp_init_module(void)
-{
-       page_idx = cxgb3i_ddp_find_page_index(PAGE_SIZE);
-       ddp_log_info("system PAGE_SIZE %lu, ddp idx %u.\n",
-                    PAGE_SIZE, page_idx);
-       return 0;
 }
 
 /**
- * cxgb3i_ddp_exit_module - module cleanup/exit entry point
- * go through the ddp list and release any resource held.
+ * cxgb3i_ddp_init - initialize ddp functions
  */
-static void __exit cxgb3i_ddp_exit_module(void)
+void cxgb3i_ddp_init(struct t3cdev *tdev)
 {
-       struct cxgb3i_ddp_info *ddp;
-
-       /* release all ddp manager if there is any */
-       write_lock(&cxgb3i_ddp_rwlock);
-       list_for_each_entry(ddp, &cxgb3i_ddp_list, list) {
-               list_del(&ddp->list);
-               ddp_release(ddp);
+       if (page_idx == DDP_PGIDX_MAX) {
+               page_idx = cxgb3i_ddp_find_page_index(PAGE_SIZE);
+               ddp_log_info("system PAGE_SIZE %lu, ddp idx %u.\n",
+                               PAGE_SIZE, page_idx);
        }
-       write_unlock(&cxgb3i_ddp_rwlock);
+       ddp_init(tdev);
 }
-
-module_init(cxgb3i_ddp_init_module);
-module_exit(cxgb3i_ddp_exit_module);
index 75a63a81e873b6db70379a00716352bf6b5d04f7..0d296de7cf32c17d408456f57e4eb840ce0ca00c 100644 (file)
@@ -301,7 +301,9 @@ int cxgb3i_setup_conn_pagesize(struct t3cdev *, unsigned int tid, int reply,
 int cxgb3i_setup_conn_digest(struct t3cdev *, unsigned int tid,
                                int hcrc, int dcrc, int reply);
 int cxgb3i_ddp_find_page_index(unsigned long pgsz);
-int cxgb3i_adapter_ddp_init(struct t3cdev *, struct cxgb3i_tag_format *,
+int cxgb3i_adapter_ddp_info(struct t3cdev *, struct cxgb3i_tag_format *,
                            unsigned int *txsz, unsigned int *rxsz);
-void cxgb3i_adapter_ddp_cleanup(struct t3cdev *);
+
+void cxgb3i_ddp_init(struct t3cdev *);
+void cxgb3i_ddp_cleanup(struct t3cdev *);
 #endif
index 1ce9f244e46c53d9725cb9d953b0b8169e1470fe..042d9bce9914550ad37ba68937195b6fdf4e1dd9 100644 (file)
@@ -12,8 +12,8 @@
 #include "cxgb3i.h"
 
 #define DRV_MODULE_NAME         "cxgb3i"
-#define DRV_MODULE_VERSION     "1.0.1"
-#define DRV_MODULE_RELDATE     "Jan. 2009"
+#define DRV_MODULE_VERSION     "1.0.2"
+#define DRV_MODULE_RELDATE     "Mar. 2009"
 
 static char version[] =
        "Chelsio S3xx iSCSI Driver " DRV_MODULE_NAME
@@ -26,6 +26,7 @@ MODULE_VERSION(DRV_MODULE_VERSION);
 
 static void open_s3_dev(struct t3cdev *);
 static void close_s3_dev(struct t3cdev *);
+static void s3_err_handler(struct t3cdev *tdev, u32 status, u32 error);
 
 static cxgb3_cpl_handler_func cxgb3i_cpl_handlers[NUM_CPL_CMDS];
 static struct cxgb3_client t3c_client = {
@@ -33,6 +34,7 @@ static struct cxgb3_client t3c_client = {
        .handlers = cxgb3i_cpl_handlers,
        .add = open_s3_dev,
        .remove = close_s3_dev,
+       .err_handler = s3_err_handler,
 };
 
 /**
@@ -48,8 +50,9 @@ static void open_s3_dev(struct t3cdev *t3dev)
                vers_printed = 1;
        }
 
+       cxgb3i_ddp_init(t3dev);
        cxgb3i_sdev_add(t3dev, &t3c_client);
-       cxgb3i_adapter_add(t3dev);
+       cxgb3i_adapter_open(t3dev);
 }
 
 /**
@@ -58,8 +61,28 @@ static void open_s3_dev(struct t3cdev *t3dev)
  */
 static void close_s3_dev(struct t3cdev *t3dev)
 {
-       cxgb3i_adapter_remove(t3dev);
+       cxgb3i_adapter_close(t3dev);
        cxgb3i_sdev_remove(t3dev);
+       cxgb3i_ddp_cleanup(t3dev);
+}
+
+static void s3_err_handler(struct t3cdev *tdev, u32 status, u32 error)
+{
+       struct cxgb3i_adapter *snic = cxgb3i_adapter_find_by_tdev(tdev);
+
+       cxgb3i_log_info("snic 0x%p, tdev 0x%p, status 0x%x, err 0x%x.\n",
+                       snic, tdev, status, error);
+       if (!snic)
+               return;
+
+       switch (status) {
+       case OFFLOAD_STATUS_DOWN:
+               snic->flags |= CXGB3I_ADAPTER_FLAG_RESET;
+               break;
+       case OFFLOAD_STATUS_UP:
+               snic->flags &= ~CXGB3I_ADAPTER_FLAG_RESET;
+               break;
+       }
 }
 
 /**
index e185dedc4c1fcc38f3d1a3ea967c51d6dacef192..fff8e4327644b2a28a522ffbd0b3626a4304b1d6 100644 (file)
@@ -53,36 +53,52 @@ static LIST_HEAD(cxgb3i_snic_list);
 static DEFINE_RWLOCK(cxgb3i_snic_rwlock);
 
 /**
- * cxgb3i_adapter_add - init a s3 adapter structure and any h/w settings
- * @t3dev: t3cdev adapter
- * return the resulting cxgb3i_adapter struct
+ * cxgb3i_adpater_find_by_tdev - find the cxgb3i_adapter structure via t3cdev
+ * @tdev: t3cdev pointer
  */
-struct cxgb3i_adapter *cxgb3i_adapter_add(struct t3cdev *t3dev)
+struct cxgb3i_adapter *cxgb3i_adapter_find_by_tdev(struct t3cdev *tdev)
 {
        struct cxgb3i_adapter *snic;
-       struct adapter *adapter = tdev2adap(t3dev);
-       int i;
 
-       snic = kzalloc(sizeof(*snic), GFP_KERNEL);
-       if (!snic) {
-               cxgb3i_api_debug("cxgb3 %s, OOM.\n", t3dev->name);
-               return NULL;
+       read_lock(&cxgb3i_snic_rwlock);
+       list_for_each_entry(snic, &cxgb3i_snic_list, list_head) {
+               if (snic->tdev == tdev) {
+                       read_unlock(&cxgb3i_snic_rwlock);
+                       return snic;
+               }
        }
-       spin_lock_init(&snic->lock);
+       read_unlock(&cxgb3i_snic_rwlock);
+       return NULL;
+}
+
+static inline int adapter_update(struct cxgb3i_adapter *snic)
+{
+       cxgb3i_log_info("snic 0x%p, t3dev 0x%p, updating.\n",
+                       snic, snic->tdev);
+       return cxgb3i_adapter_ddp_info(snic->tdev, &snic->tag_format,
+                                       &snic->tx_max_size,
+                                       &snic->rx_max_size);
+}
+
+static int adapter_add(struct cxgb3i_adapter *snic)
+{
+       struct t3cdev *t3dev = snic->tdev;
+       struct adapter *adapter = tdev2adap(t3dev);
+       int i, err;
 
-       snic->tdev = t3dev;
        snic->pdev = adapter->pdev;
        snic->tag_format.sw_bits = sw_tag_idx_bits + sw_tag_age_bits;
 
-       if (cxgb3i_adapter_ddp_init(t3dev, &snic->tag_format,
+       err = cxgb3i_adapter_ddp_info(t3dev, &snic->tag_format,
                                    &snic->tx_max_size,
-                                   &snic->rx_max_size) < 0)
-               goto free_snic;
+                                   &snic->rx_max_size);
+       if (err < 0)
+               return err;
 
        for_each_port(adapter, i) {
                snic->hba[i] = cxgb3i_hba_host_add(snic, adapter->port[i]);
                if (!snic->hba[i])
-                       goto ulp_cleanup;
+                       return -EINVAL;
        }
        snic->hba_cnt = adapter->params.nports;
 
@@ -91,46 +107,71 @@ struct cxgb3i_adapter *cxgb3i_adapter_add(struct t3cdev *t3dev)
        list_add_tail(&snic->list_head, &cxgb3i_snic_list);
        write_unlock(&cxgb3i_snic_rwlock);
 
-       return snic;
+       cxgb3i_log_info("t3dev 0x%p open, snic 0x%p, %u scsi hosts added.\n",
+                       t3dev, snic, snic->hba_cnt);
+       return 0;
+}
 
-ulp_cleanup:
-       cxgb3i_adapter_ddp_cleanup(t3dev);
-free_snic:
-       kfree(snic);
-       return NULL;
+/**
+ * cxgb3i_adapter_open - init a s3 adapter structure and any h/w settings
+ * @t3dev: t3cdev adapter
+ */
+void cxgb3i_adapter_open(struct t3cdev *t3dev)
+{
+       struct cxgb3i_adapter *snic = cxgb3i_adapter_find_by_tdev(t3dev);
+       int err;
+
+       if (snic)
+               err = adapter_update(snic);
+       else {
+               snic = kzalloc(sizeof(*snic), GFP_KERNEL);
+               if (snic) {
+                       spin_lock_init(&snic->lock);
+                       snic->tdev = t3dev;
+                       err = adapter_add(snic);
+               } else
+                       err = -ENOMEM;
+       }
+
+       if (err < 0) {
+               cxgb3i_log_info("snic 0x%p, f 0x%x, t3dev 0x%p open, err %d.\n",
+                               snic, snic ? snic->flags : 0, t3dev, err);
+               if (snic) {
+                       snic->flags &= ~CXGB3I_ADAPTER_FLAG_RESET;
+                       cxgb3i_adapter_close(t3dev);
+               }
+       }
 }
 
 /**
- * cxgb3i_adapter_remove - release the resources held and cleanup h/w settings
+ * cxgb3i_adapter_close - release the resources held and cleanup h/w settings
  * @t3dev: t3cdev adapter
  */
-void cxgb3i_adapter_remove(struct t3cdev *t3dev)
+void cxgb3i_adapter_close(struct t3cdev *t3dev)
 {
+       struct cxgb3i_adapter *snic = cxgb3i_adapter_find_by_tdev(t3dev);
        int i;
-       struct cxgb3i_adapter *snic;
+
+       if (!snic || snic->flags & CXGB3I_ADAPTER_FLAG_RESET) {
+               cxgb3i_log_info("t3dev 0x%p close, snic 0x%p, f 0x%x.\n",
+                               t3dev, snic, snic ? snic->flags : 0);
+               return;
+       }
 
        /* remove from the list */
        write_lock(&cxgb3i_snic_rwlock);
-       list_for_each_entry(snic, &cxgb3i_snic_list, list_head) {
-               if (snic->tdev == t3dev) {
-                       list_del(&snic->list_head);
-                       break;
-               }
-       }
+       list_del(&snic->list_head);
        write_unlock(&cxgb3i_snic_rwlock);
 
-       if (snic) {
-               for (i = 0; i < snic->hba_cnt; i++) {
-                       if (snic->hba[i]) {
-                               cxgb3i_hba_host_remove(snic->hba[i]);
-                               snic->hba[i] = NULL;
-                       }
+       for (i = 0; i < snic->hba_cnt; i++) {
+               if (snic->hba[i]) {
+                       cxgb3i_hba_host_remove(snic->hba[i]);
+                       snic->hba[i] = NULL;
                }
-
-               /* release ddp resources */
-               cxgb3i_adapter_ddp_cleanup(snic->tdev);
-               kfree(snic);
        }
+       cxgb3i_log_info("t3dev 0x%p close, snic 0x%p, %u scsi hosts removed.\n",
+                       t3dev, snic, snic->hba_cnt);
+       kfree(snic);
 }
 
 /**
@@ -170,7 +211,8 @@ struct cxgb3i_hba *cxgb3i_hba_host_add(struct cxgb3i_adapter *snic,
        shost = iscsi_host_alloc(&cxgb3i_host_template,
                                 sizeof(struct cxgb3i_hba), 1);
        if (!shost) {
-               cxgb3i_log_info("iscsi_host_alloc failed.\n");
+               cxgb3i_log_info("snic 0x%p, ndev 0x%p, host_alloc failed.\n",
+                               snic, ndev);
                return NULL;
        }
 
@@ -188,7 +230,8 @@ struct cxgb3i_hba *cxgb3i_hba_host_add(struct cxgb3i_adapter *snic,
        pci_dev_get(snic->pdev);
        err = iscsi_host_add(shost, &snic->pdev->dev);
        if (err) {
-               cxgb3i_log_info("iscsi_host_add failed.\n");
+               cxgb3i_log_info("snic 0x%p, ndev 0x%p, host_add failed.\n",
+                               snic, ndev);
                goto pci_dev_put;
        }
 
index c2e434e54e288b7346a4d54870e50d351b222ecd..4d8654cdbdaeec77aaf12c5cc9e39e9933be61bc 100644 (file)
@@ -94,29 +94,30 @@ static int c3cn_get_port(struct s3_conn *c3cn, struct cxgb3i_sdev_data *cdata)
        if (!cdata)
                goto error_out;
 
-       if (c3cn->saddr.sin_port != 0) {
-               idx = ntohs(c3cn->saddr.sin_port) - cxgb3_sport_base;
-               if (idx < 0 || idx >= cxgb3_max_connect)
-                       return 0;
-               if (!test_and_set_bit(idx, cdata->sport_map))
-                       return -EADDRINUSE;
+       if (c3cn->saddr.sin_port) {
+               cxgb3i_log_error("connect, sin_port NON-ZERO %u.\n",
+                                c3cn->saddr.sin_port);
+               return -EADDRINUSE;
        }
 
-       /* the sport_map_next may not be accurate but that is okay, sport_map
-          should be */
-       start = idx = cdata->sport_map_next;
+       spin_lock_bh(&cdata->lock);
+       start = idx = cdata->sport_next;
        do {
                if (++idx >= cxgb3_max_connect)
                        idx = 0;
-               if (!(test_and_set_bit(idx, cdata->sport_map))) {
+               if (!cdata->sport_conn[idx]) {
                        c3cn->saddr.sin_port = htons(cxgb3_sport_base + idx);
-                       cdata->sport_map_next = idx;
+                       cdata->sport_next = idx;
+                       cdata->sport_conn[idx] = c3cn;
+                       spin_unlock_bh(&cdata->lock);
+
                        c3cn_conn_debug("%s reserve port %u.\n",
                                        cdata->cdev->name,
                                        cxgb3_sport_base + idx);
                        return 0;
                }
        } while (idx != start);
+       spin_unlock_bh(&cdata->lock);
 
 error_out:
        return -EADDRNOTAVAIL;
@@ -124,15 +125,19 @@ error_out:
 
 static void c3cn_put_port(struct s3_conn *c3cn)
 {
-       struct cxgb3i_sdev_data *cdata = CXGB3_SDEV_DATA(c3cn->cdev);
+       if (!c3cn->cdev)
+               return;
 
        if (c3cn->saddr.sin_port) {
+               struct cxgb3i_sdev_data *cdata = CXGB3_SDEV_DATA(c3cn->cdev);
                int idx = ntohs(c3cn->saddr.sin_port) - cxgb3_sport_base;
 
                c3cn->saddr.sin_port = 0;
                if (idx < 0 || idx >= cxgb3_max_connect)
                        return;
-               clear_bit(idx, cdata->sport_map);
+               spin_lock_bh(&cdata->lock);
+               cdata->sport_conn[idx] = NULL;
+               spin_unlock_bh(&cdata->lock);
                c3cn_conn_debug("%s, release port %u.\n",
                                cdata->cdev->name, cxgb3_sport_base + idx);
        }
@@ -1305,11 +1310,7 @@ static void c3cn_release_offload_resources(struct s3_conn *c3cn)
        struct t3cdev *cdev = c3cn->cdev;
        unsigned int tid = c3cn->tid;
 
-       if (!cdev)
-               return;
-
        c3cn->qset = 0;
-
        c3cn_free_cpl_skbs(c3cn);
 
        if (c3cn->wr_avail != c3cn->wr_max) {
@@ -1317,18 +1318,22 @@ static void c3cn_release_offload_resources(struct s3_conn *c3cn)
                reset_wr_list(c3cn);
        }
 
-       if (c3cn->l2t) {
-               l2t_release(L2DATA(cdev), c3cn->l2t);
-               c3cn->l2t = NULL;
-       }
-
-       if (c3cn->state == C3CN_STATE_CONNECTING) /* we have ATID */
-               s3_free_atid(cdev, tid);
-       else {          /* we have TID */
-               cxgb3_remove_tid(cdev, (void *)c3cn, tid);
-               c3cn_put(c3cn);
+       if (cdev) {
+               if (c3cn->l2t) {
+                       l2t_release(L2DATA(cdev), c3cn->l2t);
+                       c3cn->l2t = NULL;
+               }
+               if (c3cn->state == C3CN_STATE_CONNECTING)
+                       /* we have ATID */
+                       s3_free_atid(cdev, tid);
+               else {
+                       /* we have TID */
+                       cxgb3_remove_tid(cdev, (void *)c3cn, tid);
+                       c3cn_put(c3cn);
+               }
        }
 
+       c3cn->dst_cache = NULL;
        c3cn->cdev = NULL;
 }
 
@@ -1417,17 +1422,18 @@ static void c3cn_active_close(struct s3_conn *c3cn)
 }
 
 /**
- * cxgb3i_c3cn_release - close and release an iscsi tcp connection
+ * cxgb3i_c3cn_release - close and release an iscsi tcp connection and any
+ *     resource held
  * @c3cn: the iscsi tcp connection
  */
 void cxgb3i_c3cn_release(struct s3_conn *c3cn)
 {
        c3cn_conn_debug("c3cn 0x%p, s %u, f 0x%lx.\n",
                        c3cn, c3cn->state, c3cn->flags);
-       if (likely(c3cn->state != C3CN_STATE_CONNECTING))
-               c3cn_active_close(c3cn);
-       else
+       if (unlikely(c3cn->state == C3CN_STATE_CONNECTING))
                c3cn_set_flag(c3cn, C3CN_ACTIVE_CLOSE_NEEDED);
+       else if (likely(c3cn->state != C3CN_STATE_CLOSED))
+               c3cn_active_close(c3cn);
        c3cn_put(c3cn);
 }
 
@@ -1656,7 +1662,6 @@ int cxgb3i_c3cn_connect(struct s3_conn *c3cn, struct sockaddr_in *usin)
        c3cn_set_state(c3cn, C3CN_STATE_CLOSED);
        ip_rt_put(rt);
        c3cn_put_port(c3cn);
-       c3cn->daddr.sin_port = 0;
        return err;
 }
 
@@ -1776,10 +1781,25 @@ out_err:
 static void sdev_data_cleanup(struct cxgb3i_sdev_data *cdata)
 {
        struct adap_ports *ports = &cdata->ports;
+       struct s3_conn *c3cn;
        int i;
 
+       for (i = 0; i < cxgb3_max_connect; i++) {
+               if (cdata->sport_conn[i]) {
+                       c3cn = cdata->sport_conn[i];
+                       cdata->sport_conn[i] = NULL;
+
+                       spin_lock_bh(&c3cn->lock);
+                       c3cn->cdev = NULL;
+                       c3cn_set_flag(c3cn, C3CN_OFFLOAD_DOWN);
+                       c3cn_closed(c3cn);
+                       spin_unlock_bh(&c3cn->lock);
+               }
+       }
+
        for (i = 0; i < ports->nports; i++)
                NDEV2CDATA(ports->lldevs[i]) = NULL;
+
        cxgb3i_free_big_mem(cdata);
 }
 
@@ -1821,21 +1841,27 @@ void cxgb3i_sdev_add(struct t3cdev *cdev, struct cxgb3_client *client)
        struct cxgb3i_sdev_data *cdata;
        struct ofld_page_info rx_page_info;
        unsigned int wr_len;
-       int mapsize = DIV_ROUND_UP(cxgb3_max_connect,
-                                  8 * sizeof(unsigned long));
+       int mapsize = cxgb3_max_connect * sizeof(struct s3_conn *);
        int i;
 
        cdata =  cxgb3i_alloc_big_mem(sizeof(*cdata) + mapsize, GFP_KERNEL);
-       if (!cdata)
+       if (!cdata) {
+               cxgb3i_log_warn("t3dev 0x%p, offload up, OOM %d.\n",
+                               cdev, mapsize);
                return;
+       }
 
        if (cdev->ctl(cdev, GET_WR_LEN, &wr_len) < 0 ||
            cdev->ctl(cdev, GET_PORTS, &cdata->ports) < 0 ||
-           cdev->ctl(cdev, GET_RX_PAGE_INFO, &rx_page_info) < 0)
+           cdev->ctl(cdev, GET_RX_PAGE_INFO, &rx_page_info) < 0) {
+               cxgb3i_log_warn("t3dev 0x%p, offload up, ioctl failed.\n",
+                               cdev);
                goto free_cdata;
+       }
 
        s3_init_wr_tab(wr_len);
 
+       spin_lock_init(&cdata->lock);
        INIT_LIST_HEAD(&cdata->list);
        cdata->cdev = cdev;
        cdata->client = client;
@@ -1847,6 +1873,7 @@ void cxgb3i_sdev_add(struct t3cdev *cdev, struct cxgb3_client *client)
        list_add_tail(&cdata->list, &cdata_list);
        write_unlock(&cdata_rwlock);
 
+       cxgb3i_log_info("t3dev 0x%p, offload up, added.\n", cdev);
        return;
 
 free_cdata:
@@ -1861,6 +1888,8 @@ void cxgb3i_sdev_remove(struct t3cdev *cdev)
 {
        struct cxgb3i_sdev_data *cdata = CXGB3_SDEV_DATA(cdev);
 
+       cxgb3i_log_info("t3dev 0x%p, offload down, remove.\n", cdev);
+
        write_lock(&cdata_rwlock);
        list_del(&cdata->list);
        write_unlock(&cdata_rwlock);
index 275f23f16eb7f6bc5a68691fb969268dc1ea4502..ebfca960c0a9d8358236c8658c084e44bda4ed3d 100644 (file)
@@ -16,7 +16,7 @@
 #define _CXGB3I_OFFLOAD_H
 
 #include <linux/skbuff.h>
-#include <net/tcp.h>
+#include <linux/in.h>
 
 #include "common.h"
 #include "adapter.h"
@@ -135,11 +135,11 @@ enum c3cn_flags {
        C3CN_ABORT_RPL_PENDING, /* expecting an abort reply */
        C3CN_TX_DATA_SENT,      /* already sent a TX_DATA WR */
        C3CN_ACTIVE_CLOSE_NEEDED,       /* need to be closed */
+       C3CN_OFFLOAD_DOWN       /* offload function off */
 };
 
 /**
  * cxgb3i_sdev_data - Per adapter data.
- *
  * Linked off of each Ethernet device port on the adapter.
  * Also available via the t3cdev structure since we have pointers to our port
  * net_device's there ...
@@ -148,16 +148,17 @@ enum c3cn_flags {
  * @cdev:      t3cdev adapter
  * @client:    CPL client pointer
  * @ports:     array of adapter ports
- * @sport_map_next: next index into the port map
- * @sport_map: source port map
+ * @sport_next: next port
+ * @sport_conn:        source port connection
  */
 struct cxgb3i_sdev_data {
        struct list_head list;
        struct t3cdev *cdev;
        struct cxgb3_client *client;
        struct adap_ports ports;
-       unsigned int sport_map_next;
-       unsigned long sport_map[0];
+       spinlock_t lock;
+       unsigned int sport_next;
+       struct s3_conn *sport_conn[0];
 };
 #define NDEV2CDATA(ndev) (*(struct cxgb3i_sdev_data **)&(ndev)->ec_ptr)
 #define CXGB3_SDEV_DATA(cdev) NDEV2CDATA((cdev)->lldev)
index 6194ed5d02c4e694bc2bfbe3faf9a56860a2ade5..b6af63ca980b4f1cb6be6acb2ca6762fe3f67548 100644 (file)
@@ -1014,15 +1014,15 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
         *      See if we should enable dma64 mode.
         */
        if (sizeof(dma_addr_t) > 4 &&
-           pci_set_dma_mask(pDev, DMA_64BIT_MASK) == 0) {
-               if (dma_get_required_mask(&pDev->dev) > DMA_32BIT_MASK)
+           pci_set_dma_mask(pDev, DMA_BIT_MASK(64)) == 0) {
+               if (dma_get_required_mask(&pDev->dev) > DMA_BIT_MASK(32))
                        dma64 = 1;
        }
-       if (!dma64 && pci_set_dma_mask(pDev, DMA_32BIT_MASK) != 0)
+       if (!dma64 && pci_set_dma_mask(pDev, DMA_BIT_MASK(32)) != 0)
                return -EINVAL;
 
        /* adapter only supports message blocks below 4GB */
-       pci_set_consistent_dma_mask(pDev, DMA_32BIT_MASK);
+       pci_set_consistent_dma_mask(pDev, DMA_BIT_MASK(32));
 
        base_addr0_phys = pci_resource_start(pDev,0);
        hba_map0_area_size = pci_resource_len(pDev,0);
index 976cdd5c94efc3cfd9530dfa9383e384d69f36dd..be5099dd94b5d4e655385ad59364dbd585da1910 100644 (file)
@@ -1426,7 +1426,7 @@ static int port_detect(unsigned long port_base, unsigned int j,
 
        if (ha->pdev) {
                pci_set_master(ha->pdev);
-               if (pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK))
+               if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32)))
                        printk("%s: warning, pci_set_dma_mask failed.\n",
                               ha->board_name);
        }
index b78da06d7c0ef4bf5c47190e11f68c33b3da3cfd..950f27615c765959e8dabe6b1fbf04795d770d49 100644 (file)
@@ -1,8 +1,2 @@
-# $Id: Makefile
-
 obj-$(CONFIG_FCOE) += fcoe.o
-
-fcoe-y := \
-       libfcoe.o \
-       fcoe_sw.o \
-       fc_transport_fcoe.o
+obj-$(CONFIG_LIBFCOE) += libfcoe.o
diff --git a/drivers/scsi/fcoe/fc_transport_fcoe.c b/drivers/scsi/fcoe/fc_transport_fcoe.c
deleted file mode 100644 (file)
index 8862758..0000000
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope 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.
- *
- * Maintained at www.Open-FCoE.org
- */
-
-#include <linux/pci.h>
-#include <scsi/libfcoe.h>
-#include <scsi/fc_transport_fcoe.h>
-
-/* internal fcoe transport */
-struct fcoe_transport_internal {
-       struct fcoe_transport *t;
-       struct net_device *netdev;
-       struct list_head list;
-};
-
-/* fcoe transports list and its lock */
-static LIST_HEAD(fcoe_transports);
-static DEFINE_MUTEX(fcoe_transports_lock);
-
-/**
- * fcoe_transport_default() - Returns ptr to the default transport fcoe_sw
- */
-struct fcoe_transport *fcoe_transport_default(void)
-{
-       return &fcoe_sw_transport;
-}
-
-/**
- * fcoe_transport_to_pcidev() - get the pci dev from a netdev
- * @netdev: the netdev that pci dev will be retrived from
- *
- * Returns: NULL or the corrsponding pci_dev
- */
-struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev)
-{
-       if (!netdev->dev.parent)
-               return NULL;
-       return to_pci_dev(netdev->dev.parent);
-}
-
-/**
- * fcoe_transport_device_lookup() - Lookup a transport
- * @netdev: the netdev the transport to be attached to
- *
- * This will look for existing offload driver, if not found, it falls back to
- * the default sw hba (fcoe_sw) as its fcoe transport.
- *
- * Returns: 0 for success
- */
-static struct fcoe_transport_internal *
-fcoe_transport_device_lookup(struct fcoe_transport *t,
-                            struct net_device *netdev)
-{
-       struct fcoe_transport_internal *ti;
-
-       /* assign the transpor to this device */
-       mutex_lock(&t->devlock);
-       list_for_each_entry(ti, &t->devlist, list) {
-               if (ti->netdev == netdev) {
-                       mutex_unlock(&t->devlock);
-                       return ti;
-               }
-       }
-       mutex_unlock(&t->devlock);
-       return NULL;
-}
-/**
- * fcoe_transport_device_add() - Assign a transport to a device
- * @netdev: the netdev the transport to be attached to
- *
- * This will look for existing offload driver, if not found, it falls back to
- * the default sw hba (fcoe_sw) as its fcoe transport.
- *
- * Returns: 0 for success
- */
-static int fcoe_transport_device_add(struct fcoe_transport *t,
-                                    struct net_device *netdev)
-{
-       struct fcoe_transport_internal *ti;
-
-       ti = fcoe_transport_device_lookup(t, netdev);
-       if (ti) {
-               printk(KERN_DEBUG "fcoe_transport_device_add:"
-                      "device %s is already added to transport %s\n",
-                      netdev->name, t->name);
-               return -EEXIST;
-       }
-       /* allocate an internal struct to host the netdev and the list */
-       ti = kzalloc(sizeof(*ti), GFP_KERNEL);
-       if (!ti)
-               return -ENOMEM;
-
-       ti->t = t;
-       ti->netdev = netdev;
-       INIT_LIST_HEAD(&ti->list);
-       dev_hold(ti->netdev);
-
-       mutex_lock(&t->devlock);
-       list_add(&ti->list, &t->devlist);
-       mutex_unlock(&t->devlock);
-
-       printk(KERN_DEBUG "fcoe_transport_device_add:"
-                      "device %s added to transport %s\n",
-                      netdev->name, t->name);
-
-       return 0;
-}
-
-/**
- * fcoe_transport_device_remove() - Remove a device from its transport
- * @netdev: the netdev the transport to be attached to
- *
- * This removes the device from the transport so the given transport will
- * not manage this device any more
- *
- * Returns: 0 for success
- */
-static int fcoe_transport_device_remove(struct fcoe_transport *t,
-                                       struct net_device *netdev)
-{
-       struct fcoe_transport_internal *ti;
-
-       ti = fcoe_transport_device_lookup(t, netdev);
-       if (!ti) {
-               printk(KERN_DEBUG "fcoe_transport_device_remove:"
-                      "device %s is not managed by transport %s\n",
-                      netdev->name, t->name);
-               return -ENODEV;
-       }
-       mutex_lock(&t->devlock);
-       list_del(&ti->list);
-       mutex_unlock(&t->devlock);
-       printk(KERN_DEBUG "fcoe_transport_device_remove:"
-              "device %s removed from transport %s\n",
-              netdev->name, t->name);
-       dev_put(ti->netdev);
-       kfree(ti);
-       return 0;
-}
-
-/**
- * fcoe_transport_device_remove_all() - Remove all from transport devlist
- *
- * This removes the device from the transport so the given transport will
- * not manage this device any more
- *
- * Returns: 0 for success
- */
-static void fcoe_transport_device_remove_all(struct fcoe_transport *t)
-{
-       struct fcoe_transport_internal *ti, *tmp;
-
-       mutex_lock(&t->devlock);
-       list_for_each_entry_safe(ti, tmp, &t->devlist, list) {
-               list_del(&ti->list);
-               kfree(ti);
-       }
-       mutex_unlock(&t->devlock);
-}
-
-/**
- * fcoe_transport_match() - Use the bus device match function to match the hw
- * @t: The fcoe transport to check
- * @netdev: The netdev to match against
- *
- * This function is used to check if the given transport wants to manage the
- * input netdev. if the transports implements the match function, it will be
- * called, o.w. we just compare the pci vendor and device id.
- *
- * Returns: true for match up
- */
-static bool fcoe_transport_match(struct fcoe_transport *t,
-                                struct net_device *netdev)
-{
-       /* match transport by vendor and device id */
-       struct pci_dev *pci;
-
-       pci = fcoe_transport_pcidev(netdev);
-
-       if (pci) {
-               printk(KERN_DEBUG "fcoe_transport_match:"
-                      "%s:%x:%x -- %s:%x:%x\n",
-                      t->name, t->vendor, t->device,
-                      netdev->name, pci->vendor, pci->device);
-
-               /* if transport supports match */
-               if (t->match)
-                       return t->match(netdev);
-
-               /* else just compare the vendor and device id: pci only */
-               return (t->vendor == pci->vendor) && (t->device == pci->device);
-       }
-       return false;
-}
-
-/**
- * fcoe_transport_lookup() - Check if the transport is already registered
- * @t: the transport to be looked up
- *
- * This compares the parent device (pci) vendor and device id
- *
- * Returns: NULL if not found
- *
- * TODO: return default sw transport if no other transport is found
- */
-static struct fcoe_transport *
-fcoe_transport_lookup(struct net_device *netdev)
-{
-       struct fcoe_transport *t;
-
-       mutex_lock(&fcoe_transports_lock);
-       list_for_each_entry(t, &fcoe_transports, list) {
-               if (fcoe_transport_match(t, netdev)) {
-                       mutex_unlock(&fcoe_transports_lock);
-                       return t;
-               }
-       }
-       mutex_unlock(&fcoe_transports_lock);
-
-       printk(KERN_DEBUG "fcoe_transport_lookup:"
-              "use default transport for %s\n", netdev->name);
-       return fcoe_transport_default();
-}
-
-/**
- * fcoe_transport_register() - Adds a fcoe transport to the fcoe transports list
- * @t: ptr to the fcoe transport to be added
- *
- * Returns: 0 for success
- */
-int fcoe_transport_register(struct fcoe_transport *t)
-{
-       struct fcoe_transport *tt;
-
-       /* TODO - add fcoe_transport specific initialization here */
-       mutex_lock(&fcoe_transports_lock);
-       list_for_each_entry(tt, &fcoe_transports, list) {
-               if (tt == t) {
-                       mutex_unlock(&fcoe_transports_lock);
-                       return -EEXIST;
-               }
-       }
-       list_add_tail(&t->list, &fcoe_transports);
-       mutex_unlock(&fcoe_transports_lock);
-
-       printk(KERN_DEBUG "fcoe_transport_register:%s\n", t->name);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(fcoe_transport_register);
-
-/**
- * fcoe_transport_unregister() - Remove the tranport fro the fcoe transports list
- * @t: ptr to the fcoe transport to be removed
- *
- * Returns: 0 for success
- */
-int fcoe_transport_unregister(struct fcoe_transport *t)
-{
-       struct fcoe_transport *tt, *tmp;
-
-       mutex_lock(&fcoe_transports_lock);
-       list_for_each_entry_safe(tt, tmp, &fcoe_transports, list) {
-               if (tt == t) {
-                       list_del(&t->list);
-                       mutex_unlock(&fcoe_transports_lock);
-                       fcoe_transport_device_remove_all(t);
-                       printk(KERN_DEBUG "fcoe_transport_unregister:%s\n",
-                              t->name);
-                       return 0;
-               }
-       }
-       mutex_unlock(&fcoe_transports_lock);
-       return -ENODEV;
-}
-EXPORT_SYMBOL_GPL(fcoe_transport_unregister);
-
-/**
- * fcoe_load_transport_driver() - Load an offload driver by alias name
- * @netdev: the target net device
- *
- * Requests for an offload driver module as the fcoe transport, if fails, it
- * falls back to use the SW HBA (fcoe_sw) as its transport
- *
- * TODO -
- *     1. supports only PCI device
- *     2. needs fix for VLAn and bonding
- *     3. pure hw fcoe hba may not have netdev
- *
- * Returns: 0 for success
- */
-int fcoe_load_transport_driver(struct net_device *netdev)
-{
-       struct pci_dev *pci;
-       struct device *dev = netdev->dev.parent;
-
-       if (fcoe_transport_lookup(netdev)) {
-               /* load default transport */
-               printk(KERN_DEBUG "fcoe: already loaded transport for %s\n",
-                      netdev->name);
-               return -EEXIST;
-       }
-
-       pci = to_pci_dev(dev);
-       if (dev->bus != &pci_bus_type) {
-               printk(KERN_DEBUG "fcoe: support noly PCI device\n");
-               return -ENODEV;
-       }
-       printk(KERN_DEBUG "fcoe: loading driver fcoe-pci-0x%04x-0x%04x\n",
-              pci->vendor, pci->device);
-
-       return request_module("fcoe-pci-0x%04x-0x%04x",
-                             pci->vendor, pci->device);
-
-}
-EXPORT_SYMBOL_GPL(fcoe_load_transport_driver);
-
-/**
- * fcoe_transport_attach() - Load transport to fcoe
- * @netdev: the netdev the transport to be attached to
- *
- * This will look for existing offload driver, if not found, it falls back to
- * the default sw hba (fcoe_sw) as its fcoe transport.
- *
- * Returns: 0 for success
- */
-int fcoe_transport_attach(struct net_device *netdev)
-{
-       struct fcoe_transport *t;
-
-       /* find the corresponding transport */
-       t = fcoe_transport_lookup(netdev);
-       if (!t) {
-               printk(KERN_DEBUG "fcoe_transport_attach"
-                      ":no transport for %s:use %s\n",
-                      netdev->name, t->name);
-               return -ENODEV;
-       }
-       /* add to the transport */
-       if (fcoe_transport_device_add(t, netdev)) {
-               printk(KERN_DEBUG "fcoe_transport_attach"
-                      ":failed to add %s to tramsport %s\n",
-                      netdev->name, t->name);
-               return -EIO;
-       }
-       /* transport create function */
-       if (t->create)
-               t->create(netdev);
-
-       printk(KERN_DEBUG "fcoe_transport_attach:transport %s for %s\n",
-              t->name, netdev->name);
-       return 0;
-}
-EXPORT_SYMBOL_GPL(fcoe_transport_attach);
-
-/**
- * fcoe_transport_release() - Unload transport from fcoe
- * @netdev: the net device on which fcoe is to be released
- *
- * Returns: 0 for success
- */
-int fcoe_transport_release(struct net_device *netdev)
-{
-       struct fcoe_transport *t;
-
-       /* find the corresponding transport */
-       t = fcoe_transport_lookup(netdev);
-       if (!t) {
-               printk(KERN_DEBUG "fcoe_transport_release:"
-                      "no transport for %s:use %s\n",
-                      netdev->name, t->name);
-               return -ENODEV;
-       }
-       /* remove the device from the transport */
-       if (fcoe_transport_device_remove(t, netdev)) {
-               printk(KERN_DEBUG "fcoe_transport_release:"
-                      "failed to add %s to tramsport %s\n",
-                      netdev->name, t->name);
-               return -EIO;
-       }
-       /* transport destroy function */
-       if (t->destroy)
-               t->destroy(netdev);
-
-       printk(KERN_DEBUG "fcoe_transport_release:"
-              "device %s dettached from transport %s\n",
-              netdev->name, t->name);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(fcoe_transport_release);
-
-/**
- * fcoe_transport_init() - Initializes fcoe transport layer
- *
- * This prepares for the fcoe transport layer
- *
- * Returns: none
- */
-int __init fcoe_transport_init(void)
-{
-       INIT_LIST_HEAD(&fcoe_transports);
-       mutex_init(&fcoe_transports_lock);
-       return 0;
-}
-
-/**
- * fcoe_transport_exit() - Cleans up the fcoe transport layer
- *
- * This cleans up the fcoe transport layer. removing any transport on the list,
- * note that the transport destroy func is not called here.
- *
- * Returns: none
- */
-int __exit fcoe_transport_exit(void)
-{
-       struct fcoe_transport *t, *tmp;
-
-       mutex_lock(&fcoe_transports_lock);
-       list_for_each_entry_safe(t, tmp, &fcoe_transports, list) {
-               list_del(&t->list);
-               mutex_unlock(&fcoe_transports_lock);
-               fcoe_transport_device_remove_all(t);
-               mutex_lock(&fcoe_transports_lock);
-       }
-       mutex_unlock(&fcoe_transports_lock);
-       return 0;
-}
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
new file mode 100644 (file)
index 0000000..94e1e31
--- /dev/null
@@ -0,0 +1,1878 @@
+/*
+ * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * Maintained at www.Open-FCoE.org
+ */
+
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/spinlock.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/if_ether.h>
+#include <linux/if_vlan.h>
+#include <linux/crc32.h>
+#include <linux/cpu.h>
+#include <linux/fs.h>
+#include <linux/sysfs.h>
+#include <linux/ctype.h>
+#include <scsi/scsi_tcq.h>
+#include <scsi/scsicam.h>
+#include <scsi/scsi_transport.h>
+#include <scsi/scsi_transport_fc.h>
+#include <net/rtnetlink.h>
+
+#include <scsi/fc/fc_encaps.h>
+#include <scsi/fc/fc_fip.h>
+
+#include <scsi/libfc.h>
+#include <scsi/fc_frame.h>
+#include <scsi/libfcoe.h>
+
+#include "fcoe.h"
+
+static int debug_fcoe;
+
+MODULE_AUTHOR("Open-FCoE.org");
+MODULE_DESCRIPTION("FCoE");
+MODULE_LICENSE("GPL v2");
+
+/* fcoe host list */
+LIST_HEAD(fcoe_hostlist);
+DEFINE_RWLOCK(fcoe_hostlist_lock);
+DEFINE_TIMER(fcoe_timer, NULL, 0, 0);
+DEFINE_PER_CPU(struct fcoe_percpu_s, fcoe_percpu);
+
+/* Function Prototyes */
+static int fcoe_reset(struct Scsi_Host *shost);
+static int fcoe_xmit(struct fc_lport *, struct fc_frame *);
+static int fcoe_rcv(struct sk_buff *, struct net_device *,
+                   struct packet_type *, struct net_device *);
+static int fcoe_percpu_receive_thread(void *arg);
+static void fcoe_clean_pending_queue(struct fc_lport *lp);
+static void fcoe_percpu_clean(struct fc_lport *lp);
+static int fcoe_link_ok(struct fc_lport *lp);
+
+static struct fc_lport *fcoe_hostlist_lookup(const struct net_device *);
+static int fcoe_hostlist_add(const struct fc_lport *);
+static int fcoe_hostlist_remove(const struct fc_lport *);
+
+static int fcoe_check_wait_queue(struct fc_lport *);
+static int fcoe_device_notification(struct notifier_block *, ulong, void *);
+static void fcoe_dev_setup(void);
+static void fcoe_dev_cleanup(void);
+
+/* notification function from net device */
+static struct notifier_block fcoe_notifier = {
+       .notifier_call = fcoe_device_notification,
+};
+
+static struct scsi_transport_template *scsi_transport_fcoe_sw;
+
+struct fc_function_template fcoe_transport_function = {
+       .show_host_node_name = 1,
+       .show_host_port_name = 1,
+       .show_host_supported_classes = 1,
+       .show_host_supported_fc4s = 1,
+       .show_host_active_fc4s = 1,
+       .show_host_maxframe_size = 1,
+
+       .show_host_port_id = 1,
+       .show_host_supported_speeds = 1,
+       .get_host_speed = fc_get_host_speed,
+       .show_host_speed = 1,
+       .show_host_port_type = 1,
+       .get_host_port_state = fc_get_host_port_state,
+       .show_host_port_state = 1,
+       .show_host_symbolic_name = 1,
+
+       .dd_fcrport_size = sizeof(struct fc_rport_libfc_priv),
+       .show_rport_maxframe_size = 1,
+       .show_rport_supported_classes = 1,
+
+       .show_host_fabric_name = 1,
+       .show_starget_node_name = 1,
+       .show_starget_port_name = 1,
+       .show_starget_port_id = 1,
+       .set_rport_dev_loss_tmo = fc_set_rport_loss_tmo,
+       .show_rport_dev_loss_tmo = 1,
+       .get_fc_host_stats = fc_get_host_stats,
+       .issue_fc_host_lip = fcoe_reset,
+
+       .terminate_rport_io = fc_rport_terminate_io,
+};
+
+static struct scsi_host_template fcoe_shost_template = {
+       .module = THIS_MODULE,
+       .name = "FCoE Driver",
+       .proc_name = FCOE_NAME,
+       .queuecommand = fc_queuecommand,
+       .eh_abort_handler = fc_eh_abort,
+       .eh_device_reset_handler = fc_eh_device_reset,
+       .eh_host_reset_handler = fc_eh_host_reset,
+       .slave_alloc = fc_slave_alloc,
+       .change_queue_depth = fc_change_queue_depth,
+       .change_queue_type = fc_change_queue_type,
+       .this_id = -1,
+       .cmd_per_lun = 32,
+       .can_queue = FCOE_MAX_OUTSTANDING_COMMANDS,
+       .use_clustering = ENABLE_CLUSTERING,
+       .sg_tablesize = SG_ALL,
+       .max_sectors = 0xffff,
+};
+
+/**
+ * fcoe_lport_config() - sets up the fc_lport
+ * @lp: ptr to the fc_lport
+ * @shost: ptr to the parent scsi host
+ *
+ * Returns: 0 for success
+ */
+static int fcoe_lport_config(struct fc_lport *lp)
+{
+       lp->link_up = 0;
+       lp->qfull = 0;
+       lp->max_retry_count = 3;
+       lp->e_d_tov = 2 * 1000; /* FC-FS default */
+       lp->r_a_tov = 2 * 2 * 1000;
+       lp->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS |
+                             FCP_SPPF_RETRY | FCP_SPPF_CONF_COMPL);
+
+       fc_lport_init_stats(lp);
+
+       /* lport fc_lport related configuration */
+       fc_lport_config(lp);
+
+       /* offload related configuration */
+       lp->crc_offload = 0;
+       lp->seq_offload = 0;
+       lp->lro_enabled = 0;
+       lp->lro_xid = 0;
+       lp->lso_max = 0;
+
+       return 0;
+}
+
+/**
+ * fcoe_netdev_config() - Set up netdev for SW FCoE
+ * @lp : ptr to the fc_lport
+ * @netdev : ptr to the associated netdevice struct
+ *
+ * Must be called after fcoe_lport_config() as it will use lport mutex
+ *
+ * Returns : 0 for success
+ */
+static int fcoe_netdev_config(struct fc_lport *lp, struct net_device *netdev)
+{
+       u32 mfs;
+       u64 wwnn, wwpn;
+       struct fcoe_softc *fc;
+       u8 flogi_maddr[ETH_ALEN];
+
+       /* Setup lport private data to point to fcoe softc */
+       fc = lport_priv(lp);
+       fc->ctlr.lp = lp;
+       fc->real_dev = netdev;
+       fc->phys_dev = netdev;
+
+       /* Require support for get_pauseparam ethtool op. */
+       if (netdev->priv_flags & IFF_802_1Q_VLAN)
+               fc->phys_dev = vlan_dev_real_dev(netdev);
+
+       /* Do not support for bonding device */
+       if ((fc->real_dev->priv_flags & IFF_MASTER_ALB) ||
+           (fc->real_dev->priv_flags & IFF_SLAVE_INACTIVE) ||
+           (fc->real_dev->priv_flags & IFF_MASTER_8023AD)) {
+               return -EOPNOTSUPP;
+       }
+
+       /*
+        * Determine max frame size based on underlying device and optional
+        * user-configured limit.  If the MFS is too low, fcoe_link_ok()
+        * will return 0, so do this first.
+        */
+       mfs = fc->real_dev->mtu - (sizeof(struct fcoe_hdr) +
+                                  sizeof(struct fcoe_crc_eof));
+       if (fc_set_mfs(lp, mfs))
+               return -EINVAL;
+
+       /* offload features support */
+       if (fc->real_dev->features & NETIF_F_SG)
+               lp->sg_supp = 1;
+
+#ifdef NETIF_F_FCOE_CRC
+       if (netdev->features & NETIF_F_FCOE_CRC) {
+               lp->crc_offload = 1;
+               printk(KERN_DEBUG "fcoe:%s supports FCCRC offload\n",
+                      netdev->name);
+       }
+#endif
+#ifdef NETIF_F_FSO
+       if (netdev->features & NETIF_F_FSO) {
+               lp->seq_offload = 1;
+               lp->lso_max = netdev->gso_max_size;
+               printk(KERN_DEBUG "fcoe:%s supports LSO for max len 0x%x\n",
+                      netdev->name, lp->lso_max);
+       }
+#endif
+       if (netdev->fcoe_ddp_xid) {
+               lp->lro_enabled = 1;
+               lp->lro_xid = netdev->fcoe_ddp_xid;
+               printk(KERN_DEBUG "fcoe:%s supports LRO for max xid 0x%x\n",
+                      netdev->name, lp->lro_xid);
+       }
+       skb_queue_head_init(&fc->fcoe_pending_queue);
+       fc->fcoe_pending_queue_active = 0;
+
+       /* setup Source Mac Address */
+       memcpy(fc->ctlr.ctl_src_addr, fc->real_dev->dev_addr,
+              fc->real_dev->addr_len);
+
+       wwnn = fcoe_wwn_from_mac(fc->real_dev->dev_addr, 1, 0);
+       fc_set_wwnn(lp, wwnn);
+       /* XXX - 3rd arg needs to be vlan id */
+       wwpn = fcoe_wwn_from_mac(fc->real_dev->dev_addr, 2, 0);
+       fc_set_wwpn(lp, wwpn);
+
+       /*
+        * Add FCoE MAC address as second unicast MAC address
+        * or enter promiscuous mode if not capable of listening
+        * for multiple unicast MACs.
+        */
+       rtnl_lock();
+       memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
+       dev_unicast_add(fc->real_dev, flogi_maddr, ETH_ALEN);
+       rtnl_unlock();
+
+       /*
+        * setup the receive function from ethernet driver
+        * on the ethertype for the given device
+        */
+       fc->fcoe_packet_type.func = fcoe_rcv;
+       fc->fcoe_packet_type.type = __constant_htons(ETH_P_FCOE);
+       fc->fcoe_packet_type.dev = fc->real_dev;
+       dev_add_pack(&fc->fcoe_packet_type);
+
+       return 0;
+}
+
+/**
+ * fcoe_shost_config() - Sets up fc_lport->host
+ * @lp : ptr to the fc_lport
+ * @shost : ptr to the associated scsi host
+ * @dev : device associated to scsi host
+ *
+ * Must be called after fcoe_lport_config() and fcoe_netdev_config()
+ *
+ * Returns : 0 for success
+ */
+static int fcoe_shost_config(struct fc_lport *lp, struct Scsi_Host *shost,
+                               struct device *dev)
+{
+       int rc = 0;
+
+       /* lport scsi host config */
+       lp->host = shost;
+
+       lp->host->max_lun = FCOE_MAX_LUN;
+       lp->host->max_id = FCOE_MAX_FCP_TARGET;
+       lp->host->max_channel = 0;
+       lp->host->transportt = scsi_transport_fcoe_sw;
+
+       /* add the new host to the SCSI-ml */
+       rc = scsi_add_host(lp->host, dev);
+       if (rc) {
+               FC_DBG("fcoe_shost_config:error on scsi_add_host\n");
+               return rc;
+       }
+       sprintf(fc_host_symbolic_name(lp->host), "%s v%s over %s",
+               FCOE_NAME, FCOE_VERSION,
+               fcoe_netdev(lp)->name);
+
+       return 0;
+}
+
+/**
+ * fcoe_em_config() - allocates em for this lport
+ * @lp: the port that em is to allocated for
+ *
+ * Returns : 0 on success
+ */
+static inline int fcoe_em_config(struct fc_lport *lp)
+{
+       BUG_ON(lp->emp);
+
+       lp->emp = fc_exch_mgr_alloc(lp, FC_CLASS_3,
+                                   FCOE_MIN_XID, FCOE_MAX_XID);
+       if (!lp->emp)
+               return -ENOMEM;
+
+       return 0;
+}
+
+/**
+ * fcoe_if_destroy() - FCoE software HBA tear-down function
+ * @netdev: ptr to the associated net_device
+ *
+ * Returns: 0 if link is OK for use by FCoE.
+ */
+static int fcoe_if_destroy(struct net_device *netdev)
+{
+       struct fc_lport *lp = NULL;
+       struct fcoe_softc *fc;
+       u8 flogi_maddr[ETH_ALEN];
+
+       BUG_ON(!netdev);
+
+       printk(KERN_DEBUG "fcoe_if_destroy:interface on %s\n",
+              netdev->name);
+
+       lp = fcoe_hostlist_lookup(netdev);
+       if (!lp)
+               return -ENODEV;
+
+       fc = lport_priv(lp);
+
+       /* Logout of the fabric */
+       fc_fabric_logoff(lp);
+
+       /* Remove the instance from fcoe's list */
+       fcoe_hostlist_remove(lp);
+
+       /* Don't listen for Ethernet packets anymore */
+       dev_remove_pack(&fc->fcoe_packet_type);
+       dev_remove_pack(&fc->fip_packet_type);
+       fcoe_ctlr_destroy(&fc->ctlr);
+
+       /* Cleanup the fc_lport */
+       fc_lport_destroy(lp);
+       fc_fcp_destroy(lp);
+
+       /* Detach from the scsi-ml */
+       fc_remove_host(lp->host);
+       scsi_remove_host(lp->host);
+
+       /* There are no more rports or I/O, free the EM */
+       if (lp->emp)
+               fc_exch_mgr_free(lp->emp);
+
+       /* Delete secondary MAC addresses */
+       rtnl_lock();
+       memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
+       dev_unicast_delete(fc->real_dev, flogi_maddr, ETH_ALEN);
+       if (!is_zero_ether_addr(fc->ctlr.data_src_addr))
+               dev_unicast_delete(fc->real_dev,
+                                  fc->ctlr.data_src_addr, ETH_ALEN);
+       dev_mc_delete(fc->real_dev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0);
+       rtnl_unlock();
+
+       /* Free the per-CPU revieve threads */
+       fcoe_percpu_clean(lp);
+
+       /* Free existing skbs */
+       fcoe_clean_pending_queue(lp);
+
+       /* Free memory used by statistical counters */
+       fc_lport_free_stats(lp);
+
+       /* Release the net_device and Scsi_Host */
+       dev_put(fc->real_dev);
+       scsi_host_put(lp->host);
+
+       return 0;
+}
+
+/*
+ * fcoe_ddp_setup - calls LLD's ddp_setup through net_device
+ * @lp:        the corresponding fc_lport
+ * @xid: the exchange id for this ddp transfer
+ * @sgl: the scatterlist describing this transfer
+ * @sgc: number of sg items
+ *
+ * Returns : 0 no ddp
+ */
+static int fcoe_ddp_setup(struct fc_lport *lp, u16 xid,
+                            struct scatterlist *sgl, unsigned int sgc)
+{
+       struct net_device *n = fcoe_netdev(lp);
+
+       if (n->netdev_ops && n->netdev_ops->ndo_fcoe_ddp_setup)
+               return n->netdev_ops->ndo_fcoe_ddp_setup(n, xid, sgl, sgc);
+
+       return 0;
+}
+
+/*
+ * fcoe_ddp_done - calls LLD's ddp_done through net_device
+ * @lp:        the corresponding fc_lport
+ * @xid: the exchange id for this ddp transfer
+ *
+ * Returns : the length of data that have been completed by ddp
+ */
+static int fcoe_ddp_done(struct fc_lport *lp, u16 xid)
+{
+       struct net_device *n = fcoe_netdev(lp);
+
+       if (n->netdev_ops && n->netdev_ops->ndo_fcoe_ddp_done)
+               return n->netdev_ops->ndo_fcoe_ddp_done(n, xid);
+       return 0;
+}
+
+static struct libfc_function_template fcoe_libfc_fcn_templ = {
+       .frame_send = fcoe_xmit,
+       .ddp_setup = fcoe_ddp_setup,
+       .ddp_done = fcoe_ddp_done,
+};
+
+/**
+ * fcoe_fip_recv - handle a received FIP frame.
+ * @skb: the receive skb
+ * @dev: associated &net_device
+ * @ptype: the &packet_type structure which was used to register this handler.
+ * @orig_dev: original receive &net_device, in case @dev is a bond.
+ *
+ * Returns: 0 for success
+ */
+static int fcoe_fip_recv(struct sk_buff *skb, struct net_device *dev,
+                        struct packet_type *ptype,
+                        struct net_device *orig_dev)
+{
+       struct fcoe_softc *fc;
+
+       fc = container_of(ptype, struct fcoe_softc, fip_packet_type);
+       fcoe_ctlr_recv(&fc->ctlr, skb);
+       return 0;
+}
+
+/**
+ * fcoe_fip_send() - send an Ethernet-encapsulated FIP frame.
+ * @fip: FCoE controller.
+ * @skb: FIP Packet.
+ */
+static void fcoe_fip_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
+{
+       skb->dev = fcoe_from_ctlr(fip)->real_dev;
+       dev_queue_xmit(skb);
+}
+
+/**
+ * fcoe_update_src_mac() - Update Ethernet MAC filters.
+ * @fip: FCoE controller.
+ * @old: Unicast MAC address to delete if the MAC is non-zero.
+ * @new: Unicast MAC address to add.
+ *
+ * Remove any previously-set unicast MAC filter.
+ * Add secondary FCoE MAC address filter for our OUI.
+ */
+static void fcoe_update_src_mac(struct fcoe_ctlr *fip, u8 *old, u8 *new)
+{
+       struct fcoe_softc *fc;
+
+       fc = fcoe_from_ctlr(fip);
+       rtnl_lock();
+       if (!is_zero_ether_addr(old))
+               dev_unicast_delete(fc->real_dev, old, ETH_ALEN);
+       dev_unicast_add(fc->real_dev, new, ETH_ALEN);
+       rtnl_unlock();
+}
+
+/**
+ * fcoe_if_create() - this function creates the fcoe interface
+ * @netdev: pointer the associated netdevice
+ *
+ * Creates fc_lport struct and scsi_host for lport, configures lport
+ * and starts fabric login.
+ *
+ * Returns : 0 on success
+ */
+static int fcoe_if_create(struct net_device *netdev)
+{
+       int rc;
+       struct fc_lport *lp = NULL;
+       struct fcoe_softc *fc;
+       struct Scsi_Host *shost;
+
+       BUG_ON(!netdev);
+
+       printk(KERN_DEBUG "fcoe_if_create:interface on %s\n",
+              netdev->name);
+
+       lp = fcoe_hostlist_lookup(netdev);
+       if (lp)
+               return -EEXIST;
+
+       shost = libfc_host_alloc(&fcoe_shost_template,
+                                sizeof(struct fcoe_softc));
+       if (!shost) {
+               FC_DBG("Could not allocate host structure\n");
+               return -ENOMEM;
+       }
+       lp = shost_priv(shost);
+       fc = lport_priv(lp);
+
+       /* configure fc_lport, e.g., em */
+       rc = fcoe_lport_config(lp);
+       if (rc) {
+               FC_DBG("Could not configure lport\n");
+               goto out_host_put;
+       }
+
+       /* configure lport network properties */
+       rc = fcoe_netdev_config(lp, netdev);
+       if (rc) {
+               FC_DBG("Could not configure netdev for lport\n");
+               goto out_host_put;
+       }
+
+       /*
+        * Initialize FIP.
+        */
+       fcoe_ctlr_init(&fc->ctlr);
+       fc->ctlr.send = fcoe_fip_send;
+       fc->ctlr.update_mac = fcoe_update_src_mac;
+
+       fc->fip_packet_type.func = fcoe_fip_recv;
+       fc->fip_packet_type.type = htons(ETH_P_FIP);
+       fc->fip_packet_type.dev = fc->real_dev;
+       dev_add_pack(&fc->fip_packet_type);
+
+       /* configure lport scsi host properties */
+       rc = fcoe_shost_config(lp, shost, &netdev->dev);
+       if (rc) {
+               FC_DBG("Could not configure shost for lport\n");
+               goto out_host_put;
+       }
+
+       /* lport exch manager allocation */
+       rc = fcoe_em_config(lp);
+       if (rc) {
+               FC_DBG("Could not configure em for lport\n");
+               goto out_host_put;
+       }
+
+       /* Initialize the library */
+       rc = fcoe_libfc_config(lp, &fcoe_libfc_fcn_templ);
+       if (rc) {
+               FC_DBG("Could not configure libfc for lport!\n");
+               goto out_lp_destroy;
+       }
+
+       /* add to lports list */
+       fcoe_hostlist_add(lp);
+
+       lp->boot_time = jiffies;
+
+       fc_fabric_login(lp);
+
+       if (!fcoe_link_ok(lp))
+               fcoe_ctlr_link_up(&fc->ctlr);
+
+       dev_hold(netdev);
+
+       return rc;
+
+out_lp_destroy:
+       fc_exch_mgr_free(lp->emp); /* Free the EM */
+out_host_put:
+       scsi_host_put(lp->host);
+       return rc;
+}
+
+/**
+ * fcoe_if_init() - attach to scsi transport
+ *
+ * Returns : 0 on success
+ */
+static int __init fcoe_if_init(void)
+{
+       /* attach to scsi transport */
+       scsi_transport_fcoe_sw =
+               fc_attach_transport(&fcoe_transport_function);
+
+       if (!scsi_transport_fcoe_sw) {
+               printk(KERN_ERR "fcoe_init:fc_attach_transport() failed\n");
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+/**
+ * fcoe_if_exit() - detach from scsi transport
+ *
+ * Returns : 0 on success
+ */
+int __exit fcoe_if_exit(void)
+{
+       fc_release_transport(scsi_transport_fcoe_sw);
+       return 0;
+}
+
+/**
+ * fcoe_percpu_thread_create() - Create a receive thread for an online cpu
+ * @cpu: cpu index for the online cpu
+ */
+static void fcoe_percpu_thread_create(unsigned int cpu)
+{
+       struct fcoe_percpu_s *p;
+       struct task_struct *thread;
+
+       p = &per_cpu(fcoe_percpu, cpu);
+
+       thread = kthread_create(fcoe_percpu_receive_thread,
+                               (void *)p, "fcoethread/%d", cpu);
+
+       if (likely(!IS_ERR(p->thread))) {
+               kthread_bind(thread, cpu);
+               wake_up_process(thread);
+
+               spin_lock_bh(&p->fcoe_rx_list.lock);
+               p->thread = thread;
+               spin_unlock_bh(&p->fcoe_rx_list.lock);
+       }
+}
+
+/**
+ * fcoe_percpu_thread_destroy() - removes the rx thread for the given cpu
+ * @cpu: cpu index the rx thread is to be removed
+ *
+ * Destroys a per-CPU Rx thread. Any pending skbs are moved to the
+ * current CPU's Rx thread. If the thread being destroyed is bound to
+ * the CPU processing this context the skbs will be freed.
+ */
+static void fcoe_percpu_thread_destroy(unsigned int cpu)
+{
+       struct fcoe_percpu_s *p;
+       struct task_struct *thread;
+       struct page *crc_eof;
+       struct sk_buff *skb;
+#ifdef CONFIG_SMP
+       struct fcoe_percpu_s *p0;
+       unsigned targ_cpu = smp_processor_id();
+#endif /* CONFIG_SMP */
+
+       printk(KERN_DEBUG "fcoe: Destroying receive thread for CPU %d\n", cpu);
+
+       /* Prevent any new skbs from being queued for this CPU. */
+       p = &per_cpu(fcoe_percpu, cpu);
+       spin_lock_bh(&p->fcoe_rx_list.lock);
+       thread = p->thread;
+       p->thread = NULL;
+       crc_eof = p->crc_eof_page;
+       p->crc_eof_page = NULL;
+       p->crc_eof_offset = 0;
+       spin_unlock_bh(&p->fcoe_rx_list.lock);
+
+#ifdef CONFIG_SMP
+       /*
+        * Don't bother moving the skb's if this context is running
+        * on the same CPU that is having its thread destroyed. This
+        * can easily happen when the module is removed.
+        */
+       if (cpu != targ_cpu) {
+               p0 = &per_cpu(fcoe_percpu, targ_cpu);
+               spin_lock_bh(&p0->fcoe_rx_list.lock);
+               if (p0->thread) {
+                       FC_DBG("Moving frames from CPU %d to CPU %d\n",
+                              cpu, targ_cpu);
+
+                       while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
+                               __skb_queue_tail(&p0->fcoe_rx_list, skb);
+                       spin_unlock_bh(&p0->fcoe_rx_list.lock);
+               } else {
+                       /*
+                        * The targeted CPU is not initialized and cannot accept
+                        * new  skbs. Unlock the targeted CPU and drop the skbs
+                        * on the CPU that is going offline.
+                        */
+                       while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
+                               kfree_skb(skb);
+                       spin_unlock_bh(&p0->fcoe_rx_list.lock);
+               }
+       } else {
+               /*
+                * This scenario occurs when the module is being removed
+                * and all threads are being destroyed. skbs will continue
+                * to be shifted from the CPU thread that is being removed
+                * to the CPU thread associated with the CPU that is processing
+                * the module removal. Once there is only one CPU Rx thread it
+                * will reach this case and we will drop all skbs and later
+                * stop the thread.
+                */
+               spin_lock_bh(&p->fcoe_rx_list.lock);
+               while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
+                       kfree_skb(skb);
+               spin_unlock_bh(&p->fcoe_rx_list.lock);
+       }
+#else
+       /*
+        * This a non-SMP scenario where the singluar Rx thread is
+        * being removed. Free all skbs and stop the thread.
+        */
+       spin_lock_bh(&p->fcoe_rx_list.lock);
+       while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
+               kfree_skb(skb);
+       spin_unlock_bh(&p->fcoe_rx_list.lock);
+#endif
+
+       if (thread)
+               kthread_stop(thread);
+
+       if (crc_eof)
+               put_page(crc_eof);
+}
+
+/**
+ * fcoe_cpu_callback() - fcoe cpu hotplug event callback
+ * @nfb: callback data block
+ * @action: event triggering the callback
+ * @hcpu: index for the cpu of this event
+ *
+ * This creates or destroys per cpu data for fcoe
+ *
+ * Returns NOTIFY_OK always.
+ */
+static int fcoe_cpu_callback(struct notifier_block *nfb,
+                            unsigned long action, void *hcpu)
+{
+       unsigned cpu = (unsigned long)hcpu;
+
+       switch (action) {
+       case CPU_ONLINE:
+       case CPU_ONLINE_FROZEN:
+               FC_DBG("CPU %x online: Create Rx thread\n", cpu);
+               fcoe_percpu_thread_create(cpu);
+               break;
+       case CPU_DEAD:
+       case CPU_DEAD_FROZEN:
+               FC_DBG("CPU %x offline: Remove Rx thread\n", cpu);
+               fcoe_percpu_thread_destroy(cpu);
+               break;
+       default:
+               break;
+       }
+       return NOTIFY_OK;
+}
+
+static struct notifier_block fcoe_cpu_notifier = {
+       .notifier_call = fcoe_cpu_callback,
+};
+
+/**
+ * fcoe_rcv() - this is the fcoe receive function called by NET_RX_SOFTIRQ
+ * @skb: the receive skb
+ * @dev: associated net device
+ * @ptype: context
+ * @odldev: last device
+ *
+ * this function will receive the packet and build fc frame and pass it up
+ *
+ * Returns: 0 for success
+ */
+int fcoe_rcv(struct sk_buff *skb, struct net_device *dev,
+            struct packet_type *ptype, struct net_device *olddev)
+{
+       struct fc_lport *lp;
+       struct fcoe_rcv_info *fr;
+       struct fcoe_softc *fc;
+       struct fc_frame_header *fh;
+       struct fcoe_percpu_s *fps;
+       unsigned short oxid;
+       unsigned int cpu = 0;
+
+       fc = container_of(ptype, struct fcoe_softc, fcoe_packet_type);
+       lp = fc->ctlr.lp;
+       if (unlikely(lp == NULL)) {
+               FC_DBG("cannot find hba structure");
+               goto err2;
+       }
+       if (!lp->link_up)
+               goto err2;
+
+       if (unlikely(debug_fcoe)) {
+               FC_DBG("skb_info: len:%d data_len:%d head:%p data:%p tail:%p "
+                      "end:%p sum:%d dev:%s", skb->len, skb->data_len,
+                      skb->head, skb->data, skb_tail_pointer(skb),
+                      skb_end_pointer(skb), skb->csum,
+                      skb->dev ? skb->dev->name : "<NULL>");
+
+       }
+
+       /* check for FCOE packet type */
+       if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) {
+               FC_DBG("wrong FC type frame");
+               goto err;
+       }
+
+       /*
+        * Check for minimum frame length, and make sure required FCoE
+        * and FC headers are pulled into the linear data area.
+        */
+       if (unlikely((skb->len < FCOE_MIN_FRAME) ||
+           !pskb_may_pull(skb, FCOE_HEADER_LEN)))
+               goto err;
+
+       skb_set_transport_header(skb, sizeof(struct fcoe_hdr));
+       fh = (struct fc_frame_header *) skb_transport_header(skb);
+
+       oxid = ntohs(fh->fh_ox_id);
+
+       fr = fcoe_dev_from_skb(skb);
+       fr->fr_dev = lp;
+       fr->ptype = ptype;
+
+#ifdef CONFIG_SMP
+       /*
+        * The incoming frame exchange id(oxid) is ANDed with num of online
+        * cpu bits to get cpu and then this cpu is used for selecting
+        * a per cpu kernel thread from fcoe_percpu.
+        */
+       cpu = oxid & (num_online_cpus() - 1);
+#endif
+
+       fps = &per_cpu(fcoe_percpu, cpu);
+       spin_lock_bh(&fps->fcoe_rx_list.lock);
+       if (unlikely(!fps->thread)) {
+               /*
+                * The targeted CPU is not ready, let's target
+                * the first CPU now. For non-SMP systems this
+                * will check the same CPU twice.
+                */
+               FC_DBG("CPU is online, but no receive thread ready "
+                      "for incoming skb- using first online CPU.\n");
+
+               spin_unlock_bh(&fps->fcoe_rx_list.lock);
+               cpu = first_cpu(cpu_online_map);
+               fps = &per_cpu(fcoe_percpu, cpu);
+               spin_lock_bh(&fps->fcoe_rx_list.lock);
+               if (!fps->thread) {
+                       spin_unlock_bh(&fps->fcoe_rx_list.lock);
+                       goto err;
+               }
+       }
+
+       /*
+        * We now have a valid CPU that we're targeting for
+        * this skb. We also have this receive thread locked,
+        * so we're free to queue skbs into it's queue.
+        */
+       __skb_queue_tail(&fps->fcoe_rx_list, skb);
+       if (fps->fcoe_rx_list.qlen == 1)
+               wake_up_process(fps->thread);
+
+       spin_unlock_bh(&fps->fcoe_rx_list.lock);
+
+       return 0;
+err:
+       fc_lport_get_stats(lp)->ErrorFrames++;
+
+err2:
+       kfree_skb(skb);
+       return -1;
+}
+EXPORT_SYMBOL_GPL(fcoe_rcv);
+
+/**
+ * fcoe_start_io() - pass to netdev to start xmit for fcoe
+ * @skb: the skb to be xmitted
+ *
+ * Returns: 0 for success
+ */
+static inline int fcoe_start_io(struct sk_buff *skb)
+{
+       int rc;
+
+       skb_get(skb);
+       rc = dev_queue_xmit(skb);
+       if (rc != 0)
+               return rc;
+       kfree_skb(skb);
+       return 0;
+}
+
+/**
+ * fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof
+ * @skb: the skb to be xmitted
+ * @tlen: total len
+ *
+ * Returns: 0 for success
+ */
+static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen)
+{
+       struct fcoe_percpu_s *fps;
+       struct page *page;
+
+       fps = &get_cpu_var(fcoe_percpu);
+       page = fps->crc_eof_page;
+       if (!page) {
+               page = alloc_page(GFP_ATOMIC);
+               if (!page) {
+                       put_cpu_var(fcoe_percpu);
+                       return -ENOMEM;
+               }
+               fps->crc_eof_page = page;
+               fps->crc_eof_offset = 0;
+       }
+
+       get_page(page);
+       skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page,
+                          fps->crc_eof_offset, tlen);
+       skb->len += tlen;
+       skb->data_len += tlen;
+       skb->truesize += tlen;
+       fps->crc_eof_offset += sizeof(struct fcoe_crc_eof);
+
+       if (fps->crc_eof_offset >= PAGE_SIZE) {
+               fps->crc_eof_page = NULL;
+               fps->crc_eof_offset = 0;
+               put_page(page);
+       }
+       put_cpu_var(fcoe_percpu);
+       return 0;
+}
+
+/**
+ * fcoe_fc_crc() - calculates FC CRC in this fcoe skb
+ * @fp: the fc_frame containg data to be checksummed
+ *
+ * This uses crc32() to calculate the crc for fc frame
+ * Return   : 32 bit crc
+ */
+u32 fcoe_fc_crc(struct fc_frame *fp)
+{
+       struct sk_buff *skb = fp_skb(fp);
+       struct skb_frag_struct *frag;
+       unsigned char *data;
+       unsigned long off, len, clen;
+       u32 crc;
+       unsigned i;
+
+       crc = crc32(~0, skb->data, skb_headlen(skb));
+
+       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+               frag = &skb_shinfo(skb)->frags[i];
+               off = frag->page_offset;
+               len = frag->size;
+               while (len > 0) {
+                       clen = min(len, PAGE_SIZE - (off & ~PAGE_MASK));
+                       data = kmap_atomic(frag->page + (off >> PAGE_SHIFT),
+                                          KM_SKB_DATA_SOFTIRQ);
+                       crc = crc32(crc, data + (off & ~PAGE_MASK), clen);
+                       kunmap_atomic(data, KM_SKB_DATA_SOFTIRQ);
+                       off += clen;
+                       len -= clen;
+               }
+       }
+       return crc;
+}
+
+/**
+ * fcoe_xmit() - FCoE frame transmit function
+ * @lp:        the associated local port
+ * @fp: the fc_frame to be transmitted
+ *
+ * Return   : 0 for success
+ */
+int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
+{
+       int wlen, rc = 0;
+       u32 crc;
+       struct ethhdr *eh;
+       struct fcoe_crc_eof *cp;
+       struct sk_buff *skb;
+       struct fcoe_dev_stats *stats;
+       struct fc_frame_header *fh;
+       unsigned int hlen;              /* header length implies the version */
+       unsigned int tlen;              /* trailer length */
+       unsigned int elen;              /* eth header, may include vlan */
+       struct fcoe_softc *fc;
+       u8 sof, eof;
+       struct fcoe_hdr *hp;
+
+       WARN_ON((fr_len(fp) % sizeof(u32)) != 0);
+
+       fc = lport_priv(lp);
+       fh = fc_frame_header_get(fp);
+       skb = fp_skb(fp);
+       wlen = skb->len / FCOE_WORD_TO_BYTE;
+
+       if (!lp->link_up) {
+               kfree(skb);
+               return 0;
+       }
+
+       if (unlikely(fh->fh_r_ctl == FC_RCTL_ELS_REQ) &&
+           fcoe_ctlr_els_send(&fc->ctlr, skb))
+               return 0;
+
+       sof = fr_sof(fp);
+       eof = fr_eof(fp);
+
+       elen = (fc->real_dev->priv_flags & IFF_802_1Q_VLAN) ?
+               sizeof(struct vlan_ethhdr) : sizeof(struct ethhdr);
+       hlen = sizeof(struct fcoe_hdr);
+       tlen = sizeof(struct fcoe_crc_eof);
+       wlen = (skb->len - tlen + sizeof(crc)) / FCOE_WORD_TO_BYTE;
+
+       /* crc offload */
+       if (likely(lp->crc_offload)) {
+               skb->ip_summed = CHECKSUM_PARTIAL;
+               skb->csum_start = skb_headroom(skb);
+               skb->csum_offset = skb->len;
+               crc = 0;
+       } else {
+               skb->ip_summed = CHECKSUM_NONE;
+               crc = fcoe_fc_crc(fp);
+       }
+
+       /* copy fc crc and eof to the skb buff */
+       if (skb_is_nonlinear(skb)) {
+               skb_frag_t *frag;
+               if (fcoe_get_paged_crc_eof(skb, tlen)) {
+                       kfree_skb(skb);
+                       return -ENOMEM;
+               }
+               frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
+               cp = kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ)
+                       + frag->page_offset;
+       } else {
+               cp = (struct fcoe_crc_eof *)skb_put(skb, tlen);
+       }
+
+       memset(cp, 0, sizeof(*cp));
+       cp->fcoe_eof = eof;
+       cp->fcoe_crc32 = cpu_to_le32(~crc);
+
+       if (skb_is_nonlinear(skb)) {
+               kunmap_atomic(cp, KM_SKB_DATA_SOFTIRQ);
+               cp = NULL;
+       }
+
+       /* adjust skb netowrk/transport offsets to match mac/fcoe/fc */
+       skb_push(skb, elen + hlen);
+       skb_reset_mac_header(skb);
+       skb_reset_network_header(skb);
+       skb->mac_len = elen;
+       skb->protocol = htons(ETH_P_FCOE);
+       skb->dev = fc->real_dev;
+
+       /* fill up mac and fcoe headers */
+       eh = eth_hdr(skb);
+       eh->h_proto = htons(ETH_P_FCOE);
+       if (fc->ctlr.map_dest)
+               fc_fcoe_set_mac(eh->h_dest, fh->fh_d_id);
+       else
+               /* insert GW address */
+               memcpy(eh->h_dest, fc->ctlr.dest_addr, ETH_ALEN);
+
+       if (unlikely(fc->ctlr.flogi_oxid != FC_XID_UNKNOWN))
+               memcpy(eh->h_source, fc->ctlr.ctl_src_addr, ETH_ALEN);
+       else
+               memcpy(eh->h_source, fc->ctlr.data_src_addr, ETH_ALEN);
+
+       hp = (struct fcoe_hdr *)(eh + 1);
+       memset(hp, 0, sizeof(*hp));
+       if (FC_FCOE_VER)
+               FC_FCOE_ENCAPS_VER(hp, FC_FCOE_VER);
+       hp->fcoe_sof = sof;
+
+#ifdef NETIF_F_FSO
+       /* fcoe lso, mss is in max_payload which is non-zero for FCP data */
+       if (lp->seq_offload && fr_max_payload(fp)) {
+               skb_shinfo(skb)->gso_type = SKB_GSO_FCOE;
+               skb_shinfo(skb)->gso_size = fr_max_payload(fp);
+       } else {
+               skb_shinfo(skb)->gso_type = 0;
+               skb_shinfo(skb)->gso_size = 0;
+       }
+#endif
+       /* update tx stats: regardless if LLD fails */
+       stats = fc_lport_get_stats(lp);
+       stats->TxFrames++;
+       stats->TxWords += wlen;
+
+       /* send down to lld */
+       fr_dev(fp) = lp;
+       if (fc->fcoe_pending_queue.qlen)
+               rc = fcoe_check_wait_queue(lp);
+
+       if (rc == 0)
+               rc = fcoe_start_io(skb);
+
+       if (rc) {
+               spin_lock_bh(&fc->fcoe_pending_queue.lock);
+               __skb_queue_tail(&fc->fcoe_pending_queue, skb);
+               spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+               if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
+                       lp->qfull = 1;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(fcoe_xmit);
+
+/**
+ * fcoe_percpu_receive_thread() - recv thread per cpu
+ * @arg: ptr to the fcoe per cpu struct
+ *
+ * Return: 0 for success
+ */
+int fcoe_percpu_receive_thread(void *arg)
+{
+       struct fcoe_percpu_s *p = arg;
+       u32 fr_len;
+       struct fc_lport *lp;
+       struct fcoe_rcv_info *fr;
+       struct fcoe_dev_stats *stats;
+       struct fc_frame_header *fh;
+       struct sk_buff *skb;
+       struct fcoe_crc_eof crc_eof;
+       struct fc_frame *fp;
+       u8 *mac = NULL;
+       struct fcoe_softc *fc;
+       struct fcoe_hdr *hp;
+
+       set_user_nice(current, -20);
+
+       while (!kthread_should_stop()) {
+
+               spin_lock_bh(&p->fcoe_rx_list.lock);
+               while ((skb = __skb_dequeue(&p->fcoe_rx_list)) == NULL) {
+                       set_current_state(TASK_INTERRUPTIBLE);
+                       spin_unlock_bh(&p->fcoe_rx_list.lock);
+                       schedule();
+                       set_current_state(TASK_RUNNING);
+                       if (kthread_should_stop())
+                               return 0;
+                       spin_lock_bh(&p->fcoe_rx_list.lock);
+               }
+               spin_unlock_bh(&p->fcoe_rx_list.lock);
+               fr = fcoe_dev_from_skb(skb);
+               lp = fr->fr_dev;
+               if (unlikely(lp == NULL)) {
+                       FC_DBG("invalid HBA Structure");
+                       kfree_skb(skb);
+                       continue;
+               }
+
+               if (unlikely(debug_fcoe)) {
+                       FC_DBG("skb_info: len:%d data_len:%d head:%p data:%p "
+                              "tail:%p end:%p sum:%d dev:%s",
+                              skb->len, skb->data_len,
+                              skb->head, skb->data, skb_tail_pointer(skb),
+                              skb_end_pointer(skb), skb->csum,
+                              skb->dev ? skb->dev->name : "<NULL>");
+               }
+
+               /*
+                * Save source MAC address before discarding header.
+                */
+               fc = lport_priv(lp);
+               if (skb_is_nonlinear(skb))
+                       skb_linearize(skb);     /* not ideal */
+               mac = eth_hdr(skb)->h_source;
+
+               /*
+                * Frame length checks and setting up the header pointers
+                * was done in fcoe_rcv already.
+                */
+               hp = (struct fcoe_hdr *) skb_network_header(skb);
+               fh = (struct fc_frame_header *) skb_transport_header(skb);
+
+               stats = fc_lport_get_stats(lp);
+               if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) {
+                       if (stats->ErrorFrames < 5)
+                               printk(KERN_WARNING "FCoE version "
+                                      "mismatch: The frame has "
+                                      "version %x, but the "
+                                      "initiator supports version "
+                                      "%x\n", FC_FCOE_DECAPS_VER(hp),
+                                      FC_FCOE_VER);
+                       stats->ErrorFrames++;
+                       kfree_skb(skb);
+                       continue;
+               }
+
+               skb_pull(skb, sizeof(struct fcoe_hdr));
+               fr_len = skb->len - sizeof(struct fcoe_crc_eof);
+
+               stats->RxFrames++;
+               stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
+
+               fp = (struct fc_frame *)skb;
+               fc_frame_init(fp);
+               fr_dev(fp) = lp;
+               fr_sof(fp) = hp->fcoe_sof;
+
+               /* Copy out the CRC and EOF trailer for access */
+               if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof))) {
+                       kfree_skb(skb);
+                       continue;
+               }
+               fr_eof(fp) = crc_eof.fcoe_eof;
+               fr_crc(fp) = crc_eof.fcoe_crc32;
+               if (pskb_trim(skb, fr_len)) {
+                       kfree_skb(skb);
+                       continue;
+               }
+
+               /*
+                * We only check CRC if no offload is available and if it is
+                * it's solicited data, in which case, the FCP layer would
+                * check it during the copy.
+                */
+               if (lp->crc_offload && skb->ip_summed == CHECKSUM_UNNECESSARY)
+                       fr_flags(fp) &= ~FCPHF_CRC_UNCHECKED;
+               else
+                       fr_flags(fp) |= FCPHF_CRC_UNCHECKED;
+
+               fh = fc_frame_header_get(fp);
+               if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA &&
+                   fh->fh_type == FC_TYPE_FCP) {
+                       fc_exch_recv(lp, lp->emp, fp);
+                       continue;
+               }
+               if (fr_flags(fp) & FCPHF_CRC_UNCHECKED) {
+                       if (le32_to_cpu(fr_crc(fp)) !=
+                           ~crc32(~0, skb->data, fr_len)) {
+                               if (debug_fcoe || stats->InvalidCRCCount < 5)
+                                       printk(KERN_WARNING "fcoe: dropping "
+                                              "frame with CRC error\n");
+                               stats->InvalidCRCCount++;
+                               stats->ErrorFrames++;
+                               fc_frame_free(fp);
+                               continue;
+                       }
+                       fr_flags(fp) &= ~FCPHF_CRC_UNCHECKED;
+               }
+               if (unlikely(fc->ctlr.flogi_oxid != FC_XID_UNKNOWN) &&
+                   fcoe_ctlr_recv_flogi(&fc->ctlr, fp, mac)) {
+                       fc_frame_free(fp);
+                       continue;
+               }
+               fc_exch_recv(lp, lp->emp, fp);
+       }
+       return 0;
+}
+
+/**
+ * fcoe_watchdog() - fcoe timer callback
+ * @vp:
+ *
+ * This checks the pending queue length for fcoe and set lport qfull
+ * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the
+ * fcoe_hostlist.
+ *
+ * Returns: 0 for success
+ */
+void fcoe_watchdog(ulong vp)
+{
+       struct fcoe_softc *fc;
+
+       read_lock(&fcoe_hostlist_lock);
+       list_for_each_entry(fc, &fcoe_hostlist, list) {
+               if (fc->ctlr.lp)
+                       fcoe_check_wait_queue(fc->ctlr.lp);
+       }
+       read_unlock(&fcoe_hostlist_lock);
+
+       fcoe_timer.expires = jiffies + (1 * HZ);
+       add_timer(&fcoe_timer);
+}
+
+
+/**
+ * fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue
+ * @lp: the fc_port for this skb
+ * @skb: the associated skb to be xmitted
+ *
+ * This empties the wait_queue, dequeue the head of the wait_queue queue
+ * and calls fcoe_start_io() for each packet, if all skb have been
+ * transmitted, return qlen or -1 if a error occurs, then restore
+ * wait_queue and  try again later.
+ *
+ * The wait_queue is used when the skb transmit fails. skb will go
+ * in the wait_queue which will be emptied by the time function OR
+ * by the next skb transmit.
+ *
+ * Returns: 0 for success
+ */
+static int fcoe_check_wait_queue(struct fc_lport *lp)
+{
+       struct fcoe_softc *fc = lport_priv(lp);
+       struct sk_buff *skb;
+       int rc = -1;
+
+       spin_lock_bh(&fc->fcoe_pending_queue.lock);
+       if (fc->fcoe_pending_queue_active)
+               goto out;
+       fc->fcoe_pending_queue_active = 1;
+
+       while (fc->fcoe_pending_queue.qlen) {
+               /* keep qlen > 0 until fcoe_start_io succeeds */
+               fc->fcoe_pending_queue.qlen++;
+               skb = __skb_dequeue(&fc->fcoe_pending_queue);
+
+               spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+               rc = fcoe_start_io(skb);
+               spin_lock_bh(&fc->fcoe_pending_queue.lock);
+
+               if (rc) {
+                       __skb_queue_head(&fc->fcoe_pending_queue, skb);
+                       /* undo temporary increment above */
+                       fc->fcoe_pending_queue.qlen--;
+                       break;
+               }
+               /* undo temporary increment above */
+               fc->fcoe_pending_queue.qlen--;
+       }
+
+       if (fc->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH)
+               lp->qfull = 0;
+       fc->fcoe_pending_queue_active = 0;
+       rc = fc->fcoe_pending_queue.qlen;
+out:
+       spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+       return rc;
+}
+
+/**
+ * fcoe_dev_setup() - setup link change notification interface
+ */
+static void fcoe_dev_setup()
+{
+       /*
+        * here setup a interface specific wd time to
+        * monitor the link state
+        */
+       register_netdevice_notifier(&fcoe_notifier);
+}
+
+/**
+ * fcoe_dev_setup() - cleanup link change notification interface
+ */
+static void fcoe_dev_cleanup(void)
+{
+       unregister_netdevice_notifier(&fcoe_notifier);
+}
+
+/**
+ * fcoe_device_notification() - netdev event notification callback
+ * @notifier: context of the notification
+ * @event: type of event
+ * @ptr: fixed array for output parsed ifname
+ *
+ * This function is called by the ethernet driver in case of link change event
+ *
+ * Returns: 0 for success
+ */
+static int fcoe_device_notification(struct notifier_block *notifier,
+                                   ulong event, void *ptr)
+{
+       struct fc_lport *lp = NULL;
+       struct net_device *real_dev = ptr;
+       struct fcoe_softc *fc;
+       struct fcoe_dev_stats *stats;
+       u32 link_possible = 1;
+       u32 mfs;
+       int rc = NOTIFY_OK;
+
+       read_lock(&fcoe_hostlist_lock);
+       list_for_each_entry(fc, &fcoe_hostlist, list) {
+               if (fc->real_dev == real_dev) {
+                       lp = fc->ctlr.lp;
+                       break;
+               }
+       }
+       read_unlock(&fcoe_hostlist_lock);
+       if (lp == NULL) {
+               rc = NOTIFY_DONE;
+               goto out;
+       }
+
+       switch (event) {
+       case NETDEV_DOWN:
+       case NETDEV_GOING_DOWN:
+               link_possible = 0;
+               break;
+       case NETDEV_UP:
+       case NETDEV_CHANGE:
+               break;
+       case NETDEV_CHANGEMTU:
+               mfs = fc->real_dev->mtu -
+                       (sizeof(struct fcoe_hdr) +
+                        sizeof(struct fcoe_crc_eof));
+               if (mfs >= FC_MIN_MAX_FRAME)
+                       fc_set_mfs(lp, mfs);
+               break;
+       case NETDEV_REGISTER:
+               break;
+       default:
+               FC_DBG("Unknown event %ld from netdev netlink\n", event);
+       }
+       if (link_possible && !fcoe_link_ok(lp))
+               fcoe_ctlr_link_up(&fc->ctlr);
+       else if (fcoe_ctlr_link_down(&fc->ctlr)) {
+               stats = fc_lport_get_stats(lp);
+               stats->LinkFailureCount++;
+               fcoe_clean_pending_queue(lp);
+       }
+out:
+       return rc;
+}
+
+/**
+ * fcoe_if_to_netdev() - parse a name buffer to get netdev
+ * @ifname: fixed array for output parsed ifname
+ * @buffer: incoming buffer to be copied
+ *
+ * Returns: NULL or ptr to netdeive
+ */
+static struct net_device *fcoe_if_to_netdev(const char *buffer)
+{
+       char *cp;
+       char ifname[IFNAMSIZ + 2];
+
+       if (buffer) {
+               strlcpy(ifname, buffer, IFNAMSIZ);
+               cp = ifname + strlen(ifname);
+               while (--cp >= ifname && *cp == '\n')
+                       *cp = '\0';
+               return dev_get_by_name(&init_net, ifname);
+       }
+       return NULL;
+}
+
+/**
+ * fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev
+ * @netdev: the target netdev
+ *
+ * Returns: ptr to the struct module, NULL for failure
+ */
+static struct module *
+fcoe_netdev_to_module_owner(const struct net_device *netdev)
+{
+       struct device *dev;
+
+       if (!netdev)
+               return NULL;
+
+       dev = netdev->dev.parent;
+       if (!dev)
+               return NULL;
+
+       if (!dev->driver)
+               return NULL;
+
+       return dev->driver->owner;
+}
+
+/**
+ * fcoe_ethdrv_get() - Hold the Ethernet driver
+ * @netdev: the target netdev
+ *
+ * Holds the Ethernet driver module by try_module_get() for
+ * the corresponding netdev.
+ *
+ * Returns: 0 for succsss
+ */
+static int fcoe_ethdrv_get(const struct net_device *netdev)
+{
+       struct module *owner;
+
+       owner = fcoe_netdev_to_module_owner(netdev);
+       if (owner) {
+               printk(KERN_DEBUG "fcoe:hold driver module %s for %s\n",
+                      module_name(owner), netdev->name);
+               return  try_module_get(owner);
+       }
+       return -ENODEV;
+}
+
+/**
+ * fcoe_ethdrv_put() - Release the Ethernet driver
+ * @netdev: the target netdev
+ *
+ * Releases the Ethernet driver module by module_put for
+ * the corresponding netdev.
+ *
+ * Returns: 0 for succsss
+ */
+static int fcoe_ethdrv_put(const struct net_device *netdev)
+{
+       struct module *owner;
+
+       owner = fcoe_netdev_to_module_owner(netdev);
+       if (owner) {
+               printk(KERN_DEBUG "fcoe:release driver module %s for %s\n",
+                      module_name(owner), netdev->name);
+               module_put(owner);
+               return 0;
+       }
+       return -ENODEV;
+}
+
+/**
+ * fcoe_destroy() - handles the destroy from sysfs
+ * @buffer: expcted to be a eth if name
+ * @kp: associated kernel param
+ *
+ * Returns: 0 for success
+ */
+static int fcoe_destroy(const char *buffer, struct kernel_param *kp)
+{
+       int rc;
+       struct net_device *netdev;
+
+       netdev = fcoe_if_to_netdev(buffer);
+       if (!netdev) {
+               rc = -ENODEV;
+               goto out_nodev;
+       }
+       /* look for existing lport */
+       if (!fcoe_hostlist_lookup(netdev)) {
+               rc = -ENODEV;
+               goto out_putdev;
+       }
+       rc = fcoe_if_destroy(netdev);
+       if (rc) {
+               printk(KERN_ERR "fcoe: fcoe_if_destroy(%s) failed\n",
+                      netdev->name);
+               rc = -EIO;
+               goto out_putdev;
+       }
+       fcoe_ethdrv_put(netdev);
+       rc = 0;
+out_putdev:
+       dev_put(netdev);
+out_nodev:
+       return rc;
+}
+
+/**
+ * fcoe_create() - Handles the create call from sysfs
+ * @buffer: expcted to be a eth if name
+ * @kp: associated kernel param
+ *
+ * Returns: 0 for success
+ */
+static int fcoe_create(const char *buffer, struct kernel_param *kp)
+{
+       int rc;
+       struct net_device *netdev;
+
+       netdev = fcoe_if_to_netdev(buffer);
+       if (!netdev) {
+               rc = -ENODEV;
+               goto out_nodev;
+       }
+       /* look for existing lport */
+       if (fcoe_hostlist_lookup(netdev)) {
+               rc = -EEXIST;
+               goto out_putdev;
+       }
+       fcoe_ethdrv_get(netdev);
+
+       rc = fcoe_if_create(netdev);
+       if (rc) {
+               printk(KERN_ERR "fcoe: fcoe_if_create(%s) failed\n",
+                      netdev->name);
+               fcoe_ethdrv_put(netdev);
+               rc = -EIO;
+               goto out_putdev;
+       }
+       rc = 0;
+out_putdev:
+       dev_put(netdev);
+out_nodev:
+       return rc;
+}
+
+module_param_call(create, fcoe_create, NULL, NULL, S_IWUSR);
+__MODULE_PARM_TYPE(create, "string");
+MODULE_PARM_DESC(create, "Create fcoe port using net device passed in.");
+module_param_call(destroy, fcoe_destroy, NULL, NULL, S_IWUSR);
+__MODULE_PARM_TYPE(destroy, "string");
+MODULE_PARM_DESC(destroy, "Destroy fcoe port");
+
+/**
+ * fcoe_link_ok() - Check if link is ok for the fc_lport
+ * @lp: ptr to the fc_lport
+ *
+ * Any permanently-disqualifying conditions have been previously checked.
+ * This also updates the speed setting, which may change with link for 100/1000.
+ *
+ * This function should probably be checking for PAUSE support at some point
+ * in the future. Currently Per-priority-pause is not determinable using
+ * ethtool, so we shouldn't be restrictive until that problem is resolved.
+ *
+ * Returns: 0 if link is OK for use by FCoE.
+ *
+ */
+int fcoe_link_ok(struct fc_lport *lp)
+{
+       struct fcoe_softc *fc = lport_priv(lp);
+       struct net_device *dev = fc->real_dev;
+       struct ethtool_cmd ecmd = { ETHTOOL_GSET };
+       int rc = 0;
+
+       if ((dev->flags & IFF_UP) && netif_carrier_ok(dev)) {
+               dev = fc->phys_dev;
+               if (dev->ethtool_ops->get_settings) {
+                       dev->ethtool_ops->get_settings(dev, &ecmd);
+                       lp->link_supported_speeds &=
+                               ~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT);
+                       if (ecmd.supported & (SUPPORTED_1000baseT_Half |
+                                             SUPPORTED_1000baseT_Full))
+                               lp->link_supported_speeds |= FC_PORTSPEED_1GBIT;
+                       if (ecmd.supported & SUPPORTED_10000baseT_Full)
+                               lp->link_supported_speeds |=
+                                       FC_PORTSPEED_10GBIT;
+                       if (ecmd.speed == SPEED_1000)
+                               lp->link_speed = FC_PORTSPEED_1GBIT;
+                       if (ecmd.speed == SPEED_10000)
+                               lp->link_speed = FC_PORTSPEED_10GBIT;
+               }
+       } else
+               rc = -1;
+
+       return rc;
+}
+EXPORT_SYMBOL_GPL(fcoe_link_ok);
+
+/**
+ * fcoe_percpu_clean() - Clear the pending skbs for an lport
+ * @lp: the fc_lport
+ */
+void fcoe_percpu_clean(struct fc_lport *lp)
+{
+       struct fcoe_percpu_s *pp;
+       struct fcoe_rcv_info *fr;
+       struct sk_buff_head *list;
+       struct sk_buff *skb, *next;
+       struct sk_buff *head;
+       unsigned int cpu;
+
+       for_each_possible_cpu(cpu) {
+               pp = &per_cpu(fcoe_percpu, cpu);
+               spin_lock_bh(&pp->fcoe_rx_list.lock);
+               list = &pp->fcoe_rx_list;
+               head = list->next;
+               for (skb = head; skb != (struct sk_buff *)list;
+                    skb = next) {
+                       next = skb->next;
+                       fr = fcoe_dev_from_skb(skb);
+                       if (fr->fr_dev == lp) {
+                               __skb_unlink(skb, list);
+                               kfree_skb(skb);
+                       }
+               }
+               spin_unlock_bh(&pp->fcoe_rx_list.lock);
+       }
+}
+EXPORT_SYMBOL_GPL(fcoe_percpu_clean);
+
+/**
+ * fcoe_clean_pending_queue() - Dequeue a skb and free it
+ * @lp: the corresponding fc_lport
+ *
+ * Returns: none
+ */
+void fcoe_clean_pending_queue(struct fc_lport *lp)
+{
+       struct fcoe_softc  *fc = lport_priv(lp);
+       struct sk_buff *skb;
+
+       spin_lock_bh(&fc->fcoe_pending_queue.lock);
+       while ((skb = __skb_dequeue(&fc->fcoe_pending_queue)) != NULL) {
+               spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+               kfree_skb(skb);
+               spin_lock_bh(&fc->fcoe_pending_queue.lock);
+       }
+       spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+}
+EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue);
+
+/**
+ * fcoe_reset() - Resets the fcoe
+ * @shost: shost the reset is from
+ *
+ * Returns: always 0
+ */
+int fcoe_reset(struct Scsi_Host *shost)
+{
+       struct fc_lport *lport = shost_priv(shost);
+       fc_lport_reset(lport);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(fcoe_reset);
+
+/**
+ * fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device
+ * @device: this is currently ptr to net_device
+ *
+ * Returns: NULL or the located fcoe_softc
+ */
+static struct fcoe_softc *
+fcoe_hostlist_lookup_softc(const struct net_device *dev)
+{
+       struct fcoe_softc *fc;
+
+       read_lock(&fcoe_hostlist_lock);
+       list_for_each_entry(fc, &fcoe_hostlist, list) {
+               if (fc->real_dev == dev) {
+                       read_unlock(&fcoe_hostlist_lock);
+                       return fc;
+               }
+       }
+       read_unlock(&fcoe_hostlist_lock);
+       return NULL;
+}
+
+/**
+ * fcoe_hostlist_lookup() - Find the corresponding lport by netdev
+ * @netdev: ptr to net_device
+ *
+ * Returns: 0 for success
+ */
+struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev)
+{
+       struct fcoe_softc *fc;
+
+       fc = fcoe_hostlist_lookup_softc(netdev);
+
+       return (fc) ? fc->ctlr.lp : NULL;
+}
+EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup);
+
+/**
+ * fcoe_hostlist_add() - Add a lport to lports list
+ * @lp: ptr to the fc_lport to badded
+ *
+ * Returns: 0 for success
+ */
+int fcoe_hostlist_add(const struct fc_lport *lp)
+{
+       struct fcoe_softc *fc;
+
+       fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp));
+       if (!fc) {
+               fc = lport_priv(lp);
+               write_lock_bh(&fcoe_hostlist_lock);
+               list_add_tail(&fc->list, &fcoe_hostlist);
+               write_unlock_bh(&fcoe_hostlist_lock);
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(fcoe_hostlist_add);
+
+/**
+ * fcoe_hostlist_remove() - remove a lport from lports list
+ * @lp: ptr to the fc_lport to badded
+ *
+ * Returns: 0 for success
+ */
+int fcoe_hostlist_remove(const struct fc_lport *lp)
+{
+       struct fcoe_softc *fc;
+
+       fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp));
+       BUG_ON(!fc);
+       write_lock_bh(&fcoe_hostlist_lock);
+       list_del(&fc->list);
+       write_unlock_bh(&fcoe_hostlist_lock);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(fcoe_hostlist_remove);
+
+/**
+ * fcoe_init() - fcoe module loading initialization
+ *
+ * Returns 0 on success, negative on failure
+ */
+static int __init fcoe_init(void)
+{
+       unsigned int cpu;
+       int rc = 0;
+       struct fcoe_percpu_s *p;
+
+       INIT_LIST_HEAD(&fcoe_hostlist);
+       rwlock_init(&fcoe_hostlist_lock);
+
+       for_each_possible_cpu(cpu) {
+               p = &per_cpu(fcoe_percpu, cpu);
+               skb_queue_head_init(&p->fcoe_rx_list);
+       }
+
+       for_each_online_cpu(cpu)
+               fcoe_percpu_thread_create(cpu);
+
+       /* Initialize per CPU interrupt thread */
+       rc = register_hotcpu_notifier(&fcoe_cpu_notifier);
+       if (rc)
+               goto out_free;
+
+       /* Setup link change notification */
+       fcoe_dev_setup();
+
+       setup_timer(&fcoe_timer, fcoe_watchdog, 0);
+
+       mod_timer(&fcoe_timer, jiffies + (10 * HZ));
+
+       fcoe_if_init();
+
+       return 0;
+
+out_free:
+       for_each_online_cpu(cpu) {
+               fcoe_percpu_thread_destroy(cpu);
+       }
+
+       return rc;
+}
+module_init(fcoe_init);
+
+/**
+ * fcoe_exit() - fcoe module unloading cleanup
+ *
+ * Returns 0 on success, negative on failure
+ */
+static void __exit fcoe_exit(void)
+{
+       unsigned int cpu;
+       struct fcoe_softc *fc, *tmp;
+
+       fcoe_dev_cleanup();
+
+       /* Stop the timer */
+       del_timer_sync(&fcoe_timer);
+
+       /* releases the associated fcoe hosts */
+       list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list)
+               fcoe_if_destroy(fc->real_dev);
+
+       unregister_hotcpu_notifier(&fcoe_cpu_notifier);
+
+       for_each_online_cpu(cpu) {
+               fcoe_percpu_thread_destroy(cpu);
+       }
+
+       /* detach from scsi transport */
+       fcoe_if_exit();
+}
+module_exit(fcoe_exit);
diff --git a/drivers/scsi/fcoe/fcoe.h b/drivers/scsi/fcoe/fcoe.h
new file mode 100644 (file)
index 0000000..917aae8
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright(c) 2009 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * Maintained at www.Open-FCoE.org
+ */
+
+#ifndef _FCOE_H_
+#define _FCOE_H_
+
+#include <linux/skbuff.h>
+#include <linux/kthread.h>
+
+#define FCOE_MAX_QUEUE_DEPTH   256
+#define FCOE_LOW_QUEUE_DEPTH   32
+
+#define FCOE_WORD_TO_BYTE      4
+
+#define FCOE_VERSION   "0.1"
+#define FCOE_NAME      "fcoe"
+#define FCOE_VENDOR    "Open-FCoE.org"
+
+#define FCOE_MAX_LUN           255
+#define FCOE_MAX_FCP_TARGET    256
+
+#define FCOE_MAX_OUTSTANDING_COMMANDS  1024
+
+#define FCOE_MIN_XID           0x0001  /* the min xid supported by fcoe_sw */
+#define FCOE_MAX_XID           0x07ef  /* the max xid supported by fcoe_sw */
+
+/*
+ * this percpu struct for fcoe
+ */
+struct fcoe_percpu_s {
+       struct task_struct *thread;
+       struct sk_buff_head fcoe_rx_list;
+       struct page *crc_eof_page;
+       int crc_eof_offset;
+};
+
+/*
+ * the fcoe sw transport private data
+ */
+struct fcoe_softc {
+       struct list_head list;
+       struct net_device *real_dev;
+       struct net_device *phys_dev;            /* device with ethtool_ops */
+       struct packet_type  fcoe_packet_type;
+       struct packet_type  fip_packet_type;
+       struct sk_buff_head fcoe_pending_queue;
+       u8      fcoe_pending_queue_active;
+       struct fcoe_ctlr ctlr;
+};
+
+#define fcoe_from_ctlr(fc) container_of(fc, struct fcoe_softc, ctlr)
+
+static inline struct net_device *fcoe_netdev(
+       const struct fc_lport *lp)
+{
+       return ((struct fcoe_softc *)lport_priv(lp))->real_dev;
+}
+
+#endif /* _FCOE_H_ */
diff --git a/drivers/scsi/fcoe/fcoe_sw.c b/drivers/scsi/fcoe/fcoe_sw.c
deleted file mode 100644 (file)
index 2bbbe3c..0000000
+++ /dev/null
@@ -1,561 +0,0 @@
-/*
- * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope 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.
- *
- * Maintained at www.Open-FCoE.org
- */
-
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/spinlock.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/if_vlan.h>
-#include <net/rtnetlink.h>
-
-#include <scsi/fc/fc_els.h>
-#include <scsi/fc/fc_encaps.h>
-#include <scsi/fc/fc_fs.h>
-#include <scsi/scsi_transport.h>
-#include <scsi/scsi_transport_fc.h>
-
-#include <scsi/libfc.h>
-#include <scsi/libfcoe.h>
-#include <scsi/fc_transport_fcoe.h>
-
-#define FCOE_SW_VERSION        "0.1"
-#define        FCOE_SW_NAME    "fcoesw"
-#define        FCOE_SW_VENDOR  "Open-FCoE.org"
-
-#define FCOE_MAX_LUN           255
-#define FCOE_MAX_FCP_TARGET    256
-
-#define FCOE_MAX_OUTSTANDING_COMMANDS  1024
-
-#define FCOE_MIN_XID           0x0001  /* the min xid supported by fcoe_sw */
-#define FCOE_MAX_XID           0x07ef  /* the max xid supported by fcoe_sw */
-
-static struct scsi_transport_template *scsi_transport_fcoe_sw;
-
-struct fc_function_template fcoe_sw_transport_function = {
-       .show_host_node_name = 1,
-       .show_host_port_name = 1,
-       .show_host_supported_classes = 1,
-       .show_host_supported_fc4s = 1,
-       .show_host_active_fc4s = 1,
-       .show_host_maxframe_size = 1,
-
-       .show_host_port_id = 1,
-       .show_host_supported_speeds = 1,
-       .get_host_speed = fc_get_host_speed,
-       .show_host_speed = 1,
-       .show_host_port_type = 1,
-       .get_host_port_state = fc_get_host_port_state,
-       .show_host_port_state = 1,
-       .show_host_symbolic_name = 1,
-
-       .dd_fcrport_size = sizeof(struct fc_rport_libfc_priv),
-       .show_rport_maxframe_size = 1,
-       .show_rport_supported_classes = 1,
-
-       .show_host_fabric_name = 1,
-       .show_starget_node_name = 1,
-       .show_starget_port_name = 1,
-       .show_starget_port_id = 1,
-       .set_rport_dev_loss_tmo = fc_set_rport_loss_tmo,
-       .show_rport_dev_loss_tmo = 1,
-       .get_fc_host_stats = fc_get_host_stats,
-       .issue_fc_host_lip = fcoe_reset,
-
-       .terminate_rport_io = fc_rport_terminate_io,
-};
-
-static struct scsi_host_template fcoe_sw_shost_template = {
-       .module = THIS_MODULE,
-       .name = "FCoE Driver",
-       .proc_name = FCOE_SW_NAME,
-       .queuecommand = fc_queuecommand,
-       .eh_abort_handler = fc_eh_abort,
-       .eh_device_reset_handler = fc_eh_device_reset,
-       .eh_host_reset_handler = fc_eh_host_reset,
-       .slave_alloc = fc_slave_alloc,
-       .change_queue_depth = fc_change_queue_depth,
-       .change_queue_type = fc_change_queue_type,
-       .this_id = -1,
-       .cmd_per_lun = 32,
-       .can_queue = FCOE_MAX_OUTSTANDING_COMMANDS,
-       .use_clustering = ENABLE_CLUSTERING,
-       .sg_tablesize = SG_ALL,
-       .max_sectors = 0xffff,
-};
-
-/**
- * fcoe_sw_lport_config() - sets up the fc_lport
- * @lp: ptr to the fc_lport
- * @shost: ptr to the parent scsi host
- *
- * Returns: 0 for success
- */
-static int fcoe_sw_lport_config(struct fc_lport *lp)
-{
-       int i = 0;
-
-       lp->link_up = 0;
-       lp->qfull = 0;
-       lp->max_retry_count = 3;
-       lp->e_d_tov = 2 * 1000; /* FC-FS default */
-       lp->r_a_tov = 2 * 2 * 1000;
-       lp->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS |
-                             FCP_SPPF_RETRY | FCP_SPPF_CONF_COMPL);
-
-       /*
-        * allocate per cpu stats block
-        */
-       for_each_online_cpu(i)
-               lp->dev_stats[i] = kzalloc(sizeof(struct fcoe_dev_stats),
-                                          GFP_KERNEL);
-
-       /* lport fc_lport related configuration */
-       fc_lport_config(lp);
-
-       /* offload related configuration */
-       lp->crc_offload = 0;
-       lp->seq_offload = 0;
-       lp->lro_enabled = 0;
-       lp->lro_xid = 0;
-       lp->lso_max = 0;
-
-       return 0;
-}
-
-/**
- * fcoe_sw_netdev_config() - Set up netdev for SW FCoE
- * @lp : ptr to the fc_lport
- * @netdev : ptr to the associated netdevice struct
- *
- * Must be called after fcoe_sw_lport_config() as it will use lport mutex
- *
- * Returns : 0 for success
- */
-static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)
-{
-       u32 mfs;
-       u64 wwnn, wwpn;
-       struct fcoe_softc *fc;
-       u8 flogi_maddr[ETH_ALEN];
-
-       /* Setup lport private data to point to fcoe softc */
-       fc = lport_priv(lp);
-       fc->lp = lp;
-       fc->real_dev = netdev;
-       fc->phys_dev = netdev;
-
-       /* Require support for get_pauseparam ethtool op. */
-       if (netdev->priv_flags & IFF_802_1Q_VLAN)
-               fc->phys_dev = vlan_dev_real_dev(netdev);
-
-       /* Do not support for bonding device */
-       if ((fc->real_dev->priv_flags & IFF_MASTER_ALB) ||
-           (fc->real_dev->priv_flags & IFF_SLAVE_INACTIVE) ||
-           (fc->real_dev->priv_flags & IFF_MASTER_8023AD)) {
-               return -EOPNOTSUPP;
-       }
-
-       /*
-        * Determine max frame size based on underlying device and optional
-        * user-configured limit.  If the MFS is too low, fcoe_link_ok()
-        * will return 0, so do this first.
-        */
-       mfs = fc->real_dev->mtu - (sizeof(struct fcoe_hdr) +
-                                  sizeof(struct fcoe_crc_eof));
-       if (fc_set_mfs(lp, mfs))
-               return -EINVAL;
-
-       if (!fcoe_link_ok(lp))
-               lp->link_up = 1;
-
-       /* offload features support */
-       if (fc->real_dev->features & NETIF_F_SG)
-               lp->sg_supp = 1;
-
-#ifdef NETIF_F_FCOE_CRC
-       if (netdev->features & NETIF_F_FCOE_CRC) {
-               lp->crc_offload = 1;
-               printk(KERN_DEBUG "fcoe:%s supports FCCRC offload\n",
-                      netdev->name);
-       }
-#endif
-#ifdef NETIF_F_FSO
-       if (netdev->features & NETIF_F_FSO) {
-               lp->seq_offload = 1;
-               lp->lso_max = netdev->gso_max_size;
-               printk(KERN_DEBUG "fcoe:%s supports LSO for max len 0x%x\n",
-                      netdev->name, lp->lso_max);
-       }
-#endif
-       if (netdev->fcoe_ddp_xid) {
-               lp->lro_enabled = 1;
-               lp->lro_xid = netdev->fcoe_ddp_xid;
-               printk(KERN_DEBUG "fcoe:%s supports LRO for max xid 0x%x\n",
-                      netdev->name, lp->lro_xid);
-       }
-       skb_queue_head_init(&fc->fcoe_pending_queue);
-       fc->fcoe_pending_queue_active = 0;
-
-       /* setup Source Mac Address */
-       memcpy(fc->ctl_src_addr, fc->real_dev->dev_addr,
-              fc->real_dev->addr_len);
-
-       wwnn = fcoe_wwn_from_mac(fc->real_dev->dev_addr, 1, 0);
-       fc_set_wwnn(lp, wwnn);
-       /* XXX - 3rd arg needs to be vlan id */
-       wwpn = fcoe_wwn_from_mac(fc->real_dev->dev_addr, 2, 0);
-       fc_set_wwpn(lp, wwpn);
-
-       /*
-        * Add FCoE MAC address as second unicast MAC address
-        * or enter promiscuous mode if not capable of listening
-        * for multiple unicast MACs.
-        */
-       rtnl_lock();
-       memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
-       dev_unicast_add(fc->real_dev, flogi_maddr, ETH_ALEN);
-       rtnl_unlock();
-
-       /*
-        * setup the receive function from ethernet driver
-        * on the ethertype for the given device
-        */
-       fc->fcoe_packet_type.func = fcoe_rcv;
-       fc->fcoe_packet_type.type = __constant_htons(ETH_P_FCOE);
-       fc->fcoe_packet_type.dev = fc->real_dev;
-       dev_add_pack(&fc->fcoe_packet_type);
-
-       return 0;
-}
-
-/**
- * fcoe_sw_shost_config() - Sets up fc_lport->host
- * @lp : ptr to the fc_lport
- * @shost : ptr to the associated scsi host
- * @dev : device associated to scsi host
- *
- * Must be called after fcoe_sw_lport_config() and fcoe_sw_netdev_config()
- *
- * Returns : 0 for success
- */
-static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost,
-                               struct device *dev)
-{
-       int rc = 0;
-
-       /* lport scsi host config */
-       lp->host = shost;
-
-       lp->host->max_lun = FCOE_MAX_LUN;
-       lp->host->max_id = FCOE_MAX_FCP_TARGET;
-       lp->host->max_channel = 0;
-       lp->host->transportt = scsi_transport_fcoe_sw;
-
-       /* add the new host to the SCSI-ml */
-       rc = scsi_add_host(lp->host, dev);
-       if (rc) {
-               FC_DBG("fcoe_sw_shost_config:error on scsi_add_host\n");
-               return rc;
-       }
-       sprintf(fc_host_symbolic_name(lp->host), "%s v%s over %s",
-               FCOE_SW_NAME, FCOE_SW_VERSION,
-               fcoe_netdev(lp)->name);
-
-       return 0;
-}
-
-/**
- * fcoe_sw_em_config() - allocates em for this lport
- * @lp: the port that em is to allocated for
- *
- * Returns : 0 on success
- */
-static inline int fcoe_sw_em_config(struct fc_lport *lp)
-{
-       BUG_ON(lp->emp);
-
-       lp->emp = fc_exch_mgr_alloc(lp, FC_CLASS_3,
-                                   FCOE_MIN_XID, FCOE_MAX_XID);
-       if (!lp->emp)
-               return -ENOMEM;
-
-       return 0;
-}
-
-/**
- * fcoe_sw_destroy() - FCoE software HBA tear-down function
- * @netdev: ptr to the associated net_device
- *
- * Returns: 0 if link is OK for use by FCoE.
- */
-static int fcoe_sw_destroy(struct net_device *netdev)
-{
-       int cpu;
-       struct fc_lport *lp = NULL;
-       struct fcoe_softc *fc;
-       u8 flogi_maddr[ETH_ALEN];
-
-       BUG_ON(!netdev);
-
-       printk(KERN_DEBUG "fcoe_sw_destroy:interface on %s\n",
-              netdev->name);
-
-       lp = fcoe_hostlist_lookup(netdev);
-       if (!lp)
-               return -ENODEV;
-
-       fc = lport_priv(lp);
-
-       /* Logout of the fabric */
-       fc_fabric_logoff(lp);
-
-       /* Remove the instance from fcoe's list */
-       fcoe_hostlist_remove(lp);
-
-       /* Don't listen for Ethernet packets anymore */
-       dev_remove_pack(&fc->fcoe_packet_type);
-
-       /* Cleanup the fc_lport */
-       fc_lport_destroy(lp);
-       fc_fcp_destroy(lp);
-
-       /* Detach from the scsi-ml */
-       fc_remove_host(lp->host);
-       scsi_remove_host(lp->host);
-
-       /* There are no more rports or I/O, free the EM */
-       if (lp->emp)
-               fc_exch_mgr_free(lp->emp);
-
-       /* Delete secondary MAC addresses */
-       rtnl_lock();
-       memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
-       dev_unicast_delete(fc->real_dev, flogi_maddr, ETH_ALEN);
-       if (compare_ether_addr(fc->data_src_addr, (u8[6]) { 0 }))
-               dev_unicast_delete(fc->real_dev, fc->data_src_addr, ETH_ALEN);
-       rtnl_unlock();
-
-       /* Free the per-CPU revieve threads */
-       fcoe_percpu_clean(lp);
-
-       /* Free existing skbs */
-       fcoe_clean_pending_queue(lp);
-
-       /* Free memory used by statistical counters */
-       for_each_online_cpu(cpu)
-               kfree(lp->dev_stats[cpu]);
-
-       /* Release the net_device and Scsi_Host */
-       dev_put(fc->real_dev);
-       scsi_host_put(lp->host);
-
-       return 0;
-}
-
-/*
- * fcoe_sw_ddp_setup - calls LLD's ddp_setup through net_device
- * @lp:        the corresponding fc_lport
- * @xid: the exchange id for this ddp transfer
- * @sgl: the scatterlist describing this transfer
- * @sgc: number of sg items
- *
- * Returns : 0 no ddp
- */
-static int fcoe_sw_ddp_setup(struct fc_lport *lp, u16 xid,
-                            struct scatterlist *sgl, unsigned int sgc)
-{
-       struct net_device *n = fcoe_netdev(lp);
-
-       if (n->netdev_ops && n->netdev_ops->ndo_fcoe_ddp_setup)
-               return n->netdev_ops->ndo_fcoe_ddp_setup(n, xid, sgl, sgc);
-
-       return 0;
-}
-
-/*
- * fcoe_sw_ddp_done - calls LLD's ddp_done through net_device
- * @lp:        the corresponding fc_lport
- * @xid: the exchange id for this ddp transfer
- *
- * Returns : the length of data that have been completed by ddp
- */
-static int fcoe_sw_ddp_done(struct fc_lport *lp, u16 xid)
-{
-       struct net_device *n = fcoe_netdev(lp);
-
-       if (n->netdev_ops && n->netdev_ops->ndo_fcoe_ddp_done)
-               return n->netdev_ops->ndo_fcoe_ddp_done(n, xid);
-       return 0;
-}
-
-static struct libfc_function_template fcoe_sw_libfc_fcn_templ = {
-       .frame_send = fcoe_xmit,
-       .ddp_setup = fcoe_sw_ddp_setup,
-       .ddp_done = fcoe_sw_ddp_done,
-};
-
-/**
- * fcoe_sw_create() - this function creates the fcoe interface
- * @netdev: pointer the associated netdevice
- *
- * Creates fc_lport struct and scsi_host for lport, configures lport
- * and starts fabric login.
- *
- * Returns : 0 on success
- */
-static int fcoe_sw_create(struct net_device *netdev)
-{
-       int rc;
-       struct fc_lport *lp = NULL;
-       struct fcoe_softc *fc;
-       struct Scsi_Host *shost;
-
-       BUG_ON(!netdev);
-
-       printk(KERN_DEBUG "fcoe_sw_create:interface on %s\n",
-              netdev->name);
-
-       lp = fcoe_hostlist_lookup(netdev);
-       if (lp)
-               return -EEXIST;
-
-       shost = fcoe_host_alloc(&fcoe_sw_shost_template,
-                               sizeof(struct fcoe_softc));
-       if (!shost) {
-               FC_DBG("Could not allocate host structure\n");
-               return -ENOMEM;
-       }
-       lp = shost_priv(shost);
-       fc = lport_priv(lp);
-
-       /* configure fc_lport, e.g., em */
-       rc = fcoe_sw_lport_config(lp);
-       if (rc) {
-               FC_DBG("Could not configure lport\n");
-               goto out_host_put;
-       }
-
-       /* configure lport network properties */
-       rc = fcoe_sw_netdev_config(lp, netdev);
-       if (rc) {
-               FC_DBG("Could not configure netdev for lport\n");
-               goto out_host_put;
-       }
-
-       /* configure lport scsi host properties */
-       rc = fcoe_sw_shost_config(lp, shost, &netdev->dev);
-       if (rc) {
-               FC_DBG("Could not configure shost for lport\n");
-               goto out_host_put;
-       }
-
-       /* lport exch manager allocation */
-       rc = fcoe_sw_em_config(lp);
-       if (rc) {
-               FC_DBG("Could not configure em for lport\n");
-               goto out_host_put;
-       }
-
-       /* Initialize the library */
-       rc = fcoe_libfc_config(lp, &fcoe_sw_libfc_fcn_templ);
-       if (rc) {
-               FC_DBG("Could not configure libfc for lport!\n");
-               goto out_lp_destroy;
-       }
-
-       /* add to lports list */
-       fcoe_hostlist_add(lp);
-
-       lp->boot_time = jiffies;
-
-       fc_fabric_login(lp);
-
-       dev_hold(netdev);
-
-       return rc;
-
-out_lp_destroy:
-       fc_exch_mgr_free(lp->emp); /* Free the EM */
-out_host_put:
-       scsi_host_put(lp->host);
-       return rc;
-}
-
-/**
- * fcoe_sw_match() - The FCoE SW transport match function
- *
- * Returns : false always
- */
-static bool fcoe_sw_match(struct net_device *netdev)
-{
-       /* FIXME - for sw transport, always return false */
-       return false;
-}
-
-/* the sw hba fcoe transport */
-struct fcoe_transport fcoe_sw_transport = {
-       .name = "fcoesw",
-       .create = fcoe_sw_create,
-       .destroy = fcoe_sw_destroy,
-       .match = fcoe_sw_match,
-       .vendor = 0x0,
-       .device = 0xffff,
-};
-
-/**
- * fcoe_sw_init() - Registers fcoe_sw_transport
- *
- * Returns : 0 on success
- */
-int __init fcoe_sw_init(void)
-{
-       /* attach to scsi transport */
-       scsi_transport_fcoe_sw =
-               fc_attach_transport(&fcoe_sw_transport_function);
-
-       if (!scsi_transport_fcoe_sw) {
-               printk(KERN_ERR "fcoe_sw_init:fc_attach_transport() failed\n");
-               return -ENODEV;
-       }
-
-       mutex_init(&fcoe_sw_transport.devlock);
-       INIT_LIST_HEAD(&fcoe_sw_transport.devlist);
-
-       /* register sw transport */
-       fcoe_transport_register(&fcoe_sw_transport);
-       return 0;
-}
-
-/**
- * fcoe_sw_exit() - Unregisters fcoe_sw_transport
- *
- * Returns : 0 on success
- */
-int __exit fcoe_sw_exit(void)
-{
-       /* dettach the transport */
-       fc_release_transport(scsi_transport_fcoe_sw);
-       fcoe_transport_unregister(&fcoe_sw_transport);
-       return 0;
-}
index 0d6f5beb7f9ece99e7d532513d225cc3b5e49204..f410f4abb548988cccf68816cdefbc5e78f3e3e0 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
+ * Copyright (c) 2008-2009 Cisco Systems, Inc.  All rights reserved.
+ * Copyright (c) 2009 Intel Corporation.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
  * Maintained at www.Open-FCoE.org
  */
 
+#include <linux/types.h>
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
+#include <linux/list.h>
 #include <linux/spinlock.h>
-#include <linux/skbuff.h>
+#include <linux/timer.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <linux/if_ether.h>
 #include <linux/if_vlan.h>
-#include <linux/kthread.h>
-#include <linux/crc32.h>
-#include <linux/cpu.h>
-#include <linux/fs.h>
-#include <linux/sysfs.h>
-#include <linux/ctype.h>
-#include <scsi/scsi_tcq.h>
-#include <scsi/scsicam.h>
-#include <scsi/scsi_transport.h>
-#include <scsi/scsi_transport_fc.h>
+#include <linux/netdevice.h>
+#include <linux/errno.h>
+#include <linux/bitops.h>
 #include <net/rtnetlink.h>
 
+#include <scsi/fc/fc_els.h>
+#include <scsi/fc/fc_fs.h>
+#include <scsi/fc/fc_fip.h>
 #include <scsi/fc/fc_encaps.h>
+#include <scsi/fc/fc_fcoe.h>
 
 #include <scsi/libfc.h>
-#include <scsi/fc_frame.h>
 #include <scsi/libfcoe.h>
-#include <scsi/fc_transport_fcoe.h>
-
-static int debug_fcoe;
 
-#define FCOE_MAX_QUEUE_DEPTH  256
-#define FCOE_LOW_QUEUE_DEPTH  32
+MODULE_AUTHOR("Open-FCoE.org");
+MODULE_DESCRIPTION("FIP discovery protocol support for FCoE HBAs");
+MODULE_LICENSE("GPL v2");
 
-/* destination address mode */
-#define FCOE_GW_ADDR_MODE          0x00
-#define FCOE_FCOUI_ADDR_MODE       0x01
+#define        FCOE_CTLR_MIN_FKA       500             /* min keep alive (mS) */
+#define        FCOE_CTLR_DEF_FKA       FIP_DEF_FKA     /* default keep alive (mS) */
 
-#define FCOE_WORD_TO_BYTE  4
+static void fcoe_ctlr_timeout(unsigned long);
+static void fcoe_ctlr_link_work(struct work_struct *);
+static void fcoe_ctlr_recv_work(struct work_struct *);
 
-MODULE_AUTHOR("Open-FCoE.org");
-MODULE_DESCRIPTION("FCoE");
-MODULE_LICENSE("GPL");
+static u8 fcoe_all_fcfs[ETH_ALEN] = FIP_ALL_FCF_MACS;
 
-/* fcoe host list */
-LIST_HEAD(fcoe_hostlist);
-DEFINE_RWLOCK(fcoe_hostlist_lock);
-DEFINE_TIMER(fcoe_timer, NULL, 0, 0);
-struct fcoe_percpu_s *fcoe_percpu[NR_CPUS];
+static u32 fcoe_ctlr_debug;    /* 1 for basic, 2 for noisy debug */
 
+#define FIP_DBG_LVL(level, fmt, args...)                               \
+               do {                                                    \
+                       if (fcoe_ctlr_debug >= (level))                 \
+                               FC_DBG(fmt, ##args);                    \
+               } while (0)
 
-/* Function Prototyes */
-static int fcoe_check_wait_queue(struct fc_lport *);
-static void fcoe_recv_flogi(struct fcoe_softc *, struct fc_frame *, u8 *);
-#ifdef CONFIG_HOTPLUG_CPU
-static int fcoe_cpu_callback(struct notifier_block *, ulong, void *);
-#endif /* CONFIG_HOTPLUG_CPU */
-static int fcoe_device_notification(struct notifier_block *, ulong, void *);
-static void fcoe_dev_setup(void);
-static void fcoe_dev_cleanup(void);
+#define FIP_DBG(fmt, args...)  FIP_DBG_LVL(1, fmt, ##args)
 
-/* notification function from net device */
-static struct notifier_block fcoe_notifier = {
-       .notifier_call = fcoe_device_notification,
-};
+/*
+ * Return non-zero if FCF fcoe_size has been validated.
+ */
+static inline int fcoe_ctlr_mtu_valid(const struct fcoe_fcf *fcf)
+{
+       return (fcf->flags & FIP_FL_SOL) != 0;
+}
 
+/*
+ * Return non-zero if the FCF is usable.
+ */
+static inline int fcoe_ctlr_fcf_usable(struct fcoe_fcf *fcf)
+{
+       u16 flags = FIP_FL_SOL | FIP_FL_AVAIL;
 
-#ifdef CONFIG_HOTPLUG_CPU
-static struct notifier_block fcoe_cpu_notifier = {
-       .notifier_call = fcoe_cpu_callback,
-};
+       return (fcf->flags & flags) == flags;
+}
 
 /**
- * fcoe_create_percpu_data() - creates the associated cpu data
- * @cpu: index for the cpu where fcoe cpu data will be created
- *
- * create percpu stats block, from cpu add notifier
- *
- * Returns: none
+ * fcoe_ctlr_init() - Initialize the FCoE Controller instance.
+ * @fip:       FCoE controller.
  */
-static void fcoe_create_percpu_data(int cpu)
+void fcoe_ctlr_init(struct fcoe_ctlr *fip)
 {
-       struct fc_lport *lp;
-       struct fcoe_softc *fc;
-
-       write_lock_bh(&fcoe_hostlist_lock);
-       list_for_each_entry(fc, &fcoe_hostlist, list) {
-               lp = fc->lp;
-               if (lp->dev_stats[cpu] == NULL)
-                       lp->dev_stats[cpu] =
-                               kzalloc(sizeof(struct fcoe_dev_stats),
-                                       GFP_KERNEL);
-       }
-       write_unlock_bh(&fcoe_hostlist_lock);
+       fip->state = FIP_ST_LINK_WAIT;
+       INIT_LIST_HEAD(&fip->fcfs);
+       spin_lock_init(&fip->lock);
+       fip->flogi_oxid = FC_XID_UNKNOWN;
+       setup_timer(&fip->timer, fcoe_ctlr_timeout, (unsigned long)fip);
+       INIT_WORK(&fip->link_work, fcoe_ctlr_link_work);
+       INIT_WORK(&fip->recv_work, fcoe_ctlr_recv_work);
+       skb_queue_head_init(&fip->fip_recv_list);
 }
+EXPORT_SYMBOL(fcoe_ctlr_init);
 
 /**
- * fcoe_destroy_percpu_data() - destroys the associated cpu data
- * @cpu: index for the cpu where fcoe cpu data will destroyed
- *
- * destroy percpu stats block called by cpu add/remove notifier
+ * fcoe_ctlr_reset_fcfs() - Reset and free all FCFs for a controller.
+ * @fip:       FCoE controller.
  *
- * Retuns: none
+ * Called with &fcoe_ctlr lock held.
  */
-static void fcoe_destroy_percpu_data(int cpu)
+static void fcoe_ctlr_reset_fcfs(struct fcoe_ctlr *fip)
 {
-       struct fc_lport *lp;
-       struct fcoe_softc *fc;
+       struct fcoe_fcf *fcf;
+       struct fcoe_fcf *next;
 
-       write_lock_bh(&fcoe_hostlist_lock);
-       list_for_each_entry(fc, &fcoe_hostlist, list) {
-               lp = fc->lp;
-               kfree(lp->dev_stats[cpu]);
-               lp->dev_stats[cpu] = NULL;
+       fip->sel_fcf = NULL;
+       list_for_each_entry_safe(fcf, next, &fip->fcfs, list) {
+               list_del(&fcf->list);
+               kfree(fcf);
        }
-       write_unlock_bh(&fcoe_hostlist_lock);
+       fip->fcf_count = 0;
+       fip->sel_time = 0;
 }
 
 /**
- * fcoe_cpu_callback() - fcoe cpu hotplug event callback
- * @nfb: callback data block
- * @action: event triggering the callback
- * @hcpu: index for the cpu of this event
+ * fcoe_ctrl_destroy() - Disable and tear-down the FCoE controller.
+ * @fip:       FCoE controller.
+ *
+ * This is called by FCoE drivers before freeing the &fcoe_ctlr.
  *
- * this creates or destroys per cpu data for fcoe
+ * The receive handler will have been deleted before this to guarantee
+ * that no more recv_work will be scheduled.
  *
- * Returns NOTIFY_OK always.
+ * The timer routine will simply return once we set FIP_ST_DISABLED.
+ * This guarantees that no further timeouts or work will be scheduled.
  */
-static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action,
-                            void *hcpu)
+void fcoe_ctlr_destroy(struct fcoe_ctlr *fip)
 {
-       unsigned int cpu = (unsigned long)hcpu;
-
-       switch (action) {
-       case CPU_ONLINE:
-               fcoe_create_percpu_data(cpu);
-               break;
-       case CPU_DEAD:
-               fcoe_destroy_percpu_data(cpu);
-               break;
-       default:
-               break;
-       }
-       return NOTIFY_OK;
+       flush_work(&fip->recv_work);
+       spin_lock_bh(&fip->lock);
+       fip->state = FIP_ST_DISABLED;
+       fcoe_ctlr_reset_fcfs(fip);
+       spin_unlock_bh(&fip->lock);
+       del_timer_sync(&fip->timer);
+       flush_work(&fip->link_work);
 }
-#endif /* CONFIG_HOTPLUG_CPU */
+EXPORT_SYMBOL(fcoe_ctlr_destroy);
 
 /**
- * fcoe_rcv() - this is the fcoe receive function called by NET_RX_SOFTIRQ
- * @skb: the receive skb
- * @dev: associated net device
- * @ptype: context
- * @odldev: last device
- *
- * this function will receive the packet and build fc frame and pass it up
+ * fcoe_ctlr_fcoe_size() - Return the maximum FCoE size required for VN_Port.
+ * @fip:       FCoE controller.
  *
- * Returns: 0 for success
+ * Returns the maximum packet size including the FCoE header and trailer,
+ * but not including any Ethernet or VLAN headers.
  */
-int fcoe_rcv(struct sk_buff *skb, struct net_device *dev,
-            struct packet_type *ptype, struct net_device *olddev)
+static inline u32 fcoe_ctlr_fcoe_size(struct fcoe_ctlr *fip)
 {
-       struct fc_lport *lp;
-       struct fcoe_rcv_info *fr;
-       struct fcoe_softc *fc;
-       struct fcoe_dev_stats *stats;
-       struct fc_frame_header *fh;
-       unsigned short oxid;
-       int cpu_idx;
-       struct fcoe_percpu_s *fps;
-
-       fc = container_of(ptype, struct fcoe_softc, fcoe_packet_type);
-       lp = fc->lp;
-       if (unlikely(lp == NULL)) {
-               FC_DBG("cannot find hba structure");
-               goto err2;
-       }
-
-       if (unlikely(debug_fcoe)) {
-               FC_DBG("skb_info: len:%d data_len:%d head:%p data:%p tail:%p "
-                      "end:%p sum:%d dev:%s", skb->len, skb->data_len,
-                      skb->head, skb->data, skb_tail_pointer(skb),
-                      skb_end_pointer(skb), skb->csum,
-                      skb->dev ? skb->dev->name : "<NULL>");
+       /*
+        * Determine the max FCoE frame size allowed, including
+        * FCoE header and trailer.
+        * Note:  lp->mfs is currently the payload size, not the frame size.
+        */
+       return fip->lp->mfs + sizeof(struct fc_frame_header) +
+               sizeof(struct fcoe_hdr) + sizeof(struct fcoe_crc_eof);
+}
 
-       }
+/**
+ * fcoe_ctlr_solicit() - Send a solicitation.
+ * @fip:       FCoE controller.
+ * @fcf:       Destination FCF.  If NULL, a multicast solicitation is sent.
+ */
+static void fcoe_ctlr_solicit(struct fcoe_ctlr *fip, struct fcoe_fcf *fcf)
+{
+       struct sk_buff *skb;
+       struct fip_sol {
+               struct ethhdr eth;
+               struct fip_header fip;
+               struct {
+                       struct fip_mac_desc mac;
+                       struct fip_wwn_desc wwnn;
+                       struct fip_size_desc size;
+               } __attribute__((packed)) desc;
+       }  __attribute__((packed)) *sol;
+       u32 fcoe_size;
+
+       skb = dev_alloc_skb(sizeof(*sol));
+       if (!skb)
+               return;
 
-       /* check for FCOE packet type */
-       if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) {
-               FC_DBG("wrong FC type frame");
-               goto err;
-       }
+       sol = (struct fip_sol *)skb->data;
 
-       /*
-        * Check for minimum frame length, and make sure required FCoE
-        * and FC headers are pulled into the linear data area.
-        */
-       if (unlikely((skb->len < FCOE_MIN_FRAME) ||
-           !pskb_may_pull(skb, FCOE_HEADER_LEN)))
-               goto err;
+       memset(sol, 0, sizeof(*sol));
+       memcpy(sol->eth.h_dest, fcf ? fcf->fcf_mac : fcoe_all_fcfs, ETH_ALEN);
+       memcpy(sol->eth.h_source, fip->ctl_src_addr, ETH_ALEN);
+       sol->eth.h_proto = htons(ETH_P_FIP);
 
-       skb_set_transport_header(skb, sizeof(struct fcoe_hdr));
-       fh = (struct fc_frame_header *) skb_transport_header(skb);
+       sol->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER);
+       sol->fip.fip_op = htons(FIP_OP_DISC);
+       sol->fip.fip_subcode = FIP_SC_SOL;
+       sol->fip.fip_dl_len = htons(sizeof(sol->desc) / FIP_BPW);
+       sol->fip.fip_flags = htons(FIP_FL_FPMA);
 
-       oxid = ntohs(fh->fh_ox_id);
+       sol->desc.mac.fd_desc.fip_dtype = FIP_DT_MAC;
+       sol->desc.mac.fd_desc.fip_dlen = sizeof(sol->desc.mac) / FIP_BPW;
+       memcpy(sol->desc.mac.fd_mac, fip->ctl_src_addr, ETH_ALEN);
 
-       fr = fcoe_dev_from_skb(skb);
-       fr->fr_dev = lp;
-       fr->ptype = ptype;
-       cpu_idx = 0;
-#ifdef CONFIG_SMP
-       /*
-        * The incoming frame exchange id(oxid) is ANDed with num of online
-        * cpu bits to get cpu_idx and then this cpu_idx is used for selecting
-        * a per cpu kernel thread from fcoe_percpu. In case the cpu is
-        * offline or no kernel thread for derived cpu_idx then cpu_idx is
-        * initialize to first online cpu index.
-        */
-       cpu_idx = oxid & (num_online_cpus() - 1);
-       if (!fcoe_percpu[cpu_idx] || !cpu_online(cpu_idx))
-               cpu_idx = first_cpu(cpu_online_map);
-#endif
-       fps = fcoe_percpu[cpu_idx];
+       sol->desc.wwnn.fd_desc.fip_dtype = FIP_DT_NAME;
+       sol->desc.wwnn.fd_desc.fip_dlen = sizeof(sol->desc.wwnn) / FIP_BPW;
+       put_unaligned_be64(fip->lp->wwnn, &sol->desc.wwnn.fd_wwn);
 
-       spin_lock_bh(&fps->fcoe_rx_list.lock);
-       __skb_queue_tail(&fps->fcoe_rx_list, skb);
-       if (fps->fcoe_rx_list.qlen == 1)
-               wake_up_process(fps->thread);
+       fcoe_size = fcoe_ctlr_fcoe_size(fip);
+       sol->desc.size.fd_desc.fip_dtype = FIP_DT_FCOE_SIZE;
+       sol->desc.size.fd_desc.fip_dlen = sizeof(sol->desc.size) / FIP_BPW;
+       sol->desc.size.fd_size = htons(fcoe_size);
 
-       spin_unlock_bh(&fps->fcoe_rx_list.lock);
+       skb_put(skb, sizeof(*sol));
+       skb->protocol = htons(ETH_P_802_3);
+       skb_reset_mac_header(skb);
+       skb_reset_network_header(skb);
+       fip->send(fip, skb);
 
-       return 0;
-err:
-#ifdef CONFIG_SMP
-       stats = lp->dev_stats[smp_processor_id()];
-#else
-       stats = lp->dev_stats[0];
-#endif
-       if (stats)
-               stats->ErrorFrames++;
-
-err2:
-       kfree_skb(skb);
-       return -1;
+       if (!fcf)
+               fip->sol_time = jiffies;
 }
-EXPORT_SYMBOL_GPL(fcoe_rcv);
 
 /**
- * fcoe_start_io() - pass to netdev to start xmit for fcoe
- * @skb: the skb to be xmitted
+ * fcoe_ctlr_link_up() - Start FCoE controller.
+ * @fip:       FCoE controller.
  *
- * Returns: 0 for success
+ * Called from the LLD when the network link is ready.
  */
-static inline int fcoe_start_io(struct sk_buff *skb)
+void fcoe_ctlr_link_up(struct fcoe_ctlr *fip)
 {
-       int rc;
-
-       skb_get(skb);
-       rc = dev_queue_xmit(skb);
-       if (rc != 0)
-               return rc;
-       kfree_skb(skb);
-       return 0;
+       spin_lock_bh(&fip->lock);
+       if (fip->state == FIP_ST_NON_FIP || fip->state == FIP_ST_AUTO) {
+               fip->last_link = 1;
+               fip->link = 1;
+               spin_unlock_bh(&fip->lock);
+               fc_linkup(fip->lp);
+       } else if (fip->state == FIP_ST_LINK_WAIT) {
+               fip->state = FIP_ST_AUTO;
+               fip->last_link = 1;
+               fip->link = 1;
+               spin_unlock_bh(&fip->lock);
+               FIP_DBG("%s", "setting AUTO mode.\n");
+               fc_linkup(fip->lp);
+               fcoe_ctlr_solicit(fip, NULL);
+       } else
+               spin_unlock_bh(&fip->lock);
 }
+EXPORT_SYMBOL(fcoe_ctlr_link_up);
 
 /**
- * fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof
- * @skb: the skb to be xmitted
- * @tlen: total len
+ * fcoe_ctlr_reset() - Reset FIP.
+ * @fip:       FCoE controller.
+ * @new_state: FIP state to be entered.
  *
- * Returns: 0 for success
+ * Returns non-zero if the link was up and now isn't.
  */
-static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen)
+static int fcoe_ctlr_reset(struct fcoe_ctlr *fip, enum fip_state new_state)
 {
-       struct fcoe_percpu_s *fps;
-       struct page *page;
-       int cpu_idx;
-
-       cpu_idx = get_cpu();
-       fps = fcoe_percpu[cpu_idx];
-       page = fps->crc_eof_page;
-       if (!page) {
-               page = alloc_page(GFP_ATOMIC);
-               if (!page) {
-                       put_cpu();
-                       return -ENOMEM;
-               }
-               fps->crc_eof_page = page;
-               WARN_ON(fps->crc_eof_offset != 0);
+       struct fc_lport *lp = fip->lp;
+       int link_dropped;
+
+       spin_lock_bh(&fip->lock);
+       fcoe_ctlr_reset_fcfs(fip);
+       del_timer(&fip->timer);
+       fip->state = new_state;
+       fip->ctlr_ka_time = 0;
+       fip->port_ka_time = 0;
+       fip->sol_time = 0;
+       fip->flogi_oxid = FC_XID_UNKNOWN;
+       fip->map_dest = 0;
+       fip->last_link = 0;
+       link_dropped = fip->link;
+       fip->link = 0;
+       spin_unlock_bh(&fip->lock);
+
+       if (link_dropped)
+               fc_linkdown(lp);
+
+       if (new_state == FIP_ST_ENABLED) {
+               fcoe_ctlr_solicit(fip, NULL);
+               fc_linkup(lp);
+               link_dropped = 0;
        }
-
-       get_page(page);
-       skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page,
-                          fps->crc_eof_offset, tlen);
-       skb->len += tlen;
-       skb->data_len += tlen;
-       skb->truesize += tlen;
-       fps->crc_eof_offset += sizeof(struct fcoe_crc_eof);
-
-       if (fps->crc_eof_offset >= PAGE_SIZE) {
-               fps->crc_eof_page = NULL;
-               fps->crc_eof_offset = 0;
-               put_page(page);
-       }
-       put_cpu();
-       return 0;
+       return link_dropped;
 }
 
 /**
- * fcoe_fc_crc() - calculates FC CRC in this fcoe skb
- * @fp: the fc_frame containg data to be checksummed
+ * fcoe_ctlr_link_down() - Stop FCoE controller.
+ * @fip:       FCoE controller.
  *
- * This uses crc32() to calculate the crc for fc frame
- * Return   : 32 bit crc
+ * Returns non-zero if the link was up and now isn't.
+ *
+ * Called from the LLD when the network link is not ready.
+ * There may be multiple calls while the link is down.
  */
-u32 fcoe_fc_crc(struct fc_frame *fp)
+int fcoe_ctlr_link_down(struct fcoe_ctlr *fip)
 {
-       struct sk_buff *skb = fp_skb(fp);
-       struct skb_frag_struct *frag;
-       unsigned char *data;
-       unsigned long off, len, clen;
-       u32 crc;
-       unsigned i;
-
-       crc = crc32(~0, skb->data, skb_headlen(skb));
-
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-               frag = &skb_shinfo(skb)->frags[i];
-               off = frag->page_offset;
-               len = frag->size;
-               while (len > 0) {
-                       clen = min(len, PAGE_SIZE - (off & ~PAGE_MASK));
-                       data = kmap_atomic(frag->page + (off >> PAGE_SHIFT),
-                                          KM_SKB_DATA_SOFTIRQ);
-                       crc = crc32(crc, data + (off & ~PAGE_MASK), clen);
-                       kunmap_atomic(data, KM_SKB_DATA_SOFTIRQ);
-                       off += clen;
-                       len -= clen;
-               }
-       }
-       return crc;
+       return fcoe_ctlr_reset(fip, FIP_ST_LINK_WAIT);
 }
-EXPORT_SYMBOL_GPL(fcoe_fc_crc);
+EXPORT_SYMBOL(fcoe_ctlr_link_down);
 
 /**
- * fcoe_xmit() - FCoE frame transmit function
- * @lp:        the associated local port
- * @fp: the fc_frame to be transmitted
+ * fcoe_ctlr_send_keep_alive() - Send a keep-alive to the selected FCF.
+ * @fip:       FCoE controller.
+ * @ports:     0 for controller keep-alive, 1 for port keep-alive.
+ * @sa:                source MAC address.
  *
- * Return   : 0 for success
+ * A controller keep-alive is sent every fka_period (typically 8 seconds).
+ * The source MAC is the native MAC address.
+ *
+ * A port keep-alive is sent every 90 seconds while logged in.
+ * The source MAC is the assigned mapped source address.
+ * The destination is the FCF's F-port.
  */
-int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
+static void fcoe_ctlr_send_keep_alive(struct fcoe_ctlr *fip, int ports, u8 *sa)
 {
-       int wlen, rc = 0;
-       u32 crc;
-       struct ethhdr *eh;
-       struct fcoe_crc_eof *cp;
        struct sk_buff *skb;
-       struct fcoe_dev_stats *stats;
-       struct fc_frame_header *fh;
-       unsigned int hlen;              /* header length implies the version */
-       unsigned int tlen;              /* trailer length */
-       unsigned int elen;              /* eth header, may include vlan */
-       int flogi_in_progress = 0;
-       struct fcoe_softc *fc;
-       u8 sof, eof;
-       struct fcoe_hdr *hp;
-
-       WARN_ON((fr_len(fp) % sizeof(u32)) != 0);
-
-       fc = lport_priv(lp);
-       /*
-        * if it is a flogi then we need to learn gw-addr
-        * and my own fcid
-        */
-       fh = fc_frame_header_get(fp);
-       if (unlikely(fh->fh_r_ctl == FC_RCTL_ELS_REQ)) {
-               if (fc_frame_payload_op(fp) == ELS_FLOGI) {
-                       fc->flogi_oxid = ntohs(fh->fh_ox_id);
-                       fc->address_mode = FCOE_FCOUI_ADDR_MODE;
-                       fc->flogi_progress = 1;
-                       flogi_in_progress = 1;
-               } else if (fc->flogi_progress && ntoh24(fh->fh_s_id) != 0) {
-                       /*
-                        * Here we must've gotten an SID by accepting an FLOGI
-                        * from a point-to-point connection.  Switch to using
-                        * the source mac based on the SID.  The destination
-                        * MAC in this case would have been set by receving the
-                        * FLOGI.
-                        */
-                       fc_fcoe_set_mac(fc->data_src_addr, fh->fh_s_id);
-                       fc->flogi_progress = 0;
-               }
-       }
-
-       skb = fp_skb(fp);
-       sof = fr_sof(fp);
-       eof = fr_eof(fp);
-
-       elen = (fc->real_dev->priv_flags & IFF_802_1Q_VLAN) ?
-               sizeof(struct vlan_ethhdr) : sizeof(struct ethhdr);
-       hlen = sizeof(struct fcoe_hdr);
-       tlen = sizeof(struct fcoe_crc_eof);
-       wlen = (skb->len - tlen + sizeof(crc)) / FCOE_WORD_TO_BYTE;
-
-       /* crc offload */
-       if (likely(lp->crc_offload)) {
-               skb->ip_summed = CHECKSUM_PARTIAL;
-               skb->csum_start = skb_headroom(skb);
-               skb->csum_offset = skb->len;
-               crc = 0;
-       } else {
-               skb->ip_summed = CHECKSUM_NONE;
-               crc = fcoe_fc_crc(fp);
-       }
+       struct fip_kal {
+               struct ethhdr eth;
+               struct fip_header fip;
+               struct fip_mac_desc mac;
+       } __attribute__((packed)) *kal;
+       struct fip_vn_desc *vn;
+       u32 len;
+       struct fc_lport *lp;
+       struct fcoe_fcf *fcf;
 
-       /* copy fc crc and eof to the skb buff */
-       if (skb_is_nonlinear(skb)) {
-               skb_frag_t *frag;
-               if (fcoe_get_paged_crc_eof(skb, tlen)) {
-                       kfree_skb(skb);
-                       return -ENOMEM;
-               }
-               frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
-               cp = kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ)
-                       + frag->page_offset;
-       } else {
-               cp = (struct fcoe_crc_eof *)skb_put(skb, tlen);
-       }
+       fcf = fip->sel_fcf;
+       lp = fip->lp;
+       if (!fcf || !fc_host_port_id(lp->host))
+               return;
 
-       memset(cp, 0, sizeof(*cp));
-       cp->fcoe_eof = eof;
-       cp->fcoe_crc32 = cpu_to_le32(~crc);
+       len = fcoe_ctlr_fcoe_size(fip) + sizeof(struct ethhdr);
+       BUG_ON(len < sizeof(*kal) + sizeof(*vn));
+       skb = dev_alloc_skb(len);
+       if (!skb)
+               return;
 
-       if (skb_is_nonlinear(skb)) {
-               kunmap_atomic(cp, KM_SKB_DATA_SOFTIRQ);
-               cp = NULL;
+       kal = (struct fip_kal *)skb->data;
+       memset(kal, 0, len);
+       memcpy(kal->eth.h_dest, fcf->fcf_mac, ETH_ALEN);
+       memcpy(kal->eth.h_source, sa, ETH_ALEN);
+       kal->eth.h_proto = htons(ETH_P_FIP);
+
+       kal->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER);
+       kal->fip.fip_op = htons(FIP_OP_CTRL);
+       kal->fip.fip_subcode = FIP_SC_KEEP_ALIVE;
+       kal->fip.fip_dl_len = htons((sizeof(kal->mac) +
+                                   ports * sizeof(*vn)) / FIP_BPW);
+       kal->fip.fip_flags = htons(FIP_FL_FPMA);
+
+       kal->mac.fd_desc.fip_dtype = FIP_DT_MAC;
+       kal->mac.fd_desc.fip_dlen = sizeof(kal->mac) / FIP_BPW;
+       memcpy(kal->mac.fd_mac, fip->ctl_src_addr, ETH_ALEN);
+
+       if (ports) {
+               vn = (struct fip_vn_desc *)(kal + 1);
+               vn->fd_desc.fip_dtype = FIP_DT_VN_ID;
+               vn->fd_desc.fip_dlen = sizeof(*vn) / FIP_BPW;
+               memcpy(vn->fd_mac, fip->data_src_addr, ETH_ALEN);
+               hton24(vn->fd_fc_id, fc_host_port_id(lp->host));
+               put_unaligned_be64(lp->wwpn, &vn->fd_wwpn);
        }
 
-       /* adjust skb netowrk/transport offsets to match mac/fcoe/fc */
-       skb_push(skb, elen + hlen);
+       skb_put(skb, len);
+       skb->protocol = htons(ETH_P_802_3);
        skb_reset_mac_header(skb);
        skb_reset_network_header(skb);
-       skb->mac_len = elen;
-       skb->protocol = htons(ETH_P_FCOE);
-       skb->dev = fc->real_dev;
-
-       /* fill up mac and fcoe headers */
-       eh = eth_hdr(skb);
-       eh->h_proto = htons(ETH_P_FCOE);
-       if (fc->address_mode == FCOE_FCOUI_ADDR_MODE)
-               fc_fcoe_set_mac(eh->h_dest, fh->fh_d_id);
-       else
-               /* insert GW address */
-               memcpy(eh->h_dest, fc->dest_addr, ETH_ALEN);
-
-       if (unlikely(flogi_in_progress))
-               memcpy(eh->h_source, fc->ctl_src_addr, ETH_ALEN);
-       else
-               memcpy(eh->h_source, fc->data_src_addr, ETH_ALEN);
-
-       hp = (struct fcoe_hdr *)(eh + 1);
-       memset(hp, 0, sizeof(*hp));
-       if (FC_FCOE_VER)
-               FC_FCOE_ENCAPS_VER(hp, FC_FCOE_VER);
-       hp->fcoe_sof = sof;
-
-#ifdef NETIF_F_FSO
-       /* fcoe lso, mss is in max_payload which is non-zero for FCP data */
-       if (lp->seq_offload && fr_max_payload(fp)) {
-               skb_shinfo(skb)->gso_type = SKB_GSO_FCOE;
-               skb_shinfo(skb)->gso_size = fr_max_payload(fp);
-       } else {
-               skb_shinfo(skb)->gso_type = 0;
-               skb_shinfo(skb)->gso_size = 0;
-       }
-#endif
-       /* update tx stats: regardless if LLD fails */
-       stats = lp->dev_stats[smp_processor_id()];
-       if (stats) {
-               stats->TxFrames++;
-               stats->TxWords += wlen;
-       }
-
-       /* send down to lld */
-       fr_dev(fp) = lp;
-       if (fc->fcoe_pending_queue.qlen)
-               rc = fcoe_check_wait_queue(lp);
-
-       if (rc == 0)
-               rc = fcoe_start_io(skb);
-
-       if (rc) {
-               spin_lock_bh(&fc->fcoe_pending_queue.lock);
-               __skb_queue_tail(&fc->fcoe_pending_queue, skb);
-               spin_unlock_bh(&fc->fcoe_pending_queue.lock);
-               if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
-                       lp->qfull = 1;
-       }
-
-       return 0;
+       fip->send(fip, skb);
 }
-EXPORT_SYMBOL_GPL(fcoe_xmit);
 
 /**
- * fcoe_percpu_receive_thread() - recv thread per cpu
- * @arg: ptr to the fcoe per cpu struct
+ * fcoe_ctlr_encaps() - Encapsulate an ELS frame for FIP, without sending it.
+ * @fip:       FCoE controller.
+ * @dtype:     FIP descriptor type for the frame.
+ * @skb:       FCoE ELS frame including FC header but no FCoE headers.
+ *
+ * Returns non-zero error code on failure.
+ *
+ * The caller must check that the length is a multiple of 4.
  *
- * Return: 0 for success
+ * The @skb must have enough headroom (28 bytes) and tailroom (8 bytes).
+ * Headroom includes the FIP encapsulation description, FIP header, and
+ * Ethernet header.  The tailroom is for the FIP MAC descriptor.
  */
-int fcoe_percpu_receive_thread(void *arg)
+static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip,
+                           u8 dtype, struct sk_buff *skb)
 {
-       struct fcoe_percpu_s *p = arg;
-       u32 fr_len;
-       struct fc_lport *lp;
-       struct fcoe_rcv_info *fr;
-       struct fcoe_dev_stats *stats;
-       struct fc_frame_header *fh;
-       struct sk_buff *skb;
-       struct fcoe_crc_eof crc_eof;
-       struct fc_frame *fp;
-       u8 *mac = NULL;
-       struct fcoe_softc *fc;
-       struct fcoe_hdr *hp;
-
-       set_user_nice(current, -20);
-
-       while (!kthread_should_stop()) {
-
-               spin_lock_bh(&p->fcoe_rx_list.lock);
-               while ((skb = __skb_dequeue(&p->fcoe_rx_list)) == NULL) {
-                       set_current_state(TASK_INTERRUPTIBLE);
-                       spin_unlock_bh(&p->fcoe_rx_list.lock);
-                       schedule();
-                       set_current_state(TASK_RUNNING);
-                       if (kthread_should_stop())
-                               return 0;
-                       spin_lock_bh(&p->fcoe_rx_list.lock);
-               }
-               spin_unlock_bh(&p->fcoe_rx_list.lock);
-               fr = fcoe_dev_from_skb(skb);
-               lp = fr->fr_dev;
-               if (unlikely(lp == NULL)) {
-                       FC_DBG("invalid HBA Structure");
-                       kfree_skb(skb);
-                       continue;
-               }
-
-               stats = lp->dev_stats[smp_processor_id()];
-
-               if (unlikely(debug_fcoe)) {
-                       FC_DBG("skb_info: len:%d data_len:%d head:%p data:%p "
-                              "tail:%p end:%p sum:%d dev:%s",
-                              skb->len, skb->data_len,
-                              skb->head, skb->data, skb_tail_pointer(skb),
-                              skb_end_pointer(skb), skb->csum,
-                              skb->dev ? skb->dev->name : "<NULL>");
-               }
-
-               /*
-                * Save source MAC address before discarding header.
-                */
-               fc = lport_priv(lp);
-               if (unlikely(fc->flogi_progress))
-                       mac = eth_hdr(skb)->h_source;
-
-               if (skb_is_nonlinear(skb))
-                       skb_linearize(skb);     /* not ideal */
-
-               /*
-                * Frame length checks and setting up the header pointers
-                * was done in fcoe_rcv already.
-                */
-               hp = (struct fcoe_hdr *) skb_network_header(skb);
-               fh = (struct fc_frame_header *) skb_transport_header(skb);
-
-               if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) {
-                       if (stats) {
-                               if (stats->ErrorFrames < 5)
-                                       FC_DBG("unknown FCoE version %x",
-                                              FC_FCOE_DECAPS_VER(hp));
-                               stats->ErrorFrames++;
-                       }
-                       kfree_skb(skb);
-                       continue;
-               }
-
-               skb_pull(skb, sizeof(struct fcoe_hdr));
-               fr_len = skb->len - sizeof(struct fcoe_crc_eof);
-
-               if (stats) {
-                       stats->RxFrames++;
-                       stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
-               }
-
-               fp = (struct fc_frame *)skb;
-               fc_frame_init(fp);
-               fr_dev(fp) = lp;
-               fr_sof(fp) = hp->fcoe_sof;
-
-               /* Copy out the CRC and EOF trailer for access */
-               if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof))) {
-                       kfree_skb(skb);
-                       continue;
-               }
-               fr_eof(fp) = crc_eof.fcoe_eof;
-               fr_crc(fp) = crc_eof.fcoe_crc32;
-               if (pskb_trim(skb, fr_len)) {
-                       kfree_skb(skb);
-                       continue;
-               }
-
-               /*
-                * We only check CRC if no offload is available and if it is
-                * it's solicited data, in which case, the FCP layer would
-                * check it during the copy.
-                */
-               if (lp->crc_offload && skb->ip_summed == CHECKSUM_UNNECESSARY)
-                       fr_flags(fp) &= ~FCPHF_CRC_UNCHECKED;
-               else
-                       fr_flags(fp) |= FCPHF_CRC_UNCHECKED;
-
-               fh = fc_frame_header_get(fp);
-               if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA &&
-                   fh->fh_type == FC_TYPE_FCP) {
-                       fc_exch_recv(lp, lp->emp, fp);
-                       continue;
-               }
-               if (fr_flags(fp) & FCPHF_CRC_UNCHECKED) {
-                       if (le32_to_cpu(fr_crc(fp)) !=
-                           ~crc32(~0, skb->data, fr_len)) {
-                               if (debug_fcoe || stats->InvalidCRCCount < 5)
-                                       printk(KERN_WARNING "fcoe: dropping "
-                                              "frame with CRC error\n");
-                               stats->InvalidCRCCount++;
-                               stats->ErrorFrames++;
-                               fc_frame_free(fp);
-                               continue;
-                       }
-                       fr_flags(fp) &= ~FCPHF_CRC_UNCHECKED;
-               }
-               /* non flogi and non data exchanges are handled here */
-               if (unlikely(fc->flogi_progress))
-                       fcoe_recv_flogi(fc, fp, mac);
-               fc_exch_recv(lp, lp->emp, fp);
-       }
+       struct fip_encaps_head {
+               struct ethhdr eth;
+               struct fip_header fip;
+               struct fip_encaps encaps;
+       } __attribute__((packed)) *cap;
+       struct fip_mac_desc *mac;
+       struct fcoe_fcf *fcf;
+       size_t dlen;
+
+       fcf = fip->sel_fcf;
+       if (!fcf)
+               return -ENODEV;
+       dlen = sizeof(struct fip_encaps) + skb->len;    /* len before push */
+       cap = (struct fip_encaps_head *)skb_push(skb, sizeof(*cap));
+
+       memset(cap, 0, sizeof(*cap));
+       memcpy(cap->eth.h_dest, fcf->fcf_mac, ETH_ALEN);
+       memcpy(cap->eth.h_source, fip->ctl_src_addr, ETH_ALEN);
+       cap->eth.h_proto = htons(ETH_P_FIP);
+
+       cap->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER);
+       cap->fip.fip_op = htons(FIP_OP_LS);
+       cap->fip.fip_subcode = FIP_SC_REQ;
+       cap->fip.fip_dl_len = htons((dlen + sizeof(*mac)) / FIP_BPW);
+       cap->fip.fip_flags = htons(FIP_FL_FPMA);
+
+       cap->encaps.fd_desc.fip_dtype = dtype;
+       cap->encaps.fd_desc.fip_dlen = dlen / FIP_BPW;
+
+       mac = (struct fip_mac_desc *)skb_put(skb, sizeof(*mac));
+       memset(mac, 0, sizeof(mac));
+       mac->fd_desc.fip_dtype = FIP_DT_MAC;
+       mac->fd_desc.fip_dlen = sizeof(*mac) / FIP_BPW;
+       if (dtype != ELS_FLOGI)
+               memcpy(mac->fd_mac, fip->data_src_addr, ETH_ALEN);
+
+       skb->protocol = htons(ETH_P_802_3);
+       skb_reset_mac_header(skb);
+       skb_reset_network_header(skb);
        return 0;
 }
 
 /**
- * fcoe_recv_flogi() - flogi receive function
- * @fc: associated fcoe_softc
- * @fp: the recieved frame
- * @sa: the source address of this flogi
+ * fcoe_ctlr_els_send() - Send an ELS frame encapsulated by FIP if appropriate.
+ * @fip:       FCoE controller.
+ * @skb:       FCoE ELS frame including FC header but no FCoE headers.
  *
- * This is responsible to parse the flogi response and sets the corresponding
- * mac address for the initiator, eitehr OUI based or GW based.
+ * Returns a non-zero error code if the frame should not be sent.
+ * Returns zero if the caller should send the frame with FCoE encapsulation.
  *
- * Returns: none
+ * The caller must check that the length is a multiple of 4.
+ * The SKB must have enough headroom (28 bytes) and tailroom (8 bytes).
  */
-static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa)
+int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
 {
        struct fc_frame_header *fh;
+       u16 old_xid;
        u8 op;
 
-       fh = fc_frame_header_get(fp);
-       if (fh->fh_type != FC_TYPE_ELS)
-               return;
-       op = fc_frame_payload_op(fp);
-       if (op == ELS_LS_ACC && fh->fh_r_ctl == FC_RCTL_ELS_REP &&
-           fc->flogi_oxid == ntohs(fh->fh_ox_id)) {
-               /*
-                * FLOGI accepted.
-                * If the src mac addr is FC_OUI-based, then we mark the
-                * address_mode flag to use FC_OUI-based Ethernet DA.
-                * Otherwise we use the FCoE gateway addr
-                */
-               if (!compare_ether_addr(sa, (u8[6]) FC_FCOE_FLOGI_MAC)) {
-                       fc->address_mode = FCOE_FCOUI_ADDR_MODE;
-               } else {
-                       memcpy(fc->dest_addr, sa, ETH_ALEN);
-                       fc->address_mode = FCOE_GW_ADDR_MODE;
-               }
+       if (fip->state == FIP_ST_NON_FIP)
+               return 0;
 
+       fh = (struct fc_frame_header *)skb->data;
+       op = *(u8 *)(fh + 1);
+
+       switch (op) {
+       case ELS_FLOGI:
+               old_xid = fip->flogi_oxid;
+               fip->flogi_oxid = ntohs(fh->fh_ox_id);
+               if (fip->state == FIP_ST_AUTO) {
+                       if (old_xid == FC_XID_UNKNOWN)
+                               fip->flogi_count = 0;
+                       fip->flogi_count++;
+                       if (fip->flogi_count < 3)
+                               goto drop;
+                       fip->map_dest = 1;
+                       return 0;
+               }
+               op = FIP_DT_FLOGI;
+               break;
+       case ELS_FDISC:
+               if (ntoh24(fh->fh_s_id))
+                       return 0;
+               op = FIP_DT_FDISC;
+               break;
+       case ELS_LOGO:
+               if (fip->state != FIP_ST_ENABLED)
+                       return 0;
+               if (ntoh24(fh->fh_d_id) != FC_FID_FLOGI)
+                       return 0;
+               op = FIP_DT_LOGO;
+               break;
+       case ELS_LS_ACC:
+               if (fip->flogi_oxid == FC_XID_UNKNOWN)
+                       return 0;
+               if (!ntoh24(fh->fh_s_id))
+                       return 0;
+               if (fip->state == FIP_ST_AUTO)
+                       return 0;
                /*
-                * Remove any previously-set unicast MAC filter.
-                * Add secondary FCoE MAC address filter for our OUI.
-                */
-               rtnl_lock();
-               if (compare_ether_addr(fc->data_src_addr, (u8[6]) { 0 }))
-                       dev_unicast_delete(fc->real_dev, fc->data_src_addr,
-                                          ETH_ALEN);
-               fc_fcoe_set_mac(fc->data_src_addr, fh->fh_d_id);
-               dev_unicast_add(fc->real_dev, fc->data_src_addr, ETH_ALEN);
-               rtnl_unlock();
-
-               fc->flogi_progress = 0;
-       } else if (op == ELS_FLOGI && fh->fh_r_ctl == FC_RCTL_ELS_REQ && sa) {
-               /*
-                * Save source MAC for point-to-point responses.
+                * Here we must've gotten an SID by accepting an FLOGI
+                * from a point-to-point connection.  Switch to using
+                * the source mac based on the SID.  The destination
+                * MAC in this case would have been set by receving the
+                * FLOGI.
                 */
-               memcpy(fc->dest_addr, sa, ETH_ALEN);
-               fc->address_mode = FCOE_GW_ADDR_MODE;
+               fip->flogi_oxid = FC_XID_UNKNOWN;
+               fc_fcoe_set_mac(fip->data_src_addr, fh->fh_s_id);
+               return 0;
+       default:
+               if (fip->state != FIP_ST_ENABLED)
+                       goto drop;
+               return 0;
        }
+       if (fcoe_ctlr_encaps(fip, op, skb))
+               goto drop;
+       fip->send(fip, skb);
+       return -EINPROGRESS;
+drop:
+       kfree_skb(skb);
+       return -EINVAL;
 }
+EXPORT_SYMBOL(fcoe_ctlr_els_send);
 
-/**
- * fcoe_watchdog() - fcoe timer callback
- * @vp:
+/*
+ * fcoe_ctlr_age_fcfs() - Reset and free all old FCFs for a controller.
+ * @fip:       FCoE controller.
  *
- * This checks the pending queue length for fcoe and set lport qfull
- * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the
- * fcoe_hostlist.
+ * Called with lock held.
  *
- * Returns: 0 for success
+ * An FCF is considered old if we have missed three advertisements.
+ * That is, there have been no valid advertisement from it for three
+ * times its keep-alive period including fuzz.
+ *
+ * In addition, determine the time when an FCF selection can occur.
  */
-void fcoe_watchdog(ulong vp)
+static void fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
 {
-       struct fcoe_softc *fc;
-
-       read_lock(&fcoe_hostlist_lock);
-       list_for_each_entry(fc, &fcoe_hostlist, list) {
-               if (fc->lp)
-                       fcoe_check_wait_queue(fc->lp);
+       struct fcoe_fcf *fcf;
+       struct fcoe_fcf *next;
+       unsigned long sel_time = 0;
+
+       list_for_each_entry_safe(fcf, next, &fip->fcfs, list) {
+               if (time_after(jiffies, fcf->time + fcf->fka_period * 3 +
+                              msecs_to_jiffies(FIP_FCF_FUZZ * 3))) {
+                       if (fip->sel_fcf == fcf)
+                               fip->sel_fcf = NULL;
+                       list_del(&fcf->list);
+                       WARN_ON(!fip->fcf_count);
+                       fip->fcf_count--;
+                       kfree(fcf);
+               } else if (fcoe_ctlr_mtu_valid(fcf) &&
+                          (!sel_time || time_before(sel_time, fcf->time))) {
+                       sel_time = fcf->time;
+               }
+       }
+       if (sel_time) {
+               sel_time += msecs_to_jiffies(FCOE_CTLR_START_DELAY);
+               fip->sel_time = sel_time;
+               if (time_before(sel_time, fip->timer.expires))
+                       mod_timer(&fip->timer, sel_time);
+       } else {
+               fip->sel_time = 0;
        }
-       read_unlock(&fcoe_hostlist_lock);
-
-       fcoe_timer.expires = jiffies + (1 * HZ);
-       add_timer(&fcoe_timer);
 }
 
-
 /**
- * fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue
- * @lp: the fc_port for this skb
- * @skb: the associated skb to be xmitted
+ * fcoe_ctlr_parse_adv() - Decode a FIP advertisement into a new FCF entry.
+ * @skb:       received FIP advertisement frame
+ * @fcf:       resulting FCF entry.
  *
- * This empties the wait_queue, dequeue the head of the wait_queue queue
- * and calls fcoe_start_io() for each packet, if all skb have been
- * transmitted, return qlen or -1 if a error occurs, then restore
- * wait_queue and  try again later.
- *
- * The wait_queue is used when the skb transmit fails. skb will go
- * in the wait_queue which will be emptied by the time function OR
- * by the next skb transmit.
- *
- * Returns: 0 for success
+ * Returns zero on a valid parsed advertisement,
+ * otherwise returns non zero value.
  */
-static int fcoe_check_wait_queue(struct fc_lport *lp)
+static int fcoe_ctlr_parse_adv(struct sk_buff *skb, struct fcoe_fcf *fcf)
 {
-       struct fcoe_softc *fc = lport_priv(lp);
-       struct sk_buff *skb;
-       int rc = -1;
-
-       spin_lock_bh(&fc->fcoe_pending_queue.lock);
-       if (fc->fcoe_pending_queue_active)
-               goto out;
-       fc->fcoe_pending_queue_active = 1;
-
-       while (fc->fcoe_pending_queue.qlen) {
-               /* keep qlen > 0 until fcoe_start_io succeeds */
-               fc->fcoe_pending_queue.qlen++;
-               skb = __skb_dequeue(&fc->fcoe_pending_queue);
-
-               spin_unlock_bh(&fc->fcoe_pending_queue.lock);
-               rc = fcoe_start_io(skb);
-               spin_lock_bh(&fc->fcoe_pending_queue.lock);
-
-               if (rc) {
-                       __skb_queue_head(&fc->fcoe_pending_queue, skb);
-                       /* undo temporary increment above */
-                       fc->fcoe_pending_queue.qlen--;
+       struct fip_header *fiph;
+       struct fip_desc *desc = NULL;
+       struct fip_wwn_desc *wwn;
+       struct fip_fab_desc *fab;
+       struct fip_fka_desc *fka;
+       unsigned long t;
+       size_t rlen;
+       size_t dlen;
+
+       memset(fcf, 0, sizeof(*fcf));
+       fcf->fka_period = msecs_to_jiffies(FCOE_CTLR_DEF_FKA);
+
+       fiph = (struct fip_header *)skb->data;
+       fcf->flags = ntohs(fiph->fip_flags);
+
+       rlen = ntohs(fiph->fip_dl_len) * 4;
+       if (rlen + sizeof(*fiph) > skb->len)
+               return -EINVAL;
+
+       desc = (struct fip_desc *)(fiph + 1);
+       while (rlen > 0) {
+               dlen = desc->fip_dlen * FIP_BPW;
+               if (dlen < sizeof(*desc) || dlen > rlen)
+                       return -EINVAL;
+               switch (desc->fip_dtype) {
+               case FIP_DT_PRI:
+                       if (dlen != sizeof(struct fip_pri_desc))
+                               goto len_err;
+                       fcf->pri = ((struct fip_pri_desc *)desc)->fd_pri;
                        break;
+               case FIP_DT_MAC:
+                       if (dlen != sizeof(struct fip_mac_desc))
+                               goto len_err;
+                       memcpy(fcf->fcf_mac,
+                              ((struct fip_mac_desc *)desc)->fd_mac,
+                              ETH_ALEN);
+                       if (!is_valid_ether_addr(fcf->fcf_mac)) {
+                               FIP_DBG("invalid MAC addr in FIP adv\n");
+                               return -EINVAL;
+                       }
+                       break;
+               case FIP_DT_NAME:
+                       if (dlen != sizeof(struct fip_wwn_desc))
+                               goto len_err;
+                       wwn = (struct fip_wwn_desc *)desc;
+                       fcf->switch_name = get_unaligned_be64(&wwn->fd_wwn);
+                       break;
+               case FIP_DT_FAB:
+                       if (dlen != sizeof(struct fip_fab_desc))
+                               goto len_err;
+                       fab = (struct fip_fab_desc *)desc;
+                       fcf->fabric_name = get_unaligned_be64(&fab->fd_wwn);
+                       fcf->vfid = ntohs(fab->fd_vfid);
+                       fcf->fc_map = ntoh24(fab->fd_map);
+                       break;
+               case FIP_DT_FKA:
+                       if (dlen != sizeof(struct fip_fka_desc))
+                               goto len_err;
+                       fka = (struct fip_fka_desc *)desc;
+                       t = ntohl(fka->fd_fka_period);
+                       if (t >= FCOE_CTLR_MIN_FKA)
+                               fcf->fka_period = msecs_to_jiffies(t);
+                       break;
+               case FIP_DT_MAP_OUI:
+               case FIP_DT_FCOE_SIZE:
+               case FIP_DT_FLOGI:
+               case FIP_DT_FDISC:
+               case FIP_DT_LOGO:
+               case FIP_DT_ELP:
+               default:
+                       FIP_DBG("unexpected descriptor type %x in FIP adv\n",
+                               desc->fip_dtype);
+                       /* standard says ignore unknown descriptors >= 128 */
+                       if (desc->fip_dtype < FIP_DT_VENDOR_BASE)
+                               return -EINVAL;
+                       continue;
                }
-               /* undo temporary increment above */
-               fc->fcoe_pending_queue.qlen--;
+               desc = (struct fip_desc *)((char *)desc + dlen);
+               rlen -= dlen;
        }
+       if (!fcf->fc_map || (fcf->fc_map & 0x10000))
+               return -EINVAL;
+       if (!fcf->switch_name || !fcf->fabric_name)
+               return -EINVAL;
+       return 0;
 
-       if (fc->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH)
-               lp->qfull = 0;
-       fc->fcoe_pending_queue_active = 0;
-       rc = fc->fcoe_pending_queue.qlen;
-out:
-       spin_unlock_bh(&fc->fcoe_pending_queue.lock);
-       return rc;
+len_err:
+       FIP_DBG("FIP length error in descriptor type %x len %zu\n",
+               desc->fip_dtype, dlen);
+       return -EINVAL;
 }
 
 /**
- * fcoe_dev_setup() - setup link change notification interface
+ * fcoe_ctlr_recv_adv() - Handle an incoming advertisement.
+ * @fip:       FCoE controller.
+ * @skb:       Received FIP packet.
  */
-static void fcoe_dev_setup()
+static void fcoe_ctlr_recv_adv(struct fcoe_ctlr *fip, struct sk_buff *skb)
 {
+       struct fcoe_fcf *fcf;
+       struct fcoe_fcf new;
+       struct fcoe_fcf *found;
+       unsigned long sol_tov = msecs_to_jiffies(FCOE_CTRL_SOL_TOV);
+       int first = 0;
+       int mtu_valid;
+
+       if (fcoe_ctlr_parse_adv(skb, &new))
+               return;
+
+       spin_lock_bh(&fip->lock);
+       first = list_empty(&fip->fcfs);
+       found = NULL;
+       list_for_each_entry(fcf, &fip->fcfs, list) {
+               if (fcf->switch_name == new.switch_name &&
+                   fcf->fabric_name == new.fabric_name &&
+                   fcf->fc_map == new.fc_map &&
+                   compare_ether_addr(fcf->fcf_mac, new.fcf_mac) == 0) {
+                       found = fcf;
+                       break;
+               }
+       }
+       if (!found) {
+               if (fip->fcf_count >= FCOE_CTLR_FCF_LIMIT)
+                       goto out;
+
+               fcf = kmalloc(sizeof(*fcf), GFP_ATOMIC);
+               if (!fcf)
+                       goto out;
+
+               fip->fcf_count++;
+               memcpy(fcf, &new, sizeof(new));
+               list_add(&fcf->list, &fip->fcfs);
+       } else {
+               /*
+                * Flags in advertisements are ignored once the FCF is
+                * selected.  Flags in unsolicited advertisements are
+                * ignored after a usable solicited advertisement
+                * has been received.
+                */
+               if (fcf == fip->sel_fcf) {
+                       fip->ctlr_ka_time -= fcf->fka_period;
+                       fip->ctlr_ka_time += new.fka_period;
+                       if (time_before(fip->ctlr_ka_time, fip->timer.expires))
+                               mod_timer(&fip->timer, fip->ctlr_ka_time);
+               } else if (!fcoe_ctlr_fcf_usable(fcf))
+                       fcf->flags = new.flags;
+               fcf->fka_period = new.fka_period;
+               memcpy(fcf->fcf_mac, new.fcf_mac, ETH_ALEN);
+       }
+       mtu_valid = fcoe_ctlr_mtu_valid(fcf);
+       fcf->time = jiffies;
+       FIP_DBG_LVL(found ? 2 : 1, "%s FCF for fab %llx map %x val %d\n",
+                   found ? "old" : "new",
+                   fcf->fabric_name, fcf->fc_map, mtu_valid);
+
        /*
-        * here setup a interface specific wd time to
-        * monitor the link state
+        * If this advertisement is not solicited and our max receive size
+        * hasn't been verified, send a solicited advertisement.
         */
-       register_netdevice_notifier(&fcoe_notifier);
-}
+       if (!mtu_valid)
+               fcoe_ctlr_solicit(fip, fcf);
 
-/**
- * fcoe_dev_setup() - cleanup link change notification interface
- */
-static void fcoe_dev_cleanup(void)
-{
-       unregister_netdevice_notifier(&fcoe_notifier);
+       /*
+        * If its been a while since we did a solicit, and this is
+        * the first advertisement we've received, do a multicast
+        * solicitation to gather as many advertisements as we can
+        * before selection occurs.
+        */
+       if (first && time_after(jiffies, fip->sol_time + sol_tov))
+               fcoe_ctlr_solicit(fip, NULL);
+
+       /*
+        * If this is the first validated FCF, note the time and
+        * set a timer to trigger selection.
+        */
+       if (mtu_valid && !fip->sel_time && fcoe_ctlr_fcf_usable(fcf)) {
+               fip->sel_time = jiffies +
+                               msecs_to_jiffies(FCOE_CTLR_START_DELAY);
+               if (!timer_pending(&fip->timer) ||
+                   time_before(fip->sel_time, fip->timer.expires))
+                       mod_timer(&fip->timer, fip->sel_time);
+       }
+out:
+       spin_unlock_bh(&fip->lock);
 }
 
 /**
- * fcoe_device_notification() - netdev event notification callback
- * @notifier: context of the notification
- * @event: type of event
- * @ptr: fixed array for output parsed ifname
- *
- * This function is called by the ethernet driver in case of link change event
- *
- * Returns: 0 for success
+ * fcoe_ctlr_recv_els() - Handle an incoming FIP-encapsulated ELS frame.
+ * @fip:       FCoE controller.
+ * @skb:       Received FIP packet.
  */
-static int fcoe_device_notification(struct notifier_block *notifier,
-                                   ulong event, void *ptr)
+static void fcoe_ctlr_recv_els(struct fcoe_ctlr *fip, struct sk_buff *skb)
 {
-       struct fc_lport *lp = NULL;
-       struct net_device *real_dev = ptr;
-       struct fcoe_softc *fc;
+       struct fc_lport *lp = fip->lp;
+       struct fip_header *fiph;
+       struct fc_frame *fp;
+       struct fc_frame_header *fh = NULL;
+       struct fip_desc *desc;
+       struct fip_encaps *els;
        struct fcoe_dev_stats *stats;
-       u32 new_link_up;
-       u32 mfs;
-       int rc = NOTIFY_OK;
-
-       read_lock(&fcoe_hostlist_lock);
-       list_for_each_entry(fc, &fcoe_hostlist, list) {
-               if (fc->real_dev == real_dev) {
-                       lp = fc->lp;
+       enum fip_desc_type els_dtype = 0;
+       u8 els_op;
+       u8 sub;
+       u8 granted_mac[ETH_ALEN] = { 0 };
+       size_t els_len = 0;
+       size_t rlen;
+       size_t dlen;
+
+       fiph = (struct fip_header *)skb->data;
+       sub = fiph->fip_subcode;
+       if (sub != FIP_SC_REQ && sub != FIP_SC_REP)
+               goto drop;
+
+       rlen = ntohs(fiph->fip_dl_len) * 4;
+       if (rlen + sizeof(*fiph) > skb->len)
+               goto drop;
+
+       desc = (struct fip_desc *)(fiph + 1);
+       while (rlen > 0) {
+               dlen = desc->fip_dlen * FIP_BPW;
+               if (dlen < sizeof(*desc) || dlen > rlen)
+                       goto drop;
+               switch (desc->fip_dtype) {
+               case FIP_DT_MAC:
+                       if (dlen != sizeof(struct fip_mac_desc))
+                               goto len_err;
+                       memcpy(granted_mac,
+                              ((struct fip_mac_desc *)desc)->fd_mac,
+                              ETH_ALEN);
+                       if (!is_valid_ether_addr(granted_mac)) {
+                               FIP_DBG("invalid MAC addrs in FIP ELS\n");
+                               goto drop;
+                       }
                        break;
+               case FIP_DT_FLOGI:
+               case FIP_DT_FDISC:
+               case FIP_DT_LOGO:
+               case FIP_DT_ELP:
+                       if (fh)
+                               goto drop;
+                       if (dlen < sizeof(*els) + sizeof(*fh) + 1)
+                               goto len_err;
+                       els_len = dlen - sizeof(*els);
+                       els = (struct fip_encaps *)desc;
+                       fh = (struct fc_frame_header *)(els + 1);
+                       els_dtype = desc->fip_dtype;
+                       break;
+               default:
+                       FIP_DBG("unexpected descriptor type %x "
+                               "in FIP adv\n", desc->fip_dtype);
+                       /* standard says ignore unknown descriptors >= 128 */
+                       if (desc->fip_dtype < FIP_DT_VENDOR_BASE)
+                               goto drop;
+                       continue;
                }
-       }
-       read_unlock(&fcoe_hostlist_lock);
-       if (lp == NULL) {
-               rc = NOTIFY_DONE;
-               goto out;
+               desc = (struct fip_desc *)((char *)desc + dlen);
+               rlen -= dlen;
        }
 
-       new_link_up = lp->link_up;
-       switch (event) {
-       case NETDEV_DOWN:
-       case NETDEV_GOING_DOWN:
-               new_link_up = 0;
-               break;
-       case NETDEV_UP:
-       case NETDEV_CHANGE:
-               new_link_up = !fcoe_link_ok(lp);
-               break;
-       case NETDEV_CHANGEMTU:
-               mfs = fc->real_dev->mtu -
-                       (sizeof(struct fcoe_hdr) +
-                        sizeof(struct fcoe_crc_eof));
-               if (mfs >= FC_MIN_MAX_FRAME)
-                       fc_set_mfs(lp, mfs);
-               new_link_up = !fcoe_link_ok(lp);
-               break;
-       case NETDEV_REGISTER:
-               break;
-       default:
-               FC_DBG("unknown event %ld call", event);
-       }
-       if (lp->link_up != new_link_up) {
-               if (new_link_up)
-                       fc_linkup(lp);
-               else {
-                       stats = lp->dev_stats[smp_processor_id()];
-                       if (stats)
-                               stats->LinkFailureCount++;
-                       fc_linkdown(lp);
-                       fcoe_clean_pending_queue(lp);
-               }
-       }
-out:
-       return rc;
-}
+       if (!fh)
+               goto drop;
+       els_op = *(u8 *)(fh + 1);
 
-/**
- * fcoe_if_to_netdev() - parse a name buffer to get netdev
- * @ifname: fixed array for output parsed ifname
- * @buffer: incoming buffer to be copied
- *
- * Returns: NULL or ptr to netdeive
- */
-static struct net_device *fcoe_if_to_netdev(const char *buffer)
-{
-       char *cp;
-       char ifname[IFNAMSIZ + 2];
-
-       if (buffer) {
-               strlcpy(ifname, buffer, IFNAMSIZ);
-               cp = ifname + strlen(ifname);
-               while (--cp >= ifname && *cp == '\n')
-                       *cp = '\0';
-               return dev_get_by_name(&init_net, ifname);
+       if (els_dtype == FIP_DT_FLOGI && sub == FIP_SC_REP &&
+           fip->flogi_oxid == ntohs(fh->fh_ox_id) &&
+           els_op == ELS_LS_ACC && is_valid_ether_addr(granted_mac)) {
+               fip->flogi_oxid = FC_XID_UNKNOWN;
+               fip->update_mac(fip, fip->data_src_addr, granted_mac);
+               memcpy(fip->data_src_addr, granted_mac, ETH_ALEN);
        }
-       return NULL;
+
+       /*
+        * Convert skb into an fc_frame containing only the ELS.
+        */
+       skb_pull(skb, (u8 *)fh - skb->data);
+       skb_trim(skb, els_len);
+       fp = (struct fc_frame *)skb;
+       fc_frame_init(fp);
+       fr_sof(fp) = FC_SOF_I3;
+       fr_eof(fp) = FC_EOF_T;
+       fr_dev(fp) = lp;
+
+       stats = fc_lport_get_stats(lp);
+       stats->RxFrames++;
+       stats->RxWords += skb->len / FIP_BPW;
+
+       fc_exch_recv(lp, lp->emp, fp);
+       return;
+
+len_err:
+       FIP_DBG("FIP length error in descriptor type %x len %zu\n",
+               desc->fip_dtype, dlen);
+drop:
+       kfree_skb(skb);
 }
 
 /**
- * fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev
- * @netdev: the target netdev
+ * fcoe_ctlr_recv_els() - Handle an incoming link reset frame.
+ * @fip:       FCoE controller.
+ * @fh:                Received FIP header.
  *
- * Returns: ptr to the struct module, NULL for failure
+ * There may be multiple VN_Port descriptors.
+ * The overall length has already been checked.
  */
-static struct module *
-fcoe_netdev_to_module_owner(const struct net_device *netdev)
+static void fcoe_ctlr_recv_clr_vlink(struct fcoe_ctlr *fip,
+                                     struct fip_header *fh)
 {
-       struct device *dev;
-
-       if (!netdev)
-               return NULL;
-
-       dev = netdev->dev.parent;
-       if (!dev)
-               return NULL;
+       struct fip_desc *desc;
+       struct fip_mac_desc *mp;
+       struct fip_wwn_desc *wp;
+       struct fip_vn_desc *vp;
+       size_t rlen;
+       size_t dlen;
+       struct fcoe_fcf *fcf = fip->sel_fcf;
+       struct fc_lport *lp = fip->lp;
+       u32     desc_mask;
+
+       FIP_DBG("Clear Virtual Link received\n");
+       if (!fcf)
+               return;
+       if (!fcf || !fc_host_port_id(lp->host))
+               return;
 
-       if (!dev->driver)
-               return NULL;
+       /*
+        * mask of required descriptors.  Validating each one clears its bit.
+        */
+       desc_mask = BIT(FIP_DT_MAC) | BIT(FIP_DT_NAME) | BIT(FIP_DT_VN_ID);
+
+       rlen = ntohs(fh->fip_dl_len) * FIP_BPW;
+       desc = (struct fip_desc *)(fh + 1);
+       while (rlen >= sizeof(*desc)) {
+               dlen = desc->fip_dlen * FIP_BPW;
+               if (dlen > rlen)
+                       return;
+               switch (desc->fip_dtype) {
+               case FIP_DT_MAC:
+                       mp = (struct fip_mac_desc *)desc;
+                       if (dlen < sizeof(*mp))
+                               return;
+                       if (compare_ether_addr(mp->fd_mac, fcf->fcf_mac))
+                               return;
+                       desc_mask &= ~BIT(FIP_DT_MAC);
+                       break;
+               case FIP_DT_NAME:
+                       wp = (struct fip_wwn_desc *)desc;
+                       if (dlen < sizeof(*wp))
+                               return;
+                       if (get_unaligned_be64(&wp->fd_wwn) != fcf->switch_name)
+                               return;
+                       desc_mask &= ~BIT(FIP_DT_NAME);
+                       break;
+               case FIP_DT_VN_ID:
+                       vp = (struct fip_vn_desc *)desc;
+                       if (dlen < sizeof(*vp))
+                               return;
+                       if (compare_ether_addr(vp->fd_mac,
+                           fip->data_src_addr) == 0 &&
+                           get_unaligned_be64(&vp->fd_wwpn) == lp->wwpn &&
+                           ntoh24(vp->fd_fc_id) == fc_host_port_id(lp->host))
+                               desc_mask &= ~BIT(FIP_DT_VN_ID);
+                       break;
+               default:
+                       /* standard says ignore unknown descriptors >= 128 */
+                       if (desc->fip_dtype < FIP_DT_VENDOR_BASE)
+                               return;
+                       break;
+               }
+               desc = (struct fip_desc *)((char *)desc + dlen);
+               rlen -= dlen;
+       }
 
-       return dev->driver->owner;
+       /*
+        * reset only if all required descriptors were present and valid.
+        */
+       if (desc_mask) {
+               FIP_DBG("missing descriptors mask %x\n", desc_mask);
+       } else {
+               FIP_DBG("performing Clear Virtual Link\n");
+               fcoe_ctlr_reset(fip, FIP_ST_ENABLED);
+       }
 }
 
 /**
- * fcoe_ethdrv_get() - Hold the Ethernet driver
- * @netdev: the target netdev
+ * fcoe_ctlr_recv() - Receive a FIP frame.
+ * @fip:       FCoE controller.
+ * @skb:       Received FIP packet.
  *
- * Holds the Ethernet driver module by try_module_get() for
- * the corresponding netdev.
- *
- * Returns: 0 for succsss
+ * This is called from NET_RX_SOFTIRQ.
  */
-static int fcoe_ethdrv_get(const struct net_device *netdev)
+void fcoe_ctlr_recv(struct fcoe_ctlr *fip, struct sk_buff *skb)
 {
-       struct module *owner;
-
-       owner = fcoe_netdev_to_module_owner(netdev);
-       if (owner) {
-               printk(KERN_DEBUG "fcoe:hold driver module %s for %s\n",
-                      module_name(owner), netdev->name);
-               return  try_module_get(owner);
-       }
-       return -ENODEV;
+       spin_lock_bh(&fip->fip_recv_list.lock);
+       __skb_queue_tail(&fip->fip_recv_list, skb);
+       spin_unlock_bh(&fip->fip_recv_list.lock);
+       schedule_work(&fip->recv_work);
 }
+EXPORT_SYMBOL(fcoe_ctlr_recv);
 
 /**
- * fcoe_ethdrv_put() - Release the Ethernet driver
- * @netdev: the target netdev
+ * fcoe_ctlr_recv_handler() - Receive a FIP frame.
+ * @fip:       FCoE controller.
+ * @skb:       Received FIP packet.
  *
- * Releases the Ethernet driver module by module_put for
- * the corresponding netdev.
- *
- * Returns: 0 for succsss
+ * Returns non-zero if the frame is dropped.
  */
-static int fcoe_ethdrv_put(const struct net_device *netdev)
+static int fcoe_ctlr_recv_handler(struct fcoe_ctlr *fip, struct sk_buff *skb)
 {
-       struct module *owner;
+       struct fip_header *fiph;
+       struct ethhdr *eh;
+       enum fip_state state;
+       u16 op;
+       u8 sub;
+
+       if (skb_linearize(skb))
+               goto drop;
+       if (skb->len < sizeof(*fiph))
+               goto drop;
+       eh = eth_hdr(skb);
+       if (compare_ether_addr(eh->h_dest, fip->ctl_src_addr) &&
+           compare_ether_addr(eh->h_dest, FIP_ALL_ENODE_MACS))
+               goto drop;
+       fiph = (struct fip_header *)skb->data;
+       op = ntohs(fiph->fip_op);
+       sub = fiph->fip_subcode;
+
+       FIP_DBG_LVL(2, "ver %x op %x/%x dl %x fl %x\n",
+                   FIP_VER_DECAPS(fiph->fip_ver), op, sub,
+                   ntohs(fiph->fip_dl_len), ntohs(fiph->fip_flags));
+
+       if (FIP_VER_DECAPS(fiph->fip_ver) != FIP_VER)
+               goto drop;
+       if (ntohs(fiph->fip_dl_len) * FIP_BPW + sizeof(*fiph) > skb->len)
+               goto drop;
+
+       spin_lock_bh(&fip->lock);
+       state = fip->state;
+       if (state == FIP_ST_AUTO) {
+               fip->map_dest = 0;
+               fip->state = FIP_ST_ENABLED;
+               state = FIP_ST_ENABLED;
+               FIP_DBG("using FIP mode\n");
+       }
+       spin_unlock_bh(&fip->lock);
+       if (state != FIP_ST_ENABLED)
+               goto drop;
 
-       owner = fcoe_netdev_to_module_owner(netdev);
-       if (owner) {
-               printk(KERN_DEBUG "fcoe:release driver module %s for %s\n",
-                      module_name(owner), netdev->name);
-               module_put(owner);
+       if (op == FIP_OP_LS) {
+               fcoe_ctlr_recv_els(fip, skb);   /* consumes skb */
                return 0;
        }
-       return -ENODEV;
+       if (op == FIP_OP_DISC && sub == FIP_SC_ADV)
+               fcoe_ctlr_recv_adv(fip, skb);
+       else if (op == FIP_OP_CTRL && sub == FIP_SC_CLR_VLINK)
+               fcoe_ctlr_recv_clr_vlink(fip, fiph);
+       kfree_skb(skb);
+       return 0;
+drop:
+       kfree_skb(skb);
+       return -1;
 }
 
 /**
- * fcoe_destroy() - handles the destroy from sysfs
- * @buffer: expcted to be a eth if name
- * @kp: associated kernel param
+ * fcoe_ctlr_select() - Select the best FCF, if possible.
+ * @fip:       FCoE controller.
+ *
+ * If there are conflicting advertisements, no FCF can be chosen.
  *
- * Returns: 0 for success
+ * Called with lock held.
  */
-static int fcoe_destroy(const char *buffer, struct kernel_param *kp)
+static void fcoe_ctlr_select(struct fcoe_ctlr *fip)
 {
-       int rc;
-       struct net_device *netdev;
-
-       netdev = fcoe_if_to_netdev(buffer);
-       if (!netdev) {
-               rc = -ENODEV;
-               goto out_nodev;
-       }
-       /* look for existing lport */
-       if (!fcoe_hostlist_lookup(netdev)) {
-               rc = -ENODEV;
-               goto out_putdev;
-       }
-       /* pass to transport */
-       rc = fcoe_transport_release(netdev);
-       if (rc) {
-               printk(KERN_ERR "fcoe: fcoe_transport_release(%s) failed\n",
-                      netdev->name);
-               rc = -EIO;
-               goto out_putdev;
+       struct fcoe_fcf *fcf;
+       struct fcoe_fcf *best = NULL;
+
+       list_for_each_entry(fcf, &fip->fcfs, list) {
+               FIP_DBG("consider FCF for fab %llx VFID %d map %x val %d\n",
+                       fcf->fabric_name, fcf->vfid,
+                       fcf->fc_map, fcoe_ctlr_mtu_valid(fcf));
+               if (!fcoe_ctlr_fcf_usable(fcf)) {
+                       FIP_DBG("FCF for fab %llx map %x %svalid %savailable\n",
+                               fcf->fabric_name, fcf->fc_map,
+                               (fcf->flags & FIP_FL_SOL) ? "" : "in",
+                               (fcf->flags & FIP_FL_AVAIL) ? "" : "un");
+                       continue;
+               }
+               if (!best) {
+                       best = fcf;
+                       continue;
+               }
+               if (fcf->fabric_name != best->fabric_name ||
+                   fcf->vfid != best->vfid ||
+                   fcf->fc_map != best->fc_map) {
+                       FIP_DBG("conflicting fabric, VFID, or FC-MAP\n");
+                       return;
+               }
+               if (fcf->pri < best->pri)
+                       best = fcf;
        }
-       fcoe_ethdrv_put(netdev);
-       rc = 0;
-out_putdev:
-       dev_put(netdev);
-out_nodev:
-       return rc;
+       fip->sel_fcf = best;
 }
 
 /**
- * fcoe_create() - Handles the create call from sysfs
- * @buffer: expcted to be a eth if name
- * @kp: associated kernel param
+ * fcoe_ctlr_timeout() - FIP timer function.
+ * @arg:       &fcoe_ctlr pointer.
  *
- * Returns: 0 for success
+ * Ages FCFs.  Triggers FCF selection if possible.  Sends keep-alives.
  */
-static int fcoe_create(const char *buffer, struct kernel_param *kp)
+static void fcoe_ctlr_timeout(unsigned long arg)
 {
-       int rc;
-       struct net_device *netdev;
-
-       netdev = fcoe_if_to_netdev(buffer);
-       if (!netdev) {
-               rc = -ENODEV;
-               goto out_nodev;
+       struct fcoe_ctlr *fip = (struct fcoe_ctlr *)arg;
+       struct fcoe_fcf *sel;
+       struct fcoe_fcf *fcf;
+       unsigned long next_timer = jiffies + msecs_to_jiffies(FIP_VN_KA_PERIOD);
+       DECLARE_MAC_BUF(buf);
+       u8 send_ctlr_ka;
+       u8 send_port_ka;
+
+       spin_lock_bh(&fip->lock);
+       if (fip->state == FIP_ST_DISABLED) {
+               spin_unlock_bh(&fip->lock);
+               return;
        }
-       /* look for existing lport */
-       if (fcoe_hostlist_lookup(netdev)) {
-               rc = -EEXIST;
-               goto out_putdev;
+
+       fcf = fip->sel_fcf;
+       fcoe_ctlr_age_fcfs(fip);
+
+       sel = fip->sel_fcf;
+       if (!sel && fip->sel_time && time_after_eq(jiffies, fip->sel_time)) {
+               fcoe_ctlr_select(fip);
+               sel = fip->sel_fcf;
+               fip->sel_time = 0;
        }
-       fcoe_ethdrv_get(netdev);
-
-       /* pass to transport */
-       rc = fcoe_transport_attach(netdev);
-       if (rc) {
-               printk(KERN_ERR "fcoe: fcoe_transport_attach(%s) failed\n",
-                      netdev->name);
-               fcoe_ethdrv_put(netdev);
-               rc = -EIO;
-               goto out_putdev;
+
+       if (sel != fcf) {
+               fcf = sel;              /* the old FCF may have been freed */
+               if (sel) {
+                       printk(KERN_INFO "host%d: FIP selected "
+                              "Fibre-Channel Forwarder MAC %s\n",
+                              fip->lp->host->host_no,
+                              print_mac(buf, sel->fcf_mac));
+                       memcpy(fip->dest_addr, sel->fcf_mac, ETH_ALEN);
+                       fip->port_ka_time = jiffies +
+                                           msecs_to_jiffies(FIP_VN_KA_PERIOD);
+                       fip->ctlr_ka_time = jiffies + sel->fka_period;
+                       fip->link = 1;
+               } else {
+                       printk(KERN_NOTICE "host%d: "
+                              "FIP Fibre-Channel Forwarder timed out.  "
+                              "Starting FCF discovery.\n",
+                              fip->lp->host->host_no);
+                       fip->link = 0;
+               }
+               schedule_work(&fip->link_work);
        }
-       rc = 0;
-out_putdev:
-       dev_put(netdev);
-out_nodev:
-       return rc;
-}
 
-module_param_call(create, fcoe_create, NULL, NULL, S_IWUSR);
-__MODULE_PARM_TYPE(create, "string");
-MODULE_PARM_DESC(create, "Create fcoe port using net device passed in.");
-module_param_call(destroy, fcoe_destroy, NULL, NULL, S_IWUSR);
-__MODULE_PARM_TYPE(destroy, "string");
-MODULE_PARM_DESC(destroy, "Destroy fcoe port");
+       send_ctlr_ka = 0;
+       send_port_ka = 0;
+       if (sel) {
+               if (time_after_eq(jiffies, fip->ctlr_ka_time)) {
+                       fip->ctlr_ka_time = jiffies + sel->fka_period;
+                       send_ctlr_ka = 1;
+               }
+               if (time_after(next_timer, fip->ctlr_ka_time))
+                       next_timer = fip->ctlr_ka_time;
 
-/**
- * fcoe_link_ok() - Check if link is ok for the fc_lport
- * @lp: ptr to the fc_lport
- *
- * Any permanently-disqualifying conditions have been previously checked.
- * This also updates the speed setting, which may change with link for 100/1000.
- *
- * This function should probably be checking for PAUSE support at some point
- * in the future. Currently Per-priority-pause is not determinable using
- * ethtool, so we shouldn't be restrictive until that problem is resolved.
- *
- * Returns: 0 if link is OK for use by FCoE.
- *
- */
-int fcoe_link_ok(struct fc_lport *lp)
-{
-       struct fcoe_softc *fc = lport_priv(lp);
-       struct net_device *dev = fc->real_dev;
-       struct ethtool_cmd ecmd = { ETHTOOL_GSET };
-       int rc = 0;
-
-       if ((dev->flags & IFF_UP) && netif_carrier_ok(dev)) {
-               dev = fc->phys_dev;
-               if (dev->ethtool_ops->get_settings) {
-                       dev->ethtool_ops->get_settings(dev, &ecmd);
-                       lp->link_supported_speeds &=
-                               ~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT);
-                       if (ecmd.supported & (SUPPORTED_1000baseT_Half |
-                                             SUPPORTED_1000baseT_Full))
-                               lp->link_supported_speeds |= FC_PORTSPEED_1GBIT;
-                       if (ecmd.supported & SUPPORTED_10000baseT_Full)
-                               lp->link_supported_speeds |=
-                                       FC_PORTSPEED_10GBIT;
-                       if (ecmd.speed == SPEED_1000)
-                               lp->link_speed = FC_PORTSPEED_1GBIT;
-                       if (ecmd.speed == SPEED_10000)
-                               lp->link_speed = FC_PORTSPEED_10GBIT;
+               if (time_after_eq(jiffies, fip->port_ka_time)) {
+                       fip->port_ka_time += jiffies +
+                                       msecs_to_jiffies(FIP_VN_KA_PERIOD);
+                       send_port_ka = 1;
                }
-       } else
-               rc = -1;
+               if (time_after(next_timer, fip->port_ka_time))
+                       next_timer = fip->port_ka_time;
+               mod_timer(&fip->timer, next_timer);
+       } else if (fip->sel_time) {
+               next_timer = fip->sel_time +
+                               msecs_to_jiffies(FCOE_CTLR_START_DELAY);
+               mod_timer(&fip->timer, next_timer);
+       }
+       spin_unlock_bh(&fip->lock);
 
-       return rc;
+       if (send_ctlr_ka)
+               fcoe_ctlr_send_keep_alive(fip, 0, fip->ctl_src_addr);
+       if (send_port_ka)
+               fcoe_ctlr_send_keep_alive(fip, 1, fip->data_src_addr);
 }
-EXPORT_SYMBOL_GPL(fcoe_link_ok);
 
 /**
- * fcoe_percpu_clean() - Clear the pending skbs for an lport
- * @lp: the fc_lport
+ * fcoe_ctlr_link_work() - worker thread function for link changes.
+ * @work:      pointer to link_work member inside &fcoe_ctlr.
+ *
+ * See if the link status has changed and if so, report it.
+ *
+ * This is here because fc_linkup() and fc_linkdown() must not
+ * be called from the timer directly, since they use a mutex.
  */
-void fcoe_percpu_clean(struct fc_lport *lp)
+static void fcoe_ctlr_link_work(struct work_struct *work)
 {
-       int idx;
-       struct fcoe_percpu_s *pp;
-       struct fcoe_rcv_info *fr;
-       struct sk_buff_head *list;
-       struct sk_buff *skb, *next;
-       struct sk_buff *head;
-
-       for (idx = 0; idx < NR_CPUS; idx++) {
-               if (fcoe_percpu[idx]) {
-                       pp = fcoe_percpu[idx];
-                       spin_lock_bh(&pp->fcoe_rx_list.lock);
-                       list = &pp->fcoe_rx_list;
-                       head = list->next;
-                       for (skb = head; skb != (struct sk_buff *)list;
-                            skb = next) {
-                               next = skb->next;
-                               fr = fcoe_dev_from_skb(skb);
-                               if (fr->fr_dev == lp) {
-                                       __skb_unlink(skb, list);
-                                       kfree_skb(skb);
-                               }
-                       }
-                       spin_unlock_bh(&pp->fcoe_rx_list.lock);
-               }
+       struct fcoe_ctlr *fip;
+       int link;
+       int last_link;
+
+       fip = container_of(work, struct fcoe_ctlr, link_work);
+       spin_lock_bh(&fip->lock);
+       last_link = fip->last_link;
+       link = fip->link;
+       fip->last_link = link;
+       spin_unlock_bh(&fip->lock);
+
+       if (last_link != link) {
+               if (link)
+                       fc_linkup(fip->lp);
+               else
+                       fcoe_ctlr_reset(fip, FIP_ST_LINK_WAIT);
        }
 }
-EXPORT_SYMBOL_GPL(fcoe_percpu_clean);
 
 /**
- * fcoe_clean_pending_queue() - Dequeue a skb and free it
- * @lp: the corresponding fc_lport
- *
- * Returns: none
+ * fcoe_ctlr_recv_work() - Worker thread function for receiving FIP frames.
+ * @recv_work: pointer to recv_work member inside &fcoe_ctlr.
  */
-void fcoe_clean_pending_queue(struct fc_lport *lp)
+static void fcoe_ctlr_recv_work(struct work_struct *recv_work)
 {
-       struct fcoe_softc  *fc = lport_priv(lp);
+       struct fcoe_ctlr *fip;
        struct sk_buff *skb;
 
-       spin_lock_bh(&fc->fcoe_pending_queue.lock);
-       while ((skb = __skb_dequeue(&fc->fcoe_pending_queue)) != NULL) {
-               spin_unlock_bh(&fc->fcoe_pending_queue.lock);
-               kfree_skb(skb);
-               spin_lock_bh(&fc->fcoe_pending_queue.lock);
+       fip = container_of(recv_work, struct fcoe_ctlr, recv_work);
+       spin_lock_bh(&fip->fip_recv_list.lock);
+       while ((skb = __skb_dequeue(&fip->fip_recv_list))) {
+               spin_unlock_bh(&fip->fip_recv_list.lock);
+               fcoe_ctlr_recv_handler(fip, skb);
+               spin_lock_bh(&fip->fip_recv_list.lock);
        }
-       spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+       spin_unlock_bh(&fip->fip_recv_list.lock);
 }
-EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue);
 
 /**
- * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport
- * @sht: ptr to the scsi host templ
- * @priv_size: size of private data after fc_lport
+ * fcoe_ctlr_recv_flogi() - snoop Pre-FIP receipt of FLOGI response or request.
+ * @fip:       FCoE controller.
+ * @fp:                FC frame.
+ * @sa:                Ethernet source MAC address from received FCoE frame.
  *
- * Returns: ptr to Scsi_Host
- * TODO: to libfc?
- */
-static inline struct Scsi_Host *
-libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
-{
-       return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size);
-}
-
-/**
- * fcoe_host_alloc() - Allocate a Scsi_Host with room for the fcoe_softc
- * @sht: ptr to the scsi host templ
- * @priv_size: size of private data after fc_lport
+ * Snoop potential response to FLOGI or even incoming FLOGI.
  *
- * Returns: ptr to Scsi_Host
- */
-struct Scsi_Host *fcoe_host_alloc(struct scsi_host_template *sht, int priv_size)
-{
-       return libfc_host_alloc(sht, sizeof(struct fcoe_softc) + priv_size);
-}
-EXPORT_SYMBOL_GPL(fcoe_host_alloc);
-
-/**
- * fcoe_reset() - Resets the fcoe
- * @shost: shost the reset is from
+ * The caller has checked that we are waiting for login as indicated
+ * by fip->flogi_oxid != FC_XID_UNKNOWN.
+ *
+ * The caller is responsible for freeing the frame.
  *
- * Returns: always 0
+ * Return non-zero if the frame should not be delivered to libfc.
  */
-int fcoe_reset(struct Scsi_Host *shost)
+int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *fip, struct fc_frame *fp, u8 *sa)
 {
-       struct fc_lport *lport = shost_priv(shost);
-       fc_lport_reset(lport);
+       struct fc_frame_header *fh;
+       u8 op;
+       u8 mac[ETH_ALEN];
+
+       fh = fc_frame_header_get(fp);
+       if (fh->fh_type != FC_TYPE_ELS)
+               return 0;
+
+       op = fc_frame_payload_op(fp);
+       if (op == ELS_LS_ACC && fh->fh_r_ctl == FC_RCTL_ELS_REP &&
+           fip->flogi_oxid == ntohs(fh->fh_ox_id)) {
+
+               spin_lock_bh(&fip->lock);
+               if (fip->state != FIP_ST_AUTO && fip->state != FIP_ST_NON_FIP) {
+                       spin_unlock_bh(&fip->lock);
+                       return -EINVAL;
+               }
+               fip->state = FIP_ST_NON_FIP;
+               FIP_DBG("received FLOGI LS_ACC using non-FIP mode\n");
+
+               /*
+                * FLOGI accepted.
+                * If the src mac addr is FC_OUI-based, then we mark the
+                * address_mode flag to use FC_OUI-based Ethernet DA.
+                * Otherwise we use the FCoE gateway addr
+                */
+               if (!compare_ether_addr(sa, (u8[6])FC_FCOE_FLOGI_MAC)) {
+                       fip->map_dest = 1;
+               } else {
+                       memcpy(fip->dest_addr, sa, ETH_ALEN);
+                       fip->map_dest = 0;
+               }
+               fip->flogi_oxid = FC_XID_UNKNOWN;
+               memcpy(mac, fip->data_src_addr, ETH_ALEN);
+               fc_fcoe_set_mac(fip->data_src_addr, fh->fh_d_id);
+               spin_unlock_bh(&fip->lock);
+
+               fip->update_mac(fip, mac, fip->data_src_addr);
+       } else if (op == ELS_FLOGI && fh->fh_r_ctl == FC_RCTL_ELS_REQ && sa) {
+               /*
+                * Save source MAC for point-to-point responses.
+                */
+               spin_lock_bh(&fip->lock);
+               if (fip->state == FIP_ST_AUTO || fip->state == FIP_ST_NON_FIP) {
+                       memcpy(fip->dest_addr, sa, ETH_ALEN);
+                       fip->map_dest = 0;
+                       if (fip->state == FIP_ST_NON_FIP)
+                               FIP_DBG("received FLOGI REQ, "
+                                               "using non-FIP mode\n");
+                       fip->state = FIP_ST_NON_FIP;
+               }
+               spin_unlock_bh(&fip->lock);
+       }
        return 0;
 }
-EXPORT_SYMBOL_GPL(fcoe_reset);
+EXPORT_SYMBOL(fcoe_ctlr_recv_flogi);
 
 /**
  * fcoe_wwn_from_mac() - Converts 48-bit IEEE MAC address to 64-bit FC WWN.
@@ -1253,85 +1314,6 @@ u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN],
 }
 EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac);
 
-/**
- * fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device
- * @device: this is currently ptr to net_device
- *
- * Returns: NULL or the located fcoe_softc
- */
-static struct fcoe_softc *
-fcoe_hostlist_lookup_softc(const struct net_device *dev)
-{
-       struct fcoe_softc *fc;
-
-       read_lock(&fcoe_hostlist_lock);
-       list_for_each_entry(fc, &fcoe_hostlist, list) {
-               if (fc->real_dev == dev) {
-                       read_unlock(&fcoe_hostlist_lock);
-                       return fc;
-               }
-       }
-       read_unlock(&fcoe_hostlist_lock);
-       return NULL;
-}
-
-/**
- * fcoe_hostlist_lookup() - Find the corresponding lport by netdev
- * @netdev: ptr to net_device
- *
- * Returns: 0 for success
- */
-struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev)
-{
-       struct fcoe_softc *fc;
-
-       fc = fcoe_hostlist_lookup_softc(netdev);
-
-       return (fc) ? fc->lp : NULL;
-}
-EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup);
-
-/**
- * fcoe_hostlist_add() - Add a lport to lports list
- * @lp: ptr to the fc_lport to badded
- *
- * Returns: 0 for success
- */
-int fcoe_hostlist_add(const struct fc_lport *lp)
-{
-       struct fcoe_softc *fc;
-
-       fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp));
-       if (!fc) {
-               fc = lport_priv(lp);
-               write_lock_bh(&fcoe_hostlist_lock);
-               list_add_tail(&fc->list, &fcoe_hostlist);
-               write_unlock_bh(&fcoe_hostlist_lock);
-       }
-       return 0;
-}
-EXPORT_SYMBOL_GPL(fcoe_hostlist_add);
-
-/**
- * fcoe_hostlist_remove() - remove a lport from lports list
- * @lp: ptr to the fc_lport to badded
- *
- * Returns: 0 for success
- */
-int fcoe_hostlist_remove(const struct fc_lport *lp)
-{
-       struct fcoe_softc *fc;
-
-       fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp));
-       BUG_ON(!fc);
-       write_lock_bh(&fcoe_hostlist_lock);
-       list_del(&fc->list);
-       write_unlock_bh(&fcoe_hostlist_lock);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(fcoe_hostlist_remove);
-
 /**
  * fcoe_libfc_config() - sets up libfc related properties for lport
  * @lp: ptr to the fc_lport
@@ -1354,121 +1336,3 @@ int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt)
        return 0;
 }
 EXPORT_SYMBOL_GPL(fcoe_libfc_config);
-
-/**
- * fcoe_init() - fcoe module loading initialization
- *
- * Initialization routine
- * 1. Will create fc transport software structure
- * 2. initialize the link list of port information structure
- *
- * Returns 0 on success, negative on failure
- */
-static int __init fcoe_init(void)
-{
-       int cpu;
-       struct fcoe_percpu_s *p;
-
-
-       INIT_LIST_HEAD(&fcoe_hostlist);
-       rwlock_init(&fcoe_hostlist_lock);
-
-#ifdef CONFIG_HOTPLUG_CPU
-       register_cpu_notifier(&fcoe_cpu_notifier);
-#endif /* CONFIG_HOTPLUG_CPU */
-
-       /*
-        * initialize per CPU interrupt thread
-        */
-       for_each_online_cpu(cpu) {
-               p = kzalloc(sizeof(struct fcoe_percpu_s), GFP_KERNEL);
-               if (p) {
-                       p->thread = kthread_create(fcoe_percpu_receive_thread,
-                                                  (void *)p,
-                                                  "fcoethread/%d", cpu);
-
-                       /*
-                        * if there is no error then bind the thread to the cpu
-                        * initialize the semaphore and skb queue head
-                        */
-                       if (likely(!IS_ERR(p->thread))) {
-                               p->cpu = cpu;
-                               fcoe_percpu[cpu] = p;
-                               skb_queue_head_init(&p->fcoe_rx_list);
-                               kthread_bind(p->thread, cpu);
-                               wake_up_process(p->thread);
-                       } else {
-                               fcoe_percpu[cpu] = NULL;
-                               kfree(p);
-                       }
-               }
-       }
-
-       /*
-        * setup link change notification
-        */
-       fcoe_dev_setup();
-
-       setup_timer(&fcoe_timer, fcoe_watchdog, 0);
-
-       mod_timer(&fcoe_timer, jiffies + (10 * HZ));
-
-       /* initiatlize the fcoe transport */
-       fcoe_transport_init();
-
-       fcoe_sw_init();
-
-       return 0;
-}
-module_init(fcoe_init);
-
-/**
- * fcoe_exit() - fcoe module unloading cleanup
- *
- * Returns 0 on success, negative on failure
- */
-static void __exit fcoe_exit(void)
-{
-       u32 idx;
-       struct fcoe_softc *fc, *tmp;
-       struct fcoe_percpu_s *p;
-       struct sk_buff *skb;
-
-       /*
-        * Stop all call back interfaces
-        */
-#ifdef CONFIG_HOTPLUG_CPU
-       unregister_cpu_notifier(&fcoe_cpu_notifier);
-#endif /* CONFIG_HOTPLUG_CPU */
-       fcoe_dev_cleanup();
-
-       /*
-        * stop timer
-        */
-       del_timer_sync(&fcoe_timer);
-
-       /* releases the associated fcoe transport for each lport */
-       list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list)
-               fcoe_transport_release(fc->real_dev);
-
-       for (idx = 0; idx < NR_CPUS; idx++) {
-               if (fcoe_percpu[idx]) {
-                       kthread_stop(fcoe_percpu[idx]->thread);
-                       p = fcoe_percpu[idx];
-                       spin_lock_bh(&p->fcoe_rx_list.lock);
-                       while ((skb = __skb_dequeue(&p->fcoe_rx_list)) != NULL)
-                               kfree_skb(skb);
-                       spin_unlock_bh(&p->fcoe_rx_list.lock);
-                       if (fcoe_percpu[idx]->crc_eof_page)
-                               put_page(fcoe_percpu[idx]->crc_eof_page);
-                       kfree(fcoe_percpu[idx]);
-               }
-       }
-
-       /* remove sw trasnport */
-       fcoe_sw_exit();
-
-       /* detach the transport */
-       fcoe_transport_exit();
-}
-module_exit(fcoe_exit);
index fb247fdfa2bd51d91ea567918d51cd3e818371a9..185e6bc4dd40076519dea524d9687fa8cc0f51f5 100644 (file)
@@ -5023,16 +5023,16 @@ static int __devinit gdth_pci_probe_one(gdth_pci_str *pcistr,
        /* 64-bit DMA only supported from FW >= x.43 */
        if (!(ha->cache_feat & ha->raw_feat & ha->screen_feat & GDT_64BIT) ||
            !ha->dma64_support) {
-               if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+               if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                        printk(KERN_WARNING "GDT-PCI %d: "
                                "Unable to set 32-bit DMA\n", ha->hanum);
                                goto out_free_coal_stat;
                }
        } else {
                shp->max_cmd_len = 16;
-               if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+               if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
                        printk("GDT-PCI %d: 64-bit DMA enabled\n", ha->hanum);
-               } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+               } else if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                        printk(KERN_WARNING "GDT-PCI %d: "
                                "Unable to set 64/32-bit DMA\n", ha->hanum);
                        goto out_free_coal_stat;
index af1f0af0c5acb96e7d6f87aad3a7ba4989db161e..c596ab5f05c358b3a95ded2d34e248e941412d49 100644 (file)
@@ -958,8 +958,8 @@ static int __devinit hptiop_probe(struct pci_dev *pcidev,
        pci_set_master(pcidev);
 
        /* Enable 64bit DMA if possible */
-       if (pci_set_dma_mask(pcidev, DMA_64BIT_MASK)) {
-               if (pci_set_dma_mask(pcidev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) {
+               if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) {
                        printk(KERN_ERR "hptiop: fail to set dma_mask\n");
                        goto disable_pci_device;
                }
index 93d1fbe4ee5d2a3ef40eea6458e6f2cc8e3a0c44..ea4abee7a2a95e8d783da6b7f82da2bc7f39aab8 100644 (file)
@@ -75,7 +75,7 @@ MODULE_PARM_DESC(max_lun, "Maximum allowed LUN. "
 module_param_named(max_targets, max_targets, uint, S_IRUGO);
 MODULE_PARM_DESC(max_targets, "Maximum allowed targets. "
                 "[Default=" __stringify(IBMVFC_MAX_TARGETS) "]");
-module_param_named(disc_threads, disc_threads, uint, S_IRUGO | S_IWUSR);
+module_param_named(disc_threads, disc_threads, uint, S_IRUGO);
 MODULE_PARM_DESC(disc_threads, "Number of device discovery threads to use. "
                 "[Default=" __stringify(IBMVFC_MAX_DISC_THREADS) "]");
 module_param_named(debug, ibmvfc_debug, uint, S_IRUGO | S_IWUSR);
@@ -640,6 +640,7 @@ static void ibmvfc_release_crq_queue(struct ibmvfc_host *vhost)
 
        ibmvfc_dbg(vhost, "Releasing CRQ\n");
        free_irq(vdev->irq, vhost);
+       tasklet_kill(&vhost->tasklet);
        do {
                rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
        } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
@@ -2699,6 +2700,25 @@ static struct ibmvfc_crq *ibmvfc_next_crq(struct ibmvfc_host *vhost)
 static irqreturn_t ibmvfc_interrupt(int irq, void *dev_instance)
 {
        struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance;
+       unsigned long flags;
+
+       spin_lock_irqsave(vhost->host->host_lock, flags);
+       vio_disable_interrupts(to_vio_dev(vhost->dev));
+       tasklet_schedule(&vhost->tasklet);
+       spin_unlock_irqrestore(vhost->host->host_lock, flags);
+       return IRQ_HANDLED;
+}
+
+/**
+ * ibmvfc_tasklet - Interrupt handler tasklet
+ * @data:              ibmvfc host struct
+ *
+ * Returns:
+ *     Nothing
+ **/
+static void ibmvfc_tasklet(void *data)
+{
+       struct ibmvfc_host *vhost = data;
        struct vio_dev *vdev = to_vio_dev(vhost->dev);
        struct ibmvfc_crq *crq;
        struct ibmvfc_async_crq *async;
@@ -2706,7 +2726,6 @@ static irqreturn_t ibmvfc_interrupt(int irq, void *dev_instance)
        int done = 0;
 
        spin_lock_irqsave(vhost->host->host_lock, flags);
-       vio_disable_interrupts(to_vio_dev(vhost->dev));
        while (!done) {
                /* Pull all the valid messages off the CRQ */
                while ((crq = ibmvfc_next_crq(vhost)) != NULL) {
@@ -2734,7 +2753,6 @@ static irqreturn_t ibmvfc_interrupt(int irq, void *dev_instance)
        }
 
        spin_unlock_irqrestore(vhost->host->host_lock, flags);
-       return IRQ_HANDLED;
 }
 
 /**
@@ -3105,6 +3123,7 @@ static void ibmvfc_tgt_adisc_done(struct ibmvfc_event *evt)
 
        vhost->discovery_threads--;
        ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
+       del_timer(&tgt->timer);
 
        switch (status) {
        case IBMVFC_MAD_SUCCESS:
@@ -3160,10 +3179,90 @@ static void ibmvfc_init_passthru(struct ibmvfc_event *evt)
        mad->iu.rsp.len = sizeof(mad->fc_iu.response);
 }
 
+/**
+ * ibmvfc_tgt_adisc_cancel_done - Completion handler when cancelling an ADISC
+ * @evt:               ibmvfc event struct
+ *
+ * Just cleanup this event struct. Everything else is handled by
+ * the ADISC completion handler. If the ADISC never actually comes
+ * back, we still have the timer running on the ADISC event struct
+ * which will fire and cause the CRQ to get reset.
+ *
+ **/
+static void ibmvfc_tgt_adisc_cancel_done(struct ibmvfc_event *evt)
+{
+       struct ibmvfc_host *vhost = evt->vhost;
+       struct ibmvfc_target *tgt = evt->tgt;
+
+       tgt_dbg(tgt, "ADISC cancel complete\n");
+       vhost->abort_threads--;
+       ibmvfc_free_event(evt);
+       kref_put(&tgt->kref, ibmvfc_release_tgt);
+       wake_up(&vhost->work_wait_q);
+}
+
+/**
+ * ibmvfc_adisc_timeout - Handle an ADISC timeout
+ * @tgt:               ibmvfc target struct
+ *
+ * If an ADISC times out, send a cancel. If the cancel times
+ * out, reset the CRQ. When the ADISC comes back as cancelled,
+ * log back into the target.
+ **/
+static void ibmvfc_adisc_timeout(struct ibmvfc_target *tgt)
+{
+       struct ibmvfc_host *vhost = tgt->vhost;
+       struct ibmvfc_event *evt;
+       struct ibmvfc_tmf *tmf;
+       unsigned long flags;
+       int rc;
+
+       tgt_dbg(tgt, "ADISC timeout\n");
+       spin_lock_irqsave(vhost->host->host_lock, flags);
+       if (vhost->abort_threads >= disc_threads ||
+           tgt->action != IBMVFC_TGT_ACTION_INIT_WAIT ||
+           vhost->state != IBMVFC_INITIALIZING ||
+           vhost->action != IBMVFC_HOST_ACTION_QUERY_TGTS) {
+               spin_unlock_irqrestore(vhost->host->host_lock, flags);
+               return;
+       }
+
+       vhost->abort_threads++;
+       kref_get(&tgt->kref);
+       evt = ibmvfc_get_event(vhost);
+       ibmvfc_init_event(evt, ibmvfc_tgt_adisc_cancel_done, IBMVFC_MAD_FORMAT);
+
+       evt->tgt = tgt;
+       tmf = &evt->iu.tmf;
+       memset(tmf, 0, sizeof(*tmf));
+       tmf->common.version = 1;
+       tmf->common.opcode = IBMVFC_TMF_MAD;
+       tmf->common.length = sizeof(*tmf);
+       tmf->scsi_id = tgt->scsi_id;
+       tmf->cancel_key = tgt->cancel_key;
+
+       rc = ibmvfc_send_event(evt, vhost, default_timeout);
+
+       if (rc) {
+               tgt_err(tgt, "Failed to send cancel event for ADISC. rc=%d\n", rc);
+               vhost->abort_threads--;
+               kref_put(&tgt->kref, ibmvfc_release_tgt);
+               __ibmvfc_reset_host(vhost);
+       } else
+               tgt_dbg(tgt, "Attempting to cancel ADISC\n");
+       spin_unlock_irqrestore(vhost->host->host_lock, flags);
+}
+
 /**
  * ibmvfc_tgt_adisc - Initiate an ADISC for specified target
  * @tgt:               ibmvfc target struct
  *
+ * When sending an ADISC we end up with two timers running. The
+ * first timer is the timer in the ibmvfc target struct. If this
+ * fires, we send a cancel to the target. The second timer is the
+ * timer on the ibmvfc event for the ADISC, which is longer. If that
+ * fires, it means the ADISC timed out and our attempt to cancel it
+ * also failed, so we need to reset the CRQ.
  **/
 static void ibmvfc_tgt_adisc(struct ibmvfc_target *tgt)
 {
@@ -3184,6 +3283,7 @@ static void ibmvfc_tgt_adisc(struct ibmvfc_target *tgt)
        mad = &evt->iu.passthru;
        mad->iu.flags = IBMVFC_FC_ELS;
        mad->iu.scsi_id = tgt->scsi_id;
+       mad->iu.cancel_key = tgt->cancel_key;
 
        mad->fc_iu.payload[0] = IBMVFC_ADISC;
        memcpy(&mad->fc_iu.payload[2], &vhost->login_buf->resp.port_name,
@@ -3192,9 +3292,19 @@ static void ibmvfc_tgt_adisc(struct ibmvfc_target *tgt)
               sizeof(vhost->login_buf->resp.node_name));
        mad->fc_iu.payload[6] = vhost->login_buf->resp.scsi_id & 0x00ffffff;
 
+       if (timer_pending(&tgt->timer))
+               mod_timer(&tgt->timer, jiffies + (IBMVFC_ADISC_TIMEOUT * HZ));
+       else {
+               tgt->timer.data = (unsigned long) tgt;
+               tgt->timer.expires = jiffies + (IBMVFC_ADISC_TIMEOUT * HZ);
+               tgt->timer.function = (void (*)(unsigned long))ibmvfc_adisc_timeout;
+               add_timer(&tgt->timer);
+       }
+
        ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
-       if (ibmvfc_send_event(evt, vhost, default_timeout)) {
+       if (ibmvfc_send_event(evt, vhost, IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT)) {
                vhost->discovery_threads--;
+               del_timer(&tgt->timer);
                ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
                kref_put(&tgt->kref, ibmvfc_release_tgt);
        } else
@@ -3322,6 +3432,8 @@ static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, u64 scsi_id)
        tgt->new_scsi_id = scsi_id;
        tgt->vhost = vhost;
        tgt->need_login = 1;
+       tgt->cancel_key = vhost->task_set++;
+       init_timer(&tgt->timer);
        kref_init(&tgt->kref);
        ibmvfc_init_tgt(tgt, ibmvfc_tgt_implicit_logout);
        spin_lock_irqsave(vhost->host->host_lock, flags);
@@ -3716,6 +3828,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
                                spin_unlock_irqrestore(vhost->host->host_lock, flags);
                                if (rport)
                                        fc_remote_port_delete(rport);
+                               del_timer_sync(&tgt->timer);
                                kref_put(&tgt->kref, ibmvfc_release_tgt);
                                return;
                        }
@@ -3859,6 +3972,8 @@ static int ibmvfc_init_crq(struct ibmvfc_host *vhost)
 
        retrc = 0;
 
+       tasklet_init(&vhost->tasklet, (void *)ibmvfc_tasklet, (unsigned long)vhost);
+
        if ((rc = request_irq(vdev->irq, ibmvfc_interrupt, 0, IBMVFC_NAME, vhost))) {
                dev_err(dev, "Couldn't register irq 0x%x. rc=%d\n", vdev->irq, rc);
                goto req_irq_failed;
@@ -3874,6 +3989,7 @@ static int ibmvfc_init_crq(struct ibmvfc_host *vhost)
        return retrc;
 
 req_irq_failed:
+       tasklet_kill(&vhost->tasklet);
        do {
                rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
        } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
@@ -4040,6 +4156,7 @@ static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        vhost->dev = dev;
        vhost->partition_number = -1;
        vhost->log_level = log_level;
+       vhost->task_set = 1;
        strcpy(vhost->partition_name, "UNKNOWN");
        init_waitqueue_head(&vhost->work_wait_q);
        init_waitqueue_head(&vhost->init_wait_q);
@@ -4174,6 +4291,7 @@ static struct fc_function_template ibmvfc_transport_functions = {
        .show_host_supported_classes = 1,
        .show_host_port_type = 1,
        .show_host_port_id = 1,
+       .show_host_maxframe_size = 1,
 
        .get_host_port_state = ibmvfc_get_host_port_state,
        .show_host_port_state = 1,
index b21e071b986214875074ea35748e775a4ec51469..ca1dcf7a7568b95ab1f4d3608a5fd710a449798c 100644 (file)
 #include "viosrp.h"
 
 #define IBMVFC_NAME    "ibmvfc"
-#define IBMVFC_DRIVER_VERSION          "1.0.4"
-#define IBMVFC_DRIVER_DATE             "(November 14, 2008)"
+#define IBMVFC_DRIVER_VERSION          "1.0.5"
+#define IBMVFC_DRIVER_DATE             "(March 19, 2009)"
 
 #define IBMVFC_DEFAULT_TIMEOUT 60
+#define IBMVFC_ADISC_CANCEL_TIMEOUT    45
+#define IBMVFC_ADISC_TIMEOUT           15
+#define IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT       \
+               (IBMVFC_ADISC_TIMEOUT + IBMVFC_ADISC_CANCEL_TIMEOUT)
 #define IBMVFC_INIT_TIMEOUT            120
 #define IBMVFC_MAX_REQUESTS_DEFAULT    100
 
@@ -53,9 +57,9 @@
  * Ensure we have resources for ERP and initialization:
  * 1 for ERP
  * 1 for initialization
- * 1 for each discovery thread
+ * 2 for each discovery thread
  */
-#define IBMVFC_NUM_INTERNAL_REQ        (1 + 1 + disc_threads)
+#define IBMVFC_NUM_INTERNAL_REQ        (1 + 1 + (disc_threads * 2))
 
 #define IBMVFC_MAD_SUCCESS             0x00
 #define IBMVFC_MAD_NOT_SUPPORTED       0xF1
@@ -585,10 +589,12 @@ struct ibmvfc_target {
        enum ibmvfc_target_action action;
        int need_login;
        int init_retries;
+       u32 cancel_key;
        struct ibmvfc_service_parms service_parms;
        struct ibmvfc_service_parms service_parms_change;
        struct fc_rport_identifiers ids;
        void (*job_step) (struct ibmvfc_target *);
+       struct timer_list timer;
        struct kref kref;
 };
 
@@ -672,6 +678,7 @@ struct ibmvfc_host {
        int task_set;
        int init_retries;
        int discovery_threads;
+       int abort_threads;
        int client_migrated;
        int reinit;
        int delay_init;
@@ -684,6 +691,7 @@ struct ibmvfc_host {
        char partition_name[97];
        void (*job_step) (struct ibmvfc_host *);
        struct task_struct *work_thread;
+       struct tasklet_struct tasklet;
        wait_queue_head_t init_wait_q;
        wait_queue_head_t work_wait_q;
 };
index 5529518ff2fa8871c610857c39528adc28c37c98..89a59484be02f58be4cbbfbf864d9f9ecf8ee48f 100644 (file)
@@ -2856,7 +2856,7 @@ static int initio_probe_one(struct pci_dev *pdev,
                reg = 0;
        bios_seg = (bios_seg << 8) + ((u16) ((reg & 0xFF00) >> 8));
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING  "i91u: Could not set 32 bit DMA mask\n");
                error = -ENODEV;
                goto out_disable_device;
index def473f0a98f78c239988741fcf7e70e05f52416..c09d77591f92b8576432544243781ed4df11d39a 100644 (file)
@@ -7498,7 +7498,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
 
        pci_set_master(pdev);
 
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (rc < 0) {
                dev_err(&pdev->dev, "Failed to set PCI DMA mask\n");
                goto cleanup_nomem;
index 457d76a4cfe5e18c8c448c42e41101ad90d9acce..f83a116955f2f1c6409acfae27d2e91719d42276 100644 (file)
@@ -7048,10 +7048,10 @@ ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
         * are guaranteed to be < 4G.
         */
        if (IPS_ENABLE_DMA64 && IPS_HAS_ENH_SGLIST(ha) &&
-           !pci_set_dma_mask(ha->pcidev, DMA_64BIT_MASK)) {
+           !pci_set_dma_mask(ha->pcidev, DMA_BIT_MASK(64))) {
                (ha)->flags |= IPS_HA_ENH_SG;
        } else {
-               if (pci_set_dma_mask(ha->pcidev, DMA_32BIT_MASK) != 0) {
+               if (pci_set_dma_mask(ha->pcidev, DMA_BIT_MASK(32)) != 0) {
                        printk(KERN_WARNING "Unable to set DMA Mask\n");
                        return ips_abort_init(ha, index);
                }
index f23c4ca9a2ee334a89bd0d8a9354f988b64723c3..b3d31315ac32daea6321968eedca52cb921ade3a 100644 (file)
@@ -108,7 +108,7 @@ lasi700_probe(struct parisc_device *dev)
        }
 
        hostdata->dev = &dev->dev;
-       dma_set_mask(&dev->dev, DMA_32BIT_MASK);
+       dma_set_mask(&dev->dev, DMA_BIT_MASK(32));
        hostdata->base = ioremap_nocache(base, 0x100);
        hostdata->differential = 0;
 
index a5725f3b7ce1dc06ee9d3cb8763b5b07d4de2b32..f555ae99ad40d7201de0204a6610bdb900ebe96c 100644 (file)
@@ -41,7 +41,7 @@
 
 MODULE_AUTHOR("Open-FCoE.org");
 MODULE_DESCRIPTION("libfc");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");
 
 static int fc_fcp_debug;
 
@@ -407,10 +407,12 @@ static void fc_fcp_recv_data(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
 
                if (~crc != le32_to_cpu(fr_crc(fp))) {
 crc_err:
-                       stats = lp->dev_stats[smp_processor_id()];
+                       stats = fc_lport_get_stats(lp);
                        stats->ErrorFrames++;
+                       /* FIXME - per cpu count, not total count! */
                        if (stats->InvalidCRCCount++ < 5)
-                               FC_DBG("CRC error on data frame\n");
+                               printk(KERN_WARNING "CRC error on data frame for port (%6x)\n",
+                                      fc_host_port_id(lp->host));
                        /*
                         * Assume the frame is total garbage.
                         * We may have copied it over the good part
@@ -1752,7 +1754,7 @@ int fc_queuecommand(struct scsi_cmnd *sc_cmd, void (*done)(struct scsi_cmnd *))
        /*
         * setup the data direction
         */
-       stats = lp->dev_stats[smp_processor_id()];
+       stats = fc_lport_get_stats(lp);
        if (sc_cmd->sc_data_direction == DMA_FROM_DEVICE) {
                fsp->req_flags = FC_SRB_READ;
                stats->InputRequests++;
index 7ef44501ecc6eba0e2e484eaead002681c235cf9..b8178ef398d790ef19860d378dd45a259233f76f 100644 (file)
@@ -267,10 +267,10 @@ EXPORT_SYMBOL(fc_get_host_speed);
 
 struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
 {
-       int i;
        struct fc_host_statistics *fcoe_stats;
        struct fc_lport *lp = shost_priv(shost);
        struct timespec v0, v1;
+       unsigned int cpu;
 
        fcoe_stats = &lp->host_stats;
        memset(fcoe_stats, 0, sizeof(struct fc_host_statistics));
@@ -279,10 +279,11 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
        jiffies_to_timespec(lp->boot_time, &v1);
        fcoe_stats->seconds_since_last_reset = (v0.tv_sec - v1.tv_sec);
 
-       for_each_online_cpu(i) {
-               struct fcoe_dev_stats *stats = lp->dev_stats[i];
-               if (stats == NULL)
-                       continue;
+       for_each_possible_cpu(cpu) {
+               struct fcoe_dev_stats *stats;
+
+               stats = per_cpu_ptr(lp->dev_stats, cpu);
+
                fcoe_stats->tx_frames += stats->TxFrames;
                fcoe_stats->tx_words += stats->TxWords;
                fcoe_stats->rx_frames += stats->RxFrames;
index dfaa8adf099ea2d5ef0ed577ce39411cb1393691..689628359169667d96af80b2d29a71fc079b8a04 100644 (file)
@@ -1999,8 +1999,10 @@ iscsi_pool_init(struct iscsi_pool *q, int max, void ***items, int item_size)
 
        q->queue = kfifo_init((void*)q->pool, max * sizeof(void*),
                              GFP_KERNEL, NULL);
-       if (q->queue == ERR_PTR(-ENOMEM))
+       if (IS_ERR(q->queue)) {
+               q->queue = NULL;
                goto enomem;
+       }
 
        for (i = 0; i < max; i++) {
                q->pool[i] = kzalloc(item_size, GFP_KERNEL);
index 6c867311cef1d295a8f7e39b2b1b7c43107f4202..06874e6009ea8931ddad8feef4333637ea49f858 100644 (file)
@@ -2660,8 +2660,8 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
        pci_save_state(pdev);
        pci_try_set_mwi(pdev);
 
-       if (pci_set_dma_mask(phba->pcidev, DMA_64BIT_MASK) != 0)
-               if (pci_set_dma_mask(phba->pcidev, DMA_32BIT_MASK) != 0)
+       if (pci_set_dma_mask(phba->pcidev, DMA_BIT_MASK(64)) != 0)
+               if (pci_set_dma_mask(phba->pcidev, DMA_BIT_MASK(32)) != 0)
                        goto out_idr_remove;
 
        /*
index 9fdcd60c5493a53aee595a10eb3b47819c40c157..49eb0612d5af03f10e8b2ad591ed0bbf25943557 100644 (file)
@@ -2021,7 +2021,7 @@ make_local_pdev(adapter_t *adapter, struct pci_dev **pdev)
 
        memcpy(*pdev, adapter->dev, sizeof(struct pci_dev));
 
-       if( pci_set_dma_mask(*pdev, DMA_32BIT_MASK) != 0 ) {
+       if( pci_set_dma_mask(*pdev, DMA_BIT_MASK(32)) != 0 ) {
                kfree(*pdev);
                return -1;
        }
@@ -4793,10 +4793,10 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        /* Set the Mode of addressing to 64 bit if we can */
        if ((adapter->flag & BOARD_64BIT) && (sizeof(dma_addr_t) == 8)) {
-               pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+               pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
                adapter->has_64bit_addr = 1;
        } else  {
-               pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                adapter->has_64bit_addr = 0;
        }
                
index 805bb61dde1871946b5c4cce24c0314e7efa79e5..234f0b7eb21c1783b2503c7c49724139cae45618 100644 (file)
@@ -473,7 +473,7 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        // Setup the default DMA mask. This would be changed later on
        // depending on hardware capabilities
-       if (pci_set_dma_mask(adapter->pdev, DMA_32BIT_MASK) != 0) {
+       if (pci_set_dma_mask(adapter->pdev, DMA_BIT_MASK(32)) != 0) {
 
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: pci_set_dma_mask failed:%d\n", __LINE__));
@@ -900,11 +900,11 @@ megaraid_init_mbox(adapter_t *adapter)
                adapter->pdev->device == PCI_DEVICE_ID_PERC4_DI_EVERGLADES) ||
                (adapter->pdev->vendor == PCI_VENDOR_ID_DELL &&
                adapter->pdev->device == PCI_DEVICE_ID_PERC4E_DI_KOBUK)) {
-               if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK)) {
+               if (pci_set_dma_mask(adapter->pdev, DMA_BIT_MASK(64))) {
                        con_log(CL_ANN, (KERN_WARNING
                                "megaraid: DMA mask for 64-bit failed\n"));
 
-                       if (pci_set_dma_mask (adapter->pdev, DMA_32BIT_MASK)) {
+                       if (pci_set_dma_mask (adapter->pdev, DMA_BIT_MASK(32))) {
                                con_log(CL_ANN, (KERN_WARNING
                                        "megaraid: 32-bit DMA mask failed\n"));
                                goto out_free_sysfs_res;
index 17ce7abe17ee02f7ea47055d296f95917b6e1b92..7dc3d1894b1a281580a83aff2f4660b46daebfa1 100644 (file)
@@ -2497,13 +2497,13 @@ megasas_set_dma_mask(struct pci_dev *pdev)
         * All our contollers are capable of performing 64-bit DMA
         */
        if (IS_DMA64) {
-               if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) != 0) {
+               if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
 
-                       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0)
+                       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0)
                                goto fail_set_dma_mask;
                }
        } else {
-               if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0)
+               if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0)
                        goto fail_set_dma_mask;
        }
        return 0;
index 23e5a876bb10c01ee16f591a5f2bee93b4f2f90c..e4acebd10d1b772efa0f323eaff61e842df31e64 100644 (file)
@@ -875,10 +875,10 @@ static int pci_go_64(struct pci_dev *pdev)
 {
        int rc;
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                        if (rc) {
                                dev_printk(KERN_ERR, &pdev->dev,
                                           "64-bit DMA enable failed\n");
@@ -886,13 +886,13 @@ static int pci_go_64(struct pci_dev *pdev)
                        }
                }
        } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit DMA enable failed\n");
                        return rc;
                }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit consistent DMA enable failed\n");
index d06ec5aa69249f1f86dc24ef715907f66ba59fd5..2be7d5b018d2d216827e0cd3c7cd27953a10d2e0 100644 (file)
@@ -2672,7 +2672,7 @@ static int nsp32_detect(struct pci_dev *pdev)
        /*
         * setup DMA 
         */
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
                nsp32_msg (KERN_ERR, "failed to set PCI DMA mask");
                goto scsi_unregister;
        }
index 552f58b655d155bcde07a8911f4e81123a47ce4d..2a5f0777148d1d9437991edab12236d1a8683234 100644 (file)
@@ -338,20 +338,6 @@ struct osd_request *osd_start_request(struct osd_dev *dev, gfp_t gfp)
 }
 EXPORT_SYMBOL(osd_start_request);
 
-/*
- * If osd_finalize_request() was called but the request was not executed through
- * the block layer, then we must release BIOs.
- */
-static void _abort_unexecuted_bios(struct request *rq)
-{
-       struct bio *bio;
-
-       while ((bio = rq->bio) != NULL) {
-               rq->bio = bio->bi_next;
-               bio_endio(bio, 0);
-       }
-}
-
 static void _osd_free_seg(struct osd_request *or __unused,
        struct _osd_req_data_segment *seg)
 {
@@ -363,9 +349,30 @@ static void _osd_free_seg(struct osd_request *or __unused,
        seg->alloc_size = 0;
 }
 
+static void _put_request(struct request *rq , bool is_async)
+{
+       if (is_async) {
+               WARN_ON(rq->bio);
+               __blk_put_request(rq->q, rq);
+       } else {
+               /*
+                * If osd_finalize_request() was called but the request was not
+                * executed through the block layer, then we must release BIOs.
+                * TODO: Keep error code in or->async_error. Need to audit all
+                *       code paths.
+                */
+               if (unlikely(rq->bio))
+                       blk_end_request(rq, -ENOMEM, blk_rq_bytes(rq));
+               else
+                       blk_put_request(rq);
+       }
+}
+
 void osd_end_request(struct osd_request *or)
 {
        struct request *rq = or->request;
+       /* IMPORTANT: make sure this agrees with osd_execute_request_async */
+       bool is_async = (or->request->end_io_data == or);
 
        _osd_free_seg(or, &or->set_attr);
        _osd_free_seg(or, &or->enc_get_attr);
@@ -373,12 +380,11 @@ void osd_end_request(struct osd_request *or)
 
        if (rq) {
                if (rq->next_rq) {
-                       _abort_unexecuted_bios(rq->next_rq);
-                       blk_put_request(rq->next_rq);
+                       _put_request(rq->next_rq, is_async);
+                       rq->next_rq = NULL;
                }
 
-               _abort_unexecuted_bios(rq);
-               blk_put_request(rq);
+               _put_request(rq, is_async);
        }
        _osd_request_free(or);
 }
index f8b1a749958b1f7cbfea0c095af5fdbee599da1e..f644c9571eab01d3f43be700914cac38b0c3c3d8 100644 (file)
@@ -345,10 +345,6 @@ static int osd_probe(struct device *dev)
        }
 
        dev_set_drvdata(oud->class_member, oud);
-       error = sysfs_create_link(&scsi_device->sdev_gendev.kobj,
-                                 &oud->class_member->kobj, osd_symlink);
-       if (error)
-               OSD_ERR("warning: unable to make symlink\n");
 
        OSD_INFO("osd_probe %s\n", disk->disk_name);
        return 0;
@@ -377,8 +373,6 @@ static int osd_remove(struct device *dev)
                        scsi_device);
        }
 
-       sysfs_remove_link(&oud->od.scsi_device->sdev_gendev.kobj, osd_symlink);
-
        if (oud->class_member)
                device_destroy(osd_sysfs_class,
                               MKDEV(SCSI_OSD_MAJOR, oud->minor));
diff --git a/drivers/scsi/ql1040_fw.h b/drivers/scsi/ql1040_fw.h
deleted file mode 100644 (file)
index aaf9284..0000000
+++ /dev/null
@@ -1,2130 +0,0 @@
-/**************************************************************************
- *                  QLOGIC LINUX SOFTWARE
- *
- * Copyright (C) 2004 QLogic Corporation
- * (www.qlogic.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; either version 2, 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.
- *
- *************************************************************************/
-
-/************************************************************************
- *                                                                     *
- *             --- ISP1040 Initiator/Target Firmware ---               *
- *                         32 LUN Support                              *
- *                                                                     *
- ************************************************************************
- */
-
-/*
- *     Firmware Version 7.65.06 (14:38 Jan 07, 2002)
- */
-
-static unsigned char firmware_version[] = {7,65,6};
-
-#define FW_VERSION_STRING "7.65.06"
-
-static unsigned short risc_code_addr01 = 0x1000 ;
-
-static unsigned short risc_code01[] = { 
-       0x0078, 0x103a, 0x0000, 0x4158, 0x0000, 0x2043, 0x4f50, 0x5952,
-       0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
-       0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
-       0x3130, 0x3230, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
-       0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x372e, 0x3635,
-       0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
-       0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
-       0x3031, 0x2024, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048,
-       0x1045, 0x0038, 0x104b, 0x0078, 0x1047, 0x0028, 0x104b, 0x20b9,
-       0x1212, 0x0078, 0x104d, 0x20b9, 0x2222, 0x20c1, 0x0008, 0x2071,
-       0x0010, 0x70c3, 0x0004, 0x20c9, 0x78ff, 0x2089, 0x1186, 0x70c7,
-       0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0007, 0x3f00,
-       0x70d6, 0x20c1, 0x0008, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100,
-       0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc,
-       0x3fff, 0x2b54, 0x205b, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040,
-       0x10bf, 0xa386, 0x000f, 0x0040, 0x1085, 0x2c6a, 0x2a5a, 0x20c1,
-       0x0000, 0x2019, 0x000f, 0x0078, 0x1065, 0x2c6a, 0x2a5a, 0x20c1,
-       0x0008, 0x2009, 0x7fff, 0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc,
-       0x3fff, 0x2734, 0x203b, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040,
-       0x10a9, 0x284a, 0x263a, 0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134,
-       0x200b, 0x5050, 0x2114, 0xa286, 0x5050, 0x0040, 0x10aa, 0x0078,
-       0x118e, 0x284a, 0x263a, 0x98c0, 0xa188, 0x1000, 0x212c, 0x200b,
-       0xa5a5, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10bc, 0x250a, 0xa18a,
-       0x1000, 0x98c1, 0x0078, 0x10c1, 0x250a, 0x0078, 0x10c1, 0x2c6a,
-       0x2a5a, 0x2130, 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x5200, 0x8424,
-       0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0xa192, 0x7900, 0x2009,
-       0x0000, 0x2001, 0x0031, 0x1078, 0x1d26, 0x2218, 0x2079, 0x5200,
-       0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109,
-       0x00c0, 0x10dc, 0x7ef2, 0x8528, 0x7de6, 0x7cea, 0x7bee, 0x7883,
-       0x0000, 0x2031, 0x0030, 0x78cf, 0x0101, 0x780b, 0x0002, 0x780f,
-       0x0002, 0x784f, 0x0003, 0x2069, 0x5240, 0x2001, 0x04fd, 0x2004,
-       0xa082, 0x0005, 0x0048, 0x1104, 0x0038, 0x1100, 0x0078, 0x1108,
-       0x681b, 0x003c, 0x0078, 0x110a, 0x00a8, 0x1108, 0x681b, 0x003c,
-       0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f, 0x0008,
-       0x6813, 0x0005, 0x6823, 0x0000, 0x6827, 0x0006, 0x6817, 0x0008,
-       0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x5480, 0x2011, 0x0020,
-       0x2009, 0x0010, 0x680b, 0x080c, 0x680f, 0x0019, 0x6803, 0xfd00,
-       0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
-       0x8109, 0x00c0, 0x1122, 0x2069, 0x5500, 0x2009, 0x0002, 0x20a9,
-       0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bf0, 0xa386, 0xfeff,
-       0x00c0, 0x1148, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078, 0x114c,
-       0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x0070, 0x1152,
-       0x0078, 0x1139, 0x8109, 0x00c0, 0x1137, 0x1078, 0x22a7, 0x1078,
-       0x493d, 0x1078, 0x19b5, 0x1078, 0x4e33, 0x3200, 0xa085, 0x000d,
-       0x2090, 0x70c3, 0x0000, 0x0090, 0x116c, 0x70c0, 0xa086, 0x0002,
-       0x00c0, 0x116c, 0x1078, 0x1284, 0x1078, 0x1196, 0x78cc, 0xa005,
-       0x00c0, 0x117a, 0x1078, 0x1d4f, 0x0010, 0x1180, 0x0068, 0x1180,
-       0x1078, 0x2186, 0x0010, 0x1180, 0x0068, 0x1180, 0x1078, 0x1ab9,
-       0x00e0, 0x116c, 0x1078, 0x4cba, 0x0078, 0x116c, 0x118e, 0x1190,
-       0x24ac, 0x24ac, 0x49be, 0x49be, 0x24ac, 0x24ac, 0x0078, 0x118e,
-       0x0078, 0x1190, 0x0078, 0x1192, 0x0078, 0x1194, 0x0068, 0x1201,
-       0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1201, 0x7814,
-       0xa005, 0x00c0, 0x11a7, 0x0010, 0x1202, 0x0078, 0x1201, 0x2009,
-       0x525b, 0x2104, 0xa005, 0x00c0, 0x1201, 0x2009, 0x5264, 0x200b,
-       0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11cc, 0x7816, 0x2009,
-       0x5262, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
-       0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce,
-       0x1078, 0x199a, 0x0078, 0x11ff, 0x7814, 0xa086, 0x0018, 0x00c0,
-       0x11d3, 0x1078, 0x1678, 0x7817, 0x0000, 0x2009, 0x5262, 0x2104,
-       0xa065, 0x0040, 0x11ef, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1a17,
-       0x0c7f, 0x609f, 0x0000, 0x1078, 0x174e, 0x2009, 0x000c, 0x6007,
-       0x0103, 0x1078, 0x1976, 0x00c0, 0x11fb, 0x1078, 0x199a, 0x2009,
-       0x5262, 0x200b, 0x0000, 0x2009, 0x525c, 0x2104, 0x200b, 0x0000,
-       0xa005, 0x0040, 0x11ff, 0x2001, 0x4005, 0x0078, 0x1286, 0x0078,
-       0x1284, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
-       0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1252, 0x2038,
-       0x0079, 0x1212, 0x1284, 0x12e5, 0x12a9, 0x12fe, 0x130d, 0x1313,
-       0x12a0, 0x1766, 0x1317, 0x1298, 0x12ad, 0x12af, 0x12b1, 0x12b3,
-       0x176b, 0x1298, 0x1329, 0x1365, 0x1690, 0x1760, 0x12b5, 0x15af,
-       0x15cb, 0x15e7, 0x1612, 0x1568, 0x1576, 0x158a, 0x159e, 0x13e9,
-       0x1298, 0x1397, 0x139d, 0x13a2, 0x13a7, 0x13ad, 0x13b2, 0x13b7,
-       0x13bc, 0x13c1, 0x13c5, 0x13da, 0x13e6, 0x1298, 0x1298, 0x1298,
-       0x1298, 0x13f5, 0x13fe, 0x140d, 0x1451, 0x145b, 0x1462, 0x14a8,
-       0x14b7, 0x14c6, 0x14d8, 0x1548, 0x1558, 0x1298, 0x1298, 0x1298,
-       0x1298, 0x155d, 0xa0bc, 0xffa0, 0x00c0, 0x1298, 0x2038, 0xa084,
-       0x001f, 0x0079, 0x125b, 0x17a4, 0x17a7, 0x17b7, 0x1298, 0x1298,
-       0x1931, 0x194e, 0x1298, 0x1298, 0x1298, 0x1952, 0x195a, 0x1298,
-       0x1298, 0x1298, 0x1298, 0x12db, 0x12f4, 0x131f, 0x135b, 0x1686,
-       0x1782, 0x1796, 0x1298, 0x1847, 0x1960, 0x190d, 0x1917, 0x191b,
-       0x1929, 0x1298, 0x1298, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
-       0x1286, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
-       0x1287, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x00e0,
-       0x128f, 0x00e0, 0x1291, 0x0068, 0x1291, 0x2091, 0x4080, 0x007c,
-       0x70c3, 0x4001, 0x0078, 0x1287, 0x70c3, 0x4006, 0x0078, 0x1287,
-       0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078,
-       0x1284, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x1284, 0x0078,
-       0x1284, 0x0078, 0x1284, 0x0078, 0x1284, 0x2091, 0x8000, 0x70c3,
-       0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
-       0x0007, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031,
-       0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061,
-       0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091,
-       0x4080, 0x0078, 0x0455, 0x1078, 0x1bc4, 0x00c0, 0x129c, 0x75d8,
-       0x74dc, 0x75da, 0x74de, 0x0078, 0x12e8, 0x2029, 0x0000, 0x2520,
-       0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1afe, 0x0040, 0x1284,
-       0x70c3, 0x4002, 0x0078, 0x1284, 0x1078, 0x1bc4, 0x00c0, 0x129c,
-       0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1301, 0x2029, 0x0000,
-       0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1b5e, 0x0040,
-       0x1284, 0x70c3, 0x4002, 0x0078, 0x1284, 0x71c4, 0x70c8, 0x2114,
-       0x200a, 0x0078, 0x1282, 0x71c4, 0x2114, 0x0078, 0x1282, 0x70c7,
-       0x0007, 0x70cb, 0x0041, 0x70cf, 0x0006, 0x0078, 0x1284, 0x1078,
-       0x1bc4, 0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
-       0x132c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
-       0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x1355, 0xa40a,
-       0x0040, 0x133c, 0x00c8, 0x1346, 0x8001, 0x7892, 0xa084, 0xfc00,
-       0x0040, 0x134a, 0x78cc, 0xa085, 0x0001, 0x78ce, 0x2001, 0x4005,
-       0x0078, 0x1286, 0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x7c96, 0x78cc,
-       0xa084, 0xfffc, 0x78ce, 0x0078, 0x1359, 0x78cc, 0xa085, 0x0001,
-       0x78ce, 0x0078, 0x1284, 0x1078, 0x1bc4, 0x00c0, 0x129c, 0x75d8,
-       0x76dc, 0x75da, 0x76de, 0x0078, 0x1368, 0x2029, 0x0000, 0x2530,
-       0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6,
-       0xa005, 0x0040, 0x1391, 0xa40a, 0x0040, 0x1378, 0x00c8, 0x1382,
-       0x8001, 0x78ae, 0xa084, 0xfc00, 0x0040, 0x1386, 0x78cc, 0xa085,
-       0x0100, 0x78ce, 0x2001, 0x4005, 0x0078, 0x1286, 0x7ab6, 0x7bba,
-       0x7dbe, 0x7ec2, 0x7cb2, 0x78cc, 0xa084, 0xfcff, 0x78ce, 0x0078,
-       0x1395, 0x78cc, 0xa085, 0x0100, 0x78ce, 0x0078, 0x1284, 0x2009,
-       0x5261, 0x210c, 0x7aec, 0x0078, 0x1282, 0x2009, 0x5241, 0x210c,
-       0x0078, 0x1283, 0x2009, 0x5242, 0x210c, 0x0078, 0x1283, 0x2061,
-       0x5240, 0x610c, 0x6210, 0x0078, 0x1282, 0x2009, 0x5245, 0x210c,
-       0x0078, 0x1283, 0x2009, 0x5246, 0x210c, 0x0078, 0x1283, 0x2009,
-       0x5248, 0x210c, 0x0078, 0x1283, 0x2009, 0x5249, 0x210c, 0x0078,
-       0x1283, 0x7908, 0x7a0c, 0x0078, 0x1282, 0x71c4, 0x8107, 0xa084,
-       0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x5480, 0x6a00, 0x6804,
-       0xa084, 0x0008, 0x0040, 0x13d7, 0x6b08, 0x0078, 0x13d8, 0x6b0c,
-       0x0078, 0x1281, 0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6b1c,
-       0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x1281, 0x794c, 0x0078,
-       0x1283, 0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6908, 0x6a18,
-       0x6b10, 0x2091, 0x8001, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010,
-       0x00c8, 0x127c, 0x1078, 0x237f, 0x0078, 0x1281, 0x71c4, 0xa182,
-       0x0010, 0x00c8, 0x127c, 0x2011, 0x5241, 0x2204, 0x007e, 0x2112,
-       0x1078, 0x2338, 0x017f, 0x0078, 0x1283, 0x71c4, 0x2019, 0x0100,
-       0x2304, 0xa082, 0x0006, 0x0048, 0x141b, 0x2011, 0x1449, 0x20a9,
-       0x0008, 0x0078, 0x141f, 0x2011, 0x1441, 0x20a9, 0x0008, 0x2204,
-       0xa106, 0x0040, 0x142a, 0x8210, 0x0070, 0x1428, 0x0078, 0x141f,
-       0x0078, 0x127c, 0x2304, 0xa082, 0x0006, 0x0048, 0x1433, 0xa292,
-       0x1449, 0x0078, 0x1435, 0xa292, 0x1441, 0x027e, 0x2011, 0x5242,
-       0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x2344, 0x017f, 0x0078,
-       0x1283, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
-       0x004b, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0004, 0x0001, 0x0002,
-       0x0003, 0x2061, 0x5240, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
-       0x6012, 0x0078, 0x1282, 0x2061, 0x5240, 0x6114, 0x70c4, 0x6016,
-       0x0078, 0x1283, 0x2061, 0x5240, 0x71c4, 0x2011, 0x0004, 0x601f,
-       0x0019, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x1483, 0x2011,
-       0x0005, 0x601f, 0x0019, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
-       0x1483, 0x2011, 0x0006, 0x601f, 0x000c, 0x2019, 0x2222, 0xa186,
-       0x003c, 0x00c0, 0x127c, 0x6018, 0x007e, 0x611a, 0x7800, 0xa084,
-       0x0001, 0x00c0, 0x149e, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
-       0x0048, 0x1496, 0x0038, 0x149a, 0x0078, 0x149e, 0x0028, 0x149a,
-       0x0078, 0x149e, 0x2019, 0x2222, 0x0078, 0x14a0, 0x2019, 0x1212,
-       0x23b8, 0x1078, 0x2355, 0x1078, 0x4e33, 0x017f, 0x0078, 0x1283,
-       0x71c4, 0xa184, 0xffcf, 0x00c0, 0x127c, 0x2011, 0x5248, 0x2204,
-       0x2112, 0x007e, 0x1078, 0x2377, 0x017f, 0x0078, 0x1283, 0x71c4,
-       0xa182, 0x0010, 0x00c8, 0x127c, 0x2011, 0x5249, 0x2204, 0x007e,
-       0x2112, 0x1078, 0x2366, 0x017f, 0x0078, 0x1283, 0x71c4, 0x72c8,
-       0xa184, 0xfffd, 0x00c0, 0x127b, 0xa284, 0xfffd, 0x00c0, 0x127b,
-       0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x1282,
-       0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
-       0x5480, 0x2019, 0x0000, 0x72c8, 0xd2bc, 0x0040, 0x14e9, 0xa39d,
-       0x0010, 0xd2b4, 0x0040, 0x14ee, 0xa39d, 0x0008, 0x6800, 0x007e,
-       0xa226, 0x0040, 0x1511, 0x6a02, 0xa484, 0x2000, 0x0040, 0x14fa,
-       0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x1500, 0xa39d, 0x0008,
-       0xa484, 0x4000, 0x0040, 0x1511, 0x810f, 0xa284, 0x4000, 0x0040,
-       0x150d, 0x1078, 0x2399, 0x0078, 0x1511, 0x1078, 0x238b, 0x0078,
-       0x1511, 0x72cc, 0x6808, 0xa206, 0x0040, 0x1540, 0xa2a4, 0x00ff,
-       0x2061, 0x5240, 0x6118, 0xa186, 0x0028, 0x0040, 0x1527, 0xa186,
-       0x0032, 0x0040, 0x152d, 0xa186, 0x003c, 0x0040, 0x1533, 0xa482,
-       0x0064, 0x0048, 0x153d, 0x0078, 0x1537, 0xa482, 0x0050, 0x0048,
-       0x153d, 0x0078, 0x1537, 0xa482, 0x0043, 0x0048, 0x153d, 0x71c4,
-       0x71c6, 0x027f, 0x72ca, 0x0078, 0x127d, 0x6a0a, 0xa39d, 0x000a,
-       0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x0078, 0x1281,
-       0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091,
-       0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, 0x1281,
-       0x70c4, 0x794c, 0x784e, 0x0078, 0x1283, 0x71c4, 0x72c8, 0x73cc,
-       0xa182, 0x0010, 0x00c8, 0x127c, 0x1078, 0x23a7, 0x0078, 0x1281,
-       0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002,
-       0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x1078,
-       0x19c5, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804,
-       0xa005, 0x0040, 0x1585, 0x1078, 0x226f, 0x2091, 0x8001, 0x2708,
-       0x0078, 0x1282, 0x77c4, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6a08,
-       0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1599, 0x1078,
-       0x226f, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x2041,
-       0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
-       0x19d2, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x1282, 0x77c4,
-       0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078, 0x1a52, 0x00c0,
-       0x15c7, 0x6818, 0xa005, 0x0040, 0x15c7, 0x2708, 0x1078, 0x23b7,
-       0x00c0, 0x15c7, 0x7817, 0x0015, 0x2091, 0x8001, 0x007c, 0x2091,
-       0x8001, 0x0078, 0x1284, 0x77c4, 0x77c6, 0x2041, 0x0021, 0x2049,
-       0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, 0x19d2, 0x2061,
-       0x5240, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f, 0x6073, 0x0000,
-       0x7817, 0x0016, 0x1078, 0x226f, 0x2091, 0x8001, 0x007c, 0x77c8,
-       0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2061,
-       0x5240, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782, 0x6093, 0x000f,
-       0x7817, 0x0017, 0x1078, 0x226f, 0x2091, 0x8001, 0x2041, 0x0021,
-       0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x19d2,
-       0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1606, 0x2091,
-       0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0, 0x1636, 0x2039,
-       0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078,
-       0x19c5, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001,
-       0x8738, 0xa784, 0x001f, 0x00c0, 0x161f, 0xa7bc, 0xff00, 0x873f,
-       0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x161f, 0x2091, 0x8000,
-       0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040, 0x165f, 0x684b,
-       0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x164c,
-       0x0070, 0x164c, 0x0078, 0x1643, 0x684b, 0x0009, 0x20a9, 0x0014,
-       0x6848, 0xa084, 0x0001, 0x0040, 0x1659, 0x0070, 0x1659, 0x0078,
-       0x1650, 0x20a9, 0x00fa, 0x0070, 0x165f, 0x0078, 0x165b, 0x2079,
-       0x5200, 0x7817, 0x0018, 0x2061, 0x5240, 0x606f, 0x0001, 0x6073,
-       0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002, 0x78ce, 0x6808,
-       0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091, 0x8001, 0x007c,
-       0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001, 0x00c0, 0x1682,
-       0x1078, 0x1a9c, 0x71c4, 0x71c6, 0x794a, 0x007c, 0x1078, 0x1bc4,
-       0x00c0, 0x129c, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1693,
-       0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca,
-       0x72ce, 0x2079, 0x5200, 0x2091, 0x8000, 0x1078, 0x1980, 0x2091,
-       0x8001, 0x0040, 0x174a, 0x20a9, 0x0005, 0x20a1, 0x5218, 0x2091,
-       0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020, 0x1078, 0x197b,
-       0x0040, 0x16b6, 0x1078, 0x199a, 0x0078, 0x174a, 0x6004, 0xa084,
-       0xff00, 0x8007, 0x8009, 0x0040, 0x1719, 0x0c7e, 0x2c68, 0x2091,
-       0x8000, 0x1078, 0x1980, 0x2091, 0x8001, 0x0040, 0x16ea, 0x2c00,
-       0x689e, 0x8109, 0x00c0, 0x16be, 0x609f, 0x0000, 0x0c7f, 0x0c7e,
-       0x7218, 0x731c, 0x7420, 0x7524, 0x2c68, 0x689c, 0xa065, 0x0040,
-       0x1718, 0x2009, 0x0020, 0x1078, 0x197b, 0x00c0, 0x1701, 0x6004,
-       0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x16ea, 0x2d00, 0x6002,
-       0x0078, 0x16d0, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1a17,
-       0x0c7f, 0x609f, 0x0000, 0x1078, 0x174e, 0x2009, 0x000c, 0x6008,
-       0xa085, 0x0200, 0x600a, 0x1078, 0x1976, 0x1078, 0x199a, 0x0078,
-       0x174a, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1a17, 0x0c7f,
-       0x609f, 0x0000, 0x1078, 0x174e, 0x2009, 0x000c, 0x6007, 0x0103,
-       0x601b, 0x0003, 0x1078, 0x1976, 0x1078, 0x199a, 0x0078, 0x174a,
-       0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091, 0x8000, 0x7817,
-       0x0012, 0x0e7e, 0x2071, 0x5240, 0x706f, 0x0005, 0x7073, 0x0000,
-       0x7376, 0x727a, 0x747e, 0x7082, 0x7087, 0x0000, 0x2c00, 0x708a,
-       0x708f, 0x0000, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0x0060,
-       0x0040, 0x173c, 0x1078, 0x48d3, 0x0e7f, 0x6596, 0x65a6, 0x669a,
-       0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x1078, 0x226f, 0x2091,
-       0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287, 0x20a9, 0x0005,
-       0x2099, 0x5218, 0x2091, 0x8000, 0x530a, 0x2091, 0x8001, 0x2100,
-       0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c,
-       0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x1284, 0x71c4, 0x71c6,
-       0x2168, 0x0078, 0x176d, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04,
-       0xa210, 0x8d68, 0x8109, 0x00c0, 0x176f, 0xa285, 0x0000, 0x00c0,
-       0x177d, 0x70c3, 0x4000, 0x0078, 0x177f, 0x70c3, 0x4003, 0x70ca,
-       0x0078, 0x1287, 0x2011, 0x5267, 0x220c, 0x70c4, 0x8003, 0x0048,
-       0x178f, 0x1078, 0x3c51, 0xa184, 0x7fff, 0x0078, 0x1793, 0x1078,
-       0x3c44, 0xa185, 0x8000, 0x2012, 0x0078, 0x1283, 0x71c4, 0x1078,
-       0x3c3b, 0x6100, 0x2001, 0x5267, 0x2004, 0xa084, 0x8000, 0xa10d,
-       0x6204, 0x6308, 0x0078, 0x1281, 0x79e4, 0x0078, 0x1283, 0x71c4,
-       0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x21a0,
-       0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x0078, 0x1284, 0x70c4,
-       0x2068, 0x2079, 0x5200, 0x2091, 0x8000, 0x1078, 0x1980, 0x2091,
-       0x8001, 0x0040, 0x1843, 0x6007, 0x0001, 0x600b, 0x0000, 0x602b,
-       0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f, 0xa284, 0x00f0,
-       0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016, 0xa284, 0x0800,
-       0x0040, 0x17de, 0x601b, 0x000a, 0x0078, 0x17e4, 0xa284, 0x1000,
-       0x0040, 0x17e4, 0x601b, 0x000c, 0xa284, 0x0300, 0x0040, 0x17ed,
-       0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085, 0x0001, 0x601e,
-       0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400, 0x0040, 0x17fa,
-       0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b, 0x20a0, 0xad80,
-       0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0, 0x180f, 0x6046,
-       0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078, 0x1819, 0x6800,
-       0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c, 0x6552, 0x6596,
-       0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042, 0x2c08, 0x2061,
-       0x5240, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077, 0x0000, 0x607b,
-       0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284, 0x0400, 0x608e,
-       0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007,
-       0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000, 0x1078, 0x226f,
-       0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287, 0x0c7e,
-       0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071, 0x5240, 0x2079,
-       0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040, 0x1903, 0x6a04,
-       0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x1862, 0xa286, 0x000f,
-       0x00c0, 0x1903, 0x691c, 0xa184, 0x00c0, 0x0040, 0x1903, 0xa184,
-       0x0080, 0x00c0, 0x18d3, 0x6824, 0xa084, 0xff00, 0xa085, 0x0019,
-       0x6826, 0x71b0, 0x81ff, 0x0040, 0x1889, 0x0d7e, 0x2069, 0x0020,
-       0x6807, 0x0010, 0x6908, 0x6808, 0xa106, 0x00c0, 0x187a, 0x690c,
-       0x680c, 0xa106, 0x00c0, 0x187f, 0xa184, 0x00ff, 0x00c0, 0x187f,
-       0x0d7f, 0x78b8, 0xa084, 0x801f, 0x00c0, 0x1889, 0x7848, 0xa085,
-       0x000c, 0x784a, 0x71b0, 0x81ff, 0x0040, 0x18ac, 0x70b3, 0x0000,
-       0x0d7e, 0x2069, 0x0020, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008,
-       0x00c0, 0x189d, 0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0,
-       0x18a4, 0x6807, 0x0002, 0x0d7f, 0x61c4, 0x62c8, 0x63cc, 0x61c6,
-       0x62ca, 0x63ce, 0x0e7e, 0x2071, 0x5200, 0x7266, 0x736a, 0xae80,
-       0x0019, 0x0e7f, 0x7848, 0xa084, 0x000c, 0x00c0, 0x18ba, 0x1078,
-       0x47e1, 0x78a3, 0x0000, 0x7858, 0xa084, 0xedff, 0x785a, 0x70b4,
-       0xa080, 0x00da, 0x781a, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091,
-       0x8001, 0x0078, 0x1284, 0x6824, 0xa084, 0xff00, 0xa085, 0x0019,
-       0x6826, 0x78b8, 0xa084, 0x801f, 0x00c0, 0x18d9, 0x7848, 0xa085,
-       0x000c, 0x784a, 0x7848, 0xa084, 0x000c, 0x00c0, 0x18e2, 0x71b0,
-       0x81ff, 0x0040, 0x1901, 0x70b3, 0x0000, 0x0d7e, 0x2069, 0x0020,
-       0x6807, 0x0018, 0x6804, 0xa084, 0x0008, 0x00c0, 0x18f2, 0x6807,
-       0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x18f9, 0x6807, 0x0002,
-       0x0d7f, 0x0078, 0x18cb, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091,
-       0x8001, 0x2001, 0x4005, 0x0078, 0x1286, 0x7980, 0x71c6, 0x71c4,
-       0xa182, 0x0003, 0x00c8, 0x127c, 0x7982, 0x0078, 0x1284, 0x7980,
-       0x71c6, 0x0078, 0x1284, 0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978,
-       0x71ca, 0x71c8, 0x797a, 0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078,
-       0x1284, 0x7974, 0x71c6, 0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078,
-       0x1284, 0x7900, 0x71c6, 0x71c4, 0x7902, 0x2001, 0x04fd, 0x2004,
-       0xa082, 0x0005, 0x0048, 0x1940, 0x0038, 0x1942, 0x0078, 0x194c,
-       0x00a8, 0x194c, 0xa18c, 0x0001, 0x00c0, 0x194a, 0x20b9, 0x2222,
-       0x0078, 0x194c, 0x20b9, 0x1212, 0x0078, 0x1284, 0x7900, 0x71c6,
-       0x0078, 0x1284, 0x2009, 0x5274, 0x2104, 0x70c6, 0x70c4, 0x200a,
-       0x0078, 0x1284, 0x2009, 0x5274, 0x2104, 0x70c6, 0x0078, 0x1284,
-       0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
-       0x5480, 0x6a14, 0xd2b4, 0x0040, 0x1971, 0x2011, 0x0001, 0x0078,
-       0x1973, 0x2011, 0x0000, 0x6b0c, 0x0078, 0x1281, 0xac80, 0x0001,
-       0x1078, 0x1b80, 0x007c, 0xac80, 0x0001, 0x1078, 0x1b20, 0x007c,
-       0x7850, 0xa065, 0x0040, 0x1988, 0x2c04, 0x7852, 0x2063, 0x0000,
-       0x007c, 0x0f7e, 0x2079, 0x5200, 0x7850, 0xa06d, 0x0040, 0x1998,
-       0x2d04, 0x7852, 0x6803, 0x0000, 0x6807, 0x0000, 0x680b, 0x0000,
-       0x0f7f, 0x007c, 0x2091, 0x8000, 0x0f7e, 0x2079, 0x5200, 0x7850,
-       0x2062, 0x2c00, 0xa005, 0x00c0, 0x19a7, 0x1078, 0x248c, 0x7852,
-       0x0f7f, 0x2091, 0x8001, 0x007c, 0x0f7e, 0x2079, 0x5200, 0x7850,
-       0x206a, 0x2d00, 0x7852, 0x0f7f, 0x007c, 0x2011, 0x7900, 0x7a52,
-       0x7bec, 0x8319, 0x0040, 0x19c2, 0xa280, 0x0031, 0x2012, 0x2010,
-       0x0078, 0x19b9, 0x2013, 0x0000, 0x007c, 0xa784, 0x0f00, 0x800b,
-       0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8,
-       0x5500, 0x007c, 0x1078, 0x19c5, 0x2900, 0x682a, 0x2a00, 0x682e,
-       0x6808, 0xa084, 0xffef, 0xa80d, 0x690a, 0x2009, 0x5252, 0x210c,
-       0x6804, 0xa005, 0x0040, 0x1a04, 0xa116, 0x00c0, 0x19ef, 0x2060,
-       0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x19f2, 0x2009,
-       0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1a01, 0x6000, 0x6806,
-       0x1078, 0x1a31, 0x1078, 0x1ccb, 0x6810, 0x8001, 0x6812, 0x00c0,
-       0x19f2, 0x017f, 0x6902, 0x6906, 0x007c, 0xa065, 0x0040, 0x1a16,
-       0x2008, 0x609c, 0xa005, 0x0040, 0x1a13, 0x2062, 0x609f, 0x0000,
-       0xa065, 0x0078, 0x1a09, 0x7850, 0x7952, 0x2062, 0x007c, 0xa065,
-       0x0040, 0x1a30, 0x2008, 0x609c, 0xa005, 0x0040, 0x1a25, 0x2062,
-       0x609f, 0x0000, 0xa065, 0x0078, 0x1a1b, 0x0f7e, 0x2079, 0x5200,
-       0x2091, 0x8000, 0x7850, 0x7952, 0x0f7f, 0x2062, 0x2091, 0x8001,
-       0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c, 0xac80,
-       0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a, 0x682c,
-       0x6022, 0x007c, 0x0e7e, 0x2071, 0x5240, 0x704c, 0xa08c, 0x0200,
-       0x00c0, 0x1a50, 0xa088, 0x5280, 0x2d0a, 0x8000, 0x704e, 0xa006,
-       0x0e7f, 0x007c, 0x1078, 0x19c5, 0x2091, 0x8000, 0x6804, 0x781e,
-       0xa065, 0x0040, 0x1a9b, 0x0078, 0x1a63, 0x2c00, 0x781e, 0x6000,
-       0xa065, 0x0040, 0x1a9b, 0x600c, 0xa306, 0x00c0, 0x1a5d, 0x6010,
-       0xa206, 0x00c0, 0x1a5d, 0x2c28, 0x2001, 0x5252, 0x2004, 0xac06,
-       0x00c0, 0x1a74, 0x0078, 0x1a99, 0x6804, 0xac06, 0x00c0, 0x1a81,
-       0x6000, 0xa065, 0x6806, 0x00c0, 0x1a8b, 0x6803, 0x0000, 0x0078,
-       0x1a8b, 0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0,
-       0x1a8b, 0x2c00, 0x6802, 0x2560, 0x1078, 0x1a31, 0x601b, 0x0005,
-       0x6023, 0x0020, 0x1078, 0x1ccb, 0x6810, 0x8001, 0x1050, 0x248c,
-       0x6812, 0xa085, 0xffff, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021,
-       0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x19d2,
-       0x8738, 0xa784, 0x001f, 0x00c0, 0x1aa6, 0xa7bc, 0xff00, 0x873f,
-       0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1aa6, 0x2091, 0x8001,
-       0x007c, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1aca,
-       0x2091, 0x8000, 0x78e0, 0x78e3, 0x0000, 0x2091, 0x8001, 0xa005,
-       0x00c0, 0x1acb, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1ad1, 0x1078,
-       0x248c, 0x0079, 0x1ad3, 0x1ae3, 0x1ae6, 0x1aec, 0x1af0, 0x1ae4,
-       0x1af4, 0x1afa, 0x1ae4, 0x1ae4, 0x1c95, 0x1cb9, 0x1cbd, 0x1ae4,
-       0x1ae4, 0x1ae4, 0x1ae4, 0x007c, 0x1078, 0x248c, 0x1078, 0x1a9c,
-       0x2001, 0x8001, 0x0078, 0x1cc3, 0x2001, 0x8003, 0x0078, 0x1cc3,
-       0x2001, 0x8004, 0x0078, 0x1cc3, 0x1078, 0x1a9c, 0x2001, 0x8006,
-       0x0078, 0x1cc3, 0x2001, 0x8007, 0x0078, 0x1cc3, 0x2030, 0x2138,
-       0xa782, 0x0021, 0x0048, 0x1b06, 0x2009, 0x0020, 0x2600, 0x1078,
-       0x1b20, 0x00c0, 0x1b1f, 0xa7ba, 0x0020, 0x0048, 0x1b1e, 0x0040,
-       0x1b1e, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000,
-       0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1b00, 0xa006, 0x007c,
-       0x81ff, 0x0040, 0x1b5b, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084,
-       0x00ff, 0x0040, 0x1b32, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004,
-       0x00c0, 0x1b2d, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a,
-       0x731e, 0x7422, 0x7526, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007,
-       0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x1b4f,
-       0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1b41, 0x7008,
-       0x800b, 0x00c8, 0x1b41, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0,
-       0x1b5b, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x2030, 0x2138,
-       0xa782, 0x0021, 0x0048, 0x1b66, 0x2009, 0x0020, 0x2600, 0x1078,
-       0x1b80, 0x00c0, 0x1b7f, 0xa7ba, 0x0020, 0x0048, 0x1b7e, 0x0040,
-       0x1b7e, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000,
-       0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1b60, 0xa006, 0x007c,
-       0x81ff, 0x0040, 0x1bc1, 0x2098, 0x20a1, 0x0030, 0x700c, 0xa084,
-       0x00ff, 0x0040, 0x1b92, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004,
-       0x00c0, 0x1b8d, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a,
-       0x731e, 0x7422, 0x7526, 0x780c, 0xa085, 0x0000, 0x7002, 0x53a6,
-       0x7007, 0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8,
-       0x1bb0, 0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1ba2,
-       0x7010, 0xa084, 0xf000, 0x0040, 0x1bb9, 0x7007, 0x0008, 0x0078,
-       0x1bbd, 0x7108, 0x8103, 0x00c8, 0x1ba2, 0x7007, 0x0002, 0xa184,
-       0x01e0, 0x7003, 0x0000, 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082,
-       0x0004, 0x00c8, 0x1bcd, 0x0078, 0x1bd0, 0xa006, 0x0078, 0x1bd2,
-       0xa085, 0x0001, 0x007c, 0x0e7e, 0x2071, 0x5200, 0x2d08, 0x7058,
-       0x6802, 0xa005, 0x00c0, 0x1bdd, 0x715e, 0x715a, 0x0e7f, 0x007c,
-       0x2c08, 0x7858, 0x6002, 0xa005, 0x00c0, 0x1be7, 0x795e, 0x795a,
-       0x007c, 0x2091, 0x8000, 0x6114, 0x1078, 0x2180, 0x6900, 0xa184,
-       0x0100, 0x00c0, 0x2035, 0xa184, 0x0200, 0x00c0, 0x2031, 0x681c,
-       0xa005, 0x00c0, 0x203d, 0x6003, 0x0000, 0x2c08, 0x785c, 0xa065,
-       0x00c0, 0x1c05, 0x795a, 0x0078, 0x1c06, 0x6102, 0x795e, 0x2091,
-       0x8001, 0x1078, 0x228c, 0x007c, 0x0e7e, 0x2071, 0x5200, 0x7058,
-       0xa06d, 0x0040, 0x1c1a, 0x6800, 0x705a, 0xa005, 0x00c0, 0x1c19,
-       0x705e, 0x8dff, 0x0e7f, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079,
-       0x5200, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005, 0x0040, 0x1c43,
-       0x2068, 0x6814, 0xa306, 0x00c0, 0x1c33, 0x6828, 0xa084, 0x00ff,
-       0xa406, 0x0040, 0x1c36, 0x2d60, 0x0078, 0x1c24, 0x6800, 0xa005,
-       0x6002, 0x00c0, 0x1c42, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1c41,
-       0x2c00, 0x785e, 0x2d00, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c,
-       0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5200, 0xaf80, 0x0016, 0x2060,
-       0x6000, 0xa005, 0x0040, 0x1c6b, 0x2068, 0x6814, 0xa084, 0x00ff,
-       0xa306, 0x0040, 0x1c5e, 0x2d60, 0x0078, 0x1c50, 0x6800, 0xa005,
-       0x6002, 0x00c0, 0x1c6a, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1c69,
-       0x2c00, 0x785e, 0x2d00, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c,
-       0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5200, 0xaf80, 0x0016, 0x2060,
-       0x6000, 0xa06d, 0x0040, 0x1c90, 0x6814, 0xa306, 0x0040, 0x1c83,
-       0x2d60, 0x0078, 0x1c78, 0x6800, 0xa005, 0x6002, 0x00c0, 0x1c8f,
-       0xaf80, 0x0016, 0xac06, 0x0040, 0x1c8e, 0x2c00, 0x785e, 0x2d00,
-       0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x2091, 0x8000, 0x2069,
-       0x5240, 0x6800, 0xa086, 0x0000, 0x0040, 0x1ca3, 0x2091, 0x8001,
-       0x78e3, 0x0009, 0x007c, 0x6880, 0xa0bc, 0xff00, 0x2041, 0x0021,
-       0x2049, 0x0004, 0x2051, 0x0010, 0x1078, 0x19d2, 0x8738, 0xa784,
-       0x001f, 0x00c0, 0x1cac, 0x2091, 0x8001, 0x2001, 0x800a, 0x0078,
-       0x1cc3, 0x2001, 0x800c, 0x0078, 0x1cc3, 0x1078, 0x1a9c, 0x2001,
-       0x800d, 0x0078, 0x1cc3, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001,
-       0x2091, 0x4080, 0x007c, 0x6004, 0x2c08, 0x2063, 0x0000, 0x7884,
-       0x8000, 0x7886, 0x7888, 0xa005, 0x798a, 0x0040, 0x1cda, 0x2c02,
-       0x0078, 0x1cdb, 0x798e, 0x007c, 0x6807, 0x0103, 0x0c7e, 0x2061,
-       0x5200, 0x2d08, 0x206b, 0x0000, 0x6084, 0x8000, 0x6086, 0x6088,
-       0xa005, 0x618a, 0x0040, 0x1cef, 0x2d02, 0x0078, 0x1cf0, 0x618e,
-       0x0c7f, 0x007c, 0x1078, 0x1d03, 0x0040, 0x1d02, 0x0c7e, 0x609c,
-       0xa065, 0x0040, 0x1cfd, 0x1078, 0x1a17, 0x0c7f, 0x609f, 0x0000,
-       0x1078, 0x199a, 0x007c, 0x788c, 0xa065, 0x0040, 0x1d15, 0x2091,
-       0x8000, 0x7884, 0x8001, 0x7886, 0x2c04, 0x788e, 0xa005, 0x00c0,
-       0x1d13, 0x788a, 0x8000, 0x2091, 0x8001, 0x007c, 0x20a9, 0x0010,
-       0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x1d1f, 0xa200, 0x0070,
-       0x1d23, 0x0078, 0x1d1a, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9,
-       0x0010, 0xa005, 0x0040, 0x1d49, 0xa11a, 0x00c8, 0x1d49, 0x8213,
-       0x818d, 0x0048, 0x1d3a, 0xa11a, 0x00c8, 0x1d3b, 0x0070, 0x1d41,
-       0x0078, 0x1d2f, 0xa11a, 0x2308, 0x8210, 0x0070, 0x1d41, 0x0078,
-       0x1d2f, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f,
-       0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x1d45, 0x7994,
-       0x70d0, 0xa106, 0x0040, 0x1dbd, 0x2091, 0x8000, 0x2071, 0x0020,
-       0x7004, 0xa005, 0x00c0, 0x1dbd, 0x7008, 0x7208, 0xa206, 0x00c0,
-       0x1dbd, 0xa286, 0x0008, 0x00c0, 0x1dbd, 0x2071, 0x0010, 0x1078,
-       0x1980, 0x0040, 0x1dbd, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0, 0xa184,
-       0xff00, 0x0040, 0x1d8b, 0x2031, 0x0000, 0x810b, 0x86b5, 0x810b,
-       0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b,
-       0x86b5, 0x2100, 0xa210, 0x2600, 0xa319, 0xa4a1, 0x0000, 0xa5a9,
-       0x0000, 0x0078, 0x1d95, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399,
-       0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x2009, 0x0020, 0x1078,
-       0x197b, 0x2091, 0x8001, 0x0040, 0x1db4, 0x1078, 0x199a, 0x78a8,
-       0x8000, 0x78aa, 0xa086, 0x0002, 0x00c0, 0x1dbd, 0x2091, 0x8000,
-       0x78e3, 0x0002, 0x78ab, 0x0000, 0x78cc, 0xa085, 0x0003, 0x78ce,
-       0x2091, 0x8001, 0x0078, 0x1dbd, 0x78ab, 0x0000, 0x1078, 0x2149,
-       0x6004, 0xa084, 0x000f, 0x0079, 0x1dc2, 0x2071, 0x0010, 0x2091,
-       0x8001, 0x007c, 0x1dd2, 0x1df4, 0x1e1a, 0x1dd2, 0x1e37, 0x1de1,
-       0x1fc9, 0x1fe4, 0x1dd2, 0x1dee, 0x1e14, 0x1e7f, 0x1eee, 0x1f57,
-       0x1f69, 0x1fe0, 0x2039, 0x0400, 0x78dc, 0xa705, 0x78de, 0x6008,
-       0xa705, 0x600a, 0x1078, 0x2064, 0x609c, 0x78da, 0x1078, 0x2131,
-       0x007c, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1de8, 0x0078, 0x1dd2,
-       0x601c, 0xa085, 0x0080, 0x601e, 0x0078, 0x1dfb, 0x1078, 0x1bc4,
-       0x00c0, 0x1dd2, 0x1078, 0x2163, 0x78dc, 0xa084, 0x0100, 0x0040,
-       0x1dfb, 0x0078, 0x1dd2, 0x78df, 0x0000, 0x6004, 0x8007, 0xa084,
-       0x00ff, 0x78d2, 0x8001, 0x609f, 0x0000, 0x0040, 0x1e11, 0x1078,
-       0x2064, 0x0040, 0x1e11, 0x78dc, 0xa085, 0x0100, 0x78de, 0x0078,
-       0x1e13, 0x1078, 0x2088, 0x007c, 0x1078, 0x1bc4, 0x00c0, 0x1dd2,
-       0x1078, 0x215f, 0x78dc, 0xa08c, 0x0e00, 0x00c0, 0x1e23, 0xa084,
-       0x0100, 0x00c0, 0x1e25, 0x0078, 0x1dd2, 0x1078, 0x2064, 0x00c0,
-       0x1e36, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x2021,
-       0xa186, 0x000f, 0x0040, 0x2021, 0x1078, 0x2088, 0x007c, 0x78dc,
-       0xa084, 0x0100, 0x0040, 0x1e3e, 0x0078, 0x1dd2, 0x78df, 0x0000,
-       0x6714, 0x2011, 0x0001, 0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff,
-       0xa005, 0x0040, 0x1e61, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9,
-       0x0020, 0xa08e, 0x0001, 0x0040, 0x1e61, 0x2039, 0x0000, 0x2011,
-       0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, 0x1e61, 0x0078,
-       0x1e7c, 0x1078, 0x19c5, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f,
-       0x0000, 0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091,
-       0x8001, 0x0070, 0x1e75, 0x0078, 0x1e63, 0x8211, 0x0040, 0x1e7c,
-       0x20a9, 0x0100, 0x0078, 0x1e63, 0x1078, 0x199a, 0x007c, 0x2001,
-       0x5267, 0x2004, 0xa084, 0x8000, 0x0040, 0x2049, 0x6114, 0x1078,
-       0x2180, 0x6900, 0xa184, 0x0001, 0x0040, 0x1ea0, 0x6028, 0xa084,
-       0x00ff, 0x00c0, 0x2041, 0x6800, 0xa084, 0x0001, 0x0040, 0x2049,
-       0x6803, 0x0000, 0x680b, 0x0000, 0x6807, 0x0000, 0x0078, 0x2051,
-       0x2011, 0x0001, 0x6020, 0xd0f4, 0x0040, 0x1ea8, 0xa295, 0x0002,
-       0xd0c4, 0x0040, 0x1ead, 0xa295, 0x0008, 0xd0cc, 0x0040, 0x1eb2,
-       0xa295, 0x0400, 0x601c, 0xa084, 0x0002, 0x0040, 0x1eb9, 0xa295,
-       0x0004, 0x602c, 0xa08c, 0x00ff, 0xa182, 0x0002, 0x0048, 0x204d,
-       0xa182, 0x001b, 0x00c8, 0x204d, 0x0040, 0x204d, 0x690e, 0x602c,
-       0x8007, 0xa08c, 0x00ff, 0xa182, 0x0002, 0x0048, 0x204d, 0xa182,
-       0x001b, 0x00c8, 0x204d, 0x0040, 0x204d, 0x6912, 0x6030, 0xa005,
-       0x00c0, 0x1edc, 0x2001, 0x001e, 0x8000, 0x6816, 0x6028, 0xa084,
-       0x00ff, 0x0040, 0x2049, 0x6806, 0x6028, 0x8007, 0xa084, 0x00ff,
-       0x0040, 0x2049, 0x680a, 0x6a02, 0x0078, 0x2051, 0x2001, 0x5240,
-       0x2004, 0xa086, 0x0007, 0x00c0, 0x1f53, 0x2001, 0x5267, 0x2004,
-       0xa084, 0x8000, 0x0040, 0x2049, 0x6114, 0x1078, 0x2180, 0x2001,
-       0x5252, 0x2004, 0x2010, 0x82ff, 0x0040, 0x1f0e, 0xa080, 0x0005,
-       0x2004, 0xa084, 0x00ff, 0xa106, 0x00c0, 0x1f53, 0x2091, 0x8000,
-       0x6a04, 0x6b08, 0x6418, 0xa484, 0x0003, 0x0040, 0x1f2d, 0x6128,
-       0xa18c, 0x00ff, 0x8001, 0x00c0, 0x1f23, 0x2100, 0xa210, 0x0048,
-       0x1f53, 0x0078, 0x1f2d, 0x8001, 0x00c0, 0x1f53, 0x2100, 0xa212,
-       0x0048, 0x1f53, 0x82ff, 0x0040, 0x1f53, 0xa484, 0x000c, 0x0040,
-       0x1f47, 0x6128, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0,
-       0x1f3f, 0x2100, 0xa318, 0x0048, 0x1f53, 0x0078, 0x1f47, 0xa082,
-       0x0004, 0x00c0, 0x1f53, 0x2100, 0xa31a, 0x0048, 0x1f53, 0x6030,
-       0xa005, 0x0040, 0x1f4d, 0x8000, 0x6816, 0x6a06, 0x6b0a, 0x2091,
-       0x8001, 0x0078, 0x2051, 0x2091, 0x8001, 0x0078, 0x204d, 0x6114,
-       0x1078, 0x2180, 0x2091, 0x8000, 0x6b08, 0x8318, 0x0048, 0x1f65,
-       0x6b0a, 0x2091, 0x8001, 0x0078, 0x2060, 0x2091, 0x8001, 0x0078,
-       0x204d, 0x6024, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1f87, 0xa086,
-       0x0080, 0x00c0, 0x1fc7, 0x20a9, 0x0008, 0x2069, 0x7610, 0x2091,
-       0x8000, 0x6800, 0xa084, 0xfcff, 0x6802, 0xade8, 0x0008, 0x0070,
-       0x1f83, 0x0078, 0x1f79, 0x2091, 0x8001, 0x0078, 0x2051, 0x6028,
-       0xa015, 0x0040, 0x1fc7, 0x6114, 0x1078, 0x2180, 0x0c7e, 0x0d7e,
-       0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d, 0x0040, 0x1fc3,
-       0xa206, 0x0040, 0x1f9e, 0x2168, 0x0078, 0x1f94, 0x2160, 0x6000,
-       0x6802, 0x2c68, 0x1078, 0x19ac, 0x0d7f, 0x6818, 0xa00d, 0x0040,
-       0x1fbb, 0x2060, 0x6200, 0x6a1a, 0x6a1c, 0x6202, 0x681e, 0x1078,
-       0x1989, 0x2da0, 0x2198, 0x20a9, 0x0031, 0x53a3, 0x2d60, 0x1078,
-       0x1ccb, 0x0078, 0x1fbe, 0x6808, 0x8000, 0x680a, 0x2091, 0x8001,
-       0x0c7f, 0x0078, 0x2060, 0x2091, 0x8001, 0x0d7f, 0x0c7f, 0x0078,
-       0x2049, 0x6114, 0x1078, 0x2180, 0x6800, 0xa084, 0x0001, 0x0040,
-       0x2039, 0x2091, 0x8000, 0x6a04, 0x8210, 0x0048, 0x1fdc, 0x6a06,
-       0x2091, 0x8001, 0x0078, 0x2060, 0x2091, 0x8001, 0x0078, 0x204d,
-       0x1078, 0x1bc4, 0x00c0, 0x1dd2, 0x6114, 0x1078, 0x2180, 0x60be,
-       0x60bb, 0x0000, 0x6900, 0xa184, 0x0008, 0x0040, 0x1ff3, 0x6020,
-       0xa085, 0x0100, 0x6022, 0xa184, 0x0001, 0x0040, 0x2049, 0xa184,
-       0x0100, 0x00c0, 0x2035, 0xa184, 0x0200, 0x00c0, 0x2031, 0x681c,
-       0xa005, 0x00c0, 0x203d, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000f,
-       0x00c0, 0x200c, 0x1078, 0x2163, 0x78df, 0x0000, 0x6004, 0x8007,
-       0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f, 0x0000, 0x0040, 0x2021,
-       0x1078, 0x2064, 0x0040, 0x2021, 0x78dc, 0xa085, 0x0100, 0x78de,
-       0x007c, 0x78d7, 0x0000, 0x78db, 0x0000, 0x6024, 0xa084, 0xff00,
-       0x6026, 0x1078, 0x3aac, 0x0040, 0x1d4f, 0x1078, 0x1be9, 0x0078,
-       0x1d4f, 0x2009, 0x0017, 0x0078, 0x2053, 0x2009, 0x000e, 0x0078,
-       0x2053, 0x2009, 0x0007, 0x0078, 0x2053, 0x2009, 0x0035, 0x0078,
-       0x2053, 0x2009, 0x003e, 0x0078, 0x2053, 0x2009, 0x0004, 0x0078,
-       0x2053, 0x2009, 0x0006, 0x0078, 0x2053, 0x2009, 0x0016, 0x0078,
-       0x2053, 0x2009, 0x0001, 0x6024, 0xa084, 0xff00, 0xa105, 0x6026,
-       0x2091, 0x8000, 0x1078, 0x1ccb, 0x2091, 0x8001, 0x0078, 0x1d4f,
-       0x1078, 0x199a, 0x0078, 0x1d4f, 0x78d4, 0xa06d, 0x00c0, 0x206f,
-       0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000, 0x0078, 0x207b, 0x2c00,
-       0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00, 0x6002, 0x78d8, 0xad06,
-       0x00c0, 0x207b, 0x6002, 0x78d0, 0x8001, 0x78d2, 0x00c0, 0x2087,
-       0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8, 0x2060, 0xa006, 0x007c,
-       0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xe1ff, 0x601e, 0xa184,
-       0x0060, 0x0040, 0x2097, 0x0e7e, 0x1078, 0x48d3, 0x0e7f, 0x6596,
-       0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714,
-       0x1078, 0x19c5, 0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x00c0,
-       0x20be, 0x6808, 0xa084, 0x0001, 0x0040, 0x20be, 0x2091, 0x8001,
-       0x1078, 0x1a31, 0x2091, 0x8000, 0x1078, 0x1ccb, 0x2091, 0x8001,
-       0x78d7, 0x0000, 0x78db, 0x0000, 0x0078, 0x2130, 0x6024, 0xa096,
-       0x0001, 0x00c0, 0x20c5, 0x8000, 0x6026, 0x6a10, 0x6814, 0x2091,
-       0x8001, 0xa202, 0x0048, 0x20d4, 0x0040, 0x20d4, 0x2039, 0x0200,
-       0x1078, 0x2131, 0x0078, 0x2130, 0x2c08, 0x2091, 0x8000, 0x60a0,
-       0xa084, 0x8000, 0x0040, 0x2101, 0x6800, 0xa065, 0x0040, 0x2106,
-       0x6a04, 0x0e7e, 0x2071, 0x5240, 0x7000, 0xa084, 0x0001, 0x0040,
-       0x20fb, 0x7048, 0xa206, 0x00c0, 0x20fb, 0x6b04, 0x231c, 0x2160,
-       0x6302, 0x2300, 0xa005, 0x00c0, 0x20f6, 0x6902, 0x2260, 0x6102,
-       0x0e7f, 0x0078, 0x210d, 0x2160, 0x6202, 0x6906, 0x0e7f, 0x0078,
-       0x210d, 0x6800, 0xa065, 0x0040, 0x2106, 0x6102, 0x6902, 0x00c0,
-       0x210a, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160, 0x60a0, 0xa084,
-       0x8000, 0x0040, 0x2117, 0x6808, 0xa084, 0xfffc, 0x680a, 0x6810,
-       0x8000, 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c, 0x0040, 0x0040,
-       0x2126, 0xa086, 0x0040, 0x680a, 0x1078, 0x1a42, 0x2091, 0x8000,
-       0x1078, 0x226f, 0x2091, 0x8001, 0x78db, 0x0000, 0x78d7, 0x0000,
-       0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x1ccb,
-       0x2091, 0x8001, 0x78d8, 0xa065, 0x0040, 0x2144, 0x609c, 0x78da,
-       0x609f, 0x0000, 0x0078, 0x2134, 0x78d7, 0x0000, 0x78db, 0x0000,
-       0x007c, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8, 0x2150, 0xa006,
-       0x7896, 0x70d2, 0x7804, 0xa005, 0x0040, 0x215e, 0x8001, 0x7806,
-       0x00c0, 0x215e, 0x0068, 0x215e, 0x2091, 0x4080, 0x007c, 0x2039,
-       0x2177, 0x0078, 0x2165, 0x2039, 0x217d, 0x2704, 0xa005, 0x0040,
-       0x2176, 0xac00, 0x2068, 0x6b08, 0x6c0c, 0x6910, 0x6a14, 0x690a,
-       0x6a0e, 0x6b12, 0x6c16, 0x8738, 0x0078, 0x2165, 0x007c, 0x0003,
-       0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015, 0x001b, 0x0000,
-       0x0c7e, 0x1078, 0x3c3b, 0x2c68, 0x0c7f, 0x007c, 0x0010, 0x21f7,
-       0x0068, 0x21f7, 0x2029, 0x0000, 0x78cb, 0x0000, 0x788c, 0xa065,
-       0x0040, 0x21f0, 0x2009, 0x5274, 0x2104, 0xa084, 0x0001, 0x0040,
-       0x21be, 0x6004, 0xa086, 0x0103, 0x00c0, 0x21be, 0x6018, 0xa005,
-       0x00c0, 0x21be, 0x6014, 0xa005, 0x00c0, 0x21be, 0x0d7e, 0x2069,
-       0x0000, 0x6818, 0xa084, 0x0001, 0x00c0, 0x21bd, 0x600c, 0x70c6,
-       0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, 0x4080,
-       0x0d7f, 0x1078, 0x1cf2, 0x0078, 0x21f5, 0x0d7f, 0x1078, 0x21f8,
-       0x0040, 0x21f0, 0x6204, 0xa294, 0x00ff, 0xa296, 0x0003, 0x0040,
-       0x21d0, 0x6204, 0xa296, 0x0110, 0x00c0, 0x21de, 0x78cb, 0x0001,
-       0x6204, 0xa294, 0xff00, 0x8217, 0x8211, 0x0040, 0x21de, 0x85ff,
-       0x00c0, 0x21f0, 0x8210, 0xa202, 0x00c8, 0x21f0, 0x057e, 0x1078,
-       0x2207, 0x057f, 0x0040, 0x21eb, 0x78e0, 0xa086, 0x0003, 0x0040,
-       0x21f0, 0x0078, 0x21de, 0x8528, 0x78c8, 0xa005, 0x0040, 0x218e,
-       0x85ff, 0x0040, 0x21f7, 0x2091, 0x4080, 0x78b0, 0x70d6, 0x007c,
-       0x7bac, 0x79b0, 0x70d4, 0xa102, 0x00c0, 0x2201, 0x2300, 0xa005,
-       0x007c, 0x0048, 0x2205, 0xa302, 0x007c, 0x8002, 0x007c, 0x2001,
-       0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x2221, 0x2091, 0x8000,
-       0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x2256, 0x7008, 0x7208,
-       0xa206, 0x00c0, 0x2256, 0xa286, 0x0008, 0x00c0, 0x2256, 0x2071,
-       0x0010, 0x1078, 0x225b, 0x2009, 0x0020, 0x6004, 0xa086, 0x0103,
-       0x00c0, 0x2230, 0x6028, 0xa005, 0x00c0, 0x2230, 0x2009, 0x000c,
-       0x1078, 0x1976, 0x0040, 0x2249, 0x78c4, 0x8000, 0x78c6, 0xa086,
-       0x0002, 0x00c0, 0x2256, 0x2091, 0x8000, 0x78e3, 0x0003, 0x78c7,
-       0x0000, 0x78cc, 0xa085, 0x0300, 0x78ce, 0x2091, 0x8001, 0x0078,
-       0x2256, 0x78c7, 0x0000, 0x1078, 0x1cf2, 0x79ac, 0x78b0, 0x8000,
-       0xa10a, 0x00c8, 0x2254, 0xa006, 0x78b2, 0xa006, 0x2071, 0x0010,
-       0x2091, 0x8001, 0x007c, 0x8107, 0x8004, 0x8004, 0x7ab8, 0x7bb4,
-       0x7cc0, 0x7dbc, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
-       0x0000, 0x007c, 0x2009, 0x525b, 0x2091, 0x8000, 0x200a, 0x0f7e,
-       0x0e7e, 0x2071, 0x5240, 0x7000, 0xa086, 0x0000, 0x00c0, 0x2289,
-       0x2009, 0x5212, 0x2104, 0xa005, 0x00c0, 0x2289, 0x2079, 0x0100,
-       0x7830, 0xa084, 0x00c0, 0x00c0, 0x2289, 0x0018, 0x2289, 0x781b,
-       0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x5240,
-       0x2091, 0x8000, 0x7000, 0xa086, 0x0000, 0x00c0, 0x22a2, 0x2079,
-       0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x22a2, 0x0018, 0x22a2,
-       0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f, 0x0f7f, 0x007c, 0x127e,
-       0x2091, 0x2300, 0x2071, 0x5240, 0x2079, 0x0100, 0x784b, 0x000f,
-       0x0098, 0x22b5, 0x7838, 0x0078, 0x22ae, 0x20a9, 0x0040, 0x7800,
-       0xa082, 0x0004, 0x0048, 0x22be, 0x20a9, 0x0060, 0x789b, 0x0000,
-       0x78af, 0x0000, 0x78af, 0x0000, 0x0070, 0x22c8, 0x0078, 0x22c0,
-       0x7800, 0xa082, 0x0004, 0x0048, 0x22d7, 0x70b7, 0x0093, 0x2019,
-       0x4ff0, 0x1078, 0x2313, 0x702f, 0x8001, 0x0078, 0x22e3, 0x70b7,
-       0x0000, 0x2019, 0x4e70, 0x1078, 0x2313, 0x2019, 0x4eaf, 0x1078,
-       0x2313, 0x702f, 0x8000, 0x7003, 0x0000, 0x1078, 0x2420, 0x7004,
-       0xa084, 0x000f, 0x017e, 0x2009, 0x04fd, 0x210c, 0xa18a, 0x0005,
-       0x0048, 0x22f8, 0x0038, 0x22fe, 0xa085, 0x6280, 0x0078, 0x2300,
-       0x0028, 0x22fe, 0xa085, 0x6280, 0x0078, 0x2300, 0xa085, 0x62c0,
-       0x017f, 0x7806, 0x780f, 0xb204, 0x7843, 0x00d8, 0x7853, 0x0080,
-       0x780b, 0x0008, 0x7047, 0x0008, 0x7053, 0x527f, 0x704f, 0x0000,
-       0x127f, 0x2000, 0x007c, 0x137e, 0x147e, 0x157e, 0x047e, 0x20a1,
-       0x012b, 0x2304, 0xa005, 0x789a, 0x0040, 0x2333, 0x8318, 0x2324,
-       0x8318, 0x2398, 0x24a8, 0xa484, 0xff00, 0x0040, 0x232b, 0xa482,
-       0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6, 0xa005, 0x00c0, 0x2322,
-       0x3318, 0x0078, 0x2319, 0x047f, 0x157f, 0x147f, 0x137f, 0x007c,
-       0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0, 0xa105,
-       0x2012, 0x1078, 0x2420, 0x007c, 0x2011, 0x0101, 0x20a9, 0x0009,
-       0x810b, 0x0070, 0x234d, 0x0078, 0x2348, 0xa18c, 0x0e00, 0x2204,
-       0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101, 0x20a9,
-       0x0005, 0x8213, 0x0070, 0x235e, 0x0078, 0x2359, 0xa294, 0x00e0,
-       0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011, 0x0101,
-       0x20a9, 0x000c, 0x810b, 0x0070, 0x236f, 0x0078, 0x236a, 0xa18c,
-       0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c, 0x2011,
-       0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x8103,
-       0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x62ac,
-       0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e,
-       0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f,
-       0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100,
-       0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x8103,
-       0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4,
-       0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c, 0x2091,
-       0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x23fe, 0x2061,
-       0x7600, 0x1078, 0x2406, 0x0040, 0x23e8, 0x20a9, 0x0000, 0x2061,
-       0x7500, 0x0c7e, 0x1078, 0x2406, 0x0040, 0x23d6, 0x0c7f, 0x8c60,
-       0x0070, 0x23d4, 0x0078, 0x23c9, 0x0078, 0x23fe, 0x007f, 0xa082,
-       0x7500, 0x2071, 0x5240, 0x7086, 0x7182, 0x2001, 0x0004, 0x706e,
-       0x7093, 0x000f, 0x7073, 0x0000, 0x1078, 0x226a, 0x0078, 0x23fa,
-       0x60c0, 0xa005, 0x00c0, 0x23fe, 0x2071, 0x5240, 0x7182, 0x2c00,
-       0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f, 0x7073, 0x0000,
-       0x1078, 0x226a, 0x2001, 0x0000, 0x0078, 0x2400, 0x2001, 0x0001,
-       0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005,
-       0x0040, 0x241d, 0x2060, 0x600c, 0xa306, 0x00c0, 0x241a, 0x6010,
-       0xa206, 0x00c0, 0x241a, 0x6014, 0xa106, 0x00c0, 0x241a, 0xa006,
-       0x0078, 0x241f, 0x6000, 0x0078, 0x2407, 0xa085, 0x0001, 0x007c,
-       0x2011, 0x5241, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204,
-       0xa084, 0x0100, 0x0040, 0x2436, 0x2021, 0xff04, 0x2122, 0x810b,
-       0x810b, 0x810b, 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e,
-       0x68e4, 0xa08c, 0x0020, 0x0040, 0x248a, 0xa084, 0x0006, 0x00c0,
-       0x248a, 0x6014, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
-       0xa0f0, 0x5480, 0x7004, 0xa084, 0x000a, 0x00c0, 0x248a, 0x7108,
-       0xa194, 0xff00, 0x0040, 0x248a, 0xa18c, 0x00ff, 0x2001, 0x000c,
-       0xa106, 0x0040, 0x2471, 0x2001, 0x0012, 0xa106, 0x0040, 0x2475,
-       0x2001, 0x0014, 0xa106, 0x0040, 0x2479, 0x2001, 0x0019, 0xa106,
-       0x0040, 0x247d, 0x2001, 0x0032, 0xa106, 0x0040, 0x2481, 0x0078,
-       0x2485, 0x2009, 0x0012, 0x0078, 0x2487, 0x2009, 0x0014, 0x0078,
-       0x2487, 0x2009, 0x0019, 0x0078, 0x2487, 0x2009, 0x0020, 0x0078,
-       0x2487, 0x2009, 0x003f, 0x0078, 0x2487, 0x2011, 0x0000, 0x2100,
-       0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068, 0x248c, 0x2091, 0x8000,
-       0x2071, 0x0000, 0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x2493,
-       0x007f, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002,
-       0x70db, 0x0741, 0x70df, 0x0006, 0x2071, 0x0000, 0x701b, 0x0001,
-       0x2091, 0x4080, 0x0078, 0x24aa, 0x107e, 0x007e, 0x127e, 0x2091,
-       0x2300, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca,
-       0x75ce, 0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079,
-       0x24c1, 0x24d3, 0x24d3, 0x24d3, 0x280d, 0x3a09, 0x24d1, 0x2502,
-       0x250c, 0x24d1, 0x24d1, 0x24d1, 0x24d1, 0x24d1, 0x24d1, 0x24d1,
-       0x24d1, 0x1078, 0x248c, 0x8507, 0xa084, 0x001f, 0x0079, 0x24d8,
-       0x2516, 0x280d, 0x29c7, 0x2ac4, 0x2aec, 0x2d8c, 0x3037, 0x309a,
-       0x30fb, 0x3180, 0x3238, 0x32d6, 0x2502, 0x28e9, 0x300c, 0x24f8,
-       0x3dac, 0x3dcc, 0x3f8f, 0x3f9b, 0x4074, 0x24f8, 0x24f8, 0x4149,
-       0x414d, 0x3daa, 0x24f8, 0x3efa, 0x24f8, 0x3c5e, 0x250c, 0x24f8,
-       0x1078, 0x248c, 0x0018, 0x24b1, 0x127f, 0x2091, 0x8001, 0x007f,
-       0x107f, 0x007c, 0x2019, 0x4f49, 0x1078, 0x2313, 0x702f, 0x0001,
-       0x781b, 0x004f, 0x0078, 0x24fa, 0x2019, 0x4eaf, 0x1078, 0x2313,
-       0x702f, 0x8000, 0x781b, 0x00cd, 0x0078, 0x24fa, 0x7242, 0x2009,
-       0x520f, 0x200b, 0x0000, 0xa584, 0x0001, 0x00c0, 0x3c72, 0x0040,
-       0x2533, 0x1078, 0x248c, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043,
-       0x0000, 0x7037, 0x0000, 0x1078, 0x39e0, 0x0018, 0x24b1, 0x2009,
-       0x520f, 0x200b, 0x0000, 0x7068, 0xa005, 0x00c0, 0x25fe, 0x706c,
-       0xa084, 0x0007, 0x0079, 0x253c, 0x2635, 0x2544, 0x2550, 0x256d,
-       0x258f, 0x25dc, 0x25b5, 0x2544, 0x1078, 0x39c8, 0x2009, 0x0048,
-       0x1078, 0x2ed8, 0x00c0, 0x254e, 0x7003, 0x0004, 0x0078, 0x24fa,
-       0x1078, 0x39c8, 0x00c0, 0x256b, 0x7080, 0x8007, 0x7882, 0x789b,
-       0x0010, 0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b,
-       0x0004, 0x2009, 0x00dd, 0x1078, 0x2ecc, 0x00c0, 0x256b, 0x7003,
-       0x0004, 0x7093, 0x000f, 0x0078, 0x24fa, 0x1078, 0x39c8, 0x00c0,
-       0x258d, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f,
-       0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab,
-       0x0002, 0x785b, 0x0004, 0x2009, 0x00dd, 0x1078, 0x2ecc, 0x00c0,
-       0x258d, 0x7003, 0x0004, 0x7093, 0x000f, 0x0078, 0x24fa, 0x1078,
-       0x39c8, 0x00c0, 0x25b3, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010,
-       0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184,
-       0x79aa, 0x78ab, 0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b,
-       0x0004, 0x2009, 0x00dd, 0x1078, 0x2ecc, 0x00c0, 0x25b3, 0x7003,
-       0x0004, 0x7093, 0x000f, 0x0078, 0x24fa, 0x1078, 0x39c8, 0x00c0,
-       0x25da, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f,
-       0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab,
-       0x0002, 0x785b, 0x0004, 0x2009, 0x00dd, 0x1078, 0x2ecc, 0x00c0,
-       0x25da, 0x7088, 0x708b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0002,
-       0x7093, 0x000f, 0x0078, 0x24fa, 0x1078, 0x39c8, 0x00c0, 0x24fa,
-       0x7088, 0x2068, 0x6f14, 0x1078, 0x38bd, 0x2c50, 0x1078, 0x3a7a,
-       0x789b, 0x0010, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa,
-       0x6e1c, 0x2041, 0x0001, 0x708c, 0xa084, 0x0400, 0x2001, 0x0004,
-       0x0040, 0x25fc, 0x2001, 0x0006, 0x0078, 0x271d, 0x1078, 0x39c8,
-       0x00c0, 0x24fa, 0x789b, 0x0010, 0x7068, 0x2068, 0x6f14, 0x1078,
-       0x38bd, 0x2c50, 0x1078, 0x3a7a, 0x6008, 0xa085, 0x0010, 0x600a,
-       0x6824, 0xa005, 0x0040, 0x261c, 0xa082, 0x0006, 0x0048, 0x261a,
-       0x0078, 0x261c, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f, 0xa39d,
-       0x00c0, 0x7058, 0xa084, 0x8000, 0x0040, 0x262a, 0xa684, 0x0001,
-       0x0040, 0x262c, 0xa39c, 0xffbf, 0x7baa, 0x2031, 0x0020, 0x2041,
-       0x0001, 0x2001, 0x0003, 0x0078, 0x271d, 0x0018, 0x24b1, 0x744c,
-       0xa485, 0x0000, 0x0040, 0x264f, 0xa080, 0x5280, 0x2030, 0x7150,
-       0x8108, 0xa12a, 0x0048, 0x2646, 0x2009, 0x5280, 0x2164, 0x6504,
-       0x85ff, 0x00c0, 0x2660, 0x8421, 0x00c0, 0x2640, 0x7152, 0x7003,
-       0x0000, 0x704b, 0x0000, 0x7040, 0xa005, 0x0040, 0x3c72, 0x0078,
-       0x24fa, 0x764c, 0xa6b0, 0x5280, 0x7150, 0x2600, 0x0078, 0x264b,
-       0x7152, 0x2568, 0x2558, 0x754a, 0x2c50, 0x6034, 0xa085, 0x0000,
-       0x00c0, 0x265d, 0x6708, 0x773a, 0xa784, 0x033f, 0x0040, 0x2696,
-       0xa784, 0x0021, 0x00c0, 0x265d, 0xa784, 0x0002, 0x0040, 0x267f,
-       0xa784, 0x0004, 0x0040, 0x265d, 0xa7bc, 0xfffb, 0x670a, 0xa784,
-       0x0008, 0x00c0, 0x265d, 0xa784, 0x0010, 0x00c0, 0x265d, 0xa784,
-       0x0200, 0x00c0, 0x265d, 0xa784, 0x0100, 0x0040, 0x2696, 0x6018,
-       0xa005, 0x00c0, 0x265d, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000,
-       0x6e1c, 0xa684, 0x000e, 0x6118, 0x0040, 0x26a6, 0x601c, 0xa102,
-       0x0048, 0x26a9, 0x0040, 0x26a9, 0x0078, 0x2659, 0x81ff, 0x00c0,
-       0x2659, 0x68c3, 0x0000, 0xa784, 0x0080, 0x00c0, 0x26b1, 0x700c,
-       0x6022, 0xa7bc, 0xff7f, 0x670a, 0x1078, 0x3a7a, 0x0018, 0x24b1,
-       0x789b, 0x0010, 0xa046, 0x1078, 0x39c8, 0x00c0, 0x24fa, 0x6b14,
-       0xa39c, 0x001f, 0xa39d, 0x00c0, 0x7058, 0xa084, 0x8000, 0x0040,
-       0x26cd, 0xa684, 0x0001, 0x0040, 0x26cf, 0xa39c, 0xffbf, 0xa684,
-       0x0010, 0x0040, 0x26d5, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684,
-       0x000e, 0x00c0, 0x26e0, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x271b,
-       0x7158, 0xa18c, 0x0800, 0x0040, 0x34cb, 0x2011, 0x0020, 0xa684,
-       0x0008, 0x00c0, 0x26f1, 0x8210, 0xa684, 0x0002, 0x00c0, 0x26f1,
-       0x8210, 0x7aaa, 0x8840, 0x1078, 0x39e0, 0x6a14, 0x610c, 0x8108,
-       0xa18c, 0x00ff, 0xa1e0, 0x7500, 0x2c64, 0x8cff, 0x0040, 0x2712,
-       0x6014, 0xa206, 0x00c0, 0x26fc, 0x60b8, 0x8001, 0x60ba, 0x00c0,
-       0x26f7, 0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f,
-       0x0078, 0x2635, 0x1078, 0x39c8, 0x00c0, 0x24fa, 0x2a60, 0x610e,
-       0x79aa, 0x8840, 0x7132, 0x2001, 0x0001, 0x007e, 0x715c, 0xa184,
-       0x0018, 0x0040, 0x2738, 0xa184, 0x0010, 0x0040, 0x272b, 0x1078,
-       0x36d0, 0x00c0, 0x275b, 0xa184, 0x0008, 0x0040, 0x2738, 0x69a0,
-       0xa184, 0x0600, 0x00c0, 0x2738, 0x1078, 0x35bb, 0x0078, 0x275b,
-       0x69a0, 0xa184, 0x0800, 0x0040, 0x274f, 0x0c7e, 0x027e, 0x2960,
-       0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106,
-       0x027f, 0x0c7f, 0x1078, 0x36d0, 0x00c0, 0x275b, 0x69a0, 0xa184,
-       0x0200, 0x0040, 0x2757, 0x1078, 0x360c, 0x0078, 0x275b, 0xa184,
-       0x0400, 0x00c0, 0x2734, 0x69a0, 0xa184, 0x1000, 0x0040, 0x2766,
-       0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x238b, 0x007f, 0x7002,
-       0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x2774, 0xa086, 0x0060,
-       0x00c0, 0x2774, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x2779, 0xa18d,
-       0x0004, 0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b,
-       0x0061, 0x6818, 0xa08d, 0x8000, 0xa084, 0x7fff, 0x691a, 0xa68c,
-       0x0080, 0x0040, 0x2798, 0x7097, 0x0000, 0xa08a, 0x000d, 0x0050,
-       0x2796, 0xa08a, 0x000c, 0x7196, 0x2001, 0x000c, 0x800c, 0x719a,
-       0x78aa, 0x8008, 0x810c, 0x0040, 0x34d1, 0xa18c, 0x00f8, 0x00c0,
-       0x34d1, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000,
-       0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
-       0x157f, 0x6814, 0x8007, 0x7882, 0x6d94, 0x7dd6, 0x7dde, 0x6e98,
-       0x7ed2, 0x7eda, 0x1078, 0x39c8, 0x00c0, 0x27cf, 0x702c, 0x8003,
-       0x0048, 0x27c8, 0x2019, 0x4eaf, 0x1078, 0x2313, 0x702f, 0x8000,
-       0x7830, 0xa084, 0x00c0, 0x00c0, 0x27cf, 0x0098, 0x27d7, 0x6008,
-       0xa084, 0xffef, 0x600a, 0x1078, 0x39e0, 0x0078, 0x2523, 0x7200,
-       0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x27e4, 0x781b, 0x004f,
-       0x1078, 0x39e0, 0x0078, 0x27f5, 0x6ab4, 0xa295, 0x2000, 0x7a5a,
-       0x781b, 0x004f, 0x1078, 0x39e0, 0x7200, 0x2500, 0xa605, 0x0040,
-       0x27f5, 0xa284, 0x0007, 0x1079, 0x2803, 0xad80, 0x0009, 0x7036,
-       0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x24fa, 0x6018, 0x8000,
-       0x601a, 0x0078, 0x24fa, 0x280b, 0x4b4b, 0x4b4b, 0x4b3a, 0x4b4b,
-       0x280b, 0x4b3a, 0x280b, 0x1078, 0x248c, 0x1078, 0x39c8, 0x0f7e,
-       0x2079, 0x5200, 0x78cc, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2831,
-       0x706c, 0xa086, 0x0001, 0x00c0, 0x2820, 0x706e, 0x0078, 0x28c4,
-       0x706c, 0xa086, 0x0005, 0x00c0, 0x282f, 0x7088, 0x2068, 0x681b,
-       0x0004, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x706f,
-       0x0000, 0x2011, 0x0004, 0x716c, 0xa186, 0x0001, 0x0040, 0x2852,
-       0xa186, 0x0007, 0x00c0, 0x2842, 0x2009, 0x5238, 0x200b, 0x0005,
-       0x0078, 0x2852, 0x2009, 0x5213, 0x2104, 0x2009, 0x5212, 0x200a,
-       0x2009, 0x5238, 0x200b, 0x0001, 0x706f, 0x0000, 0x7073, 0x0001,
-       0x0078, 0x2854, 0x706f, 0x0000, 0x1078, 0x4887, 0x157e, 0x20a9,
-       0x0010, 0x2039, 0x0000, 0x1078, 0x37b0, 0xa7b8, 0x0100, 0x0070,
-       0x2863, 0x0078, 0x285b, 0x157f, 0x7000, 0x0079, 0x2867, 0x2895,
-       0x287c, 0x287c, 0x286f, 0x2895, 0x2895, 0x2895, 0x2895, 0x2021,
-       0x525a, 0x2404, 0xa005, 0x0040, 0x2895, 0xad06, 0x00c0, 0x287c,
-       0x6800, 0x2022, 0x0078, 0x288c, 0x6820, 0xa084, 0x0001, 0x00c0,
-       0x2888, 0x6f14, 0x1078, 0x38bd, 0x1078, 0x34a2, 0x0078, 0x288c,
-       0x7060, 0x2060, 0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, 0x6820,
-       0xa085, 0x0008, 0x6822, 0x1078, 0x1cdc, 0x2021, 0x7600, 0x1078,
-       0x28d1, 0x2021, 0x525a, 0x1078, 0x28d1, 0x157e, 0x20a9, 0x0000,
-       0x2021, 0x7500, 0x1078, 0x28d1, 0x8420, 0x0070, 0x28a9, 0x0078,
-       0x28a2, 0x2061, 0x5500, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018,
-       0x6110, 0x81ff, 0x0040, 0x28b8, 0xa102, 0x0050, 0x28b8, 0x6012,
-       0x601b, 0x0000, 0xace0, 0x0010, 0x0070, 0x28c0, 0x0078, 0x28af,
-       0x8421, 0x00c0, 0x28ad, 0x157f, 0x709c, 0xa084, 0x8000, 0x0040,
-       0x28cb, 0x1078, 0x3ace, 0x7003, 0x0000, 0x704b, 0x0000, 0x0078,
-       0x24fa, 0x047e, 0x2404, 0xa005, 0x0040, 0x28e5, 0x2068, 0x6800,
-       0x007e, 0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822,
-       0x1078, 0x1cdc, 0x007f, 0x0078, 0x28d3, 0x047f, 0x2023, 0x0000,
-       0x007c, 0xa282, 0x0003, 0x0050, 0x28ef, 0x1078, 0x248c, 0x2300,
-       0x0079, 0x28f2, 0x28f5, 0x2968, 0x2985, 0xa282, 0x0002, 0x0040,
-       0x28fb, 0x1078, 0x248c, 0x706c, 0x706f, 0x0000, 0x7093, 0x0000,
-       0x0079, 0x2902, 0x290a, 0x290a, 0x290c, 0x2940, 0x34d7, 0x290a,
-       0x2940, 0x290a, 0x1078, 0x248c, 0x7780, 0x1078, 0x37b0, 0x7780,
-       0xa7bc, 0x0f00, 0x1078, 0x38bd, 0x6018, 0xa005, 0x0040, 0x2937,
-       0x2021, 0x7600, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x29a0,
-       0x0040, 0x2937, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7500, 0x047e,
-       0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x29a0, 0x047f, 0x0040,
-       0x2936, 0x8420, 0x0070, 0x2936, 0x0078, 0x2927, 0x157f, 0x8738,
-       0xa784, 0x001f, 0x00c0, 0x2912, 0x0078, 0x2523, 0x0078, 0x2523,
-       0x7780, 0x1078, 0x38bd, 0x6018, 0xa005, 0x0040, 0x2966, 0x2021,
-       0x7600, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x29a0, 0x0040,
-       0x2966, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7500, 0x047e, 0x2009,
-       0x0005, 0x2011, 0x0020, 0x1078, 0x29a0, 0x047f, 0x0040, 0x2965,
-       0x8420, 0x0070, 0x2965, 0x0078, 0x2956, 0x157f, 0x0078, 0x2523,
-       0x2200, 0x0079, 0x296b, 0x296e, 0x2970, 0x2970, 0x1078, 0x248c,
-       0x2009, 0x0012, 0x706c, 0xa086, 0x0002, 0x0040, 0x2979, 0x2009,
-       0x000e, 0x6818, 0xa084, 0x8000, 0x0040, 0x297f, 0x691a, 0x706f,
-       0x0000, 0x7073, 0x0001, 0x0078, 0x3956, 0x2200, 0x0079, 0x2988,
-       0x298d, 0x2970, 0x298b, 0x1078, 0x248c, 0x1078, 0x4887, 0x7000,
-       0xa086, 0x0001, 0x00c0, 0x3467, 0x1078, 0x34b8, 0x6008, 0xa084,
-       0xffef, 0x600a, 0x1078, 0x345a, 0x0040, 0x3467, 0x0078, 0x2635,
-       0x2404, 0xa005, 0x0040, 0x29c3, 0x2068, 0x2d04, 0x007e, 0x6814,
-       0xa706, 0x0040, 0x29af, 0x2d20, 0x007f, 0x0078, 0x29a1, 0x007f,
-       0x2022, 0x691a, 0x6817, 0x0000, 0x6820, 0xa205, 0x6822, 0x1078,
-       0x1cdc, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a,
-       0x1078, 0x34b8, 0x007c, 0xa085, 0x0001, 0x0078, 0x29c2, 0x2300,
-       0x0079, 0x29ca, 0x29cf, 0x29cd, 0x2a68, 0x1078, 0x248c, 0x78ec,
-       0xa084, 0x0001, 0x00c0, 0x29e3, 0x7000, 0xa086, 0x0004, 0x00c0,
-       0x29db, 0x0078, 0x2a06, 0x1078, 0x34b8, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x0078, 0x3467, 0x78e4, 0xa005, 0x00d0, 0x2a06, 0x0018,
-       0x24fa, 0x2008, 0xa084, 0x0030, 0x00c0, 0x29f2, 0x781b, 0x004f,
-       0x0078, 0x24fa, 0x78ec, 0xa084, 0x0003, 0x0040, 0x29ee, 0x2100,
-       0xa084, 0x0007, 0x0079, 0x29fc, 0x2a3f, 0x2a4a, 0x2a30, 0x2a04,
-       0x39bb, 0x39bb, 0x2a04, 0x2a59, 0x1078, 0x248c, 0x7000, 0xa086,
-       0x0004, 0x00c0, 0x2a20, 0x706c, 0xa086, 0x0002, 0x00c0, 0x2a16,
-       0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x28e9, 0x706c, 0xa086,
-       0x0006, 0x0040, 0x2a10, 0x706c, 0xa086, 0x0004, 0x0040, 0x2a10,
-       0x79e4, 0xa184, 0x0030, 0x0040, 0x2a2a, 0x78ec, 0xa084, 0x0003,
-       0x00c0, 0x2a2c, 0x0078, 0x300c, 0x2001, 0x0003, 0x0078, 0x2da0,
-       0x6818, 0xa084, 0x8000, 0x0040, 0x2a37, 0x681b, 0x001d, 0x1078,
-       0x378f, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x24fa, 0x6818,
-       0xa084, 0x8000, 0x0040, 0x2a46, 0x681b, 0x001d, 0x1078, 0x378f,
-       0x0078, 0x3986, 0x6818, 0xa084, 0x8000, 0x0040, 0x2a51, 0x681b,
-       0x001d, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b, 0x00ca, 0x0078,
-       0x24fa, 0x6818, 0xa084, 0x8000, 0x0040, 0x2a60, 0x681b, 0x001d,
-       0x1078, 0x378f, 0x782b, 0x3008, 0x781b, 0x008f, 0x0078, 0x24fa,
-       0xa584, 0x000f, 0x00c0, 0x2a85, 0x7000, 0x0079, 0x2a6f, 0x2523,
-       0x2a79, 0x2a77, 0x3467, 0x3467, 0x3467, 0x3467, 0x2a77, 0x1078,
-       0x248c, 0x1078, 0x34b8, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
-       0x345a, 0x0040, 0x3467, 0x0078, 0x2635, 0x78e4, 0xa005, 0x00d0,
-       0x2a06, 0x0018, 0x2a06, 0x2008, 0xa084, 0x0030, 0x00c0, 0x2a94,
-       0x781b, 0x004f, 0x0078, 0x24fa, 0x78ec, 0xa084, 0x0003, 0x0040,
-       0x2a90, 0x2100, 0xa184, 0x0007, 0x0079, 0x2a9e, 0x2ab0, 0x2ab4,
-       0x2aa8, 0x2aa6, 0x39bb, 0x39bb, 0x2aa6, 0x39b1, 0x1078, 0x248c,
-       0x1078, 0x3797, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x24fa,
-       0x1078, 0x3797, 0x0078, 0x3986, 0x1078, 0x3797, 0x782b, 0x3008,
-       0x781b, 0x00ca, 0x0078, 0x24fa, 0x1078, 0x3797, 0x782b, 0x3008,
-       0x781b, 0x008f, 0x0078, 0x24fa, 0x2300, 0x0079, 0x2ac7, 0x2acc,
-       0x2aca, 0x2ace, 0x1078, 0x248c, 0x0078, 0x3180, 0x681b, 0x0008,
-       0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x3180, 0x78ec,
-       0xa084, 0x0003, 0x0040, 0x3180, 0xa184, 0x0007, 0x0079, 0x2ae0,
-       0x2ae8, 0x2ab4, 0x2a30, 0x3956, 0x39bb, 0x39bb, 0x2ae8, 0x39b1,
-       0x1078, 0x396a, 0x0078, 0x24fa, 0xa282, 0x0005, 0x0050, 0x2af2,
-       0x1078, 0x248c, 0x2300, 0x0079, 0x2af5, 0x2af8, 0x2d4d, 0x2d5b,
-       0x2200, 0x0079, 0x2afb, 0x2b15, 0x2b02, 0x2b15, 0x2b00, 0x2d32,
-       0x1078, 0x248c, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082,
-       0x0020, 0x0048, 0x376b, 0xa08a, 0x0004, 0x00c8, 0x376b, 0x0079,
-       0x2b11, 0x376b, 0x376b, 0x376b, 0x3719, 0x789b, 0x0018, 0x79a8,
-       0xa184, 0x0080, 0x0040, 0x2b26, 0x0078, 0x376b, 0x7000, 0xa005,
-       0x00c0, 0x2b1c, 0x2011, 0x0004, 0x0078, 0x32e9, 0xa184, 0x00ff,
-       0xa08a, 0x0010, 0x00c8, 0x376b, 0x0079, 0x2b2e, 0x2b40, 0x2b3e,
-       0x2b58, 0x2b5c, 0x2c17, 0x376b, 0x376b, 0x2c19, 0x376b, 0x376b,
-       0x2d2e, 0x2d2e, 0x376b, 0x376b, 0x376b, 0x2d30, 0x1078, 0x248c,
-       0xa684, 0x1000, 0x0040, 0x2b4d, 0x2001, 0x0500, 0x8000, 0x8000,
-       0x783a, 0x781b, 0x008d, 0x0078, 0x24fa, 0x6818, 0xa084, 0x8000,
-       0x0040, 0x2b56, 0x681b, 0x001d, 0x0078, 0x2b44, 0x0078, 0x3956,
-       0x681b, 0x001d, 0x0078, 0x377b, 0x6920, 0x6922, 0xa684, 0x1800,
-       0x00c0, 0x2b9d, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2ba5, 0x6818,
-       0xa086, 0x0008, 0x00c0, 0x2b6e, 0x681b, 0x0000, 0xa684, 0x0400,
-       0x0040, 0x2c13, 0xa684, 0x0080, 0x0040, 0x2b99, 0x7097, 0x0000,
-       0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0050, 0x2b99, 0xa08a,
-       0x000c, 0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x789b, 0x0061,
-       0x78aa, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000,
-       0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
-       0x157f, 0x781b, 0x0058, 0x0078, 0x24fa, 0xa684, 0x1000, 0x0040,
-       0x2ba5, 0x781b, 0x0065, 0x0078, 0x24fa, 0xa684, 0x0060, 0x0040,
-       0x2c0f, 0xa684, 0x0800, 0x0040, 0x2c0f, 0xa684, 0x8000, 0x00c0,
-       0x2bb3, 0x0078, 0x2bcb, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x7adc,
-       0x79d8, 0x78d0, 0x801b, 0x00c8, 0x2bbe, 0x8000, 0xa084, 0x003f,
-       0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94,
-       0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, 0x0040, 0x2bd3, 0xa6b4,
-       0xbfff, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003, 0x00c0, 0x2be0,
-       0x1078, 0x493d, 0x1078, 0x4b3a, 0x781b, 0x0064, 0x0078, 0x24fa,
-       0xa006, 0x1078, 0x4c41, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200,
-       0xa105, 0x0040, 0x2bef, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa,
-       0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x00c0,
-       0x2c01, 0xa6b5, 0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x0064, 0x0078,
-       0x24fa, 0x781b, 0x0064, 0x2200, 0xa115, 0x00c0, 0x2c0b, 0x1078,
-       0x4b4b, 0x0078, 0x24fa, 0x1078, 0x4b96, 0x0078, 0x24fa, 0x781b,
-       0x0065, 0x0078, 0x24fa, 0x781b, 0x0058, 0x0078, 0x24fa, 0x1078,
-       0x248c, 0x0078, 0x2c7a, 0x6920, 0xa184, 0x0100, 0x0040, 0x2c31,
-       0xa18c, 0xfeff, 0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084,
-       0xefff, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078,
-       0x2c69, 0xa184, 0x0200, 0x0040, 0x2c69, 0xa18c, 0xfdff, 0x6922,
-       0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004,
-       0xa084, 0xffef, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008,
-       0x0040, 0x2c69, 0x1078, 0x38b9, 0x1078, 0x35bb, 0x88ff, 0x0040,
-       0x2c69, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004,
-       0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2c63, 0x782b, 0x3008, 0x781b,
-       0x0056, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
-       0x24fa, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2c72, 0x781b, 0x0058,
-       0x0078, 0x24fa, 0x781b, 0x0065, 0x0078, 0x24fa, 0x0078, 0x3773,
-       0x0078, 0x3773, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x00c0,
-       0x2c88, 0x6820, 0xa084, 0x0100, 0x0040, 0x2c78, 0x2009, 0x0008,
-       0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0,
-       0x2cbf, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x2cb7,
-       0x0048, 0x2c9c, 0x0078, 0x2cb9, 0xa380, 0x0002, 0xa102, 0x00c8,
-       0x2cb7, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x7054, 0x2060,
-       0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084, 0xffe5, 0x6006,
-       0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x2c6a, 0x0078,
-       0x2c1b, 0x24a8, 0x7aa8, 0x00f0, 0x2cb9, 0x0078, 0x2c8a, 0xa284,
-       0x00f0, 0xa086, 0x0020, 0x00c0, 0x2d1f, 0x8318, 0x8318, 0x2300,
-       0xa102, 0x0040, 0x2ccf, 0x0048, 0x2ccf, 0x0078, 0x2d1c, 0xa286,
-       0x0023, 0x0040, 0x2c78, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58,
-       0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085,
-       0x0010, 0x600a, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008, 0x2c48,
-       0x0c7f, 0xa184, 0x0010, 0x0040, 0x2cf3, 0x1078, 0x38b9, 0x1078,
-       0x36d0, 0x0078, 0x2d02, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008,
-       0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2c69, 0x1078, 0x38b9,
-       0x1078, 0x35bb, 0x88ff, 0x0040, 0x2c69, 0x789b, 0x0060, 0x2800,
-       0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2d16,
-       0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x24fa, 0x782b, 0x3008,
-       0x781b, 0x0065, 0x0078, 0x24fa, 0x7aa8, 0x0078, 0x2c8a, 0x8318,
-       0x2300, 0xa102, 0x0040, 0x2d28, 0x0048, 0x2d28, 0x0078, 0x2c8a,
-       0xa284, 0x0080, 0x00c0, 0x377b, 0x0078, 0x3773, 0x0078, 0x377b,
-       0x0078, 0x376b, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e,
-       0x0001, 0x0040, 0x2d3d, 0x1078, 0x248c, 0x7aa8, 0xa294, 0x00ff,
-       0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x376b, 0x0079,
-       0x2d49, 0x376b, 0x3508, 0x376b, 0x3665, 0xa282, 0x0000, 0x00c0,
-       0x2d53, 0x1078, 0x248c, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x24fa, 0xa282, 0x0003, 0x00c0, 0x2d61, 0x1078,
-       0x248c, 0xa484, 0x8000, 0x00c0, 0x2d84, 0x706c, 0xa005, 0x0040,
-       0x2d6b, 0x1078, 0x248c, 0x6f14, 0x7782, 0xa7bc, 0x0f00, 0x1078,
-       0x38bd, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f,
-       0x00c0, 0x2d6f, 0x1078, 0x3793, 0x706f, 0x0002, 0x2009, 0x5238,
-       0x200b, 0x0009, 0x0078, 0x2d86, 0x1078, 0x379f, 0x782b, 0x3008,
-       0x781b, 0x0065, 0x0078, 0x24fa, 0xa282, 0x0004, 0x0050, 0x2d92,
-       0x1078, 0x248c, 0x2300, 0x0079, 0x2d95, 0x2d98, 0x2e81, 0x2eb4,
-       0xa286, 0x0003, 0x0040, 0x2d9e, 0x1078, 0x248c, 0x2001, 0x0000,
-       0x007e, 0x68c0, 0xa005, 0x0040, 0x2da7, 0x7003, 0x0003, 0x68a0,
-       0xa084, 0x2000, 0x0040, 0x2db0, 0x6008, 0xa085, 0x0002, 0x600a,
-       0x007f, 0x703e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2db7, 0x2523,
-       0x2dc1, 0x2dc1, 0x2fb6, 0x2ff2, 0x2523, 0x2ff2, 0x2dbf, 0x1078,
-       0x248c, 0xa684, 0x1000, 0x00c0, 0x2dc9, 0x1078, 0x4887, 0x0040,
-       0x2e5b, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2e11, 0xa186, 0x0008,
-       0x00c0, 0x2de0, 0x1078, 0x34b8, 0x6008, 0xa084, 0xffef, 0x600a,
-       0x1078, 0x345a, 0x0040, 0x2e11, 0x1078, 0x4887, 0x0078, 0x2df8,
-       0xa186, 0x0028, 0x00c0, 0x2e11, 0x1078, 0x4887, 0x6008, 0xa084,
-       0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2df8, 0x8001, 0x601a,
-       0xa005, 0x0040, 0x2df8, 0x8001, 0xa005, 0x0040, 0x2df8, 0x601e,
-       0x6820, 0xa084, 0x0001, 0x0040, 0x2523, 0x6820, 0xa084, 0xfffe,
-       0x6822, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004,
-       0x6802, 0xa005, 0x2d00, 0x00c0, 0x2e0e, 0x6002, 0x6006, 0x0078,
-       0x2523, 0x017e, 0x1078, 0x2ee5, 0x017f, 0xa684, 0xdf00, 0x681e,
-       0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2e5b, 0xa186, 0x0002,
-       0x00c0, 0x2e5b, 0xa684, 0x0800, 0x00c0, 0x2e2e, 0xa684, 0x0060,
-       0x0040, 0x2e2e, 0x78d8, 0x7adc, 0x682e, 0x6a32, 0x6820, 0xa084,
-       0x0800, 0x00c0, 0x2e5b, 0x8717, 0xa294, 0x000f, 0x8213, 0x8213,
-       0x8213, 0xa290, 0x5480, 0xa290, 0x0000, 0x221c, 0xa384, 0x0100,
-       0x00c0, 0x2e44, 0x0078, 0x2e4a, 0x8210, 0x2204, 0xa085, 0x0018,
-       0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2e57, 0x68a0, 0xa084,
-       0x0100, 0x00c0, 0x2e57, 0x1078, 0x2f69, 0x0078, 0x2523, 0x6008,
-       0xa085, 0x0002, 0x600a, 0x6916, 0x6818, 0xa084, 0x8000, 0x0040,
-       0x2e63, 0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078, 0x34a9,
-       0x1078, 0x34b8, 0x00c0, 0x2e70, 0x6008, 0xa084, 0xffef, 0x600a,
-       0x6820, 0xa084, 0x0001, 0x00c0, 0x2e79, 0x1078, 0x34a2, 0x0078,
-       0x2e7d, 0x7060, 0x2060, 0x6800, 0x6002, 0x1078, 0x1cdc, 0x0078,
-       0x2523, 0xa282, 0x0004, 0x0048, 0x2e87, 0x1078, 0x248c, 0x2200,
-       0x0079, 0x2e8a, 0x2e85, 0x2e8e, 0x2e9b, 0x2e8e, 0x7000, 0xa086,
-       0x0005, 0x0040, 0x2e97, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x24fa, 0x7890, 0x8007, 0x8001, 0xa084, 0x0007,
-       0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186, 0x0003,
-       0x0040, 0x2eb0, 0xa186, 0x0000, 0x0040, 0x2eb0, 0x0078, 0x376b,
-       0x781b, 0x0065, 0x0078, 0x24fa, 0x6820, 0xa085, 0x0004, 0x6822,
-       0x82ff, 0x00c0, 0x2ebf, 0x1078, 0x378f, 0x0078, 0x2ec6, 0x8211,
-       0x0040, 0x2ec4, 0x1078, 0x248c, 0x1078, 0x379f, 0x782b, 0x3008,
-       0x781b, 0x0065, 0x0078, 0x24fa, 0x702c, 0x8003, 0x0048, 0x2ed6,
-       0x2019, 0x4eaf, 0x1078, 0x2313, 0x702f, 0x8000, 0x1078, 0x39e0,
-       0x7830, 0xa084, 0x00c0, 0x00c0, 0x2ee2, 0x0018, 0x2ee2, 0x791a,
-       0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060, 0x00c0,
-       0x2eef, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2f68, 0xa684,
-       0x0800, 0x00c0, 0x2f11, 0x68b4, 0xa084, 0x4800, 0xa635, 0xa684,
-       0x0800, 0x00c0, 0x2f11, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x703c,
-       0xa005, 0x00c0, 0x2f09, 0x2200, 0xa105, 0x0040, 0x2f10, 0x703f,
-       0x0015, 0x7000, 0xa086, 0x0006, 0x0040, 0x2f10, 0x1078, 0x4887,
-       0x007c, 0xa684, 0x0020, 0x0040, 0x2f33, 0xa684, 0x4000, 0x0040,
-       0x2f1f, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2f09, 0x68b4,
-       0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2f19, 0x703c,
-       0xa005, 0x00c0, 0x2f2d, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x692e,
-       0x6a32, 0x0078, 0x2f09, 0xa684, 0x4000, 0x0040, 0x2f3d, 0x682f,
-       0x0000, 0x6833, 0x0000, 0x0078, 0x2f09, 0x68b4, 0xa084, 0x4800,
-       0xa635, 0xa684, 0x4000, 0x00c0, 0x2f37, 0x703c, 0xa005, 0x00c0,
-       0x2f4b, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb, 0x00c8,
-       0x2f52, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e,
-       0x6a32, 0x2100, 0xa205, 0x00c0, 0x2f5f, 0x0078, 0x2f09, 0x7000,
-       0xa086, 0x0006, 0x0040, 0x2f68, 0x1078, 0x4c41, 0x0078, 0x2f09,
-       0x007c, 0x6008, 0xa085, 0x0200, 0x600a, 0xa384, 0x0200, 0x0040,
-       0x2f75, 0x6008, 0xa085, 0x0002, 0x600a, 0x681b, 0x0006, 0x688f,
-       0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f,
-       0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b,
-       0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079, 0x2f90,
-       0x2523, 0x2f9a, 0x2fa3, 0x2f98, 0x2f98, 0x2f98, 0x2f98, 0x2f98,
-       0x1078, 0x248c, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2fa3, 0x1078,
-       0x34a2, 0x0078, 0x2fa9, 0x7060, 0x2c50, 0x2060, 0x6800, 0x6002,
-       0x2a60, 0x2021, 0x525a, 0x2404, 0xa005, 0x0040, 0x2fb2, 0x2020,
-       0x0078, 0x2fab, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078, 0x34a9,
-       0x1078, 0x34b8, 0x6008, 0xa084, 0xfdff, 0x600a, 0x682b, 0x0000,
-       0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x4c89, 0xa684,
-       0x0800, 0x0040, 0x2fcf, 0x691c, 0xa18d, 0x2000, 0x691e, 0x6818,
-       0xa084, 0x8000, 0x0040, 0x2fdf, 0x7868, 0xa08c, 0x00ff, 0x0040,
-       0x2fdd, 0x681b, 0x001e, 0x0078, 0x2fdf, 0x681b, 0x0000, 0x2021,
-       0x525a, 0x2404, 0xad06, 0x0040, 0x2fe6, 0x7460, 0x6800, 0x2022,
-       0x68c3, 0x0000, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078, 0x1cdc,
-       0x0078, 0x2523, 0x1078, 0x2ee5, 0x682b, 0x0000, 0x2001, 0x000e,
-       0x6f14, 0x1078, 0x39e6, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xa084,
-       0x8000, 0x0040, 0x3005, 0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e,
-       0x706f, 0x0000, 0x0078, 0x2523, 0x7000, 0xa005, 0x00c0, 0x3012,
-       0x0078, 0x2523, 0xa006, 0x1078, 0x4887, 0x6817, 0x0000, 0x681b,
-       0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa085,
-       0x00ff, 0x6822, 0x7000, 0x0079, 0x3025, 0x2523, 0x302f, 0x302f,
-       0x3031, 0x3031, 0x3031, 0x3031, 0x302d, 0x1078, 0x248c, 0x1078,
-       0x34b8, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x3472, 0x2300,
-       0x0079, 0x303a, 0x303d, 0x303f, 0x3098, 0x1078, 0x248c, 0xa684,
-       0x8000, 0x00c0, 0x307d, 0x7000, 0x0079, 0x3046, 0x2523, 0x3050,
-       0x3050, 0x306c, 0x3050, 0x3079, 0x306c, 0x304e, 0x1078, 0x248c,
-       0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x3068, 0xa6b4, 0xffdf,
-       0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x6eb6, 0x681c, 0xa084,
-       0xffdf, 0x681e, 0x1078, 0x4887, 0x1078, 0x4b4b, 0x0078, 0x3956,
-       0xa684, 0x2000, 0x0040, 0x305a, 0x6818, 0xa084, 0x8000, 0x0040,
-       0x3079, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, 0x3079, 0x681b,
-       0x0007, 0x1078, 0x396a, 0x0078, 0x24fa, 0xa6b4, 0x7fff, 0x7e5a,
-       0x7adc, 0x79d8, 0x78d0, 0x79d2, 0x801b, 0x00c8, 0x3088, 0x8000,
-       0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
-       0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0065, 0x007c,
-       0x1078, 0x248c, 0x2300, 0x0079, 0x309d, 0x30a0, 0x30a2, 0x30eb,
-       0x1078, 0x248c, 0xa684, 0x8000, 0x00c0, 0x30da, 0x7000, 0x0079,
-       0x30a9, 0x2523, 0x30b3, 0x30b3, 0x30cf, 0x30b3, 0x30d6, 0x30cf,
-       0x30b1, 0x1078, 0x248c, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0,
-       0x30cb, 0xa6b4, 0xffbf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a,
-       0x6eb6, 0x681c, 0xa084, 0xffbf, 0x681e, 0x1078, 0x4887, 0x1078,
-       0x4b4b, 0x0078, 0x3956, 0xa684, 0x2000, 0x0040, 0x30bd, 0x6818,
-       0xa084, 0x8000, 0x0040, 0x30d6, 0x681b, 0x0007, 0x781b, 0x00ca,
-       0x0078, 0x24fa, 0xa6b4, 0x7fff, 0x7e5a, 0x7adc, 0x79d8, 0x6b98,
-       0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2,
-       0x781b, 0x0065, 0x007c, 0x6820, 0xa085, 0x0004, 0x6822, 0x1078,
-       0x3921, 0xa6b5, 0x0800, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x24fa, 0x2300, 0x0079, 0x30fe, 0x3101, 0x3103,
-       0x3105, 0x1078, 0x248c, 0x0078, 0x377b, 0xa684, 0x0400, 0x00c0,
-       0x312e, 0x79e4, 0xa184, 0x0020, 0x0040, 0x3115, 0x78ec, 0xa084,
-       0x0003, 0x0040, 0x3115, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab,
-       0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xa184, 0x0020, 0x0040,
-       0x3126, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x312a, 0x2001, 0x0014,
-       0x0078, 0x2da0, 0xa184, 0x0007, 0x0079, 0x3166, 0x7a90, 0xa294,
-       0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0040, 0x3164, 0x789b,
-       0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0, 0x3155, 0x7ba8, 0x7ba8,
-       0xa386, 0x0001, 0x00c0, 0x3148, 0x2009, 0xfff7, 0x0078, 0x314e,
-       0xa386, 0x0003, 0x00c0, 0x3155, 0x2009, 0xffef, 0x0c7e, 0x7054,
-       0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab,
-       0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c,
-       0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x3956, 0x2a3f, 0x2a4a,
-       0x3170, 0x3178, 0x316e, 0x316e, 0x3956, 0x3956, 0x1078, 0x248c,
-       0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x3960,
-       0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x3956,
-       0x79e4, 0xa184, 0x0030, 0x0040, 0x318a, 0x78ec, 0xa084, 0x0003,
-       0x00c0, 0x31b1, 0x7000, 0xa086, 0x0004, 0x00c0, 0x31a4, 0x706c,
-       0xa086, 0x0002, 0x00c0, 0x319a, 0x2011, 0x0002, 0x2019, 0x0000,
-       0x0078, 0x28e9, 0x706c, 0xa086, 0x0006, 0x0040, 0x3194, 0x706c,
-       0xa086, 0x0004, 0x0040, 0x3194, 0x7000, 0xa086, 0x0000, 0x0040,
-       0x24fa, 0x6818, 0xa085, 0x8000, 0x681a, 0x2001, 0x0014, 0x0078,
-       0x2da0, 0xa184, 0x0007, 0x0079, 0x31b5, 0x3956, 0x3956, 0x31bd,
-       0x3956, 0x39bb, 0x39bb, 0x3956, 0x3956, 0xa684, 0x0080, 0x0040,
-       0x31ec, 0x7194, 0x81ff, 0x0040, 0x31ec, 0xa182, 0x000d, 0x00d0,
-       0x31cd, 0x7097, 0x0000, 0x0078, 0x31d2, 0xa182, 0x000c, 0x7096,
-       0x2009, 0x000c, 0x789b, 0x0061, 0x79aa, 0x157e, 0x137e, 0x147e,
-       0x7098, 0x8114, 0xa210, 0x729a, 0xa080, 0x000b, 0xad00, 0x2098,
-       0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f,
-       0x137f, 0x157f, 0x0078, 0x3960, 0xa684, 0x0400, 0x00c0, 0x322d,
-       0x6820, 0xa084, 0x0001, 0x0040, 0x3960, 0xa68c, 0x0060, 0xa684,
-       0x0060, 0x0040, 0x3201, 0xa086, 0x0060, 0x00c0, 0x3201, 0xa18d,
-       0x4000, 0xa18c, 0xfffb, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab,
-       0x0000, 0x789b, 0x0061, 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa,
-       0x8008, 0x810c, 0x0040, 0x34d1, 0xa18c, 0x00f8, 0x00c0, 0x34d1,
-       0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000,
-       0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f,
-       0x6814, 0x8007, 0x7882, 0x0078, 0x3960, 0x6818, 0xa084, 0x8000,
-       0x0040, 0x3234, 0x681b, 0x0008, 0x781b, 0x00c0, 0x0078, 0x24fa,
-       0x2300, 0x0079, 0x323b, 0x3240, 0x32d4, 0x323e, 0x1078, 0x248c,
-       0x7000, 0xa084, 0x0007, 0x0079, 0x3245, 0x2523, 0x324f, 0x3284,
-       0x325a, 0x324d, 0x2523, 0x324d, 0x324d, 0x1078, 0x248c, 0x681c,
-       0xa084, 0x2000, 0x0040, 0x3268, 0x6008, 0xa085, 0x0002, 0x600a,
-       0x0078, 0x3268, 0x68c0, 0xa005, 0x00c0, 0x3284, 0x6920, 0xa18d,
-       0x0001, 0x6922, 0x68c3, 0x0001, 0x6800, 0x706a, 0x0078, 0x327e,
-       0x6920, 0xa18d, 0x0001, 0x6922, 0x6800, 0x6006, 0xa005, 0x00c0,
-       0x3272, 0x6002, 0x681c, 0xa084, 0x000e, 0x0040, 0x327e, 0x7014,
-       0x68ba, 0x7130, 0xa188, 0x7500, 0x0078, 0x3280, 0x2009, 0x7600,
-       0x2104, 0x6802, 0x2d0a, 0x7162, 0x6eb6, 0xa684, 0x0060, 0x0040,
-       0x32d2, 0xa684, 0x0800, 0x00c0, 0x3298, 0xa684, 0x7fff, 0x68b6,
-       0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x4887, 0x0078, 0x32d2,
-       0xa684, 0x0020, 0x0040, 0x32ad, 0x68c0, 0xa005, 0x0040, 0x32a4,
-       0x1078, 0x4c89, 0x0078, 0x32a7, 0xa006, 0x1078, 0x4c41, 0x79d8,
-       0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x32b3, 0x1078, 0x38ca, 0x69aa,
-       0x6aa6, 0x1078, 0x4c41, 0xa684, 0x8000, 0x0040, 0x32d2, 0xa684,
-       0x7fff, 0x68b6, 0x7adc, 0x79d8, 0xa684, 0x0020, 0x00c0, 0x32ca,
-       0x78d0, 0x801b, 0x00c8, 0x32c5, 0x8000, 0xa084, 0x003f, 0xa108,
-       0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
-       0xa303, 0x68ae, 0x0078, 0x2523, 0x0078, 0x377b, 0x7037, 0x0000,
-       0xa282, 0x0006, 0x0050, 0x32de, 0x1078, 0x248c, 0x7000, 0xa084,
-       0x0007, 0x10c0, 0x3a8c, 0x2300, 0x0079, 0x32e6, 0x32e9, 0x3312,
-       0x3326, 0x2200, 0x0079, 0x32ec, 0x3310, 0x377b, 0x32f2, 0x3310,
-       0x3342, 0x3384, 0x7003, 0x0005, 0x2001, 0x7710, 0x2068, 0x704a,
-       0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3302,
-       0x0078, 0x32fb, 0x157f, 0xad80, 0x0009, 0x7036, 0x6817, 0x0000,
-       0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0078, 0x376b,
-       0x1078, 0x248c, 0x7003, 0x0005, 0x2001, 0x7710, 0x2068, 0x704a,
-       0xad80, 0x0009, 0x7036, 0x2200, 0x0079, 0x331e, 0x377b, 0x3324,
-       0x3324, 0x3342, 0x3324, 0x377b, 0x1078, 0x248c, 0x7003, 0x0005,
-       0x2001, 0x7710, 0x2068, 0x704a, 0xad80, 0x0009, 0x7036, 0x2200,
-       0x0079, 0x3332, 0x333a, 0x3338, 0x3338, 0x333a, 0x3338, 0x333a,
-       0x1078, 0x248c, 0x1078, 0x379f, 0x782b, 0x3008, 0x781b, 0x0065,
-       0x0078, 0x24fa, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
-       0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x7600, 0x2d04,
-       0x2d08, 0x7162, 0x2068, 0xa005, 0x0040, 0x335d, 0x6814, 0xa206,
-       0x0040, 0x3379, 0x6800, 0x0078, 0x3350, 0x7003, 0x0005, 0x2001,
-       0x7710, 0x2068, 0x704a, 0x7036, 0x157e, 0x20a9, 0x0031, 0x2003,
-       0x0000, 0x8000, 0x0070, 0x336e, 0x0078, 0x3367, 0x157f, 0xad80,
-       0x0009, 0x7036, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
-       0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x33d3,
-       0x1078, 0x3797, 0x0078, 0x33d3, 0x7003, 0x0002, 0x7a80, 0xa294,
-       0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8,
-       0x79a8, 0xa18c, 0x00ff, 0xa1e8, 0x7500, 0x2d04, 0x2d08, 0x7162,
-       0x2068, 0xa005, 0x0040, 0x33a3, 0x6814, 0xa206, 0x0040, 0x33be,
-       0x6800, 0x0078, 0x3396, 0x7003, 0x0005, 0x2001, 0x7710, 0x2068,
-       0x704a, 0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070,
-       0x33b3, 0x0078, 0x33ac, 0x157f, 0xad80, 0x0009, 0x7036, 0x6a16,
-       0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a,
-       0x6820, 0xa084, 0x0c00, 0x0040, 0x33d3, 0xa084, 0x0800, 0x0040,
-       0x33cd, 0x1078, 0x379b, 0x0078, 0x33d3, 0x1078, 0x3797, 0x708b,
-       0x0000, 0x0078, 0x33d3, 0x027e, 0x8207, 0xa084, 0x000f, 0x8003,
-       0x8003, 0x8003, 0xa080, 0x5480, 0x2060, 0x7056, 0x6000, 0x705a,
-       0x6004, 0x705e, 0xa684, 0x0060, 0x0040, 0x342b, 0x6b98, 0x6c94,
-       0x69ac, 0x68b0, 0xa105, 0x00c0, 0x340d, 0x7bd2, 0x7bda, 0x7cd6,
-       0x7cde, 0xa6b4, 0xb7ff, 0x7e5a, 0xa684, 0x0060, 0xa086, 0x0060,
-       0x0040, 0x342b, 0x68c0, 0xa005, 0x0040, 0x3406, 0x7003, 0x0003,
-       0x682b, 0x0000, 0x1078, 0x4b3a, 0x0078, 0x3408, 0x1078, 0x4b4b,
-       0xa6b5, 0x2000, 0x7e5a, 0x0078, 0x342b, 0x68b0, 0xa31a, 0x2100,
-       0xa423, 0x2400, 0xa305, 0x0040, 0x342b, 0x7bd2, 0x7bda, 0x7cd6,
-       0x7cde, 0x68b0, 0xa6b4, 0xbfff, 0x7e5a, 0x007e, 0x68c0, 0xa005,
-       0x007f, 0x0040, 0x3429, 0x7003, 0x0003, 0x1078, 0x4b3a, 0x0078,
-       0x342b, 0x1078, 0x4b96, 0x077f, 0x1078, 0x38bd, 0x2009, 0x0065,
-       0xa684, 0x0004, 0x0040, 0x344c, 0x78e4, 0xa084, 0x0030, 0x0040,
-       0x3444, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3444, 0x782b, 0x3008,
-       0x2009, 0x0065, 0x0078, 0x344c, 0x0f7e, 0x2079, 0x5200, 0x1078,
-       0x4887, 0x0f7f, 0x0040, 0x2523, 0x791a, 0x2d00, 0x704a, 0x8207,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x5480, 0x2048,
-       0x0078, 0x24fa, 0x6020, 0xa005, 0x0040, 0x3466, 0x8001, 0x6022,
-       0x6008, 0xa085, 0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006,
-       0x1078, 0x4887, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040,
-       0x681f, 0x0100, 0x7000, 0xa084, 0x0007, 0x0079, 0x3477, 0x2523,
-       0x3481, 0x3481, 0x349e, 0x3489, 0x3487, 0x3489, 0x347f, 0x1078,
-       0x248c, 0x1078, 0x34a9, 0x1078, 0x34a2, 0x1078, 0x1cdc, 0x0078,
-       0x2523, 0x706c, 0x706f, 0x0000, 0x7093, 0x0000, 0x0079, 0x3490,
-       0x349a, 0x349a, 0x3498, 0x3498, 0x3498, 0x349a, 0x3498, 0x349a,
-       0x0079, 0x2902, 0x706f, 0x0000, 0x0078, 0x2523, 0x681b, 0x0000,
-       0x0078, 0x2fb6, 0x6800, 0xa005, 0x00c0, 0x34a7, 0x6002, 0x6006,
-       0x007c, 0x6010, 0xa005, 0x0040, 0x34b2, 0x8001, 0x00d0, 0x34b2,
-       0x1078, 0x248c, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c,
-       0x6018, 0xa005, 0x0040, 0x34be, 0x8001, 0x601a, 0x007c, 0x1078,
-       0x39e0, 0x681b, 0x0018, 0x0078, 0x34f5, 0x1078, 0x39e0, 0x681b,
-       0x0019, 0x0078, 0x34f5, 0x1078, 0x39e0, 0x681b, 0x001a, 0x0078,
-       0x34f5, 0x1078, 0x39e0, 0x681b, 0x0003, 0x0078, 0x34f5, 0x7780,
-       0x1078, 0x38bd, 0x7184, 0xa18c, 0x00ff, 0xa1e8, 0x7500, 0x2d04,
-       0x2d08, 0x2068, 0xa005, 0x00c0, 0x34e7, 0x0078, 0x2523, 0x6814,
-       0x7280, 0xa206, 0x0040, 0x34ef, 0x6800, 0x0078, 0x34e0, 0x6800,
-       0x200a, 0x681b, 0x0005, 0x708b, 0x0000, 0x1078, 0x34a9, 0x6820,
-       0xa084, 0x0001, 0x00c0, 0x34fe, 0x1078, 0x34a2, 0x1078, 0x34b8,
-       0x681f, 0x0000, 0x6823, 0x0020, 0x1078, 0x1cdc, 0x0078, 0x2523,
-       0xa282, 0x0003, 0x00c0, 0x376b, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8,
-       0xa4a4, 0x00ff, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0100,
-       0x0040, 0x356c, 0xa18c, 0xfeff, 0x6922, 0xa4a4, 0x00ff, 0x0040,
-       0x3556, 0xa482, 0x000c, 0x0048, 0x3529, 0x0040, 0x3529, 0x2021,
-       0x000c, 0x852b, 0x852b, 0x1078, 0x382e, 0x0040, 0x3533, 0x1078,
-       0x3627, 0x0078, 0x355f, 0x1078, 0x37e9, 0x0c7e, 0x2960, 0x6004,
-       0xa084, 0xfff5, 0x6006, 0x1078, 0x3652, 0x0c7f, 0x6920, 0xa18d,
-       0x0100, 0x6922, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400,
-       0x00c0, 0x3550, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x24fa,
-       0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x24fa, 0x0c7e, 0x2960,
-       0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3652, 0x0c7f, 0x7e58,
-       0xa684, 0x0400, 0x00c0, 0x3568, 0x781b, 0x0058, 0x0078, 0x24fa,
-       0x781b, 0x0065, 0x0078, 0x24fa, 0x0c7e, 0x7054, 0x2060, 0x6100,
-       0xa18c, 0x1000, 0x0040, 0x35ac, 0x6208, 0x8217, 0xa294, 0x00ff,
-       0xa282, 0x000c, 0x0048, 0x3580, 0x0040, 0x3580, 0x2011, 0x000c,
-       0x2400, 0xa202, 0x00c8, 0x3585, 0x2220, 0x6208, 0xa294, 0x00ff,
-       0x7018, 0xa086, 0x0028, 0x00c0, 0x3595, 0xa282, 0x0019, 0x00c8,
-       0x359b, 0x2011, 0x0019, 0x0078, 0x359b, 0xa282, 0x000c, 0x00c8,
-       0x359b, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x35a0, 0x2228,
-       0x1078, 0x37ed, 0x852b, 0x852b, 0x1078, 0x382e, 0x0040, 0x35ac,
-       0x1078, 0x3627, 0x0078, 0x35b0, 0x1078, 0x37e9, 0x1078, 0x3652,
-       0x7858, 0xa085, 0x0004, 0x785a, 0x0c7f, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x24fa, 0x0c7e, 0x2960, 0x6000, 0xd0e4, 0x00c0,
-       0x35d5, 0xd0b4, 0x00c0, 0x35cf, 0x6010, 0xa084, 0x000f, 0x00c0,
-       0x35cf, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011,
-       0x0032, 0x2019, 0x0000, 0x0078, 0x35fc, 0x68a0, 0xa084, 0x0200,
-       0x00c0, 0x35cf, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028,
-       0x00c0, 0x35ea, 0xa282, 0x0019, 0x00c8, 0x35f0, 0x2011, 0x0019,
-       0x0078, 0x35f0, 0xa282, 0x000c, 0x00c8, 0x35f0, 0x2011, 0x000c,
-       0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c, 0x0048, 0x35fc,
-       0x0040, 0x35fc, 0x2019, 0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003,
-       0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085,
-       0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0xa18c, 0xfff5,
-       0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3617, 0x78ab,
-       0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0,
-       0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e,
-       0x7154, 0x2160, 0x1078, 0x362e, 0x0c7f, 0x007c, 0x2008, 0xa084,
-       0xfff0, 0xa425, 0x7c86, 0x6018, 0x789a, 0x7cae, 0x6412, 0x78a4,
-       0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016, 0x788a,
-       0xa4a4, 0x000f, 0x8427, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa405,
-       0x600e, 0x78ec, 0xd08c, 0x00c0, 0x3651, 0x6004, 0xa084, 0xfff5,
-       0x6006, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x3659, 0x0c7f,
-       0x007c, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012,
-       0x7884, 0xa084, 0xfff0, 0x7886, 0x007c, 0xa282, 0x0002, 0x00c0,
-       0x376b, 0x7aa8, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0200,
-       0x0040, 0x36ae, 0xa18c, 0xfdff, 0x6922, 0xa294, 0x00ff, 0xa282,
-       0x0002, 0x00c8, 0x376b, 0x1078, 0x36f9, 0x1078, 0x3652, 0xa980,
-       0x0001, 0x200c, 0x1078, 0x38b9, 0x1078, 0x35bb, 0x88ff, 0x0040,
-       0x36a1, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004,
-       0x7e5a, 0xa684, 0x0400, 0x00c0, 0x369b, 0x782b, 0x3008, 0x781b,
-       0x0056, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
-       0x24fa, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x36aa, 0x781b, 0x0058,
-       0x0078, 0x24fa, 0x781b, 0x0065, 0x0078, 0x24fa, 0xa282, 0x0002,
-       0x00c8, 0x36b6, 0xa284, 0x0001, 0x0040, 0x36c0, 0x7154, 0xa188,
-       0x0000, 0x210c, 0xa18c, 0x2000, 0x00c0, 0x36c0, 0x2011, 0x0000,
-       0x1078, 0x37db, 0x1078, 0x36f9, 0x1078, 0x3652, 0x7858, 0xa085,
-       0x0004, 0x785a, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x24fa,
-       0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x00c0,
-       0x36e9, 0xd0bc, 0x00c0, 0x36e7, 0x6014, 0xa084, 0x0040, 0x00c0,
-       0x36e7, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078, 0x36f6, 0x2011,
-       0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa,
-       0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200, 0x6822, 0x027f, 0x0c7f,
-       0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x3700, 0x0c7f, 0x007c,
-       0x82ff, 0x0040, 0x3705, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002,
-       0x789a, 0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6, 0x788a, 0x6016,
-       0x78ec, 0xd08c, 0x00c0, 0x3718, 0x6004, 0xa084, 0xffef, 0x6006,
-       0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x3722, 0x007f,
-       0x0078, 0x3725, 0x007f, 0x0078, 0x3767, 0xa684, 0x0020, 0x0040,
-       0x3767, 0x7888, 0xa084, 0x0040, 0x0040, 0x3767, 0x7bb8, 0xa384,
-       0x003f, 0x831b, 0x00c8, 0x3735, 0x8000, 0xa005, 0x0040, 0x374b,
-       0x831b, 0x00c8, 0x373e, 0x8001, 0x0040, 0x3763, 0xa684, 0x4000,
-       0x0040, 0x374b, 0x78b8, 0x801b, 0x00c8, 0x3747, 0x8000, 0xa084,
-       0x003f, 0x00c0, 0x3763, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc,
-       0x2001, 0x0001, 0xa108, 0x00c8, 0x3757, 0xa291, 0x0000, 0x79d2,
-       0x79da, 0x7ad6, 0x7ade, 0x1078, 0x4c41, 0x781b, 0x0064, 0x1078,
-       0x4ac6, 0x0078, 0x24fa, 0x781b, 0x0064, 0x0078, 0x24fa, 0x781b,
-       0x0065, 0x0078, 0x24fa, 0x1078, 0x37a3, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x24fa, 0x1078, 0x378f, 0x782b, 0x3008, 0x781b,
-       0x0065, 0x0078, 0x24fa, 0x6827, 0x0002, 0x1078, 0x3797, 0x78e4,
-       0xa084, 0x0030, 0x0040, 0x2523, 0x78ec, 0xa084, 0x0003, 0x0040,
-       0x2523, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x24fa, 0x2001,
-       0x0005, 0x0078, 0x37a5, 0x2001, 0x000c, 0x0078, 0x37a5, 0x2001,
-       0x0006, 0x0078, 0x37a5, 0x2001, 0x000d, 0x0078, 0x37a5, 0x2001,
-       0x0009, 0x0078, 0x37a5, 0x2001, 0x0007, 0x789b, 0x0010, 0x78aa,
-       0x789b, 0x0060, 0x78ab, 0x0001, 0xa6b5, 0x0004, 0x7e5a, 0x007c,
-       0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0,
-       0x5480, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040,
-       0x37c9, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008,
-       0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040,
-       0x37d9, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010,
-       0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab,
-       0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004,
-       0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab,
-       0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b,
-       0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff,
-       0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0,
-       0x2001, 0x5246, 0x2004, 0xa082, 0x0028, 0x0040, 0x3817, 0x2021,
-       0x38a0, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x381d, 0x2021,
-       0x38ac, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404,
-       0xa084, 0xfff0, 0xa106, 0x0040, 0x382c, 0x8420, 0x2300, 0xa210,
-       0x0070, 0x382c, 0x0078, 0x381f, 0x157f, 0x007c, 0x157e, 0x2009,
-       0x5246, 0x210c, 0xa182, 0x0032, 0x0048, 0x3842, 0x0040, 0x3846,
-       0x2009, 0x3892, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032,
-       0x0078, 0x3858, 0xa182, 0x0028, 0x0040, 0x3850, 0x2009, 0x38a0,
-       0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064, 0x0078, 0x3858,
-       0x2009, 0x38ac, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064,
-       0x2200, 0xa502, 0x0040, 0x3868, 0x0048, 0x3868, 0x8108, 0x2300,
-       0xa210, 0x0070, 0x3865, 0x0078, 0x3858, 0x157f, 0xa006, 0x007c,
-       0x157f, 0xa582, 0x0064, 0x00c8, 0x3877, 0x7808, 0xa085, 0x0070,
-       0x780a, 0x7044, 0xa085, 0x0070, 0x7046, 0x0078, 0x3877, 0x78ec,
-       0xa084, 0x0300, 0x0040, 0x387f, 0x2104, 0x0078, 0x3890, 0x2104,
-       0xa09e, 0x1102, 0x00c0, 0x3890, 0x2001, 0x04fd, 0x2004, 0xa082,
-       0x0005, 0x0048, 0x388f, 0x2001, 0x1201, 0x0078, 0x3890, 0x2104,
-       0xa005, 0x007c, 0x1102, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404,
-       0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07,
-       0x3202, 0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805,
-       0x7a05, 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202,
-       0x5404, 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04,
-       0x7f04, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800b,
-       0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0,
-       0x5500, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x38d1,
-       0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e,
-       0x2079, 0x0100, 0x2009, 0x5240, 0x2091, 0x8000, 0x2104, 0x0079,
-       0x38e1, 0x3917, 0x38eb, 0x38eb, 0x38eb, 0x38eb, 0x38eb, 0x38eb,
-       0x391b, 0x1078, 0x248c, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
-       0x00c0, 0x38ed, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0,
-       0x38f4, 0x68b4, 0xa085, 0x4000, 0x68b6, 0x7858, 0xa085, 0x4000,
-       0x785a, 0x7830, 0xa084, 0x0080, 0x00c0, 0x3917, 0x0018, 0x3917,
-       0x681c, 0xa084, 0x0020, 0x00c0, 0x3915, 0x0e7e, 0x2071, 0x5240,
-       0x1078, 0x396a, 0x0e7f, 0x0078, 0x3917, 0x781b, 0x00ca, 0x2091,
-       0x8001, 0x0f7f, 0x007c, 0x70b3, 0x0000, 0x1078, 0x3b44, 0x0078,
-       0x3917, 0x0c7e, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003,
-       0x8003, 0xa0e0, 0x5480, 0x6004, 0xa084, 0x000a, 0x00c0, 0x3954,
-       0x6108, 0xa194, 0xff00, 0x0040, 0x3954, 0xa18c, 0x00ff, 0x2001,
-       0x0019, 0xa106, 0x0040, 0x3943, 0x2001, 0x0032, 0xa106, 0x0040,
-       0x3947, 0x0078, 0x394b, 0x2009, 0x0020, 0x0078, 0x394d, 0x2009,
-       0x003f, 0x0078, 0x394d, 0x2011, 0x0000, 0x2100, 0xa205, 0x600a,
-       0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c, 0x781b, 0x0065,
-       0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x24fa,
-       0x781b, 0x0058, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x0056,
-       0x0078, 0x24fa, 0x2009, 0x5220, 0x210c, 0xa186, 0x0000, 0x0040,
-       0x397e, 0xa186, 0x0001, 0x0040, 0x3981, 0x2009, 0x5238, 0x200b,
-       0x000b, 0x706f, 0x0001, 0x781b, 0x0048, 0x007c, 0x781b, 0x00c4,
-       0x007c, 0x2009, 0x5238, 0x200b, 0x000a, 0x007c, 0x2009, 0x5220,
-       0x210c, 0xa186, 0x0000, 0x0040, 0x39a1, 0xa186, 0x0001, 0x0040,
-       0x399b, 0x2009, 0x5238, 0x200b, 0x000b, 0x706f, 0x0001, 0x781b,
-       0x0048, 0x0078, 0x24fa, 0x2009, 0x5238, 0x200b, 0x000a, 0x0078,
-       0x24fa, 0x782b, 0x3008, 0x781b, 0x00c4, 0x0078, 0x24fa, 0x781b,
-       0x00ca, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b, 0x00ca, 0x0078,
-       0x24fa, 0x781b, 0x008f, 0x0078, 0x24fa, 0x782b, 0x3008, 0x781b,
-       0x008f, 0x0078, 0x24fa, 0x6818, 0xa084, 0x8000, 0x0040, 0x39c2,
-       0x681b, 0x001d, 0x706f, 0x0001, 0x781b, 0x0048, 0x0078, 0x24fa,
-       0x007e, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x39de, 0x7808, 0xa084,
-       0xfffc, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084,
-       0x0021, 0x0040, 0x39de, 0x7044, 0x780a, 0xa005, 0x007f, 0x007c,
-       0x7044, 0xa085, 0x0002, 0x7046, 0x780a, 0x007c, 0x007e, 0x7830,
-       0xa084, 0x0040, 0x00c0, 0x39e7, 0x0098, 0x39f2, 0x007f, 0x789a,
-       0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005,
-       0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x3a01, 0x0098,
-       0x39ff, 0x007f, 0x789a, 0x78ac, 0x007e, 0x7044, 0x780a, 0x007f,
-       0x007c, 0x78ec, 0xa084, 0x0002, 0x00c0, 0x4871, 0xa784, 0x007d,
-       0x00c0, 0x3a15, 0x2700, 0x1078, 0x248c, 0xa784, 0x0001, 0x00c0,
-       0x300c, 0xa784, 0x0070, 0x0040, 0x3a25, 0x0c7e, 0x2d60, 0x2f68,
-       0x1078, 0x2437, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
-       0x3a32, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2523,
-       0x0078, 0x3956, 0xa784, 0x0004, 0x0040, 0x3a65, 0x78b8, 0xa084,
-       0x4001, 0x0040, 0x3a65, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x2523, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
-       0x3a65, 0x78c0, 0xa085, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00ca,
-       0x0078, 0x24fa, 0x784b, 0x0008, 0x6818, 0xa084, 0x8000, 0x0040,
-       0x3a61, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, 0x3a61, 0x681b,
-       0x0007, 0x1078, 0x396a, 0x0078, 0x24fa, 0x681b, 0x0003, 0x7858,
-       0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000, 0x784b,
-       0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2a06, 0x0018, 0x24fa,
-       0x0078, 0x3773, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
-       0x8003, 0xa080, 0x5480, 0x2060, 0x2048, 0x7056, 0x6000, 0x705a,
-       0x6004, 0x705e, 0x2a60, 0x007c, 0x0079, 0x3a8e, 0x3a96, 0x3a97,
-       0x3a96, 0x3a99, 0x3a96, 0x3a96, 0x3a96, 0x3a9e, 0x007c, 0x1078,
-       0x34b8, 0x1078, 0x4887, 0x7038, 0x600a, 0x007c, 0x70a0, 0xa005,
-       0x0040, 0x3aab, 0x2068, 0x1078, 0x1bd3, 0x1078, 0x47fe, 0x1078,
-       0x4805, 0x70a3, 0x0000, 0x007c, 0x0e7e, 0x2091, 0x8000, 0x2071,
-       0x5240, 0x7000, 0xa086, 0x0007, 0x00c0, 0x3ac2, 0x6110, 0x70bc,
-       0xa106, 0x00c0, 0x3ac2, 0x0e7f, 0x1078, 0x1be0, 0x1078, 0x3ac8,
-       0xa006, 0x007c, 0x2091, 0x8001, 0x0e7f, 0xa085, 0x0001, 0x007c,
-       0x0f7e, 0x0e7e, 0x2071, 0x5240, 0x0078, 0x2297, 0x785b, 0x0000,
-       0x70af, 0x000e, 0x2009, 0x0100, 0x017e, 0x70a0, 0xa06d, 0x0040,
-       0x3add, 0x70a3, 0x0000, 0x0078, 0x3ae3, 0x70b3, 0x0000, 0x1078,
-       0x1c0c, 0x0040, 0x3ae9, 0x70ac, 0x6826, 0x1078, 0x3bc6, 0x0078,
-       0x3add, 0x017f, 0x157e, 0x0c7e, 0x0d7e, 0x20a9, 0x0008, 0x2061,
-       0x7610, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d, 0x0040, 0x3b01,
-       0x6800, 0x601e, 0x1078, 0x19ac, 0x6008, 0x8000, 0x600a, 0x0078,
-       0x3af4, 0x6018, 0xa06d, 0x0040, 0x3b0b, 0x6800, 0x601a, 0x1078,
-       0x19ac, 0x0078, 0x3b01, 0xace0, 0x0008, 0x0070, 0x3b11, 0x0078,
-       0x3af1, 0x709c, 0xa084, 0x8000, 0x0040, 0x3b18, 0x1078, 0x3c44,
-       0x0d7f, 0x0c7f, 0x157f, 0x007c, 0x127e, 0x2091, 0x2300, 0x6804,
-       0xa084, 0x000f, 0x0079, 0x3b24, 0x3b34, 0x3b34, 0x3b34, 0x3b34,
-       0x3b34, 0x3b34, 0x3b36, 0x3b3c, 0x3b34, 0x3b34, 0x3b34, 0x3b34,
-       0x3b34, 0x3b3e, 0x3b34, 0x3b36, 0x1078, 0x248c, 0x1078, 0x45d3,
-       0x1078, 0x19ac, 0x0078, 0x3b42, 0x6827, 0x000b, 0x1078, 0x45d3,
-       0x1078, 0x3bc6, 0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x0098,
-       0x3b60, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3b60, 0x0d7e, 0x1078,
-       0x4812, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001, 0x0000, 0x6827,
-       0x0084, 0x1078, 0x47c7, 0x1078, 0x3bc6, 0x0d7f, 0x0078, 0x3b94,
-       0x7948, 0xa185, 0x4000, 0x784a, 0x0098, 0x3b69, 0x794a, 0x0078,
-       0x3b4e, 0x7828, 0xa086, 0x1834, 0x00c0, 0x3b72, 0xa185, 0x0004,
-       0x0078, 0x3b79, 0x7828, 0xa086, 0x1814, 0x00c0, 0x3b66, 0xa185,
-       0x000c, 0x784a, 0x789b, 0x000e, 0x78ab, 0x0002, 0x7858, 0xa084,
-       0x00ff, 0xa085, 0x0400, 0x785a, 0x70b4, 0xa080, 0x0091, 0x781a,
-       0x6827, 0x0284, 0x682c, 0x6836, 0x6830, 0x683a, 0x2009, 0x0004,
-       0x2001, 0x0000, 0x1078, 0x47c7, 0x127f, 0x007c, 0x0d7e, 0x6b14,
-       0x1078, 0x1c70, 0x0040, 0x3ba3, 0x2068, 0x6827, 0x0002, 0x1078,
-       0x3bc6, 0x0078, 0x3b98, 0x0d7f, 0x007c, 0x0d7e, 0x6b14, 0x6c28,
-       0xa4a4, 0x00ff, 0x1078, 0x1c1c, 0x0040, 0x3bb3, 0x2068, 0x6827,
-       0x0002, 0x1078, 0x3bc6, 0x0d7f, 0x007c, 0x0d7e, 0x6b14, 0xa39c,
-       0x00ff, 0x1078, 0x1c48, 0x0040, 0x3bc4, 0x2068, 0x6827, 0x0002,
-       0x1078, 0x3bc6, 0x0078, 0x3bb9, 0x0d7f, 0x007c, 0x0c7e, 0x6914,
-       0x1078, 0x3c3b, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0006, 0x0040,
-       0x3be1, 0xa186, 0x000d, 0x0040, 0x3c00, 0xa186, 0x0017, 0x00c0,
-       0x3bdd, 0x1078, 0x19ac, 0x0078, 0x3bdf, 0x1078, 0x1cde, 0x0c7f,
-       0x007c, 0x6004, 0x8001, 0x0048, 0x3bfe, 0x6006, 0x2009, 0x0000,
-       0xa684, 0x0001, 0x00c0, 0x3bee, 0xa18d, 0x8000, 0xa684, 0x0004,
-       0x0040, 0x3bf4, 0xa18d, 0x0002, 0x691e, 0x6823, 0x0000, 0x7104,
-       0x810f, 0x6818, 0xa105, 0x681a, 0x0078, 0x3bdd, 0x1078, 0x248c,
-       0x6018, 0xa005, 0x00c0, 0x3c0f, 0x6008, 0x8001, 0x0048, 0x3c0f,
-       0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078, 0x3c25, 0xac88,
-       0x0006, 0x2104, 0xa005, 0x0040, 0x3c18, 0x2008, 0x0078, 0x3c11,
-       0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x3bdf, 0x600a, 0x6018,
-       0x2068, 0x6800, 0x601a, 0x0078, 0x3c09, 0x157e, 0x137e, 0x147e,
-       0x0c7e, 0x0d7e, 0x1078, 0x1989, 0x00c0, 0x3c30, 0x1078, 0x248c,
-       0x2da0, 0x137f, 0x20a9, 0x0031, 0x53a3, 0x0c7f, 0x147f, 0x137f,
-       0x157f, 0x0078, 0x3bdd, 0xa184, 0x001f, 0x8003, 0x8003, 0x8003,
-       0xa080, 0x7610, 0x2060, 0x007c, 0x2019, 0x5251, 0x2304, 0xa085,
-       0x0001, 0x201a, 0x2019, 0x0102, 0x2304, 0xa085, 0x0001, 0x201a,
-       0x007c, 0x2019, 0x5251, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2019,
-       0x0102, 0x2304, 0xa084, 0xfffe, 0x201a, 0x007c, 0x7990, 0xa18c,
-       0xfff8, 0x7992, 0x70b4, 0xa080, 0x00d8, 0x781a, 0x0078, 0x24fa,
-       0x70a3, 0x0000, 0x7003, 0x0000, 0x7043, 0x0001, 0x7037, 0x0000,
-       0x0018, 0x24b1, 0x1078, 0x1c0c, 0x0040, 0x3c99, 0x2009, 0x520f,
-       0x200b, 0x0000, 0x68bc, 0x2060, 0x6100, 0xa184, 0x0300, 0x0040,
-       0x3c8d, 0x6827, 0x000e, 0xa084, 0x0200, 0x0040, 0x3c89, 0x6827,
-       0x0017, 0x1078, 0x3bc6, 0x0078, 0x3c68, 0x7000, 0xa086, 0x0007,
-       0x00c0, 0x3d0d, 0x2d00, 0x70a2, 0xad80, 0x000f, 0x7036, 0x0078,
-       0x3ca0, 0x7040, 0xa086, 0x0001, 0x0040, 0x2533, 0x0078, 0x24fa,
-       0x2031, 0x0000, 0x691c, 0xa184, 0x0002, 0x0040, 0x3ca9, 0xa6b5,
-       0x0004, 0xa184, 0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3da6,
-       0x2004, 0xa635, 0x6820, 0xa084, 0x0400, 0x0040, 0x3cc1, 0x789b,
-       0x0018, 0x78ab, 0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5,
-       0x5000, 0x6820, 0xa084, 0x8000, 0x0040, 0x3ccf, 0xa6b5, 0x0400,
-       0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x3cef, 0x681c,
-       0xd0fc, 0x00c0, 0x3cdd, 0xa6b5, 0x0800, 0x6820, 0xd0c4, 0x0040,
-       0x3cef, 0xa6b5, 0x4000, 0x0078, 0x3cef, 0x6820, 0xd0c4, 0x0040,
-       0x3ce5, 0xa6b5, 0x4000, 0x0078, 0x3cef, 0x789b, 0x0018, 0x78ab,
-       0x0002, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0xa684,
-       0x0200, 0x0040, 0x3d09, 0x682c, 0x78d2, 0x6830, 0x78d6, 0xa684,
-       0x0100, 0x0040, 0x3d07, 0x682c, 0xa084, 0x0001, 0x0040, 0x3d07,
-       0x7888, 0xa084, 0x0040, 0x0040, 0x3d07, 0xa6b5, 0x8000, 0x1078,
-       0x47f6, 0x7e5a, 0x6eb6, 0x0078, 0x4835, 0x1078, 0x39c8, 0x00c0,
-       0x3da0, 0x702c, 0x8004, 0x0048, 0x3d1b, 0x2019, 0x4f49, 0x1078,
-       0x2313, 0x702f, 0x0001, 0x2041, 0x0001, 0x2031, 0x1000, 0x789b,
-       0x0018, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x691c,
-       0xa184, 0x0002, 0x0040, 0x3d34, 0xa6b5, 0x0004, 0x78ab, 0x0020,
-       0x6828, 0x78aa, 0xa8c0, 0x0002, 0x681c, 0xd0f4, 0x0040, 0x3d3d,
-       0x2c50, 0x1078, 0x3a7a, 0x1078, 0x4702, 0x6820, 0xa084, 0x8000,
-       0x0040, 0x3d4b, 0xa6b5, 0x0400, 0x789b, 0x000e, 0x6824, 0x8007,
-       0x78aa, 0x0078, 0x3d52, 0x681c, 0xa084, 0x8000, 0x00c0, 0x3d52,
-       0xa6b5, 0x0800, 0x6820, 0xa084, 0x0100, 0x0040, 0x3d59, 0xa6b5,
-       0x4000, 0x681c, 0xa084, 0x00c0, 0x8003, 0x8003, 0x8007, 0xa080,
-       0x3da6, 0x2004, 0xa635, 0xa684, 0x0100, 0x0040, 0x3d73, 0x682c,
-       0xa084, 0x0001, 0x0040, 0x3d73, 0x7888, 0xa084, 0x0040, 0x0040,
-       0x3d73, 0xa6b5, 0x8000, 0x789b, 0x007e, 0x7eae, 0x6eb6, 0x6814,
-       0x8007, 0x78aa, 0x7882, 0x2810, 0x7aaa, 0x7830, 0xa084, 0x00c0,
-       0x00c0, 0x3da0, 0x0018, 0x3da0, 0x70b4, 0xa080, 0x00dd, 0x781a,
-       0x1078, 0x39e0, 0xa684, 0x0200, 0x0040, 0x3d94, 0x682c, 0x78d2,
-       0x6830, 0x78d6, 0x1078, 0x47f6, 0x2d00, 0x70a2, 0x704a, 0x6810,
-       0x70be, 0x7003, 0x0007, 0xad80, 0x000f, 0x7036, 0x0078, 0x24fa,
-       0x1078, 0x1bd3, 0x1078, 0x39e0, 0x0078, 0x24fa, 0x0000, 0x0300,
-       0x0200, 0x0000, 0x1078, 0x248c, 0x2300, 0x0079, 0x3daf, 0x3db2,
-       0x3db2, 0x3db4, 0x1078, 0x248c, 0x1078, 0x4805, 0x6924, 0xa184,
-       0x00ff, 0xa086, 0x000a, 0x0040, 0x3dc6, 0xa184, 0xff00, 0xa085,
-       0x000a, 0x6826, 0x1078, 0x1bd3, 0x0078, 0x3c68, 0x2001, 0x000a,
-       0x1078, 0x4797, 0x0078, 0x3c68, 0xa282, 0x0005, 0x0050, 0x3dd2,
-       0x1078, 0x248c, 0x7000, 0xa084, 0x0007, 0x10c0, 0x3a8c, 0x1078,
-       0x1989, 0x00c0, 0x3df4, 0x2069, 0xffff, 0xa684, 0x0004, 0x0040,
-       0x3de5, 0x2001, 0x2800, 0x0078, 0x3de7, 0x2001, 0x0800, 0x71b4,
-       0xa188, 0x0091, 0x789b, 0x000e, 0x8007, 0x78aa, 0x2031, 0x0400,
-       0x7e5a, 0x791a, 0x0078, 0x24fa, 0x6807, 0x0106, 0x680b, 0x0000,
-       0x689f, 0x0000, 0x6827, 0x0000, 0xa386, 0x0002, 0x00c0, 0x3e15,
-       0xa286, 0x0002, 0x00c0, 0x3e15, 0x78a0, 0xa005, 0x00c0, 0x3e15,
-       0xa484, 0x8000, 0x00c0, 0x3e15, 0x78e4, 0xa084, 0x0008, 0x0040,
-       0x3e15, 0xa6b5, 0x0008, 0x2019, 0x0000, 0x1078, 0x4217, 0x2d00,
-       0x70a2, 0x704a, 0x7003, 0x0007, 0x7037, 0x0000, 0x6824, 0xa084,
-       0x0080, 0x0040, 0x3e27, 0x1078, 0x42cd, 0x0078, 0x24fa, 0x2300,
-       0x0079, 0x3e2a, 0x3e2d, 0x3eae, 0x3ec7, 0x2200, 0x0079, 0x3e30,
-       0x3e35, 0x3e45, 0x3e6b, 0x3e77, 0x3e9a, 0x2029, 0x0001, 0xa026,
-       0x2011, 0x0000, 0x1078, 0x43f3, 0x0079, 0x3e3e, 0x3e43, 0x24fa,
-       0x3c68, 0x3e43, 0x3e43, 0x1078, 0x248c, 0x7990, 0xa18c, 0x0007,
-       0x00c0, 0x3e4c, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684, 0x0004,
-       0x0040, 0x3e54, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011, 0x0001,
-       0x1078, 0x43f3, 0x0079, 0x3e5c, 0x3e61, 0x24fa, 0x3c68, 0x3e69,
-       0x3e63, 0x0078, 0x483b, 0x70ab, 0x3e67, 0x0078, 0x24fa, 0x0078,
-       0x3e61, 0x1078, 0x248c, 0xa684, 0x0010, 0x0040, 0x3e75, 0x1078,
-       0x429c, 0x0040, 0x3e75, 0x0078, 0x24fa, 0x0078, 0x430d, 0x6000,
-       0xa084, 0x0002, 0x0040, 0x3e94, 0x70b4, 0xa080, 0x00cd, 0x781a,
-       0x0d7e, 0x1078, 0x4812, 0x2d00, 0x682e, 0x6827, 0x0000, 0x1078,
-       0x3bc6, 0x0d7f, 0x1078, 0x19ac, 0x7003, 0x0000, 0x7037, 0x0000,
-       0x704b, 0x0000, 0x0078, 0x3c68, 0xa684, 0x0004, 0x00c0, 0x3e9a,
-       0x0078, 0x483b, 0x6000, 0xa084, 0x0004, 0x00c0, 0x3eac, 0x6000,
-       0xa084, 0x0001, 0x0040, 0x3eac, 0x70ab, 0x3eac, 0x2001, 0x0007,
-       0x1078, 0x478f, 0x0078, 0x4841, 0x0078, 0x483b, 0x2200, 0x0079,
-       0x3eb1, 0x3eb6, 0x3eb8, 0x3eb6, 0x3eb6, 0x3eb6, 0x1078, 0x248c,
-       0x70a7, 0x3ebc, 0x0078, 0x4847, 0x78e4, 0xa084, 0x0008, 0x00c0,
-       0x3eb8, 0x1078, 0x4781, 0x70ab, 0x3ec5, 0x0078, 0x483b, 0x2200,
-       0x0079, 0x3eca, 0x3ecf, 0x3ed1, 0x3ed1, 0x3ecf, 0x3ecf, 0x1078,
-       0x248c, 0x78e4, 0xa084, 0x0008, 0x0040, 0x3ee6, 0x70a7, 0x3eda,
-       0x0078, 0x4847, 0x2011, 0x0004, 0x1078, 0x43ed, 0x0079, 0x3ee0,
-       0x3ee6, 0x24fa, 0x3c68, 0x3ee6, 0x3ef0, 0x3ef4, 0x70ab, 0x3eee,
-       0x2001, 0x0003, 0x1078, 0x478f, 0x0078, 0x4841, 0x0078, 0x483b,
-       0x70ab, 0x3ee6, 0x0078, 0x24fa, 0x70ab, 0x3ef8, 0x0078, 0x24fa,
-       0x0078, 0x3eee, 0xa282, 0x0003, 0x0050, 0x3f00, 0x1078, 0x248c,
-       0xa386, 0x0002, 0x00c0, 0x3f19, 0xa286, 0x0002, 0x00c0, 0x3f1f,
-       0x78a0, 0xa005, 0x00c0, 0x3f1f, 0xa484, 0x8000, 0x00c0, 0x3f1f,
-       0x78e4, 0xa084, 0x0008, 0x0040, 0x3f19, 0xa6b5, 0x0008, 0x2019,
-       0x0000, 0xa684, 0x0008, 0x0040, 0x3f1f, 0x1078, 0x4279, 0x6810,
-       0x70be, 0x7003, 0x0007, 0x2300, 0x0079, 0x3f26, 0x3f29, 0x3f56,
-       0x3f5e, 0x2200, 0x0079, 0x3f2c, 0x3f31, 0x3f2f, 0x3f4a, 0x1078,
-       0x248c, 0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001, 0x1078,
-       0x43f3, 0x0079, 0x3f3b, 0x3f40, 0x24fa, 0x3c68, 0x3f48, 0x3f42,
-       0x0078, 0x483b, 0x70ab, 0x3f46, 0x0078, 0x24fa, 0x0078, 0x3f40,
-       0x1078, 0x248c, 0xa684, 0x0010, 0x0040, 0x3f54, 0x1078, 0x429c,
-       0x0040, 0x3f54, 0x0078, 0x24fa, 0x0078, 0x430d, 0x2200, 0x0079,
-       0x3f59, 0x3f5c, 0x3f5c, 0x3f5c, 0x1078, 0x248c, 0x2200, 0x0079,
-       0x3f61, 0x3f64, 0x3f66, 0x3f66, 0x1078, 0x248c, 0x78e4, 0xa084,
-       0x0008, 0x0040, 0x3f7b, 0x70a7, 0x3f6f, 0x0078, 0x4847, 0x2011,
-       0x0004, 0x1078, 0x43ed, 0x0079, 0x3f75, 0x3f7b, 0x24fa, 0x3c68,
-       0x3f7b, 0x3f85, 0x3f89, 0x70ab, 0x3f83, 0x2001, 0x0003, 0x1078,
-       0x478f, 0x0078, 0x4841, 0x0078, 0x483b, 0x70ab, 0x3f7b, 0x0078,
-       0x24fa, 0x70ab, 0x3f8d, 0x0078, 0x24fa, 0x0078, 0x3f83, 0x2300,
-       0x0079, 0x3f92, 0x3f97, 0x3f99, 0x3f95, 0x1078, 0x248c, 0x70a4,
-       0x007a, 0x70a4, 0x007a, 0xa282, 0x0002, 0x0050, 0x3fa1, 0x1078,
-       0x248c, 0xa684, 0x0200, 0x0040, 0x3fab, 0x1078, 0x47fe, 0x1078,
-       0x43d5, 0x1078, 0x4805, 0x2300, 0x0079, 0x3fae, 0x3fb1, 0x3fd9,
-       0x403f, 0xad86, 0xffff, 0x0040, 0x3c68, 0xa286, 0x0001, 0x0040,
-       0x3fbb, 0x1078, 0x248c, 0xa684, 0x0200, 0x0040, 0x3fc3, 0x1078,
-       0x47fe, 0x1078, 0x4805, 0x2001, 0x0001, 0x1078, 0x4797, 0x78b8,
-       0xa084, 0xc001, 0x0040, 0x3fd5, 0x7848, 0xa085, 0x0008, 0x784a,
-       0x7848, 0xa084, 0x0008, 0x00c0, 0x3fd0, 0x7003, 0x0000, 0x0078,
-       0x3c68, 0x2200, 0x0079, 0x3fdc, 0x3fde, 0x400f, 0x70a7, 0x3fe2,
-       0x0078, 0x4847, 0x2011, 0x000d, 0x1078, 0x43ed, 0x0079, 0x3fe8,
-       0x3fef, 0x24fa, 0x3c68, 0x3ff7, 0x3fff, 0x4005, 0x4007, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0x70ab,
-       0x4003, 0x0078, 0x24fa, 0x0078, 0x3fef, 0x1078, 0x248c, 0x70ab,
-       0x400b, 0x0078, 0x24fa, 0x1078, 0x484d, 0x0078, 0x24fa, 0x70a7,
-       0x4013, 0x0078, 0x4847, 0x2011, 0x0012, 0x1078, 0x43ed, 0x0079,
-       0x4019, 0x401f, 0x24fa, 0x3c68, 0x402b, 0x4033, 0x4039, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x70b4, 0xa080, 0x00aa,
-       0x781a, 0x0078, 0x24fa, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6,
-       0x7e5a, 0x0078, 0x4835, 0x70ab, 0x4037, 0x0078, 0x24fa, 0x0078,
-       0x401f, 0x70ab, 0x403d, 0x0078, 0x24fa, 0x0078, 0x402b, 0xa286,
-       0x0001, 0x0040, 0x4045, 0x1078, 0x248c, 0x70a7, 0x4049, 0x0078,
-       0x4847, 0x2011, 0x0015, 0x1078, 0x43ed, 0x0079, 0x404f, 0x4054,
-       0x24fa, 0x3c68, 0x4062, 0x406e, 0xa6b4, 0x00ff, 0xa6b5, 0x0400,
-       0x6eb6, 0x7e5a, 0x783b, 0x1301, 0x70b4, 0xa080, 0x00b5, 0x781a,
-       0x0078, 0x24fa, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
-       0x70b4, 0xa080, 0x00aa, 0x781a, 0x0078, 0x24fa, 0x70ab, 0x4072,
-       0x0078, 0x24fa, 0x0078, 0x4054, 0xa282, 0x0003, 0x0050, 0x407a,
-       0x1078, 0x248c, 0x2300, 0x0079, 0x407d, 0x4080, 0x40b7, 0x4114,
-       0xa286, 0x0001, 0x0040, 0x4086, 0x1078, 0x248c, 0x6804, 0xa084,
-       0x00ff, 0xa086, 0x0006, 0x00c0, 0x4093, 0x1078, 0x3bc6, 0x7003,
-       0x0000, 0x0078, 0x3c68, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684,
-       0x0200, 0x0040, 0x40a1, 0x1078, 0x47fe, 0x1078, 0x43d5, 0x1078,
-       0x4805, 0x2001, 0x0001, 0x1078, 0x4797, 0x78b8, 0xa084, 0xc001,
-       0x0040, 0x40b3, 0x7848, 0xa085, 0x0008, 0x784a, 0x7848, 0xa084,
-       0x0008, 0x00c0, 0x40ae, 0x7003, 0x0000, 0x0078, 0x3c68, 0x2200,
-       0x0079, 0x40ba, 0x40bc, 0x40ef, 0x70a7, 0x40c0, 0x0078, 0x4847,
-       0x2011, 0x000d, 0x1078, 0x43ed, 0x0079, 0x40c6, 0x40cd, 0x24fa,
-       0x3c68, 0x40d5, 0x40dd, 0x40e3, 0x40e5, 0xa6b4, 0x00ff, 0xa6b5,
-       0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0xa6b4, 0x00ff, 0xa6b5,
-       0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0x70ab, 0x40e1, 0x0078,
-       0x24fa, 0x0078, 0x40cd, 0x1078, 0x248c, 0x70ab, 0x40eb, 0x1078,
-       0x4805, 0x0078, 0x24fa, 0x1078, 0x484d, 0x0078, 0x24fa, 0x70a7,
-       0x40f3, 0x0078, 0x4847, 0x2011, 0x0005, 0x1078, 0x43ed, 0x0079,
-       0x40f9, 0x40fe, 0x24fa, 0x3c68, 0x4106, 0x410e, 0xa6b4, 0x00ff,
-       0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0xa6b4, 0x00ff,
-       0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0x70ab, 0x4112,
-       0x0078, 0x24fa, 0x0078, 0x40fe, 0xa286, 0x0001, 0x0040, 0x411a,
-       0x1078, 0x248c, 0x70a7, 0x411e, 0x0078, 0x4847, 0x2011, 0x0006,
-       0x1078, 0x43ed, 0x0079, 0x4124, 0x4129, 0x24fa, 0x3c68, 0x412f,
-       0x4139, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4835, 0xa6b4,
-       0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0xa6b5, 0x4000, 0x7e5a, 0x0078,
-       0x4835, 0x70ab, 0x413d, 0x0078, 0x24fa, 0x0078, 0x4129, 0x2300,
-       0x0079, 0x4142, 0x4147, 0x4145, 0x4145, 0x1078, 0x248c, 0x1078,
-       0x248c, 0x2300, 0x71a8, 0xa005, 0x017a, 0x6810, 0x70be, 0xa282,
-       0x0003, 0x0050, 0x4155, 0x1078, 0x248c, 0x2300, 0x0079, 0x4158,
-       0x415b, 0x4169, 0x418b, 0xa684, 0x0200, 0x0040, 0x4163, 0x1078,
-       0x47fe, 0x1078, 0x4805, 0x2001, 0x0001, 0x1078, 0x4797, 0x0078,
-       0x24fa, 0xa296, 0x0002, 0x0040, 0x4172, 0x82ff, 0x0040, 0x4172,
-       0x1078, 0x248c, 0x70a7, 0x4176, 0x0078, 0x4847, 0x2011, 0x0018,
-       0x1078, 0x43ed, 0x0079, 0x417c, 0x4181, 0x24fa, 0x3c68, 0x4183,
-       0x4185, 0x0078, 0x4835, 0x0078, 0x4835, 0x70ab, 0x4189, 0x0078,
-       0x24fa, 0x0078, 0x4181, 0x2200, 0x0079, 0x418e, 0x4190, 0x41a9,
-       0x70a7, 0x4194, 0x0078, 0x4847, 0x2011, 0x0017, 0x1078, 0x43ed,
-       0x0079, 0x419a, 0x419f, 0x24fa, 0x3c68, 0x41a1, 0x41a3, 0x0078,
-       0x4835, 0x0078, 0x4835, 0x70ab, 0x41a7, 0x0078, 0x24fa, 0x0078,
-       0x419f, 0xa484, 0x8000, 0x00c0, 0x4205, 0xa684, 0x0100, 0x0040,
-       0x41b5, 0x1078, 0x47fe, 0x1078, 0x43d5, 0x78d8, 0x78d2, 0x78dc,
-       0x78d6, 0xa6b4, 0xefff, 0x7e5a, 0x70a7, 0x41c0, 0x0078, 0x4847,
-       0x2011, 0x000d, 0x1078, 0x43ed, 0x0079, 0x41c6, 0x41cd, 0x24fa,
-       0x3c68, 0x41cd, 0x41f3, 0x41f9, 0x41fb, 0x78d8, 0x79dc, 0xa105,
-       0x00c0, 0x41df, 0x78b8, 0xa084, 0x001f, 0x00c0, 0x41df, 0x70b3,
-       0x0000, 0x7858, 0xa084, 0xfdff, 0x785a, 0x0078, 0x4835, 0xa684,
-       0x0100, 0x0040, 0x41f1, 0x7848, 0xa085, 0x0008, 0x784a, 0x1078,
-       0x47bc, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x70b3, 0x0000, 0x1078,
-       0x47f6, 0x0078, 0x4835, 0x70ab, 0x41f7, 0x0078, 0x24fa, 0x0078,
-       0x41cd, 0x1078, 0x248c, 0x70ab, 0x4201, 0x1078, 0x4805, 0x0078,
-       0x24fa, 0x1078, 0x484d, 0x0078, 0x24fa, 0x1078, 0x4805, 0x70ab,
-       0x420f, 0x2001, 0x0003, 0x1078, 0x478f, 0x0078, 0x4841, 0x1078,
-       0x47f6, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x0078, 0x4835, 0x70b8,
-       0x6812, 0x70be, 0x8000, 0x70ba, 0x681b, 0x0000, 0xa684, 0x0008,
-       0x0040, 0x423a, 0x157e, 0x137e, 0x147e, 0x7890, 0x8004, 0x8004,
-       0x8004, 0x8004, 0xa084, 0x000f, 0x681a, 0x80ac, 0x789b, 0x0000,
-       0xaf80, 0x002b, 0x2098, 0xad80, 0x000b, 0x20a0, 0x53a5, 0x147f,
-       0x137f, 0x157f, 0xa6c4, 0x0f00, 0xa684, 0x0002, 0x00c0, 0x4249,
-       0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007, 0x2008, 0x0078,
-       0x425c, 0x789b, 0x0010, 0x79ac, 0xa184, 0x0020, 0x0040, 0x425c,
-       0x017e, 0x2009, 0x0005, 0x2001, 0x3d00, 0x1078, 0x47c7, 0x6824,
-       0xa085, 0x003b, 0x6826, 0x017f, 0xa184, 0x001f, 0xa805, 0x6816,
-       0x1078, 0x3c3b, 0x68be, 0xa684, 0x0004, 0x0040, 0x426d, 0xa18c,
-       0xff00, 0x78a8, 0xa084, 0x00ff, 0xa105, 0x682a, 0xa6b4, 0x00ff,
-       0x6000, 0xa084, 0x0008, 0x0040, 0x4277, 0xa6b5, 0x4000, 0x6eb6,
-       0x007c, 0x157e, 0x137e, 0x147e, 0x6918, 0x7890, 0x8004, 0x8004,
-       0x8004, 0x8004, 0xa084, 0x000f, 0x007e, 0xa100, 0x681a, 0x007f,
-       0x8000, 0x8004, 0x0040, 0x4298, 0x20a8, 0x8104, 0xa080, 0x000b,
-       0xad00, 0x20a0, 0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0x53a5,
-       0x147f, 0x137f, 0x157f, 0x007c, 0x682c, 0xa084, 0x0020, 0x00c0,
-       0x42a4, 0x620c, 0x0078, 0x42a5, 0x6210, 0x6b18, 0x2300, 0xa202,
-       0x0040, 0x42c5, 0x2018, 0xa382, 0x000e, 0x0048, 0x42b5, 0x0040,
-       0x42b5, 0x2019, 0x000e, 0x0078, 0x42b9, 0x7858, 0xa084, 0xffef,
-       0x785a, 0x783b, 0x1b01, 0x7893, 0x0000, 0x7ba2, 0x70b4, 0xa080,
-       0x008e, 0x781a, 0xa085, 0x0001, 0x007c, 0x7858, 0xa084, 0xffef,
-       0x785a, 0x7893, 0x0000, 0xa006, 0x007c, 0x6904, 0xa18c, 0x00ff,
-       0xa196, 0x0007, 0x0040, 0x42da, 0xa196, 0x000f, 0x0040, 0x42da,
-       0x6807, 0x0117, 0x6914, 0x1078, 0x3c3b, 0x6100, 0x8104, 0x00c8,
-       0x42f5, 0x601c, 0xa005, 0x0040, 0x42e9, 0x2001, 0x0800, 0x0078,
-       0x42f7, 0x0d7e, 0x6824, 0x007e, 0x1078, 0x4812, 0x007f, 0x6826,
-       0x2d00, 0x682e, 0x1078, 0x3bc6, 0x0d7f, 0x2001, 0x0200, 0x6924,
-       0xa18c, 0x00ff, 0xa10d, 0x6926, 0x8007, 0x789b, 0x000e, 0x78aa,
-       0x6820, 0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a,
-       0x71b4, 0xa188, 0x0091, 0x791a, 0x007c, 0xa6c4, 0x0f00, 0xa684,
-       0x0002, 0x00c0, 0x4321, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184,
-       0x0007, 0x2008, 0xa805, 0x6816, 0x1078, 0x3c3b, 0x68be, 0x0078,
-       0x4324, 0x6914, 0x1078, 0x3c3b, 0x6100, 0x8104, 0x00c8, 0x4382,
-       0xa184, 0x0300, 0x0040, 0x4330, 0x6807, 0x0117, 0x0078, 0x434e,
-       0x6004, 0xa005, 0x00c0, 0x4357, 0x6807, 0x0117, 0x601c, 0xa005,
-       0x00c0, 0x4344, 0x0d7e, 0x1078, 0x4812, 0x6827, 0x0034, 0x2d00,
-       0x682e, 0x1078, 0x3bc6, 0x0d7f, 0xa684, 0x0004, 0x0040, 0x434e,
-       0x2031, 0x0400, 0x2001, 0x2800, 0x0078, 0x4352, 0x2031, 0x0400,
-       0x2001, 0x0800, 0x71b4, 0xa188, 0x0091, 0x0078, 0x43b0, 0x6018,
-       0xa005, 0x00c0, 0x4344, 0x601c, 0xa005, 0x00c0, 0x4344, 0x689f,
-       0x0000, 0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x43be, 0xd694,
-       0x00c0, 0x437b, 0x6100, 0xd1d4, 0x0040, 0x437b, 0x692c, 0xa18c,
-       0x00ff, 0x0040, 0x43be, 0xa186, 0x0003, 0x0040, 0x43be, 0xa186,
-       0x0012, 0x0040, 0x43be, 0xa6b5, 0x0800, 0x71b4, 0xa188, 0x00ae,
-       0x0078, 0x43b9, 0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c,
-       0x00ff, 0xa186, 0x0012, 0x00c0, 0x4393, 0x2001, 0x43cb, 0x2009,
-       0x0001, 0x0078, 0x43a4, 0xa186, 0x0003, 0x00c0, 0x439d, 0x2001,
-       0x43cc, 0x2009, 0x0012, 0x0078, 0x43a4, 0x2001, 0x0200, 0x71b4,
-       0xa188, 0x0091, 0x0078, 0x43b0, 0x1078, 0x47e1, 0x78a3, 0x0000,
-       0x681c, 0xa085, 0x0040, 0x681e, 0x71b4, 0xa188, 0x00da, 0xa006,
-       0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000,
-       0x6822, 0x6eb6, 0x7e5a, 0x791a, 0x0078, 0x24fa, 0x6eb6, 0x1078,
-       0x3bc6, 0x6810, 0x70be, 0x7003, 0x0007, 0x70a3, 0x0000, 0x704b,
-       0x0000, 0x0078, 0x24fa, 0x0023, 0x0070, 0x0005, 0x0000, 0x0a00,
-       0x0000, 0x0000, 0x0025, 0x0000, 0x0000, 0x683b, 0x0000, 0x6837,
-       0x0000, 0xa684, 0x0200, 0x0040, 0x43ec, 0x78b8, 0xa08c, 0x001f,
-       0xa084, 0x8000, 0x0040, 0x43e5, 0x8108, 0x78d8, 0xa100, 0x6836,
-       0x78dc, 0xa081, 0x0000, 0x683a, 0x007c, 0x7990, 0x810f, 0xa5ac,
-       0x0007, 0x2021, 0x0000, 0xa480, 0x0010, 0x789a, 0x79a8, 0xa18c,
-       0x00ff, 0xa184, 0x0080, 0x00c0, 0x441b, 0xa182, 0x0020, 0x00c8,
-       0x4439, 0xa182, 0x0012, 0x00c8, 0x4781, 0x2100, 0x1079, 0x4409,
-       0x007c, 0x4781, 0x45eb, 0x4781, 0x4781, 0x4446, 0x4449, 0x4483,
-       0x44b9, 0x44ed, 0x44f0, 0x4781, 0x4781, 0x44a4, 0x4514, 0x454e,
-       0x4781, 0x4781, 0x4574, 0xa184, 0x0020, 0x00c0, 0x45a8, 0xa18c,
-       0x001f, 0x6814, 0xa084, 0x001f, 0xa106, 0x0040, 0x4436, 0x70b4,
-       0xa080, 0x00cd, 0x781a, 0x2001, 0x0014, 0x1078, 0x4797, 0x1078,
-       0x4805, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000,
-       0x007c, 0xa182, 0x0024, 0x00c8, 0x4781, 0xa184, 0x0003, 0x1079,
-       0x4409, 0x007c, 0x4781, 0x4781, 0x4781, 0x4781, 0x1078, 0x4781,
-       0x007c, 0x2200, 0x0079, 0x444c, 0x4577, 0x4577, 0x4470, 0x4470,
-       0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x446e, 0x4470,
-       0x4465, 0x4470, 0x4470, 0x4470, 0x4470, 0x4470, 0x4478, 0x447b,
-       0x4577, 0x447b, 0x4470, 0x4470, 0x4470, 0x0c7e, 0x077e, 0x6f14,
-       0x1078, 0x37b0, 0x077f, 0x0c7f, 0x0078, 0x4470, 0x1078, 0x468e,
-       0x6827, 0x02b3, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x45ab,
-       0x1078, 0x4773, 0x007c, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001,
-       0x4800, 0x0078, 0x4593, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086,
-       0x0006, 0x00c0, 0x448d, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078,
-       0x4812, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
-       0x3b96, 0x1078, 0x45d3, 0x2b68, 0x1078, 0x3bc6, 0x0d7f, 0x1078,
-       0x3bc6, 0x2001, 0x0002, 0x007c, 0x1078, 0x45d3, 0x2001, 0x0017,
-       0x1078, 0x4797, 0x70a3, 0x0000, 0x2009, 0x5238, 0x200b, 0x0006,
-       0x70af, 0x0017, 0x2009, 0x0200, 0x1078, 0x3ad4, 0x2001, 0x0001,
-       0x007c, 0x2200, 0x0079, 0x44bc, 0x4577, 0x45a8, 0x45a8, 0x45a8,
-       0x44dd, 0x45ba, 0x44e5, 0x45ba, 0x45ba, 0x45bd, 0x45bd, 0x45c2,
-       0x45c2, 0x44d5, 0x44d5, 0x45a8, 0x45a8, 0x45ba, 0x45a8, 0x44e5,
-       0x4577, 0x44e5, 0x44e5, 0x44e5, 0x44e5, 0x6827, 0x0084, 0x2009,
-       0x000b, 0x2001, 0x4300, 0x0078, 0x45cc, 0x6827, 0x000d, 0x2009,
-       0x000b, 0x2001, 0x4300, 0x0078, 0x45ab, 0x6827, 0x0093, 0x2009,
-       0x000b, 0x2001, 0x4300, 0x0078, 0x4593, 0x2001, 0x0000, 0x007c,
-       0x2200, 0x0079, 0x44f3, 0x4577, 0x450c, 0x450c, 0x450c, 0x450c,
-       0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba, 0x45ba,
-       0x450c, 0x450c, 0x450c, 0x450c, 0x45ba, 0x450c, 0x450c, 0x45ba,
-       0x45ba, 0x45ba, 0x45ba, 0x4577, 0x6827, 0x0093, 0x2009, 0x000b,
-       0x2001, 0x4300, 0x0078, 0x4593, 0xa684, 0x0004, 0x00c0, 0x4528,
-       0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x4781, 0x1078,
-       0x45d3, 0x6807, 0x0117, 0x1078, 0x3bc6, 0x2001, 0x0002, 0x007c,
-       0x6000, 0xa084, 0x0004, 0x0040, 0x4781, 0x2d58, 0x6804, 0xa084,
-       0x00ff, 0xa086, 0x0006, 0x00c0, 0x4537, 0x6807, 0x0117, 0x6827,
-       0x0002, 0x1078, 0x4812, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e,
-       0x0d7e, 0x1078, 0x3ba5, 0x1078, 0x45d3, 0x2b68, 0x1078, 0x3bc6,
-       0x0d7f, 0x1078, 0x3bc6, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084,
-       0x0004, 0x0040, 0x4781, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006,
-       0x00c0, 0x455c, 0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078,
-       0x4812, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
-       0x3bb5, 0x1078, 0x45d3, 0x2b68, 0x1078, 0x3bc6, 0x0d7f, 0x1078,
-       0x3bc6, 0x2001, 0x0002, 0x007c, 0x1078, 0x4781, 0x007c, 0x70b4,
-       0xa080, 0x00cd, 0x781a, 0x2001, 0x0001, 0x1078, 0x4797, 0x1078,
-       0x4805, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x47c7,
-       0x1078, 0x47fe, 0x1078, 0x43d5, 0x1078, 0x42cd, 0x1078, 0x4805,
-       0x2001, 0x0001, 0x007c, 0x1078, 0x47c7, 0x1078, 0x47fe, 0x1078,
-       0x43d5, 0x70b4, 0xa080, 0x00cd, 0x781a, 0x2001, 0x0013, 0x1078,
-       0x4797, 0x1078, 0x4805, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c,
-       0x1078, 0x4781, 0x007c, 0x1078, 0x47c7, 0x1078, 0x47fe, 0x1078,
-       0x43d5, 0x1078, 0x42cd, 0x1078, 0x4805, 0x1078, 0x484d, 0x2001,
-       0x0001, 0x007c, 0x2001, 0x0003, 0x007c, 0x1078, 0x468e, 0x2001,
-       0x0000, 0x007c, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x37b0, 0x077f,
-       0x0c7f, 0x2001, 0x0000, 0x007c, 0x1078, 0x47c7, 0x1078, 0x4781,
-       0x2001, 0x0006, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
-       0x0040, 0x45de, 0xa186, 0x000f, 0x00c0, 0x45e2, 0x1078, 0x47fe,
-       0x1078, 0x43d5, 0x70b4, 0xa080, 0x00cd, 0x781a, 0x1078, 0x4805,
-       0x7003, 0x0000, 0x007c, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084,
-       0x00ff, 0xa08a, 0x0004, 0x00c8, 0x4781, 0x1079, 0x45f8, 0x007c,
-       0x4781, 0x45fc, 0x4781, 0x4695, 0xa282, 0x0003, 0x0040, 0x4603,
-       0x1078, 0x4781, 0x007c, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4,
-       0x00ff, 0x69b8, 0xa184, 0x0100, 0x0040, 0x4642, 0xa18c, 0xfeff,
-       0x69ba, 0x78a0, 0xa005, 0x00c0, 0x4642, 0xa4a4, 0x00ff, 0x0040,
-       0x4636, 0xa482, 0x000c, 0x0040, 0x461f, 0x00c8, 0x4629, 0x852b,
-       0x852b, 0x1078, 0x382e, 0x0040, 0x4629, 0x1078, 0x3627, 0x0078,
-       0x4638, 0x1078, 0x4760, 0x1078, 0x3652, 0x69b8, 0xa18d, 0x0100,
-       0x69ba, 0xa6b5, 0x1000, 0x7e5a, 0x0078, 0x463b, 0x1078, 0x3652,
-       0xa6b4, 0xefff, 0x7e5a, 0x70b4, 0xa080, 0x0091, 0x781a, 0x2001,
-       0x0001, 0x007c, 0x0c7e, 0x1078, 0x4682, 0x6200, 0xd2e4, 0x0040,
-       0x4673, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048,
-       0x4655, 0x0040, 0x4655, 0x2011, 0x000c, 0x2400, 0xa202, 0x00c8,
-       0x465a, 0x2220, 0x6208, 0xa294, 0x00ff, 0x701c, 0xa202, 0x00c8,
-       0x4662, 0x721c, 0x2200, 0xa502, 0x00c8, 0x4667, 0x2228, 0x1078,
-       0x4764, 0x852b, 0x852b, 0x1078, 0x382e, 0x0040, 0x4673, 0x1078,
-       0x362e, 0x0078, 0x4677, 0x1078, 0x4760, 0x1078, 0x3659, 0xa6b5,
-       0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9, 0x781a, 0x2001, 0x0004,
-       0x0c7f, 0x007c, 0x007e, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003,
-       0x8003, 0x8003, 0xa0e0, 0x5480, 0x007f, 0x007c, 0x0c7e, 0x1078,
-       0x4682, 0x1078, 0x3659, 0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0,
-       0x4781, 0x7aa8, 0xa294, 0x00ff, 0x69b8, 0xa184, 0x0200, 0x0040,
-       0x46cc, 0xa18c, 0xfdff, 0x69ba, 0x78a0, 0xa005, 0x00c0, 0x46cc,
-       0xa282, 0x0002, 0x00c8, 0x376b, 0x1078, 0x472a, 0x1078, 0x36f9,
-       0x1078, 0x3652, 0xa684, 0x0100, 0x0040, 0x46c2, 0x682c, 0xa084,
-       0x0001, 0x0040, 0x46c2, 0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040,
-       0x46c2, 0xc6fd, 0xa6b5, 0x1000, 0x7e5a, 0x70b4, 0xa080, 0x0091,
-       0x781a, 0x2001, 0x0001, 0x007c, 0x0c7e, 0x1078, 0x4682, 0xa284,
-       0xfffe, 0x0040, 0x46d7, 0x2011, 0x0001, 0x0078, 0x46db, 0xa284,
-       0x0001, 0x0040, 0x46e1, 0x6100, 0xd1ec, 0x00c0, 0x46e1, 0x2011,
-       0x0000, 0x1078, 0x471c, 0x1078, 0x3700, 0x1078, 0x3659, 0xa684,
-       0x0100, 0x0040, 0x46f7, 0x682c, 0xa084, 0x0001, 0x0040, 0x46f7,
-       0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040, 0x46f7, 0xc6fd, 0xa6b5,
-       0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9, 0x781a, 0x2001, 0x0004,
-       0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6000, 0x2011, 0x0001, 0xa084,
-       0x2000, 0x00c0, 0x470d, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
-       0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x68b8, 0xa085,
-       0x0200, 0x68ba, 0x0c7f, 0x007c, 0x789b, 0x0018, 0x78ab, 0x0001,
-       0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0081, 0x78ab,
-       0x0004, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0x1000,
-       0x00c0, 0x4738, 0x2029, 0x0032, 0x2021, 0x0000, 0x0078, 0x4758,
-       0x6508, 0xa5ac, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x4748,
-       0xa582, 0x0019, 0x00c8, 0x474e, 0x2029, 0x0019, 0x0078, 0x474e,
-       0xa582, 0x000c, 0x00c8, 0x474e, 0x2029, 0x000c, 0x6408, 0x8427,
-       0xa4a4, 0x00ff, 0xa482, 0x000c, 0x0048, 0x4758, 0x2021, 0x000c,
-       0x1078, 0x4764, 0x68b8, 0xa085, 0x0100, 0x68ba, 0x0c7f, 0x007c,
-       0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0018, 0x78ab, 0x0001,
-       0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b, 0x0081,
-       0x78ab, 0x0005, 0x007c, 0x2001, 0x0003, 0x1078, 0x478f, 0xa6b5,
-       0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00b9, 0x781a, 0x2001, 0x0005,
-       0x007c, 0x2001, 0x0007, 0x1078, 0x478f, 0xa6b5, 0x1000, 0x7e5a,
-       0x70b4, 0xa080, 0x00b9, 0x781a, 0x2001, 0x0004, 0x007c, 0x789b,
-       0x0018, 0x78aa, 0x789b, 0x0081, 0x78ab, 0x0001, 0x007c, 0x6904,
-       0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x47a5, 0xa196, 0x000f,
-       0x0040, 0x47a5, 0x1078, 0x19ac, 0x007c, 0x6924, 0xa194, 0x003f,
-       0x00c0, 0x47ae, 0xa18c, 0xffc0, 0xa105, 0x6826, 0x1078, 0x3bc6,
-       0x691c, 0xa184, 0x0100, 0x0040, 0x47bb, 0x6914, 0x1078, 0x3c3b,
-       0x6204, 0x8210, 0x6206, 0x007c, 0x692c, 0x6834, 0x682e, 0xa112,
-       0x6930, 0x6838, 0x6832, 0xa11b, 0xa200, 0xa301, 0x007c, 0x0c7e,
-       0xade0, 0x0018, 0x6003, 0x0070, 0x6106, 0x600b, 0x0000, 0x600f,
-       0x0a00, 0x6013, 0x0000, 0x6017, 0x0000, 0x8007, 0x601a, 0x601f,
-       0x0000, 0x6023, 0x0000, 0x0c7f, 0x6824, 0xa085, 0x0080, 0x6826,
-       0x007c, 0x157e, 0x137e, 0x147e, 0x2098, 0xaf80, 0x002d, 0x20a0,
-       0x81ac, 0x0040, 0x47ec, 0x53a6, 0xa184, 0x0001, 0x0040, 0x47f2,
-       0x3304, 0x78be, 0x147f, 0x137f, 0x157f, 0x007c, 0x70b0, 0xa005,
-       0x10c0, 0x248c, 0x70b3, 0x8000, 0x0078, 0x4b4b, 0x71b0, 0x81ff,
-       0x0040, 0x4804, 0x1078, 0x4c41, 0x007c, 0x71b0, 0x81ff, 0x0040,
-       0x4811, 0x7848, 0xa085, 0x0008, 0x784a, 0x70b3, 0x0000, 0x1078,
-       0x4887, 0x007c, 0x0c7e, 0x0d7e, 0x1078, 0x1989, 0x00c0, 0x481a,
-       0x1078, 0x248c, 0x0c7f, 0x157e, 0x137e, 0x147e, 0x2da0, 0x2c98,
-       0x20a9, 0x0031, 0x53a3, 0x147f, 0x137f, 0x157f, 0x6807, 0x010d,
-       0x680b, 0x0000, 0x7004, 0x8007, 0x681a, 0x6823, 0x0000, 0x681f,
-       0x0000, 0x689f, 0x0000, 0x0c7f, 0x007c, 0x70b4, 0xa080, 0x0091,
-       0x781a, 0x0078, 0x24fa, 0x70b4, 0xa080, 0x0081, 0x781a, 0x0078,
-       0x24fa, 0x70b4, 0xa080, 0x00b9, 0x781a, 0x0078, 0x24fa, 0x70b4,
-       0xa080, 0x00c3, 0x781a, 0x0078, 0x24fa, 0x6904, 0xa18c, 0x00ff,
-       0xa196, 0x0007, 0x0040, 0x485a, 0xa196, 0x000f, 0x0040, 0x485a,
-       0x6807, 0x0117, 0x6824, 0xa084, 0x00ff, 0xa085, 0x0200, 0x6826,
-       0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822,
-       0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71b4, 0xa188, 0x0091, 0x791a,
-       0x007c, 0x1078, 0x4805, 0x7848, 0xa085, 0x000c, 0x784a, 0x70b4,
-       0xa080, 0x00cd, 0x781a, 0x2009, 0x000b, 0x2001, 0x4400, 0x1078,
-       0x47c7, 0x2001, 0x0013, 0x1078, 0x4797, 0x0078, 0x3c68, 0x127e,
-       0x2091, 0x2200, 0x2049, 0x4887, 0x7000, 0x7204, 0xa205, 0x720c,
-       0xa215, 0x7008, 0xa084, 0xfff7, 0xa205, 0x0040, 0x4899, 0x0078,
-       0x489e, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084,
-       0x0001, 0x00c0, 0x48cc, 0x7108, 0x8103, 0x00c8, 0x48ab, 0x1078,
-       0x49ce, 0x0078, 0x48a3, 0x700c, 0xa08c, 0x00ff, 0x0040, 0x48cc,
-       0x7004, 0x8004, 0x00c8, 0x48c3, 0x7014, 0xa005, 0x00c0, 0x48bf,
-       0x7010, 0xa005, 0x0040, 0x48c3, 0xa102, 0x00c8, 0x48a3, 0x7007,
-       0x0010, 0x0078, 0x48cc, 0x8aff, 0x0040, 0x48cc, 0x1078, 0x4c18,
-       0x00c0, 0x48c6, 0x0040, 0x48a3, 0x1078, 0x4957, 0x7003, 0x0000,
-       0x127f, 0x2000, 0x007c, 0x017e, 0x6104, 0xa18c, 0x00ff, 0xa186,
-       0x0007, 0x0040, 0x48df, 0xa18e, 0x000f, 0x00c0, 0x48e2, 0x6040,
-       0x0078, 0x48e3, 0x6428, 0x017f, 0x84ff, 0x0040, 0x490d, 0x2c70,
-       0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x491d, 0x273c, 0x87fb, 0x00c0,
-       0x48fb, 0x0048, 0x48f5, 0x1078, 0x248c, 0x609c, 0xa075, 0x0040,
-       0x490d, 0x0078, 0x48e8, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c,
-       0xa529, 0x8421, 0x0040, 0x490d, 0x8738, 0x2704, 0xa005, 0x00c0,
-       0x48fc, 0x709c, 0xa075, 0x00c0, 0x48e8, 0x007c, 0x0000, 0x0005,
-       0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003,
-       0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4912, 0x490f,
-       0x0000, 0x0000, 0x8000, 0x0000, 0x4912, 0x0000, 0x491a, 0x4917,
-       0x0000, 0x0000, 0x0000, 0x0000, 0x491a, 0x0000, 0x4915, 0x4915,
-       0x0000, 0x0000, 0x8000, 0x0000, 0x4915, 0x0000, 0x491b, 0x491b,
-       0x0000, 0x0000, 0x0000, 0x0000, 0x491b, 0x127e, 0x2091, 0x2200,
-       0x2079, 0x5200, 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002,
-       0x7003, 0x0000, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007, 0x0002,
-       0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x2049,
-       0x4957, 0x2019, 0x0000, 0x7004, 0x8004, 0x00c8, 0x49aa, 0x7007,
-       0x0012, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4961, 0xa184, 0x01e0,
-       0x0040, 0x496c, 0x1078, 0x248c, 0x2001, 0x04fd, 0x2004, 0xa082,
-       0x0005, 0x00c8, 0x4977, 0xa184, 0x4000, 0x00c0, 0x4961, 0xa19c,
-       0x300c, 0xa386, 0x2004, 0x0040, 0x4985, 0xa386, 0x0008, 0x0040,
-       0x4990, 0xa386, 0x200c, 0x00c0, 0x4961, 0x7200, 0x8204, 0x0048,
-       0x4990, 0x730c, 0xa384, 0x00ff, 0x0040, 0x4990, 0x1078, 0x248c,
-       0x7007, 0x0012, 0x7000, 0xa084, 0x0001, 0x00c0, 0x49aa, 0x7008,
-       0xa084, 0x01e0, 0x00c0, 0x49aa, 0x7310, 0x7014, 0xa305, 0x0040,
-       0x49aa, 0x710c, 0xa184, 0x0300, 0x00c0, 0x49aa, 0xa184, 0x00ff,
-       0x00c0, 0x4957, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084,
-       0x0008, 0x00c0, 0x49ae, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048,
-       0x49b3, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e,
-       0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x49ce, 0x157f,
-       0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x7500,
-       0x730c, 0xa384, 0x0300, 0x00c0, 0x49f5, 0xa184, 0x01e0, 0x00c0,
-       0x4a19, 0x7108, 0xa184, 0x01e0, 0x00c0, 0x4a19, 0x2001, 0x04fd,
-       0x2004, 0xa082, 0x0005, 0x00c8, 0x49e9, 0xa184, 0x4000, 0x00c0,
-       0x49d9, 0xa184, 0x0007, 0x0079, 0x49ed, 0x49f7, 0x4a09, 0x49f5,
-       0x4a09, 0x49f5, 0x4a55, 0x49f5, 0x4a53, 0x1078, 0x248c, 0x7004,
-       0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0, 0x4a04,
-       0x2049, 0x0000, 0x0078, 0x4a08, 0x1078, 0x4c18, 0x00c0, 0x4a04,
-       0x007c, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff,
-       0x00c0, 0x4a14, 0x0078, 0x4a18, 0x1078, 0x4c18, 0x00c0, 0x4a14,
-       0x007c, 0x7007, 0x0012, 0x7108, 0x00e0, 0x4a1c, 0x2091, 0x6000,
-       0x00e0, 0x4a20, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008,
-       0x7004, 0xa084, 0x0008, 0x00c0, 0x4a28, 0x7007, 0x0012, 0x7108,
-       0x8103, 0x0048, 0x4a2d, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0,
-       0x4a41, 0x7004, 0xa005, 0x00c0, 0x4a41, 0x700c, 0xa005, 0x0040,
-       0x4a43, 0x0078, 0x4a24, 0x2049, 0x0000, 0x1078, 0x38d7, 0x6818,
-       0xa084, 0x8000, 0x0040, 0x4a4e, 0x681b, 0x0002, 0x007c, 0x1078,
-       0x248c, 0x1078, 0x248c, 0x1078, 0x4ab1, 0x7210, 0x7114, 0x700c,
-       0xa09c, 0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x1078,
-       0x4ab1, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c,
-       0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x4a78, 0x00c8, 0x4a78,
-       0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x4a5f,
-       0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x4a84,
-       0xa7ba, 0x4917, 0x0078, 0x4a86, 0xa7ba, 0x490f, 0x007f, 0xa73d,
-       0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007, 0x0012, 0x1078,
-       0x4957, 0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, 0x4aa5, 0x609c,
-       0xa005, 0x0040, 0x4aae, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080,
-       0x491d, 0x203c, 0x87fb, 0x1040, 0x248c, 0x8a51, 0x0040, 0x4aad,
-       0x7008, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051, 0x0000,
-       0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x4ac5, 0x6000,
-       0xa064, 0x00c0, 0x4abc, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080,
-       0x492d, 0x203c, 0x87fb, 0x1040, 0x248c, 0x007c, 0x127e, 0x0d7e,
-       0x2091, 0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90,
-       0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084,
-       0x0008, 0x007f, 0x0040, 0x4ae0, 0xa0b8, 0x4917, 0x0078, 0x4ae2,
-       0xa0b8, 0x490f, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff,
-       0xa186, 0x0007, 0x0040, 0x4af0, 0xa18e, 0x000f, 0x00c0, 0x4af9,
-       0x681c, 0xa084, 0x0040, 0x0040, 0x4b00, 0xa6b5, 0x0001, 0x0078,
-       0x4b00, 0x681c, 0xa084, 0x0040, 0x0040, 0x4b00, 0xa6b5, 0x0001,
-       0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4b02, 0x2400,
-       0xa305, 0x00c0, 0x4b0d, 0x0078, 0x4b33, 0x2c58, 0x2704, 0x6104,
-       0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184,
-       0x0008, 0x0040, 0x4b23, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014,
-       0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c,
-       0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078,
-       0x4a92, 0x0078, 0x4b35, 0x1078, 0x4c18, 0x00c0, 0x4b33, 0x127f,
-       0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007,
-       0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4b41, 0x7003, 0x0008,
-       0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f,
-       0x2049, 0x4b4b, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
-       0x4b54, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186,
-       0x0007, 0x0040, 0x4b67, 0xa18e, 0x000f, 0x00c0, 0x4b72, 0x681c,
-       0xa084, 0x0040, 0x0040, 0x4b6e, 0xa6b5, 0x0001, 0x6840, 0x2050,
-       0x0078, 0x4b7b, 0x681c, 0xa084, 0x0020, 0x00c0, 0x4b79, 0xa6b5,
-       0x0001, 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8,
-       0x491d, 0x273c, 0x87fb, 0x00c0, 0x4b8f, 0x0048, 0x4b89, 0x1078,
-       0x248c, 0x689c, 0xa065, 0x0040, 0x4b93, 0x0078, 0x4b7c, 0x1078,
-       0x4c18, 0x00c0, 0x4b8f, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e,
-       0x017e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08,
-       0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040,
-       0x4bad, 0xa18e, 0x000f, 0x00c0, 0x4bb6, 0x681c, 0xa084, 0x0040,
-       0x0040, 0x4bbd, 0xa6b5, 0x0001, 0x0078, 0x4bbd, 0x681c, 0xa084,
-       0x0040, 0x0040, 0x4bbd, 0xa6b5, 0x0001, 0x2049, 0x4b96, 0x017e,
-       0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4bcb, 0xa18e,
-       0x000f, 0x00c0, 0x4bce, 0x6840, 0x0078, 0x4bcf, 0x6828, 0x017f,
-       0xa055, 0x0040, 0x4c15, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f,
-       0xa7b8, 0x491d, 0x273c, 0x87fb, 0x00c0, 0x4be9, 0x0048, 0x4be2,
-       0x1078, 0x248c, 0x709c, 0xa075, 0x2060, 0x0040, 0x4c15, 0x0078,
-       0x4bd5, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048,
-       0x4c02, 0x8a51, 0x00c0, 0x4bf6, 0x1078, 0x248c, 0x8738, 0x2704,
-       0xa005, 0x00c0, 0x4bea, 0x709c, 0xa075, 0x2060, 0x0040, 0x4c15,
-       0x0078, 0x4bd5, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908,
-       0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4c11, 0x1078,
-       0x248c, 0x2071, 0x0020, 0x0078, 0x4b00, 0x127f, 0x2000, 0x007c,
-       0x7008, 0xa084, 0x0003, 0xa086, 0x0003, 0x0040, 0x4c40, 0x2704,
-       0xac08, 0x2104, 0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104,
-       0x7012, 0x8108, 0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040,
-       0x4c37, 0x8108, 0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602,
-       0x7004, 0xa084, 0x0010, 0xa085, 0x0001, 0x7006, 0x1078, 0x4a92,
-       0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x4c41,
-       0x0d7f, 0x087f, 0x7108, 0xa184, 0x0003, 0x00c0, 0x4c6b, 0x017e,
-       0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4c5b, 0xa18e,
-       0x000f, 0x00c0, 0x4c5e, 0x6840, 0x0078, 0x4c5f, 0x6828, 0x017f,
-       0xa005, 0x0040, 0x4c79, 0x0078, 0x489e, 0x0020, 0x4c6b, 0x1078,
-       0x4a55, 0x0078, 0x4c79, 0x00a0, 0x4c72, 0x7108, 0x1078, 0x49ce,
-       0x0078, 0x4c4a, 0x7007, 0x0010, 0x00a0, 0x4c74, 0x7108, 0x1078,
-       0x49ce, 0x7008, 0xa086, 0x0008, 0x00c0, 0x4c4a, 0x7000, 0xa005,
-       0x00c0, 0x4c4a, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000,
-       0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091,
-       0x2200, 0x0d7f, 0x2049, 0x4c89, 0xad80, 0x0011, 0x20a0, 0x2099,
-       0x0031, 0x700c, 0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007,
-       0x0002, 0x7003, 0x0001, 0x0040, 0x4ca8, 0x8000, 0x80ac, 0x53a5,
-       0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4caa, 0x0c7f,
-       0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f,
-       0x2000, 0x007c, 0x2091, 0x6000, 0x2091, 0x8000, 0x78cc, 0xa005,
-       0x0040, 0x4cd1, 0x7994, 0x70d0, 0xa106, 0x00c0, 0x4cd1, 0x7804,
-       0xa005, 0x0040, 0x4cd1, 0x7807, 0x0000, 0x0068, 0x4cd1, 0x2091,
-       0x4080, 0x7820, 0x8001, 0x7822, 0x00c0, 0x4d2c, 0x7824, 0x7822,
-       0x2069, 0x5240, 0x6800, 0xa084, 0x0007, 0x0040, 0x4cef, 0xa086,
-       0x0002, 0x0040, 0x4cef, 0x6834, 0xa00d, 0x0040, 0x4cef, 0x2104,
-       0xa005, 0x0040, 0x4cef, 0x8001, 0x200a, 0x0040, 0x4dd4, 0x7848,
-       0xa005, 0x0040, 0x4cfd, 0x8001, 0x784a, 0x00c0, 0x4cfd, 0x2009,
-       0x0102, 0x6844, 0x200a, 0x1078, 0x226f, 0x6890, 0xa005, 0x0040,
-       0x4d09, 0x8001, 0x6892, 0x00c0, 0x4d09, 0x686f, 0x0000, 0x6873,
-       0x0001, 0x2061, 0x5500, 0x20a9, 0x0100, 0x2009, 0x0002, 0x6034,
-       0xa005, 0x0040, 0x4d1f, 0x8001, 0x6036, 0x00c0, 0x4d1f, 0x6010,
-       0xa005, 0x0040, 0x4d1f, 0x017e, 0x1078, 0x226f, 0x017f, 0xace0,
-       0x0010, 0x0070, 0x4d25, 0x0078, 0x4d0f, 0x8109, 0x0040, 0x4d2c,
-       0x20a9, 0x0100, 0x0078, 0x4d0f, 0x1078, 0x4d39, 0x1078, 0x4d5e,
-       0x2009, 0x5251, 0x2104, 0x2009, 0x0102, 0x200a, 0x2091, 0x8001,
-       0x007c, 0x7834, 0x8001, 0x7836, 0x00c0, 0x4d5d, 0x7838, 0x7836,
-       0x2091, 0x8000, 0x7844, 0xa005, 0x00c0, 0x4d48, 0x2001, 0x0101,
-       0x8001, 0x7846, 0xa080, 0x7500, 0x2040, 0x2004, 0xa065, 0x0040,
-       0x4d5d, 0x6024, 0xa005, 0x0040, 0x4d59, 0x8001, 0x6026, 0x0040,
-       0x4d8d, 0x6000, 0x2c40, 0x0078, 0x4d4e, 0x007c, 0x7828, 0x8001,
-       0x782a, 0x00c0, 0x4d8c, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0,
-       0x4d6b, 0x2001, 0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003,
-       0x8003, 0xa090, 0x5500, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008,
-       0x0040, 0x4d8c, 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x4d84,
-       0x8001, 0x2012, 0x00c0, 0x4d8c, 0x2304, 0xa084, 0xfff7, 0xa085,
-       0x0080, 0x201a, 0x1078, 0x226f, 0x007c, 0x2069, 0x5240, 0x6800,
-       0xa005, 0x0040, 0x4d97, 0x6848, 0xac06, 0x0040, 0x4dd4, 0x601b,
-       0x0006, 0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff,
-       0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6714, 0x6f82, 0x1078,
-       0x19c5, 0x6818, 0xa005, 0x0040, 0x4daf, 0x8001, 0x681a, 0x6808,
-       0xa084, 0xffef, 0x680a, 0x6810, 0x8001, 0x00d0, 0x4db9, 0x1078,
-       0x248c, 0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078,
-       0x1cdc, 0x2069, 0x5240, 0x7944, 0xa184, 0x0100, 0x2001, 0x0006,
-       0x686e, 0x00c0, 0x4dcf, 0x6986, 0x2001, 0x0004, 0x686e, 0x1078,
-       0x226a, 0x2091, 0x8001, 0x007c, 0x2069, 0x0100, 0x2009, 0x5240,
-       0x2104, 0xa084, 0x0007, 0x0040, 0x4e30, 0xa086, 0x0007, 0x00c0,
-       0x4dea, 0x0d7e, 0x2009, 0x5252, 0x216c, 0x1078, 0x3b1c, 0x0d7f,
-       0x0078, 0x4e30, 0x2009, 0x5252, 0x2164, 0x1078, 0x2437, 0x601b,
-       0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff,
-       0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, 0x6830,
-       0xa084, 0x0040, 0x0040, 0x4e24, 0x684b, 0x0004, 0x20a9, 0x0014,
-       0x6848, 0xa084, 0x0004, 0x0040, 0x4e11, 0x0070, 0x4e11, 0x0078,
-       0x4e08, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001,
-       0x0040, 0x4e1e, 0x0070, 0x4e1e, 0x0078, 0x4e15, 0x20a9, 0x00fa,
-       0x0070, 0x4e24, 0x0078, 0x4e20, 0x6808, 0xa084, 0xfffd, 0x680a,
-       0x681b, 0x0048, 0x2009, 0x525b, 0x200b, 0x0007, 0x784c, 0x784a,
-       0x2091, 0x8001, 0x007c, 0x2079, 0x5200, 0x1078, 0x4e5e, 0x1078,
-       0x4e42, 0x1078, 0x4e50, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b,
-       0x0000, 0x007c, 0x2019, 0x0003, 0x2011, 0x5246, 0x2204, 0xa086,
-       0x003c, 0x0040, 0x4e4d, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c,
-       0x2019, 0x0039, 0x2011, 0x5246, 0x2204, 0xa086, 0x003c, 0x0040,
-       0x4e5b, 0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971,
-       0x2011, 0x5246, 0x2204, 0xa086, 0x003c, 0x0040, 0x4e69, 0x2019,
-       0x2626, 0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c,
-       0x0020, 0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014,
-       0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0080, 0x000f, 0x0000,
-       0x0201, 0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b,
-       0xa201, 0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0x0000, 0x006c,
-       0x0002, 0x0014, 0x98cd, 0x009e, 0x0093, 0xa202, 0x8838, 0x3806,
-       0x8839, 0x20c3, 0x0864, 0x9885, 0x28c1, 0x9cae, 0xa203, 0x300c,
-       0x2846, 0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0x9865, 0x28f2,
-       0x9c91, 0x9858, 0x300c, 0x28e1, 0x9c91, 0x2802, 0xa206, 0x64c3,
-       0x282e, 0xa207, 0x64a0, 0x6de0, 0x67a0, 0x6fc0, 0x1814, 0x883b,
-       0x7824, 0x68c1, 0x7864, 0x883e, 0x9879, 0x8576, 0x8677, 0x206b,
-       0x28c1, 0x9cae, 0x2044, 0x2103, 0x20a2, 0x2081, 0x9865, 0xa209,
-       0x2901, 0x988d, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c,
-       0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704, 0x9c91, 0x0014, 0xa204,
-       0xa300, 0x3009, 0x19e2, 0xf864, 0x856e, 0x883f, 0x08e6, 0x9891,
-       0xf881, 0x988c, 0xc801, 0x0014, 0xf8c1, 0x0016, 0x85b2, 0x80f0,
-       0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241, 0x0014, 0x1de2,
-       0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008, 0x1dc1,
-       0x0016, 0x8300, 0x8160, 0x842a, 0xf041, 0x3008, 0x84a8, 0x11d6,
-       0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x8000, 0x2847,
-       0x1011, 0x98c0, 0x8000, 0xa000, 0x2802, 0x1011, 0x98c6, 0x9865,
-       0x283e, 0x1011, 0x98ca, 0xa20b, 0x0017, 0x300c, 0xa300, 0x1de2,
-       0xdb81, 0x0014, 0x0210, 0x98d7, 0x0014, 0x26e0, 0x873a, 0xfb02,
-       0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9cb3, 0x0704,
-       0x0000, 0x006c, 0x0002, 0x984f, 0x0014, 0x009e, 0x00a0, 0x0017,
-       0x60ff, 0x300c, 0x8720, 0xa211, 0x9cd0, 0x8772, 0x8837, 0x2101,
-       0x987a, 0x10d2, 0x78e2, 0x9cd3, 0x9859, 0xd984, 0xf0e2, 0xf0a1,
-       0x98cd, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f, 0x9401, 0xb520,
-       0xc802, 0x8820, 0x987a, 0x2301, 0x987a, 0x10d2, 0x78e4, 0x9cd3,
-       0x8821, 0x8820, 0x9859, 0xf123, 0xf142, 0xf101, 0x98c6, 0x10d2,
-       0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001, 0x0014, 0x6845,
-       0x0214, 0xa21b, 0x9cd0, 0x2001, 0x98c5, 0x8201, 0x1852, 0xd184,
-       0xd163, 0x8834, 0x8001, 0x988d, 0x3027, 0x84a8, 0x1a56, 0x8833,
-       0x0014, 0xa218, 0x6981, 0x9cbc, 0x6926, 0x6902, 0x1a34, 0x9899,
-       0x1a14, 0x7021, 0x0014, 0xa300, 0x6141, 0x6964, 0x8010, 0x8592,
-       0x8026, 0x84b9, 0x69e4, 0x8023, 0x16e1, 0x8001, 0x10f1, 0x6946,
-       0xa213, 0x1462, 0xa213, 0x8000, 0x16e1, 0x98b5, 0x6969, 0xa214,
-       0x61c2, 0x8002, 0x14e1, 0x8004, 0x16e1, 0x0101, 0x300a, 0x8827,
-       0x0014, 0xa217, 0x9cbc, 0x0014, 0xa300, 0x8181, 0x842a, 0x84a8,
-       0x1ce6, 0x882c, 0x0016, 0xa212, 0x9cd0, 0x10d2, 0x70e4, 0x0004,
-       0x8007, 0x9424, 0xcc1a, 0x9cd3, 0x98c5, 0x8827, 0x300a, 0x0013,
-       0x8000, 0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d, 0x0014,
-       0x878e, 0x0016, 0xa21c, 0x1035, 0x9891, 0xa210, 0xa000, 0x8010,
-       0x8592, 0x853b, 0xd044, 0x8022, 0x3807, 0x84bb, 0x98ea, 0x8021,
-       0x3807, 0x84b9, 0x300c, 0x817e, 0x872b, 0x8772, 0x9891, 0x0000,
-       0x0020, 0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014,
-       0x98e2, 0x98cd, 0x0014, 0x0014, 0x0014, 0x0080, 0x0137, 0x0000,
-       0x0201, 0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b,
-       0xa201, 0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202, 0x8838,
-       0x3806, 0x8839, 0x20c3, 0x0864, 0xa82f, 0x28c1, 0x9cae, 0xa203,
-       0x300c, 0x2846, 0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0xa804,
-       0x28f2, 0x9c91, 0xa8f4, 0x300c, 0x28e1, 0x9c91, 0x2802, 0xa206,
-       0x64c3, 0x282e, 0xa207, 0x64a0, 0x6de0, 0x67a0, 0x6fc0, 0x1814,
-       0x883b, 0x7824, 0x68c1, 0x7864, 0x883e, 0xa802, 0x8576, 0x8677,
-       0x206b, 0x28c1, 0x9cae, 0x2044, 0x2103, 0x20a2, 0x2081, 0xa8e4,
-       0xa209, 0x2901, 0xa809, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a,
-       0x883c, 0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704, 0x9c91, 0x0014,
-       0xa204, 0xa300, 0x3009, 0x19e2, 0xf864, 0x856e, 0x883f, 0x08e6,
-       0xa8f7, 0xf881, 0xa8f0, 0xc801, 0x0014, 0xf8c1, 0x0016, 0x85b2,
-       0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241, 0x0014,
-       0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008,
-       0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a, 0xf041, 0x3008, 0x84a8,
-       0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x8000,
-       0x2847, 0x1011, 0xa8fc, 0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd,
-       0xa89b, 0x283e, 0x1011, 0xa8fd, 0xa20b, 0x0017, 0x300c, 0xa300,
-       0x1de2, 0xdb81, 0x0014, 0x0210, 0xa801, 0x0014, 0x26e0, 0x873a,
-       0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9cb3,
-       0x0704, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211, 0x9d63, 0x8772,
-       0x8837, 0x2101, 0xa821, 0x10d2, 0x78e2, 0x9d66, 0xa8fc, 0xd984,
-       0xf0e2, 0xf0a1, 0xa86c, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f,
-       0x9401, 0xb520, 0xc802, 0x8820, 0xa80f, 0x2301, 0xa80d, 0x10d2,
-       0x78e4, 0x9d66, 0x8821, 0x8820, 0xa8e6, 0xf123, 0xf142, 0xf101,
-       0xa84f, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001,
-       0x0014, 0x6845, 0x0214, 0xa21b, 0x9d63, 0x2001, 0xa840, 0x8201,
-       0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0xa801, 0x3027, 0x84a8,
-       0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d4f, 0x6926, 0x6902,
-       0x1a34, 0xa801, 0x1a14, 0x7021, 0x0014, 0xa300, 0x6141, 0x6964,
-       0x8010, 0x8592, 0x8026, 0x84b9, 0x69e4, 0x8023, 0x16e1, 0x8001,
-       0x10f1, 0x6946, 0xa213, 0x1462, 0xa213, 0x8000, 0x16e1, 0xa807,
-       0x6969, 0xa214, 0x61c2, 0x8002, 0x14e1, 0x8004, 0x16e1, 0x0101,
-       0x300a, 0x8827, 0x0014, 0xa217, 0x9d4f, 0x0014, 0xa300, 0x8181,
-       0x842a, 0x84a8, 0x1ce6, 0x882c, 0x0016, 0xa212, 0x9d63, 0x10d2,
-       0x70e4, 0x0004, 0x8007, 0x9424, 0xcc1a, 0x9d66, 0xa8f8, 0x8827,
-       0x300a, 0x0013, 0x8000, 0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e,
-       0xa21d, 0x0014, 0x878e, 0x0016, 0xa21c, 0x1035, 0xa8b4, 0xa210,
-       0x3807, 0x300c, 0x817e, 0x872b, 0x8772, 0xa8ad, 0x0000, 0x0d0c
-};
-static unsigned short risc_code_length01 = 0x4158;
diff --git a/drivers/scsi/ql12160_fw.h b/drivers/scsi/ql12160_fw.h
deleted file mode 100644 (file)
index d89dac0..0000000
+++ /dev/null
@@ -1,1811 +0,0 @@
-/*****************************************************************************
- *                  QLOGIC LINUX SOFTWARE
- *
- * QLogic ISP12160 device driver for Linux 2.2.x and 2.4.x
- * Copyright (C) 2002 Qlogic Corporation (www.qlogic.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; either version 2, 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.
- *
- *****************************************************************************/
-
-/************************************************************************
- *                --- ISP12160A Initiator Firmware ---                 *
- *                           32 LUN Support                            *
- ************************************************************************/
-
-/*
- *     Firmware Version 10.04.42 (15:44 Apr 18, 2003)
- */
-
-#ifdef UNIQUE_FW_NAME
-static unsigned char fw12160i_version_str[] = {10,4,42};
-#else
-static unsigned char firmware_version[] = {10,4,42};
-#endif
-
-#ifdef UNIQUE_FW_NAME
-#define fw12160i_VERSION_STRING "10.04.42"
-#else
-#define FW_VERSION_STRING "10.04.42"
-#endif
-
-#ifdef UNIQUE_FW_NAME
-static unsigned short fw12160i_addr01 = 0x1000;
-#else
-static unsigned short risc_code_addr01 = 0x1000;
-#endif
-
-#ifdef UNIQUE_FW_NAME
-static unsigned short fw12160i_code01[] = {
-#else
-static unsigned short risc_code01[] = {
-#endif
-       0x0804, 0x1041, 0x0000, 0x36c9, 0x0000, 0x2043, 0x4f50, 0x5952,
-       0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
-       0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
-       0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
-       0x3132, 0x3136, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
-       0x6572, 0x7369, 0x6f6e, 0x2031, 0x302e, 0x3034, 0x2020, 0x2043,
-       0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
-       0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
-       0x2400, 0x20c9, 0x90ff, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001,
-       0x01ff, 0x2004, 0xd0fc, 0x1120, 0x2071, 0x0100, 0x70a0, 0x70a2,
-       0x20c1, 0x0020, 0x2089, 0x1221, 0x2071, 0x0010, 0x70c3, 0x0004,
-       0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x000a,
-       0x2001, 0x04fd, 0x2004, 0x70d6, 0x2009, 0xfeff, 0x2130, 0x2128,
-       0xa1a2, 0x4700, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
-       0xa192, 0x9100, 0x2009, 0x0000, 0x2001, 0x0032, 0x080c, 0x1e05,
-       0x2218, 0x2079, 0x4700, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
-       0x0040, 0x42a4, 0x8109, 0x1dd8, 0x2009, 0xff00, 0x3400, 0xa102,
-       0x0218, 0x0110, 0x20a8, 0x42a4, 0x781b, 0x0064, 0x7814, 0xc0cd,
-       0xc0d5, 0x7816, 0x2071, 0x0200, 0x00d6, 0x2069, 0x4740, 0x080c,
-       0x465c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1130, 0x2069, 0x4780,
-       0x2071, 0x0100, 0x080c, 0x465c, 0x7814, 0xc0d4, 0x7816, 0x00de,
-       0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800, 0xc08d, 0x7802,
-       0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002, 0x7827, 0x0002,
-       0x2009, 0x0002, 0x2069, 0x4740, 0x681b, 0x0003, 0x6823, 0x0007,
-       0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028, 0x6837, 0x0006,
-       0x6833, 0x0008, 0x683b, 0x0000, 0x8109, 0x0500, 0x68cf, 0x000a,
-       0x68bf, 0x47c0, 0x2079, 0x4700, 0x68d3, 0x762d, 0x68c3, 0x4cc0,
-       0x68c7, 0x4bc0, 0x68cb, 0x8cc0, 0x68a7, 0x8f44, 0x68ab, 0x8f49,
-       0x68af, 0x8f44, 0x68b3, 0x8f44, 0x68a3, 0x0001, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x11c8, 0x2069, 0x4780, 0x0870, 0x68cf, 0x000a,
-       0x68bf, 0x49c0, 0x68d3, 0x7839, 0x68c3, 0x6cc0, 0x68c7, 0x4c40,
-       0x68cb, 0x8dd0, 0x68a7, 0x8f49, 0x68ab, 0x8f4e, 0x68af, 0x8f49,
-       0x68b3, 0x8f49, 0x68a3, 0x0001, 0x00e6, 0x2069, 0x4bc0, 0x2071,
-       0x0200, 0x70ec, 0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120,
-       0x2019, 0x180c, 0x2021, 0x000c, 0x080c, 0x1d75, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x1188, 0x2069, 0x4c40, 0x2071, 0x0100, 0x70ec,
-       0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120, 0x2019, 0x180c,
-       0x2021, 0x000c, 0x080c, 0x1d75, 0x00ee, 0x2011, 0x0002, 0x2069,
-       0x4cc0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b,
-       0x0040, 0x7bc8, 0xa386, 0xfeff, 0x1128, 0x6817, 0x0100, 0x681f,
-       0x0064, 0x0020, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010,
-       0x1f04, 0x1135, 0x8109, 0x1d38, 0x2001, 0x01ff, 0x2004, 0xd0fc,
-       0x1128, 0x8211, 0x0118, 0x2069, 0x6cc0, 0x08d8, 0x080c, 0x22f6,
-       0x080c, 0x403d, 0x080c, 0x1b8c, 0x080c, 0x4615, 0x2091, 0x2200,
-       0x2079, 0x4700, 0x2071, 0x0050, 0x2091, 0x2400, 0x2079, 0x4700,
-       0x2071, 0x0020, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x4740,
-       0x2091, 0x2800, 0x2079, 0x0100, 0x2071, 0x4780, 0x2091, 0x2000,
-       0x2079, 0x4700, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
-       0x2071, 0x0010, 0x70c3, 0x0000, 0x1004, 0x118c, 0x70c0, 0xa086,
-       0x0002, 0x1110, 0x080c, 0x13ba, 0x2039, 0x0000, 0x080c, 0x12ab,
-       0x78ac, 0xa005, 0x1180, 0x0e04, 0x119a, 0x786c, 0xa065, 0x0110,
-       0x080c, 0x20a1, 0x080c, 0x1e26, 0x0e04, 0x11af, 0x786c, 0xa065,
-       0x0110, 0x080c, 0x20a1, 0x0e04, 0x11af, 0x2009, 0x4747, 0x2011,
-       0x4787, 0x2104, 0x220c, 0xa105, 0x0110, 0x080c, 0x1c9b, 0x2071,
-       0x4740, 0x70a0, 0xa005, 0x01e8, 0x744c, 0xa485, 0x0000, 0x01c8,
-       0x2079, 0x0200, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d, 0x2190,
-       0x080c, 0x274c, 0x2091, 0x8000, 0x2091, 0x303d, 0x0e04, 0x11d1,
-       0x2079, 0x4700, 0x786c, 0xa065, 0x0120, 0x2071, 0x0010, 0x080c,
-       0x20a1, 0x1d04, 0x11d9, 0x2079, 0x4700, 0x2071, 0x0010, 0x080c,
-       0x4429, 0x2071, 0x4780, 0x70a0, 0xa005, 0x0188, 0x704c, 0xa025,
-       0x0170, 0x2079, 0x0100, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d,
-       0x2190, 0x080c, 0x274c, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079,
-       0x4700, 0x2071, 0x0010, 0x0e04, 0x11fa, 0x786c, 0xa065, 0x0110,
-       0x080c, 0x20a1, 0x1d04, 0x118e, 0x080c, 0x4429, 0x0804, 0x118e,
-       0x3c00, 0xa084, 0x0007, 0x0002, 0x120c, 0x120c, 0x120e, 0x120e,
-       0x1213, 0x1213, 0x1218, 0x1218, 0x080c, 0x2575, 0x2091, 0x2400,
-       0x080c, 0x40d5, 0x0005, 0x2091, 0x2200, 0x080c, 0x40d5, 0x0005,
-       0x2091, 0x2200, 0x080c, 0x40d5, 0x2091, 0x2400, 0x080c, 0x40d5,
-       0x0005, 0x1241, 0x1241, 0x1242, 0x1242, 0x124d, 0x124d, 0x124d,
-       0x124d, 0x1256, 0x1256, 0x1261, 0x1261, 0x124d, 0x124d, 0x124d,
-       0x124d, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270,
-       0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270,
-       0x1270, 0x0cf8, 0x0006, 0x0106, 0x0126, 0x2091, 0x2800, 0x080c,
-       0x2592, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126,
-       0x080c, 0x1200, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106,
-       0x0126, 0x2091, 0x2600, 0x080c, 0x2592, 0x012e, 0x010e, 0x000e,
-       0x000d, 0x0006, 0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x2592,
-       0x2091, 0x2800, 0x080c, 0x2592, 0x012e, 0x010e, 0x000e, 0x000d,
-       0x0006, 0x0106, 0x0126, 0x00d6, 0x00e6, 0x00f6, 0x2079, 0x4700,
-       0x2071, 0x0200, 0x2069, 0x4740, 0x3d00, 0xd08c, 0x0130, 0x70ec,
-       0xa084, 0x1c00, 0x78e2, 0x080c, 0x465c, 0x3d00, 0xd084, 0x0150,
-       0x2069, 0x4780, 0x2071, 0x0100, 0x70ec, 0xa084, 0x1c00, 0x78e6,
-       0x080c, 0x465c, 0x080c, 0x2526, 0x00fe, 0x00ee, 0x00de, 0x012e,
-       0x010e, 0x000e, 0x000d, 0x7008, 0x800b, 0x1240, 0x7007, 0x0002,
-       0xa08c, 0x01e0, 0x1120, 0xd09c, 0x0108, 0x0887, 0x0897, 0x70c3,
-       0x4002, 0x0804, 0x13bd, 0x0e04, 0x131e, 0x2061, 0x0000, 0x6018,
-       0xd084, 0x1904, 0x131e, 0x7828, 0xa005, 0x1120, 0x0004, 0x131f,
-       0x0804, 0x131e, 0xd0fc, 0x0130, 0x0006, 0x080c, 0x1b29, 0x000e,
-       0x0150, 0x0028, 0x0006, 0x080c, 0x1b1e, 0x000e, 0x0120, 0x2001,
-       0x4007, 0x0804, 0x13bc, 0x7910, 0xd0fc, 0x1128, 0x2061, 0x4740,
-       0xc19c, 0xc7fc, 0x0020, 0x2061, 0x4780, 0xc19d, 0xc7fd, 0x6060,
-       0xa005, 0x1904, 0x131e, 0x7912, 0x607e, 0x7828, 0xc0fc, 0xa086,
-       0x0018, 0x1120, 0x00c6, 0x080c, 0x1926, 0x00ce, 0x782b, 0x0000,
-       0x6078, 0xa065, 0x01e0, 0x00c6, 0x609c, 0x080c, 0x1bf3, 0x00ce,
-       0x609f, 0x0000, 0x080c, 0x1a60, 0x2009, 0x0018, 0x6087, 0x0103,
-       0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
-       0x080c, 0x1b34, 0x000e, 0x7812, 0x1198, 0x080c, 0x1b7f, 0x7810,
-       0xd09c, 0x1118, 0x2061, 0x4740, 0x0020, 0x2061, 0x4780, 0xc09c,
-       0x7812, 0x607b, 0x0000, 0x60d0, 0xd0c4, 0x0130, 0xc0c4, 0x60d2,
-       0x2001, 0x4005, 0x0804, 0x13bc, 0x0804, 0x13ba, 0x0005, 0xa006,
-       0x70c2, 0x70c6, 0x70ca, 0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a,
-       0x0040, 0x1a04, 0x136c, 0x0002, 0x13ba, 0x1408, 0x13d6, 0x143c,
-       0x1470, 0x1470, 0x13ce, 0x1a78, 0x147a, 0x13c8, 0x13da, 0x13db,
-       0x13dc, 0x13dd, 0x1a7c, 0x13c8, 0x1487, 0x14db, 0x1941, 0x1a72,
-       0x13de, 0x17c8, 0x17fe, 0x1830, 0x1876, 0x1785, 0x1792, 0x17a5,
-       0x17b7, 0x15bf, 0x13c8, 0x150d, 0x1518, 0x1526, 0x1534, 0x154b,
-       0x1559, 0x155c, 0x156e, 0x157c, 0x1586, 0x15a5, 0x15b1, 0x13c8,
-       0x13c8, 0x13c8, 0x13c8, 0x15cc, 0x15dd, 0x15f7, 0x162b, 0x1654,
-       0x1666, 0x1669, 0x1693, 0x16cc, 0x16de, 0x1753, 0x1763, 0x13c8,
-       0x13c8, 0x13c8, 0x13c8, 0x1775, 0x2100, 0xa08a, 0x0040, 0x1a04,
-       0x13c8, 0x0002, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x1a9e,
-       0x1aa4, 0x13c8, 0x13c8, 0x13c8, 0x1aa8, 0x1ae8, 0x13c8, 0x13c8,
-       0x13c8, 0x13c8, 0x1403, 0x146b, 0x1482, 0x14d6, 0x193c, 0x13c8,
-       0x13c8, 0x190b, 0x13c8, 0x1aec, 0x1a90, 0x1a9a, 0x13c8, 0x13c8,
-       0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
-       0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
-       0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
-       0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
-       0x13c8, 0x13c8, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0028, 0x73ce,
-       0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0e04, 0x13bd, 0x2061,
-       0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x0005,
-       0x70c3, 0x4001, 0x0c90, 0x70c3, 0x4006, 0x0c78, 0x2099, 0x0041,
-       0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0c20, 0x70c4, 0x70c3,
-       0x0004, 0x0807, 0x08f8, 0x08f0, 0x08e8, 0x08e0, 0x2091, 0x8000,
-       0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020,
-       0x70d3, 0x000a, 0x2001, 0x0004, 0x70d6, 0x2079, 0x0000, 0x781b,
-       0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051,
-       0x0445, 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091,
-       0x4080, 0x0804, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0018,
-       0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0,
-       0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e,
-       0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0904, 0x13ba, 0xa182,
-       0x0040, 0x1210, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x7007,
-       0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002,
-       0xa084, 0x01e0, 0x0120, 0x70c3, 0x4002, 0x0804, 0x13bd, 0x24a8,
-       0x53a5, 0x0c10, 0x0804, 0x13ba, 0x2029, 0x0000, 0x2520, 0x71d0,
-       0x72c8, 0x73cc, 0x70c4, 0x2098, 0x20a1, 0x0030, 0x7003, 0x0000,
-       0x7007, 0x0006, 0x731a, 0x721e, 0x7422, 0x7526, 0x2021, 0x0040,
-       0x7007, 0x0006, 0x81ff, 0x0904, 0x13ba, 0xa182, 0x0040, 0x1210,
-       0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007,
-       0x0001, 0x7008, 0xd0fc, 0x0de8, 0xa084, 0x01e0, 0x0d48, 0x70c3,
-       0x4002, 0x0804, 0x13bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0878,
-       0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x1108, 0x200a, 0x72ca,
-       0x0804, 0x13b9, 0x70c7, 0x000a, 0x70cb, 0x0004, 0x70cf, 0x002a,
-       0x0804, 0x13ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0018, 0x2029,
-       0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca,
-       0x73ce, 0x74d2, 0xa005, 0x05e8, 0xa40a, 0x0108, 0x1240, 0x8001,
-       0x7872, 0xa084, 0xfc00, 0x0138, 0x78ac, 0xc085, 0x78ae, 0x2001,
-       0x4005, 0x0804, 0x13bc, 0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76,
-       0xa48c, 0xff00, 0x0170, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c,
-       0x810f, 0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000,
-       0x0050, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1,
-       0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605,
-       0x0118, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc, 0x78ae,
-       0x0018, 0x78ac, 0xc085, 0x78ae, 0x0804, 0x13ba, 0x75d8, 0x76dc,
-       0x75da, 0x76de, 0x0018, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8,
-       0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0500,
-       0xa40a, 0x0110, 0x1a04, 0x13bc, 0x8001, 0x7892, 0xa084, 0xfc00,
-       0x0138, 0x78ac, 0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0804, 0x13bc,
-       0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0118, 0x7a10,
-       0xc2c5, 0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0018,
-       0x78ac, 0xc0c5, 0x78ae, 0x0804, 0x13ba, 0x2009, 0x0000, 0x786c,
-       0xa065, 0x0118, 0x8108, 0x6000, 0x0cd8, 0x7ac4, 0x0804, 0x13b8,
-       0x2009, 0x4748, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
-       0x13b9, 0x2011, 0x4788, 0x2214, 0x0804, 0x13b8, 0x2009, 0x4749,
-       0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011,
-       0x4789, 0x2214, 0x0804, 0x13b8, 0x2061, 0x4740, 0x6128, 0x622c,
-       0x8214, 0x8214, 0x8214, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1148,
-       0x2061, 0x4780, 0x6328, 0x73da, 0x632c, 0x831c, 0x831c, 0x831c,
-       0x73de, 0x0804, 0x13b8, 0x2009, 0x474c, 0x210c, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x478c, 0x2214, 0x0804,
-       0x13b8, 0x7918, 0x0804, 0x13b9, 0x2009, 0x0202, 0x210c, 0xa18c,
-       0x0f30, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011,
-       0x0102, 0x2214, 0xa294, 0x0f30, 0x0804, 0x13b8, 0x2009, 0x474d,
-       0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011,
-       0x478d, 0x2214, 0x0804, 0x13b8, 0x7920, 0x2001, 0x01ff, 0x2004,
-       0xd0fc, 0x1904, 0x13b9, 0x7a24, 0x0804, 0x13b8, 0x2011, 0x4c40,
-       0x71c4, 0xd1fc, 0x1110, 0x2011, 0x4bc0, 0x8107, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa268, 0x6a00, 0x6b08, 0x6c1c, 0x74da,
-       0xd1fc, 0x1118, 0x2021, 0x023b, 0x0010, 0x2021, 0x013b, 0x2424,
-       0xa4a4, 0x1c00, 0x74de, 0x0804, 0x13b7, 0x77c4, 0x080c, 0x1b9a,
-       0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0804,
-       0x13b7, 0x2061, 0x4740, 0x6118, 0x2001, 0x01ff, 0x2004, 0xd0fc,
-       0x1904, 0x13b9, 0x2061, 0x4780, 0x6218, 0x0804, 0x13b8, 0x77c4,
-       0x080c, 0x1b9a, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x77da,
-       0x2091, 0x8001, 0x0804, 0x13b7, 0x71c4, 0x2110, 0xa294, 0x000f,
-       0xa282, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x23b4, 0xa384, 0x4000,
-       0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x71c4, 0x2100, 0xc0bc,
-       0xa082, 0x0010, 0x1a04, 0x13b3, 0xd1bc, 0x1120, 0x2011, 0x4748,
-       0x2204, 0x0020, 0x2011, 0x4788, 0x2204, 0xc0bd, 0x0006, 0x2100,
-       0xc0bc, 0x2012, 0x080c, 0x2358, 0x001e, 0x0804, 0x13b9, 0x71c4,
-       0x2021, 0x4749, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0030, 0x71c8,
-       0x2021, 0x4789, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1623, 0x20a9,
-       0x0008, 0x2204, 0xa106, 0x0138, 0x8210, 0x1f04, 0x1609, 0x71c4,
-       0x72c8, 0x0804, 0x13b2, 0xa292, 0x1623, 0x0026, 0x2122, 0x001e,
-       0x080c, 0x236a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1110, 0xd3fc,
-       0x09f0, 0x0804, 0x13ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0004,
-       0x0001, 0x0002, 0x0003, 0x2061, 0x4740, 0x6128, 0x622c, 0x8214,
-       0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003, 0x8003,
-       0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11a0, 0x0026, 0x0016,
-       0x2061, 0x4780, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70d8,
-       0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, 0x72de,
-       0x001e, 0x002e, 0x0804, 0x13b8, 0x2061, 0x4740, 0x6130, 0x70c4,
-       0x6032, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2061,
-       0x4780, 0x6230, 0x70c8, 0x6032, 0x0804, 0x13b8, 0x7918, 0x0804,
-       0x13b9, 0x71c4, 0xa184, 0xf0cf, 0x0148, 0x2001, 0x01ff, 0x2004,
-       0xd0fc, 0x1904, 0x13b3, 0x72c8, 0x0804, 0x13b2, 0x2019, 0x0000,
-       0x080c, 0x23a6, 0x0036, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118,
-       0x001e, 0x0804, 0x13b9, 0x71c8, 0xa184, 0xf0cf, 0x0128, 0x000e,
-       0x2110, 0x71c4, 0x0804, 0x13b2, 0xc3fd, 0x080c, 0x23a6, 0x2310,
-       0x001e, 0x0804, 0x13b8, 0x71c4, 0xa182, 0x0010, 0x0248, 0x2001,
-       0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8, 0x0804, 0x13b2,
-       0x2011, 0x474d, 0x2204, 0x0006, 0x8104, 0x1208, 0x8108, 0x2112,
-       0x2019, 0x0000, 0x080c, 0x2393, 0x2001, 0x01ff, 0x2004, 0xd0fc,
-       0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa182, 0x0010, 0x0228,
-       0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x2011, 0x478d, 0x2204,
-       0x0006, 0x8104, 0x1208, 0x8108, 0x2112, 0xc3fd, 0x080c, 0x2393,
-       0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0x72c8, 0xa184, 0xfffd,
-       0x1904, 0x13b2, 0xa284, 0xfffd, 0x1904, 0x13b2, 0x2100, 0x7920,
-       0x7822, 0x2200, 0x7a24, 0x7826, 0x0804, 0x13b8, 0x2011, 0x4c40,
-       0x71c4, 0xd1fc, 0x1110, 0x2011, 0x4bc0, 0x8107, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa268, 0x72c8, 0x73cc, 0x74d8, 0x71c6,
-       0x6800, 0x70ca, 0x73ce, 0x74da, 0x2091, 0x8000, 0x6a02, 0xd2ac,
-       0x1118, 0x2021, 0x0000, 0x0090, 0xa484, 0x00ff, 0xa082, 0x0002,
-       0x1a04, 0x174f, 0x843f, 0xa7bc, 0x00ff, 0x0140, 0xa786, 0x0002,
-       0x1904, 0x174f, 0xa484, 0x00ff, 0x0904, 0x174f, 0x2061, 0x0200,
-       0xd1fc, 0x0110, 0x2061, 0x0100, 0x2029, 0x0009, 0x2031, 0x0062,
-       0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, 0xa084, 0x00ff, 0x1110,
-       0xa73d, 0x1138, 0x2041, 0x0019, 0xa384, 0x00ff, 0xa082, 0x001a,
-       0x0210, 0xa4a4, 0x00ff, 0x8307, 0xa084, 0x00ff, 0x0188, 0xa842,
-       0x02f0, 0xa086, 0x0010, 0x1120, 0xa39c, 0x00ff, 0xa39d, 0x0f00,
-       0xa3bc, 0x00ff, 0x2500, 0xa702, 0x0290, 0x2600, 0xa702, 0x1278,
-       0x2039, 0x003a, 0x6804, 0xa705, 0x6806, 0x6b0a, 0x6b0c, 0x73ce,
-       0x681c, 0x70da, 0x6c1e, 0x2091, 0x8001, 0x0804, 0x13ba, 0x2091,
-       0x8001, 0x0804, 0x13b4, 0x77c4, 0x080c, 0x1b9a, 0x2091, 0x8000,
-       0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e,
-       0x2708, 0x0804, 0x13b7, 0x70c4, 0x2061, 0x4740, 0x6118, 0x601a,
-       0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x70c8, 0x2061,
-       0x4780, 0x6218, 0x601a, 0x0804, 0x13b8, 0x71c4, 0x72c8, 0x73cc,
-       0xa182, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x23d8, 0xa384, 0x4000,
-       0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x77c4, 0x080c, 0x1b9a,
-       0x2091, 0x8000, 0x6a08, 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708,
-       0x0804, 0x13b8, 0x77c4, 0x080c, 0x1b9a, 0x2091, 0x8000, 0x6a08,
-       0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0110, 0x080c, 0x22d5,
-       0x2091, 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4, 0x080c, 0x1b9a,
-       0x2091, 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005, 0x0110,
-       0x080c, 0x22d5, 0x2091, 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4,
-       0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000,
-       0x080c, 0x1bb2, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0804, 0x13b8,
-       0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b29, 0x0138, 0x0804, 0x13bc,
-       0x080c, 0x1b1e, 0x0110, 0x0804, 0x13bc, 0x73c8, 0x72cc, 0x77c6,
-       0x73ca, 0x72ce, 0x080c, 0x1c2a, 0x11e8, 0x6818, 0xa005, 0x01a0,
-       0x2708, 0x0076, 0x080c, 0x23f7, 0x007e, 0x1170, 0x2001, 0x0015,
-       0xd7fc, 0x1118, 0x2061, 0x4740, 0x0018, 0xc0fd, 0x2061, 0x4780,
-       0x782a, 0x2091, 0x8001, 0x0005, 0x2091, 0x8001, 0x2001, 0x4005,
-       0x0804, 0x13bc, 0x2091, 0x8001, 0x0804, 0x13ba, 0x77c4, 0xd7fc,
-       0x0128, 0x080c, 0x1b29, 0x0138, 0x0804, 0x13bc, 0x080c, 0x1b1e,
-       0x0110, 0x0804, 0x13bc, 0x77c6, 0x2041, 0x0021, 0x2049, 0x0005,
-       0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1bb2, 0x2009, 0x0016,
-       0xd7fc, 0x1118, 0x2061, 0x4740, 0x0018, 0x2061, 0x4780, 0xc1fd,
-       0x6063, 0x0003, 0x607b, 0x0000, 0x6772, 0x607f, 0x000f, 0x792a,
-       0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22d5, 0x2091, 0x8001, 0x0005,
-       0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xd7fc, 0x0128, 0x080c, 0x1b29,
-       0x0138, 0x0804, 0x13bc, 0x080c, 0x1b1e, 0x0110, 0x0804, 0x13bc,
-       0xa7bc, 0xff00, 0x2091, 0x8000, 0x2009, 0x0017, 0xd7fc, 0x1118,
-       0x2061, 0x4740, 0x0018, 0x2061, 0x4780, 0xc1fd, 0x607b, 0x0000,
-       0x6063, 0x0002, 0x6772, 0x607f, 0x000f, 0x792a, 0x61d0, 0xc1c4,
-       0x61d2, 0x080c, 0x22d5, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049,
-       0x0005, 0x2051, 0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0118,
-       0x60d0, 0xc0fd, 0x60d2, 0x080c, 0x1bb2, 0x70c8, 0x6836, 0x8738,
-       0xa784, 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005, 0x2019, 0x0000,
-       0x72c8, 0xd284, 0x0128, 0x080c, 0x1b29, 0x0138, 0x0804, 0x13bc,
-       0x080c, 0x1b1e, 0x0110, 0x0804, 0x13bc, 0x72c8, 0x72ca, 0x78ac,
-       0xa084, 0x0003, 0x1518, 0x2039, 0x0000, 0xd284, 0x0108, 0xc7fd,
-       0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x080c, 0x1b9a,
-       0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, 0x6837, 0x0000,
-       0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x1d80, 0xa7bc, 0xff00,
-       0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d40, 0x2091, 0x8000,
-       0x72c8, 0x2069, 0x0100, 0xd284, 0x1110, 0x2069, 0x0200, 0x6808,
-       0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b, 0x0004,
-       0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x18c2, 0x684b,
-       0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04, 0x18cb,
-       0x20a9, 0x00fa, 0x1f04, 0x18d2, 0x2079, 0x4700, 0x2009, 0x0018,
-       0x72c8, 0xd284, 0x1118, 0x2061, 0x4740, 0x0018, 0x2061, 0x4780,
-       0xc1fd, 0x607b, 0x0000, 0x792a, 0x6063, 0x0001, 0x607f, 0x000f,
-       0x60a3, 0x0000, 0x60a4, 0x60ae, 0x60b2, 0x60d0, 0xd0b4, 0x0160,
-       0xc0b4, 0x60d2, 0x00c6, 0x60b4, 0xa065, 0x6008, 0xc0d4, 0x600a,
-       0x6018, 0x8001, 0x601a, 0x00ce, 0x60d0, 0xa084, 0x7eff, 0x60d2,
-       0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0108, 0x0005, 0x681b, 0x0054,
-       0x2091, 0x8001, 0x0005, 0x73cc, 0x080c, 0x1878, 0x69ec, 0x6a48,
-       0xa185, 0x1800, 0x684a, 0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021,
-       0x0004, 0x20a9, 0x09ff, 0x1f04, 0x191b, 0x8421, 0x1dd0, 0x8319,
-       0x1db0, 0x69ee, 0x6a4a, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118,
-       0x2069, 0x4740, 0x0010, 0x2069, 0x4780, 0x71c4, 0x71c6, 0x6916,
-       0x81ff, 0x1110, 0x68a3, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084,
-       0x1110, 0x080c, 0x1c7a, 0x0005, 0x75d8, 0x74dc, 0x75da, 0x74de,
-       0x0010, 0xa02e, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca,
-       0x72ce, 0x2079, 0x4700, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x080c,
-       0x1b77, 0x0904, 0x1a5c, 0x20a9, 0x0005, 0x20a1, 0x4714, 0x2091,
-       0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x080c, 0x1d41,
-       0x0120, 0x080c, 0x1b7f, 0x0804, 0x1a5c, 0x6004, 0xa08c, 0x00ff,
-       0xa18e, 0x0009, 0x1120, 0x0006, 0x080c, 0x2086, 0x000e, 0xa084,
-       0xff00, 0x8007, 0x8009, 0x0904, 0x19f1, 0x00c6, 0x2c68, 0x080c,
-       0x1b77, 0x05a8, 0x2c00, 0x689e, 0x8109, 0x1dc0, 0x609f, 0x0000,
-       0x00ce, 0x00c6, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040,
-       0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda,
-       0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0904, 0x19f0, 0x2009,
-       0x0040, 0x080c, 0x1d41, 0x15a0, 0x6004, 0xa084, 0x00ff, 0xa086,
-       0x0002, 0x0150, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, 0x1138,
-       0x0016, 0x080c, 0x2083, 0x001e, 0x2d00, 0x6002, 0x0898, 0x00ce,
-       0x00c6, 0x609c, 0x080c, 0x1bf3, 0x00ce, 0x609f, 0x0000, 0x080c,
-       0x1a60, 0x2009, 0x0018, 0x6008, 0xc0cd, 0x600a, 0x6004, 0x6086,
-       0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
-       0x080c, 0x1b34, 0x000e, 0x7812, 0x080c, 0x1b7f, 0x0804, 0x1a5c,
-       0x00ce, 0x00c6, 0x609c, 0x080c, 0x1bf3, 0x00ce, 0x609f, 0x0000,
-       0x080c, 0x1a60, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003,
-       0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
-       0x080c, 0x1b34, 0x000e, 0x7812, 0x080c, 0x1b7f, 0x0804, 0x1a5c,
-       0x00ce, 0x6114, 0xd1fc, 0x0120, 0x080c, 0x1b29, 0x01f0, 0x0018,
-       0x080c, 0x1b1e, 0x01d0, 0x080c, 0x1a60, 0x2009, 0x0018, 0x6087,
-       0x0103, 0x601b, 0x0021, 0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff,
-       0x0110, 0xc0c5, 0x7812, 0x080c, 0x1b34, 0x000e, 0x7812, 0x080c,
-       0x1b7f, 0x2001, 0x4007, 0x0804, 0x13bc, 0x6104, 0xa18c, 0x00ff,
-       0xa186, 0x0005, 0x1118, 0x601c, 0xc0bd, 0x601e, 0x74c4, 0x73c8,
-       0x72cc, 0x6014, 0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc,
-       0x1118, 0x2071, 0x4740, 0x0018, 0x2071, 0x4780, 0xc1fd, 0x792a,
-       0x7063, 0x0005, 0x71d0, 0xc1c4, 0x71d2, 0x7366, 0x726a, 0x746e,
-       0x7072, 0x7077, 0x0000, 0x2c00, 0x707a, 0xa02e, 0x2530, 0x611c,
-       0xa184, 0x0060, 0x0110, 0x080c, 0x3fe9, 0x00ee, 0x6596, 0x65a6,
-       0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023,
-       0x0000, 0x6024, 0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x080c,
-       0x22d5, 0x2091, 0x8001, 0x0005, 0x70c3, 0x4005, 0x0804, 0x13bd,
-       0x20a9, 0x0005, 0x2099, 0x4714, 0x2091, 0x8000, 0x530a, 0x2091,
-       0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
-       0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, 0x791e, 0x0804, 0x13ba,
-       0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, 0x1000, 0x690c, 0xa016,
-       0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, 0xa285, 0x0000, 0x1118,
-       0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, 0x70ca, 0x0804, 0x13bd,
-       0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x1a04, 0x13b3, 0x7966,
-       0x0804, 0x13ba, 0x7964, 0x71c6, 0x0804, 0x13ba, 0x7900, 0x71c6,
-       0x71c4, 0x7902, 0x0804, 0x13ba, 0x7900, 0x71c6, 0x0804, 0x13ba,
-       0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0160, 0x810c, 0x0230,
-       0x8210, 0x810c, 0x810c, 0x0210, 0x8210, 0x810c, 0x81ff, 0x1904,
-       0x13b4, 0x8210, 0x7a0e, 0xd28c, 0x0538, 0x7910, 0xc1cd, 0x7912,
-       0x2009, 0x0021, 0x2019, 0x0003, 0xd284, 0x01c0, 0x8108, 0x2019,
-       0x0041, 0x2011, 0x8f4e, 0x2312, 0x2019, 0x0042, 0x8210, 0x2312,
-       0x2019, 0x0043, 0x8210, 0x2312, 0x2019, 0x0046, 0x8210, 0x2312,
-       0x2019, 0x0047, 0x8210, 0x2312, 0x2019, 0x0006, 0x2011, 0x8f53,
-       0x2112, 0x2011, 0x8f73, 0x2312, 0x7904, 0x7806, 0x0804, 0x13b9,
-       0x7804, 0x70c6, 0x0804, 0x13ba, 0x71c4, 0xd1fc, 0x1118, 0x2011,
-       0x4bc0, 0x0010, 0x2011, 0x4c40, 0x8107, 0xa084, 0x000f, 0x8003,
-       0x8003, 0x8003, 0xa268, 0x2011, 0x0000, 0x6814, 0xd0fc, 0x0110,
-       0xa295, 0x0200, 0xd0b4, 0x0110, 0xa295, 0x0001, 0x6b0c, 0x6800,
-       0x70da, 0x0804, 0x13b7, 0x7814, 0xd0f4, 0x0130, 0x2001, 0x4007,
-       0x70db, 0x0000, 0xa005, 0x0048, 0xd0fc, 0x0130, 0x2001, 0x4007,
-       0x70db, 0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7814, 0xd0f4,
-       0x0130, 0x2001, 0x4007, 0x70db, 0x0000, 0xa005, 0x0008, 0xa006,
-       0x0005, 0x7814, 0xd0fc, 0x0130, 0x2001, 0x4007, 0x70db, 0x0001,
-       0xa005, 0x0008, 0xa006, 0x0005, 0x7112, 0x721a, 0x731e, 0x7810,
-       0xd0c4, 0x0110, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c,
-       0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084, 0x20a2,
-       0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0140, 0x810f,
-       0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107,
-       0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211, 0x7d10,
-       0xd5c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, 0xd0fc,
-       0x0de8, 0x7003, 0x0001, 0x7007, 0x0006, 0x711a, 0x721e, 0x7d10,
-       0xd5c4, 0x0110, 0x7322, 0x7426, 0xa084, 0x01e0, 0x0005, 0x7848,
-       0xa065, 0x0120, 0x2c04, 0x784a, 0x2063, 0x0000, 0x0005, 0x00f6,
-       0x2079, 0x4700, 0x7848, 0x2062, 0x2c00, 0xa005, 0x1110, 0x080c,
-       0x2575, 0x784a, 0x00fe, 0x0005, 0x2011, 0x9100, 0x7a4a, 0x7bc4,
-       0x8319, 0x0128, 0xa280, 0x0032, 0x2012, 0x2010, 0x0cc8, 0x2013,
-       0x0000, 0x0005, 0x0016, 0x0026, 0xd7fc, 0x1118, 0x2011, 0x4cc0,
-       0x0010, 0x2011, 0x6cc0, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
-       0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa268, 0x002e,
-       0x001e, 0x0005, 0x0c39, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808,
-       0xa084, 0xf9ef, 0xa80d, 0x690a, 0x00e6, 0xd7fc, 0x1128, 0x2009,
-       0x4752, 0x2071, 0x4740, 0x0020, 0x2009, 0x4792, 0x2071, 0x4780,
-       0x210c, 0x6804, 0xa005, 0x0148, 0xa116, 0x1138, 0x2060, 0x6000,
-       0x6806, 0x0016, 0x200b, 0x0000, 0x0018, 0x2009, 0x0000, 0x0016,
-       0x6804, 0xa065, 0x0178, 0x6000, 0x6806, 0x0421, 0x080c, 0x1db2,
-       0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x6812, 0x1d88, 0x7910,
-       0xc1a5, 0x7912, 0x001e, 0x6902, 0x6906, 0x2d00, 0x2060, 0x080c,
-       0x26bf, 0x00ee, 0x0005, 0xa065, 0x0160, 0x2008, 0x609c, 0xa005,
-       0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x7848, 0x794a,
-       0x2062, 0x0005, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c,
-       0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a,
-       0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, 0x1128, 0x2071, 0x4740,
-       0x2031, 0x47c0, 0x0020, 0x2071, 0x4780, 0x2031, 0x49c0, 0x704c,
-       0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, 0x8000, 0x704e, 0xa006,
-       0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0x4740, 0x0010,
-       0x2079, 0x4780, 0x080c, 0x1b9a, 0x2091, 0x8000, 0x6804, 0x780a,
-       0xa065, 0x05f0, 0x0030, 0x2c00, 0x780a, 0x2060, 0x6000, 0xa065,
-       0x05b8, 0x6010, 0xa306, 0x1db8, 0x600c, 0xa206, 0x1da0, 0x2c28,
-       0x7848, 0xac06, 0x1108, 0x0448, 0x6804, 0xac06, 0x1140, 0x6000,
-       0x2060, 0x6806, 0xa005, 0x1118, 0x6803, 0x0000, 0x0048, 0x6400,
-       0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x1110, 0x2c00, 0x6802,
-       0x2560, 0x080c, 0x1c02, 0x601b, 0x0005, 0x6023, 0x0020, 0x00fe,
-       0x080c, 0x1db2, 0x00f6, 0x7908, 0x8109, 0x790a, 0x6810, 0x8001,
-       0x6812, 0x1118, 0x7810, 0xc0a5, 0x7812, 0x2001, 0xffff, 0xa005,
-       0x00fe, 0x0005, 0x0076, 0x2700, 0x2039, 0x0000, 0xd0fc, 0x0108,
-       0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x2091,
-       0x8000, 0x080c, 0x1bb2, 0x8738, 0xa784, 0x001f, 0x1dd0, 0xa7bc,
-       0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d90, 0x2091,
-       0x8001, 0x007e, 0x0005, 0x786c, 0x2009, 0x8f74, 0x210c, 0xa10d,
-       0x0118, 0xa065, 0x0804, 0x20a1, 0x2061, 0x0000, 0x6018, 0xd084,
-       0x11b8, 0x7810, 0xd08c, 0x0130, 0xc08c, 0x7812, 0xc7fc, 0x2069,
-       0x4740, 0x0028, 0xc08d, 0x7812, 0x2069, 0x4780, 0xc7fd, 0x2091,
-       0x8000, 0x681c, 0x681f, 0x0000, 0x2091, 0x8001, 0xa005, 0x1108,
-       0x0005, 0xa08c, 0xfff0, 0x0110, 0x080c, 0x2575, 0x0002, 0x1cd7,
-       0x1cda, 0x1ce0, 0x1ce4, 0x1cd8, 0x1ce8, 0x1cd8, 0x1cd8, 0x1cd8,
-       0x1cee, 0x1d18, 0x1d1b, 0x1d20, 0x1d29, 0x1cd8, 0x1cd8, 0x0005,
-       0x080c, 0x2575, 0x080c, 0x1c7a, 0x2001, 0x8001, 0x0804, 0x1d32,
-       0x2001, 0x8003, 0x0804, 0x1d32, 0x2001, 0x8004, 0x0804, 0x1d32,
-       0x080c, 0x1c7a, 0x2001, 0x8006, 0x0804, 0x1d32, 0x2011, 0x800a,
-       0x2091, 0x8000, 0xd7fc, 0x1118, 0x2069, 0x4740, 0x0010, 0x2069,
-       0x4780, 0x2038, 0x6800, 0xa086, 0x0000, 0x0120, 0x6f1e, 0x2091,
-       0x8001, 0x0005, 0x0026, 0x6870, 0xa0bc, 0xff00, 0x2041, 0x0021,
-       0x2049, 0x0004, 0x2051, 0x0010, 0x080c, 0x1bb2, 0x8738, 0xa784,
-       0x001f, 0x1dd0, 0x2091, 0x8001, 0x000e, 0x6970, 0x71c6, 0x00d0,
-       0x2001, 0x800c, 0x00b8, 0x080c, 0x1c7a, 0x2001, 0x800d, 0x0090,
-       0xd7fc, 0x0110, 0x78e4, 0x0008, 0x78e0, 0x70c6, 0x2001, 0x800e,
-       0x0048, 0xd7fc, 0x0110, 0x78ec, 0x0008, 0x78e8, 0x70c6, 0x2001,
-       0x800f, 0x0000, 0x70c2, 0xd7fc, 0x1118, 0x70db, 0x0000, 0x0010,
-       0x70db, 0x0001, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080,
-       0x0005, 0xac80, 0x0001, 0x81ff, 0x0518, 0x2099, 0x0030, 0x20a0,
-       0x700c, 0xa084, 0x07ff, 0x0100, 0x7018, 0x0006, 0x701c, 0x0006,
-       0x7020, 0x0006, 0x7024, 0x0006, 0x7112, 0x81ac, 0x721a, 0x731e,
-       0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001, 0x7008, 0x800b,
-       0x1ee8, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x1110, 0x53a5, 0xa006,
-       0x7003, 0x0000, 0x7007, 0x0004, 0x000e, 0x7026, 0x000e, 0x7022,
-       0x000e, 0x701e, 0x000e, 0x701a, 0x0005, 0x2011, 0x0020, 0x2009,
-       0x0010, 0x6b0a, 0x6c0e, 0x681f, 0x0201, 0x6803, 0xfd20, 0x6807,
-       0x0038, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004, 0x8109,
-       0x1d80, 0x0005, 0x70ec, 0xd0dc, 0x1520, 0x2029, 0x0001, 0x7814,
-       0xd0cc, 0x1160, 0x70ec, 0xd0e4, 0x2019, 0x0c0a, 0x2021, 0x000a,
-       0x1120, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x0070, 0x70ec, 0xd0e4,
-       0x1128, 0x2019, 0x180c, 0x2021, 0x000c, 0x0030, 0x2019, 0x1809,
-       0x2021, 0x0009, 0xa5ad, 0x0200, 0x6b0a, 0x6c0e, 0x6d1e, 0x6807,
-       0x0038, 0x0005, 0x6004, 0x6086, 0x2c08, 0x2063, 0x0000, 0x7868,
-       0xa005, 0x796a, 0x0110, 0x2c02, 0x0008, 0x796e, 0x0005, 0x00c6,
-       0x2061, 0x4700, 0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6068,
-       0xa005, 0x616a, 0x0110, 0x2d02, 0x0008, 0x616e, 0x00ce, 0x0005,
-       0x2091, 0x8000, 0x2c04, 0x786e, 0xa005, 0x1108, 0x786a, 0x2091,
-       0x8001, 0x609c, 0xa005, 0x0188, 0x00c6, 0x2060, 0x2008, 0x609c,
-       0xa005, 0x0138, 0x2062, 0x609f, 0x0000, 0xa065, 0x609c, 0xa005,
-       0x1dc8, 0x7848, 0x794a, 0x2062, 0x00ce, 0x7848, 0x2062, 0x609f,
-       0x0000, 0xac85, 0x0000, 0x1110, 0x080c, 0x2575, 0x784a, 0x0005,
-       0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x1208, 0xa200,
-       0x1f04, 0x1dfc, 0x8086, 0x818e, 0x0005, 0x0156, 0x20a9, 0x0010,
-       0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a,
-       0x1220, 0x1f04, 0x1e0c, 0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04,
-       0x1e0c, 0x0006, 0x3200, 0xa084, 0xefff, 0x2080, 0x000e, 0x015e,
-       0x0005, 0x0006, 0x3200, 0xa085, 0x1000, 0x0cb8, 0x7d74, 0x70d0,
-       0xa506, 0x0904, 0x1eda, 0x7810, 0x2050, 0x080c, 0x1b77, 0x0904,
-       0x1eda, 0xa046, 0x7970, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040,
-       0x1208, 0x0030, 0x72d0, 0xa206, 0x0118, 0x8840, 0x2009, 0x0080,
-       0x00c6, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, 0x0020,
-       0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0110, 0x080c,
-       0x1b77, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002, 0x2091, 0x8001,
-       0xa08c, 0x01e0, 0x1538, 0x53a5, 0x8cff, 0x1120, 0x88ff, 0x0904,
-       0x1ec7, 0x0050, 0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80, 0x0001,
-       0x20a0, 0x53a5, 0x0804, 0x1ec7, 0xa046, 0x7218, 0x731c, 0xdac4,
-       0x0110, 0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3,
-       0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e, 0xdac4, 0x0118, 0x7422,
-       0x7526, 0xa006, 0x7007, 0x0004, 0x0904, 0x1ec7, 0x8cff, 0x0110,
-       0x080c, 0x1b7f, 0x00ce, 0x080c, 0x1b7f, 0xa046, 0x7888, 0x8000,
-       0x788a, 0xa086, 0x0002, 0x01c0, 0x7a7c, 0x7b78, 0xdac4, 0x0110,
-       0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399,
-       0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x721a, 0x731e, 0xdac4,
-       0x0588, 0x7422, 0x7526, 0x0470, 0x6014, 0xd0fc, 0x1118, 0x2069,
-       0x4740, 0x0010, 0x2069, 0x4780, 0x2091, 0x8000, 0x681f, 0x0002,
-       0x88ff, 0x0120, 0xa046, 0x788c, 0x2060, 0x0c70, 0x788b, 0x0000,
-       0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0098, 0x00ce,
-       0x788b, 0x0000, 0x080c, 0x205c, 0x6004, 0xa084, 0x000f, 0x0059,
-       0x88ff, 0x0130, 0x788c, 0x2060, 0x6004, 0xa084, 0x000f, 0x0019,
-       0x0804, 0x1e26, 0x0005, 0x0002, 0x1eec, 0x1f07, 0x1f20, 0x1eec,
-       0x1f2d, 0x1efd, 0x1eec, 0x1eec, 0x1eec, 0x1f05, 0x1f1e, 0x1eec,
-       0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x2039, 0x0400, 0x78bc, 0xa705,
-       0x78be, 0x6008, 0xa705, 0x600a, 0x080c, 0x1f69, 0x609c, 0x78ba,
-       0x609f, 0x0000, 0x080c, 0x2048, 0x0005, 0x78bc, 0xd0c4, 0x0108,
-       0x0c58, 0x601c, 0xc0bd, 0x601e, 0x0030, 0x080c, 0x2086, 0x78bc,
-       0xd0c4, 0x0108, 0x0c08, 0x78bf, 0x0000, 0x6004, 0x8007, 0xa084,
-       0x00ff, 0x78b2, 0x8001, 0x0138, 0x080c, 0x1f69, 0x0120, 0x78bc,
-       0xc0c5, 0x78be, 0x0010, 0x0804, 0x1f84, 0x0005, 0x080c, 0x2083,
-       0x78bc, 0xa08c, 0x0e00, 0x1110, 0xd0c4, 0x1108, 0x0828, 0x080c,
-       0x1f69, 0x1110, 0x0804, 0x1f84, 0x0005, 0x78bc, 0xd0c4, 0x0110,
-       0x0804, 0x1eec, 0x78bf, 0x0000, 0x6714, 0x2011, 0x0001, 0x22a8,
-       0x6018, 0xa084, 0x00ff, 0xa005, 0x0188, 0xa7bc, 0xff00, 0x20a9,
-       0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc, 0x8000, 0x2011, 0x0002,
-       0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108, 0x00c0, 0x080c, 0x1b9a,
-       0x2d00, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808,
-       0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x1f04,
-       0x1f51, 0x8211, 0x0118, 0x20a9, 0x0100, 0x0c58, 0x080c, 0x1b7f,
-       0x0005, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6, 0x1110,
-       0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002, 0x78b8, 0xad06, 0x1108,
-       0x6002, 0x78b0, 0x8001, 0x78b2, 0x1130, 0x78bc, 0xc0c4, 0x78be,
-       0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6, 0xa02e, 0x2530, 0x7dba,
-       0x7db6, 0x65ae, 0x65b2, 0x601c, 0x60a2, 0x2048, 0xa984, 0xe1ff,
-       0x601e, 0xa984, 0x0060, 0x0160, 0x080c, 0x3fe9, 0x86ff, 0x1140,
-       0x85ff, 0x1130, 0x2039, 0x0800, 0x080c, 0x2048, 0x0804, 0x2046,
-       0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x4780, 0xd7fc,
-       0x1110, 0x2071, 0x4740, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
-       0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x71c0, 0xa168,
-       0x2700, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x71c4,
-       0xa100, 0x60c2, 0x2091, 0x8000, 0x7814, 0xd0c4, 0x0138, 0xd7fc,
-       0x1118, 0xd0f4, 0x1140, 0x0010, 0xd0fc, 0x1128, 0x6e08, 0xd684,
-       0x01f0, 0xd9fc, 0x11e0, 0x2091, 0x8001, 0x080c, 0x1c02, 0x2091,
-       0x8000, 0x080c, 0x1db2, 0x2091, 0x8001, 0x7814, 0xd0c4, 0x0904,
-       0x2046, 0xd7fc, 0x1120, 0xd0f4, 0x1130, 0x0804, 0x2046, 0xd0fc,
-       0x1110, 0x0804, 0x2046, 0x601b, 0x0021, 0x0804, 0x2046, 0x6024,
-       0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x6a10, 0x6814, 0xa202,
-       0x0268, 0x0160, 0x2091, 0x8001, 0x2039, 0x0200, 0x609c, 0x78ba,
-       0x609f, 0x0000, 0x080c, 0x2048, 0x0804, 0x2046, 0x2c08, 0xd9fc,
-       0x01f0, 0x6800, 0xa065, 0x01d8, 0x6a04, 0x7000, 0xa084, 0x0002,
-       0x0168, 0x7048, 0xa206, 0x1150, 0x6b04, 0x2160, 0x2304, 0x6002,
-       0xa005, 0x1108, 0x6902, 0x2260, 0x6102, 0x0098, 0x2d00, 0x2060,
-       0x080c, 0x26bf, 0x6e08, 0x2160, 0x6202, 0x6906, 0x0050, 0x6800,
-       0x6902, 0xa065, 0x0110, 0x6102, 0x0008, 0x6906, 0x2160, 0x6003,
-       0x0000, 0x2160, 0xd9fc, 0x0118, 0xa6b4, 0xfffc, 0x6e0a, 0x6810,
-       0x7d08, 0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4,
-       0x0128, 0xa6b6, 0x0040, 0x6e0a, 0x080c, 0x1c13, 0x00ee, 0x0005,
-       0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x080c, 0x1db2, 0x2091,
-       0x8001, 0x78b8, 0xa065, 0x0128, 0x609c, 0x78ba, 0x609f, 0x0000,
-       0x0c78, 0x78b6, 0x78ba, 0x0005, 0x7970, 0x7874, 0x2818, 0xd384,
-       0x0118, 0x8000, 0xa112, 0x0220, 0x8000, 0xa112, 0x1278, 0xc384,
-       0x7a7c, 0x721a, 0x7a78, 0x721e, 0xdac4, 0x0120, 0x7a84, 0x7222,
-       0x7a80, 0x7226, 0xa006, 0xd384, 0x0108, 0x8000, 0x7876, 0x70d2,
-       0x781c, 0xa005, 0x0138, 0x8001, 0x781e, 0x1120, 0x0e04, 0x2082,
-       0x2091, 0x4080, 0x0005, 0x2039, 0x2098, 0x0010, 0x2039, 0x209e,
-       0x2704, 0xa005, 0x0160, 0xac00, 0x2068, 0x6908, 0x6810, 0x6912,
-       0x680a, 0x690c, 0x6814, 0x6916, 0x680e, 0x8738, 0x0c88, 0x0005,
-       0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015, 0x001b,
-       0x0000, 0x2041, 0x0000, 0x780c, 0x0002, 0x224a, 0x2225, 0x20a9,
-       0x2119, 0x2039, 0x8f74, 0x2734, 0x7d10, 0x00c0, 0x6084, 0xa086,
-       0x0103, 0x1904, 0x2103, 0x6114, 0x6018, 0xa105, 0x0120, 0x86ff,
-       0x11d8, 0x0804, 0x2103, 0x8603, 0xa080, 0x8f55, 0x620c, 0x2202,
-       0x8000, 0x6210, 0x2202, 0x080c, 0x1dd0, 0x8630, 0xa68e, 0x000f,
-       0x0904, 0x2184, 0x786c, 0xa065, 0x1d08, 0x7808, 0xa602, 0x1220,
-       0xd5ac, 0x1110, 0x263a, 0x0005, 0xa682, 0x0003, 0x1a04, 0x2184,
-       0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x11f8, 0x2011,
-       0x8f55, 0x2204, 0x70c6, 0x8210, 0x2204, 0x70ca, 0xd684, 0x1130,
-       0x8210, 0x2204, 0x70da, 0x8210, 0x2204, 0x70de, 0xa685, 0x8020,
-       0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf,
-       0x7812, 0x2091, 0x8001, 0x203b, 0x0000, 0x0005, 0x7810, 0xc0ad,
-       0x7812, 0x0804, 0x2184, 0x263a, 0x080c, 0x2250, 0x1904, 0x226c,
-       0x786c, 0xa065, 0x1904, 0x20ae, 0x2091, 0x8000, 0x7810, 0xa084,
-       0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0804,
-       0x226c, 0x2039, 0x8f74, 0x2734, 0x7d10, 0x00a0, 0x6084, 0xa086,
-       0x0103, 0x1904, 0x216e, 0x6114, 0x6018, 0xa105, 0x0120, 0x86ff,
-       0x11b8, 0x0804, 0x216e, 0xa680, 0x8f55, 0x620c, 0x2202, 0x080c,
-       0x1dd0, 0x8630, 0xa68e, 0x001e, 0x0904, 0x2184, 0x786c, 0xa065,
-       0x1d28, 0x7808, 0xa602, 0x1220, 0xd5ac, 0x1110, 0x263a, 0x0005,
-       0xa682, 0x0006, 0x1a04, 0x2184, 0x2091, 0x8000, 0x2069, 0x0000,
-       0x6818, 0xd084, 0x11f8, 0x2011, 0x8f55, 0x2009, 0x8f4e, 0x26a8,
-       0x211c, 0x2204, 0x201a, 0x8108, 0x8210, 0x1f04, 0x2150, 0xa685,
-       0x8030, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084,
-       0xffcf, 0x7812, 0x2091, 0x8001, 0xa006, 0x2009, 0x8f75, 0x200a,
-       0x203a, 0x0005, 0x7810, 0xc0ad, 0x7812, 0x00b0, 0x263a, 0x080c,
-       0x2250, 0x1904, 0x226c, 0x786c, 0xa065, 0x1904, 0x211e, 0x2091,
-       0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812,
-       0x2091, 0x8001, 0x0804, 0x226c, 0x2091, 0x8000, 0x7007, 0x0004,
-       0x7994, 0x70d4, 0xa102, 0x0228, 0x0168, 0x7b90, 0xa302, 0x1150,
-       0x0010, 0x8002, 0x1138, 0x263a, 0x7810, 0xc0ad, 0x7812, 0x2091,
-       0x8001, 0x0005, 0xa184, 0xff00, 0x0140, 0x810f, 0x810c, 0x810c,
-       0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107, 0x8004, 0x8004,
-       0x7a9c, 0xa210, 0x721a, 0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4,
-       0x0130, 0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1,
-       0x0030, 0x7003, 0x0000, 0x2009, 0x8f54, 0x260a, 0x8109, 0x2198,
-       0x2104, 0xd084, 0x0108, 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6,
-       0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a,
-       0x1208, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0140, 0x810f,
-       0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107,
-       0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211, 0xd4c4,
-       0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, 0xd0fc, 0x0de8,
-       0xa084, 0x01e0, 0x01d0, 0x7d10, 0x2031, 0x8f54, 0x2634, 0x78a8,
-       0x8000, 0x78aa, 0xd08c, 0x1138, 0x7007, 0x0006, 0x7004, 0xd094,
-       0x1de8, 0x0804, 0x2186, 0x2069, 0x4747, 0x206b, 0x0003, 0x78ac,
-       0xa085, 0x0300, 0x78ae, 0xa006, 0x0048, 0x2030, 0x75d6, 0x2091,
-       0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091, 0x8001,
-       0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a, 0x721e,
-       0xd5c4, 0x0110, 0x7322, 0x7426, 0x0005, 0x6084, 0xa086, 0x0103,
-       0x11d8, 0x6114, 0x6018, 0xa105, 0x11b8, 0x2069, 0x0000, 0x6818,
-       0xd084, 0x1190, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020,
-       0x681b, 0x0001, 0x2091, 0x4080, 0x080c, 0x1dd0, 0x0e04, 0x2243,
-       0x786c, 0xa065, 0x1d10, 0x0005, 0x0059, 0x1530, 0x786c, 0xa065,
-       0x19e0, 0x0410, 0x0029, 0x1500, 0x786c, 0xa065, 0x1dd8, 0x00e0,
-       0x6084, 0xa086, 0x0103, 0x1168, 0x6018, 0xc0fc, 0x601a, 0xa086,
-       0x0004, 0x1138, 0x7804, 0xd0a4, 0x0120, 0x080c, 0x1dd0, 0xa006,
-       0x0005, 0x0079, 0x1118, 0xa085, 0x0001, 0x0005, 0x00b9, 0x1110,
-       0x2041, 0x0001, 0x7d10, 0x0005, 0x88ff, 0x0110, 0x2091, 0x4080,
-       0x0005, 0x7b90, 0x7994, 0x70d4, 0xa102, 0x1118, 0xa385, 0x0000,
-       0x0005, 0x0210, 0xa302, 0x0005, 0x8002, 0x0005, 0xa184, 0xff00,
-       0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
-       0x0018, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0,
-       0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018, 0x6028,
-       0xa005, 0x0110, 0x2009, 0x0040, 0x080c, 0x1b34, 0x01d0, 0x78a8,
-       0x8000, 0x78aa, 0xd08c, 0x1510, 0x6014, 0xd0fc, 0x1118, 0x2069,
-       0x4740, 0x0010, 0x2069, 0x4780, 0x2091, 0x8000, 0x681f, 0x0003,
-       0x78ab, 0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001,
-       0x0068, 0x78ab, 0x0000, 0x080c, 0x1dd0, 0x7990, 0x7894, 0x8000,
-       0xa10a, 0x1208, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071, 0x0010,
-       0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, 0x2009, 0x4758, 0x0010,
-       0x2009, 0x4798, 0x2091, 0x8000, 0x200a, 0x00f6, 0x2009, 0x4780,
-       0x2079, 0x0100, 0xd7fc, 0x1120, 0x2009, 0x4740, 0x2079, 0x0200,
-       0x2104, 0xa086, 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009, 0x4745,
-       0x0010, 0x2009, 0x4785, 0x2104, 0xa005, 0x1130, 0x7830, 0xa084,
-       0x00c0, 0x1110, 0x781b, 0x0052, 0x00fe, 0x0005, 0x2009, 0x0002,
-       0x2069, 0x4700, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x234b,
-       0x2071, 0x4780, 0x2079, 0x0100, 0x2021, 0x49bf, 0x784b, 0x000f,
-       0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118, 0x2019, 0x3e37, 0x0030,
-       0x20a1, 0x012b, 0x2019, 0x3e37, 0xd184, 0x0110, 0x20a1, 0x022b,
-       0x2304, 0xa005, 0x0140, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398,
-       0x53a6, 0x3318, 0x0ca8, 0x789b, 0x0000, 0x789b, 0x0020, 0x20a9,
-       0x0010, 0x78af, 0x0000, 0x78af, 0x2020, 0x1f04, 0x2329, 0x7003,
-       0x0000, 0x0016, 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd, 0x080c,
-       0x246c, 0x001e, 0x7020, 0xa084, 0x000f, 0xa085, 0x6300, 0x7806,
-       0x780f, 0x9000, 0x7843, 0x00d8, 0x7853, 0x0090, 0x780b, 0x2f08,
-       0x7452, 0x704f, 0x0000, 0x8109, 0x0140, 0x2071, 0x4740, 0x2079,
-       0x0200, 0x2021, 0x47bf, 0x0804, 0x2306, 0x080c, 0x2526, 0x0005,
-       0x0016, 0x2011, 0x0101, 0xd1bc, 0x1110, 0x2011, 0x0201, 0xa18c,
-       0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x001e, 0x080c,
-       0x246c, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, 0x2011, 0x0201,
-       0x20a9, 0x0009, 0x810b, 0x1f04, 0x2372, 0xa18c, 0x0e00, 0x2204,
-       0xa084, 0xf1ff, 0xa105, 0x2012, 0x0005, 0x2019, 0x0002, 0x2009,
-       0x0101, 0x20a9, 0x0005, 0x8213, 0x1f04, 0x2383, 0xa294, 0x00e0,
-       0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0118, 0x2009,
-       0x0201, 0x0c78, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, 0x2011,
-       0x0201, 0x20a9, 0x000c, 0x810b, 0x1f04, 0x239b, 0xa18c, 0xf000,
-       0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x0005, 0x2011, 0x0102,
-       0xd3fc, 0x1110, 0x2011, 0x0202, 0x2204, 0xa09c, 0x0f30, 0xa084,
-       0xf0cf, 0xa105, 0x2012, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc,
-       0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020,
-       0x609a, 0x62ac, 0x63ac, 0x00ce, 0x0005, 0x00c6, 0x2061, 0x0100,
-       0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080,
-       0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x00ce, 0x0005,
-       0x00c6, 0x2061, 0x0100, 0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc,
-       0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0xa28c, 0x0020,
-       0x0118, 0xc2ac, 0xa39d, 0x4000, 0xc3ec, 0xd3b4, 0x1108, 0xc3ed,
-       0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, 0x0005, 0x2091,
-       0x8000, 0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, 0x2450, 0xd1fc,
-       0x0118, 0x2061, 0x8ed0, 0x0010, 0x2061, 0x8dc0, 0x080c, 0x2458,
-       0x0560, 0x20a9, 0x0101, 0xd1fc, 0x0118, 0x2061, 0x8dd0, 0x0010,
-       0x2061, 0x8cc0, 0x00c6, 0x080c, 0x2458, 0x0128, 0x00ce, 0x8c60,
-       0x1f04, 0x2412, 0x04a8, 0x000e, 0xd1fc, 0x0128, 0xa082, 0x8dd0,
-       0x2071, 0x4780, 0x0020, 0xa082, 0x8cc0, 0x2071, 0x4740, 0x7076,
-       0x7172, 0x2138, 0x2001, 0x0004, 0x7062, 0x707f, 0x000f, 0x71d0,
-       0xc1c4, 0x71d2, 0x080c, 0x22cb, 0x00c0, 0xd1fc, 0x1118, 0x2071,
-       0x4740, 0x0010, 0x2071, 0x4780, 0x6020, 0xc0dd, 0x6022, 0x7172,
-       0x2138, 0x2c00, 0x707a, 0x2001, 0x0006, 0x7062, 0x707f, 0x000f,
-       0x71d0, 0xc1c4, 0x71d2, 0x080c, 0x22cb, 0x2001, 0x0000, 0x0010,
-       0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, 0x0005,
-       0x2c04, 0xa005, 0x0170, 0x2060, 0x6010, 0xa306, 0x1140, 0x600c,
-       0xa206, 0x1128, 0x6014, 0xa106, 0x1110, 0xa006, 0x0020, 0x6000,
-       0x0c80, 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x2079,
-       0x4780, 0x2071, 0x0100, 0xd1bc, 0x1120, 0x2079, 0x4740, 0x2071,
-       0x0200, 0x7920, 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x1110, 0x001e,
-       0x0060, 0x810b, 0x810b, 0x810b, 0x810b, 0x000e, 0xa18d, 0x0800,
-       0xd0bc, 0x1110, 0xa18d, 0x0f00, 0x2104, 0x00ee, 0x00fe, 0x0005,
-       0x2001, 0x4701, 0x2004, 0xd0ac, 0x1138, 0x68e4, 0xd0ac, 0x0120,
-       0xa084, 0x0006, 0x1108, 0x0009, 0x0005, 0x6014, 0x00e6, 0x0036,
-       0x2018, 0x2071, 0x4c40, 0xd0fc, 0x1110, 0x2071, 0x4bc0, 0x8007,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, 0xa084,
-       0x000a, 0x1904, 0x2523, 0x7108, 0xa194, 0xff00, 0x0904, 0x2523,
-       0xa18c, 0x00ff, 0x701c, 0xa084, 0xff00, 0x01c0, 0x7004, 0xa085,
-       0x003a, 0x7006, 0x2001, 0x0009, 0xa102, 0x16d8, 0x2001, 0x000a,
-       0xa102, 0x16d0, 0x2001, 0x000c, 0xa102, 0x16c8, 0x701c, 0xa084,
-       0x00ff, 0x701e, 0x7004, 0xa084, 0xffdf, 0x7006, 0x2001, 0x000a,
-       0xa106, 0x01a8, 0x2001, 0x000c, 0xa106, 0x01a0, 0x2001, 0x0012,
-       0xa106, 0x0198, 0x2001, 0x0014, 0xa106, 0x0190, 0x2001, 0x0019,
-       0xa106, 0x0188, 0x2001, 0x0032, 0xa106, 0x0180, 0x00d8, 0x2009,
-       0x000c, 0x00d0, 0x2009, 0x0012, 0x00b8, 0x2009, 0x0014, 0x00a0,
-       0x2009, 0x0019, 0x0088, 0x2009, 0x0020, 0x0070, 0x2009, 0x003f,
-       0x0058, 0x2009, 0x000a, 0x0040, 0x2009, 0x000c, 0x0028, 0x2009,
-       0x0019, 0x0010, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x7004,
-       0xa085, 0x000a, 0x7006, 0x2071, 0x4700, 0x7004, 0xd0bc, 0x0158,
-       0xd3fc, 0x1120, 0x73ea, 0x2071, 0x4740, 0x0018, 0x73ee, 0x2071,
-       0x4780, 0x701f, 0x000d, 0x003e, 0x00ee, 0x0005, 0x2001, 0x01ff,
-       0x2004, 0xd0fc, 0x11d0, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
-       0x12a0, 0x2071, 0x0200, 0x71ec, 0xa18c, 0x1c00, 0x810f, 0x810c,
-       0x810c, 0x2079, 0x0100, 0x78ec, 0xa084, 0x1c00, 0x8007, 0x8004,
-       0x8004, 0xa105, 0xa08a, 0x0007, 0x0208, 0x0005, 0x0002, 0x2574,
-       0x255b, 0x2574, 0x255b, 0x254e, 0x2568, 0x254e, 0x7008, 0xa084,
-       0xc3ff, 0xa085, 0x3000, 0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085,
-       0x3000, 0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff, 0xa085, 0x2000,
-       0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x780a, 0x0005,
-       0x7008, 0xa084, 0xc3ff, 0xa085, 0x0c00, 0x700a, 0x7808, 0xa084,
-       0xc3ff, 0xa085, 0x0c00, 0x780a, 0x0005, 0x0e04, 0x2575, 0x2091,
-       0x8000, 0x2071, 0x0000, 0x0006, 0x7018, 0xd084, 0x1de8, 0x000e,
-       0x2071, 0x0010, 0x70ca, 0x000e, 0x70c6, 0x70c3, 0x8002, 0x70db,
-       0x0a04, 0x70df, 0x002a, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091,
-       0x4080, 0x0cf8, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708a,
-       0x758e, 0x7492, 0x7696, 0x779a, 0xa594, 0x003f, 0xd4f4, 0x0138,
-       0xd7bc, 0x1128, 0xa784, 0x007d, 0x1904, 0x3c9c, 0x0871, 0xa49c,
-       0x000f, 0xa382, 0x0004, 0x0320, 0xa3a6, 0x0007, 0x1930, 0x2418,
-       0x8507, 0xa084, 0x000f, 0x0002, 0x2b6c, 0x2c57, 0x2c95, 0x2efb,
-       0x3279, 0x32d0, 0x3376, 0x3405, 0x34d9, 0x35ab, 0x25c7, 0x25c4,
-       0x299e, 0x2a85, 0x324d, 0x25c4, 0x080c, 0x2575, 0x0005, 0xa006,
-       0x0038, 0x7808, 0xc08d, 0x780a, 0xa006, 0x7002, 0x704a, 0x7042,
-       0x70ce, 0x705c, 0xa005, 0x1904, 0x2718, 0x7060, 0xa084, 0x0007,
-       0x0002, 0x25e1, 0x2652, 0x265a, 0x2663, 0x266c, 0x26fe, 0x2675,
-       0x2652, 0x7830, 0xd0bc, 0x1d10, 0x71d0, 0xd1bc, 0x19f8, 0xd1b4,
-       0x1904, 0x262f, 0x70a0, 0xa086, 0x0001, 0x09c0, 0x7014, 0xa005,
-       0x19a8, 0x70b0, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0080,
-       0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
-       0xa886, 0x0001, 0x0118, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d,
-       0x6e1c, 0x2001, 0x0010, 0x0804, 0x284b, 0x705c, 0xa005, 0x1904,
-       0x25c6, 0x00c6, 0x00d6, 0x70b0, 0xa06d, 0x6800, 0xa065, 0xa055,
-       0x789b, 0x0080, 0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804,
-       0xa06d, 0xa05d, 0xa886, 0x0001, 0x0118, 0x69bc, 0x7daa, 0x79aa,
-       0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0804, 0x284b, 0x080c,
-       0x3c5b, 0x1904, 0x25c6, 0x781b, 0x0068, 0x70b8, 0xa06d, 0x68b4,
-       0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808,
-       0xc08d, 0x780a, 0x68bc, 0x703e, 0xc1b4, 0x71d2, 0x70b4, 0xa065,
-       0x68c0, 0x7056, 0x7003, 0x0002, 0x2d00, 0x704a, 0xad80, 0x0009,
-       0x7042, 0x0005, 0x080c, 0x3c5b, 0x1120, 0x781b, 0x0054, 0x7003,
-       0x0004, 0x0005, 0x080c, 0x3c5b, 0x1128, 0x2011, 0x000c, 0x0419,
-       0x7003, 0x0004, 0x0005, 0x080c, 0x3c5b, 0x1128, 0x2011, 0x0006,
-       0x00d1, 0x7003, 0x0004, 0x0005, 0x080c, 0x3c5b, 0x1128, 0x2011,
-       0x000d, 0x0089, 0x7003, 0x0004, 0x0005, 0x080c, 0x3c5b, 0x1150,
-       0x2011, 0x0006, 0x0041, 0x7078, 0x707b, 0x0000, 0x2068, 0x704a,
-       0x7003, 0x0004, 0x0005, 0x7170, 0xc1fc, 0x8107, 0x7882, 0x789b,
-       0x0080, 0xa286, 0x000c, 0x1120, 0x7aaa, 0x2001, 0x0001, 0x0098,
-       0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, 0x000d, 0x0120,
-       0x7aaa, 0x2001, 0x0002, 0x0038, 0x78ab, 0x0020, 0x7174, 0x79aa,
-       0x7aaa, 0x2001, 0x0004, 0x789b, 0x0060, 0x78aa, 0x785b, 0x0004,
-       0x781b, 0x0113, 0x080c, 0x3c6e, 0x707f, 0x000f, 0x70d0, 0xd0b4,
-       0x0168, 0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084,
-       0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x0005, 0x7014,
-       0xa005, 0x1138, 0x70d0, 0xd0b4, 0x0128, 0x70b4, 0xac06, 0x1110,
-       0x0c29, 0x0005, 0x0016, 0x71a0, 0xa186, 0x0001, 0x0528, 0x00d6,
-       0x0026, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b0, 0x2068, 0x6800,
-       0xac06, 0x0120, 0x8211, 0x01b0, 0x00c9, 0x0cc8, 0x00c6, 0x2100,
-       0x2011, 0x0001, 0xa212, 0x70b0, 0x2068, 0x6800, 0x2060, 0x6008,
-       0xa084, 0xfbef, 0x600a, 0x8211, 0x0110, 0x0041, 0x0cb0, 0x70a3,
-       0x0001, 0x00ce, 0x002e, 0x00de, 0x001e, 0x0005, 0xade8, 0x0005,
-       0x70a8, 0xad06, 0x1110, 0x70a4, 0x2068, 0x0005, 0x080c, 0x3c5b,
-       0x1904, 0x25c6, 0x7078, 0x2068, 0x7770, 0x080c, 0x3b95, 0x2c50,
-       0x080c, 0x3cf6, 0x789b, 0x0080, 0x6814, 0xa084, 0x001f, 0xc0bd,
-       0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004, 0x0804, 0x2850,
-       0x080c, 0x3c5b, 0x1904, 0x25c6, 0x789b, 0x0080, 0x705c, 0x2068,
-       0x6f14, 0x70d0, 0xd0b4, 0x0168, 0xc0b4, 0x70d2, 0x00c6, 0x70b4,
-       0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a,
-       0x00ce, 0x080c, 0x3b95, 0x2c50, 0x080c, 0x3cf6, 0x6824, 0xa005,
-       0x0130, 0xa082, 0x0006, 0x0208, 0x0010, 0x6827, 0x0005, 0x6814,
-       0xa084, 0x001f, 0xc0bd, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001,
-       0x2001, 0x0003, 0x0804, 0x2850, 0xc28d, 0x72d2, 0x72bc, 0xa200,
-       0xa015, 0x7150, 0x8108, 0xa12a, 0x0208, 0x71bc, 0x2164, 0x6504,
-       0x85ff, 0x1170, 0x7152, 0x8421, 0x1da8, 0x70d0, 0xd08c, 0x0128,
-       0x70cc, 0xa005, 0x1110, 0x70cf, 0x000a, 0x0005, 0x2200, 0x0c90,
-       0x70d0, 0xc08c, 0x70d2, 0x70cf, 0x0000, 0x6034, 0xa005, 0x1db0,
-       0x6708, 0xa784, 0x073f, 0x01d0, 0xd7d4, 0x1d80, 0xa784, 0x0021,
-       0x1d68, 0xa784, 0x0002, 0x0130, 0xa784, 0x0004, 0x0d38, 0xa7bc,
-       0xfffb, 0x670a, 0xa784, 0x0218, 0x1d08, 0xa784, 0x0100, 0x0130,
-       0x6018, 0xa005, 0x19d8, 0xa7bc, 0xfeff, 0x670a, 0x2568, 0x6823,
-       0x0000, 0x6e1c, 0xa684, 0x000e, 0x6318, 0x0128, 0x601c, 0xa302,
-       0x0220, 0x0118, 0x0858, 0x83ff, 0x1948, 0x2d58, 0x2c50, 0x7152,
-       0xd7bc, 0x1120, 0x7028, 0x6022, 0x603a, 0x0010, 0xc7bc, 0x670a,
-       0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041, 0x0001, 0x6b14,
-       0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0110, 0xd684, 0x0110,
-       0xa39c, 0xffbf, 0xd6a4, 0x0110, 0xa39d, 0x0020, 0xa684, 0x000e,
-       0x1904, 0x2802, 0xc7a5, 0x670a, 0x2c00, 0x68c6, 0x77a0, 0xa786,
-       0x0001, 0x1178, 0x70d0, 0xd0b4, 0x1160, 0x7000, 0xa082, 0x0002,
-       0x1240, 0x7830, 0xd0bc, 0x1128, 0x789b, 0x0080, 0x7baa, 0x0804,
-       0x2849, 0x8739, 0x77a2, 0x2750, 0x77ac, 0xa7b0, 0x0005, 0x70a8,
-       0xa606, 0x1108, 0x76a4, 0x76ae, 0x2c3a, 0x8738, 0x2d3a, 0x8738,
-       0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc, 0x0150,
-       0x2091, 0x8000, 0x2091, 0x303d, 0x70d0, 0xa084, 0x303d, 0x2091,
-       0x8000, 0x2090, 0xaad5, 0x0000, 0x0120, 0x8421, 0x2200, 0x1904,
-       0x2751, 0x0005, 0xd1dc, 0x0904, 0x37f1, 0x2029, 0x0020, 0xd69c,
-       0x1120, 0x8528, 0xd68c, 0x1108, 0x8528, 0x8840, 0x6f14, 0x610c,
-       0x8108, 0xa18c, 0x00ff, 0x70c8, 0xa160, 0x2c64, 0x8cff, 0x0188,
-       0x6014, 0xa706, 0x1dd0, 0x60b8, 0x8001, 0x60ba, 0x1d88, 0x2a60,
-       0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x1904, 0x2751,
-       0x0005, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840, 0x6008,
-       0xc0d5, 0x600a, 0x77a0, 0xa786, 0x0001, 0x1904, 0x27d9, 0x70d0,
-       0xd0b4, 0x1904, 0x27d9, 0x7000, 0xa082, 0x0002, 0x1a04, 0x27d9,
-       0x7830, 0xd0bc, 0x1904, 0x27d9, 0x789b, 0x0080, 0x7baa, 0x7daa,
-       0x79aa, 0x2001, 0x0002, 0x0006, 0x6018, 0x8000, 0x601a, 0x0008,
-       0x0006, 0x2960, 0x6104, 0x2a60, 0x080c, 0x3d09, 0x1590, 0xa184,
-       0x0018, 0x0180, 0xa184, 0x0010, 0x0118, 0x080c, 0x399a, 0x1548,
-       0xa184, 0x0008, 0x0138, 0x69a0, 0xa184, 0x0600, 0x1118, 0x080c,
-       0x38b8, 0x00f8, 0x69a0, 0xa184, 0x1e00, 0x0528, 0xa184, 0x0800,
-       0x0178, 0x00c6, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104,
-       0xa18d, 0x0010, 0x6106, 0x00ce, 0x080c, 0x399a, 0x1150, 0x69a0,
-       0xa184, 0x0200, 0x0118, 0x080c, 0x38fd, 0x0018, 0xa184, 0x0400,
-       0x19f0, 0x69a0, 0xa184, 0x1000, 0x0130, 0x6914, 0xa18c, 0xff00,
-       0x810f, 0x080c, 0x23c5, 0x002e, 0xa68c, 0x00e0, 0xa684, 0x0060,
-       0x0128, 0xa086, 0x0060, 0x1110, 0xa18d, 0x4000, 0xa18d, 0x0104,
-       0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a,
-       0xd6bc, 0x0168, 0xc0fc, 0x7083, 0x0000, 0xa08a, 0x000d, 0x0328,
-       0xa08a, 0x000c, 0x7182, 0x2001, 0x000c, 0x800c, 0x7186, 0x78aa,
-       0x3518, 0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0,
-       0x789b, 0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898,
-       0x25a0, 0xa286, 0x0020, 0x1508, 0x70d0, 0xc0b5, 0x70d2, 0x2c00,
-       0x70b6, 0x2d00, 0x70ba, 0x6814, 0xc0fc, 0x8007, 0x7882, 0xa286,
-       0x0002, 0x0904, 0x2921, 0x70a0, 0x8000, 0x70a2, 0x74b0, 0xa498,
-       0x0005, 0x70a8, 0xa306, 0x1108, 0x73a4, 0x73b2, 0xa286, 0x0010,
-       0x0904, 0x25c6, 0x00de, 0x00ce, 0x0005, 0x7000, 0xa005, 0x19e0,
-       0xa286, 0x0002, 0x1904, 0x2938, 0x080c, 0x3c5b, 0x19a8, 0x6814,
-       0xc0fc, 0x8007, 0x7882, 0x2091, 0x8000, 0x781b, 0x0068, 0x68b4,
-       0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x2091,
-       0x8001, 0x7808, 0xc08d, 0x780a, 0x0126, 0x00d6, 0x00c6, 0x70d0,
-       0xa084, 0x2e00, 0x2090, 0x00ce, 0x00de, 0x012e, 0x2900, 0x7056,
-       0x68bc, 0x703e, 0x7003, 0x0002, 0x2d00, 0x704a, 0xad80, 0x0009,
-       0x7042, 0x7830, 0xd0bc, 0x0140, 0x2091, 0x303d, 0x70d0, 0xa084,
-       0x303d, 0x2091, 0x8000, 0x2090, 0x70a0, 0xa005, 0x1108, 0x0005,
-       0x8421, 0x0de8, 0x724c, 0x70bc, 0xa200, 0xa015, 0x0804, 0x2751,
-       0xa286, 0x0010, 0x1560, 0x080c, 0x3c5b, 0x1904, 0x28cc, 0x6814,
-       0xc0fc, 0x8007, 0x7882, 0x781b, 0x0068, 0x68b4, 0x785a, 0x6894,
-       0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a,
-       0x70a0, 0x8000, 0x70a2, 0x74b0, 0xa490, 0x0005, 0x70a8, 0xa206,
-       0x1108, 0x72a4, 0x72b2, 0x2900, 0x7056, 0x68bc, 0x703e, 0x7003,
-       0x0002, 0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005, 0x6bb4,
-       0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94,
-       0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x0068, 0x2900,
-       0x7056, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605, 0x0170,
-       0x70d0, 0xa084, 0x2e00, 0xa086, 0x2600, 0x1118, 0x2009, 0x0000,
-       0x0010, 0x2009, 0x0001, 0xa284, 0x000f, 0x0033, 0xad80, 0x0009,
-       0x7042, 0x2d00, 0x704a, 0x0005, 0x299c, 0x4208, 0x4208, 0x41f6,
-       0x4208, 0x299c, 0x299c, 0x299c, 0x080c, 0x2575, 0x7808, 0xa084,
-       0xfffd, 0x780a, 0x00f6, 0x2079, 0x4700, 0x78ac, 0x00fe, 0xd084,
-       0x01c0, 0x7160, 0xa186, 0x0001, 0x0904, 0x2a61, 0xa186, 0x0007,
-       0x0170, 0xa186, 0x0005, 0x1158, 0x7078, 0x2068, 0x681b, 0x0004,
-       0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7063,
-       0x0000, 0x70a3, 0x0000, 0x70a4, 0x70ae, 0x70b2, 0x080c, 0x26ae,
-       0x0156, 0x2011, 0x0004, 0x7160, 0xa186, 0x0001, 0x0158, 0xa186,
-       0x0007, 0x1118, 0x701f, 0x0005, 0x0010, 0x701f, 0x0001, 0x70d0,
-       0xc0c5, 0x70d2, 0x2001, 0x470a, 0x2004, 0xa084, 0x00ff, 0xa086,
-       0x0018, 0x0130, 0x7018, 0x7016, 0xa005, 0x1110, 0x70a3, 0x0001,
-       0x0066, 0x080c, 0x3f4e, 0x20a9, 0x0010, 0x2039, 0x0000, 0x080c,
-       0x3a8b, 0xa7b8, 0x0100, 0x1f04, 0x29ef, 0x006e, 0x7000, 0x0002,
-       0x2a2c, 0x2a0a, 0x2a0a, 0x2a02, 0x2a2c, 0x2a2c, 0x2a2c, 0x2a00,
-       0x080c, 0x2575, 0x705c, 0xa005, 0x0538, 0xad06, 0x1118, 0x6800,
-       0x705e, 0x0080, 0x6820, 0xd084, 0x1148, 0x6f14, 0x080c, 0x3b95,
-       0x6008, 0xc0d4, 0x600a, 0x080c, 0x37c7, 0x0020, 0x7058, 0x2060,
-       0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc, 0x0108,
-       0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff,
-       0xc09d, 0x6822, 0x080c, 0x1dbf, 0x2011, 0x0004, 0x74c8, 0xa4a0,
-       0x0100, 0x04b1, 0xaea0, 0x0017, 0x0499, 0x20a9, 0x0101, 0x74c8,
-       0x0479, 0x8420, 0x1f04, 0x2a38, 0x70c0, 0x2060, 0x2021, 0x0002,
-       0x20a9, 0x0100, 0x6110, 0x81ff, 0x0198, 0x6018, 0x0016, 0x0006,
-       0x2011, 0x4702, 0x220c, 0xa102, 0x2012, 0x000e, 0x001e, 0xa102,
-       0x0338, 0x6012, 0x1128, 0x2011, 0x4704, 0x2204, 0xc0a5, 0x2012,
-       0x601b, 0x0000, 0xace0, 0x0010, 0x1f04, 0x2a42, 0x8421, 0x1d00,
-       0x015e, 0x7063, 0x0000, 0x7003, 0x0000, 0x704b, 0x0000, 0x0005,
-       0x0046, 0x2404, 0xa005, 0x01a8, 0x2068, 0x6800, 0x0006, 0x6a1a,
-       0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e,
-       0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1dbf, 0x000e,
-       0x0c48, 0x004e, 0x2023, 0x0000, 0x0005, 0xa282, 0x0003, 0x0310,
-       0x080c, 0x2575, 0x2300, 0x0002, 0x2a8f, 0x2b0c, 0x2b1a, 0xa282,
-       0x0002, 0x0110, 0x080c, 0x2575, 0x7060, 0x7063, 0x0000, 0x707f,
-       0x0000, 0x0022, 0x77d0, 0xc7c5, 0x77d2, 0x0002, 0x2aa6, 0x2aa6,
-       0x2aa8, 0x2ae0, 0x37fb, 0x2aa6, 0x2ae0, 0x2aa6, 0x080c, 0x2575,
-       0x7770, 0x080c, 0x3a8b, 0x7770, 0xa7bc, 0x8f00, 0x080c, 0x3b95,
-       0x6018, 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0x8dc0, 0x0010,
-       0x2021, 0x8ed0, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c, 0x2b34,
-       0x01b8, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021, 0x8cc0,
-       0x0010, 0x2021, 0x8dd0, 0x0046, 0x2009, 0x0005, 0x2011, 0x0010,
-       0x080c, 0x2b34, 0x004e, 0x0118, 0x8420, 0x1f04, 0x2acb, 0x015e,
-       0x8738, 0xa784, 0x001f, 0x1990, 0x0804, 0x25c9, 0x0804, 0x25c9,
-       0x7770, 0x080c, 0x3b95, 0x6018, 0xa005, 0x0520, 0xd7fc, 0x1118,
-       0x2021, 0x8dc0, 0x0010, 0x2021, 0x8ed0, 0x2009, 0x0005, 0x2011,
-       0x0020, 0x080c, 0x2b34, 0x01b0, 0x0156, 0x20a9, 0x0101, 0xd7fc,
-       0x1118, 0x2021, 0x8cc0, 0x0010, 0x2021, 0x8dd0, 0x0046, 0x2009,
-       0x0005, 0x2011, 0x0020, 0x0481, 0x004e, 0x0118, 0x8420, 0x1f04,
-       0x2afe, 0x015e, 0x0804, 0x25c9, 0x2200, 0x0002, 0x2b11, 0x2b13,
-       0x2b13, 0x080c, 0x2575, 0x7063, 0x0000, 0x70d0, 0xc0c5, 0x70d2,
-       0x0804, 0x25c9, 0x2200, 0x0002, 0x2b21, 0x2b13, 0x2b1f, 0x080c,
-       0x2575, 0x080c, 0x3f4e, 0x7000, 0xa086, 0x0002, 0x1904, 0x3780,
-       0x080c, 0x37e1, 0x6008, 0xa084, 0xfbef, 0x600a, 0x080c, 0x3772,
-       0x0904, 0x3780, 0x0804, 0x25c9, 0x2404, 0xa005, 0x0590, 0x2068,
-       0x2d04, 0x0006, 0x6814, 0xa706, 0x0118, 0x2d20, 0x000e, 0x0ca8,
-       0x000e, 0x2022, 0x691a, 0x6817, 0x0000, 0x682b, 0x0000, 0x68b4,
-       0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, 0x00ff, 0xa205, 0x6822,
-       0x080c, 0x1dbf, 0x2021, 0x4702, 0x241c, 0x8319, 0x2322, 0x6010,
-       0x8001, 0x6012, 0x1128, 0x2021, 0x4704, 0x2404, 0xc0a5, 0x2022,
-       0x6008, 0xa084, 0xf9ef, 0x600a, 0x080c, 0x26ca, 0x080c, 0x37e1,
-       0x0005, 0xa085, 0x0001, 0x0ce0, 0x2300, 0x0002, 0x2b73, 0x2b71,
-       0x2bee, 0x080c, 0x2575, 0x78e4, 0xa005, 0x17b0, 0x3208, 0xa18c,
-       0x0800, 0x0118, 0x0104, 0x25c6, 0x0010, 0x0304, 0x25c6, 0x2008,
-       0xa084, 0x0030, 0x1110, 0x0804, 0x324d, 0x78ec, 0xa084, 0x0003,
-       0x0dd0, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184,
-       0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184,
-       0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001,
-       0x0001, 0x0002, 0x2bd1, 0x2bda, 0x2bc7, 0x2baa, 0x3c4f, 0x3c4f,
-       0x2baa, 0x2be4, 0x080c, 0x2575, 0x7000, 0xa086, 0x0004, 0x1190,
-       0x7060, 0xa086, 0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000,
-       0x0804, 0x2a85, 0x7060, 0xa086, 0x0006, 0x0db0, 0x7060, 0xa086,
-       0x0004, 0x0d90, 0x79e4, 0x2001, 0x0003, 0x0804, 0x2f3b, 0x6818,
-       0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a61, 0x781b, 0x006e,
-       0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a61,
-       0x0804, 0x3c2d, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c,
-       0x3a61, 0x781b, 0x00fa, 0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b,
-       0x001d, 0x080c, 0x3a61, 0x781b, 0x00cb, 0x0005, 0xa584, 0x000f,
-       0x11c0, 0x7000, 0x0002, 0x25c9, 0x2bfb, 0x2bfd, 0x3780, 0x3780,
-       0x3780, 0x2bfb, 0x2bfb, 0x080c, 0x2575, 0x080c, 0x37e1, 0x6008,
-       0xa084, 0xfbef, 0x600a, 0x080c, 0x3772, 0x0904, 0x3780, 0x0804,
-       0x25c9, 0x78e4, 0xa005, 0x1b04, 0x2bac, 0x3208, 0xa18c, 0x0800,
-       0x0118, 0x0104, 0x2bac, 0x0010, 0x0304, 0x2bac, 0x2008, 0xa084,
-       0x0030, 0x1118, 0x781b, 0x0068, 0x0005, 0x78ec, 0xa084, 0x0003,
-       0x0dc8, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184,
-       0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184,
-       0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001,
-       0x0001, 0x0002, 0x2c49, 0x2c4d, 0x2c44, 0x2c42, 0x3c4f, 0x3c4f,
-       0x2c42, 0x3c49, 0x080c, 0x2575, 0x080c, 0x3a67, 0x781b, 0x006e,
-       0x0005, 0x080c, 0x3a67, 0x0804, 0x3c2d, 0x080c, 0x3a67, 0x781b,
-       0x00fa, 0x0005, 0x080c, 0x3a67, 0x781b, 0x00cb, 0x0005, 0x2300,
-       0x0002, 0x2c5e, 0x2c5c, 0x2c60, 0x080c, 0x2575, 0x0804, 0x3405,
-       0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0904,
-       0x3405, 0x78ec, 0xa084, 0x0003, 0x0904, 0x3405, 0xa184, 0x0100,
-       0x0d98, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184,
-       0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184,
-       0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001,
-       0x0001, 0x0002, 0x2c92, 0x2c4d, 0x2bc7, 0x3c0b, 0x3c4f, 0x3c4f,
-       0x3c0b, 0x3c49, 0x080c, 0x3c17, 0x0005, 0xa282, 0x0005, 0x0310,
-       0x080c, 0x2575, 0x7898, 0x2040, 0x2300, 0x0002, 0x2ca1, 0x2ecb,
-       0x2ed5, 0x2200, 0x0002, 0x2cbd, 0x2caa, 0x2cbd, 0x2ca8, 0x2ead,
-       0x080c, 0x2575, 0x789b, 0x0018, 0x78a8, 0x2010, 0xa084, 0x00ff,
-       0xa082, 0x0020, 0x0a04, 0x3a30, 0xa08a, 0x0004, 0x1a04, 0x3a30,
-       0x0002, 0x3a30, 0x3a30, 0x3a30, 0x39e4, 0x789b, 0x0018, 0x79a8,
-       0xa184, 0x0080, 0x0148, 0x0804, 0x3a30, 0x7000, 0xa005, 0x1dd8,
-       0x2011, 0x0004, 0x0804, 0x35b7, 0xa184, 0x00ff, 0xa08a, 0x0010,
-       0x1a04, 0x3a30, 0x0002, 0x2ce5, 0x2ce3, 0x2cf7, 0x2cfb, 0x2da9,
-       0x3a30, 0x3a30, 0x2dab, 0x3a30, 0x3a30, 0x2ea9, 0x2ea9, 0x3a30,
-       0x3a30, 0x3a30, 0x2eab, 0x080c, 0x2575, 0xd6e4, 0x0140, 0x2001,
-       0x0300, 0x8000, 0x8000, 0x783a, 0x781b, 0x00c7, 0x0005, 0x6818,
-       0xd0fc, 0x0118, 0x681b, 0x001d, 0x0c90, 0x0804, 0x3c0b, 0x681b,
-       0x001d, 0x0804, 0x3a5b, 0x6920, 0x6922, 0xa684, 0x1800, 0x1904,
-       0x2d4c, 0x6820, 0xd084, 0x1904, 0x2d54, 0x6818, 0xa086, 0x0008,
-       0x1110, 0x681b, 0x0000, 0xd6d4, 0x0568, 0xd6bc, 0x0558, 0x7083,
-       0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0718, 0xa08a,
-       0x000c, 0x7182, 0x2001, 0x000c, 0x800c, 0x7186, 0x789b, 0x0061,
-       0x78aa, 0x0156, 0x0136, 0x0146, 0x0016, 0x3208, 0xa18c, 0x0600,
-       0x0118, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x001e, 0x789b,
-       0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x014e,
-       0x013e, 0x015e, 0x6038, 0xa005, 0x1150, 0x681c, 0xa084, 0x000e,
-       0x0904, 0x3a5b, 0x080c, 0x3a6d, 0x782b, 0x3008, 0x0010, 0x8001,
-       0x603a, 0x781b, 0x0071, 0x0005, 0xd6e4, 0x0130, 0x781b, 0x0083,
-       0x0005, 0x781b, 0x0083, 0x0005, 0xa684, 0x0060, 0x0dd0, 0xd6dc,
-       0x0dc0, 0xd6fc, 0x01a0, 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8,
-       0x78d0, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98,
-       0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4,
-       0x0118, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003, 0x1148,
-       0x0006, 0x080c, 0x3f4e, 0x080c, 0x4208, 0x000e, 0x781b, 0x0080,
-       0x0005, 0xa006, 0x080c, 0x42e8, 0x6ab0, 0x69ac, 0x6c98, 0x6b94,
-       0x2200, 0xa105, 0x0120, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa,
-       0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x1130,
-       0xc6f5, 0x7e5a, 0x6eb6, 0x781b, 0x0080, 0x0005, 0x781b, 0x0080,
-       0x2200, 0xa115, 0x1118, 0x080c, 0x4208, 0x0005, 0x080c, 0x4235,
-       0x0005, 0x080c, 0x2575, 0x0804, 0x2e3f, 0x00c6, 0x7054, 0x2060,
-       0x6920, 0xa18c, 0xecff, 0x6922, 0x6000, 0xa084, 0xcfdf, 0x6002,
-       0x080c, 0x3917, 0xa006, 0x2040, 0x2038, 0x080c, 0x39bf, 0x0804,
-       0x2e33, 0x00c6, 0x7054, 0x2060, 0x2c48, 0x7aa8, 0xa294, 0x00ff,
-       0xa286, 0x0004, 0x11d8, 0x6920, 0xd1e4, 0x1170, 0x2039, 0x0000,
-       0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x391a,
-       0x080c, 0x39bf, 0x0804, 0x2e33, 0xa18c, 0xecff, 0x6922, 0x6104,
-       0xa18c, 0xffdd, 0x6106, 0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003,
-       0x01d0, 0x6104, 0xa184, 0x0010, 0x0548, 0x080c, 0x3b91, 0x080c,
-       0x399a, 0x88ff, 0x0518, 0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa,
-       0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005,
-       0x781b, 0x0082, 0x0005, 0x6920, 0xd1cc, 0x0130, 0xa18c, 0xfdff,
-       0x6922, 0x6000, 0xc0ec, 0x6002, 0x2039, 0x0000, 0x2041, 0x0000,
-       0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x39bf, 0xa286, 0x0001,
-       0x0158, 0x6104, 0xa184, 0x0008, 0x01b0, 0x080c, 0x3b91, 0x080c,
-       0x38b8, 0x88ff, 0x1980, 0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c,
-       0xfeff, 0x6922, 0x6000, 0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006,
-       0x2010, 0x080c, 0x391a, 0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b,
-       0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0x0804, 0x3a57, 0x2808,
-       0x789b, 0x0080, 0x2019, 0x0080, 0x78a8, 0xa094, 0x00ff, 0xa286,
-       0x0001, 0x11b8, 0x2300, 0xa102, 0xa086, 0x0001, 0x0904, 0x2dad,
-       0x7ca8, 0xa4a4, 0x00ff, 0xa480, 0x0002, 0xa300, 0x2018, 0xa102,
-       0x0a04, 0x2dc1, 0x0904, 0x2dc1, 0x24a8, 0x7aa8, 0x1f04, 0x2e5d,
-       0x0c18, 0xa284, 0x00f0, 0xa082, 0x0020, 0x06b8, 0x2200, 0xa082,
-       0x0021, 0x1698, 0x7aa8, 0x8318, 0x8318, 0x2100, 0xa302, 0x0aa0,
-       0xa286, 0x0023, 0x0950, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58,
-       0xa684, 0xfff1, 0xc0a5, 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a,
-       0x78a0, 0xa005, 0x0904, 0x2e34, 0x20a8, 0x7998, 0x789b, 0x0060,
-       0x78aa, 0x2011, 0x0080, 0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa,
-       0x7a98, 0x1f04, 0x2e8b, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b,
-       0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x8318, 0x2100, 0xa302,
-       0x0a04, 0x2e44, 0xa284, 0x0080, 0x1904, 0x3a5b, 0x78a0, 0xa005,
-       0x08c8, 0x0804, 0x3a5b, 0x0804, 0x3a30, 0x7054, 0xa04d, 0x789b,
-       0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0110, 0x080c,
-       0x2575, 0x7aa8, 0xa294, 0x00ff, 0x784b, 0x0008, 0x78a8, 0xa084,
-       0x00ff, 0xa08a, 0x0005, 0x1a04, 0x3a30, 0x0002, 0x3a30, 0x382f,
-       0x3a30, 0x394a, 0x3d59, 0xa282, 0x0000, 0x1110, 0x080c, 0x2575,
-       0x080c, 0x3a61, 0x781b, 0x0082, 0x0005, 0xa282, 0x0003, 0x1110,
-       0x080c, 0x2575, 0xd4fc, 0x11d0, 0x7060, 0xa005, 0x0110, 0x080c,
-       0x2575, 0x6f14, 0x7772, 0xa7bc, 0x8f00, 0x080c, 0x3b95, 0x6008,
-       0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x1db0, 0x080c,
-       0x3a64, 0x7063, 0x0002, 0x701f, 0x0009, 0x0010, 0x080c, 0x3a70,
-       0x781b, 0x0082, 0x0005, 0xa282, 0x0004, 0x0310, 0x080c, 0x2575,
-       0x2300, 0x0002, 0x2f05, 0x309b, 0x30d7, 0xa286, 0x0003, 0x0598,
-       0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x71d0, 0xd1b4, 0x0528, 0xd1bc,
-       0x1518, 0x2001, 0x4701, 0x2004, 0xd0c4, 0x11f0, 0x7868, 0xa084,
-       0x00ff, 0x11d0, 0xa282, 0x0002, 0x12b8, 0x00d6, 0x783b, 0x8300,
-       0x781b, 0x0059, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6,
-       0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030,
-       0x00de, 0x2001, 0x0000, 0x0058, 0x783b, 0x1300, 0x781b, 0x0057,
-       0x2001, 0x0000, 0x0020, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x7046,
-       0x68a0, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a, 0xa284, 0x000f,
-       0x0002, 0x307c, 0x2f56, 0x2f53, 0x31a7, 0x3232, 0x25c9, 0x2f51,
-       0x2f51, 0x080c, 0x2575, 0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x0120,
-       0x7044, 0xa086, 0x0014, 0x11e8, 0x080c, 0x3f4e, 0x2009, 0x0000,
-       0x6818, 0xd0fc, 0x0108, 0x7044, 0xa086, 0x0014, 0x0168, 0x6818,
-       0xa086, 0x0008, 0x1904, 0x303e, 0x7858, 0xd09c, 0x0904, 0x303e,
-       0x6820, 0xd0ac, 0x0904, 0x303e, 0x681b, 0x0014, 0x2009, 0x0002,
-       0x04a8, 0x7868, 0xa08c, 0x00ff, 0x0588, 0xa186, 0x0008, 0x1158,
-       0x6008, 0xc0a4, 0x600a, 0x080c, 0x3772, 0x0540, 0x080c, 0x37e1,
-       0x080c, 0x3f4e, 0x0060, 0xa186, 0x0028, 0x1500, 0x6018, 0xa005,
-       0x0d78, 0x8001, 0x0d68, 0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820,
-       0xd084, 0x0904, 0x25c9, 0xc084, 0x6822, 0x080c, 0x26bf, 0x7058,
-       0x00c6, 0x2060, 0x6800, 0x6002, 0x00ce, 0x6004, 0x6802, 0xa005,
-       0x2d00, 0x1108, 0x6002, 0x6006, 0x0804, 0x25c9, 0x0016, 0x81ff,
-       0x15f0, 0x7000, 0xa086, 0x0030, 0x05d0, 0x71d0, 0xd1bc, 0x15b8,
-       0xd1b4, 0x11e8, 0x705c, 0xa005, 0x1590, 0x70a0, 0xa086, 0x0001,
-       0x0570, 0x7003, 0x0000, 0x0046, 0x0056, 0x0076, 0x0066, 0x00c6,
-       0x00d6, 0x080c, 0x25f1, 0x00de, 0x00ce, 0x006e, 0x007e, 0x005e,
-       0x004e, 0x71d0, 0xd1b4, 0x11d8, 0x7003, 0x0040, 0x00c0, 0x080c,
-       0x3c5b, 0x11a8, 0x781b, 0x0068, 0x00d6, 0x70b8, 0xa06d, 0x68b4,
-       0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4,
-       0x71d2, 0x7003, 0x0030, 0x7808, 0xc08d, 0x780a, 0x00de, 0x080c,
-       0x30ff, 0x001e, 0x81ff, 0x0904, 0x303e, 0xa684, 0xdf00, 0x681e,
-       0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x1904, 0x303f, 0x6818,
-       0xa086, 0x0014, 0x1130, 0x2008, 0xd6e4, 0x0118, 0x7868, 0xa08c,
-       0x00ff, 0x080c, 0x3a7a, 0x080c, 0x26ca, 0x6820, 0xd0dc, 0x1578,
-       0x8717, 0xa294, 0x000f, 0x8213, 0x8213, 0x8213, 0xb284, 0x0600,
-       0x0118, 0xa290, 0x4bc0, 0x0010, 0xa290, 0x4c40, 0xa290, 0x0000,
-       0x221c, 0xd3c4, 0x0170, 0x6820, 0xd0e4, 0x0128, 0xa084, 0xefff,
-       0x6822, 0xc3ac, 0x2312, 0x8210, 0x2204, 0xa085, 0x0038, 0x2012,
-       0x8211, 0xd3d4, 0x0138, 0x68a0, 0xd0c4, 0x1120, 0x080c, 0x3167,
-       0x0804, 0x25c9, 0x6008, 0xc08d, 0x600a, 0x0008, 0x692a, 0x6916,
-       0x6818, 0xd0fc, 0x0110, 0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e,
-       0x6410, 0x84ff, 0x0168, 0x2009, 0x4702, 0x2104, 0x8001, 0x200a,
-       0x8421, 0x6412, 0x1128, 0x2021, 0x4704, 0x2404, 0xc0a5, 0x2022,
-       0x6018, 0xa005, 0x0118, 0x8001, 0x601a, 0x1118, 0x6008, 0xc0a4,
-       0x600a, 0x6820, 0xd084, 0x1130, 0x6800, 0xa005, 0x1108, 0x6002,
-       0x6006, 0x0020, 0x7058, 0x2060, 0x6800, 0x6002, 0x2061, 0x4700,
-       0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a,
-       0x0110, 0x2d02, 0x0008, 0x616e, 0x7200, 0xa286, 0x0030, 0x0158,
-       0xa286, 0x0040, 0x1904, 0x25c9, 0x7003, 0x0002, 0x7048, 0x2068,
-       0x68c4, 0x2060, 0x0005, 0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc,
-       0x703e, 0x70b4, 0xa065, 0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80,
-       0x0009, 0x7042, 0x0005, 0xa282, 0x0004, 0x0210, 0x080c, 0x2575,
-       0x2200, 0x0002, 0x30a6, 0x30b5, 0x30c1, 0x30b5, 0xa586, 0x1300,
-       0x0160, 0xa586, 0x8300, 0x1d90, 0x7003, 0x0000, 0x6018, 0x8001,
-       0x601a, 0x6008, 0xa084, 0xfbef, 0x600a, 0x7000, 0xa086, 0x0005,
-       0x0128, 0x080c, 0x3a61, 0x781b, 0x0082, 0x0005, 0x781b, 0x0083,
-       0x0005, 0x7890, 0x8007, 0x8001, 0xa084, 0x0007, 0xa080, 0x0018,
-       0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186, 0x0003, 0x0128, 0xa186,
-       0x0000, 0x0110, 0x0804, 0x3a30, 0x781b, 0x0083, 0x0005, 0x6820,
-       0xc095, 0x6822, 0x82ff, 0x1118, 0x080c, 0x3a61, 0x0030, 0x8211,
-       0x0110, 0x080c, 0x2575, 0x080c, 0x3a70, 0x781b, 0x0082, 0x0005,
-       0x080c, 0x3c6e, 0x7830, 0xa084, 0x00c0, 0x1170, 0x0016, 0x3208,
-       0xa18c, 0x0800, 0x001e, 0x0118, 0x0104, 0x30fc, 0x0010, 0x0304,
-       0x30fc, 0x791a, 0xa006, 0x0005, 0xa085, 0x0001, 0x0005, 0xa684,
-       0x0060, 0x1130, 0x682f, 0x0000, 0x6833, 0x0000, 0x0804, 0x3166,
-       0xd6dc, 0x1198, 0x68b4, 0xd0dc, 0x1180, 0x6998, 0x6a94, 0x692e,
-       0x6a32, 0x7044, 0xa005, 0x1130, 0x2200, 0xa105, 0x0904, 0x3f4e,
-       0x7047, 0x0015, 0x0804, 0x3f4e, 0x0005, 0xd6ac, 0x01f0, 0xd6f4,
-       0x0130, 0x682f, 0x0000, 0x6833, 0x0000, 0x0804, 0x3f4e, 0x68b4,
-       0xa084, 0x4000, 0xa635, 0xd6f4, 0x1da0, 0x7044, 0xa005, 0x1110,
-       0x7047, 0x0015, 0xd6dc, 0x1128, 0x68b4, 0xd0dc, 0x0110, 0x6ca8,
-       0x6da4, 0x6c2e, 0x6d32, 0x0804, 0x3f4e, 0xd6f4, 0x0130, 0x682f,
-       0x0000, 0x6833, 0x0000, 0x0804, 0x3f4e, 0x68b4, 0xa084, 0x4800,
-       0xa635, 0xd6f4, 0x1da0, 0x7044, 0xa005, 0x1110, 0x7047, 0x0015,
-       0x2408, 0x2510, 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291,
-       0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x1110, 0x0804, 0x3f4e,
-       0x7000, 0xa086, 0x0006, 0x0110, 0x0804, 0x3f4e, 0x0005, 0x6946,
-       0x6008, 0xc0cd, 0xd3cc, 0x0108, 0xc08d, 0x600a, 0x6818, 0x683a,
-       0x681b, 0x0006, 0x688f, 0x0000, 0x6893, 0x0000, 0x6a30, 0x692c,
-       0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833, 0x0000, 0x6837, 0x0020,
-       0x6897, 0x0000, 0x689b, 0x0020, 0x7000, 0x0002, 0x25c9, 0x3196,
-       0x3190, 0x318e, 0x318e, 0x318e, 0x318e, 0x318e, 0x080c, 0x2575,
-       0x6820, 0xd084, 0x1118, 0x080c, 0x37c7, 0x0030, 0x7058, 0x2c50,
-       0x2060, 0x6800, 0x6002, 0x2a60, 0xaea0, 0x0017, 0x2404, 0xa005,
-       0x0110, 0x2020, 0x0cd8, 0x2d22, 0x206b, 0x0000, 0x0005, 0x080c,
-       0x37cd, 0x080c, 0x37e1, 0x6008, 0xc0cc, 0x600a, 0x682b, 0x0000,
-       0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, 0x6944, 0x6916, 0x2009,
-       0x0000, 0xae86, 0x4740, 0x0110, 0x2009, 0x0001, 0x080c, 0x431f,
-       0xd6dc, 0x01c8, 0x691c, 0xc1ed, 0x691e, 0x6828, 0xa082, 0x000e,
-       0x0290, 0x6848, 0xa084, 0x000f, 0xa086, 0x000b, 0x1160, 0x685c,
-       0xa086, 0x0047, 0x1140, 0x2001, 0x4701, 0x2004, 0xd0ac, 0x1118,
-       0x2700, 0x080c, 0x249e, 0x6818, 0xd0fc, 0x0140, 0x681b, 0x0000,
-       0x7868, 0xa08c, 0x00ff, 0x0110, 0x681b, 0x001e, 0xaea0, 0x0017,
-       0x6800, 0x2022, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060,
-       0x6000, 0xd0a4, 0x0580, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051,
-       0x0020, 0x00d6, 0x00f6, 0x0156, 0x0146, 0x2079, 0x4700, 0x080c,
-       0x1bb2, 0x014e, 0x015e, 0x00fe, 0x70c8, 0x2010, 0x2009, 0x0101,
-       0x0026, 0x2204, 0xa06d, 0x0140, 0x6814, 0xa706, 0x0110, 0x6800,
-       0x0cc8, 0x6820, 0xc0d5, 0x6822, 0x002e, 0x8210, 0x8109, 0x1d80,
-       0x00de, 0x7063, 0x0003, 0x707b, 0x0000, 0x7772, 0x707f, 0x000f,
-       0x71d0, 0xc1c4, 0x71d2, 0x6818, 0xa086, 0x0002, 0x1138, 0x6817,
-       0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec, 0x681e, 0x080c, 0x1dbf,
-       0x0804, 0x25c9, 0x7cd8, 0x7ddc, 0x7fd0, 0x080c, 0x30ff, 0x682b,
-       0x0000, 0x789b, 0x000e, 0x6f14, 0x080c, 0x3c72, 0xa08c, 0x00ff,
-       0x6916, 0x6818, 0xd0fc, 0x0110, 0x7044, 0x681a, 0xa68c, 0xdf00,
-       0x691e, 0x7063, 0x0000, 0x0804, 0x25c9, 0x7000, 0xa005, 0x1110,
-       0x0804, 0x25c9, 0xa006, 0x080c, 0x3f4e, 0x6920, 0xd1ac, 0x1110,
-       0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
-       0xa084, 0x00ff, 0x6822, 0x7000, 0x0002, 0x25c9, 0x326f, 0x326f,
-       0x3272, 0x3272, 0x3272, 0x326d, 0x326d, 0x080c, 0x2575, 0x6818,
-       0x0804, 0x2f3b, 0x6008, 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0804,
-       0x3795, 0x2300, 0x0002, 0x327e, 0x3280, 0x32ce, 0x080c, 0x2575,
-       0xd6fc, 0x1904, 0x2d5b, 0x7000, 0xa00d, 0x0002, 0x25c9, 0x3290,
-       0x3290, 0x32ba, 0x3290, 0x32cb, 0x328e, 0x328e, 0x080c, 0x2575,
-       0xa684, 0x0060, 0x0538, 0xa086, 0x0060, 0x1510, 0xc6ac, 0xc6f4,
-       0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac, 0x681e, 0xa186, 0x0002,
-       0x0148, 0x080c, 0x3f4e, 0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c,
-       0x4235, 0x0010, 0x080c, 0x4208, 0x781b, 0x0083, 0x71d0, 0xd1b4,
-       0x1904, 0x25c6, 0x70a0, 0xa086, 0x0001, 0x1904, 0x260d, 0x0005,
-       0xd6ec, 0x09f0, 0x6818, 0xd0fc, 0x0170, 0xd6f4, 0x1130, 0x681b,
-       0x0015, 0x781b, 0x0083, 0x0804, 0x25c6, 0x681b, 0x0007, 0x682f,
-       0x0000, 0x6833, 0x0000, 0x080c, 0x3c17, 0x0005, 0x080c, 0x2575,
-       0x2300, 0x0002, 0x32d7, 0x32f9, 0x3351, 0x080c, 0x2575, 0x7000,
-       0x0002, 0x32e1, 0x32e3, 0x32ea, 0x32e1, 0x32e1, 0x32e1, 0x32e1,
-       0x32e1, 0x080c, 0x2575, 0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c,
-       0x4235, 0x0010, 0x080c, 0x4208, 0x681c, 0xc0b4, 0x681e, 0x70d0,
-       0xd0b4, 0x1904, 0x25c6, 0x70a0, 0xa086, 0x0001, 0x1904, 0x260d,
-       0x0005, 0xd6fc, 0x1904, 0x3341, 0x7000, 0xa00d, 0x0002, 0x25c9,
-       0x330f, 0x3309, 0x3339, 0x330f, 0x333e, 0x3307, 0x3307, 0x080c,
-       0x2575, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684,
-       0x0060, 0x0538, 0xa086, 0x0060, 0x1510, 0xa6b4, 0xbfbf, 0xc6ed,
-       0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0148, 0x080c, 0x3f4e, 0x69ac,
-       0x68b0, 0xa115, 0x0118, 0x080c, 0x4235, 0x0010, 0x080c, 0x4208,
-       0x781b, 0x0083, 0x681c, 0xc0b4, 0x681e, 0x71d0, 0xd1b4, 0x1904,
-       0x25c6, 0x70a0, 0xa086, 0x0001, 0x1904, 0x260d, 0x0005, 0xd6ec,
-       0x09f0, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x0007, 0x781b, 0x00fb,
-       0x0005, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302,
-       0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0083,
-       0x0005, 0xd6dc, 0x0130, 0x782b, 0x3009, 0x781b, 0x0083, 0x0804,
-       0x25c6, 0x7884, 0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, 0x1150,
-       0xa484, 0x0200, 0x0108, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0083,
-       0x0804, 0x25c6, 0x6820, 0xc095, 0x6822, 0x080c, 0x3c02, 0xc6dd,
-       0x080c, 0x3a61, 0x781b, 0x0082, 0x0804, 0x25c6, 0x2300, 0x0002,
-       0x337b, 0x337d, 0x337f, 0x080c, 0x2575, 0x0804, 0x3a5b, 0x7d98,
-       0xd6d4, 0x15a8, 0x79e4, 0xd1ac, 0x0130, 0x78ec, 0xa084, 0x0003,
-       0x0110, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
-       0xfffb, 0x785a, 0x7d9a, 0x79e4, 0xd1ac, 0x0120, 0x78ec, 0xa084,
-       0x0003, 0x1120, 0x2001, 0x0014, 0x0804, 0x2f3b, 0x7884, 0xd0fc,
-       0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
-       0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
-       0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x04c2, 0x7a90,
-       0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0568, 0x789b,
-       0x0080, 0x7ba8, 0xa384, 0x0001, 0x11d0, 0x7ba8, 0x7ba8, 0xa386,
-       0x0004, 0x1118, 0x2009, 0xffdf, 0x0058, 0xa386, 0x0001, 0x1118,
-       0x2009, 0xfff7, 0x0028, 0xa386, 0x0003, 0x1148, 0x2009, 0xffef,
-       0x00c6, 0x7054, 0x2060, 0x6004, 0xa104, 0x6006, 0x00ce, 0x789b,
-       0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009,
-       0x6920, 0xa18c, 0xecff, 0x6922, 0x7d9a, 0x0804, 0x3c0b, 0x2bd1,
-       0x2bda, 0x33f9, 0x33ff, 0x33f7, 0x33f7, 0x3c0b, 0x3c0b, 0x080c,
-       0x2575, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0804, 0x3c11, 0x6920,
-       0xa18c, 0xfcff, 0x6922, 0x0804, 0x3c0b, 0x79e4, 0xa184, 0x0030,
-       0x0120, 0x78ec, 0xa084, 0x0003, 0x1570, 0x7000, 0xa086, 0x0004,
-       0x1190, 0x7060, 0xa086, 0x0002, 0x1130, 0x2011, 0x0002, 0x2019,
-       0x0000, 0x0804, 0x2a85, 0x7060, 0xa086, 0x0006, 0x0db0, 0x7060,
-       0xa086, 0x0004, 0x0d90, 0x7000, 0xa086, 0x0000, 0x0904, 0x25c6,
-       0x6920, 0xa184, 0x0420, 0x0128, 0xc1d4, 0x6922, 0x6818, 0x0804,
-       0x2f3b, 0x6818, 0xa08e, 0x0002, 0x0120, 0xc0fd, 0x681a, 0x2001,
-       0x0014, 0x0804, 0x2f3b, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
-       0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000,
-       0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007,
-       0x0010, 0x2001, 0x0001, 0x0002, 0x3c0b, 0x3c0b, 0x345c, 0x3c0b,
-       0x3c4f, 0x3c4f, 0x3c0b, 0x3c0b, 0xd6bc, 0x0570, 0x7180, 0x81ff,
-       0x0558, 0xa182, 0x000d, 0x1318, 0x7083, 0x0000, 0x0028, 0xa182,
-       0x000c, 0x7082, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa, 0x0156,
-       0x0136, 0x0146, 0x7084, 0x8114, 0xa210, 0x7286, 0xa080, 0x000b,
-       0xad00, 0x2098, 0xb284, 0x0600, 0x0118, 0x20a1, 0x022b, 0x0010,
-       0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x014e,
-       0x013e, 0x015e, 0x0804, 0x3c11, 0xd6d4, 0x1904, 0x34cf, 0x6820,
-       0xd084, 0x0904, 0x3c11, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0120,
-       0xa086, 0x0060, 0x1108, 0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b,
-       0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a,
-       0x78aa, 0x8008, 0x810c, 0x0904, 0x37f6, 0xa18c, 0x00f8, 0x1904,
-       0x37f6, 0x0156, 0x0136, 0x0146, 0x0016, 0x20a1, 0x012b, 0x3208,
-       0xa18c, 0x0600, 0x0110, 0x20a1, 0x022b, 0x001e, 0x789b, 0x0000,
-       0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e,
-       0x015e, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0804, 0x3c11, 0x6818,
-       0xd0fc, 0x0110, 0x681b, 0x0008, 0x080c, 0x3a61, 0x781b, 0x00ed,
-       0x0005, 0x2300, 0x0002, 0x34e0, 0x359d, 0x34de, 0x080c, 0x2575,
-       0x7cd8, 0x7ddc, 0x7fd0, 0x82ff, 0x1528, 0x7200, 0xa286, 0x0003,
-       0x0904, 0x2f09, 0x71d0, 0xd1bc, 0x11f8, 0xd1b4, 0x01e8, 0x2001,
-       0x4701, 0x2004, 0xd0c4, 0x11c0, 0x00d6, 0x783b, 0x8800, 0x781b,
-       0x0059, 0x70b8, 0xa06d, 0x68b4, 0xc0a5, 0x785a, 0x6894, 0x78d6,
-       0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030,
-       0x00de, 0x0030, 0x7200, 0x0020, 0x783b, 0x1800, 0x781b, 0x0057,
-       0xa284, 0x000f, 0x0002, 0x3588, 0x3545, 0x351d, 0x2f38, 0x351b,
-       0x3588, 0x351b, 0x351b, 0x080c, 0x2575, 0x681c, 0xd0ec, 0x0118,
-       0x6008, 0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006,
-       0xa005, 0x1108, 0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084,
-       0x000e, 0x1120, 0x71c8, 0xa188, 0x0100, 0x0028, 0x7030, 0x68ba,
-       0x713c, 0x70c8, 0xa108, 0x2104, 0x6802, 0x2d0a, 0x715a, 0xd6dc,
-       0x1120, 0xc6fc, 0x6eb6, 0x0804, 0x3588, 0x6eb6, 0xa684, 0x0060,
-       0x1120, 0xa684, 0x7fff, 0x68b6, 0x04d8, 0xd6dc, 0x1150, 0xa684,
-       0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x080c, 0x3f4e,
-       0x0478, 0xd6ac, 0x0140, 0xa006, 0x080c, 0x3f4e, 0x2408, 0x2510,
-       0x69aa, 0x6aa6, 0x0068, 0x2408, 0x2510, 0x2700, 0x8007, 0xa084,
-       0x007f, 0xa108, 0xa291, 0x0000, 0x69aa, 0x6aa6, 0x080c, 0x3f4e,
-       0xd6fc, 0x01b0, 0xa684, 0x7fff, 0x68b6, 0x2510, 0x2408, 0xd6ac,
-       0x1138, 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000,
-       0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
-       0x7000, 0xa086, 0x0030, 0x1904, 0x25c9, 0x7003, 0x0002, 0x70b8,
-       0xa06d, 0x68bc, 0x703e, 0x70b4, 0xa065, 0x68c0, 0x7056, 0x2d00,
-       0x704a, 0xad80, 0x0009, 0x7042, 0x0005, 0xa586, 0x8800, 0x1148,
-       0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef,
-       0x600a, 0x0804, 0x3a5b, 0x7043, 0x0000, 0xa282, 0x0006, 0x0310,
-       0x080c, 0x2575, 0x2300, 0x0002, 0x35b7, 0x35c8, 0x35d2, 0x2200,
-       0x0002, 0x35bf, 0x3a5b, 0x35c1, 0x35bf, 0x3603, 0x3651, 0x080c,
-       0x2575, 0x7a80, 0xa294, 0x0f00, 0x080c, 0x36a5, 0x0804, 0x3a30,
-       0x00c1, 0x0002, 0x3a5b, 0x35d0, 0x35d0, 0x3603, 0x35d0, 0x3a5b,
-       0x080c, 0x2575, 0x0071, 0x0002, 0x35dc, 0x35da, 0x35da, 0x35dc,
-       0x35da, 0x35dc, 0x080c, 0x2575, 0x080c, 0x3a70, 0x781b, 0x0082,
-       0x0005, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, 0x37e1, 0x0010,
-       0x080c, 0x3f4e, 0x6008, 0xa084, 0xfbef, 0x600a, 0x0020, 0x7000,
-       0xa086, 0x0003, 0x0da8, 0x7003, 0x0005, 0x2001, 0x8ee0, 0xae8e,
-       0x4740, 0x0110, 0x2001, 0x8f12, 0x2068, 0x704a, 0xad80, 0x0009,
-       0x7042, 0x2200, 0x0005, 0x7000, 0xa086, 0x0002, 0x1158, 0x70d0,
-       0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00, 0x70ba, 0x0038, 0x080c,
-       0x3f4e, 0x0020, 0x7000, 0xa086, 0x0003, 0x0dc8, 0x7003, 0x0001,
-       0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f,
-       0xa215, 0x2069, 0x8dc0, 0xb284, 0x0600, 0x1118, 0xc2fd, 0x2069,
-       0x8ed0, 0x2d04, 0x2d08, 0x715a, 0xa06d, 0x0128, 0x6814, 0xa206,
-       0x0120, 0x6800, 0x0cb8, 0x080c, 0x36a5, 0x6eb4, 0x7e5a, 0x6920,
-       0xa184, 0x0c00, 0x0904, 0x36cb, 0x7060, 0xa086, 0x0006, 0x1128,
-       0x7070, 0xa206, 0x1110, 0x7062, 0x707a, 0x681b, 0x0005, 0xc1ad,
-       0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x080c, 0x3a67, 0x0804,
-       0x36cb, 0x7200, 0xa286, 0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2,
-       0x2c00, 0x70b6, 0x2d00, 0x70ba, 0x0030, 0x080c, 0x3f4e, 0x0018,
-       0xa286, 0x0003, 0x0dd0, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00,
-       0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0xae86, 0x4740,
-       0x0108, 0xc2fd, 0x79a8, 0x79a8, 0xa18c, 0x00ff, 0x2118, 0x70c8,
-       0xa168, 0x2d04, 0x2d08, 0x715a, 0xa06d, 0x0128, 0x6814, 0xa206,
-       0x0118, 0x6800, 0x0cb8, 0x0409, 0x6eb4, 0x6920, 0xa184, 0x0c00,
-       0x0904, 0x36cb, 0xd0dc, 0x0178, 0x7060, 0xa086, 0x0004, 0x1140,
-       0x7070, 0xa206, 0x1128, 0x7074, 0xa306, 0x1110, 0x7062, 0x707a,
-       0x080c, 0x3a6d, 0x0480, 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922,
-       0x080c, 0x3a67, 0x707b, 0x0000, 0x0430, 0x7003, 0x0005, 0xb284,
-       0x0600, 0x0118, 0x2001, 0x8ee0, 0x0010, 0x2001, 0x8f12, 0x2068,
-       0x704a, 0x0156, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x1f04,
-       0x36b4, 0x015e, 0xb284, 0x0600, 0x0110, 0xc2fc, 0x0008, 0xc2fd,
-       0x6a16, 0xad80, 0x0009, 0x7042, 0x68b7, 0x0700, 0x6823, 0x0800,
-       0x6827, 0x0003, 0x0005, 0xc6ec, 0xa6ac, 0x0060, 0x0904, 0x3712,
-       0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x11e0, 0x7bd2, 0x7bda,
-       0x7cd6, 0x7cde, 0xa586, 0x0060, 0x05c8, 0xd6f4, 0x1108, 0xc6ed,
-       0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0083, 0xd69c, 0x0128, 0x2009,
-       0x0082, 0x2019, 0x0000, 0x2320, 0x791a, 0xd6ec, 0x0588, 0x080c,
-       0x4208, 0x0470, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305,
-       0x01f8, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x1108,
-       0xc6ed, 0xc6f4, 0x7e5a, 0x2011, 0x0083, 0xd69c, 0x0128, 0x2011,
-       0x0082, 0x2019, 0x0000, 0x2320, 0x7a1a, 0xd6ec, 0x0188, 0x080c,
-       0x4235, 0x0070, 0x2019, 0x0000, 0x2320, 0x0010, 0xa6b4, 0xb7ff,
-       0x7e5a, 0x2009, 0x0083, 0xd69c, 0x0110, 0x2009, 0x0082, 0x791a,
-       0x68c0, 0x7056, 0x2d00, 0x704a, 0x68c4, 0x2060, 0x71d0, 0x2001,
-       0x4701, 0x2004, 0xd0c4, 0x15c8, 0x70d4, 0xa02d, 0x01b8, 0xd1bc,
-       0x0548, 0x7a80, 0xa294, 0x0f00, 0x70d8, 0xa206, 0x0118, 0x78e0,
-       0xa504, 0x1558, 0x70d6, 0xc1bc, 0x71d2, 0x0438, 0x2031, 0x0001,
-       0x852c, 0x0218, 0x8633, 0x8210, 0x0cd8, 0x0005, 0x7de0, 0xa594,
-       0xff00, 0x0130, 0x2011, 0x0008, 0x852f, 0x0c81, 0x8637, 0x0008,
-       0x0c69, 0x8217, 0x7880, 0xa084, 0x0f00, 0xa206, 0x0170, 0x72da,
-       0x76d6, 0x0058, 0x7a80, 0xa294, 0x0f00, 0x70d8, 0xa236, 0x0dc0,
-       0x78e0, 0xa534, 0x0da8, 0xc1bd, 0x71d2, 0xd1b4, 0x1904, 0x25c6,
-       0x2300, 0xa405, 0x0904, 0x25c6, 0x70a0, 0xa086, 0x0001, 0x1904,
-       0x260d, 0x0005, 0x6020, 0xa005, 0x0150, 0x8001, 0x6022, 0x6008,
-       0xa085, 0x0008, 0x600a, 0x700f, 0x0100, 0x702c, 0x6026, 0x0005,
-       0xa006, 0x080c, 0x3f4e, 0x7000, 0xa086, 0x0002, 0x0120, 0x7060,
-       0xa086, 0x0005, 0x1150, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b,
-       0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x000f,
-       0x0002, 0x25c9, 0x37a6, 0x37a3, 0x37c3, 0x37af, 0x25c9, 0x37a1,
-       0x37a1, 0x080c, 0x2575, 0x0449, 0x0411, 0x0028, 0x0431, 0x7058,
-       0x2060, 0x6800, 0x6002, 0x080c, 0x1dbf, 0x0804, 0x25c9, 0x7060,
-       0x7063, 0x0000, 0x707f, 0x0000, 0x0002, 0x37bf, 0x37bf, 0x37bd,
-       0x37bd, 0x37bd, 0x37bf, 0x37bd, 0x37bf, 0x0804, 0x2a9a, 0x7063,
-       0x0000, 0x0804, 0x25c9, 0x681b, 0x0000, 0x0804, 0x31a7, 0x6800,
-       0xa005, 0x1108, 0x6002, 0x6006, 0x0005, 0x6410, 0x84ff, 0x0168,
-       0x2009, 0x4702, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, 0x1128,
-       0x2021, 0x4704, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xc0a4, 0x600a,
-       0x0005, 0x6018, 0xa005, 0x0110, 0x8001, 0x601a, 0x0005, 0x080c,
-       0x3c6e, 0x681b, 0x0018, 0x0490, 0x080c, 0x3c6e, 0x681b, 0x0019,
-       0x0468, 0x080c, 0x3c6e, 0x681b, 0x001a, 0x0440, 0x080c, 0x3c6e,
-       0x681b, 0x0003, 0x0418, 0x7770, 0x080c, 0x3b95, 0x7174, 0xa18c,
-       0x00ff, 0x3210, 0xa294, 0x0600, 0x0118, 0xa1e8, 0x8cc0, 0x0010,
-       0xa1e8, 0x8dd0, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x1118, 0x707a,
-       0x0804, 0x25c9, 0x6814, 0x7270, 0xa206, 0x0110, 0x6800, 0x0c98,
-       0x6800, 0x200a, 0x681b, 0x0005, 0x707b, 0x0000, 0x080c, 0x37cd,
-       0x6820, 0xd084, 0x1110, 0x080c, 0x37c7, 0x080c, 0x37e1, 0x681f,
-       0x0000, 0x6823, 0x0020, 0x080c, 0x1dbf, 0x0804, 0x25c9, 0xa282,
-       0x0003, 0x1904, 0x3a35, 0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4,
-       0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x05b0, 0xc1c4, 0x6922,
-       0xa6b4, 0x00ff, 0x0530, 0xa682, 0x0018, 0x0218, 0x0110, 0x2031,
-       0x0018, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x2041,
-       0x0000, 0x080c, 0x3aee, 0x0118, 0x080c, 0x391a, 0x00a0, 0x080c,
-       0x3aba, 0x080c, 0x3917, 0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695,
-       0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082,
-       0x0005, 0x080c, 0x3917, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071,
-       0x0005, 0x781b, 0x0083, 0x0005, 0x00c6, 0x7054, 0x2060, 0x6100,
-       0xd1e4, 0x0598, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x0018,
-       0x0218, 0x0110, 0x2011, 0x0018, 0x2600, 0xa202, 0x1208, 0x2230,
-       0xa686, 0x0010, 0x1108, 0x8630, 0x6208, 0xa294, 0x00ff, 0x78ec,
-       0xd0e4, 0x0130, 0xa282, 0x000a, 0x1240, 0x2011, 0x000a, 0x0028,
-       0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x2200, 0xa502, 0x1208,
-       0x2228, 0x080c, 0x3abe, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c,
-       0x3aee, 0x0118, 0x080c, 0x391a, 0x0020, 0x080c, 0x3aba, 0x080c,
-       0x3917, 0x7858, 0xc095, 0x785a, 0x00ce, 0x781b, 0x0082, 0x0005,
-       0x00c6, 0x2960, 0x6000, 0xd0e4, 0x1188, 0xd0b4, 0x1150, 0x6010,
-       0xa084, 0x000f, 0x1130, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x00ce,
-       0x0005, 0x2011, 0x0032, 0x2019, 0x0000, 0x00f0, 0x68a0, 0xd0cc,
-       0x1dc0, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282,
-       0x000b, 0x1218, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c, 0x1210,
-       0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x0018,
-       0x0218, 0x0110, 0x2019, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003,
-       0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5,
-       0x6822, 0x080c, 0x3a7a, 0x00ce, 0x0005, 0x00c6, 0x2960, 0x6104,
-       0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0000,
-       0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa,
-       0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x00ce, 0x0005, 0xa006,
-       0x2030, 0x2010, 0x00c6, 0x7154, 0x2160, 0x2018, 0x2008, 0xa084,
-       0xffe0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4,
-       0xa084, 0x7770, 0xa18c, 0x000f, 0xa105, 0x2029, 0x4705, 0x252c,
-       0xd5cc, 0x0140, 0xd3a4, 0x0110, 0xa085, 0x0800, 0xd3fc, 0x0110,
-       0xa085, 0x8080, 0x78a6, 0x6016, 0x788a, 0xa6b4, 0x001f, 0x8637,
-       0x8204, 0x8004, 0xa605, 0x600e, 0x6004, 0xa084, 0xffd5, 0x6006,
-       0x00ce, 0x0005, 0xa282, 0x0002, 0x1904, 0x3a3f, 0x7aa8, 0x6920,
-       0xc1bd, 0x6922, 0xd1cc, 0x0568, 0xc1cc, 0x6922, 0xa294, 0x00ff,
-       0xa282, 0x0002, 0x1a04, 0x3a30, 0x080c, 0x39c1, 0x080c, 0x3917,
-       0xa980, 0x0001, 0x200c, 0x080c, 0x3b91, 0x080c, 0x38b8, 0x88ff,
-       0x0178, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
-       0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005,
-       0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083,
-       0x0005, 0xa282, 0x0002, 0x1218, 0xa284, 0x0001, 0x0140, 0x7154,
-       0xa188, 0x0000, 0x210c, 0xd1ec, 0x1110, 0x2011, 0x0000, 0x080c,
-       0x3aac, 0x0479, 0x080c, 0x3917, 0x7858, 0xc095, 0x785a, 0x781b,
-       0x0082, 0x0005, 0x00c6, 0x0026, 0x2960, 0x6000, 0x2011, 0x0001,
-       0xd0ec, 0x1158, 0xd0bc, 0x1138, 0x6014, 0xd0b4, 0x1120, 0xc1a4,
-       0x6106, 0xa006, 0x0088, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
-       0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x080c, 0x3a7a,
-       0x6820, 0xa085, 0x0200, 0x6822, 0x002e, 0x00ce, 0x0005, 0x8807,
-       0xa715, 0x00c6, 0x2009, 0x0000, 0x7054, 0x2060, 0x82ff, 0x0110,
-       0x2009, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4, 0xa084,
-       0xff9f, 0xa105, 0xc0ec, 0xd0b4, 0x1108, 0xc0ed, 0x6100, 0xd1f4,
-       0x0110, 0xa085, 0x0020, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084,
-       0xffef, 0x6006, 0x00ce, 0x0005, 0x0006, 0x7000, 0xa086, 0x0003,
-       0x0110, 0x000e, 0x0010, 0x000e, 0x0498, 0xd6ac, 0x0588, 0x7888,
-       0xa084, 0x0040, 0x0568, 0x7bb8, 0x8307, 0xa084, 0x007f, 0x1518,
-       0x8207, 0xa084, 0x00ff, 0x0904, 0x3a57, 0xa09a, 0x0004, 0x1a04,
-       0x3a57, 0xd6f4, 0x11d0, 0x79d8, 0x7adc, 0xa108, 0xa291, 0x0000,
-       0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x080c, 0x42e8, 0x781b, 0x0080,
-       0xb284, 0x0600, 0x0118, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001,
-       0x080c, 0x419a, 0x0005, 0x080c, 0x2575, 0x781b, 0x0080, 0x0005,
-       0x781b, 0x0083, 0x0005, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031,
-       0x0000, 0xa006, 0x2010, 0x080c, 0x391a, 0x080c, 0x39bf, 0x7e58,
-       0x080c, 0x3a73, 0x781b, 0x0082, 0x0005, 0x0cd1, 0x6820, 0xc0c4,
-       0x6822, 0x00c6, 0x7054, 0x2060, 0x080c, 0x3944, 0x00b0, 0x0c81,
-       0x6820, 0xc0cc, 0x6822, 0x00c6, 0x7054, 0x2060, 0x080c, 0x39de,
-       0x0060, 0x0c31, 0x6820, 0xa084, 0xecff, 0x6822, 0x00c6, 0x7054,
-       0x2060, 0x6004, 0xa084, 0xffc5, 0x6006, 0x00ce, 0x0005, 0x0049,
-       0x781b, 0x0082, 0x0005, 0x6827, 0x0002, 0x0049, 0x781b, 0x0082,
-       0x0005, 0x2001, 0x0005, 0x0088, 0x2001, 0x000c, 0x0070, 0x6820,
-       0xc0d5, 0x6822, 0x2001, 0x0006, 0x0040, 0x2001, 0x000d, 0x0028,
-       0x2001, 0x0009, 0x0010, 0x2001, 0x0007, 0x789b, 0x007e, 0x78aa,
-       0xc69d, 0x7e5a, 0x70d0, 0xd0b4, 0x0168, 0xc0b4, 0x70d2, 0x00c6,
-       0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
-       0x601a, 0x00ce, 0x0005, 0x0076, 0x873f, 0xa7bc, 0x000f, 0x873b,
-       0x873b, 0x8703, 0xa0e0, 0x4bc0, 0xae8e, 0x4740, 0x0110, 0xa0e0,
-       0x4c40, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x7fe0, 0x78ae,
-       0x6012, 0x79a4, 0xa184, 0x773f, 0x78a6, 0x6016, 0x6004, 0xa085,
-       0x0038, 0x6006, 0x007e, 0x0005, 0x789b, 0x0080, 0x78ab, 0x0001,
-       0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab,
-       0x0004, 0x0800, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b, 0x0080,
-       0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa,
-       0x789b, 0x0060, 0x78ab, 0x0005, 0x0804, 0x3a7a, 0x0156, 0x8007,
-       0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4,
-       0xa18c, 0xffe0, 0x2021, 0x3b7a, 0x2019, 0x0011, 0x20a9, 0x000e,
-       0x2011, 0x0032, 0x2404, 0xa084, 0xffe0, 0xa106, 0x0128, 0x8420,
-       0x2300, 0xa210, 0x1f04, 0x3ae2, 0x015e, 0x0005, 0x0156, 0x0804,
-       0x3b30, 0x2021, 0x3b88, 0x20a9, 0x0009, 0x2011, 0x0029, 0xa582,
-       0x0028, 0x0550, 0x8420, 0x95a9, 0x2011, 0x0033, 0xa582, 0x0033,
-       0x0618, 0x8420, 0x95a9, 0x2019, 0x000a, 0x2011, 0x0065, 0x2200,
-       0xa502, 0x02d0, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3b07, 0x015e,
-       0x0088, 0x2021, 0x3b7a, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
-       0x0033, 0x2200, 0xa502, 0x0240, 0x8420, 0x2300, 0xa210, 0x1f04,
-       0x3b19, 0x015e, 0xa006, 0x0005, 0x8211, 0x015e, 0xa582, 0x0064,
-       0x1220, 0x7808, 0xa085, 0x0070, 0x780a, 0x2404, 0xa005, 0x0005,
-       0xa886, 0x0002, 0x01e8, 0x2021, 0x3b66, 0x20a9, 0x000d, 0x2011,
-       0x0028, 0xa582, 0x0028, 0x0d48, 0x8420, 0x2019, 0x0019, 0x2011,
-       0x0033, 0x2200, 0xa502, 0x0e00, 0x8420, 0x2300, 0xa210, 0x1f04,
-       0x3b41, 0x015e, 0x2011, 0x0184, 0xa582, 0x0185, 0x0ab0, 0x0890,
-       0x2021, 0x3b75, 0x20a9, 0x0003, 0x2011, 0x0024, 0xa586, 0x0024,
-       0x0960, 0x8420, 0x2011, 0x0028, 0xa586, 0x0028, 0x0930, 0x8420,
-       0x2019, 0x0019, 0x2011, 0x0033, 0x0804, 0x3b19, 0x1021, 0x2202,
-       0x3403, 0x4604, 0x5805, 0x6a06, 0x7c07, 0x4610, 0x4612, 0x5812,
-       0x5a12, 0x6a14, 0x6c14, 0x6e14, 0x7e17, 0x9021, 0xb002, 0xe204,
-       0xe210, 0xe210, 0x1209, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404,
-       0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07,
-       0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07, 0x7e07,
-       0x0e00, 0x789b, 0x0080, 0xa046, 0x0005, 0xa784, 0x0f00, 0x800b,
-       0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xd7fc,
-       0x0118, 0xa0e0, 0x6cc0, 0x0010, 0xa0e0, 0x4cc0, 0x0005, 0x00e6,
-       0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009, 0x4780, 0x2071,
-       0x4780, 0x0030, 0x2009, 0x4740, 0x2079, 0x0200, 0x2071, 0x4740,
-       0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002, 0x3bc8, 0x3bc8,
-       0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc6, 0x3bc6, 0x080c, 0x2575,
-       0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0580, 0x7858,
-       0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086, 0x1814,
-       0x1530, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x1de0, 0x784b,
-       0x0008, 0x7848, 0xa084, 0x0008, 0x1de0, 0x7830, 0xd0bc, 0x11b8,
-       0xb284, 0x0800, 0x0118, 0x0104, 0x3bff, 0x0010, 0x0304, 0x3bff,
-       0x79e4, 0xa184, 0x0030, 0x0158, 0x78ec, 0xa084, 0x0003, 0x0138,
-       0x681c, 0xd0ac, 0x1110, 0x00d9, 0x0010, 0x781b, 0x00fb, 0x00fe,
-       0x00ee, 0x0005, 0x2001, 0x4701, 0x2004, 0xd0ac, 0x1118, 0x6814,
-       0x080c, 0x249e, 0x0005, 0x781b, 0x0083, 0x0005, 0x781b, 0x0082,
-       0x0005, 0x781b, 0x0071, 0x0005, 0x781b, 0x006e, 0x0005, 0x2009,
-       0x4719, 0x210c, 0xa186, 0x0000, 0x0150, 0xa186, 0x0001, 0x0150,
-       0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054, 0x0005, 0x781b,
-       0x00f3, 0x0005, 0x701f, 0x000a, 0x0005, 0x2009, 0x4719, 0x210c,
-       0xa186, 0x0000, 0x0168, 0xa186, 0x0001, 0x0138, 0x701f, 0x000b,
-       0x7063, 0x0001, 0x781b, 0x0054, 0x0005, 0x701f, 0x000a, 0x0005,
-       0x781b, 0x00f2, 0x0005, 0x781b, 0x00fb, 0x0005, 0x781b, 0x00fa,
-       0x0005, 0x781b, 0x00cc, 0x0005, 0x781b, 0x00cb, 0x0005, 0x6818,
-       0xd0fc, 0x0110, 0x681b, 0x001d, 0x701f, 0x000b, 0x7063, 0x0001,
-       0x781b, 0x0054, 0x0005, 0x7830, 0xa084, 0x00c0, 0x1170, 0x7808,
-       0xc08c, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084,
-       0x0021, 0x0118, 0x7808, 0xc08d, 0x780a, 0x0005, 0x7808, 0xc08d,
-       0x780a, 0x0005, 0x7830, 0xa084, 0x0040, 0x1de0, 0xb284, 0x0800,
-       0x0118, 0x1104, 0x3c80, 0x0010, 0x1304, 0x3c80, 0x78ac, 0x0005,
-       0x7808, 0xa084, 0xfffd, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000,
-       0x78ec, 0xa084, 0x0021, 0x0140, 0xb284, 0x0800, 0x0118, 0x1104,
-       0x3c8f, 0x0010, 0x1304, 0x3c92, 0x78ac, 0x0006, 0x7808, 0xa085,
-       0x0002, 0x780a, 0x000e, 0x0005, 0xa784, 0x0001, 0x1904, 0x324d,
-       0xa784, 0x0070, 0x0140, 0x00c6, 0x2d60, 0x2f68, 0x080c, 0x2490,
-       0x2d78, 0x2c68, 0x00ce, 0xa784, 0x0008, 0x0148, 0x784b, 0x0008,
-       0x78ec, 0xa084, 0x0003, 0x0904, 0x324d, 0x0804, 0x3c0b, 0xa784,
-       0x0004, 0x01c8, 0x78b8, 0xa084, 0x8000, 0x01a8, 0x784b, 0x0008,
-       0x78ec, 0xa084, 0x0003, 0x0904, 0x324d, 0x78e4, 0xa084, 0x0007,
-       0xa086, 0x0001, 0x1140, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a,
-       0x781b, 0x00fb, 0x0005, 0xa784, 0x0080, 0x0140, 0x7884, 0xd0fc,
-       0x0128, 0x080c, 0x3a57, 0x681b, 0x0022, 0x0005, 0x681b, 0x0003,
-       0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000,
-       0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x2bac, 0xb284,
-       0x0800, 0x0110, 0x0104, 0x25c6, 0x0304, 0x25c6, 0x6b14, 0x8307,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xd3fc, 0x0118, 0xa080,
-       0x4c40, 0x0010, 0xa080, 0x4bc0, 0x2060, 0x2048, 0x7056, 0x2a60,
-       0x0005, 0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, 0x3d57, 0x68a0,
-       0xd1ac, 0x1120, 0xa084, 0x0e00, 0x0904, 0x3d55, 0x6108, 0x8117,
-       0xa18c, 0x00ff, 0x631c, 0x832f, 0xd0dc, 0x0110, 0xa39d, 0x0001,
-       0xd0cc, 0x11c8, 0xa584, 0x00ff, 0x0138, 0x78ec, 0xd0e4, 0x0110,
-       0x8213, 0x00b8, 0x2029, 0x0000, 0xa182, 0x000c, 0x1290, 0x78ec,
-       0xd0e4, 0x1118, 0x2009, 0x000c, 0x0060, 0xa182, 0x000b, 0x1248,
-       0x2009, 0x000a, 0x0030, 0x2009, 0x0032, 0x2011, 0x0000, 0x2029,
-       0x0000, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x79aa,
-       0x78ab, 0x0000, 0x7aaa, 0x7baa, 0x7daa, 0xa8c0, 0x0008, 0x6820,
-       0xa085, 0x1000, 0x6822, 0x080c, 0x3a7a, 0xa085, 0x0001, 0x00ce,
-       0x0005, 0xa282, 0x0006, 0x1904, 0x3a49, 0x7da8, 0x7eac, 0x8637,
-       0xa5ac, 0x00ff, 0xa6b4, 0x00ff, 0x7fac, 0x8747, 0xa7bc, 0x00ff,
-       0xa8c4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, 0x0904, 0x3dcb,
-       0xa18c, 0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x3a23, 0xa6b4,
-       0x00ff, 0x0904, 0x3dc8, 0xa682, 0x0031, 0x1a04, 0x3a23, 0xa582,
-       0x0009, 0x0a04, 0x3a23, 0xa882, 0x0003, 0x1a04, 0x3a23, 0xa886,
-       0x0002, 0x01d0, 0xa886, 0x0000, 0x1904, 0x3a23, 0x2001, 0x000c,
-       0x79ec, 0xd1e4, 0x0110, 0x2001, 0x000a, 0xa502, 0x1290, 0x080c,
-       0x3a23, 0x00c6, 0x2960, 0x6004, 0xa085, 0x001a, 0x6006, 0x6000,
-       0xc0ac, 0x6002, 0x00ce, 0x0005, 0xa786, 0x0000, 0x0904, 0x3a23,
-       0x8634, 0xa682, 0x0018, 0x0228, 0x0120, 0x2031, 0x0018, 0x0804,
-       0x3e19, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x080c,
-       0x3aee, 0x0904, 0x3a23, 0x080c, 0x391a, 0x080c, 0x39bf, 0x7e58,
-       0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005,
-       0x080c, 0x3917, 0x0c90, 0xa886, 0x0002, 0x1108, 0x8634, 0x7154,
-       0xa188, 0x0000, 0x210c, 0xd1ac, 0x0904, 0x3a23, 0xd1ec, 0x1120,
-       0x2039, 0x0000, 0x2041, 0x0000, 0xd1e4, 0x1120, 0x2031, 0x0000,
-       0x2041, 0x0000, 0xa782, 0x0002, 0x12c8, 0x621c, 0xa284, 0x00ff,
-       0xa706, 0x0110, 0x2039, 0x0000, 0xa605, 0x0190, 0x6108, 0x811f,
-       0xa39c, 0x00ff, 0x0168, 0xa302, 0x1208, 0x2330, 0x8807, 0xa705,
-       0xa086, 0x0201, 0x0160, 0xa886, 0x0000, 0x0168, 0x2039, 0x0000,
-       0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x0070, 0xa284,
-       0xff00, 0x1108, 0x2040, 0xa184, 0x00ff, 0xa502, 0x0108, 0x2128,
-       0x852b, 0x852b, 0x080c, 0x3aee, 0x0d58, 0x080c, 0x391a, 0x080c,
-       0x39bf, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab,
-       0x0004, 0x7daa, 0x78ab, 0x0000, 0x7eaa, 0x7faa, 0x2800, 0x78aa,
-       0x789b, 0x0060, 0x78ab, 0x0008, 0x6820, 0xc0e5, 0x6822, 0x080c,
-       0x3a7a, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x0020,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9855, 0x984d, 0x0014,
-       0x9911, 0x98ff, 0x0014, 0x0014, 0x0090, 0x00e7, 0x0100, 0x0402,
-       0x2008, 0xf880, 0x0018, 0x0017, 0x840f, 0xd8c1, 0x0014, 0x0016,
-       0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0x2500, 0x0013, 0x2500,
-       0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
-       0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0xa200, 0x3806,
-       0x8839, 0x20c4, 0x0864, 0xa850, 0x3008, 0x28c1, 0x9d18, 0xa201,
-       0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a,
-       0xa808, 0x28e2, 0x9cce, 0xa8f3, 0x0864, 0xa83e, 0x300c, 0xa801,
-       0x3008, 0x28e1, 0x9cce, 0x28a2, 0x7163, 0xa831, 0x2021, 0xa818,
-       0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0, 0x6fc0, 0x67a4, 0x6c80,
-       0x0212, 0xa205, 0x883d, 0x882b, 0x1814, 0x883b, 0x7027, 0x85f2,
-       0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa813, 0x883e, 0xa811,
-       0x2882, 0x7162, 0xa814, 0x280a, 0xa204, 0x64c0, 0x6de0, 0x67a0,
-       0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576, 0x8677, 0xa802, 0x7861,
-       0x883e, 0x206a, 0x28c1, 0x9d18, 0x2042, 0x2101, 0xa8ca, 0x2902,
-       0xa20e, 0xa80b, 0xa207, 0x0014, 0xa203, 0x8000, 0x85a4, 0x1872,
-       0x879a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e, 0x7121, 0x0014,
-       0x0704, 0x3008, 0x9cce, 0x0014, 0xa202, 0x8000, 0x85a4, 0x3009,
-       0x84a8, 0x19e2, 0xf844, 0x856e, 0x883f, 0x08e6, 0xa8f5, 0xf861,
-       0xa8eb, 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532,
-       0xfaa2, 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8,
-       0xd6e0, 0x1fe6, 0x0014, 0x3008, 0x8000, 0x2849, 0x1011, 0xa8fc,
-       0x3008, 0x8000, 0xa000, 0x2081, 0x2802, 0x1011, 0xa8fc, 0xa889,
-       0x3008, 0x20a1, 0x283c, 0x1011, 0xa8fc, 0xa209, 0x0017, 0x300c,
-       0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0x0210, 0xa801, 0x0014,
-       0x26e0, 0x873a, 0xfaa3, 0x19f2, 0x26e0, 0x18f2, 0x0014, 0xa20b,
-       0x0014, 0xa20d, 0x3806, 0x0210, 0x9d22, 0x0704, 0xa206, 0x6865,
-       0x817e, 0x842a, 0x1dc1, 0x8823, 0x0016, 0x6042, 0x8008, 0xa8fa,
-       0x8160, 0x842a, 0x8180, 0xf021, 0x3008, 0x84a8, 0x11d7, 0x7042,
-       0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x0000, 0x0126, 0x70d0,
-       0xa084, 0x4c00, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205,
-       0x11a0, 0x720c, 0x82ff, 0x0128, 0x8aff, 0x1178, 0x7200, 0xd284,
-       0x1160, 0x7804, 0xd0cc, 0x0110, 0x080c, 0x435b, 0x7007, 0x0008,
-       0x7003, 0x0008, 0x012e, 0x2000, 0x0005, 0x7000, 0xa084, 0x0003,
-       0x7002, 0xc69c, 0xd084, 0x0588, 0x7108, 0xe000, 0x7008, 0xa106,
-       0x1dd8, 0xa184, 0x0003, 0x0904, 0x3fca, 0xa184, 0x01e0, 0x1904,
-       0x3fca, 0xd1f4, 0x1d88, 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60,
-       0x2011, 0x0180, 0x710c, 0x8211, 0x0130, 0x7008, 0xd0f4, 0x1d20,
-       0x700c, 0xa106, 0x0dc0, 0x7007, 0x0012, 0x7108, 0xe000, 0x7008,
-       0xa106, 0x1dd8, 0xa184, 0x0003, 0x0568, 0xd194, 0x0db0, 0xd1f4,
-       0x0548, 0x7007, 0x0002, 0x0880, 0x0428, 0x7108, 0xd1fc, 0x0130,
-       0x080c, 0x40d6, 0x8aff, 0x0904, 0x3f54, 0x0cb8, 0x700c, 0xa08c,
-       0x07ff, 0x01e8, 0x7004, 0xd084, 0x0178, 0x7014, 0xa005, 0x1148,
-       0x7010, 0x7310, 0xa306, 0x1de0, 0x2300, 0xa005, 0x0128, 0xa102,
-       0x1e20, 0x7007, 0x0010, 0x0030, 0x8aff, 0x0148, 0x080c, 0x429a,
-       0x1de8, 0x09d8, 0x080c, 0x405c, 0x012e, 0x2000, 0x0005, 0x7204,
-       0x7108, 0xc19c, 0x8103, 0x1218, 0x7007, 0x0002, 0x0cc0, 0xa205,
-       0x1d88, 0x7007, 0x0008, 0x7003, 0x0008, 0x0006, 0x2001, 0x4701,
-       0x2004, 0xd0cc, 0x0110, 0x080c, 0x435b, 0x000e, 0x012e, 0x2000,
-       0x0005, 0x6428, 0x84ff, 0x0508, 0x2c70, 0x7004, 0xa0bc, 0x000f,
-       0xa7b8, 0x401d, 0x273c, 0x87fb, 0x1148, 0x0210, 0x080c, 0x2575,
-       0x609c, 0xa075, 0x0190, 0x0c88, 0x2039, 0x4012, 0x2704, 0xae68,
-       0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0138, 0x8738, 0x2704,
-       0xa005, 0x1da8, 0x709c, 0xa075, 0x1d00, 0x0005, 0x0000, 0x0005,
-       0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003,
-       0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4012, 0x400f,
-       0x0000, 0x0000, 0x8000, 0x0000, 0x4012, 0x0000, 0x401a, 0x4017,
-       0x0000, 0x0000, 0x0000, 0x0000, 0x401a, 0x0000, 0x4015, 0x4015,
-       0x0000, 0x0000, 0x8000, 0x0000, 0x4015, 0x0000, 0x401b, 0x401b,
-       0x0000, 0x0000, 0x0000, 0x0000, 0x401b, 0x2079, 0x4700, 0x2071,
-       0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001, 0x2009,
-       0x0002, 0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
-       0x0000, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1128, 0x8109, 0x0118,
-       0x2071, 0x0020, 0x0c80, 0x0005, 0x7004, 0x8004, 0x1a04, 0x40b2,
-       0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c,
-       0x410e, 0x0804, 0x40d2, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108,
-       0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c, 0x410e,
-       0x0804, 0x40d2, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0190, 0xa386,
-       0x0008, 0x01c0, 0x7004, 0xd084, 0x1148, 0x7108, 0x7008, 0xa106,
-       0x1de0, 0xa184, 0x0003, 0x0110, 0x0804, 0x410e, 0xa386, 0x200c,
-       0x19f0, 0x7200, 0x8204, 0x0230, 0x730c, 0xa384, 0x07ff, 0x0110,
-       0x080c, 0x2575, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
-       0x0118, 0x080c, 0x410e, 0x0470, 0x7007, 0x0012, 0x7000, 0xd084,
-       0x1148, 0x7310, 0x7014, 0xa305, 0x0128, 0x710c, 0xa184, 0x07ff,
-       0x1904, 0x405c, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
-       0x0118, 0x080c, 0x410e, 0x00b0, 0x7007, 0x0012, 0x7007, 0x0008,
-       0x7004, 0xd09c, 0x1de8, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184,
-       0x01e0, 0x0118, 0x080c, 0x410e, 0x0028, 0x7007, 0x0012, 0x7108,
-       0x8103, 0x0e88, 0x7003, 0x0008, 0x0005, 0x7108, 0xa184, 0x01e0,
-       0x15a8, 0x7108, 0xa184, 0x01e0, 0x1588, 0xa184, 0x0007, 0x0002,
-       0x40ea, 0x40f8, 0x40e8, 0x40f8, 0x40e8, 0x4148, 0x40e8, 0x4146,
-       0x080c, 0x2575, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff,
-       0x1118, 0x2049, 0x0000, 0x0005, 0x080c, 0x429a, 0x1de8, 0x0005,
-       0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x1140,
-       0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0108, 0x0030,
-       0x8aff, 0x0118, 0x080c, 0x429a, 0x1de8, 0x0005, 0x7007, 0x0012,
-       0x7108, 0x1d04, 0x4111, 0x2091, 0x6000, 0x1d04, 0x4115, 0x2091,
-       0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8,
-       0x7007, 0x0012, 0x7108, 0xd1fc, 0x1dd8, 0x7003, 0x0000, 0x7000,
-       0xa005, 0x1130, 0x7004, 0xa005, 0x1118, 0x700c, 0xa005, 0x0108,
-       0x0c40, 0x2049, 0x0000, 0xb284, 0x0200, 0x0118, 0x2001, 0x0000,
-       0x0010, 0x2001, 0x0001, 0x080c, 0x3ba7, 0x681b, 0x0002, 0x2051,
-       0x0000, 0x0005, 0x080c, 0x2575, 0x080c, 0x2575, 0x080c, 0x4187,
-       0x7210, 0x7114, 0x700c, 0xa09c, 0x07ff, 0x2800, 0xa300, 0xa211,
-       0xa189, 0x0000, 0x04a1, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200,
-       0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0140, 0x1238,
-       0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0c58, 0x2b60,
-       0x8a07, 0x0006, 0x6004, 0xd09c, 0x0118, 0xa7ba, 0x4017, 0x0010,
-       0xa7ba, 0x400f, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92,
-       0x6b8e, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0110,
-       0x080c, 0x410e, 0x7007, 0x0012, 0x080c, 0x405c, 0x0005, 0x8a50,
-       0x8739, 0x2704, 0xa004, 0x1168, 0x6000, 0xa064, 0x1108, 0x2d60,
-       0x6004, 0xa084, 0x000f, 0xa080, 0x402d, 0x203c, 0x87fb, 0x090c,
-       0x2575, 0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004,
-       0x2090, 0x00de, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057,
-       0xaad4, 0x00ff, 0xa084, 0x00ff, 0x0006, 0x6804, 0xa084, 0x0008,
-       0x000e, 0x0118, 0xa0b8, 0x4017, 0x0010, 0xa0b8, 0x400f, 0xb284,
-       0x0200, 0x0110, 0x7e20, 0x0008, 0x7e24, 0xa6b5, 0x000c, 0x681c,
-       0xd0b4, 0x0108, 0xc685, 0x2400, 0xa305, 0x0550, 0x2c58, 0x2704,
-       0x6104, 0xac60, 0x6000, 0xa400, 0x2048, 0xa9cc, 0x0004, 0x0118,
-       0x080c, 0x43a3, 0x0400, 0x701a, 0x6004, 0xa301, 0x701e, 0xd19c,
-       0x0140, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081, 0x0000,
-       0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300, 0xa203,
-       0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x080c, 0x42c5, 0x0010,
-       0x080c, 0x429a, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x00d6,
-       0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x7007, 0x0004,
-       0x7004, 0xd094, 0x1de8, 0x7003, 0x0008, 0x012e, 0x2000, 0x0005,
-       0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de,
-       0x7e20, 0xb284, 0x0200, 0x1108, 0x7e24, 0xa6b5, 0x000c, 0x681c,
-       0xd0ac, 0x1118, 0xc685, 0x7003, 0x0000, 0x6828, 0x2050, 0x2d60,
-       0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x401d, 0x273c, 0x87fb, 0x1138,
-       0x0210, 0x080c, 0x2575, 0x689c, 0xa065, 0x0120, 0x0c88, 0x080c,
-       0x429a, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x0006, 0x0016,
-       0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x7e20, 0xb284,
-       0x0200, 0x1108, 0x7e24, 0x00de, 0x003e, 0x004e, 0xa6b5, 0x000c,
-       0x681c, 0xd0b4, 0x0128, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004,
-       0x2049, 0x4235, 0x6828, 0xa055, 0x00d6, 0x0904, 0x4296, 0x2d70,
-       0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x401d, 0x273c, 0x87fb,
-       0x1140, 0x0210, 0x080c, 0x2575, 0x709c, 0xa075, 0x2060, 0x0570,
-       0x0c80, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0268,
-       0x8a51, 0x1110, 0x080c, 0x2575, 0x8738, 0x2704, 0xa005, 0x1d90,
-       0x709c, 0xa075, 0x2060, 0x01d0, 0x08e0, 0x8422, 0x8420, 0x831a,
-       0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b,
-       0x1210, 0x080c, 0x2575, 0xb284, 0x0200, 0x0118, 0x2071, 0x0050,
-       0x0010, 0x2071, 0x0020, 0x00de, 0x0804, 0x41c3, 0x00de, 0x012e,
-       0x2000, 0x0005, 0x7008, 0x0006, 0xa084, 0x01e0, 0x000e, 0x0110,
-       0xa006, 0x0005, 0xa084, 0x0003, 0xa086, 0x0003, 0x1108, 0x0005,
-       0x2704, 0xac78, 0x7800, 0x2f08, 0xd094, 0x1904, 0x43a6, 0x701a,
-       0x7804, 0x701e, 0x7808, 0x7012, 0x780c, 0x7016, 0x6004, 0xd09c,
-       0x0120, 0x7810, 0x7022, 0x7814, 0x7026, 0x7602, 0x7004, 0xa084,
-       0x0010, 0xc085, 0x7006, 0x2079, 0x4700, 0x8a51, 0x01e8, 0x8738,
-       0x2704, 0xa005, 0x1168, 0x609c, 0xa005, 0x01b8, 0x2060, 0x6004,
-       0xa084, 0x000f, 0xa080, 0x401d, 0x203c, 0x87fb, 0x090c, 0x2575,
-       0x7008, 0x0006, 0xa084, 0x01e0, 0x000e, 0x0110, 0xa006, 0x0028,
-       0xa084, 0x0003, 0xa086, 0x0003, 0x0005, 0x2051, 0x0000, 0x0005,
-       0x0126, 0x0006, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090,
-       0x00de, 0x008e, 0x7108, 0xa184, 0x0003, 0x1128, 0x6828, 0xa005,
-       0x0178, 0x0804, 0x3f6d, 0x7108, 0xd1fc, 0x0118, 0x080c, 0x40d6,
-       0x0c88, 0x7007, 0x0010, 0x7108, 0xd1fc, 0x0de8, 0x080c, 0x40d6,
-       0x7008, 0xa086, 0x0008, 0x1d30, 0x7000, 0xa005, 0x1d18, 0x7003,
-       0x0000, 0x2049, 0x0000, 0x0006, 0x2001, 0x4701, 0x2004, 0xd0cc,
-       0x0110, 0x080c, 0x435b, 0x000e, 0x012e, 0x2000, 0x0005, 0x0126,
-       0x0146, 0x0136, 0x0156, 0x00c6, 0x00d6, 0x70d0, 0xa084, 0x4c00,
-       0x8004, 0x2090, 0x00de, 0x2049, 0x431f, 0xad80, 0x0011, 0x20a0,
-       0xb284, 0x0200, 0x0118, 0x2099, 0x0032, 0x0010, 0x2099, 0x0031,
-       0x700c, 0xa084, 0x07ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002,
-       0x7003, 0x0001, 0x0118, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084,
-       0x07ff, 0x0130, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x1de0,
-       0x00ce, 0x2049, 0x0000, 0x7003, 0x0000, 0x015e, 0x013e, 0x014e,
-       0x012e, 0x2000, 0x0005, 0x6814, 0xd0fc, 0x0904, 0x439e, 0x7000,
-       0xd084, 0x05e0, 0x7e24, 0xa6b5, 0x0004, 0x7007, 0x0004, 0x7004,
-       0xa084, 0x0004, 0x1de0, 0x7118, 0x0016, 0x711c, 0x0016, 0x7120,
-       0x0016, 0x7124, 0x0016, 0x701b, 0x0000, 0x701f, 0x3fff, 0x7023,
-       0x0000, 0x7027, 0x0000, 0x7013, 0x0004, 0x7017, 0x0000, 0x7602,
-       0x7007, 0x0001, 0x2001, 0xffff, 0x2009, 0x0031, 0x200a, 0x200a,
-       0x7108, 0x7008, 0xa106, 0x1de0, 0xd1fc, 0x0dd0, 0x002e, 0x7226,
-       0x002e, 0x7222, 0x002e, 0x721e, 0x002e, 0x721a, 0x7007, 0x0002,
-       0x7008, 0xa086, 0x0008, 0x0110, 0x0804, 0x410e, 0x7007, 0x0004,
-       0x7003, 0x0000, 0x0005, 0x2049, 0x41c3, 0x0068, 0x7008, 0xa084,
-       0x0003, 0x0110, 0xa006, 0x0005, 0xa006, 0x2020, 0x2018, 0x2c58,
-       0x2160, 0x2049, 0x0000, 0x8b58, 0x6100, 0x2100, 0xa408, 0x711a,
-       0x6004, 0xa301, 0x701e, 0x0006, 0x2b04, 0xa084, 0x0008, 0x0150,
-       0x6010, 0xa081, 0x0000, 0x7022, 0x0006, 0x6014, 0xa081, 0x0000,
-       0x7026, 0x0006, 0xa184, 0x0007, 0x2011, 0x0008, 0xa22a, 0x6208,
-       0x2400, 0xa212, 0x0026, 0x620c, 0x2240, 0x2300, 0xa843, 0x002e,
-       0x88ff, 0x1170, 0x2500, 0xa202, 0x0108, 0x1250, 0x2220, 0x2041,
-       0x0000, 0x2b04, 0xd09c, 0x0110, 0x000e, 0x000e, 0x000e, 0x0450,
-       0x7512, 0x7017, 0x0000, 0x7602, 0xa986, 0x41c3, 0x1118, 0x7007,
-       0x0001, 0x0028, 0x7004, 0xa084, 0x0010, 0xc085, 0x7006, 0x2500,
-       0xa100, 0x701a, 0x2b04, 0xa084, 0x0008, 0x0110, 0x000e, 0x004e,
-       0x001e, 0xa189, 0x0000, 0x711e, 0x2b0c, 0xa18c, 0x0008, 0x0130,
-       0xa4a1, 0x0000, 0x7422, 0xa081, 0x0000, 0x7026, 0x2500, 0xa222,
-       0xa8c3, 0x0000, 0x7412, 0x2820, 0x7416, 0x7602, 0xa986, 0x41c3,
-       0x1118, 0x7007, 0x0001, 0x0028, 0x7004, 0xa084, 0x0010, 0xc085,
-       0x7006, 0x8b59, 0x2b60, 0x2079, 0x4700, 0x080c, 0x42c5, 0xa006,
-       0x0005, 0x2091, 0x8000, 0x2091, 0x6000, 0x78ac, 0xa005, 0x1168,
-       0x7974, 0x70d0, 0xa106, 0x1148, 0x781c, 0xa005, 0x0130, 0x781f,
-       0x0000, 0x0e04, 0x443d, 0x2091, 0x4080, 0x2069, 0x4780, 0xc7fd,
-       0x6800, 0xa084, 0x000f, 0x1198, 0x68d0, 0xd0b4, 0x0180, 0xd0bc,
-       0x1170, 0x00f6, 0x2079, 0x0100, 0xd7fc, 0x1110, 0x2079, 0x0200,
-       0x7830, 0xa084, 0x00c0, 0x1110, 0x080c, 0x22d5, 0x00fe, 0xd7fc,
-       0x0120, 0x2069, 0x4740, 0xc7fc, 0x0c18, 0x7830, 0x8001, 0x7832,
-       0x1904, 0x44c7, 0x7834, 0x7832, 0x2061, 0x6cc0, 0x2069, 0x4780,
-       0xc7fd, 0x68cc, 0xa005, 0x0128, 0x8001, 0x68ce, 0x1110, 0x080c,
-       0x4639, 0x6800, 0xa084, 0x000f, 0x0168, 0xa086, 0x0001, 0x0150,
-       0x6840, 0xa00d, 0x0138, 0x2104, 0xa005, 0x0120, 0x8001, 0x200a,
-       0x0904, 0x45d6, 0x6814, 0xa005, 0x01a8, 0x8001, 0x6816, 0x1190,
-       0x68a3, 0x0001, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0x0200, 0x0010,
-       0x2079, 0x0100, 0x080c, 0x3c6e, 0x00fe, 0x6860, 0xa005, 0x0110,
-       0x080c, 0x22d5, 0x687c, 0xa005, 0x0140, 0x8001, 0x687e, 0x1128,
-       0x6863, 0x0000, 0x68d0, 0xc0c5, 0x68d2, 0x68d0, 0xd0fc, 0x01b0,
-       0xc0fc, 0x68d2, 0x20a9, 0x0200, 0x6034, 0xa005, 0x0158, 0x8001,
-       0x6036, 0x68d0, 0xc0fd, 0x68d2, 0x1128, 0x6010, 0xa005, 0x0110,
-       0x080c, 0x22d5, 0xace0, 0x0010, 0x1f04, 0x44ac, 0xd7fc, 0x0138,
-       0x2061, 0x4cc0, 0x2069, 0x4740, 0xc7fc, 0x0804, 0x4469, 0x0459,
-       0x7838, 0x8001, 0x783a, 0x11a0, 0x783c, 0x783a, 0x2061, 0x4cc0,
-       0x2069, 0x4740, 0xc7fc, 0x680c, 0xa005, 0x0110, 0x080c, 0x4543,
-       0xd7fc, 0x1130, 0x2061, 0x6cc0, 0x2069, 0x4780, 0xc7fd, 0x0c98,
-       0x7810, 0xd0cc, 0x0168, 0xd0ac, 0x1120, 0xd0a4, 0x0148, 0xc0ad,
-       0x7812, 0x2091, 0x8001, 0x0e04, 0x44ef, 0x080c, 0x20a1, 0x0005,
-       0x2091, 0x8001, 0x0005, 0x7840, 0x8001, 0x7842, 0x1904, 0x4542,
-       0x7844, 0x7842, 0x2069, 0x4740, 0xc7fc, 0x2079, 0x0200, 0x68d4,
-       0xa005, 0x0138, 0x7de0, 0xa504, 0x1120, 0x68d6, 0x68d0, 0xc0bc,
-       0x68d2, 0x2079, 0x4700, 0x6810, 0xa005, 0x1110, 0x2001, 0x0101,
-       0x8001, 0x6812, 0xd7fc, 0x0118, 0xa080, 0x8dd0, 0x0010, 0xa080,
-       0x8cc0, 0x2040, 0x2004, 0xa065, 0x01e0, 0x6024, 0xa005, 0x01b0,
-       0x8001, 0x6026, 0x1198, 0x6800, 0xa005, 0x0130, 0x6848, 0xac06,
-       0x1118, 0x080c, 0x45d6, 0x0068, 0x6860, 0xa005, 0x0118, 0x6027,
-       0x0001, 0x0020, 0x080c, 0x4584, 0x2804, 0x0c28, 0x6000, 0x2c40,
-       0x0c10, 0xd7fc, 0x1138, 0x2069, 0x4780, 0xc7fd, 0x2079, 0x0100,
-       0x0804, 0x44ff, 0x0005, 0x2009, 0x0000, 0x20a9, 0x0200, 0x6008,
-       0xd09c, 0x0558, 0x6024, 0xa005, 0x0118, 0x8001, 0x6026, 0x0418,
-       0x6008, 0xc09c, 0xd084, 0x1110, 0xd0ac, 0x01c0, 0x600a, 0x6004,
-       0xa005, 0x01d8, 0x00d6, 0x00c6, 0x0016, 0x2068, 0x6010, 0x8001,
-       0x6012, 0x080c, 0x37c7, 0x2d00, 0x2c68, 0x2060, 0x080c, 0x1c02,
-       0x080c, 0x1db2, 0x001e, 0x00ce, 0x00de, 0x0038, 0xc0bd, 0x600a,
-       0xa18d, 0x0001, 0x0010, 0xa18d, 0x0100, 0xace0, 0x0010, 0x1f04,
-       0x4547, 0xa184, 0x0001, 0x0130, 0xa18c, 0xfffe, 0x690e, 0x080c,
-       0x22d5, 0x0008, 0x690e, 0x0005, 0x2c00, 0x687a, 0x6714, 0x6f72,
-       0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x60b4, 0xa084,
-       0x5f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, 0x6022,
-       0x6000, 0x2042, 0x2069, 0x4780, 0xd7fc, 0x1110, 0x2069, 0x4740,
-       0x6858, 0xac06, 0x1110, 0x2800, 0x685a, 0x080c, 0x1b9a, 0x6818,
-       0xa005, 0x0110, 0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810,
-       0x7908, 0x8109, 0x790a, 0x8001, 0x1310, 0x080c, 0x2575, 0x6812,
-       0x1118, 0x7910, 0xc1a5, 0x7912, 0x602f, 0x0000, 0x6033, 0x0000,
-       0x2c68, 0x080c, 0x1dbf, 0xd7fc, 0x1118, 0x2069, 0x4740, 0x0010,
-       0x2069, 0x4780, 0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x1118,
-       0x6976, 0x2001, 0x0004, 0x080c, 0x22cb, 0x0005, 0x00d6, 0x6948,
-       0x2160, 0xd7fc, 0x1118, 0x2069, 0x0200, 0x0010, 0x2069, 0x0100,
-       0x080c, 0x2490, 0x601b, 0x0006, 0x6858, 0xa084, 0x5f00, 0x601e,
-       0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000,
-       0x6033, 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4,
-       0x01b0, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110,
-       0x1f04, 0x45fd, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084,
-       0x0110, 0x1f04, 0x4606, 0x20a9, 0x00fa, 0x1f04, 0x460d, 0x681b,
-       0x0054, 0x00de, 0x6863, 0x0007, 0x0005, 0x2079, 0x4700, 0x00e1,
-       0x0089, 0x00a9, 0x2009, 0x0002, 0x2069, 0x4780, 0x680f, 0x0000,
-       0x6813, 0x0000, 0x6817, 0x0000, 0x8109, 0x0118, 0x2069, 0x4740,
-       0x0ca8, 0x0005, 0x2019, 0x00a3, 0x7b3a, 0x7b3e, 0x0005, 0x2019,
-       0x0033, 0x7b42, 0x7b46, 0x0005, 0x2019, 0x32dd, 0x7b32, 0x7b36,
-       0x0005, 0x6a4c, 0xa285, 0x0000, 0x01f0, 0x6950, 0x6bbc, 0xa300,
-       0x00c6, 0x2164, 0x6304, 0x83ff, 0x1138, 0x8211, 0x0148, 0x8108,
-       0xa11a, 0x0eb8, 0x69bc, 0x0ca8, 0x68cf, 0x000a, 0x00ce, 0x0005,
-       0x694c, 0x6abc, 0x2264, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109,
-       0x1dc8, 0x694e, 0x00ce, 0x0005, 0x0016, 0x1d04, 0x465d, 0x2091,
-       0x6000, 0x1d04, 0x4661, 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x1118,
-       0xd0d4, 0x0190, 0x00a0, 0xae8e, 0x0100, 0x0138, 0x7814, 0xc0f5,
-       0xc0c5, 0x7816, 0xd0d4, 0x1580, 0x0460, 0x7814, 0xc0fd, 0xc0c5,
-       0x7816, 0xd0d4, 0x1548, 0x0428, 0xd0e4, 0x0904, 0x46c4, 0x1d04,
-       0x467f, 0x2091, 0x6000, 0x2009, 0x000c, 0x1d04, 0x4685, 0x2091,
-       0x6000, 0x8109, 0x1dd0, 0x70e4, 0xa084, 0x01ff, 0xa086, 0x01ff,
-       0x1110, 0x70ec, 0x08c0, 0xae8e, 0x0100, 0x0128, 0x7814, 0xc0f4,
-       0xd0fc, 0x1130, 0x0020, 0x7814, 0xc0fc, 0xd0f4, 0x1108, 0xc0c4,
-       0x7816, 0x7804, 0xd08c, 0x0500, 0x00c6, 0x2061, 0x0000, 0x6018,
-       0xd084, 0x11b8, 0xae86, 0x0200, 0x00e6, 0x2071, 0x0010, 0x0120,
-       0x70db, 0x0001, 0x78e4, 0x0018, 0x70db, 0x0000, 0x78e0, 0x70c6,
-       0x70c3, 0x800e, 0x601b, 0x0001, 0x2091, 0x4080, 0x00ee, 0x00ce,
-       0x0018, 0x00ce, 0x681f, 0x000c, 0x001e, 0x70a0, 0x70a2, 0x0005,
-       0x0c26
-};
-#ifdef UNIQUE_FW_NAME
-static unsigned short fw12160i_length01 = 0x36c9;
-#else
-static unsigned short risc_code_length01 = 0x36c9;
-#endif
-
diff --git a/drivers/scsi/ql1280_fw.h b/drivers/scsi/ql1280_fw.h
deleted file mode 100644 (file)
index 784f2a0..0000000
+++ /dev/null
@@ -1,2048 +0,0 @@
-/*****************************************************************************
- *                  QLOGIC LINUX SOFTWARE
- *
- * QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x
- * Copyright (C) 2001 Qlogic Corporation (www.qlogic.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; either version 2, 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.
- *
- *****************************************************************************/
-
-/************************************************************************
- *              --- ISP1240/1080/1280 Initiator Firmware ---           *
- *                           32 LUN Support                            *
- ************************************************************************/
-
-
-/*
- *     Firmware Version 8.15.11 (10:20 Jan 02, 2002)
- */
-
-#ifdef UNIQUE_FW_NAME
-static unsigned char fw1280ei_version_str[] = {8,15,11};
-#else
-static unsigned char firmware_version[] = {8,15,11};
-#endif
-
-#ifdef UNIQUE_FW_NAME
-#define fw1280ei_VERSION_STRING "8.15.11"
-#else
-#define FW_VERSION_STRING "8.15.11"
-#endif
-
-#ifdef UNIQUE_FW_NAME
-static unsigned short fw1280ei_addr01 = 0x1000 ;
-#else
-static unsigned short risc_code_addr01 = 0x1000 ;
-#endif
-
-#ifdef UNIQUE_FW_NAME
-static unsigned short fw1280ei_code01[] = {
-#else
-static unsigned short risc_code01[] = {
-#endif
-       0x0078, 0x1041, 0x0000, 0x3e2e, 0x0000, 0x2043, 0x4f50, 0x5952,
-       0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
-       0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
-       0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
-       0x3132, 0x3430, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
-       0x6572, 0x7369, 0x6f6e, 0x2030, 0x382e, 0x3135, 0x2020, 0x2043,
-       0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
-       0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
-       0x2400, 0x20c9, 0x98ff, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1080,
-       0x00c0, 0x1054, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010,
-       0x2089, 0x1374, 0x0078, 0x106d, 0x2001, 0x04fc, 0x2004, 0xa086,
-       0x1280, 0x00c0, 0x1069, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2071,
-       0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010, 0x2089, 0x13f8, 0x0078,
-       0x106d, 0x20c1, 0x0020, 0x2089, 0x131c, 0x2071, 0x0010, 0x70c3,
-       0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
-       0x0008, 0x2001, 0x04fe, 0x70d6, 0x20c1, 0x0021, 0x2019, 0x0000,
-       0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64,
-       0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54, 0x205b, 0x5050, 0x2114,
-       0xa286, 0xa5a5, 0x0040, 0x10a4, 0xa386, 0x000f, 0x0040, 0x10a0,
-       0x2c6a, 0x2a5a, 0x20c1, 0x0020, 0x2019, 0x000f, 0x0078, 0x1080,
-       0x2c6a, 0x2a5a, 0x0078, 0x10a2, 0x2c6a, 0x2a5a, 0x2130, 0x2128,
-       0xa1a2, 0x4f00, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
-       0xa192, 0x9900, 0x2009, 0x0000, 0x2001, 0x0032, 0x1078, 0x20c1,
-       0x2218, 0x2079, 0x4f00, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
-       0x0040, 0x42a4, 0x8109, 0x00c0, 0x10bf, 0x2009, 0xff00, 0x3400,
-       0xa102, 0x0048, 0x10cf, 0x0040, 0x10cf, 0x20a8, 0x42a4, 0x2001,
-       0x04fc, 0x2004, 0xa086, 0x1080, 0x00c0, 0x10e5, 0x2071, 0x0100,
-       0x0d7e, 0x2069, 0x4f40, 0x1078, 0x4db0, 0x0d7f, 0x7810, 0xc0ed,
-       0x7812, 0x781b, 0x0064, 0x0078, 0x110a, 0x2001, 0x04fc, 0x2004,
-       0xa086, 0x1280, 0x00c0, 0x1105, 0x7814, 0xc0ed, 0xc0d5, 0x7816,
-       0x781b, 0x0064, 0x2071, 0x0200, 0x0d7e, 0x2069, 0x4f40, 0x1078,
-       0x4db0, 0x2069, 0x4f80, 0x2071, 0x0100, 0x1078, 0x4db0, 0x7814,
-       0xc0d4, 0x7816, 0x0d7f, 0x0078, 0x110a, 0x7814, 0xc0e5, 0x7816,
-       0x781b, 0x003c, 0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800,
-       0xc08d, 0x7802, 0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002,
-       0x7827, 0x0002, 0x2009, 0x0002, 0x2069, 0x4f40, 0x681b, 0x0003,
-       0x6823, 0x0007, 0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028,
-       0x6837, 0x0000, 0x683b, 0x0006, 0x6833, 0x0008, 0x683f, 0x0000,
-       0x8109, 0x0040, 0x115e, 0x68d3, 0x000a, 0x68c3, 0x4fc0, 0x2079,
-       0x4f00, 0x7814, 0xd0e4, 0x00c0, 0x1144, 0xd0ec, 0x00c0, 0x1148,
-       0x68d7, 0x7329, 0x0078, 0x114a, 0x68d7, 0x730d, 0x0078, 0x114a,
-       0x68d7, 0x732d, 0x68c7, 0x54c0, 0x68cb, 0x53c0, 0x68cf, 0x94c0,
-       0x68ab, 0x9744, 0x68af, 0x9749, 0x68b3, 0x9744, 0x68b7, 0x9744,
-       0x68a7, 0x0001, 0x2069, 0x4f80, 0x0078, 0x111e, 0x68d3, 0x000a,
-       0x68c3, 0x51c0, 0x7814, 0xd0e4, 0x00c0, 0x116a, 0x68d7, 0x7439,
-       0x0078, 0x116c, 0x68d7, 0x7419, 0x68c7, 0x74c0, 0x68cb, 0x5440,
-       0x68cf, 0x95d0, 0x68ab, 0x9749, 0x68af, 0x974e, 0x68b3, 0x9749,
-       0x68b7, 0x9749, 0x68a7, 0x0001, 0x7810, 0xd0ec, 0x00c0, 0x11c2,
-       0x7814, 0xd0e4, 0x00c0, 0x11b4, 0x0e7e, 0x2069, 0x53c0, 0x2071,
-       0x0200, 0x70ec, 0xd0e4, 0x00c0, 0x1195, 0x2019, 0x0c0c, 0x2021,
-       0x000c, 0x1078, 0x2050, 0x0078, 0x119b, 0x2019, 0x0c0a, 0x2021,
-       0x000a, 0x1078, 0x2050, 0x2069, 0x5440, 0x2071, 0x0100, 0x70ec,
-       0xd0e4, 0x00c0, 0x11ab, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078,
-       0x2050, 0x0078, 0x11b1, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078,
-       0x2050, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0c, 0x2021, 0x000c,
-       0x2069, 0x53c0, 0x1078, 0x2050, 0x2069, 0x5440, 0x1078, 0x2050,
-       0x0078, 0x11db, 0x2069, 0x53c0, 0x0e7e, 0x2071, 0x0100, 0x70ec,
-       0xd0e4, 0x00c0, 0x11d4, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078,
-       0x2050, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0a, 0x2021, 0x000a,
-       0x1078, 0x2050, 0x0e7f, 0x2011, 0x0002, 0x2069, 0x54c0, 0x2009,
-       0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bc8,
-       0xa386, 0xfeff, 0x00c0, 0x11f2, 0x6817, 0x0100, 0x681f, 0x0064,
-       0x0078, 0x11f6, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010,
-       0x00f0, 0x11e3, 0x8109, 0x00c0, 0x11e1, 0x8211, 0x0040, 0x1204,
-       0x2069, 0x74c0, 0x0078, 0x11df, 0x1078, 0x26a2, 0x1078, 0x4712,
-       0x1078, 0x1e1b, 0x1078, 0x4d42, 0x2091, 0x2100, 0x2079, 0x4f00,
-       0x7810, 0xd0ec, 0x0040, 0x1218, 0x2071, 0x0020, 0x0078, 0x121a,
-       0x2071, 0x0050, 0x2091, 0x2200, 0x2079, 0x4f00, 0x2071, 0x0020,
-       0x2091, 0x2300, 0x2079, 0x4f00, 0x7810, 0xd0ec, 0x0040, 0x122c,
-       0x2079, 0x0100, 0x0078, 0x122e, 0x2079, 0x0200, 0x2071, 0x4f40,
-       0x2091, 0x2400, 0x2079, 0x0100, 0x2071, 0x4f80, 0x2091, 0x2000,
-       0x2079, 0x4f00, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
-       0x2071, 0x0010, 0x70c3, 0x0000, 0x0090, 0x124d, 0x70c0, 0xa086,
-       0x0002, 0x00c0, 0x124d, 0x1078, 0x15c1, 0x2039, 0x0000, 0x7810,
-       0xd0ec, 0x00c0, 0x12cf, 0x1078, 0x148e, 0x78ac, 0xa005, 0x00c0,
-       0x126b, 0x0068, 0x1261, 0x786c, 0xa065, 0x0040, 0x1261, 0x1078,
-       0x23dc, 0x1078, 0x20e8, 0x0068, 0x1278, 0x786c, 0xa065, 0x0040,
-       0x126b, 0x1078, 0x23dc, 0x0068, 0x1278, 0x2009, 0x4f47, 0x2011,
-       0x4f87, 0x2104, 0x220c, 0xa105, 0x0040, 0x1278, 0x1078, 0x1f51,
-       0x2071, 0x4f40, 0x70a4, 0xa005, 0x0040, 0x129d, 0x7450, 0xa485,
-       0x0000, 0x0040, 0x129d, 0x2079, 0x0200, 0x2091, 0x8000, 0x72d4,
-       0xa28c, 0x303d, 0x2190, 0x1078, 0x2bb1, 0x2091, 0x8000, 0x2091,
-       0x303d, 0x0068, 0x129d, 0x2079, 0x4f00, 0x786c, 0xa065, 0x0040,
-       0x129d, 0x2071, 0x0010, 0x1078, 0x23dc, 0x00e0, 0x12a5, 0x2079,
-       0x4f00, 0x2071, 0x0010, 0x1078, 0x4b16, 0x2071, 0x4f80, 0x70a4,
-       0xa005, 0x0040, 0x12bd, 0x7050, 0xa025, 0x0040, 0x12bd, 0x2079,
-       0x0100, 0x2091, 0x8000, 0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078,
-       0x2bb1, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079, 0x4f00, 0x2071,
-       0x0010, 0x0068, 0x12c9, 0x786c, 0xa065, 0x0040, 0x12c9, 0x1078,
-       0x23dc, 0x00e0, 0x1253, 0x1078, 0x4b16, 0x0078, 0x1253, 0x1078,
-       0x148e, 0x78ac, 0xa005, 0x00c0, 0x12e7, 0x0068, 0x12dd, 0x786c,
-       0xa065, 0x0040, 0x12dd, 0x1078, 0x23dc, 0x1078, 0x20e8, 0x0068,
-       0x12f1, 0x786c, 0xa065, 0x0040, 0x12e7, 0x1078, 0x23dc, 0x0068,
-       0x12f1, 0x2009, 0x4f47, 0x2104, 0xa005, 0x0040, 0x12f1, 0x1078,
-       0x1f51, 0x2071, 0x4f40, 0x70a4, 0xa005, 0x0040, 0x130c, 0x7450,
-       0xa485, 0x0000, 0x0040, 0x130c, 0x2079, 0x0100, 0x2091, 0x8000,
-       0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078, 0x2bb1, 0x2091, 0x8000,
-       0x2091, 0x303d, 0x2079, 0x4f00, 0x2071, 0x0010, 0x0068, 0x1316,
-       0x786c, 0xa065, 0x0040, 0x1316, 0x1078, 0x23dc, 0x00e0, 0x12cf,
-       0x1078, 0x4b16, 0x0078, 0x12cf, 0x133c, 0x133c, 0x133e, 0x133e,
-       0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363,
-       0x134b, 0x134b, 0x134b, 0x134b, 0x133c, 0x133c, 0x133e, 0x133e,
-       0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363,
-       0x134b, 0x134b, 0x134b, 0x134b, 0x0078, 0x133c, 0x007e, 0x107e,
-       0x127e, 0x2091, 0x2400, 0x1078, 0x29d1, 0x127f, 0x107f, 0x007f,
-       0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13c8,
-       0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
-       0x127e, 0x2091, 0x2300, 0x1078, 0x29d1, 0x127f, 0x107f, 0x007f,
-       0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300,
-       0x1078, 0x29d1, 0x2091, 0x2400, 0x1078, 0x29d1, 0x127f, 0x107f,
-       0x007f, 0x2091, 0x8001, 0x007c, 0x1394, 0x1394, 0x1396, 0x1396,
-       0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13ae, 0x13ae, 0x1396, 0x1396,
-       0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13af, 0x13af, 0x13af, 0x13af,
-       0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af,
-       0x13af, 0x13af, 0x13af, 0x13af, 0x0078, 0x1394, 0x007e, 0x107e,
-       0x127e, 0x2091, 0x2300, 0x1078, 0x29d1, 0x127f, 0x107f, 0x007f,
-       0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13d5,
-       0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007c, 0x107e,
-       0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x007e, 0x2071, 0x0100, 0x2069,
-       0x4f40, 0x2079, 0x4f00, 0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078,
-       0x4db0, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007c,
-       0x3c00, 0xa084, 0x0007, 0x0079, 0x13cd, 0x13de, 0x13de, 0x13e0,
-       0x13e0, 0x13e5, 0x13e5, 0x13ea, 0x13ea, 0x3c00, 0xa084, 0x0003,
-       0x0079, 0x13da, 0x13de, 0x13de, 0x13f3, 0x13f3, 0x1078, 0x29b2,
-       0x2091, 0x2200, 0x1078, 0x47ec, 0x007c, 0x2091, 0x2100, 0x1078,
-       0x47ec, 0x007c, 0x2091, 0x2100, 0x1078, 0x47ec, 0x2091, 0x2200,
-       0x1078, 0x47ec, 0x007c, 0x2091, 0x2100, 0x1078, 0x47ec, 0x007c,
-       0x1418, 0x1418, 0x141a, 0x141a, 0x1427, 0x1427, 0x1427, 0x1427,
-       0x1432, 0x1432, 0x143f, 0x143f, 0x1427, 0x1427, 0x1427, 0x1427,
-       0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450,
-       0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450,
-       0x0078, 0x1418, 0x007e, 0x107e, 0x127e, 0x2091, 0x2400, 0x1078,
-       0x29d1, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
-       0x107e, 0x127e, 0x1078, 0x13c8, 0x127f, 0x107f, 0x007f, 0x2091,
-       0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078,
-       0x29d1, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
-       0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x29d1, 0x2091, 0x2400,
-       0x1078, 0x29d1, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c,
-       0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2079, 0x4f00,
-       0x2071, 0x0200, 0x2069, 0x4f40, 0x3d00, 0xd08c, 0x0040, 0x1466,
-       0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078, 0x4db0, 0x3d00, 0xd084,
-       0x0040, 0x1474, 0x2069, 0x4f80, 0x2071, 0x0100, 0x70ec, 0xa084,
-       0x1c00, 0x78e6, 0x1078, 0x4db0, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f,
-       0x107f, 0x007f, 0x007c, 0x7008, 0x800b, 0x00c8, 0x1489, 0x7007,
-       0x0002, 0xa08c, 0x01e0, 0x00c0, 0x148a, 0xd09c, 0x0040, 0x1489,
-       0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x15c4, 0x0068, 0x151a,
-       0x2061, 0x0000, 0x6018, 0xd084, 0x00c0, 0x151a, 0x7828, 0xa005,
-       0x00c0, 0x149e, 0x0010, 0x151b, 0x0078, 0x151a, 0x7910, 0xd1f4,
-       0x0040, 0x14a4, 0x0078, 0x14b9, 0x7914, 0xd1ec, 0x0040, 0x14bd,
-       0xd0fc, 0x0040, 0x14b3, 0x007e, 0x1078, 0x1dae, 0x007f, 0x0040,
-       0x14bd, 0x0078, 0x14b9, 0x007e, 0x1078, 0x1da1, 0x007f, 0x0040,
-       0x14bd, 0x2001, 0x4007, 0x0078, 0x15c3, 0x7910, 0xd0fc, 0x00c0,
-       0x14c7, 0x2061, 0x4f40, 0xc19c, 0xc7fc, 0x0078, 0x14cb, 0x2061,
-       0x4f80, 0xc19d, 0xc7fd, 0x6064, 0xa005, 0x00c0, 0x151a, 0x7912,
-       0x6082, 0x7828, 0xc0fc, 0xa086, 0x0018, 0x00c0, 0x14db, 0x0c7e,
-       0x1078, 0x1b85, 0x0c7f, 0x782b, 0x0000, 0x607c, 0xa065, 0x0040,
-       0x1500, 0x0c7e, 0x609c, 0x1078, 0x1e90, 0x0c7f, 0x609f, 0x0000,
-       0x1078, 0x1cd5, 0x2009, 0x0018, 0x6087, 0x0103, 0x7810, 0x007e,
-       0x84ff, 0x00c0, 0x14f6, 0x85ff, 0x0040, 0x14f8, 0xc0c5, 0x7812,
-       0x1078, 0x1dbb, 0x007f, 0x7812, 0x00c0, 0x1514, 0x1078, 0x1e0d,
-       0x7810, 0xd09c, 0x00c0, 0x1508, 0x2061, 0x4f40, 0x0078, 0x150c,
-       0x2061, 0x4f80, 0xc09c, 0x7812, 0x607f, 0x0000, 0x60d4, 0xd0dc,
-       0x0040, 0x1518, 0xc0dc, 0x60d6, 0x2001, 0x4005, 0x0078, 0x15c3,
-       0x0078, 0x15c1, 0x007c, 0x7810, 0xd0f4, 0x0040, 0x1523, 0x2001,
-       0x4007, 0x0078, 0x15c3, 0xa006, 0x70c2, 0x70c6, 0x70ca, 0x70ce,
-       0x70da, 0x70c0, 0xa03d, 0xa08a, 0x0040, 0x00c8, 0x1531, 0x0079,
-       0x1538, 0x2100, 0xa08a, 0x0040, 0x00c8, 0x15cf, 0x0079, 0x1578,
-       0x15c1, 0x1617, 0x15e0, 0x164f, 0x1687, 0x1687, 0x15d7, 0x1ced,
-       0x1692, 0x15cf, 0x15e4, 0x15e6, 0x15e8, 0x15ea, 0x1cf2, 0x15cf,
-       0x16a0, 0x16fd, 0x1ba5, 0x1ce7, 0x15ec, 0x19ea, 0x1a2c, 0x1a67,
-       0x1ab8, 0x19a5, 0x19b2, 0x19c6, 0x19d9, 0x17eb, 0x15cf, 0x1734,
-       0x1741, 0x174d, 0x1759, 0x176f, 0x177b, 0x177e, 0x178a, 0x1796,
-       0x179e, 0x17d3, 0x17df, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x17f8,
-       0x180a, 0x1826, 0x185c, 0x1884, 0x1894, 0x1897, 0x18c8, 0x18f9,
-       0x190b, 0x1974, 0x1984, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x1994,
-       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x1d17, 0x1d1d, 0x15cf,
-       0x15cf, 0x15cf, 0x1d21, 0x1d66, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
-       0x1611, 0x1681, 0x169a, 0x16f7, 0x1b9f, 0x15cf, 0x15cf, 0x1b68,
-       0x15cf, 0x1d6a, 0x1d09, 0x1d13, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
-       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
-       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
-       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
-       0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf, 0x15cf,
-       0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x15c3, 0x73ce, 0x72ca,
-       0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068, 0x15c4, 0x2061, 0x0000,
-       0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c, 0x70c3,
-       0x4001, 0x0078, 0x15c4, 0x70c3, 0x4006, 0x0078, 0x15c4, 0x2099,
-       0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078, 0x15c1,
-       0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x15c1, 0x0078, 0x15c1,
-       0x0078, 0x15c1, 0x0078, 0x15c1, 0x2091, 0x8000, 0x70c3, 0x0004,
-       0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0008,
-       0x2001, 0x000f, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031,
-       0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051, 0x0445, 0x2061,
-       0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091, 0x4080, 0x0078,
-       0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x161a, 0x2029,
-       0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, 0x2099,
-       0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e, 0x7422,
-       0x7526, 0x2021, 0x0040, 0x81ff, 0x0040, 0x15c1, 0xa182, 0x0040,
-       0x00c8, 0x1634, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x7007,
-       0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0040, 0x163b, 0x7007,
-       0x0002, 0xa084, 0x01e0, 0x0040, 0x1649, 0x70c3, 0x4002, 0x0078,
-       0x15c4, 0x24a8, 0x53a5, 0x0078, 0x162b, 0x0078, 0x15c1, 0x2029,
-       0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x2098, 0x20a1,
-       0x0030, 0x7003, 0x0000, 0x7007, 0x0006, 0x731a, 0x721e, 0x7422,
-       0x7526, 0x2021, 0x0040, 0x7007, 0x0006, 0x81ff, 0x0040, 0x15c1,
-       0xa182, 0x0040, 0x00c8, 0x166e, 0x2120, 0xa006, 0x2008, 0x8403,
-       0x7012, 0x24a8, 0x53a6, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0040,
-       0x1675, 0xa084, 0x01e0, 0x0040, 0x1663, 0x70c3, 0x4002, 0x0078,
-       0x15c4, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1652, 0x71c4,
-       0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x168f, 0x200a, 0x72ca,
-       0x0078, 0x15c0, 0x70c7, 0x0008, 0x70cb, 0x000f, 0x70cf, 0x000b,
-       0x0078, 0x15c1, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x16a3,
-       0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6,
-       0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x16f2, 0xa40a, 0x0040,
-       0x16b3, 0x00c8, 0x16bc, 0x8001, 0x7872, 0xa084, 0xfc00, 0x0040,
-       0x16c0, 0x78ac, 0xc085, 0x78ae, 0x2001, 0x4005, 0x0078, 0x15c3,
-       0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76, 0xa48c, 0xff00, 0x0040,
-       0x16d8, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f, 0xa118,
-       0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, 0x0078, 0x16e2,
-       0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1, 0x0000,
-       0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605, 0x0040,
-       0x16ec, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc, 0x78ae,
-       0x0078, 0x16f5, 0x78ac, 0xc085, 0x78ae, 0x0078, 0x15c1, 0x75d8,
-       0x76dc, 0x75da, 0x76de, 0x0078, 0x1700, 0x2029, 0x0000, 0x2530,
-       0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6,
-       0xa005, 0x0040, 0x172f, 0xa40a, 0x0040, 0x1710, 0x00c8, 0x1719,
-       0x8001, 0x7892, 0xa084, 0xfc00, 0x0040, 0x171d, 0x78ac, 0xc0c5,
-       0x78ae, 0x2001, 0x4005, 0x0078, 0x15c3, 0x7a9a, 0x7b9e, 0x7da2,
-       0x7ea6, 0x2600, 0xa505, 0x0040, 0x1728, 0x7a10, 0xc2c5, 0x7a12,
-       0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0078, 0x1732, 0x78ac,
-       0xc0c5, 0x78ae, 0x0078, 0x15c1, 0x2009, 0x0000, 0x786c, 0xa065,
-       0x0040, 0x173e, 0x8108, 0x6000, 0x0078, 0x1737, 0x7ac4, 0x0078,
-       0x15bf, 0x2009, 0x4f48, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15c0,
-       0x2011, 0x4f88, 0x2214, 0x0078, 0x15bf, 0x2009, 0x4f49, 0x210c,
-       0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2011, 0x4f89, 0x2214, 0x0078,
-       0x15bf, 0x2061, 0x4f40, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214,
-       0x7810, 0xd0ec, 0x00c0, 0x176d, 0x2061, 0x4f80, 0x6328, 0x73da,
-       0x632c, 0x831c, 0x831c, 0x831c, 0x73de, 0x0078, 0x15bf, 0x2009,
-       0x4f4c, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2011, 0x4f8c,
-       0x2214, 0x0078, 0x15bf, 0x7918, 0x0078, 0x15c0, 0x2009, 0x4f4d,
-       0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2011, 0x4f8d, 0x2214,
-       0x0078, 0x15bf, 0x2009, 0x4f4e, 0x210c, 0x7810, 0xd0ec, 0x00c0,
-       0x15c0, 0x2011, 0x4f8e, 0x2214, 0x0078, 0x15bf, 0x7920, 0x7810,
-       0xd0ec, 0x00c0, 0x15c0, 0x7a24, 0x0078, 0x15bf, 0x71c4, 0xd1fc,
-       0x00c0, 0x17a6, 0x2011, 0x53c0, 0x0078, 0x17a8, 0x2011, 0x5440,
-       0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, 0x6a00,
-       0x6804, 0xd09c, 0x0040, 0x17b7, 0x6b08, 0x0078, 0x17b8, 0x6b0c,
-       0xd1fc, 0x00c0, 0x17bf, 0x2021, 0x023b, 0x0078, 0x17c1, 0x2021,
-       0x013b, 0x2424, 0x7914, 0xd1e4, 0x0040, 0x17cd, 0xd4c4, 0x00c0,
-       0x17cc, 0xc4d5, 0x0078, 0x17cd, 0xc4dd, 0xa4a4, 0x1c00, 0x74de,
-       0x71c4, 0x0078, 0x15be, 0x77c4, 0x1078, 0x1e2b, 0x2091, 0x8000,
-       0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x15be, 0x2061,
-       0x4f40, 0x6118, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2061, 0x4f80,
-       0x6218, 0x0078, 0x15bf, 0x77c4, 0x1078, 0x1e2b, 0x2091, 0x8000,
-       0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091, 0x8001, 0x0078, 0x15be,
-       0x71c4, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010, 0x00c8, 0x15b9,
-       0x1078, 0x27c6, 0xa384, 0x4000, 0x0040, 0x1808, 0xa295, 0x0020,
-       0x0078, 0x15be, 0x71c4, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x00c8,
-       0x15b9, 0xd1bc, 0x00c0, 0x1819, 0x2011, 0x4f48, 0x2204, 0x0078,
-       0x181d, 0x2011, 0x4f88, 0x2204, 0xc0bd, 0x007e, 0x2100, 0xc0bc,
-       0x2012, 0x1078, 0x2723, 0x017f, 0x0078, 0x15c0, 0x71c4, 0x2021,
-       0x4f49, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x1835, 0x71c8,
-       0x2021, 0x4f89, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1854, 0x20a9,
-       0x0008, 0x2204, 0xa106, 0x0040, 0x1844, 0x8210, 0x00f0, 0x1839,
-       0x71c4, 0x72c8, 0x0078, 0x15b8, 0xa292, 0x1854, 0x027e, 0x2122,
-       0x017f, 0x1078, 0x2744, 0x7810, 0xd0ec, 0x00c0, 0x1852, 0xd3fc,
-       0x0040, 0x182f, 0x0078, 0x15c1, 0x03e8, 0x00fa, 0x01f4, 0x02ee,
-       0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4f40, 0x6128, 0x622c,
-       0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003,
-       0x8003, 0x602e, 0x7810, 0xd0ec, 0x00c0, 0x1882, 0x027e, 0x017e,
-       0x2061, 0x4f80, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70d8,
-       0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, 0x72de,
-       0x017f, 0x027f, 0x0078, 0x15bf, 0x2061, 0x4f40, 0x6130, 0x70c4,
-       0x6032, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x2061, 0x4f80, 0x6230,
-       0x70c8, 0x6032, 0x0078, 0x15bf, 0x7918, 0x0078, 0x15c0, 0x71c4,
-       0xa184, 0xffcf, 0x0040, 0x18a3, 0x7810, 0xd0ec, 0x00c0, 0x15b9,
-       0x72c8, 0x0078, 0x15b8, 0x2011, 0x4f4d, 0x2204, 0x2112, 0x007e,
-       0x2019, 0x0000, 0x1078, 0x27ab, 0x7810, 0xd0ec, 0x0040, 0x18b3,
-       0x017f, 0x0078, 0x15c0, 0x71c8, 0xa184, 0xffcf, 0x0040, 0x18bc,
-       0x2110, 0x71c4, 0x0078, 0x15b8, 0x2011, 0x4f8d, 0x2204, 0x2112,
-       0x007e, 0xc3fd, 0x1078, 0x27ab, 0x027f, 0x017f, 0x0078, 0x15bf,
-       0x71c4, 0xa182, 0x0010, 0x0048, 0x18d4, 0x7810, 0xd0ec, 0x00c0,
-       0x15b9, 0x72c8, 0x0078, 0x15b8, 0x2011, 0x4f4e, 0x2204, 0x007e,
-       0x2112, 0x2019, 0x0000, 0x1078, 0x2789, 0x7810, 0xd0ec, 0x0040,
-       0x18e4, 0x017f, 0x0078, 0x15c0, 0x71c8, 0xa182, 0x0010, 0x0048,
-       0x18ed, 0x2110, 0x71c4, 0x0078, 0x15b8, 0x2011, 0x4f8e, 0x2204,
-       0x007e, 0x2112, 0xc3fd, 0x1078, 0x2789, 0x027f, 0x017f, 0x0078,
-       0x15bf, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x15b8, 0xa284,
-       0xfffd, 0x00c0, 0x15b8, 0x2100, 0x7920, 0x7822, 0x2200, 0x7a24,
-       0x7826, 0x0078, 0x15bf, 0x71c4, 0xd1fc, 0x00c0, 0x1913, 0x2011,
-       0x53c0, 0x0078, 0x1915, 0x2011, 0x5440, 0x8107, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa268, 0x2019, 0x0000, 0x72c8, 0xd2bc,
-       0x0040, 0x1924, 0xa39d, 0x0010, 0xd2b4, 0x0040, 0x1929, 0xa39d,
-       0x0008, 0x2091, 0x8000, 0x6800, 0x007e, 0xa226, 0x0040, 0x1948,
-       0x6a02, 0xd4ec, 0x0040, 0x1935, 0xc3a5, 0xd4e4, 0x0040, 0x1939,
-       0xc39d, 0xd4f4, 0x0040, 0x1948, 0x810f, 0xd2f4, 0x0040, 0x1944,
-       0x1078, 0x2808, 0x0078, 0x1948, 0x1078, 0x27e6, 0x0078, 0x1948,
-       0x72cc, 0x6808, 0xa206, 0x0040, 0x196a, 0xa2a4, 0x00ff, 0x7814,
-       0xd0e4, 0x00c0, 0x195b, 0xa482, 0x0028, 0x0048, 0x1967, 0x0040,
-       0x1967, 0x0078, 0x195f, 0xa482, 0x0043, 0x0048, 0x1967, 0x71c4,
-       0x71c6, 0x027f, 0x72ca, 0x2091, 0x8001, 0x0078, 0x15ba, 0x6a0a,
-       0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
-       0x2091, 0x8001, 0x0078, 0x15be, 0x77c4, 0x1078, 0x1e2b, 0x2091,
-       0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc,
-       0x681e, 0x2708, 0x0078, 0x15be, 0x70c4, 0x2061, 0x4f40, 0x6118,
-       0x601a, 0x7810, 0xd0ec, 0x00c0, 0x15c0, 0x70c8, 0x2061, 0x4f80,
-       0x6218, 0x601a, 0x0078, 0x15bf, 0x71c4, 0x72c8, 0x73cc, 0xa182,
-       0x0010, 0x00c8, 0x15b9, 0x1078, 0x282a, 0xa384, 0x4000, 0x0040,
-       0x19a3, 0xa295, 0x0020, 0x0078, 0x15be, 0x77c4, 0x1078, 0x1e2b,
-       0x2091, 0x8000, 0x6a08, 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708,
-       0x0078, 0x15bf, 0x77c4, 0x1078, 0x1e2b, 0x2091, 0x8000, 0x6a08,
-       0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x19c1, 0x1078,
-       0x266f, 0x2091, 0x8001, 0x2708, 0x0078, 0x15bf, 0x77c4, 0x1078,
-       0x1e2b, 0x2091, 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005,
-       0x0040, 0x19d4, 0x1078, 0x266f, 0x2091, 0x8001, 0x2708, 0x0078,
-       0x15bf, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020,
-       0x2091, 0x8000, 0x1078, 0x1e46, 0x2091, 0x8001, 0x2708, 0x6a08,
-       0x0078, 0x15bf, 0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x19fe, 0xd7fc,
-       0x0040, 0x19f8, 0x1078, 0x1dae, 0x0040, 0x19fe, 0x0078, 0x15c3,
-       0x1078, 0x1da1, 0x0040, 0x19fe, 0x0078, 0x15c3, 0x73c8, 0x72cc,
-       0x77c6, 0x73ca, 0x72ce, 0x1078, 0x1ecd, 0x00c0, 0x1a28, 0x6818,
-       0xa005, 0x0040, 0x1a22, 0x2708, 0x077e, 0x1078, 0x285a, 0x077f,
-       0x00c0, 0x1a22, 0x2001, 0x0015, 0xd7fc, 0x00c0, 0x1a1b, 0x2061,
-       0x4f40, 0x0078, 0x1a1e, 0xc0fd, 0x2061, 0x4f80, 0x782a, 0x2091,
-       0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15c3,
-       0x2091, 0x8001, 0x0078, 0x15c1, 0x77c4, 0x7814, 0xd0e4, 0x00c0,
-       0x1a40, 0xd7fc, 0x0040, 0x1a3a, 0x1078, 0x1dae, 0x0040, 0x1a40,
-       0x0078, 0x15c3, 0x1078, 0x1da1, 0x0040, 0x1a40, 0x0078, 0x15c3,
-       0x77c6, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
-       0x8000, 0x1078, 0x1e46, 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x1a54,
-       0x2061, 0x4f40, 0x0078, 0x1a57, 0x2061, 0x4f80, 0xc1fd, 0x6067,
-       0x0003, 0x607f, 0x0000, 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4,
-       0xc1dc, 0x61d6, 0x1078, 0x266f, 0x2091, 0x8001, 0x007c, 0x77c8,
-       0x77ca, 0x77c4, 0x77c6, 0x7814, 0xd0e4, 0x00c0, 0x1a7e, 0xd7fc,
-       0x0040, 0x1a78, 0x1078, 0x1dae, 0x0040, 0x1a7e, 0x0078, 0x15c3,
-       0x1078, 0x1da1, 0x0040, 0x1a7e, 0x0078, 0x15c3, 0xa7bc, 0xff00,
-       0x2091, 0x8000, 0x2009, 0x0017, 0xd7fc, 0x00c0, 0x1a8b, 0x2061,
-       0x4f40, 0x0078, 0x1a8e, 0x2061, 0x4f80, 0xc1fd, 0x607f, 0x0000,
-       0x6067, 0x0002, 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc,
-       0x61d6, 0x1078, 0x266f, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049,
-       0x0005, 0x2051, 0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0040,
-       0x1aac, 0x60d4, 0xc0fd, 0x60d6, 0x1078, 0x1e46, 0x70c8, 0x6836,
-       0x8738, 0xa784, 0x001f, 0x00c0, 0x1aac, 0x2091, 0x8001, 0x007c,
-       0x2019, 0x0000, 0x7814, 0xd0e4, 0x00c0, 0x1ace, 0x72c8, 0xd284,
-       0x0040, 0x1ac8, 0x1078, 0x1dae, 0x0040, 0x1ace, 0x0078, 0x15c3,
-       0x1078, 0x1da1, 0x0040, 0x1ace, 0x0078, 0x15c3, 0x72c8, 0x72ca,
-       0x78ac, 0xa084, 0x0003, 0x00c0, 0x1af9, 0x2039, 0x0000, 0xd284,
-       0x0040, 0x1adb, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
-       0x0008, 0x1078, 0x1e2b, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d,
-       0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1ae1,
-       0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0,
-       0x1ae1, 0x2091, 0x8000, 0x72c8, 0xd284, 0x00c0, 0x1b0b, 0x7810,
-       0xd0ec, 0x0040, 0x1b07, 0x2069, 0x0100, 0x0078, 0x1b0d, 0x2069,
-       0x0200, 0x0078, 0x1b0d, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd,
-       0x680a, 0x6830, 0xd0b4, 0x0040, 0x1b2d, 0x684b, 0x0004, 0x20a9,
-       0x0014, 0x6848, 0xd094, 0x0040, 0x1b1f, 0x00f0, 0x1b19, 0x684b,
-       0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0040, 0x1b29, 0x00f0,
-       0x1b23, 0x20a9, 0x00fa, 0x00f0, 0x1b2b, 0x2079, 0x4f00, 0x2009,
-       0x0018, 0x72c8, 0xd284, 0x00c0, 0x1b39, 0x2061, 0x4f40, 0x0078,
-       0x1b3c, 0x2061, 0x4f80, 0xc1fd, 0x607f, 0x0000, 0x792a, 0x6067,
-       0x0001, 0x6083, 0x000f, 0x60a7, 0x0000, 0x60a8, 0x60b2, 0x60b6,
-       0x60d4, 0xd0b4, 0x0040, 0x1b58, 0xc0b4, 0x60d6, 0x0c7e, 0x60b8,
-       0xa065, 0x6008, 0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f,
-       0x60d4, 0xa084, 0x77ff, 0x60d6, 0x78ac, 0xc08d, 0x78ae, 0x83ff,
-       0x0040, 0x1b63, 0x007c, 0x681b, 0x0047, 0x2091, 0x8001, 0x007c,
-       0x73cc, 0x1078, 0x1aba, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a,
-       0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff,
-       0x00f0, 0x1b78, 0x8421, 0x00c0, 0x1b76, 0x8319, 0x00c0, 0x1b74,
-       0x69ee, 0x6a4a, 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1b8c,
-       0x2069, 0x4f40, 0x0078, 0x1b8e, 0x2069, 0x4f80, 0x71c4, 0x71c6,
-       0x6916, 0x81ff, 0x00c0, 0x1b96, 0x68a7, 0x0001, 0x78ac, 0xc08c,
-       0x78ae, 0xd084, 0x00c0, 0x1b9e, 0x1078, 0x1f2d, 0x007c, 0x75d8,
-       0x74dc, 0x75da, 0x74de, 0x0078, 0x1ba7, 0xa02e, 0x2520, 0x71c4,
-       0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x4f00, 0x7dde,
-       0x7cda, 0x7bd6, 0x7ad2, 0x1078, 0x1e04, 0x0040, 0x1cd1, 0x20a9,
-       0x0005, 0x20a1, 0x4f14, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001,
-       0x2009, 0x0040, 0x1078, 0x2018, 0x0040, 0x1bca, 0x1078, 0x1e0d,
-       0x0078, 0x1cd1, 0x6004, 0xa08c, 0x00ff, 0xa18e, 0x0009, 0x00c0,
-       0x1bd5, 0x007e, 0x1078, 0x23bf, 0x007f, 0xa084, 0xff00, 0x8007,
-       0x8009, 0x0040, 0x1c61, 0x0c7e, 0x2c68, 0x1078, 0x1e04, 0x0040,
-       0x1c1b, 0x2c00, 0x689e, 0x8109, 0x00c0, 0x1bdc, 0x609f, 0x0000,
-       0x0c7f, 0x0c7e, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040,
-       0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda,
-       0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1c60, 0x2009,
-       0x0040, 0x1078, 0x2018, 0x00c0, 0x1c3e, 0x6004, 0xa084, 0x00ff,
-       0xa086, 0x0002, 0x00c0, 0x1c1b, 0x6004, 0xa084, 0x00ff, 0xa086,
-       0x000a, 0x00c0, 0x1c17, 0x017e, 0x1078, 0x23bb, 0x017f, 0x2d00,
-       0x6002, 0x0078, 0x1bea, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e90,
-       0x0c7f, 0x609f, 0x0000, 0x1078, 0x1cd5, 0x2009, 0x0018, 0x6008,
-       0xc0cd, 0x600a, 0x6004, 0x6086, 0x7810, 0x007e, 0x84ff, 0x00c0,
-       0x1c34, 0x85ff, 0x0040, 0x1c36, 0xc0c5, 0x7812, 0x1078, 0x1dbb,
-       0x007f, 0x7812, 0x1078, 0x1e0d, 0x0078, 0x1cd1, 0x0c7f, 0x0c7e,
-       0x609c, 0x1078, 0x1e90, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1cd5,
-       0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003, 0x7810, 0x007e,
-       0x84ff, 0x00c0, 0x1c56, 0x85ff, 0x0040, 0x1c58, 0xc0c5, 0x7812,
-       0x1078, 0x1dbb, 0x007f, 0x7812, 0x1078, 0x1e0d, 0x0078, 0x1cd1,
-       0x0c7f, 0x7814, 0xd0e4, 0x00c0, 0x1c8f, 0x6114, 0xd1fc, 0x0040,
-       0x1c6f, 0x1078, 0x1dae, 0x0040, 0x1c8f, 0x0078, 0x1c73, 0x1078,
-       0x1da1, 0x0040, 0x1c8f, 0x1078, 0x1cd5, 0x2009, 0x0018, 0x6087,
-       0x0103, 0x601b, 0x0021, 0x7810, 0x007e, 0x84ff, 0x00c0, 0x1c83,
-       0x85ff, 0x0040, 0x1c85, 0xc0c5, 0x7812, 0x1078, 0x1dbb, 0x007f,
-       0x7812, 0x1078, 0x1e0d, 0x2001, 0x4007, 0x0078, 0x15c3, 0x74c4,
-       0x73c8, 0x72cc, 0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009, 0x0012,
-       0xd0fc, 0x00c0, 0x1c9f, 0x2071, 0x4f40, 0x0078, 0x1ca2, 0x2071,
-       0x4f80, 0xc1fd, 0x792a, 0x7067, 0x0005, 0x71d4, 0xc1dc, 0x71d6,
-       0x736a, 0x726e, 0x7472, 0x7076, 0x707b, 0x0000, 0x2c00, 0x707e,
-       0xa02e, 0x2530, 0x611c, 0xa184, 0x0060, 0x0040, 0x1cb9, 0x1078,
-       0x46b6, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000,
-       0x60b3, 0x0000, 0x6714, 0x6023, 0x0000, 0x6024, 0xa096, 0x0001,
-       0x00c0, 0x1ccc, 0x8000, 0x6026, 0x1078, 0x266f, 0x2091, 0x8001,
-       0x007c, 0x70c3, 0x4005, 0x0078, 0x15c4, 0x20a9, 0x0005, 0x2099,
-       0x4f14, 0x2091, 0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210,
-       0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4,
-       0x70c7, 0x0000, 0x791e, 0x0078, 0x15c1, 0x71c4, 0x71c6, 0x2168,
-       0x0078, 0x1cf4, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210,
-       0x8d68, 0x8109, 0x00c0, 0x1cf6, 0xa285, 0x0000, 0x00c0, 0x1d04,
-       0x70c3, 0x4000, 0x0078, 0x1d06, 0x70c3, 0x4003, 0x70ca, 0x0078,
-       0x15c4, 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x15b9,
-       0x7966, 0x0078, 0x15c1, 0x7964, 0x71c6, 0x0078, 0x15c1, 0x7900,
-       0x71c6, 0x71c4, 0x7902, 0x0078, 0x15c1, 0x7900, 0x71c6, 0x0078,
-       0x15c1, 0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0040, 0x1d36,
-       0x810c, 0x0048, 0x1d32, 0x8210, 0x810c, 0x810c, 0x0048, 0x1d32,
-       0x8210, 0x810c, 0x81ff, 0x00c0, 0x15ba, 0x8210, 0x7a0e, 0xd28c,
-       0x0040, 0x1d62, 0x7910, 0xc1cd, 0x7912, 0x2009, 0x0021, 0x2019,
-       0x0003, 0xd284, 0x0040, 0x1d5c, 0x8108, 0x2019, 0x0041, 0x2011,
-       0x974e, 0x2312, 0x2019, 0x0042, 0x8210, 0x2312, 0x2019, 0x0043,
-       0x8210, 0x2312, 0x2019, 0x0046, 0x8210, 0x2312, 0x2019, 0x0047,
-       0x8210, 0x2312, 0x2019, 0x0006, 0x2011, 0x9753, 0x2112, 0x2011,
-       0x9773, 0x2312, 0x7904, 0x7806, 0x0078, 0x15c0, 0x7804, 0x70c6,
-       0x0078, 0x15c1, 0x71c4, 0xd1fc, 0x00c0, 0x1d72, 0x2011, 0x53c0,
-       0x0078, 0x1d74, 0x2011, 0x5440, 0x8107, 0xa084, 0x000f, 0x8003,
-       0x8003, 0x8003, 0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1d83, 0x2011,
-       0x0001, 0x0078, 0x1d85, 0x2011, 0x0000, 0x6b0c, 0x6800, 0x70da,
-       0x0078, 0x15be, 0x7814, 0xd0f4, 0x0040, 0x1d95, 0x2001, 0x4007,
-       0x70db, 0x0000, 0xa005, 0x0078, 0x1da0, 0xd0fc, 0x0040, 0x1d9f,
-       0x2001, 0x4007, 0x70db, 0x0001, 0xa005, 0x0078, 0x1da0, 0xa006,
-       0x007c, 0x7814, 0xd0f4, 0x0040, 0x1dac, 0x2001, 0x4007, 0x70db,
-       0x0000, 0xa005, 0x0078, 0x1dad, 0xa006, 0x007c, 0x7814, 0xd0fc,
-       0x0040, 0x1db9, 0x2001, 0x4007, 0x70db, 0x0001, 0xa005, 0x0078,
-       0x1dba, 0xa006, 0x007c, 0x7112, 0x721a, 0x731e, 0x7810, 0xd0c4,
-       0x0040, 0x1dc4, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c,
-       0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084, 0x20a2,
-       0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0040, 0x1de1,
-       0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078,
-       0x1de4, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006,
-       0xa211, 0x7d10, 0xd5c4, 0x0040, 0x1df1, 0x7b84, 0xa319, 0x7c80,
-       0xa421, 0x7008, 0xd0fc, 0x0040, 0x1df1, 0x7003, 0x0001, 0x7007,
-       0x0006, 0x711a, 0x721e, 0x7d10, 0xd5c4, 0x0040, 0x1e01, 0x7322,
-       0x7426, 0xa084, 0x01e0, 0x007c, 0x7848, 0xa065, 0x0040, 0x1e0c,
-       0x2c04, 0x784a, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x4f00,
-       0x7848, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1e18, 0x1078, 0x29b2,
-       0x784a, 0x0f7f, 0x007c, 0x2011, 0x9900, 0x7a4a, 0x7bc4, 0x8319,
-       0x0040, 0x1e28, 0xa280, 0x0032, 0x2012, 0x2010, 0x0078, 0x1e1f,
-       0x2013, 0x0000, 0x007c, 0x017e, 0x027e, 0xd7fc, 0x00c0, 0x1e34,
-       0x2011, 0x54c0, 0x0078, 0x1e36, 0x2011, 0x74c0, 0xa784, 0x0f00,
-       0x800b, 0xa784, 0x001f, 0x0040, 0x1e41, 0x8003, 0x8003, 0x8003,
-       0x8003, 0xa105, 0xa268, 0x027f, 0x017f, 0x007c, 0x1078, 0x1e2b,
-       0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef, 0xa80d,
-       0x690a, 0x0e7e, 0xd7fc, 0x00c0, 0x1e5b, 0x2009, 0x4f53, 0x2071,
-       0x4f40, 0x0078, 0x1e5f, 0x2009, 0x4f93, 0x2071, 0x4f80, 0x210c,
-       0x6804, 0xa005, 0x0040, 0x1e6f, 0xa116, 0x00c0, 0x1e6f, 0x2060,
-       0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x1e72, 0x2009,
-       0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1e87, 0x6000, 0x6806,
-       0x1078, 0x1ea2, 0x1078, 0x2064, 0x6810, 0x7908, 0x8109, 0x790a,
-       0x8001, 0x6812, 0x00c0, 0x1e72, 0x7910, 0xc1a5, 0x7912, 0x017f,
-       0x6902, 0x6906, 0x2d00, 0x2060, 0x1078, 0x2b13, 0x0e7f, 0x007c,
-       0xa065, 0x0040, 0x1ea1, 0x2008, 0x609c, 0xa005, 0x0040, 0x1e9e,
-       0x2062, 0x609f, 0x0000, 0xa065, 0x0078, 0x1e94, 0x7848, 0x794a,
-       0x2062, 0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c,
-       0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a,
-       0x682c, 0x6022, 0x007c, 0x0e7e, 0xd7fc, 0x00c0, 0x1ebd, 0x2071,
-       0x4f40, 0x2031, 0x4fc0, 0x0078, 0x1ec1, 0x2071, 0x4f80, 0x2031,
-       0x51c0, 0x7050, 0xa08c, 0x0200, 0x00c0, 0x1ecb, 0xa608, 0x2d0a,
-       0x8000, 0x7052, 0xa006, 0x0e7f, 0x007c, 0x0f7e, 0xd7fc, 0x00c0,
-       0x1ed5, 0x2079, 0x4f40, 0x0078, 0x1ed7, 0x2079, 0x4f80, 0x1078,
-       0x1e2b, 0x2091, 0x8000, 0x6804, 0x780a, 0xa065, 0x0040, 0x1f2b,
-       0x0078, 0x1ee9, 0x2c00, 0x780a, 0x2060, 0x6000, 0xa065, 0x0040,
-       0x1f2b, 0x6010, 0xa306, 0x00c0, 0x1ee2, 0x600c, 0xa206, 0x00c0,
-       0x1ee2, 0x2c28, 0x784c, 0xac06, 0x00c0, 0x1ef8, 0x0078, 0x1f28,
-       0x6804, 0xac06, 0x00c0, 0x1f06, 0x6000, 0x2060, 0x6806, 0xa005,
-       0x00c0, 0x1f06, 0x6803, 0x0000, 0x0078, 0x1f10, 0x6400, 0x7808,
-       0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1f10, 0x2c00, 0x6802,
-       0x2560, 0x0f7f, 0x1078, 0x1ea2, 0x0f7e, 0x601b, 0x0005, 0x6023,
-       0x0020, 0x0f7f, 0x1078, 0x2064, 0x0f7e, 0x7908, 0x8109, 0x790a,
-       0x6810, 0x8001, 0x6812, 0x00c0, 0x1f28, 0x7810, 0xc0a5, 0x7812,
-       0x2001, 0xffff, 0xa005, 0x0f7f, 0x007c, 0x077e, 0x2700, 0x2039,
-       0x0000, 0xd0fc, 0x0040, 0x1f35, 0xc7fd, 0x2041, 0x0021, 0x2049,
-       0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1e46, 0x8738,
-       0xa784, 0x001f, 0x00c0, 0x1f3d, 0xa7bc, 0xff00, 0x873f, 0x8738,
-       0x873f, 0xa784, 0x0f00, 0x00c0, 0x1f3d, 0x2091, 0x8001, 0x077f,
-       0x007c, 0x786c, 0x2009, 0x9774, 0x210c, 0xa10d, 0x0040, 0x1f5b,
-       0xa065, 0x0078, 0x23dc, 0x2061, 0x0000, 0x6018, 0xd084, 0x00c0,
-       0x1f7b, 0x7810, 0xd08c, 0x0040, 0x1f6c, 0xc08c, 0x7812, 0xc7fc,
-       0x2069, 0x4f40, 0x0078, 0x1f71, 0xc08d, 0x7812, 0x2069, 0x4f80,
-       0xc7fd, 0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091, 0x8001,
-       0xa005, 0x00c0, 0x1f7c, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1f82,
-       0x1078, 0x29b2, 0x0079, 0x1f84, 0x1f94, 0x1f97, 0x1f9d, 0x1fa1,
-       0x1f95, 0x1fa5, 0x1f95, 0x1f95, 0x1f95, 0x1fab, 0x1fdc, 0x1fe0,
-       0x1fe6, 0x1ffb, 0x1f95, 0x1f95, 0x007c, 0x1078, 0x29b2, 0x1078,
-       0x1f2d, 0x2001, 0x8001, 0x0078, 0x2007, 0x2001, 0x8003, 0x0078,
-       0x2007, 0x2001, 0x8004, 0x0078, 0x2007, 0x1078, 0x1f2d, 0x2001,
-       0x8006, 0x0078, 0x2007, 0x2091, 0x8000, 0x077e, 0xd7fc, 0x00c0,
-       0x1fb7, 0x2069, 0x4f40, 0x2039, 0x0009, 0x0078, 0x1fbb, 0x2069,
-       0x4f80, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000, 0x0040, 0x1fc5,
-       0x007f, 0x6f1e, 0x2091, 0x8001, 0x007c, 0x6874, 0x077f, 0xa0bc,
-       0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078,
-       0x1e46, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1fcf, 0x2091, 0x8001,
-       0x2001, 0x800a, 0x0078, 0x2007, 0x2001, 0x800c, 0x0078, 0x2007,
-       0x1078, 0x1f2d, 0x2001, 0x800d, 0x0078, 0x2007, 0x7814, 0xd0e4,
-       0x00c0, 0x1ff9, 0xd0ec, 0x0040, 0x1ff3, 0xd7fc, 0x0040, 0x1ff3,
-       0x78e4, 0x0078, 0x1ff4, 0x78e0, 0x70c6, 0x2001, 0x800e, 0x0078,
-       0x2007, 0x0078, 0x1f95, 0xd7fc, 0x0040, 0x2001, 0x78ec, 0x0078,
-       0x2002, 0x78e8, 0x70c6, 0x2001, 0x800f, 0x0078, 0x2007, 0x70c2,
-       0xd7fc, 0x00c0, 0x200f, 0x70db, 0x0000, 0x0078, 0x2011, 0x70db,
-       0x0001, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x007c,
-       0xac80, 0x0001, 0x81ff, 0x0040, 0x2043, 0x2099, 0x0030, 0x20a0,
-       0x700c, 0xa084, 0x03ff, 0x0040, 0x2025, 0x7018, 0x007e, 0x701c,
-       0x007e, 0x7020, 0x007e, 0x7024, 0x007e, 0x7112, 0x81ac, 0x721a,
-       0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001, 0x7008,
-       0x800b, 0x00c8, 0x2037, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0,
-       0x2043, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004, 0x007f,
-       0x7026, 0x007f, 0x7022, 0x007f, 0x701e, 0x007f, 0x701a, 0x007c,
-       0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x6803, 0xfd00,
-       0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
-       0x8109, 0x00c0, 0x2054, 0x007c, 0x6004, 0x6086, 0x2c08, 0x2063,
-       0x0000, 0x7868, 0xa005, 0x796a, 0x0040, 0x2071, 0x2c02, 0x0078,
-       0x2072, 0x796e, 0x007c, 0x0c7e, 0x2061, 0x4f00, 0x6887, 0x0103,
-       0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x2083,
-       0x2d02, 0x0078, 0x2084, 0x616e, 0x0c7f, 0x007c, 0x2091, 0x8000,
-       0x2c04, 0x786e, 0xa005, 0x00c0, 0x208e, 0x786a, 0x2091, 0x8001,
-       0x609c, 0xa005, 0x0040, 0x20a7, 0x0c7e, 0x2060, 0x2008, 0x609c,
-       0xa005, 0x0040, 0x20a3, 0x2062, 0x609f, 0x0000, 0xa065, 0x609c,
-       0xa005, 0x00c0, 0x209b, 0x7848, 0x794a, 0x2062, 0x0c7f, 0x7848,
-       0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x00c0, 0x20b1, 0x1078,
-       0x29b2, 0x784a, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086,
-       0x818e, 0x00c8, 0x20bc, 0xa200, 0x00f0, 0x20b7, 0x8086, 0x818e,
-       0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x20e2, 0xa11a,
-       0x00c8, 0x20e2, 0x8213, 0x818d, 0x0048, 0x20d5, 0xa11a, 0x00c8,
-       0x20d6, 0x00f0, 0x20ca, 0x0078, 0x20da, 0xa11a, 0x2308, 0x8210,
-       0x00f0, 0x20ca, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f,
-       0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x20de,
-       0x7d74, 0x70d0, 0xa506, 0x0040, 0x21ce, 0x7810, 0x2050, 0x7800,
-       0xd08c, 0x0040, 0x210a, 0xdaec, 0x0040, 0x210a, 0x0e7e, 0x2091,
-       0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x2107, 0x7008,
-       0x0e7f, 0xa086, 0x0008, 0x0040, 0x210a, 0x0078, 0x21ce, 0x0e7f,
-       0x0078, 0x21ce, 0x1078, 0x1e04, 0x0040, 0x21ce, 0xa046, 0x7970,
-       0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x2119, 0x0078,
-       0x2120, 0x72d0, 0xa206, 0x0040, 0x2120, 0x8840, 0x2009, 0x0080,
-       0x0c7e, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, 0x0020,
-       0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0040, 0x2132,
-       0x1078, 0x1e04, 0x7008, 0xd0fc, 0x0040, 0x2132, 0x7007, 0x0002,
-       0x2091, 0x8001, 0xa08c, 0x01e0, 0x00c0, 0x2169, 0x53a5, 0x8cff,
-       0x00c0, 0x2147, 0x88ff, 0x0040, 0x21b8, 0x0078, 0x2151, 0x2c00,
-       0x788e, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5, 0x0078,
-       0x21b8, 0xa046, 0x7218, 0x731c, 0xdac4, 0x0040, 0x2159, 0x7420,
-       0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab,
-       0x0000, 0x721a, 0x731e, 0xdac4, 0x0040, 0x2169, 0x7422, 0x7526,
-       0xa006, 0x7007, 0x0004, 0x0040, 0x21b8, 0x8cff, 0x0040, 0x2172,
-       0x1078, 0x1e0d, 0x0c7f, 0x1078, 0x1e0d, 0xa046, 0x7888, 0x8000,
-       0x788a, 0xa086, 0x0002, 0x0040, 0x2198, 0x7a7c, 0x7b78, 0xdac4,
-       0x0040, 0x2184, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004, 0x8004,
-       0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x721a,
-       0x731e, 0xdac4, 0x0040, 0x21ce, 0x7422, 0x7526, 0x0078, 0x21ce,
-       0x6014, 0xd0fc, 0x00c0, 0x21a0, 0x2069, 0x4f40, 0x0078, 0x21a2,
-       0x2069, 0x4f80, 0x2091, 0x8000, 0x681f, 0x0002, 0x88ff, 0x0040,
-       0x21ae, 0xa046, 0x788c, 0x2060, 0x0078, 0x2198, 0x788b, 0x0000,
-       0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0078, 0x21ce,
-       0x0c7f, 0x788b, 0x0000, 0x1078, 0x238d, 0x6004, 0xa084, 0x000f,
-       0x1078, 0x21cf, 0x88ff, 0x0040, 0x21cc, 0x788c, 0x2060, 0x6004,
-       0xa084, 0x000f, 0x1078, 0x21cf, 0x0078, 0x20e8, 0x007c, 0x0079,
-       0x21d1, 0x21e1, 0x21ff, 0x221d, 0x21e1, 0x222e, 0x21f2, 0x21e1,
-       0x21e1, 0x21e1, 0x21fd, 0x221b, 0x21e1, 0x21e1, 0x21e1, 0x21e1,
-       0x21e1, 0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705,
-       0x600a, 0x1078, 0x2271, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078,
-       0x2377, 0x007c, 0x78bc, 0xd0c4, 0x0040, 0x21f8, 0x0078, 0x21e1,
-       0x601c, 0xc0bd, 0x601e, 0x0078, 0x2205, 0x1078, 0x23bf, 0x78bc,
-       0xd0c4, 0x0040, 0x2205, 0x0078, 0x21e1, 0x78bf, 0x0000, 0x6004,
-       0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0040, 0x2218, 0x1078,
-       0x2271, 0x0040, 0x2218, 0x78bc, 0xc0c5, 0x78be, 0x0078, 0x221a,
-       0x0078, 0x2290, 0x007c, 0x1078, 0x23bb, 0x78bc, 0xa08c, 0x0e00,
-       0x00c0, 0x2225, 0xd0c4, 0x00c0, 0x2227, 0x0078, 0x21e1, 0x1078,
-       0x2271, 0x00c0, 0x222d, 0x0078, 0x2290, 0x007c, 0x78bc, 0xd0c4,
-       0x0040, 0x2234, 0x0078, 0x21e1, 0x78bf, 0x0000, 0x6714, 0x2011,
-       0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, 0x2254,
-       0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040, 0x2254,
-       0xa7bc, 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002,
-       0x0040, 0x2254, 0x0078, 0x226e, 0x1078, 0x1e2b, 0x2d00, 0x2091,
-       0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde,
-       0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x00f0, 0x2257, 0x8211,
-       0x0040, 0x226e, 0x20a9, 0x0100, 0x0078, 0x2257, 0x1078, 0x1e0d,
-       0x007c, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6, 0x00c0,
-       0x227c, 0x78ba, 0x0078, 0x2284, 0x689e, 0x2d00, 0x6002, 0x78b8,
-       0xad06, 0x00c0, 0x2284, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x00c0,
-       0x228f, 0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006, 0x007c,
-       0x0e7e, 0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2, 0x601c,
-       0x60a2, 0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060, 0x0040,
-       0x22a3, 0x1078, 0x46b6, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714,
-       0x2071, 0x4f80, 0xd7fc, 0x00c0, 0x22af, 0x2071, 0x4f40, 0xa784,
-       0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x22ba, 0x8003, 0x8003,
-       0x8003, 0x8003, 0xa105, 0x71c4, 0xa168, 0x2700, 0x8007, 0xa084,
-       0x000f, 0x8003, 0x8003, 0x8003, 0x71c8, 0xa100, 0x60c2, 0x2091,
-       0x8000, 0x7814, 0xd0c4, 0x0040, 0x22df, 0xd0ec, 0x0040, 0x22db,
-       0xd7fc, 0x00c0, 0x22d8, 0xd0f4, 0x00c0, 0x22e6, 0x0078, 0x22df,
-       0xd0fc, 0x00c0, 0x22e6, 0x7810, 0xd0f4, 0x00c0, 0x22e6, 0x6e08,
-       0xd684, 0x0040, 0x2310, 0xd9fc, 0x00c0, 0x2310, 0x2091, 0x8001,
-       0x1078, 0x1ea2, 0x2091, 0x8000, 0x1078, 0x2064, 0x2091, 0x8001,
-       0x7814, 0xd0e4, 0x00c0, 0x2375, 0x7814, 0xd0c4, 0x0040, 0x2375,
-       0xd0ec, 0x0040, 0x2308, 0xd7fc, 0x00c0, 0x2303, 0xd0f4, 0x00c0,
-       0x230c, 0x0078, 0x2375, 0xd0fc, 0x00c0, 0x230c, 0x0078, 0x2375,
-       0x7810, 0xd0f4, 0x0040, 0x2375, 0x601b, 0x0021, 0x0078, 0x2375,
-       0x6024, 0xa096, 0x0001, 0x00c0, 0x2317, 0x8000, 0x6026, 0x6a10,
-       0x6814, 0xa202, 0x0048, 0x232a, 0x0040, 0x232a, 0x2091, 0x8001,
-       0x2039, 0x0200, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078, 0x2377,
-       0x0078, 0x2375, 0x2c08, 0xd9fc, 0x0040, 0x2352, 0x6800, 0xa065,
-       0x0040, 0x2352, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0040, 0x2348,
-       0x704c, 0xa206, 0x00c0, 0x2348, 0x6b04, 0x2160, 0x2304, 0x6002,
-       0xa005, 0x00c0, 0x2344, 0x6902, 0x2260, 0x6102, 0x0078, 0x235e,
-       0x2d00, 0x2060, 0x1078, 0x2b13, 0x6e08, 0x2160, 0x6202, 0x6906,
-       0x0078, 0x235e, 0x6800, 0x6902, 0xa065, 0x0040, 0x235a, 0x6102,
-       0x0078, 0x235b, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160, 0xd9fc,
-       0x0040, 0x2365, 0xa6b4, 0xfffc, 0x6e0a, 0x6810, 0x7d08, 0x8528,
-       0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0040, 0x2375,
-       0xa6b6, 0x0040, 0x6e0a, 0x1078, 0x1eb3, 0x0e7f, 0x007c, 0x6008,
-       0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x2064, 0x2091, 0x8001,
-       0x78b8, 0xa065, 0x0040, 0x238a, 0x609c, 0x78ba, 0x609f, 0x0000,
-       0x0078, 0x2377, 0x78b6, 0x78ba, 0x007c, 0x7970, 0x7874, 0x2818,
-       0xd384, 0x0040, 0x2397, 0x8000, 0xa112, 0x0048, 0x239c, 0x8000,
-       0xa112, 0x00c8, 0x23ac, 0xc384, 0x7a7c, 0x721a, 0x7a78, 0x721e,
-       0xdac4, 0x0040, 0x23a7, 0x7a84, 0x7222, 0x7a80, 0x7226, 0xa006,
-       0xd384, 0x0040, 0x23ac, 0x8000, 0x7876, 0x70d2, 0x781c, 0xa005,
-       0x0040, 0x23ba, 0x8001, 0x781e, 0x00c0, 0x23ba, 0x0068, 0x23ba,
-       0x2091, 0x4080, 0x007c, 0x2039, 0x23d3, 0x0078, 0x23c1, 0x2039,
-       0x23d9, 0x2704, 0xa005, 0x0040, 0x23d2, 0xac00, 0x2068, 0x6908,
-       0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e, 0x8738,
-       0x0078, 0x23c1, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b,
-       0x0000, 0x0015, 0x001b, 0x0000, 0x2041, 0x0000, 0x780c, 0x0079,
-       0x23e1, 0x25b3, 0x2586, 0x23e5, 0x245e, 0x2039, 0x9774, 0x2734,
-       0x7d10, 0x0078, 0x2405, 0x6084, 0xa086, 0x0103, 0x00c0, 0x2447,
-       0x6114, 0x6018, 0xa105, 0x0040, 0x23fa, 0x86ff, 0x00c0, 0x2416,
-       0x0078, 0x2447, 0x8603, 0xa080, 0x9755, 0x620c, 0x2202, 0x8000,
-       0x6210, 0x2202, 0x1078, 0x2086, 0x8630, 0xa68e, 0x000f, 0x0040,
-       0x24d2, 0x786c, 0xa065, 0x00c0, 0x23eb, 0x7808, 0xa602, 0x00c8,
-       0x2416, 0xd5ac, 0x00c0, 0x2416, 0x263a, 0x007c, 0xa682, 0x0003,
-       0x00c8, 0x24d2, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084,
-       0x00c0, 0x2442, 0x2011, 0x9755, 0x2204, 0x70c6, 0x8210, 0x2204,
-       0x70ca, 0xd684, 0x00c0, 0x2432, 0x8210, 0x2204, 0x70da, 0x8210,
-       0x2204, 0x70de, 0xa685, 0x8020, 0x70c2, 0x681b, 0x0001, 0x2091,
-       0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, 0x203b,
-       0x0000, 0x007c, 0x7810, 0xc0ad, 0x7812, 0x0078, 0x24d2, 0x263a,
-       0x1078, 0x25bd, 0x00c0, 0x25e0, 0x786c, 0xa065, 0x00c0, 0x23eb,
-       0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0040, 0x2459,
-       0xc0ad, 0x7812, 0x2091, 0x8001, 0x0078, 0x25e0, 0x2039, 0x9774,
-       0x2734, 0x7d10, 0x0078, 0x247a, 0x6084, 0xa086, 0x0103, 0x00c0,
-       0x24bb, 0x6114, 0x6018, 0xa105, 0x0040, 0x2473, 0x86ff, 0x00c0,
-       0x248b, 0x0078, 0x24bb, 0xa680, 0x9755, 0x620c, 0x2202, 0x1078,
-       0x2086, 0x8630, 0xa68e, 0x001e, 0x0040, 0x24d2, 0x786c, 0xa065,
-       0x00c0, 0x2464, 0x7808, 0xa602, 0x00c8, 0x248b, 0xd5ac, 0x00c0,
-       0x248b, 0x263a, 0x007c, 0xa682, 0x0006, 0x00c8, 0x24d2, 0x2091,
-       0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x24b6, 0x2011,
-       0x9755, 0x2009, 0x974e, 0x26a8, 0x211c, 0x2204, 0x201a, 0x8108,
-       0x8210, 0x00f0, 0x249c, 0xa685, 0x8030, 0x70c2, 0x681b, 0x0001,
-       0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001,
-       0xa006, 0x2009, 0x9775, 0x200a, 0x203a, 0x007c, 0x7810, 0xc0ad,
-       0x7812, 0x0078, 0x24d2, 0x263a, 0x1078, 0x25bd, 0x00c0, 0x25e0,
-       0x786c, 0xa065, 0x00c0, 0x2464, 0x2091, 0x8000, 0x7810, 0xa084,
-       0xffcf, 0x86ff, 0x0040, 0x24cd, 0xc0ad, 0x7812, 0x2091, 0x8001,
-       0x0078, 0x25e0, 0x2091, 0x8000, 0x7007, 0x0004, 0x7994, 0x70d4,
-       0xa102, 0x0048, 0x24e3, 0x0040, 0x24ed, 0x7b90, 0xa302, 0x00c0,
-       0x24ed, 0x0078, 0x24e6, 0x8002, 0x00c0, 0x24ed, 0x263a, 0x7810,
-       0xc0ad, 0x7812, 0x2091, 0x8001, 0x007c, 0xa184, 0xff00, 0x0040,
-       0x24fa, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
-       0x0078, 0x24fd, 0x8107, 0x8004, 0x8004, 0x7a9c, 0xa210, 0x721a,
-       0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4, 0x0040, 0x250d, 0x7aa4,
-       0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1, 0x0030, 0x7003,
-       0x0000, 0x2009, 0x9754, 0x260a, 0x8109, 0x2198, 0x2104, 0xd084,
-       0x0040, 0x251b, 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6, 0x8603,
-       0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8,
-       0x252a, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0040, 0x2539,
-       0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078,
-       0x253c, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006,
-       0xa211, 0xd4c4, 0x0040, 0x2548, 0x7b84, 0xa319, 0x7c80, 0xa421,
-       0x7008, 0xd0fc, 0x0040, 0x2548, 0xa084, 0x01e0, 0x0040, 0x256d,
-       0x7d10, 0x2031, 0x9754, 0x2634, 0x78a8, 0x8000, 0x78aa, 0xd08c,
-       0x00c0, 0x2562, 0x7007, 0x0006, 0x7004, 0xd094, 0x00c0, 0x255c,
-       0x0078, 0x24d4, 0x2069, 0x4f47, 0x206b, 0x0003, 0x78ac, 0xa085,
-       0x0300, 0x78ae, 0xa006, 0x0078, 0x2576, 0x2030, 0x75d6, 0x2091,
-       0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091, 0x8001,
-       0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a, 0x721e,
-       0xd5c4, 0x0040, 0x2585, 0x7322, 0x7426, 0x007c, 0x6084, 0xa086,
-       0x0103, 0x00c0, 0x25a9, 0x6114, 0x6018, 0xa105, 0x00c0, 0x25a9,
-       0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x25a9, 0x600c, 0x70c6,
-       0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, 0x4080,
-       0x1078, 0x2086, 0x0068, 0x25a8, 0x786c, 0xa065, 0x00c0, 0x2586,
-       0x007c, 0x1078, 0x25bd, 0x00c0, 0x25e0, 0x786c, 0xa065, 0x00c0,
-       0x2586, 0x0078, 0x25e0, 0x1078, 0x25bd, 0x00c0, 0x25e0, 0x786c,
-       0xa065, 0x00c0, 0x25b3, 0x0078, 0x25e0, 0x6084, 0xa086, 0x0103,
-       0x00c0, 0x25d1, 0x6018, 0xc0fc, 0x601a, 0xa086, 0x0004, 0x00c0,
-       0x25d1, 0x7804, 0xd0a4, 0x0040, 0x25d1, 0x1078, 0x2086, 0xa006,
-       0x007c, 0x1078, 0x25e6, 0x00c0, 0x25d8, 0xa085, 0x0001, 0x007c,
-       0x1078, 0x25f5, 0x00c0, 0x25de, 0x2041, 0x0001, 0x7d10, 0x007c,
-       0x88ff, 0x0040, 0x25e5, 0x2091, 0x4080, 0x007c, 0x7b90, 0x7994,
-       0x70d4, 0xa102, 0x00c0, 0x25ef, 0xa385, 0x0000, 0x007c, 0x0048,
-       0x25f3, 0xa302, 0x007c, 0x8002, 0x007c, 0x7810, 0xd0ec, 0x0040,
-       0x260d, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005,
-       0x00c0, 0x260a, 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x260d,
-       0x0078, 0x265e, 0x0e7f, 0x0078, 0x265e, 0xa184, 0xff00, 0x0040,
-       0x261a, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
-       0x0078, 0x261d, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4,
-       0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018,
-       0x6028, 0xa005, 0x0040, 0x262e, 0x2009, 0x0040, 0x1078, 0x1dbb,
-       0x0040, 0x2650, 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x00c0, 0x265e,
-       0x6014, 0xd0fc, 0x00c0, 0x2640, 0x2069, 0x4f40, 0x0078, 0x2642,
-       0x2069, 0x4f80, 0x2091, 0x8000, 0x681f, 0x0003, 0x78ab, 0x0000,
-       0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0078, 0x265e,
-       0x78ab, 0x0000, 0x1078, 0x2086, 0x7990, 0x7894, 0x8000, 0xa10a,
-       0x00c8, 0x265b, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071, 0x0010,
-       0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x266a, 0x2009, 0x4f59,
-       0x0078, 0x266c, 0x2009, 0x4f99, 0x2091, 0x8000, 0x200a, 0x0f7e,
-       0xd7fc, 0x00c0, 0x2683, 0x2009, 0x4f40, 0x2001, 0x4f04, 0x2004,
-       0xd0ec, 0x0040, 0x267f, 0x2079, 0x0100, 0x0078, 0x2687, 0x2079,
-       0x0200, 0x0078, 0x2687, 0x2009, 0x4f80, 0x2079, 0x0100, 0x2104,
-       0xa086, 0x0000, 0x00c0, 0x26a0, 0xd7fc, 0x00c0, 0x2693, 0x2009,
-       0x4f45, 0x0078, 0x2695, 0x2009, 0x4f85, 0x2104, 0xa005, 0x00c0,
-       0x26a0, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x26a0, 0x781b, 0x0045,
-       0x0f7f, 0x007c, 0x2009, 0x0002, 0x2069, 0x4f00, 0x6810, 0xd0ec,
-       0x00c0, 0x270f, 0x2071, 0x4f80, 0x2079, 0x0100, 0x2021, 0x51bf,
-       0x784b, 0x000f, 0x2019, 0x44a7, 0xd184, 0x0040, 0x26c3, 0x6810,
-       0xd0ec, 0x0040, 0x26bf, 0x20a1, 0x012b, 0x0078, 0x26c5, 0x20a1,
-       0x022b, 0x0078, 0x26c5, 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040,
-       0x26d2, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318,
-       0x0078, 0x26c5, 0x789b, 0x0020, 0x20a9, 0x0010, 0x6814, 0xd0e4,
-       0x0040, 0x26e2, 0x78af, 0x0000, 0x78af, 0x9020, 0x00f0, 0x26da,
-       0x0078, 0x26e8, 0x78af, 0x0000, 0x78af, 0x8020, 0x00f0, 0x26e2,
-       0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, 0x0000, 0x0040, 0x26f1,
-       0xc1bd, 0x1078, 0x28e2, 0x017f, 0x7020, 0xa084, 0x000f, 0x007e,
-       0x6814, 0xd0e4, 0x007f, 0x00c0, 0x2701, 0xa085, 0x6340, 0x0078,
-       0x2703, 0xa085, 0x62c0, 0x7806, 0x780f, 0x9200, 0x7843, 0x00d8,
-       0x7853, 0x0080, 0x780b, 0x0008, 0x7456, 0x7053, 0x0000, 0x8109,
-       0x0040, 0x2722, 0x2071, 0x4f40, 0x6810, 0xd0ec, 0x0040, 0x271c,
-       0x2079, 0x0100, 0x0078, 0x271e, 0x2079, 0x0200, 0x2021, 0x4fbf,
-       0x0078, 0x26b0, 0x007c, 0x017e, 0xd1bc, 0x00c0, 0x2737, 0x007e,
-       0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2733, 0x2011,
-       0x0101, 0x0078, 0x2739, 0x2011, 0x0201, 0x0078, 0x2739, 0x2011,
-       0x0101, 0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012,
-       0x017f, 0x1078, 0x28e2, 0x007c, 0xd3fc, 0x00c0, 0x2757, 0x007e,
-       0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2753, 0x2011,
-       0x0101, 0x0078, 0x2759, 0x2011, 0x0201, 0x0078, 0x2759, 0x2011,
-       0x0101, 0x20a9, 0x0009, 0x810b, 0x00f0, 0x275b, 0xa18c, 0x0e00,
-       0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2019, 0x0002,
-       0x2001, 0x4f04, 0x2004, 0xd0ec, 0x0040, 0x2773, 0x8319, 0x2009,
-       0x0101, 0x0078, 0x2775, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213,
-       0x00f0, 0x2777, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205,
-       0x200a, 0x8319, 0x0040, 0x2788, 0x2009, 0x0201, 0x0078, 0x2775,
-       0x007c, 0xd3fc, 0x00c0, 0x279c, 0x007e, 0x2001, 0x4f04, 0x2004,
-       0xd0ec, 0x007f, 0x0040, 0x2798, 0x2011, 0x0101, 0x0078, 0x279e,
-       0x2011, 0x0201, 0x0078, 0x279e, 0x2011, 0x0101, 0x20a9, 0x000c,
-       0x810b, 0x00f0, 0x27a0, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff,
-       0xa105, 0x2012, 0x007c, 0xd3fc, 0x00c0, 0x27be, 0x007e, 0x2001,
-       0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x27ba, 0x2011, 0x0102,
-       0x0078, 0x27c0, 0x2011, 0x0202, 0x0078, 0x27c0, 0x2011, 0x0102,
-       0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x0c7e, 0xd1bc,
-       0x00c0, 0x27da, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f,
-       0x0040, 0x27d6, 0x2061, 0x0100, 0x0078, 0x27dc, 0x2061, 0x0200,
-       0x0078, 0x27dc, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080,
-       0x0020, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc,
-       0x00c0, 0x27fa, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f,
-       0x0040, 0x27f6, 0x2061, 0x0100, 0x0078, 0x27fc, 0x2061, 0x0200,
-       0x0078, 0x27fc, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080,
-       0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c,
-       0x0c7e, 0xd1bc, 0x00c0, 0x281c, 0x007e, 0x2001, 0x4f04, 0x2004,
-       0xd0ec, 0x007f, 0x0040, 0x2818, 0x2061, 0x0100, 0x0078, 0x281e,
-       0x2061, 0x0200, 0x0078, 0x281e, 0x2061, 0x0100, 0xc1bc, 0x8103,
-       0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae,
-       0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x283e, 0x007e, 0x2001,
-       0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x283a, 0x2061, 0x0100,
-       0x0078, 0x2840, 0x2061, 0x0200, 0x0078, 0x2840, 0x2061, 0x0100,
-       0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0xa28c,
-       0x0020, 0x0040, 0x284e, 0xc2ac, 0xa39d, 0x4000, 0xc3fc, 0xd3b4,
-       0x00c0, 0x2853, 0xc3fd, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018,
-       0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005,
-       0x0040, 0x28c0, 0xd1fc, 0x0040, 0x2869, 0x2061, 0x96d0, 0x0078,
-       0x286b, 0x2061, 0x95c0, 0x1078, 0x28c8, 0x0040, 0x28a2, 0x20a9,
-       0x0101, 0xd1fc, 0x0040, 0x2878, 0x2061, 0x95d0, 0x0078, 0x287a,
-       0x2061, 0x94c0, 0x0c7e, 0x1078, 0x28c8, 0x0040, 0x2885, 0x0c7f,
-       0x8c60, 0x00f0, 0x287a, 0x0078, 0x28c0, 0x007f, 0xd1fc, 0x0040,
-       0x288f, 0xa082, 0x95d0, 0x2071, 0x4f80, 0x0078, 0x2893, 0xa082,
-       0x94c0, 0x2071, 0x4f40, 0x707a, 0x7176, 0x2138, 0x2001, 0x0004,
-       0x7066, 0x7083, 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x1078, 0x2663,
-       0x0078, 0x28bc, 0xd1fc, 0x00c0, 0x28a9, 0x2071, 0x4f40, 0x0078,
-       0x28ab, 0x2071, 0x4f80, 0x6020, 0xc0dd, 0x6022, 0x7176, 0x2138,
-       0x2c00, 0x707e, 0x2001, 0x0006, 0x7066, 0x7083, 0x000f, 0x71d4,
-       0xc1dc, 0x71d6, 0x1078, 0x2663, 0x2001, 0x0000, 0x0078, 0x28c2,
-       0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c,
-       0x2c04, 0xa005, 0x0040, 0x28df, 0x2060, 0x6010, 0xa306, 0x00c0,
-       0x28dc, 0x600c, 0xa206, 0x00c0, 0x28dc, 0x6014, 0xa106, 0x00c0,
-       0x28dc, 0xa006, 0x0078, 0x28e1, 0x6000, 0x0078, 0x28c9, 0xa085,
-       0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0xd1bc, 0x00c0, 0x28fa,
-       0x2079, 0x4f40, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f,
-       0x0040, 0x28f6, 0x2071, 0x0100, 0x0078, 0x28fe, 0x2071, 0x0200,
-       0x0078, 0x28fe, 0x2079, 0x4f80, 0x2071, 0x0100, 0x7920, 0xa18c,
-       0x000f, 0x70ec, 0xd0c4, 0x00c0, 0x2908, 0x017f, 0x0078, 0x2923,
-       0x810b, 0x810b, 0x810b, 0x810b, 0x007f, 0xd0bc, 0x00c0, 0x2920,
-       0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x291c,
-       0xa18d, 0x0f00, 0x0078, 0x2922, 0xa18d, 0x0f00, 0x0078, 0x2922,
-       0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, 0x007c, 0x0e7e, 0x2001,
-       0x4f01, 0x2004, 0xd0ac, 0x00c0, 0x29a3, 0x68e4, 0xd0ac, 0x0040,
-       0x29a3, 0xa084, 0x0006, 0x00c0, 0x29a3, 0x6014, 0xd0fc, 0x00c0,
-       0x293d, 0x2071, 0x53c0, 0x0078, 0x293f, 0x2071, 0x5440, 0x8007,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, 0xa084,
-       0x000a, 0x00c0, 0x29a3, 0x7108, 0xa194, 0xff00, 0x0040, 0x29a3,
-       0xa18c, 0x00ff, 0x2001, 0x000a, 0xa106, 0x0040, 0x2972, 0x2001,
-       0x000c, 0xa106, 0x0040, 0x2976, 0x2001, 0x0012, 0xa106, 0x0040,
-       0x297a, 0x2001, 0x0014, 0xa106, 0x0040, 0x297e, 0x2001, 0x0019,
-       0xa106, 0x0040, 0x2982, 0x2001, 0x0032, 0xa106, 0x0040, 0x2986,
-       0x0078, 0x298a, 0x2009, 0x000c, 0x0078, 0x298c, 0x2009, 0x0012,
-       0x0078, 0x298c, 0x2009, 0x0014, 0x0078, 0x298c, 0x2009, 0x0019,
-       0x0078, 0x298c, 0x2009, 0x0020, 0x0078, 0x298c, 0x2009, 0x003f,
-       0x0078, 0x298c, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x2071,
-       0x4f00, 0x7004, 0xd0bc, 0x0040, 0x29a3, 0x6014, 0xd0fc, 0x00c0,
-       0x299e, 0x70ea, 0x2071, 0x4f40, 0x0078, 0x29a1, 0x70ee, 0x2071,
-       0x4f80, 0x701f, 0x000d, 0x0e7f, 0x007c, 0x2001, 0x4f05, 0x2004,
-       0xd0e4, 0x00c0, 0x29b1, 0x7804, 0xa084, 0xff1f, 0xa085, 0x6340,
-       0x7806, 0x007c, 0x0068, 0x29b2, 0x2091, 0x8000, 0x2071, 0x0000,
-       0x007e, 0x7018, 0xd084, 0x00c0, 0x29b9, 0x007f, 0x2071, 0x0010,
-       0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x080f, 0x70df,
-       0x000b, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078,
-       0x29cf, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708e, 0x7592,
-       0x7496, 0x769a, 0x779e, 0xa594, 0x003f, 0xd4f4, 0x0040, 0x29e6,
-       0xa784, 0x007d, 0x00c0, 0x441d, 0x1078, 0x29b2, 0xa49c, 0x000f,
-       0xa382, 0x0004, 0x0050, 0x29f1, 0xa3a6, 0x0007, 0x00c0, 0x29b2,
-       0x2418, 0x8507, 0xa084, 0x000f, 0x0079, 0x29f6, 0x3071, 0x3162,
-       0x318d, 0x33ff, 0x37e8, 0x3862, 0x3917, 0x39a8, 0x3a96, 0x3b85,
-       0x2a09, 0x2a06, 0x2e42, 0x2f65, 0x37b9, 0x2a06, 0x1078, 0x29b2,
-       0x007c, 0xa006, 0x0078, 0x2a13, 0x7808, 0xc08d, 0x780a, 0xa006,
-       0x7002, 0x704e, 0x7046, 0x70d2, 0x7060, 0xa005, 0x00c0, 0x2b79,
-       0x7064, 0xa084, 0x0007, 0x0079, 0x2a1d, 0x2a25, 0x2a98, 0x2aa1,
-       0x2aac, 0x2ab7, 0x2b5f, 0x2ac2, 0x2a98, 0x7830, 0xd0bc, 0x00c0,
-       0x2a08, 0x71d4, 0xd1bc, 0x00c0, 0x2a08, 0xd1b4, 0x00c0, 0x2a75,
-       0x70a4, 0xa086, 0x0001, 0x0040, 0x2a08, 0x70b4, 0xa06d, 0x6800,
-       0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808, 0xa045,
-       0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040, 0x2a4b,
-       0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0010,
-       0x0078, 0x2cd3, 0x7060, 0xa005, 0x00c0, 0x2a08, 0x0c7e, 0x0d7e,
-       0x70b4, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c,
-       0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886,
-       0x0001, 0x0040, 0x2a6e, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d,
-       0x6e1c, 0x2001, 0x0020, 0x0078, 0x2cd3, 0x1078, 0x43b0, 0x00c0,
-       0x2a08, 0x781b, 0x005b, 0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894,
-       0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a,
-       0x68bc, 0x7042, 0xc1b4, 0x71d6, 0x70b8, 0xa065, 0x68c0, 0x705a,
-       0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c,
-       0x1078, 0x43b0, 0x00c0, 0x2aa0, 0x781b, 0x0047, 0x7003, 0x0004,
-       0x007c, 0x1078, 0x43b0, 0x00c0, 0x2aab, 0x2011, 0x000c, 0x1078,
-       0x2ad2, 0x7003, 0x0004, 0x007c, 0x1078, 0x43b0, 0x00c0, 0x2ab6,
-       0x2011, 0x0006, 0x1078, 0x2ad2, 0x7003, 0x0004, 0x007c, 0x1078,
-       0x43b0, 0x00c0, 0x2ac1, 0x2011, 0x000d, 0x1078, 0x2ad2, 0x7003,
-       0x0004, 0x007c, 0x1078, 0x43b0, 0x00c0, 0x2ad1, 0x2011, 0x0006,
-       0x1078, 0x2ad2, 0x707c, 0x707f, 0x0000, 0x2068, 0x704e, 0x7003,
-       0x0001, 0x007c, 0x7174, 0xc1fc, 0x8107, 0x7882, 0x789b, 0x0010,
-       0xa286, 0x000c, 0x00c0, 0x2ae1, 0x7aaa, 0x2001, 0x0001, 0x0078,
-       0x2af6, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, 0x000d,
-       0x0040, 0x2aef, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2af6, 0x78ab,
-       0x0020, 0x7178, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b, 0x0060,
-       0x78aa, 0x785b, 0x0004, 0x781b, 0x0116, 0x1078, 0x43d3, 0x7083,
-       0x000f, 0x70d4, 0xd0b4, 0x0040, 0x2b12, 0xc0b4, 0x70d6, 0x0c7e,
-       0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
-       0x601a, 0x0c7f, 0x007c, 0x7014, 0xa005, 0x00c0, 0x2b21, 0x70d4,
-       0xd0b4, 0x0040, 0x2b22, 0x70b8, 0xac06, 0x00c0, 0x2b22, 0x1078,
-       0x2b01, 0x007c, 0x017e, 0x71a4, 0xa186, 0x0001, 0x0040, 0x2b54,
-       0x0d7e, 0x027e, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b4, 0x2068,
-       0x6800, 0xac06, 0x0040, 0x2b3b, 0x8211, 0x0040, 0x2b52, 0x1078,
-       0x2b56, 0x0078, 0x2b30, 0x0c7e, 0x2100, 0x2011, 0x0001, 0xa212,
-       0x70b4, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a,
-       0x8211, 0x0040, 0x2b4f, 0x1078, 0x2b56, 0x0078, 0x2b42, 0x70a7,
-       0x0001, 0x0c7f, 0x027f, 0x0d7f, 0x017f, 0x007c, 0xade8, 0x0005,
-       0x70ac, 0xad06, 0x00c0, 0x2b5e, 0x70a8, 0x2068, 0x007c, 0x1078,
-       0x43b0, 0x00c0, 0x2a08, 0x707c, 0x2068, 0x7774, 0x1078, 0x424e,
-       0x2c50, 0x1078, 0x4492, 0x789b, 0x0010, 0x6814, 0xa084, 0x001f,
-       0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004, 0x0078,
-       0x2cd9, 0x1078, 0x43b0, 0x00c0, 0x2a08, 0x789b, 0x0010, 0x7060,
-       0x2068, 0x6f14, 0x70d4, 0xd0b4, 0x0040, 0x2b93, 0xc0b4, 0x70d6,
-       0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
-       0x8001, 0x601a, 0x0c7f, 0x1078, 0x424e, 0x2c50, 0x1078, 0x4492,
-       0x6824, 0xa005, 0x0040, 0x2ba4, 0xa082, 0x0006, 0x0048, 0x2ba2,
-       0x0078, 0x2ba4, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, 0xc0bd,
-       0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0078,
-       0x2cd9, 0xc28d, 0x72d6, 0x72c0, 0xa200, 0xa015, 0x7154, 0x8108,
-       0xa12a, 0x0048, 0x2bbc, 0x71c0, 0x2164, 0x6504, 0x85ff, 0x00c0,
-       0x2bd3, 0x7156, 0x8421, 0x00c0, 0x2bb7, 0x70d4, 0xd08c, 0x0040,
-       0x2bcf, 0x70d0, 0xa005, 0x00c0, 0x2bcf, 0x70d3, 0x000a, 0x007c,
-       0x2200, 0x0078, 0x2bc1, 0x70d4, 0xc08c, 0x70d6, 0x70d3, 0x0000,
-       0x6034, 0xa005, 0x00c0, 0x2bd0, 0x6708, 0xa784, 0x073f, 0x0040,
-       0x2c02, 0xd7d4, 0x00c0, 0x2bd0, 0xa784, 0x0021, 0x00c0, 0x2bd0,
-       0xa784, 0x0002, 0x0040, 0x2bf3, 0xa784, 0x0004, 0x0040, 0x2bd0,
-       0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, 0x00c0, 0x2bd0, 0xa784,
-       0x0100, 0x0040, 0x2c02, 0x6018, 0xa005, 0x00c0, 0x2bd0, 0xa7bc,
-       0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e,
-       0x6318, 0x0040, 0x2c13, 0x601c, 0xa302, 0x0048, 0x2c16, 0x0040,
-       0x2c16, 0x0078, 0x2bd0, 0x83ff, 0x00c0, 0x2bd0, 0x2d58, 0x2c50,
-       0x7156, 0xd7bc, 0x00c0, 0x2c1f, 0x7028, 0x6022, 0x603a, 0xc7bc,
-       0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041, 0x0001,
-       0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0040, 0x2c33,
-       0xd684, 0x0040, 0x2c35, 0xa39c, 0xffbf, 0xd6a4, 0x0040, 0x2c3a,
-       0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2c85, 0xc7a5, 0x670a,
-       0x2c00, 0x68c6, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c59, 0x70d4,
-       0xd0b4, 0x00c0, 0x2c59, 0x7000, 0xa082, 0x0002, 0x00c8, 0x2c59,
-       0x7830, 0xd0bc, 0x00c0, 0x2c59, 0x789b, 0x0010, 0x7baa, 0x0078,
-       0x2cd1, 0x8739, 0x77a6, 0x2750, 0x77b0, 0xa7b0, 0x0005, 0x70ac,
-       0xa606, 0x00c0, 0x2c64, 0x76a8, 0x76b2, 0x2c3a, 0x8738, 0x2d3a,
-       0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc,
-       0x0040, 0x2c7c, 0x2091, 0x8000, 0x2091, 0x303d, 0x70d4, 0xa084,
-       0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000, 0x0040, 0x2c84,
-       0x8421, 0x2200, 0x00c0, 0x2bb6, 0x007c, 0xd1dc, 0x0040, 0x3e49,
-       0x2029, 0x0020, 0xd69c, 0x00c0, 0x2c92, 0x8528, 0xd68c, 0x00c0,
-       0x2c92, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, 0x00ff,
-       0x70cc, 0xa160, 0x2c64, 0x8cff, 0x0040, 0x2cb1, 0x6014, 0xa706,
-       0x00c0, 0x2c9a, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2c95, 0x2a60,
-       0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x00c0, 0x2bb6,
-       0x007c, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840, 0x6008,
-       0xc0d5, 0x600a, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c59, 0x70d4,
-       0xd0b4, 0x00c0, 0x2c59, 0x7000, 0xa082, 0x0002, 0x00c8, 0x2c59,
-       0x7830, 0xd0bc, 0x00c0, 0x2c59, 0x789b, 0x0010, 0x7baa, 0x7daa,
-       0x79aa, 0x2001, 0x0002, 0x007e, 0x6018, 0x8000, 0x601a, 0x0078,
-       0x2cda, 0x007e, 0x2960, 0x6104, 0x2a60, 0xa184, 0x0018, 0x0040,
-       0x2cf6, 0xa184, 0x0010, 0x0040, 0x2ce9, 0x1078, 0x405e, 0x00c0,
-       0x2d1b, 0xa184, 0x0008, 0x0040, 0x2cf6, 0x69a0, 0xa184, 0x0600,
-       0x00c0, 0x2cf6, 0x1078, 0x3f3e, 0x0078, 0x2d1b, 0x69a0, 0xa184,
-       0x1e00, 0x0040, 0x2d26, 0xa184, 0x0800, 0x0040, 0x2d0f, 0x0c7e,
-       0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010,
-       0x6106, 0x0c7f, 0x1078, 0x405e, 0x00c0, 0x2d1b, 0x69a0, 0xa184,
-       0x0200, 0x0040, 0x2d17, 0x1078, 0x3fa1, 0x0078, 0x2d1b, 0xa184,
-       0x0400, 0x00c0, 0x2cf2, 0x69a0, 0xa184, 0x1000, 0x0040, 0x2d26,
-       0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x27e6, 0x027f, 0xa68c,
-       0x00e0, 0xa684, 0x0060, 0x0040, 0x2d33, 0xa086, 0x0060, 0x00c0,
-       0x2d33, 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b, 0x0060,
-       0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0040, 0x2d4e,
-       0xc0fc, 0x7087, 0x0000, 0xa08a, 0x000d, 0x0050, 0x2d4c, 0xa08a,
-       0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, 0x78aa, 0x3518,
-       0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b,
-       0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0,
-       0xa286, 0x0020, 0x00c0, 0x2d86, 0x70d4, 0xc0b5, 0x70d6, 0x2c00,
-       0x70ba, 0x2d00, 0x70be, 0x6814, 0xc0fc, 0x8007, 0x7882, 0xa286,
-       0x0002, 0x0040, 0x2dbc, 0x70a4, 0x8000, 0x70a6, 0x74b4, 0xa498,
-       0x0005, 0x70ac, 0xa306, 0x00c0, 0x2d7e, 0x73a8, 0x73b6, 0xa286,
-       0x0010, 0x0040, 0x2a08, 0x0d7f, 0x0c7f, 0x007c, 0x7000, 0xa005,
-       0x00c0, 0x2d64, 0xa286, 0x0002, 0x00c0, 0x2dd6, 0x1078, 0x43b0,
-       0x00c0, 0x2d64, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091, 0x8000,
-       0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898,
-       0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a, 0x127e,
-       0x0d7e, 0x0c7e, 0x70d4, 0xa084, 0x2700, 0x2090, 0x0c7f, 0x0d7f,
-       0x127f, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003, 0x0002, 0x2d00,
-       0x704e, 0xad80, 0x0009, 0x7046, 0x7830, 0xd0bc, 0x0040, 0x2dc8,
-       0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090,
-       0x70a4, 0xa005, 0x00c0, 0x2dcd, 0x007c, 0x8421, 0x0040, 0x2dcc,
-       0x7250, 0x70c0, 0xa200, 0xa015, 0x0078, 0x2bb6, 0xa286, 0x0010,
-       0x00c0, 0x2e07, 0x1078, 0x43b0, 0x00c0, 0x2d64, 0x6814, 0xc0fc,
-       0x8007, 0x7882, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6,
-       0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, 0x70a4,
-       0x8000, 0x70a6, 0x74b4, 0xa490, 0x0005, 0x70ac, 0xa206, 0x00c0,
-       0x2dfa, 0x72a8, 0x72b6, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003,
-       0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0x6bb4,
-       0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94,
-       0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x005b, 0x2900,
-       0x705a, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605, 0x0040,
-       0x2e32, 0x70d4, 0xa084, 0x2700, 0xa086, 0x2300, 0x00c0, 0x2e2c,
-       0x2009, 0x0000, 0x0078, 0x2e2e, 0x2009, 0x0001, 0xa284, 0x000f,
-       0x1079, 0x2e38, 0xad80, 0x0009, 0x7046, 0x2d00, 0x704e, 0x007c,
-       0x2e40, 0x493f, 0x493f, 0x492c, 0x493f, 0x2e40, 0x2e40, 0x2e40,
-       0x1078, 0x29b2, 0x7808, 0xa084, 0xfffd, 0x780a, 0x1078, 0x29a5,
-       0x0f7e, 0x2079, 0x4f00, 0x78ac, 0x0f7f, 0xd084, 0x0040, 0x2e6a,
-       0x7064, 0xa086, 0x0001, 0x00c0, 0x2e58, 0x7066, 0x0078, 0x2f41,
-       0x7064, 0xa086, 0x0005, 0x00c0, 0x2e68, 0x707c, 0x2068, 0x681b,
-       0x0004, 0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822,
-       0x7067, 0x0000, 0x70a7, 0x0000, 0x70a8, 0x70b2, 0x70b6, 0x1078,
-       0x2b01, 0x157e, 0x2011, 0x0004, 0x7164, 0xa186, 0x0001, 0x0040,
-       0x2e8a, 0xa186, 0x0007, 0x00c0, 0x2e81, 0x701f, 0x0005, 0x0078,
-       0x2e8a, 0x701f, 0x0001, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6,
-       0x0078, 0x2e8c, 0x7067, 0x0000, 0x2001, 0x4f0a, 0x2004, 0xa084,
-       0x00ff, 0xa086, 0x0018, 0x0040, 0x2e9c, 0x7018, 0x7016, 0xa005,
-       0x00c0, 0x2e9c, 0x70a7, 0x0001, 0x067e, 0x1078, 0x45d6, 0x20a9,
-       0x0010, 0x2039, 0x0000, 0x1078, 0x4148, 0xa7b8, 0x0100, 0x00f0,
-       0x2ea3, 0x067f, 0x7000, 0x0079, 0x2ead, 0x2ee7, 0x2ec2, 0x2ec2,
-       0x2eb7, 0x2ee7, 0x2ee7, 0x2ee7, 0x2eb5, 0x1078, 0x29b2, 0x7060,
-       0xa005, 0x0040, 0x2ee7, 0xad06, 0x00c0, 0x2ec2, 0x6800, 0x7062,
-       0x0078, 0x2ed4, 0x6820, 0xd084, 0x00c0, 0x2ed0, 0x6f14, 0x1078,
-       0x424e, 0x6008, 0xc0d4, 0x600a, 0x1078, 0x3e19, 0x0078, 0x2ed4,
-       0x705c, 0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818,
-       0xd0fc, 0x0040, 0x2edc, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000,
-       0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x1078, 0x2073, 0xb284,
-       0x0400, 0x0040, 0x2eef, 0x2021, 0x96d0, 0x0078, 0x2ef1, 0x2021,
-       0x95c0, 0x1078, 0x2f46, 0xb284, 0x0400, 0x0040, 0x2efb, 0x2021,
-       0x4f98, 0x0078, 0x2efd, 0x2021, 0x4f58, 0x1078, 0x2f46, 0x20a9,
-       0x0101, 0xb284, 0x0400, 0x0040, 0x2f09, 0x2021, 0x95d0, 0x0078,
-       0x2f0b, 0x2021, 0x94c0, 0x1078, 0x2f46, 0x8420, 0x00f0, 0x2f0b,
-       0xb284, 0x0300, 0x0040, 0x2f18, 0x2061, 0x54c0, 0x0078, 0x2f1a,
-       0x2061, 0x74c0, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff,
-       0x0040, 0x2f37, 0x6018, 0x017e, 0x007e, 0x2011, 0x4f02, 0x220c,
-       0xa102, 0x2012, 0x007f, 0x017f, 0xa102, 0x0050, 0x2f37, 0x6012,
-       0x00c0, 0x2f37, 0x2011, 0x4f04, 0x2204, 0xc0a5, 0x2012, 0x601b,
-       0x0000, 0xace0, 0x0010, 0x00f0, 0x2f1e, 0x8421, 0x00c0, 0x2f1c,
-       0x157f, 0x7003, 0x0000, 0x704f, 0x0000, 0x007c, 0x047e, 0x2404,
-       0xa005, 0x0040, 0x2f61, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817,
-       0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820,
-       0xa084, 0x00ff, 0xc09d, 0x6822, 0x1078, 0x2073, 0x007f, 0x0078,
-       0x2f48, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050,
-       0x2f6b, 0x1078, 0x29b2, 0x2300, 0x0079, 0x2f6e, 0x2f71, 0x2ffc,
-       0x3019, 0xa282, 0x0002, 0x0040, 0x2f77, 0x1078, 0x29b2, 0x7064,
-       0x7067, 0x0000, 0x7083, 0x0000, 0x0079, 0x2f7e, 0x2f86, 0x2f86,
-       0x2f88, 0x2fc8, 0x3e55, 0x2f86, 0x2fc8, 0x2f86, 0x1078, 0x29b2,
-       0x7774, 0x1078, 0x4148, 0x7774, 0xa7bc, 0x8f00, 0x1078, 0x424e,
-       0x6018, 0xa005, 0x0040, 0x2fbf, 0xd7fc, 0x00c0, 0x2f9b, 0x2021,
-       0x95c0, 0x0078, 0x2f9d, 0x2021, 0x96d0, 0x2009, 0x0005, 0x2011,
-       0x0010, 0x1078, 0x3034, 0x0040, 0x2fbf, 0x157e, 0x20a9, 0x0101,
-       0xd7fc, 0x00c0, 0x2faf, 0x2021, 0x94c0, 0x0078, 0x2fb1, 0x2021,
-       0x95d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078, 0x3034,
-       0x047f, 0x0040, 0x2fbe, 0x8420, 0x00f0, 0x2fb1, 0x157f, 0x8738,
-       0xa784, 0x001f, 0x00c0, 0x2f8e, 0x0078, 0x2a0c, 0x0078, 0x2a0c,
-       0x7774, 0x1078, 0x424e, 0x6018, 0xa005, 0x0040, 0x2ffa, 0xd7fc,
-       0x00c0, 0x2fd6, 0x2021, 0x95c0, 0x0078, 0x2fd8, 0x2021, 0x96d0,
-       0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x3034, 0x0040, 0x2ffa,
-       0x157e, 0x20a9, 0x0101, 0xd7fc, 0x00c0, 0x2fea, 0x2021, 0x94c0,
-       0x0078, 0x2fec, 0x2021, 0x95d0, 0x047e, 0x2009, 0x0005, 0x2011,
-       0x0020, 0x1078, 0x3034, 0x047f, 0x0040, 0x2ff9, 0x8420, 0x00f0,
-       0x2fec, 0x157f, 0x0078, 0x2a0c, 0x2200, 0x0079, 0x2fff, 0x3002,
-       0x3004, 0x3004, 0x1078, 0x29b2, 0x2009, 0x0012, 0x7064, 0xa086,
-       0x0002, 0x0040, 0x300d, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0040,
-       0x3012, 0x691a, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078,
-       0x435d, 0x2200, 0x0079, 0x301c, 0x3021, 0x3004, 0x301f, 0x1078,
-       0x29b2, 0x1078, 0x45d6, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3dc7,
-       0x1078, 0x3e36, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3db8,
-       0x0040, 0x3dc7, 0x0078, 0x2a0c, 0x2404, 0xa005, 0x0040, 0x306d,
-       0x2068, 0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x3043, 0x2d20,
-       0x007f, 0x0078, 0x3035, 0x007f, 0x2022, 0x691a, 0x6817, 0x0000,
-       0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084,
-       0x00ff, 0xa205, 0x6822, 0x1078, 0x2073, 0x2021, 0x4f02, 0x241c,
-       0x8319, 0x2322, 0x6010, 0x8001, 0x6012, 0x00c0, 0x3064, 0x2021,
-       0x4f04, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, 0x600a,
-       0x1078, 0x2b22, 0x1078, 0x3e36, 0x007c, 0xa085, 0x0001, 0x0078,
-       0x306c, 0x2300, 0x0079, 0x3074, 0x3079, 0x3077, 0x30f9, 0x1078,
-       0x29b2, 0x78e4, 0xa005, 0x00d0, 0x30af, 0x3208, 0x007e, 0x2001,
-       0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x308a, 0xa18c, 0x0300,
-       0x0078, 0x308c, 0xa18c, 0x0400, 0x0040, 0x3092, 0x0018, 0x2a08,
-       0x0078, 0x3094, 0x0028, 0x2a08, 0x2008, 0xa084, 0x0030, 0x00c0,
-       0x309b, 0x0078, 0x37b9, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3099,
-       0x2100, 0xa084, 0x0007, 0x0079, 0x30a5, 0x30d9, 0x30e3, 0x30ce,
-       0x30ad, 0x43a5, 0x43a5, 0x30ad, 0x30ee, 0x1078, 0x29b2, 0x7000,
-       0xa086, 0x0004, 0x00c0, 0x30c9, 0x7064, 0xa086, 0x0002, 0x00c0,
-       0x30bf, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x2f65, 0x7064,
-       0xa086, 0x0006, 0x0040, 0x30b9, 0x7064, 0xa086, 0x0004, 0x0040,
-       0x30b9, 0x79e4, 0x2001, 0x0003, 0x0078, 0x3443, 0x6818, 0xd0fc,
-       0x0040, 0x30d4, 0x681b, 0x001d, 0x1078, 0x4118, 0x781b, 0x0064,
-       0x007c, 0x6818, 0xd0fc, 0x0040, 0x30df, 0x681b, 0x001d, 0x1078,
-       0x4118, 0x0078, 0x4381, 0x6818, 0xd0fc, 0x0040, 0x30e9, 0x681b,
-       0x001d, 0x1078, 0x4118, 0x781b, 0x00f8, 0x007c, 0x6818, 0xd0fc,
-       0x0040, 0x30f4, 0x681b, 0x001d, 0x1078, 0x4118, 0x781b, 0x00c8,
-       0x007c, 0xa584, 0x000f, 0x00c0, 0x3118, 0x1078, 0x29a5, 0x7000,
-       0x0079, 0x3102, 0x2a0c, 0x310a, 0x310c, 0x3dc7, 0x3dc7, 0x3dc7,
-       0x310a, 0x310a, 0x1078, 0x29b2, 0x1078, 0x3e36, 0x6008, 0xa084,
-       0xfbef, 0x600a, 0x1078, 0x3db8, 0x0040, 0x3dc7, 0x0078, 0x2a0c,
-       0x78e4, 0xa005, 0x00d0, 0x30af, 0x3208, 0x007e, 0x2001, 0x4f04,
-       0x2004, 0xd0ec, 0x007f, 0x0040, 0x3129, 0xa18c, 0x0300, 0x0078,
-       0x312b, 0xa18c, 0x0400, 0x0040, 0x3131, 0x0018, 0x30af, 0x0078,
-       0x3133, 0x0028, 0x30af, 0x2008, 0xa084, 0x0030, 0x00c0, 0x313b,
-       0x781b, 0x005b, 0x007c, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3138,
-       0x2100, 0xa184, 0x0007, 0x0079, 0x3145, 0x3154, 0x3158, 0x314f,
-       0x314d, 0x43a5, 0x43a5, 0x314d, 0x439f, 0x1078, 0x29b2, 0x1078,
-       0x4120, 0x781b, 0x0064, 0x007c, 0x1078, 0x4120, 0x0078, 0x4381,
-       0x1078, 0x4120, 0x781b, 0x00f8, 0x007c, 0x1078, 0x4120, 0x781b,
-       0x00c8, 0x007c, 0x2300, 0x0079, 0x3165, 0x316a, 0x3168, 0x316c,
-       0x1078, 0x29b2, 0x0078, 0x39a8, 0x681b, 0x0016, 0x78a3, 0x0000,
-       0x79e4, 0xa184, 0x0030, 0x0040, 0x39a8, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x39a8, 0xa184, 0x0100, 0x0040, 0x3170, 0xa184, 0x0007,
-       0x0079, 0x3182, 0x318a, 0x3158, 0x30ce, 0x435d, 0x43a5, 0x43a5,
-       0x435d, 0x439f, 0x1078, 0x4369, 0x007c, 0xa282, 0x0005, 0x0050,
-       0x3193, 0x1078, 0x29b2, 0x2300, 0x0079, 0x3196, 0x3199, 0x33c9,
-       0x33d4, 0x2200, 0x0079, 0x319c, 0x31b6, 0x31a3, 0x31b6, 0x31a1,
-       0x33ac, 0x1078, 0x29b2, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
-       0xa082, 0x0020, 0x0048, 0x4107, 0xa08a, 0x0004, 0x00c8, 0x4107,
-       0x0079, 0x31b2, 0x4107, 0x4107, 0x4107, 0x40b1, 0x789b, 0x0018,
-       0x79a8, 0xa184, 0x0080, 0x0040, 0x31c7, 0x0078, 0x4107, 0x7000,
-       0xa005, 0x00c0, 0x31bd, 0x2011, 0x0004, 0x0078, 0x3b93, 0xa184,
-       0x00ff, 0xa08a, 0x0010, 0x00c8, 0x4107, 0x0079, 0x31cf, 0x31e1,
-       0x31df, 0x31f6, 0x31fa, 0x32cd, 0x4107, 0x4107, 0x32cf, 0x4107,
-       0x4107, 0x33a8, 0x33a8, 0x4107, 0x4107, 0x4107, 0x33aa, 0x1078,
-       0x29b2, 0xd6e4, 0x0040, 0x31ec, 0x2001, 0x0300, 0x8000, 0x8000,
-       0x783a, 0x781b, 0x00c3, 0x007c, 0x6818, 0xd0fc, 0x0040, 0x31f4,
-       0x681b, 0x001d, 0x0078, 0x31e4, 0x0078, 0x435d, 0x681b, 0x001d,
-       0x0078, 0x4111, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x325f,
-       0x6820, 0xd084, 0x00c0, 0x3265, 0x6818, 0xa086, 0x0008, 0x00c0,
-       0x320b, 0x681b, 0x0000, 0xd6d4, 0x0040, 0x32ca, 0xd6bc, 0x0040,
-       0x324b, 0x7087, 0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d,
-       0x0050, 0x324b, 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c,
-       0x718a, 0x789b, 0x0061, 0x78aa, 0x157e, 0x137e, 0x147e, 0x017e,
-       0x3208, 0xa18c, 0x0300, 0x0040, 0x323d, 0x007e, 0x2001, 0x4f04,
-       0x2004, 0xd0ec, 0x007f, 0x0040, 0x3239, 0x20a1, 0x012b, 0x0078,
-       0x323f, 0x20a1, 0x022b, 0x0078, 0x323f, 0x20a1, 0x012b, 0x017f,
-       0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6,
-       0x147f, 0x137f, 0x157f, 0x6038, 0xa005, 0x00c0, 0x325a, 0x681c,
-       0xa084, 0x000e, 0x0040, 0x4111, 0x1078, 0x4127, 0x782b, 0x3008,
-       0x0078, 0x325c, 0x8001, 0x603a, 0x781b, 0x0067, 0x007c, 0xd6e4,
-       0x0040, 0x3265, 0x781b, 0x0079, 0x007c, 0xa684, 0x0060, 0x0040,
-       0x32c7, 0xd6dc, 0x0040, 0x32c7, 0xd6fc, 0x00c0, 0x3271, 0x0078,
-       0x3288, 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x801b,
-       0x00c8, 0x327b, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
-       0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
-       0xd6f4, 0x0040, 0x328e, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, 0xa086,
-       0x0003, 0x00c0, 0x329c, 0x007e, 0x1078, 0x45d6, 0x1078, 0x493f,
-       0x007f, 0x781b, 0x0076, 0x007c, 0xa006, 0x1078, 0x4a44, 0x6ab0,
-       0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, 0x32ab, 0x2200,
-       0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6,
-       0x7bde, 0x2300, 0xa405, 0x00c0, 0x32bb, 0xc6f5, 0x7e5a, 0x6eb6,
-       0x781b, 0x0076, 0x007c, 0x781b, 0x0076, 0x2200, 0xa115, 0x00c0,
-       0x32c4, 0x1078, 0x493f, 0x007c, 0x1078, 0x4977, 0x007c, 0x781b,
-       0x0079, 0x007c, 0x781b, 0x0067, 0x007c, 0x1078, 0x29b2, 0x0078,
-       0x331b, 0x6920, 0xd1c4, 0x0040, 0x32e4, 0xc1c4, 0x6922, 0x0c7e,
-       0x7058, 0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004, 0xa084, 0xfff5,
-       0x6006, 0x0c7f, 0x0078, 0x330f, 0xd1cc, 0x0040, 0x330f, 0xc1cc,
-       0x6922, 0x0c7e, 0x7058, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x6004,
-       0xc0a4, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x330f,
-       0x1078, 0x424a, 0x1078, 0x3f3e, 0x88ff, 0x0040, 0x330f, 0x789b,
-       0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0,
-       0x330c, 0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7e58,
-       0xd6d4, 0x00c0, 0x3316, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079,
-       0x007c, 0x0078, 0x410c, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007,
-       0x00c0, 0x3329, 0x6820, 0xa084, 0x0100, 0x0040, 0x3319, 0x2009,
-       0x0008, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
-       0x00c0, 0x3345, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
-       0x333d, 0x0048, 0x333d, 0x0078, 0x333f, 0x0078, 0x32d1, 0x24a8,
-       0x7aa8, 0x00f0, 0x333f, 0x0078, 0x332b, 0xa284, 0x00f0, 0xa086,
-       0x0020, 0x00c0, 0x3399, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040,
-       0x3355, 0x0048, 0x3355, 0x0078, 0x3396, 0xa286, 0x0023, 0x0040,
-       0x3319, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1,
-       0xc0a5, 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x0c7e, 0x7058,
-       0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, 0x0040, 0x3376,
-       0x1078, 0x424a, 0x1078, 0x405e, 0x0078, 0x3384, 0x0c7e, 0x7058,
-       0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x330f,
-       0x1078, 0x424a, 0x1078, 0x3f3e, 0x88ff, 0x0040, 0x330f, 0x789b,
-       0x0060, 0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3393,
-       0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7aa8, 0x0078,
-       0x332b, 0x8318, 0x2300, 0xa102, 0x0040, 0x33a2, 0x0048, 0x33a2,
-       0x0078, 0x332b, 0xa284, 0x0080, 0x00c0, 0x4111, 0x0078, 0x410c,
-       0x0078, 0x4111, 0x0078, 0x4107, 0x7058, 0xa04d, 0x789b, 0x0018,
-       0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040, 0x33b9, 0x1078,
-       0x29b2, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a,
-       0x0004, 0x00c8, 0x4107, 0x0079, 0x33c5, 0x4107, 0x3e8f, 0x4107,
-       0x4006, 0xa282, 0x0000, 0x00c0, 0x33cf, 0x1078, 0x29b2, 0x1078,
-       0x4118, 0x781b, 0x0078, 0x007c, 0xa282, 0x0003, 0x00c0, 0x33da,
-       0x1078, 0x29b2, 0xd4fc, 0x00c0, 0x33fa, 0x7064, 0xa005, 0x0040,
-       0x33e3, 0x1078, 0x29b2, 0x6f14, 0x7776, 0xa7bc, 0x8f00, 0x1078,
-       0x424e, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f,
-       0x00c0, 0x33e7, 0x1078, 0x411c, 0x7067, 0x0002, 0x701f, 0x0009,
-       0x0078, 0x33fc, 0x1078, 0x412b, 0x781b, 0x0078, 0x007c, 0xa282,
-       0x0004, 0x0050, 0x3405, 0x1078, 0x29b2, 0x2300, 0x0079, 0x3408,
-       0x340b, 0x35cb, 0x360e, 0xa286, 0x0003, 0x0040, 0x3443, 0x7200,
-       0x7cd8, 0x7ddc, 0x7fd0, 0x71d4, 0xd1bc, 0x00c0, 0x343b, 0xd1b4,
-       0x0040, 0x343b, 0x7868, 0xa084, 0x00ff, 0x00c0, 0x343b, 0xa282,
-       0x0002, 0x00c8, 0x343b, 0x0d7e, 0x783b, 0x8300, 0x781b, 0x004c,
-       0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898,
-       0x78d2, 0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x2001,
-       0x0000, 0x0078, 0x3447, 0x783b, 0x1300, 0x781b, 0x004a, 0x2001,
-       0x0000, 0x0078, 0x3447, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x704a,
-       0x68a0, 0xd0ec, 0x0040, 0x344f, 0x6008, 0xc08d, 0x600a, 0xa284,
-       0x000f, 0x0079, 0x3453, 0x35ab, 0x3460, 0x345d, 0x3711, 0x379d,
-       0x2a0c, 0x345b, 0x345b, 0x1078, 0x29b2, 0x6008, 0xc0d4, 0x600a,
-       0xd6e4, 0x0040, 0x3468, 0x7048, 0xa086, 0x0014, 0x00c0, 0x3488,
-       0x1078, 0x45d6, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0040, 0x3471,
-       0x7048, 0xa086, 0x0014, 0x0040, 0x3482, 0x6818, 0xa086, 0x0008,
-       0x00c0, 0x3563, 0x7858, 0xd09c, 0x0040, 0x3563, 0x6820, 0xd0ac,
-       0x0040, 0x3563, 0x681b, 0x0014, 0x2009, 0x0002, 0x0078, 0x34c7,
-       0x7868, 0xa08c, 0x00ff, 0x0040, 0x34c7, 0xa186, 0x0008, 0x00c0,
-       0x349e, 0x6008, 0xc0a4, 0x600a, 0x1078, 0x3db8, 0x0040, 0x34c7,
-       0x1078, 0x3e36, 0x1078, 0x45d6, 0x0078, 0x34af, 0xa186, 0x0028,
-       0x00c0, 0x34c7, 0x6018, 0xa005, 0x0040, 0x3491, 0x8001, 0x0040,
-       0x3491, 0x8001, 0x0040, 0x3491, 0x601e, 0x0078, 0x3491, 0x6820,
-       0xd084, 0x0040, 0x2a0c, 0xc084, 0x6822, 0x1078, 0x2b13, 0x705c,
-       0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005,
-       0x2d00, 0x00c0, 0x34c4, 0x6002, 0x6006, 0x0078, 0x2a0c, 0x017e,
-       0x81ff, 0x00c0, 0x3511, 0x7000, 0xa086, 0x0030, 0x0040, 0x3511,
-       0x71d4, 0xd1bc, 0x00c0, 0x3511, 0xd1b4, 0x00c0, 0x34f8, 0x7060,
-       0xa005, 0x00c0, 0x3511, 0x70a4, 0xa086, 0x0001, 0x0040, 0x3511,
-       0x7003, 0x0000, 0x047e, 0x057e, 0x077e, 0x067e, 0x0c7e, 0x0d7e,
-       0x1078, 0x2a35, 0x0d7f, 0x0c7f, 0x067f, 0x077f, 0x057f, 0x047f,
-       0x71d4, 0xd1b4, 0x00c0, 0x3511, 0x7003, 0x0040, 0x0078, 0x3511,
-       0x1078, 0x43b0, 0x00c0, 0x3511, 0x781b, 0x005b, 0x0d7e, 0x70bc,
-       0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
-       0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x7808, 0xc08d, 0x780a,
-       0x0d7f, 0x1078, 0x3648, 0x017f, 0x81ff, 0x0040, 0x3563, 0xa684,
-       0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x00c0,
-       0x3564, 0x6818, 0xa086, 0x0014, 0x00c0, 0x352d, 0x2008, 0xd6e4,
-       0x0040, 0x352d, 0x7868, 0xa08c, 0x00ff, 0x1078, 0x2b01, 0x1078,
-       0x2b22, 0x6820, 0xd0dc, 0x00c0, 0x3564, 0x8717, 0xa294, 0x000f,
-       0x8213, 0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x3543, 0xa290,
-       0x53c0, 0x0078, 0x3545, 0xa290, 0x5440, 0xa290, 0x0000, 0x221c,
-       0xd3c4, 0x00c0, 0x354d, 0x0078, 0x3553, 0x8210, 0x2204, 0xa085,
-       0x0018, 0x2012, 0x8211, 0xd3d4, 0x0040, 0x355e, 0x68a0, 0xd0c4,
-       0x00c0, 0x355e, 0x1078, 0x36c2, 0x0078, 0x2a0c, 0x6008, 0xc08d,
-       0x600a, 0x0078, 0x3564, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0040,
-       0x356b, 0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff,
-       0x0040, 0x3580, 0x2009, 0x4f02, 0x2104, 0x8001, 0x200a, 0x8421,
-       0x6412, 0x00c0, 0x3580, 0x2021, 0x4f04, 0x2404, 0xc0a5, 0x2022,
-       0x6018, 0xa005, 0x0040, 0x3588, 0x8001, 0x601a, 0x00c0, 0x358b,
-       0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x3597, 0x6800,
-       0xa005, 0x00c0, 0x3594, 0x6002, 0x6006, 0x0078, 0x359b, 0x705c,
-       0x2060, 0x6800, 0x6002, 0x2061, 0x4f00, 0x6887, 0x0103, 0x2d08,
-       0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x35aa, 0x2d02,
-       0x0078, 0x35ab, 0x616e, 0x7200, 0xa286, 0x0030, 0x0040, 0x35bb,
-       0xa286, 0x0040, 0x00c0, 0x2a0c, 0x7003, 0x0002, 0x704c, 0x2068,
-       0x68c4, 0x2060, 0x007c, 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc,
-       0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80,
-       0x0009, 0x7046, 0x007c, 0xa282, 0x0004, 0x0048, 0x35d1, 0x1078,
-       0x29b2, 0x2200, 0x0079, 0x35d4, 0x35d8, 0x35e9, 0x35f6, 0x35e9,
-       0xa586, 0x1300, 0x0040, 0x35e9, 0xa586, 0x8300, 0x00c0, 0x35cf,
-       0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef,
-       0x600a, 0x7000, 0xa086, 0x0005, 0x0040, 0x35f3, 0x1078, 0x4118,
-       0x781b, 0x0078, 0x007c, 0x781b, 0x0079, 0x007c, 0x7890, 0x8007,
-       0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
-       0x00ff, 0xa186, 0x0003, 0x0040, 0x360b, 0xa186, 0x0000, 0x0040,
-       0x360b, 0x0078, 0x4107, 0x781b, 0x0079, 0x007c, 0x6820, 0xc095,
-       0x6822, 0x82ff, 0x00c0, 0x3618, 0x1078, 0x4118, 0x0078, 0x361f,
-       0x8211, 0x0040, 0x361d, 0x1078, 0x29b2, 0x1078, 0x412b, 0x781b,
-       0x0078, 0x007c, 0x1078, 0x43d3, 0x7830, 0xa084, 0x00c0, 0x00c0,
-       0x3645, 0x017e, 0x3208, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec,
-       0x007f, 0x0040, 0x3637, 0xa18c, 0x0300, 0x0078, 0x3639, 0xa18c,
-       0x0400, 0x017f, 0x0040, 0x3640, 0x0018, 0x3645, 0x0078, 0x3642,
-       0x0028, 0x3645, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c,
-       0xa684, 0x0060, 0x00c0, 0x3652, 0x682f, 0x0000, 0x6833, 0x0000,
-       0x0078, 0x36c1, 0xd6dc, 0x00c0, 0x366a, 0x68b4, 0xd0dc, 0x00c0,
-       0x366a, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7048, 0xa005, 0x00c0,
-       0x3667, 0x2200, 0xa105, 0x0040, 0x45d6, 0x704b, 0x0015, 0x0078,
-       0x45d6, 0x007c, 0xd6ac, 0x0040, 0x3690, 0xd6f4, 0x0040, 0x3676,
-       0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x45d6, 0x68b4, 0xa084,
-       0x4000, 0xa635, 0xd6f4, 0x00c0, 0x3670, 0x7048, 0xa005, 0x00c0,
-       0x3683, 0x704b, 0x0015, 0xd6dc, 0x00c0, 0x368c, 0x68b4, 0xd0dc,
-       0x0040, 0x368c, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, 0x0078, 0x45d6,
-       0xd6f4, 0x0040, 0x3699, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
-       0x45d6, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x00c0, 0x3693,
-       0x7048, 0xa005, 0x00c0, 0x36a6, 0x704b, 0x0015, 0x2408, 0x2510,
-       0x2700, 0x80fb, 0x00c8, 0x36ad, 0x8000, 0xa084, 0x003f, 0xa108,
-       0xa291, 0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x36ba,
-       0x0078, 0x45d6, 0x7000, 0xa086, 0x0006, 0x0040, 0x36c1, 0x0078,
-       0x45d6, 0x007c, 0x6946, 0x6008, 0xc0cd, 0xd3cc, 0x0040, 0x36c9,
-       0xc08d, 0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f, 0x0000,
-       0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003,
-       0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020,
-       0x7000, 0x0079, 0x36e3, 0x2a0c, 0x36f5, 0x36ed, 0x36eb, 0x36eb,
-       0x36eb, 0x36eb, 0x36eb, 0x1078, 0x29b2, 0x6820, 0xd084, 0x00c0,
-       0x36f5, 0x1078, 0x3e19, 0x0078, 0x36fb, 0x705c, 0x2c50, 0x2060,
-       0x6800, 0x6002, 0x2a60, 0x3208, 0xa18c, 0x0300, 0x0040, 0x3704,
-       0x2021, 0x4f58, 0x0078, 0x3706, 0x2021, 0x4f98, 0x2404, 0xa005,
-       0x0040, 0x370d, 0x2020, 0x0078, 0x3706, 0x2d22, 0x206b, 0x0000,
-       0x007c, 0x1078, 0x3e20, 0x1078, 0x3e36, 0x6008, 0xc0cc, 0x600a,
-       0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, 0x6944,
-       0x6916, 0x3208, 0xa18c, 0x0300, 0x0040, 0x372a, 0x2009, 0x0000,
-       0x0078, 0x372c, 0x2009, 0x0001, 0x1078, 0x4a81, 0xd6dc, 0x0040,
-       0x3734, 0x691c, 0xc1ed, 0x691e, 0x6818, 0xd0fc, 0x0040, 0x3743,
-       0x7868, 0xa08c, 0x00ff, 0x0040, 0x3741, 0x681b, 0x001e, 0x0078,
-       0x3743, 0x681b, 0x0000, 0xb284, 0x0300, 0x00c0, 0x374b, 0x2021,
-       0x4f98, 0x0078, 0x374d, 0x2021, 0x4f58, 0x6800, 0x2022, 0x6a3c,
-       0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0040,
-       0x378d, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x0d7e,
-       0x0f7e, 0x157e, 0x147e, 0x2079, 0x4f00, 0x1078, 0x1e46, 0x147f,
-       0x157f, 0x0f7f, 0x70cc, 0x2010, 0x2009, 0x0101, 0x027e, 0x2204,
-       0xa06d, 0x0040, 0x377d, 0x6814, 0xa706, 0x0040, 0x377a, 0x6800,
-       0x0078, 0x3770, 0x6820, 0xc0d5, 0x6822, 0x027f, 0x8210, 0x8109,
-       0x00c0, 0x376e, 0x0d7f, 0x7067, 0x0003, 0x707f, 0x0000, 0x7776,
-       0x7083, 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x6818, 0xa086, 0x0002,
-       0x00c0, 0x3799, 0x6817, 0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec,
-       0x681e, 0x1078, 0x2073, 0x0078, 0x2a0c, 0x7cd8, 0x7ddc, 0x7fd0,
-       0x1078, 0x3648, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078,
-       0x43d7, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x37b2,
-       0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x7067, 0x0000, 0x0078,
-       0x2a0c, 0x7000, 0xa005, 0x00c0, 0x37bf, 0x0078, 0x2a0c, 0xa006,
-       0x1078, 0x45d6, 0x6920, 0xd1ac, 0x00c0, 0x37c8, 0x681b, 0x0014,
-       0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff,
-       0x6822, 0x7000, 0x0079, 0x37d4, 0x2a0c, 0x37de, 0x37de, 0x37e1,
-       0x37e1, 0x37e1, 0x37dc, 0x37dc, 0x1078, 0x29b2, 0x6818, 0x0078,
-       0x3443, 0x6008, 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0078, 0x3dde,
-       0x2300, 0x0079, 0x37eb, 0x37ee, 0x37f0, 0x3860, 0x1078, 0x29b2,
-       0xd6fc, 0x00c0, 0x3847, 0x7000, 0xa00d, 0x0079, 0x37f7, 0x2a0c,
-       0x3801, 0x3801, 0x3831, 0x3801, 0x3844, 0x37ff, 0x37ff, 0x1078,
-       0x29b2, 0xa684, 0x0060, 0x0040, 0x3831, 0xa086, 0x0060, 0x00c0,
-       0x382e, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac,
-       0x681e, 0xa186, 0x0002, 0x0040, 0x3820, 0x1078, 0x45d6, 0x69ac,
-       0x68b0, 0xa115, 0x0040, 0x3820, 0x1078, 0x4977, 0x0078, 0x3822,
-       0x1078, 0x493f, 0x781b, 0x0079, 0x71d4, 0xd1b4, 0x00c0, 0x2a08,
-       0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a52, 0x007c, 0xd6ec, 0x0040,
-       0x380b, 0x6818, 0xd0fc, 0x0040, 0x3844, 0xd6f4, 0x00c0, 0x383e,
-       0x681b, 0x0015, 0x781b, 0x0079, 0x0078, 0x2a08, 0x681b, 0x0007,
-       0x682f, 0x0000, 0x6833, 0x0000, 0x1078, 0x4369, 0x007c, 0xc6fc,
-       0x7e5a, 0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8, 0x3850, 0x8000,
-       0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
-       0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0079, 0x007c,
-       0x1078, 0x29b2, 0x2300, 0x0079, 0x3865, 0x386a, 0x388f, 0x38ef,
-       0x1078, 0x29b2, 0x7000, 0x0079, 0x386d, 0x3875, 0x3877, 0x3880,
-       0x3875, 0x3875, 0x3875, 0x3875, 0x3875, 0x1078, 0x29b2, 0x69ac,
-       0x68b0, 0xa115, 0x0040, 0x3880, 0x1078, 0x4977, 0x0078, 0x3882,
-       0x1078, 0x493f, 0x681c, 0xc0b4, 0x681e, 0x70d4, 0xd0b4, 0x00c0,
-       0x2a08, 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a52, 0x007c, 0xd6fc,
-       0x00c0, 0x38df, 0x7000, 0xa00d, 0x0079, 0x3896, 0x2a0c, 0x38a6,
-       0x38a0, 0x38d6, 0x38a6, 0x38dc, 0x389e, 0x389e, 0x1078, 0x29b2,
-       0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060,
-       0x0040, 0x38d6, 0xa086, 0x0060, 0x00c0, 0x38d3, 0xa6b4, 0xbfbf,
-       0xc6ed, 0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0040, 0x38c2, 0x1078,
-       0x45d6, 0x69ac, 0x68b0, 0xa115, 0x0040, 0x38c2, 0x1078, 0x4977,
-       0x0078, 0x38c4, 0x1078, 0x493f, 0x781b, 0x0079, 0x681c, 0xc0b4,
-       0x681e, 0x71d4, 0xd1b4, 0x00c0, 0x2a08, 0x70a4, 0xa086, 0x0001,
-       0x00c0, 0x2a52, 0x007c, 0xd6ec, 0x0040, 0x38b0, 0x6818, 0xd0fc,
-       0x0040, 0x38dc, 0x681b, 0x0007, 0x781b, 0x00f9, 0x007c, 0xc6fc,
-       0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94,
-       0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0079, 0x007c, 0xd6dc,
-       0x0040, 0x38f8, 0x782b, 0x3009, 0x781b, 0x0079, 0x0078, 0x2a08,
-       0x7884, 0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, 0x00c0, 0x390b,
-       0xa484, 0x0200, 0x0040, 0x3905, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b,
-       0x0079, 0x0078, 0x2a08, 0x6820, 0xc095, 0x6822, 0x1078, 0x42e2,
-       0xc6dd, 0x1078, 0x4118, 0x781b, 0x0078, 0x0078, 0x2a08, 0x2300,
-       0x0079, 0x391a, 0x391d, 0x391f, 0x3921, 0x1078, 0x29b2, 0x0078,
-       0x4111, 0xd6d4, 0x00c0, 0x395c, 0x79e4, 0xd1ac, 0x0040, 0x392f,
-       0x78ec, 0xa084, 0x0003, 0x0040, 0x392f, 0x782b, 0x3009, 0x789b,
-       0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xd1ac,
-       0x0040, 0x393f, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x3958, 0x2001,
-       0x4f04, 0x2004, 0xd0e4, 0x00c0, 0x3954, 0x6820, 0xd0c4, 0x0040,
-       0x3954, 0x0c7e, 0x7058, 0x2060, 0x6004, 0xc09d, 0x6006, 0x6008,
-       0xa084, 0x00ff, 0x600a, 0x0c7f, 0x2001, 0x0014, 0x0078, 0x3443,
-       0xa184, 0x0007, 0x0079, 0x3992, 0x7a90, 0xa294, 0x0007, 0x789b,
-       0x0060, 0x79a8, 0x81ff, 0x0040, 0x3990, 0x789b, 0x0010, 0x7ba8,
-       0xa384, 0x0001, 0x00c0, 0x3983, 0x7ba8, 0x7ba8, 0xa386, 0x0001,
-       0x00c0, 0x3976, 0x2009, 0xfff7, 0x0078, 0x397c, 0xa386, 0x0003,
-       0x00c0, 0x3983, 0x2009, 0xffef, 0x0c7e, 0x7058, 0x2060, 0x6004,
-       0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
-       0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922,
-       0x0078, 0x435d, 0x30d9, 0x30e3, 0x399c, 0x39a2, 0x399a, 0x399a,
-       0x435d, 0x435d, 0x1078, 0x29b2, 0x6920, 0xa18c, 0xfcff, 0x6922,
-       0x0078, 0x4363, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, 0x435d,
-       0x79e4, 0xa184, 0x0030, 0x0040, 0x39b2, 0x78ec, 0xa084, 0x0003,
-       0x00c0, 0x39e6, 0x7000, 0xa086, 0x0004, 0x00c0, 0x39cc, 0x7064,
-       0xa086, 0x0002, 0x00c0, 0x39c2, 0x2011, 0x0002, 0x2019, 0x0000,
-       0x0078, 0x2f65, 0x7064, 0xa086, 0x0006, 0x0040, 0x39bc, 0x7064,
-       0xa086, 0x0004, 0x0040, 0x39bc, 0x7000, 0xa086, 0x0000, 0x0040,
-       0x2a08, 0x6920, 0xa184, 0x0420, 0x0040, 0x39db, 0xc1d4, 0x6922,
-       0x6818, 0x0078, 0x3443, 0x6818, 0xa08e, 0x0002, 0x0040, 0x39e4,
-       0xc0fd, 0x681a, 0x2001, 0x0014, 0x0078, 0x3443, 0xa184, 0x0007,
-       0x0079, 0x39ea, 0x435d, 0x435d, 0x39f2, 0x435d, 0x43a5, 0x43a5,
-       0x435d, 0x435d, 0xd6bc, 0x0040, 0x3a34, 0x7184, 0x81ff, 0x0040,
-       0x3a34, 0xa182, 0x000d, 0x00d0, 0x3a01, 0x7087, 0x0000, 0x0078,
-       0x3a06, 0xa182, 0x000c, 0x7086, 0x2009, 0x000c, 0x789b, 0x0061,
-       0x79aa, 0x157e, 0x137e, 0x147e, 0x7088, 0x8114, 0xa210, 0x728a,
-       0xa080, 0x000b, 0xad00, 0x2098, 0xb284, 0x0300, 0x0040, 0x3a28,
-       0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x3a24,
-       0x20a1, 0x012b, 0x0078, 0x3a2a, 0x20a1, 0x022b, 0x0078, 0x3a2a,
-       0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f,
-       0x137f, 0x157f, 0x0078, 0x4363, 0xd6d4, 0x00c0, 0x3a88, 0x6820,
-       0xd084, 0x0040, 0x4363, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0040,
-       0x3a46, 0xa086, 0x0060, 0x00c0, 0x3a46, 0xc1f5, 0xc194, 0x795a,
-       0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818,
-       0xc0fd, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3e4f, 0xa18c,
-       0x00f8, 0x00c0, 0x3e4f, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208,
-       0xa18c, 0x0300, 0x0040, 0x3a74, 0x007e, 0x2001, 0x4f04, 0x2004,
-       0xd0ec, 0x007f, 0x0040, 0x3a70, 0x20a1, 0x012b, 0x0078, 0x3a76,
-       0x20a1, 0x022b, 0x0078, 0x3a76, 0x20a1, 0x012b, 0x017f, 0x789b,
-       0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f,
-       0x137f, 0x157f, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0078, 0x4363,
-       0x6818, 0xd0fc, 0x0040, 0x3a8e, 0x681b, 0x0008, 0x6820, 0xc0ad,
-       0x6822, 0x1078, 0x4120, 0x781b, 0x00ea, 0x007c, 0x2300, 0x0079,
-       0x3a99, 0x3a9e, 0x3b76, 0x3a9c, 0x1078, 0x29b2, 0x7cd8, 0x7ddc,
-       0x7fd0, 0x82ff, 0x00c0, 0x3ac7, 0x7200, 0xa286, 0x0003, 0x0040,
-       0x3410, 0x71d4, 0xd1bc, 0x00c0, 0x3aca, 0xd1b4, 0x0040, 0x3aca,
-       0x0d7e, 0x783b, 0x8800, 0x781b, 0x004c, 0x70bc, 0xa06d, 0x68b4,
-       0xc0a5, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da,
-       0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x0078, 0x3ace, 0x7200,
-       0x0078, 0x3ace, 0x783b, 0x1800, 0x781b, 0x004a, 0xa284, 0x000f,
-       0x0079, 0x3ad2, 0x3b61, 0x3b10, 0x3adc, 0x343f, 0x3ada, 0x3b61,
-       0x3ada, 0x3ada, 0x1078, 0x29b2, 0x681c, 0xd0ec, 0x0040, 0x3ae3,
-       0x6008, 0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006,
-       0xa005, 0x00c0, 0x3aec, 0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c,
-       0xa084, 0x000e, 0x00c0, 0x3b00, 0xb284, 0x0300, 0x0040, 0x3afc,
-       0x2009, 0x95c0, 0x0078, 0x3b05, 0x2009, 0x96d0, 0x0078, 0x3b05,
-       0x7030, 0x68ba, 0x7140, 0x70cc, 0xa108, 0x2104, 0x6802, 0x2d0a,
-       0x715e, 0xd6dc, 0x00c0, 0x3b10, 0xc6fc, 0x6eb6, 0x0078, 0x3b61,
-       0x6eb6, 0xa684, 0x0060, 0x00c0, 0x3b1a, 0xa684, 0x7fff, 0x68b6,
-       0x0078, 0x3b61, 0xd6dc, 0x00c0, 0x3b28, 0xa684, 0x7fff, 0x68b6,
-       0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x45d6, 0x0078, 0x3b61,
-       0xd6ac, 0x0040, 0x3b34, 0xa006, 0x1078, 0x45d6, 0x2408, 0x2510,
-       0x69aa, 0x6aa6, 0x0078, 0x3b44, 0x2408, 0x2510, 0x2700, 0x801b,
-       0x00c8, 0x3b3b, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
-       0x69aa, 0x6aa6, 0x1078, 0x45d6, 0xd6fc, 0x0040, 0x3b61, 0xa684,
-       0x7fff, 0x68b6, 0x2510, 0x2408, 0xd6ac, 0x00c0, 0x3b59, 0x2700,
-       0x801b, 0x00c8, 0x3b54, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
-       0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303,
-       0x68ae, 0x7000, 0xa086, 0x0030, 0x00c0, 0x2a0c, 0x7003, 0x0002,
-       0x70bc, 0xa06d, 0x68bc, 0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a,
-       0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0xa586, 0x8800,
-       0x00c0, 0x3b83, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008,
-       0xa084, 0xfbef, 0x600a, 0x0078, 0x4111, 0x7047, 0x0000, 0xa282,
-       0x0006, 0x0050, 0x3b8d, 0x1078, 0x29b2, 0x2300, 0x0079, 0x3b90,
-       0x3b93, 0x3ba5, 0x3bb1, 0x2200, 0x0079, 0x3b96, 0x3b9c, 0x4111,
-       0x3b9e, 0x3b9c, 0x3beb, 0x3c40, 0x1078, 0x29b2, 0x7a80, 0xa294,
-       0x0f00, 0x1078, 0x3cca, 0x0078, 0x4107, 0x1078, 0x3bc2, 0x0079,
-       0x3ba9, 0x4111, 0x3baf, 0x3baf, 0x3beb, 0x3baf, 0x4111, 0x1078,
-       0x29b2, 0x1078, 0x3bc2, 0x0079, 0x3bb5, 0x3bbd, 0x3bbb, 0x3bbb,
-       0x3bbd, 0x3bbb, 0x3bbd, 0x1078, 0x29b2, 0x1078, 0x412b, 0x781b,
-       0x0078, 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3bd3, 0x1078,
-       0x3e36, 0x0078, 0x3bcd, 0x1078, 0x45d6, 0x6008, 0xa084, 0xfbef,
-       0x600a, 0x0078, 0x3bd8, 0x7000, 0xa086, 0x0003, 0x0040, 0x3bcb,
-       0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3be2, 0x2001, 0x96e0,
-       0x0078, 0x3be4, 0x2001, 0x9712, 0x2068, 0x704e, 0xad80, 0x0009,
-       0x7046, 0x2200, 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3bfd,
-       0x70d4, 0xc0b5, 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078,
-       0x3c02, 0x1078, 0x45d6, 0x0078, 0x3c02, 0x7000, 0xa086, 0x0003,
-       0x0040, 0x3bf9, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b,
-       0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x95c0, 0xb284,
-       0x0300, 0x00c0, 0x3c16, 0xc2fd, 0x2069, 0x96d0, 0x2d04, 0x2d08,
-       0x715e, 0xa06d, 0x0040, 0x3c23, 0x6814, 0xa206, 0x0040, 0x3c25,
-       0x6800, 0x0078, 0x3c17, 0x1078, 0x3cca, 0x6eb4, 0x7e5a, 0x6920,
-       0xa184, 0x0c00, 0x0040, 0x3cf4, 0x7064, 0xa086, 0x0006, 0x00c0,
-       0x3c37, 0x7074, 0xa206, 0x00c0, 0x3c37, 0x7066, 0x707e, 0x681b,
-       0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x4120, 0x0078, 0x3cf4,
-       0x7200, 0xa286, 0x0002, 0x00c0, 0x3c52, 0x70d4, 0xc0b5, 0x70d6,
-       0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078, 0x3c56, 0x1078, 0x45d6,
-       0x0078, 0x3c56, 0xa286, 0x0003, 0x0040, 0x3c4e, 0x7003, 0x0001,
-       0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f,
-       0xa215, 0xb284, 0x0300, 0x00c0, 0x3c66, 0xc2fd, 0x79a8, 0x79a8,
-       0xa18c, 0x00ff, 0x2118, 0x70cc, 0xa168, 0x2d04, 0x2d08, 0x715e,
-       0xa06d, 0x0040, 0x3c7a, 0x6814, 0xa206, 0x0040, 0x3ca3, 0x6800,
-       0x0078, 0x3c6e, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c84,
-       0x2001, 0x96e0, 0x0078, 0x3c86, 0x2001, 0x9712, 0x2068, 0x704e,
-       0x157e, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c8b,
-       0x157f, 0xb284, 0x0300, 0x0040, 0x3c98, 0xc2fc, 0x0078, 0x3c99,
-       0xc2fd, 0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823,
-       0x0800, 0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0040,
-       0x3cf4, 0xd0dc, 0x0040, 0x3cbf, 0x7064, 0xa086, 0x0004, 0x00c0,
-       0x3cbb, 0x7074, 0xa206, 0x00c0, 0x3cbb, 0x7078, 0xa306, 0x00c0,
-       0x3cbb, 0x7066, 0x707e, 0x1078, 0x4127, 0x0078, 0x3cf4, 0x681b,
-       0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x4120, 0x707f, 0x0000,
-       0x0078, 0x3cf4, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3cd4,
-       0x2001, 0x96e0, 0x0078, 0x3cd6, 0x2001, 0x9712, 0x2068, 0x704e,
-       0x157e, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3cdb,
-       0x157f, 0xb284, 0x0300, 0x0040, 0x3ce8, 0xc2fc, 0x0078, 0x3ce9,
-       0xc2fd, 0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823,
-       0x0800, 0x6827, 0x0003, 0x007c, 0xc6ec, 0xa6ac, 0x0060, 0x0040,
-       0x3d46, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0, 0x3d21,
-       0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa586, 0x0060, 0x0040, 0x3d4b,
-       0xd6f4, 0x00c0, 0x3d0c, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009,
-       0x0079, 0xd69c, 0x0040, 0x3d19, 0x2009, 0x0078, 0x2019, 0x0000,
-       0x2320, 0x791a, 0xd6ec, 0x0040, 0x3d56, 0x1078, 0x493f, 0x0078,
-       0x3d56, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040,
-       0x3d4d, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x00c0,
-       0x3d32, 0xc6ed, 0xc6f4, 0x7e5a, 0x2011, 0x0079, 0xd69c, 0x0040,
-       0x3d3e, 0x2011, 0x0078, 0x2019, 0x0000, 0x2320, 0x7a1a, 0xd6ec,
-       0x0040, 0x3d56, 0x1078, 0x4977, 0x0078, 0x3d56, 0x2019, 0x0000,
-       0x2320, 0x0078, 0x3d4d, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079,
-       0xd69c, 0x0040, 0x3d55, 0x2009, 0x0078, 0x791a, 0x68c0, 0x705a,
-       0x2d00, 0x704e, 0x68c4, 0x2060, 0x71d4, 0x2001, 0x4f01, 0x2004,
-       0xd0c4, 0x00c0, 0x3dab, 0x70d8, 0xa02d, 0x0040, 0x3d84, 0xd1bc,
-       0x0040, 0x3d9e, 0x7a80, 0xa294, 0x0f00, 0x70dc, 0xa206, 0x0040,
-       0x3d75, 0x78e0, 0xa504, 0x00c0, 0x3dab, 0x70da, 0xc1bc, 0x71d6,
-       0x0078, 0x3dab, 0x2031, 0x0001, 0x852c, 0x0048, 0x3d83, 0x8633,
-       0x8210, 0x0078, 0x3d7c, 0x007c, 0x7de0, 0xa594, 0xff00, 0x0040,
-       0x3d91, 0x2011, 0x0008, 0x852f, 0x1078, 0x3d7a, 0x8637, 0x0078,
-       0x3d93, 0x1078, 0x3d7a, 0x8217, 0x7880, 0xa084, 0x0f00, 0xa206,
-       0x0040, 0x3dab, 0x72de, 0x76da, 0x0078, 0x3dab, 0x7a80, 0xa294,
-       0x0f00, 0x70dc, 0xa236, 0x0040, 0x3d9b, 0x78e0, 0xa534, 0x0040,
-       0x3d9b, 0xc1bd, 0x71d6, 0xd1b4, 0x00c0, 0x2a08, 0x2300, 0xa405,
-       0x0040, 0x2a08, 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a52, 0x007c,
-       0x6020, 0xa005, 0x0040, 0x3dc6, 0x8001, 0x6022, 0x6008, 0xa085,
-       0x0008, 0x600a, 0x700f, 0x0100, 0x702c, 0x6026, 0x007c, 0xa006,
-       0x1078, 0x45d6, 0x7000, 0xa086, 0x0002, 0x0040, 0x3dd4, 0x7064,
-       0xa086, 0x0005, 0x00c0, 0x3dde, 0x682b, 0x0000, 0x6817, 0x0000,
-       0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084,
-       0x000f, 0x0079, 0x3de3, 0x2a0c, 0x3df3, 0x3ded, 0x3e15, 0x3dfd,
-       0x2a0c, 0x3deb, 0x3deb, 0x1078, 0x29b2, 0x1078, 0x3e20, 0x1078,
-       0x3e19, 0x0078, 0x3df9, 0x1078, 0x3e20, 0x705c, 0x2060, 0x6800,
-       0x6002, 0x1078, 0x2073, 0x0078, 0x2a0c, 0x7064, 0x7067, 0x0000,
-       0x7083, 0x0000, 0x0079, 0x3e04, 0x3e11, 0x3e11, 0x3e0c, 0x3e0c,
-       0x3e0c, 0x3e11, 0x3e0c, 0x3e11, 0x77d4, 0xc7dd, 0x77d6, 0x0079,
-       0x2f7e, 0x7067, 0x0000, 0x0078, 0x2a0c, 0x681b, 0x0000, 0x0078,
-       0x3711, 0x6800, 0xa005, 0x00c0, 0x3e1e, 0x6002, 0x6006, 0x007c,
-       0x6410, 0x84ff, 0x0040, 0x3e32, 0x2009, 0x4f02, 0x2104, 0x8001,
-       0x200a, 0x8421, 0x6412, 0x00c0, 0x3e32, 0x2021, 0x4f04, 0x2404,
-       0xc0a5, 0x2022, 0x6008, 0xc0a4, 0x600a, 0x007c, 0x6018, 0xa005,
-       0x0040, 0x3e3c, 0x8001, 0x601a, 0x007c, 0x1078, 0x43d3, 0x681b,
-       0x0018, 0x0078, 0x3e7d, 0x1078, 0x43d3, 0x681b, 0x0019, 0x0078,
-       0x3e7d, 0x1078, 0x43d3, 0x681b, 0x001a, 0x0078, 0x3e7d, 0x1078,
-       0x43d3, 0x681b, 0x0003, 0x0078, 0x3e7d, 0x7774, 0x1078, 0x424e,
-       0x7178, 0xa18c, 0x00ff, 0x3210, 0xa294, 0x0300, 0x0040, 0x3e64,
-       0xa1e8, 0x94c0, 0x0078, 0x3e66, 0xa1e8, 0x95d0, 0x2d04, 0x2d08,
-       0x2068, 0xa005, 0x00c0, 0x3e6f, 0x707e, 0x0078, 0x2a0c, 0x6814,
-       0x7274, 0xa206, 0x0040, 0x3e77, 0x6800, 0x0078, 0x3e67, 0x6800,
-       0x200a, 0x681b, 0x0005, 0x707f, 0x0000, 0x1078, 0x3e20, 0x6820,
-       0xd084, 0x00c0, 0x3e85, 0x1078, 0x3e19, 0x1078, 0x3e36, 0x681f,
-       0x0000, 0x6823, 0x0020, 0x1078, 0x2073, 0x0078, 0x2a0c, 0xa282,
-       0x0003, 0x00c0, 0x4107, 0x7da8, 0xa5ac, 0x00ff, 0x7e5a, 0x7ea8,
-       0xa6b4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x0040, 0x3eea,
-       0xc1c4, 0x6922, 0xa6b4, 0x00ff, 0x0040, 0x3ed7, 0xa682, 0x000c,
-       0x0048, 0x3eae, 0x0040, 0x3eae, 0x2031, 0x000c, 0x2500, 0xa086,
-       0x000a, 0x0040, 0x3eb5, 0x852b, 0x852b, 0x1078, 0x41e0, 0x0040,
-       0x3ebd, 0x1078, 0x3fbc, 0x0078, 0x3ee0, 0x1078, 0x419b, 0x0c7e,
-       0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3ff2, 0x0c7f,
-       0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0,
-       0x3ed4, 0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x0c7e,
-       0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3ff2, 0x0c7f,
-       0x7e58, 0xd6d4, 0x00c0, 0x3ee7, 0x781b, 0x0067, 0x007c, 0x781b,
-       0x0079, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x6100, 0xd1e4, 0x0040,
-       0x3f33, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048,
-       0x3efd, 0x0040, 0x3efd, 0x2011, 0x000c, 0x2600, 0xa202, 0x00c8,
-       0x3f02, 0x2230, 0x6208, 0xa294, 0x00ff, 0x2001, 0x4f05, 0x2004,
-       0xd0e4, 0x00c0, 0x3f17, 0x78ec, 0xd0e4, 0x0040, 0x3f17, 0xa282,
-       0x000a, 0x00c8, 0x3f1d, 0x2011, 0x000a, 0x0078, 0x3f1d, 0xa282,
-       0x000c, 0x00c8, 0x3f1d, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8,
-       0x3f22, 0x2228, 0x1078, 0x419f, 0x2500, 0xa086, 0x000a, 0x0040,
-       0x3f2b, 0x852b, 0x852b, 0x1078, 0x41e0, 0x0040, 0x3f33, 0x1078,
-       0x3fbc, 0x0078, 0x3f37, 0x1078, 0x419b, 0x1078, 0x3ff2, 0x7858,
-       0xc095, 0x785a, 0x0c7f, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960,
-       0x6000, 0xd0e4, 0x00c0, 0x3f58, 0xd0b4, 0x00c0, 0x3f52, 0x6010,
-       0xa084, 0x000f, 0x00c0, 0x3f52, 0x6104, 0xa18c, 0xfff5, 0x6106,
-       0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3f83,
-       0x68a0, 0xd0cc, 0x00c0, 0x3f52, 0x6208, 0xa294, 0x00ff, 0x2001,
-       0x4f05, 0x2004, 0xd0e4, 0x00c0, 0x3f71, 0x78ec, 0xd0e4, 0x0040,
-       0x3f71, 0xa282, 0x000b, 0x00c8, 0x3f71, 0x2011, 0x000a, 0x0078,
-       0x3f77, 0xa282, 0x000c, 0x00c8, 0x3f77, 0x2011, 0x000c, 0x6308,
-       0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c, 0x0048, 0x3f83, 0x0040,
-       0x3f83, 0x2019, 0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
-       0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822,
-       0x70d4, 0xd0b4, 0x0040, 0x3f9f, 0xc0b4, 0x70d6, 0x70b8, 0xa065,
-       0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f,
-       0x007c, 0x0c7e, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011,
-       0x0032, 0x2019, 0x0000, 0x0078, 0x3fad, 0x78ab, 0x0001, 0x78ab,
-       0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820,
-       0xc0c5, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7158, 0x2160, 0x2018,
-       0xa08c, 0x0020, 0x0040, 0x3fc5, 0xc0ac, 0x2008, 0xa084, 0xfff0,
-       0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084,
-       0xfff0, 0xa18c, 0x000f, 0xa105, 0xc0f4, 0xa39c, 0x0020, 0x0040,
-       0x3fdb, 0xa085, 0x4000, 0xc0fc, 0xd0b4, 0x00c0, 0x3fe0, 0xc0fd,
-       0x78a6, 0x6016, 0x788a, 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004,
-       0xa084, 0x00ff, 0xa605, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006,
-       0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x6018, 0x789a, 0x78a4,
-       0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886,
-       0x600c, 0xa084, 0x00ff, 0x600e, 0x0c7f, 0x007c, 0xa282, 0x0002,
-       0x00c0, 0x4107, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc, 0x0040,
-       0x4041, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8,
-       0x4107, 0x1078, 0x4094, 0x1078, 0x3ff2, 0xa980, 0x0001, 0x200c,
-       0x1078, 0x424a, 0x1078, 0x3f3e, 0x88ff, 0x0040, 0x4037, 0x789b,
-       0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0,
-       0x4034, 0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7e58,
-       0xd6d4, 0x00c0, 0x403e, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079,
-       0x007c, 0xa282, 0x0002, 0x00c8, 0x4049, 0xa284, 0x0001, 0x0040,
-       0x4052, 0x7158, 0xa188, 0x0000, 0x210c, 0xd1ec, 0x00c0, 0x4052,
-       0x2011, 0x0000, 0x1078, 0x417c, 0x1078, 0x4094, 0x1078, 0x3ff2,
-       0x7858, 0xc095, 0x785a, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x027e,
-       0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x00c0, 0x4075, 0xd0bc,
-       0x00c0, 0x4073, 0x6014, 0xd0b4, 0x00c0, 0x4073, 0xc1a4, 0x6106,
-       0xa006, 0x0078, 0x4091, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
-       0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x70d4, 0xd0b4,
-       0x0040, 0x408d, 0xc0b4, 0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084,
-       0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x6820, 0xa085, 0x0200,
-       0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x82ff,
-       0x0040, 0x409c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a,
-       0x78a4, 0xa084, 0xffbf, 0xa205, 0xc0fc, 0xd0b4, 0x00c0, 0x40a9,
-       0xc0fd, 0x78a6, 0x6016, 0x788a, 0x6004, 0xc0a4, 0x6006, 0x0c7f,
-       0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x40ba, 0x007f,
-       0x0078, 0x40bd, 0x007f, 0x0078, 0x4104, 0xd6ac, 0x0040, 0x4104,
-       0x7888, 0xa084, 0x0040, 0x0040, 0x4104, 0x7bb8, 0xa384, 0x003f,
-       0x831b, 0x00c8, 0x40cc, 0x8000, 0xa005, 0x0040, 0x40e1, 0x831b,
-       0x00c8, 0x40d5, 0x8001, 0x0040, 0x4101, 0xd6f4, 0x0040, 0x40e1,
-       0x78b8, 0x801b, 0x00c8, 0x40dd, 0x8000, 0xa084, 0x003f, 0x00c0,
-       0x4101, 0xc6f4, 0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108,
-       0x00c8, 0x40ec, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade,
-       0x1078, 0x4a44, 0x781b, 0x0076, 0xb284, 0x0300, 0x0040, 0x40fc,
-       0x2001, 0x0000, 0x0078, 0x40fe, 0x2001, 0x0001, 0x1078, 0x48ce,
-       0x007c, 0x781b, 0x0076, 0x007c, 0x781b, 0x0079, 0x007c, 0x1078,
-       0x412f, 0x781b, 0x0078, 0x007c, 0x1078, 0x4118, 0x781b, 0x0078,
-       0x007c, 0x6827, 0x0002, 0x1078, 0x4120, 0x781b, 0x0078, 0x007c,
-       0x2001, 0x0005, 0x0078, 0x4131, 0x2001, 0x000c, 0x0078, 0x4131,
-       0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0078, 0x4131, 0x2001,
-       0x000d, 0x0078, 0x4131, 0x2001, 0x0009, 0x0078, 0x4131, 0x2001,
-       0x0007, 0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d4, 0xd0b4,
-       0x0040, 0x4147, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008,
-       0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c,
-       0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0x017e,
-       0xb28c, 0x0300, 0x0040, 0x4158, 0xa0e0, 0x53c0, 0x0078, 0x415a,
-       0xa0e0, 0x5440, 0x017f, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184,
-       0x000f, 0x0040, 0x416a, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004,
-       0xc09d, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040,
-       0x0040, 0x417a, 0xa184, 0xffbf, 0xc0fd, 0x78a6, 0x6016, 0x6004,
-       0xc0a5, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001,
-       0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab,
-       0x0004, 0x70d4, 0xd0b4, 0x0040, 0x419a, 0xc0b4, 0x70d6, 0x0c7e,
-       0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
-       0x601a, 0x0c7f, 0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b,
-       0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
-       0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x70d4, 0xd0b4, 0x0040,
-       0x41be, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084,
-       0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c, 0x157e,
-       0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a,
-       0x79a4, 0xa18c, 0xfff0, 0x2021, 0x4233, 0x2019, 0x0011, 0x20a9,
-       0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040,
-       0x41de, 0x8420, 0x2300, 0xa210, 0x00f0, 0x41d3, 0x157f, 0x007c,
-       0x157e, 0x2001, 0x4f05, 0x2004, 0xd0e4, 0x00c0, 0x4211, 0x2021,
-       0x4241, 0x20a9, 0x0009, 0x2011, 0x0028, 0xa582, 0x0019, 0x0040,
-       0x4227, 0x0048, 0x4227, 0x8420, 0x95a9, 0x2011, 0x0032, 0xa582,
-       0x0032, 0x0040, 0x4227, 0x0048, 0x4227, 0x8420, 0x95a9, 0x2019,
-       0x000a, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x4227, 0x0048,
-       0x4227, 0x8420, 0x2300, 0xa210, 0x00f0, 0x4203, 0x157f, 0x0078,
-       0x4225, 0x2021, 0x4233, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
-       0x0032, 0x2200, 0xa502, 0x0040, 0x4227, 0x0048, 0x4227, 0x8420,
-       0x2300, 0xa210, 0x00f0, 0x4219, 0x157f, 0xa006, 0x007c, 0x157f,
-       0xa582, 0x0064, 0x00c8, 0x4230, 0x7808, 0xa085, 0x0070, 0x780a,
-       0x2404, 0xa005, 0x007c, 0x1209, 0x3002, 0x3202, 0x4203, 0x4403,
-       0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07,
-       0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07,
-       0x7e07, 0x0e00, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00,
-       0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
-       0xd7fc, 0x0040, 0x425f, 0xa0e0, 0x74c0, 0x0078, 0x4261, 0xa0e0,
-       0x54c0, 0x007c, 0x0e7e, 0x0f7e, 0xd084, 0x0040, 0x426f, 0x2079,
-       0x0100, 0x2009, 0x4f80, 0x2071, 0x4f80, 0x0078, 0x427f, 0x2009,
-       0x4f40, 0x2071, 0x4f40, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x0040,
-       0x427d, 0x2079, 0x0100, 0x0078, 0x427f, 0x2079, 0x0200, 0x2091,
-       0x8000, 0x2104, 0xa084, 0x000f, 0x0079, 0x4286, 0x4290, 0x4290,
-       0x4290, 0x4290, 0x4290, 0x4290, 0x428e, 0x428e, 0x1078, 0x29b2,
-       0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0040, 0x42df,
-       0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086,
-       0x1814, 0x00c0, 0x42df, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
-       0x00c0, 0x42a5, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0,
-       0x42ac, 0x7830, 0xd0bc, 0x00c0, 0x42df, 0x007e, 0x2001, 0x4f04,
-       0x2004, 0xd0ec, 0x007f, 0x0040, 0x42c1, 0xb284, 0x0300, 0x0078,
-       0x42c3, 0xb284, 0x0400, 0x0040, 0x42c9, 0x0018, 0x42df, 0x0078,
-       0x42cb, 0x0028, 0x42df, 0x79e4, 0xa184, 0x0030, 0x0040, 0x42df,
-       0x78ec, 0xa084, 0x0003, 0x0040, 0x42df, 0x681c, 0xd0ac, 0x00c0,
-       0x42dd, 0x1078, 0x4369, 0x0078, 0x42df, 0x781b, 0x00f9, 0x0f7f,
-       0x0e7f, 0x007c, 0x0c7e, 0x2001, 0x4f01, 0x2004, 0xd0ac, 0x00c0,
-       0x435b, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
-       0xb28c, 0x0300, 0x0040, 0x42f8, 0xa0e0, 0x53c0, 0x0078, 0x42fa,
-       0xa0e0, 0x5440, 0x6004, 0xa084, 0x000a, 0x00c0, 0x435b, 0x6108,
-       0xa194, 0xff00, 0x0040, 0x435b, 0xa18c, 0x00ff, 0x2001, 0x000a,
-       0xa106, 0x0040, 0x4326, 0x2001, 0x000c, 0xa106, 0x0040, 0x432a,
-       0x2001, 0x0012, 0xa106, 0x0040, 0x432e, 0x2001, 0x0014, 0xa106,
-       0x0040, 0x4332, 0x2001, 0x0019, 0xa106, 0x0040, 0x4336, 0x2001,
-       0x0032, 0xa106, 0x0040, 0x433a, 0x0078, 0x433e, 0x2009, 0x000c,
-       0x0078, 0x4340, 0x2009, 0x0012, 0x0078, 0x4340, 0x2009, 0x0014,
-       0x0078, 0x4340, 0x2009, 0x0019, 0x0078, 0x4340, 0x2009, 0x0020,
-       0x0078, 0x4340, 0x2009, 0x003f, 0x0078, 0x4340, 0x2011, 0x0000,
-       0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x2061,
-       0x4f00, 0x6004, 0xd0bc, 0x0040, 0x435b, 0x6814, 0xd0fc, 0x00c0,
-       0x4356, 0x60ea, 0x2061, 0x4f40, 0x0078, 0x4359, 0x60ee, 0x2061,
-       0x4f80, 0x601f, 0x800f, 0x0c7f, 0x007c, 0x781b, 0x0079, 0x007c,
-       0x781b, 0x0078, 0x007c, 0x781b, 0x0067, 0x007c, 0x781b, 0x0064,
-       0x007c, 0x2009, 0x4f19, 0x210c, 0xa186, 0x0000, 0x0040, 0x437b,
-       0xa186, 0x0001, 0x0040, 0x437e, 0x701f, 0x000b, 0x7067, 0x0001,
-       0x781b, 0x0047, 0x007c, 0x781b, 0x00f0, 0x007c, 0x701f, 0x000a,
-       0x007c, 0x2009, 0x4f19, 0x210c, 0xa186, 0x0000, 0x0040, 0x4396,
-       0xa186, 0x0001, 0x0040, 0x4393, 0x701f, 0x000b, 0x7067, 0x0001,
-       0x781b, 0x0047, 0x007c, 0x701f, 0x000a, 0x007c, 0x781b, 0x00ef,
-       0x007c, 0x781b, 0x00f9, 0x007c, 0x781b, 0x00f8, 0x007c, 0x781b,
-       0x00c9, 0x007c, 0x781b, 0x00c8, 0x007c, 0x6818, 0xd0fc, 0x0040,
-       0x43ab, 0x681b, 0x001d, 0x7067, 0x0001, 0x781b, 0x0047, 0x007c,
-       0x7830, 0xa084, 0x00c0, 0x00c0, 0x43d2, 0x7808, 0xc08c, 0x780a,
-       0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x00c0,
-       0x43cf, 0x2001, 0x4f05, 0x2004, 0xd0e4, 0x00c0, 0x43cd, 0x7804,
-       0xa084, 0xff1f, 0xa085, 0x00e0, 0x7806, 0xa006, 0x007c, 0x7808,
-       0xc08d, 0x780a, 0x007c, 0x7808, 0xc08d, 0x780a, 0x007c, 0x7830,
-       0xa084, 0x0040, 0x00c0, 0x43d7, 0x2001, 0x4f04, 0x2004, 0xd0ec,
-       0x0040, 0x43e6, 0xb284, 0x0300, 0x0078, 0x43e8, 0xb284, 0x0400,
-       0x0040, 0x43ee, 0x0098, 0x43f2, 0x0078, 0x43f0, 0x00a8, 0x43f2,
-       0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005,
-       0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x4415, 0x007e,
-       0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x440b, 0xb284,
-       0x0300, 0x0078, 0x440d, 0xb284, 0x0400, 0x0040, 0x4413, 0x0098,
-       0x440f, 0x0078, 0x4415, 0x00a8, 0x4413, 0x78ac, 0x007e, 0x7808,
-       0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0001, 0x00c0,
-       0x37b9, 0xa784, 0x0070, 0x0040, 0x442d, 0x0c7e, 0x2d60, 0x2f68,
-       0x1078, 0x2926, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
-       0x443a, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x37b9,
-       0x0078, 0x435d, 0xa784, 0x0004, 0x0040, 0x4469, 0x78b8, 0xa084,
-       0x4001, 0x0040, 0x4469, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x37b9, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
-       0x4469, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00f9,
-       0x007c, 0x784b, 0x0008, 0x6818, 0xd0fc, 0x0040, 0x4466, 0x681b,
-       0x0015, 0xd6f4, 0x0040, 0x4466, 0x681b, 0x0007, 0x1078, 0x4369,
-       0x007c, 0x681b, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f,
-       0x0000, 0x6833, 0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x30af, 0x007e, 0x2001, 0x4f04, 0x2004, 0xd0ec, 0x007f,
-       0x0040, 0x4486, 0xb284, 0x0300, 0x0078, 0x4488, 0xb284, 0x0400,
-       0x0040, 0x448e, 0x0018, 0x2a08, 0x0078, 0x4490, 0x0028, 0x2a08,
-       0x0078, 0x410c, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
-       0x8003, 0xd3fc, 0x0040, 0x44a0, 0xa080, 0x5440, 0x0078, 0x44a2,
-       0xa080, 0x53c0, 0x2060, 0x2048, 0x705a, 0x2a60, 0x007c, 0x0020,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
-       0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9848, 0x0014, 0x0014,
-       0x9914, 0x98fd, 0x0014, 0x0014, 0x0080, 0x00ff, 0x0100, 0x0402,
-       0x2008, 0xf880, 0x0018, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014,
-       0x2500, 0x0013, 0x2500, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
-       0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
-       0x0010, 0xa200, 0x3806, 0x7102, 0x805f, 0x9481, 0x8839, 0x20c4,
-       0x0864, 0xa856, 0x3008, 0x28c1, 0x9d1b, 0xa201, 0x300c, 0x2847,
-       0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2,
-       0x9ccb, 0xa8f3, 0x0864, 0xa844, 0x300c, 0xa801, 0x3008, 0x28e1,
-       0x9ccb, 0x2021, 0xa81d, 0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0,
-       0x6fc0, 0x63a4, 0x6c80, 0x0212, 0xa205, 0x883d, 0x7942, 0x8020,
-       0xa4a1, 0x882b, 0x1814, 0x883b, 0x80df, 0x94a1, 0x7027, 0x85f2,
-       0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa816, 0x883e, 0xa814,
-       0x2001, 0xa812, 0xa204, 0x64c0, 0x6de0, 0x67a0, 0x6fc0, 0x7942,
-       0x8020, 0xa4a1, 0x1814, 0x80df, 0x94a1, 0x883b, 0x7023, 0x8576,
-       0x8677, 0xa802, 0x7861, 0x883e, 0x206b, 0x28c1, 0x9d1b, 0x2044,
-       0x2103, 0x20a2, 0x2081, 0xa8c3, 0xa207, 0x0904, 0xa20e, 0xa809,
-       0xa203, 0x8000, 0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601,
-       0xa208, 0x856e, 0x866f, 0x7161, 0x0014, 0x0704, 0x3008, 0x9ccb,
-       0x0014, 0xa202, 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf844,
-       0x856e, 0x883f, 0x08e6, 0xa8f5, 0xf861, 0xa8ea, 0xf801, 0x0014,
-       0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014,
-       0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014,
-       0x3008, 0x8000, 0x284a, 0x1011, 0xa8fc, 0x3008, 0x9d33, 0x8000,
-       0xa000, 0x2802, 0x1011, 0xa8fd, 0x9d39, 0xa8bd, 0x3008, 0x9d33,
-       0x283b, 0x1011, 0xa8fd, 0xa209, 0x7102, 0x805f, 0x9481, 0x0017,
-       0x300c, 0xa209, 0x8000, 0x85a4, 0x1de2, 0xa209, 0xdac1, 0x0014,
-       0x0210, 0xa801, 0x0014, 0x26e0, 0x873a, 0xfaa3, 0x19f2, 0x26e0,
-       0x18f2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9d25,
-       0x0704, 0xa206, 0x6865, 0x817e, 0x842a, 0x1dc1, 0x8823, 0x0016,
-       0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf021,
-       0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d4, 0x8822,
-       0x0016, 0x7944, 0x8421, 0xa020, 0xa532, 0x84a1, 0x0016, 0x7944,
-       0x8421, 0xa0df, 0x9532, 0x84a1, 0x0016, 0x0000, 0x127e, 0x70d4,
-       0xa084, 0x4600, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205,
-       0x00c0, 0x4602, 0x720c, 0x82ff, 0x0040, 0x45ed, 0x8aff, 0x00c0,
-       0x4602, 0x7200, 0xd284, 0x00c0, 0x4602, 0x7804, 0xd0cc, 0x0040,
-       0x45f3, 0x1078, 0x4acc, 0x7023, 0x0000, 0x7027, 0x0000, 0x7000,
-       0xd084, 0x0040, 0x45fd, 0x7007, 0x0004, 0x7003, 0x0008, 0x127f,
-       0x2000, 0x007c, 0x7000, 0xa084, 0x0003, 0x7002, 0xc69c, 0xd084,
-       0x0040, 0x465b, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x460a,
-       0xa184, 0x0003, 0x0040, 0x468c, 0xa184, 0x01e0, 0x00c0, 0x468c,
-       0xd1f4, 0x00c0, 0x460a, 0xa184, 0x3000, 0xa086, 0x1000, 0x0040,
-       0x460a, 0x2001, 0x4f05, 0x2004, 0xd0e4, 0x0040, 0x4637, 0x2011,
-       0x0180, 0x710c, 0x8211, 0x0040, 0x4645, 0x7008, 0xd0f4, 0x00c0,
-       0x460a, 0x700c, 0xa106, 0x0040, 0x462a, 0x0078, 0x4627, 0x2011,
-       0x0180, 0x710c, 0x8211, 0x0040, 0x4645, 0x7008, 0xd0f4, 0x00c0,
-       0x460a, 0x700c, 0xa106, 0x0040, 0x463a, 0x7007, 0x0012, 0x7108,
-       0x0005, 0x7008, 0xa106, 0x00c0, 0x4647, 0xa184, 0x0003, 0x0040,
-       0x468c, 0xd194, 0x0040, 0x4647, 0xd1f4, 0x0040, 0x468c, 0x7007,
-       0x0002, 0x0078, 0x460a, 0x7108, 0xd1fc, 0x0040, 0x4666, 0x1078,
-       0x47ed, 0x8aff, 0x0040, 0x45dc, 0x0078, 0x465b, 0x700c, 0xa08c,
-       0x03ff, 0x0040, 0x4691, 0x7004, 0xd084, 0x0040, 0x4683, 0x7014,
-       0xa005, 0x00c0, 0x467f, 0x7010, 0x7310, 0xa306, 0x00c0, 0x4673,
-       0x2300, 0xa005, 0x0040, 0x4683, 0xa102, 0x00c8, 0x465b, 0x7007,
-       0x0010, 0x0078, 0x468c, 0x8aff, 0x0040, 0x4691, 0x1078, 0x49f2,
-       0x00c0, 0x4686, 0x0040, 0x465b, 0x1078, 0x4738, 0x127f, 0x2000,
-       0x007c, 0x7204, 0x7108, 0xc19c, 0x8103, 0x00c8, 0x46a0, 0x7007,
-       0x0002, 0x0078, 0x4691, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c,
-       0xa205, 0x00c0, 0x468c, 0x7023, 0x0000, 0x7027, 0x0000, 0x7003,
-       0x0008, 0x007e, 0x2001, 0x4f01, 0x2004, 0xd0cc, 0x0040, 0x46b2,
-       0x1078, 0x4acc, 0x007f, 0x127f, 0x2000, 0x007c, 0x6428, 0x84ff,
-       0x0040, 0x46e2, 0x2c70, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x46f2,
-       0x273c, 0x87fb, 0x00c0, 0x46d0, 0x0048, 0x46c8, 0x1078, 0x29b2,
-       0x609c, 0xa075, 0x0040, 0x46e2, 0x0078, 0x46bb, 0x2039, 0x46e7,
-       0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0040,
-       0x46e2, 0x8738, 0x2704, 0xa005, 0x00c0, 0x46d1, 0x709c, 0xa075,
-       0x00c0, 0x46bb, 0x007c, 0x0000, 0x0005, 0x0009, 0x000d, 0x0011,
-       0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009, 0x000f, 0x0015,
-       0x001b, 0x0000, 0x0000, 0x46e7, 0x46e4, 0x0000, 0x0000, 0x8000,
-       0x0000, 0x46e7, 0x0000, 0x46ef, 0x46ec, 0x0000, 0x0000, 0x0000,
-       0x0000, 0x46ef, 0x0000, 0x46ea, 0x46ea, 0x0000, 0x0000, 0x8000,
-       0x0000, 0x46ea, 0x0000, 0x46f0, 0x46f0, 0x0000, 0x0000, 0x0000,
-       0x0000, 0x46f0, 0x2079, 0x4f00, 0x2071, 0x0010, 0x7007, 0x000a,
-       0x7007, 0x0002, 0x7003, 0x0001, 0x7810, 0xd0ec, 0x0040, 0x4726,
-       0x2009, 0x0001, 0x2071, 0x0020, 0x0078, 0x472a, 0x2009, 0x0002,
-       0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000,
-       0x8109, 0x0040, 0x4737, 0x2071, 0x0020, 0x0078, 0x472a, 0x007c,
-       0x7004, 0x8004, 0x00c8, 0x47c1, 0x7108, 0x7008, 0xa106, 0x00c0,
-       0x473c, 0xa184, 0x01e0, 0x0040, 0x4749, 0x1078, 0x4830, 0x0078,
-       0x47e9, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108, 0x7008, 0xa106,
-       0x00c0, 0x474d, 0xa184, 0x01e0, 0x0040, 0x475a, 0x1078, 0x4830,
-       0x0078, 0x47e9, 0x7810, 0xd0ec, 0x0040, 0x4774, 0x2001, 0x04fd,
-       0x2004, 0xa086, 0x0003, 0x00c0, 0x4778, 0xa184, 0x4000, 0x0040,
-       0x477c, 0xa382, 0x0003, 0x00c8, 0x477c, 0xa184, 0x0004, 0x0040,
-       0x474d, 0x8318, 0x0078, 0x474d, 0x7814, 0xd0ec, 0x00c0, 0x477c,
-       0xa184, 0x4000, 0x00c0, 0x474d, 0xa19c, 0x300c, 0xa386, 0x2004,
-       0x0040, 0x4799, 0xa386, 0x0008, 0x0040, 0x47a4, 0x7004, 0xd084,
-       0x00c0, 0x4795, 0x7108, 0x7008, 0xa106, 0x00c0, 0x478a, 0xa184,
-       0x0003, 0x0040, 0x4795, 0x0078, 0x4830, 0xa386, 0x200c, 0x00c0,
-       0x474d, 0x7200, 0x8204, 0x0048, 0x47a4, 0x730c, 0xa384, 0x03ff,
-       0x0040, 0x47a4, 0x1078, 0x29b2, 0x7108, 0x7008, 0xa106, 0x00c0,
-       0x47a4, 0xa184, 0x01e0, 0x0040, 0x47b1, 0x1078, 0x4830, 0x0078,
-       0x47e9, 0x7007, 0x0012, 0x7000, 0xd084, 0x00c0, 0x47c1, 0x7310,
-       0x7014, 0xa305, 0x0040, 0x47c1, 0x710c, 0xa184, 0x03ff, 0x00c0,
-       0x4738, 0x7108, 0x7008, 0xa106, 0x00c0, 0x47c1, 0xa184, 0x01e0,
-       0x0040, 0x47ce, 0x1078, 0x4830, 0x0078, 0x47e9, 0x7007, 0x0012,
-       0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x47d2, 0x7108, 0x7008,
-       0xa106, 0x00c0, 0x47d6, 0xa184, 0x01e0, 0x0040, 0x47e3, 0x1078,
-       0x4830, 0x0078, 0x47e9, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048,
-       0x47d6, 0x7003, 0x0008, 0x007c, 0x7108, 0xa184, 0x01e0, 0x00c0,
-       0x4830, 0x7108, 0xa184, 0x01e0, 0x00c0, 0x4830, 0xa184, 0x0007,
-       0x0079, 0x47fa, 0x4804, 0x4814, 0x4802, 0x4814, 0x4802, 0x4872,
-       0x4802, 0x4870, 0x1078, 0x29b2, 0x7004, 0xa084, 0x0010, 0xc08d,
-       0x7006, 0x8aff, 0x00c0, 0x480f, 0x2049, 0x0000, 0x007c, 0x1078,
-       0x49f2, 0x00c0, 0x480f, 0x007c, 0x7004, 0xa084, 0x0010, 0xc08d,
-       0x7006, 0x7004, 0xd084, 0x00c0, 0x4828, 0x7108, 0x7008, 0xa106,
-       0x00c0, 0x481d, 0xa184, 0x0003, 0x0040, 0x4828, 0x0078, 0x4830,
-       0x8aff, 0x0040, 0x482f, 0x1078, 0x49f2, 0x00c0, 0x482b, 0x007c,
-       0x7007, 0x0012, 0x7108, 0x00e0, 0x4833, 0x2091, 0x6000, 0x00e0,
-       0x4837, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
-       0xd09c, 0x00c0, 0x483f, 0x7007, 0x0012, 0x7108, 0xd1fc, 0x00c0,
-       0x4843, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x4857, 0x7004,
-       0xa005, 0x00c0, 0x4857, 0x700c, 0xa005, 0x0040, 0x4859, 0x0078,
-       0x483b, 0x2049, 0x0000, 0xb284, 0x0100, 0x0040, 0x4863, 0x2001,
-       0x0000, 0x0078, 0x4865, 0x2001, 0x0001, 0x1078, 0x4262, 0x681b,
-       0x0002, 0x2051, 0x0000, 0x007c, 0x1078, 0x29b2, 0x1078, 0x29b2,
-       0x1078, 0x48b9, 0x7210, 0x7114, 0x700c, 0xa09c, 0x03ff, 0x2800,
-       0xa300, 0xa211, 0xa189, 0x0000, 0x1078, 0x48b9, 0x2704, 0x2c58,
-       0xac60, 0x6308, 0x2200, 0xa322, 0x630c, 0x2100, 0xa31b, 0x2400,
-       0xa305, 0x0040, 0x4895, 0x00c8, 0x4895, 0x8412, 0x8210, 0x830a,
-       0xa189, 0x0000, 0x2b60, 0x0078, 0x487c, 0x2b60, 0x8a07, 0x007e,
-       0x6004, 0xd09c, 0x0040, 0x48a0, 0xa7ba, 0x46ec, 0x0078, 0x48a2,
-       0xa7ba, 0x46e4, 0x007f, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92,
-       0x6b8e, 0x7108, 0x7008, 0xa106, 0x00c0, 0x48a9, 0xa184, 0x01e0,
-       0x0040, 0x48b4, 0x1078, 0x4830, 0x7007, 0x0012, 0x1078, 0x4738,
-       0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x48cd, 0x6000,
-       0xa064, 0x00c0, 0x48c4, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080,
-       0x4702, 0x203c, 0x87fb, 0x1040, 0x29b2, 0x007c, 0x127e, 0x0d7e,
-       0x70d4, 0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060,
-       0x6888, 0x6b8c, 0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff,
-       0x007e, 0x6804, 0xa084, 0x0008, 0x007f, 0x0040, 0x48eb, 0xa0b8,
-       0x46ec, 0x0078, 0x48ed, 0xa0b8, 0x46e4, 0xb284, 0x0100, 0x0040,
-       0x48f4, 0x7e20, 0x0078, 0x48f5, 0x7e24, 0xa6b5, 0x000c, 0x681c,
-       0xd0b4, 0x0040, 0x48fc, 0xc685, 0x2400, 0xa305, 0x0040, 0x4925,
-       0x2c58, 0x2704, 0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004,
-       0xa301, 0x701e, 0xd19c, 0x0040, 0x4915, 0x6010, 0xa081, 0x0000,
-       0x7022, 0x6014, 0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202,
-       0x7012, 0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001,
-       0x2b60, 0x1078, 0x4a1c, 0x0078, 0x4927, 0x1078, 0x49f2, 0x00c0,
-       0x4925, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084,
-       0x4600, 0x8004, 0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094,
-       0x00c0, 0x4936, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e,
-       0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f,
-       0x0d7f, 0x7e20, 0xb284, 0x0100, 0x00c0, 0x494f, 0x7e24, 0xa6b5,
-       0x000c, 0x681c, 0xd0ac, 0x00c0, 0x495a, 0xc685, 0x7003, 0x0000,
-       0x7007, 0x0004, 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f,
-       0xa7b8, 0x46f2, 0x273c, 0x87fb, 0x00c0, 0x4970, 0x0048, 0x496a,
-       0x1078, 0x29b2, 0x689c, 0xa065, 0x0040, 0x4974, 0x0078, 0x495d,
-       0x1078, 0x49f2, 0x00c0, 0x4970, 0x127f, 0x2000, 0x007c, 0x127e,
-       0x007e, 0x017e, 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x007e,
-       0x2090, 0x007f, 0x7e20, 0xb284, 0x0100, 0x00c0, 0x4988, 0x7e24,
-       0x0d7f, 0x037f, 0x047f, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040,
-       0x4996, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004, 0x2049, 0x4977,
-       0x6828, 0xa055, 0x0d7e, 0x0040, 0x49ee, 0x2d70, 0x2e60, 0x7004,
-       0xa0bc, 0x000f, 0xa7b8, 0x46f2, 0x273c, 0x87fb, 0x00c0, 0x49b3,
-       0x0048, 0x49ac, 0x1078, 0x29b2, 0x709c, 0xa075, 0x2060, 0x0040,
-       0x49ee, 0x0078, 0x499f, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c,
-       0xa31b, 0x0048, 0x49cc, 0x8a51, 0x00c0, 0x49c0, 0x1078, 0x29b2,
-       0x8738, 0x2704, 0xa005, 0x00c0, 0x49b4, 0x709c, 0xa075, 0x2060,
-       0x0040, 0x49ee, 0x0078, 0x499f, 0x8422, 0x8420, 0x831a, 0xa399,
-       0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8,
-       0x49db, 0x1078, 0x29b2, 0xb284, 0x0100, 0x0040, 0x49e9, 0x2001,
-       0x4f04, 0x2004, 0xd0ec, 0x00c0, 0x49e9, 0x2071, 0x0050, 0x0078,
-       0x49eb, 0x2071, 0x0020, 0x0d7f, 0x0078, 0x48fc, 0x0d7f, 0x127f,
-       0x2000, 0x007c, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040,
-       0x49fb, 0xa006, 0x007c, 0xa084, 0x0003, 0xa086, 0x0003, 0x00c0,
-       0x4a02, 0x007c, 0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e,
-       0x7808, 0x7012, 0x780c, 0x7016, 0x6004, 0xd09c, 0x0040, 0x4a14,
-       0x7810, 0x7022, 0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010,
-       0xc085, 0x7006, 0x2079, 0x4f00, 0x8738, 0x8a51, 0x0040, 0x4a40,
-       0x2704, 0xa005, 0x00c0, 0x4a32, 0x609c, 0xa005, 0x0040, 0x4a41,
-       0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x46f2, 0x203c, 0x87fb,
-       0x1040, 0x29b2, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040,
-       0x4a3c, 0xa006, 0x0078, 0x4a41, 0xa084, 0x0003, 0xa086, 0x0003,
-       0x007c, 0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x70d4,
-       0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, 0xa184,
-       0x0003, 0x00c0, 0x4a59, 0x6828, 0xa005, 0x0040, 0x4a69, 0x0078,
-       0x4602, 0x7108, 0xd1fc, 0x0040, 0x4a61, 0x1078, 0x47ed, 0x0078,
-       0x4a4e, 0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x4a63, 0x1078,
-       0x47ed, 0x7008, 0xa086, 0x0008, 0x00c0, 0x4a4e, 0x7000, 0xa005,
-       0x00c0, 0x4a4e, 0x7003, 0x0000, 0x2049, 0x0000, 0x007e, 0x7804,
-       0xd0cc, 0x0040, 0x4a7d, 0x1078, 0x4acc, 0x007f, 0x127f, 0x2000,
-       0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x70d4,
-       0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x4a81, 0xad80,
-       0x0011, 0x20a0, 0xb284, 0x0100, 0x0040, 0x4aa4, 0x2001, 0x4f04,
-       0x2004, 0xd0ec, 0x0040, 0x4aa0, 0x2099, 0x0031, 0x0078, 0x4aa6,
-       0x2099, 0x0032, 0x0078, 0x4aa6, 0x2099, 0x0031, 0x700c, 0xa084,
-       0x03ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001,
-       0x0040, 0x4ab5, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x03ff,
-       0x0040, 0x4ac1, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
-       0x4abc, 0x0c7f, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f,
-       0x147f, 0x127f, 0x2000, 0x007c, 0x6814, 0xd0fc, 0x0040, 0x4b11,
-       0x7000, 0xd084, 0x0040, 0x4b11, 0x7e24, 0xa6b5, 0x0004, 0x7007,
-       0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4ad9, 0x7118, 0x017e,
-       0x711c, 0x017e, 0x7120, 0x017e, 0x7124, 0x017e, 0xa00e, 0x711a,
-       0x701f, 0x3fff, 0x7122, 0x7126, 0x7013, 0x0004, 0x7116, 0x7602,
-       0x7007, 0x0001, 0x2001, 0xffff, 0x2009, 0x0031, 0x200a, 0x200a,
-       0x7108, 0x7008, 0xa106, 0x00c0, 0x4af8, 0xd1fc, 0x0040, 0x4af8,
-       0x027f, 0x7226, 0x027f, 0x7222, 0x027f, 0x721e, 0x027f, 0x721a,
-       0x7007, 0x0002, 0x7008, 0xa086, 0x0008, 0x0040, 0x4b11, 0x0078,
-       0x4830, 0x7007, 0x0004, 0x7003, 0x0000, 0x007c, 0x2091, 0x8000,
-       0x2091, 0x6000, 0x78ac, 0xa005, 0x00c0, 0x4b2d, 0x7974, 0x70d0,
-       0xa106, 0x00c0, 0x4b2d, 0x781c, 0xa005, 0x0040, 0x4b2d, 0x781f,
-       0x0000, 0x0068, 0x4b2d, 0x2091, 0x4080, 0x7830, 0x8001, 0x7832,
-       0x00c0, 0x4bb5, 0x7834, 0x7832, 0x7810, 0xd0ec, 0x00c0, 0x4bae,
-       0x2061, 0x74c0, 0x2069, 0x4f80, 0xc7fd, 0x68d0, 0xa005, 0x0040,
-       0x4b47, 0x8001, 0x68d2, 0x00c0, 0x4b47, 0x1078, 0x4d83, 0x6800,
-       0xa084, 0x000f, 0x0040, 0x4b5c, 0xa086, 0x0001, 0x0040, 0x4b5c,
-       0x6844, 0xa00d, 0x0040, 0x4b5c, 0x2104, 0xa005, 0x0040, 0x4b5c,
-       0x8001, 0x200a, 0x0040, 0x4cf6, 0x6814, 0xa005, 0x0040, 0x4b81,
-       0x8001, 0x6816, 0x00c0, 0x4b81, 0x68a7, 0x0001, 0x0f7e, 0xd7fc,
-       0x00c0, 0x4b76, 0x7810, 0xd0ec, 0x0040, 0x4b72, 0x2079, 0x0100,
-       0x0078, 0x4b78, 0x2079, 0x0200, 0x0078, 0x4b78, 0x2079, 0x0100,
-       0x1078, 0x43d3, 0x0f7f, 0x6864, 0xa005, 0x0040, 0x4b81, 0x1078,
-       0x266f, 0x6880, 0xa005, 0x0040, 0x4b8e, 0x8001, 0x6882, 0x00c0,
-       0x4b8e, 0x6867, 0x0000, 0x68d4, 0xc0dd, 0x68d6, 0x68d4, 0xd0fc,
-       0x0040, 0x4bab, 0xc0fc, 0x68d6, 0x20a9, 0x0200, 0x6034, 0xa005,
-       0x0040, 0x4ba7, 0x8001, 0x6036, 0x68d4, 0xc0fd, 0x68d6, 0x00c0,
-       0x4ba7, 0x6010, 0xa005, 0x0040, 0x4ba7, 0x1078, 0x266f, 0xace0,
-       0x0010, 0x00f0, 0x4b96, 0xd7fc, 0x0040, 0x4bb5, 0x2061, 0x54c0,
-       0x2069, 0x4f40, 0xc7fc, 0x0078, 0x4b3d, 0x1078, 0x4bf1, 0x7838,
-       0x8001, 0x783a, 0x00c0, 0x4bd7, 0x783c, 0x783a, 0x2061, 0x54c0,
-       0x2069, 0x4f40, 0xc7fc, 0x680c, 0xa005, 0x0040, 0x4bc9, 0x1078,
-       0x4c5b, 0xd7fc, 0x00c0, 0x4bd7, 0x7810, 0xd0ec, 0x00c0, 0x4bd7,
-       0x2061, 0x74c0, 0x2069, 0x4f80, 0xc7fd, 0x0078, 0x4bc3, 0x7814,
-       0xd0e4, 0x00c0, 0x4bdb, 0x7810, 0xd0cc, 0x0040, 0x4bee, 0xd0ac,
-       0x00c0, 0x4be7, 0xd0a4, 0x0040, 0x4bee, 0xc0ad, 0x7812, 0x2091,
-       0x8001, 0x0068, 0x4bed, 0x1078, 0x23dc, 0x007c, 0x2091, 0x8001,
-       0x007c, 0x7840, 0x8001, 0x7842, 0x00c0, 0x4c5a, 0x7844, 0x7842,
-       0x2069, 0x4f40, 0xc7fc, 0x7810, 0x2079, 0x0200, 0xd0ec, 0x0040,
-       0x4c03, 0x2079, 0x0100, 0x68d8, 0xa005, 0x0040, 0x4c0f, 0x7de0,
-       0xa504, 0x00c0, 0x4c0f, 0x68da, 0x68d4, 0xc0bc, 0x68d6, 0x2079,
-       0x4f00, 0x6810, 0xa005, 0x00c0, 0x4c17, 0x2001, 0x0101, 0x8001,
-       0x6812, 0xd7fc, 0x0040, 0x4c20, 0xa080, 0x95d0, 0x0078, 0x4c22,
-       0xa080, 0x94c0, 0x2040, 0x2004, 0xa065, 0x0040, 0x4c4c, 0x6024,
-       0xa005, 0x0040, 0x4c48, 0x8001, 0x6026, 0x00c0, 0x4c48, 0x6800,
-       0xa005, 0x0040, 0x4c3b, 0x684c, 0xac06, 0x00c0, 0x4c3b, 0x1078,
-       0x4cf6, 0x0078, 0x4c4c, 0x6864, 0xa005, 0x0040, 0x4c43, 0x6027,
-       0x0001, 0x0078, 0x4c48, 0x1078, 0x4ca9, 0x2804, 0x0078, 0x4c24,
-       0x6000, 0x2c40, 0x0078, 0x4c24, 0xd7fc, 0x00c0, 0x4c5a, 0x7810,
-       0xd0ec, 0x00c0, 0x4c5a, 0x2069, 0x4f80, 0xc7fd, 0x2079, 0x0100,
-       0x0078, 0x4c03, 0x007c, 0x2009, 0x0000, 0x20a9, 0x0200, 0x6008,
-       0xd09c, 0x0040, 0x4c95, 0x6024, 0xa005, 0x0040, 0x4c6b, 0x8001,
-       0x6026, 0x0078, 0x4c93, 0x6008, 0xc09c, 0xd084, 0x00c0, 0x4c73,
-       0xd0ac, 0x0040, 0x4c8d, 0x600a, 0x6004, 0xa005, 0x0040, 0x4c95,
-       0x0d7e, 0x0c7e, 0x017e, 0x2068, 0x6010, 0x8001, 0x6012, 0x1078,
-       0x3e19, 0x2d00, 0x2c68, 0x2060, 0x1078, 0x1ea2, 0x1078, 0x2064,
-       0x017f, 0x0c7f, 0x0d7f, 0x0078, 0x4c95, 0xc0bd, 0x600a, 0xa18d,
-       0x0001, 0x0078, 0x4c95, 0xa18d, 0x0100, 0xace0, 0x0010, 0x00f0,
-       0x4c5f, 0xa184, 0x0001, 0x0040, 0x4ca4, 0xa18c, 0xfffe, 0x690e,
-       0x1078, 0x266f, 0x0078, 0x4ca5, 0x690e, 0x007c, 0x00c0, 0x4ca5,
-       0x786c, 0x2c00, 0x687e, 0x6714, 0x6f76, 0x6017, 0x0000, 0x602b,
-       0x0000, 0x601b, 0x0006, 0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020,
-       0xa084, 0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x1078,
-       0x1e2b, 0x6818, 0xa005, 0x0040, 0x4cc7, 0x8001, 0x681a, 0x6808,
-       0xc0a4, 0x680a, 0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x00d0,
-       0x4cd3, 0x1078, 0x29b2, 0x6812, 0x00c0, 0x4cd9, 0x7910, 0xc1a5,
-       0x7912, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x2073,
-       0xd7fc, 0x00c0, 0x4ce7, 0x2069, 0x4f40, 0x0078, 0x4ce9, 0x2069,
-       0x4f80, 0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x00c0, 0x4cf3,
-       0x697a, 0x2001, 0x0004, 0x1078, 0x2663, 0x007c, 0x0d7e, 0x694c,
-       0x2160, 0xd7fc, 0x00c0, 0x4d08, 0x7810, 0xd0ec, 0x0040, 0x4d04,
-       0x2069, 0x0100, 0x0078, 0x4d0a, 0x2069, 0x0200, 0x0078, 0x4d0a,
-       0x2069, 0x0100, 0x1078, 0x2926, 0x601b, 0x0006, 0x6858, 0xa084,
-       0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022,
-       0x602f, 0x0000, 0x6033, 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a,
-       0x6830, 0xd0b4, 0x0040, 0x4d3c, 0x684b, 0x0004, 0x20a9, 0x0014,
-       0x6848, 0xd094, 0x0040, 0x4d2e, 0x00f0, 0x4d28, 0x684b, 0x0009,
-       0x20a9, 0x0014, 0x6848, 0xd084, 0x0040, 0x4d38, 0x00f0, 0x4d32,
-       0x20a9, 0x00fa, 0x00f0, 0x4d3a, 0x681b, 0x0047, 0x0d7f, 0x6867,
-       0x0007, 0x007c, 0x2079, 0x4f00, 0x1078, 0x4d76, 0x1078, 0x4d5c,
-       0x1078, 0x4d69, 0x2009, 0x0002, 0x2069, 0x4f80, 0x680f, 0x0000,
-       0x6813, 0x0000, 0x6817, 0x0000, 0x8109, 0x0040, 0x4d5b, 0x2069,
-       0x4f40, 0x0078, 0x4d4e, 0x007c, 0x7810, 0xd0ec, 0x0040, 0x4d64,
-       0x2019, 0x00cc, 0x0078, 0x4d66, 0x2019, 0x007b, 0x7b3a, 0x7b3e,
-       0x007c, 0x7814, 0xd0e4, 0x00c0, 0x4d71, 0x2019, 0x0040, 0x0078,
-       0x4d73, 0x2019, 0x0026, 0x7b42, 0x7b46, 0x007c, 0x7814, 0xd0e4,
-       0x00c0, 0x4d7e, 0x2019, 0x3f94, 0x0078, 0x4d80, 0x2019, 0x2624,
-       0x7b32, 0x7b36, 0x007c, 0x6a50, 0xa285, 0x0000, 0x0040, 0x4daf,
-       0x6954, 0x6bc0, 0xa300, 0x0c7e, 0x2164, 0x6304, 0x83ff, 0x00c0,
-       0x4d9b, 0x8211, 0x0040, 0x4d9f, 0x8108, 0xa11a, 0x0048, 0x4d8c,
-       0x69c0, 0x0078, 0x4d8c, 0x68d3, 0x000a, 0x0c7f, 0x007c, 0x6950,
-       0x6ac0, 0x2264, 0x602b, 0x0000, 0x602f, 0x0000, 0x6008, 0xc0b5,
-       0x600a, 0x8210, 0x8109, 0x00c0, 0x4da1, 0x6952, 0x0c7f, 0x007c,
-       0x00e0, 0x4db0, 0x2091, 0x6000, 0x00e0, 0x4db4, 0x2091, 0x6000,
-       0x70ec, 0xd0dc, 0x00c0, 0x4dc1, 0xd0d4, 0x0040, 0x4dea, 0x0078,
-       0x4ded, 0x2008, 0x7810, 0xd0ec, 0x0040, 0x4dd4, 0xd1c4, 0x00c0,
-       0x4e0e, 0x7814, 0xc0c5, 0x7816, 0x7810, 0xc0f5, 0x7812, 0xd0ec,
-       0x0040, 0x4e0a, 0x0078, 0x4e06, 0xae8e, 0x0100, 0x0040, 0x4de1,
-       0x7814, 0xc0f5, 0xc0c5, 0x7816, 0xd0d4, 0x00c0, 0x4e0a, 0x0078,
-       0x4e06, 0x7814, 0xc0fd, 0xc0c5, 0x7816, 0xd0d4, 0x00c0, 0x4e0a,
-       0x0078, 0x4e06, 0xd0e4, 0x0040, 0x4e0c, 0x00e0, 0x4ded, 0x2091,
-       0x6000, 0x2009, 0x000c, 0x00e0, 0x4df3, 0x2091, 0x6000, 0x8109,
-       0x00c0, 0x4df3, 0x70e4, 0xa084, 0x01ff, 0xa086, 0x01ff, 0x00c0,
-       0x4e04, 0x70ec, 0x0078, 0x4dc1, 0x1078, 0x4e0f, 0x7804, 0xd08c,
-       0x0040, 0x4e0c, 0x681f, 0x000c, 0x70a0, 0x70a2, 0x007c, 0x7910,
-       0xd1ec, 0x0040, 0x4e19, 0x7814, 0xc0c4, 0xc1f4, 0x7912, 0x0078,
-       0x4e2b, 0xae8e, 0x0100, 0x0040, 0x4e25, 0x7814, 0xc0f4, 0xd0fc,
-       0x00c0, 0x4e2b, 0xc0c4, 0x0078, 0x4e2b, 0x7814, 0xc0fc, 0xd0f4,
-       0x00c0, 0x4e2b, 0xc0c4, 0x7816, 0x007c, 0x14e3
-};
-#ifdef UNIQUE_FW_NAME
-static unsigned short fw1280ei_length01 = 0x3e2e;
-#else
-static unsigned short risc_code_length01 = 0x3e2e;
-#endif
-
index df09820e8916353b47316a9404ed6deb633f1492..687dcf2d01542e5aca608399a227aeb9ce4cacc5 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/dma-mapping.h>
+#include <linux/firmware.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
 #define        MEMORY_MAPPED_IO        1
 #endif
 
-#define UNIQUE_FW_NAME
 #include "qla1280.h"
-#include "ql12160_fw.h"                /* ISP RISC codes */
-#include "ql1280_fw.h"
-#include "ql1040_fw.h"
 
 #ifndef BITS_PER_LONG
 #error "BITS_PER_LONG not defined!"
@@ -541,10 +538,7 @@ __setup("qla1280=", qla1280_setup);
 struct qla_boards {
        unsigned char name[9];  /* Board ID String */
        int numPorts;           /* Number of SCSI ports */
-       unsigned short *fwcode; /* pointer to FW array         */
-       unsigned short *fwlen;  /* number of words in array    */
-       unsigned short *fwstart;        /* start address for F/W       */
-       unsigned char *fwver;   /* Ptr to F/W version array    */
+       char *fwname;           /* firmware name        */
 };
 
 /* NOTE: the last argument in each entry is used to index ql1280_board_tbl */
@@ -567,19 +561,13 @@ MODULE_DEVICE_TABLE(pci, qla1280_pci_tbl);
 
 static struct qla_boards ql1280_board_tbl[] = {
        /* Name ,  Number of ports, FW details */
-       {"QLA12160", 2, &fw12160i_code01[0], &fw12160i_length01,
-        &fw12160i_addr01, &fw12160i_version_str[0]},
-       {"QLA1040", 1, &risc_code01[0], &risc_code_length01,
-        &risc_code_addr01, &firmware_version[0]},
-       {"QLA1080", 1, &fw1280ei_code01[0], &fw1280ei_length01,
-        &fw1280ei_addr01, &fw1280ei_version_str[0]},
-       {"QLA1240", 2, &fw1280ei_code01[0], &fw1280ei_length01,
-        &fw1280ei_addr01, &fw1280ei_version_str[0]},
-       {"QLA1280", 2, &fw1280ei_code01[0], &fw1280ei_length01,
-        &fw1280ei_addr01, &fw1280ei_version_str[0]},
-       {"QLA10160", 1, &fw12160i_code01[0], &fw12160i_length01,
-        &fw12160i_addr01, &fw12160i_version_str[0]},
-       {"        ", 0}
+       {"QLA12160",    2, "qlogic/12160.bin"},
+       {"QLA1040",     1, "qlogic/1040.bin"},
+       {"QLA1080",     1, "qlogic/1280.bin"},
+       {"QLA1240",     2, "qlogic/1280.bin"},
+       {"QLA1280",     2, "qlogic/1280.bin"},
+       {"QLA10160",    1, "qlogic/12160.bin"},
+       {"        ",    0, "   "},
 };
 
 static int qla1280_verbose = 1;
@@ -704,7 +692,7 @@ qla1280_info(struct Scsi_Host *host)
        sprintf (bp,
                 "QLogic %s PCI to SCSI Host Adapter\n"
                 "       Firmware version: %2d.%02d.%02d, Driver version %s",
-                &bdp->name[0], bdp->fwver[0], bdp->fwver[1], bdp->fwver[2],
+                &bdp->name[0], ha->fwver1, ha->fwver2, ha->fwver3,
                 QLA1280_VERSION);
        return bp;
 }
@@ -1648,36 +1636,60 @@ qla1280_chip_diag(struct scsi_qla_host *ha)
 static int
 qla1280_load_firmware_pio(struct scsi_qla_host *ha)
 {
-       uint16_t risc_address, *risc_code_address, risc_code_size;
+       const struct firmware *fw;
+       const __le16 *fw_data;
+       uint16_t risc_address, risc_code_size;
        uint16_t mb[MAILBOX_REGISTER_COUNT], i;
        int err;
 
+       err = request_firmware(&fw, ql1280_board_tbl[ha->devnum].fwname,
+                              &ha->pdev->dev);
+       if (err) {
+               printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+                      ql1280_board_tbl[ha->devnum].fwname, err);
+               return err;
+       }
+       if ((fw->size % 2) || (fw->size < 6)) {
+               printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+                      fw->size, ql1280_board_tbl[ha->devnum].fwname);
+               err = -EINVAL;
+               goto out;
+       }
+       ha->fwver1 = fw->data[0];
+       ha->fwver2 = fw->data[1];
+       ha->fwver3 = fw->data[2];
+       fw_data = (const __le16 *)&fw->data[0];
+       ha->fwstart = __le16_to_cpu(fw_data[2]);
+
        /* Load RISC code. */
-       risc_address = *ql1280_board_tbl[ha->devnum].fwstart;
-       risc_code_address = ql1280_board_tbl[ha->devnum].fwcode;
-       risc_code_size = *ql1280_board_tbl[ha->devnum].fwlen;
+       risc_address = ha->fwstart;
+       fw_data = (const __le16 *)&fw->data[4];
+       risc_code_size = (fw->size - 6) / 2;
 
        for (i = 0; i < risc_code_size; i++) {
                mb[0] = MBC_WRITE_RAM_WORD;
                mb[1] = risc_address + i;
-               mb[2] = risc_code_address[i];
+               mb[2] = __le16_to_cpu(fw_data[i]);
 
                err = qla1280_mailbox_command(ha, BIT_0 | BIT_1 | BIT_2, mb);
                if (err) {
                        printk(KERN_ERR "scsi(%li): Failed to load firmware\n",
                                        ha->host_no);
-                       return err;
+                       goto out;
                }
        }
-
-       return 0;
+out:
+       release_firmware(fw);
+       return err;
 }
 
 #define DUMP_IT_BACK 0         /* for debug of RISC loading */
 static int
 qla1280_load_firmware_dma(struct scsi_qla_host *ha)
 {
-       uint16_t risc_address, *risc_code_address, risc_code_size;
+       const struct firmware *fw;
+       const __le16 *fw_data;
+       uint16_t risc_address, risc_code_size;
        uint16_t mb[MAILBOX_REGISTER_COUNT], cnt;
        int err = 0, num, i;
 #if DUMP_IT_BACK
@@ -1689,10 +1701,29 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
                return -ENOMEM;
 #endif
 
+       err = request_firmware(&fw, ql1280_board_tbl[ha->devnum].fwname,
+                              &ha->pdev->dev);
+       if (err) {
+               printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+                      ql1280_board_tbl[ha->devnum].fwname, err);
+               return err;
+       }
+       if ((fw->size % 2) || (fw->size < 6)) {
+               printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+                      fw->size, ql1280_board_tbl[ha->devnum].fwname);
+               err = -EINVAL;
+               goto out;
+       }
+       ha->fwver1 = fw->data[0];
+       ha->fwver2 = fw->data[1];
+       ha->fwver3 = fw->data[2];
+       fw_data = (const __le16 *)&fw->data[0];
+       ha->fwstart = __le16_to_cpu(fw_data[2]);
+
        /* Load RISC code. */
-       risc_address = *ql1280_board_tbl[ha->devnum].fwstart;
-       risc_code_address = ql1280_board_tbl[ha->devnum].fwcode;
-       risc_code_size = *ql1280_board_tbl[ha->devnum].fwlen;
+       risc_address = ha->fwstart;
+       fw_data = (const __le16 *)&fw->data[4];
+       risc_code_size = (fw->size - 6) / 2;
 
        dprintk(1, "%s: DMA RISC code (%i) words\n",
                        __func__, risc_code_size);
@@ -1708,10 +1739,9 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
 
                dprintk(2, "qla1280_setup_chip:  loading risc @ =(0x%p),"
                        "%d,%d(0x%x)\n",
-                       risc_code_address, cnt, num, risc_address);
+                       fw_data, cnt, num, risc_address);
                for(i = 0; i < cnt; i++)
-                       ((__le16 *)ha->request_ring)[i] =
-                               cpu_to_le16(risc_code_address[i]);
+                       ((__le16 *)ha->request_ring)[i] = fw_data[i];
 
                mb[0] = MBC_LOAD_RAM;
                mb[1] = risc_address;
@@ -1763,7 +1793,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
 #endif
                risc_address += cnt;
                risc_code_size = risc_code_size - cnt;
-               risc_code_address = risc_code_address + cnt;
+               fw_data = fw_data + cnt;
                num++;
        }
 
@@ -1771,6 +1801,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
 #if DUMP_IT_BACK
        pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf);
 #endif
+       release_firmware(fw);
        return err;
 }
 
@@ -1786,7 +1817,7 @@ qla1280_start_firmware(struct scsi_qla_host *ha)
        /* Verify checksum of loaded RISC code. */
        mb[0] = MBC_VERIFY_CHECKSUM;
        /* mb[1] = ql12_risc_code_addr01; */
-       mb[1] = *ql1280_board_tbl[ha->devnum].fwstart;
+       mb[1] = ha->fwstart;
        err = qla1280_mailbox_command(ha, BIT_1 | BIT_0, mb);
        if (err) {
                printk(KERN_ERR "scsi(%li): RISC checksum failed.\n", ha->host_no);
@@ -1796,7 +1827,7 @@ qla1280_start_firmware(struct scsi_qla_host *ha)
        /* Start firmware execution. */
        dprintk(1, "%s: start firmware running.\n", __func__);
        mb[0] = MBC_EXECUTE_FIRMWARE;
-       mb[1] = *ql1280_board_tbl[ha->devnum].fwstart;
+       mb[1] = ha->fwstart;
        err = qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]);
        if (err) {
                printk(KERN_ERR "scsi(%li): Failed to start firmware\n",
@@ -4244,8 +4275,8 @@ qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        ha->devnum = devnum;    /* specifies microcode load address */
 
 #ifdef QLA_64BIT_PTR
-       if (pci_set_dma_mask(ha->pdev, DMA_64BIT_MASK)) {
-               if (pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(64))) {
+               if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32))) {
                        printk(KERN_WARNING "scsi(%li): Unable to set a "
                               "suitable DMA mask - aborting\n", ha->host_no);
                        error = -ENODEV;
@@ -4255,7 +4286,7 @@ qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                dprintk(2, "scsi(%li): 64 Bit PCI Addressing Enabled\n",
                        ha->host_no);
 #else
-       if (pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32))) {
                printk(KERN_WARNING "scsi(%li): Unable to set a "
                       "suitable DMA mask - aborting\n", ha->host_no);
                error = -ENODEV;
@@ -4450,6 +4481,9 @@ module_exit(qla1280_exit);
 MODULE_AUTHOR("Qlogic & Jes Sorensen");
 MODULE_DESCRIPTION("Qlogic ISP SCSI (qla1x80/qla1x160) driver");
 MODULE_LICENSE("GPL");
+MODULE_FIRMWARE("qlogic/1040.bin");
+MODULE_FIRMWARE("qlogic/1280.bin");
+MODULE_FIRMWARE("qlogic/12160.bin");
 MODULE_VERSION(QLA1280_VERSION);
 
 /*
index ff2c363ead26c8bb114a58f9db89675a28eb2dda..d7c44b8d2b4f5c9ef9c92c5bc8bb4a3029afc095 100644 (file)
@@ -1069,6 +1069,12 @@ struct scsi_qla_host {
 
        struct nvram nvram;
        int nvram_valid;
+
+       /* Firmware Info */
+       unsigned short fwstart; /* start address for F/W   */
+       unsigned char fwver1;   /* F/W version first char  */
+       unsigned char fwver2;   /* F/W version second char */
+       unsigned char fwver3;   /* F/W version third char  */
 };
 
 #endif /* _QLA1280_H */
index ee9d40152430dcab236eadc4fd3dea5221ccc760..b09993a06576cfbf37ead3608b53d5256bf084f4 100644 (file)
@@ -96,7 +96,9 @@ qla2x00_sysfs_read_nvram(struct kobject *kobj,
        if (!capable(CAP_SYS_ADMIN))
                return 0;
 
-       /* Read NVRAM data from cache. */
+       if (IS_NOCACHE_VPD_TYPE(ha))
+               ha->isp_ops->read_optrom(vha, ha->vpd, ha->flt_region_nvram << 2,
+                   ha->nvram_size);
        return memory_read_from_buffer(buf, count, &off, ha->nvram,
                                        ha->nvram_size);
 }
@@ -111,7 +113,8 @@ qla2x00_sysfs_write_nvram(struct kobject *kobj,
        struct qla_hw_data *ha = vha->hw;
        uint16_t        cnt;
 
-       if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size)
+       if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size ||
+           !ha->isp_ops->write_nvram)
                return 0;
 
        /* Checksum NVRAM. */
@@ -137,12 +140,21 @@ qla2x00_sysfs_write_nvram(struct kobject *kobj,
                *iter = chksum;
        }
 
+       if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
+               qla_printk(KERN_WARNING, ha,
+                   "HBA not online, failing NVRAM update.\n");
+               return -EAGAIN;
+       }
+
        /* Write NVRAM. */
        ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->nvram_base, count);
        ha->isp_ops->read_nvram(vha, (uint8_t *)ha->nvram, ha->nvram_base,
            count);
 
+       /* NVRAM settings take effect immediately. */
        set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+       qla2xxx_wake_dpc(vha);
+       qla2x00_wait_for_chip_reset(vha);
 
        return (count);
 }
@@ -330,6 +342,12 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj,
                if (ha->optrom_state != QLA_SWRITING)
                        break;
 
+               if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
+                       qla_printk(KERN_WARNING, ha,
+                           "HBA not online, failing flash update.\n");
+                       return -EAGAIN;
+               }
+
                DEBUG2(qla_printk(KERN_INFO, ha,
                    "Writing flash region -- 0x%x/0x%x.\n",
                    ha->optrom_region_start, ha->optrom_region_size));
@@ -364,7 +382,9 @@ qla2x00_sysfs_read_vpd(struct kobject *kobj,
        if (!capable(CAP_SYS_ADMIN))
                return 0;
 
-       /* Read NVRAM data from cache. */
+       if (IS_NOCACHE_VPD_TYPE(ha))
+               ha->isp_ops->read_optrom(vha, ha->vpd, ha->flt_region_vpd << 2,
+                   ha->vpd_size);
        return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size);
 }
 
@@ -376,14 +396,35 @@ qla2x00_sysfs_write_vpd(struct kobject *kobj,
        struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
            struct device, kobj)));
        struct qla_hw_data *ha = vha->hw;
+       uint8_t *tmp_data;
 
-       if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size)
+       if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size ||
+           !ha->isp_ops->write_nvram)
                return 0;
 
+       if (qla2x00_wait_for_hba_online(vha) != QLA_SUCCESS) {
+               qla_printk(KERN_WARNING, ha,
+                   "HBA not online, failing VPD update.\n");
+               return -EAGAIN;
+       }
+
        /* Write NVRAM. */
        ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->vpd_base, count);
        ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, ha->vpd_base, count);
 
+       /* Update flash version information for 4Gb & above. */
+       if (!IS_FWI2_CAPABLE(ha))
+               goto done;
+
+       tmp_data = vmalloc(256);
+       if (!tmp_data) {
+               qla_printk(KERN_WARNING, ha,
+                   "Unable to allocate memory for VPD information update.\n");
+               goto done;
+       }
+       ha->isp_ops->get_flash_version(vha, tmp_data);
+       vfree(tmp_data);
+done:
        return count;
 }
 
@@ -458,6 +499,199 @@ static struct bin_attribute sysfs_sfp_attr = {
        .read = qla2x00_sysfs_read_sfp,
 };
 
+static ssize_t
+qla2x00_sysfs_write_reset(struct kobject *kobj,
+                       struct bin_attribute *bin_attr,
+                       char *buf, loff_t off, size_t count)
+{
+       struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+           struct device, kobj)));
+       struct qla_hw_data *ha = vha->hw;
+       int type;
+
+       if (off != 0)
+               return 0;
+
+       type = simple_strtol(buf, NULL, 10);
+       switch (type) {
+       case 0x2025c:
+               qla_printk(KERN_INFO, ha,
+                   "Issuing ISP reset on (%ld).\n", vha->host_no);
+
+               scsi_block_requests(vha->host);
+               set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+               qla2xxx_wake_dpc(vha);
+               qla2x00_wait_for_chip_reset(vha);
+               scsi_unblock_requests(vha->host);
+               break;
+       case 0x2025d:
+               if (!IS_QLA81XX(ha))
+                       break;
+
+               qla_printk(KERN_INFO, ha,
+                   "Issuing MPI reset on (%ld).\n", vha->host_no);
+
+               /* Make sure FC side is not in reset */
+               qla2x00_wait_for_hba_online(vha);
+
+               /* Issue MPI reset */
+               scsi_block_requests(vha->host);
+               if (qla81xx_restart_mpi_firmware(vha) != QLA_SUCCESS)
+                       qla_printk(KERN_WARNING, ha,
+                           "MPI reset failed on (%ld).\n", vha->host_no);
+               scsi_unblock_requests(vha->host);
+               break;
+       }
+       return count;
+}
+
+static struct bin_attribute sysfs_reset_attr = {
+       .attr = {
+               .name = "reset",
+               .mode = S_IWUSR,
+       },
+       .size = 0,
+       .write = qla2x00_sysfs_write_reset,
+};
+
+static ssize_t
+qla2x00_sysfs_write_edc(struct kobject *kobj,
+                       struct bin_attribute *bin_attr,
+                       char *buf, loff_t off, size_t count)
+{
+       struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+           struct device, kobj)));
+       struct qla_hw_data *ha = vha->hw;
+       uint16_t dev, adr, opt, len;
+       int rval;
+
+       ha->edc_data_len = 0;
+
+       if (!capable(CAP_SYS_ADMIN) || off != 0 || count < 8)
+               return 0;
+
+       if (!ha->edc_data) {
+               ha->edc_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
+                   &ha->edc_data_dma);
+               if (!ha->edc_data) {
+                       DEBUG2(qla_printk(KERN_INFO, ha,
+                           "Unable to allocate memory for EDC write.\n"));
+                       return 0;
+               }
+       }
+
+       dev = le16_to_cpup((void *)&buf[0]);
+       adr = le16_to_cpup((void *)&buf[2]);
+       opt = le16_to_cpup((void *)&buf[4]);
+       len = le16_to_cpup((void *)&buf[6]);
+
+       if (!(opt & BIT_0))
+               if (len == 0 || len > DMA_POOL_SIZE || len > count - 8)
+                       return -EINVAL;
+
+       memcpy(ha->edc_data, &buf[8], len);
+
+       rval = qla2x00_write_edc(vha, dev, adr, ha->edc_data_dma,
+           ha->edc_data, len, opt);
+       if (rval != QLA_SUCCESS) {
+               DEBUG2(qla_printk(KERN_INFO, ha,
+                   "Unable to write EDC (%x) %02x:%02x:%04x:%02x:%02x.\n",
+                   rval, dev, adr, opt, len, *buf));
+               return 0;
+       }
+
+       return count;
+}
+
+static struct bin_attribute sysfs_edc_attr = {
+       .attr = {
+               .name = "edc",
+               .mode = S_IWUSR,
+       },
+       .size = 0,
+       .write = qla2x00_sysfs_write_edc,
+};
+
+static ssize_t
+qla2x00_sysfs_write_edc_status(struct kobject *kobj,
+                       struct bin_attribute *bin_attr,
+                       char *buf, loff_t off, size_t count)
+{
+       struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+           struct device, kobj)));
+       struct qla_hw_data *ha = vha->hw;
+       uint16_t dev, adr, opt, len;
+       int rval;
+
+       ha->edc_data_len = 0;
+
+       if (!capable(CAP_SYS_ADMIN) || off != 0 || count < 8)
+               return 0;
+
+       if (!ha->edc_data) {
+               ha->edc_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
+                   &ha->edc_data_dma);
+               if (!ha->edc_data) {
+                       DEBUG2(qla_printk(KERN_INFO, ha,
+                           "Unable to allocate memory for EDC status.\n"));
+                       return 0;
+               }
+       }
+
+       dev = le16_to_cpup((void *)&buf[0]);
+       adr = le16_to_cpup((void *)&buf[2]);
+       opt = le16_to_cpup((void *)&buf[4]);
+       len = le16_to_cpup((void *)&buf[6]);
+
+       if (!(opt & BIT_0))
+               if (len == 0 || len > DMA_POOL_SIZE)
+                       return -EINVAL;
+
+       memset(ha->edc_data, 0, len);
+       rval = qla2x00_read_edc(vha, dev, adr, ha->edc_data_dma,
+           ha->edc_data, len, opt);
+       if (rval != QLA_SUCCESS) {
+               DEBUG2(qla_printk(KERN_INFO, ha,
+                   "Unable to write EDC status (%x) %02x:%02x:%04x:%02x.\n",
+                   rval, dev, adr, opt, len));
+               return 0;
+       }
+
+       ha->edc_data_len = len;
+
+       return count;
+}
+
+static ssize_t
+qla2x00_sysfs_read_edc_status(struct kobject *kobj,
+                          struct bin_attribute *bin_attr,
+                          char *buf, loff_t off, size_t count)
+{
+       struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
+           struct device, kobj)));
+       struct qla_hw_data *ha = vha->hw;
+
+       if (!capable(CAP_SYS_ADMIN) || off != 0 || count == 0)
+               return 0;
+
+       if (!ha->edc_data || ha->edc_data_len == 0 || ha->edc_data_len > count)
+               return -EINVAL;
+
+       memcpy(buf, ha->edc_data, ha->edc_data_len);
+
+       return ha->edc_data_len;
+}
+
+static struct bin_attribute sysfs_edc_status_attr = {
+       .attr = {
+               .name = "edc_status",
+               .mode = S_IRUSR | S_IWUSR,
+       },
+       .size = 0,
+       .write = qla2x00_sysfs_write_edc_status,
+       .read = qla2x00_sysfs_read_edc_status,
+};
+
 static struct sysfs_entry {
        char *name;
        struct bin_attribute *attr;
@@ -469,6 +703,9 @@ static struct sysfs_entry {
        { "optrom_ctl", &sysfs_optrom_ctl_attr, },
        { "vpd", &sysfs_vpd_attr, 1 },
        { "sfp", &sysfs_sfp_attr, 1 },
+       { "reset", &sysfs_reset_attr, },
+       { "edc", &sysfs_edc_attr, 2 },
+       { "edc_status", &sysfs_edc_status_attr, 2 },
        { NULL },
 };
 
@@ -482,6 +719,8 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
        for (iter = bin_file_entries; iter->name; iter++) {
                if (iter->is4GBp_only && !IS_FWI2_CAPABLE(vha->hw))
                        continue;
+               if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
+                       continue;
 
                ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
                    iter->attr);
@@ -502,6 +741,8 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha)
        for (iter = bin_file_entries; iter->name; iter++) {
                if (iter->is4GBp_only && !IS_FWI2_CAPABLE(ha))
                        continue;
+               if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha))
+                       continue;
 
                sysfs_remove_bin_file(&host->shost_gendev.kobj,
                    iter->attr);
@@ -818,9 +1059,33 @@ qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
        if (!IS_QLA81XX(ha))
                return snprintf(buf, PAGE_SIZE, "\n");
 
-       return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x (%x)\n",
+       return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
            ha->mpi_version[0], ha->mpi_version[1], ha->mpi_version[2],
-           ha->mpi_version[3], ha->mpi_capabilities);
+           ha->mpi_capabilities);
+}
+
+static ssize_t
+qla2x00_phy_version_show(struct device *dev, struct device_attribute *attr,
+    char *buf)
+{
+       scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+       struct qla_hw_data *ha = vha->hw;
+
+       if (!IS_QLA81XX(ha))
+               return snprintf(buf, PAGE_SIZE, "\n");
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
+           ha->phy_version[0], ha->phy_version[1], ha->phy_version[2]);
+}
+
+static ssize_t
+qla2x00_flash_block_size_show(struct device *dev,
+                             struct device_attribute *attr, char *buf)
+{
+       scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+       struct qla_hw_data *ha = vha->hw;
+
+       return snprintf(buf, PAGE_SIZE, "0x%x\n", ha->fdt_block_size);
 }
 
 static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL);
@@ -848,6 +1113,9 @@ static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show,
 static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
                   NULL);
 static DEVICE_ATTR(mpi_version, S_IRUGO, qla2x00_mpi_version_show, NULL);
+static DEVICE_ATTR(phy_version, S_IRUGO, qla2x00_phy_version_show, NULL);
+static DEVICE_ATTR(flash_block_size, S_IRUGO, qla2x00_flash_block_size_show,
+                  NULL);
 
 struct device_attribute *qla2x00_host_attrs[] = {
        &dev_attr_driver_version,
@@ -868,6 +1136,8 @@ struct device_attribute *qla2x00_host_attrs[] = {
        &dev_attr_optrom_fw_version,
        &dev_attr_total_isp_aborts,
        &dev_attr_mpi_version,
+       &dev_attr_phy_version,
+       &dev_attr_flash_block_size,
        NULL,
 };
 
@@ -1012,7 +1282,10 @@ qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
        if (!fcport)
                return;
 
-       qla2x00_abort_fcport_cmds(fcport);
+       if (unlikely(pci_channel_offline(fcport->vha->hw->pdev)))
+               qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
+       else
+               qla2x00_abort_fcport_cmds(fcport);
 
        /*
         * Transport has effectively 'deleted' the rport, clear
@@ -1032,16 +1305,18 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
        if (!fcport)
                return;
 
+       if (unlikely(pci_channel_offline(fcport->vha->hw->pdev))) {
+               qla2x00_abort_all_cmds(fcport->vha, DID_NO_CONNECT << 16);
+               return;
+       }
        /*
         * At this point all fcport's software-states are cleared.  Perform any
         * final cleanup of firmware resources (PCBs and XCBs).
         */
-       if (fcport->loop_id != FC_NO_LOOP_ID) {
+       if (fcport->loop_id != FC_NO_LOOP_ID)
                fcport->vha->hw->isp_ops->fabric_logout(fcport->vha,
                        fcport->loop_id, fcport->d_id.b.domain,
                        fcport->d_id.b.area, fcport->d_id.b.al_pa);
-               fcport->loop_id = FC_NO_LOOP_ID;
-       }
 
        qla2x00_abort_fcport_cmds(fcport);
 }
index e0c5bb54b258a492e9ceb641cada66b07d4785f8..714ee67567e1c814080342665e4d19dde48513ee 100644 (file)
 /* ISP request and response entry counts (37-65535) */
 #define REQUEST_ENTRY_CNT_2100         128     /* Number of request entries. */
 #define REQUEST_ENTRY_CNT_2200         2048    /* Number of request entries. */
-#define REQUEST_ENTRY_CNT_2XXX_EXT_MEM 4096    /* Number of request entries. */
-#define REQUEST_ENTRY_CNT_24XX         4096    /* Number of request entries. */
+#define REQUEST_ENTRY_CNT_24XX         2048    /* Number of request entries. */
 #define RESPONSE_ENTRY_CNT_2100                64      /* Number of response entries.*/
 #define RESPONSE_ENTRY_CNT_2300                512     /* Number of response entries.*/
 
@@ -201,20 +200,7 @@ typedef struct srb {
 /*
  * SRB flag definitions
  */
-#define SRB_TIMEOUT            BIT_0   /* Command timed out */
-#define SRB_DMA_VALID          BIT_1   /* Command sent to ISP */
-#define SRB_WATCHDOG           BIT_2   /* Command on watchdog list */
-#define SRB_ABORT_PENDING      BIT_3   /* Command abort sent to device */
-
-#define SRB_ABORTED            BIT_4   /* Command aborted command already */
-#define SRB_RETRY              BIT_5   /* Command needs retrying */
-#define SRB_GOT_SENSE          BIT_6   /* Command has sense data */
-#define SRB_FAILOVER           BIT_7   /* Command in failover state */
-
-#define SRB_BUSY               BIT_8   /* Command is in busy retry state */
-#define SRB_FO_CANCEL          BIT_9   /* Command don't need to do failover */
-#define SRB_IOCTL              BIT_10  /* IOCTL command. */
-#define SRB_TAPE               BIT_11  /* FCP2 (Tape) command. */
+#define SRB_DMA_VALID          BIT_0   /* Command sent to ISP */
 
 /*
  * ISP I/O Register Set structure definitions.
@@ -372,10 +358,10 @@ struct device_reg_2xxx {
 };
 
 struct device_reg_25xxmq {
-       volatile uint32_t req_q_in;
-       volatile uint32_t req_q_out;
-       volatile uint32_t rsp_q_in;
-       volatile uint32_t rsp_q_out;
+       uint32_t req_q_in;
+       uint32_t req_q_out;
+       uint32_t rsp_q_in;
+       uint32_t rsp_q_out;
 };
 
 typedef union {
@@ -620,6 +606,7 @@ typedef struct {
 #define MBC_GET_TIMEOUT_PARAMS         0x22    /* Get FW timeouts. */
 #define MBC_TRACE_CONTROL              0x27    /* Trace control command. */
 #define MBC_GEN_SYSTEM_ERROR           0x2a    /* Generate System Error. */
+#define MBC_WRITE_SFP                  0x30    /* Write SFP Data. */
 #define MBC_READ_SFP                   0x31    /* Read SFP Data. */
 #define MBC_SET_TIMEOUT_PARAMS         0x32    /* Set FW timeouts. */
 #define MBC_MID_INITIALIZE_FIRMWARE    0x48    /* MID Initialize firmware. */
@@ -1570,39 +1557,13 @@ typedef struct fc_port {
 #define FCS_DEVICE_DEAD                2
 #define FCS_DEVICE_LOST                3
 #define FCS_ONLINE             4
-#define FCS_NOT_SUPPORTED      5
-#define FCS_FAILOVER           6
-#define FCS_FAILOVER_FAILED    7
 
 /*
  * FC port flags.
  */
 #define FCF_FABRIC_DEVICE      BIT_0
 #define FCF_LOGIN_NEEDED       BIT_1
-#define FCF_FO_MASKED          BIT_2
-#define FCF_FAILOVER_NEEDED    BIT_3
-#define FCF_RESET_NEEDED       BIT_4
-#define FCF_PERSISTENT_BOUND   BIT_5
-#define FCF_TAPE_PRESENT       BIT_6
-#define FCF_FARP_DONE          BIT_7
-#define FCF_FARP_FAILED                BIT_8
-#define FCF_FARP_REPLY_NEEDED  BIT_9
-#define FCF_AUTH_REQ           BIT_10
-#define FCF_SEND_AUTH_REQ      BIT_11
-#define FCF_RECEIVE_AUTH_REQ   BIT_12
-#define FCF_AUTH_SUCCESS       BIT_13
-#define FCF_RLC_SUPPORT                BIT_14
-#define FCF_CONFIG             BIT_15  /* Needed? */
-#define FCF_RESCAN_NEEDED      BIT_16
-#define FCF_XP_DEVICE          BIT_17
-#define FCF_MSA_DEVICE         BIT_18
-#define FCF_EVA_DEVICE         BIT_19
-#define FCF_MSA_PORT_ACTIVE    BIT_20
-#define FCF_FAILBACK_DISABLE   BIT_21
-#define FCF_FAILOVER_DISABLE   BIT_22
-#define FCF_DSXXX_DEVICE       BIT_23
-#define FCF_AA_EVA_DEVICE      BIT_24
-#define FCF_AA_MSA_DEVICE      BIT_25
+#define FCF_TAPE_PRESENT       BIT_2
 
 /* No loop ID flag. */
 #define FC_NO_LOOP_ID          0x1000
@@ -2102,9 +2063,6 @@ struct isp_operations {
 
        int (*get_flash_version) (struct scsi_qla_host *, void *);
        int (*start_scsi) (srb_t *);
-       void (*wrt_req_reg) (struct qla_hw_data *, uint16_t, uint16_t);
-       void (*wrt_rsp_reg) (struct qla_hw_data *, uint16_t, uint16_t);
-       uint16_t (*rd_req_reg) (struct qla_hw_data *, uint16_t);
 };
 
 /* MSI-X Support *************************************************************/
@@ -2200,6 +2158,8 @@ struct rsp_que {
        dma_addr_t  dma;
        response_t *ring;
        response_t *ring_ptr;
+       uint32_t __iomem *rsp_q_in;     /* FWI2-capable only. */
+       uint32_t __iomem *rsp_q_out;
        uint16_t  ring_index;
        uint16_t  out_ptr;
        uint16_t  length;
@@ -2217,6 +2177,8 @@ struct req_que {
        dma_addr_t  dma;
        request_t *ring;
        request_t *ring_ptr;
+       uint32_t __iomem *req_q_in;     /* FWI2-capable only. */
+       uint32_t __iomem *req_q_out;
        uint16_t  ring_index;
        uint16_t  in_ptr;
        uint16_t  cnt;
@@ -2256,10 +2218,10 @@ struct qla_hw_data {
                uint32_t        msix_enabled            :1;
                uint32_t        disable_serdes          :1;
                uint32_t        gpsc_supported          :1;
-               uint32_t        vsan_enabled            :1;
                uint32_t        npiv_supported          :1;
                uint32_t        fce_enabled             :1;
-               uint32_t        hw_event_marker_found:1;
+               uint32_t        fac_supported           :1;
+               uint32_t        chip_reset_done         :1;
        } flags;
 
        /* This spinlock is used to protect "io transactions", you must
@@ -2277,7 +2239,7 @@ struct qla_hw_data {
 
 #define MIN_IOBASE_LEN          0x100
 /* Multi queue data structs */
-       device_reg_t    *mqiobase;
+       device_reg_t __iomem *mqiobase;
        uint16_t        msix_count;
        uint8_t         mqenable;
        struct req_que **req_q_map;
@@ -2300,7 +2262,6 @@ struct qla_hw_data {
        uint16_t        max_loop_id;
 
        uint16_t        fb_rev;
-       uint16_t        max_public_loop_ids;
        uint16_t        min_external_loopid;    /* First external loop Id */
 
 #define PORT_SPEED_UNKNOWN 0xFFFF
@@ -2381,6 +2342,8 @@ struct qla_hw_data {
                                IS_QLA25XX(ha) || IS_QLA81XX(ha))
 #define IS_NOPOLLING_TYPE(ha)  ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && \
                                (ha)->flags.msix_enabled)
+#define IS_FAC_REQUIRED(ha)    (IS_QLA81XX(ha))
+#define IS_NOCACHE_VPD_TYPE(ha)        (IS_QLA81XX(ha))
 
 #define IS_IIDMA_CAPABLE(ha)    ((ha)->device_type & DT_IIDMA)
 #define IS_FWI2_CAPABLE(ha)     ((ha)->device_type & DT_FWI2)
@@ -2425,6 +2388,10 @@ struct qla_hw_data {
        void            *sfp_data;
        dma_addr_t      sfp_data_dma;
 
+       uint8_t         *edc_data;
+       dma_addr_t      edc_data_dma;
+       uint16_t        edc_data_len;
+
        struct task_struct      *dpc_thread;
        uint8_t dpc_active;                  /* DPC routine is active */
 
@@ -2439,6 +2406,8 @@ struct qla_hw_data {
        dma_addr_t      init_cb_dma;
        init_cb_t       *init_cb;
        int             init_cb_size;
+       dma_addr_t      ex_init_cb_dma;
+       struct ex_init_cb_81xx *ex_init_cb;
 
        /* These are used by mailbox operations. */
        volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT];
@@ -2453,15 +2422,6 @@ struct qla_hw_data {
        struct completion mbx_cmd_comp; /* Serialize mbx access */
        struct completion mbx_intr_comp;  /* Used for completion notification */
 
-       uint32_t        mbx_flags;
-#define  MBX_IN_PROGRESS       BIT_0
-#define  MBX_BUSY              BIT_1   /* Got the Access */
-#define  MBX_SLEEPING_ON_SEM   BIT_2
-#define  MBX_POLLING_FOR_COMP  BIT_3
-#define  MBX_COMPLETED         BIT_4
-#define  MBX_TIMEDOUT          BIT_5
-#define  MBX_ACCESS_TIMEDOUT   BIT_6
-
        /* Basic firmware related information. */
        uint16_t        fw_major_version;
        uint16_t        fw_minor_version;
@@ -2473,13 +2433,15 @@ struct qla_hw_data {
 #define RISC_START_ADDRESS_2100 0x1000
 #define RISC_START_ADDRESS_2300 0x800
 #define RISC_START_ADDRESS_2400 0x100000
+       uint16_t        fw_xcb_count;
 
        uint16_t        fw_options[16];         /* slots: 1,2,3,10,11 */
        uint8_t         fw_seriallink_options[4];
        uint16_t        fw_seriallink_options24[4];
 
-       uint8_t         mpi_version[4];
+       uint8_t         mpi_version[3];
        uint32_t        mpi_capabilities;
+       uint8_t         phy_version[3];
 
        /* Firmware dump information. */
        struct qla2xxx_fw_dump *fw_dump;
@@ -2545,6 +2507,8 @@ struct qla_hw_data {
        uint32_t        flt_region_boot;
        uint32_t        flt_region_fw;
        uint32_t        flt_region_vpd_nvram;
+       uint32_t        flt_region_vpd;
+       uint32_t        flt_region_nvram;
        uint32_t        flt_region_npiv_conf;
 
        /* Needed for BEACON */
@@ -2613,36 +2577,19 @@ typedef struct scsi_qla_host {
 #define LOOP_RESYNC_ACTIVE     5
 #define LOCAL_LOOP_UPDATE      6       /* Perform a local loop update. */
 #define RSCN_UPDATE            7       /* Perform an RSCN update. */
-#define MAILBOX_RETRY          8
-#define ISP_RESET_NEEDED       9       /* Initiate a ISP reset. */
-#define FAILOVER_EVENT_NEEDED  10
-#define FAILOVER_EVENT         11
-#define FAILOVER_NEEDED                12
-#define SCSI_RESTART_NEEDED    13      /* Processes SCSI retry queue. */
-#define PORT_RESTART_NEEDED    14      /* Processes Retry queue. */
-#define RESTART_QUEUES_NEEDED  15      /* Restarts the Lun queue. */
-#define ABORT_QUEUES_NEEDED    16
-#define RELOGIN_NEEDED         17
-#define LOGIN_RETRY_NEEDED     18      /* Initiate required fabric logins. */
-#define REGISTER_FC4_NEEDED    19      /* SNS FC4 registration required. */
-#define ISP_ABORT_RETRY                20      /* ISP aborted. */
-#define FCPORT_RESCAN_NEEDED   21      /* IO descriptor processing needed */
-#define IODESC_PROCESS_NEEDED  22      /* IO descriptor processing needed */
-#define IOCTL_ERROR_RECOVERY   23
-#define LOOP_RESET_NEEDED      24
-#define BEACON_BLINK_NEEDED    25
-#define REGISTER_FDMI_NEEDED   26
-#define FCPORT_UPDATE_NEEDED   27
-#define VP_DPC_NEEDED          28      /* wake up for VP dpc handling */
-#define UNLOADING              29
-#define NPIV_CONFIG_NEEDED     30
+#define RELOGIN_NEEDED         8
+#define REGISTER_FC4_NEEDED    9       /* SNS FC4 registration required. */
+#define ISP_ABORT_RETRY                10      /* ISP aborted. */
+#define BEACON_BLINK_NEEDED    11
+#define REGISTER_FDMI_NEEDED   12
+#define FCPORT_UPDATE_NEEDED   13
+#define VP_DPC_NEEDED          14      /* wake up for VP dpc handling */
+#define UNLOADING              15
+#define NPIV_CONFIG_NEEDED     16
 
        uint32_t        device_flags;
-#define DFLG_LOCAL_DEVICES             BIT_0
-#define DFLG_RETRY_LOCAL_DEVICES       BIT_1
-#define DFLG_FABRIC_DEVICES            BIT_2
-#define SWITCH_FOUND                   BIT_3
-#define DFLG_NO_CABLE                  BIT_4
+#define SWITCH_FOUND           BIT_0
+#define DFLG_NO_CABLE          BIT_1
 
        srb_t           *status_srb;    /* Status continuation entry. */
 
@@ -2755,10 +2702,5 @@ typedef struct scsi_qla_host {
 #include "qla_inline.h"
 
 #define CMD_SP(Cmnd)           ((Cmnd)->SCp.ptr)
-#define CMD_COMPL_STATUS(Cmnd)  ((Cmnd)->SCp.this_residual)
-#define CMD_RESID_LEN(Cmnd)    ((Cmnd)->SCp.buffers_residual)
-#define CMD_SCSI_STATUS(Cmnd)  ((Cmnd)->SCp.Status)
-#define CMD_ACTUAL_SNSLEN(Cmnd)        ((Cmnd)->SCp.Message)
-#define CMD_ENTRY_STATUS(Cmnd) ((Cmnd)->SCp.have_data_in)
 
 #endif
index c66036da7d2b75b5439ff743fef001c35fef886e..3a9a6ca422660c7b4fe9d5bafe2e68f314c43904 100644 (file)
@@ -71,7 +71,7 @@ qla2x00_dfs_fce_open(struct inode *inode, struct file *file)
 
        mutex_unlock(&ha->fce_mutex);
 out:
-       return single_open(file, qla2x00_dfs_fce_show, ha);
+       return single_open(file, qla2x00_dfs_fce_show, vha);
 }
 
 static int
@@ -145,7 +145,7 @@ create_dir:
        atomic_inc(&qla2x00_dfs_root_count);
 
 create_nodes:
-       ha->dfs_fce = debugfs_create_file("fce", S_IRUSR, ha->dfs_dir, ha,
+       ha->dfs_fce = debugfs_create_file("fce", S_IRUSR, ha->dfs_dir, vha,
            &dfs_fce_ops);
        if (!ha->dfs_fce) {
                qla_printk(KERN_NOTICE, ha,
index ffff4255408784ffe24c1a2753a9654950e5ca6d..96ccb9642ba09e27c17e6a86ab1b3071f1e40323 100644 (file)
@@ -1403,6 +1403,21 @@ struct access_chip_rsp_84xx {
 #define MBA_IDC_TIME_EXT       0x8102
 
 #define MBC_IDC_ACK            0x101
+#define MBC_RESTART_MPI_FW     0x3d
+#define MBC_FLASH_ACCESS_CTRL  0x3e    /* Control flash access. */
+
+/* Flash access control option field bit definitions */
+#define FAC_OPT_FORCE_SEMAPHORE                BIT_15
+#define FAC_OPT_REQUESTOR_ID           BIT_14
+#define FAC_OPT_CMD_SUBCODE            0xff
+
+/* Flash access control command subcodes */
+#define FAC_OPT_CMD_WRITE_PROTECT      0x00
+#define FAC_OPT_CMD_WRITE_ENABLE       0x01
+#define FAC_OPT_CMD_ERASE_SECTOR       0x02
+#define FAC_OPT_CMD_LOCK_SEMAPHORE     0x03
+#define FAC_OPT_CMD_UNLOCK_SEMAPHORE   0x04
+#define FAC_OPT_CMD_GET_SECTOR_SIZE    0x05
 
 struct nvram_81xx {
        /* NVRAM header. */
@@ -1440,7 +1455,17 @@ struct nvram_81xx {
        uint16_t reserved_6[24];
 
        /* Offset 128. */
-       uint16_t reserved_7[64];
+       uint16_t ex_version;
+       uint8_t prio_fcf_matching_flags;
+       uint8_t reserved_6_1[3];
+       uint16_t pri_fcf_vlan_id;
+       uint8_t pri_fcf_fabric_name[8];
+       uint16_t reserved_6_2[7];
+       uint8_t spma_mac_addr[6];
+       uint16_t reserved_6_3[14];
+
+       /* Offset 192. */
+       uint16_t reserved_7[32];
 
        /*
         * BIT 0  = Enable spinup delay
@@ -1664,6 +1689,17 @@ struct mid_init_cb_81xx {
        struct mid_conf_entry_24xx entries[MAX_MULTI_ID_FABRIC];
 };
 
+struct ex_init_cb_81xx {
+       uint16_t ex_version;
+       uint8_t prio_fcf_matching_flags;
+       uint8_t reserved_1[3];
+       uint16_t pri_fcf_vlan_id;
+       uint8_t pri_fcf_fabric_name[8];
+       uint16_t reserved_2[7];
+       uint8_t spma_mac_addr[6];
+       uint16_t reserved_3[14];
+};
+
 #define FARX_ACCESS_FLASH_CONF_81XX    0x7FFD0000
 #define FARX_ACCESS_FLASH_DATA_81XX    0x7F800000
 
@@ -1672,6 +1708,10 @@ struct mid_init_cb_81xx {
 #define FA_RISC_CODE_ADDR_81   0xA0000
 #define FA_FW_AREA_ADDR_81     0xC0000
 #define FA_VPD_NVRAM_ADDR_81   0xD0000
+#define FA_VPD0_ADDR_81                0xD0000
+#define FA_VPD1_ADDR_81                0xD0400
+#define FA_NVRAM0_ADDR_81      0xD0080
+#define FA_NVRAM1_ADDR_81      0xD0480
 #define FA_FEATURE_ADDR_81     0xD4000
 #define FA_FLASH_DESCR_ADDR_81 0xD8000
 #define FA_FLASH_LAYOUT_ADDR_81        0xD8400
index 6de283f8f111d0a2a30056594e02b6e410add6f1..528913f6bed99ffc010eb3ec6d680660403683c7 100644 (file)
@@ -73,6 +73,7 @@ extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int);
 extern int qla2x00_post_aen_work(struct scsi_qla_host *, enum
     fc_host_event_code, u32);
 extern int qla2x00_post_idc_ack_work(struct scsi_qla_host *, uint16_t *);
+extern int qla81xx_restart_mpi_firmware(scsi_qla_host_t *);
 
 extern void qla2x00_abort_fcport_cmds(fc_port_t *);
 extern struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *,
@@ -82,7 +83,7 @@ extern void qla2x00_relogin(struct scsi_qla_host *);
 /*
  * Global Functions in qla_mid.c source file.
  */
-extern struct scsi_host_template qla24xx_driver_template;
+extern struct scsi_host_template qla2xxx_driver_template;
 extern struct scsi_transport_template *qla2xxx_transport_vport_template;
 extern void qla2x00_timer(scsi_qla_host_t *);
 extern void qla2x00_start_timer(scsi_qla_host_t *, void *, unsigned long);
@@ -110,6 +111,7 @@ extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *, int);
 extern struct fw_blob *qla2x00_request_firmware(scsi_qla_host_t *);
 
 extern int qla2x00_wait_for_hba_online(scsi_qla_host_t *);
+extern int qla2x00_wait_for_chip_reset(scsi_qla_host_t *);
 
 extern void qla2xxx_wake_dpc(struct scsi_qla_host *);
 extern void qla2x00_alert_all_vps(struct rsp_que *, uint16_t *);
@@ -144,8 +146,8 @@ extern int
 qla2x00_execute_fw(scsi_qla_host_t *, uint32_t);
 
 extern void
-qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *,
-    uint16_t *, uint16_t *, uint16_t *, uint32_t *, uint8_t *, uint32_t *);
+qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *,
+    uint16_t *, uint32_t *, uint8_t *, uint32_t *, uint8_t *);
 
 extern int
 qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *);
@@ -262,6 +264,14 @@ qla2x00_disable_fce_trace(scsi_qla_host_t *, uint64_t *, uint64_t *);
 extern int
 qla2x00_read_sfp(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t, uint16_t);
 
+extern int
+qla2x00_read_edc(scsi_qla_host_t *, uint16_t, uint16_t, dma_addr_t,
+    uint8_t *, uint16_t, uint16_t);
+
+extern int
+qla2x00_write_edc(scsi_qla_host_t *, uint16_t, uint16_t, dma_addr_t,
+    uint8_t *, uint16_t, uint16_t);
+
 extern int
 qla2x00_set_idma_speed(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t *);
 
@@ -269,6 +279,15 @@ extern int qla84xx_verify_chip(struct scsi_qla_host *, uint16_t *);
 
 extern int qla81xx_idc_ack(scsi_qla_host_t *, uint16_t *);
 
+extern int
+qla81xx_fac_get_sector_size(scsi_qla_host_t *, uint32_t *);
+
+extern int
+qla81xx_fac_do_write_enable(scsi_qla_host_t *, int);
+
+extern int
+qla81xx_fac_erase_sector(scsi_qla_host_t *, uint32_t, uint32_t);
+
 /*
  * Global Function Prototypes in qla_isr.c source file.
  */
index 87f9abc714604b9927b019ebb67f71cf11f01c5a..bd7dd84c06485b4947ef4f38b66a799ff7230305 100644 (file)
@@ -20,7 +20,6 @@
 *  QLogic ISP2x00 Hardware Support Function Prototypes.
 */
 static int qla2x00_isp_firmware(scsi_qla_host_t *);
-static void qla2x00_resize_request_q(scsi_qla_host_t *);
 static int qla2x00_setup_chip(scsi_qla_host_t *);
 static int qla2x00_init_rings(scsi_qla_host_t *);
 static int qla2x00_fw_ready(scsi_qla_host_t *);
@@ -61,8 +60,10 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha)
        int     rval;
        struct qla_hw_data *ha = vha->hw;
        struct req_que *req = ha->req_q_map[0];
+
        /* Clear adapter flags. */
        vha->flags.online = 0;
+       ha->flags.chip_reset_done = 0;
        vha->flags.reset_active = 0;
        atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
        atomic_set(&vha->loop_state, LOOP_DOWN);
@@ -70,7 +71,6 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha)
        vha->dpc_flags = 0;
        vha->flags.management_server_logged_in = 0;
        vha->marker_needed = 0;
-       ha->mbx_flags = 0;
        ha->isp_abort_cnt = 0;
        ha->beacon_blink_led = 0;
        set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
@@ -131,6 +131,7 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha)
                }
        }
        rval = qla2x00_init_rings(vha);
+       ha->flags.chip_reset_done = 1;
 
        return (rval);
 }
@@ -512,7 +513,6 @@ qla2x00_reset_chip(scsi_qla_host_t *vha)
 static inline void
 qla24xx_reset_risc(scsi_qla_host_t *vha)
 {
-       int hw_evt = 0;
        unsigned long flags = 0;
        struct qla_hw_data *ha = vha->hw;
        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
@@ -542,8 +542,6 @@ qla24xx_reset_risc(scsi_qla_host_t *vha)
                d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
                barrier();
        }
-       if (cnt == 0)
-               hw_evt = 1;
 
        /* Wait for soft-reset to complete. */
        d2 = RD_REG_DWORD(&reg->ctrl_status);
@@ -816,7 +814,7 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
                qla_printk(KERN_INFO, ha, "Allocated (%d KB) for FCE...\n",
                    FCE_SIZE / 1024);
 
-               fce_size = sizeof(struct qla2xxx_fce_chain) + EFT_SIZE;
+               fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
                ha->flags.fce_enabled = 1;
                ha->fce_dma = tc_dma;
                ha->fce = tc;
@@ -893,62 +891,6 @@ cont_alloc:
            htonl(offsetof(struct qla2xxx_fw_dump, isp));
 }
 
-/**
- * qla2x00_resize_request_q() - Resize request queue given available ISP memory.
- * @ha: HA context
- *
- * Returns 0 on success.
- */
-static void
-qla2x00_resize_request_q(scsi_qla_host_t *vha)
-{
-       int rval;
-       uint16_t fw_iocb_cnt = 0;
-       uint16_t request_q_length = REQUEST_ENTRY_CNT_2XXX_EXT_MEM;
-       dma_addr_t request_dma;
-       request_t *request_ring;
-       struct qla_hw_data *ha = vha->hw;
-       struct req_que *req = ha->req_q_map[0];
-
-       /* Valid only on recent ISPs. */
-       if (IS_QLA2100(ha) || IS_QLA2200(ha))
-               return;
-
-       /* Retrieve IOCB counts available to the firmware. */
-       rval = qla2x00_get_resource_cnts(vha, NULL, NULL, NULL, &fw_iocb_cnt,
-                                       &ha->max_npiv_vports);
-       if (rval)
-               return;
-       /* No point in continuing if current settings are sufficient. */
-       if (fw_iocb_cnt < 1024)
-               return;
-       if (req->length >= request_q_length)
-               return;
-
-       /* Attempt to claim larger area for request queue. */
-       request_ring = dma_alloc_coherent(&ha->pdev->dev,
-           (request_q_length + 1) * sizeof(request_t), &request_dma,
-           GFP_KERNEL);
-       if (request_ring == NULL)
-               return;
-
-       /* Resize successful, report extensions. */
-       qla_printk(KERN_INFO, ha, "Extended memory detected (%d KB)...\n",
-           (ha->fw_memory_size + 1) / 1024);
-       qla_printk(KERN_INFO, ha, "Resizing request queue depth "
-           "(%d -> %d)...\n", req->length, request_q_length);
-
-       /* Clear old allocations. */
-       dma_free_coherent(&ha->pdev->dev,
-           (req->length + 1) * sizeof(request_t), req->ring,
-           req->dma);
-
-       /* Begin using larger queue. */
-       req->length = request_q_length;
-       req->ring = request_ring;
-       req->dma = request_dma;
-}
-
 /**
  * qla2x00_setup_chip() - Load and start RISC firmware.
  * @ha: HA context
@@ -963,6 +905,7 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
        struct qla_hw_data *ha = vha->hw;
        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
        unsigned long flags;
+       uint16_t fw_major_version;
 
        if (!IS_FWI2_CAPABLE(ha) && !IS_QLA2100(ha) && !IS_QLA2200(ha)) {
                /* Disable SRAM, Instruction RAM and GP RAM parity.  */
@@ -986,13 +929,15 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
 
                        rval = qla2x00_execute_fw(vha, srisc_address);
                        /* Retrieve firmware information. */
-                       if (rval == QLA_SUCCESS && ha->fw_major_version == 0) {
+                       if (rval == QLA_SUCCESS) {
+                               fw_major_version = ha->fw_major_version;
                                qla2x00_get_fw_version(vha,
                                    &ha->fw_major_version,
                                    &ha->fw_minor_version,
                                    &ha->fw_subminor_version,
                                    &ha->fw_attributes, &ha->fw_memory_size,
-                                   ha->mpi_version, &ha->mpi_capabilities);
+                                   ha->mpi_version, &ha->mpi_capabilities,
+                                   ha->phy_version);
                                ha->flags.npiv_supported = 0;
                                if (IS_QLA2XXX_MIDTYPE(ha) &&
                                         (ha->fw_attributes & BIT_2)) {
@@ -1003,9 +948,11 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
                                                ha->max_npiv_vports =
                                                    MIN_MULTI_ID_FABRIC - 1;
                                }
-                               qla2x00_resize_request_q(vha);
+                               qla2x00_get_resource_cnts(vha, NULL,
+                                   &ha->fw_xcb_count, NULL, NULL,
+                                   &ha->max_npiv_vports);
 
-                               if (ql2xallocfwdump)
+                               if (!fw_major_version && ql2xallocfwdump)
                                        qla2x00_alloc_fw_dump(vha);
                        }
                } else {
@@ -1028,6 +975,21 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
                spin_unlock_irqrestore(&ha->hardware_lock, flags);
        }
 
+       if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) {
+               uint32_t size;
+
+               rval = qla81xx_fac_get_sector_size(vha, &size);
+               if (rval == QLA_SUCCESS) {
+                       ha->flags.fac_supported = 1;
+                       ha->fdt_block_size = size << 2;
+               } else {
+                       qla_printk(KERN_ERR, ha,
+                           "Unsupported FAC firmware (%d.%02d.%02d).\n",
+                           ha->fw_major_version, ha->fw_minor_version,
+                           ha->fw_subminor_version);
+               }
+       }
+
        if (rval) {
                DEBUG2_3(printk("scsi(%ld): Setup chip **** FAILED ****.\n",
                    vha->host_no));
@@ -1314,8 +1276,11 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
                mid_init_cb->count = cpu_to_le16(ha->max_npiv_vports);
        }
 
-
-       mid_init_cb->options = __constant_cpu_to_le16(BIT_1);
+       if (IS_FWI2_CAPABLE(ha)) {
+               mid_init_cb->options = __constant_cpu_to_le16(BIT_1);
+               mid_init_cb->init_cb.execution_throttle =
+                   cpu_to_le16(ha->fw_xcb_count);
+       }
 
        rval = qla2x00_init_firmware(vha, ha->init_cb_size);
        if (rval) {
@@ -1989,7 +1954,6 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags)
        fcport->port_type = FCT_UNKNOWN;
        fcport->loop_id = FC_NO_LOOP_ID;
        atomic_set(&fcport->state, FCS_UNCONFIGURED);
-       fcport->flags = FCF_RLC_SUPPORT;
        fcport->supported_classes = FC_COS_UNSPECIFIED;
 
        return fcport;
@@ -2171,7 +2135,6 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
                            vha->host_no, fcport->loop_id));
 
                        atomic_set(&fcport->state, FCS_DEVICE_LOST);
-                       fcport->flags &= ~FCF_FARP_DONE;
                }
        }
 
@@ -2228,8 +2191,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
                            WWN_SIZE))
                                continue;
 
-                       fcport->flags &= ~(FCF_FABRIC_DEVICE |
-                           FCF_PERSISTENT_BOUND);
+                       fcport->flags &= ~FCF_FABRIC_DEVICE;
                        fcport->loop_id = new_fcport->loop_id;
                        fcport->port_type = new_fcport->port_type;
                        fcport->d_id.b24 = new_fcport->d_id.b24;
@@ -2242,7 +2204,6 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
 
                if (!found) {
                        /* New device, add to fcports list. */
-                       new_fcport->flags &= ~FCF_PERSISTENT_BOUND;
                        if (vha->vp_idx) {
                                new_fcport->vha = vha;
                                new_fcport->vp_idx = vha->vp_idx;
@@ -2275,11 +2236,6 @@ cleanup_allocation:
                    "rval=%x\n", vha->host_no, rval));
        }
 
-       if (found_devs) {
-               vha->device_flags |= DFLG_LOCAL_DEVICES;
-               vha->device_flags &= ~DFLG_RETRY_LOCAL_DEVICES;
-       }
-
        return (rval);
 }
 
@@ -2765,7 +2721,6 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
                                fcport->loop_id = FC_NO_LOOP_ID;
                                fcport->flags |= (FCF_FABRIC_DEVICE |
                                    FCF_LOGIN_NEEDED);
-                               fcport->flags &= ~FCF_PERSISTENT_BOUND;
                                break;
                        }
 
@@ -2808,9 +2763,6 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
        kfree(swl);
        kfree(new_fcport);
 
-       if (!list_empty(new_fcports))
-               vha->device_flags |= DFLG_FABRIC_DEVICES;
-
        return (rval);
 }
 
@@ -2993,7 +2945,6 @@ qla2x00_device_resync(scsi_qla_host_t *vha)
                                            0, 0);
                                }
                        }
-                       fcport->flags &= ~FCF_FARP_DONE;
                }
        }
        return (rval);
@@ -3302,6 +3253,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
 
        if (vha->flags.online) {
                vha->flags.online = 0;
+               ha->flags.chip_reset_done = 0;
                clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
                ha->qla_stats.total_isp_aborts++;
 
@@ -3451,6 +3403,7 @@ qla2x00_restart_isp(scsi_qla_host_t *vha)
 
        if (!status && !(status = qla2x00_init_rings(vha))) {
                clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
+               ha->flags.chip_reset_done = 1;
                /* Initialize the queues in use */
                qla25xx_init_queues(ha);
 
@@ -4338,23 +4291,17 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
 
        /* Determine NVRAM starting address. */
        ha->nvram_size = sizeof(struct nvram_81xx);
-       ha->nvram_base = FA_NVRAM_FUNC0_ADDR;
        ha->vpd_size = FA_NVRAM_VPD_SIZE;
-       ha->vpd_base = FA_NVRAM_VPD0_ADDR;
-       if (PCI_FUNC(ha->pdev->devfn) & 1) {
-               ha->nvram_base = FA_NVRAM_FUNC1_ADDR;
-               ha->vpd_base = FA_NVRAM_VPD1_ADDR;
-       }
 
        /* Get VPD data into cache */
        ha->vpd = ha->nvram + VPD_OFFSET;
-       ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd,
-           ha->nvram_base - FA_NVRAM_FUNC0_ADDR, FA_NVRAM_VPD_SIZE * 4);
+       ha->isp_ops->read_optrom(vha, ha->vpd, ha->flt_region_vpd << 2,
+           ha->vpd_size);
 
        /* Get NVRAM data into cache and calculate checksum. */
-       dptr = (uint32_t *)nv;
-       ha->isp_ops->read_nvram(vha, (uint8_t *)dptr, ha->nvram_base,
+       ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram << 2,
            ha->nvram_size);
+       dptr = (uint32_t *)nv;
        for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++)
                chksum += le32_to_cpu(*dptr++);
 
@@ -4452,6 +4399,9 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
                icb->enode_mac[5] = 0x06 + PCI_FUNC(ha->pdev->devfn);
        }
 
+       /* Use extended-initialization control block. */
+       memcpy(ha->ex_init_cb, &nv->ex_version, sizeof(*ha->ex_init_cb));
+
        /*
         * Setup driver NVRAM options.
         */
index 2258152b1f41bf8660b4351a2a5af8851ce09441..a8abbb95730df7d39eda9721471f04f4af1dd8db 100644 (file)
@@ -776,7 +776,7 @@ qla24xx_start_scsi(srb_t *sp)
 
        req_cnt = qla24xx_calc_iocbs(tot_dsds);
        if (req->cnt < (req_cnt + 2)) {
-               cnt = ha->isp_ops->rd_req_reg(ha, req->id);
+               cnt = RD_REG_DWORD_RELAXED(req->req_q_out);
 
                if (req->ring_index < cnt)
                        req->cnt = cnt - req->ring_index;
@@ -836,7 +836,8 @@ qla24xx_start_scsi(srb_t *sp)
        sp->flags |= SRB_DMA_VALID;
 
        /* Set chip new ring index. */
-       ha->isp_ops->wrt_req_reg(ha, req->id, req->ring_index);
+       WRT_REG_DWORD(req->req_q_in, req->ring_index);
+       RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr);
 
        /* Manage unprocessed RIO/ZIO commands in response queue. */
        if (vha->flags.process_response_queue &&
@@ -854,35 +855,3 @@ queuing_error:
 
        return QLA_FUNCTION_FAILED;
 }
-
-uint16_t
-qla24xx_rd_req_reg(struct qla_hw_data *ha, uint16_t id)
-{
-       device_reg_t __iomem *reg = (void *) ha->iobase;
-       return RD_REG_DWORD_RELAXED(&reg->isp24.req_q_out);
-}
-
-uint16_t
-qla25xx_rd_req_reg(struct qla_hw_data *ha, uint16_t id)
-{
-       device_reg_t __iomem *reg = (void *) ha->mqiobase + QLA_QUE_PAGE * id;
-       return RD_REG_DWORD_RELAXED(&reg->isp25mq.req_q_out);
-}
-
-void
-qla24xx_wrt_req_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index)
-{
-       device_reg_t __iomem *reg = (void *) ha->iobase;
-       WRT_REG_DWORD(&reg->isp24.req_q_in, index);
-       RD_REG_DWORD_RELAXED(&reg->isp24.req_q_in);
-}
-
-void
-qla25xx_wrt_req_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index)
-{
-       device_reg_t __iomem *reg = (void *) ha->mqiobase + QLA_QUE_PAGE * id;
-       struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp;
-       WRT_REG_DWORD(&reg->isp25mq.req_q_in, index);
-       RD_REG_DWORD(&ioreg->hccr); /* PCI posting */
-}
-
index f250e5b7897cf7387f14579d50dd9462c2b0dc28..d04981848e561aed9e9c7853619f78c532d84174 100644 (file)
@@ -852,9 +852,6 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha,
                /* Free outstanding command slot. */
                req->outstanding_cmds[index] = NULL;
 
-               CMD_COMPL_STATUS(sp->cmd) = 0L;
-               CMD_SCSI_STATUS(sp->cmd) = 0L;
-
                /* Save ISP completion status */
                sp->cmd->result = DID_OK << 16;
 
@@ -955,7 +952,6 @@ qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t sense_len)
        if (sense_len >= SCSI_SENSE_BUFFERSIZE)
                sense_len = SCSI_SENSE_BUFFERSIZE;
 
-       CMD_ACTUAL_SNSLEN(cp) = sense_len;
        sp->request_sense_length = sense_len;
        sp->request_sense_ptr = cp->sense_buffer;
        if (sp->request_sense_length > 32)
@@ -973,8 +969,7 @@ qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t sense_len)
            cp->device->channel, cp->device->id, cp->device->lun, cp,
            cp->serial_number));
        if (sense_len)
-               DEBUG5(qla2x00_dump_buffer(cp->sense_buffer,
-                   CMD_ACTUAL_SNSLEN(cp)));
+               DEBUG5(qla2x00_dump_buffer(cp->sense_buffer, sense_len));
 }
 
 /**
@@ -1043,9 +1038,6 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
        }
 
        lscsi_status = scsi_status & STATUS_MASK;
-       CMD_ENTRY_STATUS(cp) = sts->entry_status;
-       CMD_COMPL_STATUS(cp) = comp_status;
-       CMD_SCSI_STATUS(cp) = scsi_status;
 
        fcport = sp->fcport;
 
@@ -1104,7 +1096,6 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
                if (scsi_status & (SS_RESIDUAL_UNDER | SS_RESIDUAL_OVER)) {
                        resid = resid_len;
                        scsi_set_resid(cp, resid);
-                       CMD_RESID_LEN(cp) = resid;
 
                        if (!lscsi_status &&
                            ((unsigned)(scsi_bufflen(cp) - resid) <
@@ -1160,7 +1151,6 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
 
                if (scsi_status & SS_RESIDUAL_UNDER) {
                        scsi_set_resid(cp, resid);
-                       CMD_RESID_LEN(cp) = resid;
                } else {
                        DEBUG2(printk(KERN_INFO
                            "scsi(%ld:%d:%d) UNDERRUN status detected "
@@ -1499,7 +1489,6 @@ qla24xx_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
 void
 qla24xx_process_response_queue(struct rsp_que *rsp)
 {
-       struct qla_hw_data *ha = rsp->hw;
        struct sts_entry_24xx *pkt;
        struct scsi_qla_host *vha;
 
@@ -1553,7 +1542,7 @@ qla24xx_process_response_queue(struct rsp_que *rsp)
        }
 
        /* Adjust ring index */
-       ha->isp_ops->wrt_rsp_reg(ha, rsp->id, rsp->ring_index);
+       WRT_REG_DWORD(rsp->rsp_q_out, rsp->ring_index);
 }
 
 static void
@@ -2029,7 +2018,7 @@ skip_msix:
 skip_msi:
 
        ret = request_irq(ha->pdev->irq, ha->isp_ops->intr_handler,
-           IRQF_DISABLED|IRQF_SHARED, QLA2XXX_DRIVER_NAME, rsp);
+           IRQF_SHARED, QLA2XXX_DRIVER_NAME, rsp);
        if (ret) {
                qla_printk(KERN_WARNING, ha,
                    "Failed to reserve interrupt %d already in use.\n",
@@ -2117,18 +2106,3 @@ int qla25xx_request_irq(struct rsp_que *rsp)
        msix->rsp = rsp;
        return ret;
 }
-
-void
-qla25xx_wrt_rsp_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index)
-{
-       device_reg_t __iomem *reg = (void *) ha->mqiobase + QLA_QUE_PAGE * id;
-       WRT_REG_DWORD(&reg->isp25mq.rsp_q_out, index);
-}
-
-void
-qla24xx_wrt_rsp_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index)
-{
-       device_reg_t __iomem *reg = (void *) ha->iobase;
-       WRT_REG_DWORD(&reg->isp24.rsp_q_out, index);
-}
-
index 4aab7acf752550abf7942875df557c273ed0f0cc..e67c1660bf4671aacf54c43e35dca5182b81fc33 100644 (file)
@@ -45,6 +45,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
        struct qla_hw_data *ha = vha->hw;
        scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
 
+       if (ha->pdev->error_state > pci_channel_io_frozen)
+               return QLA_FUNCTION_TIMEOUT;
+
        reg = ha->iobase;
        io_lock_on = base_vha->flags.init_done;
 
@@ -408,7 +411,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
 void
 qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor,
     uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi,
-    uint32_t *mpi_caps)
+    uint32_t *mpi_caps, uint8_t *phy)
 {
        int             rval;
        mbx_cmd_t       mc;
@@ -420,7 +423,7 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor,
        mcp->out_mb = MBX_0;
        mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
        if (IS_QLA81XX(vha->hw))
-               mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10;
+               mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8;
        mcp->flags = 0;
        mcp->tov = MBX_TOV_SECONDS;
        rval = qla2x00_mailbox_command(vha, mcp);
@@ -435,11 +438,13 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor,
        else
                *memory = (mcp->mb[5] << 16) | mcp->mb[4];
        if (IS_QLA81XX(vha->hw)) {
-               mpi[0] = mcp->mb[10] >> 8;
-               mpi[1] = mcp->mb[10] & 0xff;
-               mpi[2] = mcp->mb[11] >> 8;
-               mpi[3] = mcp->mb[11] & 0xff;
+               mpi[0] = mcp->mb[10] & 0xff;
+               mpi[1] = mcp->mb[11] >> 8;
+               mpi[2] = mcp->mb[11] & 0xff;
                *mpi_caps = (mcp->mb[12] << 16) | mcp->mb[13];
+               phy[0] = mcp->mb[8] & 0xff;
+               phy[1] = mcp->mb[9] >> 8;
+               phy[2] = mcp->mb[9] & 0xff;
        }
 
        if (rval != QLA_SUCCESS) {
@@ -1043,14 +1048,22 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
        else
                mcp->mb[0] = MBC_INITIALIZE_FIRMWARE;
 
+       mcp->mb[1] = 0;
        mcp->mb[2] = MSW(ha->init_cb_dma);
        mcp->mb[3] = LSW(ha->init_cb_dma);
-       mcp->mb[4] = 0;
-       mcp->mb[5] = 0;
        mcp->mb[6] = MSW(MSD(ha->init_cb_dma));
        mcp->mb[7] = LSW(MSD(ha->init_cb_dma));
-       mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
-       mcp->in_mb = MBX_5|MBX_4|MBX_0;
+       mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
+       if (IS_QLA81XX(ha) && ha->ex_init_cb->ex_version) {
+               mcp->mb[1] = BIT_0;
+               mcp->mb[10] = MSW(ha->ex_init_cb_dma);
+               mcp->mb[11] = LSW(ha->ex_init_cb_dma);
+               mcp->mb[12] = MSW(MSD(ha->ex_init_cb_dma));
+               mcp->mb[13] = LSW(MSD(ha->ex_init_cb_dma));
+               mcp->mb[14] = sizeof(*ha->ex_init_cb);
+               mcp->out_mb |= MBX_14|MBX_13|MBX_12|MBX_11|MBX_10;
+       }
+       mcp->in_mb = MBX_0;
        mcp->buf_size = size;
        mcp->flags = MBX_DMA_OUT;
        mcp->tov = MBX_TOV_SECONDS;
@@ -1187,10 +1200,6 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt)
                fcport->d_id.b.al_pa = pd->port_id[2];
                fcport->d_id.b.rsvd_1 = 0;
 
-               /* Check for device require authentication. */
-               pd->common_features & BIT_5 ? (fcport->flags |= FCF_AUTH_REQ) :
-                   (fcport->flags &= ~FCF_AUTH_REQ);
-
                /* If not target must be initiator or unknown type. */
                if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0)
                        fcport->port_type = FCT_INITIATOR;
@@ -3218,3 +3227,204 @@ qla81xx_idc_ack(scsi_qla_host_t *vha, uint16_t *mb)
 
        return rval;
 }
+
+int
+qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size)
+{
+       int rval;
+       mbx_cmd_t mc;
+       mbx_cmd_t *mcp = &mc;
+
+       if (!IS_QLA81XX(vha->hw))
+               return QLA_FUNCTION_FAILED;
+
+       DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
+
+       mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
+       mcp->mb[1] = FAC_OPT_CMD_GET_SECTOR_SIZE;
+       mcp->out_mb = MBX_1|MBX_0;
+       mcp->in_mb = MBX_1|MBX_0;
+       mcp->tov = MBX_TOV_SECONDS;
+       mcp->flags = 0;
+       rval = qla2x00_mailbox_command(vha, mcp);
+
+       if (rval != QLA_SUCCESS) {
+               DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n",
+                   __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1]));
+       } else {
+               DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no));
+               *sector_size = mcp->mb[1];
+       }
+
+       return rval;
+}
+
+int
+qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable)
+{
+       int rval;
+       mbx_cmd_t mc;
+       mbx_cmd_t *mcp = &mc;
+
+       if (!IS_QLA81XX(vha->hw))
+               return QLA_FUNCTION_FAILED;
+
+       DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
+
+       mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
+       mcp->mb[1] = enable ? FAC_OPT_CMD_WRITE_ENABLE :
+           FAC_OPT_CMD_WRITE_PROTECT;
+       mcp->out_mb = MBX_1|MBX_0;
+       mcp->in_mb = MBX_1|MBX_0;
+       mcp->tov = MBX_TOV_SECONDS;
+       mcp->flags = 0;
+       rval = qla2x00_mailbox_command(vha, mcp);
+
+       if (rval != QLA_SUCCESS) {
+               DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n",
+                   __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1]));
+       } else {
+               DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no));
+       }
+
+       return rval;
+}
+
+int
+qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish)
+{
+       int rval;
+       mbx_cmd_t mc;
+       mbx_cmd_t *mcp = &mc;
+
+       if (!IS_QLA81XX(vha->hw))
+               return QLA_FUNCTION_FAILED;
+
+       DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
+
+       mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
+       mcp->mb[1] = FAC_OPT_CMD_ERASE_SECTOR;
+       mcp->mb[2] = LSW(start);
+       mcp->mb[3] = MSW(start);
+       mcp->mb[4] = LSW(finish);
+       mcp->mb[5] = MSW(finish);
+       mcp->out_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
+       mcp->in_mb = MBX_2|MBX_1|MBX_0;
+       mcp->tov = MBX_TOV_SECONDS;
+       mcp->flags = 0;
+       rval = qla2x00_mailbox_command(vha, mcp);
+
+       if (rval != QLA_SUCCESS) {
+               DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
+                   "mb[2]=%x.\n", __func__, vha->host_no, rval, mcp->mb[0],
+                   mcp->mb[1], mcp->mb[2]));
+       } else {
+               DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no));
+       }
+
+       return rval;
+}
+
+int
+qla81xx_restart_mpi_firmware(scsi_qla_host_t *vha)
+{
+       int rval = 0;
+       mbx_cmd_t mc;
+       mbx_cmd_t *mcp = &mc;
+
+       DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
+
+       mcp->mb[0] = MBC_RESTART_MPI_FW;
+       mcp->out_mb = MBX_0;
+       mcp->in_mb = MBX_0|MBX_1;
+       mcp->tov = MBX_TOV_SECONDS;
+       mcp->flags = 0;
+       rval = qla2x00_mailbox_command(vha, mcp);
+
+       if (rval != QLA_SUCCESS) {
+               DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x mb[1]=0x%x.\n",
+                   __func__, vha->host_no, rval, mcp->mb[0], mcp->mb[1]));
+       } else {
+               DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no));
+       }
+
+       return rval;
+}
+
+int
+qla2x00_read_edc(scsi_qla_host_t *vha, uint16_t dev, uint16_t adr,
+    dma_addr_t sfp_dma, uint8_t *sfp, uint16_t len, uint16_t opt)
+{
+       int rval;
+       mbx_cmd_t mc;
+       mbx_cmd_t *mcp = &mc;
+
+       DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
+
+       mcp->mb[0] = MBC_READ_SFP;
+       mcp->mb[1] = dev;
+       mcp->mb[2] = MSW(sfp_dma);
+       mcp->mb[3] = LSW(sfp_dma);
+       mcp->mb[6] = MSW(MSD(sfp_dma));
+       mcp->mb[7] = LSW(MSD(sfp_dma));
+       mcp->mb[8] = len;
+       mcp->mb[9] = adr;
+       mcp->mb[10] = opt;
+       mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
+       mcp->in_mb = MBX_0;
+       mcp->tov = MBX_TOV_SECONDS;
+       mcp->flags = 0;
+       rval = qla2x00_mailbox_command(vha, mcp);
+
+       if (opt & BIT_0)
+               if (sfp)
+                       *sfp = mcp->mb[8];
+
+       if (rval != QLA_SUCCESS) {
+               DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__,
+                   vha->host_no, rval, mcp->mb[0]));
+       } else {
+               DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
+       }
+
+       return rval;
+}
+
+int
+qla2x00_write_edc(scsi_qla_host_t *vha, uint16_t dev, uint16_t adr,
+    dma_addr_t sfp_dma, uint8_t *sfp, uint16_t len, uint16_t opt)
+{
+       int rval;
+       mbx_cmd_t mc;
+       mbx_cmd_t *mcp = &mc;
+
+       DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
+
+       if (opt & BIT_0)
+               if (sfp)
+                       len = *sfp;
+
+       mcp->mb[0] = MBC_WRITE_SFP;
+       mcp->mb[1] = dev;
+       mcp->mb[2] = MSW(sfp_dma);
+       mcp->mb[3] = LSW(sfp_dma);
+       mcp->mb[6] = MSW(MSD(sfp_dma));
+       mcp->mb[7] = LSW(MSD(sfp_dma));
+       mcp->mb[8] = len;
+       mcp->mb[9] = adr;
+       mcp->mb[10] = opt;
+       mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
+       mcp->in_mb = MBX_0;
+       mcp->tov = MBX_TOV_SECONDS;
+       mcp->flags = 0;
+       rval = qla2x00_mailbox_command(vha, mcp);
+
+       if (rval != QLA_SUCCESS) {
+               DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__,
+                   vha->host_no, rval, mcp->mb[0]));
+       } else {
+               DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no));
+       }
+
+       return rval;
+}
index 785c61279e6e47c582329f08e6ea47ca9a159c44..51716c7e30083495ebcc59ed387fd498472ac181 100644 (file)
@@ -359,7 +359,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
        scsi_qla_host_t *base_vha = shost_priv(fc_vport->shost);
        struct qla_hw_data *ha = base_vha->hw;
        scsi_qla_host_t *vha;
-       struct scsi_host_template *sht = &qla24xx_driver_template;
+       struct scsi_host_template *sht = &qla2xxx_driver_template;
        struct Scsi_Host *host;
 
        vha = qla2x00_create_host(sht, ha);
@@ -584,6 +584,7 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options,
        struct req_que *req = NULL;
        struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
        uint16_t que_id = 0;
+       device_reg_t __iomem *reg;
 
        req = kzalloc(sizeof(struct req_que), GFP_KERNEL);
        if (req == NULL) {
@@ -631,6 +632,9 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options,
        req->ring_index = 0;
        req->cnt = req->length;
        req->id = que_id;
+       reg = ISP_QUE_REG(ha, que_id);
+       req->req_q_in = &reg->isp25mq.req_q_in;
+       req->req_q_out = &reg->isp25mq.req_q_out;
        req->max_q_depth = ha->req_q_map[0]->max_q_depth;
        mutex_unlock(&ha->vport_lock);
 
@@ -658,7 +662,8 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options,
        int ret = 0;
        struct rsp_que *rsp = NULL;
        struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
-       uint16_t que_id = 0;;
+       uint16_t que_id = 0;
+       device_reg_t __iomem *reg;
 
        rsp = kzalloc(sizeof(struct rsp_que), GFP_KERNEL);
        if (rsp == NULL) {
@@ -706,6 +711,9 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options,
        rsp->ring_ptr = rsp->ring;
        rsp->ring_index = 0;
        rsp->id = que_id;
+       reg = ISP_QUE_REG(ha, que_id);
+       rsp->rsp_q_in = &reg->isp25mq.rsp_q_in;
+       rsp->rsp_q_out = &reg->isp25mq.rsp_q_out;
        mutex_unlock(&ha->vport_lock);
 
        ret = qla25xx_request_irq(rsp);
index 3ddfa889e94936205cb145278302b9ad144cd7c3..e4fdcdad80d0b7c12c1be44b0eb75a834ef37d49 100644 (file)
@@ -104,9 +104,7 @@ static int qla2xxx_slave_alloc(struct scsi_device *);
 static int qla2xxx_scan_finished(struct Scsi_Host *, unsigned long time);
 static void qla2xxx_scan_start(struct Scsi_Host *);
 static void qla2xxx_slave_destroy(struct scsi_device *);
-static int qla2x00_queuecommand(struct scsi_cmnd *cmd,
-               void (*fn)(struct scsi_cmnd *));
-static int qla24xx_queuecommand(struct scsi_cmnd *cmd,
+static int qla2xxx_queuecommand(struct scsi_cmnd *cmd,
                void (*fn)(struct scsi_cmnd *));
 static int qla2xxx_eh_abort(struct scsi_cmnd *);
 static int qla2xxx_eh_device_reset(struct scsi_cmnd *);
@@ -117,42 +115,10 @@ static int qla2xxx_eh_host_reset(struct scsi_cmnd *);
 static int qla2x00_change_queue_depth(struct scsi_device *, int);
 static int qla2x00_change_queue_type(struct scsi_device *, int);
 
-static struct scsi_host_template qla2x00_driver_template = {
+struct scsi_host_template qla2xxx_driver_template = {
        .module                 = THIS_MODULE,
        .name                   = QLA2XXX_DRIVER_NAME,
-       .queuecommand           = qla2x00_queuecommand,
-
-       .eh_abort_handler       = qla2xxx_eh_abort,
-       .eh_device_reset_handler = qla2xxx_eh_device_reset,
-       .eh_target_reset_handler = qla2xxx_eh_target_reset,
-       .eh_bus_reset_handler   = qla2xxx_eh_bus_reset,
-       .eh_host_reset_handler  = qla2xxx_eh_host_reset,
-
-       .slave_configure        = qla2xxx_slave_configure,
-
-       .slave_alloc            = qla2xxx_slave_alloc,
-       .slave_destroy          = qla2xxx_slave_destroy,
-       .scan_finished          = qla2xxx_scan_finished,
-       .scan_start             = qla2xxx_scan_start,
-       .change_queue_depth     = qla2x00_change_queue_depth,
-       .change_queue_type      = qla2x00_change_queue_type,
-       .this_id                = -1,
-       .cmd_per_lun            = 3,
-       .use_clustering         = ENABLE_CLUSTERING,
-       .sg_tablesize           = SG_ALL,
-
-       /*
-        * The RISC allows for each command to transfer (2^32-1) bytes of data,
-        * which equates to 0x800000 sectors.
-        */
-       .max_sectors            = 0xFFFF,
-       .shost_attrs            = qla2x00_host_attrs,
-};
-
-struct scsi_host_template qla24xx_driver_template = {
-       .module                 = THIS_MODULE,
-       .name                   = QLA2XXX_DRIVER_NAME,
-       .queuecommand           = qla24xx_queuecommand,
+       .queuecommand           = qla2xxx_queuecommand,
 
        .eh_abort_handler       = qla2xxx_eh_abort,
        .eh_device_reset_handler = qla2xxx_eh_device_reset,
@@ -430,73 +396,7 @@ qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport,
 }
 
 static int
-qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
-{
-       scsi_qla_host_t *vha = shost_priv(cmd->device->host);
-       fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
-       struct fc_rport *rport = starget_to_rport(scsi_target(cmd->device));
-       struct qla_hw_data *ha = vha->hw;
-       srb_t *sp;
-       int rval;
-
-       if (unlikely(pci_channel_offline(ha->pdev))) {
-               cmd->result = DID_REQUEUE << 16;
-               goto qc_fail_command;
-       }
-
-       rval = fc_remote_port_chkready(rport);
-       if (rval) {
-               cmd->result = rval;
-               goto qc_fail_command;
-       }
-
-       /* Close window on fcport/rport state-transitioning. */
-       if (fcport->drport)
-               goto qc_target_busy;
-
-       if (atomic_read(&fcport->state) != FCS_ONLINE) {
-               if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
-                   atomic_read(&vha->loop_state) == LOOP_DEAD) {
-                       cmd->result = DID_NO_CONNECT << 16;
-                       goto qc_fail_command;
-               }
-               goto qc_target_busy;
-       }
-
-       spin_unlock_irq(vha->host->host_lock);
-
-       sp = qla2x00_get_new_sp(vha, fcport, cmd, done);
-       if (!sp)
-               goto qc_host_busy_lock;
-
-       rval = ha->isp_ops->start_scsi(sp);
-       if (rval != QLA_SUCCESS)
-               goto qc_host_busy_free_sp;
-
-       spin_lock_irq(vha->host->host_lock);
-
-       return 0;
-
-qc_host_busy_free_sp:
-       qla2x00_sp_free_dma(sp);
-       mempool_free(sp, ha->srb_mempool);
-
-qc_host_busy_lock:
-       spin_lock_irq(vha->host->host_lock);
-       return SCSI_MLQUEUE_HOST_BUSY;
-
-qc_target_busy:
-       return SCSI_MLQUEUE_TARGET_BUSY;
-
-qc_fail_command:
-       done(cmd);
-
-       return 0;
-}
-
-
-static int
-qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
+qla2xxx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 {
        scsi_qla_host_t *vha = shost_priv(cmd->device->host);
        fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
@@ -507,7 +407,10 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
        int rval;
 
        if (unlikely(pci_channel_offline(ha->pdev))) {
-               cmd->result = DID_REQUEUE << 16;
+               if (ha->pdev->error_state == pci_channel_io_frozen)
+                       cmd->result = DID_REQUEUE << 16;
+               else
+                       cmd->result = DID_NO_CONNECT << 16;
                goto qc24_fail_command;
        }
 
@@ -635,6 +538,34 @@ qla2x00_wait_for_hba_online(scsi_qla_host_t *vha)
        return (return_status);
 }
 
+int
+qla2x00_wait_for_chip_reset(scsi_qla_host_t *vha)
+{
+       int             return_status;
+       unsigned long   wait_reset;
+       struct qla_hw_data *ha = vha->hw;
+       scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
+
+       wait_reset = jiffies + (MAX_LOOP_TIMEOUT * HZ);
+       while (((test_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags)) ||
+           test_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags) ||
+           test_bit(ISP_ABORT_RETRY, &base_vha->dpc_flags) ||
+           ha->dpc_active) && time_before(jiffies, wait_reset)) {
+
+               msleep(1000);
+
+               if (!test_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags) &&
+                   ha->flags.chip_reset_done)
+                       break;
+       }
+       if (ha->flags.chip_reset_done)
+               return_status = QLA_SUCCESS;
+       else
+               return_status = QLA_FUNCTION_FAILED;
+
+       return return_status;
+}
+
 /*
  * qla2x00_wait_for_loop_ready
  *    Wait for MAX_LOOP_TIMEOUT(5 min) value for loop
@@ -1163,7 +1094,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
                        continue;
                for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
                        sp = req->outstanding_cmds[cnt];
-                       if (sp && sp->fcport->vha == vha) {
+                       if (sp) {
                                req->outstanding_cmds[cnt] = NULL;
                                sp->cmd->result = res;
                                qla2x00_sp_compl(ha, sp);
@@ -1245,10 +1176,10 @@ qla2x00_config_dma_addressing(struct qla_hw_data *ha)
        /* Assume a 32bit DMA mask. */
        ha->flags.enable_64bit_addressing = 0;
 
-       if (!dma_set_mask(&ha->pdev->dev, DMA_64BIT_MASK)) {
+       if (!dma_set_mask(&ha->pdev->dev, DMA_BIT_MASK(64))) {
                /* Any upper-dword bits set? */
                if (MSD(dma_get_required_mask(&ha->pdev->dev)) &&
-                   !pci_set_consistent_dma_mask(ha->pdev, DMA_64BIT_MASK)) {
+                   !pci_set_consistent_dma_mask(ha->pdev, DMA_BIT_MASK(64))) {
                        /* Ok, a 64bit DMA mask is applicable. */
                        ha->flags.enable_64bit_addressing = 1;
                        ha->isp_ops->calc_req_entries = qla2x00_calc_iocbs_64;
@@ -1257,8 +1188,8 @@ qla2x00_config_dma_addressing(struct qla_hw_data *ha)
                }
        }
 
-       dma_set_mask(&ha->pdev->dev, DMA_32BIT_MASK);
-       pci_set_consistent_dma_mask(ha->pdev, DMA_32BIT_MASK);
+       dma_set_mask(&ha->pdev->dev, DMA_BIT_MASK(32));
+       pci_set_consistent_dma_mask(ha->pdev, DMA_BIT_MASK(32));
 }
 
 static void
@@ -1351,9 +1282,6 @@ static struct isp_operations qla2100_isp_ops = {
        .write_optrom           = qla2x00_write_optrom_data,
        .get_flash_version      = qla2x00_get_flash_version,
        .start_scsi             = qla2x00_start_scsi,
-       .wrt_req_reg            = NULL,
-       .wrt_rsp_reg            = NULL,
-       .rd_req_reg             = NULL,
 };
 
 static struct isp_operations qla2300_isp_ops = {
@@ -1389,9 +1317,6 @@ static struct isp_operations qla2300_isp_ops = {
        .write_optrom           = qla2x00_write_optrom_data,
        .get_flash_version      = qla2x00_get_flash_version,
        .start_scsi             = qla2x00_start_scsi,
-       .wrt_req_reg            = NULL,
-       .wrt_rsp_reg            = NULL,
-       .rd_req_reg             = NULL,
 };
 
 static struct isp_operations qla24xx_isp_ops = {
@@ -1427,9 +1352,6 @@ static struct isp_operations qla24xx_isp_ops = {
        .write_optrom           = qla24xx_write_optrom_data,
        .get_flash_version      = qla24xx_get_flash_version,
        .start_scsi             = qla24xx_start_scsi,
-       .wrt_req_reg            = qla24xx_wrt_req_reg,
-       .wrt_rsp_reg            = qla24xx_wrt_rsp_reg,
-       .rd_req_reg             = qla24xx_rd_req_reg,
 };
 
 static struct isp_operations qla25xx_isp_ops = {
@@ -1465,9 +1387,6 @@ static struct isp_operations qla25xx_isp_ops = {
        .write_optrom           = qla24xx_write_optrom_data,
        .get_flash_version      = qla24xx_get_flash_version,
        .start_scsi             = qla24xx_start_scsi,
-       .wrt_req_reg            = qla24xx_wrt_req_reg,
-       .wrt_rsp_reg            = qla24xx_wrt_rsp_reg,
-       .rd_req_reg             = qla24xx_rd_req_reg,
 };
 
 static struct isp_operations qla81xx_isp_ops = {
@@ -1493,8 +1412,8 @@ static struct isp_operations qla81xx_isp_ops = {
        .build_iocbs            = NULL,
        .prep_ms_iocb           = qla24xx_prep_ms_iocb,
        .prep_ms_fdmi_iocb      = qla24xx_prep_ms_fdmi_iocb,
-       .read_nvram             = qla25xx_read_nvram_data,
-       .write_nvram            = qla25xx_write_nvram_data,
+       .read_nvram             = NULL,
+       .write_nvram            = NULL,
        .fw_dump                = qla81xx_fw_dump,
        .beacon_on              = qla24xx_beacon_on,
        .beacon_off             = qla24xx_beacon_off,
@@ -1503,9 +1422,6 @@ static struct isp_operations qla81xx_isp_ops = {
        .write_optrom           = qla24xx_write_optrom_data,
        .get_flash_version      = qla24xx_get_flash_version,
        .start_scsi             = qla24xx_start_scsi,
-       .wrt_req_reg            = qla24xx_wrt_req_reg,
-       .wrt_rsp_reg            = qla24xx_wrt_rsp_reg,
-       .rd_req_reg             = qla24xx_rd_req_reg,
 };
 
 static inline void
@@ -1727,7 +1643,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        struct rsp_que *rsp = NULL;
 
        bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
-       sht = &qla2x00_driver_template;
+       sht = &qla2xxx_driver_template;
        if (pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422 ||
            pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432 ||
            pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8432 ||
@@ -1736,7 +1652,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
            pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532 ||
            pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001) {
                bars = pci_select_bars(pdev, IORESOURCE_MEM);
-               sht = &qla24xx_driver_template;
                mem_only = 1;
        }
 
@@ -1927,10 +1842,16 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        ha->rsp_q_map[0] = rsp;
        ha->req_q_map[0] = req;
 
+       /* FWI2-capable only. */
+       req->req_q_in = &ha->iobase->isp24.req_q_in;
+       req->req_q_out = &ha->iobase->isp24.req_q_out;
+       rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in;
+       rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out;
        if (ha->mqenable) {
-               ha->isp_ops->wrt_req_reg = qla25xx_wrt_req_reg;
-               ha->isp_ops->wrt_rsp_reg = qla25xx_wrt_rsp_reg;
-               ha->isp_ops->rd_req_reg = qla25xx_rd_req_reg;
+               req->req_q_in = &ha->mqiobase->isp25mq.req_q_in;
+               req->req_q_out = &ha->mqiobase->isp25mq.req_q_out;
+               rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in;
+               rsp->rsp_q_out =  &ha->mqiobase->isp25mq.rsp_q_out;
        }
 
        if (qla2x00_initialize_adapter(base_vha)) {
@@ -2000,6 +1921,16 @@ probe_init_failed:
        ha->max_queues = 0;
 
 probe_failed:
+       if (base_vha->timer_active)
+               qla2x00_stop_timer(base_vha);
+       base_vha->flags.online = 0;
+       if (ha->dpc_thread) {
+               struct task_struct *t = ha->dpc_thread;
+
+               ha->dpc_thread = NULL;
+               kthread_stop(t);
+       }
+
        qla2x00_free_device(base_vha);
 
        scsi_host_put(base_vha->host);
@@ -2033,10 +1964,30 @@ qla2x00_remove_one(struct pci_dev *pdev)
 
        set_bit(UNLOADING, &base_vha->dpc_flags);
 
+       qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16);
+
        qla2x00_dfs_remove(base_vha);
 
        qla84xx_put_chip(base_vha);
 
+       /* Disable timer */
+       if (base_vha->timer_active)
+               qla2x00_stop_timer(base_vha);
+
+       base_vha->flags.online = 0;
+
+       /* Kill the kernel thread for this host */
+       if (ha->dpc_thread) {
+               struct task_struct *t = ha->dpc_thread;
+
+               /*
+                * qla2xxx_wake_dpc checks for ->dpc_thread
+                * so we need to zero it out.
+                */
+               ha->dpc_thread = NULL;
+               kthread_stop(t);
+       }
+
        qla2x00_free_sysfs_attr(base_vha);
 
        fc_remove_host(base_vha->host);
@@ -2065,25 +2016,6 @@ static void
 qla2x00_free_device(scsi_qla_host_t *vha)
 {
        struct qla_hw_data *ha = vha->hw;
-       qla2x00_abort_all_cmds(vha, DID_NO_CONNECT << 16);
-
-       /* Disable timer */
-       if (vha->timer_active)
-               qla2x00_stop_timer(vha);
-
-       vha->flags.online = 0;
-
-       /* Kill the kernel thread for this host */
-       if (ha->dpc_thread) {
-               struct task_struct *t = ha->dpc_thread;
-
-               /*
-                * qla2xxx_wake_dpc checks for ->dpc_thread
-                * so we need to zero it out.
-                */
-               ha->dpc_thread = NULL;
-               kthread_stop(t);
-       }
 
        if (ha->flags.fce_enabled)
                qla2x00_disable_fce_trace(vha, NULL, NULL);
@@ -2313,9 +2245,19 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
        } else
                ha->npiv_info = NULL;
 
+       /* Get consistent memory allocated for EX-INIT-CB. */
+       if (IS_QLA81XX(ha)) {
+               ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
+                   &ha->ex_init_cb_dma);
+               if (!ha->ex_init_cb)
+                       goto fail_ex_init_cb;
+       }
+
        INIT_LIST_HEAD(&ha->vp_list);
        return 1;
 
+fail_ex_init_cb:
+       kfree(ha->npiv_info);
 fail_npiv_info:
        dma_free_coherent(&ha->pdev->dev, ((*rsp)->length + 1) *
                sizeof(response_t), (*rsp)->ring, (*rsp)->dma);
@@ -2398,18 +2340,22 @@ qla2x00_mem_free(struct qla_hw_data *ha)
        if (ha->sfp_data)
                dma_pool_free(ha->s_dma_pool, ha->sfp_data, ha->sfp_data_dma);
 
+       if (ha->edc_data)
+               dma_pool_free(ha->s_dma_pool, ha->edc_data, ha->edc_data_dma);
+
        if (ha->ms_iocb)
                dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma);
 
+       if (ha->ex_init_cb)
+               dma_pool_free(ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma);
+
        if (ha->s_dma_pool)
                dma_pool_destroy(ha->s_dma_pool);
 
-
        if (ha->gid_list)
                dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list,
                ha->gid_list_dma);
 
-
        if (ha->init_cb)
                dma_free_coherent(&ha->pdev->dev, ha->init_cb_size,
                ha->init_cb, ha->init_cb_dma);
@@ -2428,6 +2374,8 @@ qla2x00_mem_free(struct qla_hw_data *ha)
        ha->ms_iocb_dma = 0;
        ha->init_cb = NULL;
        ha->init_cb_dma = 0;
+       ha->ex_init_cb = NULL;
+       ha->ex_init_cb_dma = 0;
 
        ha->s_dma_pool = NULL;
 
@@ -2914,19 +2862,11 @@ qla2x00_timer(scsi_qla_host_t *vha)
                                spin_unlock_irqrestore(&ha->hardware_lock,
                                                                cpu_flags);
                        }
-                       set_bit(ABORT_QUEUES_NEEDED, &vha->dpc_flags);
                        start_dpc++;
                }
 
                /* if the loop has been down for 4 minutes, reinit adapter */
                if (atomic_dec_and_test(&vha->loop_down_timer) != 0) {
-                       DEBUG(printk("scsi(%ld): Loop down exceed 4 mins - "
-                           "restarting queues.\n",
-                           vha->host_no));
-
-                       set_bit(RESTART_QUEUES_NEEDED, &vha->dpc_flags);
-                       start_dpc++;
-
                        if (!(vha->device_flags & DFLG_NO_CABLE) &&
                            !vha->vp_idx) {
                                DEBUG(printk("scsi(%ld): Loop down - "
@@ -3053,6 +2993,8 @@ qla2x00_release_firmware(void)
 static pci_ers_result_t
 qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
 {
+       scsi_qla_host_t *base_vha = pci_get_drvdata(pdev);
+
        switch (state) {
        case pci_channel_io_normal:
                return PCI_ERS_RESULT_CAN_RECOVER;
@@ -3060,7 +3002,7 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
                pci_disable_device(pdev);
                return PCI_ERS_RESULT_NEED_RESET;
        case pci_channel_io_perm_failure:
-               qla2x00_remove_one(pdev);
+               qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16);
                return PCI_ERS_RESULT_DISCONNECT;
        }
        return PCI_ERS_RESULT_NEED_RESET;
index 284827926effc096155dd3e755a2348fb03631d6..152ecfc26cd201e4ad0b304708e2962a7619afa2 100644 (file)
@@ -612,8 +612,8 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start)
 
        /* Good data.  Use specified location. */
        loc = locations[1];
-       *start = le16_to_cpu(fltl->start_hi) << 16 |
-           le16_to_cpu(fltl->start_lo);
+       *start = (le16_to_cpu(fltl->start_hi) << 16 |
+           le16_to_cpu(fltl->start_lo)) >> 2;
 end:
        DEBUG2(qla_printk(KERN_DEBUG, ha, "FLTL[%s] = 0x%x.\n", loc, *start));
        return QLA_SUCCESS;
@@ -629,6 +629,14 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
                { FA_BOOT_CODE_ADDR, FA_BOOT_CODE_ADDR, FA_BOOT_CODE_ADDR_81 };
        const uint32_t def_vpd_nvram[] =
                { FA_VPD_NVRAM_ADDR, FA_VPD_NVRAM_ADDR, FA_VPD_NVRAM_ADDR_81 };
+       const uint32_t def_vpd0[] =
+               { 0, 0, FA_VPD0_ADDR_81 };
+       const uint32_t def_vpd1[] =
+               { 0, 0, FA_VPD1_ADDR_81 };
+       const uint32_t def_nvram0[] =
+               { 0, 0, FA_NVRAM0_ADDR_81 };
+       const uint32_t def_nvram1[] =
+               { 0, 0, FA_NVRAM1_ADDR_81 };
        const uint32_t def_fdt[] =
                { FA_FLASH_DESCR_ADDR_24, FA_FLASH_DESCR_ADDR,
                        FA_FLASH_DESCR_ADDR_81 };
@@ -693,6 +701,20 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
                        break;
                case FLT_REG_VPD_0:
                        ha->flt_region_vpd_nvram = start;
+                       if (!(PCI_FUNC(ha->pdev->devfn) & 1))
+                               ha->flt_region_vpd = start;
+                       break;
+               case FLT_REG_VPD_1:
+                       if (PCI_FUNC(ha->pdev->devfn) & 1)
+                               ha->flt_region_vpd = start;
+                       break;
+               case FLT_REG_NVRAM_0:
+                       if (!(PCI_FUNC(ha->pdev->devfn) & 1))
+                               ha->flt_region_nvram = start;
+                       break;
+               case FLT_REG_NVRAM_1:
+                       if (PCI_FUNC(ha->pdev->devfn) & 1)
+                               ha->flt_region_nvram = start;
                        break;
                case FLT_REG_FDT:
                        ha->flt_region_fdt = start;
@@ -722,13 +744,18 @@ no_flash_data:
        ha->flt_region_fw = def_fw[def];
        ha->flt_region_boot = def_boot[def];
        ha->flt_region_vpd_nvram = def_vpd_nvram[def];
+       ha->flt_region_vpd = !(PCI_FUNC(ha->pdev->devfn) & 1) ?
+           def_vpd0[def]: def_vpd1[def];
+       ha->flt_region_nvram = !(PCI_FUNC(ha->pdev->devfn) & 1) ?
+           def_nvram0[def]: def_nvram1[def];
        ha->flt_region_fdt = def_fdt[def];
        ha->flt_region_npiv_conf = !(PCI_FUNC(ha->pdev->devfn) & 1) ?
            def_npiv_conf0[def]: def_npiv_conf1[def];
 done:
        DEBUG2(qla_printk(KERN_DEBUG, ha, "FLT[%s]: boot=0x%x fw=0x%x "
-           "vpd_nvram=0x%x fdt=0x%x flt=0x%x npiv=0x%x.\n", loc,
-           ha->flt_region_boot, ha->flt_region_fw, ha->flt_region_vpd_nvram,
+           "vpd_nvram=0x%x vpd=0x%x nvram=0x%x fdt=0x%x flt=0x%x "
+           "npiv=0x%x.\n", loc, ha->flt_region_boot, ha->flt_region_fw,
+           ha->flt_region_vpd_nvram, ha->flt_region_vpd, ha->flt_region_nvram,
            ha->flt_region_fdt, ha->flt_region_flt, ha->flt_region_npiv_conf));
 }
 
@@ -931,31 +958,41 @@ done:
        ha->npiv_info = NULL;
 }
 
-static void
-qla24xx_unprotect_flash(struct qla_hw_data *ha)
+static int
+qla24xx_unprotect_flash(scsi_qla_host_t *vha)
 {
+       struct qla_hw_data *ha = vha->hw;
        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
 
+       if (ha->flags.fac_supported)
+               return qla81xx_fac_do_write_enable(vha, 1);
+
        /* Enable flash write. */
        WRT_REG_DWORD(&reg->ctrl_status,
            RD_REG_DWORD(&reg->ctrl_status) | CSRX_FLASH_ENABLE);
        RD_REG_DWORD(&reg->ctrl_status);        /* PCI Posting. */
 
        if (!ha->fdt_wrt_disable)
-               return;
+               goto done;
 
        /* Disable flash write-protection, first clear SR protection bit */
        qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), 0);
        /* Then write zero again to clear remaining SR bits.*/
        qla24xx_write_flash_dword(ha, flash_conf_addr(ha, 0x101), 0);
+done:
+       return QLA_SUCCESS;
 }
 
-static void
-qla24xx_protect_flash(struct qla_hw_data *ha)
+static int
+qla24xx_protect_flash(scsi_qla_host_t *vha)
 {
        uint32_t cnt;
+       struct qla_hw_data *ha = vha->hw;
        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
 
+       if (ha->flags.fac_supported)
+               return qla81xx_fac_do_write_enable(vha, 0);
+
        if (!ha->fdt_wrt_disable)
                goto skip_wrt_protect;
 
@@ -973,6 +1010,26 @@ skip_wrt_protect:
        WRT_REG_DWORD(&reg->ctrl_status,
            RD_REG_DWORD(&reg->ctrl_status) & ~CSRX_FLASH_ENABLE);
        RD_REG_DWORD(&reg->ctrl_status);        /* PCI Posting. */
+
+       return QLA_SUCCESS;
+}
+
+static int
+qla24xx_erase_sector(scsi_qla_host_t *vha, uint32_t fdata)
+{
+       struct qla_hw_data *ha = vha->hw;
+       uint32_t start, finish;
+
+       if (ha->flags.fac_supported) {
+               start = fdata >> 2;
+               finish = start + (ha->fdt_block_size >> 2) - 1;
+               return qla81xx_fac_erase_sector(vha, flash_data_addr(ha,
+                   start), flash_data_addr(ha, finish));
+       }
+
+       return qla24xx_write_flash_dword(ha, ha->fdt_erase_cmd,
+           (fdata & 0xff00) | ((fdata << 16) & 0xff0000) |
+           ((fdata >> 16) & 0xff));
 }
 
 static int
@@ -987,8 +1044,6 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
        void *optrom = NULL;
        struct qla_hw_data *ha = vha->hw;
 
-       ret = QLA_SUCCESS;
-
        /* Prepare burst-capable write on supported ISPs. */
        if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && !(faddr & 0xfff) &&
            dwords > OPTROM_BURST_DWORDS) {
@@ -1004,7 +1059,12 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
        rest_addr = (ha->fdt_block_size >> 2) - 1;
        sec_mask = ~rest_addr;
 
-       qla24xx_unprotect_flash(ha);
+       ret = qla24xx_unprotect_flash(vha);
+       if (ret != QLA_SUCCESS) {
+               qla_printk(KERN_WARNING, ha,
+                   "Unable to unprotect flash for update.\n");
+               goto done;
+       }
 
        for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) {
                fdata = (faddr & sec_mask) << 2;
@@ -1017,9 +1077,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
                                    ha->fdt_unprotect_sec_cmd,
                                    (fdata & 0xff00) | ((fdata << 16) &
                                    0xff0000) | ((fdata >> 16) & 0xff));
-                       ret = qla24xx_write_flash_dword(ha, ha->fdt_erase_cmd,
-                           (fdata & 0xff00) |((fdata << 16) &
-                           0xff0000) | ((fdata >> 16) & 0xff));
+                       ret = qla24xx_erase_sector(vha, fdata);
                        if (ret != QLA_SUCCESS) {
                                DEBUG9(qla_printk("Unable to erase sector: "
                                    "address=%x.\n", faddr));
@@ -1073,8 +1131,11 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
                            0xff0000) | ((fdata >> 16) & 0xff));
        }
 
-       qla24xx_protect_flash(ha);
-
+       ret = qla24xx_protect_flash(vha);
+       if (ret != QLA_SUCCESS)
+               qla_printk(KERN_WARNING, ha,
+                   "Unable to protect flash after update.\n");
+done:
        if (optrom)
                dma_free_coherent(&ha->pdev->dev,
                    OPTROM_BURST_SIZE, optrom, optrom_dma);
@@ -1915,7 +1976,7 @@ qla2x00_resume_hba(struct scsi_qla_host *vha)
        clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags);
        set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
        qla2xxx_wake_dpc(vha);
-       qla2x00_wait_for_hba_online(vha);
+       qla2x00_wait_for_chip_reset(vha);
        scsi_unblock_requests(vha->host);
 }
 
@@ -2206,11 +2267,7 @@ qla24xx_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf,
        rval = qla24xx_write_flash_data(vha, (uint32_t *)buf, offset >> 2,
            length >> 2);
 
-       /* Resume HBA -- RISC reset needed. */
        clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags);
-       set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
-       qla2xxx_wake_dpc(vha);
-       qla2x00_wait_for_hba_online(vha);
        scsi_unblock_requests(vha->host);
 
        return rval;
@@ -2518,7 +2575,7 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf)
        dcode = mbuf;
 
        /* Begin with first PCI expansion ROM header. */
-       pcihdr = ha->flt_region_boot;
+       pcihdr = ha->flt_region_boot << 2;
        last_image = 1;
        do {
                /* Verify PCI expansion ROM header. */
index a772eab2f0ea96016b4b83f8080556e94ed4c3e0..19d1afc3a34345fba4daa04f5c3f08959db5b891 100644 (file)
@@ -7,9 +7,9 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION      "8.03.00-k4"
+#define QLA2XXX_VERSION      "8.03.01-k1"
 
 #define QLA_DRIVER_MAJOR_VER   8
 #define QLA_DRIVER_MINOR_VER   3
-#define QLA_DRIVER_PATCH_VER   0
+#define QLA_DRIVER_PATCH_VER   1
 #define QLA_DRIVER_BETA_VER    0
index eb3a414b189a111f8110385440c0911300085210..ec9da6ce8489ceedf36ab7efe8bd59c56cebfc45 100644 (file)
@@ -1369,16 +1369,16 @@ static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha)
        int retval;
 
        /* Update our PCI device dma_mask for full 64 bit mask */
-       if (pci_set_dma_mask(ha->pdev, DMA_64BIT_MASK) == 0) {
-               if (pci_set_consistent_dma_mask(ha->pdev, DMA_64BIT_MASK)) {
+       if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(64)) == 0) {
+               if (pci_set_consistent_dma_mask(ha->pdev, DMA_BIT_MASK(64))) {
                        dev_dbg(&ha->pdev->dev,
                                  "Failed to set 64 bit PCI consistent mask; "
                                   "using 32 bit.\n");
                        retval = pci_set_consistent_dma_mask(ha->pdev,
-                                                            DMA_32BIT_MASK);
+                                                            DMA_BIT_MASK(32));
                }
        } else
-               retval = pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK);
+               retval = pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32));
 }
 
 static int qla4xxx_slave_alloc(struct scsi_device *sdev)
index 69d6ad862b60f3eb7af0e69ca1e415786a9ea84c..fa34b92850a60c45887fb45d75e643121faa7600 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
+#include <linux/firmware.h>
 
 #include <asm/byteorder.h>
 
@@ -53,8 +54,6 @@
 
 #define DEFAULT_LOOP_COUNT     10000
 
-#include "qlogicpti_asm.c"
-
 static struct qlogicpti *qptichain = NULL;
 static DEFINE_SPINLOCK(qptichain_lock);
 
@@ -465,16 +464,32 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
 
 static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
 {
+       const struct firmware *fw;
+       const char fwname[] = "qlogic/isp1000.bin";
+       const __le16 *fw_data;
        struct Scsi_Host *host = qpti->qhost;
        unsigned short csum = 0;
        unsigned short param[6];
-       unsigned short *risc_code, risc_code_addr, risc_code_length;
+       unsigned short risc_code_addr, risc_code_length;
+       int err;
        unsigned long flags;
        int i, timeout;
 
-       risc_code = &sbus_risc_code01[0];
+       err = request_firmware(&fw, fwname, &qpti->op->dev);
+       if (err) {
+               printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+                      fwname, err);
+               return err;
+       }
+       if (fw->size % 2) {
+               printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+                      fw->size, fwname);
+               err = -EINVAL;
+               goto outfirm;
+       }
+       fw_data = (const __le16 *)&fw->data[0];
        risc_code_addr = 0x1000;        /* all f/w modules load at 0x1000 */
-       risc_code_length = sbus_risc_code_length01;
+       risc_code_length = fw->size / 2;
 
        spin_lock_irqsave(host->host_lock, flags);
 
@@ -482,12 +497,12 @@ static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
         * afterwards via the mailbox commands.
         */
        for (i = 0; i < risc_code_length; i++)
-               csum += risc_code[i];
+               csum += __le16_to_cpu(fw_data[i]);
        if (csum) {
-               spin_unlock_irqrestore(host->host_lock, flags);
                printk(KERN_EMERG "qlogicpti%d: Aieee, firmware checksum failed!",
                       qpti->qpti_id);
-               return 1;
+               err = 1;
+               goto out;
        }               
        sbus_writew(SBUS_CTRL_RESET, qpti->qregs + SBUS_CTRL);
        sbus_writew((DMA_CTRL_CCLEAR | DMA_CTRL_CIRQ), qpti->qregs + CMD_DMA_CTRL);
@@ -496,9 +511,9 @@ static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
        while (--timeout && (sbus_readw(qpti->qregs + SBUS_CTRL) & SBUS_CTRL_RESET))
                udelay(20);
        if (!timeout) {
-               spin_unlock_irqrestore(host->host_lock, flags);
                printk(KERN_EMERG "qlogicpti%d: Cannot reset the ISP.", qpti->qpti_id);
-               return 1;
+               err = 1;
+               goto out;
        }
 
        sbus_writew(HCCTRL_RESET, qpti->qregs + HCCTRL);
@@ -536,21 +551,21 @@ static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
        if (qlogicpti_mbox_command(qpti, param, 1)) {
                printk(KERN_EMERG "qlogicpti%d: Cannot stop firmware for reload.\n",
                       qpti->qpti_id);
-               spin_unlock_irqrestore(host->host_lock, flags);
-               return 1;
+               err = 1;
+               goto out;
        }               
 
        /* Load it up.. */
        for (i = 0; i < risc_code_length; i++) {
                param[0] = MBOX_WRITE_RAM_WORD;
                param[1] = risc_code_addr + i;
-               param[2] = risc_code[i];
+               param[2] = __le16_to_cpu(fw_data[i]);
                if (qlogicpti_mbox_command(qpti, param, 1) ||
                    param[0] != MBOX_COMMAND_COMPLETE) {
                        printk("qlogicpti%d: Firmware dload failed, I'm bolixed!\n",
                               qpti->qpti_id);
-                       spin_unlock_irqrestore(host->host_lock, flags);
-                       return 1;
+                       err = 1;
+                       goto out;
                }
        }
 
@@ -569,8 +584,8 @@ static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
            (param[0] != MBOX_COMMAND_COMPLETE)) {
                printk(KERN_EMERG "qlogicpti%d: New firmware csum failure!\n",
                       qpti->qpti_id);
-               spin_unlock_irqrestore(host->host_lock, flags);
-               return 1;
+               err = 1;
+               goto out;
        }
 
        /* Start using newly downloaded firmware. */
@@ -583,8 +598,8 @@ static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
            (param[0] != MBOX_COMMAND_COMPLETE)) {
                printk(KERN_EMERG "qlogicpti%d: AboutFirmware cmd fails.\n",
                       qpti->qpti_id);
-               spin_unlock_irqrestore(host->host_lock, flags);
-               return 1;
+               err = 1;
+               goto out;
        }
 
        /* Snag the major and minor revisions from the result. */
@@ -599,8 +614,8 @@ static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
            (param[0] != MBOX_COMMAND_COMPLETE)) {
                printk(KERN_EMERG "qlogicpti%d: could not set clock rate.\n",
                       qpti->qpti_id);
-               spin_unlock_irqrestore(host->host_lock, flags);
-               return 1;
+               err = 1;
+               goto out;
        }
 
        if (qpti->is_pti != 0) {
@@ -616,8 +631,11 @@ static int __devinit qlogicpti_load_firmware(struct qlogicpti *qpti)
                qlogicpti_mbox_command(qpti, param, 1);
        }
 
+out:
        spin_unlock_irqrestore(host->host_lock, flags);
-       return 0;
+outfirm:
+       release_firmware(fw);
+       return err;
 }
 
 static int qlogicpti_verify_tmon(struct qlogicpti *qpti)
@@ -1458,6 +1476,7 @@ MODULE_DESCRIPTION("QlogicISP SBUS driver");
 MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
 MODULE_LICENSE("GPL");
 MODULE_VERSION("2.1");
+MODULE_FIRMWARE("qlogic/isp1000.bin");
 
 module_init(qpti_init);
 module_exit(qpti_exit);
diff --git a/drivers/scsi/qlogicpti_asm.c b/drivers/scsi/qlogicpti_asm.c
deleted file mode 100644 (file)
index 19aa84f..0000000
+++ /dev/null
@@ -1,1160 +0,0 @@
-/* Version 1.31.00 ISP1000 Initiator RISC firmware */
-unsigned short sbus_risc_code01[] __devinitdata = {
-       0x0078, 0x1030, 0x0000, 0x2419, 0x0000, 0x12ff, 0x2043, 0x4f50,
-       0x5952, 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932,
-       0x2c31, 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749,
-       0x4320, 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049,
-       0x5350, 0x3130, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520,
-       0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3331, 0x2020,
-       0x20b9, 0x1212, 0x20c1, 0x0008, 0x2071, 0x0010, 0x70c3, 0x0004,
-       0x20c9, 0x3fff, 0x2089, 0x10c8, 0x70c7, 0x4953, 0x70cb, 0x5020,
-       0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00, 0x70d6, 0x2031, 0x0030,
-       0x2079, 0x3500, 0x7863, 0x0000, 0x2fa0, 0x2009, 0x0327, 0x2011,
-       0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x1051, 0x789b,
-       0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0bb8, 0x2069,
-       0x3540, 0x00a8, 0x106a, 0x681b, 0x003c, 0x2009, 0x1313, 0x21b8,
-       0x0078, 0x106c, 0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa,
-       0x680f, 0x0008, 0x6813, 0x0005, 0x681f, 0x0000, 0x6823, 0x0006,
-       0x6817, 0x0008, 0x6827, 0x0000, 0x2069, 0x3600, 0x2011, 0x0020,
-       0x2009, 0x0010, 0x680b, 0x0c19, 0x680f, 0x0019, 0x6803, 0xdd00,
-       0x6807, 0x001a, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
-       0x8109, 0x00c0, 0x1082, 0x2069, 0x3680, 0x20a9, 0x0080, 0x6837,
-       0x0000, 0x680b, 0x0040, 0x6817, 0x0100, 0x681f, 0x0064, 0xade8,
-       0x0010, 0x0070, 0x10a5, 0x0078, 0x1097, 0x1078, 0x1a38, 0x1078,
-       0x2f3a, 0x1078, 0x1681, 0x1078, 0x33ba, 0x3200, 0xa085, 0x000d,
-       0x2090, 0x70c3, 0x0000, 0x0090, 0x10bc, 0x70c0, 0xa086, 0x0002,
-       0x00c0, 0x10bc, 0x1078, 0x11ba, 0x1078, 0x10ec, 0x1078, 0x1817,
-       0x1078, 0x19a8, 0x1078, 0x327d, 0x1078, 0x177d, 0x0078, 0x10bc,
-       0x10d0, 0x10d2, 0x1bc3, 0x1bc3, 0x2f98, 0x2f98, 0x1bc3, 0x1bc3,
-       0x0078, 0x10d0, 0x0078, 0x10d2, 0x0078, 0x10d4, 0x0078, 0x10d6,
-       0x7008, 0x800c, 0x00c8, 0x10e7, 0x7007, 0x0002, 0xa08c, 0x000c,
-       0x00c0, 0x10e8, 0x8004, 0x8004, 0x00c8, 0x10e7, 0x087a, 0x097a,
-       0x70c3, 0x4002, 0x0078, 0x11bd, 0x7814, 0xa005, 0x00c0, 0x10f4,
-       0x0010, 0x1130, 0x0078, 0x112f, 0x2009, 0x3568, 0x2104, 0xa005,
-       0x00c0, 0x112f, 0x7814, 0xa086, 0x0001, 0x00c0, 0x1101, 0x1078,
-       0x1536, 0x7817, 0x0000, 0x2009, 0x356f, 0x2104, 0xa065, 0x0040,
-       0x111d, 0x2009, 0x356a, 0x211c, 0x8108, 0x2114, 0x8108, 0x2104,
-       0xa210, 0xa399, 0x0000, 0x2009, 0x001c, 0x6083, 0x0103, 0x1078,
-       0x1611, 0x00c0, 0x1129, 0x1078, 0x1678, 0x2009, 0x356f, 0x200b,
-       0x0000, 0x2009, 0x3569, 0x2104, 0x200b, 0x0000, 0xa005, 0x0040,
-       0x112d, 0x2001, 0x4005, 0x0078, 0x11bc, 0x0078, 0x11ba, 0x007c,
-       0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x0040, 0x1138, 0x007c,
-       0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000,
-       0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1188, 0x2038, 0x0079, 0x1148,
-       0x11ba, 0x1205, 0x11d3, 0x1205, 0x1256, 0x1256, 0x11ca, 0x1590,
-       0x1261, 0x11c6, 0x11d7, 0x11d9, 0x11db, 0x11dd, 0x1595, 0x11c6,
-       0x1267, 0x1283, 0x1544, 0x158a, 0x11df, 0x146b, 0x148d, 0x14a7,
-       0x14d0, 0x1424, 0x1432, 0x1446, 0x145a, 0x12ef, 0x11c6, 0x129f,
-       0x12a6, 0x12ab, 0x12b0, 0x12b6, 0x12bb, 0x12c0, 0x12c5, 0x12ca,
-       0x12ce, 0x12e3, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x12fb,
-       0x1304, 0x1313, 0x1339, 0x1343, 0x134a, 0x1370, 0x137f, 0x138e,
-       0x13a0, 0x1409, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x1419,
-       0xa0bc, 0xffa0, 0x00c0, 0x11c6, 0x2038, 0xa084, 0x001f, 0x0079,
-       0x1191, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6,
-       0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6,
-       0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6,
-       0x11c6, 0x11c6, 0x11c6, 0x15ed, 0x15f7, 0x15fb, 0x1609, 0x11c6,
-       0x11c6, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x11bc, 0x73ce,
-       0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x2061, 0x0000, 0x601b,
-       0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c, 0x70c3, 0x4001,
-       0x0078, 0x11bd, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005,
-       0x53a3, 0x0078, 0x11ba, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078,
-       0x11ba, 0x0078, 0x11ba, 0x0078, 0x11ba, 0x0078, 0x11ba, 0x2091,
-       0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf,
-       0x2020, 0x70d3, 0x0001, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b,
-       0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051,
-       0x0470, 0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091,
-       0x5000, 0x2091, 0x4080, 0x0078, 0x0455, 0x71d0, 0x72c8, 0x73cc,
-       0x70c4, 0x20a0, 0x2098, 0x2031, 0x0030, 0x81ff, 0x0040, 0x11ba,
-       0x7007, 0x0004, 0x731a, 0x721e, 0x2051, 0x0012, 0x2049, 0x1234,
-       0x2041, 0x11ba, 0x7003, 0x0002, 0xa786, 0x0001, 0x00c0, 0x1226,
-       0x2049, 0x1242, 0x2041, 0x124e, 0x7003, 0x0003, 0x7017, 0x0000,
-       0x810b, 0x7112, 0x00c8, 0x122e, 0x7017, 0x0001, 0x7007, 0x0001,
-       0xa786, 0x0001, 0x0040, 0x1242, 0x700c, 0xa084, 0x007f, 0x8004,
-       0x2009, 0x0020, 0xa102, 0x0942, 0x094a, 0x20a8, 0x26a0, 0x53a6,
-       0x0078, 0x10d8, 0x700c, 0xa084, 0x007f, 0x0040, 0x1242, 0x80ac,
-       0x0048, 0x1242, 0x2698, 0x53a5, 0x0078, 0x10d8, 0x700c, 0xa084,
-       0x007f, 0x80ac, 0x2698, 0x53a5, 0x0078, 0x11ba, 0x71c4, 0x70c8,
-       0x2114, 0xa79e, 0x0004, 0x00c0, 0x125e, 0x200a, 0x72ca, 0x0078,
-       0x11b9, 0x70c7, 0x0001, 0x70cb, 0x001f, 0x0078, 0x11ba, 0x70c4,
-       0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005,
-       0x0040, 0x127d, 0x8001, 0x7872, 0x7a7a, 0x7b7e, 0x7c76, 0x7898,
-       0xa084, 0xfffc, 0x789a, 0x0078, 0x1281, 0x7898, 0xa085, 0x0001,
-       0x789a, 0x0078, 0x11ba, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6,
-       0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1299, 0x8001, 0x7886,
-       0x7a8e, 0x7b92, 0x7c8a, 0x7898, 0xa084, 0xfcff, 0x789a, 0x0078,
-       0x129d, 0x7898, 0xa085, 0x0100, 0x789a, 0x0078, 0x11ba, 0x2009,
-       0x3559, 0x210c, 0x2011, 0x0410, 0x0078, 0x11b8, 0x2009, 0x3541,
-       0x210c, 0x0078, 0x11b9, 0x2009, 0x3542, 0x210c, 0x0078, 0x11b9,
-       0x2061, 0x3540, 0x610c, 0x6210, 0x0078, 0x11b8, 0x2009, 0x3545,
-       0x210c, 0x0078, 0x11b9, 0x2009, 0x3546, 0x210c, 0x0078, 0x11b9,
-       0x2009, 0x3547, 0x210c, 0x0078, 0x11b9, 0x2009, 0x3548, 0x210c,
-       0x0078, 0x11b9, 0x7908, 0x7a0c, 0x0078, 0x11b8, 0x71c4, 0x8107,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x3600, 0x6a00,
-       0x6804, 0xa084, 0x0008, 0x0040, 0x12e0, 0x6b08, 0x0078, 0x12e1,
-       0x6b0c, 0x0078, 0x11b7, 0x77c4, 0x1078, 0x1692, 0x2091, 0x8000,
-       0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x11b7, 0x77c4,
-       0x1078, 0x1692, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091,
-       0x8001, 0x0078, 0x11b7, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x11b2,
-       0x1078, 0x1abc, 0x0078, 0x11b7, 0x71c4, 0xa182, 0x0010, 0x00c8,
-       0x11b2, 0x2011, 0x3541, 0x2204, 0x007e, 0x2112, 0x1078, 0x1a75,
-       0x017f, 0x0078, 0x11b9, 0x71c4, 0x2011, 0x1331, 0x20a9, 0x0008,
-       0x2204, 0xa106, 0x0040, 0x1323, 0x8210, 0x0070, 0x1321, 0x0078,
-       0x1318, 0x0078, 0x11b2, 0xa292, 0x1331, 0x027e, 0x2011, 0x3542,
-       0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x1a81, 0x017f, 0x0078,
-       0x11b9, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
-       0x004b, 0x2061, 0x3540, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
-       0x6012, 0x0078, 0x11b8, 0x2061, 0x3540, 0x6114, 0x70c4, 0x6016,
-       0x0078, 0x11b9, 0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186,
-       0x0028, 0x0040, 0x1363, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186,
-       0x0032, 0x0040, 0x1363, 0x2011, 0x0006, 0x2019, 0x1313, 0xa186,
-       0x003c, 0x00c0, 0x11b2, 0x2061, 0x3540, 0x6018, 0x007e, 0x611a,
-       0x23b8, 0x1078, 0x1a92, 0x1078, 0x33ba, 0x017f, 0x0078, 0x11b9,
-       0x71c4, 0xa184, 0xffcf, 0x00c0, 0x11b2, 0x2011, 0x3547, 0x2204,
-       0x2112, 0x007e, 0x1078, 0x1ab4, 0x017f, 0x0078, 0x11b9, 0x71c4,
-       0xa182, 0x0010, 0x00c8, 0x11b2, 0x2011, 0x3548, 0x2204, 0x007e,
-       0x2112, 0x1078, 0x1aa3, 0x017f, 0x0078, 0x11b9, 0x71c4, 0x72c8,
-       0xa184, 0xfffd, 0x00c0, 0x11b1, 0xa284, 0xfffd, 0x00c0, 0x11b1,
-       0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x11b8,
-       0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
-       0x3600, 0x2019, 0x0000, 0x72c8, 0x6800, 0x007e, 0xa226, 0x0040,
-       0x13cf, 0x6a02, 0xa484, 0x2000, 0x0040, 0x13b8, 0xa39d, 0x0010,
-       0xa484, 0x1000, 0x0040, 0x13be, 0xa39d, 0x0008, 0xa484, 0x4000,
-       0x0040, 0x13cf, 0x810f, 0xa284, 0x4000, 0x0040, 0x13cb, 0x1078,
-       0x1ad6, 0x0078, 0x13cf, 0x1078, 0x1ac8, 0x0078, 0x13cf, 0x72cc,
-       0x82ff, 0x0040, 0x1401, 0x6808, 0xa206, 0x0040, 0x1401, 0xa2a4,
-       0x00ff, 0x2061, 0x3540, 0x6118, 0xa186, 0x0028, 0x0040, 0x13e8,
-       0xa186, 0x0032, 0x0040, 0x13ee, 0xa186, 0x003c, 0x0040, 0x13f4,
-       0xa482, 0x0064, 0x0048, 0x13fe, 0x0078, 0x13f8, 0xa482, 0x0050,
-       0x0048, 0x13fe, 0x0078, 0x13f8, 0xa482, 0x0043, 0x0048, 0x13fe,
-       0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x11b3, 0x6a0a, 0xa39d,
-       0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x0078,
-       0x11b7, 0x77c4, 0x1078, 0x1692, 0x2091, 0x8000, 0x6a14, 0x6b1c,
-       0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078,
-       0x11b7, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x11b2,
-       0x1078, 0x1ae4, 0x0078, 0x11b7, 0x77c4, 0x1078, 0x1692, 0x2091,
-       0x8000, 0x6a08, 0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708,
-       0x0078, 0x11b8, 0x77c4, 0x1078, 0x1692, 0x2091, 0x8000, 0x6a08,
-       0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1441, 0x1078,
-       0x1a19, 0x2091, 0x8001, 0x2708, 0x0078, 0x11b8, 0x77c4, 0x1078,
-       0x1692, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804,
-       0xa005, 0x0040, 0x1455, 0x1078, 0x1a19, 0x2091, 0x8001, 0x2708,
-       0x0078, 0x11b8, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051,
-       0x0020, 0x2091, 0x8000, 0x1078, 0x169f, 0x2091, 0x8001, 0x2708,
-       0x6a08, 0x0078, 0x11b8, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca,
-       0x73ce, 0x1078, 0x1718, 0x00c0, 0x1489, 0x6818, 0xa005, 0x0040,
-       0x1483, 0x2708, 0x1078, 0x1af4, 0x00c0, 0x1483, 0x7817, 0xffff,
-       0x2091, 0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078,
-       0x11bc, 0x2091, 0x8001, 0x0078, 0x11ba, 0x77c4, 0x77c6, 0x2041,
-       0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
-       0x169f, 0x2061, 0x3540, 0x60a3, 0x0003, 0x67b6, 0x60a7, 0x0000,
-       0x7817, 0xffff, 0x2091, 0x8001, 0x1078, 0x1a19, 0x007c, 0x77c8,
-       0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2061,
-       0x3540, 0x60a3, 0x0002, 0x60a7, 0x0000, 0x67b6, 0x7817, 0xffff,
-       0x1078, 0x1a19, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0004,
-       0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x169f, 0x70c8, 0x6836,
-       0x8738, 0xa784, 0x0007, 0x00c0, 0x14c4, 0x2091, 0x8001, 0x007c,
-       0x7898, 0xa084, 0x0003, 0x00c0, 0x14f4, 0x2039, 0x0000, 0x2041,
-       0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x1692, 0x2091,
-       0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784,
-       0x0007, 0x00c0, 0x14dd, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f,
-       0xa784, 0x0f00, 0x00c0, 0x14dd, 0x2091, 0x8000, 0x2069, 0x0100,
-       0x6830, 0xa084, 0x0040, 0x0040, 0x151d, 0x684b, 0x0004, 0x20a9,
-       0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x150a, 0x0070, 0x150a,
-       0x0078, 0x1501, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084,
-       0x0001, 0x0040, 0x1517, 0x0070, 0x1517, 0x0078, 0x150e, 0x20a9,
-       0x00fa, 0x0070, 0x151d, 0x0078, 0x1519, 0x2079, 0x3500, 0x7817,
-       0x0001, 0x2061, 0x3540, 0x60a3, 0x0001, 0x60a7, 0x0000, 0x60c3,
-       0x000f, 0x7898, 0xa085, 0x0002, 0x789a, 0x6808, 0xa084, 0xfffd,
-       0x680a, 0x681b, 0x0046, 0x2091, 0x8001, 0x007c, 0x7898, 0xa084,
-       0xfffd, 0x789a, 0xa084, 0x0001, 0x00c0, 0x1540, 0x1078, 0x1760,
-       0x71c4, 0x71c6, 0x794a, 0x007c, 0x74c4, 0x73c8, 0x72cc, 0x74c6,
-       0x73ca, 0x72ce, 0x2079, 0x3500, 0x2009, 0x0040, 0x1078, 0x166f,
-       0x0040, 0x1586, 0x1078, 0x163f, 0x0040, 0x155a, 0x1078, 0x1678,
-       0x0078, 0x1586, 0x6010, 0x2091, 0x8001, 0x7817, 0xffff, 0x2009,
-       0x3568, 0x200b, 0x0005, 0x8108, 0x200b, 0x0000, 0x8108, 0x230a,
-       0x8108, 0x220a, 0x8108, 0x240a, 0x8108, 0x200a, 0x8108, 0x200b,
-       0x0000, 0x8108, 0x2c0a, 0xa02e, 0x2530, 0x0e7e, 0x1078, 0x2f13,
-       0x0e7f, 0x6592, 0x65a2, 0x6696, 0x66a6, 0x60ab, 0x0000, 0x60af,
-       0x0000, 0x2091, 0x8001, 0x1078, 0x1a19, 0x007c, 0x70c3, 0x4005,
-       0x0078, 0x11bd, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x11ba,
-       0x71c4, 0x71c6, 0x2168, 0x0078, 0x1597, 0x2069, 0x1000, 0x690c,
-       0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1599, 0xa285,
-       0x0000, 0x00c0, 0x15a7, 0x70c3, 0x4000, 0x0078, 0x15a9, 0x70c3,
-       0x4003, 0x70ca, 0x0078, 0x11bd, 0x71c4, 0x72c8, 0x73cc, 0x2100,
-       0xa184, 0xfffc, 0x00c0, 0x11c6, 0x2100, 0x0079, 0x15b7, 0x15ce,
-       0x15e3, 0x15e5, 0x15e7, 0x70c3, 0x4003, 0x71ce, 0x72d2, 0x73d6,
-       0x0078, 0x15ca, 0x70c3, 0x4000, 0x70cf, 0x0000, 0x70d3, 0x0000,
-       0x70d7, 0x0000, 0x77c6, 0x71ca, 0x0078, 0x11ba, 0x2031, 0x15e9,
-       0x2624, 0x8630, 0x2412, 0x2204, 0xa446, 0x00c0, 0x15bb, 0xa484,
-       0xffff, 0x00c0, 0x15d0, 0x2031, 0x15e9, 0x8210, 0x8319, 0xa384,
-       0xffff, 0x00c0, 0x15d0, 0x0078, 0x15c2, 0x0078, 0x15c2, 0x0078,
-       0x15c2, 0x5555, 0xaaaa, 0xffff, 0x0000, 0x7960, 0x71c6, 0x71c4,
-       0xa182, 0x0003, 0x00c8, 0x11b2, 0x7962, 0x0078, 0x11ba, 0x7960,
-       0x71c6, 0x0078, 0x11ba, 0x7954, 0x71c6, 0x71c4, 0x7956, 0x7958,
-       0x71ca, 0x71c8, 0x795a, 0x795c, 0x71ce, 0x71cc, 0x795e, 0x0078,
-       0x11ba, 0x7954, 0x71c6, 0x7958, 0x71ca, 0x795c, 0x71ce, 0x0078,
-       0x11ba, 0x700c, 0xa084, 0x007f, 0x0040, 0x161d, 0x7007, 0x0004,
-       0x7004, 0xa084, 0x0004, 0x00c0, 0x1618, 0x7017, 0x0000, 0x7112,
-       0x721a, 0x731e, 0x8108, 0x810c, 0x81a9, 0x8c98, 0x20a1, 0x0030,
-       0x6080, 0x20a2, 0x53a6, 0x780c, 0xa085, 0x0000, 0x7002, 0x7007,
-       0x0001, 0x7108, 0x8104, 0x00c8, 0x1631, 0x7007, 0x0002, 0xa184,
-       0x000c, 0x710c, 0xa184, 0x0300, 0x7003, 0x0000, 0x007c, 0x700c,
-       0xa084, 0x007f, 0x0040, 0x164b, 0x7007, 0x0004, 0x7004, 0xa084,
-       0x0004, 0x00c0, 0x1646, 0x7017, 0x0000, 0x7112, 0x721a, 0x731e,
-       0x2099, 0x0030, 0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002,
-       0x7007, 0x0001, 0x7008, 0x800c, 0x00c8, 0x165a, 0x7007, 0x0002,
-       0xa08c, 0x000c, 0x00c0, 0x166c, 0x710c, 0xa184, 0x0300, 0x00c0,
-       0x166c, 0x2ca0, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x7850,
-       0xa065, 0x0040, 0x1677, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c,
-       0x0f7e, 0x2079, 0x3500, 0x7850, 0x2062, 0x2c00, 0x7852, 0x0f7f,
-       0x007c, 0x2011, 0x4000, 0x7a52, 0x2019, 0x0410, 0x8319, 0x0040,
-       0x168f, 0xa280, 0x002f, 0x2012, 0x2010, 0x0078, 0x1686, 0x2013,
-       0x0000, 0x007c, 0xa784, 0x0f00, 0x800c, 0xa784, 0x0007, 0x8003,
-       0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8, 0x3680, 0x007c, 0x1078,
-       0x1692, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef,
-       0xa80d, 0x690a, 0x2009, 0x354f, 0x210c, 0x6804, 0xa005, 0x0040,
-       0x16bc, 0xa116, 0x00c0, 0x16bc, 0x2060, 0x6000, 0x6806, 0x017e,
-       0x200b, 0x0000, 0x0078, 0x16bf, 0x2009, 0x0000, 0x017e, 0x6804,
-       0xa065, 0x0040, 0x16ce, 0x6000, 0x6806, 0x1078, 0x16df, 0x1078,
-       0x17cb, 0x6810, 0x8001, 0x6812, 0x00c0, 0x16bf, 0x017f, 0x6902,
-       0x6906, 0x007c, 0xa065, 0x0040, 0x16de, 0x6098, 0x609b, 0x0000,
-       0x2008, 0x1078, 0x1678, 0x2100, 0x0078, 0x16d2, 0x007c, 0x6003,
-       0x0103, 0x20a9, 0x001c, 0xac80, 0x0004, 0x20a0, 0x2001, 0x0000,
-       0x40a4, 0x6828, 0x6016, 0x682c, 0x601e, 0x007c, 0x0e7e, 0x2071,
-       0x3540, 0x7040, 0xa08c, 0x0080, 0x00c0, 0x16fc, 0xa088, 0x3580,
-       0x2d0a, 0x8000, 0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
-       0x3540, 0x2009, 0x3580, 0x7240, 0x8221, 0x8211, 0x0048, 0x1716,
-       0x2104, 0x8108, 0xad06, 0x00c0, 0x1705, 0x8119, 0x211e, 0x8108,
-       0x8318, 0x8211, 0x00c8, 0x170e, 0x7442, 0xa006, 0x0e7f, 0x007c,
-       0x1078, 0x1692, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040,
-       0x175f, 0x0078, 0x1729, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040,
-       0x175f, 0x600c, 0xa306, 0x00c0, 0x1723, 0x6008, 0xa206, 0x00c0,
-       0x1723, 0x2c28, 0x2001, 0x354f, 0x2004, 0xac06, 0x0040, 0x175f,
-       0x6804, 0xac06, 0x00c0, 0x1746, 0x6000, 0x2060, 0x6806, 0xa005,
-       0x00c0, 0x1746, 0x6803, 0x0000, 0x0078, 0x1750, 0x6400, 0x781c,
-       0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1750, 0x2c00, 0x6802,
-       0x2560, 0x1078, 0x16df, 0x6017, 0x0005, 0x601f, 0x0020, 0x1078,
-       0x17cb, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff, 0xa005, 0x007c,
-       0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
-       0x2091, 0x8000, 0x1078, 0x169f, 0x8738, 0xa784, 0x0007, 0x00c0,
-       0x176a, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00,
-       0x00c0, 0x176a, 0x2091, 0x8001, 0x007c, 0x2061, 0x0000, 0x6018,
-       0xa084, 0x0001, 0x00c0, 0x178a, 0x78ac, 0x78af, 0x0000, 0xa005,
-       0x00c0, 0x178b, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1791, 0x1078,
-       0x1ba5, 0x0079, 0x1793, 0x17a3, 0x17a5, 0x17ab, 0x17af, 0x17a3,
-       0x17b3, 0x17a3, 0x17a3, 0x17a3, 0x17a3, 0x17b9, 0x17bd, 0x17a3,
-       0x17a3, 0x17a3, 0x17a3, 0x1078, 0x1ba5, 0x1078, 0x1760, 0x2001,
-       0x8001, 0x0078, 0x17c3, 0x2001, 0x8003, 0x0078, 0x17c3, 0x2001,
-       0x8004, 0x0078, 0x17c3, 0x1078, 0x1760, 0x2001, 0x8006, 0x0078,
-       0x17c3, 0x2001, 0x800c, 0x0078, 0x17c3, 0x1078, 0x1760, 0x2001,
-       0x800d, 0x0078, 0x17c3, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001,
-       0x2091, 0x4080, 0x007c, 0x2c04, 0x6082, 0x2c08, 0x2063, 0x0000,
-       0x7864, 0x8000, 0x7866, 0x7868, 0xa005, 0x796a, 0x0040, 0x17db,
-       0x2c02, 0x0078, 0x17dc, 0x796e, 0x007c, 0x0c7e, 0x2061, 0x3500,
-       0x6883, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6064, 0x8000, 0x6066,
-       0x6068, 0xa005, 0x616a, 0x0040, 0x17f0, 0x2d02, 0x0078, 0x17f1,
-       0x616e, 0x0c7f, 0x007c, 0x1078, 0x1804, 0x0040, 0x1803, 0x0c7e,
-       0x6098, 0xa065, 0x0040, 0x17fe, 0x1078, 0x16d2, 0x0c7f, 0x609b,
-       0x0000, 0x1078, 0x1678, 0x007c, 0x786c, 0xa065, 0x0040, 0x1816,
-       0x2091, 0x8000, 0x7864, 0x8001, 0x7866, 0x2c04, 0x786e, 0xa005,
-       0x00c0, 0x1814, 0x786a, 0x8000, 0x2091, 0x8001, 0x007c, 0x7898,
-       0xa005, 0x00c0, 0x1865, 0x7974, 0x70d0, 0x0005, 0x0005, 0x72d0,
-       0xa206, 0x00c0, 0x181c, 0x2200, 0xa106, 0x00c0, 0x1833, 0x7804,
-       0xa005, 0x0040, 0x1865, 0x7807, 0x0000, 0x0068, 0x1865, 0x2091,
-       0x4080, 0x0078, 0x1865, 0x1078, 0x166f, 0x0040, 0x1865, 0x7a7c,
-       0x7b78, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0x2009,
-       0x0040, 0x1078, 0x163f, 0x0040, 0x185c, 0x1078, 0x1678, 0x7880,
-       0x8000, 0x7882, 0xa086, 0x0002, 0x00c0, 0x1865, 0x2091, 0x8000,
-       0x78af, 0x0002, 0x7883, 0x0000, 0x7898, 0xa085, 0x0003, 0x789a,
-       0x2091, 0x8001, 0x0078, 0x1865, 0x7883, 0x0000, 0x1078, 0x1992,
-       0x6000, 0xa084, 0x0007, 0x0079, 0x1866, 0x007c, 0x186e, 0x187d,
-       0x189d, 0x186e, 0x18af, 0x186e, 0x186e, 0x186e, 0x2039, 0x0400,
-       0x78a8, 0xa705, 0x78aa, 0x6004, 0xa705, 0x6006, 0x1078, 0x18ed,
-       0x6018, 0x78a6, 0x1078, 0x197a, 0x007c, 0x78a8, 0xa084, 0x0100,
-       0x0040, 0x1884, 0x0078, 0x186e, 0x78ab, 0x0000, 0x6000, 0x8007,
-       0xa084, 0x00ff, 0x789e, 0x8001, 0x609b, 0x0000, 0x0040, 0x189a,
-       0x1078, 0x18ed, 0x0040, 0x189a, 0x78a8, 0xa085, 0x0100, 0x78aa,
-       0x0078, 0x189c, 0x1078, 0x1911, 0x007c, 0x78a8, 0xa08c, 0x0e00,
-       0x00c0, 0x18a6, 0xa084, 0x0100, 0x00c0, 0x18a8, 0x0078, 0x186e,
-       0x1078, 0x18ed, 0x00c0, 0x18ae, 0x1078, 0x1911, 0x007c, 0x78a8,
-       0xa084, 0x0100, 0x0040, 0x18b6, 0x0078, 0x186e, 0x78ab, 0x0000,
-       0x6710, 0x20a9, 0x0001, 0x6014, 0xa084, 0x00ff, 0xa005, 0x0040,
-       0x18d3, 0xa7bc, 0xff00, 0x20a9, 0x0008, 0xa08e, 0x0001, 0x0040,
-       0x18d3, 0x2039, 0x0000, 0x20a9, 0x0080, 0xa08e, 0x0002, 0x0040,
-       0x18d3, 0x0078, 0x18ea, 0x1078, 0x1692, 0x2d00, 0x2091, 0x8000,
-       0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a,
-       0x2d00, 0xa080, 0x0010, 0x2068, 0x2091, 0x8001, 0x0070, 0x18ea,
-       0x0078, 0x18d6, 0x1078, 0x1678, 0x007c, 0x78a0, 0xa06d, 0x00c0,
-       0x18f8, 0x2c00, 0x78a2, 0x78a6, 0x609b, 0x0000, 0x0078, 0x1904,
-       0x2c00, 0x689a, 0x609b, 0x0000, 0x78a2, 0x2d00, 0x6002, 0x78a4,
-       0xad06, 0x00c0, 0x1904, 0x6002, 0x789c, 0x8001, 0x789e, 0x00c0,
-       0x1910, 0x78a8, 0xa084, 0x0000, 0x78aa, 0x78a4, 0x2060, 0xa006,
-       0x007c, 0xa02e, 0x2530, 0x6118, 0xa184, 0x0060, 0x619e, 0x0040,
-       0x191d, 0x0e7e, 0x1078, 0x2f13, 0x0e7f, 0x6592, 0x65a2, 0x6696,
-       0x66a6, 0x60ab, 0x0000, 0x60af, 0x0000, 0x6710, 0x1078, 0x1692,
-       0x2091, 0x8000, 0x6808, 0xa084, 0x0001, 0x0040, 0x193f, 0x2091,
-       0x8001, 0x1078, 0x16df, 0x2091, 0x8000, 0x1078, 0x17cb, 0x2091,
-       0x8001, 0x78a3, 0x0000, 0x78a7, 0x0000, 0x0078, 0x1979, 0x6020,
-       0xa096, 0x0001, 0x00c0, 0x1946, 0x8000, 0x6022, 0x6a10, 0x6814,
-       0x2091, 0x8001, 0xa202, 0x0048, 0x1955, 0x0040, 0x1955, 0x2039,
-       0x0200, 0x1078, 0x197a, 0x0078, 0x1979, 0x2c08, 0x2091, 0x8000,
-       0x6800, 0xa065, 0x0040, 0x195d, 0x6102, 0x6902, 0x00c0, 0x1961,
-       0x6906, 0x2160, 0x6003, 0x0000, 0x6810, 0x8000, 0x6812, 0x2091,
-       0x8001, 0x6808, 0xa08c, 0x0040, 0x0040, 0x1973, 0xa086, 0x0040,
-       0x680a, 0x1078, 0x16ee, 0x1078, 0x1a19, 0x78a7, 0x0000, 0x78a3,
-       0x0000, 0x007c, 0x6004, 0xa705, 0x6006, 0x2091, 0x8000, 0x1078,
-       0x17cb, 0x2091, 0x8001, 0x78a4, 0xa065, 0x0040, 0x198d, 0x6098,
-       0x78a6, 0x609b, 0x0000, 0x0078, 0x197d, 0x78a3, 0x0000, 0x78a7,
-       0x0000, 0x007c, 0x7970, 0x7874, 0x8000, 0xa10a, 0x00c8, 0x1999,
-       0xa006, 0x7876, 0x70d2, 0x7804, 0xa005, 0x0040, 0x19a7, 0x8001,
-       0x7806, 0x00c0, 0x19a7, 0x0068, 0x19a7, 0x2091, 0x4080, 0x007c,
-       0x0068, 0x19c2, 0x2029, 0x0000, 0x786c, 0xa065, 0x0040, 0x19bd,
-       0x1078, 0x19c3, 0x0040, 0x19bd, 0x057e, 0x1078, 0x19d9, 0x057f,
-       0x00c0, 0x19bd, 0x8528, 0x0078, 0x19ac, 0x85ff, 0x0040, 0x19c2,
-       0x2091, 0x4080, 0x007c, 0x7b84, 0x7988, 0x72d4, 0x0005, 0x0005,
-       0x70d4, 0xa206, 0x00c0, 0x19c5, 0x2200, 0xa102, 0x00c0, 0x19d3,
-       0x2300, 0xa005, 0x007c, 0x0048, 0x19d7, 0xa302, 0x007c, 0x8002,
-       0x007c, 0x1078, 0x1a0b, 0x2009, 0x001c, 0x6024, 0xa005, 0x0040,
-       0x19e3, 0x2009, 0x0040, 0x1078, 0x1611, 0x0040, 0x19fc, 0x7894,
-       0x8000, 0x7896, 0xa086, 0x0002, 0x00c0, 0x1a0a, 0x2091, 0x8000,
-       0x78af, 0x0003, 0x7897, 0x0000, 0x7898, 0xa085, 0x0300, 0x789a,
-       0x2091, 0x8001, 0x0078, 0x1a0a, 0x7897, 0x0000, 0x1078, 0x17f3,
-       0x7984, 0x7888, 0x8000, 0xa10a, 0x00c8, 0x1a07, 0xa006, 0x788a,
-       0x70d6, 0xa006, 0x007c, 0x8107, 0x8004, 0x8004, 0x7a90, 0x7b8c,
-       0xa210, 0xa399, 0x0000, 0x007c, 0x2009, 0x3568, 0x2091, 0x8000,
-       0x200a, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3540, 0x2091, 0x8000,
-       0x2104, 0xa086, 0x0000, 0x00c0, 0x1a34, 0x2009, 0x3512, 0x2104,
-       0xa005, 0x00c0, 0x1a34, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1a34,
-       0x0018, 0x1a34, 0x781b, 0x0044, 0x2091, 0x8001, 0x0f7f, 0x007c,
-       0x127e, 0x2091, 0x2300, 0x2071, 0x3540, 0x2079, 0x0100, 0x2019,
-       0x2dd8, 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040, 0x1a50, 0x789a,
-       0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318, 0x0078, 0x1a43,
-       0x789b, 0x0020, 0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x0220,
-       0x0070, 0x1a5c, 0x0078, 0x1a54, 0x7003, 0x0000, 0x1078, 0x1b5b,
-       0x7004, 0xa084, 0x000f, 0xa085, 0x6280, 0x7806, 0x780f, 0x9200,
-       0x7843, 0x00d8, 0x7853, 0x0080, 0x780b, 0x0038, 0x7047, 0x357f,
-       0x7043, 0x0000, 0x127f, 0x2000, 0x007c, 0xa18c, 0x000f, 0x2011,
-       0x0101, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x1b5b,
-       0x007c, 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x1a8a,
-       0x0078, 0x1a85, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105,
-       0x2012, 0x007c, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070,
-       0x1a9b, 0x0078, 0x1a96, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f,
-       0xa205, 0x200a, 0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b,
-       0x0070, 0x1aac, 0x0078, 0x1aa7, 0xa18c, 0xf000, 0x2204, 0xa084,
-       0x0fff, 0xa105, 0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084,
-       0xffcf, 0xa105, 0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020,
-       0x0c7e, 0x2061, 0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c,
-       0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a,
-       0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003,
-       0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085,
-       0x0020, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020,
-       0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4,
-       0x63ae, 0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e,
-       0x6818, 0xa005, 0x0040, 0x1b39, 0x2061, 0x3f80, 0x1078, 0x1b41,
-       0x0040, 0x1b27, 0x20a9, 0x0000, 0x2061, 0x3e80, 0x0c7e, 0x1078,
-       0x1b41, 0x0040, 0x1b13, 0x0c7f, 0x8c60, 0x0070, 0x1b11, 0x0078,
-       0x1b06, 0x0078, 0x1b39, 0x007f, 0xa082, 0x3e80, 0x2071, 0x3540,
-       0x70ba, 0x601c, 0xa085, 0x0800, 0x601e, 0x71b6, 0x60a7, 0x0000,
-       0x2001, 0x0004, 0x70a2, 0x1078, 0x1a14, 0x0078, 0x1b35, 0x2071,
-       0x3540, 0x601c, 0xa085, 0x0800, 0x601e, 0x71b6, 0x60a7, 0x0000,
-       0x2001, 0x0006, 0x70a2, 0x1078, 0x1a14, 0x2001, 0x0000, 0x0078,
-       0x1b3b, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f,
-       0x007c, 0x2c04, 0xa005, 0x0040, 0x1b58, 0x2060, 0x600c, 0xa306,
-       0x00c0, 0x1b55, 0x6008, 0xa206, 0x00c0, 0x1b55, 0x6010, 0xa106,
-       0x00c0, 0x1b55, 0xa006, 0x0078, 0x1b5a, 0x6000, 0x0078, 0x1b42,
-       0xa085, 0x0001, 0x007c, 0x2011, 0x3541, 0x220c, 0xa18c, 0x000f,
-       0x2011, 0x013b, 0x2204, 0xa084, 0x0100, 0x0040, 0x1b6a, 0x2021,
-       0xff80, 0x2122, 0x007c, 0x0e7e, 0x68e4, 0xa08c, 0x0020, 0x0040,
-       0x1ba3, 0xa084, 0x0006, 0x00c0, 0x1ba3, 0x6010, 0x8007, 0xa084,
-       0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0, 0x3600, 0x7004, 0xa084,
-       0x000a, 0x00c0, 0x1ba3, 0x7108, 0xa194, 0xff00, 0x0040, 0x1ba3,
-       0xa18c, 0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x1b96, 0x2001,
-       0x0032, 0xa106, 0x0040, 0x1b9a, 0x0078, 0x1b9e, 0x2009, 0x0020,
-       0x0078, 0x1ba0, 0x2009, 0x003f, 0x0078, 0x1ba0, 0x2011, 0x0000,
-       0x2100, 0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068, 0x1ba5, 0x007e,
-       0x2071, 0x0000, 0x7018, 0xa084, 0x0001, 0x00c0, 0x1baa, 0x007f,
-       0x2e08, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002,
-       0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x007f, 0x2070,
-       0x007f, 0x0078, 0x1bc1, 0x107e, 0x007e, 0x127e, 0x2091, 0x2300,
-       0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0xa594, 0x003f, 0xa484, 0x4000,
-       0x0040, 0x1bd8, 0xa784, 0x007c, 0x00c0, 0x2d9c, 0x1078, 0x1ba5,
-       0xa49c, 0x000f, 0xa382, 0x0004, 0x0050, 0x1be0, 0x1078, 0x1ba5,
-       0x8507, 0xa084, 0x000f, 0x0079, 0x1be5, 0x1fea, 0x209a, 0x20c0,
-       0x22e6, 0x256b, 0x25b3, 0x25ea, 0x2665, 0x26bf, 0x2744, 0x1c0b,
-       0x1bf5, 0x1e53, 0x1f1d, 0x254a, 0x1bf5, 0x1078, 0x1ba5, 0x0018,
-       0x1bc8, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7003,
-       0x0000, 0x703f, 0x0000, 0x7030, 0xa005, 0x0040, 0x1c09, 0x7033,
-       0x0000, 0x0018, 0x1bc8, 0x705c, 0xa005, 0x00c0, 0x1cb6, 0x70a0,
-       0xa084, 0x0007, 0x0079, 0x1c14, 0x1cd6, 0x1c1c, 0x1c2a, 0x1c4b,
-       0x1c71, 0x1c9d, 0x1c9b, 0x1c1c, 0x7808, 0xa084, 0xfffd, 0x780a,
-       0x2009, 0x0046, 0x1078, 0x2412, 0x00c0, 0x1c28, 0x7003, 0x0004,
-       0x0078, 0x1bf7, 0x1078, 0x2d5e, 0x00c0, 0x1c49, 0x70b4, 0x8007,
-       0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b,
-       0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078,
-       0x2410, 0x00c0, 0x1c49, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033,
-       0x3570, 0x0078, 0x1bf7, 0x1078, 0x2d5e, 0x00c0, 0x1c6f, 0x71b4,
-       0x8107, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x0007,
-       0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab,
-       0x0002, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078, 0x2410, 0x00c0,
-       0x1c6f, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033, 0x3570, 0x0078,
-       0x1bf7, 0x1078, 0x2d5e, 0x00c0, 0x1c99, 0x71b4, 0x8107, 0x789b,
-       0x007e, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, 0x00c0,
-       0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab, 0x000d, 0x789b,
-       0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078,
-       0x2410, 0x00c0, 0x1c99, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033,
-       0x3570, 0x0078, 0x1bf7, 0x0078, 0x1c4b, 0x1078, 0x2d5e, 0x00c0,
-       0x1bf7, 0x70bc, 0x2068, 0x789b, 0x0010, 0x6f10, 0x1078, 0x2ca1,
-       0x2c50, 0x6810, 0xa084, 0x0007, 0xa085, 0x0080, 0x78aa, 0x6e18,
-       0x2041, 0x0001, 0x2001, 0x0004, 0x0078, 0x1dde, 0x1078, 0x2d5e,
-       0x00c0, 0x1bf7, 0x789b, 0x0010, 0x705c, 0x2068, 0x6f10, 0x1078,
-       0x2ca1, 0x2c50, 0x6008, 0xa085, 0x0010, 0x600a, 0x6810, 0xa084,
-       0x0007, 0xa085, 0x0080, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001,
-       0x1078, 0x2dc5, 0x2001, 0x0003, 0x0078, 0x1dc9, 0x0018, 0x1bc8,
-       0x7440, 0xa485, 0x0000, 0x0040, 0x1cf0, 0xa080, 0x3580, 0x2030,
-       0x7144, 0x8108, 0xa12a, 0x0048, 0x1ce7, 0x2009, 0x3580, 0x2164,
-       0x6504, 0x85ff, 0x00c0, 0x1cfd, 0x8421, 0x00c0, 0x1ce1, 0x7146,
-       0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x1bf7, 0x7640, 0xa6b0,
-       0x3580, 0x7144, 0x2600, 0x0078, 0x1cec, 0x7146, 0x2568, 0x2558,
-       0x753e, 0x2c50, 0x6034, 0xa085, 0x0000, 0x00c0, 0x1cfa, 0x6708,
-       0x7736, 0xa784, 0x013f, 0x0040, 0x1d2f, 0xa784, 0x0021, 0x00c0,
-       0x1cfa, 0xa784, 0x0002, 0x0040, 0x1d1c, 0xa784, 0x0004, 0x0040,
-       0x1cfa, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008, 0x00c0, 0x1cfa,
-       0xa784, 0x0010, 0x00c0, 0x1cfa, 0xa784, 0x0100, 0x0040, 0x1d2f,
-       0x6018, 0xa005, 0x00c0, 0x1cfa, 0xa7bc, 0xfeff, 0x670a, 0x681f,
-       0x0000, 0x6e18, 0xa684, 0x000e, 0x6118, 0x0040, 0x1d3f, 0x601c,
-       0xa102, 0x0048, 0x1d42, 0x0040, 0x1d42, 0x0078, 0x1cf6, 0x81ff,
-       0x00c0, 0x1cf6, 0xa784, 0x0080, 0x00c0, 0x1d48, 0x700c, 0x6022,
-       0xa7bc, 0xff7f, 0x670a, 0x6b10, 0x8307, 0xa084, 0x000f, 0x8003,
-       0x8003, 0x8003, 0xa080, 0x3600, 0x2060, 0x2048, 0x704a, 0x6000,
-       0x704e, 0x6004, 0x7052, 0x2a60, 0x0018, 0x1bc8, 0x789b, 0x0010,
-       0xa046, 0x1078, 0x2d5e, 0x00c0, 0x1bf7, 0x6b10, 0xa39c, 0x0007,
-       0xa39d, 0x00c0, 0x704c, 0xa084, 0x8000, 0x0040, 0x1d73, 0xa684,
-       0x0001, 0x0040, 0x1d75, 0xa39c, 0xffbf, 0xa684, 0x0010, 0x0040,
-       0x1d7b, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e, 0x00c0,
-       0x1d86, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x1dc7, 0x714c, 0xa18c,
-       0x0800, 0x0040, 0x2902, 0x2011, 0x0021, 0x8004, 0x8004, 0x0048,
-       0x1d9d, 0x2011, 0x0022, 0x8004, 0x0048, 0x1d9d, 0x2011, 0x0020,
-       0x8004, 0x0048, 0x1d9d, 0x0040, 0x1dc7, 0x7aaa, 0x8840, 0x1078,
-       0x2d77, 0x6a10, 0x610c, 0x8108, 0xa18c, 0x00ff, 0xa1e0, 0x3e80,
-       0x2c64, 0x8cff, 0x0040, 0x1dbe, 0x6010, 0xa206, 0x00c0, 0x1da8,
-       0x60b4, 0x8001, 0x60b6, 0x00c0, 0x1da3, 0x0c7e, 0x2a60, 0x6008,
-       0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078, 0x1cd6, 0x1078, 0x2d5e,
-       0x00c0, 0x1bf7, 0x2a60, 0x610e, 0x79aa, 0x8840, 0x712e, 0x2001,
-       0x0001, 0x007e, 0x7150, 0xa184, 0x0018, 0x0040, 0x1ddd, 0xa184,
-       0x0010, 0x0040, 0x1dd7, 0x1078, 0x2acc, 0x00c0, 0x1ddd, 0xa184,
-       0x0008, 0x0040, 0x1ddd, 0x1078, 0x29e6, 0x007f, 0x7002, 0xa68c,
-       0x0060, 0x88ff, 0x0040, 0x1de6, 0xa18d, 0x0004, 0x795a, 0x69b2,
-       0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061, 0x6814, 0xa085,
-       0x8000, 0x6816, 0x78aa, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012c,
-       0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000a, 0x2098, 0x53a6,
-       0x147f, 0x137f, 0x157f, 0x6810, 0x8007, 0x789b, 0x007e, 0x78aa,
-       0x6d90, 0x7dd6, 0x7dde, 0x6e94, 0x7ed2, 0x7eda, 0x7830, 0xa084,
-       0x00c0, 0x00c0, 0x1e15, 0x0098, 0x1e1d, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x1078, 0x2d77, 0x0078, 0x1bff, 0x7200, 0xa284, 0x0007,
-       0xa086, 0x0001, 0x00c0, 0x1e2a, 0x781b, 0x0049, 0x1078, 0x2d77,
-       0x0078, 0x1e3b, 0x6ab0, 0xa295, 0x2000, 0x7a5a, 0x781b, 0x0049,
-       0x1078, 0x2d77, 0x7200, 0x2500, 0xa605, 0x0040, 0x1e3b, 0xa284,
-       0x0007, 0x1079, 0x1e49, 0xad80, 0x0008, 0x7032, 0xa284, 0x0007,
-       0xa086, 0x0001, 0x00c0, 0x1e47, 0x6018, 0x8000, 0x601a, 0x0078,
-       0x1bf7, 0x1e51, 0x30f0, 0x30f0, 0x30df, 0x30f0, 0x1e51, 0x1e51,
-       0x1e51, 0x1078, 0x1ba5, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e,
-       0x2079, 0x3500, 0x7898, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x1e79,
-       0x70a0, 0xa086, 0x0001, 0x00c0, 0x1e68, 0x70a2, 0x0078, 0x1f01,
-       0x70a0, 0xa086, 0x0005, 0x00c0, 0x1e77, 0x70bc, 0x2068, 0x6817,
-       0x0004, 0x6813, 0x0000, 0x681c, 0xa085, 0x0008, 0x681e, 0x70a3,
-       0x0000, 0x157e, 0x2011, 0x0004, 0x71a0, 0xa186, 0x0001, 0x0040,
-       0x1e9b, 0xa186, 0x0007, 0x00c0, 0x1e8b, 0x2009, 0x352b, 0x200b,
-       0x0005, 0x0078, 0x1e9b, 0x2009, 0x3513, 0x2104, 0x2009, 0x3512,
-       0x200a, 0x2009, 0x352b, 0x200b, 0x0001, 0x70a3, 0x0000, 0x70a7,
-       0x0001, 0x0078, 0x1e9d, 0x70a3, 0x0000, 0x1078, 0x2ec7, 0x20a9,
-       0x0010, 0x2039, 0x0000, 0x1078, 0x2ba6, 0xa7b8, 0x0100, 0x0070,
-       0x1eab, 0x0078, 0x1ea3, 0x7000, 0x2020, 0x0079, 0x1eaf, 0x1edd,
-       0x1ec6, 0x1ec6, 0x1eb9, 0x1edd, 0x1edd, 0x1eb7, 0x1eb7, 0x1078,
-       0x1ba5, 0x2021, 0x3557, 0x2404, 0xa005, 0x0040, 0x1ec6, 0xad06,
-       0x00c0, 0x1ec6, 0x6800, 0x2022, 0x0078, 0x1ed6, 0x681c, 0xa084,
-       0x0001, 0x00c0, 0x1ed2, 0x6f10, 0x1078, 0x2ca1, 0x1078, 0x28d9,
-       0x0078, 0x1ed6, 0x7054, 0x2060, 0x6800, 0x6002, 0x6a16, 0x681c,
-       0xa085, 0x0008, 0x681e, 0x1078, 0x17dd, 0x2021, 0x3f80, 0x1078,
-       0x1f07, 0x2021, 0x3557, 0x1078, 0x1f07, 0x20a9, 0x0000, 0x2021,
-       0x3e80, 0x1078, 0x1f07, 0x8420, 0x0070, 0x1ef0, 0x0078, 0x1ee9,
-       0x20a9, 0x0080, 0x2061, 0x3680, 0x6018, 0x6110, 0xa102, 0x6012,
-       0x601b, 0x0000, 0xace0, 0x0010, 0x0070, 0x1f00, 0x0078, 0x1ef4,
-       0x157f, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x1bf7, 0x047e,
-       0x2404, 0xa005, 0x0040, 0x1f19, 0x2068, 0x6800, 0x007e, 0x6a16,
-       0x681c, 0xa085, 0x0008, 0x681e, 0x1078, 0x17dd, 0x007f, 0x0078,
-       0x1f09, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050,
-       0x1f23, 0x1078, 0x1ba5, 0x2300, 0x0079, 0x1f26, 0x1f29, 0x1f9c,
-       0x1faa, 0xa282, 0x0002, 0x0040, 0x1f2f, 0x1078, 0x1ba5, 0x70a0,
-       0x70a3, 0x0000, 0x70c3, 0x0000, 0x0079, 0x1f36, 0x1f3e, 0x1f3e,
-       0x1f40, 0x1f74, 0x2908, 0x1f3e, 0x1f74, 0x1f3e, 0x1078, 0x1ba5,
-       0x77b4, 0x1078, 0x2ba6, 0x77b4, 0xa7bc, 0x0f00, 0x1078, 0x2ca1,
-       0x6018, 0xa005, 0x0040, 0x1f6b, 0x2021, 0x3f80, 0x2009, 0x0004,
-       0x2011, 0x0010, 0x1078, 0x1fc5, 0x0040, 0x1f6b, 0x157e, 0x20a9,
-       0x0000, 0x2021, 0x3e80, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010,
-       0x1078, 0x1fc5, 0x047f, 0x0040, 0x1f6a, 0x8420, 0x0070, 0x1f6a,
-       0x0078, 0x1f5b, 0x157f, 0x8738, 0xa784, 0x0007, 0x00c0, 0x1f46,
-       0x0078, 0x1bff, 0x0078, 0x1bff, 0x77b4, 0x1078, 0x2ca1, 0x6018,
-       0xa005, 0x0040, 0x1f9a, 0x2021, 0x3f80, 0x2009, 0x0005, 0x2011,
-       0x0020, 0x1078, 0x1fc5, 0x0040, 0x1f9a, 0x157e, 0x20a9, 0x0000,
-       0x2021, 0x3e80, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078,
-       0x1fc5, 0x047f, 0x0040, 0x1f99, 0x8420, 0x0070, 0x1f99, 0x0078,
-       0x1f8a, 0x157f, 0x0078, 0x1bff, 0x2200, 0x0079, 0x1f9f, 0x1fa2,
-       0x1fa4, 0x1fa4, 0x1078, 0x1ba5, 0x70a3, 0x0000, 0x70a7, 0x0001,
-       0x0078, 0x1bf7, 0x2200, 0x0079, 0x1fad, 0x1fb2, 0x1fa4, 0x1fb0,
-       0x1078, 0x1ba5, 0x1078, 0x241f, 0x7000, 0xa086, 0x0001, 0x00c0,
-       0x28af, 0x1078, 0x28ef, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
-       0x28a2, 0x0040, 0x28af, 0x0078, 0x1cd6, 0x2404, 0xa005, 0x0040,
-       0x1fe6, 0x2068, 0x2d04, 0x007e, 0x6810, 0xa706, 0x0040, 0x1fd4,
-       0x2d20, 0x007f, 0x0078, 0x1fc6, 0x007f, 0x2022, 0x6916, 0x681c,
-       0xa205, 0x681e, 0x1078, 0x17dd, 0x6010, 0x8001, 0x6012, 0x6008,
-       0xa084, 0xffef, 0x600a, 0x1078, 0x28ef, 0x007c, 0xa085, 0x0001,
-       0x0078, 0x1fe5, 0x2300, 0x0079, 0x1fed, 0x1ff2, 0x1ff0, 0x2035,
-       0x1078, 0x1ba5, 0x78e4, 0xa005, 0x00d0, 0x2015, 0x0018, 0x2015,
-       0x2008, 0xa084, 0x0030, 0x00c0, 0x2001, 0x781b, 0x0049, 0x0078,
-       0x1bf7, 0x78ec, 0xa084, 0x0003, 0x0040, 0x1ffd, 0x2100, 0xa084,
-       0x0007, 0x0079, 0x200b, 0x2023, 0x2029, 0x201d, 0x2013, 0x2d58,
-       0x2d58, 0x2013, 0x202f, 0x1078, 0x1ba5, 0x7000, 0xa005, 0x0040,
-       0x1bff, 0x2001, 0x0003, 0x0078, 0x22fa, 0x1078, 0x2b89, 0x781b,
-       0x0055, 0x0078, 0x1bf7, 0x1078, 0x2b89, 0x781b, 0x00dc, 0x0078,
-       0x1bf7, 0x1078, 0x2b89, 0x781b, 0x00e3, 0x0078, 0x1bf7, 0x1078,
-       0x2b89, 0x781b, 0x009d, 0x0078, 0x1bf7, 0xa584, 0x000f, 0x00c0,
-       0x205f, 0x1078, 0x241f, 0x7000, 0x0079, 0x203e, 0x2046, 0x2053,
-       0x2046, 0x28af, 0x2048, 0x28af, 0x2046, 0x2046, 0x1078, 0x1ba5,
-       0x71a0, 0x70a3, 0x0000, 0xa186, 0x0004, 0x00c0, 0x2051, 0x0078,
-       0x2908, 0x0078, 0x28af, 0x1078, 0x28ef, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x1078, 0x28a2, 0x0040, 0x28af, 0x0078, 0x1cd6, 0x78e4,
-       0xa005, 0x00d0, 0x2015, 0x0018, 0x2015, 0x2008, 0xa084, 0x0030,
-       0x00c0, 0x206e, 0x781b, 0x0049, 0x0078, 0x1bf7, 0x78ec, 0xa084,
-       0x0003, 0x0040, 0x206a, 0x2100, 0xa184, 0x0007, 0x0079, 0x2078,
-       0x2088, 0x208e, 0x2082, 0x2080, 0x2d58, 0x2d58, 0x2080, 0x2d50,
-       0x1078, 0x1ba5, 0x1078, 0x2b91, 0x781b, 0x0055, 0x0078, 0x1bf7,
-       0x1078, 0x2b91, 0x781b, 0x00dc, 0x0078, 0x1bf7, 0x1078, 0x2b91,
-       0x781b, 0x00e3, 0x0078, 0x1bf7, 0x1078, 0x2b91, 0x781b, 0x009d,
-       0x0078, 0x1bf7, 0x2300, 0x0079, 0x209d, 0x20a2, 0x20a0, 0x20a4,
-       0x1078, 0x1ba5, 0x0078, 0x2665, 0x6817, 0x0008, 0x78a3, 0x0000,
-       0x79e4, 0xa184, 0x0030, 0x0040, 0x2665, 0x78ec, 0xa084, 0x0003,
-       0x0040, 0x2665, 0xa184, 0x0007, 0x0079, 0x20b6, 0x2023, 0x2029,
-       0x201d, 0x2d30, 0x2d58, 0x2d58, 0x20be, 0x2d50, 0x1078, 0x1ba5,
-       0xa282, 0x0005, 0x0050, 0x20c6, 0x1078, 0x1ba5, 0x2300, 0x0079,
-       0x20c9, 0x20cc, 0x22ce, 0x22da, 0x2200, 0x0079, 0x20cf, 0x20d4,
-       0x20d6, 0x20e9, 0x20d4, 0x22b3, 0x1078, 0x1ba5, 0x789b, 0x0018,
-       0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0048, 0x2b6a, 0xa08a,
-       0x0004, 0x00c8, 0x2b6a, 0x0079, 0x20e5, 0x2b6a, 0x2b6a, 0x2b6a,
-       0x2b0c, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x20fe,
-       0xa184, 0x0018, 0x0040, 0x20fa, 0x0078, 0x2b6a, 0x7000, 0xa005,
-       0x00c0, 0x20f4, 0x2011, 0x0003, 0x0078, 0x2752, 0xa184, 0x00ff,
-       0xa08a, 0x0010, 0x00c8, 0x2b6a, 0x0079, 0x2106, 0x2118, 0x2116,
-       0x212e, 0x2130, 0x21c2, 0x2b6a, 0x2b6a, 0x21c4, 0x2b6a, 0x2b6a,
-       0x22af, 0x22af, 0x2b6a, 0x2b6a, 0x2b6a, 0x22b1, 0x1078, 0x1ba5,
-       0xa684, 0x1000, 0x0040, 0x2125, 0x2001, 0x0300, 0x8000, 0x8000,
-       0x783a, 0x781b, 0x009a, 0x0078, 0x1bf7, 0x6814, 0xa084, 0x8000,
-       0x0040, 0x212c, 0x6817, 0x0003, 0x0078, 0x2d30, 0x1078, 0x1ba5,
-       0x691c, 0x691e, 0xa684, 0x1800, 0x00c0, 0x214a, 0x681c, 0xa084,
-       0x0001, 0x00c0, 0x2152, 0x6814, 0xa086, 0x0008, 0x00c0, 0x2142,
-       0x6817, 0x0000, 0xa684, 0x0400, 0x0040, 0x21be, 0x781b, 0x0058,
-       0x0078, 0x1bf7, 0xa684, 0x1000, 0x0040, 0x2152, 0x781b, 0x0058,
-       0x0078, 0x1bf7, 0xa684, 0x0060, 0x0040, 0x21ba, 0xa684, 0x0800,
-       0x0040, 0x21ba, 0xa684, 0x8000, 0x00c0, 0x2160, 0x0078, 0x217a,
-       0xa6b4, 0x7fff, 0x7e5a, 0x6eb2, 0x789b, 0x0074, 0x7aac, 0x79ac,
-       0x78ac, 0x801b, 0x00c8, 0x216d, 0x8000, 0xa084, 0x003f, 0xa108,
-       0xa291, 0x0000, 0x6b94, 0x2100, 0xa302, 0x68ae, 0x6b90, 0x2200,
-       0xa303, 0x68aa, 0xa684, 0x4000, 0x0040, 0x2182, 0xa6b4, 0xbfff,
-       0x7e5a, 0x6eb2, 0x7000, 0xa086, 0x0003, 0x00c0, 0x218f, 0x1078,
-       0x2f3a, 0x1078, 0x30df, 0x781b, 0x0067, 0x0078, 0x1bf7, 0xa006,
-       0x1078, 0x3194, 0x6aac, 0x69a8, 0x6c94, 0x6b90, 0x2200, 0xa105,
-       0x0040, 0x219e, 0x2200, 0xa422, 0x2100, 0xa31b, 0x7cd2, 0x7bd6,
-       0x2300, 0xa405, 0x00c0, 0x21ac, 0xa6b5, 0x4000, 0x7e5a, 0x6eb2,
-       0x781b, 0x0067, 0x0078, 0x1bf7, 0x781b, 0x0067, 0x2200, 0xa115,
-       0x00c0, 0x21b6, 0x1078, 0x30f0, 0x0078, 0x1bf7, 0x1078, 0x311d,
-       0x0078, 0x1bf7, 0x781b, 0x006a, 0x0078, 0x1bf7, 0x781b, 0x0058,
-       0x0078, 0x1bf7, 0x1078, 0x1ba5, 0x0078, 0x2221, 0x691c, 0xa184,
-       0x0100, 0x0040, 0x21dc, 0xa18c, 0xfeff, 0x691e, 0x0c7e, 0x7048,
-       0x2060, 0x6000, 0xa084, 0xefff, 0x6002, 0x6004, 0xa084, 0xfff5,
-       0x6006, 0x0c7f, 0x0078, 0x2210, 0xa184, 0x0200, 0x0040, 0x2210,
-       0xa18c, 0xfdff, 0x691e, 0x0c7e, 0x7048, 0x2060, 0x6000, 0xa084,
-       0xdfff, 0x6002, 0x6004, 0xa084, 0xffef, 0x6006, 0x2008, 0x2c48,
-       0x0c7f, 0xa184, 0x0008, 0x0040, 0x2210, 0x1078, 0x2c9d, 0x1078,
-       0x29e6, 0x88ff, 0x0040, 0x2210, 0x789b, 0x0060, 0x2800, 0x78aa,
-       0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x220c,
-       0x781b, 0x0055, 0x0078, 0x1bf7, 0x781b, 0x0069, 0x0078, 0x1bf7,
-       0x7e58, 0xa684, 0x0400, 0x00c0, 0x2219, 0x781b, 0x0058, 0x0078,
-       0x1bf7, 0x781b, 0x006a, 0x0078, 0x1bf7, 0x0078, 0x2b70, 0x0078,
-       0x2b70, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040, 0x221f,
-       0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0,
-       0x2244, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x223c,
-       0x0048, 0x223c, 0x0078, 0x223e, 0x0078, 0x21c6, 0x24a8, 0x7aa8,
-       0x00f0, 0x223e, 0x0078, 0x222a, 0xa284, 0x00f0, 0xa086, 0x0020,
-       0x00c0, 0x22a0, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, 0x2254,
-       0x0048, 0x2254, 0x0078, 0x229d, 0xa286, 0x0023, 0x0040, 0x221f,
-       0x6818, 0xa084, 0xfff1, 0x681a, 0x7e58, 0xa684, 0xfff1, 0xa085,
-       0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, 0x0010, 0x600a, 0x0c7e,
-       0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0010,
-       0x0040, 0x2278, 0x1078, 0x2c9d, 0x1078, 0x2acc, 0x0078, 0x2287,
-       0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184,
-       0x0008, 0x0040, 0x2210, 0x1078, 0x2c9d, 0x1078, 0x29e6, 0x88ff,
-       0x0040, 0x2210, 0x789b, 0x0060, 0x2800, 0x78aa, 0xa6b5, 0x0004,
-       0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2299, 0x781b, 0x0055, 0x0078,
-       0x1bf7, 0x781b, 0x0069, 0x0078, 0x1bf7, 0x7aa8, 0x0078, 0x222a,
-       0x8318, 0x2300, 0xa102, 0x0040, 0x22a9, 0x0048, 0x22a9, 0x0078,
-       0x222a, 0xa284, 0x0080, 0x00c0, 0x2b76, 0x0078, 0x2b70, 0x0078,
-       0x2b76, 0x0078, 0x2b6a, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
-       0xa08e, 0x0001, 0x0040, 0x22be, 0x1078, 0x1ba5, 0x7aa8, 0xa294,
-       0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x2b6a,
-       0x0079, 0x22ca, 0x2b6a, 0x2939, 0x2b6a, 0x2a67, 0xa282, 0x0000,
-       0x00c0, 0x22d4, 0x1078, 0x1ba5, 0x1078, 0x2b89, 0x781b, 0x0069,
-       0x0078, 0x1bf7, 0xa282, 0x0003, 0x00c0, 0x22e0, 0x1078, 0x1ba5,
-       0x1078, 0x2b99, 0x781b, 0x0069, 0x0078, 0x1bf7, 0xa282, 0x0004,
-       0x0050, 0x22ec, 0x1078, 0x1ba5, 0x2300, 0x0079, 0x22ef, 0x22f2,
-       0x23c9, 0x23fa, 0xa286, 0x0003, 0x0040, 0x22f8, 0x1078, 0x1ba5,
-       0x2001, 0x0000, 0x703a, 0x7000, 0xa084, 0x0007, 0x0079, 0x2300,
-       0x2308, 0x230a, 0x230a, 0x2508, 0x2530, 0x24d2, 0x2308, 0x2308,
-       0x1078, 0x1ba5, 0xa684, 0x1000, 0x00c0, 0x2312, 0x1078, 0x2ec7,
-       0x0040, 0x23a3, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x235a, 0xa186,
-       0x0008, 0x00c0, 0x2329, 0x1078, 0x28ef, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x1078, 0x28a2, 0x0040, 0x235a, 0x1078, 0x2ec7, 0x0078,
-       0x2341, 0xa186, 0x0028, 0x00c0, 0x235a, 0x1078, 0x2ec7, 0x6008,
-       0xa084, 0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2341, 0x8001,
-       0x601a, 0xa005, 0x0040, 0x2341, 0x8001, 0xa005, 0x0040, 0x2341,
-       0x601e, 0x681c, 0xa084, 0x0001, 0x0040, 0x1bff, 0x681c, 0xa084,
-       0xfffe, 0x681e, 0x7054, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f,
-       0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x2357, 0x6002, 0x6006,
-       0x0078, 0x1bff, 0x017e, 0x1078, 0x241f, 0x017f, 0xa684, 0xdf00,
-       0x681a, 0x6827, 0x0000, 0x6f10, 0x81ff, 0x0040, 0x23a3, 0xa186,
-       0x0002, 0x00c0, 0x239b, 0xa684, 0x0800, 0x00c0, 0x2377, 0xa684,
-       0x0060, 0x0040, 0x2377, 0x78d8, 0x7adc, 0x682e, 0x6a2a, 0x8717,
-       0xa294, 0x000f, 0x8213, 0x8213, 0x8213, 0xa290, 0x3600, 0xa290,
-       0x0000, 0x221c, 0xa384, 0x0100, 0x00c0, 0x2388, 0x0078, 0x238e,
-       0x8210, 0x2204, 0xa085, 0x0018, 0x2012, 0x8211, 0xa384, 0x0400,
-       0x0040, 0x239b, 0x689c, 0xa084, 0x0100, 0x00c0, 0x239b, 0x1078,
-       0x2491, 0x0078, 0x1bff, 0xa186, 0x0018, 0x0040, 0x23a3, 0xa186,
-       0x0014, 0x0040, 0x1bff, 0x6912, 0x6814, 0xa084, 0x8000, 0x0040,
-       0x23ab, 0x7038, 0x6816, 0xa68c, 0xdf00, 0x691a, 0x1078, 0x28e0,
-       0x1078, 0x28ef, 0x00c0, 0x23b8, 0x6008, 0xa084, 0xffef, 0x600a,
-       0x681c, 0xa084, 0x0001, 0x00c0, 0x23c1, 0x1078, 0x28d9, 0x0078,
-       0x23c5, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078, 0x17dd, 0x0078,
-       0x1bff, 0xa282, 0x0004, 0x0048, 0x23cf, 0x1078, 0x1ba5, 0x2200,
-       0x0079, 0x23d2, 0x23d6, 0x23d8, 0x23e5, 0x23d8, 0x1078, 0x1ba5,
-       0x7000, 0xa086, 0x0005, 0x0040, 0x23e1, 0x1078, 0x2b89, 0x781b,
-       0x0069, 0x781b, 0x006a, 0x0078, 0x1bf7, 0x7890, 0x8007, 0x8001,
-       0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
-       0xa186, 0x0003, 0x0040, 0x23f6, 0x0078, 0x2b6a, 0x781b, 0x006a,
-       0x0078, 0x1bf7, 0x681c, 0xa085, 0x0004, 0x681e, 0x82ff, 0x00c0,
-       0x2405, 0x1078, 0x2b89, 0x0078, 0x240c, 0x8211, 0x0040, 0x240a,
-       0x1078, 0x1ba5, 0x1078, 0x2b99, 0x781b, 0x0069, 0x0078, 0x1bf7,
-       0x1078, 0x2d77, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x241c, 0x0018,
-       0x241c, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684,
-       0x0060, 0x00c0, 0x2429, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078,
-       0x2490, 0xa684, 0x0800, 0x00c0, 0x2438, 0x68b0, 0xa084, 0x4800,
-       0xa635, 0xa684, 0x0800, 0x00c0, 0x2438, 0x1078, 0x2ec7, 0x007c,
-       0xa684, 0x0020, 0x0040, 0x2462, 0x78d0, 0x8003, 0x00c8, 0x2446,
-       0xa006, 0x1078, 0x3194, 0x78d4, 0x1078, 0x31f9, 0xa684, 0x4000,
-       0x0040, 0x2450, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078, 0x2435,
-       0x68b0, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x244a,
-       0x7038, 0xa005, 0x00c0, 0x245c, 0x79d8, 0x7adc, 0x692e, 0x6a2a,
-       0x0078, 0x2435, 0xa684, 0x4000, 0x0040, 0x246c, 0x682f, 0x0000,
-       0x682b, 0x0000, 0x0078, 0x2435, 0x68b0, 0xa084, 0x4800, 0xa635,
-       0xa684, 0x4000, 0x00c0, 0x2466, 0x7038, 0xa005, 0x00c0, 0x247a,
-       0x703b, 0x0007, 0x79d8, 0x7adc, 0x78d0, 0x80f3, 0x00c8, 0x2481,
-       0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a2a,
-       0x2100, 0xa205, 0x00c0, 0x248e, 0x0078, 0x2435, 0x1078, 0x3194,
-       0x007c, 0xa384, 0x0200, 0x0040, 0x2499, 0x6008, 0xa085, 0x0002,
-       0x600a, 0x6817, 0x0006, 0x6a28, 0x692c, 0x6a3a, 0x693e, 0x682b,
-       0x0300, 0x682f, 0x0000, 0x6833, 0x2000, 0x6893, 0x0000, 0x6897,
-       0x0020, 0x7000, 0x0079, 0x24ac, 0x24b4, 0x24b6, 0x24bf, 0x24b4,
-       0x24b4, 0x24b4, 0x24b4, 0x24b4, 0x1078, 0x1ba5, 0x681c, 0xa084,
-       0x0001, 0x00c0, 0x24bf, 0x1078, 0x28d9, 0x0078, 0x24c5, 0x7054,
-       0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, 0x2021, 0x3557, 0x2404,
-       0xa005, 0x0040, 0x24ce, 0x2020, 0x0078, 0x24c7, 0x2d22, 0x206b,
-       0x0000, 0x007c, 0x77b4, 0x1078, 0x2ba6, 0xa7bc, 0x0f00, 0x1078,
-       0x2ca1, 0x6018, 0xa005, 0x0040, 0x2501, 0x0d7e, 0x2001, 0x3f90,
-       0x2068, 0x0d7f, 0x2021, 0x3f80, 0x2009, 0x0004, 0x2011, 0x0010,
-       0x1078, 0x1fc5, 0x0040, 0x2501, 0x157e, 0x20a9, 0x0000, 0x2021,
-       0x3e80, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x1fc5,
-       0x047f, 0x0040, 0x2500, 0x8420, 0x0070, 0x2500, 0x0078, 0x24f1,
-       0x157f, 0x8738, 0xa784, 0x0007, 0x00c0, 0x24d7, 0x0078, 0x1bff,
-       0x1078, 0x28e0, 0x1078, 0x28ef, 0x6827, 0x0000, 0x789b, 0x000e,
-       0x6f10, 0x6813, 0x0002, 0x1078, 0x31ca, 0xa684, 0x0800, 0x0040,
-       0x251d, 0x6918, 0xa18d, 0x2000, 0x691a, 0x6814, 0xa084, 0x8000,
-       0x0040, 0x2524, 0x6817, 0x0000, 0x2021, 0x3557, 0x6800, 0x2022,
-       0x6a38, 0x693c, 0x6a2a, 0x692e, 0x1078, 0x17dd, 0x0078, 0x1bff,
-       0x1078, 0x241f, 0x6827, 0x0000, 0x789b, 0x000e, 0x6f10, 0x1078,
-       0x2d7c, 0xa08c, 0x00ff, 0x6912, 0x6814, 0xa084, 0x8000, 0x0040,
-       0x2543, 0x7038, 0x6816, 0xa68c, 0xdf00, 0x691a, 0x70a3, 0x0000,
-       0x0078, 0x1bff, 0xa006, 0x1078, 0x2ec7, 0x6813, 0x0000, 0x6817,
-       0x0001, 0xa68c, 0xdf00, 0x691a, 0x6827, 0x0000, 0x7000, 0x0079,
-       0x2559, 0x2561, 0x2563, 0x2563, 0x2565, 0x2565, 0x2565, 0x2561,
-       0x2561, 0x1078, 0x1ba5, 0x1078, 0x28ef, 0x6008, 0xa084, 0xffef,
-       0x600a, 0x0078, 0x28ba, 0x2300, 0x0079, 0x256e, 0x2571, 0x2573,
-       0x25b1, 0x1078, 0x1ba5, 0x7000, 0x0079, 0x2576, 0x257e, 0x2580,
-       0x2580, 0x258b, 0x2580, 0x2592, 0x257e, 0x257e, 0x1078, 0x1ba5,
-       0xa684, 0x2000, 0x00c0, 0x258b, 0xa6b5, 0x2000, 0x7e5a, 0x1078,
-       0x30f0, 0x0078, 0x2d30, 0x6814, 0xa084, 0x8000, 0x0040, 0x2592,
-       0x6817, 0x0007, 0x2009, 0x3518, 0x210c, 0xa186, 0x0000, 0x0040,
-       0x25a7, 0xa186, 0x0001, 0x0040, 0x25ab, 0x2009, 0x352b, 0x200b,
-       0x000b, 0x70a3, 0x0001, 0x781b, 0x0046, 0x0078, 0x1bf7, 0x781b,
-       0x00dd, 0x0078, 0x1bf7, 0x2009, 0x352b, 0x200b, 0x000a, 0x0078,
-       0x1bf7, 0x1078, 0x1ba5, 0x2300, 0x0079, 0x25b6, 0x25b9, 0x25bb,
-       0x25de, 0x1078, 0x1ba5, 0x7000, 0x0079, 0x25be, 0x25c6, 0x25c8,
-       0x25c8, 0x25d3, 0x25c8, 0x25da, 0x25c6, 0x25c6, 0x1078, 0x1ba5,
-       0xa684, 0x2000, 0x00c0, 0x25d3, 0xa6b5, 0x2000, 0x7e5a, 0x1078,
-       0x30f0, 0x0078, 0x2d30, 0x6814, 0xa084, 0x8000, 0x0040, 0x25da,
-       0x6817, 0x0007, 0x781b, 0x00e4, 0x0078, 0x1bf7, 0x681c, 0xa085,
-       0x0004, 0x681e, 0xa6b5, 0x0800, 0x1078, 0x2b89, 0x781b, 0x0069,
-       0x0078, 0x1bf7, 0x2300, 0x0079, 0x25ed, 0x25f0, 0x25f2, 0x25f4,
-       0x1078, 0x1ba5, 0x1078, 0x1ba5, 0xa684, 0x0400, 0x00c0, 0x2613,
-       0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb,
-       0x785a, 0x79e4, 0xa184, 0x0020, 0x0040, 0x260b, 0x78ec, 0xa084,
-       0x0003, 0x00c0, 0x260f, 0x2001, 0x0014, 0x0078, 0x22fa, 0xa184,
-       0x0007, 0x0079, 0x264b, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060,
-       0x79a8, 0x81ff, 0x0040, 0x2649, 0x789b, 0x0010, 0x7ba8, 0xa384,
-       0x0001, 0x00c0, 0x263a, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0,
-       0x262d, 0x2009, 0xfff7, 0x0078, 0x2633, 0xa386, 0x0003, 0x00c0,
-       0x263a, 0x2009, 0xffef, 0x0c7e, 0x7048, 0x2060, 0x6004, 0xa104,
-       0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb,
-       0x785a, 0x782b, 0x3009, 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
-       0x691e, 0x0078, 0x2d30, 0x2023, 0x2029, 0x2655, 0x265d, 0x2653,
-       0x2653, 0x2653, 0x2d30, 0x1078, 0x1ba5, 0x691c, 0xa18c, 0xfdff,
-       0xa18c, 0xfeff, 0x691e, 0x0078, 0x2d38, 0x691c, 0xa18c, 0xfdff,
-       0xa18c, 0xfeff, 0x691e, 0x0078, 0x2d30, 0x79e4, 0xa184, 0x0030,
-       0x0040, 0x266f, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x2677, 0x6814,
-       0xa085, 0x8000, 0x6816, 0x2001, 0x0014, 0x0078, 0x22fa, 0xa184,
-       0x0007, 0x0079, 0x267b, 0x2d30, 0x2d30, 0x2683, 0x2d30, 0x2d58,
-       0x2d58, 0x2d30, 0x2d30, 0xa684, 0x0400, 0x00c0, 0x26b4, 0x681c,
-       0xa084, 0x0001, 0x0040, 0x2d38, 0xa68c, 0x2060, 0xa18c, 0xfffb,
-       0x795a, 0x69b2, 0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061,
-       0x6814, 0xa085, 0x8000, 0x6816, 0x78aa, 0x157e, 0x137e, 0x147e,
-       0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000a,
-       0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6810, 0x8007, 0x789b,
-       0x007e, 0x78aa, 0x0078, 0x2d38, 0x6814, 0xa084, 0x8000, 0x0040,
-       0x26bb, 0x6817, 0x0008, 0x781b, 0x00d8, 0x0078, 0x1bf7, 0x2300,
-       0x0079, 0x26c2, 0x26c7, 0x2742, 0x26c5, 0x1078, 0x1ba5, 0x7000,
-       0xa084, 0x0007, 0x0079, 0x26cc, 0x26d4, 0x26d6, 0x26f2, 0x26d4,
-       0x26d4, 0x24d2, 0x26d4, 0x26d4, 0x1078, 0x1ba5, 0x691c, 0xa18d,
-       0x0001, 0x691e, 0x6800, 0x6006, 0xa005, 0x00c0, 0x26e0, 0x6002,
-       0x6818, 0xa084, 0x000e, 0x0040, 0x26ec, 0x7014, 0x68b6, 0x712c,
-       0xa188, 0x3e80, 0x0078, 0x26ee, 0x2009, 0x3f80, 0x2104, 0x6802,
-       0x2d0a, 0x7156, 0x6eb2, 0xa684, 0x0060, 0x0040, 0x2740, 0xa684,
-       0x0800, 0x00c0, 0x2704, 0xa684, 0x7fff, 0x68b2, 0x6890, 0x6894,
-       0x1078, 0x2ec7, 0x0078, 0x2740, 0xa684, 0x0020, 0x0040, 0x2716,
-       0xa006, 0x1078, 0x3194, 0x78d0, 0x8003, 0x00c8, 0x2712, 0x78d4,
-       0x1078, 0x31f9, 0x79d8, 0x7adc, 0x0078, 0x271a, 0x1078, 0x2cae,
-       0x1078, 0x3194, 0xa684, 0x8000, 0x0040, 0x2740, 0xa684, 0x7fff,
-       0x68b2, 0x789b, 0x0074, 0x1078, 0x2d7c, 0x2010, 0x1078, 0x2d7c,
-       0x2008, 0xa684, 0x0020, 0x00c0, 0x2738, 0x1078, 0x2d7c, 0x801b,
-       0x00c8, 0x2733, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
-       0x6b94, 0x2100, 0xa302, 0x68ae, 0x6b90, 0x2200, 0xa303, 0x68aa,
-       0x0078, 0x1bff, 0x0078, 0x2b76, 0x7033, 0x0000, 0xa282, 0x0005,
-       0x0050, 0x274c, 0x1078, 0x1ba5, 0x2300, 0x0079, 0x274f, 0x2752,
-       0x275c, 0x277f, 0x2200, 0x0079, 0x2755, 0x275a, 0x2b76, 0x275a,
-       0x27a8, 0x27f9, 0x1078, 0x1ba5, 0x7000, 0xa086, 0x0001, 0x00c0,
-       0x2769, 0x1078, 0x28ef, 0x1078, 0x2ec7, 0x7034, 0x600a, 0x0078,
-       0x276e, 0x7000, 0xa086, 0x0003, 0x0040, 0x2763, 0x7003, 0x0005,
-       0x2001, 0x3f90, 0x2068, 0x703e, 0x7032, 0x2200, 0x0079, 0x2778,
-       0x2b76, 0x277d, 0x27a8, 0x277d, 0x2b76, 0x1078, 0x1ba5, 0x7000,
-       0xa086, 0x0001, 0x00c0, 0x278c, 0x1078, 0x28ef, 0x1078, 0x2ec7,
-       0x7034, 0x600a, 0x0078, 0x2791, 0x7000, 0xa086, 0x0003, 0x0040,
-       0x2786, 0x7003, 0x0005, 0x2001, 0x3f90, 0x2068, 0x703e, 0x7032,
-       0x2200, 0x0079, 0x279b, 0x27a2, 0x27a0, 0x27a2, 0x27a0, 0x27a2,
-       0x1078, 0x1ba5, 0x1078, 0x2b99, 0x781b, 0x0069, 0x0078, 0x1bf7,
-       0x7000, 0xa086, 0x0001, 0x00c0, 0x27b5, 0x1078, 0x28ef, 0x1078,
-       0x2ec7, 0x7034, 0x600a, 0x0078, 0x27ba, 0x7000, 0xa086, 0x0003,
-       0x0040, 0x27af, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
-       0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, 0x2069, 0x3f80, 0x2d04,
-       0x2d08, 0x7156, 0x2068, 0xa005, 0x0040, 0x27d5, 0x6810, 0xa206,
-       0x0040, 0x27ee, 0x6800, 0x0078, 0x27c8, 0x7003, 0x0005, 0x2001,
-       0x3f90, 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003,
-       0x0000, 0x8000, 0x0070, 0x27e6, 0x0078, 0x27df, 0x157f, 0x6a12,
-       0x68b3, 0x0700, 0x681f, 0x0800, 0x6823, 0x0003, 0x6eb0, 0x7e5a,
-       0x681c, 0xa084, 0x0c00, 0x0040, 0x284f, 0x1078, 0x2b91, 0x0078,
-       0x284f, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2806, 0x1078, 0x28ef,
-       0x1078, 0x2ec7, 0x7034, 0x600a, 0x0078, 0x280b, 0x7000, 0xa086,
-       0x0003, 0x0040, 0x2800, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00,
-       0x789b, 0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, 0x79a8, 0x79a8,
-       0xa18c, 0x00ff, 0xa1e8, 0x3e80, 0x2d04, 0x2d08, 0x7156, 0x2068,
-       0xa005, 0x0040, 0x282a, 0x6810, 0xa206, 0x0040, 0x2843, 0x6800,
-       0x0078, 0x281d, 0x7003, 0x0005, 0x2001, 0x3f90, 0x2068, 0x703e,
-       0x7032, 0x157e, 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070,
-       0x283b, 0x0078, 0x2834, 0x157f, 0x6a12, 0x68b3, 0x0700, 0x681f,
-       0x0800, 0x6823, 0x0003, 0x6eb0, 0x7e5a, 0x681c, 0xa084, 0x0c00,
-       0x0040, 0x284f, 0x1078, 0x2b8d, 0x7e58, 0x0078, 0x284f, 0x027e,
-       0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3600,
-       0x2060, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0xa684, 0x0060,
-       0x0040, 0x2886, 0x6b94, 0x6c90, 0x69a8, 0x68ac, 0xa105, 0x00c0,
-       0x2874, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff, 0x7e5a,
-       0x1078, 0x30f0, 0x0078, 0x2886, 0x68ac, 0xa31a, 0x2100, 0xa423,
-       0x2400, 0xa305, 0x0040, 0x2886, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde,
-       0x68ac, 0xa6b4, 0xbfff, 0x7e5a, 0x1078, 0x311d, 0x077f, 0x1078,
-       0x2ca1, 0x2009, 0x006a, 0xa684, 0x0008, 0x0040, 0x2891, 0x2009,
-       0x0069, 0xa6b5, 0x2000, 0x7e5a, 0x791a, 0x2d00, 0x703e, 0x8207,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3600, 0x2048,
-       0x0078, 0x1bf7, 0x6020, 0xa005, 0x0040, 0x28ae, 0x8001, 0x6022,
-       0x6008, 0xa085, 0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006,
-       0x1078, 0x2ec7, 0x6813, 0x0000, 0x6817, 0x0001, 0x681f, 0x0040,
-       0x681b, 0x0100, 0x7000, 0xa084, 0x0007, 0x0079, 0x28bf, 0x28c7,
-       0x28c9, 0x28c9, 0x28d5, 0x28d1, 0x28c7, 0x28c7, 0x28c7, 0x1078,
-       0x1ba5, 0x1078, 0x28e0, 0x1078, 0x28d9, 0x1078, 0x17dd, 0x0078,
-       0x1bff, 0x70a3, 0x0000, 0x0078, 0x1bff, 0x6817, 0x0000, 0x0078,
-       0x2508, 0x6800, 0xa005, 0x00c0, 0x28de, 0x6002, 0x6006, 0x007c,
-       0x6010, 0xa005, 0x0040, 0x28e9, 0x8001, 0x00d0, 0x28e9, 0x1078,
-       0x1ba5, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x6018,
-       0xa005, 0x0040, 0x28f5, 0x8001, 0x601a, 0x007c, 0x1078, 0x2d77,
-       0x6817, 0x0018, 0x0078, 0x2926, 0x1078, 0x2d77, 0x6817, 0x0019,
-       0x0078, 0x2926, 0x1078, 0x2d77, 0x6817, 0x001a, 0x0078, 0x2926,
-       0x77b4, 0x1078, 0x2ca1, 0x71b8, 0xa18c, 0x00ff, 0xa1e8, 0x3e80,
-       0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, 0x2918, 0x0078, 0x1bff,
-       0x6810, 0x72b4, 0xa206, 0x0040, 0x2920, 0x6800, 0x0078, 0x2911,
-       0x6800, 0x200a, 0x6817, 0x0005, 0x70bf, 0x0000, 0x1078, 0x28e0,
-       0x681c, 0xa084, 0x0001, 0x00c0, 0x292f, 0x1078, 0x28d9, 0x1078,
-       0x28ef, 0x681b, 0x0000, 0x681f, 0x0020, 0x1078, 0x17dd, 0x0078,
-       0x1bff, 0xa282, 0x0003, 0x00c0, 0x2b6a, 0x7da8, 0xa5ac, 0x00ff,
-       0x7ea8, 0xa6b4, 0x00ff, 0x691c, 0xa18d, 0x0080, 0x691e, 0xa184,
-       0x0100, 0x0040, 0x2999, 0xa18c, 0xfeff, 0x691e, 0xa6b4, 0x00ff,
-       0x0040, 0x2983, 0xa682, 0x000f, 0x0048, 0x295a, 0x0040, 0x295a,
-       0x2031, 0x000f, 0x852b, 0x852b, 0x1078, 0x2c24, 0x0040, 0x2964,
-       0x1078, 0x2a33, 0x0078, 0x298c, 0x1078, 0x2bdf, 0x0c7e, 0x2960,
-       0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x2a57, 0x0c7f, 0x691c,
-       0xa18d, 0x0100, 0x691e, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684,
-       0x0400, 0x00c0, 0x297f, 0x781b, 0x0055, 0x0078, 0x1bf7, 0x781b,
-       0x0069, 0x0078, 0x1bf7, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5,
-       0x6006, 0x1078, 0x2a57, 0x0c7f, 0x7e58, 0xa684, 0x0400, 0x00c0,
-       0x2995, 0x781b, 0x0058, 0x0078, 0x1bf7, 0x781b, 0x006a, 0x0078,
-       0x1bf7, 0x0c7e, 0x7048, 0x2060, 0x6100, 0xa18c, 0x1000, 0x0040,
-       0x29d9, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000f, 0x0048,
-       0x29ad, 0x0040, 0x29ad, 0x2011, 0x000f, 0x2600, 0xa202, 0x00c8,
-       0x29b2, 0x2230, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028,
-       0x00c0, 0x29c2, 0xa282, 0x0019, 0x00c8, 0x29c8, 0x2011, 0x0019,
-       0x0078, 0x29c8, 0xa282, 0x000c, 0x00c8, 0x29c8, 0x2011, 0x000c,
-       0x2200, 0xa502, 0x00c8, 0x29cd, 0x2228, 0x1078, 0x2be3, 0x852b,
-       0x852b, 0x1078, 0x2c24, 0x0040, 0x29d9, 0x1078, 0x2a33, 0x0078,
-       0x29dd, 0x1078, 0x2bdf, 0x1078, 0x2a57, 0x7858, 0xa085, 0x0004,
-       0x785a, 0x0c7f, 0x781b, 0x0069, 0x0078, 0x1bf7, 0x0c7e, 0x2960,
-       0x6000, 0xa084, 0x1000, 0x00c0, 0x2a01, 0x6010, 0xa084, 0x000f,
-       0x00c0, 0x29fb, 0xa18c, 0x0002, 0x00c0, 0x29fb, 0xa18c, 0xfff5,
-       0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078,
-       0x2a23, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0,
-       0x2a11, 0xa282, 0x0019, 0x00c8, 0x2a17, 0x2011, 0x0019, 0x0078,
-       0x2a17, 0xa282, 0x000c, 0x00c8, 0x2a17, 0x2011, 0x000c, 0x6308,
-       0x831f, 0xa39c, 0x00ff, 0xa382, 0x000f, 0x0048, 0x2a23, 0x0040,
-       0x2a23, 0x2019, 0x000f, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
-       0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x681c, 0xa085, 0x0100,
-       0x681e, 0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008, 0xa084,
-       0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4,
-       0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016, 0x788a,
-       0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605,
-       0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e,
-       0x7048, 0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6,
-       0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c, 0xa282,
-       0x0002, 0x00c0, 0x2b6a, 0x7aa8, 0x691c, 0xa18d, 0x0080, 0x691e,
-       0xa184, 0x0200, 0x0040, 0x2aac, 0xa18c, 0xfdff, 0x691e, 0xa294,
-       0x00ff, 0xa282, 0x0002, 0x00c8, 0x2b6a, 0x1078, 0x2af3, 0x1078,
-       0x2a57, 0xa980, 0x0001, 0x200c, 0x1078, 0x2c9d, 0x1078, 0x29e6,
-       0x88ff, 0x0040, 0x2a9f, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58,
-       0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2a9b, 0x781b,
-       0x0055, 0x0078, 0x1bf7, 0x781b, 0x0069, 0x0078, 0x1bf7, 0x7e58,
-       0xa684, 0x0400, 0x00c0, 0x2aa8, 0x781b, 0x0058, 0x0078, 0x1bf7,
-       0x781b, 0x006a, 0x0078, 0x1bf7, 0xa282, 0x0002, 0x00c8, 0x2ab4,
-       0xa284, 0x0001, 0x0040, 0x2abe, 0x7148, 0xa188, 0x0000, 0x210c,
-       0xa18c, 0x2000, 0x00c0, 0x2abe, 0x2011, 0x0000, 0x1078, 0x2bd1,
-       0x1078, 0x2af3, 0x1078, 0x2a57, 0x7858, 0xa085, 0x0004, 0x785a,
-       0x781b, 0x0069, 0x0078, 0x1bf7, 0x0c7e, 0x027e, 0x2960, 0x6000,
-       0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x2ae3, 0x6014, 0xa084,
-       0x0040, 0x00c0, 0x2ae1, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078,
-       0x2af0, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
-       0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x681c, 0xa085, 0x0200, 0x681e,
-       0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff, 0x0040,
-       0x2afb, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4,
-       0xa084, 0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084,
-       0xffef, 0x6006, 0x0c7f, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003,
-       0x0040, 0x2b15, 0x007f, 0x0078, 0x2b18, 0x007f, 0x0078, 0x2b66,
-       0xa684, 0x0020, 0x0040, 0x2b66, 0x7888, 0xa084, 0x0040, 0x0040,
-       0x2b66, 0x78a8, 0x8001, 0x0040, 0x2b25, 0x7bb8, 0xa384, 0x003f,
-       0x831b, 0x00c8, 0x2b2c, 0x8000, 0xa005, 0x0040, 0x2b4d, 0x831b,
-       0x00c8, 0x2b35, 0x8001, 0x0040, 0x2b62, 0xa006, 0x1078, 0x3194,
-       0x78b4, 0x1078, 0x31f9, 0x0078, 0x2b66, 0xa684, 0x4000, 0x0040,
-       0x2b4d, 0x78b8, 0x801b, 0x00c8, 0x2b46, 0x8000, 0xa084, 0x003f,
-       0x00c0, 0x2b62, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc, 0x2001,
-       0x0001, 0xa108, 0x00c8, 0x2b56, 0xa291, 0x0000, 0x79d2, 0x79da,
-       0x7ad6, 0x7ade, 0x1078, 0x3194, 0x781b, 0x0067, 0x1078, 0x305e,
-       0x0078, 0x1bf7, 0x781b, 0x0067, 0x0078, 0x1bf7, 0x781b, 0x006a,
-       0x0078, 0x1bf7, 0x1078, 0x2b9d, 0x781b, 0x0069, 0x0078, 0x1bf7,
-       0x1078, 0x2b89, 0x781b, 0x0069, 0x0078, 0x1bf7, 0x6823, 0x0002,
-       0x1078, 0x2b91, 0x691c, 0xa18d, 0x0020, 0x691e, 0x6814, 0xa084,
-       0x8000, 0x0040, 0x2b85, 0x6817, 0x0005, 0x781b, 0x0069, 0x0078,
-       0x1bf7, 0x2001, 0x0005, 0x0078, 0x2b9f, 0x2001, 0x000c, 0x0078,
-       0x2b9f, 0x2001, 0x0006, 0x0078, 0x2b9f, 0x2001, 0x000d, 0x0078,
-       0x2b9f, 0x2001, 0x0009, 0x0078, 0x2b9f, 0x2001, 0x0007, 0x789b,
-       0x007f, 0x78aa, 0xa6b5, 0x0008, 0x7e5a, 0x007c, 0x077e, 0x873f,
-       0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0, 0x3600, 0xa7b8,
-       0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040, 0x2bbf, 0xa184,
-       0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008, 0x6006, 0x8738,
-       0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040, 0x2bcf, 0xa184,
-       0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010, 0x6006, 0x077f,
-       0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
-       0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, 0x007c, 0x2031,
-       0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab,
-       0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab,
-       0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003,
-       0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0, 0x2001, 0x3546,
-       0x2004, 0xa082, 0x0028, 0x0040, 0x2c0d, 0x2021, 0x2c84, 0x2019,
-       0x0014, 0x20a9, 0x000c, 0x0078, 0x2c13, 0x2021, 0x2c90, 0x2019,
-       0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404, 0xa084, 0xfff0,
-       0xa106, 0x0040, 0x2c22, 0x8420, 0x2300, 0xa210, 0x0070, 0x2c22,
-       0x0078, 0x2c15, 0x157f, 0x007c, 0x157e, 0x2011, 0x3546, 0x2214,
-       0xa282, 0x0032, 0x0048, 0x2c38, 0x0040, 0x2c3c, 0x2021, 0x2c76,
-       0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x0078, 0x2c4c,
-       0xa282, 0x0028, 0x0040, 0x2c44, 0x2021, 0x2c84, 0x2019, 0x0014,
-       0x20a9, 0x000c, 0x0078, 0x2c4a, 0x2021, 0x2c90, 0x2019, 0x0019,
-       0x20a9, 0x000d, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x2c5c,
-       0x0048, 0x2c5c, 0x8420, 0x2300, 0xa210, 0x0070, 0x2c59, 0x0078,
-       0x2c4c, 0x157f, 0xa006, 0x007c, 0x157f, 0xa582, 0x0064, 0x00c8,
-       0x2c65, 0x7808, 0xa085, 0x0070, 0x780a, 0x78ec, 0xa084, 0x0300,
-       0x0040, 0x2c73, 0x2404, 0xa09e, 0x1201, 0x00c0, 0x2c73, 0x2001,
-       0x2101, 0x0078, 0x2c74, 0x2404, 0xa005, 0x007c, 0x1201, 0x3002,
-       0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806,
-       0x7a06, 0x0a07, 0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202,
-       0x7202, 0x6605, 0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05,
-       0x2202, 0x3202, 0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604,
-       0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046,
-       0x007c, 0xa784, 0x0f00, 0x800c, 0xa784, 0x0007, 0x8003, 0x8003,
-       0x8003, 0x8003, 0xa105, 0xa0e0, 0x3680, 0x007c, 0x79d8, 0x7adc,
-       0x78d0, 0x801b, 0x00c8, 0x2cb5, 0x8000, 0xa084, 0x003f, 0xa108,
-       0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3540,
-       0x2091, 0x8000, 0x2104, 0x0079, 0x2cc5, 0x2cf7, 0x2ccf, 0x2ccf,
-       0x2ccf, 0x2ccf, 0x2ccf, 0x2ccd, 0x2ccd, 0x1078, 0x1ba5, 0x784b,
-       0x0004, 0x7848, 0xa084, 0x0004, 0x00c0, 0x2cd1, 0x784b, 0x0008,
-       0x7848, 0xa084, 0x0008, 0x00c0, 0x2cd8, 0x68b0, 0xa085, 0x4000,
-       0x68b2, 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080,
-       0x00c0, 0x2cf7, 0x0018, 0x2cf7, 0x6818, 0xa084, 0x0020, 0x00c0,
-       0x2cf5, 0x781b, 0x00dd, 0x0078, 0x2cf7, 0x781b, 0x00e4, 0x2091,
-       0x8001, 0x0f7f, 0x007c, 0x0c7e, 0x6810, 0x8007, 0xa084, 0x000f,
-       0x8003, 0x8003, 0x8003, 0xa0e0, 0x3600, 0x6004, 0xa084, 0x000a,
-       0x00c0, 0x2d2e, 0x6108, 0xa194, 0xff00, 0x0040, 0x2d2e, 0xa18c,
-       0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x2d1d, 0x2001, 0x0032,
-       0xa106, 0x0040, 0x2d21, 0x0078, 0x2d25, 0x2009, 0x0020, 0x0078,
-       0x2d27, 0x2009, 0x003f, 0x0078, 0x2d27, 0x2011, 0x0000, 0x2100,
-       0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c,
-       0x781b, 0x006a, 0x0078, 0x1bf7, 0x781b, 0x0069, 0x0078, 0x1bf7,
-       0x781b, 0x0058, 0x0078, 0x1bf7, 0x781b, 0x0055, 0x0078, 0x1bf7,
-       0x781b, 0x00dd, 0x0078, 0x1bf7, 0x781b, 0x00dc, 0x0078, 0x1bf7,
-       0x781b, 0x00e4, 0x0078, 0x1bf7, 0x781b, 0x00e3, 0x0078, 0x1bf7,
-       0x781b, 0x009e, 0x0078, 0x1bf7, 0x781b, 0x009d, 0x0078, 0x1bf7,
-       0x70a3, 0x0001, 0x781b, 0x0046, 0x0078, 0x1bf7, 0x007e, 0x7830,
-       0xa084, 0x00c0, 0x00c0, 0x2d75, 0x7808, 0xa084, 0xfffd, 0x780a,
-       0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
-       0x2d75, 0x7808, 0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0x7808,
-       0xa085, 0x0002, 0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0,
-       0x2d7c, 0x0098, 0x2d85, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd,
-       0x780a, 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021,
-       0x0040, 0x2d94, 0x0098, 0x2d92, 0x78ac, 0x007e, 0x7808, 0xa085,
-       0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0070, 0x0040, 0x2da8,
-       0x0c7e, 0x2d60, 0x2f68, 0x1078, 0x1b6b, 0x2d78, 0x2c68, 0x0c7f,
-       0x6817, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681a, 0x682f, 0x0000,
-       0x682b, 0x0000, 0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x2015,
-       0xa084, 0x0020, 0x0040, 0x2015, 0x78ec, 0xa084, 0x0003, 0x0040,
-       0x2015, 0x0018, 0x2015, 0x0078, 0x2b70, 0x0c7e, 0x6810, 0x8007,
-       0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3600, 0x2060,
-       0x2048, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x0c7f, 0x007c,
-       0x0020, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
-       0x0000, 0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9847, 0x0014,
-       0x0014, 0x98f5, 0x98e7, 0x0014, 0x0014, 0x0080, 0x00bf, 0x0100,
-       0x0402, 0x2008, 0xf880, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014,
-       0xa200, 0x8838, 0x817e, 0x842a, 0x84a0, 0x3806, 0x8839, 0x28c2,
-       0x9cc3, 0xa805, 0x0864, 0xa83b, 0x3008, 0x28c1, 0x9cc3, 0xa201,
-       0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a,
-       0xa808, 0x28e2, 0x9ca0, 0xa8f3, 0x0864, 0xa829, 0x300c, 0xa801,
-       0x3008, 0x28e1, 0x9ca0, 0x280d, 0xa204, 0x64c0, 0x67a0, 0x6fc0,
-       0x1814, 0x883b, 0x7023, 0x8576, 0x8677, 0xa80f, 0x786e, 0x883e,
-       0xa80c, 0x282b, 0xa205, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b,
-       0x7023, 0x8576, 0x8677, 0xa801, 0x883e, 0x2069, 0x28c1, 0x9cc3,
-       0x2044, 0x2103, 0x20a2, 0x2081, 0xa8dc, 0xa207, 0x0014, 0xa203,
-       0x8000, 0x84a8, 0x85a4, 0x1872, 0x849a, 0x883c, 0x1fe2, 0xf601,
-       0xa208, 0x856e, 0x866f, 0x0704, 0x3008, 0x9ca0, 0x0014, 0xa202,
-       0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf848, 0x8174, 0x86eb,
-       0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6, 0xa8f1, 0xf861, 0xa8e8,
-       0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2,
-       0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0,
-       0x1fe6, 0x0014, 0xa206, 0x6865, 0x817f, 0x842a, 0x1dc1, 0x8823,
-       0x0016, 0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a,
-       0xf021, 0x3008, 0x84a8, 0x1dc6, 0x20d7, 0x8822, 0x0016, 0x8000,
-       0x2848, 0x1011, 0xa8fc, 0x3008, 0x8000, 0xa000, 0x2802, 0x1011,
-       0xa8fd, 0xa887, 0x3008, 0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017,
-       0x300c, 0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0x26e0, 0x873a,
-       0xfaa2, 0x19f2, 0x1fe2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x817e,
-       0x842a, 0x84a0, 0x3806, 0x0210, 0x9ccd, 0x0704, 0x0000, 0x127e,
-       0x2091, 0x2200, 0x2049, 0x2ec7, 0x7000, 0x7204, 0xa205, 0x720c,
-       0xa215, 0x7008, 0xa084, 0xfffd, 0xa205, 0x0040, 0x2ed9, 0x0078,
-       0x2ede, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084,
-       0x0001, 0x00c0, 0x2f0c, 0x7108, 0x8104, 0x00c8, 0x2eeb, 0x1078,
-       0x2fa8, 0x0078, 0x2ee3, 0x700c, 0xa08c, 0x007f, 0x0040, 0x2f0c,
-       0x7004, 0x8004, 0x00c8, 0x2f03, 0x7014, 0xa005, 0x00c0, 0x2eff,
-       0x7010, 0xa005, 0x0040, 0x2f03, 0xa102, 0x00c8, 0x2ee3, 0x7007,
-       0x0010, 0x0078, 0x2f0c, 0x8aff, 0x0040, 0x2f0c, 0x1078, 0x316b,
-       0x00c0, 0x2f06, 0x0040, 0x2ee3, 0x1078, 0x2f56, 0x7003, 0x0000,
-       0x127f, 0x2000, 0x007c, 0x6424, 0x84ff, 0x0040, 0x2f30, 0x2c70,
-       0x2039, 0x2f35, 0x2704, 0xae68, 0x680c, 0xa630, 0x6808, 0xa529,
-       0x8421, 0x0040, 0x2f30, 0x8738, 0x2704, 0xa005, 0x00c0, 0x2f1b,
-       0x7098, 0xa075, 0x0040, 0x2f30, 0x2039, 0x2f32, 0x0078, 0x2f1a,
-       0x007c, 0x0000, 0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018,
-       0x001c, 0x0000, 0x127e, 0x2091, 0x2200, 0x2079, 0x3500, 0x2071,
-       0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071,
-       0x0020, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049,
-       0x0000, 0x78b3, 0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x2f56,
-       0x7004, 0x8004, 0x00c8, 0x2f82, 0x7007, 0x0012, 0x7108, 0x7008,
-       0xa106, 0x00c0, 0x2f5e, 0xa184, 0x0030, 0x0040, 0x2f6b, 0xa086,
-       0x0030, 0x00c0, 0x2f5e, 0x7000, 0xa084, 0x0001, 0x00c0, 0x2f82,
-       0x7008, 0xa084, 0x000c, 0x00c0, 0x2f80, 0x710c, 0xa184, 0x0300,
-       0x00c0, 0x2f80, 0xa184, 0x007f, 0x00c0, 0x2f56, 0x0078, 0x2f82,
-       0x6817, 0x0003, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084,
-       0x0008, 0x00c0, 0x2f86, 0x7007, 0x0012, 0x7108, 0x8104, 0x0048,
-       0x2f8b, 0x78b3, 0x0000, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c,
-       0x107e, 0x007e, 0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078,
-       0x2fa8, 0x157f, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c,
-       0x7204, 0x2118, 0x7108, 0x700c, 0xa084, 0x0300, 0x00c0, 0x2fea,
-       0xa184, 0x000c, 0x00c0, 0x2fea, 0x8213, 0x8213, 0x8213, 0x8213,
-       0xa284, 0x0100, 0xa10d, 0x810b, 0x810b, 0x810f, 0xa184, 0x0007,
-       0x0079, 0x2fc2, 0x2fcc, 0x2fdc, 0x2fea, 0x2fdc, 0x2ffe, 0x2ffe,
-       0x2fea, 0x2ffc, 0x1078, 0x1ba5, 0x7007, 0x0002, 0x8aff, 0x00c0,
-       0x2fd5, 0x2049, 0x0000, 0x0078, 0x2fd9, 0x1078, 0x316b, 0x00c0,
-       0x2fd5, 0x78b3, 0x0000, 0x007c, 0x7007, 0x0002, 0x8aff, 0x00c0,
-       0x2fe3, 0x0078, 0x2fe7, 0x1078, 0x316b, 0x00c0, 0x2fe3, 0x78b3,
-       0x0000, 0x007c, 0x7007, 0x0002, 0x1078, 0x2f56, 0x1078, 0x2cbb,
-       0x6814, 0xa084, 0x8000, 0x0040, 0x2ff7, 0x6817, 0x0002, 0x007c,
-       0x1078, 0x1ba5, 0x1078, 0x1ba5, 0x1078, 0x3050, 0x7210, 0x7114,
-       0x700c, 0xa09c, 0x007f, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000,
-       0x78b0, 0xa005, 0x0040, 0x3010, 0x78b3, 0x0000, 0x0078, 0x3033,
-       0x1078, 0x3050, 0x2704, 0x2c58, 0xac60, 0x630c, 0x2200, 0xa322,
-       0x6308, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x3029, 0x00c8,
-       0x3029, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078,
-       0x3010, 0x2b60, 0x8a07, 0xa7ba, 0x2f32, 0xa73d, 0x2c00, 0x6882,
-       0x6f86, 0x6c8e, 0x6b8a, 0x7007, 0x0012, 0x1078, 0x2f56, 0x007c,
-       0x8738, 0x2704, 0xa005, 0x00c0, 0x3044, 0x6098, 0xa005, 0x0040,
-       0x304d, 0x2060, 0x2039, 0x2f32, 0x8a51, 0x0040, 0x304c, 0x7008,
-       0xa084, 0x00c0, 0xa086, 0x00c0, 0x007c, 0x2051, 0x0000, 0x007c,
-       0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x305d, 0x2039, 0x2f38,
-       0x6000, 0xa064, 0x00c0, 0x305d, 0x2d60, 0x007c, 0x127e, 0x0d7e,
-       0x2091, 0x2200, 0x0d7f, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c,
-       0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x2f32, 0x7e08,
-       0xa6b5, 0x000c, 0x6818, 0xa084, 0x0040, 0x0040, 0x3079, 0xa6b5,
-       0x0001, 0x0f7e, 0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, 0x0040,
-       0x0040, 0x3088, 0xa684, 0x0001, 0x00c0, 0x3088, 0xa6b5, 0x0001,
-       0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x308a, 0x7000,
-       0xa005, 0x0040, 0x3095, 0x1078, 0x1ba5, 0x2400, 0xa305, 0x00c0,
-       0x309b, 0x0078, 0x30d8, 0x2c58, 0x2704, 0xac60, 0x6004, 0xa400,
-       0x007e, 0x701a, 0x6000, 0xa301, 0x701e, 0x2009, 0x04fd, 0x2104,
-       0xa086, 0x04fd, 0x007f, 0x00c0, 0x30c8, 0xa084, 0x0001, 0x0040,
-       0x30c8, 0xa684, 0x0001, 0x00c0, 0x30c8, 0x7013, 0x0001, 0x7017,
-       0x0000, 0x7602, 0x7007, 0x0001, 0x78b3, 0x0001, 0xa4a0, 0x0001,
-       0xa399, 0x0000, 0x6004, 0xa400, 0x701a, 0x6000, 0xa301, 0x701e,
-       0x620c, 0x2400, 0xa202, 0x7012, 0x6208, 0x2300, 0xa203, 0x7016,
-       0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, 0x3038, 0x0078, 0x30da,
-       0x1078, 0x316b, 0x00c0, 0x30d8, 0x127f, 0x2000, 0x007c, 0x127e,
-       0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084,
-       0x0004, 0x00c0, 0x30e6, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c,
-       0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x30f0, 0x7007,
-       0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x30f9, 0x7000, 0xa005,
-       0x0040, 0x3104, 0x1078, 0x1ba5, 0x7e08, 0xa6b5, 0x000c, 0x6818,
-       0xa084, 0x0040, 0x0040, 0x310e, 0xa6b5, 0x0001, 0x6824, 0xa005,
-       0x0040, 0x311a, 0x2050, 0x2039, 0x2f35, 0x2d60, 0x1078, 0x316b,
-       0x00c0, 0x3116, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
-       0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5,
-       0x000c, 0x6818, 0xa084, 0x0040, 0x0040, 0x3130, 0xa6b5, 0x0001,
-       0x2049, 0x311d, 0x6824, 0xa055, 0x0040, 0x3168, 0x2d70, 0x2e60,
-       0x2039, 0x2f35, 0x2704, 0xae68, 0x680c, 0xa422, 0x6808, 0xa31b,
-       0x0048, 0x3155, 0x8a51, 0x00c0, 0x3147, 0x1078, 0x1ba5, 0x8738,
-       0x2704, 0xa005, 0x00c0, 0x313b, 0x7098, 0xa075, 0x2060, 0x0040,
-       0x3168, 0x2039, 0x2f32, 0x0078, 0x313a, 0x8422, 0x8420, 0x831a,
-       0xa399, 0x0000, 0x690c, 0x2400, 0xa122, 0x6908, 0x2300, 0xa11b,
-       0x00c8, 0x3164, 0x1078, 0x1ba5, 0x2071, 0x0020, 0x0078, 0x3088,
-       0x127f, 0x2000, 0x007c, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0,
-       0x0040, 0x3193, 0x2704, 0xac08, 0x2104, 0x701e, 0x8108, 0x2104,
-       0x701a, 0x8108, 0x2104, 0x7016, 0x8108, 0x2104, 0x7012, 0x0f7e,
-       0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, 0x0040, 0x0040, 0x318e,
-       0xa684, 0x0001, 0x00c0, 0x318e, 0xa6b5, 0x0001, 0x7602, 0x7007,
-       0x0001, 0x1078, 0x3038, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091,
-       0x2200, 0x2049, 0x3194, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x00c0,
-       0x00c0, 0x31aa, 0x6824, 0xa005, 0x0040, 0x31ba, 0x0078, 0x2ede,
-       0x0078, 0x31ba, 0x7108, 0x8104, 0x00c8, 0x31b2, 0x1078, 0x2fa8,
-       0x0078, 0x319d, 0x7007, 0x0010, 0x7108, 0x8104, 0x00c8, 0x31b4,
-       0x1078, 0x2fa8, 0x7008, 0xa086, 0x0002, 0x00c0, 0x319d, 0x7000,
-       0xa005, 0x00c0, 0x319d, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f,
-       0x2000, 0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0d7e, 0x2091,
-       0x2200, 0x0d7f, 0x2049, 0x31ca, 0xad80, 0x0010, 0x20a0, 0x2099,
-       0x0031, 0x700c, 0xa084, 0x007f, 0x6826, 0x7007, 0x0008, 0x7007,
-       0x0002, 0x7003, 0x0001, 0x0040, 0x31e8, 0x8000, 0x80ac, 0x53a5,
-       0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x31ea, 0x2049,
-       0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000,
-       0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049,
-       0x31f9, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c, 0x8057, 0xaad4,
-       0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x2f32, 0x7e08, 0xa6b5, 0x0004,
-       0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x3212, 0x2c58,
-       0x2704, 0xac60, 0x6004, 0xa400, 0x701a, 0x6000, 0xa301, 0x701e,
-       0x7013, 0x0001, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x007f,
-       0x8007, 0x2009, 0x0031, 0x200a, 0x00a0, 0x322c, 0x7108, 0x7007,
-       0x0002, 0x810c, 0x00c8, 0x322c, 0x810c, 0x0048, 0x3239, 0x0078,
-       0x2fea, 0xa4a0, 0x0001, 0xa399, 0x0000, 0x6b8a, 0x6c8e, 0x7007,
-       0x0004, 0x2049, 0x0000, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c,
-       0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x3251,
-       0xa200, 0x00f0, 0x324c, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9,
-       0x0010, 0xa005, 0x0040, 0x3277, 0xa11a, 0x00c8, 0x3277, 0x8213,
-       0x818d, 0x0048, 0x326a, 0xa11a, 0x00c8, 0x326b, 0x00f0, 0x325f,
-       0x0078, 0x326f, 0xa11a, 0x2308, 0x8210, 0x00f0, 0x325f, 0x007e,
-       0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e,
-       0x3200, 0xa085, 0x0800, 0x0078, 0x3273, 0x00e0, 0x32bf, 0x2091,
-       0x6000, 0x7820, 0x8001, 0x7822, 0x00c0, 0x32b9, 0x7824, 0x7822,
-       0x2091, 0x8000, 0x2069, 0x3540, 0x6800, 0xa084, 0x0007, 0x0040,
-       0x32a1, 0xa086, 0x0002, 0x0040, 0x32a1, 0x6830, 0xa00d, 0x0040,
-       0x32a1, 0x2104, 0xa005, 0x0040, 0x32a1, 0x8001, 0x200a, 0x0040,
-       0x336f, 0x2061, 0x3680, 0x20a9, 0x0080, 0x6034, 0xa005, 0x0040,
-       0x32b3, 0x8001, 0x6036, 0x00c0, 0x32b3, 0x6010, 0xa005, 0x0040,
-       0x32b3, 0x1078, 0x1a19, 0xace0, 0x0010, 0x0070, 0x32b9, 0x0078,
-       0x32a5, 0x1078, 0x32d4, 0x1078, 0x32c2, 0x1078, 0x32f9, 0x2091,
-       0x8001, 0x007c, 0x783c, 0x8001, 0x783e, 0x00c0, 0x32d3, 0x7840,
-       0x783e, 0x7848, 0xa005, 0x0040, 0x32d3, 0x8001, 0x784a, 0x00c0,
-       0x32d3, 0x1078, 0x1a19, 0x007c, 0x7834, 0x8001, 0x7836, 0x00c0,
-       0x32f8, 0x7838, 0x7836, 0x2091, 0x8000, 0x7844, 0xa005, 0x00c0,
-       0x32e3, 0x2001, 0x0101, 0x8001, 0x7846, 0xa080, 0x3e80, 0x2040,
-       0x2004, 0xa065, 0x0040, 0x32f8, 0x6020, 0xa005, 0x0040, 0x32f4,
-       0x8001, 0x6022, 0x0040, 0x3328, 0x6000, 0x2c40, 0x0078, 0x32e9,
-       0x007c, 0x7828, 0x8001, 0x782a, 0x00c0, 0x3327, 0x782c, 0x782a,
-       0x7830, 0xa005, 0x00c0, 0x3306, 0x2001, 0x0080, 0x8001, 0x7832,
-       0x8003, 0x8003, 0x8003, 0x8003, 0xa090, 0x3680, 0xa298, 0x0002,
-       0x2304, 0xa084, 0x0008, 0x0040, 0x3327, 0xa290, 0x0009, 0x2204,
-       0xa005, 0x0040, 0x331f, 0x8001, 0x2012, 0x00c0, 0x3327, 0x2304,
-       0xa084, 0xfff7, 0xa085, 0x0080, 0x201a, 0x1078, 0x1a19, 0x007c,
-       0x2069, 0x3540, 0x6800, 0xa005, 0x0040, 0x3332, 0x683c, 0xac06,
-       0x0040, 0x336f, 0x6017, 0x0006, 0x60b0, 0xa084, 0x3f00, 0x601a,
-       0x601c, 0xa084, 0x00ff, 0xa085, 0x0060, 0x601e, 0x6000, 0x2042,
-       0x6710, 0x6fb6, 0x1078, 0x1692, 0x6818, 0xa005, 0x0040, 0x334a,
-       0x8001, 0x681a, 0x6808, 0xa084, 0xffef, 0x680a, 0x6810, 0x8001,
-       0x00d0, 0x3354, 0x1078, 0x1ba5, 0x6812, 0x602f, 0x0000, 0x602b,
-       0x0000, 0x2c68, 0x1078, 0x17dd, 0x2069, 0x3540, 0x2001, 0x0006,
-       0x68a2, 0x7944, 0xa184, 0x0100, 0x00c0, 0x336a, 0x69ba, 0x2001,
-       0x0004, 0x68a2, 0x1078, 0x1a14, 0x2091, 0x8001, 0x007c, 0x2009,
-       0x354f, 0x2164, 0x2069, 0x0100, 0x1078, 0x1b6b, 0x6017, 0x0006,
-       0x6858, 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff, 0xa085,
-       0x0048, 0x601e, 0x602f, 0x0000, 0x602b, 0x0000, 0x6830, 0xa084,
-       0x0040, 0x0040, 0x33ab, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
-       0xa084, 0x0004, 0x0040, 0x3398, 0x0070, 0x3398, 0x0078, 0x338f,
-       0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040,
-       0x33a5, 0x0070, 0x33a5, 0x0078, 0x339c, 0x20a9, 0x00fa, 0x0070,
-       0x33ab, 0x0078, 0x33a7, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b,
-       0x0046, 0x2009, 0x3568, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091,
-       0x8001, 0x007c, 0x2079, 0x3500, 0x1078, 0x3403, 0x1078, 0x33cb,
-       0x1078, 0x33e0, 0x1078, 0x33f5, 0x7833, 0x0000, 0x7847, 0x0000,
-       0x784b, 0x0000, 0x007c, 0x2019, 0x000a, 0x2011, 0x3546, 0x2204,
-       0xa086, 0x0032, 0x0040, 0x33dd, 0x2019, 0x000c, 0x2204, 0xa086,
-       0x003c, 0x0040, 0x33dd, 0x2019, 0x0008, 0x7b2a, 0x7b2e, 0x007c,
-       0x2019, 0x0030, 0x2011, 0x3546, 0x2204, 0xa086, 0x0032, 0x0040,
-       0x33f2, 0x2019, 0x0039, 0x2204, 0xa086, 0x003c, 0x0040, 0x33f2,
-       0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x000d, 0x2011,
-       0x3546, 0x2204, 0xa086, 0x003c, 0x0040, 0x3400, 0x2019, 0x000a,
-       0x7b3e, 0x7b42, 0x007c, 0x2019, 0x2faf, 0x2011, 0x3546, 0x2204,
-       0xa086, 0x0032, 0x0040, 0x3415, 0x2019, 0x3971, 0x2204, 0xa086,
-       0x003c, 0x0040, 0x3415, 0x2019, 0x2626, 0x7b22, 0x7b26, 0x007c,
-       0x92a7
-};
-unsigned short __devinitdata sbus_risc_code_length01 = 0x2419;
index a2ef03243a2c3d53d5fc719be830a4e42eebdea1..166417a6afbab0ceb2a30dec46a1cfddeb02a5a1 100644 (file)
@@ -169,12 +169,10 @@ scsi_pool_alloc_command(struct scsi_host_cmd_pool *pool, gfp_t gfp_mask)
 {
        struct scsi_cmnd *cmd;
 
-       cmd = kmem_cache_alloc(pool->cmd_slab, gfp_mask | pool->gfp_mask);
+       cmd = kmem_cache_zalloc(pool->cmd_slab, gfp_mask | pool->gfp_mask);
        if (!cmd)
                return NULL;
 
-       memset(cmd, 0, sizeof(*cmd));
-
        cmd->sense_buffer = kmem_cache_alloc(pool->sense_slab,
                                             gfp_mask | pool->gfp_mask);
        if (!cmd->sense_buffer) {
index 4b13e36d3aa0b000b3c2bd5aa6d92a0c0b1554be..d1cb64ad1a3f373092d954804fa41cca636ccfcd 100644 (file)
@@ -791,7 +791,22 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
                                      "%d bytes done.\n",
                                      req->nr_sectors, good_bytes));
 
-       /* A number of bytes were successfully read.  If there
+       /*
+        * Recovered errors need reporting, but they're always treated
+        * as success, so fiddle the result code here.  For BLOCK_PC
+        * we already took a copy of the original into rq->errors which
+        * is what gets returned to the user
+        */
+       if (sense_valid && sshdr.sense_key == RECOVERED_ERROR) {
+               if (!(req->cmd_flags & REQ_QUIET))
+                       scsi_print_sense("", cmd);
+               result = 0;
+               /* BLOCK_PC may have set error */
+               error = 0;
+       }
+
+       /*
+        * A number of bytes were successfully read.  If there
         * are leftovers and there is some kind of error
         * (result != 0), retry the rest.
         */
index aeab5d9dff27bd316a82d45eb55bf1010d510158..3fcb64b91c43d799bca344c9029566d41e0c121b 100644 (file)
@@ -1051,12 +1051,6 @@ static int sd_done(struct scsi_cmnd *SCpnt)
                good_bytes = sd_completed_bytes(SCpnt);
                break;
        case RECOVERED_ERROR:
-               /* Inform the user, but make sure that it's not treated
-                * as a hard error.
-                */
-               scsi_print_sense("sd", SCpnt);
-               SCpnt->result = 0;
-               memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
                good_bytes = scsi_bufflen(SCpnt);
                break;
        case NO_SENSE:
index c9146d751cbf17af70d8f509d6a29ba13b476052..4f618f48735627c089b4d119ed85e7df03342b79 100644 (file)
@@ -264,6 +264,7 @@ struct ses_host_edev {
        struct enclosure_device *edev;
 };
 
+#if 0
 int ses_match_host(struct enclosure_device *edev, void *data)
 {
        struct ses_host_edev *sed = data;
@@ -280,6 +281,7 @@ int ses_match_host(struct enclosure_device *edev, void *data)
        sed->edev = edev;
        return 1;
 }
+#endif  /*  0  */
 
 static void ses_process_descriptor(struct enclosure_component *ecomp,
                                   unsigned char *desc)
index ffc87851f2e86e866616da6a6c0e39ca48dd1910..82312df9b0bfb9fba684eb9f4e7922a19b645b5d 100644 (file)
@@ -1312,8 +1312,10 @@ static void sg_rq_end_io(struct request *rq, int uptodate)
                wake_up_interruptible(&sfp->read_wait);
                kill_fasync(&sfp->async_qp, SIGPOLL, POLL_IN);
                kref_put(&sfp->f_ref, sg_remove_sfp);
-       } else
-               execute_in_process_context(sg_rq_end_io_usercontext, &srp->ew);
+       } else {
+               INIT_WORK(&srp->ew.work, sg_rq_end_io_usercontext);
+               schedule_work(&srp->ew.work);
+       }
 }
 
 static struct file_operations sg_fops = {
@@ -1656,10 +1658,30 @@ static int sg_start_req(Sg_request *srp, unsigned char *cmd)
                md->null_mapped = hp->dxferp ? 0 : 1;
        }
 
-       if (iov_count)
-               res = blk_rq_map_user_iov(q, rq, md, hp->dxferp, iov_count,
-                                         hp->dxfer_len, GFP_ATOMIC);
-       else
+       if (iov_count) {
+               int len, size = sizeof(struct sg_iovec) * iov_count;
+               struct iovec *iov;
+
+               iov = kmalloc(size, GFP_ATOMIC);
+               if (!iov)
+                       return -ENOMEM;
+
+               if (copy_from_user(iov, hp->dxferp, size)) {
+                       kfree(iov);
+                       return -EFAULT;
+               }
+
+               len = iov_length(iov, iov_count);
+               if (hp->dxfer_len < len) {
+                       iov_count = iov_shorten(iov, iov_count, hp->dxfer_len);
+                       len = hp->dxfer_len;
+               }
+
+               res = blk_rq_map_user_iov(q, rq, md, (struct sg_iovec *)iov,
+                                         iov_count,
+                                         len, GFP_ATOMIC);
+               kfree(iov);
+       } else
                res = blk_rq_map_user(q, rq, md, hp->dxferp,
                                      hp->dxfer_len, GFP_ATOMIC);
 
@@ -2079,7 +2101,8 @@ static void sg_remove_sfp(struct kref *kref)
        write_unlock_irqrestore(&sg_index_lock, iflags);
        wake_up_interruptible(&sdp->o_excl_wait);
 
-       execute_in_process_context(sg_remove_sfp_usercontext, &sfp->ew);
+       INIT_WORK(&sfp->ew.work, sg_remove_sfp_usercontext);
+       schedule_work(&sfp->ew.work);
 }
 
 static int
index 77f0b2cdaa943c3784469c049eb5a24cafc894c7..37b3359e863e427e4a088366ea382a04273a6a69 100644 (file)
@@ -83,7 +83,7 @@ static int __init snirm710_probe(struct platform_device *dev)
        }
 
        hostdata->dev = &dev->dev;
-       dma_set_mask(&dev->dev, DMA_32BIT_MASK);
+       dma_set_mask(&dev->dev, DMA_BIT_MASK(32));
        hostdata->base = ioremap_nocache(base, 0x100);
        hostdata->differential = 0;
 
index e7fa3caead79051f423b0790168769b01ecd4a95..0e1a0f2d2ad55543f39f0f9f56b6bea2645e5990 100644 (file)
@@ -309,15 +309,6 @@ static int sr_done(struct scsi_cmnd *SCpnt)
                        break;
 
                case RECOVERED_ERROR:
-
-                       /*
-                        * An error occured, but it recovered.  Inform the
-                        * user, but make sure that it's not treated as a
-                        * hard error.
-                        */
-                       scsi_print_sense("sr", SCpnt);
-                       SCpnt->result = 0;
-                       SCpnt->sense_buffer[0] = 0x0;
                        good_bytes = this_count;
                        break;
 
index 47b614e8580cc264793e6ec47d61cbad4eaff647..8d2a95c4e5b56af930c46a76d760e53a9c9931a9 100644 (file)
 #include <scsi/scsi_eh.h>
 
 #define DRV_NAME "stex"
-#define ST_DRIVER_VERSION "4.6.0000.1"
-#define ST_VER_MAJOR           4
-#define ST_VER_MINOR           6
-#define ST_OEM                         0
-#define ST_BUILD_VER           1
+#define ST_DRIVER_VERSION "4.6.0000.3"
+#define ST_VER_MAJOR           4
+#define ST_VER_MINOR           6
+#define ST_OEM                 0
+#define ST_BUILD_VER           3
 
 enum {
        /* MU register offset */
@@ -55,6 +55,13 @@ enum {
        OIS     = 0x30, /* MU_OUTBOUND_INTERRUPT_STATUS */
        OIM     = 0x3c, /* MU_OUTBOUND_INTERRUPT_MASK */
 
+       YH2I_INT                                = 0x20,
+       YINT_EN                                 = 0x34,
+       YI2H_INT                                = 0x9c,
+       YI2H_INT_C                              = 0xa0,
+       YH2I_REQ                                = 0xc0,
+       YH2I_REQ_HI                             = 0xc4,
+
        /* MU register value */
        MU_INBOUND_DOORBELL_HANDSHAKE           = 1,
        MU_INBOUND_DOORBELL_REQHEADCHANGED      = 2,
@@ -95,20 +102,14 @@ enum {
        TASK_ATTRIBUTE_ORDERED                  = 0x2,
        TASK_ATTRIBUTE_ACA                      = 0x4,
 
-       /* request count, etc. */
-       MU_MAX_REQUEST                          = 32,
+       SS_STS_NORMAL                           = 0x80000000,
+       SS_STS_DONE                             = 0x40000000,
+       SS_STS_HANDSHAKE                        = 0x20000000,
 
-       /* one message wasted, use MU_MAX_REQUEST+1
-               to handle MU_MAX_REQUEST messages */
-       MU_REQ_COUNT                            = (MU_MAX_REQUEST + 1),
-       MU_STATUS_COUNT                         = (MU_MAX_REQUEST + 1),
+       SS_HEAD_HANDSHAKE                       = 0x80,
 
        STEX_CDB_LENGTH                         = 16,
-       REQ_VARIABLE_LEN                        = 1024,
        STATUS_VAR_LEN                          = 128,
-       ST_CAN_QUEUE                            = MU_MAX_REQUEST,
-       ST_CMD_PER_LUN                          = MU_MAX_REQUEST,
-       ST_MAX_SG                               = 32,
 
        /* sg flags */
        SG_CF_EOT                               = 0x80, /* end of table */
@@ -120,9 +121,9 @@ enum {
 
        st_shasta                               = 0,
        st_vsc                                  = 1,
-       st_vsc1                                 = 2,
-       st_yosemite                             = 3,
-       st_seq                                  = 4,
+       st_yosemite                             = 2,
+       st_seq                                  = 3,
+       st_yel                                  = 4,
 
        PASSTHRU_REQ_TYPE                       = 0x00000001,
        PASSTHRU_REQ_NO_WAKEUP                  = 0x00000100,
@@ -160,26 +161,36 @@ struct st_sgitem {
        u8 ctrl;        /* SG_CF_xxx */
        u8 reserved[3];
        __le32 count;
+       __le64 addr;
+};
+
+struct st_ss_sgitem {
        __le32 addr;
        __le32 addr_hi;
+       __le32 count;
 };
 
 struct st_sgtable {
        __le16 sg_count;
        __le16 max_sg_count;
        __le32 sz_in_byte;
-       struct st_sgitem table[ST_MAX_SG];
+};
+
+struct st_msg_header {
+       __le64 handle;
+       u8 flag;
+       u8 channel;
+       __le16 timeout;
+       u32 reserved;
 };
 
 struct handshake_frame {
-       __le32 rb_phy;          /* request payload queue physical address */
-       __le32 rb_phy_hi;
+       __le64 rb_phy;          /* request payload queue physical address */
        __le16 req_sz;          /* size of each request payload */
        __le16 req_cnt;         /* count of reqs the buffer can hold */
        __le16 status_sz;       /* size of each status payload */
        __le16 status_cnt;      /* count of status the buffer can hold */
-       __le32 hosttime;        /* seconds from Jan 1, 1970 (GMT) */
-       __le32 hosttime_hi;
+       __le64 hosttime;        /* seconds from Jan 1, 1970 (GMT) */
        u8 partner_type;        /* who sends this frame */
        u8 reserved0[7];
        __le32 partner_ver_major;
@@ -188,7 +199,8 @@ struct handshake_frame {
        __le32 partner_ver_build;
        __le32 extra_offset;    /* NEW */
        __le32 extra_size;      /* NEW */
-       u32 reserved1[2];
+       __le32 scratch_size;
+       u32 reserved1;
 };
 
 struct req_msg {
@@ -200,7 +212,7 @@ struct req_msg {
        u8 data_dir;
        u8 payload_sz;          /* payload size in 4-byte, not used */
        u8 cdb[STEX_CDB_LENGTH];
-       u8 variable[REQ_VARIABLE_LEN];
+       u32 variable[0];
 };
 
 struct status_msg {
@@ -256,12 +268,6 @@ struct st_drvver {
        u32 reserved[3];
 };
 
-#define MU_REQ_BUFFER_SIZE     (MU_REQ_COUNT * sizeof(struct req_msg))
-#define MU_STATUS_BUFFER_SIZE  (MU_STATUS_COUNT * sizeof(struct status_msg))
-#define MU_BUFFER_SIZE         (MU_REQ_BUFFER_SIZE + MU_STATUS_BUFFER_SIZE)
-#define STEX_EXTRA_SIZE                sizeof(struct st_frame)
-#define STEX_BUFFER_SIZE       (MU_BUFFER_SIZE + STEX_EXTRA_SIZE)
-
 struct st_ccb {
        struct req_msg *req;
        struct scsi_cmnd *cmd;
@@ -273,6 +279,7 @@ struct st_ccb {
        u32 req_type;
        u8 srb_status;
        u8 scsi_status;
+       u8 reserved[2];
 };
 
 struct st_hba {
@@ -284,6 +291,10 @@ struct st_hba {
        struct Scsi_Host *host;
        struct pci_dev *pdev;
 
+       struct req_msg * (*alloc_rq) (struct st_hba *);
+       int (*map_sg)(struct st_hba *, struct req_msg *, struct st_ccb *);
+       void (*send) (struct st_hba *, struct req_msg *, u16);
+
        u32 req_head;
        u32 req_tail;
        u32 status_head;
@@ -291,16 +302,36 @@ struct st_hba {
 
        struct status_msg *status_buffer;
        void *copy_buffer; /* temp buffer for driver-handled commands */
-       struct st_ccb ccb[MU_MAX_REQUEST];
+       struct st_ccb *ccb;
        struct st_ccb *wait_ccb;
-       wait_queue_head_t waitq;
+       __le32 *scratch;
 
        unsigned int mu_status;
+       unsigned int cardtype;
+       int msi_enabled;
        int out_req_cnt;
+       u32 extra_offset;
+       u16 rq_count;
+       u16 rq_size;
+       u16 sts_count;
+};
 
-       unsigned int cardtype;
+struct st_card_info {
+       struct req_msg * (*alloc_rq) (struct st_hba *);
+       int (*map_sg)(struct st_hba *, struct req_msg *, struct st_ccb *);
+       void (*send) (struct st_hba *, struct req_msg *, u16);
+       unsigned int max_id;
+       unsigned int max_lun;
+       unsigned int max_channel;
+       u16 rq_count;
+       u16 rq_size;
+       u16 sts_count;
 };
 
+static int msi;
+module_param(msi, int, 0);
+MODULE_PARM_DESC(msi, "Enable Message Signaled Interrupts(0=off, 1=on)");
+
 static const char console_inq_page[] =
 {
        0x03,0x00,0x03,0x03,0xFA,0x00,0x00,0x30,
@@ -318,22 +349,20 @@ MODULE_DESCRIPTION("Promise Technology SuperTrak EX Controllers");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(ST_DRIVER_VERSION);
 
-static void stex_gettime(__le32 *time)
+static void stex_gettime(__le64 *time)
 {
        struct timeval tv;
 
        do_gettimeofday(&tv);
-       *time = cpu_to_le32(tv.tv_sec & 0xffffffff);
-       *(time + 1) = cpu_to_le32((tv.tv_sec >> 16) >> 16);
+       *time = cpu_to_le64(tv.tv_sec);
 }
 
 static struct status_msg *stex_get_status(struct st_hba *hba)
 {
-       struct status_msg *status =
-               hba->status_buffer + hba->status_tail;
+       struct status_msg *status = hba->status_buffer + hba->status_tail;
 
        ++hba->status_tail;
-       hba->status_tail %= MU_STATUS_COUNT;
+       hba->status_tail %= hba->sts_count+1;
 
        return status;
 }
@@ -351,47 +380,83 @@ static void stex_invalid_field(struct scsi_cmnd *cmd,
 
 static struct req_msg *stex_alloc_req(struct st_hba *hba)
 {
-       struct req_msg *req = ((struct req_msg *)hba->dma_mem) +
-               hba->req_head;
+       struct req_msg *req = hba->dma_mem + hba->req_head * hba->rq_size;
 
        ++hba->req_head;
-       hba->req_head %= MU_REQ_COUNT;
+       hba->req_head %= hba->rq_count+1;
 
        return req;
 }
 
+static struct req_msg *stex_ss_alloc_req(struct st_hba *hba)
+{
+       return (struct req_msg *)(hba->dma_mem +
+               hba->req_head * hba->rq_size + sizeof(struct st_msg_header));
+}
+
 static int stex_map_sg(struct st_hba *hba,
        struct req_msg *req, struct st_ccb *ccb)
 {
        struct scsi_cmnd *cmd;
        struct scatterlist *sg;
        struct st_sgtable *dst;
+       struct st_sgitem *table;
        int i, nseg;
 
        cmd = ccb->cmd;
-       dst = (struct st_sgtable *)req->variable;
-       dst->max_sg_count = cpu_to_le16(ST_MAX_SG);
-       dst->sz_in_byte = cpu_to_le32(scsi_bufflen(cmd));
+       nseg = scsi_dma_map(cmd);
+       BUG_ON(nseg < 0);
+       if (nseg) {
+               dst = (struct st_sgtable *)req->variable;
+
+               ccb->sg_count = nseg;
+               dst->sg_count = cpu_to_le16((u16)nseg);
+               dst->max_sg_count = cpu_to_le16(hba->host->sg_tablesize);
+               dst->sz_in_byte = cpu_to_le32(scsi_bufflen(cmd));
+
+               table = (struct st_sgitem *)(dst + 1);
+               scsi_for_each_sg(cmd, sg, nseg, i) {
+                       table[i].count = cpu_to_le32((u32)sg_dma_len(sg));
+                       table[i].addr = cpu_to_le64(sg_dma_address(sg));
+                       table[i].ctrl = SG_CF_64B | SG_CF_HOST;
+               }
+               table[--i].ctrl |= SG_CF_EOT;
+       }
+
+       return nseg;
+}
+
+static int stex_ss_map_sg(struct st_hba *hba,
+       struct req_msg *req, struct st_ccb *ccb)
+{
+       struct scsi_cmnd *cmd;
+       struct scatterlist *sg;
+       struct st_sgtable *dst;
+       struct st_ss_sgitem *table;
+       int i, nseg;
 
+       cmd = ccb->cmd;
        nseg = scsi_dma_map(cmd);
-       if (nseg < 0)
-               return -EIO;
+       BUG_ON(nseg < 0);
        if (nseg) {
+               dst = (struct st_sgtable *)req->variable;
+
                ccb->sg_count = nseg;
                dst->sg_count = cpu_to_le16((u16)nseg);
+               dst->max_sg_count = cpu_to_le16(hba->host->sg_tablesize);
+               dst->sz_in_byte = cpu_to_le32(scsi_bufflen(cmd));
 
+               table = (struct st_ss_sgitem *)(dst + 1);
                scsi_for_each_sg(cmd, sg, nseg, i) {
-                       dst->table[i].count = cpu_to_le32((u32)sg_dma_len(sg));
-                       dst->table[i].addr =
+                       table[i].count = cpu_to_le32((u32)sg_dma_len(sg));
+                       table[i].addr =
                                cpu_to_le32(sg_dma_address(sg) & 0xffffffff);
-                       dst->table[i].addr_hi =
+                       table[i].addr_hi =
                                cpu_to_le32((sg_dma_address(sg) >> 16) >> 16);
-                       dst->table[i].ctrl = SG_CF_64B | SG_CF_HOST;
                }
-               dst->table[--i].ctrl |= SG_CF_EOT;
        }
 
-       return 0;
+       return nseg;
 }
 
 static void stex_controller_info(struct st_hba *hba, struct st_ccb *ccb)
@@ -400,7 +465,7 @@ static void stex_controller_info(struct st_hba *hba, struct st_ccb *ccb)
        size_t count = sizeof(struct st_frame);
 
        p = hba->copy_buffer;
-       count = scsi_sg_copy_to_buffer(ccb->cmd, p, count);
+       scsi_sg_copy_to_buffer(ccb->cmd, p, count);
        memset(p->base, 0, sizeof(u32)*6);
        *(unsigned long *)(p->base) = pci_resource_start(hba->pdev, 0);
        p->rom_addr = 0;
@@ -418,15 +483,13 @@ static void stex_controller_info(struct st_hba *hba, struct st_ccb *ccb)
        p->subid =
                hba->pdev->subsystem_vendor << 16 | hba->pdev->subsystem_device;
 
-       count = scsi_sg_copy_from_buffer(ccb->cmd, p, count);
+       scsi_sg_copy_from_buffer(ccb->cmd, p, count);
 }
 
 static void
 stex_send_cmd(struct st_hba *hba, struct req_msg *req, u16 tag)
 {
        req->tag = cpu_to_le16(tag);
-       req->task_attr = TASK_ATTRIBUTE_SIMPLE;
-       req->task_manage = 0; /* not supported yet */
 
        hba->ccb[tag].req = req;
        hba->out_req_cnt++;
@@ -436,13 +499,44 @@ stex_send_cmd(struct st_hba *hba, struct req_msg *req, u16 tag)
        readl(hba->mmio_base + IDBL); /* flush */
 }
 
+static void
+stex_ss_send_cmd(struct st_hba *hba, struct req_msg *req, u16 tag)
+{
+       struct scsi_cmnd *cmd;
+       struct st_msg_header *msg_h;
+       dma_addr_t addr;
+
+       req->tag = cpu_to_le16(tag);
+
+       hba->ccb[tag].req = req;
+       hba->out_req_cnt++;
+
+       cmd = hba->ccb[tag].cmd;
+       msg_h = (struct st_msg_header *)req - 1;
+       if (likely(cmd)) {
+               msg_h->channel = (u8)cmd->device->channel;
+               msg_h->timeout = cpu_to_le16(cmd->request->timeout/HZ);
+       }
+       addr = hba->dma_handle + hba->req_head * hba->rq_size;
+       addr += (hba->ccb[tag].sg_count+4)/11;
+       msg_h->handle = cpu_to_le64(addr);
+
+       ++hba->req_head;
+       hba->req_head %= hba->rq_count+1;
+
+       writel((addr >> 16) >> 16, hba->mmio_base + YH2I_REQ_HI);
+       readl(hba->mmio_base + YH2I_REQ_HI); /* flush */
+       writel(addr, hba->mmio_base + YH2I_REQ);
+       readl(hba->mmio_base + YH2I_REQ); /* flush */
+}
+
 static int
 stex_slave_alloc(struct scsi_device *sdev)
 {
        /* Cheat: usually extracted from Inquiry data */
        sdev->tagged_supported = 1;
 
-       scsi_activate_tcq(sdev, ST_CMD_PER_LUN);
+       scsi_activate_tcq(sdev, sdev->host->can_queue);
 
        return 0;
 }
@@ -469,7 +563,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
 {
        struct st_hba *hba;
        struct Scsi_Host *host;
-       unsigned int id,lun;
+       unsigned int id, lun;
        struct req_msg *req;
        u16 tag;
 
@@ -516,7 +610,8 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
        case INQUIRY:
                if (id != host->max_id - 1)
                        break;
-               if (lun == 0 && (cmd->cmnd[1] & INQUIRY_EVPD) == 0) {
+               if (!lun && !cmd->device->channel &&
+                       (cmd->cmnd[1] & INQUIRY_EVPD) == 0) {
                        scsi_sg_copy_from_buffer(cmd, (void *)console_inq_page,
                                                 sizeof(console_inq_page));
                        cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
@@ -554,7 +649,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
        if (unlikely(tag >= host->can_queue))
                return SCSI_MLQUEUE_HOST_BUSY;
 
-       req = stex_alloc_req(hba);
+       req = hba->alloc_rq(hba);
 
        req->lun = lun;
        req->target = id;
@@ -572,12 +667,13 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
        hba->ccb[tag].cmd = cmd;
        hba->ccb[tag].sense_bufflen = SCSI_SENSE_BUFFERSIZE;
        hba->ccb[tag].sense_buffer = cmd->sense_buffer;
-       hba->ccb[tag].req_type = 0;
 
-       if (cmd->sc_data_direction != DMA_NONE)
-               stex_map_sg(hba, req, &hba->ccb[tag]);
+       if (!hba->map_sg(hba, req, &hba->ccb[tag])) {
+               hba->ccb[tag].sg_count = 0;
+               memset(&req->variable[0], 0, 8);
+       }
 
-       stex_send_cmd(hba, req, tag);
+       hba->send(hba, req, tag);
        return 0;
 }
 
@@ -586,7 +682,7 @@ static void stex_scsi_done(struct st_ccb *ccb)
        struct scsi_cmnd *cmd = ccb->cmd;
        int result;
 
-       if (ccb->srb_status == SRB_STATUS_SUCCESS ||  ccb->srb_status == 0) {
+       if (ccb->srb_status == SRB_STATUS_SUCCESS || ccb->srb_status == 0) {
                result = ccb->scsi_status;
                switch (ccb->scsi_status) {
                case SAM_STAT_GOOD:
@@ -626,8 +722,6 @@ static void stex_scsi_done(struct st_ccb *ccb)
 static void stex_copy_data(struct st_ccb *ccb,
        struct status_msg *resp, unsigned int variable)
 {
-       size_t count = variable;
-
        if (resp->scsi_status != SAM_STAT_GOOD) {
                if (ccb->sense_buffer != NULL)
                        memcpy(ccb->sense_buffer, resp->variable,
@@ -637,17 +731,16 @@ static void stex_copy_data(struct st_ccb *ccb,
 
        if (ccb->cmd == NULL)
                return;
-       count = scsi_sg_copy_from_buffer(ccb->cmd, resp->variable, count);
+       scsi_sg_copy_from_buffer(ccb->cmd, resp->variable, variable);
 }
 
-static void stex_ys_commands(struct st_hba *hba,
+static void stex_check_cmd(struct st_hba *hba,
        struct st_ccb *ccb, struct status_msg *resp)
 {
        if (ccb->cmd->cmnd[0] == MGT_CMD &&
-               resp->scsi_status != SAM_STAT_CHECK_CONDITION) {
+               resp->scsi_status != SAM_STAT_CHECK_CONDITION)
                scsi_set_resid(ccb->cmd, scsi_bufflen(ccb->cmd) -
                        le32_to_cpu(*(__le32 *)&resp->variable[0]));
-       }
 }
 
 static void stex_mu_intr(struct st_hba *hba, u32 doorbell)
@@ -658,12 +751,12 @@ static void stex_mu_intr(struct st_hba *hba, u32 doorbell)
        unsigned int size;
        u16 tag;
 
-       if (!(doorbell & MU_OUTBOUND_DOORBELL_STATUSHEADCHANGED))
+       if (unlikely(!(doorbell & MU_OUTBOUND_DOORBELL_STATUSHEADCHANGED)))
                return;
 
        /* status payloads */
        hba->status_head = readl(base + OMR1);
-       if (unlikely(hba->status_head >= MU_STATUS_COUNT)) {
+       if (unlikely(hba->status_head > hba->sts_count)) {
                printk(KERN_WARNING DRV_NAME "(%s): invalid status head\n",
                        pci_name(hba->pdev));
                return;
@@ -693,13 +786,13 @@ static void stex_mu_intr(struct st_hba *hba, u32 doorbell)
                        continue;
                }
 
+               hba->out_req_cnt--;
                ccb = &hba->ccb[tag];
-               if (hba->wait_ccb == ccb)
+               if (unlikely(hba->wait_ccb == ccb))
                        hba->wait_ccb = NULL;
                if (unlikely(ccb->req == NULL)) {
                        printk(KERN_WARNING DRV_NAME
                                "(%s): lagging req\n", pci_name(hba->pdev));
-                       hba->out_req_cnt--;
                        continue;
                }
 
@@ -720,7 +813,7 @@ static void stex_mu_intr(struct st_hba *hba, u32 doorbell)
 
                if (likely(ccb->cmd != NULL)) {
                        if (hba->cardtype == st_yosemite)
-                               stex_ys_commands(hba, ccb, resp);
+                               stex_check_cmd(hba, ccb, resp);
 
                        if (unlikely(ccb->cmd->cmnd[0] == PASSTHRU_CMD &&
                                ccb->cmd->cmnd[1] == PASSTHRU_GET_ADAPTER))
@@ -728,17 +821,8 @@ static void stex_mu_intr(struct st_hba *hba, u32 doorbell)
 
                        scsi_dma_unmap(ccb->cmd);
                        stex_scsi_done(ccb);
-                       hba->out_req_cnt--;
-               } else if (ccb->req_type & PASSTHRU_REQ_TYPE) {
-                       hba->out_req_cnt--;
-                       if (ccb->req_type & PASSTHRU_REQ_NO_WAKEUP) {
-                               ccb->req_type = 0;
-                               continue;
-                       }
+               } else
                        ccb->req_type = 0;
-                       if (waitqueue_active(&hba->waitq))
-                               wake_up(&hba->waitq);
-               }
        }
 
 update_status:
@@ -771,7 +855,103 @@ static irqreturn_t stex_intr(int irq, void *__hba)
        return IRQ_RETVAL(handled);
 }
 
-static int stex_handshake(struct st_hba *hba)
+static void stex_ss_mu_intr(struct st_hba *hba)
+{
+       struct status_msg *resp;
+       struct st_ccb *ccb;
+       __le32 *scratch;
+       unsigned int size;
+       int count = 0;
+       u32 value;
+       u16 tag;
+
+       if (unlikely(hba->out_req_cnt <= 0 ||
+                       hba->mu_status == MU_STATE_RESETTING))
+               return;
+
+       while (count < hba->sts_count) {
+               scratch = hba->scratch + hba->status_tail;
+               value = le32_to_cpu(*scratch);
+               if (unlikely(!(value & SS_STS_NORMAL)))
+                       return;
+
+               resp = hba->status_buffer + hba->status_tail;
+               *scratch = 0;
+               ++count;
+               ++hba->status_tail;
+               hba->status_tail %= hba->sts_count+1;
+
+               tag = (u16)value;
+               if (unlikely(tag >= hba->host->can_queue)) {
+                       printk(KERN_WARNING DRV_NAME
+                                       "(%s): invalid tag\n", pci_name(hba->pdev));
+                       continue;
+               }
+
+               hba->out_req_cnt--;
+               ccb = &hba->ccb[tag];
+               if (unlikely(hba->wait_ccb == ccb))
+                       hba->wait_ccb = NULL;
+               if (unlikely(ccb->req == NULL)) {
+                       printk(KERN_WARNING DRV_NAME
+                               "(%s): lagging req\n", pci_name(hba->pdev));
+                       continue;
+               }
+
+               ccb->req = NULL;
+               if (likely(value & SS_STS_DONE)) { /* normal case */
+                       ccb->srb_status = SRB_STATUS_SUCCESS;
+                       ccb->scsi_status = SAM_STAT_GOOD;
+               } else {
+                       ccb->srb_status = resp->srb_status;
+                       ccb->scsi_status = resp->scsi_status;
+                       size = resp->payload_sz * sizeof(u32);
+                       if (unlikely(size < sizeof(*resp) - STATUS_VAR_LEN ||
+                               size > sizeof(*resp))) {
+                               printk(KERN_WARNING DRV_NAME
+                                       "(%s): bad status size\n",
+                                       pci_name(hba->pdev));
+                       } else {
+                               size -= sizeof(*resp) - STATUS_VAR_LEN;
+                               if (size)
+                                       stex_copy_data(ccb, resp, size);
+                       }
+                       if (likely(ccb->cmd != NULL))
+                               stex_check_cmd(hba, ccb, resp);
+               }
+
+               if (likely(ccb->cmd != NULL)) {
+                       scsi_dma_unmap(ccb->cmd);
+                       stex_scsi_done(ccb);
+               } else
+                       ccb->req_type = 0;
+       }
+}
+
+static irqreturn_t stex_ss_intr(int irq, void *__hba)
+{
+       struct st_hba *hba = __hba;
+       void __iomem *base = hba->mmio_base;
+       u32 data;
+       unsigned long flags;
+       int handled = 0;
+
+       spin_lock_irqsave(hba->host->host_lock, flags);
+
+       data = readl(base + YI2H_INT);
+       if (data && data != 0xffffffff) {
+               /* clear the interrupt */
+               writel(data, base + YI2H_INT_C);
+               stex_ss_mu_intr(hba);
+               handled = 1;
+       }
+
+       spin_unlock_irqrestore(hba->host->host_lock, flags);
+
+       return IRQ_RETVAL(handled);
+}
+
+static int stex_common_handshake(struct st_hba *hba)
 {
        void __iomem *base = hba->mmio_base;
        struct handshake_frame *h;
@@ -800,26 +980,27 @@ static int stex_handshake(struct st_hba *hba)
        data = readl(base + OMR1);
        if ((data & 0xffff0000) == MU_HANDSHAKE_SIGNATURE_HALF) {
                data &= 0x0000ffff;
-               if (hba->host->can_queue > data)
+               if (hba->host->can_queue > data) {
                        hba->host->can_queue = data;
+                       hba->host->cmd_per_lun = data;
+               }
        }
 
-       h = (struct handshake_frame *)(hba->dma_mem + MU_REQ_BUFFER_SIZE);
-       h->rb_phy = cpu_to_le32(hba->dma_handle);
-       h->rb_phy_hi = cpu_to_le32((hba->dma_handle >> 16) >> 16);
-       h->req_sz = cpu_to_le16(sizeof(struct req_msg));
-       h->req_cnt = cpu_to_le16(MU_REQ_COUNT);
+       h = (struct handshake_frame *)hba->status_buffer;
+       h->rb_phy = cpu_to_le64(hba->dma_handle);
+       h->req_sz = cpu_to_le16(hba->rq_size);
+       h->req_cnt = cpu_to_le16(hba->rq_count+1);
        h->status_sz = cpu_to_le16(sizeof(struct status_msg));
-       h->status_cnt = cpu_to_le16(MU_STATUS_COUNT);
+       h->status_cnt = cpu_to_le16(hba->sts_count+1);
        stex_gettime(&h->hosttime);
        h->partner_type = HMU_PARTNER_TYPE;
-       if (hba->dma_size > STEX_BUFFER_SIZE) {
-               h->extra_offset = cpu_to_le32(STEX_BUFFER_SIZE);
+       if (hba->extra_offset) {
+               h->extra_offset = cpu_to_le32(hba->extra_offset);
                h->extra_size = cpu_to_le32(ST_ADDITIONAL_MEM);
        } else
                h->extra_offset = h->extra_size = 0;
 
-       status_phys = hba->dma_handle + MU_REQ_BUFFER_SIZE;
+       status_phys = hba->dma_handle + (hba->rq_count+1) * hba->rq_size;
        writel(status_phys, base + IMR0);
        readl(base + IMR0);
        writel((status_phys >> 16) >> 16, base + IMR1);
@@ -851,10 +1032,79 @@ static int stex_handshake(struct st_hba *hba)
        readl(base + IMR1);
        writel(0, base + OMR1);
        readl(base + OMR1); /* flush */
-       hba->mu_status = MU_STATE_STARTED;
        return 0;
 }
 
+static int stex_ss_handshake(struct st_hba *hba)
+{
+       void __iomem *base = hba->mmio_base;
+       struct st_msg_header *msg_h;
+       struct handshake_frame *h;
+       __le32 *scratch = hba->scratch;
+       u32 data;
+       unsigned long before;
+       int ret = 0;
+
+       h = (struct handshake_frame *)(hba->alloc_rq(hba));
+       msg_h = (struct st_msg_header *)h - 1;
+       msg_h->handle = cpu_to_le64(hba->dma_handle);
+       msg_h->flag = SS_HEAD_HANDSHAKE;
+
+       h->rb_phy = cpu_to_le64(hba->dma_handle);
+       h->req_sz = cpu_to_le16(hba->rq_size);
+       h->req_cnt = cpu_to_le16(hba->rq_count+1);
+       h->status_sz = cpu_to_le16(sizeof(struct status_msg));
+       h->status_cnt = cpu_to_le16(hba->sts_count+1);
+       stex_gettime(&h->hosttime);
+       h->partner_type = HMU_PARTNER_TYPE;
+       h->extra_offset = h->extra_size = 0;
+       h->scratch_size = cpu_to_le32((hba->sts_count+1)*sizeof(u32));
+
+       data = readl(base + YINT_EN);
+       data &= ~4;
+       writel(data, base + YINT_EN);
+       writel((hba->dma_handle >> 16) >> 16, base + YH2I_REQ_HI);
+       writel(hba->dma_handle, base + YH2I_REQ);
+
+       scratch = hba->scratch;
+       before = jiffies;
+       while (!(le32_to_cpu(*scratch) & SS_STS_HANDSHAKE)) {
+               if (time_after(jiffies, before + MU_MAX_DELAY * HZ)) {
+                       printk(KERN_ERR DRV_NAME
+                               "(%s): no signature after handshake frame\n",
+                               pci_name(hba->pdev));
+                       ret = -1;
+                       break;
+               }
+               rmb();
+               msleep(1);
+       }
+
+       *scratch = 0;
+       msg_h->flag = 0;
+       return ret;
+}
+
+static int stex_handshake(struct st_hba *hba)
+{
+       int err;
+       unsigned long flags;
+
+       err = (hba->cardtype == st_yel) ?
+               stex_ss_handshake(hba) : stex_common_handshake(hba);
+       if (err == 0) {
+               spin_lock_irqsave(hba->host->host_lock, flags);
+               hba->req_head = 0;
+               hba->req_tail = 0;
+               hba->status_head = 0;
+               hba->status_tail = 0;
+               hba->out_req_cnt = 0;
+               hba->mu_status = MU_STATE_STARTED;
+               spin_unlock_irqrestore(hba->host->host_lock, flags);
+       }
+       return err;
+}
+
 static int stex_abort(struct scsi_cmnd *cmd)
 {
        struct Scsi_Host *host = cmd->device->host;
@@ -883,15 +1133,23 @@ static int stex_abort(struct scsi_cmnd *cmd)
                        goto out;
        }
 
-       data = readl(base + ODBL);
-       if (data == 0 || data == 0xffffffff)
-               goto fail_out;
+       if (hba->cardtype == st_yel) {
+               data = readl(base + YI2H_INT);
+               if (data == 0 || data == 0xffffffff)
+                       goto fail_out;
 
-       writel(data, base + ODBL);
-       readl(base + ODBL); /* flush */
+               writel(data, base + YI2H_INT_C);
+               stex_ss_mu_intr(hba);
+       } else {
+               data = readl(base + ODBL);
+               if (data == 0 || data == 0xffffffff)
+                       goto fail_out;
 
-       stex_mu_intr(hba, data);
+               writel(data, base + ODBL);
+               readl(base + ODBL); /* flush */
 
+               stex_mu_intr(hba, data);
+       }
        if (hba->wait_ccb == NULL) {
                printk(KERN_WARNING DRV_NAME
                        "(%s): lost interrupt\n", pci_name(hba->pdev));
@@ -950,8 +1208,8 @@ static void stex_hard_reset(struct st_hba *hba)
 static int stex_reset(struct scsi_cmnd *cmd)
 {
        struct st_hba *hba;
-       unsigned long flags;
-       unsigned long before;
+       void __iomem *base;
+       unsigned long flags, before;
 
        hba = (struct st_hba *) &cmd->device->host->hostdata[0];
 
@@ -971,13 +1229,6 @@ static int stex_reset(struct scsi_cmnd *cmd)
                                pci_name(hba->pdev));
                        return FAILED;
                }
-               spin_lock_irqsave(hba->host->host_lock, flags);
-               hba->req_head = 0;
-               hba->req_tail = 0;
-               hba->status_head = 0;
-               hba->status_tail = 0;
-               hba->out_req_cnt = 0;
-               spin_unlock_irqrestore(hba->host->host_lock, flags);
                return SUCCESS;
        }
 
@@ -994,7 +1245,23 @@ static int stex_reset(struct scsi_cmnd *cmd)
                msleep(1);
        }
 
+       base = hba->mmio_base;
+       writel(0, base + IMR0);
+       readl(base + IMR0);
+       writel(0, base + OMR0);
+       readl(base + OMR0);
+       writel(0, base + IMR1);
+       readl(base + IMR1);
+       writel(0, base + OMR1);
+       readl(base + OMR1); /* flush */
+       spin_lock_irqsave(hba->host->host_lock, flags);
+       hba->req_head = 0;
+       hba->req_tail = 0;
+       hba->status_head = 0;
+       hba->status_tail = 0;
+       hba->out_req_cnt = 0;
        hba->mu_status = MU_STATE_STARTED;
+       spin_unlock_irqrestore(hba->host->host_lock, flags);
        return SUCCESS;
 }
 
@@ -1028,30 +1295,157 @@ static struct scsi_host_template driver_template = {
        .slave_destroy                  = stex_slave_destroy,
        .eh_abort_handler               = stex_abort,
        .eh_host_reset_handler          = stex_reset,
-       .can_queue                      = ST_CAN_QUEUE,
        .this_id                        = -1,
-       .sg_tablesize                   = ST_MAX_SG,
-       .cmd_per_lun                    = ST_CMD_PER_LUN,
+};
+
+static struct pci_device_id stex_pci_tbl[] = {
+       /* st_shasta */
+       { 0x105a, 0x8350, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               st_shasta }, /* SuperTrak EX8350/8300/16350/16300 */
+       { 0x105a, 0xc350, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               st_shasta }, /* SuperTrak EX12350 */
+       { 0x105a, 0x4302, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               st_shasta }, /* SuperTrak EX4350 */
+       { 0x105a, 0xe350, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               st_shasta }, /* SuperTrak EX24350 */
+
+       /* st_vsc */
+       { 0x105a, 0x7250, PCI_ANY_ID, PCI_ANY_ID, 0, 0, st_vsc },
+
+       /* st_yosemite */
+       { 0x105a, 0x8650, 0x105a, PCI_ANY_ID, 0, 0, st_yosemite },
+
+       /* st_seq */
+       { 0x105a, 0x3360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, st_seq },
+
+       /* st_yel */
+       { 0x105a, 0x8650, 0x1033, PCI_ANY_ID, 0, 0, st_yel },
+       { 0x105a, 0x8760, PCI_ANY_ID, PCI_ANY_ID, 0, 0, st_yel },
+       { }     /* terminate list */
+};
+
+static struct st_card_info stex_card_info[] = {
+       /* st_shasta */
+       {
+               .max_id         = 17,
+               .max_lun        = 8,
+               .max_channel    = 0,
+               .rq_count       = 32,
+               .rq_size        = 1048,
+               .sts_count      = 32,
+               .alloc_rq       = stex_alloc_req,
+               .map_sg         = stex_map_sg,
+               .send           = stex_send_cmd,
+       },
+
+       /* st_vsc */
+       {
+               .max_id         = 129,
+               .max_lun        = 1,
+               .max_channel    = 0,
+               .rq_count       = 32,
+               .rq_size        = 1048,
+               .sts_count      = 32,
+               .alloc_rq       = stex_alloc_req,
+               .map_sg         = stex_map_sg,
+               .send           = stex_send_cmd,
+       },
+
+       /* st_yosemite */
+       {
+               .max_id         = 2,
+               .max_lun        = 256,
+               .max_channel    = 0,
+               .rq_count       = 256,
+               .rq_size        = 1048,
+               .sts_count      = 256,
+               .alloc_rq       = stex_alloc_req,
+               .map_sg         = stex_map_sg,
+               .send           = stex_send_cmd,
+       },
+
+       /* st_seq */
+       {
+               .max_id         = 129,
+               .max_lun        = 1,
+               .max_channel    = 0,
+               .rq_count       = 32,
+               .rq_size        = 1048,
+               .sts_count      = 32,
+               .alloc_rq       = stex_alloc_req,
+               .map_sg         = stex_map_sg,
+               .send           = stex_send_cmd,
+       },
+
+       /* st_yel */
+       {
+               .max_id         = 129,
+               .max_lun        = 256,
+               .max_channel    = 3,
+               .rq_count       = 801,
+               .rq_size        = 512,
+               .sts_count      = 801,
+               .alloc_rq       = stex_ss_alloc_req,
+               .map_sg         = stex_ss_map_sg,
+               .send           = stex_ss_send_cmd,
+       },
 };
 
 static int stex_set_dma_mask(struct pci_dev * pdev)
 {
        int ret;
 
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)
-               && !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))
+       if (!pci_set_dma_mask(pdev,  DMA_BIT_MASK(64))
+               && !pci_set_consistent_dma_mask(pdev,  DMA_BIT_MASK(64)))
                return 0;
-       ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (!ret)
-               ret = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+               ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        return ret;
 }
 
+static int stex_request_irq(struct st_hba *hba)
+{
+       struct pci_dev *pdev = hba->pdev;
+       int status;
+
+       if (msi) {
+               status = pci_enable_msi(pdev);
+               if (status != 0)
+                       printk(KERN_ERR DRV_NAME
+                               "(%s): error %d setting up MSI\n",
+                               pci_name(pdev), status);
+               else
+                       hba->msi_enabled = 1;
+       } else
+               hba->msi_enabled = 0;
+
+       status = request_irq(pdev->irq, hba->cardtype == st_yel ?
+               stex_ss_intr : stex_intr, IRQF_SHARED, DRV_NAME, hba);
+
+       if (status != 0) {
+               if (hba->msi_enabled)
+                       pci_disable_msi(pdev);
+       }
+       return status;
+}
+
+static void stex_free_irq(struct st_hba *hba)
+{
+       struct pci_dev *pdev = hba->pdev;
+
+       free_irq(pdev->irq, hba);
+       if (hba->msi_enabled)
+               pci_disable_msi(pdev);
+}
+
 static int __devinit
 stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct st_hba *hba;
        struct Scsi_Host *host;
+       const struct st_card_info *ci = NULL;
+       u32 sts_offset, cp_offset, scratch_offset;
        int err;
 
        err = pci_enable_device(pdev);
@@ -1095,10 +1489,17 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        }
 
        hba->cardtype = (unsigned int) id->driver_data;
-       if (hba->cardtype == st_vsc && (pdev->subsystem_device & 1))
-               hba->cardtype = st_vsc1;
-       hba->dma_size = (hba->cardtype == st_vsc1 || hba->cardtype == st_seq) ?
-               (STEX_BUFFER_SIZE + ST_ADDITIONAL_MEM) : (STEX_BUFFER_SIZE);
+       ci = &stex_card_info[hba->cardtype];
+       sts_offset = scratch_offset = (ci->rq_count+1) * ci->rq_size;
+       if (hba->cardtype == st_yel)
+               sts_offset += (ci->sts_count+1) * sizeof(u32);
+       cp_offset = sts_offset + (ci->sts_count+1) * sizeof(struct status_msg);
+       hba->dma_size = cp_offset + sizeof(struct st_frame);
+       if (hba->cardtype == st_seq ||
+               (hba->cardtype == st_vsc && (pdev->subsystem_device & 1))) {
+               hba->extra_offset = hba->dma_size;
+               hba->dma_size += ST_ADDITIONAL_MEM;
+       }
        hba->dma_mem = dma_alloc_coherent(&pdev->dev,
                hba->dma_size, &hba->dma_handle, GFP_KERNEL);
        if (!hba->dma_mem) {
@@ -1108,35 +1509,46 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto out_iounmap;
        }
 
-       hba->status_buffer =
-               (struct status_msg *)(hba->dma_mem + MU_REQ_BUFFER_SIZE);
-       hba->copy_buffer = hba->dma_mem + MU_BUFFER_SIZE;
+       hba->ccb = kcalloc(ci->rq_count, sizeof(struct st_ccb), GFP_KERNEL);
+       if (!hba->ccb) {
+               err = -ENOMEM;
+               printk(KERN_ERR DRV_NAME "(%s): ccb alloc failed\n",
+                       pci_name(pdev));
+               goto out_pci_free;
+       }
+
+       if (hba->cardtype == st_yel)
+               hba->scratch = (__le32 *)(hba->dma_mem + scratch_offset);
+       hba->status_buffer = (struct status_msg *)(hba->dma_mem + sts_offset);
+       hba->copy_buffer = hba->dma_mem + cp_offset;
+       hba->rq_count = ci->rq_count;
+       hba->rq_size = ci->rq_size;
+       hba->sts_count = ci->sts_count;
+       hba->alloc_rq = ci->alloc_rq;
+       hba->map_sg = ci->map_sg;
+       hba->send = ci->send;
        hba->mu_status = MU_STATE_STARTING;
 
-       if (hba->cardtype == st_shasta) {
-               host->max_lun = 8;
-               host->max_id = 16 + 1;
-       } else if (hba->cardtype == st_yosemite) {
-               host->max_lun = 256;
-               host->max_id = 1 + 1;
-       } else {
-               /* st_vsc , st_vsc1 and st_seq */
-               host->max_lun = 1;
-               host->max_id = 128 + 1;
-       }
-       host->max_channel = 0;
+       if (hba->cardtype == st_yel)
+               host->sg_tablesize = 38;
+       else
+               host->sg_tablesize = 32;
+       host->can_queue = ci->rq_count;
+       host->cmd_per_lun = ci->rq_count;
+       host->max_id = ci->max_id;
+       host->max_lun = ci->max_lun;
+       host->max_channel = ci->max_channel;
        host->unique_id = host->host_no;
        host->max_cmd_len = STEX_CDB_LENGTH;
 
        hba->host = host;
        hba->pdev = pdev;
-       init_waitqueue_head(&hba->waitq);
 
-       err = request_irq(pdev->irq, stex_intr, IRQF_SHARED, DRV_NAME, hba);
+       err = stex_request_irq(hba);
        if (err) {
                printk(KERN_ERR DRV_NAME "(%s): request irq failed\n",
                        pci_name(pdev));
-               goto out_pci_free;
+               goto out_ccb_free;
        }
 
        err = stex_handshake(hba);
@@ -1164,7 +1576,9 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        return 0;
 
 out_free_irq:
-       free_irq(pdev->irq, hba);
+       stex_free_irq(hba);
+out_ccb_free:
+       kfree(hba->ccb);
 out_pci_free:
        dma_free_coherent(&pdev->dev, hba->dma_size,
                          hba->dma_mem, hba->dma_handle);
@@ -1183,15 +1597,20 @@ out_disable:
 static void stex_hba_stop(struct st_hba *hba)
 {
        struct req_msg *req;
+       struct st_msg_header *msg_h;
        unsigned long flags;
        unsigned long before;
        u16 tag = 0;
 
        spin_lock_irqsave(hba->host->host_lock, flags);
-       req = stex_alloc_req(hba);
-       memset(req->cdb, 0, STEX_CDB_LENGTH);
+       req = hba->alloc_rq(hba);
+       if (hba->cardtype == st_yel) {
+               msg_h = (struct st_msg_header *)req - 1;
+               memset(msg_h, 0, hba->rq_size);
+       } else
+               memset(req, 0, hba->rq_size);
 
-       if (hba->cardtype == st_yosemite) {
+       if (hba->cardtype == st_yosemite || hba->cardtype == st_yel) {
                req->cdb[0] = MGT_CMD;
                req->cdb[1] = MGT_CMD_SIGNATURE;
                req->cdb[2] = CTLR_CONFIG_CMD;
@@ -1206,27 +1625,31 @@ static void stex_hba_stop(struct st_hba *hba)
        hba->ccb[tag].sg_count = 0;
        hba->ccb[tag].sense_bufflen = 0;
        hba->ccb[tag].sense_buffer = NULL;
-       hba->ccb[tag].req_type |= PASSTHRU_REQ_TYPE;
+       hba->ccb[tag].req_type = PASSTHRU_REQ_TYPE;
 
-       stex_send_cmd(hba, req, tag);
+       hba->send(hba, req, tag);
        spin_unlock_irqrestore(hba->host->host_lock, flags);
 
        before = jiffies;
        while (hba->ccb[tag].req_type & PASSTHRU_REQ_TYPE) {
-               if (time_after(jiffies, before + ST_INTERNAL_TIMEOUT * HZ))
+               if (time_after(jiffies, before + ST_INTERNAL_TIMEOUT * HZ)) {
+                       hba->ccb[tag].req_type = 0;
                        return;
-               msleep(10);
+               }
+               msleep(1);
        }
 }
 
 static void stex_hba_free(struct st_hba *hba)
 {
-       free_irq(hba->pdev->irq, hba);
+       stex_free_irq(hba);
 
        iounmap(hba->mmio_base);
 
        pci_release_regions(hba->pdev);
 
+       kfree(hba->ccb);
+
        dma_free_coherent(&hba->pdev->dev, hba->dma_size,
                          hba->dma_mem, hba->dma_handle);
 }
@@ -1255,27 +1678,6 @@ static void stex_shutdown(struct pci_dev *pdev)
        stex_hba_stop(hba);
 }
 
-static struct pci_device_id stex_pci_tbl[] = {
-       /* st_shasta */
-       { 0x105a, 0x8350, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               st_shasta }, /* SuperTrak EX8350/8300/16350/16300 */
-       { 0x105a, 0xc350, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               st_shasta }, /* SuperTrak EX12350 */
-       { 0x105a, 0x4302, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               st_shasta }, /* SuperTrak EX4350 */
-       { 0x105a, 0xe350, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               st_shasta }, /* SuperTrak EX24350 */
-
-       /* st_vsc */
-       { 0x105a, 0x7250, PCI_ANY_ID, PCI_ANY_ID, 0, 0, st_vsc },
-
-       /* st_yosemite */
-       { 0x105a, 0x8650, PCI_ANY_ID, PCI_ANY_ID, 0, 0, st_yosemite },
-
-       /* st_seq */
-       { 0x105a, 0x3360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, st_seq },
-       { }     /* terminate list */
-};
 MODULE_DEVICE_TABLE(pci, stex_pci_tbl);
 
 static struct pci_driver stex_pci_driver = {
index 23e782015880173a47684b166bff6196ea864963..583966ec82661f9959fe2434c853d50e2139d771 100644 (file)
@@ -1349,7 +1349,7 @@ static struct Scsi_Host * __devinit sym_attach(struct scsi_host_template *tpnt,
        if ((SYM_CONF_DMA_ADDRESSING_MODE > 0) && (np->features & FE_DAC) &&
                        !pci_set_dma_mask(pdev, DMA_DAC_MASK)) {
                set_dac(np);
-       } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       } else if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printf_warning("%s: No suitable DMA available\n", sym_name(np));
                goto attach_failed;
        }
index 567fbe0b4f09551c2d48bc429cc75998a43a839a..b80bf709f104ade623662ea8c646dea308a67818 100644 (file)
@@ -234,7 +234,7 @@ static inline struct sym_hcb * sym_get_hcb(struct Scsi_Host *host)
 /*
  *  Set the status field of a CAM CCB.
  */
-static __inline void 
+static inline void
 sym_set_cam_status(struct scsi_cmnd *cmd, int status)
 {
        cmd->result &= ~(0xff  << 16);
@@ -244,7 +244,7 @@ sym_set_cam_status(struct scsi_cmnd *cmd, int status)
 /*
  *  Get the status field of a CAM CCB.
  */
-static __inline int 
+static inline int
 sym_get_cam_status(struct scsi_cmnd *cmd)
 {
        return host_byte(cmd->result);
@@ -253,7 +253,7 @@ sym_get_cam_status(struct scsi_cmnd *cmd)
 /*
  *  Build CAM result for a successful IO and for a failed IO.
  */
-static __inline void sym_set_cam_result_ok(struct sym_ccb *cp, struct scsi_cmnd *cmd, int resid)
+static inline void sym_set_cam_result_ok(struct sym_ccb *cp, struct scsi_cmnd *cmd, int resid)
 {
        scsi_set_resid(cmd, resid);
        cmd->result = (((DID_OK) << 16) + ((cp->ssss_status) & 0x7f));
index ccea7db59f498b0b6708c44ef9a7179937fddbb8..ffa70d1ed182dcfee4e1a2fc4593db436c16ced7 100644 (file)
@@ -602,7 +602,7 @@ sym_getsync(struct sym_hcb *np, u_char dt, u_char sfac, u_char *divp, u_char *fa
 /*
  *  Set initial io register bits from burst code.
  */
-static __inline void sym_init_burst(struct sym_hcb *np, u_char bc)
+static inline void sym_init_burst(struct sym_hcb *np, u_char bc)
 {
        np->rv_ctest4   &= ~0x80;
        np->rv_dmode    &= ~(0x3 << 6);
index 61d28fcfffbf795b999167f715413cde70fd6806..9ebc8706b6bfc7b70fcdd884a5328130d53e65d4 100644 (file)
@@ -1080,23 +1080,23 @@ int sym_hcb_attach(struct Scsi_Host *shost, struct sym_fw *fw, struct sym_nvram
  */
 
 #if   SYM_CONF_DMA_ADDRESSING_MODE == 0
-#define DMA_DAC_MASK   DMA_32BIT_MASK
+#define DMA_DAC_MASK   DMA_BIT_MASK(32)
 #define sym_build_sge(np, data, badd, len)     \
 do {                                           \
        (data)->addr = cpu_to_scr(badd);        \
        (data)->size = cpu_to_scr(len);         \
 } while (0)
 #elif SYM_CONF_DMA_ADDRESSING_MODE == 1
-#define DMA_DAC_MASK   DMA_40BIT_MASK
+#define DMA_DAC_MASK   DMA_BIT_MASK(40)
 #define sym_build_sge(np, data, badd, len)                             \
 do {                                                                   \
        (data)->addr = cpu_to_scr(badd);                                \
        (data)->size = cpu_to_scr((((badd) >> 8) & 0xff000000) + len);  \
 } while (0)
 #elif SYM_CONF_DMA_ADDRESSING_MODE == 2
-#define DMA_DAC_MASK   DMA_64BIT_MASK
+#define DMA_DAC_MASK   DMA_BIT_MASK(64)
 int sym_lookup_dmap(struct sym_hcb *np, u32 h, int s);
-static __inline void 
+static inline void
 sym_build_sge(struct sym_hcb *np, struct sym_tblmove *data, u64 badd, int len)
 {
        u32 h = (badd>>32);
@@ -1201,7 +1201,7 @@ dma_addr_t __vtobus(m_pool_ident_t dev_dmat, void *m);
 
 #define sym_m_pool_match(mp_id1, mp_id2)       (mp_id1 == mp_id2)
 
-static __inline void *sym_m_get_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
+static inline void *sym_m_get_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
 {
        void *vaddr = NULL;
        dma_addr_t baddr = 0;
@@ -1215,7 +1215,7 @@ static __inline void *sym_m_get_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
        return vaddr;
 }
 
-static __inline void sym_m_free_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
+static inline void sym_m_free_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
 {
        dma_free_coherent(mp->dev_dmat, SYM_MEM_CLUSTER_SIZE, vbp->vaddr,
                        vbp->baddr);
index 92bf9b14a7a2bb98fdd0cc772d7496f86dc77637..883cac10daf9b15a129549b3fecd73aa871f6af2 100644 (file)
@@ -262,7 +262,7 @@ static void ___free_dma_mem_cluster(m_pool_p mp, void *m)
 #endif
 
 /* Fetch the memory pool for a given pool id (i.e. DMA constraints) */
-static __inline m_pool_p ___get_dma_pool(m_pool_ident_t dev_dmat)
+static inline m_pool_p ___get_dma_pool(m_pool_ident_t dev_dmat)
 {
        m_pool_p mp;
        for (mp = mp0.next;
index 430537183c1851a22c6fbee9cf95bc3ae13663dd..96c15145902cefc69bc6bdbb229390c6f34d35ca 100644 (file)
@@ -52,17 +52,17 @@ typedef struct sym_quehead {
        (ptr)->flink = (ptr); (ptr)->blink = (ptr); \
 } while (0)
 
-static __inline struct sym_quehead *sym_que_first(struct sym_quehead *head)
+static inline struct sym_quehead *sym_que_first(struct sym_quehead *head)
 {
        return (head->flink == head) ? 0 : head->flink;
 }
 
-static __inline struct sym_quehead *sym_que_last(struct sym_quehead *head)
+static inline struct sym_quehead *sym_que_last(struct sym_quehead *head)
 {
        return (head->blink == head) ? 0 : head->blink;
 }
 
-static __inline void __sym_que_add(struct sym_quehead * new,
+static inline void __sym_que_add(struct sym_quehead * new,
        struct sym_quehead * blink,
        struct sym_quehead * flink)
 {
@@ -72,19 +72,19 @@ static __inline void __sym_que_add(struct sym_quehead * new,
        blink->flink    = new;
 }
 
-static __inline void __sym_que_del(struct sym_quehead * blink,
+static inline void __sym_que_del(struct sym_quehead * blink,
        struct sym_quehead * flink)
 {
        flink->blink = blink;
        blink->flink = flink;
 }
 
-static __inline int sym_que_empty(struct sym_quehead *head)
+static inline int sym_que_empty(struct sym_quehead *head)
 {
        return head->flink == head;
 }
 
-static __inline void sym_que_splice(struct sym_quehead *list,
+static inline void sym_que_splice(struct sym_quehead *list,
        struct sym_quehead *head)
 {
        struct sym_quehead *first = list->flink;
@@ -101,7 +101,7 @@ static __inline void sym_que_splice(struct sym_quehead *list,
        }
 }
 
-static __inline void sym_que_move(struct sym_quehead *orig,
+static inline void sym_que_move(struct sym_quehead *orig,
        struct sym_quehead *dest)
 {
        struct sym_quehead *first, *last;
@@ -129,7 +129,7 @@ static __inline void sym_que_move(struct sym_quehead *orig,
 
 #define sym_insque_head(new, head)     __sym_que_add(new, head, (head)->flink)
 
-static __inline struct sym_quehead *sym_remque_head(struct sym_quehead *head)
+static inline struct sym_quehead *sym_remque_head(struct sym_quehead *head)
 {
        struct sym_quehead *elem = head->flink;
 
@@ -142,7 +142,7 @@ static __inline struct sym_quehead *sym_remque_head(struct sym_quehead *head)
 
 #define sym_insque_tail(new, head)     __sym_que_add(new, (head)->blink, head)
 
-static __inline struct sym_quehead *sym_remque_tail(struct sym_quehead *head)
+static inline struct sym_quehead *sym_remque_tail(struct sym_quehead *head)
 {
        struct sym_quehead *elem = head->blink;
 
index 533f82025adf218e6fffbfd1730f94839924be21..7ddff3f55087c0a1581783c882858cb09e4f1074 100644 (file)
@@ -306,6 +306,63 @@ static void __devexit pci_plx9050_exit(struct pci_dev *dev)
        }
 }
 
+#define NI8420_INT_ENABLE_REG  0x38
+#define NI8420_INT_ENABLE_BIT  0x2000
+
+static void __devexit pci_ni8420_exit(struct pci_dev *dev)
+{
+       void __iomem *p;
+       unsigned long base, len;
+       unsigned int bar = 0;
+
+       if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
+               moan_device("no memory in bar", dev);
+               return;
+       }
+
+       base = pci_resource_start(dev, bar);
+       len =  pci_resource_len(dev, bar);
+       p = ioremap_nocache(base, len);
+       if (p == NULL)
+               return;
+
+       /* Disable the CPU Interrupt */
+       writel(readl(p + NI8420_INT_ENABLE_REG) & ~(NI8420_INT_ENABLE_BIT),
+              p + NI8420_INT_ENABLE_REG);
+       iounmap(p);
+}
+
+
+/* MITE registers */
+#define MITE_IOWBSR1   0xc4
+#define MITE_IOWCR1    0xf4
+#define MITE_LCIMR1    0x08
+#define MITE_LCIMR2    0x10
+
+#define MITE_LCIMR2_CLR_CPU_IE (1 << 30)
+
+static void __devexit pci_ni8430_exit(struct pci_dev *dev)
+{
+       void __iomem *p;
+       unsigned long base, len;
+       unsigned int bar = 0;
+
+       if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
+               moan_device("no memory in bar", dev);
+               return;
+       }
+
+       base = pci_resource_start(dev, bar);
+       len =  pci_resource_len(dev, bar);
+       p = ioremap_nocache(base, len);
+       if (p == NULL)
+               return;
+
+       /* Disable the CPU Interrupt */
+       writel(MITE_LCIMR2_CLR_CPU_IE, p + MITE_LCIMR2);
+       iounmap(p);
+}
+
 /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */
 static int
 sbs_setup(struct serial_private *priv, const struct pciserial_board *board,
@@ -597,6 +654,108 @@ static int pci_xircom_init(struct pci_dev *dev)
        return 0;
 }
 
+static int pci_ni8420_init(struct pci_dev *dev)
+{
+       void __iomem *p;
+       unsigned long base, len;
+       unsigned int bar = 0;
+
+       if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
+               moan_device("no memory in bar", dev);
+               return 0;
+       }
+
+       base = pci_resource_start(dev, bar);
+       len =  pci_resource_len(dev, bar);
+       p = ioremap_nocache(base, len);
+       if (p == NULL)
+               return -ENOMEM;
+
+       /* Enable CPU Interrupt */
+       writel(readl(p + NI8420_INT_ENABLE_REG) | NI8420_INT_ENABLE_BIT,
+              p + NI8420_INT_ENABLE_REG);
+
+       iounmap(p);
+       return 0;
+}
+
+#define MITE_IOWBSR1_WSIZE     0xa
+#define MITE_IOWBSR1_WIN_OFFSET        0x800
+#define MITE_IOWBSR1_WENAB     (1 << 7)
+#define MITE_LCIMR1_IO_IE_0    (1 << 24)
+#define MITE_LCIMR2_SET_CPU_IE (1 << 31)
+#define MITE_IOWCR1_RAMSEL_MASK        0xfffffffe
+
+static int pci_ni8430_init(struct pci_dev *dev)
+{
+       void __iomem *p;
+       unsigned long base, len;
+       u32 device_window;
+       unsigned int bar = 0;
+
+       if ((pci_resource_flags(dev, bar) & IORESOURCE_MEM) == 0) {
+               moan_device("no memory in bar", dev);
+               return 0;
+       }
+
+       base = pci_resource_start(dev, bar);
+       len =  pci_resource_len(dev, bar);
+       p = ioremap_nocache(base, len);
+       if (p == NULL)
+               return -ENOMEM;
+
+       /* Set device window address and size in BAR0 */
+       device_window = ((base + MITE_IOWBSR1_WIN_OFFSET) & 0xffffff00)
+                       | MITE_IOWBSR1_WENAB | MITE_IOWBSR1_WSIZE;
+       writel(device_window, p + MITE_IOWBSR1);
+
+       /* Set window access to go to RAMSEL IO address space */
+       writel((readl(p + MITE_IOWCR1) & MITE_IOWCR1_RAMSEL_MASK),
+              p + MITE_IOWCR1);
+
+       /* Enable IO Bus Interrupt 0 */
+       writel(MITE_LCIMR1_IO_IE_0, p + MITE_LCIMR1);
+
+       /* Enable CPU Interrupt */
+       writel(MITE_LCIMR2_SET_CPU_IE, p + MITE_LCIMR2);
+
+       iounmap(p);
+       return 0;
+}
+
+/* UART Port Control Register */
+#define NI8430_PORTCON 0x0f
+#define NI8430_PORTCON_TXVR_ENABLE     (1 << 3)
+
+static int
+pci_ni8430_setup(struct serial_private *priv,
+                const struct pciserial_board *board,
+                struct uart_port *port, int idx)
+{
+       void __iomem *p;
+       unsigned long base, len;
+       unsigned int bar, offset = board->first_offset;
+
+       if (idx >= board->num_ports)
+               return 1;
+
+       bar = FL_GET_BASE(board->flags);
+       offset += idx * board->uart_offset;
+
+       base = pci_resource_start(priv->dev, bar);
+       len =  pci_resource_len(priv->dev, bar);
+       p = ioremap_nocache(base, len);
+
+       /* enable the transciever */
+       writeb(readb(p + offset + NI8430_PORTCON) | NI8430_PORTCON_TXVR_ENABLE,
+              p + offset + NI8430_PORTCON);
+
+       iounmap(p);
+
+       return setup_port(priv, port, bar, offset, board->reg_shift);
+}
+
+
 static int pci_netmos_init(struct pci_dev *dev)
 {
        /* subdevice 0x00PS means <P> parallel, <S> serial */
@@ -912,6 +1071,126 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
                .setup          = pci_default_setup,
                .exit           = __devexit_p(pci_ite887x_exit),
        },
+       /*
+        * National Instruments
+        */
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PCI23216,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PCI2328,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PCI2324,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PCI2322,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PCI2324I,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PCI2322I,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PXI8420_23216,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PXI8420_2328,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PXI8420_2324,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PXI8420_2322,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PXI8422_2324,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_DEVICE_ID_NI_PXI8422_2322,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8420_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ni8420_exit),
+       },
+       {
+               .vendor         = PCI_VENDOR_ID_NI,
+               .device         = PCI_ANY_ID,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ni8430_init,
+               .setup          = pci_ni8430_setup,
+               .exit           = __devexit_p(pci_ni8430_exit),
+       },
        /*
         * Panacom
         */
@@ -1216,6 +1495,7 @@ enum pci_board_num_t {
        pbn_b1_2_115200,
        pbn_b1_4_115200,
        pbn_b1_8_115200,
+       pbn_b1_16_115200,
 
        pbn_b1_1_921600,
        pbn_b1_2_921600,
@@ -1225,6 +1505,9 @@ enum pci_board_num_t {
        pbn_b1_2_1250000,
 
        pbn_b1_bt_1_115200,
+       pbn_b1_bt_2_115200,
+       pbn_b1_bt_4_115200,
+
        pbn_b1_bt_2_921600,
 
        pbn_b1_1_1382400,
@@ -1280,6 +1563,10 @@ enum pci_board_num_t {
        pbn_exar_XR17C154,
        pbn_exar_XR17C158,
        pbn_pasemi_1682M,
+       pbn_ni8430_2,
+       pbn_ni8430_4,
+       pbn_ni8430_8,
+       pbn_ni8430_16,
 };
 
 /*
@@ -1487,6 +1774,12 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .base_baud      = 115200,
                .uart_offset    = 8,
        },
+       [pbn_b1_16_115200] = {
+               .flags          = FL_BASE1,
+               .num_ports      = 16,
+               .base_baud      = 115200,
+               .uart_offset    = 8,
+       },
 
        [pbn_b1_1_921600] = {
                .flags          = FL_BASE1,
@@ -1525,6 +1818,18 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .base_baud      = 115200,
                .uart_offset    = 8,
        },
+       [pbn_b1_bt_2_115200] = {
+               .flags          = FL_BASE1|FL_BASE_BARS,
+               .num_ports      = 2,
+               .base_baud      = 115200,
+               .uart_offset    = 8,
+       },
+       [pbn_b1_bt_4_115200] = {
+               .flags          = FL_BASE1|FL_BASE_BARS,
+               .num_ports      = 4,
+               .base_baud      = 115200,
+               .uart_offset    = 8,
+       },
 
        [pbn_b1_bt_2_921600] = {
                .flags          = FL_BASE1|FL_BASE_BARS,
@@ -1850,6 +2155,37 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .num_ports      = 1,
                .base_baud      = 8333333,
        },
+       /*
+        * National Instruments 843x
+        */
+       [pbn_ni8430_16] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 16,
+               .base_baud      = 3686400,
+               .uart_offset    = 0x10,
+               .first_offset   = 0x800,
+       },
+       [pbn_ni8430_8] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 8,
+               .base_baud      = 3686400,
+               .uart_offset    = 0x10,
+               .first_offset   = 0x800,
+       },
+       [pbn_ni8430_4] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 4,
+               .base_baud      = 3686400,
+               .uart_offset    = 0x10,
+               .first_offset   = 0x800,
+       },
+       [pbn_ni8430_2] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 2,
+               .base_baud      = 3686400,
+               .uart_offset    = 0x10,
+               .first_offset   = 0x800,
+       },
 };
 
 static const struct pci_device_id softmodem_blacklist[] = {
@@ -3051,6 +3387,82 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_pasemi_1682M },
 
+       /*
+        * National Instruments
+        */
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI23216,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_16_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2328,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_8_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2324,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_bt_4_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2322,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_bt_2_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2324I,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_bt_4_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI2322I,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_bt_2_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_23216,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_16_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2328,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_8_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2324,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_bt_4_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8420_2322,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_bt_2_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8422_2324,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_bt_4_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8422_2322,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b1_bt_2_115200 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2322,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_2 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2322,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_2 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2324,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_4 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2324,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_4 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_2328,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_8 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_2328,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_8 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8430_23216,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_16 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8430_23216,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_16 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8432_2322,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_2 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8432_2322,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_2 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PXI8432_2324,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_4 },
+       {       PCI_VENDOR_ID_NI, PCI_DEVICE_ID_NI_PCI8432_2324,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_ni8430_4 },
+
        /*
        * ADDI-DATA GmbH communication cards <info@addi-data.com>
        */
index bbcfc26a3b6d4f306b97ca025793b482ed124f03..d71dfe398940114b4af1f6474127f2b3c9112bc4 100644 (file)
@@ -333,6 +333,10 @@ static const struct pnp_device_id pnp_dev_table[] = {
        {       "WACF006",              0       },
        {       "WACF007",              0       },
        {       "WACF008",              0       },
+       {       "WACF009",              0       },
+       {       "WACF00A",              0       },
+       {       "WACF00B",              0       },
+       {       "WACF00C",              0       },
        /* Compaq touchscreen */
        {       "FPI2002",              0 },
        /* Fujitsu Stylistic touchscreens */
@@ -346,8 +350,9 @@ static const struct pnp_device_id pnp_dev_table[] = {
        {       "FUJ02B8",              0 },
        {       "FUJ02B9",              0 },
        {       "FUJ02BC",              0 },
-       /* Fujitsu Wacom Tablet PC devices */
+       /* Fujitsu Wacom Tablet PC device */
        {       "FUJ02E5",              0       },
+       /* Fujitsu P-series tablet PC device */
        {       "FUJ02E6",              0       },
        /*
         * LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in
index aa9d3a4c2d50ba86470fe3706e9d7193e72de9cf..0328fd4006e52436e0fa49fd3e2a2909572b0c10 100644 (file)
@@ -533,6 +533,13 @@ config SERIAL_S3C6400
          Serial port support for the Samsung S3C6400 and S3C6410
          SoCs
 
+config SERIAL_MAX3100
+       tristate "MAX3100 support"
+       depends on SPI
+       select SERIAL_CORE
+       help
+         MAX3100 chip support
+
 config SERIAL_DZ
        bool "DECstation DZ serial driver"
        depends on MACH_DECSTATION && 32BIT
@@ -700,7 +707,7 @@ choice
 
 config SERIAL_BFIN_DMA
        bool "DMA mode"
-       depends on !DMA_UNCACHED_NONE && !KGDB_UART
+       depends on !DMA_UNCACHED_NONE && KGDB_SERIAL_CONSOLE=n
        help
          This driver works under DMA mode. If this option is selected, the
          blackfin simple dma driver is also enabled.
@@ -727,19 +734,19 @@ config BFIN_UART0_CTSRTS
 
 config UART0_CTS_PIN
        int "UART0 CTS pin"
-       depends on BFIN_UART0_CTSRTS
+       depends on BFIN_UART0_CTSRTS && !BF548
        default 23
        help
          The default pin is GPIO_GP7.
-         Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.
+         Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
 
 config UART0_RTS_PIN
        int "UART0 RTS pin"
-       depends on BFIN_UART0_CTSRTS
+       depends on BFIN_UART0_CTSRTS && !BF548
        default 22
        help
          The default pin is GPIO_GP6.
-         Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.
+         Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
 
 config SERIAL_BFIN_UART1
        bool "Enable UART1"
@@ -756,21 +763,21 @@ config BFIN_UART1_CTSRTS
 
 config UART1_CTS_PIN
        int "UART1 CTS pin"
-       depends on BFIN_UART1_CTSRTS && !BF54x
+       depends on BFIN_UART1_CTSRTS && !BF548
        default -1
        help
-         Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.
+         Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
 
 config UART1_RTS_PIN
        int "UART1 RTS pin"
-       depends on BFIN_UART1_CTSRTS && !BF54x
+       depends on BFIN_UART1_CTSRTS && !BF548
        default -1
        help
-         Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.
+         Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
 
 config SERIAL_BFIN_UART2
        bool "Enable UART2"
-       depends on SERIAL_BFIN && (BF54x)
+       depends on SERIAL_BFIN && (BF54x || BF538 || BF539)
        help
          Enable UART2
 
@@ -783,17 +790,17 @@ config BFIN_UART2_CTSRTS
 
 config UART2_CTS_PIN
        int "UART2 CTS pin"
-       depends on BFIN_UART2_CTSRTS
+       depends on BFIN_UART2_CTSRTS && !BF548
        default -1
        help
-         Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.
+         Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
 
 config UART2_RTS_PIN
        int "UART2 RTS pin"
-       depends on BFIN_UART2_CTSRTS
+       depends on BFIN_UART2_CTSRTS && !BF548
        default -1
        help
-         Refer to ./include/asm-blackfin/gpio.h to see the GPIO map.
+         Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
 
 config SERIAL_BFIN_UART3
        bool "Enable UART3"
@@ -808,6 +815,20 @@ config BFIN_UART3_CTSRTS
          Enable hardware flow control in the driver. Using GPIO emulate the CTS/RTS
          signal.
 
+config UART3_CTS_PIN
+       int "UART3 CTS pin"
+       depends on BFIN_UART3_CTSRTS && !BF548
+       default -1
+       help
+         Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+
+config UART3_RTS_PIN
+       int "UART3 RTS pin"
+       depends on BFIN_UART3_CTSRTS && !BF548
+       default -1
+       help
+         Refer to arch/blackfin/mach-*/include/mach/gpio.h to see the GPIO map.
+
 config SERIAL_IMX
        bool "IMX serial port support"
        depends on ARM && (ARCH_IMX || ARCH_MXC)
index 8844c0a039298f7f3f8d32576a19a97ff593d399..d438eb2a73defd29ca9cfab294fa95b20d09fc5f 100644 (file)
@@ -43,6 +43,7 @@ obj-$(CONFIG_SERIAL_S3C2412) += s3c2412.o
 obj-$(CONFIG_SERIAL_S3C2440) += s3c2440.o
 obj-$(CONFIG_SERIAL_S3C24A0) += s3c24a0.o
 obj-$(CONFIG_SERIAL_S3C6400) += s3c6400.o
+obj-$(CONFIG_SERIAL_MAX3100) += max3100.o
 obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o
 obj-$(CONFIG_SERIAL_MUX) += mux.o
 obj-$(CONFIG_SERIAL_68328) += 68328serial.o
index 318d69dce8e1351f72cf1c100c0eba4b508cf54f..18ba812a4f84bc6b3aea2c5818613a811a681387 100644 (file)
@@ -63,7 +63,6 @@ static int kgdboc_break_enabled;
 #define DMA_RX_YCOUNT          (PAGE_SIZE / DMA_RX_XCOUNT)
 
 #define DMA_RX_FLUSH_JIFFIES   (HZ / 50)
-#define CTS_CHECK_JIFFIES      (HZ / 50)
 
 #ifdef CONFIG_SERIAL_BFIN_DMA
 static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart);
@@ -71,10 +70,65 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart);
 static void bfin_serial_tx_chars(struct bfin_serial_port *uart);
 #endif
 
-static void bfin_serial_mctrl_check(struct bfin_serial_port *uart);
-
 static void bfin_serial_reset_irda(struct uart_port *port);
 
+#if defined(CONFIG_SERIAL_BFIN_CTSRTS) || \
+       defined(CONFIG_SERIAL_BFIN_HARD_CTSRTS)
+static unsigned int bfin_serial_get_mctrl(struct uart_port *port)
+{
+       struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
+       if (uart->cts_pin < 0)
+               return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
+
+       /* CTS PIN is negative assertive. */
+       if (UART_GET_CTS(uart))
+               return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
+       else
+               return TIOCM_DSR | TIOCM_CAR;
+}
+
+static void bfin_serial_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+       struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
+       if (uart->rts_pin < 0)
+               return;
+
+       /* RTS PIN is negative assertive. */
+       if (mctrl & TIOCM_RTS)
+               UART_ENABLE_RTS(uart);
+       else
+               UART_DISABLE_RTS(uart);
+}
+
+/*
+ * Handle any change of modem status signal.
+ */
+static irqreturn_t bfin_serial_mctrl_cts_int(int irq, void *dev_id)
+{
+       struct bfin_serial_port *uart = dev_id;
+       unsigned int status;
+
+       status = bfin_serial_get_mctrl(&uart->port);
+       uart_handle_cts_change(&uart->port, status & TIOCM_CTS);
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       uart->scts = 1;
+       UART_CLEAR_SCTS(uart);
+       UART_CLEAR_IER(uart, EDSSI);
+#endif
+
+       return IRQ_HANDLED;
+}
+#else
+static unsigned int bfin_serial_get_mctrl(struct uart_port *port)
+{
+       return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
+}
+
+static void bfin_serial_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+}
+#endif
+
 /*
  * interrupts are disabled on entry
  */
@@ -111,6 +165,13 @@ static void bfin_serial_start_tx(struct uart_port *port)
        struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
        struct tty_struct *tty = uart->port.info->port.tty;
 
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       if (uart->scts && (!bfin_serial_get_mctrl(&uart->port)&TIOCM_CTS)) {
+               uart->scts = 0;
+               uart_handle_cts_change(&uart->port, uart->scts);
+       }
+#endif
+
        /*
         * To avoid losting RX interrupt, we reset IR function
         * before sending data.
@@ -174,10 +235,10 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart)
                        return;
                }
 
-       if (!uart->port.info || !uart->port.info->tty)
+       if (!uart->port.info || !uart->port.info->port.tty)
                return;
 #endif
-       tty = uart->port.info->tty;
+       tty = uart->port.info->port.tty;
 
        if (ANOMALY_05000363) {
                /* The BF533 (and BF561) family of processors have a nice anomaly
@@ -264,12 +325,6 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
 {
        struct circ_buf *xmit = &uart->port.info->xmit;
 
-       /*
-        * Check the modem control lines before
-        * transmitting anything.
-        */
-       bfin_serial_mctrl_check(uart);
-
        if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) {
 #ifdef CONFIG_BF54x
                /* Clear TFI bit */
@@ -312,6 +367,12 @@ static irqreturn_t bfin_serial_tx_int(int irq, void *dev_id)
 {
        struct bfin_serial_port *uart = dev_id;
 
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       if (uart->scts && (!bfin_serial_get_mctrl(&uart->port)&TIOCM_CTS)) {
+               uart->scts = 0;
+               uart_handle_cts_change(&uart->port, uart->scts);
+       }
+#endif
        spin_lock(&uart->port.lock);
        if (UART_GET_LSR(uart) & THRE)
                bfin_serial_tx_chars(uart);
@@ -328,12 +389,6 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
 
        uart->tx_done = 0;
 
-       /*
-        * Check the modem control lines before
-        * transmitting anything.
-        */
-       bfin_serial_mctrl_check(uart);
-
        if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) {
                uart->tx_count = 0;
                uart->tx_done = 1;
@@ -401,9 +456,11 @@ static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart)
        else
                flg = TTY_NORMAL;
 
-       for (i = uart->rx_dma_buf.tail; i != uart->rx_dma_buf.head; i++) {
+       for (i = uart->rx_dma_buf.tail; ; i++) {
                if (i >= UART_XMIT_SIZE)
                        i = 0;
+               if (i == uart->rx_dma_buf.head)
+                       break;
                if (!uart_handle_sysrq_char(&uart->port, uart->rx_dma_buf.buf[i]))
                        uart_insert_char(&uart->port, status, OE,
                                uart->rx_dma_buf.buf[i], flg);
@@ -415,7 +472,8 @@ static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart)
 
 void bfin_serial_rx_dma_timeout(struct bfin_serial_port *uart)
 {
-       int x_pos, pos, flags;
+       int x_pos, pos;
+       unsigned long flags;
 
        spin_lock_irqsave(&uart->port.lock, flags);
 
@@ -445,6 +503,13 @@ static irqreturn_t bfin_serial_dma_tx_int(int irq, void *dev_id)
        struct bfin_serial_port *uart = dev_id;
        struct circ_buf *xmit = &uart->port.info->xmit;
 
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       if (uart->scts && (!bfin_serial_get_mctrl(&uart->port)&TIOCM_CTS)) {
+               uart->scts = 0;
+               uart_handle_cts_change(&uart->port, uart->scts);
+       }
+#endif
+
        spin_lock(&uart->port.lock);
        if (!(get_dma_curr_irqstat(uart->tx_dma_channel)&DMA_RUN)) {
                disable_dma(uart->tx_dma_channel);
@@ -493,61 +558,6 @@ static unsigned int bfin_serial_tx_empty(struct uart_port *port)
                return 0;
 }
 
-static unsigned int bfin_serial_get_mctrl(struct uart_port *port)
-{
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
-       if (uart->cts_pin < 0)
-               return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
-
-       if (UART_GET_CTS(uart))
-               return TIOCM_DSR | TIOCM_CAR;
-       else
-#endif
-               return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
-}
-
-static void bfin_serial_set_mctrl(struct uart_port *port, unsigned int mctrl)
-{
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
-       if (uart->rts_pin < 0)
-               return;
-
-       if (mctrl & TIOCM_RTS)
-               UART_CLEAR_RTS(uart);
-       else
-               UART_SET_RTS(uart);
-#endif
-}
-
-/*
- * Handle any change of modem status signal since we were last called.
- */
-static void bfin_serial_mctrl_check(struct bfin_serial_port *uart)
-{
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-       unsigned int status;
-       struct uart_info *info = uart->port.info;
-       struct tty_struct *tty = info->port.tty;
-
-       status = bfin_serial_get_mctrl(&uart->port);
-       uart_handle_cts_change(&uart->port, status & TIOCM_CTS);
-       if (!(status & TIOCM_CTS)) {
-               tty->hw_stopped = 1;
-               uart->cts_timer.data = (unsigned long)(uart);
-               uart->cts_timer.function = (void *)bfin_serial_mctrl_check;
-               uart->cts_timer.expires = jiffies + CTS_CHECK_JIFFIES;
-               add_timer(&(uart->cts_timer));
-       } else {
-               tty->hw_stopped = 0;
-       }
-#endif
-}
-
-/*
- * Interrupts are always disabled.
- */
 static void bfin_serial_break_ctl(struct uart_port *port, int break_state)
 {
        struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
@@ -603,7 +613,7 @@ static int bfin_serial_startup(struct uart_port *port)
        uart->rx_dma_timer.expires = jiffies + DMA_RX_FLUSH_JIFFIES;
        add_timer(&(uart->rx_dma_timer));
 #else
-#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+# if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
        defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
        if (kgdboc_port_line == uart->port.line && kgdboc_break_enabled)
                kgdboc_break_enabled = 0;
@@ -658,11 +668,50 @@ static int bfin_serial_startup(struct uart_port *port)
                }
        }
 # endif
-#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+# if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
        defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
        }
 # endif
 #endif
+
+#ifdef CONFIG_SERIAL_BFIN_CTSRTS
+       if (uart->cts_pin >= 0) {
+               if (request_irq(gpio_to_irq(uart->cts_pin),
+                       bfin_serial_mctrl_cts_int,
+                       IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
+                       IRQF_DISABLED, "BFIN_UART_CTS", uart)) {
+                       uart->cts_pin = -1;
+                       pr_info("Unable to attach BlackFin UART CTS interrupt.\
+                                So, disable it.\n");
+               }
+       }
+       if (uart->rts_pin >= 0) {
+               gpio_request(uart->rts_pin, DRIVER_NAME);
+               gpio_direction_output(uart->rts_pin, 0);
+       }
+#endif
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       if (request_irq(uart->status_irq,
+               bfin_serial_mctrl_cts_int,
+               IRQF_DISABLED, "BFIN_UART_MODEM_STATUS", uart)) {
+               pr_info("Unable to attach BlackFin UART Modem \
+                       Status interrupt.\n");
+       }
+
+       if (uart->cts_pin >= 0) {
+               gpio_request(uart->cts_pin, DRIVER_NAME);
+               gpio_direction_output(uart->cts_pin, 1);
+       }
+       if (uart->rts_pin >= 0) {
+               gpio_request(uart->rts_pin, DRIVER_NAME);
+               gpio_direction_output(uart->rts_pin, 0);
+       }
+
+       /* CTS RTS PINs are negative assertive. */
+       UART_PUT_MCR(uart, ACTS);
+       UART_SET_IER(uart, EDSSI);
+#endif
+
        UART_SET_IER(uart, ERBFI);
        return 0;
 }
@@ -696,6 +745,21 @@ static void bfin_serial_shutdown(struct uart_port *port)
        free_irq(uart->port.irq, uart);
        free_irq(uart->port.irq+1, uart);
 #endif
+
+#ifdef CONFIG_SERIAL_BFIN_CTSRTS
+       if (uart->cts_pin >= 0)
+               free_irq(gpio_to_irq(uart->cts_pin), uart);
+       if (uart->rts_pin >= 0)
+               gpio_free(uart->rts_pin);
+#endif
+#ifdef CONFIG_SERIAL_BFIN_HARD_CTSRTS
+       if (uart->cts_pin >= 0)
+               gpio_free(uart->cts_pin);
+       if (uart->rts_pin >= 0)
+               gpio_free(uart->rts_pin);
+       if (UART_GET_IER(uart) && EDSSI)
+               free_irq(uart->status_irq, uart);
+#endif
 }
 
 static void
@@ -757,7 +821,7 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios,
        }
 
        baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
-       quot = uart_get_divisor(port, baud);
+       quot = uart_get_divisor(port, baud) - ANOMALY_05000230;
        spin_lock_irqsave(&uart->port.lock, flags);
 
        UART_SET_ANOMALY_THRESHOLD(uart, USEC_PER_SEC / baud * 15);
@@ -861,6 +925,20 @@ static void bfin_serial_set_ldisc(struct uart_port *port)
        }
 }
 
+static void bfin_serial_reset_irda(struct uart_port *port)
+{
+       int line = port->line;
+       unsigned short val;
+
+       val = UART_GET_GCTL(&bfin_serial_ports[line]);
+       val &= ~(IREN | RPOLC);
+       UART_PUT_GCTL(&bfin_serial_ports[line], val);
+       SSYNC();
+       val |= (IREN | RPOLC);
+       UART_PUT_GCTL(&bfin_serial_ports[line], val);
+       SSYNC();
+}
+
 #ifdef CONFIG_CONSOLE_POLL
 static void bfin_serial_poll_put_char(struct uart_port *port, unsigned char chr)
 {
@@ -906,20 +984,6 @@ static int bfin_kgdboc_port_startup(struct uart_port *port)
 }
 #endif
 
-static void bfin_serial_reset_irda(struct uart_port *port)
-{
-       int line = port->line;
-       unsigned short val;
-
-       val = UART_GET_GCTL(&bfin_serial_ports[line]);
-       val &= ~(IREN | RPOLC);
-       UART_PUT_GCTL(&bfin_serial_ports[line], val);
-       SSYNC();
-       val |= (IREN | RPOLC);
-       UART_PUT_GCTL(&bfin_serial_ports[line], val);
-       SSYNC();
-}
-
 static struct uart_ops bfin_serial_pops = {
        .tx_empty       = bfin_serial_tx_empty,
        .set_mctrl      = bfin_serial_set_mctrl,
@@ -949,6 +1013,39 @@ static struct uart_ops bfin_serial_pops = {
 #endif
 };
 
+static void __init bfin_serial_hw_init(void)
+{
+#ifdef CONFIG_SERIAL_BFIN_UART0
+       peripheral_request(P_UART0_TX, DRIVER_NAME);
+       peripheral_request(P_UART0_RX, DRIVER_NAME);
+#endif
+
+#ifdef CONFIG_SERIAL_BFIN_UART1
+       peripheral_request(P_UART1_TX, DRIVER_NAME);
+       peripheral_request(P_UART1_RX, DRIVER_NAME);
+
+# if defined(CONFIG_BFIN_UART1_CTSRTS) && defined(CONFIG_BF54x)
+       peripheral_request(P_UART1_RTS, DRIVER_NAME);
+       peripheral_request(P_UART1_CTS, DRIVER_NAME);
+# endif
+#endif
+
+#ifdef CONFIG_SERIAL_BFIN_UART2
+       peripheral_request(P_UART2_TX, DRIVER_NAME);
+       peripheral_request(P_UART2_RX, DRIVER_NAME);
+#endif
+
+#ifdef CONFIG_SERIAL_BFIN_UART3
+       peripheral_request(P_UART3_TX, DRIVER_NAME);
+       peripheral_request(P_UART3_RX, DRIVER_NAME);
+
+# if defined(CONFIG_BFIN_UART3_CTSRTS) && defined(CONFIG_BF54x)
+       peripheral_request(P_UART3_RTS, DRIVER_NAME);
+       peripheral_request(P_UART3_CTS, DRIVER_NAME);
+# endif
+#endif
+}
+
 static void __init bfin_serial_init_ports(void)
 {
        static int first = 1;
@@ -958,6 +1055,8 @@ static void __init bfin_serial_init_ports(void)
                return;
        first = 0;
 
+       bfin_serial_hw_init();
+
        for (i = 0; i < nr_active_ports; i++) {
                bfin_serial_ports[i].port.uartclk   = get_sclk();
                bfin_serial_ports[i].port.fifosize  = BFIN_UART_TX_FIFO_SIZE;
@@ -970,6 +1069,8 @@ static void __init bfin_serial_init_ports(void)
                        bfin_serial_resource[i].uart_base_addr;
                bfin_serial_ports[i].port.irq       =
                        bfin_serial_resource[i].uart_irq;
+               bfin_serial_ports[i].status_irq     =
+                       bfin_serial_resource[i].uart_status_irq;
                bfin_serial_ports[i].port.flags     = UPF_BOOT_AUTOCONF;
 #ifdef CONFIG_SERIAL_BFIN_DMA
                bfin_serial_ports[i].tx_done        = 1;
@@ -980,16 +1081,14 @@ static void __init bfin_serial_init_ports(void)
                        bfin_serial_resource[i].uart_rx_dma_channel;
                init_timer(&(bfin_serial_ports[i].rx_dma_timer));
 #endif
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
-               init_timer(&(bfin_serial_ports[i].cts_timer));
+#if defined(CONFIG_SERIAL_BFIN_CTSRTS) || \
+       defined(CONFIG_SERIAL_BFIN_HARD_CTSRTS)
                bfin_serial_ports[i].cts_pin        =
                        bfin_serial_resource[i].uart_cts_pin;
                bfin_serial_ports[i].rts_pin        =
                        bfin_serial_resource[i].uart_rts_pin;
 #endif
-               bfin_serial_hw_init(&bfin_serial_ports[i]);
        }
-
 }
 
 #if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK)
@@ -1046,7 +1145,8 @@ bfin_serial_console_setup(struct console *co, char *options)
        int baud = 57600;
        int bits = 8;
        int parity = 'n';
-# ifdef CONFIG_SERIAL_BFIN_CTSRTS
+# if defined(CONFIG_SERIAL_BFIN_CTSRTS) || \
+       defined(CONFIG_SERIAL_BFIN_HARD_CTSRTS)
        int flow = 'r';
 # else
        int flow = 'n';
@@ -1088,7 +1188,7 @@ static void
 bfin_serial_console_write(struct console *co, const char *s, unsigned int count)
 {
        struct bfin_serial_port *uart = &bfin_serial_ports[co->index];
-       int flags = 0;
+       unsigned long flags;
 
        spin_lock_irqsave(&uart->port.lock, flags);
        uart_console_write(&uart->port, s, count, bfin_serial_console_putchar);
@@ -1243,7 +1343,8 @@ static int bfin_serial_remove(struct platform_device *dev)
                        continue;
                uart_remove_one_port(&bfin_serial_reg, &bfin_serial_ports[i].port);
                bfin_serial_ports[i].port.dev = NULL;
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
+#if defined(CONFIG_SERIAL_BFIN_CTSRTS) || \
+       defined(CONFIG_SERIAL_BFIN_HARD_CTSRTS)
                gpio_free(bfin_serial_ports[i].cts_pin);
                gpio_free(bfin_serial_ports[i].rts_pin);
 #endif
index 5c6ef51da274db66b60e2e83cd2195044b55d252..f8df0681e160da380826b5d7538c79b9ac08af3a 100644 (file)
@@ -1106,6 +1106,10 @@ static int cpm_uart_init_port(struct device_node *np,
        for (i = 0; i < NUM_GPIOS; i++)
                pinfo->gpios[i] = of_get_gpio(np, i);
 
+#ifdef CONFIG_PPC_EARLY_DEBUG_CPM
+       udbg_putc = NULL;
+#endif
+
        return cpm_uart_request_port(&pinfo->port);
 
 out_pram:
@@ -1255,10 +1259,6 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
                        baud = 9600;
        }
 
-#ifdef CONFIG_PPC_EARLY_DEBUG_CPM
-       udbg_putc = NULL;
-#endif
-
        if (IS_SMC(pinfo)) {
                out_be16(&pinfo->smcup->smc_brkcr, 0);
                cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
@@ -1339,13 +1339,13 @@ static int __devinit cpm_uart_probe(struct of_device *ofdev,
 
        dev_set_drvdata(&ofdev->dev, pinfo);
 
+       /* initialize the device pointer for the port */
+       pinfo->port.dev = &ofdev->dev;
+
        ret = cpm_uart_init_port(ofdev->node, pinfo);
        if (ret)
                return ret;
 
-       /* initialize the device pointer for the port */
-       pinfo->port.dev = &ofdev->dev;
-
        return uart_add_one_port(&cpm_reg, &pinfo->port);
 }
 
index e642c22c80e230f8ad5da30a69b9512838cc34b9..7ba7d70f04d6caaa8d8e5ce0cb31aa37bfc1168b 100644 (file)
@@ -1391,7 +1391,7 @@ static inline void e100_disable_rx_irq(struct e100_serial *info)
 #if defined(CONFIG_ETRAX_RS485)
 /* Enable RS-485 mode on selected port. This is UGLY. */
 static int
-e100_enable_rs485(struct tty_struct *tty,struct rs485_control *r)
+e100_enable_rs485(struct tty_struct *tty, struct serial_rs485 *r)
 {
        struct e100_serial * info = (struct e100_serial *)tty->driver_data;
 
@@ -1409,13 +1409,11 @@ e100_enable_rs485(struct tty_struct *tty,struct rs485_control *r)
                       CONFIG_ETRAX_RS485_LTC1387_RXEN_PORT_G_BIT, 1);
 #endif
 
-       info->rs485.rts_on_send = 0x01 & r->rts_on_send;
-       info->rs485.rts_after_sent = 0x01 & r->rts_after_sent;
+       info->rs485.flags = r->flags;
        if (r->delay_rts_before_send >= 1000)
                info->rs485.delay_rts_before_send = 1000;
        else
                info->rs485.delay_rts_before_send = r->delay_rts_before_send;
-       info->rs485.enabled = r->enabled;
 /*     printk("rts: on send = %i, after = %i, enabled = %i",
                    info->rs485.rts_on_send,
                    info->rs485.rts_after_sent,
@@ -1430,17 +1428,18 @@ e100_write_rs485(struct tty_struct *tty,
                  const unsigned char *buf, int count)
 {
        struct e100_serial * info = (struct e100_serial *)tty->driver_data;
-       int old_enabled = info->rs485.enabled;
+       int old_value = (info->rs485.flags) & SER_RS485_ENABLED;
 
        /* rs485 is always implicitly enabled if we're using the ioctl()
-        * but it doesn't have to be set in the rs485_control
+        * but it doesn't have to be set in the serial_rs485
         * (to be backward compatible with old apps)
         * So we store, set and restore it.
         */
-       info->rs485.enabled = 1;
+       info->rs485.flags |= SER_RS485_ENABLED;
        /* rs_write now deals with RS485 if enabled */
        count = rs_write(tty, buf, count);
-       info->rs485.enabled = old_enabled;
+       if (!old_value)
+               info->rs485.flags &= ~(SER_RS485_ENABLED);
        return count;
 }
 
@@ -1451,7 +1450,7 @@ static void rs485_toggle_rts_timer_function(unsigned long data)
        struct e100_serial *info = (struct e100_serial *)data;
 
        fast_timers_rs485[info->line].function = NULL;
-       e100_rts(info, info->rs485.rts_after_sent);
+       e100_rts(info, (info->rs485.flags & SER_RS485_RTS_AFTER_SEND));
 #if defined(CONFIG_ETRAX_RS485_DISABLE_RECEIVER)
        e100_enable_rx(info);
        e100_enable_rx_irq(info);
@@ -1647,7 +1646,7 @@ transmit_chars_dma(struct e100_serial *info)
                info->tr_running = 0;
 
 #if defined(CONFIG_ETRAX_RS485) && defined(CONFIG_ETRAX_FAST_TIMER)
-               if (info->rs485.enabled) {
+               if (info->rs485.flags & SER_RS485_ENABLED) {
                        /* Set a short timer to toggle RTS */
                        start_one_shot_timer(&fast_timers_rs485[info->line],
                                             rs485_toggle_rts_timer_function,
@@ -2577,7 +2576,7 @@ static void handle_ser_tx_interrupt(struct e100_serial *info)
        info->icount.tx++;
        if (info->xmit.head == info->xmit.tail) {
 #if defined(CONFIG_ETRAX_RS485) && defined(CONFIG_ETRAX_FAST_TIMER)
-               if (info->rs485.enabled) {
+               if (info->rs485.flags & SER_RS485_ENABLED) {
                        /* Set a short timer to toggle RTS */
                        start_one_shot_timer(&fast_timers_rs485[info->line],
                                             rs485_toggle_rts_timer_function,
@@ -3218,7 +3217,7 @@ rs_write(struct tty_struct *tty,
 #if defined(CONFIG_ETRAX_RS485)
        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
 
-       if (info->rs485.enabled)
+       if (info->rs485.flags & SER_RS485_ENABLED)
        {
                /* If we are in RS-485 mode, we need to toggle RTS and disable
                 * the receiver before initiating a DMA transfer
@@ -3228,7 +3227,7 @@ rs_write(struct tty_struct *tty,
                fast_timers_rs485[info->line].function = NULL;
                del_fast_timer(&fast_timers_rs485[info->line]);
 #endif
-               e100_rts(info, info->rs485.rts_on_send);
+               e100_rts(info, (info->rs485.flags & SER_RS485_RTS_ON_SEND));
 #if defined(CONFIG_ETRAX_RS485_DISABLE_RECEIVER)
                e100_disable_rx(info);
                e100_enable_rx_irq(info);
@@ -3242,7 +3241,7 @@ rs_write(struct tty_struct *tty,
        count = rs_raw_write(tty, buf, count);
 
 #if defined(CONFIG_ETRAX_RS485)
-       if (info->rs485.enabled)
+       if (info->rs485.flags & SER_RS485_ENABLED)
        {
                unsigned int val;
                /* If we are in RS-485 mode the following has to be done:
@@ -3263,7 +3262,7 @@ rs_write(struct tty_struct *tty,
                        get_lsr_info(info, &val);
                }while (!(val & TIOCSER_TEMT));
 
-               e100_rts(info, info->rs485.rts_after_sent);
+               e100_rts(info, (info->rs485.flags & SER_RS485_RTS_AFTER_SEND));
 
 #if defined(CONFIG_ETRAX_RS485_DISABLE_RECEIVER)
                e100_enable_rx(info);
@@ -3678,14 +3677,52 @@ rs_ioctl(struct tty_struct *tty, struct file * file,
 #if defined(CONFIG_ETRAX_RS485)
        case TIOCSERSETRS485:
        {
+               /* In this ioctl we still use the old structure
+                * rs485_control for backward compatibility
+                * (if we use serial_rs485, then old user-level code
+                * wouldn't work anymore...).
+                * The use of this ioctl is deprecated: use TIOCSRS485
+                * instead.*/
                struct rs485_control rs485ctrl;
+               struct serial_rs485 rs485data;
+               printk(KERN_DEBUG "The use of this ioctl is deprecated. Use TIOCSRS485 instead\n");
                if (copy_from_user(&rs485ctrl, (struct rs485_control *)arg,
                                sizeof(rs485ctrl)))
                        return -EFAULT;
 
-               return e100_enable_rs485(tty, &rs485ctrl);
+               rs485data.delay_rts_before_send = rs485ctrl.delay_rts_before_send;
+               rs485data.flags = 0;
+               if (rs485ctrl.enabled)
+                       rs485data.flags |= SER_RS485_ENABLED;
+               else
+                       rs485data.flags &= ~(SER_RS485_ENABLED);
+
+               if (rs485ctrl.rts_on_send)
+                       rs485data.flags |= SER_RS485_RTS_ON_SEND;
+               else
+                       rs485data.flags &= ~(SER_RS485_RTS_ON_SEND);
+
+               if (rs485ctrl.rts_after_sent)
+                       rs485data.flags |= SER_RS485_RTS_AFTER_SEND;
+               else
+                       rs485data.flags &= ~(SER_RS485_RTS_AFTER_SEND);
+
+               return e100_enable_rs485(tty, &rs485data);
        }
 
+       case TIOCSRS485:
+       {
+               /* This is the new version of TIOCSRS485, with new
+                * data structure serial_rs485 */
+               struct serial_rs485 rs485data;
+               if (copy_from_user(&rs485data, (struct rs485_control *)arg,
+                               sizeof(rs485data)))
+                       return -EFAULT;
+
+               return e100_enable_rs485(tty, &rs485data);
+       }
+
+
        case TIOCSERWRRS485:
        {
                struct rs485_write rs485wr;
@@ -3827,8 +3864,8 @@ rs_close(struct tty_struct *tty, struct file * filp)
        /* port closed */
 
 #if defined(CONFIG_ETRAX_RS485)
-       if (info->rs485.enabled) {
-               info->rs485.enabled = 0;
+       if (info->rs485.flags & SER_RS485_ENABLED) {
+               info->rs485.flags &= ~(SER_RS485_ENABLED);
 #if defined(CONFIG_ETRAX_RS485_ON_PA)
                *R_PORT_PA_DATA = port_pa_data_shadow &= ~(1 << rs485_pa_bit);
 #endif
@@ -4493,10 +4530,10 @@ rs_init(void)
 
 #if defined(CONFIG_ETRAX_RS485)
                /* Set sane defaults */
-               info->rs485.rts_on_send = 0;
-               info->rs485.rts_after_sent = 1;
+               info->rs485.flags &= ~(SER_RS485_RTS_ON_SEND);
+               info->rs485.flags |= SER_RS485_RTS_AFTER_SEND;
                info->rs485.delay_rts_before_send = 0;
-               info->rs485.enabled = 0;
+               info->rs485.flags &= ~(SER_RS485_ENABLED);
 #endif
                INIT_WORK(&info->work, do_softint);
 
index f36a729280bcb938919690c5a28bb6bf48ee8e0a..ea0beb46a10d1ae40eb43737d1696a4d7df70576 100644 (file)
@@ -125,7 +125,7 @@ struct e100_serial {
        int errorcode;
 
 #ifdef CONFIG_ETRAX_RS485
-       struct rs485_control    rs485;  /* RS-485 support */
+       struct serial_rs485     rs485;  /* RS-485 support */
 #endif
 };
 
index 2b7531d9f6abcfa72c9872bcea48ef9a5cf593c6..6579e2be1dd133a60fb9d63c0ec06bd02d941687 100644 (file)
@@ -1098,7 +1098,6 @@ static void icom_set_termios(struct uart_port *port,
 {
        int baud;
        unsigned cflag, iflag;
-       int bits;
        char new_config2;
        char new_config3 = 0;
        char tmp_byte;
@@ -1119,34 +1118,27 @@ static void icom_set_termios(struct uart_port *port,
        switch (cflag & CSIZE) {
        case CS5:               /* 5 bits/char */
                new_config2 |= ICOM_ACFG_5BPC;
-               bits = 7;
                break;
        case CS6:               /* 6 bits/char */
                new_config2 |= ICOM_ACFG_6BPC;
-               bits = 8;
                break;
        case CS7:               /* 7 bits/char */
                new_config2 |= ICOM_ACFG_7BPC;
-               bits = 9;
                break;
        case CS8:               /* 8 bits/char */
                new_config2 |= ICOM_ACFG_8BPC;
-               bits = 10;
                break;
        default:
-               bits = 10;
                break;
        }
        if (cflag & CSTOPB) {
                /* 2 stop bits */
                new_config2 |= ICOM_ACFG_2STOP_BIT;
-               bits++;
        }
        if (cflag & PARENB) {
                /* parity bit enabled */
                new_config2 |= ICOM_ACFG_PARITY_ENAB;
                trace(ICOM_PORT, "PARENB", 0);
-               bits++;
        }
        if (cflag & PARODD) {
                /* odd parity */
@@ -1322,7 +1314,6 @@ static struct uart_driver icom_uart_driver = {
 static int __devinit icom_init_ports(struct icom_adapter *icom_adapter)
 {
        u32 subsystem_id = icom_adapter->subsystem_id;
-       int retval = 0;
        int i;
        struct icom_port *icom_port;
 
@@ -1368,7 +1359,7 @@ static int __devinit icom_init_ports(struct icom_adapter *icom_adapter)
                }
        }
 
-       return retval;
+       return 0;
 }
 
 static void icom_port_active(struct icom_port *icom_port, struct icom_adapter *icom_adapter, int port_num)
@@ -1391,7 +1382,6 @@ static int __devinit icom_load_ports(struct icom_adapter *icom_adapter)
 {
        struct icom_port *icom_port;
        int port_num;
-       int retval;
 
        for (port_num = 0; port_num < icom_adapter->numb_ports; port_num++) {
 
@@ -1405,7 +1395,7 @@ static int __devinit icom_load_ports(struct icom_adapter *icom_adapter)
                        icom_port->adapter = icom_adapter;
 
                        /* get port memory */
-                       if ((retval = get_port_memory(icom_port)) != 0) {
+                       if (get_port_memory(icom_port) != 0) {
                                dev_err(&icom_port->adapter->pci_dev->dev,
                                        "Memory allocation for port FAILED\n");
                        }
index ac79cbe4c2cf40e2e5512a4607d517c120784757..d2d32a19862961a06e6ecd0738d5e3877ade07a0 100644 (file)
@@ -52,12 +52,11 @@ int jsm_debug;
 module_param(jsm_debug, int, 0);
 MODULE_PARM_DESC(jsm_debug, "Driver debugging level");
 
-static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+static int __devinit jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int rc = 0;
        struct jsm_board *brd;
        static int adapter_count = 0;
-       int retval;
 
        rc = pci_enable_device(pdev);
        if (rc) {
@@ -134,7 +133,7 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        rc = jsm_tty_init(brd);
        if (rc < 0) {
                dev_err(&pdev->dev, "Can't init tty devices (%d)\n", rc);
-               retval = -ENXIO;
+               rc = -ENXIO;
                goto out_free_irq;
        }
 
@@ -142,7 +141,7 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (rc < 0) {
                /* XXX: leaking all resources from jsm_tty_init here! */
                dev_err(&pdev->dev, "Can't init uart port (%d)\n", rc);
-               retval = -ENXIO;
+               rc = -ENXIO;
                goto out_free_irq;
        }
 
@@ -161,7 +160,7 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                /* XXX: leaking all resources from jsm_tty_init and
                        jsm_uart_port_init here! */
                dev_err(&pdev->dev, "memory allocation for flipbuf failed\n");
-               retval = -ENOMEM;
+               rc = -ENOMEM;
                goto out_free_irq;
        }
 
index e6390d023634ce978beced44b34299656b846faa..9dadaa11d266c0643ad587cf91201c0453785883 100644 (file)
@@ -533,7 +533,6 @@ static void neo_copy_data_from_queue_to_uart(struct jsm_channel *ch)
        if (!(ch->ch_flags & (CH_TX_FIFO_EMPTY | CH_TX_FIFO_LWM)))
                return;
 
-       len_written = 0;
        n = UART_17158_TX_FIFOSIZE - ch->ch_t_tlevel;
 
        /* cache head and tail of queue */
@@ -619,14 +618,10 @@ static void neo_parse_modem(struct jsm_channel *ch, u8 signals)
 /* Make the UART raise any of the output signals we want up */
 static void neo_assert_modem_signals(struct jsm_channel *ch)
 {
-       u8 out;
-
        if (!ch)
                return;
 
-       out = ch->ch_mostat;
-
-       writeb(out, &ch->ch_neo_uart->mcr);
+       writeb(ch->ch_mostat, &ch->ch_neo_uart->mcr);
 
        /* flush write operation */
        neo_pci_posting_flush(ch->ch_bd);
@@ -936,10 +931,9 @@ static inline void neo_parse_lsr(struct jsm_board *brd, u32 port)
 static void neo_param(struct jsm_channel *ch)
 {
        u8 lcr = 0;
-       u8 uart_lcr = 0;
-       u8 ier = 0;
-       u32 baud = 9600;
-       int quot = 0;
+       u8 uart_lcr, ier;
+       u32 baud;
+       int quot;
        struct jsm_board *bd;
 
        bd = ch->ch_bd;
index 324c74d2f6660939d42b62dd2b5239de1395877a..31496dc0a0d17d65206cb14ba280a6a5ffe29229 100644 (file)
@@ -183,7 +183,6 @@ static void jsm_tty_break(struct uart_port *port, int break_state)
 static int jsm_tty_open(struct uart_port *port)
 {
        struct jsm_board *brd;
-       int rc = 0;
        struct jsm_channel *channel = (struct jsm_channel *)port;
        struct ktermios *termios;
 
@@ -265,7 +264,7 @@ static int jsm_tty_open(struct uart_port *port)
        channel->ch_open_count++;
 
        jsm_printk(OPEN, INFO, &channel->ch_bd->pci_dev, "finish\n");
-       return rc;
+       return 0;
 }
 
 static void jsm_tty_close(struct uart_port *port)
@@ -367,7 +366,7 @@ static struct uart_ops jsm_ops = {
  * Init the tty subsystem.  Called once per board after board has been
  * downloaded and init'ed.
  */
-int jsm_tty_init(struct jsm_board *brd)
+int __devinit jsm_tty_init(struct jsm_board *brd)
 {
        int i;
        void __iomem *vaddr;
@@ -431,7 +430,7 @@ int jsm_tty_init(struct jsm_board *brd)
        return 0;
 }
 
-int jsm_uart_port_init(struct jsm_board *brd)
+int __devinit jsm_uart_port_init(struct jsm_board *brd)
 {
        int i;
        struct jsm_channel *ch;
@@ -748,7 +747,7 @@ static void jsm_carrier(struct jsm_channel *ch)
 void jsm_check_queue_flow_control(struct jsm_channel *ch)
 {
        struct board_ops *bd_ops = ch->ch_bd->bd_ops;
-       int qleft = 0;
+       int qleft;
 
        /* Store how much space we have left in the queue */
        if ((qleft = ch->ch_r_tail - ch->ch_r_head - 1) < 0)
@@ -834,7 +833,7 @@ void jsm_check_queue_flow_control(struct jsm_channel *ch)
  */
 int jsm_tty_write(struct uart_port *port)
 {
-       int bufcount = 0, n = 0;
+       int bufcount;
        int data_count = 0,data_count1 =0;
        u16 head;
        u16 tail;
@@ -850,14 +849,12 @@ int jsm_tty_write(struct uart_port *port)
        if ((bufcount = tail - head - 1) < 0)
                bufcount += WQUEUESIZE;
 
-       n = bufcount;
-
-       n = min(n, 56);
+       bufcount = min(bufcount, 56);
        remain = WQUEUESIZE - head;
 
        data_count = 0;
-       if (n >= remain) {
-               n -= remain;
+       if (bufcount >= remain) {
+               bufcount -= remain;
                while ((port->info->xmit.head != temp_tail) &&
                (data_count < remain)) {
                        channel->ch_wqueue[head++] =
@@ -871,8 +868,8 @@ int jsm_tty_write(struct uart_port *port)
        }
 
        data_count1 = 0;
-       if (n > 0) {
-               remain = n;
+       if (bufcount > 0) {
+               remain = bufcount;
                while ((port->info->xmit.head != temp_tail) &&
                        (data_count1 < remain)) {
                        channel->ch_wqueue[head++] =
index ad3488504010f2ebe66055fa3878eae07fcacabb..9c1243fbd512348f7b06c1b9adc9a5abf3b2d582 100644 (file)
@@ -1538,6 +1538,21 @@ no_dma:
        uap->port.type = PORT_PMAC_ZILOG;
        uap->port.flags = 0;
 
+       /*
+        * Fixup for the port on Gatwick for which the device-tree has
+        * missing interrupts. Normally, the macio_dev would contain
+        * fixed up interrupt info, but we use the device-tree directly
+        * here due to early probing so we need the fixup too.
+        */
+       if (uap->port.irq == NO_IRQ &&
+           np->parent && np->parent->parent &&
+           of_device_is_compatible(np->parent->parent, "gatwick")) {
+               /* IRQs on gatwick are offset by 64 */
+               uap->port.irq = irq_create_mapping(NULL, 64 + 15);
+               uap->tx_dma_irq = irq_create_mapping(NULL, 64 + 4);
+               uap->rx_dma_irq = irq_create_mapping(NULL, 64 + 5);
+       }
+
        /* Setup some valid baud rate information in the register
         * shadows so we don't write crap there before baud rate is
         * first initialized.
index 315a9333ca3cd1b7723197c74d0ebec1fe6fcdf3..7de66c06b05de5da9e08e84163d83645cf33106c 100644 (file)
@@ -1274,6 +1274,7 @@ static int ucc_uart_probe(struct of_device *ofdev,
        if (!iprop) {
                iprop = of_get_property(np, "device-id", NULL);
                if (!iprop) {
+                       kfree(qe_port);
                        dev_err(&ofdev->dev, "UCC is unspecified in "
                                "device tree\n");
                        return -EINVAL;
index a0aa33dde0a43dc36b1acbae9f9f22da5c39c065..816d4c592a3ca6d609e4c9481ad2e4ef2ee05a9c 100644 (file)
@@ -617,9 +617,9 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
        pci_set_master(pdev);
 
 #ifdef USE_64BIT_DMA
-        ret = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+        ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
         if (!ret) {
-                ret = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+                ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
                 if (ret < 0) {
                         printk(KERN_WARNING "%s: Unable to obtain 64 bit DMA "
                                "for consistent allocations\n",
index 33fcef3150d4c63ae0ef67b24b7566ef495bd145..c1688c71f052e252acdad47df85bae6f4fe5282a 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/workqueue.h>
 #include <linux/delay.h>
 #include <linux/clk.h>
+#include <linux/gpio.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -53,6 +54,7 @@ MODULE_ALIAS("platform:pxa2xx-spi");
 #define RESET_DMA_CHANNEL      (DCSR_NODESC | DMA_INT_MASK)
 #define IS_DMA_ALIGNED(x)      ((((u32)(x)) & 0x07) == 0)
 #define MAX_DMA_LEN            8191
+#define DMA_ALIGNMENT          8
 
 /*
  * for testing SSCR1 changes that require SSP restart, basically
@@ -166,6 +168,8 @@ struct chip_data {
        u8 enable_dma;
        u8 bits_per_word;
        u32 speed_hz;
+       int gpio_cs;
+       int gpio_cs_inverted;
        int (*write)(struct driver_data *drv_data);
        int (*read)(struct driver_data *drv_data);
        void (*cs_control)(u32 command);
@@ -173,6 +177,32 @@ struct chip_data {
 
 static void pump_messages(struct work_struct *work);
 
+static void cs_assert(struct driver_data *drv_data)
+{
+       struct chip_data *chip = drv_data->cur_chip;
+
+       if (chip->cs_control) {
+               chip->cs_control(PXA2XX_CS_ASSERT);
+               return;
+       }
+
+       if (gpio_is_valid(chip->gpio_cs))
+               gpio_set_value(chip->gpio_cs, chip->gpio_cs_inverted);
+}
+
+static void cs_deassert(struct driver_data *drv_data)
+{
+       struct chip_data *chip = drv_data->cur_chip;
+
+       if (chip->cs_control) {
+               chip->cs_control(PXA2XX_CS_ASSERT);
+               return;
+       }
+
+       if (gpio_is_valid(chip->gpio_cs))
+               gpio_set_value(chip->gpio_cs, !chip->gpio_cs_inverted);
+}
+
 static int flush(struct driver_data *drv_data)
 {
        unsigned long limit = loops_per_jiffy << 1;
@@ -189,10 +219,6 @@ static int flush(struct driver_data *drv_data)
        return limit;
 }
 
-static void null_cs_control(u32 command)
-{
-}
-
 static int null_writer(struct driver_data *drv_data)
 {
        void __iomem *reg = drv_data->ioaddr;
@@ -400,7 +426,6 @@ static void giveback(struct driver_data *drv_data)
        msg = drv_data->cur_msg;
        drv_data->cur_msg = NULL;
        drv_data->cur_transfer = NULL;
-       drv_data->cur_chip = NULL;
        queue_work(drv_data->workqueue, &drv_data->pump_messages);
        spin_unlock_irqrestore(&drv_data->lock, flags);
 
@@ -416,7 +441,7 @@ static void giveback(struct driver_data *drv_data)
         * a message with an error, or next message is for another chip
         */
        if (!last_transfer->cs_change)
-               drv_data->cs_control(PXA2XX_CS_DEASSERT);
+               cs_deassert(drv_data);
        else {
                struct spi_message *next_msg;
 
@@ -445,12 +470,14 @@ static void giveback(struct driver_data *drv_data)
                if (next_msg && next_msg->spi != msg->spi)
                        next_msg = NULL;
                if (!next_msg || msg->state == ERROR_STATE)
-                       drv_data->cs_control(PXA2XX_CS_DEASSERT);
+                       cs_deassert(drv_data);
        }
 
        msg->state = NULL;
        if (msg->complete)
                msg->complete(msg->context);
+
+       drv_data->cur_chip = NULL;
 }
 
 static int wait_ssp_rx_stall(void const __iomem *ioaddr)
@@ -887,7 +914,7 @@ static void pump_transfers(unsigned long data)
 
                /* Drop chip select only if cs_change is requested */
                if (previous->cs_change)
-                       drv_data->cs_control(PXA2XX_CS_DEASSERT);
+                       cs_deassert(drv_data);
        }
 
        /* Check for transfers that need multiple DMA segments */
@@ -922,7 +949,6 @@ static void pump_transfers(unsigned long data)
        }
        drv_data->n_bytes = chip->n_bytes;
        drv_data->dma_width = chip->dma_width;
-       drv_data->cs_control = chip->cs_control;
        drv_data->tx = (void *)transfer->tx_buf;
        drv_data->tx_end = drv_data->tx + transfer->len;
        drv_data->rx = transfer->rx_buf;
@@ -1084,11 +1110,7 @@ static void pump_transfers(unsigned long data)
                        write_SSTO(chip->timeout, reg);
        }
 
-       /* FIXME, need to handle cs polarity,
-        * this driver uses struct pxa2xx_spi_chip.cs_control to
-        * specify a CS handling function, and it ignores most
-        * struct spi_device.mode[s], including SPI_CS_HIGH */
-       drv_data->cs_control(PXA2XX_CS_ASSERT);
+       cs_assert(drv_data);
 
        /* after chip select, release the data by enabling service
         * requests and interrupts, without changing any mode bits */
@@ -1166,6 +1188,44 @@ static int transfer(struct spi_device *spi, struct spi_message *msg)
 /* the spi->mode bits understood by this driver: */
 #define MODEBITS (SPI_CPOL | SPI_CPHA)
 
+static int setup_cs(struct spi_device *spi, struct chip_data *chip,
+                   struct pxa2xx_spi_chip *chip_info)
+{
+       int err = 0;
+
+       if (chip == NULL || chip_info == NULL)
+               return 0;
+
+       /* NOTE: setup() can be called multiple times, possibly with
+        * different chip_info, release previously requested GPIO
+        */
+       if (gpio_is_valid(chip->gpio_cs))
+               gpio_free(chip->gpio_cs);
+
+       /* If (*cs_control) is provided, ignore GPIO chip select */
+       if (chip_info->cs_control) {
+               chip->cs_control = chip_info->cs_control;
+               return 0;
+       }
+
+       if (gpio_is_valid(chip_info->gpio_cs)) {
+               err = gpio_request(chip_info->gpio_cs, "SPI_CS");
+               if (err) {
+                       dev_err(&spi->dev, "failed to request chip select "
+                                       "GPIO%d\n", chip_info->gpio_cs);
+                       return err;
+               }
+
+               chip->gpio_cs = chip_info->gpio_cs;
+               chip->gpio_cs_inverted = spi->mode & SPI_CS_HIGH;
+
+               err = gpio_direction_output(chip->gpio_cs,
+                                       !chip->gpio_cs_inverted);
+       }
+
+       return err;
+}
+
 static int setup(struct spi_device *spi)
 {
        struct pxa2xx_spi_chip *chip_info = NULL;
@@ -1211,7 +1271,7 @@ static int setup(struct spi_device *spi)
                        return -ENOMEM;
                }
 
-               chip->cs_control = null_cs_control;
+               chip->gpio_cs = -1;
                chip->enable_dma = 0;
                chip->timeout = TIMOUT_DFLT;
                chip->dma_burst_size = drv_data->master_info->enable_dma ?
@@ -1225,8 +1285,6 @@ static int setup(struct spi_device *spi)
        /* chip_info isn't always needed */
        chip->cr1 = 0;
        if (chip_info) {
-               if (chip_info->cs_control)
-                       chip->cs_control = chip_info->cs_control;
                if (chip_info->timeout)
                        chip->timeout = chip_info->timeout;
                if (chip_info->tx_threshold)
@@ -1308,13 +1366,16 @@ static int setup(struct spi_device *spi)
 
        spi_set_ctldata(spi, chip);
 
-       return 0;
+       return setup_cs(spi, chip, chip_info);
 }
 
 static void cleanup(struct spi_device *spi)
 {
        struct chip_data *chip = spi_get_ctldata(spi);
 
+       if (gpio_is_valid(chip->gpio_cs))
+               gpio_free(chip->gpio_cs);
+
        kfree(chip);
 }
 
@@ -1438,6 +1499,7 @@ static int __init pxa2xx_spi_probe(struct platform_device *pdev)
 
        master->bus_num = pdev->id;
        master->num_chipselect = platform_info->num_chipselect;
+       master->dma_alignment = DMA_ALIGNMENT;
        master->cleanup = cleanup;
        master->setup = setup;
        master->transfer = transfer;
index 3410b0c55ed2a8562713c376bc38fbfc8b711e54..f014cc21e8131051542a0641129ce9018ec51020 100644 (file)
 #include <asm/dma.h>
 #include <asm/portmux.h>
 #include <asm/bfin5xx_spi.h>
+#include <asm/cacheflush.h>
 
 #define DRV_NAME       "bfin-spi"
 #define DRV_AUTHOR     "Bryan Wu, Luke Yang"
-#define DRV_DESC       "Blackfin BF5xx on-chip SPI Controller Driver"
+#define DRV_DESC       "Blackfin on-chip SPI Controller Driver"
 #define DRV_VERSION    "1.0"
 
 MODULE_AUTHOR(DRV_AUTHOR);
 MODULE_DESCRIPTION(DRV_DESC);
 MODULE_LICENSE("GPL");
 
-#define IS_DMA_ALIGNED(x) (((u32)(x)&0x07) == 0)
-
 #define START_STATE    ((void *)0)
 #define RUNNING_STATE  ((void *)1)
 #define DONE_STATE     ((void *)2)
@@ -44,6 +43,9 @@ MODULE_LICENSE("GPL");
 #define QUEUE_RUNNING  0
 #define QUEUE_STOPPED  1
 
+/* Value to send if no TX value is supplied */
+#define SPI_IDLE_TXVAL 0x0000
+
 struct driver_data {
        /* Driver model hookup */
        struct platform_device *pdev;
@@ -110,6 +112,8 @@ struct chip_data {
        u8 bits_per_word;       /* 8 or 16 */
        u8 cs_change_per_word;
        u16 cs_chg_udelay;      /* Some devices require > 255usec delay */
+       u32 cs_gpio;
+       u16 idle_tx_val;
        void (*write) (struct driver_data *);
        void (*read) (struct driver_data *);
        void (*duplex) (struct driver_data *);
@@ -154,10 +158,13 @@ static u16 hz_to_spi_baud(u32 speed_hz)
        if ((sclk % (2 * speed_hz)) > 0)
                spi_baud++;
 
+       if (spi_baud < MIN_SPI_BAUD_VAL)
+               spi_baud = MIN_SPI_BAUD_VAL;
+
        return spi_baud;
 }
 
-static int flush(struct driver_data *drv_data)
+static int bfin_spi_flush(struct driver_data *drv_data)
 {
        unsigned long limit = loops_per_jiffy << 1;
 
@@ -171,33 +178,40 @@ static int flush(struct driver_data *drv_data)
 }
 
 /* Chip select operation functions for cs_change flag */
-static void cs_active(struct driver_data *drv_data, struct chip_data *chip)
+static void bfin_spi_cs_active(struct driver_data *drv_data, struct chip_data *chip)
 {
-       u16 flag = read_FLAG(drv_data);
+       if (likely(chip->chip_select_num)) {
+               u16 flag = read_FLAG(drv_data);
 
-       flag |= chip->flag;
-       flag &= ~(chip->flag << 8);
+               flag |= chip->flag;
+               flag &= ~(chip->flag << 8);
 
-       write_FLAG(drv_data, flag);
+               write_FLAG(drv_data, flag);
+       } else {
+               gpio_set_value(chip->cs_gpio, 0);
+       }
 }
 
-static void cs_deactive(struct driver_data *drv_data, struct chip_data *chip)
+static void bfin_spi_cs_deactive(struct driver_data *drv_data, struct chip_data *chip)
 {
-       u16 flag = read_FLAG(drv_data);
+       if (likely(chip->chip_select_num)) {
+               u16 flag = read_FLAG(drv_data);
 
-       flag |= (chip->flag << 8);
+               flag &= ~chip->flag;
+               flag |= (chip->flag << 8);
 
-       write_FLAG(drv_data, flag);
+               write_FLAG(drv_data, flag);
+       } else {
+               gpio_set_value(chip->cs_gpio, 1);
+       }
 
        /* Move delay here for consistency */
        if (chip->cs_chg_udelay)
                udelay(chip->cs_chg_udelay);
 }
 
-#define MAX_SPI_SSEL   7
-
 /* stop controller and re-config current chip*/
-static void restore_state(struct driver_data *drv_data)
+static void bfin_spi_restore_state(struct driver_data *drv_data)
 {
        struct chip_data *chip = drv_data->cur_chip;
 
@@ -211,294 +225,256 @@ static void restore_state(struct driver_data *drv_data)
        write_BAUD(drv_data, chip->baud);
 
        bfin_spi_enable(drv_data);
-       cs_active(drv_data, chip);
+       bfin_spi_cs_active(drv_data, chip);
 }
 
-/* used to kick off transfer in rx mode */
-static unsigned short dummy_read(struct driver_data *drv_data)
+/* used to kick off transfer in rx mode and read unwanted RX data */
+static inline void bfin_spi_dummy_read(struct driver_data *drv_data)
 {
-       unsigned short tmp;
-       tmp = read_RDBR(drv_data);
-       return tmp;
+       (void) read_RDBR(drv_data);
 }
 
-static void null_writer(struct driver_data *drv_data)
+static void bfin_spi_null_writer(struct driver_data *drv_data)
 {
        u8 n_bytes = drv_data->n_bytes;
+       u16 tx_val = drv_data->cur_chip->idle_tx_val;
+
+       /* clear RXS (we check for RXS inside the loop) */
+       bfin_spi_dummy_read(drv_data);
 
        while (drv_data->tx < drv_data->tx_end) {
-               write_TDBR(drv_data, 0);
-               while ((read_STAT(drv_data) & BIT_STAT_TXS))
-                       cpu_relax();
+               write_TDBR(drv_data, tx_val);
                drv_data->tx += n_bytes;
+               /* wait until transfer finished.
+                  checking SPIF or TXS may not guarantee transfer completion */
+               while (!(read_STAT(drv_data) & BIT_STAT_RXS))
+                       cpu_relax();
+               /* discard RX data and clear RXS */
+               bfin_spi_dummy_read(drv_data);
        }
 }
 
-static void null_reader(struct driver_data *drv_data)
+static void bfin_spi_null_reader(struct driver_data *drv_data)
 {
        u8 n_bytes = drv_data->n_bytes;
-       dummy_read(drv_data);
+       u16 tx_val = drv_data->cur_chip->idle_tx_val;
+
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
 
        while (drv_data->rx < drv_data->rx_end) {
+               write_TDBR(drv_data, tx_val);
+               drv_data->rx += n_bytes;
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
-               dummy_read(drv_data);
-               drv_data->rx += n_bytes;
+               bfin_spi_dummy_read(drv_data);
        }
 }
 
-static void u8_writer(struct driver_data *drv_data)
+static void bfin_spi_u8_writer(struct driver_data *drv_data)
 {
-       dev_dbg(&drv_data->pdev->dev,
-               "cr8-s is 0x%x\n", read_STAT(drv_data));
+       /* clear RXS (we check for RXS inside the loop) */
+       bfin_spi_dummy_read(drv_data);
 
        while (drv_data->tx < drv_data->tx_end) {
-               write_TDBR(drv_data, (*(u8 *) (drv_data->tx)));
-               while (read_STAT(drv_data) & BIT_STAT_TXS)
+               write_TDBR(drv_data, (*(u8 *) (drv_data->tx++)));
+               /* wait until transfer finished.
+                  checking SPIF or TXS may not guarantee transfer completion */
+               while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
-               ++drv_data->tx;
+               /* discard RX data and clear RXS */
+               bfin_spi_dummy_read(drv_data);
        }
-
-       /* poll for SPI completion before return */
-       while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-               cpu_relax();
 }
 
-static void u8_cs_chg_writer(struct driver_data *drv_data)
+static void bfin_spi_u8_cs_chg_writer(struct driver_data *drv_data)
 {
        struct chip_data *chip = drv_data->cur_chip;
 
-       while (drv_data->tx < drv_data->tx_end) {
-               cs_active(drv_data, chip);
+       /* clear RXS (we check for RXS inside the loop) */
+       bfin_spi_dummy_read(drv_data);
 
-               write_TDBR(drv_data, (*(u8 *) (drv_data->tx)));
-               while (read_STAT(drv_data) & BIT_STAT_TXS)
-                       cpu_relax();
-               while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
+       while (drv_data->tx < drv_data->tx_end) {
+               bfin_spi_cs_active(drv_data, chip);
+               write_TDBR(drv_data, (*(u8 *) (drv_data->tx++)));
+               /* make sure transfer finished before deactiving CS */
+               while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
-
-               cs_deactive(drv_data, chip);
-
-               ++drv_data->tx;
+               bfin_spi_dummy_read(drv_data);
+               bfin_spi_cs_deactive(drv_data, chip);
        }
 }
 
-static void u8_reader(struct driver_data *drv_data)
+static void bfin_spi_u8_reader(struct driver_data *drv_data)
 {
-       dev_dbg(&drv_data->pdev->dev,
-               "cr-8 is 0x%x\n", read_STAT(drv_data));
-
-       /* poll for SPI completion before start */
-       while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-               cpu_relax();
+       u16 tx_val = drv_data->cur_chip->idle_tx_val;
 
-       /* clear TDBR buffer before read(else it will be shifted out) */
-       write_TDBR(drv_data, 0xFFFF);
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
 
-       dummy_read(drv_data);
-
-       while (drv_data->rx < drv_data->rx_end - 1) {
+       while (drv_data->rx < drv_data->rx_end) {
+               write_TDBR(drv_data, tx_val);
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
-               *(u8 *) (drv_data->rx) = read_RDBR(drv_data);
-               ++drv_data->rx;
+               *(u8 *) (drv_data->rx++) = read_RDBR(drv_data);
        }
-
-       while (!(read_STAT(drv_data) & BIT_STAT_RXS))
-               cpu_relax();
-       *(u8 *) (drv_data->rx) = read_SHAW(drv_data);
-       ++drv_data->rx;
 }
 
-static void u8_cs_chg_reader(struct driver_data *drv_data)
+static void bfin_spi_u8_cs_chg_reader(struct driver_data *drv_data)
 {
        struct chip_data *chip = drv_data->cur_chip;
+       u16 tx_val = chip->idle_tx_val;
 
-       while (drv_data->rx < drv_data->rx_end) {
-               cs_active(drv_data, chip);
-               read_RDBR(drv_data);    /* kick off */
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
 
+       while (drv_data->rx < drv_data->rx_end) {
+               bfin_spi_cs_active(drv_data, chip);
+               write_TDBR(drv_data, tx_val);
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
-               while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-                       cpu_relax();
-
-               *(u8 *) (drv_data->rx) = read_SHAW(drv_data);
-               cs_deactive(drv_data, chip);
-
-               ++drv_data->rx;
+               *(u8 *) (drv_data->rx++) = read_RDBR(drv_data);
+               bfin_spi_cs_deactive(drv_data, chip);
        }
 }
 
-static void u8_duplex(struct driver_data *drv_data)
+static void bfin_spi_u8_duplex(struct driver_data *drv_data)
 {
-       /* in duplex mode, clk is triggered by writing of TDBR */
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
+
        while (drv_data->rx < drv_data->rx_end) {
-               write_TDBR(drv_data, (*(u8 *) (drv_data->tx)));
-               while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-                       cpu_relax();
+               write_TDBR(drv_data, (*(u8 *) (drv_data->tx++)));
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
-               *(u8 *) (drv_data->rx) = read_RDBR(drv_data);
-               ++drv_data->rx;
-               ++drv_data->tx;
+               *(u8 *) (drv_data->rx++) = read_RDBR(drv_data);
        }
 }
 
-static void u8_cs_chg_duplex(struct driver_data *drv_data)
+static void bfin_spi_u8_cs_chg_duplex(struct driver_data *drv_data)
 {
        struct chip_data *chip = drv_data->cur_chip;
 
-       while (drv_data->rx < drv_data->rx_end) {
-               cs_active(drv_data, chip);
-
-               write_TDBR(drv_data, (*(u8 *) (drv_data->tx)));
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
 
-               while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-                       cpu_relax();
+       while (drv_data->rx < drv_data->rx_end) {
+               bfin_spi_cs_active(drv_data, chip);
+               write_TDBR(drv_data, (*(u8 *) (drv_data->tx++)));
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
-               *(u8 *) (drv_data->rx) = read_RDBR(drv_data);
-
-               cs_deactive(drv_data, chip);
-
-               ++drv_data->rx;
-               ++drv_data->tx;
+               *(u8 *) (drv_data->rx++) = read_RDBR(drv_data);
+               bfin_spi_cs_deactive(drv_data, chip);
        }
 }
 
-static void u16_writer(struct driver_data *drv_data)
+static void bfin_spi_u16_writer(struct driver_data *drv_data)
 {
-       dev_dbg(&drv_data->pdev->dev,
-               "cr16 is 0x%x\n", read_STAT(drv_data));
+       /* clear RXS (we check for RXS inside the loop) */
+       bfin_spi_dummy_read(drv_data);
 
        while (drv_data->tx < drv_data->tx_end) {
                write_TDBR(drv_data, (*(u16 *) (drv_data->tx)));
-               while ((read_STAT(drv_data) & BIT_STAT_TXS))
-                       cpu_relax();
                drv_data->tx += 2;
+               /* wait until transfer finished.
+                  checking SPIF or TXS may not guarantee transfer completion */
+               while (!(read_STAT(drv_data) & BIT_STAT_RXS))
+                       cpu_relax();
+               /* discard RX data and clear RXS */
+               bfin_spi_dummy_read(drv_data);
        }
-
-       /* poll for SPI completion before return */
-       while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-               cpu_relax();
 }
 
-static void u16_cs_chg_writer(struct driver_data *drv_data)
+static void bfin_spi_u16_cs_chg_writer(struct driver_data *drv_data)
 {
        struct chip_data *chip = drv_data->cur_chip;
 
-       while (drv_data->tx < drv_data->tx_end) {
-               cs_active(drv_data, chip);
+       /* clear RXS (we check for RXS inside the loop) */
+       bfin_spi_dummy_read(drv_data);
 
+       while (drv_data->tx < drv_data->tx_end) {
+               bfin_spi_cs_active(drv_data, chip);
                write_TDBR(drv_data, (*(u16 *) (drv_data->tx)));
-               while ((read_STAT(drv_data) & BIT_STAT_TXS))
-                       cpu_relax();
-               while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-                       cpu_relax();
-
-               cs_deactive(drv_data, chip);
-
                drv_data->tx += 2;
+               /* make sure transfer finished before deactiving CS */
+               while (!(read_STAT(drv_data) & BIT_STAT_RXS))
+                       cpu_relax();
+               bfin_spi_dummy_read(drv_data);
+               bfin_spi_cs_deactive(drv_data, chip);
        }
 }
 
-static void u16_reader(struct driver_data *drv_data)
+static void bfin_spi_u16_reader(struct driver_data *drv_data)
 {
-       dev_dbg(&drv_data->pdev->dev,
-               "cr-16 is 0x%x\n", read_STAT(drv_data));
-
-       /* poll for SPI completion before start */
-       while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-               cpu_relax();
-
-       /* clear TDBR buffer before read(else it will be shifted out) */
-       write_TDBR(drv_data, 0xFFFF);
+       u16 tx_val = drv_data->cur_chip->idle_tx_val;
 
-       dummy_read(drv_data);
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
 
-       while (drv_data->rx < (drv_data->rx_end - 2)) {
+       while (drv_data->rx < drv_data->rx_end) {
+               write_TDBR(drv_data, tx_val);
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
                *(u16 *) (drv_data->rx) = read_RDBR(drv_data);
                drv_data->rx += 2;
        }
-
-       while (!(read_STAT(drv_data) & BIT_STAT_RXS))
-               cpu_relax();
-       *(u16 *) (drv_data->rx) = read_SHAW(drv_data);
-       drv_data->rx += 2;
 }
 
-static void u16_cs_chg_reader(struct driver_data *drv_data)
+static void bfin_spi_u16_cs_chg_reader(struct driver_data *drv_data)
 {
        struct chip_data *chip = drv_data->cur_chip;
+       u16 tx_val = chip->idle_tx_val;
 
-       /* poll for SPI completion before start */
-       while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-               cpu_relax();
-
-       /* clear TDBR buffer before read(else it will be shifted out) */
-       write_TDBR(drv_data, 0xFFFF);
-
-       cs_active(drv_data, chip);
-       dummy_read(drv_data);
-
-       while (drv_data->rx < drv_data->rx_end - 2) {
-               cs_deactive(drv_data, chip);
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
 
+       while (drv_data->rx < drv_data->rx_end) {
+               bfin_spi_cs_active(drv_data, chip);
+               write_TDBR(drv_data, tx_val);
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
-               cs_active(drv_data, chip);
                *(u16 *) (drv_data->rx) = read_RDBR(drv_data);
                drv_data->rx += 2;
+               bfin_spi_cs_deactive(drv_data, chip);
        }
-       cs_deactive(drv_data, chip);
-
-       while (!(read_STAT(drv_data) & BIT_STAT_RXS))
-               cpu_relax();
-       *(u16 *) (drv_data->rx) = read_SHAW(drv_data);
-       drv_data->rx += 2;
 }
 
-static void u16_duplex(struct driver_data *drv_data)
+static void bfin_spi_u16_duplex(struct driver_data *drv_data)
 {
-       /* in duplex mode, clk is triggered by writing of TDBR */
-       while (drv_data->tx < drv_data->tx_end) {
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
+
+       while (drv_data->rx < drv_data->rx_end) {
                write_TDBR(drv_data, (*(u16 *) (drv_data->tx)));
-               while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-                       cpu_relax();
+               drv_data->tx += 2;
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
                *(u16 *) (drv_data->rx) = read_RDBR(drv_data);
                drv_data->rx += 2;
-               drv_data->tx += 2;
        }
 }
 
-static void u16_cs_chg_duplex(struct driver_data *drv_data)
+static void bfin_spi_u16_cs_chg_duplex(struct driver_data *drv_data)
 {
        struct chip_data *chip = drv_data->cur_chip;
 
-       while (drv_data->tx < drv_data->tx_end) {
-               cs_active(drv_data, chip);
+       /* discard old RX data and clear RXS */
+       bfin_spi_dummy_read(drv_data);
 
+       while (drv_data->rx < drv_data->rx_end) {
+               bfin_spi_cs_active(drv_data, chip);
                write_TDBR(drv_data, (*(u16 *) (drv_data->tx)));
-               while (!(read_STAT(drv_data) & BIT_STAT_SPIF))
-                       cpu_relax();
+               drv_data->tx += 2;
                while (!(read_STAT(drv_data) & BIT_STAT_RXS))
                        cpu_relax();
                *(u16 *) (drv_data->rx) = read_RDBR(drv_data);
-
-               cs_deactive(drv_data, chip);
-
                drv_data->rx += 2;
-               drv_data->tx += 2;
+               bfin_spi_cs_deactive(drv_data, chip);
        }
 }
 
 /* test if ther is more transfer to be done */
-static void *next_transfer(struct driver_data *drv_data)
+static void *bfin_spi_next_transfer(struct driver_data *drv_data)
 {
        struct spi_message *msg = drv_data->cur_msg;
        struct spi_transfer *trans = drv_data->cur_transfer;
@@ -517,7 +493,7 @@ static void *next_transfer(struct driver_data *drv_data)
  * caller already set message->status;
  * dma and pio irqs are blocked give finished message back
  */
-static void giveback(struct driver_data *drv_data)
+static void bfin_spi_giveback(struct driver_data *drv_data)
 {
        struct chip_data *chip = drv_data->cur_chip;
        struct spi_transfer *last_transfer;
@@ -537,26 +513,30 @@ static void giveback(struct driver_data *drv_data)
 
        msg->state = NULL;
 
-       /* disable chip select signal. And not stop spi in autobuffer mode */
-       if (drv_data->tx_dma != 0xFFFF) {
-               cs_deactive(drv_data, chip);
-               bfin_spi_disable(drv_data);
-       }
-
        if (!drv_data->cs_change)
-               cs_deactive(drv_data, chip);
+               bfin_spi_cs_deactive(drv_data, chip);
+
+       /* Not stop spi in autobuffer mode */
+       if (drv_data->tx_dma != 0xFFFF)
+               bfin_spi_disable(drv_data);
 
        if (msg->complete)
                msg->complete(msg->context);
 }
 
-static irqreturn_t dma_irq_handler(int irq, void *dev_id)
+static irqreturn_t bfin_spi_dma_irq_handler(int irq, void *dev_id)
 {
        struct driver_data *drv_data = dev_id;
        struct chip_data *chip = drv_data->cur_chip;
        struct spi_message *msg = drv_data->cur_msg;
+       unsigned long timeout;
+       unsigned short dmastat = get_dma_curr_irqstat(drv_data->dma_channel);
+       u16 spistat = read_STAT(drv_data);
+
+       dev_dbg(&drv_data->pdev->dev,
+               "in dma_irq_handler dmastat:0x%x spistat:0x%x\n",
+               dmastat, spistat);
 
-       dev_dbg(&drv_data->pdev->dev, "in dma_irq_handler\n");
        clear_dma_irqstat(drv_data->dma_channel);
 
        /* Wait for DMA to complete */
@@ -575,16 +555,30 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
                        cpu_relax();
        }
 
+       dev_dbg(&drv_data->pdev->dev,
+               "in dma_irq_handler dmastat:0x%x spistat:0x%x\n",
+               dmastat, read_STAT(drv_data));
+
+       timeout = jiffies + HZ;
        while (!(read_STAT(drv_data) & SPIF))
-               cpu_relax();
+               if (!time_before(jiffies, timeout)) {
+                       dev_warn(&drv_data->pdev->dev, "timeout waiting for SPIF");
+                       break;
+               } else
+                       cpu_relax();
 
-       msg->actual_length += drv_data->len_in_bytes;
+       if ((dmastat & DMA_ERR) && (spistat & RBSY)) {
+               msg->state = ERROR_STATE;
+               dev_err(&drv_data->pdev->dev, "dma receive: fifo/buffer overflow\n");
+       } else {
+               msg->actual_length += drv_data->len_in_bytes;
 
-       if (drv_data->cs_change)
-               cs_deactive(drv_data, chip);
+               if (drv_data->cs_change)
+                       bfin_spi_cs_deactive(drv_data, chip);
 
-       /* Move to next transfer */
-       msg->state = next_transfer(drv_data);
+               /* Move to next transfer */
+               msg->state = bfin_spi_next_transfer(drv_data);
+       }
 
        /* Schedule transfer tasklet */
        tasklet_schedule(&drv_data->pump_transfers);
@@ -598,7 +592,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static void pump_transfers(unsigned long data)
+static void bfin_spi_pump_transfers(unsigned long data)
 {
        struct driver_data *drv_data = (struct driver_data *)data;
        struct spi_message *message = NULL;
@@ -621,20 +615,23 @@ static void pump_transfers(unsigned long data)
 
         /* Handle for abort */
        if (message->state == ERROR_STATE) {
+               dev_dbg(&drv_data->pdev->dev, "transfer: we've hit an error\n");
                message->status = -EIO;
-               giveback(drv_data);
+               bfin_spi_giveback(drv_data);
                return;
        }
 
        /* Handle end of message */
        if (message->state == DONE_STATE) {
+               dev_dbg(&drv_data->pdev->dev, "transfer: all done!\n");
                message->status = 0;
-               giveback(drv_data);
+               bfin_spi_giveback(drv_data);
                return;
        }
 
        /* Delay if requested at end of transfer */
        if (message->state == RUNNING_STATE) {
+               dev_dbg(&drv_data->pdev->dev, "transfer: still running ...\n");
                previous = list_entry(transfer->transfer_list.prev,
                                      struct spi_transfer, transfer_list);
                if (previous->delay_usecs)
@@ -642,13 +639,20 @@ static void pump_transfers(unsigned long data)
        }
 
        /* Setup the transfer state based on the type of transfer */
-       if (flush(drv_data) == 0) {
+       if (bfin_spi_flush(drv_data) == 0) {
                dev_err(&drv_data->pdev->dev, "pump_transfers: flush failed\n");
                message->status = -EIO;
-               giveback(drv_data);
+               bfin_spi_giveback(drv_data);
                return;
        }
 
+       if (transfer->len == 0) {
+               /* Move to next transfer of this msg */
+               message->state = bfin_spi_next_transfer(drv_data);
+               /* Schedule next transfer tasklet */
+               tasklet_schedule(&drv_data->pump_transfers);
+       }
+
        if (transfer->tx_buf != NULL) {
                drv_data->tx = (void *)transfer->tx_buf;
                drv_data->tx_end = drv_data->tx + transfer->len;
@@ -679,31 +683,31 @@ static void pump_transfers(unsigned long data)
                drv_data->n_bytes = 1;
                width = CFG_SPI_WORDSIZE8;
                drv_data->read = chip->cs_change_per_word ?
-                       u8_cs_chg_reader : u8_reader;
+                       bfin_spi_u8_cs_chg_reader : bfin_spi_u8_reader;
                drv_data->write = chip->cs_change_per_word ?
-                       u8_cs_chg_writer : u8_writer;
+                       bfin_spi_u8_cs_chg_writer : bfin_spi_u8_writer;
                drv_data->duplex = chip->cs_change_per_word ?
-                       u8_cs_chg_duplex : u8_duplex;
+                       bfin_spi_u8_cs_chg_duplex : bfin_spi_u8_duplex;
                break;
 
        case 16:
                drv_data->n_bytes = 2;
                width = CFG_SPI_WORDSIZE16;
                drv_data->read = chip->cs_change_per_word ?
-                       u16_cs_chg_reader : u16_reader;
+                       bfin_spi_u16_cs_chg_reader : bfin_spi_u16_reader;
                drv_data->write = chip->cs_change_per_word ?
-                       u16_cs_chg_writer : u16_writer;
+                       bfin_spi_u16_cs_chg_writer : bfin_spi_u16_writer;
                drv_data->duplex = chip->cs_change_per_word ?
-                       u16_cs_chg_duplex : u16_duplex;
+                       bfin_spi_u16_cs_chg_duplex : bfin_spi_u16_duplex;
                break;
 
        default:
                /* No change, the same as default setting */
                drv_data->n_bytes = chip->n_bytes;
                width = chip->width;
-               drv_data->write = drv_data->tx ? chip->write : null_writer;
-               drv_data->read = drv_data->rx ? chip->read : null_reader;
-               drv_data->duplex = chip->duplex ? chip->duplex : null_writer;
+               drv_data->write = drv_data->tx ? chip->write : bfin_spi_null_writer;
+               drv_data->read = drv_data->rx ? chip->read : bfin_spi_null_reader;
+               drv_data->duplex = chip->duplex ? chip->duplex : bfin_spi_null_writer;
                break;
        }
        cr = (read_CTRL(drv_data) & (~BIT_CTL_TIMOD));
@@ -717,7 +721,7 @@ static void pump_transfers(unsigned long data)
        }
        dev_dbg(&drv_data->pdev->dev,
                "transfer: drv_data->write is %p, chip->write is %p, null_wr is %p\n",
-               drv_data->write, chip->write, null_writer);
+               drv_data->write, chip->write, bfin_spi_null_writer);
 
        /* speed and width has been set on per message */
        message->state = RUNNING_STATE;
@@ -731,32 +735,34 @@ static void pump_transfers(unsigned long data)
 
        write_STAT(drv_data, BIT_STAT_CLR);
        cr = (read_CTRL(drv_data) & (~BIT_CTL_TIMOD));
-       cs_active(drv_data, chip);
+       if (drv_data->cs_change)
+               bfin_spi_cs_active(drv_data, chip);
 
        dev_dbg(&drv_data->pdev->dev,
                "now pumping a transfer: width is %d, len is %d\n",
                width, transfer->len);
 
        /*
-        * Try to map dma buffer and do a dma transfer if
-        * successful use different way to r/w according to
-        * drv_data->cur_chip->enable_dma
+        * Try to map dma buffer and do a dma transfer.  If successful use,
+        * different way to r/w according to the enable_dma settings and if
+        * we are not doing a full duplex transfer (since the hardware does
+        * not support full duplex DMA transfers).
         */
        if (!full_duplex && drv_data->cur_chip->enable_dma
                                && drv_data->len > 6) {
 
+               unsigned long dma_start_addr, flags;
+
                disable_dma(drv_data->dma_channel);
                clear_dma_irqstat(drv_data->dma_channel);
-               bfin_spi_disable(drv_data);
 
                /* config dma channel */
                dev_dbg(&drv_data->pdev->dev, "doing dma transfer\n");
+               set_dma_x_count(drv_data->dma_channel, drv_data->len);
                if (width == CFG_SPI_WORDSIZE16) {
-                       set_dma_x_count(drv_data->dma_channel, drv_data->len);
                        set_dma_x_modify(drv_data->dma_channel, 2);
                        dma_width = WDSIZE_16;
                } else {
-                       set_dma_x_count(drv_data->dma_channel, drv_data->len);
                        set_dma_x_modify(drv_data->dma_channel, 1);
                        dma_width = WDSIZE_8;
                }
@@ -779,58 +785,75 @@ static void pump_transfers(unsigned long data)
                        enable_dma(drv_data->dma_channel);
 
                        /* start SPI transfer */
-                       write_CTRL(drv_data,
-                               (cr | CFG_SPI_DMAWRITE | BIT_CTL_ENABLE));
+                       write_CTRL(drv_data, cr | BIT_CTL_TIMOD_DMA_TX);
 
                        /* just return here, there can only be one transfer
                         * in this mode
                         */
                        message->status = 0;
-                       giveback(drv_data);
+                       bfin_spi_giveback(drv_data);
                        return;
                }
 
                /* In dma mode, rx or tx must be NULL in one transfer */
+               dma_config = (RESTART | dma_width | DI_EN);
                if (drv_data->rx != NULL) {
                        /* set transfer mode, and enable SPI */
-                       dev_dbg(&drv_data->pdev->dev, "doing DMA in.\n");
+                       dev_dbg(&drv_data->pdev->dev, "doing DMA in to %p (size %zx)\n",
+                               drv_data->rx, drv_data->len_in_bytes);
 
-                       /* clear tx reg soformer data is not shifted out */
-                       write_TDBR(drv_data, 0xFFFF);
+                       /* invalidate caches, if needed */
+                       if (bfin_addr_dcachable((unsigned long) drv_data->rx))
+                               invalidate_dcache_range((unsigned long) drv_data->rx,
+                                                       (unsigned long) (drv_data->rx +
+                                                       drv_data->len_in_bytes));
 
-                       set_dma_x_count(drv_data->dma_channel, drv_data->len);
-
-                       /* start dma */
-                       dma_enable_irq(drv_data->dma_channel);
-                       dma_config = (WNR | RESTART | dma_width | DI_EN);
-                       set_dma_config(drv_data->dma_channel, dma_config);
-                       set_dma_start_addr(drv_data->dma_channel,
-                                       (unsigned long)drv_data->rx);
-                       enable_dma(drv_data->dma_channel);
-
-                       /* start SPI transfer */
-                       write_CTRL(drv_data,
-                               (cr | CFG_SPI_DMAREAD | BIT_CTL_ENABLE));
+                       dma_config |= WNR;
+                       dma_start_addr = (unsigned long)drv_data->rx;
+                       cr |= BIT_CTL_TIMOD_DMA_RX | BIT_CTL_SENDOPT;
 
                } else if (drv_data->tx != NULL) {
                        dev_dbg(&drv_data->pdev->dev, "doing DMA out.\n");
 
-                       /* start dma */
-                       dma_enable_irq(drv_data->dma_channel);
-                       dma_config = (RESTART | dma_width | DI_EN);
-                       set_dma_config(drv_data->dma_channel, dma_config);
-                       set_dma_start_addr(drv_data->dma_channel,
-                                       (unsigned long)drv_data->tx);
-                       enable_dma(drv_data->dma_channel);
+                       /* flush caches, if needed */
+                       if (bfin_addr_dcachable((unsigned long) drv_data->tx))
+                               flush_dcache_range((unsigned long) drv_data->tx,
+                                               (unsigned long) (drv_data->tx +
+                                               drv_data->len_in_bytes));
+
+                       dma_start_addr = (unsigned long)drv_data->tx;
+                       cr |= BIT_CTL_TIMOD_DMA_TX;
+
+               } else
+                       BUG();
+
+               /* oh man, here there be monsters ... and i dont mean the
+                * fluffy cute ones from pixar, i mean the kind that'll eat
+                * your data, kick your dog, and love it all.  do *not* try
+                * and change these lines unless you (1) heavily test DMA
+                * with SPI flashes on a loaded system (e.g. ping floods),
+                * (2) know just how broken the DMA engine interaction with
+                * the SPI peripheral is, and (3) have someone else to blame
+                * when you screw it all up anyways.
+                */
+               set_dma_start_addr(drv_data->dma_channel, dma_start_addr);
+               set_dma_config(drv_data->dma_channel, dma_config);
+               local_irq_save(flags);
+               SSYNC();
+               write_CTRL(drv_data, cr);
+               enable_dma(drv_data->dma_channel);
+               dma_enable_irq(drv_data->dma_channel);
+               local_irq_restore(flags);
 
-                       /* start SPI transfer */
-                       write_CTRL(drv_data,
-                               (cr | CFG_SPI_DMAWRITE | BIT_CTL_ENABLE));
-               }
        } else {
                /* IO mode write then read */
                dev_dbg(&drv_data->pdev->dev, "doing IO transfer\n");
 
+               /* we always use SPI_WRITE mode. SPI_READ mode
+                  seems to have problems with setting up the
+                  output value in TDBR prior to the transfer. */
+               write_CTRL(drv_data, (cr | CFG_SPI_WRITE));
+
                if (full_duplex) {
                        /* full duplex mode */
                        BUG_ON((drv_data->tx_end - drv_data->tx) !=
@@ -838,9 +861,6 @@ static void pump_transfers(unsigned long data)
                        dev_dbg(&drv_data->pdev->dev,
                                "IO duplex: cr is 0x%x\n", cr);
 
-                       /* set SPI transfer mode */
-                       write_CTRL(drv_data, (cr | CFG_SPI_WRITE));
-
                        drv_data->duplex(drv_data);
 
                        if (drv_data->tx != drv_data->tx_end)
@@ -850,9 +870,6 @@ static void pump_transfers(unsigned long data)
                        dev_dbg(&drv_data->pdev->dev,
                                "IO write: cr is 0x%x\n", cr);
 
-                       /* set SPI transfer mode */
-                       write_CTRL(drv_data, (cr | CFG_SPI_WRITE));
-
                        drv_data->write(drv_data);
 
                        if (drv_data->tx != drv_data->tx_end)
@@ -862,9 +879,6 @@ static void pump_transfers(unsigned long data)
                        dev_dbg(&drv_data->pdev->dev,
                                "IO read: cr is 0x%x\n", cr);
 
-                       /* set SPI transfer mode */
-                       write_CTRL(drv_data, (cr | CFG_SPI_READ));
-
                        drv_data->read(drv_data);
                        if (drv_data->rx != drv_data->rx_end)
                                tranf_success = 0;
@@ -876,20 +890,19 @@ static void pump_transfers(unsigned long data)
                        message->state = ERROR_STATE;
                } else {
                        /* Update total byte transfered */
-                       message->actual_length += drv_data->len;
-
+                       message->actual_length += drv_data->len_in_bytes;
                        /* Move to next transfer of this msg */
-                       message->state = next_transfer(drv_data);
+                       message->state = bfin_spi_next_transfer(drv_data);
+                       if (drv_data->cs_change)
+                               bfin_spi_cs_deactive(drv_data, chip);
                }
-
                /* Schedule next transfer tasklet */
                tasklet_schedule(&drv_data->pump_transfers);
-
        }
 }
 
 /* pop a msg from queue and kick off real transfer */
-static void pump_messages(struct work_struct *work)
+static void bfin_spi_pump_messages(struct work_struct *work)
 {
        struct driver_data *drv_data;
        unsigned long flags;
@@ -917,7 +930,7 @@ static void pump_messages(struct work_struct *work)
 
        /* Setup the SSP using the per chip configuration */
        drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi);
-       restore_state(drv_data);
+       bfin_spi_restore_state(drv_data);
 
        list_del_init(&drv_data->cur_msg->queue);
 
@@ -946,7 +959,7 @@ static void pump_messages(struct work_struct *work)
  * got a msg to transfer, queue it in drv_data->queue.
  * And kick off message pumper
  */
-static int transfer(struct spi_device *spi, struct spi_message *msg)
+static int bfin_spi_transfer(struct spi_device *spi, struct spi_message *msg)
 {
        struct driver_data *drv_data = spi_master_get_devdata(spi->master);
        unsigned long flags;
@@ -975,7 +988,7 @@ static int transfer(struct spi_device *spi, struct spi_message *msg)
 
 #define MAX_SPI_SSEL   7
 
-static u16 ssel[3][MAX_SPI_SSEL] = {
+static u16 ssel[][MAX_SPI_SSEL] = {
        {P_SPI0_SSEL1, P_SPI0_SSEL2, P_SPI0_SSEL3,
        P_SPI0_SSEL4, P_SPI0_SSEL5,
        P_SPI0_SSEL6, P_SPI0_SSEL7},
@@ -990,12 +1003,12 @@ static u16 ssel[3][MAX_SPI_SSEL] = {
 };
 
 /* first setup for new devices */
-static int setup(struct spi_device *spi)
+static int bfin_spi_setup(struct spi_device *spi)
 {
        struct bfin5xx_spi_chip *chip_info = NULL;
        struct chip_data *chip;
        struct driver_data *drv_data = spi_master_get_devdata(spi->master);
-       u8 spi_flg;
+       int ret;
 
        /* Abort device setup if requested features are not supported */
        if (spi->mode & ~(SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST)) {
@@ -1041,6 +1054,8 @@ static int setup(struct spi_device *spi)
                chip->bits_per_word = chip_info->bits_per_word;
                chip->cs_change_per_word = chip_info->cs_change_per_word;
                chip->cs_chg_udelay = chip_info->cs_chg_udelay;
+               chip->cs_gpio = chip_info->cs_gpio;
+               chip->idle_tx_val = chip_info->idle_tx_val;
        }
 
        /* translate common spi framework into our register */
@@ -1059,13 +1074,13 @@ static int setup(struct spi_device *spi)
         */
        if (chip->enable_dma && !drv_data->dma_requested) {
                /* register dma irq handler */
-               if (request_dma(drv_data->dma_channel, "BF53x_SPI_DMA") < 0) {
+               if (request_dma(drv_data->dma_channel, "BFIN_SPI_DMA") < 0) {
                        dev_dbg(&spi->dev,
                                "Unable to request BlackFin SPI DMA channel\n");
                        return -ENODEV;
                }
                if (set_dma_callback(drv_data->dma_channel,
-                       (void *)dma_irq_handler, drv_data) < 0) {
+                   bfin_spi_dma_irq_handler, drv_data) < 0) {
                        dev_dbg(&spi->dev, "Unable to set dma callback\n");
                        return -EPERM;
                }
@@ -1078,37 +1093,47 @@ static int setup(struct spi_device *spi)
         * SPI_BAUD, not the real baudrate
         */
        chip->baud = hz_to_spi_baud(spi->max_speed_hz);
-       spi_flg = ~(1 << (spi->chip_select));
-       chip->flag = ((u16) spi_flg << 8) | (1 << (spi->chip_select));
+       chip->flag = 1 << (spi->chip_select);
        chip->chip_select_num = spi->chip_select;
 
+       if (chip->chip_select_num == 0) {
+               ret = gpio_request(chip->cs_gpio, spi->modalias);
+               if (ret) {
+                       if (drv_data->dma_requested)
+                               free_dma(drv_data->dma_channel);
+                       return ret;
+               }
+               gpio_direction_output(chip->cs_gpio, 1);
+       }
+
        switch (chip->bits_per_word) {
        case 8:
                chip->n_bytes = 1;
                chip->width = CFG_SPI_WORDSIZE8;
                chip->read = chip->cs_change_per_word ?
-                       u8_cs_chg_reader : u8_reader;
+                       bfin_spi_u8_cs_chg_reader : bfin_spi_u8_reader;
                chip->write = chip->cs_change_per_word ?
-                       u8_cs_chg_writer : u8_writer;
+                       bfin_spi_u8_cs_chg_writer : bfin_spi_u8_writer;
                chip->duplex = chip->cs_change_per_word ?
-                       u8_cs_chg_duplex : u8_duplex;
+                       bfin_spi_u8_cs_chg_duplex : bfin_spi_u8_duplex;
                break;
 
        case 16:
                chip->n_bytes = 2;
                chip->width = CFG_SPI_WORDSIZE16;
                chip->read = chip->cs_change_per_word ?
-                       u16_cs_chg_reader : u16_reader;
+                       bfin_spi_u16_cs_chg_reader : bfin_spi_u16_reader;
                chip->write = chip->cs_change_per_word ?
-                       u16_cs_chg_writer : u16_writer;
+                       bfin_spi_u16_cs_chg_writer : bfin_spi_u16_writer;
                chip->duplex = chip->cs_change_per_word ?
-                       u16_cs_chg_duplex : u16_duplex;
+                       bfin_spi_u16_cs_chg_duplex : bfin_spi_u16_duplex;
                break;
 
        default:
                dev_err(&spi->dev, "%d bits_per_word is not supported\n",
                                chip->bits_per_word);
-               kfree(chip);
+               if (chip_info)
+                       kfree(chip);
                return -ENODEV;
        }
 
@@ -1125,7 +1150,7 @@ static int setup(struct spi_device *spi)
                peripheral_request(ssel[spi->master->bus_num]
                        [chip->chip_select_num-1], spi->modalias);
 
-       cs_deactive(drv_data, chip);
+       bfin_spi_cs_deactive(drv_data, chip);
 
        return 0;
 }
@@ -1134,19 +1159,25 @@ static int setup(struct spi_device *spi)
  * callback for spi framework.
  * clean driver specific data
  */
-static void cleanup(struct spi_device *spi)
+static void bfin_spi_cleanup(struct spi_device *spi)
 {
        struct chip_data *chip = spi_get_ctldata(spi);
 
+       if (!chip)
+               return;
+
        if ((chip->chip_select_num > 0)
                && (chip->chip_select_num <= spi->master->num_chipselect))
                peripheral_free(ssel[spi->master->bus_num]
                                        [chip->chip_select_num-1]);
 
+       if (chip->chip_select_num == 0)
+               gpio_free(chip->cs_gpio);
+
        kfree(chip);
 }
 
-static inline int init_queue(struct driver_data *drv_data)
+static inline int bfin_spi_init_queue(struct driver_data *drv_data)
 {
        INIT_LIST_HEAD(&drv_data->queue);
        spin_lock_init(&drv_data->lock);
@@ -1156,10 +1187,10 @@ static inline int init_queue(struct driver_data *drv_data)
 
        /* init transfer tasklet */
        tasklet_init(&drv_data->pump_transfers,
-                    pump_transfers, (unsigned long)drv_data);
+                    bfin_spi_pump_transfers, (unsigned long)drv_data);
 
        /* init messages workqueue */
-       INIT_WORK(&drv_data->pump_messages, pump_messages);
+       INIT_WORK(&drv_data->pump_messages, bfin_spi_pump_messages);
        drv_data->workqueue = create_singlethread_workqueue(
                                dev_name(drv_data->master->dev.parent));
        if (drv_data->workqueue == NULL)
@@ -1168,7 +1199,7 @@ static inline int init_queue(struct driver_data *drv_data)
        return 0;
 }
 
-static inline int start_queue(struct driver_data *drv_data)
+static inline int bfin_spi_start_queue(struct driver_data *drv_data)
 {
        unsigned long flags;
 
@@ -1190,7 +1221,7 @@ static inline int start_queue(struct driver_data *drv_data)
        return 0;
 }
 
-static inline int stop_queue(struct driver_data *drv_data)
+static inline int bfin_spi_stop_queue(struct driver_data *drv_data)
 {
        unsigned long flags;
        unsigned limit = 500;
@@ -1219,11 +1250,11 @@ static inline int stop_queue(struct driver_data *drv_data)
        return status;
 }
 
-static inline int destroy_queue(struct driver_data *drv_data)
+static inline int bfin_spi_destroy_queue(struct driver_data *drv_data)
 {
        int status;
 
-       status = stop_queue(drv_data);
+       status = bfin_spi_stop_queue(drv_data);
        if (status != 0)
                return status;
 
@@ -1232,7 +1263,7 @@ static inline int destroy_queue(struct driver_data *drv_data)
        return 0;
 }
 
-static int __init bfin5xx_spi_probe(struct platform_device *pdev)
+static int __init bfin_spi_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct bfin5xx_spi_master *platform_info;
@@ -1258,9 +1289,9 @@ static int __init bfin5xx_spi_probe(struct platform_device *pdev)
 
        master->bus_num = pdev->id;
        master->num_chipselect = platform_info->num_chipselect;
-       master->cleanup = cleanup;
-       master->setup = setup;
-       master->transfer = transfer;
+       master->cleanup = bfin_spi_cleanup;
+       master->setup = bfin_spi_setup;
+       master->transfer = bfin_spi_transfer;
 
        /* Find and map our resources */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -1285,13 +1316,13 @@ static int __init bfin5xx_spi_probe(struct platform_device *pdev)
        }
 
        /* Initial and start queue */
-       status = init_queue(drv_data);
+       status = bfin_spi_init_queue(drv_data);
        if (status != 0) {
                dev_err(dev, "problem initializing queue\n");
                goto out_error_queue_alloc;
        }
 
-       status = start_queue(drv_data);
+       status = bfin_spi_start_queue(drv_data);
        if (status != 0) {
                dev_err(dev, "problem starting queue\n");
                goto out_error_queue_alloc;
@@ -1317,7 +1348,7 @@ static int __init bfin5xx_spi_probe(struct platform_device *pdev)
        return status;
 
 out_error_queue_alloc:
-       destroy_queue(drv_data);
+       bfin_spi_destroy_queue(drv_data);
 out_error_no_dma_ch:
        iounmap((void *) drv_data->regs_base);
 out_error_ioremap:
@@ -1328,7 +1359,7 @@ out_error_get_res:
 }
 
 /* stop hardware and remove the driver */
-static int __devexit bfin5xx_spi_remove(struct platform_device *pdev)
+static int __devexit bfin_spi_remove(struct platform_device *pdev)
 {
        struct driver_data *drv_data = platform_get_drvdata(pdev);
        int status = 0;
@@ -1337,7 +1368,7 @@ static int __devexit bfin5xx_spi_remove(struct platform_device *pdev)
                return 0;
 
        /* Remove the queue */
-       status = destroy_queue(drv_data);
+       status = bfin_spi_destroy_queue(drv_data);
        if (status != 0)
                return status;
 
@@ -1362,12 +1393,12 @@ static int __devexit bfin5xx_spi_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM
-static int bfin5xx_spi_suspend(struct platform_device *pdev, pm_message_t state)
+static int bfin_spi_suspend(struct platform_device *pdev, pm_message_t state)
 {
        struct driver_data *drv_data = platform_get_drvdata(pdev);
        int status = 0;
 
-       status = stop_queue(drv_data);
+       status = bfin_spi_stop_queue(drv_data);
        if (status != 0)
                return status;
 
@@ -1377,7 +1408,7 @@ static int bfin5xx_spi_suspend(struct platform_device *pdev, pm_message_t state)
        return 0;
 }
 
-static int bfin5xx_spi_resume(struct platform_device *pdev)
+static int bfin_spi_resume(struct platform_device *pdev)
 {
        struct driver_data *drv_data = platform_get_drvdata(pdev);
        int status = 0;
@@ -1386,7 +1417,7 @@ static int bfin5xx_spi_resume(struct platform_device *pdev)
        bfin_spi_enable(drv_data);
 
        /* Start the queue running */
-       status = start_queue(drv_data);
+       status = bfin_spi_start_queue(drv_data);
        if (status != 0) {
                dev_err(&pdev->dev, "problem starting queue (%d)\n", status);
                return status;
@@ -1395,29 +1426,29 @@ static int bfin5xx_spi_resume(struct platform_device *pdev)
        return 0;
 }
 #else
-#define bfin5xx_spi_suspend NULL
-#define bfin5xx_spi_resume NULL
+#define bfin_spi_suspend NULL
+#define bfin_spi_resume NULL
 #endif                         /* CONFIG_PM */
 
 MODULE_ALIAS("platform:bfin-spi");
-static struct platform_driver bfin5xx_spi_driver = {
+static struct platform_driver bfin_spi_driver = {
        .driver = {
                .name   = DRV_NAME,
                .owner  = THIS_MODULE,
        },
-       .suspend        = bfin5xx_spi_suspend,
-       .resume         = bfin5xx_spi_resume,
-       .remove         = __devexit_p(bfin5xx_spi_remove),
+       .suspend        = bfin_spi_suspend,
+       .resume         = bfin_spi_resume,
+       .remove         = __devexit_p(bfin_spi_remove),
 };
 
-static int __init bfin5xx_spi_init(void)
+static int __init bfin_spi_init(void)
 {
-       return platform_driver_probe(&bfin5xx_spi_driver, bfin5xx_spi_probe);
+       return platform_driver_probe(&bfin_spi_driver, bfin_spi_probe);
 }
-module_init(bfin5xx_spi_init);
+module_init(bfin_spi_init);
 
-static void __exit bfin5xx_spi_exit(void)
+static void __exit bfin_spi_exit(void)
 {
-       platform_driver_unregister(&bfin5xx_spi_driver);
+       platform_driver_unregister(&bfin_spi_driver);
 }
-module_exit(bfin5xx_spi_exit);
+module_exit(bfin_spi_exit);
index 0480d8bb19d32b7a6d81b2b43efafc2a7fe8defd..0671aeef579221bf17c21b522a7905be253ca8a6 100644 (file)
 #define QUEUE_STOPPED                  (1)
 
 #define IS_DMA_ALIGNED(x)              (((u32)(x) & 0x03) == 0)
+#define DMA_ALIGNMENT                  4
 /*-------------------------------------------------------------------------*/
 
 
@@ -779,7 +780,8 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
 
                        /* Read trailing bytes */
                        limit = loops_per_jiffy << 1;
-                       while ((read(drv_data) == 0) && limit--);
+                       while ((read(drv_data) == 0) && --limit)
+                               cpu_relax();
 
                        if (limit == 0)
                                dev_err(&drv_data->pdev->dev,
@@ -1481,6 +1483,7 @@ static int __init spi_imx_probe(struct platform_device *pdev)
 
        master->bus_num = pdev->id;
        master->num_chipselect = platform_info->num_chipselect;
+       master->dma_alignment = DMA_ALIGNMENT;
        master->cleanup = cleanup;
        master->setup = setup;
        master->transfer = transfer;
index 4ff4c16014233b8e94fb32ed9c1de251ff91bfa6..25c0ffd2faa00bd73cf6642abeade61292f4d6e6 100644 (file)
@@ -477,8 +477,8 @@ static int __devinit agnx_pci_probe(struct pci_dev *pdev,
                return err;
        }
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) ||
-           pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) ||
+           pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR PFX "No suitable DMA available\n");
                goto err_free_reg;
        }
index 3e41e0861481a033d983e4681814a51a32c922b9..5869e1484a952e4491fb6825dba9829b6117c993 100644 (file)
@@ -849,15 +849,15 @@ static int __devinit probe(struct pci_dev *dev, const struct pci_device_id *id)
 #if 1   /* @todo For now, disable 64-bit, because I do not understand the implications (DAC!) */
        /* query for DMA transfer */
        /* @see Documentation/PCI/PCI-DMA-mapping.txt */
-       if (!pci_set_dma_mask(dev, DMA_64BIT_MASK)) {
-               pci_set_consistent_dma_mask(dev, DMA_64BIT_MASK);
+       if (!pci_set_dma_mask(dev, DMA_BIT_MASK(64))) {
+               pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(64));
                /* use 64-bit DMA */
                printk(KERN_DEBUG "Using a 64-bit DMA mask.\n");
        } else
 #endif
-       if (!pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
+       if (!pci_set_dma_mask(dev, DMA_BIT_MASK(32))) {
                printk(KERN_DEBUG "Could not set 64-bit DMA mask.\n");
-               pci_set_consistent_dma_mask(dev, DMA_32BIT_MASK);
+               pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(32));
                /* use 32-bit DMA */
                printk(KERN_DEBUG "Using a 32-bit DMA mask.\n");
        } else {
index 1781510c53fd7a5a7dbc4e04c7b768801d3e06fd..234f332fc82fb813b21e92e7a851289d0ad7ea4f 100644 (file)
@@ -289,7 +289,8 @@ static void serial_unthrottle(struct tty_struct *tty);
 static int serial_break(struct tty_struct *tty, int break_state);
 static int serial_chars_in_buffer(struct tty_struct *tty);
 
-static int qt_open(struct usb_serial_port *port, struct file *filp);
+static int qt_open(struct tty_struct *tty, struct usb_serial_port *port,
+                               struct file *filp);
 static int BoxSetPrebufferLevel(struct usb_serial *serial);
 
 static int BoxSetATC(struct usb_serial *serial, __u16 n_Mode);
@@ -300,24 +301,26 @@ static int BoxSetUart(struct usb_serial *serial, unsigned short Uart_Number,
 static int BoxOPenCloseChannel(struct usb_serial *serial, __u16 Uart_Number,
                               __u16 OpenClose,
                               struct qt_open_channel_data *pDeviceData);
-static void qt_close(struct usb_serial_port *port, struct file *filp);
+static void qt_close(struct tty_struct *tty, struct usb_serial_port *port,
+                                       struct file *filp);
 static int BoxGetRegister(struct usb_serial *serial, unsigned short Uart_Number,
                          unsigned short Register_Num, __u8 *pValue);
 static int BoxSetRegister(struct usb_serial *serial, unsigned short Uart_Number,
                          unsigned short Register_Num, unsigned short Value);
 static void qt_write_bulk_callback(struct urb *urb);
-static int qt_write(struct usb_serial_port *port, int from_user,
+static int qt_write(struct tty_struct *tty, struct usb_serial_port *port,
                    const unsigned char *buf, int count);
 static void port_softint(struct work_struct *work);
 static int qt_write_room(struct usb_serial_port *port);
 static int qt_chars_in_buffer(struct usb_serial_port *port);
-static int qt_ioctl(struct usb_serial_port *port, struct file *file,
-                   unsigned int cmd, unsigned long arg);
-static void qt_set_termios(struct usb_serial_port *port,
+static int qt_ioctl(struct tty_struct *tty, struct usb_serial_port *port,
+               struct file *file, unsigned int cmd, unsigned long arg);
+static void qt_set_termios(struct tty_struct *tty,
+                          struct usb_serial_port *port,
                           struct ktermios *old_termios);
-static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int UartNumber,
+static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int index,
                             int bSet);
-static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber);
+static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 index);
 static int EmulateWriteQMCR_Reg(int index, unsigned uc_value);
 static int EmulateReadQMCR_Reg(int index, unsigned *uc_value);
 static struct usb_serial *find_the_box(unsigned int index);
@@ -336,10 +339,11 @@ static int serial_tiocmset(struct tty_struct *tty, struct file *file,
                           unsigned int set, unsigned int clear);
 static int serial_tiocmget(struct tty_struct *tty, struct file *file);
 
-static int qt_tiocmset(struct usb_serial_port *port, struct file *file,
-                      unsigned int value);
+static int qt_tiocmset(struct tty_struct *tty, struct usb_serial_port *port,
+                      struct file *file, unsigned int value);
 
-static int qt_tiocmget(struct usb_serial_port *port, struct file *file);
+static int qt_tiocmget(struct tty_struct *tty, struct usb_serial_port *port,
+                                                       struct file *file);
 
 /* Version Information */
 #define DRIVER_VERSION "v2.14"
@@ -818,7 +822,7 @@ static struct usb_serial *get_free_serial(int num_ports, int *minor)
        return NULL;
 }
 
-static int flip_that(struct tty_struct *tty, __u16 UartNumber,
+static int flip_that(struct tty_struct *tty, __u16 index,
                     struct usb_serial *serial)
 {
        tty_flip_buffer_push(tty);
@@ -829,18 +833,18 @@ static int flip_that(struct tty_struct *tty, __u16 UartNumber,
 /* Handles processing and moving data to the tty layer */
 static void port_sofrint(void *private)
 {
-       struct usb_serial_port *port = (struct usb_serial_port *)private;
+       struct usb_serial_port *port = private;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        struct tty_struct *tty = port->tty;
        unsigned char *data = port->read_urb->transfer_buffer;
-       unsigned int UartNumber;
+       unsigned int index;
        struct urb *urb = port->read_urb;
        unsigned int RxCount = urb->actual_length;
        int i, result;
        int flag, flag_data;
 
-       /* UartNumber = MINOR(port->tty->device) - serial->minor; */
-       UartNumber = tty->index - serial->minor;
+       /* index = MINOR(port->tty->device) - serial->minor; */
+       index = tty->index - serial->minor;
 
        mydbg("%s - port %d\n", __func__, port->number);
        mydbg("%s - port->RxHolding = %d\n", __func__, port->RxHolding);
@@ -948,7 +952,7 @@ static void port_sofrint(void *private)
                      __func__, result);
        else {
                if (tty && RxCount)
-                       flip_that(tty, UartNumber, serial);
+                       flip_that(tty, index, serial);
        }
 
        return;
@@ -1097,7 +1101,7 @@ static int serial_open(struct tty_struct *tty, struct file *filp)
                port->RxHolding = 0;
                mydbg("%s port->RxHolding = 0\n", __func__);
 
-               retval = qt_open(port, filp);
+               retval = qt_open(tty, port, filp);
        }
 
        if (retval)
@@ -1112,11 +1116,12 @@ static int serial_open(struct tty_struct *tty, struct file *filp)
 /*****************************************************************************
  *device's specific driver functions
  *****************************************************************************/
-static int qt_open(struct usb_serial_port *port, struct file *filp)
+static int qt_open(struct tty_struct *tty, struct usb_serial_port *port,
+                                       struct file *filp)
 {
        struct usb_serial *serial = port->serial;
        int result = 0;
-       unsigned int UartNumber;
+       unsigned int index;
        struct qt_get_device_data DeviceData;
        struct qt_open_channel_data ChannelData;
        unsigned short default_divisor = 0x30;          /* gives 9600 baud rate */
@@ -1128,13 +1133,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp)
 
        mydbg("%s - port %d\n", __func__, port->number);
 
-       /* force low_latency on so that our tty_push actually forces the data through,
-          otherwise it is scheduled, and with high data rates (like with OHCI) data
-          can get lost. */
-       if (port->tty)
-               port->tty->low_latency = 0;
-
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
 
        status = box_get_device(serial, &DeviceData);
        if (status < 0) {
@@ -1147,7 +1146,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp)
        /* Open uart channel */
 
        /* Port specific setups */
-       status = BoxOPenCloseChannel(serial, UartNumber, 1, &ChannelData);
+       status = BoxOPenCloseChannel(serial, index, 1, &ChannelData);
        if (status < 0) {
                mydbg(__FILE__ "BoxOPenCloseChannel failed\n");
                return status;
@@ -1161,7 +1160,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp)
            (SERIAL_MSR_CTS | SERIAL_MSR_DSR | SERIAL_MSR_RI | SERIAL_MSR_CD);
 
        /* Set Baud rate to default and turn off (default)flow control here */
-       status = BoxSetUart(serial, UartNumber, default_divisor, default_LCR);
+       status = BoxSetUart(serial, index, default_divisor, default_LCR);
        if (status < 0) {
                mydbg(__FILE__ "BoxSetUart failed\n");
                return status;
@@ -1169,7 +1168,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp)
        mydbg(__FILE__ "BoxSetUart completed.\n");
 
        /* Put this here to make it responsive to stty and defauls set by the tty layer */
-       qt_set_termios(port, NULL);
+       qt_set_termios(tty, port, NULL);
 
        /* Initialize the wait que head */
        init_waitqueue_head(&(port->wait));
@@ -1203,7 +1202,7 @@ static int qt_open(struct usb_serial_port *port, struct file *filp)
 static void serial_close(struct tty_struct *tty, struct file *filp)
 {
        struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+           tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
 
        if (!serial)
@@ -1226,7 +1225,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp)
                        mydbg("%s - port->closePending = 1\n", __func__);
 
                        if (serial->dev) {
-                               qt_close(port, filp);
+                               qt_close(tty, port, filp);
                                port->open_count = 0;
                        }
                }
@@ -1240,20 +1239,21 @@ exit:
 
 }
 
-static void qt_close(struct usb_serial_port *port, struct file *filp)
+static void qt_close(struct tty_struct *tty, struct usb_serial_port *port,
+                                                       struct file *filp)
 {
        unsigned long jift = jiffies + 10 * HZ;
-       __u8 LSR_Value, MCR_Value;
+       u8 lsr, mcr;
        struct usb_serial *serial = port->serial;
        int status;
-       unsigned int UartNumber;
+       unsigned int index;
 
        struct qt_open_channel_data ChannelData;
        status = 0;
-       LSR_Value = 0;
+       lsr = 0;
 
        mydbg("%s - port %d\n", __func__, port->number);
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
 
        /* shutdown any bulk reads that might be going on */
        if (serial->num_bulk_out)
@@ -1263,20 +1263,19 @@ static void qt_close(struct usb_serial_port *port, struct file *filp)
 
        /* wait up to 30 seconds for transmitter to empty */
        do {
-               status = BoxGetRegister(serial, UartNumber, LINE_STATUS_REGISTER, &LSR_Value);
+               status = BoxGetRegister(serial, index, LINE_STATUS_REGISTER, &lsr);
                if (status < 0) {
                        mydbg(__FILE__ "box_get_device failed\n");
                        break;
                }
 
-               if ((LSR_Value & SERIAL_LSR_TEMT)
+               if ((lsr & SERIAL_LSR_TEMT)
                    && (port->ReadBulkStopped == 1))
                        break;
                schedule();
 
        }
-       while (jiffies <= jift)
-               ;
+       while (jiffies <= jift);
 
        if (jiffies > jift)
                mydbg("%s - port %d timout of checking transmitter empty\n",
@@ -1286,17 +1285,17 @@ static void qt_close(struct usb_serial_port *port, struct file *filp)
                      __func__, port->number);
 
        status =
-           BoxGetRegister(serial, UartNumber, MODEM_CONTROL_REGISTER,
-                          &MCR_Value);
-       mydbg(__FILE__ "BoxGetRegister MCR = 0x%x.\n", MCR_Value);
+           BoxGetRegister(serial, index, MODEM_CONTROL_REGISTER,
+                          &mcr);
+       mydbg(__FILE__ "BoxGetRegister MCR = 0x%x.\n", mcr);
 
        if (status >= 0) {
-               MCR_Value &= ~(SERIAL_MCR_DTR | SERIAL_MCR_RTS);
-               /* status = BoxSetRegister(serial, UartNumber, MODEM_CONTROL_REGISTER, MCR_Value); */
+               mcr &= ~(SERIAL_MCR_DTR | SERIAL_MCR_RTS);
+               /* status = BoxSetRegister(serial, index, MODEM_CONTROL_REGISTER, mcr); */
        }
 
        /* Close uart channel */
-       status = BoxOPenCloseChannel(serial, UartNumber, 0, &ChannelData);
+       status = BoxOPenCloseChannel(serial, index, 0, &ChannelData);
        if (status < 0)
                mydbg("%s - port %d BoxOPenCloseChannel failed.\n",
                      __func__, port->number);
@@ -1308,12 +1307,10 @@ static void qt_close(struct usb_serial_port *port, struct file *filp)
 static int serial_write(struct tty_struct *tty, const unsigned char *buf,
                        int count)
 {
-       struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+       struct usb_serial_port *port = tty->driver_data;
        struct usb_serial *serial;
        int retval = -EINVAL;
-       unsigned int UartNumber;
-       int from_user = 0;
+       unsigned int index;
 
        serial = get_usb_serial(port, __func__);
        if (serial == NULL)
@@ -1321,7 +1318,7 @@ static int serial_write(struct tty_struct *tty, const unsigned char *buf,
        /* This can happen if we get disconnected a */
        if (port->open_count == 0)
                return -ENODEV;
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
 
        mydbg("%s - port %d, %d byte(s)\n", __func__, port->number, count);
        mydbg("%s - port->RxHolding =  %d\n", __func__, port->RxHolding);
@@ -1331,19 +1328,19 @@ static int serial_write(struct tty_struct *tty, const unsigned char *buf,
                goto exit;
        }
 
-       retval = qt_write(port, from_user, buf, count);
+       retval = qt_write(tty, port, buf, count);
 
 exit:
        return retval;
 }
 
-static int qt_write(struct usb_serial_port *port, int from_user,
-                   const unsigned char *buf, int count)
+static int qt_write(struct tty_struct *tty, struct usb_serial_port *port,
+                               const unsigned char *buf, int count)
 {
        int result;
-       unsigned int UartNumber;
-
+       unsigned int index;
        struct usb_serial *serial = get_usb_serial(port, __func__);
+
        if (serial == NULL)
                return -ENODEV;
 
@@ -1354,7 +1351,7 @@ static int qt_write(struct usb_serial_port *port, int from_user,
                return 0;
        }
 
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
        /* only do something if we have a bulk out endpoint */
        if (serial->num_bulk_out) {
                if (port->write_urb->status == -EINPROGRESS) {
@@ -1364,14 +1361,7 @@ static int qt_write(struct usb_serial_port *port, int from_user,
 
                count =
                    (count > port->bulk_out_size) ? port->bulk_out_size : count;
-
-               if (from_user) {
-                       if (copy_from_user
-                           (port->write_urb->transfer_buffer, buf, count))
-                               return -EFAULT;
-               } else {
-                       memcpy(port->write_urb->transfer_buffer, buf, count);
-               }
+               memcpy(port->write_urb->transfer_buffer, buf, count);
 
                /* usb_serial_debug_data(__FILE__, __func__, count, port->write_urb->transfer_buffer); */
 
@@ -1449,8 +1439,7 @@ static void port_softint(struct work_struct *work)
 }
 static int serial_write_room(struct tty_struct *tty)
 {
-       struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+       struct usb_serial_port *port = tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        int retval = -EINVAL;
 
@@ -1493,8 +1482,7 @@ static int qt_write_room(struct usb_serial_port *port)
 }
 static int serial_chars_in_buffer(struct tty_struct *tty)
 {
-       struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+       struct usb_serial_port *port = tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        int retval = -EINVAL;
 
@@ -1537,17 +1525,16 @@ static int serial_tiocmset(struct tty_struct *tty, struct file *file,
                           unsigned int set, unsigned int clear)
 {
 
-       struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+       struct usb_serial_port *port = tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        int retval = -ENODEV;
-       unsigned int UartNumber;
+       unsigned int index;
        mydbg("In %s \n", __func__);
 
        if (!serial)
                return -ENODEV;
 
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
 
        down(&port->sem);
 
@@ -1559,22 +1546,22 @@ static int serial_tiocmset(struct tty_struct *tty, struct file *file,
                goto exit;
        }
 
-       retval = qt_tiocmset(port, file, set);
+       retval = qt_tiocmset(tty, port, file, set);
 
 exit:
        up(&port->sem);
        return retval;
 }
 
-static int qt_tiocmset(struct usb_serial_port *port, struct file *file,
-                      unsigned int value)
+static int qt_tiocmset(struct tty_struct *tty, struct usb_serial_port *port,
+                      struct file *file, unsigned int value)
 {
 
-       __u8 MCR_Value;
+       u8 mcr;
        int status;
-       unsigned int UartNumber;
-
+       unsigned int index;
        struct usb_serial *serial = get_usb_serial(port, __func__);
+
        if (serial == NULL)
                return -ENODEV;
 
@@ -1583,10 +1570,10 @@ static int qt_tiocmset(struct usb_serial_port *port, struct file *file,
     /**************************************************************************************/
     /**  TIOCMGET
      */
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
        status =
-           BoxGetRegister(port->serial, UartNumber, MODEM_CONTROL_REGISTER,
-                          &MCR_Value);
+           BoxGetRegister(port->serial, index, MODEM_CONTROL_REGISTER,
+                          &mcr);
        if (status < 0)
                return -ESPIPE;
 
@@ -1594,17 +1581,17 @@ static int qt_tiocmset(struct usb_serial_port *port, struct file *file,
         * Turn off the RTS and DTR and loopbcck and then only turn on what was
         * asked for
         */
-       MCR_Value &= ~(SERIAL_MCR_RTS | SERIAL_MCR_DTR | SERIAL_MCR_LOOP);
+       mcr &= ~(SERIAL_MCR_RTS | SERIAL_MCR_DTR | SERIAL_MCR_LOOP);
        if (value & TIOCM_RTS)
-               MCR_Value |= SERIAL_MCR_RTS;
+               mcr |= SERIAL_MCR_RTS;
        if (value & TIOCM_DTR)
-               MCR_Value |= SERIAL_MCR_DTR;
+               mcr |= SERIAL_MCR_DTR;
        if (value & TIOCM_LOOP)
-               MCR_Value |= SERIAL_MCR_LOOP;
+               mcr |= SERIAL_MCR_LOOP;
 
        status =
-           BoxSetRegister(port->serial, UartNumber, MODEM_CONTROL_REGISTER,
-                          MCR_Value);
+           BoxSetRegister(port->serial, index, MODEM_CONTROL_REGISTER,
+                          mcr);
        if (status < 0)
                return -ESPIPE;
        else
@@ -1614,18 +1601,16 @@ static int qt_tiocmset(struct usb_serial_port *port, struct file *file,
 static int serial_tiocmget(struct tty_struct *tty, struct file *file)
 {
 
-       struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
-
+       struct usb_serial_port *port = tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        int retval = -ENODEV;
-       unsigned int UartNumber;
+       unsigned int index;
        mydbg("In %s \n", __func__);
 
        if (!serial)
                return -ENODEV;
 
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
 
        down(&port->sem);
 
@@ -1637,56 +1622,55 @@ static int serial_tiocmget(struct tty_struct *tty, struct file *file)
                goto exit;
        }
 
-       retval = qt_tiocmget(port, file);
+       retval = qt_tiocmget(tty, port, file);
 
 exit:
        up(&port->sem);
        return retval;
 }
 
-static int qt_tiocmget(struct usb_serial_port *port, struct file *file)
+static int qt_tiocmget(struct tty_struct *tty,
+                       struct usb_serial_port *port, struct file *file)
 {
 
-       __u8 MCR_Value;
-       __u8 MSR_Value;
+       u8 mcr;
+       u8 msr;
        unsigned int result = 0;
        int status;
-       unsigned int UartNumber;
-       struct tty_struct *tty;
+       unsigned int index;
 
        struct usb_serial *serial = get_usb_serial(port, __func__);
        if (serial == NULL)
                return -ENODEV;
-       tty = port->tty;
 
        mydbg("%s - port %d, tty =0x%p\n", __func__, port->number, tty);
 
     /**************************************************************************************/
     /**  TIOCMGET
      */
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
        status =
-           BoxGetRegister(port->serial, UartNumber, MODEM_CONTROL_REGISTER,
-                          &MCR_Value);
+           BoxGetRegister(port->serial, index, MODEM_CONTROL_REGISTER,
+                          &mcr);
        if (status >= 0) {
                status =
-                   BoxGetRegister(port->serial, UartNumber,
-                                  MODEM_STATUS_REGISTER, &MSR_Value);
+                   BoxGetRegister(port->serial, index,
+                                  MODEM_STATUS_REGISTER, &msr);
 
        }
 
        if (status >= 0) {
-               result = ((MCR_Value & SERIAL_MCR_DTR) ? TIOCM_DTR : 0)
+               result = ((mcr & SERIAL_MCR_DTR) ? TIOCM_DTR : 0)
                    /* DTR IS SET */
-                   | ((MCR_Value & SERIAL_MCR_RTS) ? TIOCM_RTS : 0)
+                   | ((mcr & SERIAL_MCR_RTS) ? TIOCM_RTS : 0)
                    /* RTS IS SET */
-                   | ((MSR_Value & SERIAL_MSR_CTS) ? TIOCM_CTS : 0)
+                   | ((msr & SERIAL_MSR_CTS) ? TIOCM_CTS : 0)
                    /* CTS is set */
-                   | ((MSR_Value & SERIAL_MSR_CD) ? TIOCM_CAR : 0)
+                   | ((msr & SERIAL_MSR_CD) ? TIOCM_CAR : 0)
                    /* Carrier detect is set */
-                   | ((MSR_Value & SERIAL_MSR_RI) ? TIOCM_RI : 0)
+                   | ((msr & SERIAL_MSR_RI) ? TIOCM_RI : 0)
                    /* Ring indicator set */
-                   | ((MSR_Value & SERIAL_MSR_DSR) ? TIOCM_DSR : 0);
+                   | ((msr & SERIAL_MSR_DSR) ? TIOCM_DSR : 0);
                /* DSR is set */
                return result;
 
@@ -1698,17 +1682,16 @@ static int serial_ioctl(struct tty_struct *tty, struct file *file,
                        unsigned int cmd, unsigned long arg)
 {
 
-       struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+       struct usb_serial_port *port = tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        int retval = -ENODEV;
-       unsigned int UartNumber;
+       unsigned int index;
        mydbg("In %s \n", __func__);
 
        if (!serial)
                return -ENODEV;
 
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
 
        down(&port->sem);
 
@@ -1720,125 +1703,34 @@ static int serial_ioctl(struct tty_struct *tty, struct file *file,
                goto exit;
        }
 
-       retval = qt_ioctl(port, file, cmd, arg);
+       retval = qt_ioctl(tty, port, file, cmd, arg);
 
 exit:
        up(&port->sem);
        return retval;
 }
-static int qt_ioctl(struct usb_serial_port *port, struct file *file,
-                   unsigned int cmd, unsigned long arg)
+static int qt_ioctl(struct tty_struct *tty, struct usb_serial_port *port,
+                       struct file *file, unsigned int cmd, unsigned long arg)
 {
-       __u8 MCR_Value;
-       __u8 MSR_Value;
-       unsigned short Prev_MSR_Value;
+       __u8 mcr;
+       __u8 msr;
+       unsigned short prev_msr;
        unsigned int value, result = 0;
        int status;
-       unsigned int UartNumber;
-       struct tty_struct *tty;
+       unsigned int index;
 
        struct usb_serial *serial = get_usb_serial(port, __func__);
        if (serial == NULL)
                return -ENODEV;
-       tty = port->tty;
 
        mydbg("%s - port %d, tty =0x%p\n", __func__, port->number, tty);
 
        /* TIOCMGET */
-       UartNumber = port->tty->index - serial->minor;
-
-       if (cmd == TIOCMGET) {
-               MCR_Value = port->shadowMCR;
-               MSR_Value = port->shadowMSR;
-
-               {
-                       result = ((MCR_Value & SERIAL_MCR_DTR) ? TIOCM_DTR : 0)
-                           /* DTR IS SET */
-                           | ((MCR_Value & SERIAL_MCR_RTS) ? TIOCM_RTS : 0)
-                           /* RTS IS SET */
-                           | ((MSR_Value & SERIAL_MSR_CTS) ? TIOCM_CTS : 0)
-                           /* CTS is set */
-                           | ((MSR_Value & SERIAL_MSR_CD) ? TIOCM_CAR : 0)
-                           /* Carrier detect is set */
-                           | ((MSR_Value & SERIAL_MSR_RI) ? TIOCM_RI : 0)
-                           /* Ring indicator set */
-                           | ((MSR_Value & SERIAL_MSR_DSR) ? TIOCM_DSR : 0);
-                       /* DSR is set */
-                       if (copy_to_user
-                           ((unsigned int *)arg, &result,
-                            sizeof(unsigned int)))
-                               return -EFAULT;
-                       return 0;
-
-               }
-       }
-
-       /* TIOCMBIS, TIOCMBIC, AND TIOCMSET */
-       if (cmd == TIOCMBIS || cmd == TIOCMBIC || cmd == TIOCMSET) {
-               status =
-                   BoxGetRegister(port->serial, UartNumber,
-                                  MODEM_CONTROL_REGISTER, &MCR_Value);
-               if (status < 0)
-                       return -ESPIPE;
-               if (copy_from_user
-                   (&value, (unsigned int *)arg, sizeof(unsigned int)))
-                       return -EFAULT;
-
-               switch (cmd) {
-               case TIOCMBIS:
-                       if (value & TIOCM_RTS)
-                               MCR_Value |= SERIAL_MCR_RTS;
-                       if (value & TIOCM_DTR)
-                               MCR_Value |= SERIAL_MCR_DTR;
-                       if (value & TIOCM_LOOP)
-                               MCR_Value |= SERIAL_MCR_LOOP;
-                       break;
-               case TIOCMBIC:
-                       if (value & TIOCM_RTS)
-                               MCR_Value &= ~SERIAL_MCR_RTS;
-                       if (value & TIOCM_DTR)
-                               MCR_Value &= ~SERIAL_MCR_DTR;
-                       if (value & TIOCM_LOOP)
-                               MCR_Value &= ~SERIAL_MCR_LOOP;
-                       break;
-               case TIOCMSET:
-                       /*
-                        * Turn off the RTS and DTR and loopbcck and then only
-                        * turn on what was asked for
-                        */
-                       MCR_Value &=
-                           ~(SERIAL_MCR_RTS | SERIAL_MCR_DTR |
-                             SERIAL_MCR_LOOP);
-                       if (value & TIOCM_RTS)
-                               MCR_Value |= SERIAL_MCR_RTS;
-                       if (value & TIOCM_DTR)
-                               MCR_Value |= SERIAL_MCR_DTR;
-                       if (value & TIOCM_LOOP)
-                               MCR_Value |= SERIAL_MCR_LOOP;
-                       break;
-               default:
-                       break;
-
-               }
-               status =
-                   BoxSetRegister(port->serial, UartNumber,
-                                  MODEM_CONTROL_REGISTER, MCR_Value);
-               if (status < 0)
-                       return -ESPIPE;
-               else {
-                       port->shadowMCR = MCR_Value;
-                       return 0;
-               }
-
-       }
-    /**************************************************************************************/
-   /**   TIOCMBIS, TIOCMBIC, AND TIOCMSET    end
-   */
-    /**************************************************************************************/
+       index = tty->index - serial->minor;
 
        if (cmd == TIOCMIWAIT) {
                DECLARE_WAITQUEUE(wait, current);
-               Prev_MSR_Value = port->shadowMSR & SERIAL_MSR_MASK;
+               prev_msr = port->shadowMSR & SERIAL_MSR_MASK;
                while (1) {
                        add_wait_queue(&port->wait, &wait);
                        set_current_state(TASK_INTERRUPTIBLE);
@@ -1847,22 +1739,22 @@ static int qt_ioctl(struct usb_serial_port *port, struct file *file,
                        /* see if a signal woke us up */
                        if (signal_pending(current))
                                return -ERESTARTSYS;
-                       MSR_Value = port->shadowMSR & SERIAL_MSR_MASK;
-                       if (MSR_Value == Prev_MSR_Value)
+                       msr = port->shadowMSR & SERIAL_MSR_MASK;
+                       if (msr == prev_msr)
                                return -EIO;    /* no change error */
 
                        if ((arg & TIOCM_RNG
-                            && ((Prev_MSR_Value & SERIAL_MSR_RI) ==
-                                (MSR_Value & SERIAL_MSR_RI)))
+                            && ((prev_msr & SERIAL_MSR_RI) ==
+                                (msr & SERIAL_MSR_RI)))
                            || (arg & TIOCM_DSR
-                               && ((Prev_MSR_Value & SERIAL_MSR_DSR) ==
-                                   (MSR_Value & SERIAL_MSR_DSR)))
+                               && ((prev_msr & SERIAL_MSR_DSR) ==
+                                   (msr & SERIAL_MSR_DSR)))
                            || (arg & TIOCM_CD
-                               && ((Prev_MSR_Value & SERIAL_MSR_CD) ==
-                                   (MSR_Value & SERIAL_MSR_CD)))
+                               && ((prev_msr & SERIAL_MSR_CD) ==
+                                   (msr & SERIAL_MSR_CD)))
                            || (arg & TIOCM_CTS
-                               && ((Prev_MSR_Value & SERIAL_MSR_CTS) ==
-                                   (MSR_Value & SERIAL_MSR_CTS)))) {
+                               && ((prev_msr & SERIAL_MSR_CTS) ==
+                                   (msr & SERIAL_MSR_CTS)))) {
                                return 0;
                        }
 
@@ -1878,7 +1770,7 @@ static int qt_ioctl(struct usb_serial_port *port, struct file *file,
 static void serial_set_termios(struct tty_struct *tty, struct ktermios *old)
 {
        struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+           tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
 
        if (!serial)
@@ -1894,22 +1786,22 @@ static void serial_set_termios(struct tty_struct *tty, struct ktermios *old)
        }
 
        /* pass on to the driver specific version of this function if it is available */
-       qt_set_termios(port, old);
+       qt_set_termios(tty, port, old);
 
 exit:
        up(&port->sem);
 }
 
-static void qt_set_termios(struct usb_serial_port *port,
+static void qt_set_termios(struct tty_struct *tty,
+                          struct usb_serial_port *port,
                           struct ktermios *old_termios)
 {
        unsigned int cflag;
        int baud, divisor, remainder;
-       unsigned char LCR_change_to = 0;
-       struct tty_struct *tty;
+       unsigned char new_LCR = 0;
        int status;
        struct usb_serial *serial;
-       __u16 UartNumber;
+       __u16 index;
        __u16 tmp, tmp2;
 
        mydbg("%s - port %d\n", __func__, port->number);
@@ -1921,59 +1813,46 @@ static void qt_set_termios(struct usb_serial_port *port,
        tmp2 = serial->minor;
        mydbg("%s - serial->minor =  %d\n", __func__, tmp2);
 
-       UartNumber = port->tty->index - serial->minor;
-
-       tty = port->tty;
+       index = port->tty->index - serial->minor;
 
        cflag = tty->termios->c_cflag;
 
-       if (old_termios) {
-               if ((cflag == old_termios->c_cflag)
-                   && (RELEVANT_IFLAG(tty->termios->c_iflag) ==
-                       RELEVANT_IFLAG(old_termios->c_iflag))) {
-                       mydbg("%s - Nothing to change\n", __func__);
-                       return;
-               }
-
-       }
-
        mydbg("%s - 3\n", __func__);
 
        switch (cflag) {
        case CS5:
-               LCR_change_to |= SERIAL_5_DATA;
+               new_LCR |= SERIAL_5_DATA;
                break;
        case CS6:
-               LCR_change_to |= SERIAL_6_DATA;
+               new_LCR |= SERIAL_6_DATA;
                break;
        case CS7:
-               LCR_change_to |= SERIAL_7_DATA;
+               new_LCR |= SERIAL_7_DATA;
                break;
        default:
        case CS8:
-               LCR_change_to |= SERIAL_8_DATA;
+               new_LCR |= SERIAL_8_DATA;
                break;
        }
 
        /* Parity stuff */
        if (cflag & PARENB) {
                if (cflag & PARODD)
-                       LCR_change_to |= SERIAL_ODD_PARITY;
+                       new_LCR |= SERIAL_ODD_PARITY;
                else
-                       LCR_change_to |= SERIAL_EVEN_PARITY;
+                       new_LCR |= SERIAL_EVEN_PARITY;
        }
        if (cflag & CSTOPB)
-               LCR_change_to |= SERIAL_TWO_STOPB;
+               new_LCR |= SERIAL_TWO_STOPB;
        else
-               LCR_change_to |= SERIAL_TWO_STOPB;
+               new_LCR |= SERIAL_TWO_STOPB;
 
        mydbg("%s - 4\n", __func__);
        /* Thats the LCR stuff, go ahead and set it */
        baud = tty_get_baud_rate(tty);
-       if (!baud) {
+       if (!baud)
                /* pick a default, any default... */
                baud = 9600;
-       }
 
        mydbg("%s - got baud = %d\n", __func__, baud);
 
@@ -1986,9 +1865,7 @@ static void qt_set_termios(struct usb_serial_port *port,
        /*
         * Set Baud rate to default and turn off (default)flow control here
         */
-       status =
-           BoxSetUart(serial, UartNumber, (unsigned short)divisor,
-                      LCR_change_to);
+       status = BoxSetUart(serial, index, (unsigned short)divisor, new_LCR);
        if (status < 0) {
                mydbg(__FILE__ "BoxSetUart failed\n");
                return;
@@ -2000,7 +1877,7 @@ static void qt_set_termios(struct usb_serial_port *port,
                      port->number);
 
                /* Enable RTS/CTS flow control */
-               status = BoxSetHW_FlowCtrl(serial, UartNumber, 1);
+               status = BoxSetHW_FlowCtrl(serial, index, 1);
 
                if (status < 0) {
                        mydbg(__FILE__ "BoxSetHW_FlowCtrl failed\n");
@@ -2011,7 +1888,7 @@ static void qt_set_termios(struct usb_serial_port *port,
                mydbg("%s - disabling HW flow control port %d\n", __func__,
                      port->number);
 
-               status = BoxSetHW_FlowCtrl(serial, UartNumber, 0);
+               status = BoxSetHW_FlowCtrl(serial, index, 0);
                if (status < 0) {
                        mydbg(__FILE__ "BoxSetHW_FlowCtrl failed\n");
                        return;
@@ -2025,19 +1902,20 @@ static void qt_set_termios(struct usb_serial_port *port,
                unsigned char stop_char = STOP_CHAR(tty);
                unsigned char start_char = START_CHAR(tty);
                status =
-                   BoxSetSW_FlowCtrl(serial, UartNumber, stop_char,
+                   BoxSetSW_FlowCtrl(serial, index, stop_char,
                                      start_char);
                if (status < 0)
                        mydbg(__FILE__ "BoxSetSW_FlowCtrl (enabled) failed\n");
 
        } else {
                /* disable SW flow control */
-               status = BoxDisable_SW_FlowCtrl(serial, UartNumber);
+               status = BoxDisable_SW_FlowCtrl(serial, index);
                if (status < 0)
                        mydbg(__FILE__ "BoxSetSW_FlowCtrl (diabling) failed\n");
 
        }
-
+       tty->termios->c_cflag &= ~CMSPAR;
+       /* FIXME: Error cases should be returning the actual bits changed only */
 }
 
 /****************************************************************************
@@ -2237,11 +2115,11 @@ static int BoxSetUart(struct usb_serial *serial, unsigned short Uart_Number,
        return result;
 }
 
-static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int UartNumber,
+static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int index,
                             int bSet)
 {
-       __u8 MCR_Value = 0;
-       __u8 MSR_Value = 0, MOUT_Value = 0;
+       __u8 mcr = 0;
+       __u8 msr = 0, MOUT_Value = 0;
        struct usb_serial_port *port;
        unsigned int status;
 
@@ -2249,34 +2127,34 @@ static int BoxSetHW_FlowCtrl(struct usb_serial *serial, unsigned int UartNumber,
 
        if (bSet == 1) {
                /* flow control, box will clear RTS line to prevent remote */
-               MCR_Value = SERIAL_MCR_RTS;
+               mcr = SERIAL_MCR_RTS;
        }                       /* device from xmitting more chars */
        else {
                /* no flow control to remote device */
-               MCR_Value = 0;
+               mcr = 0;
 
        }
-       MOUT_Value = MCR_Value << 8;
+       MOUT_Value = mcr << 8;
 
        if (bSet == 1) {
                /* flow control, box will inhibit xmit data if CTS line is
                 * asserted */
-               MSR_Value = SERIAL_MSR_CTS;
+               msr = SERIAL_MSR_CTS;
        } else {
                /* Box will not inhimbe xmit data due to CTS line */
-               MSR_Value = 0;
+               msr = 0;
        }
-       MOUT_Value |= MSR_Value;
+       MOUT_Value |= msr;
 
        status =
            usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
                            QT_HW_FLOW_CONTROL_MASK, 0x40, MOUT_Value,
-                           UartNumber, NULL, 0, 300);
+                           index, NULL, 0, 300);
        return status;
 
 }
 
-static int BoxSetSW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber,
+static int BoxSetSW_FlowCtrl(struct usb_serial *serial, __u16 index,
                             unsigned char stop_char, unsigned char start_char)
 {
        __u16 nSWflowout;
@@ -2288,17 +2166,17 @@ static int BoxSetSW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber,
        result =
            usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
                            QT_SW_FLOW_CONTROL_MASK, 0x40, nSWflowout,
-                           UartNumber, NULL, 0, 300);
+                           index, NULL, 0, 300);
        return result;
 
 }
-static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber)
+static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 index)
 {
        int result;
 
        result =
            usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-                           QT_SW_FLOW_CONTROL_DISABLE, 0x40, 0, UartNumber,
+                           QT_SW_FLOW_CONTROL_DISABLE, 0x40, 0, index,
                            NULL, 0, 300);
        return result;
 
@@ -2307,7 +2185,7 @@ static int BoxDisable_SW_FlowCtrl(struct usb_serial *serial, __u16 UartNumber)
 static void serial_throttle(struct tty_struct *tty)
 {
        struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+           tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        mydbg("%s - port %d\n", __func__, port->number);
 
@@ -2334,7 +2212,7 @@ exit:
 static void serial_unthrottle(struct tty_struct *tty)
 {
        struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+           tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
        unsigned int result;
 
@@ -2380,20 +2258,19 @@ exit:
 
 static int serial_break(struct tty_struct *tty, int break_state)
 {
-       struct usb_serial_port *port =
-           (struct usb_serial_port *)tty->driver_data;
+       struct usb_serial_port *port = tty->driver_data;
        struct usb_serial *serial = get_usb_serial(port, __func__);
-       __u16 UartNumber, Break_Value;
+       u16 index, onoff;
        unsigned int result;
 
-       UartNumber = port->tty->index - serial->minor;
+       index = tty->index - serial->minor;
        if (!serial)
                return -ENODEV;
 
        if (break_state == -1)
-               Break_Value = 1;
+               onoff = 1;
        else
-               Break_Value = 0;
+               onoff = 0;
 
        down(&port->sem);
 
@@ -2406,7 +2283,7 @@ static int serial_break(struct tty_struct *tty, int break_state)
 
        result =
            usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
-                           QT_BREAK_CONTROL, 0x40, Break_Value, UartNumber,
+                           QT_BREAK_CONTROL, 0x40, onoff, index,
                            NULL, 0, 300);
 
 exit:
index 953684f729da2db0d18bff065ce30ff415a9b6a5..94815634847872885b40a744a2e09662489249ba 100644 (file)
@@ -371,9 +371,9 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,
                printk(KERN_DEBUG "%s\n", slic_proc_version);
        }
 
-       err = pci_set_dma_mask(pcidev, DMA_64BIT_MASK);
+       err = pci_set_dma_mask(pcidev, DMA_BIT_MASK(64));
        if (err) {
-               err = pci_set_dma_mask(pcidev, DMA_32BIT_MASK);
+               err = pci_set_dma_mask(pcidev, DMA_BIT_MASK(32));
                if (err)
                        goto err_out_disable_pci;
        }
index 0050a022010f1344c12716ee34b9caa393846943..891f6e334672d61ee867af2ff453c406ee5aba86 100644 (file)
@@ -934,16 +934,16 @@ static int sxg_entry_probe(struct pci_dev *pcidev,
 
        pci_read_config_byte(pcidev, PCI_REVISION_ID, &revision_id);
 
-       if (!(err = pci_set_dma_mask(pcidev, DMA_64BIT_MASK))) {
-               DBG_ERROR("pci_set_dma_mask(DMA_64BIT_MASK) successful\n");
+       if (!(err = pci_set_dma_mask(pcidev, DMA_BIT_MASK(64)))) {
+               DBG_ERROR("pci_set_dma_mask(DMA_BIT_MASK(64)) successful\n");
        } else {
-               if ((err = pci_set_dma_mask(pcidev, DMA_32BIT_MASK))) {
+               if ((err = pci_set_dma_mask(pcidev, DMA_BIT_MASK(32)))) {
                        DBG_ERROR
                            ("No usable DMA configuration, aborting  err[%x]\n",
                             err);
                        return err;
                }
-               DBG_ERROR("pci_set_dma_mask(DMA_32BIT_MASK) successful\n");
+               DBG_ERROR("pci_set_dma_mask(DMA_BIT_MASK(32)) successful\n");
        }
 
        DBG_ERROR("Call pci_request_regions\n");
index b3d5a23ab56fbf5c3832aa76d69e27caf15a9ff4..869d47cb6db3a5e905d767af2be7cc610622adbc 100644 (file)
@@ -1358,6 +1358,9 @@ static struct usb_device_id acm_ids[] = {
        { USB_DEVICE(0x079b, 0x000f), /* BT On-Air USB MODEM */
        .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
        },
+       { USB_DEVICE(0x0ace, 0x1602), /* ZyDAS 56K USB MODEM */
+       .driver_info = SINGLE_RX_URB,
+       },
        { USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */
        .driver_info = SINGLE_RX_URB, /* firmware bug */
        },
@@ -1493,4 +1496,4 @@ module_exit(acm_exit);
 MODULE_AUTHOR( DRIVER_AUTHOR );
 MODULE_DESCRIPTION( DRIVER_DESC );
 MODULE_LICENSE("GPL");
-
+MODULE_ALIAS_CHARDEV_MAJOR(ACM_TTY_MAJOR);
index f2618d17710d248938632cee6278a2a3bb690a8b..c637207a1c80b63eab4bfa5587d4250bfe0d3c86 100644 (file)
@@ -622,7 +622,7 @@ static int ehci_run (struct usb_hcd *hcd)
                ehci_writel(ehci, 0, &ehci->regs->segment);
 #if 0
 // this is deeply broken on almost all architectures
-               if (!dma_set_mask(hcd->self.controller, DMA_64BIT_MASK))
+               if (!dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64)))
                        ehci_info(ehci, "enabled 64bit DMA\n");
 #endif
        }
index abb9a7706ec7c370dd0835db9d04b0e3f1abc6b8..5aa8bce90e1f3856d7195db5614394a6c709ba9f 100644 (file)
@@ -108,7 +108,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
                case 0x00d8:    /* CK8 */
                case 0x00e8:    /* CK8S */
                        if (pci_set_consistent_dma_mask(pdev,
-                                               DMA_31BIT_MASK) < 0)
+                                               DMA_BIT_MASK(31)) < 0)
                                ehci_warn(ehci, "can't enable NVidia "
                                        "workaround for >2GB RAM\n");
                        break;
index 9c9da35abc6c010c6929a1e515fc4179ef898111..1ba9f9a8c3088bd607fb95b5599e0982c6c8c9d2 100644 (file)
@@ -81,7 +81,7 @@ static int ps3_ehci_probe(struct ps3_system_bus_device *dev)
        int result;
        struct usb_hcd *hcd;
        unsigned int virq;
-       static u64 dummy_mask = DMA_32BIT_MASK;
+       static u64 dummy_mask = DMA_BIT_MASK(32);
 
        if (usb_disabled()) {
                result = -ENODEV;
index 3c1a3b5f89f19fb19dde0962b8b4e6a2e704b9e4..3d19103173286e849e54a21ede9012b04426ee24 100644 (file)
@@ -80,7 +80,7 @@ static int ps3_ohci_probe(struct ps3_system_bus_device *dev)
        int result;
        struct usb_hcd *hcd;
        unsigned int virq;
-       static u64 dummy_mask = DMA_32BIT_MASK;
+       static u64 dummy_mask = DMA_BIT_MASK(32);
 
        if (usb_disabled()) {
                result = -ENODEV;
index 1aed584be5eb9a528d904b3b3209afef29f40383..751a533a4347e7324725afb8948b75fcb2437bbd 100644 (file)
@@ -79,6 +79,7 @@ static struct usb_device_id id_table [] = {
        { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
        { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
        { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
+       { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
        { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
        { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
        { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
index 54974f446a8c2f51f213d293d3a2f53bcaf6479d..1d7a22e3a9fd1daa5df3c239185670763e7a5563 100644 (file)
@@ -7,6 +7,10 @@
  *     (at your option) any later version.
  * 
  */
+
+#define BENQ_VENDOR_ID                 0x04a5
+#define BENQ_PRODUCT_ID_S81            0x4027
+
 #define PL2303_VENDOR_ID       0x067b
 #define PL2303_PRODUCT_ID      0x2303
 #define PL2303_PRODUCT_ID_RSAQ2                0x04bb
index 8b3cbc87adc7c1958b7a2204239802f2f7b0499d..69879e4379402f63ad53579c6a1184d762322260 100644 (file)
@@ -139,14 +139,6 @@ static int symbol_open(struct tty_struct *tty, struct usb_serial_port *port,
        priv->port = port;
        spin_unlock_irqrestore(&priv->lock, flags);
 
-       /*
-        * Force low_latency on so that our tty_push actually forces the data
-        * through, otherwise it is scheduled, and with high data rates (like
-        * with OHCI) data can get lost.
-        */
-       if (tty)
-               tty->low_latency = 1;
-
        /* Start reading from the device */
        usb_fill_int_urb(priv->int_urb, priv->udev,
                         usb_rcvintpipe(priv->udev, priv->int_address),
@@ -205,62 +197,6 @@ static void symbol_unthrottle(struct tty_struct *tty)
                                                        __func__, result);
 }
 
-static int symbol_ioctl(struct tty_struct *tty, struct file *file,
-                       unsigned int cmd, unsigned long arg)
-{
-       struct usb_serial_port *port = tty->driver_data;
-       struct device *dev = &port->dev;
-
-       /*
-        * Right now we need to figure out what commands
-        * most userspace tools want to see for this driver,
-        * so just log the things.
-        */
-       switch (cmd) {
-       case TIOCSERGETLSR:
-               dev_info(dev, "%s: TIOCSERGETLSR\n", __func__);
-               break;
-
-       case TIOCGSERIAL:
-               dev_info(dev, "%s: TIOCGSERIAL\n", __func__);
-               break;
-
-       case TIOCMIWAIT:
-               dev_info(dev, "%s: TIOCMIWAIT\n", __func__);
-               break;
-
-       case TIOCGICOUNT:
-               dev_info(dev, "%s: TIOCGICOUNT\n", __func__);
-               break;
-       default:
-               dev_info(dev, "%s: unknown (%d)\n", __func__, cmd);
-       }
-       return -ENOIOCTLCMD;
-}
-
-static int symbol_tiocmget(struct tty_struct *tty, struct file *file)
-{
-       struct usb_serial_port *port = tty->driver_data;
-       struct device *dev = &port->dev;
-
-       /* TODO */
-       /* probably just need to shadow whatever was sent to us here */
-       dev_info(dev, "%s\n", __func__);
-       return 0;
-}
-
-static int symbol_tiocmset(struct tty_struct *tty, struct file *file,
-                          unsigned int set, unsigned int clear)
-{
-       struct usb_serial_port *port = tty->driver_data;
-       struct device *dev = &port->dev;
-
-       /* TODO */
-       /* probably just need to shadow whatever was sent to us here */
-       dev_info(dev, "%s\n", __func__);
-       return 0;
-}
-
 static int symbol_startup(struct usb_serial *serial)
 {
        struct symbol_private *priv;
@@ -367,9 +303,6 @@ static struct usb_serial_driver symbol_device = {
        .shutdown =             symbol_shutdown,
        .throttle =             symbol_throttle,
        .unthrottle =           symbol_unthrottle,
-       .ioctl =                symbol_ioctl,
-       .tiocmget =             symbol_tiocmget,
-       .tiocmset =             symbol_tiocmset,
 };
 
 static int __init symbol_init(void)
index 1f8964ed98825914d9b68ebde4a1345dac33a18e..2e2784627ad66cf8502361fa59c2ad029e138d82 100644 (file)
@@ -160,10 +160,10 @@ static int whci_probe(struct pci_dev *pci, const struct pci_device_id *id)
        pci_enable_msi(pci);
        pci_set_master(pci);
        err = -ENXIO;
-       if (!pci_set_dma_mask(pci, DMA_64BIT_MASK))
-               pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK);
-       else if (!pci_set_dma_mask(pci, DMA_32BIT_MASK))
-               pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK);
+       if (!pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
+               pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
+       else if (!pci_set_dma_mask(pci, DMA_BIT_MASK(32)))
+               pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
        else
                goto error_dma;
 
index ffe2f2796e290ba55352bca2e64264eac59df0f4..7826bdce4bbe307042e4459398ff1b6ba87bd3ca 100644 (file)
@@ -1550,6 +1550,7 @@ config FB_3DFX
        select FB_CFB_IMAGEBLIT
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
+       select FB_MODE_HELPERS
        help
          This driver supports graphics boards with the 3Dfx Banshee,
          Voodoo3 or VSA-100 (aka Voodoo4/5) chips. Say Y if you have
@@ -1565,6 +1566,14 @@ config FB_3DFX_ACCEL
        This will compile the 3Dfx Banshee/Voodoo3/VSA-100 frame buffer
        device driver with acceleration functions.
 
+config FB_3DFX_I2C
+       bool "Enable DDC/I2C support"
+       depends on FB_3DFX && EXPERIMENTAL
+       select FB_DDC
+       default y
+       help
+         Say Y here if you want DDC/I2C support for your 3dfx Voodoo3.
+
 config FB_VOODOO1
        tristate "3Dfx Voodoo Graphics (sst1) support"
        depends on FB && PCI
index 72facb9eb7db7661fbf8ef77cc4c66aca50b3184..f9d19be05540a3a831886236f778b61645bfec0c 100644 (file)
@@ -84,6 +84,15 @@ config LCD_TOSA
          If you have an Sharp SL-6000 Zaurus say Y to enable a driver
          for its LCD.
 
+config LCD_HP700
+       tristate "HP Jornada 700 series LCD Driver"
+       depends on LCD_CLASS_DEVICE
+       depends on SA1100_JORNADA720_SSP && !PREEMPT
+       default y
+       help
+         If you have an HP Jornada 700 series handheld (710/720/728)
+         say Y to enable LCD control driver.
+
 #
 # Backlight
 #
@@ -157,6 +166,15 @@ config BACKLIGHT_HP680
          If you have a HP Jornada 680, say y to enable the
          backlight driver.
 
+config BACKLIGHT_HP700
+       tristate "HP Jornada 700 series Backlight Driver"
+       depends on BACKLIGHT_CLASS_DEVICE
+       depends on SA1100_JORNADA720_SSP && !PREEMPT
+       default y
+       help
+         If you have an HP Jornada 700 series,
+         say Y to include backlight control driver.
+
 config BACKLIGHT_PROGEAR
        tristate "Frontpath ProGear Backlight Driver"
        depends on BACKLIGHT_CLASS_DEVICE && PCI && X86
index 63d75949816544149506cd9ddd750d0793b81cf4..4eb178c1d684a25850cff30bea530daeb6cd285b 100644 (file)
@@ -2,6 +2,7 @@
 
 obj-$(CONFIG_LCD_CLASS_DEVICE)     += lcd.o
 obj-$(CONFIG_LCD_CORGI)                   += corgi_lcd.o
+obj-$(CONFIG_LCD_HP700)                   += jornada720_lcd.o
 obj-$(CONFIG_LCD_LTV350QV)        += ltv350qv.o
 obj-$(CONFIG_LCD_ILI9320)         += ili9320.o
 obj-$(CONFIG_LCD_PLATFORM)        += platform_lcd.o
@@ -12,6 +13,7 @@ obj-$(CONFIG_LCD_TOSA)                   += tosa_lcd.o
 obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
 obj-$(CONFIG_BACKLIGHT_ATMEL_PWM)    += atmel-pwm-bl.o
 obj-$(CONFIG_BACKLIGHT_GENERIC)        += generic_bl.o
+obj-$(CONFIG_BACKLIGHT_HP700)  += jornada720_bl.o
 obj-$(CONFIG_BACKLIGHT_HP680)  += hp680_bl.o
 obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o
 obj-$(CONFIG_BACKLIGHT_OMAP1)  += omap1_bl.o
diff --git a/drivers/video/backlight/jornada720_bl.c b/drivers/video/backlight/jornada720_bl.c
new file mode 100644 (file)
index 0000000..c3ebb6b
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ *
+ * Backlight driver for HP Jornada 700 series (710/720/728)
+ * Copyright (C) 2006-2009 Kristoffer Ericson <kristoffer.ericson@gmail.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 or any later version as published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/backlight.h>
+#include <linux/device.h>
+#include <linux/fb.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#include <mach/jornada720.h>
+#include <mach/hardware.h>
+
+#include <video/s1d13xxxfb.h>
+
+#define BL_MAX_BRIGHT  255
+#define BL_DEF_BRIGHT  25
+
+static int jornada_bl_get_brightness(struct backlight_device *bd)
+{
+       int ret;
+
+       /* check if backlight is on */
+       if (!(PPSR & PPC_LDD1))
+               return 0;
+
+       jornada_ssp_start();
+
+       /* cmd should return txdummy */
+       ret = jornada_ssp_byte(GETBRIGHTNESS);
+
+       if (jornada_ssp_byte(GETBRIGHTNESS) != TXDUMMY) {
+               printk(KERN_ERR "bl : get brightness timeout\n");
+               jornada_ssp_end();
+               return -ETIMEDOUT;
+       } else /* exchange txdummy for value */
+               ret = jornada_ssp_byte(TXDUMMY);
+
+       jornada_ssp_end();
+
+       return (BL_MAX_BRIGHT - ret);
+}
+
+static int jornada_bl_update_status(struct backlight_device *bd)
+{
+       int ret = 0;
+
+       jornada_ssp_start();
+
+       /* If backlight is off then really turn it off */
+       if ((bd->props.power != FB_BLANK_UNBLANK) || (bd->props.fb_blank != FB_BLANK_UNBLANK)) {
+               ret = jornada_ssp_byte(BRIGHTNESSOFF);
+               if (ret != TXDUMMY) {
+                       printk(KERN_INFO "bl : brightness off timeout\n");
+                       /* turn off backlight */
+                       PPSR &= ~PPC_LDD1;
+                       PPDR |= PPC_LDD1;
+                       ret = -ETIMEDOUT;
+               }
+       } else  /* turn on backlight */
+               PPSR |= PPC_LDD1;
+
+               /* send command to our mcu */
+               if (jornada_ssp_byte(SETBRIGHTNESS) != TXDUMMY) {
+                       printk(KERN_INFO "bl : failed to set brightness\n");
+                       ret = -ETIMEDOUT;
+                       goto out
+               }
+
+               /* at this point we expect that the mcu has accepted
+                  our command and is waiting for our new value
+                  please note that maximum brightness is 255,
+                  but due to physical layout it is equal to 0, so we simply
+                  invert the value (MAX VALUE - NEW VALUE). */
+               if (jornada_ssp_byte(BL_MAX_BRIGHT - bd->props.brightness) != TXDUMMY) {
+                       printk(KERN_ERR "bl : set brightness failed\n");
+                       ret = -ETIMEDOUT;
+               }
+
+               /* If infact we get an TXDUMMY as output we are happy and dont
+                  make any further comments about it */
+out:
+       jornada_ssp_end();
+
+       return ret;
+}
+
+static struct backlight_ops jornada_bl_ops = {
+       .get_brightness = jornada_bl_get_brightness,
+       .update_status = jornada_bl_update_status,
+       .options = BL_CORE_SUSPENDRESUME,
+};
+
+static int jornada_bl_probe(struct platform_device *pdev)
+{
+       int ret;
+       struct backlight_device *bd;
+
+       bd = backlight_device_register(S1D_DEVICENAME, &pdev->dev, NULL, &jornada_bl_ops);
+
+       if (IS_ERR(bd)) {
+               ret = PTR_ERR(bd);
+               printk(KERN_ERR "bl : failed to register device, err=%x\n", ret);
+               return ret;
+       }
+
+       bd->props.power = FB_BLANK_UNBLANK;
+       bd->props.brightness = BL_DEF_BRIGHT;
+       /* note. make sure max brightness is set otherwise
+          you will get seemingly non-related errors when
+          trying to change brightness */
+       bd->props.max_brightness = BL_MAX_BRIGHT;
+       jornada_bl_update_status(bd);
+
+       platform_set_drvdata(pdev, bd);
+       printk(KERN_INFO "HP Jornada 700 series backlight driver\n");
+
+       return 0;
+}
+
+static int jornada_bl_remove(struct platform_device *pdev)
+{
+       struct backlight_device *bd = platform_get_drvdata(pdev);
+
+       backlight_device_unregister(bd);
+
+       return 0;
+}
+
+static struct platform_driver jornada_bl_driver = {
+       .probe          = jornada_bl_probe,
+       .remove         = jornada_bl_remove,
+       .driver = {
+               .name   = "jornada_bl",
+       },
+};
+
+int __init jornada_bl_init(void)
+{
+       return platform_driver_register(&jornada_bl_driver);
+}
+
+void __exit jornada_bl_exit(void)
+{
+       platform_driver_unregister(&jornada_bl_driver);
+}
+
+MODULE_AUTHOR("Kristoffer Ericson <kristoffer.ericson>");
+MODULE_DESCRIPTION("HP Jornada 710/720/728 Backlight driver");
+MODULE_LICENSE("GPL");
+
+module_init(jornada_bl_init);
+module_exit(jornada_bl_exit);
diff --git a/drivers/video/backlight/jornada720_lcd.c b/drivers/video/backlight/jornada720_lcd.c
new file mode 100644 (file)
index 0000000..cbbb167
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ *
+ * LCD driver for HP Jornada 700 series (710/720/728)
+ * Copyright (C) 2006-2009 Kristoffer Ericson <kristoffer.ericson@gmail.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 or any later version as published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/device.h>
+#include <linux/fb.h>
+#include <linux/kernel.h>
+#include <linux/lcd.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+
+#include <mach/jornada720.h>
+#include <mach/hardware.h>
+
+#include <video/s1d13xxxfb.h>
+
+#define LCD_MAX_CONTRAST       0xff
+#define LCD_DEF_CONTRAST       0x80
+
+static int jornada_lcd_get_power(struct lcd_device *dev)
+{
+       /* LDD2 in PPC = LCD POWER */
+       if (PPSR & PPC_LDD2)
+               return FB_BLANK_UNBLANK;        /* PW ON */
+       else
+               return FB_BLANK_POWERDOWN;      /* PW OFF */
+}
+
+static int jornada_lcd_get_contrast(struct lcd_device *dev)
+{
+       int ret;
+
+       if (jornada_lcd_get_power(dev) != FB_BLANK_UNBLANK)
+               return 0;
+
+       jornada_ssp_start();
+
+       if (jornada_ssp_byte(GETCONTRAST) != TXDUMMY) {
+               printk(KERN_ERR "lcd: get contrast failed\n");
+               jornada_ssp_end();
+               return -ETIMEDOUT;
+       } else {
+               ret = jornada_ssp_byte(TXDUMMY);
+               jornada_ssp_end();
+               return ret;
+       }
+}
+
+static int jornada_lcd_set_contrast(struct lcd_device *dev, int value)
+{
+       int ret;
+
+       jornada_ssp_start();
+
+       /* start by sending our set contrast cmd to mcu */
+       ret = jornada_ssp_byte(SETCONTRAST);
+
+       /* push the new value */
+       if (jornada_ssp_byte(value) != TXDUMMY) {
+               printk(KERN_ERR "lcd : set contrast failed\n");
+               jornada_ssp_end();
+               return -ETIMEDOUT;
+       }
+
+       /* if we get here we can assume everything went well */
+       jornada_ssp_end();
+
+       return 0;
+}
+
+static int jornada_lcd_set_power(struct lcd_device *dev, int power)
+{
+       if (power != FB_BLANK_UNBLANK) {
+               PPSR &= ~PPC_LDD2;
+               PPDR |= PPC_LDD2;
+       } else
+               PPSR |= PPC_LDD2;
+
+       return 0;
+}
+
+static struct lcd_ops jornada_lcd_props = {
+       .get_contrast = jornada_lcd_get_contrast,
+       .set_contrast = jornada_lcd_set_contrast,
+       .get_power = jornada_lcd_get_power,
+       .set_power = jornada_lcd_set_power,
+};
+
+static int jornada_lcd_probe(struct platform_device *pdev)
+{
+       struct lcd_device *lcd_device;
+       int ret;
+
+       lcd_device = lcd_device_register(S1D_DEVICENAME, &pdev->dev, NULL, &jornada_lcd_props);
+
+       if (IS_ERR(lcd_device)) {
+               ret = PTR_ERR(lcd_device);
+               printk(KERN_ERR "lcd : failed to register device\n");
+               return ret;
+       }
+
+       platform_set_drvdata(pdev, lcd_device);
+
+       /* lets set our default values */
+       jornada_lcd_set_contrast(lcd_device, LCD_DEF_CONTRAST);
+       jornada_lcd_set_power(lcd_device, FB_BLANK_UNBLANK);
+       /* give it some time to startup */
+       msleep(100);
+
+       return 0;
+}
+
+static int jornada_lcd_remove(struct platform_device *pdev)
+{
+       struct lcd_device *lcd_device = platform_get_drvdata(pdev);
+
+       lcd_device_unregister(lcd_device);
+
+       return 0;
+}
+
+static struct platform_driver jornada_lcd_driver = {
+       .probe  = jornada_lcd_probe,
+       .remove = jornada_lcd_remove,
+       .driver = {
+               .name   = "jornada_lcd",
+       },
+};
+
+int __init jornada_lcd_init(void)
+{
+       return platform_driver_register(&jornada_lcd_driver);
+}
+
+void __exit jornada_lcd_exit(void)
+{
+       platform_driver_unregister(&jornada_lcd_driver);
+}
+
+MODULE_AUTHOR("Kristoffer Ericson <kristoffer.ericson@gmail.com>");
+MODULE_DESCRIPTION("HP Jornada 710/720/728 LCD driver");
+MODULE_LICENSE("GPL");
+
+module_init(jornada_lcd_init);
+module_exit(jornada_lcd_exit);
index 65864c500455677a1ef540579c0817f32fd62478..3bb4c0a50c62f501fca12471a09c046141d6ddca 100644 (file)
 
 static struct backlight_device *mbp_backlight_device;
 
-static struct dmi_system_id __initdata mbp_device_table[] = {
+/* Structure to be passed to the DMI_MATCH function. */
+struct dmi_match_data {
+       /* I/O resource to allocate. */
+       unsigned long iostart;
+       unsigned long iolen;
+       /* Backlight operations structure. */
+       struct backlight_ops backlight_ops;
+};
+
+/* Module parameters. */
+static int debug;
+module_param_named(debug, debug, int, 0644);
+MODULE_PARM_DESC(debug, "Set to one to enable debugging messages.");
+
+/*
+ * Implementation for MacBooks with Intel chipset.
+ */
+static int intel_chipset_send_intensity(struct backlight_device *bd)
+{
+       int intensity = bd->props.brightness;
+
+       if (debug)
+               printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n",
+                      intensity);
+
+       outb(0x04 | (intensity << 4), 0xb3);
+       outb(0xbf, 0xb2);
+       return 0;
+}
+
+static int intel_chipset_get_intensity(struct backlight_device *bd)
+{
+       int intensity;
+
+       outb(0x03, 0xb3);
+       outb(0xbf, 0xb2);
+       intensity = inb(0xb3) >> 4;
+
+       if (debug)
+               printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n",
+                      intensity);
+
+       return intensity;
+}
+
+static const struct dmi_match_data intel_chipset_data = {
+       .iostart = 0xb2,
+       .iolen = 2,
+       .backlight_ops  = {
+               .options        = BL_CORE_SUSPENDRESUME,
+               .get_brightness = intel_chipset_get_intensity,
+               .update_status  = intel_chipset_send_intensity,
+       }
+};
+
+/*
+ * Implementation for MacBooks with Nvidia chipset.
+ */
+static int nvidia_chipset_send_intensity(struct backlight_device *bd)
+{
+       int intensity = bd->props.brightness;
+
+       if (debug)
+               printk(KERN_DEBUG "mbp_nvidia_bl: setting brightness to %d\n",
+                      intensity);
+
+       outb(0x04 | (intensity << 4), 0x52f);
+       outb(0xbf, 0x52e);
+       return 0;
+}
+
+static int nvidia_chipset_get_intensity(struct backlight_device *bd)
+{
+       int intensity;
+
+       outb(0x03, 0x52f);
+       outb(0xbf, 0x52e);
+       intensity = inb(0x52f) >> 4;
+
+       if (debug)
+               printk(KERN_DEBUG "mbp_nvidia_bl: read brightness of %d\n",
+                      intensity);
+
+       return intensity;
+}
+
+static const struct dmi_match_data nvidia_chipset_data = {
+       .iostart = 0x52e,
+       .iolen = 2,
+       .backlight_ops          = {
+               .options        = BL_CORE_SUSPENDRESUME,
+               .get_brightness = nvidia_chipset_get_intensity,
+               .update_status  = nvidia_chipset_send_intensity
+       }
+};
+
+/*
+ * DMI matching.
+ */
+static /* const */ struct dmi_match_data *driver_data;
+
+static int mbp_dmi_match(const struct dmi_system_id *id)
+{
+       driver_data = id->driver_data;
+
+       printk(KERN_INFO "mbp_nvidia_bl: %s detected\n", id->ident);
+       return 1;
+}
+
+static const struct dmi_system_id __initdata mbp_device_table[] = {
        {
-               .ident = "3,1",
-               .matches = {
+               .callback       = mbp_dmi_match,
+               .ident          = "MacBookPro 3,1",
+               .matches        = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
                },
+               .driver_data    = (void *)&intel_chipset_data,
        },
        {
-               .ident = "3,2",
-               .matches = {
+               .callback       = mbp_dmi_match,
+               .ident          = "MacBookPro 3,2",
+               .matches        = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,2"),
                },
+               .driver_data    = (void *)&intel_chipset_data,
        },
        {
-               .ident = "4,1",
-               .matches = {
+               .callback       = mbp_dmi_match,
+               .ident          = "MacBookPro 4,1",
+               .matches        = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4,1"),
                },
+               .driver_data    = (void *)&intel_chipset_data,
+       },
+       {
+               .callback       = mbp_dmi_match,
+               .ident          = "MacBook 5,1",
+               .matches        = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,1"),
+               },
+               .driver_data    = (void *)&nvidia_chipset_data,
+       },
+       {
+               .callback       = mbp_dmi_match,
+               .ident          = "MacBookAir 2,1",
+               .matches        = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2,1"),
+               },
+               .driver_data    = (void *)&nvidia_chipset_data,
+       },
+       {
+               .callback       = mbp_dmi_match,
+               .ident          = "MacBookPro 5,1",
+               .matches        = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"),
+               },
+               .driver_data    = (void *)&nvidia_chipset_data,
        },
        { }
 };
 
-static int mbp_send_intensity(struct backlight_device *bd)
-{
-       int intensity = bd->props.brightness;
-
-       outb(0x04 | (intensity << 4), 0xb3);
-       outb(0xbf, 0xb2);
-
-       return 0;
-}
-
-static int mbp_get_intensity(struct backlight_device *bd)
-{
-       outb(0x03, 0xb3);
-       outb(0xbf, 0xb2);
-       return inb(0xb3) >> 4;
-}
-
-static struct backlight_ops mbp_ops = {
-       .options = BL_CORE_SUSPENDRESUME,
-       .get_brightness = mbp_get_intensity,
-       .update_status  = mbp_send_intensity,
-};
-
 static int __init mbp_init(void)
 {
        if (!dmi_check_system(mbp_device_table))
                return -ENODEV;
 
-       if (!request_region(0xb2, 2, "Macbook Pro backlight"))
+       if (!request_region(driver_data->iostart, driver_data->iolen, 
+                                               "Macbook Pro backlight"))
                return -ENXIO;
 
        mbp_backlight_device = backlight_device_register("mbp_backlight",
-                                                        NULL, NULL,
-                                                        &mbp_ops);
+                                       NULL, NULL, &driver_data->backlight_ops);
        if (IS_ERR(mbp_backlight_device)) {
-               release_region(0xb2, 2);
+               release_region(driver_data->iostart, driver_data->iolen);
                return PTR_ERR(mbp_backlight_device);
        }
 
        mbp_backlight_device->props.max_brightness = 15;
        mbp_backlight_device->props.brightness =
-               mbp_get_intensity(mbp_backlight_device);
+               driver_data->backlight_ops.get_brightness(mbp_backlight_device);
        backlight_update_status(mbp_backlight_device);
 
        return 0;
@@ -103,7 +222,7 @@ static void __exit mbp_exit(void)
 {
        backlight_device_unregister(mbp_backlight_device);
 
-       release_region(0xb2, 2);
+       release_region(driver_data->iostart, driver_data->iolen);
 }
 
 module_init(mbp_init);
index ea07258565f0e686186ba3479baf5b45ed92ea29..e641584e212e64c087cada21136b6840ff18d2e5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * simple PWM based backlight control, board code has to setup
  * 1) pin configuration so PWM waveforms can output
- * 2) platform_data casts to the PWM id (0/1/2/3 on PXA)
+ * 2) platform_data being correctly configured
  *
  * 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
@@ -97,7 +97,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
        } else
                dev_dbg(&pdev->dev, "got pwm for backlight\n");
 
-       bl = backlight_device_register(pdev->name, &pdev->dev,
+       bl = backlight_device_register(dev_name(&pdev->dev), &pdev->dev,
                        pb, &pwm_backlight_ops);
        if (IS_ERR(bl)) {
                dev_err(&pdev->dev, "failed to register backlight\n");
index fb51197d1c98e227cabb96e8244585851a366ff2..f153c581cbd7bbe99f4558f98e5975b935463263 100644 (file)
@@ -1352,14 +1352,15 @@ static int fsl_diu_resume(struct of_device *ofdev)
 #endif                         /* CONFIG_PM */
 
 /* Align to 64-bit(8-byte), 32-byte, etc. */
-static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align)
+static int allocate_buf(struct device *dev, struct diu_addr *buf, u32 size,
+                       u32 bytes_align)
 {
        u32 offset, ssize;
        u32 mask;
        dma_addr_t paddr = 0;
 
        ssize = size + bytes_align;
-       buf->vaddr = dma_alloc_coherent(NULL, ssize, &paddr, GFP_DMA |
+       buf->vaddr = dma_alloc_coherent(dev, ssize, &paddr, GFP_DMA |
                                                             __GFP_ZERO);
        if (!buf->vaddr)
                return -ENOMEM;
@@ -1376,9 +1377,10 @@ static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align)
        return 0;
 }
 
-static void free_buf(struct diu_addr *buf, u32 size, u32 bytes_align)
+static void free_buf(struct device *dev, struct diu_addr *buf, u32 size,
+                    u32 bytes_align)
 {
-       dma_free_coherent(NULL, size + bytes_align,
+       dma_free_coherent(dev, size + bytes_align,
                                buf->vaddr, (buf->paddr - buf->offset));
        return;
 }
@@ -1476,17 +1478,19 @@ static int __devinit fsl_diu_probe(struct of_device *ofdev,
        machine_data->monitor_port = monitor_port;
 
        /* Area descriptor memory pool aligns to 64-bit boundary */
-       if (allocate_buf(&pool.ad, sizeof(struct diu_ad) * FSL_AOI_NUM, 8))
+       if (allocate_buf(&ofdev->dev, &pool.ad,
+                        sizeof(struct diu_ad) * FSL_AOI_NUM, 8))
                return -ENOMEM;
 
        /* Get memory for Gamma Table  - 32-byte aligned memory */
-       if (allocate_buf(&pool.gamma, 768, 32)) {
+       if (allocate_buf(&ofdev->dev, &pool.gamma, 768, 32)) {
                ret = -ENOMEM;
                goto error;
        }
 
        /* For performance, cursor bitmap buffer aligns to 32-byte boundary */
-       if (allocate_buf(&pool.cursor, MAX_CURS * MAX_CURS * 2, 32)) {
+       if (allocate_buf(&ofdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2,
+                        32)) {
                ret = -ENOMEM;
                goto error;
        }
@@ -1554,11 +1558,13 @@ error:
                i > 0; i--)
                uninstall_fb(machine_data->fsl_diu_info[i - 1]);
        if (pool.ad.vaddr)
-               free_buf(&pool.ad, sizeof(struct diu_ad) * FSL_AOI_NUM, 8);
+               free_buf(&ofdev->dev, &pool.ad,
+                        sizeof(struct diu_ad) * FSL_AOI_NUM, 8);
        if (pool.gamma.vaddr)
-               free_buf(&pool.gamma, 768, 32);
+               free_buf(&ofdev->dev, &pool.gamma, 768, 32);
        if (pool.cursor.vaddr)
-               free_buf(&pool.cursor, MAX_CURS * MAX_CURS * 2, 32);
+               free_buf(&ofdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2,
+                        32);
        if (machine_data->dummy_aoi_virt)
                fsl_diu_free(machine_data->dummy_aoi_virt, 64);
        iounmap(dr.diu_reg);
@@ -1584,11 +1590,13 @@ static int fsl_diu_remove(struct of_device *ofdev)
        for (i = ARRAY_SIZE(machine_data->fsl_diu_info); i > 0; i--)
                uninstall_fb(machine_data->fsl_diu_info[i - 1]);
        if (pool.ad.vaddr)
-               free_buf(&pool.ad, sizeof(struct diu_ad) * FSL_AOI_NUM, 8);
+               free_buf(&ofdev->dev, &pool.ad,
+                        sizeof(struct diu_ad) * FSL_AOI_NUM, 8);
        if (pool.gamma.vaddr)
-               free_buf(&pool.gamma, 768, 32);
+               free_buf(&ofdev->dev, &pool.gamma, 768, 32);
        if (pool.cursor.vaddr)
-               free_buf(&pool.cursor, MAX_CURS * MAX_CURS * 2, 32);
+               free_buf(&ofdev->dev, &pool.cursor, MAX_CURS * MAX_CURS * 2,
+                        32);
        if (machine_data->dummy_aoi_virt)
                fsl_diu_free(machine_data->dummy_aoi_virt, 64);
        iounmap(dr.diu_reg);
index fa1a512ce030d501999cacb3121d36909c89926a..21b3692092f2e8925cac85c15117f2bb565e4335 100644 (file)
@@ -400,12 +400,12 @@ static void sdc_disable_channel(struct mx3fb_info *mx3_fbi)
 static int sdc_set_window_pos(struct mx3fb_data *mx3fb, enum ipu_channel channel,
                              int16_t x_pos, int16_t y_pos)
 {
-       x_pos += mx3fb->h_start_width;
-       y_pos += mx3fb->v_start_width;
-
        if (channel != IDMAC_SDC_0)
                return -EINVAL;
 
+       x_pos += mx3fb->h_start_width;
+       y_pos += mx3fb->v_start_width;
+
        mx3fb_write_reg(mx3fb, (x_pos << 16) | y_pos, SDC_BG_POS);
        return 0;
 }
@@ -491,11 +491,13 @@ static int sdc_init_panel(struct mx3fb_data *mx3fb, enum ipu_panel panel,
         * 2^4 to get fractional part, as long as we stay under ~250MHz and on
         * i.MX31 it (HSP_CLK) is <= 178MHz. Currently 128.267MHz
         */
-       dev_dbg(mx3fb->dev, "pixel clk = %d\n", pixel_clk);
-
        ipu_clk = clk_get(mx3fb->dev, NULL);
-       div = clk_get_rate(ipu_clk) * 16 / pixel_clk;
-       clk_put(ipu_clk);
+       if (!IS_ERR(ipu_clk)) {
+               div = clk_get_rate(ipu_clk) * 16 / pixel_clk;
+               clk_put(ipu_clk);
+       } else {
+               div = 0;
+       }
 
        if (div < 0x40) {       /* Divider less than 4 */
                dev_dbg(mx3fb->dev,
@@ -503,6 +505,9 @@ static int sdc_init_panel(struct mx3fb_data *mx3fb, enum ipu_panel panel,
                div = 0x40;
        }
 
+       dev_dbg(mx3fb->dev, "pixel clk = %u, divider %u.%u\n",
+               pixel_clk, div >> 4, (div & 7) * 125);
+
        spin_lock_irqsave(&mx3fb->lock, lock_flags);
 
        /*
@@ -515,16 +520,16 @@ static int sdc_init_panel(struct mx3fb_data *mx3fb, enum ipu_panel panel,
        /* DI settings */
        old_conf = mx3fb_read_reg(mx3fb, DI_DISP_IF_CONF) & 0x78FFFFFF;
        old_conf |= sig.datamask_en << DI_D3_DATAMSK_SHIFT |
-           sig.clksel_en << DI_D3_CLK_SEL_SHIFT |
-           sig.clkidle_en << DI_D3_CLK_IDLE_SHIFT;
+               sig.clksel_en << DI_D3_CLK_SEL_SHIFT |
+               sig.clkidle_en << DI_D3_CLK_IDLE_SHIFT;
        mx3fb_write_reg(mx3fb, old_conf, DI_DISP_IF_CONF);
 
        old_conf = mx3fb_read_reg(mx3fb, DI_DISP_SIG_POL) & 0xE0FFFFFF;
        old_conf |= sig.data_pol << DI_D3_DATA_POL_SHIFT |
-           sig.clk_pol << DI_D3_CLK_POL_SHIFT |
-           sig.enable_pol << DI_D3_DRDY_SHARP_POL_SHIFT |
-           sig.Hsync_pol << DI_D3_HSYNC_POL_SHIFT |
-           sig.Vsync_pol << DI_D3_VSYNC_POL_SHIFT;
+               sig.clk_pol << DI_D3_CLK_POL_SHIFT |
+               sig.enable_pol << DI_D3_DRDY_SHARP_POL_SHIFT |
+               sig.Hsync_pol << DI_D3_HSYNC_POL_SHIFT |
+               sig.Vsync_pol << DI_D3_VSYNC_POL_SHIFT;
        mx3fb_write_reg(mx3fb, old_conf, DI_DISP_SIG_POL);
 
        switch (pixel_fmt) {
@@ -721,7 +726,6 @@ static int mx3fb_set_par(struct fb_info *fbi)
        struct idmac_channel *ichan = mx3_fbi->idmac_channel;
        struct idmac_video_param *video = &ichan->params.video;
        struct scatterlist *sg = mx3_fbi->sg;
-       size_t screen_size;
 
        dev_dbg(mx3fb->dev, "%s [%c]\n", __func__, list_empty(&ichan->queue) ? '-' : '+');
 
@@ -745,12 +749,10 @@ static int mx3fb_set_par(struct fb_info *fbi)
                }
        }
 
-       screen_size = fbi->fix.line_length * fbi->var.yres;
-
        sg_init_table(&sg[0], 1);
        sg_init_table(&sg[1], 1);
 
-       sg_dma_address(&sg[0])  = fbi->fix.smem_start;
+       sg_dma_address(&sg[0]) = fbi->fix.smem_start;
        sg_set_page(&sg[0], virt_to_page(fbi->screen_base),
                    fbi->fix.smem_len,
                    offset_in_page(fbi->screen_base));
@@ -927,7 +929,7 @@ static int mx3fb_setcolreg(unsigned int regno, unsigned int red,
        u32 val;
        int ret = 1;
 
-       dev_dbg(fbi->device, "%s\n", __func__);
+       dev_dbg(fbi->device, "%s, regno = %u\n", __func__, regno);
 
        mutex_lock(&mx3_fbi->mutex);
        /*
@@ -973,9 +975,8 @@ static int mx3fb_blank(int blank, struct fb_info *fbi)
        struct mx3fb_info *mx3_fbi = fbi->par;
        struct mx3fb_data *mx3fb = mx3_fbi->mx3fb;
 
-       dev_dbg(fbi->device, "%s\n", __func__);
-
-       dev_dbg(fbi->device, "blank = %d\n", blank);
+       dev_dbg(fbi->device, "%s, blank = %d, base %p, len %u\n", __func__,
+               blank, fbi->screen_base, fbi->fix.smem_len);
 
        if (mx3_fbi->blank == blank)
                return 0;
@@ -988,8 +989,11 @@ static int mx3fb_blank(int blank, struct fb_info *fbi)
        case FB_BLANK_VSYNC_SUSPEND:
        case FB_BLANK_HSYNC_SUSPEND:
        case FB_BLANK_NORMAL:
-               sdc_disable_channel(mx3_fbi);
                sdc_set_brightness(mx3fb, 0);
+               memset((char *)fbi->screen_base, 0, fbi->fix.smem_len);
+               /* Give LCD time to update - enough for 50 and 60 Hz */
+               msleep(25);
+               sdc_disable_channel(mx3_fbi);
                break;
        case FB_BLANK_UNBLANK:
                sdc_enable_channel(mx3_fbi);
@@ -1063,6 +1067,7 @@ static int mx3fb_pan_display(struct fb_var_screeninfo *var,
                mutex_unlock(&mx3_fbi->mutex);
                dev_info(fbi->device, "Panning failed due to %s\n", ret < 0 ?
                         "user interrupt" : "timeout");
+               disable_irq(mx3_fbi->idmac_channel->eof_irq);
                return ret ? : -ETIMEDOUT;
        }
 
@@ -1073,6 +1078,9 @@ static int mx3fb_pan_display(struct fb_var_screeninfo *var,
                    virt_to_page(fbi->screen_base + offset), fbi->fix.smem_len,
                    offset_in_page(fbi->screen_base + offset));
 
+       if (mx3_fbi->txd)
+               async_tx_ack(mx3_fbi->txd);
+
        txd = dma_chan->device->device_prep_slave_sg(dma_chan, sg +
                mx3_fbi->cur_ipu_buf, 1, DMA_TO_DEVICE, DMA_PREP_INTERRUPT);
        if (!txd) {
@@ -1099,8 +1107,6 @@ static int mx3fb_pan_display(struct fb_var_screeninfo *var,
                return -EIO;
        }
 
-       if (mx3_fbi->txd)
-               async_tx_ack(mx3_fbi->txd);
        mx3_fbi->txd = txd;
 
        fbi->var.xoffset = var->xoffset;
@@ -1506,7 +1512,7 @@ static struct platform_driver mx3fb_driver = {
  * example:
  *     video=mx3fb:bpp=16
  */
-static int mx3fb_setup(void)
+static int __init mx3fb_setup(void)
 {
 #ifndef MODULE
        char *opt, *options = NULL;
index ee64771fbe3dd0dee90f15664606901884b85245..89f231dc443f0b191701cae247aca0f29c4785f2 100644 (file)
  * Created      : Thu Sep 23 18:17:43 1999, hmallat
  * Last modified: Tue Nov  2 21:19:47 1999, hmallat
  *
+ * I2C part copied from the i2c-voodoo3.c driver by:
+ * Frodo Looijaard <frodol@dds.nl>,
+ * Philip Edelbrock <phil@netroedge.com>,
+ * Ralph Metzler <rjkm@thp.uni-koeln.de>, and
+ * Mark D. Studebaker <mdsxyz123@yahoo.com>
+ *
  * Lots of the information here comes from the Daryll Strauss' Banshee
  * patches to the XF86 server, and the rest comes from the 3dfx
  * Banshee specification. I'm very much indebted to Daryll for his
@@ -481,6 +487,12 @@ static int tdfxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
                return -EINVAL;
        }
 
+       if (info->monspecs.hfmax && info->monspecs.vfmax &&
+           info->monspecs.dclkmax && fb_validate_mode(var, info) < 0) {
+               DPRINTK("mode outside monitor's specs\n");
+               return -EINVAL;
+       }
+
        var->xres = (var->xres + 15) & ~15; /* could sometimes be 8 */
        lpitch = var->xres * ((var->bits_per_pixel + 7) >> 3);
 
@@ -1167,6 +1179,207 @@ static struct fb_ops tdfxfb_ops = {
 #endif
 };
 
+#ifdef CONFIG_FB_3DFX_I2C
+/* The voo GPIO registers don't have individual masks for each bit
+   so we always have to read before writing. */
+
+static void tdfxfb_i2c_setscl(void *data, int val)
+{
+       struct tdfxfb_i2c_chan  *chan = data;
+       struct tdfx_par         *par = chan->par;
+       unsigned int r;
+
+       r = tdfx_inl(par, VIDSERPARPORT);
+       if (val)
+               r |= I2C_SCL_OUT;
+       else
+               r &= ~I2C_SCL_OUT;
+       tdfx_outl(par, VIDSERPARPORT, r);
+       tdfx_inl(par, VIDSERPARPORT);   /* flush posted write */
+}
+
+static void tdfxfb_i2c_setsda(void *data, int val)
+{
+       struct tdfxfb_i2c_chan  *chan = data;
+       struct tdfx_par         *par = chan->par;
+       unsigned int r;
+
+       r = tdfx_inl(par, VIDSERPARPORT);
+       if (val)
+               r |= I2C_SDA_OUT;
+       else
+               r &= ~I2C_SDA_OUT;
+       tdfx_outl(par, VIDSERPARPORT, r);
+       tdfx_inl(par, VIDSERPARPORT);   /* flush posted write */
+}
+
+/* The GPIO pins are open drain, so the pins always remain outputs.
+   We rely on the i2c-algo-bit routines to set the pins high before
+   reading the input from other chips. */
+
+static int tdfxfb_i2c_getscl(void *data)
+{
+       struct tdfxfb_i2c_chan  *chan = data;
+       struct tdfx_par         *par = chan->par;
+
+       return (0 != (tdfx_inl(par, VIDSERPARPORT) & I2C_SCL_IN));
+}
+
+static int tdfxfb_i2c_getsda(void *data)
+{
+       struct tdfxfb_i2c_chan  *chan = data;
+       struct tdfx_par         *par = chan->par;
+
+       return (0 != (tdfx_inl(par, VIDSERPARPORT) & I2C_SDA_IN));
+}
+
+static void tdfxfb_ddc_setscl(void *data, int val)
+{
+       struct tdfxfb_i2c_chan  *chan = data;
+       struct tdfx_par         *par = chan->par;
+       unsigned int r;
+
+       r = tdfx_inl(par, VIDSERPARPORT);
+       if (val)
+               r |= DDC_SCL_OUT;
+       else
+               r &= ~DDC_SCL_OUT;
+       tdfx_outl(par, VIDSERPARPORT, r);
+       tdfx_inl(par, VIDSERPARPORT);   /* flush posted write */
+}
+
+static void tdfxfb_ddc_setsda(void *data, int val)
+{
+       struct tdfxfb_i2c_chan  *chan = data;
+       struct tdfx_par         *par = chan->par;
+       unsigned int r;
+
+       r = tdfx_inl(par, VIDSERPARPORT);
+       if (val)
+               r |= DDC_SDA_OUT;
+       else
+               r &= ~DDC_SDA_OUT;
+       tdfx_outl(par, VIDSERPARPORT, r);
+       tdfx_inl(par, VIDSERPARPORT);   /* flush posted write */
+}
+
+static int tdfxfb_ddc_getscl(void *data)
+{
+       struct tdfxfb_i2c_chan  *chan = data;
+       struct tdfx_par         *par = chan->par;
+
+       return (0 != (tdfx_inl(par, VIDSERPARPORT) & DDC_SCL_IN));
+}
+
+static int tdfxfb_ddc_getsda(void *data)
+{
+       struct tdfxfb_i2c_chan  *chan = data;
+       struct tdfx_par         *par = chan->par;
+
+       return (0 != (tdfx_inl(par, VIDSERPARPORT) & DDC_SDA_IN));
+}
+
+static int __devinit tdfxfb_setup_ddc_bus(struct tdfxfb_i2c_chan *chan,
+                                         const char *name, struct device *dev)
+{
+       int rc;
+
+       strlcpy(chan->adapter.name, name, sizeof(chan->adapter.name));
+       chan->adapter.owner             = THIS_MODULE;
+       chan->adapter.class             = I2C_CLASS_DDC;
+       chan->adapter.algo_data         = &chan->algo;
+       chan->adapter.dev.parent        = dev;
+       chan->algo.setsda               = tdfxfb_ddc_setsda;
+       chan->algo.setscl               = tdfxfb_ddc_setscl;
+       chan->algo.getsda               = tdfxfb_ddc_getsda;
+       chan->algo.getscl               = tdfxfb_ddc_getscl;
+       chan->algo.udelay               = 10;
+       chan->algo.timeout              = msecs_to_jiffies(500);
+       chan->algo.data                 = chan;
+
+       i2c_set_adapdata(&chan->adapter, chan);
+
+       rc = i2c_bit_add_bus(&chan->adapter);
+       if (rc == 0)
+               DPRINTK("I2C bus %s registered.\n", name);
+       else
+               chan->par = NULL;
+
+       return rc;
+}
+
+static int __devinit tdfxfb_setup_i2c_bus(struct tdfxfb_i2c_chan *chan,
+                                         const char *name, struct device *dev)
+{
+       int rc;
+
+       strlcpy(chan->adapter.name, name, sizeof(chan->adapter.name));
+       chan->adapter.owner             = THIS_MODULE;
+       chan->adapter.class             = I2C_CLASS_TV_ANALOG;
+       chan->adapter.algo_data         = &chan->algo;
+       chan->adapter.dev.parent        = dev;
+       chan->algo.setsda               = tdfxfb_i2c_setsda;
+       chan->algo.setscl               = tdfxfb_i2c_setscl;
+       chan->algo.getsda               = tdfxfb_i2c_getsda;
+       chan->algo.getscl               = tdfxfb_i2c_getscl;
+       chan->algo.udelay               = 10;
+       chan->algo.timeout              = msecs_to_jiffies(500);
+       chan->algo.data                 = chan;
+
+       i2c_set_adapdata(&chan->adapter, chan);
+
+       rc = i2c_bit_add_bus(&chan->adapter);
+       if (rc == 0)
+               DPRINTK("I2C bus %s registered.\n", name);
+       else
+               chan->par = NULL;
+
+       return rc;
+}
+
+static void __devinit tdfxfb_create_i2c_busses(struct fb_info *info)
+{
+       struct tdfx_par *par = info->par;
+
+       tdfx_outl(par, VIDINFORMAT, 0x8160);
+       tdfx_outl(par, VIDSERPARPORT, 0xcffc0020);
+
+       par->chan[0].par = par;
+       par->chan[1].par = par;
+
+       tdfxfb_setup_ddc_bus(&par->chan[0], "Voodoo3-DDC", info->dev);
+       tdfxfb_setup_i2c_bus(&par->chan[1], "Voodoo3-I2C", info->dev);
+}
+
+static void tdfxfb_delete_i2c_busses(struct tdfx_par *par)
+{
+       if (par->chan[0].par)
+               i2c_del_adapter(&par->chan[0].adapter);
+       par->chan[0].par = NULL;
+
+       if (par->chan[1].par)
+               i2c_del_adapter(&par->chan[1].adapter);
+       par->chan[1].par = NULL;
+}
+
+static int tdfxfb_probe_i2c_connector(struct tdfx_par *par,
+                                     struct fb_monspecs *specs)
+{
+       u8 *edid = NULL;
+
+       DPRINTK("Probe DDC Bus\n");
+       if (par->chan[0].par)
+               edid = fb_ddc_read(&par->chan[0].adapter);
+
+       if (edid) {
+               fb_edid_to_monspecs(edid, specs);
+               kfree(edid);
+               return 0;
+       }
+       return 1;
+}
+#endif /* CONFIG_FB_3DFX_I2C */
+
 /**
  *      tdfxfb_probe - Device Initializiation
  *
@@ -1182,6 +1395,8 @@ static int __devinit tdfxfb_probe(struct pci_dev *pdev,
        struct tdfx_par *default_par;
        struct fb_info *info;
        int err, lpitch;
+       struct fb_monspecs *specs;
+       bool found;
 
        err = pci_enable_device(pdev);
        if (err) {
@@ -1284,13 +1499,49 @@ static int __devinit tdfxfb_probe(struct pci_dev *pdev,
        if (hwcursor)
                info->fix.smem_len = (info->fix.smem_len - 1024) &
                                        (PAGE_MASK << 1);
-
-       if (!mode_option)
+       specs = &info->monspecs;
+       found = false;
+       info->var.bits_per_pixel = 8;
+#ifdef CONFIG_FB_3DFX_I2C
+       tdfxfb_create_i2c_busses(info);
+       err = tdfxfb_probe_i2c_connector(default_par, specs);
+
+       if (!err) {
+               if (specs->modedb == NULL)
+                       DPRINTK("Unable to get Mode Database\n");
+               else {
+                       const struct fb_videomode *m;
+
+                       fb_videomode_to_modelist(specs->modedb,
+                                                specs->modedb_len,
+                                                &info->modelist);
+                       m = fb_find_best_display(specs, &info->modelist);
+                       if (m) {
+                               fb_videomode_to_var(&info->var, m);
+                               /* fill all other info->var's fields */
+                               if (tdfxfb_check_var(&info->var, info) < 0)
+                                       info->var = tdfx_var;
+                               else
+                                       found = true;
+                       }
+               }
+       }
+#endif
+       if (!mode_option && !found)
                mode_option = "640x480@60";
 
-       err = fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL, 8);
-       if (!err || err == 4)
-               info->var = tdfx_var;
+       if (mode_option) {
+               err = fb_find_mode(&info->var, info, mode_option,
+                                  specs->modedb, specs->modedb_len,
+                                  NULL, info->var.bits_per_pixel);
+               if (!err || err == 4)
+                       info->var = tdfx_var;
+       }
+
+       if (found) {
+               fb_destroy_modedb(specs->modedb);
+               specs->modedb = NULL;
+       }
 
        /* maximize virtual vertical length */
        lpitch = info->var.xres_virtual * ((info->var.bits_per_pixel + 7) >> 3);
@@ -1315,6 +1566,9 @@ static int __devinit tdfxfb_probe(struct pci_dev *pdev,
        return 0;
 
 out_err_iobase:
+#ifdef CONFIG_FB_3DFX_I2C
+       tdfxfb_delete_i2c_busses(default_par);
+#endif
        if (default_par->mtrr_handle >= 0)
                mtrr_del(default_par->mtrr_handle, info->fix.smem_start,
                         info->fix.smem_len);
@@ -1379,6 +1633,9 @@ static void __devexit tdfxfb_remove(struct pci_dev *pdev)
        struct tdfx_par *par = info->par;
 
        unregister_framebuffer(info);
+#ifdef CONFIG_FB_3DFX_I2C
+       tdfxfb_delete_i2c_busses(par);
+#endif
        if (par->mtrr_handle >= 0)
                mtrr_del(par->mtrr_handle, info->fix.smem_start,
                         info->fix.smem_len);
index 5d3b1a8e28b0b7e7a66b03aabc29db9d37f59794..a38fa4907c92af452249b9df01c2a637debb955d 100644 (file)
@@ -106,6 +106,8 @@ static int wdrtas_set_interval(int interval)
        return result;
 }
 
+#define WDRTAS_SP_SPI_LEN 4
+
 /**
  * wdrtas_get_interval - returns the current watchdog interval
  * @fallback_value: value (in seconds) to use, if the RTAS call fails
@@ -119,10 +121,17 @@ static int wdrtas_set_interval(int interval)
 static int wdrtas_get_interval(int fallback_value)
 {
        long result;
-       char value[4];
+       char value[WDRTAS_SP_SPI_LEN];
 
+       spin_lock(&rtas_data_buf_lock);
+       memset(rtas_data_buf, 0, WDRTAS_SP_SPI_LEN);
        result = rtas_call(wdrtas_token_get_sp, 3, 1, NULL,
-                          WDRTAS_SP_SPI, (void *)__pa(&value), 4);
+                          WDRTAS_SP_SPI, __pa(rtas_data_buf),
+                          WDRTAS_SP_SPI_LEN);
+
+       memcpy(value, rtas_data_buf, WDRTAS_SP_SPI_LEN);
+       spin_unlock(&rtas_data_buf_lock);
+
        if (value[0] != 0 || value[1] != 2 || value[3] != 0 || result < 0) {
                printk(KERN_WARNING "wdrtas: could not get sp_spi watchdog "
                       "timeout (%li). Continuing\n", result);
index 16664894966d74eac809a7693957508e78ee2e97..1e7fd4df16a7cd9cbae72986fe06ae91a6310672 100644 (file)
@@ -32,6 +32,10 @@ fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \
                                         adaptec/starfire_tx.bin
 fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin
 fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw
+fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-4.6.17.fw \
+                            bnx2/bnx2-rv2p-09-4.6.15.fw \
+                            bnx2/bnx2-mips-06-4.6.16.fw \
+                            bnx2/bnx2-rv2p-06-4.6.16.fw
 fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin
 fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin
 fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \
@@ -40,7 +44,13 @@ fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \
 fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin
 fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \
                             e100/d102e_ucode.bin
+fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin
 fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin
+fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
+                                     advansys/3550.bin advansys/38C0800.bin
+fw-shipped-$(CONFIG_SCSI_QLOGIC_1280) += qlogic/1040.bin qlogic/1280.bin \
+                                        qlogic/12160.bin
+fw-shipped-$(CONFIG_SCSI_QLOGICPTI) += qlogic/isp1000.bin
 fw-shipped-$(CONFIG_SMCTR) += tr_smctr.bin
 fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp
 fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \
index d6c227db37c2bfcc9e38b3597c95cda395860d9f..e4deb511cc73766537f5a992845f1cf0d5427239 100644 (file)
@@ -45,6 +45,32 @@ Found alsa-firmware package in hex form, with the following comment:
 
 --------------------------------------------------------------------------
 
+Driver: SCSI_ADVANSYS - AdvanSys SCSI
+
+File: advansys/mcode.bin
+File: advansys/3550.bin
+File: advansys/38C0800.bin
+File: advansys/38C1600.bin
+
+Licence: BSD, no source available.
+
+Found in hex form in kernel source.
+
+--------------------------------------------------------------------------
+
+Driver: SCSI_QLOGIC_1280 - Qlogic QLA 1240/1x80/1x160 SCSI support
+
+File: qlogic/1040.bin
+File: qlogic/1280.bin
+File: qlogic/12160.bin
+
+Licence: Allegedly GPLv2+, but no source visible. Marked:
+
+                   QLOGIC LINUX SOFTWARE
+  QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x
+  Copyright (C) 2001 Qlogic Corporation (www.qlogic.com)
+
+--------------------------------------------------------------------------
 Driver: smctr -- SMC ISA/MCA Token Ring adapter
 
 File: tr_smctr.bin
@@ -596,3 +622,43 @@ Licence: Allegedly GPL, but no source visible. Marked:
 Found in hex form in kernel source.
 
 --------------------------------------------------------------------------
+
+Driver: SCSI_QLOGICPTI - PTI Qlogic, ISP Driver
+
+File: qlogic/isp1000.bin
+
+Licence: Unknown
+
+Found in hex form in kernel source.
+
+--------------------------------------------------------------------------
+
+Driver: MYRI_SBUS - MyriCOM Gigabit Ethernet
+
+File: myricom/lanai.bin
+
+Licence: Unknown
+
+Found in hex form in kernel source.
+
+--------------------------------------------------------------------------
+
+Driver: BNX2 - Broadcom NetXtremeII
+
+File: bnx2/bnx2-mips-06-4.6.16.fw
+File: bnx2/bnx2-rv2p-06-4.6.16.fw
+File: bnx2/bnx2-mips-09-4.6.17.fw
+File: bnx2/bnx2-rv2p-09-4.6.15.fw
+
+Licence:
+
+ This file contains firmware data derived from proprietary unpublished
+ source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
+
+ Permission is hereby granted for the distribution of this firmware data
+ in hexadecimal or equivalent format, provided this copyright notice is
+ accompanying it.
+
+Found in hex form in kernel source.
+
+--------------------------------------------------------------------------
diff --git a/firmware/advansys/3550.bin.ihex b/firmware/advansys/3550.bin.ihex
new file mode 100644 (file)
index 0000000..6809b0d
--- /dev/null
@@ -0,0 +1,317 @@
+:10000000DD2DD504000000F200F0001618E400FC1D
+:10001000010048E4BE18188003F6020000FAFFFF52
+:10002000280E9EE7FF0082E700EA00F601E609E7F6
+:1000300055F001F601FA08000300040018F410005E
+:1000400000EC85F0BC00D5F08E0C385400E61EF0B4
+:1000500086F0B4009857D0010C1C3E1C0C00BB006D
+:10006000AA18028032F001FC880CC6120213184054
+:10007000005701EA3C006C016E0104123E570080FB
+:1000800003E6B600C00001013E01DA0F221008129B
+:10009000024AB95403581B8030E44BE4200032007C
+:1000A0003E00800024013C0168016A017001720178
+:1000B000740176017801620A920C2C102E1006133E
+:1000C0004C1CBB553C5604804AE402EE5BF0B1F098
+:1000D00003F706F703FC0F004000BE000001B00864
+:1000E00030136415321C381C4E1C10440248004C5E
+:1000F00004EA5DF004F602FC0500340036009800C6
+:10010000CC0020014E014E0B1E0E0C100A120413DF
+:100110004013301C004EBD56068300DC05F009F08C
+:1001200059F0A7F0B8F00EF70600190033009B0055
+:10013000A400B500BA00D000E100E700DE03560AD3
+:10014000140E021004100A1036100A131213521360
+:1001500010151415AC16201C341C361C08443844E9
+:1001600091440A454846014868548355B0570158A0
+:10017000835905E60BF00CF05CF04BF404F805F83D
+:1001800002FA03FA04FC05FC07000A000D001C003B
+:100190009E00A800AA00B900E00022012601790112
+:1001A0007A01C001C2017C025A03EA04E807680828
+:1001B0006908BA08E909060B3A0E00101A10ED108A
+:1001C000F11006120C1316131E1382134214D614C8
+:1001D0008A15C617D2176B18121C461C9C32004099
+:1001E0000E47484741488948804C00544455E555DE
+:1001F00014567757BF57405C0680089003A1FE9CB9
+:10020000F02902FEB80CFF100000D0FECC1800CF81
+:10021000FE8001FF030000FE9315FE0F05FF38006E
+:1002200000FE572400FE48004FFF04000010FF09A5
+:100230000000FF080101FF08FFFFFF270000FF107B
+:10024000FFFFFF0F0000FE7856FE3412FF21000072
+:10025000FE04F7CF2A670B01FECE0EFE04F7CF6730
+:100260000B3C2AFE3DF0FE0202FE20F09CFE91F0C7
+:10027000FEF001FE90F0FEF001FE8FF09C05513B78
+:1002800002FED40C01FE440DFEDD12FEFC10FE2821
+:100290001C05FEA600FED3124718FEA600B5FE48B8
+:1002A000F0FE8602FE49F0FEA002FE4AF0FEBE020B
+:1002B000FE46F0FE5002FE47F0FE5602FE43F0FE00
+:1002C0004402FE44F0FE4802FE45F0FE4C02170BCD
+:1002D000A0170618960229FE001CDEFE021CDDFE99
+:1002E0001E1CFEE91001FE2017FEE710FE06FCC7EB
+:1002F0000A6B019E0229144D379701FE640F0A6BA9
+:100300000182FEBD100A6B0182FEAD10FE161CFEBE
+:10031000581C170618962A2529FE3DF0FE020221D8
+:10032000FE9402FE5A1CEAFE141C14FE300037979D
+:1003300001FE540F1706189602D01E20071034FE37
+:10034000691017061896FE04EC20463D1220FE05A3
+:10035000F6C701FE5216094A4C35112D3C8A01E6BA
+:1003600002290A40010E07005D016FFE1810FE41D0
+:10037000580A99010EFEC85464FE0C0301E60229D6
+:100380002A46FE02E827F8FE9E43F7FE27F0FEDC31
+:1003900001FE074BFE20F09CFE401C25D2FE26F0FD
+:1003A000FE5603FEA0F0FE4403FE11F09CFEEF108B
+:1003B000FE9FF0FE6403EB0FFE1100025A2AFE4876
+:1003C0001CEB09041DFE1813231E98AC12980A405A
+:1003D000010EAC7501FEBC1511CA25D2FE01F0D28A
+:1003E000FE82F0FE9203EC11FEE40065FEA40325FC
+:1003F000321FFEB4030143FE06F0FEC4038D81FEEE
+:100400000AF0FE7A060222056B2816FEF604142C6A
+:1004100001338FFE660202D1EB2A671AFE671BF8D2
+:10042000F7FE481C70016E870A40010E070016D3C4
+:100430000ACA010E7460597627056B28FE10121443
+:100440002C01338FFE660202D1BC7DBD7F25226563
+:10045000FE3C041FFE380468FEA000FE9B57FE4EC3
+:10046000122BFF02001001081FFEE0042B01081FE1
+:1004700022302ED5FE4C44FE4C1260FE4448132C14
+:10048000FE4C5464D3467627FAEFFE621309041D2E
+:10049000FE2A132F077EA5FE2010132CFE4C546459
+:1004A000D3FAEF8609041DFE08132F077E6E090498
+:1004B0001DFE1C1214920904063B14C401338FFE66
+:1004C000700C02222B11FEE600FE1C90F903149220
+:1004D00001330229FE425B671AFE4659F8F7FE8790
+:1004E00080FE31E44F09040BFE7813FE2080071ACA
+:1004F000FE7012490406FE601305FEA2002816FED7
+:100500008005FE31E46A49040BFE4A1305FEA00093
+:1005100028FE42125E01082532F1010826FE9805E8
+:1005200011FEE3002349FE4AF0FE6A05FE49F0FE93
+:1005300064058324FE2100A124FE2200A0244CFE99
+:100540000948010826FE9805FEE2084904C53B015A
+:1005500086240612CC37FE270109041DFE2212470D
+:1005600001A714920904063B14C401338FFE700CDA
+:10057000022205FE9C0028FE3E12055028FE36137E
+:100580004701A726FE08060A06490419FE02125F63
+:1005900001FEAA141FFEFE05119A014311FEE5009B
+:1005A0000550B40C5005C628FE6212053F28FE5ABD
+:1005B0001301FE141801FE6618FE4348B719136CA8
+:1005C000FF020057488B1C3D85B7694701A726FEEF
+:1005D000720649041BDF890A4D01FED8141FFE680C
+:1005E00006119A014311FEE500053FB40C3F1706C2
+:1005F00001A7EC7270016E8711FEE200010825323E
+:10060000FE0AF0FEA6068CFE5C07FE06F0FE6407FE
+:100610008D81022209040BFE2E12151A0108150005
+:1006200001081500010815000108FE99A40108152C
+:100630000002FE320861041BFE381209041B6E150D
+:10064000FE1B000108150001081500010815000136
+:100650000815060108150002D9664CFE3A555FFEE2
+:100660009A814B1DBAFE32070A1DFE096FAFFECA02
+:1006700045FE3212622C85667B01082532FE0AF0A7
+:10068000FE32078D818CFE5C070222014302FE8A46
+:1006900006151902FE8A06FE9CF7D4FE2C90FEAECB
+:1006A0009077FECA070C541855094A6A351E200770
+:1006B00010FE0E1274FE808037206327FE0610FEA7
+:1006C00083E7C4A1FE0340094A4F3501A8ADFE1FD0
+:1006D00040125801A5FE0850FE8A50FE4451FEC645
+:1006E0005183FBFE8A900C521853FE0C90FE8E90A4
+:1006F000FE4050FEC2500C39183AFE4A1009046AF6
+:10070000FE2A12FE2C90FEAE900C54185509044F90
+:100710008501A8FE1F801258FE4490FEC6900C561C
+:100720001857FBFE8A900C521853FE4090FEC29060
+:100730000C39183A0C38184E094A19352A13FE4E4E
+:100740001165FE4808FE9EF0FE5C08B116322A7361
+:10075000DDB8FE8008B9FE9E088CFE7408FE06F027
+:10076000FE7A088D8102220143FEC9101519FEC9C7
+:1007700010610406FE101261040B4509040BFE68AB
+:1007800012FE2E1C02FE240A6104064561040BFEC3
+:100790005212FE2C1CFEAAF0FE1E09FEACF0FEBE9C
+:1007A00008FE8A10AAFEF310FEADF0FECA0802FE93
+:1007B000240AABFEE710FE2BF09DE91CFE00FEFEB6
+:1007C0001C12B5FED2F09DFE76181C1A169D05CBA4
+:1007D0001C06169DB86DB96DAAABFEB110705E2BEC
+:1007E000149201330FFE3500FE01F05A0F7C025ABD
+:1007F000FE74181CFE00F8166D671B01FE440D3BCD
+:1008000001E61E2774671A026D09040B21FE060A11
+:1008100009046AFE8212090419FE66131E58ACFC14
+:10082000FE8380FEC844FE2E13FE0491FE86916373
+:1008300027FE4059FEC15977D7055431550C7B1816
+:100840007CBE54BF5501A8AD63271258C038C14EB5
+:1008500079566857F4F5FE04FA38FE05FA4E01A5FC
+:10086000A2230C7B0C7C79566857FE1210090419E0
+:1008700016D77939683A0904FEF700350552315325
+:10088000FE1058FE9158FE1459FE9559026D090448
+:100890001916D70904FEF70035FE3A55FE19815F97
+:1008A000FE1090FE9290FED7102F079B16FEC608F2
+:1008B000119B09040BFE14130539313A77FEC60863
+:1008C000FE0C58FE8D58026D2347FE1980DE090488
+:1008D0000BFE1A12FE6C19FE1941E9B5FED1F0D9D2
+:1008E000147A01330FFE4400FE8E10FE6C19BE39DF
+:1008F000FEED19BF3AFE0C51FE8E51E91CFE00FFC1
+:1009000034FE7410B5FED2F0FEB20AFE76181C1A40
+:100910008405CB1C06FE08130FFE1600025AFED1FA
+:10092000F0FEC40A147A01330FFE1700FE4210FED7
+:10093000CEF0FECA0AFE3C10FECDF0FED60A0FFE37
+:100940002200025AFECBF0FEE20A0FFE2400025AF9
+:10095000FED0F0FEEC0A0F93DCFECFF0FEF60A0F9D
+:100960004CFE1010FECCF0D96104193B0FFE1200B2
+:100970002A13FE4E1165FE0C0BFE9EF0FE200BB1FD
+:1009800016322A73DDB822B9222AEC65FE2C0B251B
+:10099000328CFE480B8D81B8D4B9D402220143FEBB
+:1009A000DB1011FEE800AAAB70BC7DBD7FFE89F0B4
+:1009B00022302ED8BC7DBD7F01081F22302ED6B13B
+:1009C000450FFE4200025A7806FE814916FE380C99
+:1009D00009040BFE44130F004B0BFE54124BFE2870
+:1009E0000021FEA60C0A40010E07005D3EFE280015
+:1009F000FEE21001E701E80A9901FE320E59112DBD
+:100A0000016F02290FFE44004B0BDF3E0BFEB410BA
+:100A100001863E0BFEAA100186FE1982FE3446A313
+:100A20003E0B0FFE4300FE9610094A0B3501E7010D
+:100A3000E859112D016F670B593C8A02FE2A030900
+:100A4000040B843E0B0F00FE5C1061041BFE581269
+:100A500009041BFE5013FE1C1CFE9DF0FE5C0CFEE8
+:100A60001C1CFE9DF0FE620C094A1B35FEA9100FEE
+:100A7000FE1500FE04E60B5F5C0FFE1300FE101077
+:100A80000FFE4700A10FFE4100A00FFE240087AA21
+:100A9000AB70056B2821D15FFE04E61BFE9D41FE75
+:100AA0001C425901DA0229EA140B3795A914FE31C8
+:100AB00000379701FE540F02D03CFE06ECC9EE3E13
+:100AC0001DFECE45343CFE06EAC9FE474B89FE7545
+:100AD000570551FE9856FE38120A42010EFE444850
+:100AE0004609041DFE1A130A40010E47FE41580A2A
+:100AF00099010EFE49548EFE2A0D02FE2A030A5168
+:100B0000FEEE14EE3E1DFECE45343CFECE47FEAD5D
+:100B10001302291E200710FE9E1223124D1294125A
+:100B2000CE1E2D47372DB1E0FEBCF0FEEC0D1306B6
+:100B3000124D01FEE21505FE380131FE3A0177FE45
+:100B4000F00DFE02ECCE62005DFE04EC2046FE05D8
+:100B5000F6FE340101FE5216FBFE48F40DFE18139A
+:100B6000AFFE02EACE627AFEC513141B3795A95C6C
+:100B700005FE38011CFEF0FF0CFE600105FE3A0187
+:100B80000CFE62013D12202406122D112D8A13063F
+:100B90000323031E4DFEF7121E94AC1294077AFE37
+:100BA0007113FE241C141A3795A9FED910B6FE0342
+:100BB000DCFE7357FE805D03B6FE03DCFE5B57FE72
+:100BC000805D03FE0357B623FE00CC03FE0357B639
+:100BD000750309044CFE2213FE1C800706FE1A133F
+:100BE000FE1E80E1FE1D80A4FE0C90FE0E13FE0E84
+:100BF00090A3FE3C90FE30F40BFE3C50A001FE8220
+:100C0000162F072DE001FEBC1509041D4501E70163
+:100C1000E811FEE90009044CFE2C1301FE1416FE37
+:100C20001E1CFE1490FE96900CFE640118FE6601D8
+:100C300009044FFE1212FE038074FE01EC20FE80B8
+:100C4000401220632711C8591E20ED762003FE08AC
+:100C50001C05FEAC00FE065805FEAE00FE0758055A
+:100C6000FEB000FE085805FEB200FE0958FE0A1C40
+:100C7000246912C9230C500C3F1340485F171DFE16
+:100C8000904DFE915421FE080F3E10134248174C20
+:100C9000FE904DFE915421FE1E0F24101220782C40
+:100CA000461E20ED762011C8F6FED6F0FE320FEA81
+:100CB00070FE141CFE101CFE181C033CFE0C14EEEF
+:100CC000FE07E61DFECE47FEF513030186782C468F
+:100CD000FAEFFE42132F072DFE34130A42010EB025
+:100CE000FE3612F0FE454801E3FE00CCB0FEF313E1
+:100CF0003D750710A30A80010EFE805C016FFE0E99
+:100D000010077E45F6FED6F0FE6C0F03FE445874C5
+:100D1000FE01EC97FE9E40FE9DE700FE9CE71B76E1
+:100D20002701DAFEDD102ABC7DBD7F302ED5071BE2
+:100D3000FE4812070BFE5612071AFE301207C216A3
+:100D4000FE3E1107FE230016FE4A11070616FEA8F6
+:100D5000110719FE12120700162214C201339F2B2D
+:100D600001088C43032BFE62080ACA01FE320E11F1
+:100D70007E02292B2F079BFED9137939683A77FE1B
+:100D8000FC1009046AFE7212C038C14EF4F58EFEE2
+:100D9000C6101E58FE2613057B317C77FE820C0C94
+:100DA000541855230C7B0C7C01A82469731258013C
+:100DB000A5C038C14EFE0455FEA555FE04FA38FE06
+:100DC00005FA4EFE911005563157FE4056FEE1568B
+:100DD0000C56185783C038C14EF4F505523153FEF6
+:100DE0000056FEA1560C52185309046AFE1E121E2C
+:100DF00058FE1F4005543155FE2C50FEAE5005568E
+:100E00003157FE4450FEC65005523153FE0850FE85
+:100E10008A500539313AFE4050FEC250025C240629
+:100E200012CD025B2B01081F44302ED5070621444A
+:100E30002F079B215B016E1C3D164409040BE279D0
+:100E400039683AFE0A5534FE8B55BE39BF3AFE0C5E
+:100E500051FE8E51025BFE1981AFFE1941025B2BE0
+:100E6000010825321FA2302ED84B1AFEA6124B0BBA
+:100E70003B0244010825321FA2302ED6071A214416
+:100E800001081FA2302EFEE809FEC2496005FE9C43
+:100E9000002884490419349FFEBB454B00453E069B
+:100EA000783DFEDA14016E87FE4B45E22F079AE18A
+:100EB00005C62884053F28345E025BFEC05DFEF84F
+:100EC00014FE03170550B40C505E2B0108265C017C
+:100ED000FEAA14025C010825321F44302ED60706F4
+:100EE000214401FE8E13FE4258FE8214FEA4148794
+:100EF000FE4AF40B1644FE4AF406FE0C122F079A23
+:100F000085025B053FB40C3F5E2B0108265C01FEA9
+:100F1000D814025C130665FECA1226FEE01272F1B6
+:100F200001082372038FFEDC1225FEDC121FFECAAD
+:100F3000125E2B0108FED510136CFF020057488B80
+:100F40001CFEFF7FFE3056FE005C03136CFF0200A8
+:100F500057488B1C3DFE3056FE005C03136CFF02AD
+:100F60000057488B03136CFF020057488BFE0B5849
+:100F7000030A5001820A3F018203FC1C10FF030098
+:100F800054FE00F41948FE007DFE017DFE027DFE48
+:100F9000037C63270C521853BE56BF5703FE6208EA
+:100FA000FE824AFEE11AFE835A740301FE1418FE03
+:100FB00042485F608901081FFEA214302ED8010844
+:100FC0001FFEA214302EFEE80AFEC15905C628FEF7
+:100FD000CC1249041BFEC41323621BE24BC364FE04
+:100FE000E8133B130617C378DBFE7810FF02835526
+:100FF000A1FF028355621AA4BBFE30008EE4172CB9
+:101000001306FE5610620BE1BBFE64008EE40AFE7E
+:10101000640017931306FE28106206FE6013BBFEE1
+:10102000C8008EE40AFEC800174D130683BBFE906D
+:1010300001BAFE4E1489FE1210FE43F494FE56F0DF
+:10104000FE6014FE04F46CFE43F493FEF310F90109
+:10105000FE22131C3DFE1013FE0017FE4DE469BA7C
+:10106000FE9C14B769FE1C10FE0017FE4DE419BA71
+:10107000FE9C14B719836023FE4DF400DF8913062C
+:10108000FEB456FEC3580360130B03150601082671
+:10109000E5150B010826E5151A010826E572FE89FB
+:1010A000490108031506010826A6151A010826A6F7
+:1010B0001506010826A6FE8949010826A672FE89A2
+:1010C0004A01080360031ECC0706FE4413AD12CC90
+:1010D000FE49F4003B729F5EFE01ECFE2701F10128
+:1010E000082F07FEE300FE20131FFE5A152312CD22
+:1010F00001431ECD070645094A0635030A42010E83
+:10110000ED880710A40A80010E880A51019E030A87
+:1011100080010E88FE80E710071084FE455801E329
+:1011200088030A42010E880A51019E030A42010EF9
+:10113000FE8080F2FE49E410A40A80010EF20A51FA
+:1011400001820317107166FE6001FE18DFFE19DED2
+:10115000FE241CFE1DF71D90FEF61501FEFC16E098
+:10116000911D66FE2C01FE2F1903AE21FEE615FE31
+:10117000DA1017107105FE6401FE00F419FE18580C
+:1011800005FE6601FE19589119FE3C90FE30F406EA
+:10119000FE3C5066FE3800FE0F79FE1CF71990FEEB
+:1011A0004016FEB6143403AE21FE1816FE9C10172E
+:1011B0001071FE835AFE18DFFE19DEFE1DF738900F
+:1011C000FE6216FE9414FE10139138661BFEAF19D2
+:1011D000FE98E70003AE21FE5616FE6C1017107144
+:1011E000FE30BCFEB2BC91C5661BFE0F79FE1CF73B
+:1011F000C590FE9A16FE5C143403AE21FE8616FEE0
+:101200004210FE02F61071FE18FE54FE19FE55FC47
+:10121000FE1DF74F90FEC016FE3614FE1C13914FB4
+:1012200047FE8358FEAF19FE80E710FE81E71011DC
+:10123000FEDD006327036327FE124521FEB016146E
+:10124000063795A90229FE39F0FE04172303FE7E16
+:10125000181C1A5D130D037105CB1C06FEEF12FE60
+:10126000E110782C462F072DFE3C13FE8214FE421F
+:10127000133C8A0A42010EB0FE3E12F0FE454801C0
+:10128000E3FE00CCB0FEF3133D750710A30A800106
+:101290000EF2016FFE1610077E85FE4014FE24122A
+:1012A000F6FED6F0FE2417170B03FE9CE70B0FFE8D
+:1012B000150059762701DA1706033C8A094A1D35BD
+:1012C000112D016F170603FE3890FEBA9079C7689A
+:1012D000C8FE485534FEC955031E98731298030A78
+:1012E00099010EF00A40010EFE494416FEF01773F4
+:1012F00075030A42010E0710450A51019E0A40017A
+:101300000E737503FE4EE41A64FE241805FE900069
+:10131000FE3A455BFE4EE4C264FE361805FE9200BE
+:10132000FE02E61BDCFE4EE4FE0B0064FE481805E0
+:10133000FE9400FE02E619FE081005FE9600FE026D
+:10134000E62CFE4E45FE0C12AFFF046854DE1C690D
+:1013500003077AFE5AF0FE741824FE0900FE3410CA
+:10136000071BFE5AF0FE821824C3FE2610071A5DE2
+:10137000242CDC070B5D2493FE0E1007065D244D24
+:101380009FAD0314FE09000133FE04FE7D057FF9C5
+:101390000325FECA18FE14F00865FEC61803FF1ADE
+:0213A00000004B
+:00000001FF
+/* Microcode buffer is kept after initialization for error recovery. */
diff --git a/firmware/advansys/38C0800.bin.ihex b/firmware/advansys/38C0800.bin.ihex
new file mode 100644 (file)
index 0000000..a60b447
--- /dev/null
@@ -0,0 +1,336 @@
+:10000000D83F0D05000000F200F000FC001618E4D7
+:10001000010048E4188003F60200CE1900FAFFFF41
+:100020001C0F00F69EE7FF0082E700EA01FA01E6F6
+:1000300009E755F001F60300040010001EF085F0FA
+:1000400018F40800BC00385400ECD5F0820D00E62E
+:1000500086F0B1F0985701FCB400D4010C1C3E1C92
+:100060003C00BB000010BA19028032F07C0D021374
+:10007000BA131840005701EA02FC03FC3E006C0171
+:100080006E0174017601B9543E57008003E6B60054
+:10009000C00001013E017A01CA08CE1016110412F7
+:1000A0000812024ABB553C5603581B8030E44BE40F
+:1000B0005DF002FA200032004000800024013C0183
+:1000C00068016A017001720178017C01620A860D83
+:1000D00006134C1C04804AE402EE5BF003F70C00AC
+:1000E0000F004700BE00000120115C16321C381CB6
+:1000F0004E1C1044004C04EA5CF0A7F004F603FA2E
+:100100000500340036009800CC0020014E014A0B57
+:10011000420C120F0C1022110A120413301C024858
+:10012000004E42544455BD56068300DC05F009F0EC
+:1001300059F0B8F04BF406F70EF704FC05FC060086
+:10014000190033009B00A400B500BA00D000E10004
+:10015000E700E203080F021004100A100A130C1340
+:1001600012132414341404160816A417201C341C6B
+:10017000361C0844384491440A45484601486854AE
+:100180003A558355E555B0570158835905E60BF0AC
+:100190000CF004F805F807000A001C001E009E0081
+:1001A000A800AA00B900E0002201260179017E0121
+:1001B000C401C60180025E03EE049A06F8076208D5
+:1001C00068086908D608E909FA0B2E0F12101A10F0
+:1001D000ED10F1102A1106120C123E121013161314
+:1001E0001E134614761482143615CA156B18BE18E1
+:1001F000CA18E619121C461C9C3200400E47FE9C91
+:10020000F02B02FEAC0DFF100000D7FEE81900D65F
+:10021000FE8401FF030000FE9315FE0F05FF38006A
+:1002200000FE572400FE4C005BFF04000011FF0994
+:100230000000FF080101FF08FFFFFF270000FF107B
+:10024000FFFFFF110000FE7856FE3412FF21000070
+:10025000FE04F7D62C990A01FEC20FFE04F7D699C8
+:100260000A422CFE3DF0FE0602FE20F0A7FE91F0B1
+:10027000FEF401FE90F0FEF401FE8FF0A7035D4D49
+:1002800002FEC80D01FE380EFEDD12FEFC10FE2837
+:100290001C03FEA600FED3124114FEA600C2FE48B7
+:1002A000F0FE8A02FE49F0FEA402FE4AF0FEC202FF
+:1002B000FE46F0FE5402FE47F0FE5A02FE43F0FEF8
+:1002C0004802FE44F0FE4C02FE45F0FE5002180AC1
+:1002D000AA180614A1022BFE001CE7FE021CE6FE73
+:1002E0001E1CFEE91001FE1818FEE710FE06FCCEEB
+:1002F000097001A8022B155939A201FE5810097086
+:100300000187FEBD1009700187FEAD10FE161CFEB0
+:10031000581C180614A12C1C2BFE3DF0FE060223CF
+:10032000FE9802FE5A1CF8FE141C15FE300039A27D
+:1003300001FE4810180614A102D72220071135FE2D
+:100340006910180614A1FE04EC204F431320FE058B
+:10035000F6CE01FE4A1708545837122F429201FE7A
+:100360008216022B0946010E0700660173FE181063
+:10037000FE415809A4010EFEC8546BFE100301FE95
+:100380008216022B2C4FFE02E82AFEBF57FE9E4328
+:10039000FE7757FE27F0FEE001FE074BFE20F0A798
+:1003A000FE401C1CD9FE26F0FE5A03FEA0F0FE48BB
+:1003B00003FE11F0A7FEEF10FE9FF0FE6803F91098
+:1003C000FE110002652CFE481CF908051BFE1813DF
+:1003D0002122A3B713A30946010EB77801FEB41674
+:1003E00012D11CD9FE01F0D9FE82F0FE9603FA125A
+:1003F000FEE40027FEA8031C341DFEB803014BFEDB
+:1004000006F0FEC8039586FE0AF0FE8A0602240363
+:10041000702817FEFA04156D01367BFE6A0202D8B9
+:10042000F92C9919FE671BFEBF57FE7757FE481C33
+:100430007401AF8C0946010E070017DA09D1010ECD
+:100440008D5164792A037028FE1012156D01367BD8
+:10045000FE6A0202D8C781C8831C2427FE40041DFF
+:10046000FE3C043BFEA000FE9B57FE4E122DFF02F9
+:100470000010010B1DFEE4042D010B1D243331DEA1
+:10048000FE4C44FE4C1251FE44480F6FFE4C546B20
+:10049000DA4F792AFE0680FE4847FE621308051BE4
+:1004A000FE2A13320782FE5213FE20100F6FFE4CFD
+:1004B000546BDAFE0680FE4847FE401308051BFE1B
+:1004C0000813320782FE301308051BFE1C12159D0F
+:1004D0000805064D15FE0D0001367BFE640D022455
+:1004E0002D12FEE600FE1C90FE405C04159D0136B8
+:1004F000022BFE425B9919FE4659FEBF57FE775705
+:10050000FE8780FE31E45B08050AFE8413FE20802E
+:100510000719FE7C12530506FE6C1303FEA2002889
+:1005200017FE9005FE31E45A53050AFE561303FEEA
+:10053000A00028FE4E1267FF02001027FE48051C8F
+:1005400034FE8948FF02001027FE560526FEA80546
+:1005500012FEE3002153FE4AF0FE7605FE49F0FE4E
+:1005600070058825FE2100AB25FE2200AA2558FE35
+:100570000948FF02001027FE860526FEA805FEE2B8
+:10058000085305CB4D01B0250613D339FE270108CA
+:10059000051BFE22124101B2159D0805064D15FEF0
+:1005A0000D0001367BFE640D022403FE9C0028EB47
+:1005B000035C28FE36134101B226FE1806090653D5
+:1005C000051FFE02125001FE9E151DFE0E0612A50D
+:1005D000014B12FEE500035CC10C5C03CD28FE62FA
+:1005E00012034528FE5A1301FE0C1901FE7619FE6E
+:1005F0004348C4CC0F71FF02005752931E438BC473
+:100600006E4101B226FE820653051AE9910959018D
+:10061000FECC151DFE780612A5014B12FEE5000367
+:1006200045C10C45180601B2FA767401AF8C12FE72
+:10063000E20027DB1C34FE0AF0FEB60694FE6C07CF
+:10064000FE06F0FE74079586022408050AFE2E12A7
+:100650001619010B1600010B1600010B1600010BF9
+:10066000FE99A4010B160002FE420868051AFE3826
+:100670001208051AFE301316FE1B00010B160001AE
+:100680000B1600010B1600010B1606010B160002DB
+:10069000E26C58BE50FE9A81551B7AFE4207091B38
+:1006A000FE096FBAFECA45FE3212696D8B6C7F2758
+:1006B000FE54071C34FE0AF0FE4207958694FE6C39
+:1006C000070224014B02DB161F02DBFE9CF7DCFE57
+:1006D0002C90FEAE9056FEDA070C60146108545A56
+:1006E0003722200711FE0E128DFE808039206A2AE3
+:1006F000FE0610FE83E7FE4800ABFE034008545B95
+:100700003701B3B8FE1F40136201EFFE0850FE8AA6
+:1007100050FE4451FEC65188FE0890FE8A900C5E41
+:10072000145FFE0C90FE8E90FE4050FEC2500C3DB9
+:10073000143EFE4A1008055AFE2A12FE2C90FEAE08
+:10074000900C60146108055B8B01B3FE1F8013627F
+:10075000FE4490FEC6900C3F1440FE0890FE8A9026
+:100760000C5E145FFE4090FEC2900C3D143E0C2EB9
+:10077000143C210C490C6308541F372C0FFE4E11FA
+:1007800027DDFE9EF0FE7608BC17342C77E6C5FE0A
+:100790009A08C6FEB80894FE8E08FE06F0FE94087D
+:1007A00095860224014BFEC910161FFEC91068056C
+:1007B00006FE101268050A4E08050AFE9012FE2E6B
+:1007C0001C02FE180B6805064E68050AFE7A12FE2A
+:1007D0002C1CFEAAF0FED209FEACF0FE000902FEBF
+:1007E000DE09FEB7F0FEFC08FE02F61A50FE701895
+:1007F000FEF118FE4055FEE155FE1058FE9158FEE0
+:100800001459FE95591C85FE8CF0FEFC08FEACF0D8
+:10081000FEF008B5FECB10FEADF0FE0C0902FE188E
+:100820000BB6FEBF10FE2BF085F41EFE00FEFE1C74
+:1008300012C2FED2F085FE76181E19178503D21E4D
+:10084000061785C54AC64AB5B6FE891074672D15C8
+:100850009D013610FE3500FE01F06510800265FE38
+:100860009880FE19E40AFE1A1251FE1982FE6C18D5
+:10087000FE4454BEFE1981FE74188F9017FECE08F8
+:10088000024A08055AEC032E293C0C3F14409B2ECB
+:100890009C3CFE6C18FEED18FE4454FEE5543A3FB5
+:1008A0003B40034929638FFEE354FE7418FEF5189C
+:1008B0008FFEE35490C056FECE08024AFE37F0FE8B
+:1008C000DA09FE8BF0FE6009024A08050A23FEFAE7
+:1008D0000A3A493B6356FE3E0A0FFEC007419800A4
+:1008E000ADFE0159FE52F0FE0C0A8F7AFE240A3A40
+:1008F000498FFEE35457497D63FE1458FE95580214
+:100900004A3A493B63FE1459FE9559BE574957630D
+:10091000024A08055AFE821208051FFE661322626B
+:10092000B7FE03A1FE8380FEC844FE2E13FE049191
+:10093000FE86916A2AFE4059FEC15956E00360299D
+:10094000610C7F148057607D6101B3B86A2A13621D
+:100950009B2E9C3C3A3F3B4090C0FE04FA2EFE0585
+:10096000FA3C01EFFE3610210C7F0C803A3F3B40F1
+:10097000E408051F17E03A3D3B3E0805FEF7003747
+:10098000035E295FFE1058FE915857497D6302FEB1
+:10099000F40908051F17E00805FEF70037BEFE1929
+:1009A0008150FE1090FE9290FED3103207A617FEE3
+:1009B000080912A608050AFE1413033D293E56FE37
+:1009C0000809FE0C58FE8D58024A2141FE1980E7A5
+:1009D00008050AFE1A12FE6C19FE1941F4C2FED176
+:1009E000F0E2157E013610FE4400FE8E10FE6C19FA
+:1009F000573DFEED197D3EFE0C51FE8E51F41EFE5C
+:100A000000FF35FE7410C2FED2F0FEA60BFE761873
+:100A10001E198A03D21E06FE081310FE1600026578
+:100A2000FED1F0FEB80B157E013610FE1700FE4217
+:100A300010FECEF0FEBE0BFE3C10FECDF0FECA0B4B
+:100A400010FE22000265FECBF0FED60B10FE240045
+:100A50000265FED0F0FEE00B109EE5FECFF0FEEA50
+:100A60000B1058FE1010FECCF0E268051F4D10FE72
+:100A700012002C0FFE4E1127FE000CFE9EF0FE14FD
+:100A80000CBC17342C77E6C524C6242CFA27FE208C
+:100A90000C1C3494FE3C0C9586C5DCC6DC0224019B
+:100AA0004BFEDB1012FEE800B5B674C781C883FEAA
+:100AB00089F0243331E1C781C88327FE660C1D24E9
+:100AC0003331DFBC4E10FE420002657C06FE8149D8
+:100AD00017FE2C0D08050AFE44131000550AFE549B
+:100AE0001255FE280023FE9A0D0946010E070066E6
+:100AF00044FE2800FEE21001F501F609A401FE26DD
+:100B00000F64122F0173022B10FE4400550AE944B2
+:100B10000AFEB41001B0440AFEAA1001B0FE198208
+:100B2000FE3446AC440A10FE4300FE961008540AF8
+:100B30003701F501F664122F0173990A644292029B
+:100B4000FE2E0308050A8A440A1000FE5C106805A0
+:100B50001AFE581208051AFE5013FE1C1CFE9DF0CA
+:100B6000FE500DFE1C1CFE9DF0FE560D08541A375B
+:100B7000FEA91010FE1500FE04E60A50FE2E10100D
+:100B8000FE1300FE1010106FAB10FE4100AA10FE05
+:100B900024008CB5B67403702823D850FE04E61ADE
+:100BA000FE9D41FE1C426401E3022BF8150A39A0A8
+:100BB000B415FE310039A201FE481002D742FE06EC
+:100BC000ECD0FC441BFECE453542FE06EAD0FE4783
+:100BD0004B91FE7557035DFE9856FE381209480189
+:100BE0000EFE44484F08051BFE1A130946010E412C
+:100BF000FE415809A4010EFE495496FE1E0E02FE47
+:100C00002E03095DFEEE14FC441BFECE453542FE6C
+:100C1000CE47FEAD13022B22200711FE9E12211398
+:100C200059139F13D5222F41392FBCADFEBCF0FEC6
+:100C3000E00E0F06135901FEDA1603FE380129FEF5
+:100C40003A0156FEE40EFE02ECD5690066FE04ECA5
+:100C5000204FFE05F6FE340101FE4A17FE0890FE05
+:100C600048F40DFE1813BAFE02EAD5697EFEC513DC
+:100C7000151A39A0B4FE2E1003FE38011EFEF0FF37
+:100C80000CFE600103FE3A010CFE620143132025B5
+:100C900006132F122F920F060421042259FEF71279
+:100CA000229FB7139F077EFE7113FE241C1519396E
+:100CB000A0B4FED910C3FE03DCFE7357FE805D04B2
+:100CC000C3FE03DCFE5B57FE805D04FE0357C321B9
+:100CD000FE00CC04FE0357C37804080558FE221317
+:100CE000FE1C800706FE1A13FE1E80EDFE1D80AE60
+:100CF000FE0C90FE0E13FE0E90ACFE3C90FE30F407
+:100D00000AFE3C50AA01FE7A1732072FAD01FEB44D
+:100D10001608051B4E01F501F612FEE900080558FC
+:100D2000FE2C1301FE0C17FE1E1CFE1490FE969066
+:100D30000CFE640114FE660108055BFE1212FE0340
+:100D4000808DFE01EC20FE804013206A2A12CF64C1
+:100D50002220FB792004FE081C03FEAC00FE06588E
+:100D600003FEAE00FE075803FEB000FE085803FE67
+:100D7000B200FE0958FE0A1C256E13D0210C5C0C33
+:100D8000450F465250181BFE904DFE915423FEFC19
+:100D90000F44110F48521858FE904DFE915423E411
+:100DA000251113207C6F4F2220FB792012CFFE14D7
+:100DB00056FED6F0FE2610F874FE141CFE101CFE23
+:100DC000181C0442FE0C14FCFE07E61BFECE47FE78
+:100DD000F5130401B07C6F4FFE0680FE4847FE42CB
+:100DE0001332072FFE34130948010EBBFE3612FEE4
+:100DF0004148FE454801F0FE00CCBBFEF3134378AA
+:100E00000711AC0984010EFE805C0173FE0E100711
+:100E1000824EFE1456FED6F0FE601004FE44588D3D
+:100E2000FE01ECA2FE9E40FE9DE700FE9CE71A79C3
+:100E30002A01E3FEDD102CC781C8833331DE071A97
+:100E4000FE4812070AFE56120719FE301207C9178C
+:100E5000FE321207FE230017EB070617FE9C12074F
+:100E60001FFE12120700172415C90136A92D010B08
+:100E7000944B042DDD09D101FE260F1282022B2D89
+:100E80003207A6FED9133A3D3B3E56FEF011080547
+:100E90005AFE72129B2E9C3C90C096FEBA112262A2
+:100EA000FE2613037F298056FE760D0C6014612107
+:100EB0000C7F0C8001B3256E77136201EF9B2E9C93
+:100EC0003CFE0455FEA555FE04FA2EFE05FA3CFE36
+:100ED0009110033F2940FE4056FEE1560C3F14405E
+:100EE000889B2E9C3C90C0035E295FFE0056FEA1AD
+:100EF000560C5E145F08055AFE1E122262FE1F4049
+:100F000003602961FE2C50FEAE50033F2940FE4491
+:100F100050FEC650035E295FFE0850FE8A50033D16
+:100F2000293EFE4050FEC2500289250613D40272AB
+:100F30002D010B1D4C3331DE0706234C3207A6234F
+:100F40007201AF1E43174C08050AEE3A3D3B3EFEC8
+:100F50000A5535FE8B55573D7D3EFE0C51FE8E5198
+:100F60000272FE1981BAFE194102722D010B1C3466
+:100F70001DE83331E15519FEA612550A4D024C0108
+:100F80000B1C341DE83331DF0719234C010B1DE81E
+:100F90003331FEE809FEC2495103FE9C00288A5302
+:100FA000051F35A9FEBB4555004E44067C43FEDABD
+:100FB0001401AF8CFE4B45EE3207A5ED03CD288A18
+:100FC00003452835670272FEC05DFEF814FE031764
+:100FD000035CC10C5C672D010B268901FE9E150286
+:100FE00089010B1C341D4C3331DF0706234C01F102
+:100FF000FE4258F1FEA4148CFE4AF40A174CFE4A35
+:10100000F406EA3207A58B02720345C10C45672D31
+:10101000010B268901FECC1502890F0627FEBE139F
+:1010200026FED41376FE8948010B2176047BFED080
+:10103000131CFED0131DFEBE13672D010BFED51031
+:101040000F71FF02005752931EFEFF7FFE3056FEC7
+:10105000005C040F71FF02005752931E43FE30568E
+:10106000FE005C040F71FF0200575293040F71FFE2
+:101070000200575293FE0B5804095C018709450191
+:101080008704FE03A11E11FF030054FE00F41F524B
+:10109000FE007DFE017DFE027DFE037C6A2A0C5E61
+:1010A000145F573F7D4004DDFE824AFEE11AFE8355
+:1010B0005A8D0401FE0C19FE4248505191010B1D3E
+:1010C000FE96153331E1010B1DFE96153331FEE816
+:1010D0000AFEC15903CD28FECC1253051AFEC413D3
+:1010E00021691AEE55CA6BFEDC144D0F0618CA7C36
+:1010F00030FE7810FF028355ABFF0283556919AEAD
+:1011000098FE300096F2186D0F06FE5610690AED33
+:1011100098FE640096F209FE6400189E0F06FE28F1
+:10112000106906FE601398FEC80096F209FEC8001A
+:1011300018590F068898FE90017AFE421591E4FE38
+:1011400043F49FFE56F0FE5415FE04F471FE43F482
+:101150009EFEF310FE405C01FE16141E43ECFE00E2
+:1011600017FE4DE46E7AFE9015C46EFE1C10FE0054
+:1011700017FE4DE4CC7AFE9015C4CC885121FE4D6B
+:10118000F400E9910F06FEB456FEC35804510F0A4D
+:10119000041606010B26F3160A010B26F316190195
+:1011A0000B26F376FE8949010B041606010B26B1C6
+:1011B0001619010B26B11606010B26B1FE8949014D
+:1011C0000B26B176FE894A010B04510422D307068F
+:1011D000FE4813B813D3FE49F4004D76A967FE010B
+:1011E000ECFE2701FE8948FF02001027FE2E163272
+:1011F00007FEE300FE20131DFE52162113D4014BFF
+:1012000022D407064E08540637040948010EFB8E07
+:101210000711AE0984010E8E095D01A8040984013D
+:101220000E8EFE80E71107118AFE455801F08E04EC
+:101230000948010E8E095D01A8040948010EFE80CF
+:1012400080FE804CFE49E411AE0984010EFE804C04
+:10125000095D0187041811756CFE6001FE18DFFE40
+:1012600019DEFE241CFE1DF71B97FEEE1601FEF490
+:1012700017AD9A1B6CFE2C01FE2F1904B923FEDE5C
+:1012800016FEDA1018117503FE6401FE00F41FFE4D
+:10129000185803FE6601FE19589A1FFE3C90FE3056
+:1012A000F406FE3C506CFE3800FE0F79FE1CF71F62
+:1012B00097FE3817FEB6143504B923FE1017FE9CAE
+:1012C00010181175FE835AFE18DFFE19DEFE1DF799
+:1012D0002E97FE5A17FE9414EC9A2E6C1AFEAF1934
+:1012E000FE98E70004B923FE4E17FE6C1018117526
+:1012F000FE30BCFEB2BC9ACB6C1AFE0F79FE1CF716
+:10130000CB97FE9217FE5C143504B923FE7E17FEC0
+:101310004210FE02F61175FE18FE60FE19FE61FE17
+:1013200003A1FE1DF75B97FEB817FE3614FE1C13D3
+:101330009A5B41FE8358FEAF19FE80E711FE81E7FC
+:101340001112FEDD006A2A046A2AFE124523FEA855
+:1013500017150639A0B4022BFE39F0FEFC17210444
+:10136000FE7E181E19660F0D047503D21E06FEEFD1
+:1013700012FEE1107C6F4F32072FFE3C13F1FE424C
+:101380001342920948010EBBEBFE4148FE4548015D
+:10139000F0FE00CCBBFEF31343780711AC098401C7
+:1013A0000EFE804C0173FE161007828BFE4014FE69
+:1013B0002412FE1456FED6F0FE1C18180A04FE9CD9
+:1013C000E70A10FE150064792A01E3180604429228
+:1013D00008541B37122F0173180604FE3890FEBA0A
+:1013E000903ACE3BCFFE485535FEC9550422A3772F
+:1013F00013A30409A4010EFE41480946010EFE494B
+:101400004417FEE8187778040948010E07114E09C1
+:101410005D01A80946010E777804FE4EE4196BFEC3
+:101420001C1903FE9000FE3A45FE2C10FE4EE4C946
+:101430006BFE2E1903FE9200FE02E61AE5FE4EE454
+:10144000FE0B006BFE401903FE9400FE02E61FFE39
+:10145000081003FE9600FE02E66DFE4E45EABAFF56
+:10146000046854E71E6EFE081CFE6719FE0A1CFE87
+:101470001AF4FE0004EAFE48F4197AFE74190F19F2
+:1014800004077EFE5AF0FE841925FE0900FE341082
+:10149000071AFE5AF0FE921925CAFE261007196691
+:1014A000256DE5070A66259EFE0E1007066625597E
+:1014B000A9B80415FE09000136FE04FE810383FE6F
+:1014C000405C041CF7FE14F00B27FED6191CF77BBA
+:0C14D000F7FE82F0FEDA1904FFCC0000E9
+:00000001FF
+/* Microcode buffer is kept after initialization for error recovery. */
diff --git a/firmware/advansys/38C1600.bin.ihex b/firmware/advansys/38C1600.bin.ihex
new file mode 100644 (file)
index 0000000..18c7c48
--- /dev/null
@@ -0,0 +1,398 @@
+:1000000077EF0406000000F2001600FC001000F07C
+:1000100018E40100041E48E403F6F7132E1E020044
+:100020000717C05F00FAFFFF040000F609E782E748
+:1000300085F086F04E109EE7FF0055F001F60300B4
+:10004000985701E600EA00EC01FA18F40800F01DE8
+:10005000385432F01000C20E1EF0D5F0BC004BE454
+:1000600000E6B1F0B40002133E1CC8473E00D801C0
+:1000700006130C1C5E1E0057C85701FCBC0EA212D2
+:10008000B9540080620A5A12C8153E1E1840BD5667
+:1000900003E601EA5CF00F0020006C016E0104121F
+:1000A0000413BB553C563E5703584AE44000B60083
+:1000B000BB00C000000101013E01580A44100A12B1
+:1000C0004C1C4E1C024A30E405E60C003C0080004B
+:1000D00024013C0168016A0170017201740176011A
+:1000E00078017C01C60E0C10AC12AE12161A321C2E
+:1000F0006E1E02483A55C95702EE5BF003F706F749
+:1001000003FC06001E00BE00E1000C12181A701A53
+:10011000301C381C1044004CB057405C4DE404EADD
+:100120005DF0A7F004F602FC05000900190032009A
+:1001300033003400360098009E00CC0020014E01B0
+:1001400079013C09680D021004103A1008120A13D4
+:100150004016501600174A19004E0054015800DC92
+:1001600005F009F059F0B8F048F40EF70A009B00CA
+:100170009C00A400B500BA00D000E700F0036908B5
+:10018000E9095C0CB612BC19D81B201C341C361CA7
+:10019000421D0844384491440A45484689486854F9
+:1001A0008355835931E402E607F008F00BF00CF0B8
+:1001B0004BF404F805F802FA03FA04FC05FC070006
+:1001C000A800AA00B900E000E500220126016001B4
+:1001D0007A018201C801CA0186026A031805B207C2
+:1001E0006808100D06100A100E1012106010ED10A5
+:1001F000F310061210121E120C130E131013FE9C95
+:10020000F03505FEEC0EFF100000E9FE341F00E89B
+:10021000FE8801FF030000FE9315FE0F05FF380066
+:1002200000FE572400FE4C0065FF0400001AFF0981
+:100230000000FF080101FF08FFFFFF270000FF107B
+:10024000FFFFFF130000FE7856FE3412FF2100006E
+:10025000FE04F7E8377D0D01FE4A11FE04F7E87D44
+:100260000D5137FE3DF0FE0C02FE20F0BCFE91F079
+:10027000FEF801FE90F0FEF801FE8FF0BC03674D22
+:1002800005FE080F01FE780FFEDD1205FE0E03FECF
+:10029000281C03FEA600FED1123E22FEA600ACFEE4
+:1002A00048F0FE9002FE49F0FEAA02FE4AF0FEC8A7
+:1002B00002FE46F0FE5A02FE47F0FE6002FE43F0E8
+:1002C000FE4E02FE44F0FE5202FE45F0FE56021CB7
+:1002D0000DA21C0722B70535FE001CFEF110FE0220
+:1002E0001CF5FE1E1CFEE910015FFEE710FE06FC79
+:1002F000DE0A8101A305351F9547B801FEE4110A06
+:1003000081015CFEBD100A81015CFEAD10FE161C71
+:10031000FE581C1C0722B7372A35FE3DF0FE0C02A2
+:100320002BFE9E02FE5A1CFE121CFE141C1FFE30E9
+:100330000047B801FED4111C0722B705E9212C099A
+:100340001A31FE69101C0722B7FE04EC2C6001FE76
+:100350001E1E202CFE05F6DE01FE621B010C614A0A
+:100360004415565101FE9E1E01FE961A05350A5788
+:1003700001180900360185FE1810FE41580ABA011D
+:1003800018FEC8547BFE1C0301FE961A0535376023
+:10039000FE02E830FEBF57FE9E43FE7757FE27F071
+:1003A000FEE401FE074BFE20F0BCFE401C2AEBFEE3
+:1003B00026F0FE6603FEA0F0FE5403FE11F0BCFE24
+:1003C000EF10FE9FF0FE7403FE461C19FE1100059F
+:1003D0007037FE481CFE461C010C0628FE1813262A
+:1003E00021B9C720B90A570118C78901FEC81A15D3
+:1003F000E12AEBFE01F0EBFE82F0FEA403FE9C324C
+:1004000015FEE4002FFEB6032A3C16FEC60301418A
+:10041000FE06F0FED603AFA0FE0AF0FEA2070529F5
+:1004200003811E1BFE24051F6301428FFE7002051F
+:10043000EAFE461C377D1DFE671BFEBF57FE775741
+:10044000FE481C7501A6860A57011809001BEC0A14
+:10045000E101187750408D3003811EF81F6301427F
+:100460008FFE700205EAD799D89C2A292FFE4E04E8
+:1004700016FE4A047EFEA000FE9B57FE541232FF79
+:10048000020010010816FE02053201081629272570
+:10049000EEFE4C44FE581250FE44481334FE4C54B9
+:1004A0007BEC608D3001FE4E1EFE4847FE7C130142
+:1004B0000C0628FE32130143099BFE6813FE26102A
+:1004C0001334FE4C547BEC01FE4E1EFE4847FE5496
+:1004D00013010C0628A50143099BFE4013010C06DD
+:1004E00028F91F7F010C06074D1FFE0D0001428FEA
+:1004F000FEA40E05293215FEE6000FFE1C9004FE38
+:100500009C933A0B0E8B021F7F01420535FE425B26
+:100510007D1DFE4659FEBF57FE77570FFE878004AC
+:10052000FE8783FEC9470B0ED065010C060DFE98B1
+:10053000130FFE208004FEA083330B0E091DFE84E2
+:100540001201380607FE701303FEA2001E1BFEDA1E
+:1005500005D0540138060DFE581303FEA0001EFE00
+:1005600050125EFF0200102FFE90052A3CCCFF02C5
+:1005700000102FFE9E0517FEF40515FEE300260170
+:1005800038FE4AF0FEC005FE49F0FEBA05712EFEA7
+:100590002100F12EFE2200A22E4AFE0948FF020091
+:1005A000102FFED00517FEF405FEE208013806FE06
+:1005B0001C004D01A72E0720E447FE2701010C0671
+:1005C00028FE24123E01841F7F010C06074D1FFEEA
+:1005D0000D0001428FFEA40E052903E61EFECA137C
+:1005E00003B61EFE401203661EFE38133E0184173A
+:1005F000FE72060A0701380624FE02124F01FE565B
+:100600001916FE68061582014115E203668A106616
+:10061000039A1EFE701203551EFE681301C60912CE
+:1006200048FE92062E1201FEAC1DFE434862801366
+:1006300058FF02005752AD233F4E62493E018417D6
+:10064000FEEA0601380612F7450A9501FE841916DE
+:10065000FEE0061582014115E203558A10551C077C
+:100660000184FEAE10036F1EFE9E133E0184039AAA
+:100670001EFE1A1201380612FC01C601FEAC1DFE58
+:1006800043486280F0450A9503B61EF801380624F7
+:1006900036FE02F60771788C004D62493E2D934E6E
+:1006A000D00D17FE9A0701FEC01916FE90072620EE
+:1006B0009E1582014115E2219E0907FB03E6FE58C3
+:1006C0005710E605FE2A06036F8A106F1C07018487
+:1006D000FE9C325F7501A68615FEE2002FED2A3CD6
+:1006E000FE0AF0FECE07AEFE9608FE06F0FE9E085D
+:1006F000AFA00529010C060DFE2E12141D010814D1
+:100700000001081400010814000108FE99A4010862
+:10071000140005FEC60901760612FE3A12010C0607
+:1007200012FE301314FE1B0001081400010814000F
+:1007300001081400010814070108140005EF7C4AA1
+:10074000784F0FFE9A8104FE9A83FECB470B0E2D45
+:100750002848FE6C080A28FE096FCAFECA45FE3208
+:100760001253634E7C972FFE7E082A3CFE0AF0FE51
+:100770006C08AFA0AEFE96080529014105ED1424D2
+:1007800005EDFE9CF79F01FEAE1EFE185801FEBE51
+:100790001EFE9958FE7818FEF9188EFE1609106A8A
+:1007A000226B010C615444212C091AF87701FE7E5A
+:1007B0001E472C7A30F0FE83E7FE3F0071FE0340B7
+:1007C000010C61654401C2C8FE1F40206E01FE6A33
+:1007D00016FE0850FE8A50FE4451FEC651FE10100F
+:1007E00001FECE1E01FEDE1E1068226901FEEE1E15
+:1007F00001FEFE1EFE4050FEC250104B224CFE8AEF
+:1008000010010C0654FE501201FEAE1E01FEBE1E6B
+:10081000106A226B010C06654E01C20FFE1F800498
+:10082000FE9F83330B0E206E0FFE449004FEC49394
+:100830003A0BFEC69004FEC693790B0E106C226D27
+:1008400001FECE1E01FEDE1E106822690FFE4090E2
+:1008500004FEC0933A0BFEC29004FEC293790B0EC5
+:10086000104B224C10642234010C6124443713FED7
+:100870004E112FFEDE09FE9EF0FEF209FE01481B1E
+:100880003C3788F5D4FE1E0AD5FE420AD2FE1E0A67
+:10089000D3FE420AAEFE120AFE06F0FE180AAFA010
+:1008A00005290141FEC1101424FEC110017606077E
+:1008B000FE14120176060D5D010C060DFE7412FE8B
+:1008C0002E1C05FE1A0C017606075D0176060D4109
+:1008D000FE2C1CFEAAF0FECE0AFEACF0FE660AFE5E
+:1008E0009210C4F6FEADF0FE720A05FE1A0CC5FEAB
+:1008F000E710FE2BF0BFFE6B1823FE00FEFE1C125D
+:10090000ACFED2F0BFFE7618231D1BBF03E3230706
+:100910001BBFD45BD55BD25BD35BC4C5FEA910758E
+:100920005E321F7F014219FE3500FE01F0701998FA
+:100930000570FE741823FE00F81B5B7D1201FE7823
+:100940000F4D01FE961A2130777D1D055B010C06C7
+:100950000D2BFEE20B010C0654FEA612010C062420
+:10096000FE8813216EC701FE1E1F0FFE838004FE4A
+:100970008383FEC9470B0EFEC844FE42130FFE04DC
+:100980009104FE8493FECA570BFE869104FE869363
+:10099000FECB570B0E7A30FE4059FEC1598E4003F4
+:1009A0006A3B6B10972298D96ADA6B01C2C87A3019
+:1009B000206EDB64DC34916C7E6DFE4455FEE555A3
+:1009C000FE04FA64FE05FA3401FE6A16A3261097A7
+:1009D0001098916C7E6DFE1410010C06241B409142
+:1009E0004B7E4C010C06FEF7004403683B69FE1089
+:1009F00058FE9158FE1459FE9559055B010C0624CA
+:100A00001B40010C06FEF700447801FE8E1E4F0FBE
+:100A1000FE109004FE90933A0BFE929004FE929387
+:100A2000790B0EFEBD10014309BB1BFE6E0A15BB00
+:100A3000010C060DFE1413034B3B4C8EFE6E0AFE9A
+:100A40000C58FE8D58055B263E0FFE198004FE995A
+:100A500083330B0EFEE510010C060DFE1A12FE6C20
+:100A600019FE1941FE6B18ACFED1F0EF1F92014246
+:100A700019FE4400FE9010FE6C19D94BFEED19DAF8
+:100A80004CFE0C51FE8E51FE6B1823FE00FF31FE12
+:100A90007610ACFED2F0FEBA0CFE7618231D5D0374
+:100AA000E32307FE081319FE16000570FED1F0FEC1
+:100AB000CC0C1F92014219FE17005CFECEF0FED254
+:100AC0000CFE3E10FECDF0FEDE0C19FE220005707D
+:100AD000FECBF0FEEA0C19FE24000570FED0F0FEFD
+:100AE000F40C1994FE1C10FECFF0FEFE0C194AF314
+:100AF000FECCF0EF017606244D19FE12003713FEEE
+:100B00004E112FFE160DFE9EF0FE2A0DFE01481B13
+:100B10003C3788F5D429D529D229D32937FE9C32F0
+:100B20002FFE3E0D2A3CAEFE620DAFA0D49FD59F96
+:100B3000D29FD39F05290141FED31015FEE800C4C2
+:100B4000C575D799D89CFE89F0292725BED799D895
+:100B50009C2FFE8C0D16292725BDFE0148A419FEE9
+:100B6000420005709007FE81491BFE640E010C06D1
+:100B70000DFE441319002D0DFE54122DFE28002BDE
+:100B8000FEDA0E0A57011809003646FE2800FEFA62
+:100B90001001FEF41C01FE001D0ABA01FE581040AF
+:100BA00015560185053519FE44002D0DF7460DFE3D
+:100BB000CC1001A7460DFEC21001A70FFE1982043A
+:100BC000FE9983FECC470B0EFE3446A5460D19FE5A
+:100BD0004300FEA210010C610D4401FEF41C01FE55
+:100BE000001D40155601857D0D405101FE9E1E05DC
+:100BF000FE3A03010C060D5D460D1900FE62100160
+:100C0000760612FE5C12010C0612FE5213FE1C1C2C
+:100C1000FE9DF0FE8E0EFE1C1CFE9DF0FE940E014D
+:100C20000C611244FE9F1019FE1500FE04E60D4FE4
+:100C3000FE2E1019FE1300FE101019FE4700F119C8
+:100C4000FE4100A219FE240086C4C57503811E2B37
+:100C5000EA4FFE04E612FE9D41FE1C424001F405EF
+:100C600035FE121C1F0D47B5C31FFE310047B801EA
+:100C7000FED41105E951FE06ECE0FE0E474628FEC3
+:100C8000CE453151FE06EAE0FE474B45FE7557035F
+:100C900067FE9856FE38120A5A0118FE4448600151
+:100CA0000C0628FE18130A5701183EFE41580ABACE
+:100CB000FEFA14FE4954B0FE5E0F05FE3A030A67C1
+:100CC000FEE014FE0E474628FECE453151FECE47CB
+:100CD000FEAD130535212C091AFE98122620962008
+:100CE000E7FE081CFE7C19FEFD19FE0A1C03E5FE4A
+:100CF0004855A53BFE6201FEC95531FE741001FE48
+:100D0000F01A03FE38013BFE3A018EFE1E10FE0271
+:100D1000ECE7530036FE04EC2C60FE05F6FE3401D1
+:100D200001FE621B01FECE1EB211FE1813CAFE02A6
+:100D3000EAE75392FEC3131F1247B5C3FE2A1003FE
+:100D4000FE380123FEF0FF10E503FE3A0110FE62BB
+:100D50000101FE1E1E202C155601FE9E1E130702C9
+:100D600026022196C720960992FE79131F1D47B5CA
+:100D7000C3FEE110CFFE03DCFE7357FE805D02CFA1
+:100D8000FE03DCFE5B57FE805D02FE0357CF26FEAE
+:100D900000CC02FE0357CF8902010C064AFE4E1317
+:100DA0000FFE1C8004FE9C83330B0E0907FE3A13D2
+:100DB0000FFE1E8004FE9E83330B0EFE2A130FFED1
+:100DC0001D8004FE9D83FEF9130EFE1C1301FEEE32
+:100DD0001EACFE141301FEFE1EFE8158FA01FE0E2B
+:100DE0001FFE30F40DFE3C50A201FE921B01430990
+:100DF00056FB01FEC81A010C0628A401FEF41C01D2
+:100E0000FE001D15FEE900010C064AFE4E1301FE10
+:100E1000221BFE1E1C0FFE149004FE94933A0BFE40
+:100E2000969004FE9693790B0E10FE640122FE66E6
+:100E300001010C0665F90FFE038004FE8383330B6A
+:100E40000E77FE01EC2CFE8040202C7A3015DF401E
+:100E5000212CFE00408D2C02FE081C03FEAC00FE7F
+:100E6000065803FEAE00FE075803FEB000FE085809
+:100E700003FEB200FE0958FE0A1C2E4920E026108F
+:100E8000661055106F1357524F1C28FE904DFE915F
+:100E9000542BFE8811461A135A521C4AFE904DFEDE
+:100EA00091542BFE9E112E1A202C903460212CFE82
+:100EB00000408D2C15DFFE1456FED6F0FEB211FE5A
+:100EC000121C75FE141CFE101CFE181C0251FE0C98
+:100ED00014FE0E47FE07E628FECE47FEF51302017C
+:100EE000A7903460FE0680FE4847FE4213FE028053
+:100EF0000956FE34130A5A0118CBFE3612FE414839
+:100F0000FE454801FEB216FE00CCCBFEF3133F892E
+:100F1000091AA50A9D0118FE805C0185F2099BA4AF
+:100F2000FE1456FED6F0FEEC1102FE445877FE0188
+:100F3000ECB8FE9E40FE9DE700FE9CE7128D30015E
+:100F4000F4FEDD1037D799D89C2725EE0912FE480C
+:100F500012090DFE5612091DFE301209DD1BFEC4DA
+:100F60001309FE23001BFED01309071BFE341409CE
+:100F700024FE121209001B291FDD0142A1320108C3
+:100F8000AE410232FE62080AE101FE5810159B05CF
+:100F90003532014309BBFED713914B7E4C8EFE8048
+:100FA00013010C0654FE7212DB64DC34FE4455FE61
+:100FB000E555B0FE4A13216EFE261303973B988E2B
+:100FC000FEB60E106A226B261097109801C22E49A9
+:100FD00088206E01FE6A16DB64DC34FE0455FEA533
+:100FE00055FE04FA64FE05FA34FE8F10036C3B6D67
+:100FF000FE4056FEE156106C226D71DB64DC34FE5F
+:101000004455FEE55503683B69FE0056FEA15610A7
+:10101000682269010C0654F9216EFE1F40036A3BE9
+:101020006BFE2C50FEAE50036C3B6DFE4450FEC672
+:101030005003683B69FE0850FE8A50034B3B4CFE50
+:101040004050FEC25005732E07209E0572320108E3
+:10105000163D2725EE09072B3D014309BB2B7201E5
+:10106000A6233F1B3D010C060DFE1E13914B7E4C2B
+:10107000FE0A5531FE8B55D94BDA4CFE0C51FE8ED3
+:1010800051057201FE8E1ECAFE1941057232010819
+:101090002A3C16C02725BE2D1DC02D0D832D7F1B7C
+:1010A000FE6615053D01082A3C16C02725BD091D11
+:1010B0002B3D010816C02725FEE809FEC249500352
+:1010C000B61E830138062431A1FEBB452D00A4467F
+:1010D00007903F01FEF81501A686FE4B45FE201342
+:1010E00001430982FE1613039A1E5D03551E315EED
+:1010F0000572FEC05D01A7FE031703668A10665ED7
+:10110000320108177301FE5619057301082A3C16AF
+:101110003D2725BD09072B3D01FEBE16FE4258FEA8
+:10112000E81401A686FE4AF40D1B3DFE4AF407FEB4
+:101130000E12014309824E057203558A10555E3224
+:101140000108177301FE8419057301082A3C163D36
+:101150002725BD09122B3D01FEE8178BFEAA14FEC0
+:10116000B61486A8B20D1B3DB207FE0E120143094C
+:10117000824E0572036F8A106F5E32010817730189
+:10118000FEC019057313072FFECC1517FEE2155F7D
+:10119000CC0108265F028FFEDE152AFEDE1516FE44
+:1011A000CC155E320108FED5101358FF02005752CD
+:1011B000AD23FEFF7FFE3056FE005C021358FF0297
+:1011C000005752AD233FFE3056FE005C021358FF1D
+:1011D00002005752AD021358FF02005752FE005E44
+:1011E000021358FF02005752ADFE0B58020A660167
+:1011F0005C0A55015C0A6F015C0201FE1E1F231A86
+:10120000FF030054FE00F424520FFE007C04FE078E
+:101210007C3A0B0EFE0071FEF918FE7A19FEFB19DE
+:10122000FE1AF700FE1BF7007A3010682269D96CAD
+:10123000DA6D02FE6208FE824AFEE11AFE835A77E8
+:101240000201C6FE42484F5045010816FEE017272E
+:1012500025BE010816FEE0172725FEE80AFEC15943
+:10126000039A1EFEDA1201380612FED0132653121C
+:1012700048FE0817D1125312FE1E132DB47BFE2612
+:10128000174D13071CB49004FE7810FF028355F12C
+:10129000FF028355531DFE1213D6FE3000B0FE80B0
+:1012A000171C631307FE5610530DFE1613D6FE646B
+:1012B00000B0FE80170AFE64001C941307FE28107D
+:1012C0005307FE6013D6FEC800B0FE80170AFEC8A2
+:1012D000001C95130771D6FE900148FE8C1745F34C
+:1012E000FE43F496FE56F0FE9E17FE04F458FE43AD
+:1012F000F494F68B01FE2416233FFCA88C4948FE8B
+:10130000DA176249FE1C10A88C8048FEDA1762804A
+:10131000715026FE4DF400F7451307FEB456FEC388
+:10132000580250130D02503E784F45010816A92768
+:1013300025BEFE03EAFE7E01010816A92725FEE967
+:101340000A010816A92725FEE90AFE05EAFE7F0123
+:10135000010816A92725FE6909FE02EAFE8001019F
+:101360000816A92725FEE80847FE810103B61E835B
+:101370000138062431A278F2530736FE34F43FA137
+:1013800078039A1E830138061231F04F45FE901003
+:10139000FE405A233FFB8C4948FEAA186249718CD3
+:1013A0008048FEAA186280FEB456FE405D01C60168
+:1013B000FEAC1DFE0217FEC845FE5AF0FEC018FE28
+:1013C00043482D9336FE34F4FE0011FE40102DB438
+:1013D00036FE34F404FE34102DFE0B00364663FE58
+:1013E0002810FEC049FF020054B2FE900148FEFAE8
+:1013F0001845FE1CF43FF3FE40F496FE56F0FE0C3A
+:1014000019FE04F458FE40F494F63E2D934ED00D90
+:1014100021FE7F01FEC846FE24138C005D2621FEBE
+:101420007E01FEC845FE141321FE8001FE4845FAE8
+:1014300021FE8101FEC8444E260213070278455062
+:10144000130D021407010817FE8219140D01081765
+:10145000FE8219141D010817FE82195FFE894901D9
+:1014600008021407010817C1141D010817C1140749
+:10147000010817C1FE8949010817C15FFE894A01A9
+:1014800008025002140701081774147F010817742A
+:10149000141201081774FE89490108177414000119
+:1014A000081774FE894A01081774FE0949010817D4
+:1014B000745FCC01080221E40907FE4C13C820E444
+:1014C000FE49F4004D5FA15EFE01ECFE2701CCFF5A
+:1014D0000200102FFE3E1A014309FEE300FE221314
+:1014E00016FE641A26209E0141219E09075D010C0B
+:1014F000610744020A5A0118FE0040AA091AFE12A6
+:10150000130A9D0118AA0A6701A3020A9D0118AADD
+:10151000FE80E71A091A5DFE455801FEB216AA02BE
+:101520000A5A0118AA0A6701A3020A5A011801FE01
+:101530007E1EFE804CFE49E41AFE12130A9D01181D
+:10154000FE804C0A67015C021C1A877CE5FE18DFEE
+:10155000FE19DEFE241CFE1DF728B1FE041B01FE51
+:101560002A1CFAB3287CFE2C01FE2F1902C92BFE7F
+:10157000F41AFEFA101C1A8703FE6401FE00F4241C
+:10158000FE185803FE6601FE1958B32401FE0E1F13
+:10159000FE30F407FE3C507CFE3800FE0F79FE1C46
+:1015A000F724B1FE501BFED4143102C92BFE261BBA
+:1015B000FEBA101C1A87FE835AFE18DFFE19DEFEE3
+:1015C0001DF754B1FE721BFEB214FCB3547C12FE24
+:1015D000AF19FE98E70002C92BFE661BFE8A101C9D
+:1015E0001A878B0FFE309004FEB0933A0BFE18580A
+:1015F000FE329004FEB2933A0BFE19580EA8B34A7D
+:101600007C12FE0F79FE1CF74AB1FEC61BFE5E146B
+:101610003102C92BFE961B5CFE02F61A87FE18FEED
+:101620006AFE19FE6B01FE1E1FFE1DF765B1FEEE80
+:101630001BFE3614FE1C13B3653EFE8358FEAF1925
+:10164000FE80E71AFE81E71A15FEDD007A30027A85
+:1016500030FE12452BFEDC1B1F0747B5C30535FEC8
+:1016600039F0752602FE7E18231D361311028703FA
+:10167000E32307FEEF12FEE110903460FE028009C2
+:1016800056FE3C13FE8214FE421351FE06830A5A94
+:101690000118CBFE3E12FE4148FE454801FEB2163F
+:1016A000FE00CCCBFEF3133F89091AA50A9D011851
+:1016B000FE804C0185FE1610099B4EFE4014FE2450
+:1016C00012FE1456FED6F0FE521C1C0D02FE9CE7C4
+:1016D0000D19FE1500408D3001F41C070251FE0665
+:1016E00083FE1880612844155601851C0702FE38C8
+:1016F00090FEBA9091DE7EDFFE485531FEC955025C
+:1017000021B98820B9020ABA0118FE41480A5701D6
+:1017100018FE49441BFE1E1D8889020A5A01180939
+:101720001AA40A6701A30A570118888902FE4EE429
+:101730001D7BFE521D03FE9000FE3A45FE2C10FE5E
+:101740004EE4DD7BFE641D03FE9200D112FE1A10F2
+:10175000FE4EE4FE0B007BFE761D03FE9400D124BA
+:10176000FE081003FE9600D163FE4E4583CAFF04B7
+:101770006854FEF1102349FE081CFE6719FE0A1C7E
+:10178000FE1AF4FE000483B21D48FEAA1D131D02BA
+:101790000992FE5AF0FEBA1D2E93FE34100912FE75
+:1017A0005AF0FEC81D2EB4FE2610091D362E63FE0B
+:1017B0001A10090D362E94F20907362E95A1C8028B
+:1017C0001F930142FE04FE99039C8B022AFE1C1EFD
+:1017D000FE14F0082FFE0C1E2AFE1C1E8FFE1C1E7F
+:1017E000FE82F0FE101E020F3F04FE8083330B0EBC
+:1017F000020FFE188004FE9883330B0E020FFE02C8
+:101800008004FE8283330B0E020FFE068004FE86E8
+:1018100083330B0E020FFE1B8004FE9B83330B0EE3
+:10182000020FFE048004FE8483330B0E020FFE8041
+:101830008004FE8083FEC9470B0E020FFE1981044F
+:10184000FE9983FECA470B0E020FFE068304FE8636
+:1018500083FECE470B0E020FFE2C9004FEAC933A93
+:101860000B0E020FFEAE9004FEAE93790B0E020F2C
+:10187000FE089004FE88933A0B0E020FFE8A900435
+:10188000FE8A93790B0E020FFE0C9004FE8C933AA5
+:101890000B0E020FFE8E9004FE8E93790B0E020F3C
+:1018A000FE3C9004FEBC933A0B0E028B0FFE0380AD
+:0E18B00004FE8383330B770EA802FF66000050
+:00000001FF
+/* Microcode buffer is kept after initialization for error recovery. */
diff --git a/firmware/advansys/mcode.bin.ihex b/firmware/advansys/mcode.bin.ihex
new file mode 100644 (file)
index 0000000..cd160d9
--- /dev/null
@@ -0,0 +1,147 @@
+:100000003F452C01010301190F0000000000000012
+:10001000000000000F0F0F0F0F0F0F0F0000000068
+:1000200000000000000000000000000000000000D0
+:1000300000000000000000000000000000000000C0
+:100040000000000000000000C3120D0501000000C8
+:1000500000FF000000000000FF80FFFF0100000023
+:10006000000000000000002300000000000700FF67
+:1000700000000000FFFFFF00000000000000E48817
+:100080000000000080734804360000A2C2008073A4
+:1000900003233640B600360005D60CD212DA00A291
+:1000A000C20092801E985000F5004898DF23366009
+:1000B000B60092804F00F5004898EF233660B600F6
+:1000C000928080629280004615EE13EA020109D800
+:1000D000CD044D0000A3D600A6977F2304618401C0
+:1000E000E684D2C18073CD044D0000A3DA01A69747
+:1000F000C681C28880738077000101A1FE004F0095
+:10010000849707A6080100330300C288030301DEB9
+:10011000C288CE006960CE0002034A6000A2780166
+:10012000806307A62401788103038063E20007A6A9
+:10013000340100330400C2880307020104CA0D23FE
+:1001400068984D04048505D80D236898CD041523BF
+:10015000F888FB23026182018063020306A3620127
+:1001600000330A00C2884E0007A36E0100330B0063
+:10017000C288CD04362D00331A00C288500488810D
+:1001800006AB820188814E0007A39201500000A3B4
+:100190003C0100057C814697020105C60423A001AD
+:1001A0001523A101BE81FD23026182010ADA4A0002
+:1001B000066100A0B4018063CD04362D00331B001E
+:1001C000C28806236898CD04E684060100A2D40103
+:1001D000576000A0DA01E6848023A001E6848073E2
+:1001E0004B00066100A2000204010CDE020103CCF8
+:1001F0004F008497FC810823024182014F006297DF
+:1002000048048480F0970046560003C00123E800AC
+:1002100081730629034206E203EE6BEB1123F88893
+:100220000498F0808073807707A42A027C9506A644
+:10023000340203A64C044682040103D8B4986A969B
+:100240004682FE95806783038063B62D02A66C020A
+:1002500007A65A0206A65E0203A66202C2887C9521
+:100260004882609648820423A0011423A1013C84A3
+:1002700004010CDCE0232561EF0014014F04A80108
+:100280006F00A5010323A40106239C01242B1C015C
+:1002900002A6AA0207A65A0206A65E0203A6200428
+:1002A00001A6B40200A6B40200331200C288000EF8
+:1002B0008063004300A08C024D0404010BDCE723A3
+:1002C00004618401103112351401EC006C38003FD8
+:1002D0000000EA821823046118A0E2020401A2C807
+:1002E00000331F00C28808310A350C390E3D7E9854
+:1002F000B62D01A6140300A6140307A60C0306A638
+:10030000100303A6200402A66C0200333300C28847
+:100310007C95EE826096EE82829880427E9864E4BC
+:1003200004012DC83105070100A2540300438701D1
+:10033000050586987E9800A6160307A64C0303A61B
+:100340003C0406A6500301A6160300332500C2880C
+:100350007C95328360963283040110CE07C8050570
+:10036000EB0400330020C020816272830001050588
+:10037000FFA27A03B1010823B2012E8305051501FE
+:1003800000A29A03EC006E0095016C38003F00005B
+:1003900001A6960300A69603108480427E9801A6CB
+:1003A000A40300A6BC031084A898804201A6A4035D
+:1003B00007A6B203D4837C95A88300332F00C2889C
+:1003C000A898804200A6BC0307A6CA03D4837C95E4
+:1003D000C08300332600C288382B80328036042345
+:1003E000A0011223A101108407F006A4F403806B7E
+:1003F000806705238303806303A60E0407A6060413
+:1004000006A60A0400331700C2887C95F483609620
+:10041000F483208407F006A42004806B8067052302
+:1004200083038063B62D03A63C0407A6340406A606
+:10043000380400333000C2887C9520846096208484
+:100440001D0106CC00330084C0200023EA00816235
+:10045000A20D806307A65A0400331800C288030364
+:100460008063A30107A46404230100A286040AA0F8
+:100470007604E00000331D00C2880BA08204E00077
+:1004800000331E00C2884223F888002322A3E6041A
+:10049000082322A3A204282322A3AE04022322A31A
+:1004A000C4044223F8884A00066100A0AE04452334
+:1004B000F888049800A2C004B49800330082C020D9
+:1004C0008162E8814723F88804010BDE0498B49820
+:1004D00000330081C0208162140100A00002432388
+:1004E000F8880423A0014423A10180734D0003A3D5
+:1004F000F40400332700C288040104DC0223A201B3
+:100500000423A001049826954B00F6004F044F00E9
+:1005100000A3220500057600066100A21C050A85DD
+:100520004697CD04248548048480020103DA8023A1
+:10053000820134850223A0014A00066100A2400521
+:100540001D0104D6FF2386414B60CB00FF238001B1
+:1005500049008101040102C830018001F704030150
+:1005600049048001C90000050001FFA0600577046F
+:100570000123EA005D00FEC700620023EA00006379
+:1005800007A4F805030302A08E05F48500332D00AF
+:10059000C28804A0B80580630023DF004A0006611A
+:1005A00000A2A4051D0106D60223024182015000CB
+:1005B00062970485042302418201048508A0BE05D8
+:1005C000F48503A0C405F48501A0CE0588008063EE
+:1005D000CC8607A0EE055F00002BDF0800A2E60531
+:1005E0008067806301A27A067C8506236898482389
+:1005F000F88807238000068780637C850023DF005E
+:1006000000634A00066100A236061D0116D4C0230D
+:1006100007418303806306A61C0600333700C288A7
+:100620001D0101D620236360830380630223DF0062
+:1006300007A67C05EF046F0000634B000641CB006A
+:100640005200066100A24E061D0103CAC0230741E5
+:1006500000631D0104CC00330083C020816280232D
+:1006600007410063806708238303806300630123DD
+:10067000DF0006A6840607A67C058067806300333A
+:100680000040C020816200630000FE958303806308
+:1006900006A6940607A67C05000001A01407002BFF
+:1006A000400E8063010006A6AA0607A67C05400E40
+:1006B0008063004300A0A20606A6BC0607A67C0530
+:1006C0008067400E806307A67C050023DF0000637F
+:1006D00007A6D60600332A00C28803038063890078
+:1006E0000A2B07A6E80600332900C288004300A2AF
+:1006F000F406C00E8063DE86C00E00330080C0208A
+:100700008162040102DA80637C85807B806306A6B7
+:100710008C0600332C00C2880CA22E07FE958303A2
+:10072000806306A62C0707A67C0500333D00C2881F
+:1007300000008067830380630CA0440707A67C0544
+:10074000BF2304618401E6840063F0040101F10029
+:100750000001F20001058001720471008101700442
+:10076000800581050063F004F20072040101F100CC
+:1007700070008101700471008101720080017104B8
+:100780007000800170040063F004F2007204000144
+:10079000F10070008001700471008001720081011D
+:1007A000710470008101700400630023B3018305AC
+:1007B000A301A201A1010123A0010001C80003A11E
+:1007C000C40700330700C28880058105040111C8F1
+:1007D0004800B001B1010823B201050148040043FB
+:1007E00000A2E4070005DA870001C800FF238001AA
+:1007F00005050063F7041A09F6086E040002804339
+:100800007608800277040063F7041A09F6086E047C
+:10081000000200A0140816880043760880027704BE
+:100820000063F3040023F40074008043F400CF401D
+:1008300000A2440874040201F7C9F6D9000101A11D
+:10084000240804982695248873040063F30475042F
+:100850005A88020104D84697049826954A8875005C
+:1008600000A3640800054E8873040063807B8063E6
+:1008700006A6760800333E00C28880678303806343
+:100880000063382B9C88382B928832093105929866
+:100890000505B209006300320036003A003E0063ED
+:1008A00080328036803A803EB43D0063382B40323F
+:1008B0004036403A403E00635A20C94000A0B40888
+:1008C0005D00FEC300638073E6200223E8008273AC
+:1008D000FFFD80731323F8886620C0200423A00145
+:1008E000A123A1018162E28880738077680000A261
+:1008F000800003C2F1C74123F8881123A10104231A
+:04090000A001E684E8
+:00000001FF
+/* Microcode buffer is kept after initialization for error recovery. */
diff --git a/firmware/bnx2/bnx2-mips-06-4.6.16.fw.ihex b/firmware/bnx2/bnx2-mips-06-4.6.16.fw.ihex
new file mode 100644 (file)
index 0000000..0df10b5
--- /dev/null
@@ -0,0 +1,5805 @@
+:10000000080000F80800000000004DA4000000C82F
+:1000100000000000000000000000000008004DA4E7
+:100020000000001400004E6C080000800800000072
+:10003000000056CC00004E800800582000000084CC
+:100040000000A54C080056CC000001340000A5D0EB
+:10005000080031D808000000000070DC0000A70490
+:10006000000000000000000000000000080070DC3C
+:1000700000000024000117E00800048808000400C4
+:100080000000175C000118040000000000000000E0
+:100090000000000000000000000000000000000060
+:1000A000080000980800000000003A7400012F606A
+:1000B0000000000000000000000000000000000040
+:0800C000000000000000000038
+:0800C8000A00003E00000000E8
+:1000D000000000000000000D636F6D342E362E31DD
+:1000E00036000000040610020000000000000003BB
+:1000F00000000014000000320000000300000000B7
+:1001000000000000000000000000000000000000EF
+:1001100000000010000001360000EA60000000014D
+:1001200000000000000000000000000000000008C7
+:1001300000000000000000000000000000000000BF
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000020000000000000000000000008D
+:10017000000000000000000000000000000000007F
+:10018000000000000000000000000010000000005F
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C0000000000010000003000000000000000D0F
+:1001D0000000000D3C02080024424DE03C030800F2
+:1001E00024634ED4AC4000000043202B1480FFFD5C
+:1001F000244200043C1D080037BD7FFC03A0F02111
+:100200003C100800261000F83C1C0800279C4DE01C
+:100210000E0002AA000000000000000D3C03601068
+:100220008C6450002402FF7F3C1A8000008220244E
+:100230003484380C24020037AC645000AF4200080C
+:1002400024020C80AF4200243C1B80083C060800BE
+:1002500024C6079C3C02080024424E182404001BBC
+:100260002484FFFFAC4600000481FFFD244200040B
+:100270003C020800244203803C010800AC224E20CE
+:100280003C020800244206803C010800AC224E24B7
+:100290003C02080024420D803C010800AC224E6064
+:1002A0003C02080024420A103C03080024630908A9
+:1002B0003C040800248409443C05080024A53C248F
+:1002C0003C010800AC224E683C0208002442057044
+:1002D0003C010800AC264E643C010800AC254E747D
+:1002E0003C010800AC234E7C3C010800AC224E804F
+:1002F0003C010800AC244E843C010800AC234E1C99
+:100300003C010800AC204E283C010800AC204E2CDB
+:100310003C010800AC204E303C010800AC204E34BB
+:100320003C010800AC204E383C010800AC204E3C9B
+:100330003C010800AC204E403C010800AC244E4477
+:100340003C010800AC204E483C010800AC204E4C5B
+:100350003C010800AC204E503C010800AC204E543B
+:100360003C010800AC204E583C010800AC264E5C15
+:100370003C010800AC204E6C3C010800AC254E70DE
+:100380003C010800AC234E780A0006F4000000008F
+:100390003C0308008C6300208F8200081043000398
+:1003A000000000000A00052CAF83000803E00008ED
+:1003B0000000000027BDFFE8AFB00010AFBF001481
+:1003C00027500100920200091040001A2403000186
+:1003D0003C0208008C42002010400016000018214A
+:1003E0000E00056400000000960300083C060800AB
+:1003F00094C64E968E0400188F8200209605000C3D
+:1004000000031C0000661825AC440000AC45000445
+:1004100024040001AC400008AC40000CAC400010CB
+:10042000AC400014AC4000180E000589AC43001C21
+:10043000000018218FBF00148FB000100060102141
+:1004400003E0000827BD001827BDFFE8AFBF00107C
+:100450009742010830437000240220001062000A15
+:1004600028642001548000128FBF00102402400035
+:1004700010620008240260001062000A8FBF0010A2
+:100480000A0000FB000010218FBF00100A0000BB13
+:1004900027BD00180E0003F6000000000A0000FA55
+:1004A0008FBF00100E000FB6000000008FBF0010BD
+:1004B0000000102103E0000827BD00183C020800DE
+:1004C0008C42002027BDFFE810400027AFBF00107E
+:1004D0000E00056400000000974201089743010CDC
+:1004E0008F8500203042003E3063FFFF0002140081
+:1004F00000431025ACA200008F4201003C0608001A
+:1005000094C64E968FBF0010ACA20004974301160C
+:100510009744010E3C02200000031C003084FFFFC2
+:1005200000641825ACA3000800C2302597420110D2
+:100530009743011224040001000214003063FFFFFE
+:1005400000431025ACA2000C9742011427BD0018EF
+:100550003042FFFFACA20010ACA00014ACA0001809
+:100560000A000589ACA6001C8FBF001003E000083C
+:1005700027BD00183C0208008C42002027BDFFE880
+:100580001040002AAFBF00100E00056400000000FC
+:10059000974201089743010C8F8500203042003EAE
+:1005A0003063FFFF0002140000431025ACA20000DE
+:1005B0008F4201003C06080094C64E968FBF001083
+:1005C000ACA20004974301169744010E3C022000A0
+:1005D00000031C003084FFFF00641825ACA3000852
+:1005E00000C23025974201109743011224040001F4
+:1005F000000214003063FFFF00431025ACA2000C82
+:100600009742011427BD00183042FFFFACA2001032
+:100610008F420118ACA200149342010B304200FF3C
+:10062000ACA200180A000589ACA6001C8FBF001000
+:1006300003E0000827BD001827BDFFE0AFB00010A1
+:10064000AFBF0018AFB10014275001009203000B98
+:100650002402001A961100081462003500002021BF
+:100660003222000110400009000000008E0200004C
+:1006700096030014000211C200021040005A10211B
+:10068000A44300800A000179322200020E00012BEF
+:10069000000000003C0208008C420040244200019F
+:1006A0003C010800AC220040322200020002202B54
+:1006B0003C0208008C420044322300042442000122
+:1006C0003C010800AC2200441060001A8FBF0018E3
+:1006D0008F4202B804410008240400013C020800D3
+:1006E0008C420060244200013C010800AC22006002
+:1006F0000A00019C8FB100148E02002096030016A0
+:1007000000002021AF4202808E020004A743028431
+:10071000AF4202883C021000AF4202B83C0208001F
+:100720008C42005C244200013C010800AC22005CC9
+:100730008FBF00188FB100148FB0001000801021FF
+:1007400003E0000827BD002027BDFFE0AFB0001088
+:10075000AFBF0018AFB10014275001009203000B87
+:1007600024020003961100081462003500002021C5
+:100770003222000110400009000000008E0200003B
+:1007800096030014000211C200021040005A10210A
+:10079000A44300800A0001BD322200020E0000FDC9
+:1007A000000000003C0208008C420040244200018E
+:1007B0003C010800AC220040322200020002202B43
+:1007C0003C0208008C420044322300042442000111
+:1007D0003C010800AC2200441060001A8FBF0018D2
+:1007E0008F4202B804410008240400013C020800C2
+:1007F0008C420060244200013C010800AC220060F1
+:100800000A0001E08FB100148E020020960300164A
+:1008100000002021AF4202808E020004A743028420
+:10082000AF4202883C021000AF4202B83C0208000E
+:100830008C42005C244200013C010800AC22005CB8
+:100840008FBF00188FB100148FB0001000801021EE
+:1008500003E0000827BD00209362000003E00008C9
+:10086000AF80000403E000080000102127BDFFE86E
+:10087000AFBF0014AFB000108F420100AF420020A4
+:100880008F420104AF4200A89350010B0E0001E417
+:10089000321000FF3C02080024424E18001018805D
+:1008A0002E10001C16000004006210210E0001E74B
+:1008B0000A0001FF000000008C4200000040F8091F
+:1008C00000000000104000053C0240008F4301047E
+:1008D0003C026020AC4300143C024000AF420138AF
+:1008E0003C0208008C4200348FBF00148FB000100F
+:1008F000244200013C010800AC22003403E000085F
+:1009000027BD001827BDFFE8AFBF00108F42014090
+:100910000E0001E4AF4200200E0003800000000042
+:100920003C024000AF4201783C03080024630038D9
+:100930008C6200008FBF001027BD00182442000108
+:1009400003E00008AC62000027BDFFE8AFBF001065
+:100950008F4201800E0001E4AF4200208F430180EE
+:1009600024020F0014620005000000008F4201887D
+:10097000A742009C0A0002393C024000936200003A
+:1009800024030050304200FF144300083C024000A2
+:100990000E00036400000000144000043C0240000C
+:1009A0000E000E42000000003C024000AF4201B8C1
+:1009B0003C0208008C42003C8FBF00102442000122
+:1009C0003C010800AC22003C03E0000827BD0018F1
+:1009D00003E00008000010218F4301048F82001003
+:1009E00010430008000000003C0208008C42008414
+:1009F000244200013C010800AC2200848F42010423
+:100A0000AF82001003E000080000000027BDFFE8EF
+:100A1000AFBF001027440100948200083043000259
+:100A2000304200041040001B000000008F4202B85A
+:100A300004410008240500013C0208008C420060CB
+:100A4000244200013C010800AC2200600A0002813F
+:100A50008FBF00108C820020948300160000282194
+:100A6000AF4202808C820004A7430284AF42028816
+:100A70003C021000AF4202B83C0208008C42005C0D
+:100A8000244200013C010800AC22005C0A00028103
+:100A90008FBF001010600008240500013C02080010
+:100AA0008C420084244200013C010800AC220084F6
+:100AB0000A0002818FBF00108F4401000E00024423
+:100AC00000000000000028218FBF001000A01021AE
+:100AD00003E0000827BD00183C0208008C42008893
+:100AE000274301009465000C244200013C010800EA
+:100AF000AC2200888C64001803451021904540000A
+:100B0000AF4400388C62001C2403FFF800052E005F
+:100B10000043102434420004AF42003C3C02000574
+:100B2000AF420030000000000000000000000000A4
+:100B3000AF450404000000000000000000000000B9
+:100B40003C02000634420001AF42003000000000C9
+:100B500000000000000000008F4200003042001042
+:100B60001040FFFD0000102103E00008000000001D
+:100B700027BDFFE0AFBF0018AFB100140E00005555
+:100B8000AFB000103C028000344200708C42000084
+:100B9000AF8200140E0000B2000000003C02800092
+:100BA000344600703C0308008C6300A03C0208003F
+:100BB0008C4200A4104300048F8400143C01080000
+:100BC000AC2300A4A743009E8CCA00003C0308008D
+:100BD0008C6300BC3C0208008C4200B80144202316
+:100BE00000641821000040210064202B00481021DF
+:100BF000004410213C010800AC2300BC3C0108006B
+:100C0000AC2200B88F510000322200071040FFE1F3
+:100C1000AF8A00148CC600003C0508008CA500BCFF
+:100C20003C0408008C8400B800CA302300A62821A8
+:100C30000000102100A6302B0082202100862021F8
+:100C4000322700013C010800AC2500BC3C01080033
+:100C5000AC2400B810E00021322200028F420100D3
+:100C6000AF4200208F420104AF4200A89342010B23
+:100C70000E0001E4305000FF2E02001C544000041E
+:100C8000001010800E0001E70A0002F800000000CA
+:100C90003C03080024634E18004310218C420000DE
+:100CA0000040F80900000000104000053C02400030
+:100CB0008F4301043C026020AC4300143C0240001E
+:100CC000AF4201383C0208008C420034244200014B
+:100CD0003C010800AC220034322200021040000E19
+:100CE000322200048F4201400E0001E4AF42002096
+:100CF0000E000380000000003C024000AF4201787B
+:100D00003C0208008C420038244200013C010800EB
+:100D1000AC220038322200041040FF9B3C028000CD
+:100D20008F4201800E0001E4AF4200208F4301801A
+:100D300024020F0014620005000000008F420188A9
+:100D4000A742009C0A00032D3C0240009362000071
+:100D500024030050304200FF144300083C024000CE
+:100D60000E00036400000000544000043C024000F8
+:100D70000E000E42000000003C024000AF4201B8ED
+:100D80003C0208008C42003C244200013C01080067
+:100D9000AC22003C0A0002B03C0280003C02900001
+:100DA0003442000100822025AF4400208F42002001
+:100DB0000440FFFE0000000003E000080000000007
+:100DC0003C028000344200010082202503E000083C
+:100DD000AF44002027BDFFE0AFB10014AFB000105A
+:100DE00000808821AFBF00180E00033530B000FF2F
+:100DF0009362007D0220202102028025A370007DE5
+:100E00008F7000743C0280000E00033E02028024BA
+:100E1000160000098FBF00188F4201F80440FFFE42
+:100E200024020002AF5101C0A34201C43C021000E1
+:100E3000AF4201F88FBF00188FB100148FB00010BF
+:100E400003E0000827BD002027BDFFD000001021CF
+:100E500003E0000827BD003027BDFFE8AFBF00104A
+:100E6000974201843042020010400005000020211A
+:100E70000E001079000000000A000378240400012D
+:100E80008F420188044000098FBF00108F42018803
+:100E90003C03FF00004310243C0304001443000300
+:100EA000240400019362003E8FBF001000801021D7
+:100EB00003E0000827BD0018A36000228F44014012
+:100EC0000A0003432405000127BDFFE8AFBF00145B
+:100ED000AFB000109362000024030020304200FFF6
+:100EE0001043000B00000000936200002403003058
+:100EF000304200FF10430006000000009362000033
+:100F000024030050304200FF144300628FBF0014DE
+:100F100093420148304200FF2443FFFF2C6200054A
+:100F20001040005C8FBF0014000310803C030800D9
+:100F300024634DA4004310218C42000000400008AF
+:100F4000000000000E0003358F4401408F70000C3C
+:100F50008F4201441602000224020001AF62000C1D
+:100F60000E00033E8F4401408F42014414500004A0
+:100F70008FBF00148FB000100A000FED27BD0018BE
+:100F80008F62000C0A0003EC000000009762001062
+:100F90008F4301443042FFFF14620009000000004B
+:100FA00024020001A76200108F420140AF420200FC
+:100FB0003C021000AF4202380A0003F38FBF001456
+:100FC000976200100A0003EC000000000E000335D9
+:100FD0008F440140976200128F4301443050FFFF5D
+:100FE0001603000224020001A76200120E00033E55
+:100FF0008F4401408F420144160200048FBF001449
+:101000008FB000100A00037C27BD00189762001201
+:101010000A0003EC00000000976200148F430144B3
+:101020003042FFFF146200068FBF0014240200014B
+:101030008FB00010A76200140A00131927BD001812
+:10104000976200140A0003EC00000000976200168B
+:101050008F4301443042FFFF146200062402000166
+:101060008FBF00148FB00010A76200160A000BE0BB
+:1010700027BD001897620016144000068FBF0014A9
+:101080003C0208008C420070244200013C01080030
+:10109000AC2200708FB0001003E0000827BD0018DC
+:1010A00027BDFFE8AFBF0014AFB0001093430109A4
+:1010B0002402001F8F500100106200A5286200204A
+:1010C00010400018240200382862000A1040000C6A
+:1010D0002402000B286200081040002C00000000D1
+:1010E000046000E728620002144000282402000681
+:1010F000106200268FBF00140A0004F08FB00010A9
+:101100001062005E2862000B144000DE8FBF0014E6
+:101110002402000E106200738FB000100A0004F069
+:1011200000000000106200C2286200391040000A6E
+:101130002402008024020036106200CC28620037AE
+:10114000104000B624020035106200C38FBF0014A7
+:101150000A0004F08FB000101062002B286200819A
+:1011600010400006240200C824020039106200B6B4
+:101170008FBF00140A0004F08FB0001010620099B5
+:101180008FBF00140A0004F08FB000103C0208006A
+:101190008C420020104000BB8FBF00140E0005647D
+:1011A000000000008F4201008F8300209745010C52
+:1011B00097460108AC6200008F4201043C0408001D
+:1011C00094844E9600052C00AC6200048F420118F6
+:1011D0000006340000C43025AC6200088F42011CB8
+:1011E00024040001AC62000C9342010A00A22825ED
+:1011F000AC650010AC600014AC600018AC66001C5C
+:101200000A0004C48FBF00143C0208008C42002076
+:101210001040009C8FBF00140E0005640000000009
+:10122000974401083C03080094634E969745010CCF
+:10123000000422029746010E8F820020000426003F
+:101240000083202500052C003C03008000A62825F3
+:1012500000832025AC400000AC400004AC400008F6
+:10126000AC40000CAC450010AC400014AC40001881
+:10127000AC44001C0A0004C3240400019742010C82
+:101280001440001500000000936200053042001079
+:1012900014400011000000000E0003350200202160
+:1012A0009362000502002021344200100E00033E2C
+:1012B000A36200059362000024030020304200FF77
+:1012C0001043006F020020218FBF00148FB0001068
+:1012D0000A00108F27BD00180000000D0A0004EF5F
+:1012E0008FBF00143C0208008C42002010400065B3
+:1012F0008FBF00140E000564000000008F4201043F
+:101300008F8300209744010C3C05080094A54E965D
+:10131000AC6200009762002C000424003042FFFF02
+:10132000008220253C02400E00A22825AC64000467
+:10133000AC600008AC60000CAC600010AC60001445
+:10134000AC600018AC65001C0A0004C32404000152
+:101350000E00033502002021A76000080E00033EA6
+:1013600002002021020020210E0003432405000179
+:101370003C0208008C420020104000428FBF001445
+:101380000E000564000000009742010C8F830020CE
+:101390003C05080094A54E9600021400AC700000B5
+:1013A000AC620004AC6000088F64004C3C02401F3B
+:1013B00000A22825AC64000C8F62005024040001B8
+:1013C000AC6200108F620054AC620014AC60001874
+:1013D000AC65001C8FBF00148FB000100A00058997
+:1013E00027BD00189362000024030020304200FF54
+:1013F000104300248FBF00140E000FD702002021DD
+:10140000104000208FBF0014020020218FB0001078
+:10141000000028210A00034327BD001802002021F4
+:101420008FBF00148FB000100A00065127BD0018AE
+:101430009745010C020020218FBF00148FB00010CF
+:101440000A00067127BD0018020020218FB000108D
+:101450000A00069627BD00189345010D02002021C1
+:101460008FB000100A0006E027BD001802002021FE
+:101470008FBF00148FB000100A0006BC27BD0018F3
+:101480008FBF00148FB0001003E0000827BD0018C4
+:101490008F4202780440FFFE34820080AF42024057
+:1014A00024020002A34202443C02100003E00008B0
+:1014B000AF4202783C04080094844EA23C0208002B
+:1014C0008C424EAC3083FFFF000318C00043102154
+:1014D000AF42003C3C0208008C424EA8AF420038AC
+:1014E0003C02005034420008AF42003000000000CF
+:1014F00000000000000000008F4200003042002089
+:101500001040FFFD000000008F4204003C01080075
+:10151000AC224E988F4204043C010800AC224E9C41
+:101520003C020020AF420030000000003C020800F6
+:1015300094424EA03C03080094634EA43C0508006E
+:1015400094A54EA624840001004310213083FFFFA0
+:101550003C010800A4224EA03C010800A4244EA295
+:1015600014650003000000003C010800A4204EA206
+:1015700003E00008000000003C05000A27BDFFE86A
+:10158000034528213C04080024844E88AFBF001086
+:101590000E0005EE2406000A3C02080094424E8A22
+:1015A0003C03080094634EA63042000F244200031F
+:1015B0000043180424027FFF0043102B1040000258
+:1015C000AF83001C0000000D0E0004FB00000000B3
+:1015D0003C02080094424E928FBF001027BD0018B5
+:1015E00003E00008A74200A23C02000A03421021C7
+:1015F000944300063C02080094424E923C010800CD
+:10160000A4234E8E004310238F83001C000214007D
+:10161000000214030043102B03E0000838420001CD
+:1016200027BDFFE8AFBF00103C02000A03421021B3
+:10163000944200063C010800A4224E8E0E0005488C
+:10164000000000005440FFF93C02000A8FBF001068
+:1016500003E0000827BD001827BDFFE8AFBF00105A
+:101660000E000548000000001040000300000000CC
+:101670000E000556000000003C0208008C424E9807
+:101680008FBF001027430400AF4200383C0208001F
+:101690008C424E9C27BD0018AF830020AF42003C17
+:1016A0003C020005AF42003003E00008AF800018A4
+:1016B0008F8200183C0300060002114000431025F1
+:1016C000AF420030000000000000000000000000F9
+:1016D0008F420000304200101040FFFD27420400FE
+:1016E000AF82002003E00008AF8000183C0608002D
+:1016F0008CC64E9C8F8500188F8300203C0208000A
+:1017000094424E9227BDFFE024A5000124630020EF
+:101710002442000124C70020AFB10014AFB0001074
+:10172000AFBF0018AF850018AF8300203C01080050
+:10173000A4224E92309000FF3C010800AC274E9C42
+:1017400004C100080000882104E000060000000039
+:101750003C0208008C424E98244200013C010800E3
+:10176000AC224E983C02080094424E923C03080082
+:1017700094634EA00010202B004310262C42000141
+:1017800000441025144000048F8300182402001028
+:101790001462000F000000000E00057A2411000101
+:1017A0003C03080094634E923C02080094424EA011
+:1017B00014620003000000000E0004FB00000000A3
+:1017C00016000003000000000E0005640000000089
+:1017D0003C03080094634E963C02080094424E94E9
+:1017E000246300013064FFFF3C010800A4234E96EF
+:1017F00014820003000000003C010800A4204E9663
+:1018000012000006000000003C02080094424E92C4
+:10181000A74200A20A0005DC022010210E000548A4
+:101820000000000010400004022010210E000556A8
+:1018300000000000022010218FBF00188FB100149B
+:101840008FB0001003E0000827BD00203084FFFFA8
+:1018500030A5FFFF000018211080000700000000E5
+:10186000308200011040000200042042006518216F
+:101870000A0005E40005284003E00008006010218C
+:1018800010C0000624C6FFFF8CA2000024A500049F
+:10189000AC8200000A0005EE2484000403E0000886
+:1018A0000000000010A0000824A3FFFFAC86000089
+:1018B00000000000000000002402FFFF2463FFFF7F
+:1018C0001462FFFA2484000403E000080000000012
+:1018D00024020001AF62000CA7620010A762001290
+:1018E000A762001403E00008A76200163082007FA0
+:1018F000034210213C08000E004818213C02080059
+:101900008C42002027BDFFD82407FF80AFB3001C06
+:10191000AFB20018AFB10014AFB00010AFBF0020DD
+:101920000080802130B100FF0087202430D200FFEA
+:101930001040002F00009821AF44002C906200005E
+:1019400024030050304200FF1443000E000000004A
+:101950003C0208008C4200E00202102100471024E3
+:10196000AF42002C3C0208008C4200E00202102131
+:101970003042007F0342102100481021944200D4DD
+:101980003053FFFF0E000564000000003C02080019
+:1019900094424E968F8300200011340000C23025FF
+:1019A00000122C003C02400000C2302534A500018A
+:1019B000AC7000008FBF0020AC6000048FB2001834
+:1019C000AC7300088FB10014AC60000C8FB3001C26
+:1019D000AC6500108FB00010AC600014240400014E
+:1019E000AC60001827BD00280A000589AC66001C01
+:1019F0008FBF00208FB3001C8FB200188FB100146E
+:101A00008FB0001003E0000827BD00289343010FAA
+:101A1000240200101062000E2865001110A00007BB
+:101A200024020012240200082405003A1062000675
+:101A30000000302103E0000800000000240500350C
+:101A40001462FFFC000030210A00060900000000BB
+:101A50008F42007424420FA003E00008AF62000C24
+:101A600027BDFFE8AFBF00100E00034324050001AF
+:101A70008FBF001024020001A762001227BD0018CA
+:101A80002402000103E00008A360002227BDFFE05C
+:101A9000AFB10014AFB00010AFBF001830B1FFFFFE
+:101AA0000E000335008080219362003F2403000470
+:101AB000304200FF1443000C0200202112200008D5
+:101AC0002402000A0E0006020000000093620005D6
+:101AD0002403FFFE00431024A36200052402001229
+:101AE000A362003F020020210E00033EA36000819C
+:101AF00016200003020020210E00066600000000F0
+:101B000002002021322600FF8FBF00188FB1001481
+:101B10008FB00010240500380A00060927BD0020F8
+:101B200027BDFFE0AFBF001CAFB20018AFB100147B
+:101B3000AFB000100E000335008080210E000602B9
+:101B4000000000009362003F24120018305100FF93
+:101B5000123200030200202124020012A362003F7F
+:101B6000936200052403FFFE004310240E00033E91
+:101B7000A362000502002021240500201632000780
+:101B8000000030218FBF001C8FB200188FB10014ED
+:101B90008FB000100A00034327BD00208FBF001C38
+:101BA0008FB200188FB100148FB0001024050039D7
+:101BB0000A00060927BD002027BDFFE8AFB00010CE
+:101BC000AFBF00149742010C24050036008080212D
+:101BD00014400010304600FF0E00033500000000E6
+:101BE00024020012A362003F9362000534420010F9
+:101BF0000E000602A36200050E00033E0200202133
+:101C0000020020210E000343240500200A0006D50F
+:101C1000000000000E000609000000000E00033561
+:101C200002002021936200232403FF9F0200202151
+:101C3000004310248FBF00148FB00010A362002354
+:101C40000A00033E27BD001827BDFFE0AFBF001804
+:101C5000AFB10014AFB0001030B100FF0E0003357B
+:101C600000808021240200120E000602A362003FC1
+:101C70000E00033E0200202102002021022030211C
+:101C80008FBF00188FB100148FB0001024050035ED
+:101C90000A00060927BD0020A380002C03E00008ED
+:101CA000A380002D8F4202780440FFFE8F82003413
+:101CB000AF42024024020002A34202443C02100050
+:101CC00003E00008AF4202783C0360008C625400DD
+:101CD000304200081440FFFD000000008C625408F0
+:101CE000AF82000024020052AC605408AC6454304F
+:101CF000AC6254342402000803E00008AC625400D3
+:101D00003C0260008C425400304200081040000544
+:101D10003C0360008C625400304200081440FFFD18
+:101D2000000000008F8300003C02600003E0000818
+:101D3000AC43540890A30000240200050080402119
+:101D40003063003F0000482114620005000050216C
+:101D500090A2001C94A3001E304900FF306AFFFFD0
+:101D6000AD00000CAD000010AD0000249502001481
+:101D70008D05001C8D0400183042FFFF0049102320
+:101D800000021100000237C30040382100862023E2
+:101D900000A2102B0082202300A72823AD05001CE1
+:101DA000AD040018A5090014A5090020A50A001615
+:101DB00003E00008A50A00228F4201F80440FFFE5C
+:101DC00024020002AF4401C0A34201C43C0210003F
+:101DD00003E00008AF4201F83C0208008C4200B466
+:101DE00027BDFFE8AFBF001424420001AFB00010D0
+:101DF0003C010800AC2200B48F4300243C02001FC9
+:101E000030AA00FF3442FF8030D800FF00628024F7
+:101E10000080F82130EF00FF1158003B01405821AD
+:101E2000240CFF803C19000A3163007F000310C0BE
+:101E300000031940006218213C0208008C4200DCBB
+:101E400025680001310D007F03E2102100431021BD
+:101E50003043007F03431821004C102400794821AF
+:101E6000AF4200248D220024016C1824006C7026DF
+:101E7000AD22000C8D220024310800FFAD2200109D
+:101E800095220014952300208D27001C3042FFFF6F
+:101E90003063FFFF8D26001800431023000211005D
+:101EA000000227C30040282100C4302300E2102B89
+:101EB00000C2302300E53823AD27001CAD260018F2
+:101EC00095220020A522001495220022154B000A1D
+:101ED000A52200168D2300248D220008254600012E
+:101EE000314500801462000430C4007F108F00026E
+:101EF00038AA008000C0502151AF000131C800FF56
+:101F00001518FFC9010058218F8400343082007FEA
+:101F1000034218213C02000A006218212402FF80BB
+:101F200000822024AF440024A06A0079A06A0083C4
+:101F30008C6200508F840034AC6200708C65007439
+:101F40003C027FFF3442FFFF00A228240E00073C22
+:101F5000AC650074AF5000248FBF00148FB0001028
+:101F600003E0000827BD001827BDFFC0AFBE003842
+:101F7000AFB70034AFB5002CAFB20020AFB1001C3A
+:101F8000AFB00018AFBF003CAFB60030AFB4002810
+:101F9000AFB300248F4500248F4600288F43002CC8
+:101FA0003C02001F3442FF800062182400C230242B
+:101FB0000080A821AFA3001400A2F0240E000700A7
+:101FC000AFA600103C0208008C4200E02410FF8005
+:101FD0000360882102A2102100501024AF42002487
+:101FE0003C0208008C4200E002A210213042007F37
+:101FF000034218213C02000A00629021924200D262
+:1020000093630084305700FF306300FF2402000117
+:1020100010620034036020212402000214620036A2
+:10202000000000000E0012E50240282192230083E8
+:10203000922200833063007F3042007F000210C094
+:1020400000031940006218213C0208008C4200DCA9
+:1020500002A210210043382100F01024AF420028D2
+:10206000922500789224008330E2007F03421821F9
+:102070003C02000C14850007006280212402FFFF4F
+:10208000A24200F12402FFFFA64200F20A0007F874
+:102090002402FFFF96020020A24200F196020022D5
+:1020A000A64200F28E020024AE4200F49222008387
+:1020B000A24200F08E4200C8AE4200FC8E4200C434
+:1020C000AE4200F88E220050AE4201008E4200CC9B
+:1020D000AE420104922200853042003F0A000853BC
+:1020E000344200400E00130802402821922200854D
+:1020F0000A0008533042003F936200852403FFDF4B
+:102100003042003FA36200859362008500431024A3
+:10211000A36200859363008393620078307400FFAC
+:10212000304200FF10540036240AFF803C0C000CA3
+:102130003283007F000310C00003194000621821A1
+:102140003C0208008C4200DC268800013109007F37
+:1021500002A210210043382130E2007F03421821FF
+:1021600000EA1024AF420028006C80218E02002477
+:10217000028A1824006A5826AE02000C8E0200243F
+:10218000310800FFAE0200109602001496030020F2
+:102190008E07001C3042FFFF3063FFFF8E060018E1
+:1021A0000043102300021100000227C30040282131
+:1021B00000C4302300E2102B00C2302300E5382396
+:1021C000AE07001CAE06001896020020A6020014FE
+:1021D00096020022A602001692220079304200FFE9
+:1021E000105400070000000051370001316800FF63
+:1021F00092220078304200FF1448FFCD0100A02158
+:1022000092220083A22200798E2200500A0008B395
+:10221000AE220070A22200858E22004C2405FF8091
+:10222000AE42010C9222008534420020A222008599
+:10223000924200D13C0308008C6300DC305400FF64
+:102240003C0208008C4200E400143140001420C01D
+:1022500002A3182100C4202102A210210064382109
+:10226000004610210045182400E52824AF45002829
+:10227000AF43002C3042007F924400D030E3007F17
+:1022800003422821034318213C02000C00628021F4
+:102290003C02000E309600FF00A298211296002A00
+:1022A000000000008E02000C0200202102602821A4
+:1022B00010400025261000280E00071B000000001B
+:1022C0009262000D26830001307400FF3042007FCF
+:1022D000A262000D2404FF801697FFF026730020F1
+:1022E0003C0208008C4200DC0000A02102A2102168
+:1022F00000441024AF4200283C0208008C4200E455
+:102300003C0308008C6300DC02A21021004410246E
+:10231000AF42002C3C0208008C4200E402A31821CA
+:102320003063007F02A210213042007F034220214F
+:10233000034318213C02000C006280213C02000E85
+:102340000A000875008298218E4200D8AE22005003
+:102350008E4200D8AE22007092250083924600D1B2
+:1023600092230083924400D12402FF8000A22824FB
+:102370003063007F308400FF00A628250064182AFF
+:102380001060000230A500FF38A50080A225008360
+:10239000A22500790E00070E000000009222007EA8
+:1023A00002A02021A222007A8E2300743C027FFF2B
+:1023B0003442FFFF006218240E00073CAE23007475
+:1023C0008FA20010AF5E00248FBF003CAF420028F8
+:1023D0008FBE00388FA200148FB700348FB6003044
+:1023E0008FB5002C8FB400288FB300248FB200204B
+:1023F0008FB1001C8FB0001827BD004003E000081B
+:10240000AF42002C90A2000024420001A0A20000D4
+:102410003C0308008C6300F4304200FF1443000FBB
+:1024200000803021A0A000003C0208008C4200E4A3
+:102430008F840034008220213082007F03421821E3
+:102440003C02000C006218212402FF80008220243C
+:10245000ACC3000003E00008AF4400288C820000F9
+:102460002442002003E00008AC82000094C2000077
+:102470003C080800950800CA30E7FFFF00804821AB
+:1024800001021021A4C2000094C200003042FFFFEC
+:1024900000E2102B54400001A4C7000094A20000E9
+:1024A0003C0308008C6300CC24420001A4A200007D
+:1024B00094A200003042FFFF544300078F8600289B
+:1024C0000107102BA4A00000544000010100382196
+:1024D000A4C700008F8600288CC4001CAF44003CB9
+:1024E00094A200008F43003C3042FFFF000210C066
+:1024F00000621821AF43003C8F42003C0082202341
+:1025000018800004000000008CC200180A000914A2
+:10251000244200018CC20018AF4200383C02005037
+:1025200034420010AF420030000000000000000004
+:10253000000000008F420000304200201040FFFDEC
+:10254000000000008F420404AD2200048F4204000A
+:10255000AD2200003C020020AF42003003E0000842
+:102560000000000027BDFFE0AFB20018AFB10014BB
+:10257000AFB00010AFBF001C94C2000000C08021AB
+:102580003C120800965200C624420001A602000038
+:102590009603000094E2000000E03021144300059F
+:1025A0008FB100300E0008E9024038210A000946C8
+:1025B000000000008C8300048C8200042442004050
+:1025C00004610007AC8200048C8200040440000413
+:1025D000000000008C82000024420001AC82000058
+:1025E000960200003042FFFF50520001A60000009A
+:1025F0009622000024420001A62200008F820028BB
+:102600009623000094420016144300048FBF001C60
+:1026100024020001A62200008FBF001C8FB2001808
+:102620008FB100148FB0001003E0000827BD002018
+:102630008F89002827BDFFE0AFBF00188D2200283A
+:102640002748040030E700FFAF4200388D22002CFD
+:10265000AF880030AF42003C3C020005AF42003082
+:10266000000000000000000000000000000000006A
+:1026700000000000000000008C82000C8C82000C26
+:10268000AD0200008C820010AD0200048C820018A4
+:10269000AD0200088C82001CAD02000C8CA200145C
+:1026A000AD0200108C820020AD0200149082000563
+:1026B000304200FF00021200AD0200188CA2001888
+:1026C000AD02001C8CA2000CAD0200208CA20010F8
+:1026D000AD0200248CA2001CAD0200288CA20020B8
+:1026E000AD02002CAD060030AD000034978300260B
+:1026F0003402FFFF14620002006020213404FFFF57
+:1027000010E00011AD040038952300369524003602
+:10271000240200013063FFFF000318C20069182182
+:1027200090650040308400070082100400451025A9
+:10273000A06200408F820028944200563042FFFF82
+:102740000A0009ADAD02003C952300369524003601
+:10275000240200013063FFFF000318C20069182142
+:1027600090650040308400070082100400021027AA
+:1027700000451024A0620040AD00003C00000000B5
+:1027800000000000000000003C020006344200404F
+:10279000AF42003000000000000000000000000018
+:1027A0008F420000304200101040FFFD8F8600284D
+:1027B000AF88003024C2005624C7003C24C400283F
+:1027C00024C5003224C600360E000927AFA200102F
+:1027D0008FBF001803E0000827BD00208F8300246E
+:1027E0003C0508008CA500E88F82003430633FFF71
+:1027F0000003198000451021004310212403FF80AD
+:102800003045007F00431024AF42002803451821C3
+:102810003C02000C0062302190C2000D0000382103
+:1028200034420010A0C2000D8F8900288F8A002436
+:1028300095230036000A1382304800032402000169
+:10284000A4C3000E1102000B290200021040000573
+:10285000240200021100000C240300010A0009F008
+:102860000000182111020006000000000A0009F013
+:10287000000018218CC2002C0A0009F0244300013A
+:102880008CC20014244300018CC200180043102B9A
+:1028900014400003000000000A0009F924070001A9
+:1028A0009522003E24420001A522003E000A138228
+:1028B000304300032C6200021040000900802821F0
+:1028C000146000040000000094C200360A000A09E7
+:1028D0003046FFFF8CC600380A000A090080282114
+:1028E000000030213C04080024844EB00A00095A3C
+:1028F00000000000274901008D22000C95230006EE
+:1029000001202021000216023045003F3063FFFF06
+:102910002402002728A6002810A2000EAF8300245E
+:1029200010C00008240200312402002110A2000976
+:102930002402002510A200079382002D0A000A2716
+:102940000000000010A200059382002D0A000A2753
+:10295000000000000A0009C5000000000A0006F798
+:102960000000000095230006912400058D25000C31
+:102970008D2600108D2700188D28001C8D29002021
+:10298000244200013C010800A4234EB63C0108008B
+:10299000A0244EB53C010800AC254EBC3C0108000B
+:1029A000AC264EC03C010800AC274EC83C010800D4
+:1029B000AC284ECC3C010800AC294ED003E0000806
+:1029C000A382002D8F87002827BDFFC0AFB300343E
+:1029D000AFB20030AFB1002CAFB00028AFBF0038AD
+:1029E0003C0208008C4200D094E3003030B0FFFF7E
+:1029F000005010073045FFFF3063FFFF00C09821F3
+:102A0000A7A200103C110800963100C614A30006CE
+:102A10003092FFFF8CE2002424420030AF42003CA1
+:102A20000A000A608CE2002094E200323042FFFF8C
+:102A300054A2000827A400188CE2002C2442003085
+:102A4000AF42003C8CE20028AF4200380A000A6E18
+:102A50008F84002827A5001027A6002002203821F7
+:102A60000E0008E9A7A000208FA200182442003021
+:102A7000AF4200388FA2001CAF42003C8F84002878
+:102A80003C020005AF42003094820034274304002A
+:102A90003042FFFF0202102B14400007AF830030CA
+:102AA00094820054948300340202102100431023C6
+:102AB0000A000A823043FFFF94830054948200345A
+:102AC0000223182100501023006218233063FFFFF7
+:102AD000948200163042FFFF144300030000000000
+:102AE0000A000A9024030001948200163042FFFF7E
+:102AF0000043102B104000058F8200309482001696
+:102B0000006210233043FFFF8F820030AC5300007F
+:102B1000AC400004AC520008AC43000C3C02000680
+:102B200034420010AF4200300000000000000000FE
+:102B3000000000008F420000304200101040FFFDF6
+:102B4000001018C20064182190650040320400078C
+:102B5000240200018FBF00388FB300348FB20030E1
+:102B60008FB1002C8FB00028008210040045102582
+:102B700027BD004003E00008A062004027BDFFA879
+:102B8000AFB60050AFB5004CAFB40048AFB300448F
+:102B9000AFB1003CAFBF0054AFB20040AFB000389F
+:102BA0008C9000003C0208008C4200E88F860034C4
+:102BB000960300022413FF8000C2302130633FFFE0
+:102BC0000003198000C3382100F3102490B20000E4
+:102BD000AF42002C9203000230E2007F034230211A
+:102BE0003C02000E00C28821306300C02402004075
+:102BF0000080A82100A0B021146200260000A021BE
+:102C00008E3400388E220018144000022402000185
+:102C1000AE2200189202000D304200201440001530
+:102C20008F8200343C0308008C6300DC001238C043
+:102C3000001231400043102100C7302100463821E6
+:102C400030E300073C02008030E6007800C2302507
+:102C50000343182100F31024AF4208002463090045
+:102C6000AF4608108E2200188C6300080043102124
+:102C7000AE2200188E22002C8E2300182442000160
+:102C80000062182B1060003D000000000A000B4499
+:102C900000000000920300022402FFC00043102441
+:102CA000304200FF1440000524020001AE2200184B
+:102CB000962200360A000B2D3054FFFF8E2200149E
+:102CC00024420001AE220018920200000002160009
+:102CD00000021603044100290000000096020002D1
+:102CE00027A4001000802821A7A200169602000247
+:102CF00024070001000030213042FFFFAF82002492
+:102D00000E00095AAFA0001C960300023C04080004
+:102D10008C8400E88F82003430633FFF0003198009
+:102D200000441021004310213043007F3C05000C7B
+:102D30000053102403431821AF42002800651821D6
+:102D40009062000D001221403042007FA062000D11
+:102D50003C0308008C6300E48F82003400431021A0
+:102D60000044382130E2007F034210210045102149
+:102D700000F31824AF430028AEA200009222000DF9
+:102D8000304200101040001302A020218F83002841
+:102D90008EA40000028030219462003E2442FFFF96
+:102DA000A462003E948400029625000E3084FFFF4A
+:102DB0000E000A3F30A5FFFF8F82002894430034A5
+:102DC0009622000E1443000302A0202124020001D9
+:102DD000A382002C02C028210E0008CF00000000B2
+:102DE0008FBF00548FB600508FB5004C8FB4004891
+:102DF0008FB300448FB200408FB1003C8FB00038D9
+:102E000003E0000827BD00588F85002827BDFFD0AC
+:102E1000AFB40028AFB20020AFBF002CAFB3002486
+:102E2000AFB1001CAFB0001890A800D090A600D1A0
+:102E30003C0208008C4200E48F83003430C700FF5E
+:102E4000A3A600100062182100071140006218219B
+:102E50003062007F034220213C02000C00822021CE
+:102E60002402FF8000621824311200FF8CB100D8C8
+:102E7000AFA400148CB300DC0000A021AF430028F5
+:102E800010F2001F240200018FA6001427A40014D2
+:102E900027A500108CC2000402228021027010239A
+:102EA000044000172402000190C3000D2402FF809B
+:102EB00000431024304200FF144000070200882124
+:102EC00090C2000D344200400E0008CFA0C2000D99
+:102ED0000A000B8B93A200100E000AAD241400010F
+:102EE0008F830028AC7000D893A20010A06200D19C
+:102EF00093A200101452FFE58FA6001424020001D3
+:102F0000168200048FBF002C0E0006F700000000A0
+:102F10008FBF002C8FB400288FB300248FB2002005
+:102F20008FB1001C8FB0001803E0000827BD0030EF
+:102F300027BDFFD8AFB3001CAFB20018AFB100146B
+:102F4000AFB00010AFBF00200080982100E08021CA
+:102F500030B1FFFF0E00056430D200FF000000001A
+:102F600000000000000000008F820020AC51000033
+:102F7000AC520004AC530008AC40000CAC40001054
+:102F8000AC400014AC4000183C03080094634E961B
+:102F900002038025AC50001C00000000000000006F
+:102FA00000000000240400018FBF00208FB3001C2C
+:102FB0008FB200188FB100148FB000100A0005897D
+:102FC00027BD002827BDFFE8AFB00010AFBF001439
+:102FD00030A5FFFF30C600FF0080802124020C8056
+:102FE000AF420024000000000000000000000000CC
+:102FF00000000000000000000E000B9A000000001E
+:103000003C040800248400E08C8200002403FF803C
+:103010008FBF00140202102100431024AF4200248D
+:103020008C8200003C03000A020280213210007FE3
+:10303000035010218FB000100043102127BD00184D
+:1030400003E00008AF82002827BDFFE8AFBF0010F3
+:103050008F4401403C0308008C6300E02402FF80A1
+:10306000AF8400340083182100621024AF42002492
+:103070003C02000803424021950500023063007FB6
+:103080003C02000A034318210062182130A5FFFF0B
+:103090003402FFFF000030213C07602010A2000630
+:1030A000AF8300282402FFFFA5020002946500D42C
+:1030B0000E000BBF30A5FFFF8FBF001024020C8055
+:1030C00027BD001803E00008AF4200243C020008BE
+:1030D00003424021950200023C0A0800954A00C6BE
+:1030E0003046FFFF14C000073402FFFF8F82002824
+:1030F0008F8400343C076020944500D40A000C28DB
+:1031000030A5FFFF10C200248F87002894E20054EE
+:1031100094E400163045FFFF00A6102300A6182BEC
+:103120003089FFFF106000043044FFFF00C510230A
+:10313000012210233044FFFF008A102B1040000CA6
+:10314000012A102324020001A50200162402FFFF19
+:10315000A502000294E500D48F84003400003021E1
+:1031600030A5FFFF3C0760200A000BBF00000000F5
+:103170000044102A104000080000000095020016CC
+:103180003042000110400004000000009742007E21
+:1031900024420014A502001603E00008000000000D
+:1031A0008F84002827BDFFE0AFBF00189482003451
+:1031B0009483003E1060001A3048FFFF9383002C78
+:1031C00024020001146200278FBF00188F8200289C
+:1031D000000818C231080007006218212447003A8D
+:1031E000244900542444002024450030244600345F
+:1031F00090620040304200FF01021007304200019F
+:10320000104000168FBF00180E000927AFA900104C
+:103210008F820028944200340A000C413048FFFF9E
+:1032200094830036948200341043000E8FBF001840
+:1032300094820036A482003494820056A482005402
+:103240008C82002CAC82002494820032A482003054
+:103250009482003CA482003A8FBF00180A000C013F
+:1032600027BD002003E0000827BD002027BDFFE8A0
+:10327000AFBF00108F4A01003C0508008CA500E09C
+:103280003C02080090424EBC3C0C0800958C4EB6A7
+:1032900001452821304B003F30A2007F03424021EE
+:1032A000396900323C02000A3963003F2C63000197
+:1032B000010240212D2900012402FF8000A22824C0
+:1032C00001234825AF8A003400801821AF4500242F
+:1032D000000030210080282124070001AF88002849
+:1032E0003C04080024844EB0AF8C00241520000656
+:1032F000A380002D240200201562000E3402FFFF7F
+:103300001582000C00000000240200201562000558
+:10331000000000008C6300142402FFFF106200070D
+:10332000000000000E00095A000000000A000C9D79
+:10333000000000000E0009C5006020210E000C36C0
+:10334000000000008FBF001024020C8027BD001871
+:1033500003E00008AF4200243C0208008C4200E079
+:1033600027BDFFA0AFB1003C008210212411FF80D7
+:10337000AFBE0058AFB70054AFB20040AFB0003896
+:10338000AFBF005CAFB60050AFB5004CAFB4004863
+:10339000AFB30044005110248F4800248F49002807
+:1033A0008F470028AF4200243C0208008C4200E016
+:1033B0000080902124060006008210213042007F08
+:1033C000034218213C02000A006280213C02001FD7
+:1033D0003442FF8000E2382427A40010260500F0C4
+:1033E0000122F0240102B8240E0005EEAFA7003040
+:1033F0008FA20018AE0200C48FA2001CAE0200C84B
+:103400008FA20024AE0200CC93A40010920300D13E
+:103410002402FF800082102400431025304900FF61
+:103420003083007F3122007F0062102A10400004A8
+:10343000000310C001311026304900FF000310C006
+:1034400000031940006218213C0208008C4200DC95
+:10345000920400D202421021004310210051102496
+:10346000AF42002893A300103063007F000310C018
+:1034700000031940006218213C0208008C4200DC65
+:1034800002421021004310213042007F03421821E4
+:103490003C02000C006240218FA300142402FFFFB5
+:1034A00010620030309500FF93A2001195030014C4
+:1034B000304400FF3063FFFF0064182B1060000DE4
+:1034C00000000000950400148D07001C8D060018F4
+:1034D0003084FFFF0044202300042100000010215D
+:1034E00000E4382100E4202B00C230210A000D172F
+:1034F00000C43021950400148D07001C8D060018AF
+:103500003084FFFF008220230004210000001021EE
+:103510000080182100C2302300E4202B00C4302397
+:1035200000E33823AD07001CAD06001893A200117C
+:10353000A502001497A20012A50200168FA2001483
+:10354000AD0200108FA20014AD02000C93A2001176
+:10355000A502002097A20012A50200228FA200144B
+:10356000AD0200242406FF80024610243256007F5C
+:10357000AF420024035618213C02000A0062802159
+:103580008E02004C8FA200203124007F000428C04E
+:10359000AE0200508FA200200004214000852821A7
+:1035A000AE02007093A2001001208821A2020083C5
+:1035B00093A20010A2020079920200853042003FDF
+:1035C000A20200853C0208008C4200DC024210216D
+:1035D0000045102100461024AF42002C3C02080098
+:1035E0008C4200E43C0308008C6300DC02421021A2
+:1035F0000044102100461024AF4200283C0208007D
+:103600008C4200E402431821006518210242102177
+:10361000004410213042007F3063007F93A50010EA
+:1036200003422021034318213C02000E0062402186
+:103630003C02000C10B1008C008248213233007F24
+:10364000166000192404FF803C0208008C4200DC54
+:103650000242102100441024AF42002C3C0208001A
+:103660008C4200E43C0308008C6300DC0242102121
+:1036700000441024AF4200283C0208008C4200E4C1
+:10368000024318213063007F024210213042007F44
+:1036900003422021034318213C02000E0062402116
+:1036A0003C02000C008248219124000D2414FF806C
+:1036B0000000102100942025A124000D9504000293
+:1036C000950500148D07001C3084FFFF30A5FFFF17
+:1036D0008D060018008520230004210000E4382115
+:1036E00000C2302100E4202B00C43021AD07001CB3
+:1036F000AD06001895020002A5020014A5000016F0
+:103700008D020008AD0200108D020008AD02000C11
+:1037100095020002A5020020A50000228D020008EB
+:10372000AD0200249122000D3042004010400042C2
+:10373000262200013C0208008C4200E0A3B30028CE
+:103740003C10000A0242102100541024AF42002411
+:103750003C0208008C4200E0A380002C27A4002C2F
+:10376000024210213042007F0342182100701821CC
+:103770008C6200D88D26000427A50028AFA9002C54
+:1037800000461021AC6200D80E000AADAF830028BD
+:1037900093A300288F8200280E0006F7A04300D1D3
+:1037A0000E000C360000000002541024AF4200242A
+:1037B0003C0208008C4200DC00132940001320C0AA
+:1037C00000A42021024210210044102100541024A2
+:1037D000AF42002C3C0208008C4200E43C0308008D
+:1037E0008C6300DC03563021024210210045102179
+:1037F00000541024AF4200283C0208008C4200E430
+:1038000002431821006418210242102100451021B2
+:103810003042007F3063007F0342202103431821A0
+:103820003C02000E006240213C02000C00D08021CE
+:1038300000824821262200013043007F14750005D4
+:10384000304400FF2403FF8002231024004310268D
+:10385000304400FF93A20010008088212508002832
+:103860001444FF762529002093A400108FA3001490
+:103870002402FFFF1062000A308900FF2482000149
+:10388000248300013042007F14550005306900FF99
+:103890002403FF800083102400431026304900FFDA
+:1038A00092020078305300FF11330032012088214A
+:1038B0003C0208008C4200DC3225007F000520C05D
+:1038C0000005294000A42021024210212406FF8087
+:1038D0000044102100461024AF42002C3C03080095
+:1038E0008C6300DC3C0208008C4200E40243182197
+:1038F00002421021004510210064182100461024C6
+:103900003063007FAF420028034318213C02000EC1
+:10391000006240213C0208008C4200E48D06000C4D
+:103920000100202102421021004510213042007F79
+:10393000034218213C02000C0062482110C0000D17
+:10394000012028210E00071B000000002402FF8038
+:103950000222182426240001006228263082007FDB
+:1039600014550002308300FF30A300FF1473FFD012
+:10397000006088218E0300743C027FFF3442FFFF09
+:1039800000621824AE0300740E00073C02402021A0
+:10399000AF5700248FA20030AF5E00288FBF005CBD
+:1039A0008FBE00588FB700548FB600508FB5004CB3
+:1039B0008FB400488FB300448FB200408FB1003CF9
+:1039C0008FB0003827BD006003E00008AF42002C34
+:1039D00027BDFFD8AFB1001CAFBF0020AFB00018AB
+:1039E00027510188922200032408FF803C03000A2B
+:1039F0003047007FA3A700108F4601803C020800DB
+:103A00008C4200E0AF86003400C2282100A81024B8
+:103A1000AF4200249224000030A2007F0342102114
+:103A200000431021AF8200283084007F240200026E
+:103A300014820025000719403C0208008C4200E473
+:103A400000C210210043282130A2007F0342182128
+:103A500000A81024AF4200283C02000C006218218C
+:103A60009062000DAFA3001400481025A062000D65
+:103A70008FA300149062000D304200405040006A55
+:103A80008FBF00208F860028A380002C27A400145D
+:103A90008CC200D88C63000427A5001000431021BD
+:103AA0000E000AADACC200D893A300108F8200288C
+:103AB0000E0006F7A04300D10E000C3600000000F7
+:103AC0000A000ED88FBF00200E00070000C0202182
+:103AD0000E00070E000000003C0200080342802197
+:103AE000922300019202007B1443004F8FBF0020FD
+:103AF000922200003044007F24020004108200174C
+:103B0000288200051040000624020005240200035C
+:103B1000108200078FB1001C0A000ED900000000BF
+:103B2000108200128FBF00200A000ED98FB1001C36
+:103B300092050083920600788E0700748F8400340B
+:103B400030A500FF00073E0230C600FF0E0007440C
+:103B500030E7007F0A000ED88FBF00200E000CA4B3
+:103B60008F8400340A000ED88FBF002024020C80FE
+:103B7000AF4200249202003E30420040104000203C
+:103B8000000000009202003E000216000002160330
+:103B900004410006000000008F8400340E0006710E
+:103BA000240500930A000ED88FBF00209202003F28
+:103BB00024030018304200FF1443000C8F840034AB
+:103BC000240500390E000609000030210E000335DF
+:103BD0008F84003424020012A202003F0E00033E34
+:103BE0008F8400340A000ED88FBF002024050036D1
+:103BF0000E000609000030210A000ED88FBF0020F9
+:103C00000E0003358F8400349202000534420020F8
+:103C1000A20200050E00033E8F8400340E00108FB8
+:103C20008F8400348FBF00208FB1001C8FB000182C
+:103C300024020C8027BD002803E00008AF420024C6
+:103C400027BDFFE8AFB00010AFBF0014274301004D
+:103C500094620008000214000002140304410002F0
+:103C6000000080212410000194620008304200808E
+:103C70001040001A02001021946200083042200017
+:103C800010400016020010218C6300183C021C2D0D
+:103C9000344219ED240600061062000F3C07602133
+:103CA0003C0208008C4200D4104000078F8200289C
+:103CB0008F830028906200623042000F344200403F
+:103CC000A06200628F8200288F840034944500D463
+:103CD0000E000BBF30A5FFFF020010218FBF0014A4
+:103CE0008FB0001003E0000827BD001827BDFFE0DB
+:103CF000AFB10014AFB00010A380002CAFBF00180C
+:103D00008F4501003C0308008C6300E02402FF8023
+:103D1000AF85003400A318213064007F03442021C4
+:103D2000006218243C02000A00822021AF430024D4
+:103D3000275001008E0200148C8300DCAF84002821
+:103D40000043102318400004000088218E02001454
+:103D50000E000B50AC8200DC9202000B2403000228
+:103D6000304200FF1443002F0000000096020008BC
+:103D7000304300FF24020082146200052402008404
+:103D80000E000A0B000000000A000F640000000093
+:103D900014620009240200818F8200288F8400347D
+:103DA0003C076021944500D49206000530A5FFFF32
+:103DB0000A000F5330C600FF146200270000000005
+:103DC0009202000A304300FF3062002010400004DD
+:103DD000306200408F8400340A000F4F24060040F8
+:103DE00010400004000316008F8400340A000F4FB7
+:103DF0002406004100021603044100178F8400349A
+:103E0000240600428F8200283C076019944500D4A4
+:103E100030A5FFFF0E000BBF000000000A000F647A
+:103E2000000000009202000B24030016304200FF45
+:103E300010430006000000009202000B240300174C
+:103E4000304200FF14430004000000000E000EDEAC
+:103E500000000000004088210E000C360000000029
+:103E60009202000A304200081040000624020C8032
+:103E70008F8500283C0400080E0012BD0344202159
+:103E800024020C80AF4200248FBF001802201021B2
+:103E90008FB000108FB1001403E0000827BD002090
+:103EA00027BDFFE8AFBF0014AFB000108F50002453
+:103EB0003C0308008C6300E08F4501002402FF8072
+:103EC00000A318213064007F0344202100621824DD
+:103ED0003C02000A00822021AF850034AF43002459
+:103EE00090820062AF8400283042000F34420050BC
+:103EF000A08200623C02001F3442FF800E0006F7E1
+:103F000002028024AF5000248FBF00148FB0001035
+:103F100003E0000827BD00183C0208008C42002086
+:103F20001040001D2745010090A300093C02000835
+:103F30000342202124020018546200033C020008BE
+:103F40000A000FA5240200080342202124020016C3
+:103F5000146200052402001724020012A082003F10
+:103F60000A000FAF94A700085462000694A7000847
+:103F7000936200052403FFFE00431024A3620005A2
+:103F800094A7000890A6001B8CA4000094A500062E
+:103F90000A000B9A00073C0003E000080000000044
+:103FA0002744010094820008304500FF38A30082B6
+:103FB00038A200842C6300012C4200010062182505
+:103FC00010600006240200839382002D1040000D33
+:103FD000000000000A000C690000000014A20005A7
+:103FE00024A2FF808F4301043C02602003E000080C
+:103FF000AC430014304200FF2C420002104000038A
+:10400000240200220A000F090000000014A200038D
+:10401000000000000A000F76000000000A000F9464
+:10402000000000009363007E9362007A144300094D
+:10403000000020219362000024030050304200FF62
+:1040400014430004240400019362007E2442000112
+:10405000A362007E03E00008008010218F4201F877
+:104060000440FFFE24020002AF4401C0A34201C489
+:104070003C02100003E00008AF4201F827BDFFE852
+:10408000AFBF00109362003F2403000A304200FFDC
+:1040900014430046000000008F6300548F62004C00
+:1040A0001062007F036030219362000024030050FF
+:1040B000304200FF1443002F000000008F440140F5
+:1040C0003C0208008C4200E02403FF8000821021A3
+:1040D00000431024AF4200243C0208008C4200E060
+:1040E0008F6500543C03000A008220213084007F49
+:1040F0000344102100431021AC4501089762003CA5
+:104100008F63004C3042FFFF000210400062182114
+:10411000AF63005C8F6300548F64004C9762003C77
+:10412000006418233042FFFF0003184300021040D0
+:104130000043102A10400006000000008F62005467
+:104140008F63004C004310230A0010250002104327
+:104150009762003C3042FFFF00021040ACC2006496
+:1041600024020001A0C0007CA0C2008424020C80B4
+:10417000AF4200240E000FD78F4401401040004989
+:104180008FBF00108F4301408F4201F80440FFFEB3
+:1041900024020002AF4301C0A34201C43C0210004C
+:1041A000AF4201F80A0010778FBF00109362003F02
+:1041B00024030010304200FF1443000400000000FC
+:1041C0008F4401400A001063000028219362003FE1
+:1041D00024030016304200FF14430004240200149C
+:1041E000A362003F0A001071000000008F62004CC3
+:1041F0008F630050004310230441002A8FBF00103A
+:104200009362008124420001A362008193620081D5
+:104210003C0308008C6300C0304200FF14430010D0
+:10422000000000009362003F24030004304200FFBE
+:1042300014430006000000008F4401408FBF0010AF
+:10424000240500930A00067127BD00188F44014021
+:10425000240500938FBF00100A0006E027BD001858
+:104260008F4401400E000335000000008F620054AF
+:104270002442FFFFAF6200548F6200502442FFFFD0
+:10428000AF6200500E00033E8F4401408F44014056
+:104290008FBF0010240500040A00034327BD001847
+:1042A0008FBF001003E0000827BD00188F4201886F
+:1042B0009363007E00021402304400FF306300FF6D
+:1042C0001464000D0000000093620080304200FF83
+:1042D0001044000900000000A36400809362000005
+:1042E00024030050304200FF14430004000000008B
+:1042F0000A0007A88F440180A364008003E000083F
+:104300000000000027BDFFE8AFB00010AFBF0014F1
+:1043100093620005240300303042003014430089CA
+:10432000008080213C0208008C4200201040008068
+:10433000020020210E000564000000008F8500208F
+:10434000ACB000009362003E9363003F304200FF38
+:1043500000021200306300FF00431025ACA20004ED
+:104360009362008200021600000216030441000559
+:10437000000000003C0308008C6300480A0010B5F0
+:10438000000000009362003E3042004014400003F1
+:104390000000182193620081304300FF9362008285
+:1043A00000031E00304200FF0002140000621825C6
+:1043B000ACA300088F620040ACA2000C8F620048E2
+:1043C000ACA200108F62004CACA200148F620050AF
+:1043D0008F63004C004310230441000300000000E1
+:1043E0000A0010C98F62004C8F620050ACA2001806
+:1043F0003C02080094424E963C03C00B0000202172
+:10440000004310250E000589ACA2001C8F620054E9
+:104410008F840020AC8200008F620058AC820004C0
+:104420008F62005CAC8200088F6200608F43007472
+:1044300000431021AC82000C8F620064AC8200103B
+:10444000976300689762006A00031C003042FFFF18
+:1044500000621825AC83001493620082240300805C
+:10446000304200FF14430003000000000A0010FD6A
+:10447000AC8000188F63000C240200011062000E53
+:104480002402FFFF9362003E304200401440000AC5
+:104490002402FFFF8F63000C8F4200740062182318
+:1044A0003C02080000621024144000020000282191
+:1044B0000060282100051043AC8200183C0208006F
+:1044C00094424E963C03C00C00002021004310256E
+:1044D0008F8300200E000589AC62001C8F620018DB
+:1044E0008F8300203C05080094A54E96240400010B
+:1044F000AC620000AC6000048F66006C3C02400DB2
+:1045000000A22825AC6600088F6200DCAC62000CBB
+:10451000AC6000109362000500021600AC6200144B
+:10452000AC6000180E000589AC65001C020020215B
+:104530008FBF00148FB00010A36000050A0004F2C2
+:1045400027BD00188FBF00148FB0001003E00008D3
+:1045500027BD00189742007C30C600FFA08600846B
+:104560003047FFFF2402000514C2000B24E346502D
+:1045700090A201122C4200071040000724E30A0019
+:1045800090A30112240200140062100400E2102122
+:104590000A0011353047FFFF3067FFFF03E00008D6
+:1045A000A4870014AC87004C8CA201080080402135
+:1045B00000A0482100E2102330C600FF184000038D
+:1045C00093AA001324E2FFFCACA2010830C2000150
+:1045D00010400008000000008D02005000E210238F
+:1045E00004410013240600058D02005410E200105F
+:1045F000000000008D02005414E2001A00000000C8
+:104600003C0208008C4200D8304200201040000AD2
+:1046100024020001910300789102008314430006F4
+:104620002402000101002021012028212406000489
+:104630000A00112300000000A100008411400009BD
+:10464000A50200148F4301008F4201F80440FFFED1
+:1046500024020002AF4301C0A34201C43C02100087
+:10466000AF4201F803E000080000000027BDFFE8AA
+:104670008FA90028AFBF00100080402100E9182357
+:104680001860007330C600FFA080007CA08000810D
+:104690008CA2010800E210230440004D000000003D
+:1046A0008C8200509483003C8C8400640047482333
+:1046B0003063FFFF012318210083202B10800004AA
+:1046C000000000008D0200640A00118600E2102143
+:1046D0009502003C3042FFFF0122102100E2102130
+:1046E000AD02005C9502003C8D03005C3042FFFF90
+:1046F0000002104000E210210043102B1040000384
+:10470000000000000A0011958D02005C9502003C3B
+:104710003042FFFF0002104000E21021AD02005CB9
+:10472000A1000084AD07004C8CA2010800E2102318
+:104730001840000224E2FFFCACA2010830C20001D4
+:104740001040000A000000008D02005000E210231B
+:1047500004410004010020218D02005414E20003F2
+:10476000000000000A0011B7240600058D02005465
+:1047700014E200478FBF00103C0208008C4200D8B2
+:10478000304200201040000A24020001910300780A
+:10479000910200831443000624020001010020213D
+:1047A000240600048FBF00100A00112327BD001843
+:1047B000A1000084A50200148F4301008F4201F87C
+:1047C0000440FFFE240200020A0011DC0000000089
+:1047D0008C82005C004910230043102B54400001E0
+:1047E000AC87005C9502003C3042FFFF0062102B5A
+:1047F00014400007240200029502003C8D03005C77
+:104800003042FFFF00621821AD03005C2402000269
+:10481000AD07004CA10200840E000FD78F440100A9
+:104820001040001B8FBF00108F4301008F4201F822
+:104830000440FFFE24020002AF4301C0A34201C4B2
+:104840003C021000AF4201F80A0011F28FBF0010C5
+:1048500030C200101040000E8FBF00108C83005C2F
+:104860009482003C006918233042FFFF0062182147
+:104870003C023FFF3444FFFF0083102B54400001F3
+:104880000080182101231021AD02005C8FBF0010B1
+:1048900003E0000827BD001827BDFFE88FAA002805
+:1048A000AFBF00100080402100EA482319200021FA
+:1048B00030C600FF8C83005C8C820064006A182381
+:1048C0000043102B504000100069182194A20110E1
+:1048D00001221021A4A2011094A201103042FFFF76
+:1048E0000043102B1440000A3C023FFF94A2011029
+:1048F00000431023A4A201109482003C3042FFFF29
+:104900000A00121100621821A4A001103C023FFF0E
+:104910003444FFFF0083102B544000010080182115
+:1049200000671021AD02005CA100007C0A00125952
+:10493000A100008130C200101040003C00000000C7
+:104940008C820050004A10231840003800000000FC
+:104950009082007C24420001A082007C9082007C36
+:104960003C0308008C630024304200FF0043102BFE
+:104970001440005C8FBF00108CA2010800E21023DD
+:1049800018400058000000008C8300549482003CC2
+:10499000006A18233042FFFF000318430002104052
+:1049A0000043102A10400005000000008C820054D3
+:1049B000004A10230A001240000210439482003C77
+:1049C0003042FFFF00021040AD0200649502003C3F
+:1049D0008D0400649503003C3042FFFF000210404C
+:1049E000008220213063FFFF008318210143102142
+:1049F000AD02005C8D020054ACA20108240200024A
+:104A0000A10200840E000FD78F4401001040003532
+:104A10008FBF00108F4301008F4201F80440FFFE5A
+:104A2000240200020A00128200000000AD07004CC0
+:104A30008CA2010800E210231840000224E2FFFCCF
+:104A4000ACA2010830C200011040000A00000000C2
+:104A50008D02005000E210230441000401002021D7
+:104A60008D02005414E20003000000000A001279D5
+:104A7000240600058D02005414E2001A8FBF0010B6
+:104A80003C0208008C4200D8304200201040000A4E
+:104A90002402000191030078910200831443000670
+:104AA0002402000101002021240600048FBF001011
+:104AB0000A00112327BD0018A1000084A5020014DC
+:104AC0008F4301008F4201F80440FFFE24020002E0
+:104AD000AF4301C0A34201C43C021000AF4201F841
+:104AE0008FBF001003E0000827BD00188FAA001038
+:104AF0008C8200500080402130C600FF004A102305
+:104B000000A048211840000700E0182124020001FD
+:104B1000A0800084A0A00112A48200140A0011F455
+:104B2000AFAA0010A0800081AD07004C8CA2010844
+:104B300000E210231840000224E2FFFCACA20108AE
+:104B400030C2000110400008000000008D0200503B
+:104B50000062102304410013240600058D02005456
+:104B600010620010000000008D0200541462001159
+:104B7000000000003C0208008C4200D830420020B7
+:104B80001040000A24020001910300789102008382
+:104B900014430006240200010100202101202821E5
+:104BA000240600040A00112300000000A100008474
+:104BB000A502001403E000080000000027BDFFE08C
+:104BC000AFBF0018274201009046000A8C4800142D
+:104BD0008C8B004C9082008430C900FF0168182340
+:104BE000304A00FF1C60001A2D4600062402000116
+:104BF0000142100410C00016304300030120302190
+:104C00000100382114600007304C000C15800009A9
+:104C1000304200301440000B8FBF00180A0012E32E
+:104C2000000000000E0011F4AFAB00100A0012E308
+:104C30008FBF00180E001169AFAB00100A0012E31D
+:104C40008FBF0018AFAB00100E001289AFAA00147E
+:104C50008FBF001803E0000827BD002024020003D6
+:104C6000A08200848C82005403E00008ACA20108FA
+:104C70003C02000803421821906200812406004390
+:104C80003C07601924420001A0620081906300810A
+:104C90003C0208008C4200C0306300FF1462001028
+:104CA0002403FF803C0208008C4200E000821021B7
+:104CB00000431024AF4200243C0208008C4200E074
+:104CC0003C03000A008210213042007F0342102181
+:104CD00000431021944500D40A000BBF30A5FFFF0C
+:104CE00003E000080000000027BDFFE0AFBF001890
+:104CF000AFB10014AFB000108F420180008080215E
+:104D000000A088210E0012EA00402021A2000084A9
+:104D10008E0200548FBF00188FB00010AE22010821
+:104D20008FB1001403E0000827BD002027BDFFE07D
+:104D30003C020008AFB00010AFBF0018AFB10014C4
+:104D4000034280218F510140920300848E04005061
+:104D50008E02004C14820040306600FF3C020800C6
+:104D60008C4200E02403FF80022210210043102423
+:104D7000AF4200243C0208008C4200E09744007CD3
+:104D800092050081022210213042007F0342182147
+:104D90003C02000A0062182114A0000B3084FFFFBF
+:104DA0002402000554C20014248205DC9062011222
+:104DB00024420001A062011224020C80AF420024B0
+:104DC0000A00134224020005A0600112240200051B
+:104DD00014C20009248205DC920200812C420007E3
+:104DE0005040000524820A0092030081240200142E
+:104DF00000621004008210213044FFFFA60400145A
+:104E00000E0012EA022020219602003C8E03004C84
+:104E1000022020213042FFFF0002104000621821D2
+:104E20000E000335AE03005C9202007D02202021BB
+:104E3000344200400E00033EA202007D8F4201F882
+:104E40000440FFFE24020002AF5101C0A34201C48E
+:104E50003C021000AF4201F88FBF00188FB1001460
+:0C4E60008FB0001003E0000827BD002008
+:044E6C0008000E7CB0
+:104E700008000EC408000F0408000F5008000F843B
+:104E80000A00002000000000000000000000000DEB
+:104E90006370342E362E31360000000004061004F4
+:104EA0000000000000000000000000000000000002
+:104EB00000000000000000000000000000000000F2
+:104EC00000000000000000000000002000000000C2
+:104ED00000000000000000000000000000000000D2
+:104EE00000000000000000000000000000000000C2
+:104EF0000000000000000000000000010000002B86
+:104F00000000000010000003000000000000000D81
+:104F10000000000D3C020800244258A43C03080095
+:104F200024635F70AC4000000043202B1480FFFD21
+:104F3000244200043C1D080037BD7FFC03A0F02183
+:104F40003C100800261000803C1C0800279C58A438
+:104F50000E00019C000000000000000D27BDFFE8CE
+:104F60003C096018AFBF00108D2C5000240DFF7F4E
+:104F700024080031018D5824356A380C24070C00B0
+:104F80003C1A8000AD2A50003C04800AAF4800085B
+:104F90003C1B8008AF4700240E000924AF8400109A
+:104FA0000E0008E7000000000E00083400000000BA
+:104FB0000E00125E000000003C0460168C850000AC
+:104FC0003C06FFFF3C02535300A618241062003F2A
+:104FD00034867C0094C201F2A780002C10400003AC
+:104FE000A78000CC38581E1EA798002C94C201F848
+:104FF00010400004978300CC38591E1EA79900CC9E
+:10500000978300CC2C7F006753E0000124030066E7
+:105010009784002C2C820401144000020060282197
+:10502000240404003C0760008CE904382403103C8D
+:105030003128FFFF1103001730B9FFFF5720000C84
+:10504000A38000CE24020050A38200CE939F00CE06
+:1050500013E0000A8FBF001027BD0018A78000CC06
+:10506000A780002CA780003403E00008A78000E69A
+:10507000939F00CE17E0FFF88FBF001027BD0018E8
+:10508000A78500CCA784002CA780003403E000088B
+:10509000A78000E6A38000CE8CCB003C316A0001E3
+:1050A0001140000E0000000030A7FFFF10E0FFE6F7
+:1050B000240200508CCC00C83186000114C0FFE4EB
+:1050C000939F00CE0A000072240200518C8F0004CE
+:1050D0003C0E60000A00005501EE30218CEF0808FC
+:1050E000240D5708000F740211CD000430B8FFFFE3
+:1050F000240500660A000073240404001700FFD48E
+:10510000939F00CE0A000072240200508F86001088
+:105110003089FFFF000939408CC300103C08005063
+:1051200000E82025AF4300388CC500142742040056
+:10513000AF82001CAF45003CAF44003000000000CF
+:10514000000000000000000000000000000000005F
+:105150000000000000000000000000008F4B000075
+:10516000316A00201140FFFD0000000003E000084C
+:10517000000000008F840010948A001A8C8700249D
+:105180003149FFFF000940C000E83021AF46003C34
+:105190008C8500248F43003C00A310231840002975
+:1051A000000000008C8B0020256200013C0D0050A7
+:1051B00035AC0008AF420038AF4C003000000000B2
+:1051C00000000000000000000000000000000000DF
+:1051D0000000000000000000000000008F4F0000F1
+:1051E00031EE002011C0FFFD000000008F4A0400D6
+:1051F0003C080020AC8A00108F490404AC890014DC
+:10520000AF48003000000000948600189487001C0E
+:1052100000C71821A48300189485001A24A2000155
+:10522000A482001A9498001A9499001E133800035F
+:105230000000000003E000080000000003E0000898
+:10524000A480001A8C8200200A0000CC3C0D005083
+:105250000A0000BD000000003C0308008C63002031
+:105260008F82001827BDFFE810620008AFBF001052
+:105270000E0000F4AF8300183C0308008C6300208C
+:1052800024040001106400048F8900108FBF0010F7
+:1052900003E0000827BD00188FBF00103C07601214
+:1052A000A520000A9528000A34E5001027BD001843
+:1052B0003106FFFF03E00008ACA600903C020800A6
+:1052C0008C42002027BDFFC8AFBF0034AFBE003006
+:1052D000AFB7002CAFB60028AFB50024AFB40020A4
+:1052E000AFB3001CAFB20018AFB1001410400050B3
+:1052F000AFB000108F840010948600069483000ADB
+:1053000000C3282330B6FFFF12C0004A8FBF00340D
+:1053100094890018948A000A012A40233102FFFF71
+:1053200002C2382B14E0000202C0202100402021DC
+:105330002C8C0005158000020080A021241400049C
+:105340000E0000A3028020218F8700100280982188
+:10535000AF80001494ED000A028088211280004E74
+:1053600031B2FFFF3C1770003C1540003C1E60004E
+:105370008F8F001C8DEE000001D71824507500504F
+:105380000220202102A3802B160000353C182000AB
+:105390005078004702202021241000018F83001440
+:1053A00014600039029158230230F8230250C821BA
+:1053B00033F1FFFF1620FFEE3332FFFF8F8700101F
+:1053C0003C110020AF5100300000000094E6000ABC
+:1053D0003C1E601237D5001002662821A4E5000AA1
+:1053E00094E2000A94F2000A94F400183057FFFF88
+:1053F0001292003BAEB700908CED00148CE40010CC
+:105400000013714001AE4021000E5FC3010E502B0E
+:10541000008B4821012A1821ACE80014ACE30010ED
+:1054200002D3382330F6FFFF16C0FFB98F84001077
+:105430008FBF00348FBE00308FB7002C8FB600288E
+:105440008FB500248FB400208FB3001C8FB20018DA
+:105450008FB100148FB0001003E0000827BD0038A2
+:10546000107E001B000000001477FFCC2410000108
+:105470000E0015A9000000008F8300141060FFCB00
+:105480000230F823029158238F87001001702021E9
+:105490000A0001873093FFFF8F8300141460FFCB55
+:1054A0003C110020AF5100300A0001530000000001
+:1054B0000E00079B024028210A000147004080217E
+:1054C0000E000341024028210A00014700408021CC
+:1054D0000E001471022020210A00014700408021A3
+:1054E0000E0000BD000000000A00016902D338234D
+:1054F00027BDFFE8AFB00010AFBF00140E000037AB
+:10550000000000003C028000345000700A0001AA34
+:105510008E0600008F4F000039EE000131C20001FD
+:10552000104000248F8600A88E0700003C0C080065
+:105530008D8C003C3C0908008D29003800E668236A
+:10554000018D28210000502100AD302B012A40217F
+:10555000010620213C010800AC25003CAF8700A8D3
+:105560003C010800AC2400380E0000F600000000EA
+:105570003C0308008C6300701060FFE6006020218F
+:105580003C0508008CA500683C0608008CC6006C31
+:105590000E001538000000003C010800AC2000702F
+:1055A0008F4F000039EE000131C200011440FFDED0
+:1055B0008F8600A88E0A00008F8B00A83C0508008B
+:1055C0008CA5003C3C0408008C840038014B482327
+:1055D00000A938210082182100E9402B0068102121
+:1055E0003C010800AC27003C3C010800AC2200381C
+:1055F0008F5F01002419FF0024180C0003F92024F8
+:1056000010980012AF840000AF440020936D00009A
+:10561000240C002031A600FF10CC0012240E0050F4
+:1056200010CE00043C194000AF5901380A0001A314
+:10563000000000000E0011D4000000003C194000E2
+:10564000AF5901380A0001A3000000000E00010F4D
+:10565000000000003C194000AF5901380A0001A3C6
+:10566000000000008F58010000802821330F00FF48
+:1056700001E020210E0002EEAF8F00043C19400033
+:10568000AF5901380A0001A30000000000A4102B4C
+:1056900024030001104000090000302100052840CB
+:1056A00000A4102B04A00003000318405440FFFC8A
+:1056B000000528405060000A0004182B0085382B94
+:1056C00054E000040003184200C330250085202365
+:1056D000000318421460FFF9000528420004182B4B
+:1056E00003E0000800C310213084FFFF30A5FFFF56
+:1056F0008F4201B80440FFFE3C0740800087302500
+:105700003C031000AF400180AF450184AF460188E3
+:1057100003E00008AF4301B83084FFFF8F4201B8B7
+:105720000440FFFE3C0740388CA600000087282577
+:105730003C031000AF460180AF45018803E000083C
+:10574000AF4301B88F8300388F8600301066000B9E
+:10575000008040213C07080024E75A18000328C0B5
+:1057600000A710218C44000024630001108800056C
+:105770003063000F5466FFFA000328C003E00008FE
+:10578000000010213C07080024E75A1C00A7302124
+:1057900003E000088CC200003C039000346200016A
+:1057A00000822025AF4400208F45002004A0FFFE8A
+:1057B0000000000003E00008000000003C0380003F
+:1057C000346200010082202503E00008AF4400207D
+:1057D00027BDFFE0AFB100143091FFFFAFB0001064
+:1057E000AFBF00181220001500A080218CA500007A
+:1057F00010A00013240400020E000C6B24060140CC
+:10580000AE0000008F4201B80440000D00002821C6
+:105810003C064000022620258FBF00188FB10014DF
+:105820008FB000103C03100027BD0020AF45018061
+:10583000AF44018803E00008AF4301B88CA5000025
+:105840008F4201B80440FFFE3C064000022620259E
+:105850008FBF00188FB100148FB000103C031000F0
+:1058600027BD0020AF450180AF44018803E0000858
+:10587000AF4301B83086FFFF8F4201B80440FFFEFE
+:105880003C0940068CA8000000C93825AF480180BB
+:105890008CA400043C031000AF440184AF4701888E
+:1058A00003E00008AF4301B827BDFFE0AFB0001030
+:1058B000AFBF0018AFB100149363003E0080802199
+:1058C0000080282130620040000020211040000F9D
+:1058D0008E1100000E000860022020219367000056
+:1058E0002404005030E500FF50A400128E0F000089
+:1058F000022020218FBF00188FB100148FB000103C
+:10590000A762013C0A00092027BD00200E00027D8D
+:10591000000000000E0008600220202193670000B4
+:105920002404005030E500FF14A4FFF202202021DF
+:105930008E0F00003C1008008E1000503C0D000C33
+:10594000240BFF8001F05021314E007F01DA6021ED
+:10595000018D4021014B4824AF490028022020211D
+:105960008FBF00188FB100148FB00010A50200D6B1
+:1059700027BD00200A000920AF8800D027BDFFE026
+:10598000AFBF0018AFB10014AFB0001093660001B4
+:10599000008080210E00024630D10004936400058F
+:1059A000001029C2A765000034830040A3630005EE
+:1059B0000E00024F020020210E00092202002021C9
+:1059C00024020001AF62000C02002821A76200102F
+:1059D00024040002A762001224060140A7620014FA
+:1059E0000E000C6BA76200161620000F8FBF001868
+:1059F000978C00343C0B08008D6B00782588FFFFE6
+:105A00003109FFFF256A0001012A382B10E000064A
+:105A1000A78800343C0F6006240E001635ED0010F8
+:105A2000ADAE00508FBF00188FB100148FB00010C2
+:105A300003E0000827BD002027BDFFE0AFB1001440
+:105A4000AFBF0018AFB0001000A088211080000A7E
+:105A50003C0360002402008010820012000000005D
+:105A60000000000D8FBF00188FB100148FB0001020
+:105A700003E0000827BD00208C682BF80500FFFE1E
+:105A800000000000AC712BC08FBF00188FB1001454
+:105A90008FB000103C09100027BD002003E0000873
+:105AA000AC692BF80E00024600A02021936500058A
+:105AB000022020210E00024F30B000FF2403003EE0
+:105AC0001603FFE7000000008F4401780480FFFE0A
+:105AD000240700073C061000AF510140022020219E
+:105AE000A34701448FBF00188FB100148FB000107E
+:105AF000AF4601780A0002BF27BD002027BDFFE89E
+:105B0000AFBF0014AFB000108F50002000000000A5
+:105B10000E000922AF440020AF5000208FBF0014B8
+:105B20008FB0001003E0000827BD00183084FFFF8D
+:105B30008F4201B80440FFFE3C0740350087302506
+:105B40003C031000AF450180AF400184AF4601889F
+:105B500003E00008AF4301B83084FFFF8F4201B873
+:105B60000440FFFE3C074036008730253C03100010
+:105B7000AF450180AF400184AF46018803E00008D3
+:105B8000AF4301B827BDFFD0AFB3001C3093FFFF78
+:105B9000AFB50024AFB20018AFBF0028AFB40020EB
+:105BA000AFB10014AFB0001030B5FFFF1260002796
+:105BB000000090218F90001C8E0300003C068000A6
+:105BC0002402004000033E0200032C0230E4007F68
+:105BD000006688241482001D30A500FF8F830028F2
+:105BE0002C68000A510000108F91001400035880A7
+:105BF0003C0C0800258C56CC016C50218D490000CE
+:105C0000012000080000000002B218213065FFFFEB
+:105C10000E00021A24040084162000028F90001C3B
+:105C2000AF8000288F910014260C0020264B000125
+:105C3000018080213172FFFF16200004AF8C001C10
+:105C40000253402B1500FFDC000000000240102131
+:105C50008FBF00288FB500248FB400208FB3001CA5
+:105C60008FB200188FB100148FB0001003E000084D
+:105C700027BD0030240D003414AD00F600000000F4
+:105C8000920B000E240A16803C07000CA36B002127
+:105C90009203000D0347F8213C066000A363002037
+:105CA000961100123C087FFF350CFFFFA771003CE6
+:105CB00096020010240B00053054FFFFAF740084DF
+:105CC0008E19001CAF4A00288FF800008CCF444882
+:105CD0000319702601EE3021AF66004C8F69004C2D
+:105CE00024CD00013C197F00AF6900508F64005043
+:105CF000AF640054AF660070AF6D00588F650058F8
+:105D000024040050AF65005CA3600023AF6C006406
+:105D1000A36B00378E030014AF6300488F710048F7
+:105D2000AF7100248E020018AF62006C9214000C58
+:105D3000A3740036936A003E355F0020A37F003EC7
+:105D40008F7800740319782435EE4000AF6E00742C
+:105D500093700000320900FF112402332418FF80E1
+:105D60003C04080024845A980E00028A00000000B7
+:105D700024060004240700013C0408008C845A987F
+:105D8000A366007DA36700058F4A01780540FFFEEA
+:105D900024020002AF440140A34201448F90001C42
+:105DA0003C141000AF5401780A000369AF8000284A
+:105DB0002CAD003751A0FF9C8F9100140005A080EE
+:105DC0003C180800271856F4029878218DEE000040
+:105DD00001C00008000000002406000614A60011FF
+:105DE000000000003C1F08008FFF5A9824040005A3
+:105DF000AF5F00208E190018AF7900188F78004C23
+:105E0000AF78001C8F6F0050122000C2AF6F00707F
+:105E10000A000369AF840028240A000710AA00843E
+:105E2000240300063C05080024A55A980E000254DD
+:105E3000240400818F90001C0011102B0A000369BC
+:105E4000AF820028240A000414AAFFF6240300509D
+:105E50003C0E08008DCE5A98AF4E00208E090008E7
+:105E6000AF6900408E060008AF6600448E07000C44
+:105E7000AF6700488E040010AF64004C8E0D001018
+:105E8000AF6D00848E080014AF6800508E050018B6
+:105E9000AF6500548E0C001CAF6C0058936B000073
+:105EA000317400FF128301F5000000008F64004888
+:105EB0008F6600400086382304E000042404008C30
+:105EC0001620FFDE24020003240400823C050800A3
+:105ED00024A55A980E00027D000000008F90001C3F
+:105EE000000010210A000369AF8200282409000580
+:105EF00014A9FFCC240520003C0A08008D4A5A98BA
+:105F0000AF4A00208E1F0004AF7F005C921900088A
+:105F100024100008A37900218F98001C930F00091A
+:105F2000A36F00208F86001C90CE000A31C400FFB2
+:105F300010900010288300091460006C24020002F5
+:105F4000240800201088000B3405800028850021DB
+:105F500014A0000824054000240D0040108D000509
+:105F60003C05000124070080108700023C05000268
+:105F7000240540008F6E00743C0FFF0001CF802489
+:105F800002054825AF69007490C4000BA36400812A
+:105F90008F84001C9486000C10C0019B0000000040
+:105FA000948E000C241FFFBF24060004A76E003C43
+:105FB0009090000EA370003E8F89001C9124000F6A
+:105FC000A364003F8F94001C8E8D00108F470074D7
+:105FD00001A72823AF6500608E880014AF680064B5
+:105FE000968C0018A76C0068968B001AA76B006A45
+:105FF0008E82001CAF62006C96830002A763013E94
+:10600000928A000EA36A003E9379003E033FC024AB
+:106010001220016AA378003E8F90001C0A000369D9
+:10602000AF8600282414002214B4FF7E2403000746
+:106030003C0208008C425A981220000CAF4200200B
+:106040000A000369AF830028240C003310AC00144D
+:10605000240800283C05080024A55A980E000226B2
+:10606000240400810A0003EE8F90001C3C04080009
+:1060700024845A980E00028A00000000936B0000EE
+:1060800024110050316300FF107101540000000022
+:106090008F90001C000018210A000369AF830028BC
+:1060A0003C0508008CA55A9824040081AF450020C7
+:1060B000A36800343C05080024A55A980E00022667
+:1060C000000000008F90001C240200090A000369F0
+:1060D000AF82002802B288213225FFFF0E00021A8B
+:1060E000240400840A0003698F90001C1082FFA121
+:1060F000240504002894000312800176240C000477
+:10610000240B0001548BFF9B240540000A00043D32
+:10611000240501003C04080024845A988F62004C36
+:106120000E00028A8F6300508F90001C0000202117
+:106130000A000369AF8400288E1000042404008A3A
+:10614000AF500020936E000531C900021520016593
+:10615000020028219378002302002821330F002019
+:1061600015E001602404008D9362003F24190012A1
+:10617000305F00FF13F9015B240400810E0002462A
+:106180000200202193740023240A0004020020212D
+:1061900036830042A36300230E00024FA36A007DF2
+:1061A0008F4B01780560FFFE24050002AF500140CF
+:1061B000A34501448F90001C3C0C1000AF4C0178AB
+:1061C0000A0003EF0011102B8E1000042404008A33
+:1061D000AF500020936D000531A800021500001992
+:1061E000020028219367003F2414001230E400FFCE
+:1061F0001094010100000000936E003F240600048B
+:1062000031C900FF112600FC000000000E0002460C
+:1062100002002021936200232419FFFE02002021A6
+:10622000345F0020A37F0023A374003F9378000510
+:10623000031978240E00024FA36F000502002821E5
+:10624000000020210E000336000000000A0003EECB
+:106250008F90001C8E0500043C0F0008034F402166
+:10626000AF450020910E00002406005031C900FF08
+:106270001126017A240400888F5901B80720FFFEF7
+:106280003C0C400E008C58253C031000AF450180AB
+:10629000AF400184AF4B0188AF4301B891020000C9
+:1062A000240AFF8024040004004AF825A11F0000EE
+:1062B0000E000C6B240600300A0003EE8F90001CC9
+:1062C0008E04001C0E000231000000001040014C42
+:1062D000004048218F90001C240500898F4D01B893
+:1062E00005A0FFFE00000000AF4901808E0F001CDA
+:1062F0003C1440010011702B00B448253C111000E3
+:10630000AF4F0184AF8E0028AF490188AF5101B86B
+:106310000A00036A8F910014961900023C140800C9
+:1063200026945A9833380004130000F23C026000AF
+:106330008E1F001C3C010800AC3F5A98AF5F002044
+:10634000920C0010240B0014318400FF148B011CEC
+:106350000000000096090002312D000115A001B2D5
+:10636000000000008E020004AE8200083C0E08000F
+:106370008DCE5AA011C001A8000000008F690074E2
+:106380003C0E800024040001012E6825AF6D0074CE
+:10639000A3600005AF64000C3C0C08008D8C5AA073
+:1063A0008F88001CA7640010000C59C2A76400125B
+:1063B000A7640014A7640016A76B00088D030008EB
+:1063C00024040002AF63002C8D0A000CAF6A003079
+:1063D00091070010A36700348F82001C90450011C4
+:1063E000A36500358F86001C90D00012A370003684
+:1063F0008F9F001C93F90013A37900378F90001C26
+:1064000096180014A778003896140016A774003A5E
+:106410008E0F0018AF6F00245620FE02AF840028B4
+:106420003C05080024A55A980E00025400002021C3
+:106430008F90001C0A0004AC000020218E0F000485
+:106440003C14080026945A983C010800AC2F5A9836
+:10645000AF4F0020920E000331C90004112000024A
+:106460002402001224020006A362003F9203001BD4
+:10647000240AFFC03062003F004AF825A37F003E97
+:106480009219000333380001170000C1000000001A
+:106490008E020008AE8200083C0208008C425AA01E
+:1064A000104000C000000000000221C2A7640008E4
+:1064B0008E0D000C240B000124140014AF6D002C71
+:1064C0008E080010AF68003096050016A7650038EA
+:1064D000960C0014A76C003AAF6B000CA76B001071
+:1064E000A76B0012A76B0014A76B0016122000EB1D
+:1064F000A37400349206000330C700022CF00001A0
+:10650000260200088F90001C0A000369AF82002851
+:106510008E14000424030081AF54002093680023EC
+:106520003105001010A000AC000000008F4401B83D
+:106530000480FFFE3C06401F0011382B006610252A
+:106540003C111000AF540180AF870028AF40018498
+:10655000AF420188AF5101B80A00036A8F9100145D
+:106560008E0600043C19000803592021AF46002084
+:106570008E07000890980000240F0050331400FF8D
+:10658000128F00A7240500888F4401B80480FFFE05
+:106590003C0D40090011602B00AD10253C1110008E
+:1065A000AF460180AF8C0028AF470184AF4201881D
+:1065B000AF5101B80A00036A8F9100143C0508002E
+:1065C00024A55A980E00027D240400828F90001C9E
+:1065D000000030210A000369AF8600283C0408004F
+:1065E0008C845A980E0014F6000000008F90001C56
+:1065F0000A000486000018210E00033624040081DE
+:106600000A0003EE8F90001C3C05080024A55A9850
+:106610000E00027D2404008B8F90001C0011302B93
+:106620000A000369AF8600283C1908008F395A9880
+:106630003C1F08008FFF005024CCFFFE033F782151
+:1066400001F87024AF4E00283C0408008C845A984E
+:106650003C0908008D2900500089682131A5007F80
+:1066600000BA402101078021AE0600D8AF9000D0CB
+:10667000AE0000DC0A0003B8AE0C0108AF60008475
+:106680003C0808008D085A983C0D08008DAD00505C
+:106690002405FF803C02000C010D58210165602497
+:1066A000AF4C00288E0A00143174007F029A182122
+:1066B00000627821ADEA00D88E1F0014AF8F00D0A1
+:1066C000ADFF00DC8E1900102738FFFE0A00040B16
+:1066D000ADF80108548CFE27240540000A00043D53
+:1066E000240510000E00032B000000000A0003EE3A
+:1066F0008F90001C8C46442C3C056C6234B0797041
+:106700003C010800AC205A9814D000082404000270
+:1067100097880034978A002C02802821010A382BA0
+:1067200010E0001124040092240400020E000C89E1
+:10673000240501403C010800AC225A98AF420020D9
+:106740003C0308008C635A98106000052404008301
+:106750000E000854000000001040000924040083CB
+:106760003C05080024A55A980E00025400000000C1
+:106770008F90001C0011202B0A000369AF840028B1
+:106780000E000858000000000A0005308F90001C21
+:106790008E0400080E000231000000000A00058689
+:1067A000AE8200083C05080024A55A980E00022677
+:1067B000240400878F90001C0A0005A20011102BF2
+:1067C0000E00085C000000003C05080024A55A9853
+:1067D0000A00063A2404008B0E00024602802021A3
+:1067E0009370002302802021360D00100E00024F0E
+:1067F000A36D00238F90001C0A0005AB0000182138
+:10680000240400040E000C89240500301440002AE2
+:10681000004048218F90001C0A00051724050083C2
+:106820009205000C30BF000113E0000300000000DF
+:106830009602000EA482002C920A000C314800023D
+:106840001100FF5100002821960B00128E03001446
+:10685000A48B001A0A0005C2AC83001C8F83003889
+:106860008F8700301067FE84000020213C0908005B
+:1068700025295A1C000320C0008930218CD4000037
+:106880001285005E247800013303000F5467FFFA7D
+:10689000000320C00A0004FE000020213C0508007F
+:1068A00024A55A980E00027D240400828F90001CBB
+:1068B0000A0005A2000010213C0B0008034B202118
+:1068C00024030050240A0001AF420020A0830000EE
+:1068D000A08A00018F88001C91070004A08700187F
+:1068E0008F82001C90450005A08500198F86001C32
+:1068F00090DF0006A09F001A8F99001C93380007B4
+:10690000A098001B8F94001C928F0008A08F001C81
+:106910008F90001C920E0009A08E001D8F8D001C10
+:1069200091AC000AA08C001E8F8B001C3C0C080050
+:10693000258C5A1C9163000B3C0B0800256B5A18E0
+:10694000A083001F8F8A001C9148000CA0880020A3
+:106950008F87001C90E5000DA08500218F82001C10
+:10696000240546469046000EA08600228F9F001CFC
+:1069700093F9000FA09900238F98001C9314001026
+:10698000A09400248F8F001C91F00011A09000258E
+:106990008F90001C8F8E00308F990038960D001458
+:1069A000000E18C025C80001A48D0028960A001604
+:1069B000006C3021006BF821A48A002A9607001889
+:1069C0003108000FA487002CA485002E8E02001C25
+:1069D000ACC90000AF88003011190003AFE200001D
+:1069E0000A00051700002821250C00013184000F42
+:1069F000000028210A000517AF8400383C07080072
+:106A000024E75A180087802100002021ACC0000034
+:106A10000A0004FEAE0000003C05080024A55A98B8
+:106A20000A00063A240400878E0400040E00023196
+:106A3000000000000A00053BAE8200083084FFFF22
+:106A400030C600FF8F4201B80440FFFE000644003C
+:106A5000010430253C07200000C720253C0310001E
+:106A6000AF400180AF450184AF44018803E00008D6
+:106A7000AF4301B827BDFFE8AFB00010AFBF0014AF
+:106A80003C076000240600021080000600A0802160
+:106A90000010102B8FBF00148FB0001003E000080F
+:106AA00027BD00183C09600EAD2000348CE5201C89
+:106AB0008F82001C2408FFFC00A81824ACE3201CD3
+:106AC0000E0006EF8C45000C0010102B8FBF001439
+:106AD0008FB0001003E0000827BD00183C02600ED4
+:106AE0003447010024090018274A04000000000070
+:106AF00000000000000000003C06005034C302000B
+:106B0000AF440038AF45003CAF430030014018218E
+:106B10008F4B0000316800201100FFFD2406007F2C
+:106B20002408FFFF8C6C000024C6FFFF24630004D0
+:106B3000ACEC000014C8FFFB24E7000400000000D8
+:106B400000000000000000003C0F0020AF4F0030AC
+:106B50000000000024AD020001A5702B2529FFFFD5
+:106B6000008E20211520FFE101A0282103E000086C
+:106B70000000000027BDFFE0AFB10014AFBF001858
+:106B8000AFB000103C05600E8CA20034008088215C
+:106B9000144000063C0460008C87201C2408FFFC85
+:106BA00000E8302434C30001AC83201C8F8B001C10
+:106BB00024090001ACA90034956900028D65001418
+:106BC0008D70000C2D2400818D6700048D660008F7
+:106BD000108000078D6A00102D2C00041580000E17
+:106BE00030CE0007312D000311A0000B0000000083
+:106BF0002404008B020028210E0006EF2406000367
+:106C00000011102B8FBF00188FB100148FB000102F
+:106C100003E0000827BD002015C0FFF62404008B08
+:106C20003C030020AF4300300000000024020001BC
+:106C3000AF8200140000000000000000000000000F
+:106C40003C1F0150013FC825253800033C0F600E52
+:106C5000AF47003800181882AF46003C35E8003CCA
+:106C6000AF590030274704008F44000030860020D1
+:106C700010C0FFFD00000000106000082466FFFF48
+:106C80002403FFFF8CEB000024C6FFFF24E7000471
+:106C9000AD0B000014C3FFFB250800043C08600E88
+:106CA000AD090038000000000000000000000000F6
+:106CB0003C070020AF470030000000000E0007171F
+:106CC0000140202102002821000020210E0006EFB3
+:106CD000240600030011102B8FBF00188FB1001481
+:106CE0008FB0001003E0000827BD002027BDFFD8AB
+:106CF000AFB200183092FFFFAFB10014AFBF002059
+:106D0000AFB3001CAFB000101240002C000088216F
+:106D10000A0007AF2413000150B3003C8CE5000CBF
+:106D20000000000D262D000131B1FFFF24EC0020F2
+:106D30000232382B10E00021AF8C001C8F8200142F
+:106D40001440001E8F87001C3C0670003C0320008E
+:106D50008CE400000086282414A300188F85003CD2
+:106D6000000444023C0980000089802414A0FFEA4A
+:106D7000310600FF2404000210C4001F28CA0003CB
+:106D800011400016240B000314D3FFE7262D000149
+:106D9000020028210E0006FD240400018F87001C3C
+:106DA000AF82003C262D000131B1FFFF24EC002012
+:106DB0000232382B14E0FFE1AF8C001C02201021BE
+:106DC0008FBF00208FB3001C8FB200188FB100144A
+:106DD0008FB0001003E0000827BD002814CBFFD2BD
+:106DE000262D00010E00073D020020218F87001C88
+:106DF0000A0007C9AF82003C020028210E0006FDF0
+:106E0000000020210A0007C88F87001C0E0006EF33
+:106E1000240400841600FFC38F87001C0A0007A902
+:106E2000AF80003C3082FFFF1440000300001821B7
+:106E30000004240224030010308500FF14A0000584
+:106E40003087000F246600080004220230C300FFD0
+:106E50003087000F14E00005308900032468000427
+:106E600000042102310300FF3089000315200005D2
+:106E7000388B0001246A000200042082314300FFA5
+:106E8000388B00013164000110800002246C000185
+:106E9000318300FF03E0000800601021308BFFFF0A
+:106EA000000B394230E600FF3C09080025295998BB
+:106EB00000064080010960218D8700003164001FB9
+:106EC000240A0001008A180430A500FF00E32025F1
+:106ED00014A000020003102700E22024240F000168
+:106EE00000CF700401096821000E282714800005D6
+:106EF000ADA400008F86000C00A6102403E000085B
+:106F0000AF82000C8F88000C01C8102503E0000838
+:106F1000AF82000C3C06001F3C0360003084FFFF82
+:106F200034C5FF8024020020AC602008AC60200C37
+:106F3000AC602010AC652014AC642018AC6220005A
+:106F4000000000000000000003E000080000000056
+:106F500027BDFFE82402FFFFAFBF0010AF82000C87
+:106F6000000020213C06080024C659982405FFFF94
+:106F700024890001000440803124FFFF010618210C
+:106F80002C87002014E0FFFAAC6500000E000825F5
+:106F900000002021240200013C04600024050020A0
+:106FA000AC822018AC85200000000000000000002A
+:106FB00000000000244A00013142FFFF2C4604007B
+:106FC00014C0FFF78FBF001003E0000827BD0018B2
+:106FD0008F8300082C62040003E00008384200019F
+:106FE0008F8300082462000103E00008AF820008DC
+:106FF0008F8300082462FFFF03E00008AF820008CF
+:1070000027BDFFE0AFB10014AFBF0018AFB0001054
+:107010008F6B00303C06600000808821ACCB2008DC
+:107020008F6A002C3C02800024030008ACCA200CAC
+:107030009769003A9768003800092C003107FFFF74
+:1070400000A72025ACC42010ACC22014ACC3200083
+:107050000000000000000000000000003C03600091
+:107060008C6D200031AC00081580FFF90000000095
+:107070008C6E201405C00020000000000E0007E9FF
+:107080008F84000C000240803C0908002529599893
+:10709000010938218CE400000E0007E9000281405C
+:1070A000020220213090FFFF020020210E0008077D
+:1070B000000028213C0C8000022C58253210FFFFD4
+:1070C0003C116000240A0020AE2B2014AE302018A2
+:1070D000AE2A2000000000000000000000000000B8
+:1070E000020010218FBF00188FB100148FB0001064
+:1070F00003E0000827BD00208C6620143C02001F1E
+:107100003443FF803C1FFFE800C3C02437F9080068
+:1071100003198021001079C23C0C8000022C5825F4
+:1071200031F0FFFF3C116000240A0020AE2B201438
+:10713000AE302018AE2A2000000000000000000041
+:1071400000000000020010218FBF00188FB1001452
+:107150008FB0001003E0000827BD002027BDFFE826
+:10716000AFB000103402FFFF3090FFFFAFBF00143C
+:1071700012020006020020210E0008250000000077
+:10718000020020210E000807240500018F8400085A
+:107190008FBF00148FB000102483FFFF27BD00189D
+:1071A00003E00008AF830008000439C230E6003F66
+:1071B00000043B4200071840240210002CC40020A9
+:1071C00024C8FFE0AF42002C2463000114800003B8
+:1071D00030A900FF00071840310600FF000360805F
+:1071E00024080001019A58213C0A000E00C8280416
+:1071F000016A382111200005000530278CE90000C4
+:107200000125302503E00008ACE600008CEE00000C
+:1072100001C6682403E00008ACED000027BDFFE8CC
+:10722000AFBF0014AFB000103C0460008C850808AC
+:107230003403F00030A2F0005043000624020001A5
+:107240008C8708083404E00030E6F00010C4001E0B
+:1072500024020002AF8200403C1060003C0A0200A1
+:10726000AE0A0814240910003C08000E8E034400E6
+:1072700003482021AF49002C240501200E000CCF2B
+:10728000000030218F830040106000043C02169102
+:10729000240B0001106B000E3C023D6C344F00903B
+:1072A000AE0F44088FBF00148FB000103C0C60007C
+:1072B000240E10003C0D020027BD0018AD8E4420A6
+:1072C00003E00008AD8D08100A0008F6AF8000400A
+:1072D0003C0218DA344F0090AE0F44088FBF001400
+:1072E0008FB000103C0C6000240E10003C0D02001A
+:1072F00027BD0018AD8E442003E00008AD8D0810B6
+:107300000A0008CA240500010A0008CA0000282152
+:107310003C08080025085DA42404FFFF0100182193
+:107320002402001E2442FFFFAC6400000441FFFD64
+:10733000246300043C07080024E75E208CE5FFFC82
+:107340002404001C24060001308A001F0146480462
+:1073500024840001000910272C8300201460FFFA08
+:1073600000A22824ACE5FFFC3C05666634A4616EEF
+:107370003C06080024C65EE0AF840058AF88009C3D
+:107380002404FFFF00C018212402001F2442FFFF35
+:10739000AC6400000441FFFD246300043C07666602
+:1073A0003C05080024A55EA0AF86004834E6616E67
+:1073B000AF8600982404FFFF00A018212402000FCC
+:1073C0002442FFFFAC6400000441FFFD246300047D
+:1073D0003C0B66663C06080024C65E203568616E7C
+:1073E000AF8500A4AF8800702404FFFF00C01821FF
+:1073F0002402001F2442FFFFAC6400000441FFFD93
+:10740000246300043C0D66663C0A0800254A5F6060
+:1074100035AC616EAF860090AF8C005C2404FFFF3A
+:1074200001401821240200032442FFFFAC64000045
+:107430000441FFFD246300043C09080025295F7016
+:107440008D27FFFC24040006240500013099001F4D
+:107450000325C00424840001001878272C8E002006
+:1074600015C0FFFA00EF3824AD27FFFC3C09666623
+:1074700024030400240403DC24050200240600661F
+:107480003522616E3C08080025085AA4AF820074BA
+:10749000AF830044AF83006CAF830050AF830084A0
+:1074A000AF8A008CAF840064AF85004CAF86005477
+:1074B000AF840078AF850060AF860080010018219E
+:1074C000240200022442FFFFAC6000000441FFFDE3
+:1074D00024630004240400032403000C3C0A080075
+:1074E000254A5AB0AF8A00680A00099D2405FFFFAB
+:1074F0000004188024840001006858212C8700C0F3
+:1075000014E0FFFBAD6500003C0E666635CD616E94
+:10751000240C17A024081800AF8D0088AF8C0094AD
+:1075200003E00008AF88007C2484007F000421C2AF
+:1075300000004021000030210000382100002821F7
+:107540000A0009B4AF8400A01060000624E700011F
+:1075500000C4302124A500012CC20BF51440FFFA11
+:107560002CA300663C09080025295F600120182132
+:10757000240200032442FFFFAC6000000441FFFD31
+:107580002463000410E0001A24E3FFFF00032942F3
+:1075900010A0000A000020212406FFFF3C03080081
+:1075A00024635F60248400010085502BAC660000DA
+:1075B000250800011540FFFB2463000430E2001F92
+:1075C0001040000800086880240C0001004C3804BA
+:1075D000000858800169282124E6FFFF03E0000825
+:1075E000ACA6000001A940212409FFFFAD0900005D
+:1075F00003E0000800000000AF4400283C04000C39
+:1076000003442021000528820A000CCF000030210D
+:10761000000421803C036000AC64100800000000FE
+:1076200000052980AC65100C0000000003E0000894
+:107630008C62100C27BDFFE800802821240400384C
+:10764000AFBF00140E0009E4AFB0001024040E0018
+:10765000AF4400283C10000C0350202124050010EA
+:107660000E000CCF0000302103501021AC40000070
+:10767000AC400004240400388FBF00148FB0001009
+:1076800024053FFF27BD00180A0009E48C430000D1
+:10769000000421803C036000AC641008000000007E
+:1076A0008C62100C03E000080002118227BDFFC8A5
+:1076B000AFB400208F940068AFBE0030AFB7002C8D
+:1076C000AFB600280000B8210080B021241E00C001
+:1076D000AFBF0034AFB50024AFB3001CAFB2001889
+:1076E000AFB10014AFB000100A000A21AFA5003CF2
+:1076F000504000018F94006827DEFFFF13C0002870
+:10770000269400048E9200003C03080024635DA0D0
+:107710001240FFF70283102B3C04080024845AA473
+:10772000028410230002A8C0000098210A000A3039
+:1077300024110001001188401220002600000000E2
+:1077400002B38021025128240200202110A0FFF959
+:10775000267300010E0009ED0000000000166840CD
+:1077600032EC000101AC20210E0009E402002821C6
+:107770008F89009426F700018FA6003C3AEB0001A8
+:10778000316A00012528FFFF0011382702CAB02105
+:10779000AF88009416E6FFE702479024AE920000FF
+:1077A00002E010218FBF00348FBE00308FB7002C55
+:1077B0008FB600288FB500248FB400208FB3001C33
+:1077C0008FB200188FB100148FB0001003E00008D2
+:1077D00027BD00383C0E080025CE5DA0028E102B80
+:1077E0000A000A1CAE92000027BDFFD8AFB10014FA
+:1077F000AFB00010AFBF0020AFB3001CAFB2001895
+:1078000000A0882110A0001F000480403C13080045
+:1078100026735AA40A000A692412000112200019D2
+:10782000261000010E000A0402002021000231424D
+:107830002444FFA0000618803045001F2C8217A1A9
+:10784000007318212631FFFF1040FFF400B230040E
+:107850008C6900000200202124053FFF01264024FE
+:107860001500FFEE012638250E0009E4AC67000084
+:107870008F8A009426100001254700011620FFE999
+:10788000AF8700948FBF00208FB3001C8FB2001809
+:107890008FB100148FB0001003E0000827BD00284E
+:1078A0008F85009C00805821000040210000482165
+:1078B000240A001F3C0C0800258C5E1C3C0D0800AF
+:1078C00025AD5DA48CA6000050C00014000040212E
+:1078D00000AD1023000238C0240300010A000AA2F0
+:1078E000000020211500000300E41021244820247A
+:1078F0000000482125290001512B00132506DFDC5B
+:10790000106000062484000100C3702415C0FFF538
+:10791000000318400A000AA00000402110AC002615
+:1079200024A3000400602821254AFFFF1540FFE53D
+:10793000AF85009C512B00042506DFDC00004021B0
+:1079400003E00008010010210006614230C5001F5D
+:10795000000C50803C07080024E75DA424040001CB
+:10796000014730211120000F00A420043C0508002D
+:1079700024A55E20148000052529FFFF24C60004ED
+:1079800010C5001100000000240400018CCF00008D
+:107990000004C0270004204001F868241520FFF5EA
+:1079A000ACCD00008F99007801001021032B4823F3
+:1079B00003E00008AF8900783C05080024A55DA419
+:1079C0000A000AAA000040213C06080024C65DA463
+:1079D0000A000AC324040001308800FF24020002C8
+:1079E0001102000A240300031103005C8F8900A424
+:1079F000240400041104005F24050005110500673C
+:107A00000000182103E00008006010218F89004861
+:107A10003C0C0800258C5EE03C04080024845F6078
+:107A2000240300201060000F00005821240D0002E4
+:107A3000240E00033C0F080025EF5EE08D270000B8
+:107A400014E0000B30F9FFFF252900040124C02BAE
+:107A500053000001018048212463FFFF5460FFF8B8
+:107A60008D2700000160182103E00008006010214C
+:107A7000132000323C0500FF30E200FF00403021BF
+:107A80001040004200005021240500010000202188
+:107A90000005C84000A6C02417000003332500FFDE
+:107AA00014A0FFFB24840001012CC023001828C06F
+:107AB00000AA6021008C50213144001F240C0001D9
+:107AC000008C18040003102700E23024110D00413F
+:107AD000AD260000110E004C000A1840110D0036B2
+:107AE0008F87006C510E00568F8C0060240D0004AF
+:107AF000110D005A8F8E0084240E0005150EFFDA3A
+:107B000001601821240B14301140000600001821D8
+:107B10008F8400A024630001006A402B1500FFFD44
+:107B2000016458218F8A0080AF89008C0160182180
+:107B30002549FFFF0A000AFAAF89008000E52024EA
+:107B4000000736021080FFD0240A001800075402F4
+:107B5000314600FF0A000B02240A00103C0C08000A
+:107B6000258C5EA03C04080024845EE00A000AE93B
+:107B7000240300103C0C0800258C5E203C04080007
+:107B800024845EA00A000AE88F89009000071A0288
+:107B9000306600FF0A000B02240A00088F89008C5F
+:107BA0003C0C0800258C5F603C04080024845F7056
+:107BB0000A000AE924030004000A4080250B003073
+:107BC00024E6FFFF01601821AF8900480A000AFA85
+:107BD000AF86006C000AC982001978803C07080053
+:107BE00024E75EA001E72021000A18428C8F0000E4
+:107BF0003079001F032C38040007C02701F86024E7
+:107C00000A000B17AC8C00000003314200062880EC
+:107C100000AF28213062001F8CB8000024630001EF
+:107C2000004CC804000321420019382700041080CA
+:107C300003073024004F20210A000B5BACA6000094
+:107C4000000A68C025AB0032258AFFFF01601821B9
+:107C5000AF8900A40A000AFAAF8A0060254B1030F1
+:107C6000AF8900900160182125C9FFFF0A000AFAB8
+:107C7000AF890084308600072CC200061040001433
+:107C800000000000000640803C030800246357D039
+:107C9000010338218CE4000000800008000000008F
+:107CA0002409000310A9000E00000000240A0005AA
+:107CB00010AA000B00000000240B000110AB00080C
+:107CC000000000008F8C00A010AC00050000000038
+:107CD00003E00008000010210A000A8800A020210B
+:107CE0000A000AD600C0202127BDFFE8308400FF2B
+:107CF000240300021083000BAFBF00102406000312
+:107D00001086003A2408000410880068240E00053C
+:107D1000108E007F2CAF14308FBF001003E00008DE
+:107D200027BD00182CA200301440FFFC8FBF0010AC
+:107D300024A5FFD0000531C2000668803C0708007A
+:107D400024E75EE001A730218CC9000000052882ED
+:107D500030AC001F240B0001018B50048F840048BD
+:107D6000012A4025ACC800008C830000506000014F
+:107D7000AF8600488F98006C30AE000124A6FFFF4C
+:107D8000270F000115C00002AF8F006C24A6000170
+:107D90000006414200082080008718218C790000ED
+:107DA00030C2001F240600010046F804033F3824B7
+:107DB00010E0FFDA8FBF00100005C182001870804C
+:107DC0003C0F080025EF5EA001CF48218D2B00005D
+:107DD0000005684231A5001F00A66004016C502513
+:107DE00027BD001803E00008AD2A00002CA70030D2
+:107DF00014E0FFCA8FBF001030B900071723FFC778
+:107E000024A8FFCE00086A02000D60803C0B080029
+:107E1000256B5EA0018B30218CC40000000828C2B5
+:107E200030AA001F24080001014848048F8200A4E2
+:107E300000891825ACC300008C5F000053E00001EE
+:107E4000AF8600A400057040000E7942000F288024
+:107E50003C04080024845EE000A418218C6B000020
+:107E600025DF000131CD001F001F514201A8600431
+:107E7000016C4825000A1080AC69000000442821EC
+:107E80008CA600008F98006033F9001F8FBF001090
+:107E90000328380400C77825270E000127BD0018E5
+:107EA000ACAF000003E00008AF8E006024A5EFD067
+:107EB0002CB804001300FF998FBF00100005314259
+:107EC000000658803C0A0800254A5E20016A3021DD
+:107ED0008CC4000030A3001F2409000100691004B5
+:107EE0008F9900900082F825ACDF00008F270000FA
+:107EF00050E00001AF8600908F8D00848FBF00108E
+:107F000027BD001825AC000103E00008AF8C0084F9
+:107F100015E0FF828FBF00108F8600A00006104082
+:107F20000046F821001F210003E4C8210019384051
+:107F300024F8143000B8402B1100FF788FBF0010D8
+:107F400024A4EBD00E00020300C0282100027942D5
+:107F5000000F70803C0D080025AD5F6001CD202131
+:107F60008C8B0000304C001F240600010186180491
+:107F70008F89008C01635025AC8A00008D2500009C
+:107F800050A00001AF84008C8F9800808FBF00103C
+:107F900027BD00182708000103E00008AF88008013
+:107FA00030A500072403000310A3001028A200043A
+:107FB00014400008240700022403000410A3001545
+:107FC0002408000510A8000F8F8500A003E000081A
+:107FD0000000000014A7FFFD0080282114C3FFFB50
+:107FE000240400020A000B9A000000002409000586
+:107FF0000080282110C9FFFB2404000303E00008CF
+:108000000000000014C5FFF1008028210A000B9A2F
+:1080100024040005240A00010080282110CAFFF171
+:108020002404000403E000080000000027BDFFE076
+:10803000AFB00010000581C22603FFD024C5003F69
+:108040002C6223D024C6007FAFB20018AFB1001459
+:10805000AFBF001C309100FF000691C200052982CD
+:1080600002002021104000082403FFFF0E000A5ADE
+:108070000000000002002021022028210E000C48F0
+:1080800002403021000018218FBF001C8FB2001861
+:108090008FB100148FB000100060102103E00008C1
+:1080A00027BD002027BDFFD824A2007FAFB3001C4E
+:1080B000AFB20018000299C2309200FF24A3003F23
+:1080C0000240202102602821AFB10014AFB000109F
+:1080D000AFBF00200E000B7D00038982004080218D
+:1080E000004020210220282114400009000018210E
+:1080F0008FBF00208FB3001C8FB200188FB1001407
+:108100008FB000100060102103E0000827BD002898
+:108110000E000A0B00000000004028210200202170
+:108120001051FFF3001019C00E000A5A00000000A1
+:1081300002002021024028210E000C48026030215C
+:108140008FBF00208FB3001C8FB200188FB10014B6
+:108150008FB00010000018210060102103E000081B
+:1081600027BD00283084FFFF30A5FFFF10800007E7
+:10817000000018213082000110400002000420425B
+:10818000006518211480FFFB0005284003E000086B
+:108190000060102110C00007000000008CA2000049
+:1081A00024C6FFFF24A50004AC82000014C0FFFB1E
+:1081B0002484000403E000080000000010A0000870
+:1081C00024A3FFFFAC8600000000000000000000B8
+:1081D0002402FFFF2463FFFF1462FFFA24840004DB
+:1081E00003E000080000000030A5FFFF8F4201B847
+:1081F0000440FFFE3C07601500A730253C0310003B
+:10820000AF440180AF400184AF46018803E000081D
+:10821000AF4301B88F8500D02C8640000080182124
+:108220008CA700840087102B144000100000000071
+:108230008CA800842D06400050C0000F240340008D
+:108240008CAA0084008A482B512000018CA3008452
+:1082500000035A42000B20803C05080024A558204A
+:108260000085182103E000088C62000014C0FFF4B0
+:10827000000000002403400000035A42000B20804D
+:108280003C05080024A558200085182103E00008BB
+:108290008C6200008F8300D0906600D024C500015E
+:1082A000A06500D08F8500D0906400D090A200D24D
+:1082B0001044001700000000936C00788F8B00BC06
+:1082C000318A00FFA16A000C25490001938700C490
+:1082D000312200FF3048007F1107000B00026827A1
+:1082E000A36200788F4E017805C0FFFE8F9900B021
+:1082F000241800023C0F1000AF590140A35801445C
+:1083000003E00008AF4F01780A000D1831A2008089
+:10831000A0A000D00A000D0E000000008F8700D042
+:1083200027BDFFC8AFBF0030AFB7002CAFB60028E5
+:10833000AFB50024AFB40020AFB3001CAFB200183B
+:10834000AFB10014AFB0001094E300E094E200E29B
+:10835000104300D72405FFFF3C047FFF3497FFFF45
+:108360002415FF800A000DFF3C16000E108A00D174
+:108370008FBF00308F9100B03C1808008F18005C50
+:10838000001230C0001291400311702101D57824F1
+:10839000AF4F002C94EC00E231CD007F01BA5821A0
+:1083A000318A7FFF01764821000A804002091021AE
+:1083B000945300003C0808008D0800580246C02174
+:1083C00032733FFF0013198001032021022428216A
+:1083D00030BF007F03FAC82100B5A024AF54002CA1
+:1083E0000336A0218E8700108E8F0030037858212D
+:1083F000256D008800EF7023240C0002AE8E001063
+:10840000AF8D00ACA16C0088976A003C8E84003070
+:108410008F9100AC0E000CE53150FFFF00024B8045
+:10842000020940253C02420001022025AE2400043E
+:108430008E8300048F8D00AC8E860000240E000811
+:10844000ADA3001CADA60018ADA0000CADA000109F
+:10845000929F000A33F900FFA5B900149685000821
+:108460003C1F000CA5A500169298000A331100FFCE
+:10847000A5B100209690000824180005A5B00022A0
+:10848000ADA00024928F000B2410C00031E700FF44
+:10849000A5A70002A1AE00018E8C00308F8B00AC2E
+:1084A0008F8400B0AD6C00083C0A08008D4A00546F
+:1084B0000144482101354024AF4800283C0208000F
+:1084C0008C4200540044302130C3007F007AC82120
+:1084D000033F282102458821AF9100BCAF8500C031
+:1084E000A23800008F8A00BC2403FFBF2418FFDFDE
+:1084F000954F000201F0382400F37025A54E0002CC
+:10850000914D000231AC003F358B0040A14B000281
+:108510008F8600BC8F8900D0ACC000048D28007C01
+:108520003C098000ACC8000890C4000D3082007F78
+:10853000A0C2000D8F8500BC90BF000D03E3C824CE
+:10854000A0B9000D8F9100BC9233000D02789024E9
+:10855000A232000D8E9000348F8B00BCAD700010E5
+:108560008E87002C8E8F003000EF7023AD6E0014CC
+:10857000916D001831AC007FA16C00188F9F00BC7A
+:108580008E8A00308FE8001801572024010930241A
+:1085900000C41025AFE200189283000AA3E3001C78
+:1085A000969900088F8500BC8F9800D0A4B9001E52
+:1085B0008E9000308E8400300E0002038F05008400
+:1085C0008F8500D0000291400002990090AF00BC5E
+:1085D000025388210040302131E7000210E00003FF
+:1085E00002118021000290800212802190B900BC0B
+:1085F0003327000410E000020006F880021F8021EB
+:108600008E9800308F8B00BC24068000330F00034F
+:10861000000F702331CD0003020D6021AD6C00040A
+:1086200094A400E294AA00E294B000E231497FFFF2
+:108630002522000130537FFF0206182400734025D5
+:10864000A4A800E294A400E23C1408008E94006008
+:1086500030917FFF12340022000000000E000D0553
+:10866000000000008F8700D00000282194F300E074
+:1086700094F000E21213000F8FBF003090E900D099
+:1086800090E800D1313200FF310400FF0244302B6A
+:1086900014C0FF36264A000190EE00D2264B00019E
+:1086A00031CD00FF008D6021158BFF338F9100B01D
+:1086B0008FBF00308FB7002C8FB600288FB50024F5
+:1086C0008FB400208FB3001C8FB200188FB100143C
+:1086D0008FB0001000A0102103E0000827BD003873
+:1086E00094A300E200664024A4A800E290A400E263
+:1086F00090B900E2309100FF0011A1C20014F827E8
+:10870000001F39C03332007F024730250A000DF7C1
+:10871000A0A600E23084FFFF30A5FFFFAF440018A1
+:10872000AF45001C03E000088F42001427BDFFB8CE
+:10873000AFB000208F9000D03084FFFFAFA40010B6
+:10874000AFBF0044AFBE0040AFB7003CAFB600388B
+:10875000AFB50034AFB40030AFB3002CAFB20028D7
+:10876000AFB10024A7A00018920600D1920500D056
+:1087700030C400FF30A300FF0064102B1040012222
+:10878000AFA00014920900D08FB50010312800FF6F
+:108790000088382324F4FFFF0014882B0015982B41
+:1087A00002339024524001268FB40014961E00120A
+:1087B000961F00108FB7001003DFC82300171400A6
+:1087C0000019C400000224030018140302E2B02AB6
+:1087D00052C00001004020210284282B10A000027A
+:1087E000008018210280182100033C0000071C03B0
+:1087F0003064FFFF2C86000914C000020060B8211D
+:10880000241700088E0A0008001769808E09000CE2
+:1088100031ABFFFF3C0C0010016C402527520400D7
+:10882000AF4A0038AF9200B8AF49003CAF480030C3
+:108830000000000000000000000000000000000038
+:108840000000000000000000000000000000000028
+:108850008F4F000031EE002011C0FFFD0017982A55
+:10886000027110240A000E920000B02155E00101AF
+:108870009258000131130080126001CF01202021A5
+:108880009655001232A5FFFF0E000CDAA7B50018AE
+:108890008F9000D00291A02326C800018F9100B8CC
+:1088A0000008B4000016B403262C004002D7782A32
+:1088B0000014882B240B00010180902101F1102469
+:1088C000AF8C00B8AFAB0014104001BC8F8900B072
+:1088D0003C0C08008D8C0054240BFF80921E00D0AD
+:1088E00001895021014B2824921900D0AF4500285E
+:1088F0008E4700103C0808008D0800583C180800FE
+:108900008F18005430E33FFF000321800104302121
+:10891000012658212402FF800162F824920C00D025
+:10892000AF5F002C9248000033D100FF333500FFC9
+:108930000309982100117140001578C0326D007F45
+:1089400001CF382101BA2821318300FF3164007F33
+:108950003C0A000C00AA88210367F0210003314083
+:10896000009A10213108003F3C1F000E00D1C021A9
+:10897000005F982127D900882D150008AF9100C00D
+:10898000AF9900ACAF9800BCAF9300B412A0018ABD
+:1089900000008821240E0001010E4004310D005D0D
+:1089A00011A0FFB2310F00028E4A00283C03008064
+:1089B0003C04FFEFAE6A00008E450024A260000A6E
+:1089C0003488FFFFAE6500049247002C3C1FFF9FD8
+:1089D00037FEFFFFA267000C8E62000C3C180040BF
+:1089E000A267000B0043302500C8C824033E88243A
+:1089F0000238A825AE75000C8E490004AE60001840
+:108A00003C0F00FFAE6900148E4D002C35EEFFFFC9
+:108A10008F8B00B001AE6024AE6C00108E47000852
+:108A2000A660000896450012AE6700208E42000C3A
+:108A300030B03FFF00105180AE6200248E5E001403
+:108A4000014B182130A40001AE7E00288E59001879
+:108A5000000331C200044380AE79002C8E51001C0B
+:108A600000C8F821A67F001CAE71003096580002A5
+:108A70008E550020A678001EAE7500349249003352
+:108A80003130000456000005925000008F8C00D059
+:108A90008D8B007CAE6B0030925000008F8F00BC3D
+:108AA000A1F00000924E003331CD000251A000072A
+:108AB000925E00018F8900BC2418FF809131000074
+:108AC0000311A825A1350000925E00018F9900BC1A
+:108AD0002409FFBF240BFFDFA33E00018F9500BCDC
+:108AE00092B8000D3311007FA2B1000D8F8E00BC33
+:108AF00091D0000D02097824A1CF000D8F8800BC11
+:108B00008E6D0014910A000D2DAC0001000C29405F
+:108B1000014B382400E51825A103000D96420012F0
+:108B20008F8800BC8F8700D0A50200028E4500040C
+:108B300090FF00BC30A400030004302330DE0003AB
+:108B400000BE102133F90002172000022444003433
+:108B50002444003090E200BC00A2302430DF000446
+:108B600017E0000224830004008018218F8F00ACDE
+:108B700024090002AD030004A1E90000924E003F69
+:108B80008F8D00ACA1AE00018F9500AC924C003FE0
+:108B90008E440004A6AC0002976B003C0E000CE56E
+:108BA0003170FFFF00025380020A38253C05420065
+:108BB00000E51825AEA300048F8600AC8E4800386F
+:108BC000ACC800188E440034ACC4001CACC0000C0F
+:108BD000ACC00010A4C00014A4C00016A4C00020A3
+:108BE000A4C00022ACC000248E6400145080000198
+:108BF00024040001ACC400080E000D05241100017E
+:108C00000A000E858F9000D0920F00D2920E00D0F5
+:108C10008FB5001031EB00FF31CD00FF008D6023D8
+:108C2000016C50212554FFFF0014882B0015982B50
+:108C3000023390241640FEDD000000008FB40014C3
+:108C40008FBF00448FBE00403A8200018FB7003CC6
+:108C50008FB600388FB500348FB400308FB3002C3E
+:108C60008FB200288FB100248FB0002003E00008ED
+:108C700027BD004833110020122000EE241500010A
+:108C8000921E00BC241F00010000A82133D900015E
+:108C90001320000DAFBF001C8E4400148E0800840A
+:108CA0000088102B14400002008030218E060084C2
+:108CB0008E03006400C3A82B16A0000200C0202170
+:108CC0008E0400640080A8218E4700148E05006485
+:108CD00000E5302B14C0000200E020218E04006467
+:108CE0000095F02313C000048FAC001C240A00027E
+:108CF000AFAA001C8FAC001C028C582B156000A87A
+:108D0000000018218E4F00388E6D000C3C0E008044
+:108D1000AE6F00008E4A00343C10FF9F01AE582514
+:108D2000AE6A00049246003F360CFFFF016C382407
+:108D30003C0500203C03FFEFA266000B00E5102578
+:108D40003468FFFF8F8700B80048F8243C0400080F
+:108D500003E4C825AE79000C8CF80014AE6000184E
+:108D600002BE7821AE7800148CF10018AE71001CA0
+:108D70008CE90008AE6900248CEE000CAE6F002C6C
+:108D8000AE600028AE6E0020A6600038A660003AF3
+:108D90008CED001401B58023021E902312400011B7
+:108DA000AE72001090EA003D8E6500048E640000F3
+:108DB000000A310000A6C821000010210326402B24
+:108DC0000082F82103E8C021AE790004AE780000EB
+:108DD00090F1003DA271000A8F8900B8953200061B
+:108DE000A67200088F9800AC2419000202A020216E
+:108DF000A31900009769003C8F9200AC0E000CE5AF
+:108E00003131FFFF00027B808F8500B8022F68257B
+:108E10003C0E420001AE8025AE5000048F8400ACB1
+:108E20008CAC0038AC8C00188CAB0034AC8B001CC4
+:108E3000AC80000CAC800010A4800014A48000164C
+:108E4000A4800020A4800022AC80002490A7003FD2
+:108E5000A487000212A001342403000153C00002C1
+:108E600090A2003D90A2003E24480001A08800018D
+:108E70008F9F00ACAFF500088F8300D0240700342B
+:108E8000906600BC30C5000250A0000124070030ED
+:108E90008F9200B88F8A00BC906D00BC924B00008E
+:108EA0002412C00032A50003A14B00008F8600B839
+:108EB0008F8800BC2402000490C4000100451823E0
+:108EC00030790003A10400018F8A00BC8F9F00B895
+:108ED00000F538219558000297E9001200F9382171
+:108EE00003128824312F3FFF022F7025A54E000268
+:108EF0009150000231A80004320C003F358B004035
+:108F0000A14B000212A000028F8500BC00E83821AE
+:108F10008F8E00D0ACA70004240BFFBF8DCD007C4A
+:108F20002EA400012403FFDFACAD000890B0000DBB
+:108F300000044140320C007FA0AC000D8F8600BCC5
+:108F400090CA000D014B1024A0C2000D8F8700BCF9
+:108F500090E5000D00A3F82403E8C825A0F9000D52
+:108F60008F9100B88F8D00BC8E380020ADB80010F6
+:108F70008E290024ADA900148E2F0028ADAF001853
+:108F80008E2E002C0E000D05ADAE001C8FB0001C07
+:108F9000240C0002120C00ED8F9000D08FA3001C57
+:108FA00000608821146000020060A8210000A02158
+:108FB00056A0FE390291A0230014882B8FAE00101A
+:108FC000960700103C0A002001D6F02302C7C021FA
+:108FD00033D2FFFFA6180010AFB20010AF4A003026
+:108FE0000000000096170010961300121277008EF2
+:108FF000001641808E16000C8E0F0008000817C363
+:1090000002C8282100A8582B01E2A82102AB182190
+:10901000AE05000CAE0300088FB300100013B82B90
+:10902000023780241200FF058F9000D00A000E4BFB
+:10903000000000008E480038A6600008240F0003DE
+:10904000AE6800008E4C0034A260000A8F9000B819
+:10905000AE6C00043C050080920B003FA26F000C38
+:109060008E62000C3C11FF9FA26B000B004568252F
+:109070003623FFFF3C04FFEF8F8C00B801A33024A0
+:10908000349FFFFF00DFC824AE79000C8D890014E7
+:10909000959E00128F9800B0AE6900108D8E00145E
+:1090A000AE600018AE600020AE6E0014AE6000240A
+:1090B0008D87001833CE3FFF000E5180AE67002829
+:1090C0008D8800080158902133D00001AE6800302F
+:1090D0008D91000C8F8D00AC001259C200107B8066
+:1090E000016F282124020002A665001CA66000363C
+:1090F000AE71002CA1A200009763003C8F9800ACD9
+:109100003C044200307FFFFF03E43025AF0600043B
+:109110008F9900B824070001240BC0008F3300385A
+:1091200024060034AF1300188F290034AF09001C47
+:10913000AF00000CAF000010A7000014A70000163D
+:10914000A7000020A7000022AF000024A7150002FE
+:10915000A30700018F8A00AC8F9E00B88F8C00BCE3
+:10916000AD55000893C80000A18800008F9200B898
+:109170008F8F00BC92500001A1F000018F8400BCD1
+:1091800094910002022B282400AE1025A482000234
+:10919000908D000231A3003FA08300028F8300D096
+:1091A0008F8400BC907F00BC33F30002526000014A
+:1091B00024060030AC8600048C65007C240DFFBFC3
+:1091C00002A08821AC8500089082000D3043007F0A
+:1091D000A083000D8F8600BC90C4000D008DF82484
+:1091E000A0DF000D8F8E00BC91D9000D3729002023
+:1091F000A1C9000D8F9E00B88F9300BC8FC70020BF
+:10920000AE6700108FD80024AE7800148FCA0028F3
+:10921000AE6A00188FD2002C0E000D05AE72001C35
+:109220000A00104C8F9000D0960200148E040004A7
+:109230003043FFFF000368C0008DF821AF5F003CA2
+:109240008E1900048F46003C032648231920003C59
+:10925000000000008E05000024A200013C0B00105D
+:1092600035750008AF420038AF55003000000000EF
+:1092700000000000000000000000000000000000EE
+:109280000000000000000000000000008F4C000003
+:10929000318F002011E0FFFD000000008F5304001B
+:1092A0003C080020AE1300088F570404AE17000CD2
+:1092B000AF480030000000003C0608008CC60044A7
+:1092C0002416000110D600BB000000009619001201
+:1092D0003C0508008CA5004000B94821A6090012F1
+:1092E000960E001425C70001A60700149618001456
+:1092F0003304FFFF5486FF498FB30010A60000140B
+:109300000E000E2530A5FFFF3C0408008C840024CD
+:10931000961F00120044682303ED3023A6060012B6
+:109320000A0010678FB30010A08300018F8200AC89
+:1093300024040001AC4400080A000FFF8F8300D012
+:109340008E0200000A0010F83C0B00108F9F00C036
+:109350008FB8001C920F00D0920B00D0920D00D05D
+:1093600031F100FF316E00FF000E28C000111140E6
+:109370000045182131A600FF036350210006C940B3
+:10938000033F382125490088AF8900ACAF8700BC76
+:10939000A15800889768003C03C020218F9100AC41
+:1093A0000E000CE53110FFFF00026380020C7825EF
+:1093B0003C0442008F8C00B801E45825AE2B000419
+:1093C0008D9100388F8B00AC00006821000D1100DA
+:1093D000AD7100188D8E00343C087FFF3504FFFF0F
+:1093E000AD6E001C9183003E8D65001C8D790018C8
+:1093F000000331000003870200A6C0210050F825B9
+:109400000306482B033F382100E95021AD78001CAA
+:10941000AD6A0018AD60000CAD600010918F003E89
+:109420002405000503C45024A56F00149591000481
+:1094300003C02021A5710016918E003EA56E00206C
+:10944000958D0004A56D0022AD6000249190003F31
+:10945000A57000029182003D24430001A163000138
+:109460008F8600AC8F9F00BCACDE0008A3E5000037
+:109470008F9000BC8F9900B82405FFBF96070002AB
+:10948000973800120247782433093FFF01E9882505
+:10949000A6110002921200022418FFDF324E003F94
+:1094A00035CD0040A20D00028F8600BC8F8C00D00D
+:1094B0002412FFFFACC000048D8B007C3C0C8000AC
+:1094C000ACCB000890C2000D3043007FA0C3000D5C
+:1094D0008F8700BC90FF000D03E5C824A0F9000DA4
+:1094E0008F9100BC9229000D01387824A22F000D25
+:1094F0008F9000BCAE120010AE150014920E001832
+:109500002415FF8002AE6825A20D00188F8500BCCF
+:109510008F8300B88CAB0018016C1024004A3025F2
+:10952000ACA600189068003EA0A8001C8F9F00B851
+:109530008F8700BC8F9800D097F90004A4F9001E13
+:109540000E0002038F0500848F8600D00002794050
+:109550000002490090D200BC01E988210040282186
+:109560003255000212A0000303D120210002A8807E
+:109570000095202190CC00BC3192000412400003E1
+:1095800033C900030005408000882021241900040D
+:109590008F9E00BC0329382330F800030098502127
+:1095A000AFCA00040E000D05A66500380A0010477A
+:1095B0008F9000D0960A00123C1E08008FDE002417
+:1095C00003CA9021A61200120A0010678FB3001080
+:1095D00027BDFFE03C1808008F180050AFB0001006
+:1095E000AFBF0018AFB10014AF8400B09371007426
+:1095F000030478212410FF8031EE007F3225007FA4
+:1096000001F0582401DA68213C0C000AA38500C44B
+:1096100001AC2821AF4B002494A9001097680006E4
+:1096200090A6006200803821240200300109202326
+:1096300030C300F0AF8500D0106200193090FFFFFA
+:1096400090AE0062240DFFF0240A005001AE6024A9
+:10965000318B00FF116A002F000000001600000788
+:10966000241F0C00AF5F00248FB100148FBF0018BF
+:109670008FB0001003E0000827BD00200E000E2B65
+:1096800002002021241F0C00AF5F00248FB10014C2
+:109690008FBF00188FB0001003E0000827BD002026
+:1096A00094A200E094A400E290BF01130082182667
+:1096B0003079FFFF33E700C014E000092F310001CB
+:1096C00016000038000000005620FFE6241F0C00A2
+:1096D0000E000D27000000000A0011F9241F0C00E5
+:1096E0001620FFDE000000000E000D270000000025
+:1096F0001440FFDC241F0C00160000228F8300D0D2
+:10970000906901133122003FA06201130A0011F990
+:10971000241F0C0094AF00D48F8600D400E02821D1
+:10972000240400050E000C6B31F0FFFF144000050F
+:1097300024030003979100E6000018212625FFFF6F
+:10974000A78500E68F5801B80700FFFE3C1960139B
+:10975000AF400180241F0C00AF50018400793825F0
+:109760003C101000AF4701888FB10014AF5001B812
+:10977000AF5F00248FB000108FBF001803E0000817
+:1097800027BD00200E000E2B020020215040FFB507
+:10979000241F0C008F8300D0906901130A0012224D
+:1097A0003122003F0E000E2B020020211440FFAD9D
+:1097B000241F0C00122000078F8300D09068011333
+:1097C0003106003F34C20040A06201130A0011F9C3
+:1097D000241F0C000E000D27000000005040FFA1C8
+:1097E000241F0C008F8300D0906801133106003FC6
+:1097F0000A00125234C20040AF9B00C803E00008C8
+:10980000AF8000EC3089FFFF000940422D0200418B
+:10981000000929801440000200095040240800403B
+:10982000000879400008C0C001F85821256701A848
+:1098300000EF702125CC007F240DFF80018D1824BE
+:109840000065302100CA282125640088240A008888
+:109850003C010800AC2A004C3C010800AC2400503C
+:10986000AF8500D43C010800AC2900603C01080031
+:10987000AC2800643C010800AC2700543C010800FF
+:10988000AC2300583C010800AC26005C03E0000853
+:1098900000000000308300FF30C6FFFF30E400FF0F
+:1098A0008F4201B80440FFFE00034C00012438251C
+:1098B0003C08600000E820253C031000AF45018013
+:1098C000AF460184AF44018803E00008AF4301B80C
+:1098D0008F86001C3C096012352700108CCB0004D9
+:1098E0003C0C600E35850010316A00062D480001E1
+:1098F000ACE800C48CC40004ACA431808CC2000865
+:1099000094C30002ACA2318403E00008A78300E402
+:109910003C0308008C6300508F8400E88F86001C95
+:109920002402FF800064C0210302C824AF5900282C
+:109930008CCD00043305007F00BA78213C0E000C6A
+:1099400001EE2821ACAD00588CC80008AF8500D0CE
+:109950003C076012ACA8005C8CCC001034E800100E
+:10996000ACAC000C8CCB000CACAB000894AA00147F
+:109970003C0208008C42004425490001A4A90014BF
+:1099800094A400143083FFFF106200178F8400D06E
+:109990003C0A08008D4A0040A4AA00128CCE001890
+:1099A000AC8E00248CCD0014AC8D00208CC7001828
+:1099B000AC87002C8CCC001424060001AC8C002851
+:1099C0008D0B00BC5166001A8D0200B48D0200B8E8
+:1099D000A482003A948F003AA48F003C948800D46B
+:1099E00003E000083102FFFF3C0908008D29002434
+:1099F000A4A000148F8400D0A4A900128CCE00185B
+:109A0000AC8E00248CCD0014AC8D00208CC70018C7
+:109A1000AC87002C8CCC001424060001AC8C0028F0
+:109A20008D0B00BC5566FFEA8D0200B88D0200B4B4
+:109A3000A482003A948F003AA48F003C948800D40A
+:109A400003E000083102FFFF8F86001C3C0C080079
+:109A50008D8C0050240BFF808CCD00083C03000C43
+:109A6000000D51C0018A4021010B4824AF8A00E853
+:109A7000AF49002890C700073105007F00BA1021C8
+:109A80000043282130E400041080002FAF8500D06F
+:109A900090CF000731EE000811C0003C000000002C
+:109AA0008CD9000C8CC400140324C02B1300002696
+:109AB000000000008CC2000CACA200648CCD001829
+:109AC0002402FFF8ACAD00688CCC0010ACAC008078
+:109AD0008CCB000CACAB00848CCA001CACAA007C04
+:109AE00090A900BC01224024A0A800BC90C300079C
+:109AF0003067000810E000048F8500D090AF00BCF4
+:109B000035EE0001A0AE00BC90D90007333800014B
+:109B10001300000F8F8400D024070020908200BC27
+:109B200034490002A08900BC8F8400D09088006274
+:109B3000310300F014670006240A0034AC8A00C028
+:109B40000A001334000000000A00130E8CC2001437
+:109B500090CB00073166000210C000050000000035
+:109B6000908D00BC35AC0004A08C00BC8F8400D06C
+:109B700090980113330F003FA08F01138F8E00D0F8
+:109B800095C500D403E0000830A2FFFFACA000643C
+:109B90000A00130F0000000027BDFFD8AFB000106F
+:109BA0008F90001CAFBF0024AFB40020AFB20018EC
+:109BB000AFB10014AFB3001C9613000E3C07600A4F
+:109BC0003C1460063264FFFF369300100E001261F1
+:109BD00034F404108F8400D43C11600E0E0009AAE6
+:109BE00036310010920E00153C0708008CE700602B
+:109BF0003C12601231CD000FA38D00F08E0E0004D8
+:109C00008E0D000896080012961F00109619001A73
+:109C10009618001E960F001C310CFFFF33EBFFFF60
+:109C2000332AFFFF3309FFFF31E6FFFF3C01080045
+:109C3000AC2B00403C010800AC2C00243C01080087
+:109C4000AC2A0044AE293178AE26317C9202001550
+:109C50009603001636520010304400FF3065FFFFB7
+:109C60003C0608008CC60064AE243188AE4500B4C2
+:109C70009208001496190018241F0001011FC00447
+:109C8000332FFFFF3C0508008CA50058AE5800B8E4
+:109C9000AE4F00BC920C0014AF8E00D8AF8D00DC2C
+:109CA000318B00FFAE4B00C0920A0015AE67004832
+:109CB000AE66004C314900FFAE4900C8AE65007C7D
+:109CC0003C0308008C6300503C0408008C84004C6A
+:109CD0003C0808008D0800543C0208008C42005CDF
+:109CE0008FBF0024AE6300808FB00010AE8300747D
+:109CF0008FB3001CAE22319CAE4200DCAE2731A0F7
+:109D0000AE2631A4AE24318CAE233190AE283194EE
+:109D1000AE253198AE870050AE860054AE850070F7
+:109D20008FB10014AE4700E0AE4600E4AE4400CC74
+:109D3000AE4300D0AE4800D4AE4500D88FB400206A
+:109D40008FB2001803E0000827BD002827BDFFE000
+:109D5000AFB10014AFBF0018241100010E00085469
+:109D6000AFB0001010510005978400E6978300CC37
+:109D70000083102B144000088F8500D424070002B4
+:109D80008FBF00188FB100148FB0001000E01021B9
+:109D900003E0000827BD00200E000C892404000504
+:109DA000AF8200E81040FFF6240700020E000858BA
+:109DB0008F90001C979F00E68F9900E88F8D00C858
+:109DC00027EF0001240E0050AF590020A78F00E6B6
+:109DD000A1AE00003C0C08008D8C00648F8600C88A
+:109DE000240A8000000C5E00ACCB0074A4C0000606
+:109DF00094C9000A241FFF803C0D000C012AC024D6
+:109E0000A4D8000A90C8000A24182000011F1825B1
+:109E1000A0C3000A8F8700C8A0E000788F8500C823
+:109E200000003821A0A000833C0208008C420050B2
+:109E30008F8400E80044782101FFC824AF5900282E
+:109E4000960B000231EE007F01DA6021018D302196
+:109E5000A4CB00D4960A0002AF8600D03C0E0004CA
+:109E600025492401A4C900E68E080004ACC80004FA
+:109E70008E030008ACC30000A4C00010A4C00014EE
+:109E8000A0C000D08F8500D02403FFBFA0A000D1C8
+:109E90003C0408008C8400648F8200D0A04400D26F
+:109EA0008E1F000C8F8A00D0978F00E4AD5F001CDE
+:109EB0008E19001024100030AD590018A540003054
+:109EC000A5510054A5510056A54F0016AD4E00688F
+:109ED000AD580080AD580084914D006231AC000F48
+:109EE000358B0010A14B00628F8600D090C90063B3
+:109EF0003128007FA0C800638F8400D02406FFFFB4
+:109F00009085006300A31024A08200638F9100D08D
+:109F100000E01021923F00BC37F90001A23900BCDB
+:109F20008F8A00D0938F00F0AD580064AD5000C010
+:109F3000914E00D3000F690031CC000F018D5825E0
+:109F4000A14B00D38F8500D08F8900DCACA900E83D
+:109F50008F8800D88FBF00188FB100148FB0001009
+:109F600027BD0020ACA800ECA4A600D6A4A000E069
+:109F7000A4A000E203E000080000000027BDFFE00D
+:109F8000AFB000108F90001CAFB10014AFBF00182D
+:109F90008E1900043C1808008F180050240FFF8011
+:109FA000001989C00238702131CD007F01CF6024B3
+:109FB00001BA50213C0B000CAF4C0028014B402152
+:109FC000950900D4950400D68E0700043131FFFFB7
+:109FD000AF8800D00E000922000721C08E060004C1
+:109FE0008F8300C8000629C0AF4500209064003E62
+:109FF00030820040144000068F8400D0341FFFFFE1
+:10A00000948300D63062FFFF145F0004000000005C
+:10A01000948400D60E0008B73084FFFF8E0500043C
+:10A02000022030218FBF00188FB100148FB00010B4
+:10A030002404002200003821000529C00A001285EE
+:10A0400027BD002027BDFFE0AFB100143091FFFF16
+:10A05000AFB00010AFBF00181220001D000080211B
+:10A060008F86001C8CC500002403000600053F02FB
+:10A070000005140230E4000714830015304500FF8A
+:10A080002CA800061100004D000558803C0C08006B
+:10A09000258C57E8016C50218D49000001200008F3
+:10A0A000000000008F8E00EC240D000111CD00593E
+:10A0B00000000000260B00013170FFFF24CA0020C1
+:10A0C0000211202B014030211480FFE6AF8A001CD2
+:10A0D000020010218FBF00188FB100148FB0001044
+:10A0E00003E0000827BD0020938700CE14E000386D
+:10A0F000240400140E001346000000008F86001C8C
+:10A10000240200010A00148DAF8200EC8F8900EC5C
+:10A11000240800021128003B240400130000282119
+:10A1200000003021240700010E001285000000000D
+:10A130000A00148D8F86001C8F8700EC2405000216
+:10A1400014E5FFF6240400120E0012F200000000D5
+:10A150008F8500E800403021240400120E00128593
+:10A16000000038210A00148D8F86001C8F8300ECBC
+:10A17000241F0003147FFFD0260B00010E0012A441
+:10A18000000000008F8500E800403021240200021A
+:10A190002404001000003821AF8200EC0E0012856C
+:10A1A000000000000A00148D8F86001C8F8F00ECC9
+:10A1B0002406000211E6000B000000002404001039
+:10A1C00000002821000030210A0014AA2407000101
+:10A1D000000028210E001285000030210A00148D95
+:10A1E0008F86001C0E0013B3000000001440001204
+:10A1F0008F99001C8F86001C240200030A00148D16
+:10A20000AF8200EC0E00143F000000000A00148D25
+:10A210008F86001C0E001294000000002402000231
+:10A2200024040014000028210000302100003821FF
+:10A230000A0014C7AF8200EC00403821240400104B
+:10A2400097380002000028210E0012853306FFFF18
+:10A250000A00148D8F86001C8F8400C83C077FFF86
+:10A2600034E6FFFF8C8500742402000100A6182448
+:10A27000AC83007403E00008A082000510A0003643
+:10A280002CA20080274A04003C0B00052409008012
+:10A29000104000072408008030A6000F00C54021B0
+:10A2A0002D0300811460000200A0482124080080D2
+:10A2B000AF4B003000000000000000000000000074
+:10A2C0001100000900003821014030218C8D000070
+:10A2D00024E7000400E8602BACCD000024840004D7
+:10A2E0001580FFFA24C600040000000000000000F2
+:10A2F000000000003C0E0006010E3825AF4700307C
+:10A300000000000000000000000000008F4F00006F
+:10A3100031E800101100FFFD000000008F42003CFA
+:10A320008F43003C0049C8210323C02B13000004C5
+:10A33000000000008F4C003825860001AF46003831
+:10A340008F47003C00A9282300E96821AF4D003C5D
+:10A3500014A0FFCE2CA2008003E000080000000043
+:10A3600027BDFFD03C020002AFB100143C11000C2D
+:10A37000AF450038AFB3001CAF46003C00809821C9
+:10A38000AF42003024050088AF440028035120214B
+:10A39000AFBF0028AFB50024AFB40020AFB20018A3
+:10A3A0000E0014FFAFB000103C1F08008FFF004CE0
+:10A3B0003C1808008F1800642410FF8003F3A821C4
+:10A3C00032B9007F02B078240018A0C0033A70218F
+:10A3D0000018914001D12021AF4F00280E0014FF3A
+:10A3E000025428213C0D08008DAD005024050120A9
+:10A3F00001B35821316C007F01705024019A48212B
+:10A40000013120210E0014FFAF4A00283C0808004B
+:10A410008D0800543C0508008CA500640113382108
+:10A4200030E6007F00F0182400DA2021009120217E
+:10A43000AF4300280E0014FF000529403C0208002D
+:10A440008C4200583C1008008E1000601200001C66
+:10A45000005388212415FF800A0015823C14000C4B
+:10A460003226007F0235182400DA202102402821FC
+:10A47000AF430028009420210E0014FF2610FFC0D7
+:10A480001200000F023288212E05004110A0FFF4B7
+:10A49000241210003226007F00109180023518240B
+:10A4A00000DA202102402821AF4300280094202117
+:10A4B0000E0014FF000080211600FFF302328821F5
+:10A4C0003C0B08008D6B005C240AFF802405000211
+:10A4D00001734021010A4824AF4900283C040800C8
+:10A4E000948400623110007F021A88213C07000C1E
+:10A4F0000E000CB90227982100402821026020217B
+:10A500008FBF00288FB500248FB400208FB3001CAC
+:10A510008FB200188FB100148FB000100A0014FF22
+:10A5200027BD00308F83001C8C62000410400003A4
+:10A530000000000003E00008000000008C64001030
+:0CA540008C6500080A0015388C66000CC1
+:04A54C00000000000B
+:10A550000000001B0000000F0000000A00000008BF
+:10A5600000000006000000050000000500000004D7
+:10A5700000000004000000030000000300000003CE
+:10A5800000000003000000030000000200000002C1
+:10A5900000000002000000020000000200000002B3
+:10A5A00000000002000000020000000200000002A3
+:10A5B0000000000200000002000000020000000293
+:10A5C0000000000200000001000000010000000186
+:10A5D00008000F3008000D8808000FC40800106C38
+:10A5E00008000F5808000F98080011A408000DA4D7
+:10A5F000080011C808000DF4080014980800144061
+:10A6000008000DA408000DA408000DA408001254B1
+:10A610000800125408000DA408000DA4080016E05C
+:10A6200008000DA408000DA408000DA408000DA446
+:10A63000080013D408000DA408000DA408000DA400
+:10A6400008000DA408000DA408000DA408000DA426
+:10A6500008000DA408000DA408000DA408000DA416
+:10A6600008000DA408000DA408000DA408000FB8F0
+:10A6700008000DA408000DA40800169008000DA401
+:10A6800008000DA408000DA408000DA408000DA4E6
+:10A6900008000DA408000DA408000DA408000DA4D6
+:10A6A00008000DA408000DA408000DA408000DA4C6
+:10A6B00008000DA408000DA408000DA408000DA4B6
+:10A6C000080015BC08000DA408000DA408001348DC
+:10A6D000080012B808002E5008002E5808002E203E
+:10A6E00008002E2C08002E3808002E440800532C99
+:10A6F000080052EC080052B80800528C080052685A
+:04A7000008005224D7
+:0CA704000A000C760000000000000000BD
+:10A710000000000D727870342E362E3136000000A5
+:10A72000040610030000000000000001000000000B
+:10A730000000000000000000000000000000000019
+:10A740000000000000000000000000000000000009
+:10A7500000000000000000000000000000000000F9
+:10A7600000000000000000000000000000000000E9
+:10A7700000000000000000000000000000000000D9
+:10A7800000000000000000000000000000000000C9
+:10A7900000000000000000000000000000000000B9
+:10A7A00000000000000000000000000000000000A9
+:10A7B0000000000000000000000000000000000099
+:10A7C0000000000000000000000000000000000089
+:10A7D0000000000000000000000000000000000079
+:10A7E0000000000000000000000000000000000069
+:10A7F0000000000000000000000000000000000059
+:10A800000000000000000000000000000000000048
+:10A810000000000000000000000000000000000038
+:10A820000000000000000000000000000000000028
+:10A830000000000000000000000000000000000018
+:10A840000000000000000000000000000000000008
+:10A8500000000000000000000000000000000000F8
+:10A8600000000000000000000000000000000000E8
+:10A8700000000000000000000000000000000000D8
+:10A8800000000000000000000000000000000000C8
+:10A8900000000000000000000000000000000000B8
+:10A8A00000000000000000000000000000000000A8
+:10A8B0000000000000000000000000000000000098
+:10A8C0000000000000000000000000000000000088
+:10A8D0000000000000000000000000000000000078
+:10A8E0000000000000000000000000000000000068
+:10A8F0000000000000000000000000000000000058
+:10A900000000000000000000000000000000000047
+:10A910000000000000000000000000000000000037
+:10A920000000000000000000000000000000000027
+:10A930000000000000000000000000000000000017
+:10A940000000000000000000000000000000000007
+:10A9500000000000000000000000000000000000F7
+:10A9600000000000000000000000000000000000E7
+:10A9700000000000000000000000000000000000D7
+:10A9800000000000000000000000000000000000C7
+:10A9900000000000000000000000000000000000B7
+:10A9A00000000000000000000000000000000000A7
+:10A9B0000000000000000000000000000000000097
+:10A9C0000000000000000000000000000000000087
+:10A9D0000000000000000000000000000000000077
+:10A9E0000000000000000000000000000000000067
+:10A9F0000000000000000000000000000000000057
+:10AA00000000000000000000000000000000000046
+:10AA10000000000000000000000000000000000036
+:10AA20000000000000000000000000000000000026
+:10AA30000000000000000000000000000000000016
+:10AA40000000000000000000000000000000000006
+:10AA500000000000000000000000000000000000F6
+:10AA600000000000000000000000000000000000E6
+:10AA700000000000000000000000000000000000D6
+:10AA800000000000000000000000000000000000C6
+:10AA900000000000000000000000000000000000B6
+:10AAA00000000000000000000000000000000000A6
+:10AAB0000000000000000000000000000000000096
+:10AAC0000000000000000000000000000000000086
+:10AAD0000000000000000000000000000000000076
+:10AAE0000000000000000000000000000000000066
+:10AAF0000000000000000000000000000000000056
+:10AB00000000000000000000000000000000000045
+:10AB10000000000000000000000000000000000035
+:10AB20000000000000000000000000000000000025
+:10AB30000000000000000000000000000000000015
+:10AB40000000000000000000000000000000000005
+:10AB500000000000000000000000000000000000F5
+:10AB600000000000000000000000000000000000E5
+:10AB700000000000000000000000000000000000D5
+:10AB800000000000000000000000000000000000C5
+:10AB900000000000000000000000000000000000B5
+:10ABA00000000000000000000000000000000000A5
+:10ABB0000000000000000000000000000000000095
+:10ABC0000000000000000000000000000000000085
+:10ABD0000000000000000000000000000000000075
+:10ABE0000000000000000000000000000000000065
+:10ABF0000000000000000000000000000000000055
+:10AC00000000000000000000000000000000000044
+:10AC10000000000000000000000000000000000034
+:10AC20000000000000000000000000000000000024
+:10AC30000000000000000000000000000000000014
+:10AC40000000000000000000000000000000000004
+:10AC500000000000000000000000000000000000F4
+:10AC600000000000000000000000000000000000E4
+:10AC700000000000000000000000000000000000D4
+:10AC800000000000000000000000000000000000C4
+:10AC900000000000000000000000000000000000B4
+:10ACA00000000000000000000000000000000000A4
+:10ACB0000000000000000000000000000000000094
+:10ACC0000000000000000000000000000000000084
+:10ACD0000000000000000000000000000000000074
+:10ACE0000000000000000000000000000000000064
+:10ACF0000000000000000000000000000000000054
+:10AD00000000000000000000000000000000000043
+:10AD10000000000000000000000000000000000033
+:10AD20000000000000000000000000000000000023
+:10AD30000000000000000000000000000000000013
+:10AD40000000000000000000000000000000000003
+:10AD500000000000000000000000000000000000F3
+:10AD600000000000000000000000000000000000E3
+:10AD700000000000000000000000000000000000D3
+:10AD800000000000000000000000000000000000C3
+:10AD900000000000000000000000000000000000B3
+:10ADA00000000000000000000000000000000000A3
+:10ADB0000000000000000000000000000000000093
+:10ADC0000000000000000000000000000000000083
+:10ADD0000000000000000000000000000000000073
+:10ADE0000000000000000000000000000000000063
+:10ADF0000000000000000000000000000000000053
+:10AE00000000000000000000000000000000000042
+:10AE10000000000000000000000000000000000032
+:10AE20000000000000000000000000000000000022
+:10AE30000000000000000000000000000000000012
+:10AE40000000000000000000000000000000000002
+:10AE500000000000000000000000000000000000F2
+:10AE600000000000000000000000000000000000E2
+:10AE700000000000000000000000000000000000D2
+:10AE800000000000000000000000000000000000C2
+:10AE900000000000000000000000000000000000B2
+:10AEA00000000000000000000000000000000000A2
+:10AEB0000000000000000000000000000000000092
+:10AEC0000000000000000000000000000000000082
+:10AED0000000000000000000000000000000000072
+:10AEE0000000000000000000000000000000000062
+:10AEF0000000000000000000000000000000000052
+:10AF00000000000000000000000000000000000041
+:10AF10000000000000000000000000000000000031
+:10AF20000000000000000000000000000000000021
+:10AF30000000000000000000000000000000000011
+:10AF40000000000000000000000000000000000001
+:10AF500000000000000000000000000000000000F1
+:10AF600000000000000000000000000000000000E1
+:10AF700000000000000000000000000000000000D1
+:10AF800000000000000000000000000000000000C1
+:10AF900000000000000000000000000000000000B1
+:10AFA00000000000000000000000000000000000A1
+:10AFB0000000000000000000000000000000000091
+:10AFC0000000000000000000000000000000000081
+:10AFD0000000000000000000000000000000000071
+:10AFE0000000000000000000000000000000000061
+:10AFF0000000000000000000000000000000000051
+:10B000000000000000000000000000000000000040
+:10B010000000000000000000000000000000000030
+:10B020000000000000000000000000000000000020
+:10B030000000000000000000000000000000000010
+:10B040000000000000000000000000000000000000
+:10B0500000000000000000000000000000000000F0
+:10B0600000000000000000000000000000000000E0
+:10B0700000000000000000000000000000000000D0
+:10B0800000000000000000000000000000000000C0
+:10B0900000000000000000000000000000000000B0
+:10B0A00000000000000000000000000000000000A0
+:10B0B0000000000000000000000000000000000090
+:10B0C0000000000000000000000000000000000080
+:10B0D0000000000000000000000000000000000070
+:10B0E0000000000000000000000000000000000060
+:10B0F0000000000000000000000000000000000050
+:10B10000000000000000000000000000000000003F
+:10B11000000000000000000000000000000000002F
+:10B12000000000000000000000000000000000001F
+:10B13000000000000000000000000000000000000F
+:10B1400000000000000000000000000000000000FF
+:10B1500000000000000000000000000000000000EF
+:10B1600000000000000000000000000000000000DF
+:10B1700000000000000000000000000000000000CF
+:10B1800000000000000000000000000000000000BF
+:10B1900000000000000000000000000000000000AF
+:10B1A000000000000000000000000000000000009F
+:10B1B000000000000000000000000000000000008F
+:10B1C000000000000000000000000000000000007F
+:10B1D000000000000000000000000000000000006F
+:10B1E000000000000000000000000000000000005F
+:10B1F000000000000000000000000000000000004F
+:10B20000000000000000000000000000000000003E
+:10B21000000000000000000000000000000000002E
+:10B22000000000000000000000000000000000001E
+:10B23000000000000000000000000000000000000E
+:10B2400000000000000000000000000000000000FE
+:10B2500000000000000000000000000000000000EE
+:10B2600000000000000000000000000000000000DE
+:10B2700000000000000000000000000000000000CE
+:10B2800000000000000000000000000000000000BE
+:10B2900000000000000000000000000000000000AE
+:10B2A000000000000000000000000000000000009E
+:10B2B000000000000000000000000000000000008E
+:10B2C000000000000000000000000000000000007E
+:10B2D000000000000000000000000000000000006E
+:10B2E000000000000000000000000000000000005E
+:10B2F000000000000000000000000000000000004E
+:10B30000000000000000000000000000000000003D
+:10B31000000000000000000000000000000000002D
+:10B32000000000000000000000000000000000001D
+:10B33000000000000000000000000000000000000D
+:10B3400000000000000000000000000000000000FD
+:10B3500000000000000000000000000000000000ED
+:10B3600000000000000000000000000000000000DD
+:10B3700000000000000000000000000000000000CD
+:10B3800000000000000000000000000000000000BD
+:10B3900000000000000000000000000000000000AD
+:10B3A000000000000000000000000000000000009D
+:10B3B000000000000000000000000000000000008D
+:10B3C000000000000000000000000000000000007D
+:10B3D000000000000000000000000000000000006D
+:10B3E000000000000000000000000000000000005D
+:10B3F000000000000000000000000000000000004D
+:10B40000000000000000000000000000000000003C
+:10B41000000000000000000000000000000000002C
+:10B42000000000000000000000000000000000001C
+:10B43000000000000000000000000000000000000C
+:10B4400000000000000000000000000000000000FC
+:10B4500000000000000000000000000000000000EC
+:10B4600000000000000000000000000000000000DC
+:10B4700000000000000000000000000000000000CC
+:10B4800000000000000000000000000000000000BC
+:10B4900000000000000000000000000000000000AC
+:10B4A000000000000000000000000000000000009C
+:10B4B000000000000000000000000000000000008C
+:10B4C000000000000000000000000000000000007C
+:10B4D000000000000000000000000000000000006C
+:10B4E000000000000000000000000000000000005C
+:10B4F000000000000000000000000000000000004C
+:10B50000000000000000000000000000000000003B
+:10B51000000000000000000000000000000000002B
+:10B52000000000000000000000000000000000001B
+:10B53000000000000000000000000000000000000B
+:10B5400000000000000000000000000000000000FB
+:10B5500000000000000000000000000000000000EB
+:10B5600000000000000000000000000000000000DB
+:10B5700000000000000000000000000000000000CB
+:10B5800000000000000000000000000000000000BB
+:10B5900000000000000000000000000000000000AB
+:10B5A000000000000000000000000000000000009B
+:10B5B000000000000000000000000000000000008B
+:10B5C000000000000000000000000000000000007B
+:10B5D000000000000000000000000000000000006B
+:10B5E000000000000000000000000000000000005B
+:10B5F000000000000000000000000000000000004B
+:10B60000000000000000000000000000000000003A
+:10B61000000000000000000000000000000000002A
+:10B62000000000000000000000000000000000001A
+:10B63000000000000000000000000000000000000A
+:10B6400000000000000000000000000000000000FA
+:10B6500000000000000000000000000000000000EA
+:10B6600000000000000000000000000000000000DA
+:10B6700000000000000000000000000000000000CA
+:10B6800000000000000000000000000000000000BA
+:10B6900000000000000000000000000000000000AA
+:10B6A000000000000000000000000000000000009A
+:10B6B000000000000000000000000000000000008A
+:10B6C000000000000000000000000000000000007A
+:10B6D000000000000000000000000000000000006A
+:10B6E000000000000000000000000000000000005A
+:10B6F000000000000000000000000000000000004A
+:10B700000000000000000000000000000000000039
+:10B710000000000000000000000000000000000029
+:10B720000000000000000000000000000000000019
+:10B730000000000000000000000000000000000009
+:10B7400000000000000000000000000000000000F9
+:10B7500000000000000000000000000000000000E9
+:10B7600000000000000000000000000000000000D9
+:10B7700000000000000000000000000000000000C9
+:10B7800000000000000000000000000000000000B9
+:10B7900000000000000000000000000000000000A9
+:10B7A0000000000000000000000000000000000099
+:10B7B0000000000000000000000000000000000089
+:10B7C0000000000000000000000000000000000079
+:10B7D0000000000000000000000000000000000069
+:10B7E0000000000000000000000000000000000059
+:10B7F0000000000000000000000000000000000049
+:10B800000000000000000000000000000000000038
+:10B810000000000000000000000000000000000028
+:10B820000000000000000000000000000000000018
+:10B830000000000000000000000000000000000008
+:10B8400000000000000000000000000000000000F8
+:10B8500000000000000000000000000000000000E8
+:10B8600000000000000000000000000000000000D8
+:10B8700000000000000000000000000000000000C8
+:10B8800000000000000000000000000000000000B8
+:10B8900000000000000000000000000000000000A8
+:10B8A0000000000000000000000000000000000098
+:10B8B0000000000000000000000000000000000088
+:10B8C0000000000000000000000000000000000078
+:10B8D0000000000000000000000000000000000068
+:10B8E0000000000000000000000000000000000058
+:10B8F0000000000000000000000000000000000048
+:10B900000000000000000000000000000000000037
+:10B910000000000000000000000000000000000027
+:10B920000000000000000000000000000000000017
+:10B930000000000000000000000000000000000007
+:10B9400000000000000000000000000000000000F7
+:10B9500000000000000000000000000000000000E7
+:10B9600000000000000000000000000000000000D7
+:10B9700000000000000000000000000000000000C7
+:10B9800000000000000000000000000000000000B7
+:10B9900000000000000000000000000000000000A7
+:10B9A0000000000000000000000000000000000097
+:10B9B0000000000000000000000000000000000087
+:10B9C0000000000000000000000000000000000077
+:10B9D0000000000000000000000000000000000067
+:10B9E0000000000000000000000000000000000057
+:10B9F0000000000000000000000000000000000047
+:10BA00000000000000000000000000000000000036
+:10BA10000000000000000000000000000000000026
+:10BA20000000000000000000000000000000000016
+:10BA30000000000000000000000000000000000006
+:10BA400000000000000000000000000000000000F6
+:10BA500000000000000000000000000000000000E6
+:10BA600000000000000000000000000000000000D6
+:10BA700000000000000000000000000000000000C6
+:10BA800000000000000000000000000000000000B6
+:10BA900000000000000000000000000000000000A6
+:10BAA0000000000000000000000000000000000096
+:10BAB0000000000000000000000000000000000086
+:10BAC0000000000000000000000000000000000076
+:10BAD0000000000000000000000000000000000066
+:10BAE0000000000000000000000000000000000056
+:10BAF0000000000000000000000000000000000046
+:10BB00000000000000000000000000000000000035
+:10BB10000000000000000000000000000000000025
+:10BB20000000000000000000000000000000000015
+:10BB30000000000000000000000000000000000005
+:10BB400000000000000000000000000000000000F5
+:10BB500000000000000000000000000000000000E5
+:10BB600000000000000000000000000000000000D5
+:10BB700000000000000000000000000000000000C5
+:10BB800000000000000000000000000000000000B5
+:10BB900000000000000000000000000000000000A5
+:10BBA0000000000000000000000000000000000095
+:10BBB0000000000000000000000000000000000085
+:10BBC0000000000000000000000000000000000075
+:10BBD0000000000000000000000000000000000065
+:10BBE0000000000000000000000000000000000055
+:10BBF0000000000000000000000000000000000045
+:10BC00000000000000000000000000000000000034
+:10BC10000000000000000000000000000000000024
+:10BC20000000000000000000000000000000000014
+:10BC30000000000000000000000000000000000004
+:10BC400000000000000000000000000000000000F4
+:10BC500000000000000000000000000000000000E4
+:10BC600000000000000000000000000000000000D4
+:10BC700000000000000000000000000000000000C4
+:10BC800000000000000000000000000000000000B4
+:10BC900000000000000000000000000000000000A4
+:10BCA0000000000000000000000000000000000094
+:10BCB0000000000000000000000000000000000084
+:10BCC0000000000000000000000000000000000074
+:10BCD0000000000000000000000000000000000064
+:10BCE0000000000000000000000000000000000054
+:10BCF0000000000000000000000000000000000044
+:10BD00000000000000000000000000000000000033
+:10BD10000000000000000000000000000000000023
+:10BD20000000000000000000000000000000000013
+:10BD30000000000000000000000000000000000003
+:10BD400000000000000000000000000000000000F3
+:10BD500000000000000000000000000000000000E3
+:10BD600000000000000000000000000000000000D3
+:10BD700000000000000000000000000000000000C3
+:10BD800000000000000000000000000000000000B3
+:10BD900000000000000000000000000000000000A3
+:10BDA0000000000000000000000000000000000093
+:10BDB0000000000000000000000000000000000083
+:10BDC0000000000000000000000000000000000073
+:10BDD0000000000000000000000000000000000063
+:10BDE0000000000000000000000000000000000053
+:10BDF0000000000000000000000000000000000043
+:10BE00000000000000000000000000000000000032
+:10BE10000000000000000000000000000000000022
+:10BE20000000000000000000000000000000000012
+:10BE30000000000000000000000000000000000002
+:10BE400000000000000000000000000000000000F2
+:10BE500000000000000000000000000000000000E2
+:10BE600000000000000000000000000000000000D2
+:10BE700000000000000000000000000000000000C2
+:10BE800000000000000000000000000000000000B2
+:10BE900000000000000000000000000000000000A2
+:10BEA0000000000000000000000000000000000092
+:10BEB0000000000000000000000000000000000082
+:10BEC0000000000000000000000000000000000072
+:10BED0000000000000000000000000000000000062
+:10BEE0000000000000000000000000000000000052
+:10BEF0000000000000000000000000000000000042
+:10BF00000000000000000000000000000000000031
+:10BF10000000000000000000000000000000000021
+:10BF20000000000000000000000000000000000011
+:10BF30000000000000000000000000000000000001
+:10BF400000000000000000000000000000000000F1
+:10BF500000000000000000000000000000000000E1
+:10BF600000000000000000000000000000000000D1
+:10BF700000000000000000000000000000000000C1
+:10BF800000000000000000000000000000000000B1
+:10BF900000000000000000000000000000000000A1
+:10BFA0000000000000000000000000000000000091
+:10BFB0000000000000000000000000000000000081
+:10BFC0000000000000000000000000000000000071
+:10BFD0000000000000000000000000000000000061
+:10BFE0000000000000000000000000000000000051
+:10BFF0000000000000000000000000000000000041
+:10C000000000000000000000000000000000000030
+:10C010000000000000000000000000000000000020
+:10C020000000000000000000000000000000000010
+:10C030000000000000000000000000000000000000
+:10C0400000000000000000000000000000000000F0
+:10C0500000000000000000000000000000000000E0
+:10C0600000000000000000000000000000000000D0
+:10C0700000000000000000000000000000000000C0
+:10C0800000000000000000000000000000000000B0
+:10C0900000000000000000000000000000000000A0
+:10C0A0000000000000000000000000000000000090
+:10C0B0000000000000000000000000000000000080
+:10C0C0000000000000000000000000000000000070
+:10C0D0000000000000000000000000000000000060
+:10C0E0000000000000000000000000000000000050
+:10C0F0000000000000000000000000000000000040
+:10C10000000000000000000000000000000000002F
+:10C11000000000000000000000000000000000001F
+:10C12000000000000000000000000000000000000F
+:10C1300000000000000000000000000000000000FF
+:10C1400000000000000000000000000000000000EF
+:10C1500000000000000000000000000000000000DF
+:10C1600000000000000000000000000000000000CF
+:10C1700000000000000000000000000000000000BF
+:10C1800000000000000000000000000000000000AF
+:10C19000000000000000000000000000000000009F
+:10C1A000000000000000000000000000000000008F
+:10C1B000000000000000000000000000000000007F
+:10C1C000000000000000000000000000000000006F
+:10C1D000000000000000000000000000000000005F
+:10C1E000000000000000000000000000000000004F
+:10C1F000000000000000000000000000000000003F
+:10C20000000000000000000000000000000000002E
+:10C21000000000000000000000000000000000001E
+:10C22000000000000000000000000000000000000E
+:10C2300000000000000000000000000000000000FE
+:10C2400000000000000000000000000000000000EE
+:10C2500000000000000000000000000000000000DE
+:10C2600000000000000000000000000000000000CE
+:10C2700000000000000000000000000000000000BE
+:10C2800000000000000000000000000000000000AE
+:10C29000000000000000000000000000000000009E
+:10C2A000000000000000000000000000000000008E
+:10C2B000000000000000000000000000000000007E
+:10C2C000000000000000000000000000000000006E
+:10C2D000000000000000000000000000000000005E
+:10C2E000000000000000000000000000000000004E
+:10C2F000000000000000000000000000000000003E
+:10C30000000000000000000000000000000000002D
+:10C31000000000000000000000000000000000001D
+:10C32000000000000000000000000000000000000D
+:10C3300000000000000000000000000000000000FD
+:10C3400000000000000000000000000000000000ED
+:10C3500000000000000000000000000000000000DD
+:10C3600000000000000000000000000000000000CD
+:10C3700000000000000000000000000000000000BD
+:10C3800000000000000000000000000000000000AD
+:10C39000000000000000000000000000000000009D
+:10C3A000000000000000000000000000000000008D
+:10C3B000000000000000000000000000000000007D
+:10C3C000000000000000000000000000000000006D
+:10C3D000000000000000000000000000000000005D
+:10C3E000000000000000000000000000000000004D
+:10C3F000000000000000000000000000000000003D
+:10C40000000000000000000000000000000000002C
+:10C41000000000000000000000000000000000001C
+:10C42000000000000000000000000000000000000C
+:10C4300000000000000000000000000000000000FC
+:10C4400000000000000000000000000000000000EC
+:10C4500000000000000000000000000000000000DC
+:10C4600000000000000000000000000000000000CC
+:10C4700000000000000000000000000000000000BC
+:10C4800000000000000000000000000000000000AC
+:10C49000000000000000000000000000000000009C
+:10C4A000000000000000000000000000000000008C
+:10C4B000000000000000000000000000000000007C
+:10C4C000000000000000000000000000000000006C
+:10C4D000000000000000000000000000000000005C
+:10C4E000000000000000000000000000000000004C
+:10C4F000000000000000000000000000000000003C
+:10C50000000000000000000000000000000000002B
+:10C51000000000000000000000000000000000001B
+:10C52000000000000000000000000000000000000B
+:10C5300000000000000000000000000000000000FB
+:10C5400000000000000000000000000000000000EB
+:10C5500000000000000000000000000000000000DB
+:10C5600000000000000000000000000000000000CB
+:10C5700000000000000000000000000000000000BB
+:10C5800000000000000000000000000000000000AB
+:10C59000000000000000000000000000000000009B
+:10C5A000000000000000000000000000000000008B
+:10C5B000000000000000000000000000000000007B
+:10C5C000000000000000000000000000000000006B
+:10C5D000000000000000000000000000000000005B
+:10C5E000000000000000000000000000000000004B
+:10C5F000000000000000000000000000000000003B
+:10C60000000000000000000000000000000000002A
+:10C61000000000000000000000000000000000001A
+:10C62000000000000000000000000000000000000A
+:10C6300000000000000000000000000000000000FA
+:10C6400000000000000000000000000000000000EA
+:10C6500000000000000000000000000000000000DA
+:10C6600000000000000000000000000000000000CA
+:10C6700000000000000000000000000000000000BA
+:10C6800000000000000000000000000000000000AA
+:10C69000000000000000000000000000000000009A
+:10C6A000000000000000000000000000000000008A
+:10C6B000000000000000000000000000000000007A
+:10C6C000000000000000000000000000000000006A
+:10C6D000000000000000000000000000000000005A
+:10C6E000000000000000000000000000000000004A
+:10C6F000000000000000000000000000000000003A
+:10C700000000000000000000000000000000000029
+:10C710000000000000000000000000000000000019
+:10C720000000000000000000000000000000000009
+:10C7300000000000000000000000000000000000F9
+:10C7400000000000000000000000000000000000E9
+:10C7500000000000000000000000000000000000D9
+:10C7600000000000000000000000000000000000C9
+:10C7700000000000000000000000000000000000B9
+:10C7800000000000000000000000000000000000A9
+:10C790000000000000000000000000000000000099
+:10C7A0000000000000000000000000000000000089
+:10C7B0000000000000000000000000000000000079
+:10C7C0000000000000000000000000000000000069
+:10C7D0000000000000000000000000000000000059
+:10C7E0000000000000000000000000000000000049
+:10C7F0000000000000000000000000000000000039
+:10C800000000000000000000000000000000000028
+:10C810000000000000000000000000000000000018
+:10C820000000000000000000000000000000000008
+:10C8300000000000000000000000000000000000F8
+:10C8400000000000000000000000000000000000E8
+:10C8500000000000000000000000000000000000D8
+:10C8600000000000000000000000000000000000C8
+:10C8700000000000000000000000000000000000B8
+:10C8800000000000000000000000000000000000A8
+:10C890000000000000000000000000000000000098
+:10C8A0000000000000000000000000000000000088
+:10C8B0000000000000000000000000000000000078
+:10C8C0000000000000000000000000000000000068
+:10C8D0000000000000000000000000000000000058
+:10C8E0000000000000000000000000000000000048
+:10C8F0000000000000000000000000000000000038
+:10C900000000000000000000000000000000000027
+:10C910000000000000000000000000000000000017
+:10C920000000000000000000000000000000000007
+:10C9300000000000000000000000000000000000F7
+:10C9400000000000000000000000000000000000E7
+:10C9500000000000000000000000000000000000D7
+:10C9600000000000000000000000000000000000C7
+:10C9700000000000000000000000000000000000B7
+:10C9800000000000000000000000000000000000A7
+:10C990000000000000000000000000000000000097
+:10C9A0000000000000000000000000000000000087
+:10C9B0000000000000000000000000000000000077
+:10C9C0000000000000000000000000000000000067
+:10C9D0000000000000000000000000000000000057
+:10C9E0000000000000000000000000000000000047
+:10C9F0000000000000000000000000000000000037
+:10CA00000000000000000000000000000000000026
+:10CA10000000000000000000000000000000000016
+:10CA20000000000000000000000000000000000006
+:10CA300000000000000000000000000000000000F6
+:10CA400000000000000000000000000000000000E6
+:10CA500000000000000000000000000000000000D6
+:10CA600000000000000000000000000000000000C6
+:10CA700000000000000000000000000000000000B6
+:10CA800000000000000000000000000000000000A6
+:10CA90000000000000000000000000000000000096
+:10CAA0000000000000000000000000000000000086
+:10CAB0000000000000000000000000000000000076
+:10CAC0000000000000000000000000000000000066
+:10CAD0000000000000000000000000000000000056
+:10CAE0000000000000000000000000000000000046
+:10CAF0000000000000000000000000000000000036
+:10CB00000000000000000000000000000000000025
+:10CB10000000000000000000000000000000000015
+:10CB20000000000000000000000000000000000005
+:10CB300000000000000000000000000000000000F5
+:10CB400000000000000000000000000000000000E5
+:10CB500000000000000000000000000000000000D5
+:10CB600000000000000000000000000000000000C5
+:10CB700000000000000000000000000000000000B5
+:10CB800000000000000000000000000000000000A5
+:10CB90000000000000000000000000000000000095
+:10CBA0000000000000000000000000000000000085
+:10CBB0000000000000000000000000000000000075
+:10CBC0000000000000000000000000000000000065
+:10CBD0000000000000000000000000000000000055
+:10CBE0000000000000000000000000000000000045
+:10CBF0000000000000000000000000000000000035
+:10CC00000000000000000000000000000000000024
+:10CC10000000000000000000000000000000000014
+:10CC20000000000000000000000000000000000004
+:10CC300000000000000000000000000000000000F4
+:10CC400000000000000000000000000000000000E4
+:10CC500000000000000000000000000000000000D4
+:10CC600000000000000000000000000000000000C4
+:10CC700000000000000000000000000000000000B4
+:10CC800000000000000000000000000000000000A4
+:10CC90000000000000000000000000000000000094
+:10CCA0000000000000000000000000000000000084
+:10CCB0000000000000000000000000000000000074
+:10CCC0000000000000000000000000000000000064
+:10CCD0000000000000000000000000000000000054
+:10CCE0000000000000000000000000000000000044
+:10CCF0000000000000000000000000000000000034
+:10CD00000000000000000000000000000000000023
+:10CD10000000000000000000000000000000000013
+:10CD20000000000000000000000000000000000003
+:10CD300000000000000000000000000000000000F3
+:10CD400000000000000000000000000000000000E3
+:10CD500000000000000000000000000000000000D3
+:10CD600000000000000000000000000000000000C3
+:10CD700000000000000000000000000000000000B3
+:10CD800000000000000000000000000000000000A3
+:10CD90000000000000000000000000000000000093
+:10CDA0000000000000000000000000000000000083
+:10CDB0000000000000000000000000000000000073
+:10CDC0000000000000000000000000000000000063
+:10CDD0000000000000000000000000000000000053
+:10CDE0000000000000000000000000000000000043
+:10CDF0000000000000000000000000000000000033
+:10CE00000000000000000000000000000000000022
+:10CE10000000000000000000000000000000000012
+:10CE20000000000000000000000000000000000002
+:10CE300000000000000000000000000000000000F2
+:10CE400000000000000000000000000000000000E2
+:10CE500000000000000000000000000000000000D2
+:10CE600000000000000000000000000000000000C2
+:10CE700000000000000000000000000000000000B2
+:10CE800000000000000000000000000000000000A2
+:10CE90000000000000000000000000000000000092
+:10CEA0000000000000000000000000000000000082
+:10CEB0000000000000000000000000000000000072
+:10CEC0000000000000000000000000000000000062
+:10CED0000000000000000000000000000000000052
+:10CEE0000000000000000000000000000000000042
+:10CEF0000000000000000000000000000000000032
+:10CF00000000000000000000000000000000000021
+:10CF10000000000000000000000000000000000011
+:10CF20000000000000000000000000000000000001
+:10CF300000000000000000000000000000000000F1
+:10CF400000000000000000000000000000000000E1
+:10CF500000000000000000000000000000000000D1
+:10CF600000000000000000000000000000000000C1
+:10CF700000000000000000000000000000000000B1
+:10CF800000000000000000000000000000000000A1
+:10CF90000000000000000000000000000000000091
+:10CFA0000000000000000000000000000000000081
+:10CFB0000000000000000000000000000000000071
+:10CFC0000000000000000000000000000000000061
+:10CFD0000000000000000000000000000000000051
+:10CFE0000000000000000000000000000000000041
+:10CFF0000000000000000000000000000000000031
+:10D000000000000000000000000000000000000020
+:10D010000000000000000000000000000000000010
+:10D020000000000000000000000000000000000000
+:10D0300000000000000000000000000000000000F0
+:10D0400000000000000000000000000000000000E0
+:10D0500000000000000000000000000000000000D0
+:10D0600000000000000000000000000000000000C0
+:10D0700000000000000000000000000000000000B0
+:10D0800000000000000000000000000000000000A0
+:10D090000000000000000000000000000000000090
+:10D0A0000000000000000000000000000000000080
+:10D0B0000000000000000000000000000000000070
+:10D0C0000000000000000000000000000000000060
+:10D0D0000000000000000000000000000000000050
+:10D0E0000000000000000000000000000000000040
+:10D0F0000000000000000000000000000000000030
+:10D10000000000000000000000000000000000001F
+:10D11000000000000000000000000000000000000F
+:10D1200000000000000000000000000000000000FF
+:10D1300000000000000000000000000000000000EF
+:10D1400000000000000000000000000000000000DF
+:10D1500000000000000000000000000000000000CF
+:10D1600000000000000000000000000000000000BF
+:10D1700000000000000000000000000000000000AF
+:10D18000000000000000000000000000000000009F
+:10D19000000000000000000000000000000000008F
+:10D1A000000000000000000000000000000000007F
+:10D1B000000000000000000000000000000000006F
+:10D1C000000000000000000000000000000000005F
+:10D1D000000000000000000000000000000000004F
+:10D1E000000000000000000000000000000000003F
+:10D1F000000000000000000000000000000000002F
+:10D20000000000000000000000000000000000001E
+:10D21000000000000000000000000000000000000E
+:10D2200000000000000000000000000000000000FE
+:10D2300000000000000000000000000000000000EE
+:10D2400000000000000000000000000000000000DE
+:10D2500000000000000000000000000000000000CE
+:10D2600000000000000000000000000000000000BE
+:10D2700000000000000000000000000000000000AE
+:10D28000000000000000000000000000000000009E
+:10D29000000000000000000000000000000000008E
+:10D2A000000000000000000000000000000000007E
+:10D2B000000000000000000000000000000000006E
+:10D2C000000000000000000000000000000000005E
+:10D2D000000000000000000000000000000000004E
+:10D2E000000000000000000000000000000000003E
+:10D2F000000000000000000000000000000000002E
+:10D30000000000000000000000000000000000001D
+:10D31000000000000000000000000000000000000D
+:10D3200000000000000000000000000000000000FD
+:10D3300000000000000000000000000000000000ED
+:10D3400000000000000000000000000000000000DD
+:10D3500000000000000000000000000000000000CD
+:10D3600000000000000000000000000000000000BD
+:10D3700000000000000000000000000000000000AD
+:10D38000000000000000000000000000000000009D
+:10D39000000000000000000000000000000000008D
+:10D3A000000000000000000000000000000000007D
+:10D3B000000000000000000000000000000000006D
+:10D3C000000000000000000000000000000000005D
+:10D3D000000000000000000000000000000000004D
+:10D3E000000000000000000000000000000000003D
+:10D3F000000000000000000000000000000000002D
+:10D40000000000000000000000000000000000001C
+:10D41000000000000000000000000000000000000C
+:10D4200000000000000000000000000000000000FC
+:10D4300000000000000000000000000000000000EC
+:10D4400000000000000000000000000000000000DC
+:10D4500000000000000000000000000000000000CC
+:10D4600000000000000000000000000000000000BC
+:10D4700000000000000000000000000000000000AC
+:10D48000000000000000000000000000000000009C
+:10D49000000000000000000000000000000000008C
+:10D4A000000000000000000000000000000000007C
+:10D4B000000000000000000000000000000000006C
+:10D4C000000000000000000000000000000000005C
+:10D4D000000000000000000000000000000000004C
+:10D4E000000000000000000000000000000000003C
+:10D4F000000000000000000000000000000000002C
+:10D50000000000000000000000000000000000001B
+:10D51000000000000000000000000000000000000B
+:10D5200000000000000000000000000000000000FB
+:10D5300000000000000000000000000000000000EB
+:10D5400000000000000000000000000000000000DB
+:10D5500000000000000000000000000000000000CB
+:10D5600000000000000000000000000000000000BB
+:10D5700000000000000000000000000000000000AB
+:10D58000000000000000000000000000000000009B
+:10D59000000000000000000000000000000000008B
+:10D5A000000000000000000000000000000000007B
+:10D5B000000000000000000000000000000000006B
+:10D5C000000000000000000000000000000000005B
+:10D5D000000000000000000000000000000000004B
+:10D5E000000000000000000000000000000000003B
+:10D5F000000000000000000000000000000000002B
+:10D60000000000000000000000000000000000001A
+:10D61000000000000000000000000000000000000A
+:10D6200000000000000000000000000000000000FA
+:10D6300000000000000000000000000000000000EA
+:10D6400000000000000000000000000000000000DA
+:10D6500000000000000000000000000000000000CA
+:10D6600000000000000000000000000000000000BA
+:10D6700000000000000000000000000000000000AA
+:10D68000000000000000000000000000000000009A
+:10D69000000000000000000000000000000000008A
+:10D6A000000000000000000000000000000000007A
+:10D6B000000000000000000000000000000000006A
+:10D6C000000000000000000000000000000000005A
+:10D6D000000000000000000000000000000000004A
+:10D6E000000000000000000000000000000000003A
+:10D6F000000000000000000000000000000000002A
+:10D700000000000000000000000000000000000019
+:10D710000000000000000000000000000000000009
+:10D7200000000000000000000000000000000000F9
+:10D7300000000000000000000000000000000000E9
+:10D7400000000000000000000000000000000000D9
+:10D7500000000000000000000000000000000000C9
+:10D7600000000000000000000000000000000000B9
+:10D7700000000000000000000000000000000000A9
+:10D780000000000000000000000000000000000099
+:10D790000000000000000000000000000000000089
+:10D7A0000000000000000000000000000000000079
+:10D7B0000000000000000000000000000000000069
+:10D7C0000000000000000000000000000000000059
+:10D7D0000000000000000000000000000000000049
+:10D7E0000000000000000000000000000000000039
+:10D7F0000000000000000000000000000000000029
+:10D800000000000000000000000000000000000018
+:10D810000000000000000000000000000000000008
+:10D8200000000000000000000000000000000000F8
+:10D8300000000000000000000000000000000000E8
+:10D8400000000000000000000000000000000000D8
+:10D8500000000000000000000000000000000000C8
+:10D8600000000000000000000000000000000000B8
+:10D8700000000000000000000000000000000000A8
+:10D880000000000000000000000000000000000098
+:10D890000000000000000000000000000000000088
+:10D8A0000000000000000000000000000000000078
+:10D8B0000000000000000000000000000000000068
+:10D8C0000000000000000000000000000000000058
+:10D8D0000000000000000000000000000000000048
+:10D8E00010000003000000000000000D0000000D0B
+:10D8F0003C020800244271203C030800246375C8E0
+:10D90000AC4000000043202B1480FFFD24420004A3
+:10D910003C1D080037BD7FFC03A0F0213C1008002F
+:10D92000261031D83C1C0800279C71200E00116481
+:10D93000000000000000000D30A5FFFF30C600FF12
+:10D94000274301808F4201B80440FFFE24020002F9
+:10D95000AC640000A4650008A066000AA062000B89
+:10D960003C021000AC67001803E00008AF4201B8A9
+:10D970003C0360008C624FF80440FFFE3C02020052
+:10D98000AC644FC0AC624FC43C02100003E000081E
+:10D99000AC624FF827BDFFE8AFBF0014AFB0001076
+:10D9A0000E0011B300808021936200052403FFFE66
+:10D9B00002002021004310248FBF00148FB00010FC
+:10D9C000A36200050A0011BC27BD001827BDFFE8AF
+:10D9D000AFB00010AFBF00140E000EA40080802175
+:10D9E0009362000024030050304200FF14430004FF
+:10D9F00024020100AF4201800A000CC10200202174
+:10DA0000AF400180020020218FBF00148FB00010B2
+:10DA10000A000F7D27BD001827BDFF98AFBE00602C
+:10DA2000AFB7005CAFB20048AFBF0064AFB60058FC
+:10DA3000AFB50054AFB40050AFB3004CAFB1004429
+:10DA4000AFB000408F5001289363003F9362000500
+:10DA50000000F021307200FF000210273042000168
+:10DA60000000B82114400066AFA0003893420116B0
+:10DA700093430112304200FF306300FF0342202134
+:10DA800003431021244540008F82000010400018FD
+:10DA9000248840008F4201043C030001004310240D
+:10DAA00010400013000000008CA3000C8F620030B7
+:10DAB000146201A2240200018CA300108F62002CCA
+:10DAC0001462019E240200019762003A9483400090
+:10DAD0003042FFFF1462019924020001976200386E
+:10DAE000950300023042FFFF1462019424020001FA
+:10DAF00093620000304300FF240200201062000502
+:10DB00002402005010620006000000000A000D0B05
+:10DB1000000000000000000D0A000D14AFA000304E
+:10DB20003C1E080027DE71880A000D14AFA00030EB
+:10DB30003C0208008C4200DC244200013C01080049
+:10DB4000AC2200DC0E00127D000000000A000E8FE7
+:10DB50008FBF00648F4201043C0300209113000D2D
+:10DB6000004310240002202B00042140AFA4003009
+:10DB70008F4301043C02004000621824146000023C
+:10DB8000348700400080382132620020AFA7003087
+:10DB90001440000234E6008000E0302110C0000B89
+:10DBA000AFA6003093C500088F67004C020020210B
+:10DBB00000052B0034A5008130A5F0810E000C8DEE
+:10DBC00030C600FF0A000E8C000000009362003E89
+:10DBD000304200401040000E24020004564200066D
+:10DBE00024020012020020210E0013DA010030216D
+:10DBF0000A000E8F8FBF006416420005000000006F
+:10DC00000E000CB2000020210A000E8F8FBF0064AE
+:10DC10009742011A9504000E9363003532650004A3
+:10DC20003055FFFF00642004AFA4003C8D110004B8
+:10DC300010A000158D1400089362003E3042004091
+:10DC400010400007000000000E00133B02202021BE
+:10DC50001040000D000000000A000E8C00000000C3
+:10DC60008F620044022210230440013200000000B1
+:10DC70008F620048022210230441012E2404001662
+:10DC80000A000DA28FC200048F62004802221023F6
+:10DC900004400008000000003C0208008C423100F3
+:10DCA000244200013C010800AC2231000A000E8130
+:10DCB000000000008F62004002221023184000097B
+:10DCC0002402000C3C0208008C423100327300FC3C
+:10DCD0000000A821244200013C010800AC223100D0
+:10DCE0002402000CAFA200308F62004000511823C4
+:10DCF0001860000D02A3102A144001030000000068
+:10DD00001475000602A310233A620001304200019C
+:10DD1000144000FD0000000002A31023022388210C
+:10DD20000A000D8A3055FFFF000018213262000200
+:10DD30001040001A326200109362003E30420040F0
+:10DD4000504000118FC200040E0011B302002021C8
+:10DD500024020018A362003F936200052403FFFE23
+:10DD600002002021004310240E0011BCA362000514
+:10DD700024040039000028210E0013242406001872
+:10DD80000A000E8E24020001240400170040F80946
+:10DD9000000000000A000E8E24020001104000E581
+:10DDA000000000008F64004C8F6200540282102338
+:10DDB0001C4000E002841023044200010080A021E6
+:10DDC000AFA30018AFB10010AFB50014934201200B
+:10DDD0008F6600409764003C304200FF03422821D8
+:10DDE0008FA2003C00A328218FA300303084FFFFC6
+:10DDF0000044202B8FC200000064182524A5400099
+:10DE0000AFA50020AFA60028AFA30030AFA6002426
+:10DE1000AFA0002CAFB400340040F80927A40010D4
+:10DE20008FA200303042000254400001327300FEE5
+:10DE30009362003E30420040104000378FA3001430
+:10DE40008F6200541682001A32620001240200140C
+:10DE5000124200102A42001510400006240200164B
+:10DE60002402000C12420007326200010A000DEB8E
+:10DE70000000000012420005326200010A000DEBB2
+:10DE8000000000000A000DE62417000E0A000DE64F
+:10DE9000241700100A000DEA2417001293620023D1
+:10DEA0002403FFBD00431024A3620023326200015B
+:10DEB000104000198FA300142402000C1242000E1F
+:10DEC0002A42000D104000062402000E2402000A1F
+:10DED000124200078FA200240A000E032442000110
+:10DEE000124200088FA200240A000E0324420001FF
+:10DEF0000A000E01241700082402000E16E2000298
+:10DF000024170016241700108FA2002424420001B9
+:10DF1000AFA200248FA300148FA200248F760040AC
+:10DF200000431021AF6200408FA2003C9364003692
+:10DF30008F630040028290213402FFFF00821004B0
+:10DF400000621821AF6300488FA6003030C200087D
+:10DF50001040000E000000008F62005816420004BE
+:10DF600030C600FF9742011A5040000134C600102D
+:10DF700093C500088FA700340200202100052B0064
+:10DF800034A500800E000C8D30A5F0808F6200401B
+:10DF900000561023184000178FA200183C020800FA
+:10DFA0008C423198304200101040000924020001D8
+:10DFB000976200681440000624020001A76200680E
+:10DFC0009742007A2442000A0A000E47A762001214
+:10DFD000A76200120E0011B3020020219362007D9F
+:10DFE0002403000102002021344200010A000E45F2
+:10DFF000AFA300381840000A000000000E0011B363
+:10E00000020020219362007D2403000102002021F0
+:10E01000AFA30038344200040E0011BCA362007D9F
+:10E020009362003E304200401440000C3262000116
+:10E030001040000A000000008F6300408FC20004FF
+:10E0400024040018246300010040F809AF63004075
+:10E050008FA200300A000E8E304200048F620058FA
+:10E0600010520010000000008F62001802221023DE
+:10E070001C400008240200018F62001816220009CB
+:10E08000000000008F62001C028210230440000583
+:10E0900024020001AF720058AFA20038AF7100181F
+:10E0A000AF74001C12E0000B8FA300380E0011B3F8
+:10E0B00002002021A377003F0E0011BC02002021A6
+:10E0C00002E03021240400370E0013240000282130
+:10E0D0008FA3003810600003000000000E000C9BAE
+:10E0E0000200202112A00005000018218FA200309C
+:10E0F0003042000450400011006010212403000150
+:10E100000A000E8E006010210E0011B302002021C3
+:10E110009362007D02002021344200040E0011BCF5
+:10E12000A362007D0E000C9B020020210A000E8ECF
+:10E1300024020001AF400044240200018FBF0064AC
+:10E140008FBE00608FB7005C8FB600588FB500544B
+:10E150008FB400508FB3004C8FB200488FB1004491
+:10E160008FB0004003E0000827BD00688C870004E2
+:10E170008C8600000000102100E5382100E5282BE6
+:10E1800000C2302100C53021AC87000403E0000844
+:10E19000AC8600008F4201B80440FFFE2402080054
+:10E1A000AF4201B803E00008000000003C02000894
+:10E1B0000342282194A200483084FFFF1040001B36
+:10E1C0002484001294A200483042FFFF0044102A29
+:10E1D00010400017240200032402001A9343012078
+:10E1E000A342018B8F820008306300FF3042400061
+:10E1F000104000092463FFFE94A200483042FFFF54
+:10E200000043102B144000058F820014A743019493
+:10E210000A000EC8344200018F8200142403FFFE5E
+:10E220000043102403E00008AF820014240200031E
+:10E2300003E00008A342018B27BDFFE0AFB2001846
+:10E24000AFB10014AFB00010AFBF001C30B1FFFF82
+:10E2500030D0FFFF30F2FFFF8F4201B80440FFFED5
+:10E2600000000000AF440180AF4400200E000EAA61
+:10E27000020020218F8300088F840014A751018C95
+:10E28000A750018EA74301908F8300043082800045
+:10E29000AF4301A8A75201881040000E8F820014DE
+:10E2A00093420116304200FC24420004005A10211F
+:10E2B0008C4240003042FFFF144000068F82001461
+:10E2C0003C02FFFF34427FFF00821024AF82001423
+:10E2D0008F8200142403BFFF00431024A74201A62D
+:10E2E0009743010C8F42010400031C003042FFFFE2
+:10E2F00000621825AF4301AC3C021000AF4201B8E8
+:10E300008FBF001C8FB200188FB100148FB00010A7
+:10E3100003E0000827BD002027BDFFE0AFB20018D2
+:10E3200030D2FFFFAF440180AF44002002402021E3
+:10E33000AFB10014AFB0001030F1FFFFAFBF001C51
+:10E340000E000EAA30B0FFFF8F8300142402BFFF1F
+:10E35000A750018C006218248F820008A752018EFA
+:10E36000A7510188A74301A6A74201903C021000D3
+:10E37000AF4201B88FBF001C8FB200188FB10014DC
+:10E380008FB0001003E0000827BD00202743018064
+:10E390008F4201B80440FFFE24022000A46200085E
+:10E3A00024020002A062000BA46000103C021000D6
+:10E3B000AF4201B803E00008000000008F47007082
+:10E3C000934201128F83000827BDFFF0304200FF07
+:10E3D000000228823062010000003021104000431A
+:10E3E00024A400033062400010400010306220007E
+:10E3F00000041080005A10218C43400024A4000423
+:10E4000000041080AFA30000005A10218C4240008D
+:10E41000AFA2000493420116304200FC005A1021C2
+:10E420008C4240000A000F56AFA200081040002F97
+:10E430000000302100041080005A10218C4340005D
+:10E4400024A4000400041080AFA30000005A10218F
+:10E450008C424000AFA00008AFA200048FA80008C3
+:10E460000000302100002021240A00083C09080097
+:10E470002529010003A41021148A000300042A00A6
+:10E480001100000A000000009042000024840001F6
+:10E490002C83000C00A210210002108000491021E2
+:10E4A0008C4200001460FFF300C230263C040800D8
+:10E4B0008C8431048F4200702C830020106000098E
+:10E4C000004738233C03080024633108000410800F
+:10E4D0000043102124830001AC4700003C010800E8
+:10E4E000AC233104AF8600042406000100C01021D3
+:10E4F00003E0000827BD00103C0208008C420038F1
+:10E5000027BDFFD0AFB50024AFB3001CAFBF0028BC
+:10E51000AFB40020AFB20018AFB10014AFB000101C
+:10E520003C15080026B50038144000022453FFFFB4
+:10E53000000098218F840008308240001040000ABB
+:10E54000308280003C0200200082102450400006EF
+:10E55000308280008F8200142403BFFF00831824C0
+:10E560000A000FA2344210001040000A3C020020B2
+:10E5700000821024104000078F8200143C03FFFF2C
+:10E5800034637FFF0083182434428000AF8200147C
+:10E59000AF8300080E000F2E00000000144000089A
+:10E5A0008F8400089743011E9742011C3063FFFFD0
+:10E5B0000002140000621825AF8300048F84000855
+:10E5C0009742010C30831000106000113046FFFFAD
+:10E5D000308200201440000F241200053C0210007D
+:10E5E000008210241040000B241200013C030E0096
+:10E5F0003C020DFF008318243442FFFF0043102B20
+:10E6000010400004000000000A000FC4241200059E
+:10E61000241200013C0508008CA5003454A0001908
+:10E620008F8400088F82001C544000168F840008DD
+:10E630008F82001430424000544000128F84000842
+:10E640003C021F01008210243C0310001443000D03
+:10E650008F84000830C202001440000B3C0200010D
+:10E660009746010E364700020000202124C6000410
+:10E6700030C6FFFF0E000F05240500020A00108DB2
+:10E680008FBF00283C020001008210241040000CC3
+:10E690008F8300143C0208008C4200D89746010E7C
+:10E6A000240400802442000130C6FFFF240500023C
+:10E6B0003C010800AC2200D80A00108A240700039D
+:10E6C00030624000104000063C0210003C020F0087
+:10E6D0000082102450400001934201163C021000B9
+:10E6E0000082102410400044000000003C0208009A
+:10E6F0008C4200301040000C306240001040000A94
+:10E700003C030F00008318243C0201000043102B3F
+:10E7100014400005000000009746010E3647000235
+:10E720000A0010872404008010A0000D3082010030
+:10E730001040000B3C020F00008210243C0302003A
+:10E74000104300078F82000400531024005510214D
+:10E7500090420004244200040A00103A000221C042
+:10E76000000000008F8600083C0508008CA500D042
+:10E77000000616023050000F38A200012C420001A2
+:10E780002E03000C0043102414400018001021C078
+:10E790002602FFFC2C4200045440001400002021FB
+:10E7A00038A200022C420001004310241040000354
+:10E7B000000612420A00103A000020210010182B17
+:10E7C0000043102450400009001021C09746010E5C
+:10E7D000000020212405000224C6000430C6FFFFEB
+:10E7E0000E000ECD3247FFFB001021C09746010EF0
+:10E7F0000A001087364700028F4240003C11080093
+:10E800008E310024304201001040004032220001CD
+:10E810000220802110A00017325400043082010031
+:10E8200010400015240200013C020F000082102459
+:10E830003C0302001043000F8F8200049746010E34
+:10E840000240382100531024005510219044000448
+:10E8500024C6000430C6FFFF24840004000421C045
+:10E860000E000ECD240500022402FFFE02228024A9
+:10E870003252FFFB2402000116020007320200019F
+:10E880003242000450400001365200029746010E09
+:10E890000A001086024038211040000A32020004AB
+:10E8A0009746010E024038210000202124C60004B2
+:10E8B00030C6FFFF0E000ECD240500023252FFFBD2
+:10E8C000320200041040000B8F8200083042080022
+:10E8D00010400008000000009746010E0240382159
+:10E8E0002404010024C6000430C6FFFF0E000ECD34
+:10E8F00024050002568000108FBF00280E000F2252
+:10E90000000000000A00108D8FBF00281040000A90
+:10E910008FBF00289746010E3647000200002021D5
+:10E9200024C6000430C6FFFF240500020E000ECDF1
+:10E93000000000008FBF00288FB500248FB4002096
+:10E940008FB3001C8FB200188FB100148FB000106D
+:10E950000000102103E0000827BD0030274301809C
+:10E960008F4201B80440FFFE000000008F420148C2
+:10E9700000021402A462000824020002A062000B3C
+:10E980008F420148A46200108F420144AC6200240F
+:10E990003C02100003E00008AF4201B827BDFFE8C9
+:10E9A000AFB000103C04600CAFBF00148C8250006C
+:10E9B0002403FF7F3C1A8000004310243442380CAB
+:10E9C000AC825000240200033C106000AF420008FB
+:10E9D0008E0208083C1B80083C010800AC20002087
+:10E9E0003042FFF0384200102C4200010E001B396B
+:10E9F000AF8200003C04FFFF3C02040034830806A1
+:10EA00003442000CAE021948AE03194C3C056016A6
+:10EA10008E0219808CA30000344202000064182486
+:10EA2000AE0219803C0253531462000334A47C00EC
+:10EA30008CA20004005020218C82007C8C83007802
+:10EA40008FBF00148FB0001027BD0018AF820018D0
+:10EA500003E00008AF83001027BDFFE8AFBF001040
+:10EA60008F4340003402FFFF3C040800248400F080
+:10EA700010620007000000008F4240003C040800C4
+:10EA8000248400E83042010010400009000000002A
+:10EA90009745010E0E000E9A30A5FFFF9745010E17
+:10EAA0003C040800248431C80A0010FC8FBF001009
+:10EAB0008F4340008F8200103C040800248400E053
+:10EAC0001462000A000000008F4340048F82001887
+:10EAD00014620006000000009745010E3C04080087
+:10EAE000248431B80A0010FC8FBF00109745010E36
+:10EAF0008FBF001030A5FFFF0A000E9A27BD001837
+:10EB000027BDFFE8AFBF00108F420128AF420020B1
+:10EB10008F4201048F430100AF8200080E000EA453
+:10EB2000AF8300140E0010D5000000003C02080066
+:10EB30008C4200C0104000088F8400083C0208008E
+:10EB40008C4200C4244200013C010800AC2200C4F5
+:10EB50000A001135000000003C0200100082102461
+:10EB60001440000A8F8300143C0208008C420020ED
+:10EB7000244200013C010800AC2200200E000F7D61
+:10EB8000000020210A001133000000002402BFFF12
+:10EB9000006210241040000800000000240287FFDB
+:10EBA00000621024144000083C020060008210241F
+:10EBB00010400005000000000E000CC50000000021
+:10EBC0000A001133000000000E00119D000000003B
+:10EBD000104000063C0240008F4301243C026020AC
+:10EBE000AC430014000000003C024000AF4201387A
+:10EBF000000000008FBF001003E0000827BD0018D0
+:10EC000027BDFFE8AFBF00108F4201403C04400029
+:10EC1000AF4200208F4301483C027000006218247C
+:10EC2000106400100083102B144000063C026000AA
+:10EC30003C02200010620007000000000A00115F83
+:10EC40003C0240001062000B3C0240000A00115FD1
+:10EC5000000000000E001096000000000A00115F86
+:10EC60003C0240000E0011C1000000000A00115FCC
+:10EC70003C0240000E001B46000000003C02400029
+:10EC8000AF420178000000008FBF001003E00008D1
+:10EC900027BD001827BDFFE8AFBF00140E0010A667
+:10ECA000AFB000103C028000344200708C43000082
+:10ECB00000403821AF830020006030218CE8000044
+:10ECC0003C0508008CA500FC3C0408008C8400F87E
+:10ECD000010630230000102100A6282100A6302BB9
+:10ECE00000822021008620213C010800AC2500FC88
+:10ECF0003C010800AC2400F88F50000032020003F1
+:10ED00001040FFEE010030218CE600003C050800B9
+:10ED10008CA500FC3C0408008C8400F800C830235B
+:10ED200000A628210000102100A6302B00822021FF
+:10ED300000862021320700013C010800AC2500FCC0
+:10ED4000AF8800203C010800AC2400F810E000046B
+:10ED5000320200020E0010FF00000000320200022A
+:10ED60005040FFD13C0280000E00113F0000000027
+:10ED70000A0011693C0280008F4201003042003ECF
+:10ED80001440001124020001AF4000488F420100EE
+:10ED9000304207C01040000500000000AF40004CAA
+:10EDA000AF40005003E0000824020001AF400054CF
+:10EDB000AF4000408F420100304238005440000113
+:10EDC000AF4000442402000103E0000800000000FE
+:10EDD0003C0290003442000100822025AF44002014
+:10EDE0008F4200200440FFFE0000000003E0000806
+:10EDF000000000003C028000344200010082202517
+:10EE000003E00008AF44002027BDFFE0AFB20018C8
+:10EE1000AFBF001CAFB10014AFB000108F50014065
+:10EE20008F5101483C0280000011940202222024EC
+:10EE3000324300FF2402000E1062008A2862000F95
+:10EE40001040001228620037240200061062003BC6
+:10EE50002862000710400007240200091060001A11
+:10EE60002402000110620025000000000A00127652
+:10EE7000000000001062007B2402000B1062005BA7
+:10EE80003222FFFF0A001276000000001040000846
+:10EE90002402003828620035104000802402001F40
+:10EEA0001062007E000000000A00127600000000E0
+:10EEB0001062007A2402008010620042000000000C
+:10EEC0000A001276000000008F4201B80440FFFEE5
+:10EED00024020001AF500180AF400184A752018895
+:10EEE000A342018A24020002A342018BA751019090
+:10EEF0008F4201440A001271AF4201A41080000A3F
+:10EF0000240200023C010800A02271783C010800A4
+:10EF1000AC3071808F4201443C010800AC22717C0E
+:10EF20000A0012788FBF001C8F4201B80440FFFE18
+:10EF3000240200020A00125B000000008F4201B8A8
+:10EF40000440FFFE00000000AF5001803C020800BA
+:10EF50009042717810400003000018213C03080023
+:10EF60008C637180AF430184A75201883C02080082
+:10EF7000904271780000182134420001A342018AB6
+:10EF800024020002A342018BA75101908F42014449
+:10EF9000AF4201A43C020800904271781040000387
+:10EFA0003C0210003C0308008C63717CAF4301A855
+:10EFB000AF4201B83C010800A02071780A00127825
+:10EFC0008FBF001C8F4201B80440FFFE24020002E4
+:10EFD000A342018BA7520188A75101908F4201449F
+:10EFE000A74201920A0012733C0210001440001D57
+:10EFF0000000000093620005304200041440003716
+:10F00000000000000E0011B30200202193620005F1
+:10F0100002002021344200040E0011BCA36200054E
+:10F02000936200053042000414400002000000001A
+:10F030000000000D9362000024030020304200FF16
+:10F0400014430008000000008F4201B80440FFFE96
+:10F0500024020005AF500180A342018B3C02100046
+:10F06000AF4201B88F4201B80440FFFE2402000203
+:10F07000AF400180AF500184A7520188A342018AAA
+:10F08000A342018BA7510190AF4001A48F420144DC
+:10F09000AF4201A80A0012733C0210008F4201B86F
+:10F0A0000440FFFE24020001AF500180AF40018404
+:10F0B000A7520188A342018A24020002A342018BC5
+:10F0C000A7510190AF4001A4AF4001A83C0210003D
+:10F0D000AF4201B80A0012788FBF001C0000000D7B
+:10F0E0008FBF001C8FB200188FB100148FB00010BA
+:10F0F00003E0000827BD002027BDFFE8AFBF0010D8
+:10F100000E000EA400000000AF4001808FBF001071
+:10F11000000020210A000F7D27BD00183084FFFF6A
+:10F1200030A5FFFF0000182110800007000000003C
+:10F1300030820001104000020004204200651821C6
+:10F140000A0012890005284003E000080060102131
+:10F1500010C0000624C6FFFF8CA2000024A50004F6
+:10F16000AC8200000A0012932484000403E000082B
+:10F170000000000010A0000824A3FFFFAC860000E0
+:10F1800000000000000000002402FFFF2463FFFFD6
+:10F190001462FFFA2484000403E000080000000069
+:10F1A00027BDFFE0AFB20018AFB10014AFB0001040
+:10F1B000AFBF001C9482000C00A088212490001492
+:10F1C0000002130200021080008290210000302112
+:10F1D00000A020210E00129C240500050212102B15
+:10F1E0001040005700001021920300002C6200091B
+:10F1F0005040005192020001000310803C030800BF
+:10F20000246370DC004310218C42000000400008A1
+:10F2100000000000920300012402000C1462004868
+:10F2200024020001025010232C42000A1440003630
+:10F23000261000028E22000034420100AE2200009F
+:10F240009202000092030001920400029205000362
+:10F2500000031C00000216000043102500042200D9
+:10F26000004410250045102526100004AE2200049D
+:10F270009202000092030001920400029205000332
+:10F280000002160000031C000043102500042200A9
+:10F290000044102500451025261000040A0012B66F
+:10F2A000AE2200089203000124020004146200163A
+:10F2B0002610000292020000920400018E2300003A
+:10F2C00000021200004410253463000426100002DE
+:10F2D000AE22000C0A0012B6AE2300009203000119
+:10F2E0002402000314620008261000028E2200008F
+:10F2F000920300002610000134420008A2230010EF
+:10F300000A0012B6AE2200000A00130F2402000108
+:10F31000920300012402000210620002260400028F
+:10F32000024020210A0012B6008080210A0012B695
+:10F3300026100001920200010A0012B6020280218A
+:10F340008FBF001C8FB200188FB100148FB0001057
+:10F3500003E0000827BD002027BDFFE8AFBF001471
+:10F36000AFB000100E0011B3008080219362007DC9
+:10F3700002002021344200200E0011BCA362007D57
+:10F38000020020218FBF00148FB000100A000C9BD8
+:10F3900027BD0018308300FF30A500FF30C600FFF6
+:10F3A000274701808F4201B80440FFFE00000000A3
+:10F3B0008F42012834634000ACE2000024020001C7
+:10F3C000ACE00004A4E30008A0E2000A240200026A
+:10F3D000A0E2000B3C021000A4E50010ACE0002409
+:10F3E000ACE00028A4E6001203E00008AF4201B838
+:10F3F00027BDFFE8AFBF00109362003F2403001257
+:10F40000304200FF1043000D008030218F62004425
+:10F41000008210230440000A8FBF00108F62004852
+:10F42000240400390000282100C2102304410004F4
+:10F43000240600120E001324000000008FBF0010ED
+:10F440002402000103E0000827BD001827BDFFC803
+:10F45000AFB1002C00A08821AFB2003027A500106A
+:10F460000080902102202021AFBF00340E0012A79F
+:10F47000AFB0002810400009024020218E22000871
+:10F48000AF6200840E001315AF6000402404003802
+:10F490002405008D0A0013D1240600129362003463
+:10F4A000936300378F640084304200FF306300FFB5
+:10F4B0000043282100A4202B1080000B0000000036
+:10F4C0009763003C8F6200843063FFFF0045102388
+:10F4D0000062182B14600004000000008F6200849A
+:10F4E0000A00137B004580239762003C3050FFFFE9
+:10F4F0008FA3001030620004504000032E02021857
+:10F500008FA2001C0202102B1440000502002021D3
+:10F510003062000410400002240402188FA4001C72
+:10F520002C82008010400002008080212410008086
+:10F530000E0011B30240202124020001AF62000C32
+:10F540009362003E001020403042007FA362003EE4
+:10F550008E22000424420001AF620040A770003CEC
+:10F560008F6200509623000E00431021AF620058B6
+:10F570008F62005000441021AF62005C8E220004B4
+:10F58000AF6200188E220008AF62001C8FA200102C
+:10F59000304200085440000A93A20020A3600036C5
+:10F5A000936200362403FFDFA36200359362003EBE
+:10F5B00000431024A362003E0A0013B18E2200080B
+:10F5C000A36200358E220008AF62004C8F620024D7
+:10F5D0008F63004000431021AF6200489362000037
+:10F5E00024030050304200FF144300122403FF8024
+:10F5F0003C0208008C4231A002421021004310243A
+:10F60000AF4200283C0208008C4231A08E24000842
+:10F610003C03000C024210213042007F03421021C3
+:10F6200000431021AC4400D88E230008AF8200288C
+:10F63000AC4300DC0E0011BC024020212404003841
+:10F64000000028212406000A0E00132400000000F8
+:10F650008FBF00348FB200308FB1002C8FB00028E4
+:10F660002402000103E0000827BD003827BDFFE8A1
+:10F67000AFBF001090C7000D00C0282130E6001079
+:10F6800010C0000A30E200048CA300088F6200540E
+:10F690001062000630E20004144000178FBF001013
+:10F6A000000020210A000CB227BD00181040000DF8
+:10F6B00030E3001210C000108FBF00108CA30008B0
+:10F6C0008F6200541462000D2402000124040038EB
+:10F6D0002405008D0E001324240600120A0013FDD9
+:10F6E0008FBF001024020012146200038FBF0010AD
+:10F6F0000A00135227BD00182402000103E000088D
+:10F7000027BD001827BDFFF827420180AFA20000E7
+:10F71000308A00FF8F4201B80440FFFE0000000065
+:10F720008F4601283C0208008C4231A02403FF8050
+:10F73000AF86005000C2102100431024AF420024C5
+:10F740003C0208008C4231A08FA900008FA8000065
+:10F7500000C210213042007F034218213C02000AFF
+:10F7600000621821946400D48FA700008FA50000C8
+:10F7700024020002AF830028A0A2000B8FA3000088
+:10F78000354260003084FFFFA4E200083C02100014
+:10F79000AD260000AD040004AC60002427BD0008C5
+:10F7A000AF4201B803E00008240200018C8200048B
+:10F7B0008F83002800451023AC8200049062006310
+:10F7C0003042007FA06200638C820020938300306F
+:10F7D0008F85002834420002AF830044A780004296
+:10F7E000AC820020A4A000E490A200632403FFBF29
+:10F7F0000043102403E00008A0A200632743018017
+:10F800008F4201B80440FFFE8F820050AC620000BE
+:10F810008F420124AC62000424026083A4620008C9
+:10F8200024020002A062000B3C02100003E000086A
+:10F83000AF4201B88F880044938200308F83002844
+:10F840003C07080024E7759400481023304200FF6D
+:10F85000304900FC246500888F860048304A000348
+:10F860001120000900002021248200048CA3000044
+:10F87000304400FF0089102AACE3000024A50004F6
+:10F880001440FFF924E70004114000090000202182
+:10F890002482000190A30000304400FF008A102B56
+:10F8A000A0E3000024A500011440FFF924E70001B3
+:10F8B00030C20003144000048F850044310200036D
+:10F8C0001040000D0000000010A0000900002021E1
+:10F8D0002482000190C30000304400FF0085102BFB
+:10F8E000A0E3000024C600011440FFF924E7000152
+:10F8F00003E00008000000001100FFFD00002021CF
+:10F90000248200048CC30000304400FF0088102BC8
+:10F91000ACE3000024C600041440FFF924E700040F
+:10F9200003E00008000000008F8300449382003051
+:10F9300030C600FF30A500FF00431023304300FF16
+:10F940008F820028008038210043102114C000025B
+:10F95000244800880083382130E200031440000569
+:10F9600030A2000314400003306200031040000D79
+:10F970000000000010A000090000202124820001E6
+:10F9800090E30000304400FF0085102BA10300002D
+:10F9900024E700011440FFF92508000103E00008F6
+:10F9A0000000000010A0FFFD0000202124820004C0
+:10F9B0008CE30000304400FF0085102BAD030000F5
+:10F9C00024E700041440FFF92508000403E00008C0
+:10F9D0000000000027BDFFF82402FFFFAFA20000D7
+:10F9E000008038212405002F3C0908002529719446
+:10F9F000240800FF2406FFFF90E2000024A3FFFF7D
+:10FA00000006220200C21026304200FF00021080D1
+:10FA1000004910218C420000306500FF24E70001FE
+:10FA200014A8FFF50082302600061027AFA20004BC
+:10FA3000AFA200000000282127A6000400C5102363
+:10FA40009044000324A2000100BD1821304500FFAE
+:10FA50002CA200041440FFF9A06400008FA2000053
+:10FA600003E0000827BD00080080482130AAFFFFFE
+:10FA700030C600FF30E7FFFF274801808F4201B802
+:10FA80000440FFFE8F820050AD0200008F4201242F
+:10FA9000AD0200048D220020A5070008A102000A83
+:10FAA00024020016A102000B934301208D220008BE
+:10FAB0008D240004306300FF00431021978300422F
+:10FAC000004410218D250024004310233C0308002E
+:10FAD0008C6331A08F840028A502000C246300E809
+:10FAE0002402FFFFA50A000EA5030010A5060012C0
+:10FAF000AD050018AD020024948201142403FFF721
+:10FB00003042FFFFAD0200288C820118AD02002CAC
+:10FB10003C021000AD000030AF4201B88D22002041
+:10FB20000043102403E00008AD2200208F8200284B
+:10FB300030E7FFFF00804821904200D330A5FFFF4F
+:10FB400030C600FF0002110030420F0000E23825ED
+:10FB5000274801808F4201B80440FFFE8F82005089
+:10FB6000AD0200008F420124AD0200048D2200206E
+:10FB7000A5070008A102000A24020017A102000B39
+:10FB8000934301208D2200088D240004306300FF80
+:10FB90000043102197830042004410218F840028E5
+:10FBA000004310233C0308008C6331A0A502000C25
+:10FBB000A505000E246300E8A5030010A5060012A9
+:10FBC000AD0000148D220024AD0200188C82005C70
+:10FBD000AD02001C8C820058AD0200202402FFFF01
+:10FBE000AD020024948200E63042FFFFAD020028FF
+:10FBF00094820060948300BE30427FFF3063FFFF39
+:10FC00000002120000431021AD02002C3C02100043
+:10FC1000AD000030AF4201B8948200BE2403FFF76C
+:10FC200000A21021A48200BE8D22002000431024D7
+:10FC300003E00008AD220020274301808F4201B875
+:10FC40000440FFFE24020018AC640000A062000B18
+:10FC50008F820028944200E6A46200103C0210004B
+:10FC6000AC60003003E00008AF4201B827430180D8
+:10FC70008F4201B80440FFFE8F82002C9442001C8A
+:10FC80003042FFFF000211C0AC62000024020019E4
+:10FC9000A062000B3C021000AC60003003E00008E2
+:10FCA000AF4201B88F87003430C300FF8F4201B8E4
+:10FCB0000440FFFE8F82005034636000ACA200005D
+:10FCC0009382004CA0A200058CE20010A4A20006C2
+:10FCD000A4A300088C8200202403FFF7A0A2000A3E
+:10FCE00024020002A0A2000B8CE20000ACA20010D3
+:10FCF0008CE20004ACA200148CE2001CACA2002434
+:10FD00008CE20020ACA200288CE2002CACA2002CDB
+:10FD10008C820024ACA200183C021000AF4201B853
+:10FD20008C8200200043102403E00008AC820020F5
+:10FD30009382004C2403000127BDFFE800433004F8
+:10FD40002C420020AFB00010AFBF00142410FFFE03
+:10FD500010400005274501803C0208008C4231908C
+:10FD60000A00159C004610243C0208008C42319485
+:10FD70000046102414400007240600848F830028C6
+:10FD80002410FFFF906200623042000F34420040B6
+:10FD9000A06200620E001568000000000200102141
+:10FDA0008FBF00148FB0001003E0000827BD0018BB
+:10FDB0008F83002C27BDFFE0AFB20018AFB1001455
+:10FDC000AFB00010AFBF001C9062000D00A09021EA
+:10FDD00030D100FF3042007FA062000D8F850028E7
+:10FDE0008E430018008080218CA2007C14620005E4
+:10FDF0002402000E90A20063344200200A0015C5C0
+:10FE0000A0A200630E00158BA382004C2403FFFF09
+:10FE1000104300472404FFFF52200045000020212A
+:10FE20008E4300003C020010006210245040000489
+:10FE30003C020008020020210A0015D4240200150B
+:10FE400000621024504000098E450000020020216D
+:10FE5000240200140E00158BA382004C2403FFFF24
+:10FE6000104300332404FFFF8E4500003C020002D3
+:10FE700000A21024104000163C0200048F86002CC3
+:10FE80008CC200148CC300108CC4001400431023D7
+:10FE90000044102B50400005020020218E43002C0E
+:10FEA0008CC2001010620003020020210A00160517
+:10FEB000240200123C02000400A210245040001C46
+:10FEC00000002021020020210A0016052402001350
+:10FED00000A21024104000068F83002C8C620010BA
+:10FEE00050400013000020210A0015FF02002021CD
+:10FEF0008C620010504000048E42002C0200202131
+:10FF00000A001605240200115040000900002021BB
+:10FF100002002021240200170E00158BA382004C42
+:10FF20002403FFFF104300022404FFFF00002021F0
+:10FF30008FBF001C8FB200188FB100148FB000105B
+:10FF40000080102103E0000827BD002093830030CB
+:10FF500027BDFFE024020034AFB20018AFB1001497
+:10FF6000AFBF001CAFB00010008088211462000CED
+:10FF700000A090218F8400340E0014B48C900030C7
+:10FF80001202000724020005022020210E00158B1A
+:10FF9000A382004C2403FFFF1043005F2404FFFFF3
+:10FFA00092420004104000098F8200280220202184
+:10FFB0002402000C0E00158BA382004C2403FFFFCB
+:10FFC000104300552404FFFF8F820028A3800024E3
+:10FFD0008E4300048C4400803C0200FF3442FFFF4B
+:10FFE000006218240083202B10800008AF83003C9F
+:10FFF00002202021240200190E00158BA382004C40
+:020000040001F9
+:100000002403FFFF104300442404FFFF97820042B3
+:100010008F8700448F88003C00471023110000396F
+:10002000A78200428F8600283045FFFF8F84005052
+:1000300090C300BC3C0208008C4231A0000318822F
+:100040003070000100822021001010800102102178
+:1000500000A2282B10A00010248200888F84003476
+:100060001082000D3C033F018E420000004310242B
+:100070003C0325001443000630E500FF8C8200009D
+:10008000ACC200888C8200100A001665ACC20098D1
+:100090000E001489000030218F85003C93830024DA
+:1000A0008F86002830A20003000210233042000394
+:1000B00000433821A387002494C400E400A228212F
+:1000C0008F8300448F82004834841000A4C400E46D
+:1000D00000431021AF8200481200000EAF8500449B
+:1000E00024E20004A382002494C200E424A30004B8
+:1000F000AF83004434422000A4C200E40A00168505
+:10010000000020218F820048AF800044004710216A
+:10011000AF820048000020218FBF001C8FB2001862
+:100120008FB100148FB000100080102103E0000890
+:1001300027BD00208F86002827BDFFE8AFBF001431
+:10014000AFB0001090C200633042002010400008A1
+:1001500030A500FF8CC2007C2403FFDF2442000195
+:10016000ACC2007C90C2006300431024A0C20063B4
+:1001700010A000238F83002827500180020028212F
+:100180000E001568240600828F82002890420063CA
+:100190003042004050400019A380004C8F8300344F
+:1001A0008F4201B80440FFFE8F820050AE02000073
+:1001B00024026082A602000824020002A202000BB0
+:1001C0008C620008AE0200108C62000CAE020014BB
+:1001D0008C620014AE0200188C620018AE0200247B
+:1001E0008C620024AE0200288C620028AE02002C33
+:1001F0003C021000AF4201B8A380004C8F8300285E
+:100200008FBF00148FB000109062006327BD0018EC
+:100210003042007FA0620063978200428F860044D4
+:100220008F8500289383003000461023A782004268
+:10023000A4A000E490A400638F820048AF83004430
+:100240002403FFBF0046102100832024AF82004812
+:10025000A0A400638F820028A04000BD8F820028E8
+:1002600003E00008A44000BE8F8A002827BDFFE0FD
+:10027000AFB10014AFB000108F880044AFBF0018BA
+:1002800093890024954200E430D100FF0109182B26
+:100290000080802130AC00FF3047FFFF0000582174
+:1002A00014600003310600FF0120302101095823AA
+:1002B000978300420068102B1440003200000000B9
+:1002C00014680007240200018E0200202403FFFBB3
+:1002D00034E7800000431024AE0200202402000115
+:1002E00034E70880158200053165FFFF0E0014D940
+:1002F000020020210A00171A020020210E00150A10
+:10030000020020210E00154D8F8400508F8400289C
+:100310009482006024420001A48200609482006004
+:100320003C0308008C63318830427FFF5443000F48
+:1003300002002021948200602403800000431024E6
+:10034000A48200609082006090830060304200FFD1
+:10035000000211C200021027000211C03063007FAA
+:1003600000621825A08300600200202102202821BD
+:100370008FBF00188FB100148FB000100A00168CC8
+:1003800027BD0020914200632403FF800043102515
+:10039000A1420063978200423048FFFF1100002015
+:1003A000938300248F840028004B1023304600FFE5
+:1003B000948300E42402EFFF0168282B00621824D4
+:1003C000A48300E414A000038E0200200100582141
+:1003D000000030212403FFFB34E780000043102499
+:1003E000AE02002024020001158200053165FFFFE6
+:1003F0000E0014D9020020210A0017429783004200
+:100400000E00150A02002021978300428F820044CB
+:10041000A780004200431023AF820044938300244E
+:100420008F8200288FBF00188FB100148FB000108A
+:1004300027BD002003E00008A04300BD8F820028F4
+:1004400090430088904500BD244900883063003FF8
+:100450002463FFE024020001006238042C630020C2
+:1004600030E80019A385002410600010AF89003423
+:100470003C028000344200022405000124060001F1
+:100480001500000800E2182400002821146000056F
+:1004900030E20020104000052405000191260001F3
+:1004A00030C600010A0016D90000000003E0000871
+:1004B0000000000027BDFFD8AFB000108F900034BF
+:1004C000AFB40020AFB10014AFBF0024AFB3001C25
+:1004D000AFB200188E0500103C0208008C4231B00B
+:1004E0008F86003830A33FFF0062182B8CD3001496
+:1004F000008088218CD20020106000780000A021AC
+:1005000090C3000D2402FF8000431024304200FFFE
+:100510005040007302202021000513823042000366
+:100520005440006F0220202194C3001C8F820028B9
+:100530008E050028A44301148CC200100262182307
+:10054000146500072402001F8F82003C0062102106
+:100550000262102B104000088F83002C2402001828
+:100560000E00158BA382004C2403FFFF1043006F85
+:100570002404FFFF8F83002C8F84003C8C620010CA
+:100580000244902100441023AC6200108F820028A6
+:10059000AC7200208C4200680052102B1040000901
+:1005A0008F830038022020212402001D0E00158BAD
+:1005B000A382004C2403FFFF1043005C2404FFFFD0
+:1005C0008F8300388E0200248C63002410430007C0
+:1005D000022020212402001C0E00158BA382004C57
+:1005E0002403FFFF104300512404FFFF8F84002CDD
+:1005F0008C82002424420001AC82002412530004A7
+:100600008F8200288C4200685642000E8E02000045
+:100610008E0200003C030080004310241440000DB3
+:100620002402001A022020210E00158BA382004C08
+:100630002403FFFF1043003D2404FFFF0A0017D6E8
+:100640008E0200143C03008000431024504000033D
+:100650008E020014AC8000208E0200142412FFFFD2
+:10066000105200062402001B022020210E00158BD0
+:10067000A382004C1052002D2404FFFF8E030000C3
+:100680003C020001006210241040001F3C02008068
+:100690000062102414400008022020212402001AC5
+:1006A0000E00158BA382004C2403FFFF1043001F94
+:1006B0002404FFFF02202021020028210E0015AB98
+:1006C000240600012403FFFF2404FFFF1443000E4F
+:1006D000241400010A00180B8FBF002402202021DF
+:1006E0002402000D8FBF00248FB400208FB3001CA4
+:1006F0008FB200188FB100148FB0001027BD0028F2
+:100700000A00158BA382004C8F83002C022020212D
+:100710000280302194620036240500012442000149
+:100720000E0016D9A4620036000020218FBF0024DD
+:100730008FB400208FB3001C8FB200188FB100144B
+:100740008FB000100080102103E0000827BD0028B2
+:100750008F83002827BDFFD8AFB40020AFB3001CA3
+:10076000AFB20018AFB10014AFB00010AFBF00249B
+:10077000906200638F9100342412FFFF34420040E6
+:1007800092250000A06200638E2200100080982154
+:1007900030B0003F105200060360A0212402000D7B
+:1007A0000E00158BA382004C105200522404FFFF50
+:1007B0008F8300288E2200188C63007C1043000772
+:1007C000026020212402000E0E00158BA382004C33
+:1007D0002403FFFF104300472404FFFF24040020EC
+:1007E000120400048F8300289062006334420020CA
+:1007F000A06200638F85003C10A0001E0000000076
+:10080000560400048F820028026020210A00185537
+:100810002402000A9683000A2404FFFD944200602B
+:100820003042FFFF104300348FBF00243C02080019
+:100830008C42318C0045102B1440000602602021B0
+:10084000000028210E0016D9240600010A00187C99
+:10085000000020212402002D0E00158BA382004CE5
+:100860002403FFFF104300232404FFFF0A00187C29
+:1008700000002021160400058F8400288E23001418
+:100880002402FFFF50620018026020219482006061
+:1008900024420001A4820060948200603C030800AE
+:1008A0008C63318830427FFF5443000F0260202167
+:1008B000948200602403800000431024A48200601E
+:1008C0009082006090830060304200FF000211C2FD
+:1008D00000021027000211C03063007F006218255B
+:1008E000A0830060026020210E00168C2405000108
+:1008F000000020218FBF00248FB400208FB3001C84
+:100900008FB200188FB100148FB00010008010213A
+:1009100003E0000827BD00288F83002827BDFFE8DB
+:10092000AFB00010AFBF0014906200638F87003437
+:1009300000808021344200408CE60010A0620063F9
+:100940003C0308008C6331B030C23FFF0043102BE2
+:100950001040004E8F8500382402FF8090A3000DC8
+:1009600000431024304200FF504000490200202183
+:10097000000613823048000324020002550200449E
+:100980000200202194A2001C8F850028240300234C
+:10099000A4A201148CE60000000616023042003FBB
+:1009A000104300103C0300838CE300188CA2007CF1
+:1009B000106200062402000E0E00158BA382004C6C
+:1009C0002403FFFF104300382404FFFF8F83002817
+:1009D0009062006334420020A06200630A0018C1E4
+:1009E0008F83002C00C31024144300078F83002C36
+:1009F00090A200623042000F34420020A0A20062A8
+:100A0000A38800408F83002C9062000D3042007F4D
+:100A1000A062000D8F83003C1060001802002021AE
+:100A20008F8400388C8200100043102B1040000986
+:100A300024020018020020210E00158BA382004C16
+:100A40002403FFFF104300182404FFFF0A0018E9E5
+:100A5000000020218C8200102405000102002021CA
+:100A6000004310238F83002C240600010E0016D9AA
+:100A7000AC6200100A0018E9000020210E00168C5C
+:100A8000240500010A0018E90000202102002021AD
+:100A90002402000D8FBF00148FB0001027BD001876
+:100AA0000A00158BA382004C8FBF00148FB000107A
+:100AB0000080102103E0000827BD001827BDFFD8E3
+:100AC000AFB000108F900034AFB3001CAFBF002058
+:100AD000AFB20018AFB100148E1200103C03080032
+:100AE0008C6331B032423FFF0043102B1040007C3A
+:100AF000008098218F8500382402FF8090A3000D8C
+:100B000000431024304200FF504000760260202154
+:100B10000012138230420003240300015443007189
+:100B20000260202190A2000D3042000854400003D2
+:100B30008F82003C0A00191924020024504000034F
+:100B40008E03000C0A001919240200278CA2002031
+:100B500014620005240200208E0300088CA20024E9
+:100B600010620008240200200E00158BA382004CA6
+:100B70002403FFFF1043006A2404FFFF0A00194406
+:100B80008F84002C8E0200142411FFFF14510003E7
+:100B90008F8700280A00193F240200258E030018C1
+:100BA0008CE2007C146200162402000E8E030024E6
+:100BB0008CA2002814620012240200218E06002854
+:100BC0008CA2002C14C2000E2402001F8E03002CE5
+:100BD0001060000B240200238CE200680043102BFD
+:100BE00014400007240200268CA20014006618217D
+:100BF0000043102B504000078F84002C2402002259
+:100C00000E00158BA382004C105100452404FFFFF9
+:100C10008F84002C2403FFF79082000D00431024E2
+:100C2000A082000D8F8600283C0308008C6331AC45
+:100C30008F82005094C400E08F85002C0043102167
+:100C400030847FFF00042040004410213043007FA7
+:100C5000034320213C03000E008320212403FF8056
+:100C600000431024AF42002CA49200008CA2002864
+:100C700024420001ACA200288CA2002C8E03002C80
+:100C800000431021ACA2002C8E02002CACA200303C
+:100C90008E020014ACA2003494A2003A2442000157
+:100CA000A4A2003A94C600E03C0208008C4231B095
+:100CB00024C4000130837FFF1462001300803021C0
+:100CC000240280000082302430C2FFFF000213C2E1
+:100CD000304200FF000210270A001981000233C0D1
+:100CE000026020212402000D8FBF00208FB3001C62
+:100CF0008FB200188FB100148FB0001027BD0028EC
+:100D00000A00158BA382004C8F82002802602021EC
+:100D1000240500010E00168CA44600E000002021EE
+:100D20008FBF00208FB3001C8FB200188FB100144A
+:100D30008FB000100080102103E0000827BD0028BC
+:100D400027BDFFE0AFB100148F910034AFB00010A9
+:100D5000AFBF00188E2600103C0308008C6331B032
+:100D600030C23FFF0043102B1040005E0080802106
+:100D70008F8500382402FF8090A3000D00431024CB
+:100D8000304200FF50400058020020218F82003C7A
+:100D900010400008000613828F8200289763000A23
+:100DA0002404FFFD944200603042FFFF10430055D1
+:100DB00000061382304200031440000E00000000C1
+:100DC00092220002104000058E230024506000157E
+:100DD000922300030A0019BA020020218CA20024E9
+:100DE0005062001092230003020020210A0019C261
+:100DF0002402000F90A2000D304200085440000968
+:100E00009223000302002021240200100E00158B03
+:100E1000A382004C2403FFFF1043003A2404FFFF89
+:100E200092230003240200025462000C9222000369
+:100E30008F82003C544000099222000302002021CE
+:100E40002402002C0E00158BA382004C2403FFFF0C
+:100E50001043002C2404FFFF9222000302202821CB
+:100E600002002021384600102CC600012C4200014F
+:100E70000E0015AB004630252411FFFF1051002154
+:100E80002404FFFF8F83003C106000120200202129
+:100E90003C0208008C42318C0043102B14400006A9
+:100EA00000000000000028210E0016D924060001D1
+:100EB0000A001A00000020212402002D0E00158BCC
+:100EC000A382004C1051000F2404FFFF0A001A00F7
+:100ED000000020210E00168C240500010A001A00D3
+:100EE00000002021020020212402000D8FBF0018E5
+:100EF0008FB100148FB0001027BD00200A00158BA1
+:100F0000A382004C8FBF00188FB100148FB0001067
+:100F10000080102103E0000827BD002093830040DB
+:100F200027BDFFE024020002AFB10014AFB00010F3
+:100F300000808821AFBF0018000080211062008C63
+:100F40002404FFFD978500428F83004430A2FFFFF9
+:100F50000043102B5440007D8F8400480E00144C39
+:100F6000000000003C020800244275940220202169
+:100F7000004028210E001612AF8200342409FFFF22
+:100F80001049007B2404FFFF3C0808008D0875A46D
+:100F90003C0208008C4231B03C0308009063759419
+:100FA00031043FFF0082102B1040001B3067003FD0
+:100FB0003C0208008C4231A88F830050000421803D
+:100FC00000621821006418213062007F034228214A
+:100FD0003C02000C00A228213C02008034420001A7
+:100FE0003066007800C230252402FF8000621024A1
+:100FF000AF42002830640007AF4208048F82002807
+:101000000344202124840940AF460814AF85002CF6
+:10101000AF840038AC4301189383004024020003DE
+:101020001462003B240200012402002610E2003D6D
+:1010300028E200271040001324020032240200227C
+:1010400010E2003828E200231040000824020024A7
+:101050002402002010E200242402002110E2001EDD
+:10106000022020210A001A7F2402000B10E2002D2A
+:101070002402002510E20010022020210A001A7F1D
+:101080002402000B10E2001A28E200331040000690
+:101090002402003F2402003110E2000B0220202134
+:1010A0000A001A7F2402000B10E200110220202106
+:1010B0000A001A7F2402000B0E00176C0220202168
+:1010C0000A001A9A004080210E0018EE022020210A
+:1010D0000A001A9A004080210E00198F0220202158
+:1010E0000A001A9A004080211509000E0000000035
+:1010F0000E001813022020210A001A9A00408021B5
+:101100000E00158BA382004C0A001A9A0040802121
+:1011100014620017020020212402002314E20005BB
+:101120002402000B0E001885022020210A001A9AC2
+:101130000040802102202021A382004C0E00158B4C
+:101140002410FFFF0A001A9B0200202130A500FF97
+:101150000E00148924060001978300428F82004408
+:10116000A780004200431023AF82004402002021E8
+:101170008FBF00188FB100148FB0001000801021B5
+:1011800003E0000827BD002027BDFFE0AFB1001439
+:10119000AFBF0018AFB000108F4601283C03080015
+:1011A0008C6331A02402FF80AF86005000C3182159
+:1011B0003065007F03452821006218243C02000AA4
+:1011C000AF43002400A2282190A200620080882161
+:1011D000AF850028304200FF00021102A3820040C8
+:1011E00090A200BC304200021440000224030034EC
+:1011F000240300308F820028A383003093830040B3
+:101200008C4200C0A380004CAF8200442402000442
+:10121000106200308F8400448E2400045080002D22
+:101220008F8400448E2200103083FFFFA784004289
+:101230001060001FAF8200488F8300282405FF80C4
+:10124000022020219062006300A21024304200FF9F
+:101250001440000D000000000E001A069790004296
+:1012600010400010004018212402FFFD54620011BC
+:101270008E230020020028210E00142A02202021A3
+:101280000A001AEC8E2300209062006300A2102452
+:10129000304200FF10400003022020210E00174EB4
+:1012A00000000000978200421440FFE48F83002872
+:1012B0008E23002030620004104000068F8400441A
+:1012C0002402FFFB006210240E00143EAE22002018
+:1012D0008F8400448F8300288FBF00188FB10014C3
+:1012E0008FB000102402000127BD002003E0000899
+:1012F000AC6400C030A500FF2403000124A9000154
+:101300000069102B1040000C00004021240A00014D
+:1013100000A31023004A3804246300013082000136
+:101320000069302B104000020004204201074025D4
+:1013300054C0FFF800A3102303E0000801001021AF
+:1013400027BDFFE03C021EDCAFB20018AFB10014B5
+:10135000AFBF001CAFB0001034526F4100008821B5
+:10136000240500080E001AFC0220202100118080B4
+:101370003C07080024E771940002160002071821B8
+:10138000AC6200000000282124A200013045FFFFCC
+:101390008C6200002CA600080441000200022040DC
+:1013A0000092202614C0FFF8AC64000002078021E0
+:1013B0008E0400000E001AFC2405002026230001E4
+:1013C0003071FFFF2E2301001460FFE5AE02000024
+:1013D0008FBF001C8FB200188FB100148FB00010A7
+:1013E00003E0000827BD00203C02080024426A8474
+:1013F0003C010800AC2271883C02080024425000E5
+:101400003C010800AC22718C240200063C0108005B
+:10141000A02271900A001B0F0000000027BDFFD81A
+:10142000AFB3001CAFB20018AFBF0020AFB10014C3
+:10143000AFB000108F5101408F480148000894025E
+:10144000324300FF311300FF8F4201B80440FFFE1A
+:1014500027500180AE1100008F420144AE0200040B
+:1014600024020002A6120008A202000B24020014AB
+:10147000AE130024106200252862001510400008F9
+:101480002402001524020010106200302402001211
+:10149000106200098FBF00200A001C308FB3001CAF
+:1014A0001062006724020022106200378FBF002004
+:1014B0000A001C308FB3001C3C0208008C4231A093
+:1014C0002403FF800222102100431024AF42002495
+:1014D0003C0208008C4231A0022210213042007FE1
+:1014E000034218213C02000A00621821166000B372
+:1014F000AF830028906200623042000F3442003017
+:10150000A06200620A001C2F8FBF00203C04600014
+:101510008C832C083C02F0033442FFFF0062182445
+:10152000AC832C083C0208008C4231A08C832C0830
+:101530002442007400021082000214800062182508
+:10154000AC832C080A001C2F8FBF00203C0208002F
+:101550008C4231A02403FF8002221021004310247A
+:10156000AF4200243C0208008C4231A03C03000A38
+:10157000022210213042007F03421021004310213B
+:101580000A001C2EAF8200283C0208008C4231A0C9
+:101590002404FF800222102100441024AF420024C2
+:1015A0003C0208008C4231A0022210213042007F10
+:1015B000034218213C02000A006218219062006375
+:1015C00000821024304200FF1040007CAF830028CE
+:1015D00024620088944300123C0208008C4231A827
+:1015E00030633FFF000319800222102100431021C5
+:1015F0003043007F03431821004410243C04000CB6
+:1016000000641821AF4200280E00155AAF83002C49
+:101610008F4201B80440FFFE00000000AE11000040
+:101620008F420144AE02000424020002A612000808
+:10163000A202000BAE1300240A001C2F8FBF002053
+:101640002406FF8002261024AF4200203C0208003E
+:101650008C4231A031043FFF00042180022210217E
+:1016600000461024AF4200243C0308008C6331A8DC
+:101670003C0208008C4231A03227007F022318214F
+:1016800002221021006418213042007F3064007F64
+:10169000034228213C02000A0066182400A22821E7
+:1016A000034420213C02000C00822021AF4300288B
+:1016B0003C0200080347182100629021AF850028F2
+:1016C000AF84002C0E00155A010080218F4201B812
+:1016D0000440FFFE8F82002C8F8400282745018064
+:1016E0009042000DACB10000A4B00006000216004C
+:1016F0000002160300021027000237C214C00016B1
+:10170000248200889442001232033FFF30423FFFA0
+:101710001443001224026082908300632402FF803D
+:1017200000431024304200FF5040000C240260822D
+:10173000908200623042000F34420040A08200627A
+:1017400024026084A4A200082402000DA0A20005C7
+:101750000A001C193C02270024026082A4A200088F
+:10176000A0A000053C02270000061C00006218250E
+:1017700024020002A0A2000BACA30010ACA0001435
+:10178000ACA00024ACA00028ACA0002C8E42004CE1
+:101790008F84002CACA200189083000D2402FF80DF
+:1017A00000431024304200FF104000058FBF00208E
+:1017B0009082000D3042007FA082000D8FBF00207C
+:1017C0008FB3001C8FB200188FB100148FB00010BF
+:1017D0003C02100027BD002803E00008AF4201B81A
+:1017E00008004C2808004C2808004BA008004BD8E3
+:1017F00008004C0C08004C3008004C3008004C30FD
+:0418000008004B1081
+:0C1804000A0001220000000000000000AB
+:101810000000000D747061342E362E313600000049
+:10182000040610010000000000000000000000009D
+:1018300000000000000000000000000000000000A8
+:101840000000000000000000000000000000000098
+:101850000000000000000000000000000000000088
+:101860000000000000000000000000000000000078
+:101870000000000000000000000000000000000068
+:101880000000000000000000000000000000000058
+:1018900010000003000000000000000D0000000D1B
+:1018A0003C02080024421B803C03080024632014EF
+:1018B000AC4000000043202B1480FFFD24420004B4
+:1018C0003C1D080037BD2FFC03A0F0213C10080090
+:1018D000261004883C1C0800279C1B800E00015A1F
+:1018E000000000000000000D3084FFFF3082000780
+:1018F0008F85001810400002248300073064FFF831
+:101900000085302130C41FFF03441821247B400090
+:10191000AF85001CAF84001803E00008AF440084CA
+:101920003084FFFF308200078F8500208F860028DB
+:1019300010400002248300073064FFF80085202156
+:101940000086182B14600002AF8500240086202337
+:101950000344282134068000AF840020AF44008077
+:1019600000A6202103E00008AF84003827BDFFD87F
+:10197000AFB3001CAFB20018AFB00010AFBF00246F
+:10198000AFB40020AFB100143C0860088D145000C3
+:101990002418FF7F3C1A8000029898243672380C75
+:1019A000AD1250008F5100083C07601C3C086000DD
+:1019B00036300001AF500008AF800018AF40008003
+:1019C000AF4000848CE600088D0F08083C076016C5
+:1019D0008CEC000031EEFFF039CA00103C0DFFFF27
+:1019E000340B80003C030080034B48212D44000150
+:1019F000018D28243C0253533C010800AC230420F1
+:101A0000AF890038AF860028AF840010275B400004
+:101A100014A2000334E37C008CF90004032818218D
+:101A20008C7F007C8C6500783C0280003452007012
+:101A3000AF85003CAF9F00403C13080026731BC4D9
+:101A40000240A0218E4800008F46000038C30001EC
+:101A50003064000110800017AF88003402804821F4
+:101A60008D2D00003C1908008F39045C3C110800E2
+:101A70008E31045801A8F823033F7821000040214B
+:101A80000228382101FF802B00F070213C01080062
+:101A9000AC2F045C3C010800AC2E04588F4C0000B5
+:101AA000398B0001316A00011540FFED01A0402192
+:101AB000AF8D00348E4E00003C0C08008D8C045C11
+:101AC0003C0A08008D4A045801C86823018D28216A
+:101AD0000000582100AD302B014B20210086102141
+:101AE0003C010800AC25045C3C010800AC22045811
+:101AF0008F4501088F44010030A92000AF85000008
+:101B0000AF84000C1120000A00A030213C0708001F
+:101B10008CE7042C24EF00013C010800AC2F042CBE
+:101B20003C104000AF5001380A0001900000000056
+:101B300030B002001600001424110F0010910012A2
+:101B400024070D001087023330B000065200FFF565
+:101B50003C104000936D0000240C001031A600F0F2
+:101B600010CC0269240E007010CE02DD8F8B0014A1
+:101B700025670001AF8700143C104000AF500138CA
+:101B80000A00019000000000974801041100FFE5E1
+:101B90003C10400030B84000170000A200000000D8
+:101BA0008F5901780720FFFE8F870038240900082D
+:101BB000240508008CE30008AF450178A7490140DF
+:101BC000A7400142974201048F8600003049FFFF81
+:101BD00030DF000113E002D5012040212524FFFE63
+:101BE000240A0002A74A01463088FFFFA7440148A3
+:101BF0003C0B08008D6B043C156002C48F8F000CF9
+:101C000030C30020146000022404000924040001F1
+:101C100030CD0C00240C040051AC000134840004CD
+:101C2000A744014A3C0508008CA504203C0200485A
+:101C30003C19000100A2F82530D8000203F928253C
+:101C400013000004000018213C04010000A4282512
+:101C50002403000130CA000451400005AF8300088E
+:101C60003C06001000A6282524030001AF830008CD
+:101C7000AF45100000000000000000000000000060
+:101C8000000000008F8300081060002300000000A7
+:101C90008F4B10000561FFFE000000001060001E69
+:101CA000000000008F4D10003C03002001A36024C1
+:101CB000118000198F8F000031EE000211C0001654
+:101CC00000000000975010141600001300000000E0
+:101CD0009745100830BFFFFF27F800060018C8829C
+:101CE0000019308000C7282133110001330300039D
+:101CF000122003208CA200000000000D00C7F82174
+:101D0000AFE200003C1908008F390430272600019B
+:101D10003C010800AC2604308F6A00003405FFFF48
+:101D2000AF8A00048CE200001045029A00002021D6
+:101D30008CE5000030BF010013E0027E010020218D
+:101D40003C0708008CE704743C1008008E10044C1B
+:101D500000E858213C1808008F1804700168882B8F
+:101D60003C0808008D080448000078210204602126
+:101D7000030F18210184702B010F6821007150217D
+:101D800001AE10213C010800AC2C044C3C010800C1
+:101D9000AC2204483C010800AC2B04743C01080050
+:101DA000AC2A04708F8D00180120302131290007E2
+:101DB00025AE000831C21FFF03426021AF8D001C19
+:101DC000AF820018259B4000AF4200841120000321
+:101DD0008F90002024C800073106FFF88F84002868
+:101DE00000D0282100A4782B15E00002AF90002439
+:101DF00000A4282303452021340380000083102100
+:101E00003C061000AF850020AF820038AF4500804F
+:101E1000AF4601788F8B0014256700010A0001DDB1
+:101E2000AF8700148F6200088F6700002411003014
+:101E30000007C602330300F0107100A2241900400D
+:101E40001479FF4B8F8B00148F4A01780540FFFEF9
+:101E500030A7020014E00003000512820000000D0C
+:101E6000000512823050000300104900013070213B
+:101E7000000E688001B06021000C58800173802141
+:101E80008E08000015000002000000000000000D98
+:101E90008F6F000405E202B192030006920700056D
+:101EA000920F00043C0200010007288000B060216E
+:101EB0008D8900182771000825EE00050122682190
+:101EC000000E3082AD8D0018022020210E0005800A
+:101ED00026050014920B00068F7F00043C087FFF4C
+:101EE000000B2080009130218CC30004350AFFFFD5
+:101EF00003EAC8240079C021ACD800049207000589
+:101F000092090004960D00080007288000B1F8210E
+:101F10008FEF0000974201043C07FFFF01E75024C8
+:101F2000304EFFFF01C96021018D58233168FFFF4A
+:101F300001482025AFE400009203000724190001A6
+:101F4000107902692406000310660279000000007F
+:101F50008E190010241F000AA75F0140A7590142F3
+:101F6000920300048F86000024070001A743014468
+:101F7000A74001469758010430D100023C050041BA
+:101F8000A758014800001821A747014A1220000362
+:101F900030CA00043C050141240300015140000502
+:101FA000AF8300083C08001000A828252403000186
+:101FB000AF830008AF4510000000000000000000E3
+:101FC00000000000000000008F8B0008116000047A
+:101FD000000000008F4410000481FFFE000000009C
+:101FE0008F6A0000920700043C0508008CA5044499
+:101FF000AF8A0004975F01043C0F08008DEF044096
+:1020000030E300FF33F9FFFF0079C02100B86821F9
+:102010000000102124E6000A30C8FFFF01B8482B59
+:1020200001E2702101C96021311000073C01080064
+:10203000AC2D04443C010800AC2C04401200000309
+:102040008F8D0018250B00073168FFF8010D7021F6
+:1020500031CC1FFFAF8D001CAF8C0018AF4C00843B
+:1020600097440104034C80213084FFFF308800072F
+:1020700011000003261B4000248900073124FFF8CB
+:102080008F8200208F850028008220210085782BF8
+:1020900015E00002AF82002400852023034488213C
+:1020A00034058000022510213C061000AF8400207A
+:1020B000AF820038AF440080AF4601780A00028545
+:1020C0008F8B00148F5F017807E0FFFE30AA0200BB
+:1020D00015400003000542820000000D0005428209
+:1020E000310200030002710001C26821000D60800E
+:1020F000018248210009288000B380218E0B000056
+:1021000011600002000000000000000D8F6F000C45
+:1021100005E001F38F87003824190001AE19000093
+:102120008CE30008A20000078F78000400181C024E
+:10213000306600FF24D10005001130832CC400411B
+:1021400014800002A20300040000000D8F6B000445
+:102150003C0EFFFF00E028213164FFFF248F000BBD
+:10216000000F408200081080004748218D2D00009C
+:1021700026040014A60B000801AE60240E000580A2
+:10218000AD2C00008F5F01083C0A100003EA3824E0
+:1021900010E001A30000000097460104920300072D
+:1021A00024D1FFEC346500023224FFFFA2050007B2
+:1021B000960600082CC7001354E0000592030007A0
+:1021C000920A0007355F0001A21F00079203000773
+:1021D000240B0001106B01BA24090003106901CD22
+:1021E0008F88003830CFFFFF25E400020004C88349
+:1021F000333F00FF001F2880A219000500A85821C6
+:102200008D780000975101043C03FFFF0303602415
+:102210003222FFFF004F702325CDFFFE018D4825A0
+:10222000AD690000920600053C02FFF6344EFFFF48
+:1022300030CA00FF000A388000F020219099001475
+:102240003C1FFF7F37E7FFFF3323000F0066782135
+:1022500031F800FF0018288000B088218E2D002062
+:1022600000A86021A20F000601AE4824AE0D000CAC
+:10227000AD89000C920B00068E04000C0127F82497
+:10228000000B50800150C821972600260148C0212C
+:1022900000874024AF260024AE08000CAF3F00208A
+:1022A000AF0600108F860000240C001024090002E5
+:1022B000A74C0140A7400142A7400144A74901465D
+:1022C000974B01042407000130C80002256AFFFE75
+:1022D000A74A01483C050009A747014A110000032D
+:1022E000000018213C0501092403000130CD000441
+:1022F00051A00005AF8300083C06001000A6282569
+:1023000024030001AF830008AF4510000000000067
+:10231000000000000000000000000000921800040F
+:1023200027110002322F0007000F1023304E000744
+:10233000AE0E00108F900008120000040000000094
+:102340008F4310000461FFFE000000008F78000042
+:102350008F8F00183C1008008E100444AF980004C2
+:102360009751010425E6001030CA1FFF3222FFFFFB
+:10237000AF8F001CAF8A0018AF4A00842449FFFECB
+:102380003C0B08008D6B0440974E0104012068212E
+:10239000000967C3020D282131C9FFFF00AD402BA2
+:1023A000016C382100E82021034AF8213139000767
+:1023B0003C010800AC2504443C010800AC24044066
+:1023C0001320000327FB4000252300073069FFF896
+:1023D0008F9F00208F840028013F382100E4C82B04
+:1023E00017200002AF9F002400E438230347202178
+:1023F00034058000008510213C061000AF870020C6
+:10240000AF820038AF470080AF4601780A000285EE
+:102410008F8B0014975801041300FDC23C1040003C
+:102420008F4301780460FFFE30B9400013200003A1
+:102430003C0400080000000D3C040008AF440140CB
+:1024400024080800AF4801788F8B0000974A0104E8
+:10245000317F000113E000E93146FFFF24D0FFFE89
+:10246000240C0002A74C0146A75001488F8F00188A
+:102470002405000DA745014A8F71000025E20008E0
+:1024800030491FFF0349702130CD0007AF91000490
+:10249000AF8F001CAF89001800C03821AF490084FD
+:1024A00011A0000325DB400024C6000730C7FFF859
+:1024B0008F9800208F84002800F8302100C4382B2A
+:1024C00014E00002AF98002400C430238F8A001467
+:1024D00003465821340880000168F821255900017D
+:1024E0003C0310003C104000AF860020AF9F003836
+:1024F000AF460080AF430178AF990014AF50013868
+:102500000A000190000000008F6900009744010458
+:102510003127FFFF3088FFFF8F4F017805E0FFFE76
+:1025200030FF0007001F18233078000724E6FFFE65
+:102530002419000AA7590140A7580142A74601449F
+:10254000A7400146A74801488F42010830510020AA
+:1025500016200002240300092403000130AA00020F
+:10256000A743014A3C040041114000030000182128
+:102570003C0401412403000130AB0004516000051C
+:10258000AF8300083C0500100085202524030001CE
+:10259000AF830008AF4410000000000000000000FE
+:1025A00000000000000000008F90000812000004EE
+:1025B000000000008F4C10000581FFFE00000000AD
+:1025C0008F780000276200088F8D003CAF980004D0
+:1025D000944600089451000A944F000C30CEFFFF3F
+:1025E0000011240031E9FFFF11CD00A20089202550
+:1025F0003C0308008C6304443C1808008F18044016
+:1026000000E85021255FFFFE007F782100001021A7
+:1026100001FF302B03028821022648213C010800DB
+:10262000AC2F04443C010800AC29044024EB000812
+:102630003162FFFF3047000710E000038F8500186C
+:10264000245000073202FFF83106FFFF30C80007B0
+:102650000045702131CD1FFF034D6021AF85001C67
+:10266000AF8D0018259B4000AF4D00841100000382
+:102670008F8F002024C400073086FFF88F84002845
+:1026800000CF282100A4482B15200002AF8F002482
+:1026900000A42823AF850020AF4500803C1108002E
+:1026A0008E3104340345C0213402800003023021FE
+:1026B00012200005AF860038938300172419000EFE
+:1026C0001079000D241F043F3C0A1000AF4A017826
+:1026D0008F8B0014256700010A0001DDAF8700140D
+:1026E0000E0005A63C1040008F8B001425670001EA
+:1026F0000A0001DEAF8700143C0A1000A75F014802
+:10270000AF4A01780A0004B48F8B0014240E0F0026
+:1027100011EE003D30D100201620000224030009F4
+:10272000240300010A000208A743014A0A0001FB32
+:10273000A740014694E5000894E2000A94EB000CDF
+:102740008F86003C0002FC00316AFFFF30B9FFFFBA
+:102750001326003703EA20253C0508008CA5044415
+:102760003C1F08008FFF04400000502100A83821C2
+:1027700000E8302B03EAC8210326C0213C010800F1
+:10278000AC2704443C010800AC3804400A0002694C
+:102790008F8D00183C1908008F39047C3C03080019
+:1027A0008C6304543C0608008CC604783C0F080077
+:1027B0008DEF0450032838210068682100E8C02B01
+:1027C00000C4882101A8402B01E47021023858215F
+:1027D00001C860213C010800AC2D04543C010800F4
+:1027E000AC2C04503C010800AC27047C3C010800E0
+:1027F000AC2B04780A0002698F8D0018A7400146AF
+:102800000A00041B8F8F001830D000201600FFC56F
+:102810002403000D240300050A000208A743014A0F
+:10282000975901042738FFF00A00036B3304FFFFB8
+:102830008F8C0040148CFFC8000080213C110800E0
+:102840008E31046C3C0408008C84046802287021DA
+:1028500001C8782B00904021010F68213C0108003D
+:10286000AC2E046C3C010800AC2D04680A0002691F
+:102870008F8D00188F9900401499FF5D0000602132
+:102880003C0508008CA5046C3C1008008E10046800
+:1028900000E82021248EFFFE00AEF82103EE582B25
+:1028A000020C5021014B18213C010800AC3F046C84
+:1028B0003C010800AC2304680A00048B24EB0008E8
+:1028C0008F8800383C02FFFF8D0E000C01C2682487
+:1028D00001A46025AD0C000C0A00037930CFFFFF86
+:1028E0000A0003A9AE000000974B01049204000403
+:1028F0008E2A000C01644021251FFFF20147182495
+:1029000033F9FFFF0079C025AE38000C0A0002D46D
+:102910008E1900103C03FFFF8D11001002232824A4
+:1029200000A47825AD0F00100A00037930CFFFFF17
+:1029300097450104920600048E2F001000A6102176
+:102940002449FFEE01E76824312EFFFF01AE602528
+:10295000AE2C00100A0002D48E1900108E06000C56
+:10296000AE0000000003C080031088210A0002A608
+:10297000AE2600201460000D3050FFFF3C04FFFF26
+:102980000044602401846826000D582B000C502B55
+:10299000014B102410400002000000000000000D58
+:1029A0008CA300000A00023E006410253A11FFFFCC
+:1029B0000011782B0010702B01CF20241080000212
+:1029C000000000000000000D8CB800000A00023E6C
+:1029D0003702FFFF3084FFFF30A5FFFF10800007A4
+:1029E0000000182130820001104000020004204243
+:1029F000006518211480FFFB0005284003E0000853
+:102A00000060102110C00007000000008CA2000030
+:102A100024C6FFFF24A50004AC82000014C0FFFB05
+:102A20002484000403E000080000000010A0000857
+:102A300024A3FFFFAC86000000000000000000009F
+:102A40002402FFFF2463FFFF1462FFFA24840004C2
+:102A500003E0000800000000308EFFFF30D8FFFFC9
+:102A600000057C0001F8602539CDFFFF01AC502145
+:102A7000014C582B014B4821000944023127FFFF2C
+:102A800000E830210006240230C5FFFF00A4182111
+:102A90003862FFFF03E000083042FFFF3C0C0800F3
+:102AA0008D8C0484240BFF8027BDFFD0018450212E
+:102AB000014B4824AF4900203C0808008D080484DD
+:102AC000AFB20020AFB00018AFBF0028AFB30024F2
+:102AD000AFB1001C936600040104382130E4007F8C
+:102AE000009A10213C0300080043902130C50020CB
+:102AF000036080213C080111277B000814A000021C
+:102B0000264600702646006C92130004975101047B
+:102B1000920F00043267000F322EFFFF31ED0040AC
+:102B200001C7282311A0000500004821925900BCCC
+:102B3000333800041700009000000000924300BCEE
+:102B4000307F000413E0000F0000000010A0000D13
+:102B500000000000960E0002240AFF8000A76021FA
+:102B600025CDFFFEA74D1016920B0004014B20242B
+:102B7000308200FF10400085010C40253C0F04000E
+:102B8000010F40258F5301780660FFFE2404000AE0
+:102B9000A7440140960D00022404000931AC00074F
+:102BA000000C5823316A0007A74A0142960200022E
+:102BB0002443FFFEA7430144A7400146975F010459
+:102BC000A75F01488F5901083338002053000001E6
+:102BD00024040001920F000431EE001015C0000221
+:102BE0003483001000801821A743014A0000000030
+:102BF000000000000000000000000000AF481000CE
+:102C000000000000000000000000000000000000C4
+:102C10008F5110000621FFFE3113FFFF12600003E9
+:102C2000000000008F481018ACC800009603000692
+:102C3000307FFFFF27F90002001998820013888077
+:102C4000023B30218CD800001520005700183402B8
+:102C5000920300042405FF8000A3F82433F100FF51
+:102C60001220002C00000000924700BC30F200024D
+:102C70001240002800000000974B100C2562FFFE58
+:102C8000A7421016000000003C0A0400354900303D
+:102C9000AF4910000000000000000000000000002C
+:102CA000000000008F4C10000581FFFE00000000B6
+:102CB0009749100C8F51101C00C020213127FFFFB5
+:102CC00024F20030001218820003288000BBF82193
+:102CD0003226FFFFAFF100000E00059500112C0217
+:102CE0000013C880033B98218E7800000002740016
+:102CF000AFB800108FA80010310FFFFFAFAF00106A
+:102D00008FA4001001C46825AFAD00108FA600107D
+:102D1000AE66000097730008976D000A9766000C76
+:102D20008F8A003C000D5C0030CCFFFF3262FFFF59
+:102D3000104A0036016C2025960600023C10100057
+:102D400024D300080E0001393264FFFF974C0104C0
+:102D50000E0001473184FFFFAF5001788FBF00287C
+:102D60008FB300248FB200208FB1001C8FB00018E9
+:102D700003E0000827BD003010A0FF700000000035
+:102D800024A5FFFC0A0005CE240900048CD1000014
+:102D9000AF5110188F5301780660FF7A2404000A9F
+:102DA0000A0005E30000000000A7C8218F88003852
+:102DB0008F4E101C0019C0820018788001E8202175
+:102DC000AC8E0000000E2C0200C020210E000595E4
+:102DD00031C6FFFF023B28218CAD000000025400E9
+:102DE00000403021AFAD00108FAC0010318BFFFFE1
+:102DF000AFAB00108FA2001001424825AFA9001010
+:102E00008FA700100A000613ACA700008F8F0040A8
+:102E1000148FFFC90000000097420104960B0002C6
+:102E20003C0508008CA5046C3049FFFF316AFFFFA8
+:102E30003C1108008E310468012A382124F2FFFE7B
+:102E400000B240210012FFC30112C82B023FC02173
+:102E5000031920213C010800AC28046C3C01080047
+:102E6000AC2404680A00064D0000000000A4102BEA
+:102E700010400009240300010005284000A4102B85
+:102E800004A00003000318405440FFFC0005284044
+:102E900010600007000000000085302B14C0000205
+:102EA00000031842008520231460FFFB0005284220
+:102EB00003E00008008010218F85002C27BDFFE86B
+:102EC000000530272CC300012CA40002008310252C
+:102ED00010400003AFBF00102405007FAF85002C19
+:102EE0000005282730A5FFFF0E000574240426F5F1
+:102EF0008F830030240402BD004030210083382B32
+:102F000010E0000924050001000420400083102B7C
+:102F100004800003000528405440FFFC00042040CA
+:102F200010A0000800C350210064402B15000002CF
+:102F3000000528420064182314A0FFFB000420426F
+:102F400000C350218FBF0010000A4C02312200FF45
+:102F500027BD0018AF8A002C03E00008AF890030BD
+:102F60000A00002600000000000000000000000D24
+:102F7000747870342E362E313600000004061000AE
+:102F80000000000A000001360000EA6000000000B6
+:102F90000000000000000000000000000000000031
+:102FA0000000000000000000000000000000000021
+:102FB0000000000000000000000000000000000011
+:102FC0000000001D000000000000000000000000E4
+:102FD00000000000000000000000000000000000F1
+:102FE00000000000000000000000000000000000E1
+:102FF00000000000000000000000000010000003BE
+:10300000000000000000000D0000000D3C02080060
+:1030100024423AA03C03080024633C54AC40000026
+:103020000043202B1480FFFD244200043C1D0800B7
+:1030300037BD7FFC03A0F0213C100800261000984B
+:103040003C1C0800279C3AA00E000305000000006D
+:103050000000000D8F8300383C08800035070070A9
+:103060008CE50000008330253C02900000C2202542
+:10307000AF850030AF4400208F4900200520FFFEBF
+:103080003C038000346200708C4500008F86003065
+:103090003C1908008F39007C3C0E08008DCE00786A
+:1030A00000A6202303245821000078210164682B06
+:1030B00001CF6021018D50213C010800AC2B007C28
+:1030C0003C010800AC2A007803E000080000000082
+:1030D0000A00003D240400018F8400383C05800074
+:1030E00034A200010082182503E00008AF4300204D
+:1030F00003E00008000010213084FFFF30A5FFFF2F
+:1031000010800007000018213082000110400002EA
+:1031100000042042006518211480FFFB00052840B0
+:1031200003E000080060102110C00007000000004C
+:103130008CA2000024C6FFFF24A50004AC8200007E
+:1031400014C0FFFB2484000403E00008000000001A
+:1031500010A0000824A3FFFFAC86000000000000C0
+:10316000000000002402FFFF2463FFFF1462FFFA47
+:103170002484000403E0000800000000308AFFFF00
+:1031800093A80013A74A014497490E1630C600FFC2
+:103190003C021000A7490146AF450148A346015231
+:1031A000A748015AAF4701608FA400188FA30014ED
+:1031B000A7440158AF43015403E00008AF4201782F
+:1031C00003E00008000000003C038000346200704F
+:1031D0008C4900008F88003C2484000727BDFFF83D
+:1031E0003084FFF8AF890030974D008A31ACFFFF83
+:1031F000AFAC00008FAB0000016850232547FFFFF4
+:1032000030E61FFF00C4282B14A0FFF73C0C800001
+:10321000358B00708D6A00003C0708008CE7008445
+:103220003C0608008CC60080000810820149182363
+:103230000002788000E370210000202101C3C82B28
+:1032400000C4C02101FA4021031948212502400091
+:1032500027BD00083C010800AC2E00843C0108009A
+:10326000AC29008003E00008000000008F82003CD1
+:103270002486000730C5FFF800A2182130641FFF24
+:1032800003E00008AF84003C3C0E20FF27BDFFE0B8
+:103290003C1A80003C0F800835CDFFFDAFBF001801
+:1032A000AFB10014AFB00010AF8F0044AF4D0E00AF
+:1032B000000000000000000000000000000000000E
+:1032C000000000003C0C00FF358BFFFDAF4B0E00F3
+:1032D0003C0660048CC95000240AFF7F3C1160004A
+:1032E000012A40243507380CACC750008E2404381E
+:1032F00024050009AF4500083083FFFF38622F71B5
+:103300002450C0B3AF80004C0E000064AF80003C7E
+:1033100052000001AE20442C0E00046000000000AA
+:103320008FBF00188FB100148FB000100A000E7705
+:1033300027BD002027BDFFD0AFB20028AFB10024C9
+:10334000AFBF002CAFB00020936200080080902136
+:1033500000A088211440002D240400100E00009AC3
+:10336000000000008F8E004C3C10320031C600FF80
+:1033700000067C0001F0602525CD0001AF8D004CDA
+:10338000AC4C0000936B00099369000A316A00FF9E
+:10339000000A3C00312800FF00E82025AC4400046E
+:1033A0008F83004C06400043AC430008AC40000C47
+:1033B000979800403305000814A000022628000654
+:1033C0002628000297420E148F450E1C8F670004BA
+:1033D000937F00023044FFFF33F900FFAFB90010C4
+:1033E0008F710014AFA800180E000087AFB1001451
+:1033F0008FBF002C8FB200288FB100248FB0002027
+:10340000240400100A0000C327BD0030936900099E
+:103410009368000B312300FF310200FF006280211E
+:10342000261F000A33F0FFFF0E00009A0200202141
+:103430008F86004C3C0D410024D90001AF99004C0F
+:103440009378000930C600FF00067400330500FFC2
+:1034500024AF000201CF6025018D5825AC4B000040
+:103460008F6A000C97440E1401523825AC470004B3
+:103470008F450E1C8F670004936900023084FFFFA4
+:10348000312800FFAFA800108F630014AFB10018FF
+:103490000E000087AFA30014020020218FBF002C74
+:1034A0008FB200288FB100248FB000200A0000C323
+:1034B00027BD00303C1280000A000114AC52000C01
+:1034C00027BDFFD8AFB3001CAFBF0020AFB20018BC
+:1034D000AFB10014AFB00010936200081440008137
+:1034E00000809821AF60000C9785004030A4400018
+:1034F0001080008B2403001624104007A363000AE9
+:10350000AF700014938F00428F6C001431EE0007EF
+:10351000000E6A40018D5825AF6B0014978A004059
+:103520008F6800143149001001093825AF67001475
+:103530009786004030C300085060008D00002821AD
+:103540008F6600143C0310003C02810000C3282554
+:10355000AF65001497440E0A2418000E3405FFFCD2
+:10356000309FFFFF03E2C825AF790004A378000273
+:103570009372000A26510004A371000A9783004049
+:103580009364000A30661F00000611830044F8218E
+:1035900027F90028A379000997580E0CA778001086
+:1035A0009372000926510002323000070010782380
+:1035B00031EE0007A36E000B936D0009976C0010AD
+:1035C0008F9000349789004031AB00FF016C50218F
+:1035D000014540213127004010E000053105FFFF83
+:1035E00000B0382B3C06800010E000140000882159
+:1035F0000205402B15000033000020218F4A0E14D5
+:10360000AF4A0E108F490E1CAF490E18AF450E0081
+:103610008F4C0000318B00081160FFFD000000009E
+:10362000974D0E0800A0802100003021A78D00409A
+:103630008F450E0424110001AF850034976E0010F1
+:1036400031D2FFFF8E640000009010231440000967
+:10365000AE6200008F6A00148F8700483549004031
+:10366000AF6900148F480E10ACE800208F430E188D
+:10367000ACE3002400C020210E0000F50200282148
+:103680008E66000014C00005000000008F6B00145F
+:10369000240CFFBF016C9824AF7300148F6D000CD5
+:1036A00001B22821AF65000C937200081640000398
+:1036B000000000001620003100000000A371000887
+:1036C000020020218FBF00208FB3001C8FB2001892
+:1036D0008FB100148FB000100080102103E00008AB
+:1036E00027BD00288F900034979100403C06800051
+:1036F00002009021322F004015E0FFD20000882107
+:10370000977F00108F98003433F9FFFF1738FFEDD3
+:1037100000002021000030210A0001B9241100011D
+:103720002403000E24104007A363000AAF700014A6
+:10373000938F00428F6C001431EE0007000E6A4038
+:10374000018D5825AF6B0014978A00408F680014D4
+:103750003149001001093825AF67001497860040F1
+:1037600030C300081460FF7600000000000028212C
+:10377000AF6000040A000187A36000028F6F00148D
+:103780003C19EFFF3738FFFE01F870240A0001D71B
+:10379000AF6E00148F8700388F8A004427BDFFE08A
+:1037A0008F860048AFB00018AFBF001C8F450104E2
+:1037B0008D4900ACAF4700808CC8002000A9382399
+:1037C00000008021AF480E108F440E1000004821E9
+:1037D000AF440E148CC20024AF420E188F430E1853
+:1037E000AF430E1C10E000362D390001936B00082A
+:1037F0001160004F00000000976E001031CDFFFFF8
+:1038000000ED602B1580004A000000009778001042
+:10381000330FFFFFAF4F0E008F5F000033F900083A
+:103820001320FFFD0000000097420E088F460E0493
+:103830003045FFFF30A300011060008A0000000047
+:103840000000000D30A8A040240400401104003BFB
+:1038500030A9A0001120008500000000936C000832
+:103860005180000927A40010976F001031EEFFFF70
+:1038700000CE682B11A0000427A4001030B800402F
+:103880001300007A00000000AFA70010A7850040D9
+:10389000AF8600340E0001580000000000404821AF
+:1038A0001440FFD08FA700108F420E148F84004861
+:1038B000AC8200208F470E1CAC8700242D390001FC
+:1038C0000330302510C000178FBF001C8F840038D4
+:1038D00024100F0010900085000000008F4F017829
+:1038E00005E0FFFE24180F001098006F0000000094
+:1038F0008F470E14240202403C101000AF470144D1
+:103900008F490E1CAF490148A3400152A740015AFC
+:10391000AF400160A7400158AF420154AF50017859
+:103920008FBF001C8FB0001803E0000827BD0020E7
+:10393000AF470E000A00022E000000008F490178F8
+:103940000520FFFE240A08008F84003CAF4A01785E
+:103950009758008A330FFFFF01E4702325CDFFFF46
+:1039600031AC1FFF2D8B00081560FFF9000000002F
+:103970008F83004C8F9F003800C0482103442021D2
+:103980002466000124190F00AF86004C306A00FF46
+:1039900000E938232486400013F9000524080001BB
+:1039A000938B004231680007000812403448000140
+:1039B000000A7C003C18010001F87025AC8E400024
+:1039C0008F8D004C30AC003630A40008ACCD000424
+:1039D0001080002E010C3025974D0E0A8F8C003C74
+:1039E0003C02810031A4FFFF258B000800824025A6
+:1039F0003C03100031651FFF25390006241F000E0F
+:103A0000AF48016000C33025A75F015AAF85003C75
+:103A1000A759015814E0000A8F9F003824050F00B1
+:103A200053E500022410000134C600408F430E10FD
+:103A30008F880048AD0300208F4B0E18AD0B00247B
+:103A40008F420E14AF4201448F440E1CAF44014814
+:103A5000A34A01523C0A1000AF4601540A00022159
+:103A6000AF4A017814C0FF7830A8A0408F420E14EE
+:103A70008F84004800004821AC8200208F470E1C34
+:103A8000AC8700240A0002582D3900018F98003CB1
+:103A900025390002A7590158270F000831EE1FFFF2
+:103AA0000A0002ADAF8E003CAF40014C1120002C4B
+:103AB000000000008F460E10AF4601448F430E18E1
+:103AC000240200403C101000AF430148A3400152C3
+:103AD000A740015AAF400160A7400158AF420154CE
+:103AE000AF5001780A0002718FBF001C1120000640
+:103AF00000000000975F0E0833E5004014A00002AC
+:103B0000000000000000000D8F4801780500FFFE56
+:103B100000000000974E0E103C0D0500240320000D
+:103B200031CCFFFF018D1025AF42014C8F440E14A4
+:103B30003C0B1000AF4401448F4A0E1CAF4A0148B1
+:103B4000A34001528F840038A740015AAF40016062
+:103B5000A7400158AF4301540A00025FAF4B017800
+:103B60008F590E14AF5901448F430E1C0A0002D91D
+:103B70002402004027BDFFE0AFB20018AFB100142F
+:103B8000AFB00010AFBF001C0E0000CA0000000064
+:103B90003C0280008F8A0044345000703C120800C0
+:103BA00026523B70020088218E0800008F450000DD
+:103BB00038A400013083000110600017AF88003086
+:103BC000022048218D2C00003C0208008C42006C31
+:103BD0003C1808008F1800680188182300436821EA
+:103BE0000000C82101A3782B0319702101CF4021C7
+:103BF0003C010800AC2D006C3C010800AC280068BA
+:103C00008F4B00003967000130E6000114C0FFED62
+:103C100001804021AF8C00308E1800003C0E08005F
+:103C20008DCE006C3C0C08008D8C00680308782356
+:103C300001CF28210000402100AF302B01885821FE
+:103C4000016620213C010800AC25006C3C01080005
+:103C5000AC2400688F49010025470088AF870048E1
+:103C6000AF890038AF4900208E070000AF870030D1
+:103C70008F5901780720FFFE000000008E0F000022
+:103C80003C0D08008DAD00743C0C08008D8C00705C
+:103C900001E7702301AE28210000302100AE582B2F
+:103CA00001862021008B3821240908003C010800EE
+:103CB000AC2500743C010800AC270070AF490178C6
+:103CC00093430108A383004293820042305F0001C6
+:103CD00017E000158F830038241F0D00107F001996
+:103CE00024020F001062001D000000009147000038
+:103CF0002403005030E900FF112300043C0540007C
+:103D0000AF4501380A000312000000000E0008DA77
+:103D1000000000008F8A00443C054000AF45013898
+:103D20000A00031200000000939900423338000695
+:103D3000001851000E00020D0152D8210A00036E36
+:103D40008F8A00443C1B0800277B3BF00E00020DCD
+:103D5000000000000A00036E8F8A00443C1B08002C
+:103D6000277B3C100E00020D000000000A00036ECD
+:103D70008F8A004490AA00018FAB00108CAC001019
+:103D80003C0300FF8D680004AD6C00208CAD001476
+:103D900000E060213462FFFFAD6D00248CA70018A5
+:103DA0003C09FF000109C024AD6700288CAE001C4F
+:103DB0000182C82403197825AD6F0004AD6E002C74
+:103DC0008CAD0008314A00FFAD6D001C94A90002C3
+:103DD0003128FFFFAD68001090A70000A560000229
+:103DE000A1600004A167000090A30002306200FF00
+:103DF0000002198210600005240500011065000E04
+:103E00000000000003E00008A16A00018CD800282F
+:103E1000354A0080AD7800188CCF0014AD6F0014C7
+:103E20008CCE0030AD6E00088CC4002CA16A00015D
+:103E300003E00008AD64000C8CCD001CAD6D0018D3
+:103E40008CC90014AD6900148CC80024AD6800084A
+:103E50008CC70020AD67000C8CC200148C830064FA
+:103E60000043C82B13200007000000008CC2001480
+:103E7000144CFFE400000000354A008003E0000815
+:103E8000A16A00018C8200640A0003C400000000E3
+:103E900090AA000027BDFFF88FA9001CA3AA00006C
+:103EA0008FAE00003C0FFF808FA8001835E2FFFFA7
+:103EB0008CCD002C01C26024AFAC0000A120000416
+:103EC00000E06021A7A000028FB800008D27000449
+:103ED0000188182100A0582100C05021006D28261B
+:103EE0003C06FF7F3C0F00FF2CAD000135EEFFFFCD
+:103EF00034D9FFFF3C02FF0003193024000D1DC020
+:103F0000010EC82400E2C02400C3702503197825DF
+:103F1000AD2E0000AD2F00048D450024AFAE000093
+:103F2000AD2500088D4D00202405FFFFAD2D000CB0
+:103F3000956800023107FFFFAD2700109166001859
+:103F400030C200FF000219C2506000018D450034EC
+:103F5000AD2500148D67000827BD0008AD27001CA3
+:103F60008C8B00CCAD2C0028AD20002CAD2B002478
+:103F7000AD20001803E00008AD20002027BDFFE0C1
+:103F8000AFB20018AFB10014AFB00010AFBF001C4B
+:103F90009098000000C088213C0D00FF330F007F87
+:103FA000A0CF0000908E000135ACFFFF3C0AFF005F
+:103FB000A0CE000194A6001EA22000048CAB001429
+:103FC0008E29000400A08021016C2824012A4024AD
+:103FD0000080902101052025A6260002AE240004C1
+:103FE00026050020262400080E0000722406000288
+:103FF00092470000260500282624001400071E0012
+:104000000003160324060004044000032403FFFFFA
+:10401000965900023323FFFF0E000072AE230010FA
+:10402000262400248FBF001C8FB200188FB100140B
+:104030008FB0001024050003000030210A00007C2E
+:1040400027BD002027BDFFD8AFB1001CAFB00018BE
+:10405000AFBF002090A80000240200018FB0003CF8
+:104060003103003F00808821106200148FAA0038BD
+:10407000240B0005506B0016AFAA001000A02021F1
+:1040800000C028210E00040702003021922400BC49
+:10409000308300021060000326060030ACC0000030
+:1040A00024C600048FBF00208FB1001C8FB0001801
+:1040B00000C0102103E0000827BD0028014038217E
+:1040C0000E000385AFB000100A00044B0000000092
+:1040D0000E0003CCAFB000140A00044B0000000037
+:1040E0003C02000A034218213C04080024843B08D7
+:1040F0002405001A000030210A00007CAF83002C48
+:104100003C038000346200708C48000000A05821FD
+:1041100000C04821308A00FFAF8800308F4401780A
+:104120000480FFFE3C0C8000358600708CC50000CA
+:104130003C0308008C6300743C1808008F18007062
+:1041400000A82023006468210000C82101A4782B66
+:104150000319702101CF60213C010800AC2D0074CF
+:104160003C010800AC2C00708F480E14AF4801448D
+:10417000AF47014CA34A0152A74B0158934601088F
+:1041800030C5000854A0000135291000934B0900E8
+:1041900024070050316A00FF1147000700000000AB
+:1041A0008F450E1CAF450148AF4901543C09100032
+:1041B00003E00008AF490178934D010831A80008D9
+:1041C0001100001000000000934F010831EE0010B4
+:1041D00051C00001352900083C04080090843B6C64
+:1041E000A34401508F4309A4AF4301488F4209A063
+:1041F000AF420144AF4901543C09100003E00008FC
+:10420000AF4901783C1908008F393B283338000842
+:104210005700FFF1352900080A00049E0000000045
+:1042200024070040AF470814AF4008108F420944EC
+:104230008F4309508F4409548F45095C8F46094CC0
+:10424000AF820064AF830054AF840050AF85005C40
+:1042500003E00008AF8600609346010930C5007F87
+:10426000000518C0000521400083102103E000086C
+:10427000244200883C0A0800914A3B2D3C09080072
+:1042800095293B263C051100000A3C002528000228
+:1042900000E8302500C5182524820008AC83000002
+:1042A00003E00008AC8000048F4A002C974D0908F9
+:1042B0003C0E000E034E382131ACFFFF000C41C014
+:1042C000AF48002C9743090894EB001A0080402166
+:1042D000240200013169FFFFAC8900008CE6001C5C
+:1042E00000A05821AC8600048CE40020AD04000836
+:1042F00090E30019306300031062003E00000000EC
+:104300002865000214A00071240F0002106F004CF9
+:104310000000000024180003107800550000000081
+:104320003C09080095293B1C93430934934F09210C
+:104330003C05080094A53B22306400FF94EE002A5F
+:104340000004688231EC00FF978F0058000DC60012
+:10435000000CCC003127FFFF0319102500A73021E6
+:104360000046202501CF68213C03400000836025E2
+:10437000000D4C00AD090004AD0C0000935909205C
+:104380003C1800062509001400193E0000F82825F5
+:10439000AD0500088F4E092C25E6000130C27FFFD5
+:1043A000AD0E000C8F440930A7820058250200286A
+:1043B000AD0400108F4D0938AD0D0014AD2B000475
+:1043C0008F4C0940AD2C0008934309373C19080075
+:1043D00093393B2CAD200010000347000019C400A6
+:1043E000011858253567FFFFAD27000C03E00008D2
+:1043F000AF4A002C3C09080095293B1C3C0D0800E5
+:1044000095AD3B263C0C0800958C3B1894E40024A9
+:10441000312EFFFF01AE302100CC18230004CC0068
+:104420002462FFF20322C025240F0800AD18000CFF
+:10443000AD0F0014AD0000100A0004F225080018AA
+:1044400094E5002494EE00283C09080095293B1CC3
+:1044500000056C00000E640035A68100358408005C
+:10446000AD06000CAD0400100A0004F2250800148B
+:104470003C09080095293B1C3C0F080095EF3B26A2
+:104480003C06080094C63B1894E400243125FFFF45
+:1044900094ED002801E5702101C660230004CC00E2
+:1044A000000D1C002582FFEE006278253738810060
+:1044B00024050800AD18000CAD0F0010AD05001864
+:1044C000AD0000140A0004F22508001C1460FF94DB
+:1044D0000000000094E300243C09080095293B1CDF
+:1044E0000003140034590800AD19000C0A0004F24E
+:1044F0002508001003E00008240201F427BDFFE8AE
+:10450000AFB00010AFBF00140E00005C008080212F
+:1045100024050040AF4508148F8300548F84005059
+:104520008F85005C0070182100641023184000047F
+:10453000AF830054AF6300548F660054AF860050C1
+:104540001200000C000000008F440074936800818A
+:104550003409FA002D07000710E00005008910213A
+:10456000936C0081240B01F4018B50040144102151
+:10457000AF62000C8F4E095C01C5682319A00004CE
+:104580008FBF00148F4F095CAF8F005C8FBF00148A
+:104590008FB000100A00005E27BD00188F840064F1
+:1045A0008F8300548F820050AF640044AF6300508B
+:1045B00003E00008AF6200543C03800034620070E6
+:1045C0008C43000027BDFFF8308700FF30A900FFB3
+:1045D00030C800FFAF8300308F4401780480FFFEB5
+:1045E0003C028000345900708F380000A3A70003FC
+:1045F0003C0708008CE700748FAC00003C06080004
+:104600008CC60070030378233C0E7FFF00EFC821A7
+:1046100035CDFFFF00005021018D282400CA18214C
+:10462000000847C0032F202B00A810250064C021DC
+:10463000AFA200003C010800AC3900743C01080046
+:10464000AC380070934F010AA3A000023C0E80FF1B
+:10465000A3AF00018FAC0000312B007F35CDFFFFF1
+:10466000018D4824000B5600012A40252407300004
+:104670002406FF803C05100027BD0008AF48014C10
+:10468000AF470154A7400158A346015203E0000878
+:10469000AF45017827BDFFE8AFBF0014AFB00010F1
+:1046A0008F6500743C068000309000FF00A6202536
+:1046B0000E00005CAF640074936300053462000870
+:1046C0000E00005EA3620005020020218FBF0014CF
+:1046D0008FB0001024050005240600010A0005968D
+:1046E00027BD001827BDFFE03C038000AFB00010DD
+:1046F000AFBF0018AFB10014346200708C470000E7
+:10470000309000FF30A800FFAF8700308F44017861
+:104710000480FFFE3C188000371100708E2F0000CF
+:104720003C0D08008DAD00743C0A08008D4A0070F5
+:1047300001E7702301AE28210000582100AE302B84
+:10474000014B4821012638213C010800AC250074AA
+:10475000000088213C010800AC2700701100000F08
+:10476000000000008F6200742619FFFF3208007FEE
+:104770000002FE0233E5007F15000006332200FF31
+:104780002407FF800207202624A3FFFF0083802543
+:10479000320200FF00408021241110080E00005C4E
+:1047A000000000008F4908183125000414A0FFFD07
+:1047B0003218007F001878C00018714001CF6821BE
+:1047C00025AC0088AF4C0818274A09808D4B002083
+:1047D000AF4B01448D460024AF460148A350015021
+:1047E0000E00005EA7400158022010218FBF001864
+:1047F0008FB100148FB0001003E0000827BD002027
+:1048000027BDFFE8308400FFAFBF00100E0005E1B8
+:1048100030A500FF8F8300548FBF00103445004047
+:104820002404FF903C02100027BD0018AF43014C48
+:10483000A3440152AF45015403E00008AF420178A0
+:1048400027BDFFE8AFBF0014AFB000109345093F8C
+:10485000240200063C08080095083B2230A300FF14
+:104860002487FFD8240500041062003624060002C5
+:10487000974E093C3C0D02040006340031CCFFFF8A
+:10488000018D5825AC8B0000934A093E3149002028
+:104890001120000800000000935F09363C19010355
+:1048A0003738030033F000FF02187825240500088C
+:1048B000AC8F000493580934934D09213C104000FB
+:1048C000330E00FF000E608231AB00FF000C56007B
+:1048D000000B1400014218250068F82503F0C825D4
+:1048E000AC99FFD8935809378F4C09488F4D094030
+:1048F00000057882330E00FF01CF5821018D282357
+:10490000000B57000146102530A3FFFF0043402550
+:10491000000F488001273021ACE800200E00005C29
+:1049200024D00028240400040E00005EA364003F8D
+:10493000020010218FBF00148FB0001003E00008A8
+:1049400027BD00180A0006442406001227BDFFD028
+:1049500024090010AFB50024AFB40020AFB3001C91
+:10496000AFB10014AFB000103C010800A0293B2CEF
+:10497000AFBF0028AFB2001897480908309400FF75
+:104980003C02000E3107FFFF000731C0AF46002C8C
+:10499000974409089344010B30B300FF0342802180
+:1049A000308300300000A821106000E4000088215E
+:1049B000240C00043C010800A02C3B2C934B093E26
+:1049C000000B5600000A2E0304A001310000000075
+:1049D000AF4000489352010B324F002011E0000617
+:1049E00000000000935F093E001FCE000019C603BF
+:1049F00007000148000000009346010B30C2004050
+:104A0000104000038F9200548F87005424F2FFFF60
+:104A1000960A002C9345093493490937A78A005810
+:104A200030A600FF312700FF00071080004620213C
+:104A30000091F8213C010800A43F3B22920300189A
+:104A40003C010800A4203B1C3C010800A4203B18AA
+:104A5000307000FF03F04021250B000A3170FFFF8A
+:104A60003C010800A4283B243C010800A4283B2664
+:104A70000E00009A020020210E0004C500402021F3
+:104A80008F4B002C975809083C19000E0359402100
+:104A9000330FFFFF000F71C0AF4E002C9743090882
+:104AA000950D001A241100010040382131ACFFFFA0
+:104AB000AC4C00008D0A001CAC4A00048D0500209F
+:104AC000AC4500089109001931230003107100BDA5
+:104AD0002871000216200103240C0002106C00F55E
+:104AE000240D0003106D00CA000000003C090800FE
+:104AF00095293B1C93430934935809213C0A08002B
+:104B0000954A3B22306400FF950C002A0004F8828D
+:104B1000331900FF97980058001F760000197C0099
+:104B20003126FFFF01CF402501466821010D882570
+:104B3000019828213C0840000228102500054C005F
+:104B4000ACE90004ACE20000934309203C040006F9
+:104B500024E900140003FE0003E4C825ACF90008B2
+:104B60008F4E092C270F000131E67FFFACEE000CC1
+:104B70008F4D0930A786005824E60028ACED0010C0
+:104B80008F4C0938ACEC0014AD3200048F51094051
+:104B9000AD310008934209373C05080090A53B2C35
+:104BA000AD2000100002270000051C000083F8253E
+:104BB00037F2FFFFAD32000CAF4B002C12A00033D8
+:104BC000000000009352093F24150006240500044C
+:104BD000324B00FF117500CD24090002974F093CAC
+:104BE0003C0E020431EDFFFF01AE6025ACEC002865
+:104BF0009351093E322200201040000800000000BE
+:104C0000934409363C180103371F0300309900FF15
+:104C1000033F2825ACC5000424050008935209343D
+:104C20009343092100056082324B00FF000BA882EC
+:104C3000306400FF0015FE000004C40003F8C8251E
+:104C4000032A782501E87025ACCEFFD8934D0937AB
+:104C50008F5209488F42094031B100FF022C582180
+:104C600002423023000B1F000009AC0000754825EC
+:104C700030C8FFFF012850250E00005CACEA002080
+:104C8000240700040E00005EA367003F0E0000C36F
+:104C9000020020213C05080090A53B2C30B0000309
+:104CA0001200000F028020218F8800542509000186
+:104CB000AF890054AF6900508F6A0054014938230E
+:104CC00018E00002012020218F640054AF640054DA
+:104CD0008F420074244601F4AF66000C028020214C
+:104CE00002602821A76000680E0005E13C13100057
+:104CF0008F8E005434540006AF4E014C8F8D004C03
+:104D00008FBF00288FB5002431B100FF25AC000112
+:104D1000AF8C004C8FB20018A35101528FB000101D
+:104D2000AF5401548FB10014AF5301788FB40020F9
+:104D30008FB3001C03E0000827BD00309359093EE3
+:104D40000019C6000018960306420048241100020C
+:104D500093420923304400021080FF1E8F870060B9
+:104D60008F86005414E6FF1B000000000E00005C5C
+:104D7000000000009365003F2408001630A900FFE2
+:104D80001128000C240A00083C0D080091AD3B2CB2
+:104D900035AC00013C010800A02C3B2C936B003F7C
+:104DA000316300FF106A0065240E000A106E005E79
+:104DB0002402000C0E00005E000000000A00069DA8
+:104DC000000000003C09080095293B1C3C19080024
+:104DD00097393B263C18080097183B18950E00247D
+:104DE000313FFFFF033F782101F86823000E8C005C
+:104DF00025ACFFF2022C502524050800244700189A
+:104E0000AC4A000CAC4500140A0006E5AC400010AA
+:104E10003C09080095293B1C3C18080097183B26C4
+:104E20003C0F080095EF3B18950D00243139FFFF2A
+:104E3000950C00280319702101CF8823000D2C0048
+:104E4000000C54002622FFEE0142302534A48100DC
+:104E500024030800ACE4000CACE60010ACE300183E
+:104E6000ACE000140A0006E524E7001C3C01080041
+:104E7000A0313B2C9343093E24150001307F0020D4
+:104E800017E0FED4241100080A00069D2411000436
+:104E90008F6E00848F4D094011A0FECDAF8E00545F
+:104EA000240F00143C010800A02F3B2C0A00069C94
+:104EB0000000000095020024950600283C09080027
+:104EC00095293B1C0002240000061C00349F810031
+:104ED00034790800ACFF000CACF900100A0006E5BC
+:104EE00024E700141460FF0100000000951800245E
+:104EF0003C09080095293B1C2447001000187C0041
+:104F000035EE08000A0006E5AC4E000C0A00071F4B
+:104F1000240900128F64004CAF6400548F63005466
+:104F20000A0006A6AF630050A362003F0E00005EB9
+:104F3000000000000A00069D00000000240200148A
+:104F40000A0007F3A362003F27BDFFE8308400FF9B
+:104F5000AFBF00100E0005E130A500FF9378007E82
+:104F60009379007F936E00809368007A332F00FF5F
+:104F700000186600000F6C0031CB00FF018D482542
+:104F8000000B52008FBF0010012A3825310600FFA8
+:104F90003444700000E628252402FF813C03100001
+:104FA00027BD0018AF45014CAF440154A342015244
+:104FB00003E00008AF43017827BDFFD8AFB2001867
+:104FC000AFB10014AFB00010AFBF0020AFB3001CF2
+:104FD00093420109308600FF30B000FF000618C27E
+:104FE000320400023071000114800005305200FFCD
+:104FF0009367000530E5000810A0000D30C80010D0
+:10500000024020210E0005CD0220282124040001A9
+:105010008FBF00208FB3001C8FB200188FB1001417
+:105020008FB000100080102103E0000827BD002889
+:105030001500003200000000934301090000282100
+:105040003062007F000220C00002F94003E4982192
+:1050500026790088033B98218E7800248E6F000803
+:10506000130F0046000000008F6400842418000223
+:105070000004FD8233F900031338007C00000000B7
+:1050800093660083934A0109514600043205007C6F
+:1050900010A00060000000003205007C14A0005346
+:1050A0000240202116200006320400018E7F0024D9
+:1050B0008F59010417F9FFD60000202132040001A6
+:1050C0001080000A024020218F4209408F93006423
+:1050D00010530006000000000E00067B022028216D
+:1050E0008F430940AF630044024020210E00062890
+:1050F000022028210A00082C240400013C09080091
+:105100008D290064252600013C010800AC260064BE
+:1051100016000012000000008F6D00843C0E00C0DD
+:1051200001AE602415800005024020210E0007FA20
+:10513000022028210A00082C240400012405000470
+:105140000E00059624060001024020210E0007FAF9
+:10515000022028210A00082C240400010E00003D32
+:1051600024040001936B007D020B50250E00005EAD
+:10517000A36A007D0A00086F8F6D00848F6600743B
+:105180008F4801048E67002400064E021507FFB603
+:105190003126007F936B008326440001308A007F14
+:1051A00011460043316300FF5464FFB08F640084F4
+:1051B0002645000130B1007F30A200FF1226000416
+:1051C00024050001004090210A000842241100013A
+:1051D000240FFF80024F702401CF9026324200FF3F
+:1051E000004090210A000842241100010E00067BB5
+:1051F00002202821321800301300FFAA321000824A
+:10520000024020210E0005CD022028210A00082C92
+:10521000240400018F6E00743C0F800024050003FD
+:1052200001CF9025AF7200749371008324060001B2
+:105230000E000596322400FF0E00003D24040001FC
+:10524000936D007D020D60250E00005EA36C007D55
+:105250003C0B08008D6B0054257000013C010800D8
+:10526000AC3000540A00082C240400018F6800743C
+:105270003C0980002405000401093825AF6700744B
+:1052800093630083240600010E000596306400FF3E
+:105290000E00003D240400019362007D0202982567
+:1052A0000E00005EA373007D0A00082C2404000198
+:1052B000324D008039AC0080546CFF6C8F640084E8
+:1052C0000A0008952645000127BDFFD03C0A0008CA
+:1052D000AFBF002CAFB40028AFB30024AFB20020A2
+:1052E000AFB1001CAFB00018034AD8212409004018
+:1052F000AF490814AF4008108F4209448F4309504A
+:105300008F4609548F47095C8F48094C9344010824
+:105310009345010BAF820064308400FF30A500FF8D
+:10532000AF830054AF860050AF87005C0E000816B4
+:10533000AF8800601440015A8FBF002CA76000683E
+:10534000934D0900240B00503C14080026943C3077
+:1053500031AC00FF3C12080026523C40118B000388
+:10536000000000000000A02100009021934F0109DF
+:105370008F8800542402001031F1007F001170C0AA
+:105380000011694001AE282124B80088AF580818E0
+:105390008F4A01048F4B09A43C0C000E034CC8211A
+:1053A000014B48233C010800AC293B088F440958B5
+:1053B0003C010800A0223B2C9746090800881823CE
+:1053C0003C010800AC233B0C30C7FFFF0007F9C0CD
+:1053D0003C010800AC283B30AF5F002C9742090825
+:1053E0009730002C8E910000932F0018037898219D
+:1053F000A7900058AF9300480220F80931F000FF51
+:10540000304E000215C0018E30530001126001427F
+:10541000000000008F4F09A4241300013C01080084
+:10542000AC2F3B3493510934934E0937322500FF9A
+:1054300031CD00FF000D60800185502101505821C1
+:105440003C010800A42B3B243C010800A42A3B2279
+:1054500093490934312200FF0202202124900010D8
+:105460003C010800A4303B20240800068F9900541A
+:105470003C010800AC283B288F9F005C8F580958DE
+:105480000000802103F9282304A0013C03192023F4
+:105490000480013A00A4382B10E0013C0000000019
+:1054A0003C010800AC253B0C8E4200000040F8098E
+:1054B000000000003046000214C000DD00408821DA
+:1054C00030430001546000108E4200043C04080088
+:1054D0008C843B103C09C00000898025AF500E0031
+:1054E0008F4B0000316A00081140FFFD00000000F2
+:1054F00097450E0824100001A78500408F4C0E042C
+:10550000AF8C00348E4200040040F8090000000017
+:1055100002228825322D000215A00159000000004A
+:105520003C09080095293B183C06080094C63B241A
+:105530003C04080094843B1A3C1908008F393B1046
+:10554000012658213C1808008F183B343C1F0800E6
+:1055500097FF3B2E016418218F4E09400329282113
+:10556000246F00020319682100BF60213C0108007C
+:10557000A42B3B26AF8E00643C010800AC2D3B34CD
+:105580003C010800A42C3B1C0E00009A31E4FFFFF4
+:105590008F87004C004020213C010800A0273B2DB4
+:1055A0008E42000824E80001AF88004C0040F80952
+:1055B000000000008F4B002C974909083C0A000EA0
+:1055C000034A38213124FFFF000419C08F8A005498
+:1055D000AF43002C9743090894E6001A004040218D
+:1055E00030DFFFFFAC5F00008CF9001CAC590004F9
+:1055F0008CF80020AC58000890EF001931E300034C
+:10560000107300E60000000028620002144001024E
+:10561000240C0002106C00F4240D0003106D00A790
+:10562000000000003C09080095293B1C9345093403
+:10563000934C09213C0F080095EF3B2230BF00FF3F
+:1056400094EE002A001F6882319900FF978C005861
+:10565000000D16000019C4003124FFFF01E43021C1
+:10566000005848250126382501CC28213C0340005C
+:1056700000E3F82500056C00AD0D0004AD1F00002F
+:10568000935909203C180006250D001400197E00CE
+:1056900001F87025AD0E00088F42092C2586000107
+:1056A0008E4C000CAD02000C8F44093030C97FFFD6
+:1056B000A7890058AD0400108F4709382504002839
+:1056C000AD070014ADAA00048F450940ADA5000840
+:1056D000934309373C1F080093FF3B2CADA00010FB
+:1056E0000003C700001FCC000319782535EEFFFF2B
+:1056F000ADAE000CAF4B002C0180F809000000009B
+:105700003C06080094C63B263C02080094423B1A23
+:1057100000C24821252B00020E0000C33164FFFFA8
+:105720003C0808008D083B083C0708008CE73B104C
+:10573000010750233C010800AC2A3B081540000635
+:10574000000000003C0808008D083B28350A004096
+:105750003C010800AC2A3B28120000848F830048DB
+:105760008F470E108F900048AE0700208F4B0E1809
+:10577000AE0B00243C10080096103B1C0E00005C91
+:1057800000000000240F0040AF4F08148F86005423
+:105790008F89005000D018210069702319C00004BF
+:1057A000AF830054AF6300548F640054AF84005043
+:1057B0001200000C000000008F44007493780081F8
+:1057C0003419FA002F020007104000050099182133
+:1057D000937F0081240C01F403EC680401A41821D8
+:1057E000AF63000C8F4A095C8F88005C0148282356
+:1057F00018A00003000000008F50095CAF90005C0F
+:105800000E00005E000000008F8300548E470010E1
+:105810003C010800AC233B3000E0F8090000000028
+:105820003C0B08008D6B3B081560FF102408000638
+:105830008F590024975F09088F8900648F8E005468
+:105840003C0C001F978400588F8F002C8F930050C2
+:1058500033F8FFFF358DFF80032D3024001811C071
+:1058600032320010AF420024A5E4002CAF460024E1
+:10587000AF690044AF6E0050AF7300545640007CD7
+:105880008E850004322A0040554000318E91000878
+:105890008E88000C0100F809000000008FBF002C6A
+:1058A0008FB400288FB300248FB200208FB1001C6A
+:1058B0008FB0001803E0000827BD00303C09080045
+:1058C00095293B1C3C03080094633B263C040800DC
+:1058D00094843B1894F900243125FFFF94F80028A4
+:1058E0000065F82103E478230019640000186C00B7
+:1058F00025EEFFEE01AE302535828100240308003D
+:10590000AD02000CAD060010AD030018AD00001490
+:105910000A0009B32508001C934301098F8600384B
+:1059200000033E0000E64025AF4800808F5F09A0DD
+:105930008F5809A4AFBF0010AF5F0E148FB90010CD
+:10594000AF590E10AF580E1C0A00092DAF580E1893
+:105950000220F809000000008E88000C0100F80900
+:10596000000000000A000A508FBF002CA460002035
+:10597000A47300220A000A05AC7300243C0108004D
+:10598000AC203B0C0A0009538E4200003C01080089
+:10599000AC243B0C0A0009538E4200003C0908006D
+:1059A00095293B1C3C1F080097FF3B263C0508003F
+:1059B00094A53B1894F800243124FFFF03E4C82188
+:1059C0000325782300186C0025EEFFF201AE602558
+:1059D000AC4C000C24020800AD020014AD00001015
+:1059E0000A0009B32508001894E6002494E300286F
+:1059F0003C09080095293B1C000624000003FC001C
+:105A00003485810037F90800AD05000CAD19001090
+:105A10000A0009B3250800141460FF02000000000A
+:105A200094F800243C09080095293B1C00187C00D0
+:105A300035EE0800AD0E000C0A0009B32508001071
+:105A400093520109000028210E000628324400FF6D
+:105A50008FBF002C8FB400288FB300248FB200209A
+:105A60008FB1001C8FB0001803E0000827BD003084
+:105A700000A0F809000000000A000A4A322A00408B
+:105A80001200FF6B000000008F4E0E148F92004832
+:105A9000AE4E00208F530E1C0A000A34AE53002471
+:105AA0008F820018008040213C040100904700854F
+:105AB00030E3002010600009000000003C070800EF
+:105AC0008CE73B308F83001400E320230480000820
+:105AD0009389000014E300030100202103E0000883
+:105AE000008010213C04010003E000080080102128
+:105AF0001120000B006738238F8C001C2409003410
+:105B0000918B00BC316A0002514000012409003031
+:105B100000E9682B15A0FFF10100202100E93823DE
+:105B20002419FFFC00B9C02400F9782400F8702B78
+:105B300015C0FFEA01E8202130C20003000218234B
+:105B400014C00012306900030000302100A9702148
+:105B500001C6682100ED602B1180FFE03C040100CC
+:105B60002D2F00010006482B0105382101E93024C2
+:105B700014C0FFDA24E4FFFC2419FFFC00B9C024A0
+:105B80000308202103E00008008010218F8B001CF7
+:105B900024060004916A00BC314400041480FFEC28
+:105BA00000A970210A000AFC0000302127BDFFE88F
+:105BB000AFBF00108F460100934A01093C1F080047
+:105BC0008FFF00902407FF80314F00FF31E8007FF6
+:105BD0000008614003E6C821032CC02127090120E9
+:105BE000012770243C010800A02F3B6CAF4E080C2D
+:105BF0003C0D08008DAD00903C0400803482000311
+:105C000001A65821016C18212465012030AA0078D2
+:105C100001424025AF48081C3C1F08008FFF009040
+:105C20008F88004403E6C021331900070307482486
+:105C3000033A7821AF49002825E909C0952E0002D2
+:105C40003C0D08008DAD008C3C0A08008D4A009088
+:105C500031CC3FFF01A61821000C5980006B282190
+:105C600000A72024AF44002C952200023C1F08000E
+:105C70008FFF008C9107008530593FFF03E67821A4
+:105C80000019C1800146702101F8682131CC007FE4
+:105C900031AB007F019A2821017A50213C03000C8E
+:105CA0003C04000E00A328210144102130E600200E
+:105CB00027470980AF820028AF880018AF890020ED
+:105CC000AF85001C10C00006AF8700248D02005075
+:105CD0008CA4010C0044302318C0007700000000A1
+:105CE000910C0085240DFFDF018D3824A10700856C
+:105CF0008F8B00188F8900208F8700248D65004CC2
+:105D0000AF850014912F000D31EE002011C0001757
+:105D10000000000024090001A3890000AF800008F2
+:105D20008CE400248F850008240A0008AF8000045A
+:105D3000AF80000C3C010800A42A3B1A3C0108007B
+:105D4000A4203B2E0E000AD0000030218F850020B9
+:105D50008FBF0010AF82001090A8000D27BD001863
+:105D60000008394203E0000830E20001913F0002E0
+:105D70002418000133F900FF00192182109800391E
+:105D8000240800021088005B8F8600288CE5002420
+:105D900014A0001B8F9F001C91220000240A000504
+:105DA0003046003F10CA0047240400018F860004DB
+:105DB000A3840000AF86000CAF8600088CE40024AA
+:105DC0008F850008240A00083C010800A42A3B1A19
+:105DD0003C010800A4203B2E0E000AD00000000069
+:105DE0008F8500208FBF0010AF82001090A8000D9B
+:105DF00027BD00180008394203E0000830E2000126
+:105E00008CF800088CF900248FEE00C4A3800000F9
+:105E10008CE40024AF8E00088F8500088F86000474
+:105E200003197823240A0008AF8F000C3C010800F6
+:105E3000A42A3B1A3C010800A4203B2E0E000AD0E5
+:105E4000000000008F8500208FBF0010AF8200107F
+:105E500090A8000D27BD00180008394203E0000893
+:105E600030E20001912300003062003F104400271F
+:105E70008F85001C8CE400241480002100000000A9
+:105E80008D2E00183C187FFF8F85001C370FFFFFF9
+:105E900001CF1824AF8300048F9F00048CA80084D6
+:105EA00003E8C82B1720000203E020218CA4008403
+:105EB0000A000B8BAF8400048CA3010C0A000B6951
+:105EC000AF8300148D2C00188F8600043C0D7FFFDB
+:105ED0008F89001C35A3FFFF01835824240400018F
+:105EE000AF8B000CAD2000CCA38400000A000B9700
+:105EF000AF8600088CCA00140A000B8BAF8A00041E
+:105F00008CA300C80A000BCEAF8300048F84002846
+:105F10008CAC00648C8D0014018D582B1160000432
+:105F2000000000008CA200640A000BCEAF820004C7
+:105F30008C8200140A000BCEAF8200048F8500080B
+:105F400027BDFFE0AFBF0018AFB1001414A00007D9
+:105F5000AFB000108F8600202402000590C400001E
+:105F60003083003F106200B68F84001C8F910004C4
+:105F700000A080218F8C00243C0508008CA53B0CE0
+:105F80008D8B000431663FFF00C5502B554000014A
+:105F900000C02821938D000011A0007300B0F82BE1
+:105FA0008F98001C24040034930F00BC31EE0002D3
+:105FB00051C000012404003000A4C82B172000D1D8
+:105FC0000000000000A4282300B0F82B3C010800CA
+:105FD000A4243B1817E00068020020213C030800BD
+:105FE0008C633B080083102B544000010080182173
+:105FF0008F8800203C010800AC233B1000004821A2
+:106000009104000D30830020506000018F490E186C
+:106010008F8300100123382B10E00059000000008E
+:106020003C0408008C843B1000895821006B502BE5
+:10603000114000560090602B0069302300C02021E1
+:106040003C010800AC263B1012000003241FFFFC9B
+:106050001090008A32270003009FC8243C010800EA
+:10606000AC393B103C010800A4203B2E8F84000873
+:10607000120400078F83001CAF910004020020214E
+:106080008C7100CCAF90000826300001AC7000CCC1
+:106090003C0208008C423B108F8A000C2407001839
+:1060A0000082202301422823AF84000810800002D0
+:1060B000AF85000C240700108F8600183C010800F3
+:1060C000A0273B2C2407004090CC0085318B00C0DA
+:1060D000116700408F8D001014A0001500002021D2
+:1060E000934A01098F420974314500FF00022602DC
+:1060F00024A300013090007F3071007F1230007ABD
+:106100002407FF80A0C300833C0908008D293B2899
+:106110008F880020240D0002352C00083C01080067
+:10612000A02D3B6D3C010800AC2C3B282404001042
+:10613000910E000D31C6002010C00005008018210E
+:10614000240800013C010800AC283B103483000106
+:106150008FBF00188FB100148FB0001000601021A5
+:1061600003E0000827BD00203C010800A4203B18E4
+:1061700013E0FF9A020020210A000C1F00A020213A
+:106180003C0408008C843B100090602B1180FFAE13
+:10619000000000003C0F080095EF3B1801E470215F
+:1061A00001C6682B11A000072C8200043C1F600070
+:1061B0008FF954043338003F1700FFE524030042F1
+:1061C0002C8200041040FFA0240300420A000C7D32
+:1061D0008FBF0018152DFFC0000000008CDF007479
+:1061E0003C0380002405FF8003E3C825ACD900747C
+:1061F00090D80085240E000424040010330F003FC3
+:1062000001E54025A0C800858F8800203C010800DA
+:10621000A02E3B6D240300019106000D30C9002023
+:1062200015200003000000003C0308008C633B10B5
+:106230003C010800AC233B080A000C74000000007D
+:106240008F87000C8C88008400E8282B14A00002A3
+:1062500000E088218C91008424090001A3890000BA
+:106260008F440E18022028210E000AD0022030216F
+:10627000022080210A000C05AF82001000071823BD
+:10628000306600033C010800A4263B2E12200005C6
+:106290008F8C001C918B00BC316A000415400015E6
+:1062A00024CD00043C0F080095EF3B2E01E4702143
+:1062B00000AE302B50C0FF6E8F8400082C85000587
+:1062C00014A0FFA32403004230980003170000022B
+:1062D000009818232483FFFC3C010800AC233B10EA
+:1062E0000A000C410000000000A758240A000C69B5
+:1062F000016718263C010800A42D3B2E0A000CD192
+:10630000000000003C010800AC203B100A000C7C9F
+:10631000240300428F83000C14600007000010214A
+:106320008F880020240500059106000030C400FF7E
+:10633000108500030000000003E0000800000000DA
+:10634000910A0018314900FF000939C214E0FFFA30
+:106350008F8500183C04080094843B183C03080017
+:106360008C633B303C1908008F393B103C0F080010
+:1063700095EF3B2E0064C0218CAD005403197021B1
+:1063800001CF6021018D58231960001D000000001D
+:10639000910E001C8F8C0028974B0E1031CD00FF02
+:1063A0008D850004016D30238D88000030CEFFFF05
+:1063B000000E510000AAC821000038210107202149
+:1063C000032A182B0083C021AD990004AD9800006A
+:1063D000918F000A01CF6821A18D000A8F880028C3
+:1063E000974B0E12A50B0008950A003825490001AD
+:1063F000A50900389107000D34E60008A106000D3C
+:1064000003E000080000000027BDFFE093870000C4
+:106410008F8F00208FAD00143C0E7FFF8F89000806
+:1064200035C8FFFFAFBF001CAFB0001801A818248B
+:1064300091EA000D000717C03C1FBFFF00625825FE
+:106440002D2E00018F90001437F9FFFF3C18080033
+:106450008F183B303C0F080095EF3B2601796824EC
+:10646000000E47803C07EFFF3C05F0FF01A8182510
+:106470003149002034E2FFFF34ACFFFF0310582302
+:1064800027A500102406000225EA00020062182455
+:106490000080802115200002000040218F480E1C42
+:1064A000A7AA0012056000372407000030FF00FF94
+:1064B000001FCF008F8B001800793825AFA700147C
+:1064C000916F00853C08080091083B2D3C18DFFFC8
+:1064D00031EE00C0370AFFFF000E182B3C1F0800EA
+:1064E00097FF3B2000EA6824A3A80011000317408F
+:1064F00001A248258FB90010AFA900143C0A08007A
+:10650000914A3B2FA7BF00168FA80014032CC0246C
+:106510003C0B01003C0F0FFF030B18253147000314
+:1065200035EEFFFF010C682400071600006EF8240A
+:106530003C09700001A2C82503E95825AFB9001431
+:10654000AFAB00100E000072A3A000158F8C0020CE
+:10655000260200089186000D30C40020108000063D
+:106560008FBF001C3C05080094A53B1C24B0FFFF16
+:106570003C010800A4303B1C8FB0001803E0000869
+:1065800027BD00208F9800100118502B5540FFC7E1
+:10659000240700010A000D5430FF00FF9382000021
+:1065A00027BDFFE0AFBF00181040000F0080502152
+:1065B0008F880020240B00058F89000491070000BC
+:1065C0008F84001C0100282130E3003F8F860028C3
+:1065D000106B000800003821AFA900100E0004392C
+:1065E000AFAA0014A38000008FBF001803E00008CA
+:1065F00027BD00208D1900183C0F08008DEF3B10BF
+:106600008F98000C3C027FFF8D080014345FFFFF61
+:10661000033F682401F8702101AE6023018838210E
+:10662000AFA900100E000439AFAA00140A000DA291
+:10663000A38000008F8700203C05080094A53B2E16
+:106640003C0208008C423B2890E6000D0005240027
+:1066500030C300201060002C004440258F850018B6
+:1066600000006021240B000190A300850000482158
+:10667000240A00013C0F800035EE00708DC7000039
+:10668000AF8700308F5801780700FFFE3C03800081
+:10669000347900708F3800003C0508008CA5007428
+:1066A0003C0D08008DAD00700307782300AF382142
+:1066B0000000102100EF302B01A2202100861821BC
+:1066C0003C010800AC2700743C010800AC230070BA
+:1066D000AF4B01483C1908008F393B30A7490144B2
+:1066E000A74A0146AF59014C3C0B0800916B3B2D6A
+:1066F000A34B0152AF4801543C081000A74C01586D
+:1067000003E00008AF4801788F4B0E1C3C0A0800DC
+:106710008D4A3B1097490E16974D0E140145602186
+:10672000312AFFFF0A000DC531A9FFFF8F8300202A
+:106730009064000D3082002010400029000000000D
+:106740000000482100005021000040213C0780004B
+:1067500034EB00708D670000AF8700308F4C0178FC
+:106760000580FFFE3C0D800035AC00708D8B000075
+:106770003C0508008CA500743C0408008C84007063
+:106780000167302300A678210000102101E6C82B04
+:106790000082C021031970213C010800AC2F007455
+:1067A0003C010800AC2E0070AF4901483C0D0800C8
+:1067B0008DAD3B30A748014424090040A74A01465B
+:1067C0003C081000240AFF91AF4D014CA34A01522E
+:1067D000AF490154A740015803E00008AF480178D1
+:1067E0008F490E1897460E1297450E1030CAFFFFBC
+:1067F0000A000DFB30A8FFFF8F83002027BDFFF8A4
+:106800009064000D308200201040003A000000002B
+:10681000240B000100004821240A00013C088000EC
+:10682000350700708CE30000AF8300308F4C017897
+:106830000580FFFE3C0E80003C04080090843B6C09
+:1068400035C700708CEC00003C0508008CA5007476
+:10685000A3A400033C1908008F3900708FAD00001D
+:106860000183302300A63821000010210322782163
+:1068700000E6C02B01F8602101AE4025AFA8000062
+:106880003C010800AC2700743C010800AC2C0070EF
+:106890009346010A3C04080090843B6DA3A00002CB
+:1068A000A3A600018FA300003C0580FF3099007F64
+:1068B00034A2FFFF006278240019C60001F8702599
+:1068C000240D3000AF4E014C27BD0008AF4D0154E0
+:1068D000A7400158AF4B0148A7490144A74A0146C8
+:1068E0003C091000240AFF80A34A015203E000087B
+:1068F000AF4901788F4B0E1897460E1297450E1030
+:1069000030CAFFFF0A000E2F30A9FFFF8F85001845
+:106910002402008090A40085308300C0106200052E
+:106920008F86001C8F8800048F870008ACC800C8C1
+:10693000ACC700C403E00008000000003C0A0800E7
+:10694000254A37CC3C090800252938983C0808001E
+:1069500025082C4C3C07080024E739AC3C0608000D
+:1069600024C6363C3C05080024A533B43C0408008A
+:1069700024842FDC3C030800246336D43C02080046
+:10698000244234A83C010800AC2A3C383C010800F1
+:10699000AC293C343C010800AC283C303C010800E8
+:1069A000AC273C3C3C010800AC263C4C3C010800B8
+:1069B000AC253C443C010800AC243C403C010800B0
+:1069C000AC233C503C010800AC223C4803E00008EA
+:0469D00000000000C3
+:00000001FF
+/*
+ * This file contains firmware data derived from proprietary unpublished
+ * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
+ *
+ * Permission is hereby granted for the distribution of this firmware data
+ * in hexadecimal or equivalent format, provided this copyright notice is
+ * accompanying it.
+ */
diff --git a/firmware/bnx2/bnx2-mips-09-4.6.17.fw.ihex b/firmware/bnx2/bnx2-mips-09-4.6.17.fw.ihex
new file mode 100644 (file)
index 0000000..7667c66
--- /dev/null
@@ -0,0 +1,5816 @@
+:10000000080000F80800000000004AC8000000C80E
+:1000100000000000000000000000000008004AC8C6
+:100020000000003000004B90080000800800000035
+:10003000000053A800004BC0080055400000008499
+:1000400000009F68080053A80000016C00009FECAE
+:10005000080031D808000000000079080000A1580D
+:100060000000000000000000000000000800790807
+:100070000000012400011A60080004880800040040
+:10008000000013A400011B84000000000000000019
+:1000900000000000080017A40000000400012F2841
+:1000A000080000980800000000003AFC00012F2C16
+:1000B00000000000000000000000000008003AFC02
+:0800C0000000003000016A2875
+:0800C8000A00003E00000000E8
+:1000D000000000000000000D636F6D342E362E31DD
+:1000E00036000000040610020000000000000003BB
+:1000F00000000014000000320000000300000000B7
+:1001000000000000000000000000000000000000EF
+:1001100000000010000001360000EA60000000014D
+:1001200000000000000000000000000000000008C7
+:1001300000000000000000000000000000000000BF
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000020000000000000000000000008D
+:10017000000000000000000000000000000000007F
+:10018000000000000000000000000010000000005F
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C0000000000010000003000000000000000D0F
+:1001D0000000000D3C02080024424B203C030800B4
+:1001E00024634C18AC4000000043202B1480FFFD1A
+:1001F000244200043C1D080037BD9FFC03A0F021F1
+:100200003C100800261000F83C1C0800279C4B20DE
+:100210000E000273000000000000000D27BDFFE883
+:100220003C028000AFB00010AFBF0014345001009A
+:10023000920200091040001A240300013C02080049
+:100240008C42002010400016000018210E000D7195
+:1002500000000000960300083C06080094C64BFE10
+:100260008E0400188F82002C9605000C00031C00E1
+:1002700000661825AC440000AC45000424040001CD
+:10028000AC400008AC40000CAC400010AC40001486
+:10029000AC4000180E000D98AC43001C0000182163
+:1002A0008FBF00148FB000100060102103E0000821
+:1002B00027BD001827BDFFE8AFBF00103C0280003B
+:1002C0009442010830437000240220001062000AAA
+:1002D00028642001548000128FBF001024024000C7
+:1002E00010620008240260001062000A8FBF001034
+:1002F0000A000097000010218FBF00100A0000556F
+:1003000027BD00180E000433000000000A0000960C
+:100310008FBF00100E000C81000000008FBF001086
+:100320000000102103E0000827BD00183C0208006F
+:100330008C42002027BDFFE810400028AFBF00100E
+:100340000E000D71000000003C05800094A2010821
+:1003500094A3010C8F86002C3042003E3063FFFFD7
+:100360000002140000431025ACC200008CA2010062
+:100370003C07080094E74BFE8FBF0010ACC200049E
+:1003800094A3011694A4010E3C02200000031C005B
+:100390003084FFFF00641825ACC3000800E2382554
+:1003A00094A2011094A3011224040001000214007D
+:1003B0003063FFFF00431025ACC2000C94A201146F
+:1003C00027BD00183042FFFFACC20010ACC00014C3
+:1003D000ACC000180A000D98ACC7001C8FBF0010FD
+:1003E00003E0000827BD00183C0680008CC202B85C
+:1003F0002403000104410008008028213C02080079
+:100400008C420060244200013C010800AC220060E4
+:1004100003E00008006010218C8300209482001605
+:10042000ACC302802442FFFCA4C202843C02080048
+:100430008C42005C8C84000494A3000E24420001D2
+:100440003C010800AC22005C3C021000A4C3028600
+:10045000ACC4028800001821ACC202B803E0000856
+:10046000006010213C0208008C42002027BDFFE8FC
+:100470001040002BAFBF00100E000D7100000000F7
+:100480003C05800094A2010894A3010C8F86002CE7
+:100490003042003E3063FFFF00021400004310258D
+:1004A000ACC200008CA201003C07080094E74BFEA0
+:1004B0008FBF0010ACC2000494A3011694A4010ED7
+:1004C0003C02200000031C003084FFFF006418255C
+:1004D000ACC3000800E2382594A2011094A30112D5
+:1004E00024040001000214003063FFFF00431025C4
+:1004F000ACC2000C94A2011427BD00183042FFFFCB
+:10050000ACC200108CA20118ACC2001490A2010B66
+:10051000304200FFACC200180A000D98ACC7001CA6
+:100520008FBF001003E0000827BD001827BDFFE0C3
+:10053000AFB000103C108000AFB20018AFBF001C7D
+:10054000AFB10014361201009243000B2402001ACE
+:10055000965100081462005B00002821322200013D
+:1005600010400018000000008E42000000022340EE
+:100570003C02003F3442FFFF0044102B10400004B7
+:100580003C030040964200140A00013B00832021F6
+:100590008E030100240201005462000696420014FA
+:1005A0003C028008944200043042000F0002250003
+:1005B0009642001400821025AE0200800A00016FEE
+:1005C000000000003C0208008C420020104000287F
+:1005D000000000000E000D710000000096020108EE
+:1005E0009603010C8F85002C3042003E3063FFFFE4
+:1005F0000002140000431025ACA200008E0201008E
+:100600003C06080094C64BFEACA2000496030116FB
+:100610009604010E3C02200000031C003084FFFF02
+:1006200000641825ACA3000800C230259602011012
+:100630009603011224040001000214003063FFFF3E
+:1006400000431025ACA2000C960201143042FFFFBB
+:10065000ACA200108E020118ACA200149202010B91
+:10066000304200FFACA200180E000D98ACA6001C92
+:100670003C0208008C420040244200013C0108007A
+:10068000AC2200403C0308008C630044322200028C
+:1006900032240004246300013C010800AC23004420
+:1006A000108000080002282B024020218FBF001C70
+:1006B0008FB200188FB100148FB000100A0000C86C
+:1006C00027BD00208FBF001C8FB200188FB100140F
+:1006D0008FB0001000A0102103E0000827BD00200B
+:1006E00027BDFFE03C058000AFB10014AFBF00188C
+:1006F000AFB0001034B101009223000B24020003BC
+:1007000014620043963000083202000110400016C7
+:100710003C02003F8E2300003442FFFF00032340D1
+:100720000044102B504000052402010096220014C2
+:100730003C0300400A0001A400832021546200060B
+:10074000962200143C028008944200043042000FBC
+:10075000000225009622001400821025ACA2008021
+:100760000A0001AF000000000E0000990000000028
+:100770003C0208008C420040244200013C01080079
+:10078000AC2200403C0208008C42004432030004CA
+:10079000244200013C010800AC2200441060000724
+:1007A00032020002022020218FBF00188FB10014F6
+:1007B0008FB000100A0000C827BD002010400015AF
+:1007C0008FBF00183C0480008C8301043C02602031
+:1007D000AC4300148C420004240301FE304203FFAA
+:1007E0001443000C8FBF00188C820100000219C254
+:1007F0002462FFFC2C420008104000032404000285
+:100800002462FFFD004420043C026000AC446914F3
+:100810008FBF00188FB100148FB00010000010219E
+:1008200003E0000827BD00203C0480008C83010009
+:1008300024020100506200033C0280080000000D09
+:100840003C02800894430004000010213063000F34
+:1008500000031D0003E00008AC8300803C02800818
+:10086000344200809042000003E00008AF800000A6
+:1008700003E000080000102127BDFFE83C028000D3
+:10088000AFBF0014AFB000108C430100AC43002098
+:100890008C430104AC4300A89050010B0E0001E50D
+:1008A000321000FF3C02080024424B580010188010
+:1008B0002E10001D16000005006210210E0001EA36
+:1008C000004018210A000205000000008C420000D0
+:1008D0000040F80900000000004018213C02080018
+:1008E0008C42003410600005244400013C0280006A
+:1008F0008C4301043C026020AC4300148FBF001401
+:100900008FB000103C0340003C02800027BD00185F
+:10091000AC4301383C010800AC24003403E000087B
+:100920000000000027BDFFE8AFBF0014AFB000100B
+:100930003C1080008E0201400E0001E5AE02002056
+:100940000E000399000000003C04080024840038D5
+:100950008C8200003C034000AE0301788FBF00147E
+:100960008FB000102442000127BD001803E00008EA
+:10097000AC82000027BDFFE8AFB00010AFBF00148D
+:100980003C1080008E0201800E0001E5AE020020C6
+:100990008E03018024020F00546200083C0280088C
+:1009A0008E0201883C0300E03042FFFF0043102527
+:1009B000AE0200800A00024A3C02800034420080FD
+:1009C0009042000024030050304200FF144300080E
+:1009D0003C0280000E000379000000001440000477
+:1009E0003C0280000E000967000000003C0280000D
+:1009F0003C034000AC4301B83C0208008C42003C80
+:100A00008FBF00148FB00010244200013C01080089
+:100A1000AC22003C03E0000827BD001803E00008FA
+:100A2000000010213C05800034A4010094820008DD
+:100A30003043000230420004104000030000000078
+:100A40000A0000C800000000106000052404000136
+:100A50003C0208008C4200840A00026F244200011C
+:100A60008CA301048F82000C104300080000202199
+:100A70008CA301043C0208008C420084AF83000C6C
+:100A8000244200013C010800AC22008403E000087D
+:100A90000080102127BDFFE83C036010AFBF0014A9
+:100AA000AFB000108C6550002402FF7F3C04800032
+:100AB00000A2282434A5380C24020037AC6550006D
+:100AC000AC82000824020C80AC8200243C060800A2
+:100AD00024C607A83C02080024424B582405001CE9
+:100AE00024A5FFFFAC46000004A1FFFD2442000442
+:100AF0003C020800244201EC3C010800AC224B609F
+:100B00003C020800244206183C010800AC224B6459
+:100B10003C02080024420D103C010800AC224BA00E
+:100B20003C020800244204643C0308002463095486
+:100B30003C0408002484095C3C05080024A52C948E
+:100B40003C010800AC224BC03C0208002442076074
+:100B50003C010800AC264BA83C010800AC254BB476
+:100B60003C010800AC234BBC3C010800AC244BC446
+:100B70003C010800AC224BC83C010800AC234B5C94
+:100B80003C010800AC204B683C010800AC204B6CD9
+:100B90003C010800AC204B703C010800AC204B74B9
+:100BA0003C010800AC204B783C010800AC204B7C99
+:100BB0003C010800AC204B803C010800AC244B8475
+:100BC0003C010800AC204B883C010800AC204B8C59
+:100BD0003C010800AC204B903C010800AC204B9439
+:100BE0003C010800AC204B983C010800AC264B9C13
+:100BF0003C010800AC264BA43C010800AC204BACE7
+:100C00003C010800AC254BB03C010800AC234BB8BC
+:100C10000E00055A000000003C02800034420070C3
+:100C20008C420000AF8200103C0308008C6300205F
+:100C30008F820004104300043C0580000E000D3735
+:100C4000AF8300043C05800034A900708D280000AB
+:100C50008F8400103C0708008CE700BC3C060800AD
+:100C60008CC600B8010420230000102100E43821C4
+:100C700000C2302100E4202B00C430213C010800D8
+:100C8000AC2700BC3C010800AC2600B88CB00000CA
+:100C9000320200071040FFE4AF8800108D260000EC
+:100CA0003C0508008CA500BC3C0408008C8400B8FE
+:100CB00000C8302300A628210000102100A6302BF8
+:100CC0000082202100862021320700013C0108001B
+:100CD000AC2500BC3C010800AC2400B810E00004C6
+:100CE000320200020E0001EC00000000320200029D
+:100CF00010400004320200040E0002170000000041
+:100D0000320200045040FFC53C0280000E00022B5E
+:100D1000000000000A0002D53C0280003C02900066
+:100D200034420001008220253C028000AC440020B7
+:100D30003C0380008C6200200440FFFE00000000A5
+:100D400003E00008000000003C0280003443000182
+:100D50000083202503E00008AC44002027BDFFE00D
+:100D6000AFB10014AFB0001000808821AFBF0018F1
+:100D70000E00031530B000FF8F83FFAC022020214E
+:100D80009062002502028025A07000258C7000185A
+:100D90003C0280000E000320020280241600000A9C
+:100DA0008FBF00183C0380008C6201F80440FFFEF6
+:100DB00024020002AC7101C0A06201C43C02100018
+:100DC000AC6201F88FBF00188FB100148FB0001013
+:100DD00003E0000827BD002027BDFFB8AFBF0044D7
+:100DE000AFB000403C0780008CE601048F82FFA872
+:100DF000AFA600288C450020AFA5002C8C44003CF9
+:100E0000AFA400308C430040AFA300348C42004CB0
+:100E1000AFA60010AFA50014AFA20020AFA200380B
+:100E20003C0208008C420020AFA40018AFA3001CB5
+:100E30008CF00100104000198FBF00440E000D71AE
+:100E4000000000008F83002C3C05080094A54BFE99
+:100E50003C024018AC70000000A228258FA20010B0
+:100E600024040001AC6200048FA20014AC620008EC
+:100E70008FA20018AC62000C8FA2001CAC620010A4
+:100E80008FA20020AC6200148FA20024AC62001874
+:100E90000E000D98AC65001C8FBF00448FB0004061
+:100EA0000000102103E0000827BD004827BDFFE82F
+:100EB000AFBF00103C038000946201843042020006
+:100EC00010400005000020210E000FE3000000008C
+:100ED0000A00038F240400018C6201880440000A88
+:100EE0008FBF00108C6201883C03FF000043102478
+:100EF0003C03040014430004240400018F82FFAC6F
+:100F0000904200088FBF00100080102103E000080D
+:100F100027BD00188F82FFB024050001A040001AF1
+:100F20003C0280000A0003258C44014027BDFFE0FD
+:100F3000AFB100148F91FFACAFBF001CAFB200186F
+:100F4000AFB000109222000024030020304200FFC6
+:100F50001043000C3C028000922200002403003069
+:100F6000304200FF104300073C0280009222000044
+:100F700024030050304200FF144300818FBF001C47
+:100F80003C02800090420148304200FF2443FFFFB2
+:100F90002C6200051040007A8FBF001C00031080F7
+:100FA0003C03080024634AD8004310218C4200000F
+:100FB00000400008000000003C1180008E24014029
+:100FC0000E0003158F92FFAC8E50000C8E22014450
+:100FD0001602000224020001AE42000C0E000320A3
+:100FE0008E2401408E220144145000068FBF001C45
+:100FF0008FB200188FB100148FB000100A000F518B
+:1010000027BD00208E42000C0A00042700000000CB
+:10101000962200103C0480008C8301443042FFFF84
+:10102000146200090000000024020001A622001042
+:101030008C820140AC8202003C021000AC8202387B
+:101040000A00042E8FBF001C962200100A000427FD
+:10105000000000009222000024030020304200FF24
+:101060001443000B3C128000962200123C038000C7
+:101070008C6301443042FFFF14620018000000003E
+:1010800024020001A62200120A0004008FBF001CE7
+:101090008E4401400E00031500000000962200124D
+:1010A0008E4301443050FFFF16030002240200016A
+:1010B000A62200120E0003208E4401408E420144FD
+:1010C000160200068FBF001C8FB200188FB10014EB
+:1010D0008FB000100A00039327BD00209622001253
+:1010E0000A00042700000000962200143C03800040
+:1010F0008C6301443042FFFF1462000900000000CD
+:1011000024020001A62200148FBF001C8FB2001819
+:101110008FB100148FB000100A00126827BD0020A4
+:10112000962200140A0004270000000096220016F0
+:101130003C0380008C6301443042FFFF14620008CE
+:1011400024020001A62200168FBF001C8FB20018D7
+:101150008FB100148FB000100A000B0B27BD0020C8
+:1011600096220016144000068FBF001C3C020800A7
+:101170008C420070244200013C010800AC22007047
+:101180008FB200188FB100148FB0001003E0000878
+:1011900027BD002027BDFFE03C028000AFB1001456
+:1011A000AFBF001CAFB20018AFB000103451010047
+:1011B000922300098C5001002402001F106200AA33
+:1011C0002862002010400018240200382862000A1B
+:1011D0001040000C2402000B286200081040002C74
+:1011E0000000000004600100286200021440002892
+:1011F00024020006106200268FBF001C0A00054A68
+:101200008FB20018106200602862000B144000F7D3
+:101210008FBF001C2402000E106200778FB20018EE
+:101220000A00054A00000000106200D3286200395D
+:101230001040000A2402008024020036106200E3FD
+:1012400028620037104000C524020035106200D823
+:101250008FBF001C0A00054A8FB200181062002DD3
+:101260002862008110400006240200C824020039D0
+:10127000106200C98FBF001C0A00054A8FB2001817
+:10128000106200A28FBF001C0A00054A8FB200182E
+:101290003C0208008C420020104000D48FBF001C8C
+:1012A0000E000D71000000003C028000344201007D
+:1012B0008C4400008F83002C944700083C050800F4
+:1012C00094A54BFEAC6400008C44000400073C0075
+:1012D00000E53825AC6400048C4400189446000CEA
+:1012E000AC6400088C45001C000634002404000196
+:1012F000AC65000C9042000A00C23025AC660010BC
+:10130000AC600014AC600018AC67001C0A00050C4F
+:101310008FBF001C3C0208008C420020104000B32C
+:101320008FBF001C0E000D71000000009624000805
+:101330003C03080094634BFE9625000C0004220237
+:101340009626000E8F82002C0004260000832025A4
+:1013500000052C003C03008000A6282500832025E2
+:10136000AC400000AC400004AC400008AC40000CB5
+:10137000AC450010AC400014AC400018AC44001C5C
+:101380000A00050B240400019622000C14400017EB
+:101390008F91FFAC922200053042001014400013E0
+:1013A000000000000E00031502002021922200051B
+:1013B00002002021344200100E000320A22200056A
+:1013C0009222000024030020304200FF10430086D8
+:1013D000020020218FBF001C8FB200188FB10014B3
+:1013E0008FB000100A00104C27BD00200000000D37
+:1013F0000A0005498FBF001C3C0208008C420020F7
+:101400001040007A8FBF001C0E000D71000000001C
+:101410008E2200048F83002C9624000C3C050800CB
+:1014200094A54BFEAC6200003C0280089442002C64
+:10143000000424003042FFFF008220253C02400EC1
+:1014400000A22825AC640004AC600008AC60000C6D
+:10145000AC600010AC600014AC600018AC65001CFF
+:101460000A00050B240400010E00031502002021D0
+:101470008F92FFB0020020210E000320A640000C36
+:10148000020020210E000325240500013C02080073
+:101490008C420020104000558FBF001C0E000D71C3
+:1014A000000000009622000C8F83002C8F84FFAC7C
+:1014B00000021400AC700000AC620004AC600008D4
+:1014C0008C8200383C05080094A54BFEAC62000CF1
+:1014D0008C86003C3C02401F00A22825AC66001010
+:1014E0008E42000424040001AC620014AC600018B9
+:1014F000AC65001C8FBF001C8FB200188FB10014A8
+:101500008FB000100A000D9827BD00208F82FFAC1D
+:101510002403002090420000304200FF10430033BB
+:101520008FBF001C0E000F37000000001040002F7E
+:101530008FBF001C3C0380008C6201F80440FFFE5A
+:1015400024020002AC7001C0A06201C43C02100081
+:10155000AC6201F80A0005498FBF001C020020217F
+:101560008FBF001C8FB200188FB100148FB0001015
+:101570000A000E8027BD00209625000C02002021C5
+:101580008FBF001C8FB200188FB100148FB00010F5
+:101590000A000EA527BD0020020020218FB20018EE
+:1015A0008FB100148FB000100A000ED027BD0020AC
+:1015B0009225000D020020218FB200188FB1001477
+:1015C0008FB000100A000F2127BD0020020020214B
+:1015D0008FBF001C8FB200188FB100148FB00010A5
+:1015E0000A000EF827BD00208FBF001C8FB2001824
+:1015F0008FB100148FB0001003E0000827BD002059
+:101600003C0380008C6202780440FFFE240200024A
+:10161000AC640240A06202443C02100003E00008F7
+:10162000AC620278000411C003E0000824420240CA
+:10163000A380001803E00008A38000193C03800089
+:101640008C6202780440FFFE8F82001CAC62024074
+:1016500024020002A06202443C02100003E00008E1
+:10166000AC62027803E000080000000090830030C4
+:1016700024020005008040213063003F0000482123
+:1016800014620005000050219082004C9483004EAB
+:10169000304900FF306AFFFFAD00000CAD000010C4
+:1016A000AD000024950200148D05001C8D04001867
+:1016B0003042FFFF0049102300021100000237C32F
+:1016C000004038210086202300A2102B0082202316
+:1016D00000A72823AD05001CAD040018A5090014BF
+:1016E000A5090020A50A001603E00008A50A0022AB
+:1016F00003E000080000000027BDFFD8AFB20018CB
+:101700003C128008AFB40020AFB3001CAFB100148E
+:10171000AFBF0024AFB00010365101009222000C80
+:101720003C140800929400F7304300FF24020001AB
+:1017300010620031008098212402000214620034FB
+:10174000365000800E001242000000009204004C4F
+:101750000E0005573084007F026210212403FF80B1
+:10176000004318243C048000AC8300949245000898
+:101770009204004C3042007F3C0380061485000731
+:10178000004380212402FFFFA22200112402FFFF58
+:10179000A62200120A0005BA2402FFFF96020020CA
+:1017A000A222001196020022A62200128E0200241C
+:1017B0003C048008AE2200143485008090A2004CC6
+:1017C00034830100A06200108CA2003CAC620018BF
+:1017D0008C820068AC6200E48C820064AC6200E041
+:1017E0008C82006CAC6200E824020001A0A20068B8
+:1017F0000A0005D63C0480080E00125B00000000C1
+:1018000036420080A04000680A0005D63C048008EB
+:10181000A2000068A20000690A0006123C028008CB
+:10182000348300808C62003834850100AC62006C27
+:1018300024020001A062006990A200C59083000804
+:10184000305100FF3072007F1232001B3C088008CC
+:101850000E00055702202021026210212403FF8080
+:10186000004318243C048000AC8300943042007F85
+:101870003C038006004380218E02000C1040000DC6
+:10188000020020210E000569000000002622000150
+:10189000305100FF9203003C023410260002102B4E
+:1018A000000210233063007F022288240A0005E032
+:1018B000A203003C3C088008350401008C8200D063
+:1018C00035070080ACE2003C8C8200D0AD02000005
+:1018D00090E5004C908600C590E3004C908400C5D4
+:1018E0002402FF8000A228243063007F308400FFA0
+:1018F00000A628250064182A1060000230A500FF09
+:1019000038A50080A0E5004CA10500093C02800834
+:101910009043000E344400803C058000A043000A40
+:101920008C8300183C027FFF3442FFFF00621824C2
+:10193000AC8300188CA201F80440FFFE00000000F8
+:10194000ACB301C08FBF00248FB400208FB3001C44
+:101950008FB200188FB100148FB000102402000263
+:10196000A0A201C427BD00283C02100003E000082B
+:10197000ACA201F890A2000027BDFFE0AFB20018B2
+:1019800024420001A0A200003C0308008C6300F484
+:10199000304200FFAFB10014AFBF001CAFB0001069
+:1019A00000A088211443000200809021A0A0000024
+:1019B0000E000557922400008F90001C2403FF8026
+:1019C00002021021004310243C038000AC6200247A
+:1019D0000E00055792240000020280213210007F81
+:1019E0003C02800A02028021AE5000008FBF001C22
+:1019F0008FB200188FB100148FB0001003E0000800
+:101A000027BD002094820006908300058C85000C81
+:101A10008C8600108C8700188C88001C8C84002019
+:101A20003C010800A4224BD23C010800A0234BD16A
+:101A30003C010800AC254BD83C010800AC264BDC2F
+:101A40003C010800AC274BE43C010800AC284BE803
+:101A50003C010800AC244BEC03E00008000000004F
+:101A60003C028008344201008C4400343C03800076
+:101A700034650400AC6400388C420038AF85003017
+:101A8000AC62003C3C020005AC620030000000008B
+:101A90000000000003E00008000000003C02000617
+:101AA000308400FF008220253C028000AC440030DE
+:101AB0000000000000000000000000003C03800067
+:101AC0008C620000304200101040FFFD34620400C0
+:101AD00003E00008AF82003094C200003C08080018
+:101AE000950800CA30E7FFFF00804821010210215D
+:101AF000A4C2000094C200003042FFFF00E2102B9D
+:101B000054400001A4C7000094A200003C03080058
+:101B10008C6300CC24420001A4A2000094A2000027
+:101B20003042FFFF144300073C0280080107102BDE
+:101B3000A4A000005440000101003821A4C7000007
+:101B40003C028008344601008CC3002894A20000A7
+:101B50003C0480003042FFFE000210C000621021F1
+:101B6000AC82003C8C82003C0062182318600004A8
+:101B7000000000008CC200240A0006AF24420001CD
+:101B80008CC20024AC8200383C0200503442001069
+:101B90003C038000AC620030000000000000000048
+:101BA000000000008C620000304200201040FFFD69
+:101BB0000000000094A200003C04800030420001BC
+:101BC000000210C0004410218C430400AD2300002B
+:101BD0008C420404AD2200043C02002003E0000813
+:101BE000AC82003027BDFFE0AFB20018AFB10014E7
+:101BF000AFB00010AFBF001C94C2000000C0802135
+:101C00003C120800965200C624420001A6020000C1
+:101C10009603000094E2000000E030211443000528
+:101C20008FB100300E000684024038210A0006E61B
+:101C3000000000008C8300048C82000424420040D9
+:101C400004610007AC8200048C820004044000049C
+:101C5000000000008C82000024420001AC820000E1
+:101C6000960200003042FFFF50520001A600000023
+:101C70009622000024420001A62200003C028008B7
+:101C800034420100962300009442003C14430004B7
+:101C90008FBF001C24020001A62200008FBF001C81
+:101CA0008FB200188FB100148FB0001003E000084D
+:101CB00027BD002027BDFFE03C028008AFBF001811
+:101CC000344201008C4800343C0380003469040035
+:101CD000AC6800388C42003830E700FFAF89003034
+:101CE000AC62003C3C020005AC6200300000000029
+:101CF00000000000000000000000000000000000E4
+:101D0000000000008C82000C8C82000C978300166F
+:101D1000AD2200008C82001000604021AD22000442
+:101D20008C820018AD2200088C82001CAD22000CB1
+:101D30008CA20014AD2200108C820020AD22001471
+:101D400090820005304200FF00021200AD22001810
+:101D50008CA20018AD22001C8CA2000CAD22002029
+:101D60008CA20010AD2200248CA2001CAD22002801
+:101D70008CA20020AD22002C3402FFFFAD260030E3
+:101D8000AD200034506200013408FFFFAD28003858
+:101D900050E000113C0280083C04800834840100BB
+:101DA000948200503042FFFFAD22003C94830044F7
+:101DB00094850044240200013063FFFF000318C231
+:101DC000006418219064005430A5000700A210049C
+:101DD0000A0007510044102534420100AD20003CA8
+:101DE00094430044944400443063FFFF000318C24E
+:101DF000006218213084000790650054240200011D
+:101E0000008210040002102700451024A062005434
+:101E10000000000000000000000000003C0200067E
+:101E2000344200403C038000AC62003000000000FF
+:101E300000000000000000008C6200003042001032
+:101E40001040FFFD3C06800834C20150346304009A
+:101E500034C7014A34C4013434C5014034C6014496
+:101E6000AFA200100E0006C7AF8300308FBF00186E
+:101E700003E0000827BD00208F8300143C05080004
+:101E80008CA500E88F82001C30633FFF000319809F
+:101E900000451021004310212403FF800043182433
+:101EA0003C058000ACA300283042007F3C03800C3E
+:101EB0000043302190C2000D000038213442001050
+:101EC000A0C2000D8F8900143C028008344201003A
+:101ED00094430044000913823048000324020001A7
+:101EE000A4C3000E1102000B2902000210400005DD
+:101EF000240200021100000C240300010A000798CC
+:101F00000000182111020006000000000A000798D6
+:101F1000000018218CC2002C0A00079824430001FD
+:101F20008CC20014244300018CC200180043102B03
+:101F3000144000033C0380080A0007A224070001A4
+:101F4000346301009462004C24420001A462004CFE
+:101F500000091382304300032C6200021040000984
+:101F600000802821146000040000000094C20034A6
+:101F70000A0007B23046FFFF8CC600380A0007B2DD
+:101F800000802821000030213C04080024844BCC30
+:101F90000A0006FB0000000027BDFF90AFB60068F6
+:101FA000AFB50064AFB40060AFB3005CAFB200582F
+:101FB000AFB10054AFBF006CAFB000508C900000C8
+:101FC0000080B0213C0208008C4200E896040032F8
+:101FD0008F83001C2414FF8030843FFF006218218F
+:101FE0000004218000641821007410243C13800038
+:101FF00000A0902190A50000AE620028920400325B
+:102000003C02800C3063007F00628821308400C075
+:10201000240200401482002D0000A8218E350038D3
+:102020008E2200181440000224020001AE22001883
+:102030009202003C304200201440000F00000000DB
+:102040000E00055700A020218F83001C006218217C
+:10205000306400783C02008000822025007418243F
+:10206000AE630800AE6408108E2200188E030008CC
+:1020700000431021AE2200188E22002C8E2300185F
+:10208000244200010062182B1060003D0000000097
+:102090009242000024420001A24200003C030800DA
+:1020A0008C6300F4304200FF50430001A240000066
+:1020B0000E000557924400008F90001C0202102170
+:1020C000005410240A0008B8AE62002492030032C3
+:1020D0002402FFC000431024304200FF14400005DA
+:1020E00024020001AE220018962200340A00082EB5
+:1020F0003055FFFF8E22001424420001AE2200184A
+:102100009202003000021600000216030441001C77
+:10211000000000009602003227A400100080282151
+:10212000A7A2001696020032000030212407000109
+:102130003042FFFFAF8200140E0006FBAFA0001C70
+:10214000960200328F83001C3C0408008C8400E857
+:1021500030423FFF00021180006418210062182104
+:1021600000741024AE62002C3063007F3C02800EAD
+:10217000006218219062000D3042007FA062000DC5
+:102180009222000D30420010504000789242000030
+:102190003C028008344401009482004C8EC300004D
+:1021A0003C130800967300C62442FFFFA482004C33
+:1021B000946200329623000E3054FFFF3070FFFF10
+:1021C0003C0308008C6300D000701807A7A30038F8
+:1021D0009482003E3063FFFF3042FFFF146200072D
+:1021E000000000008C8200303C038000244200305C
+:1021F000AC62003C0A0008568C82002C948200409D
+:102200003042FFFF5462000927A400408C8200384E
+:102210003C03800024420030AC62003C8C820034DD
+:10222000AC6200380A0008653C03800027A500382E
+:1022300027A60048026038210E000684A7A00048A7
+:102240008FA300403C02800024630030AC43003880
+:102250008FA30044AC43003C3C0380003C020005DB
+:10226000AC6200303C028008344401009482004299
+:10227000346304003042FFFF0202102B14400007B9
+:10228000AF8300309482004E9483004202021021FA
+:10229000004310230A00087B3043FFFF9483004E65
+:1022A0009482004202631821005010230062182318
+:1022B0003063FFFF3C028008344401009482003CFC
+:1022C0003042FFFF14430003000000000A00088BA7
+:1022D000240300019482003C3042FFFF0062102B77
+:1022E000144000058F8200309482003C006210236D
+:1022F0003043FFFF8F820030AC550000AC4000043B
+:10230000AC540008AC43000C3C0200063442001000
+:102310003C038000AC6200300000000000000000C0
+:10232000000000008C620000304200101040FFFDF1
+:102330003C04800834840100001018C20064182195
+:102340009065005432020007240600010046100484
+:1023500000451025A0620054948300429622000E8E
+:1023600050430001A386001892420000244200015D
+:10237000A24200003C0308008C6300F4304200FFDE
+:1023800050430001A24000000E0005579244000097
+:102390008F90001C2403FF800202102100431024B0
+:1023A0003C038000AC6200240E00055792440000FC
+:1023B000020280213210007F3C02800A020280214A
+:1023C000AED000008FBF006C8FB600688FB5006480
+:1023D0008FB400608FB3005C8FB200588FB100548F
+:1023E0008FB0005003E0000827BD007027BDFFD864
+:1023F000AFB3001CAFB20018AFB10014AFB0001003
+:10240000AFBF00200080982100E0802130B1FFFFA5
+:102410000E000D7130D200FF00000000000000002F
+:10242000000000008F82002CAC510000AC52000470
+:10243000AC530008AC40000CAC400010AC400014A1
+:10244000AC4000183C03080094634BFE0203802557
+:10245000AC50001C00000000000000000000000064
+:10246000240400018FBF00208FB3001C8FB200181E
+:102470008FB100148FB000100A000D9827BD0028FE
+:1024800030A5FFFF30C600FF24030C803C02800013
+:10249000AC43002400000000000000000000000029
+:1024A00000000000000000000A0008C90000000051
+:1024B0003C028008344301009462000E3C0808008E
+:1024C000950800C63046FFFF14C000043402FFFF29
+:1024D000946500DA0A00091F8F84001C10C20027CF
+:1024E000000000009462004E9464003C3045FFFF01
+:1024F00000A6102300A6182B3087FFFF10600004F1
+:102500003044FFFF00C5102300E210233044FFFFDA
+:102510000088102B1040000E00E810233C028008B9
+:10252000344401002403000134420080A443001617
+:102530002402FFFFA482000E948500DA8F84001C21
+:102540000000302130A5FFFF0A0008EE3C076020A4
+:102550000044102A104000093C02800834430080E7
+:102560009462001630420001104000043C028000DA
+:102570009442007E24420014A462001603E0000886
+:102580000000000027BDFFE03C028008AFBF001C38
+:10259000AFB0001834420100944300429442004C12
+:1025A000104000193068FFFF9383001824020001D7
+:1025B000146200298FBF001C3C06800834D0010043
+:1025C000000810C20050102190420054310300074F
+:1025D00034C70148304200FF00621007304200015A
+:1025E00034C9014E34C4012C34C5013E10400016DC
+:1025F00034C601420E0006C7AFA900109602004281
+:102600000A00093C3048FFFF3C02800834440100C6
+:1026100094830044948200421043000F8FBF001C3B
+:1026200094820044A482004294820050A482004E0E
+:102630008C820038AC82003094820040A482003E3C
+:102640009482004AA48200488FBF001C8FB00018FB
+:102650000A0008FA27BD00208FB0001803E0000828
+:1026600027BD002027BDFFA0AFB1004C3C1180006A
+:10267000AFBF0058AFB30054AFB20050AFB0004886
+:102680003626018890C200033044007FA3A40010C6
+:102690008E32018090C200003043007F240200038C
+:1026A0001062003BAF92001C28620004104000063C
+:1026B0002402000424020002106200098FBF0058A7
+:1026C0000A000B038FB300541062004B2402000574
+:1026D0001062014C8FBF00580A000B038FB30054E7
+:1026E000000411C0024210212404FF802442024051
+:1026F0000044102426430040AE2200243063007FB3
+:102700003C02800A006218219062003CAFA3003CAA
+:1027100000441025A062003C8FA3003C9062003C66
+:10272000304200401040016A8FBF00583C108008C2
+:10273000A3800018361001008E0200D08C63003494
+:1027400027A4003C27A50010004310210E0007B469
+:10275000AE0200D093A200103C038000A20200C58C
+:102760008C6202780440FFFE8F82001CAC62024043
+:1027700024020002A06202443C021000AC62027813
+:102780000E00092F000000000A000B028FBF005846
+:102790003C05800890C3000190A2000B1443014C3B
+:1027A0008FBF005834A400808C8200189082004CA7
+:1027B00090A200088C8300183C027FFF3442FFFF88
+:1027C000006218243C0208008C4200B4AC8300185C
+:1027D0003C038000244200013C010800AC2200B40C
+:1027E0008C6201F80440FFFE8F82001CAC6201C0C5
+:1027F0000A000ACA240200023C10800890C30001AB
+:102800009202000B144301328FBF005836050110AD
+:1028100027A400180E000E202406000327A4002879
+:10282000360501E00E000E20240600038FA20028CA
+:1028300036030100AE0200648FA2002CAE020068D5
+:102840008FA20030AE02006C93A40018906300C504
+:102850002402FF800082102400431025305000FF26
+:102860003084007F3202007F0082102A5440000131
+:102870003A1000800E0005570000000002421021AF
+:102880002403FF8000431024AE22009493A4001878
+:102890003C130800927300F70E0005573084007F48
+:1028A000024210213042007F3C0380060043402159
+:1028B0008FA3001C2402FFFF10620034AFA8004069
+:1028C00093A2001995030014304400FF3063FFFF0A
+:1028D0000064182B10600010000000009504001424
+:1028E0008D07001C8D0600183084FFFF0044202354
+:1028F0000004210000E438210000102100E4202B16
+:1029000000C2302100C43021AD07001CAD06001804
+:102910000A000A2393A20019950400148D07001CD5
+:102920008D0600183084FFFF008220230004210060
+:10293000000010210080182100C2302300E4202B69
+:1029400000C4302300E33823AD07001CAD06001897
+:1029500093A200198FA30040A462001497A2001A4A
+:10296000A46200168FA2001CAC6200108FA2001C93
+:10297000AC62000C93A20019A462002097A2001A76
+:10298000A46200228FA2001CAC6200243C048008D8
+:10299000348300808C6200388FA2002002008821DE
+:1029A000AC62003C8FA20020AC82000093A2001811
+:1029B000A062004C93A20018A0820009A0600068E9
+:1029C00093A200181051005293A400183230007FD7
+:1029D0000E00055702002021024210212407FF802B
+:1029E0003046007F3C03800000471024AC62009416
+:1029F0003C02800600C2302190C2003CAFA60040DD
+:102A00000000202100471025A0C2003C8FA80040F4
+:102A100095020002950300148D07001C3042FFFF51
+:102A20003063FFFF8D0600180043102300021100E1
+:102A300000E2382100E2102B00C4302100C2302116
+:102A4000AD07001CAD06001895020002A502001497
+:102A5000A50000168D020008AD0200108D020008CE
+:102A6000AD02000C95020002A5020020A500002284
+:102A70008D020008AD0200249102003C304200406B
+:102A80001040001A26220001A3B000383C10800834
+:102A9000A3800018361001008E0200D08D03003490
+:102AA00027A4004027A50038004310210E0007B4DA
+:102AB000AE0200D093A200383C038000A20200C501
+:102AC0008C6202780440FFFE8F82001CAC620240E0
+:102AD00024020002A06202443C021000AC620278B0
+:102AE0000E00092F00000000262200013043007F65
+:102AF00014730004004020212403FF8002231024CB
+:102B00000043202693A200180A000A3F309100FFDC
+:102B10008FA3001C2402FFFF1062000A309000FF08
+:102B200024820001248300013042007F14530005F9
+:102B3000307000FF2403FF80008310240043102620
+:102B4000305000FF3C0280089042000802008821BB
+:102B5000305000FF123000193222007F000211C0F5
+:102B600002421021244202402403FF800043182423
+:102B70003C048000AC8300943042007F3C0380061C
+:102B8000004310218C43000C004020211060000BFA
+:102B9000AFA200400E0005690000000026230001DE
+:102BA0002405FF803062007F145300020225202498
+:102BB000008518260A000AA3307100FF3C04800833
+:102BC000348400808C8300183C027FFF3442FFFF76
+:102BD00000621824AC8300183C0380008C6201F86A
+:102BE0000440FFFE00000000AC7201C0240200029D
+:102BF000A06201C43C021000AC6201F80A000B02A2
+:102C00008FBF00583C04800890C300019082000BE5
+:102C10001443002F8FBF00583490008092020008A8
+:102C200030420040104000200000000092020008E6
+:102C30000002160000021603044100050240202194
+:102C40000E000EA5240500930A000B028FBF00584A
+:102C50009202000924030018304200FF1443000DC3
+:102C600002402021240500390E000E3D00003021D5
+:102C70000E0003158F84001C8F82FFAC240300120A
+:102C8000A04300090E0003208F84001C0A000B02E1
+:102C90008FBF0058240500360E000E3D0000302185
+:102CA0000A000B028FBF00580E00031502402021BE
+:102CB000920200058F84001C344200200E00032085
+:102CC000A20200050E00104C8F84001C8FBF00581C
+:102CD0008FB300548FB200508FB1004C8FB00048BA
+:102CE00024030C803C02800027BD006003E0000844
+:102CF000AC43002427BDFFE83C028008AFB00010C1
+:102D0000AFBF0014344501003C1080008E0201402A
+:102D100094A3000E0000302100402021AF82001C4F
+:102D20003063FFFF3402FFFF106200063C076020A3
+:102D30002402FFFFA4A2000E94A500DA0E0008EE04
+:102D400030A5FFFF24020C80AE0200248FBF0014C8
+:102D50008FB0001003E0000827BD001827BDFFC09A
+:102D60003C0980003C058008AFB70034AFB20020BA
+:102D7000AFBF0038AFB60030AFB5002CAFB40028FD
+:102D8000AFB30024AFB1001CAFB000183532010062
+:102D900034A801008D2701008E4200148D0300D459
+:102DA0000000B821A38000180043102318400055EC
+:102DB000AF87001C8E4200142403FF8024E40040EF
+:102DC000AD0200D490A60008910500C53084007FB4
+:102DD00030D3007F30A200FF000211C000E21021BA
+:102DE00024420240A3A50010004310248D1400D0FB
+:102DF0008D1500D4AD22002493A300103C02800A5C
+:102E000000822021AFA40014107300330000B02111
+:102E10008FA3001427A4001427A500108C6200348F
+:102E20000282802102B010230440002B2411FF8075
+:102E30009062003C02221024304200FF1440001B2C
+:102E40000200A0219062003C34420040A062003C9D
+:102E500093A2001024420001304300FFA3A20010FF
+:102E60003C0208008C4200F450620001A3A0001054
+:102E70000E00055793A400108F90001C3C038000A7
+:102E80000202102100511024AC6200240E000557EC
+:102E900093A40010020280213210007F3C02800ABD
+:102EA000020280210A000B81AFB000140E0007B4AB
+:102EB000000000003C02800834420100AC5000D009
+:102EC00093A3001024160001A04300C593A2001094
+:102ED0001453FFD08FA300142402000116C200096E
+:102EE0003C0380008C6202780440FFFE8F82001C4D
+:102EF000AC62024024020002A06202443C021000C4
+:102F0000AC6202789242000B24030002304200FFC0
+:102F1000144300720000000096420008304300FF96
+:102F20002402008214620040240200843C028000DB
+:102F3000344901008D22000C952300060002160280
+:102F40003063FFFF3044003F240200271082000F4F
+:102F5000AF830014288200281040000824020031AA
+:102F6000240200211082000924020025108200079B
+:102F7000938200190A000BC00000000010820007B5
+:102F8000938200190A000BC0000000000E00076CBD
+:102F9000012020210A000C40000000003C038000BA
+:102FA0008C6202780440FFFE8F82001CAC620240FB
+:102FB00024020002A06202443C021000AC620278CB
+:102FC0000A000C4000000000952300069124000533
+:102FD0008D25000C8D2600108D2700188D28001CD3
+:102FE0008D290020244200013C010800A4234BD27B
+:102FF0003C010800A0244BD13C010800AC254BD873
+:103000003C010800AC264BDC3C010800AC274BE43B
+:103010003C010800AC284BE83C010800AC294BEC13
+:103020000A000C40A38200191462000A24020081E5
+:103030003C02800834420100944500DA92460005C3
+:103040008F84001C30A5FFFF30C600FF0A000C0172
+:103050003C0760211462005C000000009242000AFC
+:10306000304300FF30620020104000073062004013
+:103070003C02800834420100944500DA8F84001C31
+:103080000A000BFF24060040104000070003160052
+:103090003C02800834420100944500DA8F84001C11
+:1030A0000A000BFF240600410002160304410046FB
+:1030B0003C02800834420100944500DA8F84001CF1
+:1030C0002406004230A5FFFF3C0760190E0008EE01
+:1030D000000000000A000C40000000009242000BBB
+:1030E00024040016304200FF104400063C06800015
+:1030F0009242000B24030017304200FF14430032B9
+:103100000000000034C5010090A2000B304200FF17
+:103110001444000B000080218CA200208CA400200D
+:103120002403FF8000431024000211403084007FFC
+:10313000004410253C03200000431025ACC2083099
+:1031400094A20008000214000002140304420001CB
+:103150002410000194A20008304200805040001A60
+:103160000200B82194A2000830422000504000160E
+:103170000200B8218CA300183C021C2D344219ED2A
+:10318000106200110200B8213C0208008C4200D4F9
+:10319000104000053C028008240300043442010072
+:1031A000A04300EC3C02800834420100944500DA60
+:1031B0008F84001C2406000630A5FFFF0E0008EED9
+:1031C0003C0760210200B8210E00092F000000001A
+:1031D0009242000A30420008104000043C02800085
+:1031E0000E00121F000000003C02800024030C802F
+:1031F000AC4300248FBF003802E010218FB60030AE
+:103200008FB700348FB5002C8FB400288FB3002403
+:103210008FB200208FB1001C8FB0001803E00008AF
+:1032200027BD00402402FF80008220243C02900041
+:1032300034420007008220253C028000AC4400207C
+:103240003C0380008C6200200440FFFE0000000070
+:1032500003E00008000000003C0380002402FF801F
+:10326000008220243462000700822025AC64002004
+:103270008C6200200440FFFE0000000003E0000814
+:10328000000000003C0280082403000534420100D5
+:10329000A04300EC3C0280008C4201003C03800013
+:1032A000AF82001C8C6202780440FFFE8F82001CFB
+:1032B000AC62024024020002A06202443C02100000
+:1032C000AC62027803E000080000000027BDFFE8C0
+:1032D0003C068000AFBF001034C5010094A2000876
+:1032E000304400FF38830082388200842C63000160
+:1032F0002C42000100621825106000302402008377
+:1033000093820019504000398FBF00103C02080022
+:1033100090424BD88CC401003C07080094E74BD284
+:103320003046003F38C3003238C2003F2C630001F2
+:103330002C42000100621825AF84001CAF870014E6
+:10334000A38000191460000600A0202124020020A0
+:1033500014C200113402FFFF14E2000F000000004D
+:103360002402002014C20005000000008CA30014F9
+:103370002402FFFF1062000A000000003C04080065
+:1033800024844BCC000030210E0006FB24070001F2
+:103390000A000CB6000000000E00076C00000000E0
+:1033A0000E00092F0000000024030C803C02800066
+:1033B000AC4300240A000CEF8FBF001014820006FB
+:1033C0002482FF808CC301043C026020AC430014C3
+:1033D0000A000CEF8FBF0010304200FF2C420002A9
+:1033E00010400004240200228FBF00100A000B25A9
+:1033F00027BD0018148200038FBF00100A000C6F55
+:1034000027BD00183C0208008C4200201040001D1F
+:103410002402001890A3000914620003240200167D
+:103420000A000CDB240300081462000724020017C2
+:10343000240300123C02800834420080A0430009AB
+:103440000A000CE894A700085462000794A700083B
+:103450008F82FFAC2404FFFE904300050064182413
+:10346000A043000594A7000890A6001B8CA40000B0
+:1034700094A500068FBF001000073C000A0008C991
+:1034800027BD001803E0000827BD00183C05080010
+:1034900094A54C0A3C0308008C634C143C04800047
+:1034A00030A2FFFF000230C02402FFF000C210244F
+:1034B00000621821AC83003C3C0208008C424C1096
+:1034C0003C038000AC8200383C02005034420010C3
+:1034D000AC620030000000000000000000000000AE
+:1034E0008C620000304200201040FFFD30C2000816
+:1034F000104000093C0280008C6204088C63040CBC
+:103500003C010800AC224C003C010800AC234C04F8
+:103510000A000D1B3C0300208C4304008C42040471
+:103520003C010800AC234C003C010800AC224C04D8
+:103530003C0300203C028000AC4300303C0780008C
+:103540008CE20030004310241440FFFD0000000016
+:103550003C03080094634C083C02080094424C0C65
+:103560003C06080094C64C0E24A5000100621821F8
+:1035700030A4FFFF3C020040ACE200303C010800F8
+:10358000A4234C083C010800A4254C0A148600031F
+:10359000000000003C010800A4204C0A03E00008E1
+:1035A0000000000027BDFFE83C04080024844BF025
+:1035B0003C05800AAFBF00100E000E202406000A52
+:1035C0003C02080094424BF23C03080094634C0E0A
+:1035D0003042000F244200030043180424027FFFFE
+:1035E0000043102B10400002AF8300280000000DA4
+:1035F0000E000CF1000000003C02080094424BF465
+:103600003C03080094634BFA8FBF00103042000F58
+:10361000000215000062182527BD00183C0280003A
+:1036200003E00008AC4300A03C02800A944300067B
+:103630003C02080094424BFA3C010800A4234BF6DC
+:10364000004310238F8300283042FFFF0043102BDC
+:1036500003E000083842000127BDFFE8AFBF0010BB
+:103660003C02800A944200063C010800A4224BF66A
+:103670000E000D58000000005440FFFA3C02800A82
+:103680008FBF001003E0000827BD001827BDFFE82A
+:10369000AFBF00100E000D580000000010400003E6
+:1036A000000000000E000D64000000003C02080055
+:1036B0008C424C003C0380008FBF0010AC6200388D
+:1036C0003C0208008C424C043464040027BD0018FE
+:1036D000AC62003C3C020005AC620030AF84002CC0
+:1036E00003E00008AF8000248F8200243C03000622
+:1036F00000021140004310253C038000AC62003002
+:103700000000000000000000000000008C620000CB
+:10371000304200101040FFFD34620400AF82002CE4
+:1037200003E00008AF8000243C0608008CC64C046F
+:103730008F8500248F83002C3C02080094424BFAB2
+:1037400027BDFFE024A500012463002024420001DE
+:1037500024C70020AFB10014AFB00010AFBF0018F5
+:10376000AF850024AF83002C3C010800A4224BFA53
+:10377000309000FF3C010800AC274C0404C1000855
+:103780000000882104E00006000000003C02080060
+:103790008C424C00244200013C010800AC224C0049
+:1037A0003C04080094844C083C02080094424BFA04
+:1037B0002E030001004410262C440001008318242D
+:1037C000106000040010102B24020001AF820020C2
+:1037D0000010102B00821025144000068F8200205C
+:1037E000144000048F830024240200101462000F90
+:1037F000000000000E000D88241100013C030800A9
+:1038000094634BFA3C02080094424C081462000393
+:10381000000000000E000CF1000000001600000384
+:10382000000000000E000D71000000003C030800C5
+:1038300094634BFE3C02080094424BFC246300015D
+:103840003064FFFF3C010800A4234BFE14820003F8
+:10385000000000003C010800A4204BFE1200000BF9
+:10386000000000003C02080094424BF43C030800B6
+:1038700094634BFA00021500006218253C02800098
+:10388000AC4300A00A000DF7AF8000200E000D58D9
+:103890000000000010400004022010210E000D6402
+:1038A00000000000022010218FBF00188FB100140B
+:1038B0008FB0001003E0000827BD002003E00008DF
+:1038C000000000008F8200343C030006000211401B
+:1038D000004310253C038000AC6200300000000073
+:1038E00000000000000000008C6200003042001068
+:1038F0001040FFFD34620400AF82003003E0000896
+:10390000AF80003403E000080000102103E000084D
+:10391000000000003084FFFF30A5FFFF00001821E9
+:1039200010800007000000003082000110400002FB
+:1039300000042042006518210A000E1600052840E8
+:1039400003E000080060102110C0000624C6FFFF3D
+:103950008CA2000024A50004AC8200000A000E2006
+:103960002484000403E000080000000010A0000808
+:1039700024A3FFFFAC860000000000000000000050
+:103980002402FFFF2463FFFF1462FFFA2484000473
+:1039900003E00008000000003C0280083442008080
+:1039A00024030001AC43000CA4430010A443001204
+:1039B000A443001403E00008A443001627BDFFD869
+:1039C000248200802407FF803043007FAFB00010C6
+:1039D00000808021004720243C0208008C42002007
+:1039E0003C08800EAFB3001CAFB20018AFB100149A
+:1039F000AFBF00203C0980000068182130B100FFF3
+:103A000030D200FF1040002900009821260201005A
+:103A1000AD24002C004728243042007F004820219C
+:103A20009062000024030050304200FF1443000461
+:103A300000000000AD25002C948200DA3053FFFF17
+:103A40000E000D71000000003C03080094634BFE63
+:103A50008F82002C00112C0000A3282500122400C6
+:103A60003C0340003484000100A32825AC50000032
+:103A70008FBF0020AC4000048FB20018AC53000888
+:103A80008FB10014AC40000C8FB3001CAC4400108C
+:103A90008FB00010AC40001424040001AC400018AA
+:103AA00027BD00280A000D98AC45001C8FBF0020E0
+:103AB0008FB3001C8FB200188FB100148FB00010AC
+:103AC00003E0000827BD00283C06800034C2010046
+:103AD0009043000F240200101062000E28650011B0
+:103AE00010A0000724020012240200082405003A56
+:103AF000106200060000302103E000080000000012
+:103B0000240500351462FFFC000030210A000E3D40
+:103B1000000000008CC200748F83FFAC24420FA011
+:103B200003E00008AC62000C27BDFFE8AFBF001047
+:103B30000E000325240500013C0480088FBF0010FF
+:103B40002402000134830080A462001227BD001803
+:103B50002402000103E00008A080001A27BDFFE056
+:103B6000AFB20018AFB10014AFB00010AFBF001C6F
+:103B700030B2FFFF0E000315008088213C02800850
+:103B8000345000809202000924030004304200FFF8
+:103B90001443000C3C028008124000082402000A72
+:103BA0000E000E3400000000920200052403FFFE08
+:103BB00000431024A202000524020012A202000900
+:103BC0003C02800834420080022020210E000320A5
+:103BD000A040002716400003022020210E000E986E
+:103BE0000000000002202021324600FF8FBF001C91
+:103BF0008FB200188FB100148FB000102405003868
+:103C00000A000E3D27BD002027BDFFE0AFBF001C0E
+:103C1000AFB20018AFB10014AFB000100E00031522
+:103C2000008080210E000E34000000003C0280085D
+:103C30003445008090A2000924120018305100FF82
+:103C4000123200030200202124020012A0A2000967
+:103C500090A200052403FFFE004310240E00032061
+:103C6000A0A2000502002021240500201632000732
+:103C7000000030218FBF001C8FB200188FB10014DC
+:103C80008FB000100A00032527BD00208FBF001C45
+:103C90008FB200188FB100148FB0001024050039C6
+:103CA0000A000E3D27BD002027BDFFE83C02800032
+:103CB000AFB00010AFBF0014344201009442000CBA
+:103CC000240500360080802114400012304600FF99
+:103CD0000E000315000000003C0280083442008002
+:103CE00024030012A0430009904300053463001030
+:103CF0000E000E34A04300050E0003200200202118
+:103D0000020020210E000325240500200A000F15C3
+:103D1000000000000E000E3D000000000E00031524
+:103D2000020020213C0280089043001B2405FF9FD5
+:103D300002002021006518248FBF00148FB00010EE
+:103D4000A043001B0A00032027BD001827BDFFE089
+:103D5000AFBF0018AFB10014AFB0001030B100FF1A
+:103D60000E000315008080213C028008240300120D
+:103D7000344200800E000E34A04300090E000320E0
+:103D80000200202102002021022030218FBF0018D4
+:103D90008FB100148FB00010240500350A000E3DCD
+:103DA00027BD00203C0480089083000E9082000A0A
+:103DB0001443000B000028218F82FFAC2403005025
+:103DC0002405000190420000304200FF144300042B
+:103DD000000000009082000E24420001A082000E2C
+:103DE00003E0000800A010213C0380008C6201F871
+:103DF0000440FFFE24020002AC6401C0A06201C4C2
+:103E00003C02100003E00008AC6201F827BDFFE0AF
+:103E1000AFB200183C128008AFB10014AFBF001C55
+:103E2000AFB0001036510080922200092403000A2E
+:103E3000304200FF1443003A000000008E430004AB
+:103E40008E2200385062007E8FBF001C922200003C
+:103E500024030050304200FF144300253C02800040
+:103E60008C4201408E43000436420100022028218A
+:103E7000AC43001C9622005C8E2300383042FFFFCA
+:103E80000002104000621821AE23001C8E43000483
+:103E90008E2400389622005C006418233042FFFF15
+:103EA00000031843000210400043102A104000068F
+:103EB000000000008E4200048E23003800431023CF
+:103EC0000A000F83000220439622005C3042FFFF6D
+:103ED000000220403C02800834430100344200804C
+:103EE000ACA4002CA040002424020001A062000C1D
+:103EF0000E000F3700000000104000518FBF001C63
+:103F00003C0280008C4401408FBF001C8FB200181F
+:103F10008FB100148FB000100A000F4827BD002099
+:103F20009222000924030010304200FF14430004D1
+:103F30003C0280008C4401400A000FC5000028218B
+:103F40009222000924030016304200FF14430006A9
+:103F500024020014A22200093C0280008C4401408B
+:103F60000A000FD88FBF001C8E2200388E23003C21
+:103F700000431023044100328FBF001C922200270F
+:103F800024420001A2220027922200273C030800BD
+:103F90008C630048304200FF144300163C10800040
+:103FA0009222000924030004304200FF1443000958
+:103FB0003C0280008C4401408FBF001C8FB200186F
+:103FC0008FB100148FB00010240500930A000EA5D5
+:103FD00027BD00208C440140240500938FBF001CA6
+:103FE0008FB200188FB100148FB000100A000F219B
+:103FF00027BD00208E0401400E00031500000000C4
+:104000008E4200042442FFFFAE4200048E22003C98
+:104010002442FFFFAE22003C0E0003208E0401402C
+:104020008E0401408FBF001C8FB200188FB10014A6
+:104030008FB00010240500040A00032527BD0020CE
+:104040008FB200188FB100148FB0001003E0000889
+:1040500027BD00203C0680008CC201883C038008FC
+:10406000346500809063000E00021402304400FFAB
+:10407000306300FF1464000E3C02800890A200260A
+:10408000304200FF104400098F82FFACA0A400263C
+:104090002403005090420000304200FF1443000609
+:1040A000000000000A00058C8CC401803C028008DE
+:1040B00034420080A044002603E000080000000015
+:1040C00027BDFFE030E700FFAFB20018AFBF001C14
+:1040D000AFB10014AFB000100080902114E00006D2
+:1040E00030C600FF000000000000000D00000000CE
+:1040F0000A001037240001173C0380089062000E6C
+:10410000304200FF144600233462008090420026B3
+:10411000304200FF1446001F000000009062000FB4
+:10412000304200FF1446001B000000009062000AAD
+:10413000304200FF144600038F90FFAC0000000DDA
+:104140008F90FFAC8F82FFB03C118000AE05003C29
+:10415000AC450000A066000A0E0003158E24010085
+:10416000A20000240E0003208E2401003C038000E6
+:104170008C6201F80440FFFE24020002AC7201C010
+:10418000A06201C43C021000AC6201F80A001038C1
+:104190008FBF001C000000000000000D00000000A8
+:1041A000240001408FBF001C8FB200188FB1001493
+:1041B0008FB0001003E0000827BD00208F83FFAC04
+:1041C0003C0280008C440100344201008C65003CBC
+:1041D0009046001B0A000FFE240700013C028008E5
+:1041E0009043000E9042000A00431026304200FF28
+:1041F00003E000080002102B27BDFFE03C0280080E
+:10420000AFB10014AFB00010AFBF00183450008041
+:104210009202000524030030304200301443008431
+:10422000008088213C0208008C4200201040008160
+:104230008FBF00180E000D71000000008F86002C4B
+:10424000ACD100009202000892030009304200FF46
+:1042500000021200306300FF00431025ACC20004CE
+:104260009202004D000216000002160304410005F0
+:10427000000000003C0308008C6300480A00107630
+:104280003C108008920200083042004014400003B5
+:104290000000182192020027304300FF3C108008E4
+:1042A000361100809222004D00031E003C050800DC
+:1042B00094A54BFE304200FF000214000062182556
+:1042C000ACC300088E2300303C02C00B00A228259E
+:1042D000ACC3000C8E22003400002021ACC20010C0
+:1042E0008E220038ACC200148E22003CACC20018F2
+:1042F0000E000D98ACC5001C8E0200048F84002CAB
+:104300003C058000AC8200008E220020AC820004BC
+:104310008E22001CAC8200088E2200588CA30074F0
+:1043200000431021AC82000C8E22002CAC820010C5
+:104330008E2200408E23004400021400004310250A
+:10434000AC8200149222004D24030080304200FF12
+:1043500014430003000000000A0010B8AC800018ED
+:104360008E23000C240200011062000E2402FFFFC5
+:1043700092220008304200401440000A2402FFFF4D
+:104380008E23000C8CA20074006218233C020800EB
+:10439000006210241440000200002821006028213F
+:1043A00000051043AC8200183C02080094424BFE0A
+:1043B0003C03C00C00002021004310258F83002CFB
+:1043C0000E000D98AC62001C3C0480083482010091
+:1043D0008C4200008F83002C348400803C0608004F
+:1043E00094C64BFEAC620000AC6000048C850048B3
+:1043F0003C02400D00C23025AC650008AC60000CEA
+:10440000AC600010908200058FBF00188FB10014BF
+:1044100000021600AC6200148FB00010AC600018EF
+:1044200024040001AC66001C0A000D9827BD002082
+:104430008FBF00188FB100148FB0001003E0000888
+:1044400027BD00203C0280009443007C3C02800891
+:1044500034460100308400FF3065FFFF2402000570
+:1044600024A34650A0C4000C5482000C3065FFFF0A
+:1044700090C2000D2C4200071040000724A30A0040
+:1044800090C3000D240200140062100400A2102149
+:104490000A0010F53045FFFF3065FFFF3C02800841
+:1044A0003442008003E00008A44500143C03800867
+:1044B00034680080AD050038346701008CE2001CD0
+:1044C000308400FF00A210231840000330C600FF14
+:1044D00024A2FFFCACE2001C308200015040000826
+:1044E0003C0380088D02003C00A21023044100120E
+:1044F000240400058C62000410A2000F3C03800815
+:104500008C62000414A20018000000003C020800A5
+:104510008C4200D830420020104000093C02800844
+:1045200034620080906300089042004C1443000401
+:104530003C028008240400040A0010DF0000000090
+:104540003443008034420100A040000C24020001EA
+:10455000A462001410C000043C0280008C440100DE
+:104560000A000F480000000003E0000800000000FF
+:1045700027BDFFE800A61823AFBF00101860004E4B
+:10458000308800FF3C02800834470080A0E000240F
+:1045900034440100A0E000278C82001C00A21023FC
+:1045A0000440002B000000008CE2003C94E3005C1F
+:1045B0008CE4002C004530233063FFFF00C318213A
+:1045C0000083202B1080000400E018218CE2002CD6
+:1045D0000A00114800A2102194E2005C3042FFFF63
+:1045E00000C2102100A21021AC62001C3C02800815
+:1045F0003447008094E2005C8CE3001C3042FFFFF3
+:104600000002104000A210210043102B10400003B4
+:10461000000000000A0011598CE2001C94E2005CCA
+:104620003042FFFF0002104000A21021ACE2001C4B
+:104630003C028008344201008FBF0010010020219D
+:1046400024060001A040000C0A0010F927BD001844
+:104650008CE2001C004610230043102B5440000144
+:10466000ACE5001C94E2005C3042FFFF0062102BBE
+:10467000144000072402000294E2005C8CE3001C5A
+:104680003042FFFF00621821ACE3001C240200024C
+:10469000ACE500380E000F37A082000C1040001867
+:1046A0008FBF00103C0280008C4401008FBF0010BF
+:1046B0000A000F4827BD00183102001010400010FA
+:1046C0008FBF00103C028008344500808CA3001C82
+:1046D00094A2005C006618233042FFFF006218219C
+:1046E0003C023FFF3444FFFF0083102B5440000185
+:1046F0000080182100C31021ACA2001C8FBF001045
+:1047000003E0000827BD001827BDFFE800C04021D6
+:1047100000A63023AFBF001018C00026308A00FF6B
+:104720003C028008344900808D24001C8D23002C1D
+:10473000008820230064182B1060000F344701000C
+:104740008CE2002000461021ACE200208CE2002028
+:104750000044102B1440000B3C023FFF8CE2002071
+:1047600000441023ACE200209522005C3042FFFFA1
+:104770000A0011AE00822021ACE00020008620213A
+:104780003C023FFF3443FFFF0064102B5440000104
+:10479000006020213C0280083442008000851821FE
+:1047A000AC43001CA0400024A04000270A0011FDDB
+:1047B0008FBF001031420010104000408FBF00102A
+:1047C0003C06800834C400808C82003C00481023E2
+:1047D0005840003B014020219082002424420001E7
+:1047E000A0820024908200243C0308008C630024F3
+:1047F000304200FF0043102B544000348FBF0010A4
+:1048000034C201008C42001C00A210231840002F6B
+:104810008FBF00108CC300049482005C00681823D2
+:104820003042FFFF00031843000210400043102AEB
+:1048300010400005000000008CC200040048102356
+:104840000A0011E3000210439482005C3042FFFF33
+:10485000000210403C068008AC82002C34C5008069
+:1048600094A2005C8CA4002C94A3005C3042FFFF57
+:1048700000021040008220213063FFFF00832021CE
+:1048800001041021ACA2001C8CC2000434C601003B
+:10489000ACC2001C240200020E000F37A0C2000CA4
+:1048A0001040000A8FBF00103C0280008C440100C1
+:1048B0008FBF00100A000F4827BD001801402021BB
+:1048C000240600010A0010F927BD001803E00008C3
+:1048D00027BD00183C098008352A00808D42003C25
+:1048E000308300FF352B01000046102330E700FF26
+:1048F000184000060060202124020001A160000C85
+:10490000A160000D0A001190A542001424020005C8
+:10491000352901000000302114E20008A1400027E1
+:104920009122000D2C4200061040000400000000FF
+:104930009122000D24420001A122000D0A0010F96D
+:10494000000000003C0380083C028000344201006B
+:1049500034640080346301009045000A8C480014E0
+:104960008C8900389062000C30AA00FF01281823BF
+:10497000304700FF1C60000E2CE4000624020001FA
+:1049800000E210041080000A30430003014020219F
+:10499000010028210120302114600007304B000C59
+:1049A000156000073042003014400007000000008E
+:1049B00003E00008000000000A0011900000000061
+:1049C0000A00112A000000000A0012030000000083
+:1049D0003C0380083464010024020003A082000C20
+:1049E0008C62000403E00008AC82001C3C058008D7
+:1049F00034A300809062002734A501002406004300
+:104A000024420001A0620027906300273C020800B6
+:104A10008C420048306300FF146200043C076021B0
+:104A200094A500DA0A0008EE30A5FFFF03E00008B5
+:104A30000000000027BDFFE8AFBF00103C0280006F
+:104A40000E0012498C4401803C028008344301006E
+:104A5000A060000C8C4200048FBF001027BD00181E
+:104A600003E00008AC62001C27BDFFE03C028008A8
+:104A7000AFBF0018AFB10014AFB0001034450080D4
+:104A8000344601003C0880008D09014090C3000CB1
+:104A90008CA4003C8CA2003814820038306700FFE0
+:104AA0009502007C90A30027146000093045FFFFA9
+:104AB0002402000554E200083C04800890C2000D66
+:104AC00024420001A0C2000D0A0012843C048008A8
+:104AD000A0C0000D3C048008348201009042000C0C
+:104AE00024030005304200FF1443000A24A205DC21
+:104AF00034830080906200272C420007504000055C
+:104B000024A20A009063002724020014006210040B
+:104B100000A210213C108008361000803045FFFFB5
+:104B2000012020210E001249A60500149602005C07
+:104B30008E0300383C1180003042FFFF000210401D
+:104B400000621821AE03001C0E0003158E240140E4
+:104B50009202002534420040A20200250E000320EC
+:104B60008E2401408E2401408FBF00188FB10014A5
+:104B70008FB000100A000F4827BD00208FBF00181B
+:104B80008FB100148FB0001003E0000827BD002093
+:104B90008008010080080080800800008008024032
+:104BA00008000EF008000F4808000F8C08001020C5
+:104BB0000800106480080100800800808008000060
+:104BC0000A00002000000000000000000000000DAE
+:104BD0006370342E362E31370000000004061104B5
+:104BE00000000000000000000000000000000000C5
+:104BF0000000000038003C00000000000000000041
+:104C00000000000000000000000000200000000084
+:104C10000000000000000000000000000000000094
+:104C20000000000000000000000000000000000084
+:104C30000000000021003800000000010000002BEF
+:104C40000000000010000003000000000000000D44
+:104C50000000000D3C020800244255C43C0308003B
+:104C6000246357F4AC4000000043202B1480FFFD68
+:104C7000244200043C1D080037BD9FFC03A0F02126
+:104C80003C100800261000803C1C0800279C55C4DE
+:104C90000E00026A000000000000000D00A01821B4
+:104CA00000801021008028213C0460003C07600047
+:104CB0002406000810600006348420788C4200002E
+:104CC000ACE220088C63000003E00008ACE3200C99
+:104CD0000A000E1C00000000240300403C0260009B
+:104CE00003E00008AC4320003C0760008F86000012
+:104CF0008CE520740086102100A2182B1460000798
+:104D0000000028218F8AFDEC24050001A144001336
+:104D10008F89000001244021AF88000003E00008D3
+:104D200000A010218F84FDEC8F8500009086001379
+:104D300030C300FF00A31023AF82000003E000088F
+:104D4000A08000138F84FDEC27BDFFE8AFB00010FA
+:104D5000AFBF001490890011908700112402002831
+:104D6000312800FF3906002830E300FF2485002C9D
+:104D70002CD00001106200162484001C0E000037A5
+:104D8000000000008F8FFDEC3C056000240202044F
+:104D900095EE003E95ED003C000E5C0031ACFFFF4F
+:104DA000016C5025ACAA201052000001240200041E
+:104DB000ACA2200000000000000000000000000085
+:104DC0008FBF00148FB0001003E0000827BD00184B
+:104DD0000A00006F000028218F85FDEC27BDFFD859
+:104DE000AFBF0020AFB3001CAFB20018AFB10014CA
+:104DF000AFB000100080982190A4001124B0001CD6
+:104E000024B1002C308300FF386200280E000059C6
+:104E10002C5200010E000061000000000200202161
+:104E20001240000202202821000028210E00003735
+:104E3000000000008F8DFDEC3C0880003C05600008
+:104E400095AC003E95AB003C02683025000C4C0050
+:104E5000316AFFFF012A3825ACA720102402020284
+:104E6000ACA6201452400001240200028FBF002093
+:104E70008FB3001C8FB200188FB100148FB00010D8
+:104E800027BD002803E00008ACA2200027BDFFE0FA
+:104E9000AFB20018AFB10014AFB00010AFBF001C2C
+:104EA0003C1160008E2320748F82000030D0FFFF01
+:104EB00030F2FFFF1062000C2406008F0E00003756
+:104EC000000000003C06801F0010440034C5FF00B5
+:104ED0000112382524040002AE27201000003021E2
+:104EE000AE252014AE2420008FBF001C8FB2001806
+:104EF0008FB100148FB0001000C0102103E0000833
+:104F000027BD002027BDFFE0AFB0001030D0FFFF6D
+:104F1000AFBF0018AFB100140E00003730F1FFFF33
+:104F200000102400009180253C036000AC7020102C
+:104F30008FBF00188FB100148FB00010240200043E
+:104F4000AC62200027BD002003E000080000102113
+:104F500027BDFFE83C0C6018AFBF00108D985000D3
+:104F60002419FF7F3C0880000319782435EE380CA3
+:104F7000340D8071240A003124090C00AD8E5000DC
+:104F80003C0B800AAD8D53BCAD0A0008AD0900246E
+:104F90000E00048DAF8B002C0E00044B00000000AF
+:104FA0000E000046000000003C0760008CE5080889
+:104FB0002406FFF03C03570900A620243462F000C9
+:104FC00010820048241F0001AF8000380E000BAE95
+:104FD000000000003C0660168CC700003C0860140E
+:104FE0008D0500A03C03FFFF00E320243C02535347
+:104FF00000051FC21082003534C57C0094A201F266
+:10500000A780005010400003A7800060384C1E1E8F
+:10501000A78C005094A201F8104000048F8E003835
+:10502000384D1E1EA78D00608F8E003811C0000401
+:1050300097840060240F0020A78F005097840060A1
+:105040002C980081530000012404008097850050B3
+:105050002CB9040153200001240504003C03600026
+:105060008C670438241F103C30E2FFFF105F000300
+:105070003088FFFF5100000B24060050A38000621F
+:10508000938900621120000B8FBF001027BD00180C
+:10509000A7800060A7800050A780005803E00008A8
+:1050A000A7800076A3860062938900621520FFF72F
+:1050B0008FBF001027BD0018A7840060A78500508F
+:1050C000A780005803E00008A780007600035880FE
+:1050D000016650218D4900043C0660000A00010F62
+:1050E000012628210A000103AF9F00383083FFFF0B
+:1050F0008F88002C8F870028000321403C0580000A
+:105100003C020050008248253C0660003C0A010039
+:1051100034AC04008CCD08E001AA582411600005CD
+:10512000000000008CCF08E024E7000101EA7025B0
+:10513000ACCE08E08D19001001805821ACB90038C0
+:105140008D180014ACB8003CACA900300000000081
+:10515000000000000000000000000000000000004F
+:105160000000000000000000000000003C03800080
+:105170008C640000308200201040FFFD3C0F600076
+:105180008DED08E03C0E010001AE18241460FFE133
+:1051900000000000AF87002803E00008AF8B003C50
+:1051A0008F85002C240BFFF03C06800094A7001A8A
+:1051B0008CA9002430ECFFFF000C38C000EB502419
+:1051C000012A4021ACC8003C8CA400248CC3003CC4
+:1051D0000083102318400033000000008CAD002035
+:1051E00025A200013C0F0050ACC2003835EE001083
+:1051F0003C068000ACCE0030000000000000000043
+:10520000000000000000000000000000000000009E
+:1052100000000000000000003C0480008C990000A9
+:10522000333800201300FFFD30E200081040001763
+:105230003C0980008C880408ACA800108C83040C06
+:10524000ACA300143C1900203C188000AF190030BA
+:1052500094AE001894AF001C01CF3021A4A6001812
+:1052600094AD001A25A70001A4A7001A94AB001A58
+:1052700094AC001E118B00030000000003E0000846
+:105280000000000003E00008A4A0001A8D2A04001A
+:10529000ACAA00108D240404ACA400140A0001A2DE
+:1052A0003C1900208CA200200A00018A3C0F00500B
+:1052B0000A000178000000003C0308008C63002015
+:1052C0008F82003427BDFFE810620008AFBF0010D6
+:1052D0000E0001BCAF8300343C0308008C63002047
+:1052E00024040001106400048F8C002C8FBF001078
+:1052F00003E0000827BD00188FBF00103C058000A8
+:10530000A580000A958B000A958A000427BD001825
+:105310003167FFFF3149000F0009450000E83025E3
+:1053200003E00008ACA600803C0208008C4200208C
+:1053300027BDFFC8AFBF0034AFBE0030AFB7002CF1
+:10534000AFB60028AFB50024AFB40020AFB3001C47
+:10535000AFB20018AFB1001410400053AFB000104E
+:105360008F84002C948600069483000A00C32823AF
+:1053700030B6FFFF12C0004D8FBF00349489001873
+:10538000948A000A012A40233102FFFF02C2382B0F
+:1053900014E0000202C02021004020212C8C0005D6
+:1053A000158000020080A021241400040E00014B8F
+:1053B000028020218F87002C02809821AF8000304E
+:1053C00094ED000A028088211280005131B2FFFF63
+:1053D0003C1770003C1540003C1E60008F8F003C65
+:1053E0008DEE000001D718245075005302202021B3
+:1053F00002A3802B160000383C1820001078004AC9
+:1054000000000000241000018F8300301460003C75
+:10541000029158230230F8230250C82133F1FFFFD4
+:105420001620FFEE3332FFFF8F87002C3C12002046
+:105430003C118000AE32003094EA000A3C17800034
+:10544000026A4821A4E9000A94E3000A94E80004EF
+:105450003065FFFF3106000F0006150000A2F025A1
+:10546000AEFE008094F4000A94F5001812B4003ADD
+:105470000013C9408CF800148CEE00100319582159
+:10548000000078210179682B01CF6021018D202156
+:10549000ACEB0014ACE4001002D3382330F6FFFF6D
+:1054A00016C0FFB68F84002C8FBF00348FBE003033
+:1054B0008FB7002C8FB600288FB500248FB4002042
+:1054C0008FB3001C8FB200188FB100148FB0001082
+:1054D00003E0000827BD0038107E001B000000001C
+:1054E0001477FFC9241000010E0014E00000000032
+:1054F0008F8300301060FFC80230F82302915823D8
+:105500008F87002C017020210A0002553093FFFF85
+:105510008F8300301460FFC83C1200203C118000D3
+:105520000A00021EAE3200300E0003CE02202021FF
+:105530000A000212004080210E0007C60240282106
+:105540000A000212004080210E000D7D0220202161
+:105550000A000212004080210E00017800000000C5
+:105560000A00023702D3382327BDFFD0AFB500248D
+:10557000AFB40020AFB3001CAFB20018AFB100143D
+:10558000AFB00010AFBF00280E0000E43C14800054
+:105590003C0280083C0320003C010800AC20007065
+:1055A00034550080347200032413000136900070DB
+:1055B0002411FF800A0002858E0600003C1980003D
+:1055C0008F3800003B0F000131E200011040002540
+:1055D0008F8600848E0700003C0D08008DAD003CD6
+:1055E0003C0A08008D4A003800E6702301AE4021D5
+:1055F00000005821010E302B014B482101262021AB
+:105600003C010800AC28003CAF8700843C01080046
+:10561000AC2400380E0001BE000000003C0508006C
+:105620008CA5007010A0FFE500A020213C0508001B
+:105630008CA500683C0608008CC6006C0E00148324
+:10564000000000003C010800AC2000703C19800004
+:105650008F3800003B0F000131E200011440FFDDF4
+:105660008F8600848E0C00008F8D00843C0708001C
+:105670008CE7003C3C0608008CC60038018D58239E
+:1056800000EB282100AB202B00C24821012410216F
+:105690003C010800AC25003C3C0880003C010800AF
+:1056A000AC2200388D030100241F0C00107F00265F
+:1056B000000000008D180100240E0020AD1800200D
+:1056C00092AF000031E300FF106E00232419005058
+:1056D00010790026000000003C0480008C88010046
+:1056E0001500000300000000566000143C04400058
+:1056F0008C9901008C8F0100000098210331C02497
+:105700000018694031EE007F01AE602501925825F6
+:10571000AC8B08308C8701008C89010024EA0100E1
+:1057200001513024000629403123007F00A31025B9
+:105730000052F825AC9F08303C044000AE8401388C
+:105740000A00027D000000000E0001DA00000000E7
+:105750000A0002C73C0480008D0401000E00077F90
+:10576000000000000A0002C73C0480008D04010014
+:105770000E00139B000000000A0002C73C048000DA
+:1057800000A4102B24030001104000090000302168
+:105790000005284000A4102B04A0000300031840BB
+:1057A0005440FFFC000528405060000A0004182BFC
+:1057B0000085382B54E000040003184200C3302554
+:1057C00000852023000318421460FFF900052842D9
+:1057D0000004182B03E0000800C310213084FFFFF1
+:1057E00030C600FF3C0780008CE201B80440FFFE99
+:1057F00000064C00012430253C08200000C820256C
+:105800003C031000ACE00180ACE50184ACE401880D
+:1058100003E00008ACE301B83C0660008CC5201C26
+:105820002402FFF030830200308601001060000E79
+:1058300000A2282434A500013087300010E00005C4
+:1058400030830C0034A500043C04600003E0000831
+:10585000AC85201C1060FFFD3C04600034A50008EE
+:1058600003E00008AC85201C54C0FFF334A50002FF
+:105870000A00031F3087300027BDFFE8AFB00010DB
+:10588000AFBF00143C076000240600021080001126
+:1058900000A080218F83003C0E0003168C6400184A
+:1058A0008F82003C00002021240600018C45000C62
+:1058B0000E0003070000000016000002240200038F
+:1058C000000010218FBF00148FB0001003E000080B
+:1058D00027BD00188CE8201C2409FFF001092824AA
+:1058E000ACE5201C8F87003C0A00033C8CE5000CD3
+:1058F0003C02600E0080402134460100240900185B
+:105900000000000000000000000000003C0A005001
+:105910003C03800035470200AC6800383464040062
+:10592000AC65003CAC6700308C6C0000318B002013
+:105930001160FFFD2407FFFF2403007F8C8D000012
+:105940002463FFFF24840004ACCD00001467FFFB38
+:1059500024C6000400000000000000000000000059
+:1059600024A402000085282B3C0300203C0E80006C
+:105970002529FFFF01054021ADC300301520FFE0C0
+:105980000080282103E00008000000008F82003C16
+:1059900027BDFFD8AFB3001CAFBF0020AFB20018C7
+:1059A000AFB10014AFB000109446000200809821FF
+:1059B0008C5200182CC300818C4800048C470008CE
+:1059C0008C51000C8C490010106000078C4A0014A8
+:1059D0002CC400041480001330EB000730C5000312
+:1059E00010A00010000000002410008B02002021F5
+:1059F000022028210E00030724060003166000027F
+:105A000024020003000010218FBF00208FB3001C70
+:105A10008FB200188FB100148FB0001003E000089F
+:105A200027BD00281560FFF12410008B3C0C80007E
+:105A30003C030020241F0001AD830030AF9F0030E5
+:105A40000000000000000000000000002419FFF02A
+:105A500024D8000F031978243C1000D0AD880038FA
+:105A600001F0702524CD00033C08600EAD87003C9A
+:105A700035850400AD8E0030000D38823504003CC1
+:105A80003C0380008C6B0000316200201040FFFD61
+:105A90000000000010E0000824E3FFFF2407FFFFE0
+:105AA0008CA800002463FFFF24A50004AC8800003C
+:105AB0001467FFFB248400043C04600EAC860038AD
+:105AC0000000000000000000000000003C07002073
+:105AD0003C0680000120202101402821ACC7003075
+:105AE0000E00034C000080210E000316024020210E
+:105AF0000A00038C0200202127BDFFD8AFB2001896
+:105B00003092FFFFAFB10014AFBF0020AFB3001C55
+:105B1000AFB000101240002D000088210A0003E2FF
+:105B20002413000350B300428CE5000C0000000D6C
+:105B3000263900013331FFFF24F800200232382BD0
+:105B400010E00022AF98003C8F8200301440001F0C
+:105B50008F87003C3C0670003C0320008CE4000072
+:105B60000086282414A300198F85004400044402F1
+:105B70003C0980000089802414A0FFEA310600FF60
+:105B8000240A000210CA003028CB0003116000175D
+:105B9000000000002404000114C4FFE626390001BF
+:105BA000020028210E00032E240400018F87003CF0
+:105BB000AF820044263900013331FFFF24F8002072
+:105BC0000232382B14E0FFE0AF98003C0220102195
+:105BD0008FBF00208FB3001C8FB200188FB100144C
+:105BE0008FB0001003E0000827BD002810D3001B71
+:105BF000240C000414CCFFCF26390001308DFFFFA8
+:105C0000000D19C03C0480008C8E01B805C0FFFE59
+:105C10003C0F10003C102004AC830180AC80018458
+:105C2000AC900188AC8F01B80A0003DD2639000171
+:105C30000E000307240400841600FFBD8F87003C7C
+:105C40000A0003DCAF800044020028210E00032E6E
+:105C5000000020210A0003FC8F87003C0E00037324
+:105C6000020020218F87003C0A0003FDAF82004420
+:105C7000000449C23127003F000443423C02800037
+:105C800000082040240316802CE60020AC43002CA2
+:105C900024EAFFE02482000114C0000330A900FFC1
+:105CA00000801021314700FF000260803C0D800021
+:105CB000240A0001018D20213C0B000E00EA28047B
+:105CC000008B302111200005000538278CCE000004
+:105CD00001C5382503E00008ACC700008CD80000DF
+:105CE0000307782403E00008ACCF000027BDFFE0E5
+:105CF000AFB10014AFB00010AFBF00183C07600098
+:105D00008CE408083402F0003C1160003083F0009D
+:105D1000240501C03C04800E000030211062000602
+:105D2000241000018CEA08083149F0003928E0000D
+:105D30000008382B000780403C0D0200AE2D0814EF
+:105D4000240C16803C0B80008E2744000E000E268B
+:105D5000AD6C002C120000043C02169124050001D9
+:105D6000120500103C023D6C345800E0AE38440887
+:105D70003C1108008E31007C8FBF00183C0660008B
+:105D800000118540360F16808FB100148FB00010BF
+:105D90003C0E020027BD0020ACCF442003E00008E9
+:105DA000ACCE08103C0218DA345800E0AE38440893
+:105DB0003C1108008E31007C8FBF00183C0660004B
+:105DC00000118540360F16808FB100148FB000107F
+:105DD0003C0E020027BD0020ACCF442003E00008A9
+:105DE000ACCE08100A00042C240500010A00042C83
+:105DF0000000282124020400A782000CA7800004D0
+:105E0000000020213C06080024C656582405FFFF48
+:105E100024890001000440803124FFFF010618217D
+:105E20002C87002014E0FFFAAC6500002404040075
+:105E3000A784000EA7800006000020213C06080071
+:105E400024C656D82405FFFF248D0001000460807D
+:105E500031A4FFFF018658212C8A00201540FFFA4B
+:105E6000AD650000A7800010A7800008A780000A89
+:105E7000000020213C06080024C657582405FFFFD7
+:105E8000249900010004C0803324FFFF0306782119
+:105E90002C8E000415C0FFFAADE500003C05600043
+:105EA0008CA73D002403E08F00E31024344601401A
+:105EB00003E00008ACA63D002487007F000731C244
+:105EC00024C5FFFF000518C2246400013082FFFFD3
+:105ED000000238C0A78400183C010800AC2700303D
+:105EE000AF80001400002821000020210000302194
+:105EF0002489000100A728213124FFFF2CA81701C5
+:105F0000110000032C8300801460FFF924C60001F7
+:105F100000C02821AF86001410C0001DA786001203
+:105F200024CAFFFF000A11423C0808002508575800
+:105F30001040000A00002021004030212407FFFF0C
+:105F4000248E00010004688031C4FFFF01A8602195
+:105F50000086582B1560FFFAAD87000030A2001FA5
+:105F60005040000800043080240300010043C804AE
+:105F700000041080004878212738FFFF03E0000864
+:105F8000ADF8000000C820212405FFFFAC8500000B
+:105F900003E000080000000030A5FFFF30C6FFFF4F
+:105FA00030A8001F0080602130E700FF0005294273
+:105FB0000000502110C0001D24090001240B000125
+:105FC00025180001010B2004330800FF0126782664
+:105FD000390E00202DED00012DC2000101A218256F
+:105FE0001060000D014450250005C880032C40219D
+:105FF0000100182110E0000F000A20278D04000086
+:10600000008A1825AD03000024AD000100004021E6
+:106010000000502131A5FFFF252E000131C9FFFFEF
+:1060200000C9102B1040FFE72518000103E000080D
+:10603000000000008D0A0000014440240A000512FF
+:10604000AC68000027BDFFE830A5FFFF30C6FFFFAA
+:10605000AFB00010AFBF001430E7FFFF00005021C9
+:106060003410FFFF0000602124AF001F00C0482152
+:10607000241800012419002005E0001601E0102179
+:106080000002F943019F682A0009702B01AE4024E9
+:1060900011000017000C18800064102110E00005AA
+:1060A0008C4B000000F84004000838230167582496
+:1060B00000003821154000410000402155600016C5
+:1060C0003169FFFF258B0001316CFFFF05E1FFEC1B
+:1060D00001E0102124A2003E0002F943019F682A3A
+:1060E0000009702B01AE40241500FFEB000C188056
+:1060F000154600053402FFFF020028210E0004F6B9
+:1061000000003821020010218FBF00148FB0001052
+:1061100003E0000827BD00181520000301601821C6
+:10612000000B1C0224080010306A00FF1540000517
+:10613000306E000F250D000800031A0231A800FF81
+:10614000306E000F15C00005307F000325100004DD
+:1061500000031902320800FF307F000317E000053A
+:10616000386900012502000200031882304800FF50
+:10617000386900013123000110600004310300FF81
+:10618000250A0001314800FF310300FF000C69407F
+:1061900001A34021240A000110CAFFD53110FFFFDE
+:1061A000246E000131C800FF1119FFC638C9000173
+:1061B0002D1F002053E0001C258B0001240D000141
+:1061C0000A000589240E002051460017258B000186
+:1061D00025090001312800FF2D090020512000125F
+:1061E000258B000125430001010D5004014B1024B3
+:1061F000250900011440FFF4306AFFFF3127FFFF3B
+:1062000010EE000C2582FFFF304CFFFF00005021F4
+:106210003410FFFF312800FF2D0900205520FFF228
+:1062200025430001258B0001014648260A0005434D
+:10623000316CFFFF00003821000050210A00059555
+:106240003410FFFF27BDFFD8AFB0001030F0FFFFC4
+:10625000AFB10014001039423211FFE00007108086
+:10626000AFB3001C00B1282330D3FFFFAFB200183A
+:1062700030A5FFFF008090210260302100442021E2
+:10628000AFBF00200E0005213207001F0222882127
+:106290003403FFFF02402021020028210260302148
+:1062A00000003821104300093231FFFF0220102185
+:1062B0008FBF00208FB3001C8FB200188FB1001465
+:1062C0008FB0001003E0000827BD00280E00052154
+:1062D0000000000000408821022010218FBF002014
+:1062E0008FB3001C8FB200188FB100148FB0001054
+:1062F00003E0000827BD0028000424003C036000E0
+:10630000AC603D0810A000023482100634821016E2
+:1063100003E00008AC623D0427BDFFE0AFB0001011
+:10632000309000FF2E020006AFBF0018104000089A
+:10633000AFB10014001030803C030800246353B454
+:1063400000C328218CA40000008000080000000089
+:10635000000020218FBF00188FB100148FB00010F3
+:106360000080102103E0000827BD00209791001253
+:1063700016200051000020213C020800904200330A
+:106380000A0005FC00000000978D000E15A00031EA
+:10639000000020210A0005FC240200089787000C59
+:1063A00014E0001A000018210060202124020001DE
+:1063B0001080FFE98FBF0018000429C2004530217A
+:1063C00000A6582B1160FFE43C0880003C07200029
+:1063D000000569C001A76025AD0C00203C038008C2
+:1063E0002402001F2442FFFFAC6000000441FFFDB7
+:1063F0002463000424A5000100A6702B15C0FFF53E
+:10640000000569C00A0005E68FBF001897870004E1
+:106410003C04080024845658240504000E0005A1FD
+:1064200024060001978B000C24440001308AFFFFF2
+:106430002569FFFF2D480400004028211500004079
+:10644000A789000C24AC3800000C19C00A0005FA1A
+:10645000A7800004978700063C040800248456D8CF
+:10646000240504000E0005A1240600019799000EE2
+:10647000244400013098FFFF272FFFFF2F0E040058
+:106480000040882115C0002CA78F000EA7800006B1
+:106490003A020003262401003084FFFF0E0005CEDF
+:1064A0002C4500010011F8C027F00100001021C0A8
+:1064B0000A0005FC24020008978500169787000A49
+:1064C0003C040800248457580E0005A1240600014E
+:1064D000978700128F8900142445000130A8FFFF20
+:1064E00024E3FFFF0109302B0040802114C0001875
+:1064F000A7830012A780000A978500180E000E10CF
+:1065000002002021244A05003144FFFF0E0005CE81
+:10651000240500013C05080094A500320E000E1071
+:1065200002002021244521003C0208009042003353
+:106530000A0005FC000521C00A000634A7840006F5
+:1065400024AC3800000C19C00A0005FAA784000426
+:106550000A00064EA785000A308400FF27BDFFE829
+:106560002C820006AFBF0014AFB000101040001521
+:1065700000A03821000440803C030800246353CC71
+:10658000010328218CA40000008000080000000006
+:1065900024CC007F000751C2000C59C23170FFFFAC
+:1065A0002547C40030E5FFFF2784000402003021A6
+:1065B0000E0004F624070001978600100206202131
+:1065C000A78400108FBF00148FB0001003E00008F4
+:1065D00027BD00183C0508008CA50030000779C2D3
+:1065E0000E0002F025E4DF003045FFFF3C04080008
+:1065F00024845758240600010E0004F624070001E5
+:10660000978E00128FBF00148FB0001025CD0001AF
+:1066100027BD001803E00008A78D00120007C9C2BB
+:106620002738FF00001878C231F0FFFF3C04080053
+:10663000248456D802002821240600010E0004F606
+:1066400024070001978D000E260E0100000E840025
+:1066500025AC00013C0B6000A78C000EAD603D082E
+:1066600036040006000030213C0760008CE23D0447
+:10667000305F000617E0FFFD24C9000100061B0083
+:10668000312600FF006440252CC50004ACE83D0421
+:1066900014A0FFF68FBF00148FB0001003E00008B5
+:1066A00027BD0018000751C22549C8002406000173
+:1066B000240700013C040800248456580E0004F608
+:1066C0003125FFFF9787000C8FBF00148FB000109B
+:1066D00024E6000127BD001803E00008A786000C8F
+:1066E0003084FFFF30A5FFFF3C0680008CC201B85C
+:1066F0000440FFFE3C084080008838253C03100021
+:10670000ACC00180ACC50184ACC7018803E00008BF
+:10671000ACC301B83084FFFF3C0680008CC201B8D6
+:106720000440FFFE3C0840388CA700000088282564
+:106730003C031000ACC70180ACC5018803E0000831
+:10674000ACC301B88F83005C8F8600541066000BC9
+:10675000008040213C07080024E75768000328C058
+:1067600000A710218C44000024630001108800055C
+:106770003063000F5466FFFA000328C003E00008EE
+:10678000000010213C07080024E7576C00A73021C7
+:1067900003E000088CC200003C039000346200015A
+:1067A000008220253C038000AC6400208C65002022
+:1067B00004A0FFFE0000000003E00008000000004D
+:1067C0003C028000344300010083202503E00008E0
+:1067D000AC44002027BDFFE0AFB100143091FFFFB3
+:1067E000AFB00010AFBF00181220001200A080212F
+:1067F0008CA5000014A00011240400023C068000B7
+:106800008CC201B80440FFFE3C074000022720254F
+:106810008FBF00188FB100148FB000103C03100020
+:1068200027BD0020ACC50180ACC4018803E000088E
+:10683000ACC301B80A00070F8CA500000E00066665
+:1068400024060200000028210A00070FAE00000005
+:106850003087FFFF3C0680008CC201B80440FFFE79
+:106860003C0A40068CA9000000EA4025ACC9018022
+:106870008CA400043C031000ACC40184ACC80188A3
+:1068800003E00008ACC301B88F83FDE827BDFFE833
+:10689000AFBF0014AFB00010906700080080102157
+:1068A0000080282130E600400000202110C00008B0
+:1068B0008C5000000E0000860200202102002021E2
+:1068C0008FBF00148FB000100A00048927BD001884
+:1068D0000E000724000000000E00008602002021A8
+:1068E000020020218FBF00148FB000100A0004891D
+:1068F00027BD001827BDFFE0AFB000108F90FDE866
+:10690000AFBF001CAFB20018AFB100149206000177
+:10691000008088210E0006F630D2000492040005A3
+:10692000001129C2A605000034830040A20300051F
+:106930000E000700022020210E00048B02202021DF
+:1069400024020001AE02000C02202821A602001041
+:1069500024040002A602001224060200A60200146B
+:106960000E000666A60200161640000F8FBF001C20
+:10697000978C00583C0B08008D6B00782588FFFF32
+:106980003109FFFF256A0001012A382B10E00006BB
+:10699000A78800583C0F6006240E001635ED001045
+:1069A000ADAE00508FBF001C8FB200188FB1001425
+:1069B0008FB0001003E0000827BD002027BDFFE0D6
+:1069C000AFBF0018AFB10014AFB000100E0006F654
+:1069D000008088218F85FDE80220202190A30005FA
+:1069E0000E000700307000FF2402003E1202000576
+:1069F0008FBF00188FB100148FB0001003E00008A3
+:106A000027BD00203C0580008CA401780480FFFE97
+:106A1000240700073C061000ACB1014002202021F1
+:106A2000A0A701448FBF00188FB100148FB00010D1
+:106A3000ACA601780A00074D27BD002027BDFFE066
+:106A4000AFB00010AFBF0018AFB100143C10800011
+:106A50008E110020000000000E00048BAE04002008
+:106A6000AE1100208FBF00188FB100148FB000103E
+:106A700003E0000827BD00203084FFFF3C068000B3
+:106A80008CC201B80440FFFE3C0840350088382520
+:106A90003C031000ACC50180ACC00184ACC70188C8
+:106AA00003E00008ACC301B83084FFFF3C0680005F
+:106AB0008CC201B80440FFFE3C08403600883825EF
+:106AC0003C031000ACC50180ACC00184ACC7018898
+:106AD00003E00008ACC301B827BDFFD0AFB5002468
+:106AE0003095FFFFAFB60028AFB40020AFBF002C39
+:106AF000AFB3001CAFB20018AFB10014AFB00010BC
+:106B000030B6FFFF12A000270000A0218F92003CAA
+:106B10008E4300003C0680002402004000033E0239
+:106B200000032C0230E4007F006698241482001DCC
+:106B300030A500FF8F83004C2C68000A5100001024
+:106B40008F860030000358803C0C0800258C53E8E9
+:106B5000016C50218D490000012000080000000058
+:106B600002D448213125FFFF0E0006C8240400840A
+:106B7000166000028F92003CAF80004C8F86003080
+:106B800026580020268F00010300902131F4FFFFDA
+:106B900014C00004AF98003C0295282B14A0FFDC21
+:106BA00000000000028010218FBF002C8FB600284B
+:106BB0008FB500248FB400208FB3001C8FB2001853
+:106BC0008FB100148FB0001003E0000827BD003023
+:106BD0002407003414A70146000000009247000E6D
+:106BE0008F99FDEC8F90FDE824181600A32700195B
+:106BF000924A000D3C0880003C07800CA32A001834
+:106C0000964400123C0F60003C117FFFA604005C1C
+:106C1000965F00103622FFFF240A000533E5FFFFD0
+:106C2000AE0500548E46001CAD1800288CE900000B
+:106C30008DEE44480126682601CD3021AE0600388D
+:106C40008E03003824CB00013C0E7F00AE03003CD5
+:106C50008E0C003CAF2C0004AE0B00208E130020E5
+:106C6000AE13001CA320001BAE02002CA32A0012AE
+:106C70008E44001424130050AE0400348E1F0034E0
+:106C8000AF3F00148E450018AE0500489258000C26
+:106C9000A218004E920F000835E90020A209000852
+:106CA0008E0D001801AE1824346C4000AE0C001894
+:106CB000920B0000317200FF125302AD2413FF80CB
+:106CC0003C040800248457E80E000732000000004E
+:106CD00024030004240800013C0508008CA557E8A3
+:106CE0003C048000A2030025A20800058C900178D6
+:106CF0000600FFFE8F92003C240E00023C0D1000A7
+:106D0000AC850140A08E0144AC8D01780A0007EFEC
+:106D1000AF80004C2CAD003711A0FF998F8600305A
+:106D2000000580803C1108002631541002117821A2
+:106D30008DEE000001C000080000000024100004D7
+:106D400014B0008E3C0780003C0C08008D8C57E886
+:106D50008F86FDE8ACEC00208E4B00088F98FDEC90
+:106D600024090050ACCB00308E430008ACC3005067
+:106D70008E42000CACC200348E4A0010ACCA0038FF
+:106D80008E440010ACC400548E5F0014ACDF003C95
+:106D90008E590018AF1900048E4F001CACCF002094
+:106DA00090D10000322500FF10A9027D00000000F4
+:106DB0008CD100348CCF0030022F302304C000F37C
+:106DC0002404008C126000F0240200030A0007EF84
+:106DD000AF82004C2418000514B800683C0B8000FA
+:106DE0003C0C08008D8C57E88F86FDE8AD6C0020C8
+:106DF0008E4300048F9FFDEC24072000ACC3001CD1
+:106E00009242000824120008A3E200198F8A003C75
+:106E100091440009A3E400188F85003C90B9000A52
+:106E2000332400FF1092001028880009150000BCD0
+:106E3000240D0002240900201089000B3407800073
+:106E4000289100211620000824074000240F00404C
+:106E5000108F00053C0700012418008010980002E4
+:106E60003C070002240740008CC400183C0AFF00C5
+:106E7000008AF82403E7C825ACD9001890B2000BAB
+:106E8000A0D200278F83003C9465000C10A0023133
+:106E9000000000009467000C3C1F8000A4C7005C49
+:106EA0009062000E2403FFBF24070004A0C2000864
+:106EB0008F8A003C9144000FA0C400098F88003CD9
+:106EC0008D1200108FF9007402592823ACC50058A8
+:106ED0008D180014ACD8002C950F001831F1FFFF6D
+:106EE000ACD100409509001A3130FFFFACD000440E
+:106EF0008D0E001CACCE0048950D0002A4CD00788C
+:106F0000910C000EA0CC000890CB00080163102467
+:106F1000126001D7A0C200088F92003C0A0007EF60
+:106F2000AF87004C2406000614A600143C0E800017
+:106F30003C1008008E1057E88F8CFDE4ADD0002087
+:106F40008E4D00188F86FDE88F8BFDECAD8D000017
+:106F50008CC8003824040005AD8800048CC3003CB4
+:106F600012600081AD6300000A0007EFAF84004C9F
+:106F70002409000710A9004B240400063C05080062
+:106F800024A557E80E000705240400818F92003CD9
+:106F90000013102B0A0007EFAF82004C241F0023C0
+:106FA00014BFFFF63C0C80003C0308008C6357E8DC
+:106FB0008F8BFDECAD8300208F91FDE88E460004A1
+:106FC0002564002026450014AE2600282406000370
+:106FD0000E000E1C257000308F87003C020020211F
+:106FE000240600030E000E1C24E500083C040800E3
+:106FF000248457E80E0007320000000092220000AF
+:1070000024040050304A00FF5544FFE18F92003CB9
+:107010000E000E07000000000A0008F48F92003CEA
+:107020002408003314A800323C0280003C11080000
+:107030008E3157E88F89FDECAC5100208E4A000854
+:10704000240F00288F8DFDE8AD2A00308E44000CFF
+:1070500024060009AD2400348E5F0010AD3F0038D7
+:107060008E590014AD3900208E450018AD2500243E
+:107070008E58001CAD380028A12F00118E4E000440
+:1070800012600031ADAE00288F92003C0A0007EF7D
+:10709000AF86004C2411002214B1FFB8000000009C
+:1070A000240400073C1808008F1857E83C0F8000A4
+:1070B000ADF800205660FEB1AF84004C3C040800DF
+:1070C000248457E80E000732241300508F99FDE8FE
+:1070D00093320000324500FF10B3016C0000000045
+:1070E0008F92003C000020210A0007EFAF84004C83
+:1070F0003C05080024A557E80E0006D524040081AD
+:107100000A0008F48F92003C02D498213265FFFFF8
+:107110000E0006C8240400840A0007EF8F92003C8A
+:10712000108DFF51240704002887000310E001AAF6
+:1071300024100004240E0001548EFF4B240740004D
+:107140000A0008AA240701003C05080024A557E806
+:107150000E000724240400828F92003C000030219E
+:107160000A0007EFAF86004C3C040800248457E86F
+:107170008CC200380E0007328CC3003C8F92003C5A
+:107180000A00094A00002021240400823C0508006E
+:1071900024A557E80E000724000000008F92003C51
+:1071A000000010210A0007EFAF82004C8E5000044F
+:1071B0008F91FDE83C0A8000AD500020922200052E
+:1071C000020028213046000214C001872404008AEE
+:1071D0008F92FDEC020028212404008D924B001BAD
+:1071E000316300201460018000000000922D00092E
+:1071F000240C001231A800FF110C017B2404008133
+:107200000E0006F6020020219245001B240E000409
+:107210000200202134A90042A249001B0E000700F1
+:10722000A22E00253C0480008C9101780620FFFEF0
+:1072300024180002AC900140A09801448F92003CB9
+:107240003C0F1000AC8F01780A0008F50013102BDA
+:107250008E5000048F91FDE83C1F8000AFF00020AD
+:1072600092390005020028213327000214E0001A99
+:107270002404008A922600092412001230C400FF60
+:10728000109201110000000092230009240A00045A
+:10729000306200FF104A010C000000000E0006F6EC
+:1072A000020020218F88FDEC240CFFFE020020212B
+:1072B000910E001B35CD0020A10D001BA23200094C
+:1072C000922B0005016C90240E000700A2320005ED
+:1072D00002002821000020210E0007BA0000000053
+:1072E0000A0008F48F92003C8E5100043C0280009A
+:1072F0003C100800261057E8AC5100203C01080063
+:10730000AC3157E89246000330C400041080016994
+:107310008F84FDE824020006A0820009924D001B24
+:107320002408FFC031AC003F01885825A08B00081D
+:1073300092430003306A0001154001600000000024
+:107340008E420008AE0200083C0208008C4257F052
+:107350001040015F8F8EFDEC000281C28F85FDE839
+:10736000A5D0000C8E5F000C240F0001240900142E
+:10737000ADDF002C8E590010ADD9001C96470016C9
+:10738000A5C7003C96580014A5D8003EACAF000C31
+:10739000A4AF0010A4AF0012A4AF0014A4AF001655
+:1073A00012600163A1C900119244000330920002EF
+:1073B0002E5300018F92003C266200080A0007EF5E
+:1073C000AF82004C8E4600043C0580003C048008DF
+:1073D000ACA600208E4700089089000024110050C0
+:1073E000312200FF105100BC240500883C048000BD
+:1073F0008C8F01B805E0FFFE0013802B3C1840097C
+:1074000000B81025AF90004C3C101000AC860180F5
+:10741000AC870184AC820188AC9001B80A0007F007
+:107420008F8600308E4500043C0680003C098008B1
+:10743000ACC50020913F00002404005033F900FF48
+:10744000132400B4240600883C0480008C8A01B810
+:107450000540FFFE3C0E400E00CE68253C081000A3
+:10746000AC850180AC800184AC8D0188AC8801B80A
+:10747000912B0000240CFF8024040004016C1825CB
+:10748000240600300E000666A12300000A0008F45E
+:107490008F92003C8E5000048F91FDEC3C0F8000D9
+:1074A000ADF000209225001B30A900101120007CB7
+:1074B000240300813C0480008C8701B804E0FFFEB7
+:1074C0003C1F401FAC900180007F10250013C82B8B
+:1074D0003C101000AC800184AF99004CAC82018854
+:1074E000AC9001B80A0007F08F8600308E44001C73
+:1074F0000E0006E100000000104000FC00403821B2
+:107500008F92003C240600893C0580008CAE01B8B7
+:1075100005C0FFFE00000000ACA701808E50001CDB
+:107520003C1140010013782B00D138253C1310008A
+:10753000ACB00184AF8F004CACA70188ACB301B8EC
+:107540000A0007F08F860030965900023C100800B0
+:10755000261057E833380004130000A73C046000ED
+:107560008E5F001C3C068000ACDF00203C01080060
+:10757000AC3F57E8964F000231E7000114E000E706
+:10758000000000008E420004AE0200083C1008001B
+:107590008E1057F0120000DD3C0680008F85FDE85C
+:1075A000241000018CBF00188F91FDEC8F89FDE441
+:1075B00003E6C825ACB90018A0A00005ACB0000CCB
+:1075C0003C1808008F1857F08F87003CA4B00010BB
+:1075D000001879C2A4B00012A4B00014A4B0001620
+:1075E000A62F000C8CEE00088F8D003C8F8C003C89
+:1075F000AE2E002C8DA8000C24070002AE28001C23
+:10760000918B0010A22B00118F83003C906A001117
+:10761000A12A00088F82003C90440012A0A4004ED2
+:107620008F92003C92460013A22600128F92003CDB
+:10763000965F0014A63F003C96590016A639003EFE
+:107640008E580018AE3800145660FD4CAF87004CC1
+:107650003C05080024A557E80E000705000020217E
+:107660008F92003C000038210A0007EFAF87004CE2
+:107670003C05080024A557E80E00072424040082D6
+:107680008F92003C0A0008D7000038210E000E0738
+:10769000000000008F92003C0A00094A00002021EF
+:1076A0000E0006F6020020219232001B020020216B
+:1076B000365800100E000700A238001B8F92003CC5
+:1076C0000A000A3D000018210E0007BA24040081B8
+:1076D0000A0008F48F92003C9243000C306A0001CB
+:1076E0001140000300000000964B000EA48B002CFC
+:1076F0009248000C310C00021180FF3C0000282150
+:10770000964E00128E4D0014A48E001A0A000A0B29
+:10771000AC8D001C8F83005C8F8700541067FF4A7C
+:10772000000030213C0808002508576C000320C0E9
+:10773000008830218CD10000122500C8246200018D
+:107740003043000F1467FFFA000320C00A000A222A
+:10775000000030213C05080024A557E80E0007244E
+:107760002404008B8F92003C0A0008D70013382BAA
+:107770003C0C08008D8C57E824D9FFFE25910100B0
+:10778000322B007F0167902102331024AD020028C4
+:10779000AE4600D0AE4000D40A000840AE59001CEE
+:1077A000ACC000543C0908008D2957E83C05800C0A
+:1077B00034A80100ACE900288E500014AD1000D0B0
+:1077C0008E4E0014AD0E00D48E4D001025A7FFFE86
+:1077D0000A00087CAD07001C5490FDA3240740005C
+:1077E0000A0008AA240710000E0007AE00000000DF
+:1077F0000A0008F48F92003C8C83442C3C05DEADDB
+:1078000034B2BEEF3C010800AC2057E81072004FC4
+:10781000000000003C046C6234827970146200083D
+:1078200024040002978A0058978300500200282100
+:107830000143482B11200019240400922404000263
+:107840000E0005D6240502003C0B8000AD6200202E
+:107850003C010800AC2257E81040000D8F8E003C20
+:10786000240C00282404000391CD001031A800FF4F
+:10787000550C0001240400010E00004A0000000025
+:1078800010400004240400830A000A6D8F92003C1B
+:10789000240400833C05080024A557E80E000705D2
+:1078A000000000008F92003C0013382B0A0007EF05
+:1078B000AF87004C0A0009D6240200128E4400084B
+:1078C0000E0006E1000000000A0009E2AE02000816
+:1078D0003C05080024A557E80E0006D524040087BF
+:1078E0008F92003C0A0009FF0013102B24040004AF
+:1078F0000E0005D624050030144000170040382142
+:107900008F92003C0A000A52240600833C050800BE
+:1079100024A557E80A000B37240400878E4400048E
+:107920000E0006E1000000000A000A73AE02000823
+:107930003C05080024A557E80E0007242404008213
+:107940008F92003C0A0009FF000010218C83442C18
+:107950000A000B163C046C628F92003C3C088008C5
+:107960003C0C8000240B0050240A0001AD82002052
+:10797000A10B0000A10A000192490004A10900180E
+:1079800092440005A1040019924300063C0408003B
+:107990002484576CA103001A924200073C0308009C
+:1079A00024635768A102001B92450008A105001C32
+:1079B00092460009A106001D925F000AA11F001E49
+:1079C0009259000BA119001F9258000CA118002019
+:1079D0009251000DA11100219250000EA110002221
+:1079E000924F000FA10F0023924E0010A10E002411
+:1079F000924D0011A10D0025964C0014A50C0028F5
+:107A0000964B00168F8A00548F98005CA50B002AB5
+:107A100096490018000A10C025450001A509002C50
+:107A20008E46001C0044C8210043F82130A5000FF9
+:107A3000AFE60000AF27000010B80003AF85005488
+:107A40000A000A520000302124AD000131A8000FC5
+:107A5000000030210A000A52AF88005C3C07080091
+:107A600024E7576800879021ACC000000000302157
+:107A70000A000A22AE4000003C0482013C03600080
+:107A800034820E02AC603D68AF80007C03E00008E9
+:107A9000AC623D6C27BDFFE8AFB000103090FFFF37
+:107AA000001018422C620041AFBF001414400002C5
+:107AB00024040080240300403C010800AC30006036
+:107AC0003C010800AC2300640E000E100060282169
+:107AD000244802BF2409FF800109282400103980AE
+:107AE000001030408FBF00148FB0001000A720217D
+:107AF00000861821AF8300643C010800AC250058C3
+:107B00003C010800AC24005C03E0000827BD00181D
+:107B1000308300FF30C6FFFF30E400FF3C088000E8
+:107B20008D0201B80440FFFE0003540001443825D3
+:107B30003C09600000E920253C031000AD050180F0
+:107B4000AD060184AD04018803E00008AD0301B86F
+:107B50008F86003C3C096012352700108CCB000456
+:107B60003C0C600E35850010316A00062D4800017E
+:107B7000ACE800C48CC40004ACA431808CC2000802
+:107B800094C30002ACA2318403E00008A783007410
+:107B90008F85003C8F87FF408F86FF488CAE0004A6
+:107BA0003C0F601235E80010ACEE00688CAD0008A8
+:107BB000ACED006C8CAC0010ACCC004C8CAB000C71
+:107BC000ACCB004894CA00543C0208008C420044EC
+:107BD00025490001A4C9005494C400543083FFFF18
+:107BE00010620017000000003C0208008C420040B8
+:107BF000A4C200528CA30018ACE300308CA2001485
+:107C0000ACE2002C8CB90018ACF900388CB8001428
+:107C100024050001ACF800348D0600BC50C50019E5
+:107C20008D0200B48D0200B8A4E2004894E400483C
+:107C3000A4E4004A94E800DA03E000083102FFFF00
+:107C40003C0208008C420024A4C00054A4C200528C
+:107C50008CA30018ACE300308CA20014ACE2002C22
+:107C60008CB90018ACF900388CB800142405000158
+:107C7000ACF800348D0600BC54C5FFEB8D0200B893
+:107C80008D0200B4A4E2004894E40048A4E4004A51
+:107C900094E800DA03E000083102FFFF8F86003C21
+:107CA0003C0480008CC900088CC80008000929C069
+:107CB000000839C0AC87002090C300073062000480
+:107CC0001040003AAF85007890CB0007316A000879
+:107CD000114000398F87FF448CCD000C8CCE0014EE
+:107CE00001AE602B11800032000000008CC2000C3D
+:107CF000ACE200708CCB00188F85FF408F88FF4866
+:107D0000ACEB00748CCA00102402FFF8ACAA00C8C7
+:107D10008CC9000CAD0900608CC4001CACA400C070
+:107D200090E3007C0062C824A0F9007C90D8000792
+:107D3000330F000811E000040000000090ED007C0B
+:107D400035AC0001A0EC007C90CF000731EE0001C3
+:107D500011C000090000000090E4007C241800021B
+:107D600034820002A0E2007C90A300EC307900FF96
+:107D7000133800132408003490C90007312600028C
+:107D800010C000040000000090EB007C356A000485
+:107D9000A0EA007C90ED007D31AC003FA0EC007DBE
+:107DA00094A700DA03E0000830E2FFFF8F87FF446A
+:107DB0000A000C4C8CC200140A000C4DACE00070A0
+:107DC0000A000C6EACA800CC8F8C003C27BDFFD8FD
+:107DD000AFB3001CAFB20018AFB00010AFBF0020AF
+:107DE000AFB10014918F00153C13600E3673001074
+:107DF00031EB000FA38B00808D8F00048D8B00086A
+:107E0000959F0012959900109584001A9598001E70
+:107E1000958E001C33EDFFFF332AFFFF3089FFFFF3
+:107E20003308FFFF31C7FFFF3C010800AC2D0024E1
+:107E30003C010800AC2900443C010800AC2A004089
+:107E4000AE683178AE67317C91850015959100164A
+:107E50003C1260123652001030A200FF3230FFFF99
+:107E6000AE623188AE5000B491830014959F001823
+:107E7000240600010066C80433F8FFFFAE5900B8BD
+:107E8000AE5800BC918E0014AF8F00683C086006AD
+:107E900031CD00FFAE4D00C0918A00159584000ED3
+:107EA0003C07600A314900FFAF8B006C3084FFFF54
+:107EB000AE4900C8351100100E000BB534F00410A7
+:107EC0003C0208008C4200603C0308008C630064A4
+:107ED0003C0608008CC600583C0508008CA5005CD8
+:107EE0008F8400648FBF0020AE23004CAE65319CB0
+:107EF000AE030054AE4500DCAE6231A0AE6331A4E7
+:107F0000AE663198AE2200488FB3001CAE0200501E
+:107F10008FB10014AE4200E0AE4300E4AE4600D89C
+:107F20008FB000108FB200180A0004BE27BD0028D1
+:107F3000978500769783006027BDFFE8AFB00010FB
+:107F400000A3102BAFBF0014240400058F90003C49
+:107F500010400055240900020E0005D68F850064EC
+:107F6000AF820078240400031040004F240900026F
+:107F70003C0680000E00004AACC20020240700012D
+:107F8000240820001040004D24040005978E007640
+:107F90008F8AFF442409005025C50001A78500767B
+:107FA000A14900003C0D08008DAD00642403800051
+:107FB0008F84FF40000D6600AD4C0018A540000600
+:107FC000954B000A8F85FF482402FF80016330240F
+:107FD000A546000A915F000A0000482103E2C82577
+:107FE000A159000AA0A00008A140004CA08000C533
+:107FF00096180002978300743C020004A49800DAEB
+:10800000960F00022418FFBF25EE2401A48E00AEB7
+:108010008E0D0004ACAD00448E0C0008ACAC0040EA
+:10802000A4A00050A4A000548E0B000C240C00301F
+:10803000AC8B00288E060010AC860024A480003E85
+:10804000A487004EA4870050A483003CAD42007476
+:10805000AC8800C8ACA80060A08700EC909F00C46A
+:1080600033F9007FA09900C4909000C402187824CE
+:10807000A08F00C4914E007C35CD0001A14D007C45
+:10808000938B0080AD480070AC8C00CCA08B00C6F8
+:108090008F88006C8F870068AC8800B4AC8700B80C
+:1080A000A5400078A540007A8FBF00148FB0001063
+:1080B0000120102103E0000827BD00188F850078FB
+:1080C0000E0006668F8600640A000D3A240900023D
+:1080D00027BDFFE0AFB000108F90003CAFB100149F
+:1080E000AFBF00188E0900040E00048B000921C0E8
+:1080F0008E0800048F84FF408F82FF48000839C03B
+:108100003C068000ACC70020948500DA9043001341
+:108110001460001C30B1FFFF8F8CFF44918B00086E
+:10812000316A00401540000B000000008E0D000475
+:10813000022030218FBF00188FB100148FB00010C3
+:108140002404002200003821000D29C00A000BD4AD
+:1081500027BD00200E000061000000008E0D00040D
+:10816000022030218FBF00188FB100148FB0001093
+:108170002404002200003821000D29C00A000BD47D
+:1081800027BD00200E000059000000008E0D0004E5
+:10819000022030218FBF00188FB100148FB0001063
+:1081A0002404002200003821000D29C00A000BD44D
+:1081B00027BD002027BDFFE0AFB200183092FFFFBF
+:1081C000AFB00010AFBF001CAFB100141240001ED2
+:1081D000000080218F86003C8CC50000240300062F
+:1081E00000053F020005140230E400071483001666
+:1081F000304500FF2CA80006110000400005588003
+:108200003C0C0800258C54EC016C50218D49000079
+:1082100001200008000000008F8E007C240D00016A
+:1082200011CD005024020002AF82007C260900011B
+:108230003130FFFF24C800200212202B0100302122
+:108240001480FFE5AF88003C020010218FBF001CA6
+:108250008FB200188FB100148FB0001003E0000837
+:1082600027BD00209387006254E0003400003021D5
+:108270000E000C82000000008F86003C0A000D9A60
+:10828000240200018F87007C2405000210E50031E4
+:1082900024040013000028210000302124070001DD
+:1082A0000E000BD4000000000A000D9B8F86003CDE
+:1082B0008F83007C240200021462FFF62404001263
+:1082C0000E000C37000000008F8500780040302140
+:1082D000240400120E000BD4000038210A000D9B6C
+:1082E0008F86003C8F83007C2411000310710029CD
+:1082F000241F0002107FFFCE260900012404001075
+:1083000000002821000030210A000DB824070001D8
+:108310008F91007C240600021626FFF92404001029
+:108320000E000CDC00000000144000238F98003C7D
+:108330008F86003C0A000D9A2402000324040014D6
+:108340000E000BD4000028218F86003C0A000D9AF5
+:10835000240200020E000D44000000000A000D9BE4
+:108360008F86003C0E000BE4000000002419000280
+:1083700024040014000028210000302100003821CE
+:10838000AF99007C0E000BD4000000000A000D9B8A
+:108390008F86003C0E000BF4000000008F850078F3
+:1083A000241900020040302124040010000038216C
+:1083B0000A000DF1AF99007C004038212404001020
+:1083C000970F0002000028210E000BD431E6FFFFBA
+:1083D0008F86003C0A000D9BAF91007C8F84FF4488
+:1083E0003C077FFF34E6FFFF8C8500182402000164
+:1083F00000A61824AC83001803E00008A082000542
+:108400003084FFFF30A5FFFF108000070000182117
+:108410003082000110400002000420420065182153
+:108420001480FFFB0005284003E0000800601021D5
+:1084300010C00007000000008CA2000024C6FFFF4F
+:1084400024A50004AC82000014C0FFFB24840004B7
+:1084500003E000080000000010A0000824A3FFFFB4
+:10846000AC86000000000000000000002402FFFFB6
+:108470002463FFFF1462FFFA2484000403E0000871
+:1084800000000000000411C003E000082442024084
+:1084900027BDFFE8AFB0001000808021AFBF0014FF
+:1084A0000E000E3100A0202100504821240AFF8038
+:1084B0008FBF00148FB00010012A30243127007FB5
+:1084C0003C08800A3C04210000E8102100C4282553
+:1084D0003C03800027BD0018AC650024AF8200205B
+:1084E000AC400000AC65002403E00008AC40004054
+:1084F0003C0D08008DAD005800056180240AFF8006
+:1085000001A45821016C4821012A30243127007F21
+:108510003C08800C3C04210000E8102100C4282500
+:108520003C038000AC650028AF82001C03E000081B
+:10853000AC40002430A5FFFF3C0680008CC201B88F
+:108540000440FFFE3C08601500A838253C031000DD
+:10855000ACC40180ACC00184ACC7018803E0000852
+:10856000ACC301B83C0D08008DAD0058000561801A
+:10857000240AFF8001A45821016C4021010A4824EB
+:10858000000931403107007F00C728253C04200046
+:1085900000A418253C028000AC43083003E000082A
+:1085A000AF80001C27BDFFE8AFB000100080802125
+:1085B000AFBF00140E000E3100A020210050482152
+:1085C000240BFF80012B5024000A39403128007F02
+:1085D0003C0620008FBF00148FB0001000E8282553
+:1085E00034C2000100A218253C04800027BD0018F9
+:1085F000AC83083003E00008AF8000203C05800811
+:108600008CA700603C0680080087102B14400011E6
+:108610002C8340008CA800602D0340001060000FE8
+:10862000240340008CC900600089282B14A000029C
+:10863000008018218CC3006000035A42000B308078
+:108640003C0A0800254A554000CA202103E00008E2
+:108650008C8200001460FFF32403400000035A42A0
+:10866000000B30803C0A0800254A554000CA2021F2
+:1086700003E000088C8200003C05800890A60008FA
+:108680009384009024C20001304200FF3043007FF9
+:108690001064000C00023827A0A200083C048000EF
+:1086A0008C85017804A0FFFE8F8A008824090002CF
+:1086B0003C081000AC8A0140A089014403E0000896
+:1086C000AC8801780A000EB630E2008027BDFFC8F2
+:1086D0003C05800834A40080AFBF0034AFBE00303A
+:1086E000AFB7002CAFB60028AFB50024AFB4002060
+:1086F000AFB3001CAFB20018AFB10014AFB00010A0
+:10870000948300789482007A104300CD2405FFFF03
+:108710003C1E80080080B8210A000F923C168000A1
+:10872000108A00C88FBF00348F8400883C0B08007B
+:108730008D6B005C240AFF803C07800E01644021A1
+:10874000010A4824AEC9002C96E6007A3102007F67
+:108750000047182130C57FFF000580400203A82193
+:1087600096BF00003C1908008F390058240FFF8085
+:1087700033F53FFF032488210015C1800238902182
+:10878000024F58243C0C0100016C5025324E007FF2
+:108790003C0D800C01CD9021028028210E000E346A
+:1087A000AECA00288E4800108E4900308F86002007
+:1087B0002402000201093823AE470010A0C20000C5
+:1087C00096E3005C8E4400308F9100200E000E8FE7
+:1087D0003070FFFF00022B800205C8253C1F4200BD
+:1087E000033FC025AE3800048E5100048F8700205F
+:1087F0008E4F000024080008ACF1001CACEF0018FC
+:10880000ACE0000CACE000109250000A2406000519
+:108810002405C000320E00FFA4EE0014964D00089F
+:1088200002E09821A4ED0016924C000A3C0D80084D
+:10883000318B00FFA4EB00209644000835AC01000A
+:10884000A4E40022ACE00024924A000B314900FF6E
+:10885000A4E90002A0E800018E4200308F830020CE
+:108860002408FFBFAC620008A06600308F8E002095
+:108870002403FFDF95DF003203E5C8240335C0255C
+:10888000A5D8003291D10032322F003F35F00040A0
+:10889000A1D000328F890020AD2000348D8B00C024
+:1088A000AD2B00389124003C3C0B7FFF308A007FC9
+:1088B000A12A003C8F8600203564FFFF90C7003C52
+:1088C00000E81024A0C2003C8F9900209325003CB2
+:1088D00000A3F824A33F003C8E5800348F8C002066
+:1088E000AD9800408E4F002C8E51003001F1802356
+:1088F000AD900044918E004831CD007FA18D00489D
+:108900008F8500208E4A00308CA900480144402405
+:108910000136382400E83025ACA600489242000A0F
+:10892000A0A2004C964300088F9F0020A7E3004EB2
+:108930008E5000308E4400300E0002F08FC5006073
+:1089400092F1007C0002C1400002C90003197821A5
+:10895000322E00020040282111C00003020F8021A6
+:108960000002208002048021926D007C31AC000462
+:108970001180000200057080020E80218E440030BC
+:108980008F87002024058000308B0003000B5023CC
+:108990003149000302094021ACE800349664007AB2
+:1089A0009662007A9670007A30467FFF24C30001F9
+:1089B000307F7FFF0205C824033FC025A678007AD8
+:1089C0009671007A3C1208008E520060322F7FFFB1
+:1089D00011F20028000000008F8400880E000E694C
+:1089E00002A028218F8400880E000E7902802821A1
+:1089F0000E000EAE0000000096F3007896F4007AA8
+:108A00001293000F000028213C0980083524010042
+:108A100093C80008908700C53114007F30E400FF40
+:108A20000284302B14C0FF3E268A0001938D0090F3
+:108A3000268B0001008D6021158BFF3C8F84008800
+:108A40008FBF00348FBE00308FB7002C8FB6002848
+:108A50008FB500248FB400208FB3001C8FB2001894
+:108A60008FB100148FB0001000A0102103E00008A7
+:108A700027BD0038967F007A03E5C824A679007ADE
+:108A80009278007A926E007A331100FF001179C259
+:108A9000000F9027001269C031CC007F018D28257E
+:108AA000A265007A0A000F878F8400883C0380004B
+:108AB0003084FFFF30A5FFFFAC640018AC65001CDC
+:108AC00003E000088C62001427BDFFA83C06800864
+:108AD000AFBF0054AFBE0050AFB7004CAFB60048B8
+:108AE000AFB50044AFB40040AFB3003CAFB2003804
+:108AF000AFB10034AFB0003034C80100910500C5FB
+:108B000090C700083084FFFF30A500FF30E2007FEF
+:108B10000045182AAFA40010A7A000181060009C00
+:108B2000AFA0001490CA00083149007F00A930238B
+:108B300024D4FFFF0014882B8FB300100013902B58
+:108B400002328024520000858FB400143C03800858
+:108B500094790052947E00508FB60010033EC023DB
+:108B60000018BC00001714030016FC0002C2A82A5B
+:108B700016A00002001F2C030040282100143C0016
+:108B80000007240300A4102A5440000100A0202163
+:108B90002885000914A000020080B02124160008D6
+:108BA0003C0C80088D860048001659808D88004C4A
+:108BB0003C0380003169FFFF3C0A0010012A202598
+:108BC00034700400AC660038AF90008CAC68003C98
+:108BD000AC64003000000000000000000000000055
+:108BE0000000000000000000000000000000000085
+:108BF000000000008C6E000031CD002011A0FFFDB0
+:108C00000016902A0251782411E000360000B821A5
+:108C10003C1580003C118008922200088EA40100BF
+:108C200000008821305E007F0E000E3403C0282132
+:108C30008E1F00108EA4010033F93FFF032028216E
+:108C40000E000E4CAFB9001C921800003302003F1A
+:108C50002C5300085260000D000080212405000103
+:108C6000004518043067005D14E000B18F92008C5D
+:108C7000306400021480014D8F86008C30680080C3
+:108C80005500004A96180012000080218EA40100B1
+:108C90000E000E698FA5001C8EA401000E000E7937
+:108CA00003C028211200004F3C07800826E4000181
+:108CB0008F8C008C0004BC000291A0230017BC0321
+:108CC00002F6302A0014882B259F00402412000150
+:108CD00000D1F02403E08021AF9F008C17C0FFCDAE
+:108CE000AFB200143C07800894E800508FB3001026
+:108CF0003C05800002E810213C0D0020A4E2005059
+:108D0000ACAD003094F5005094F600520277502339
+:108D10003149FFFF12D50041AFA900108CF6004C7D
+:108D2000001749808CF7004802C9F8210000202173
+:108D300003E9302B02E4602101868021ACFF004C66
+:108D4000ACF000488FB300100013902B0232802447
+:108D50001600FF7F3C0380088FB400148FBF0054BF
+:108D60008FBE00503A8200018FB7004C8FB600488A
+:108D70008FB500448FB400408FB3003C8FB20038F1
+:108D80008FB100348FB0003003E0000827BD0058D9
+:108D900090CF0008938C009031EE007F00AE6823E6
+:108DA000018D58210A000FDD2574FFFF8F84008894
+:108DB00024100001A7B800180E000E5D97A500183A
+:108DC0008EA401000E000E698FA5001C8EA4010068
+:108DD0000E000E7903C028211600FFB526E400011D
+:108DE0003C07800894E800508FB300103C058000D9
+:108DF00002E810213C0D0020A4E20050ACAD003090
+:108E000094F5005094F60052027750233149FFFF49
+:108E10000014882B16D5FFC1AFA9001094FE005492
+:108E20008CF0004433D8FFFE001878C0020F702188
+:108E3000ACAE003C8CF900448CA3003C03235823C7
+:108E4000196002EA000000008CF200402642000196
+:108E5000ACA200383C05005034A700103C03800051
+:108E6000AC670030000000000000000000000000BF
+:108E700000000000000000000000000000000000F2
+:108E8000000000008C7F000033E6002010C0FFFDD2
+:108E90003C108008960D00543C1780003C0680086A
+:108EA00031B30001001350C00157B0218EC9040036
+:108EB0003C0708008CE700443C040020ACC9004893
+:108EC0008ED50404240C0001ACD5004C10EC02D06B
+:108ED000AEE40030961800523C0508008CA5004016
+:108EE00000B87821A60F0052960E005425C3000149
+:108EF000A6030054961900543324FFFF5487FF0F34
+:108F00008FB3001030A5FFFF0E000FBBA60000546A
+:108F10003C0508008CA50024961200520045382319
+:108F20000247F023A61E00520A000FDF8FB3001085
+:108F30008F93001C3C0700808E4400283C1FFFEFED
+:108F400037F9FFFFAE6400008E420024A260000AE1
+:108F50003C0FFF9FAE6200049245002C35EEFFFFF0
+:108F60003C0C0040A265000C8E71000CA265000B49
+:108F70003C0600FF0227C0250319682401AE5824CF
+:108F8000016C5025AE6A000C8E490004AE600018DA
+:108F900034D0FFFFAE6900148E48002C8F82008809
+:108FA000A660000801102024AE6400108E51000855
+:108FB00096470012AE7100208E58000C30E33FFF40
+:108FC00000032980AE7800248E4C001400A2F82102
+:108FD00030F90001AE6C00288E4B0018001F71C2E2
+:108FE00000197B80AE6B002C8E49001C01CF6821DC
+:108FF000A66D001CAE690030964A00028E46002025
+:10900000A66A001EAE66003492430033307000043E
+:1090100056000006924B00003C06800834D0010048
+:109020008E0800C0AE680030924B00008F8A00208E
+:10903000A14B0030924900333123000250600007F9
+:10904000924400018F8C0020240FFF80918E00300D
+:1090500001CF6825A18D0030924400018F8200204D
+:109060002418FFBF240AFFDFA04400318F9900209D
+:109070003C088008350400809331003C323F007F7B
+:10908000A33F003C8F8D002091AF003C01F870247D
+:10909000A1AE003C8F8700208E6C001490E3003C52
+:1090A0002D8B0001000B4940006A302400C9802547
+:1090B000A0F0003C964500128F870020A4E5003206
+:1090C0008E450004909F007C30A20003000288239C
+:1090D0003239000300B9102133F8000217000002F2
+:1090E00024440034244400303C038008346600806B
+:1090F00090C9007C00A980243208000415000002F9
+:1091000024830004008018218F840020240800029A
+:10911000ACE30034A08800009242003F8F9F002003
+:109120003C188008370F0080A3E200018F910020D7
+:109130009259003F8E440004A639000295EE005C6F
+:109140000E000E8F31D0FFFF00026B80020D5825FC
+:109150003C0C4200016C2825AE2500048E4A0038E4
+:109160008F850020ACAA00188E470034ACA7001CE5
+:10917000ACA0000CACA00010A4A00014A4A0001689
+:10918000A4A00020A4A00022ACA000248E620014A1
+:109190005040000124020001ACA200080E000EAEF7
+:1091A000241100010A0010332410000190D30001A3
+:1091B000327200201240018A241000013C0A80080B
+:1091C0003547008090E3007C8F93001CAFA0002403
+:1091D0003069000111200011AFB000203C0580086B
+:1091E0008CCB00148CAC0060016C882B1620000323
+:1091F000016028213C1080088E0500603C0F80082B
+:1092000035E300808C6E007000AE682B15A0000264
+:1092100000A020218C640070AFA400248F82FF4C3A
+:109220008CC400148C5900700099C02B53000001AD
+:109230008C4400708FA200240082F82313E0000306
+:10924000AFBF002824040002AFA400208FB200208A
+:109250000292402B1500015B000018218CC50038DC
+:109260008E6B000C3C0C0080AE6500008CC9003495
+:109270003C11FF9F016C5025AE69000490C8003F6F
+:109280003623FFFF014310243C1200203C04FFEF73
+:10929000A268000B00523825349FFFFF00FFC02456
+:1092A0003C1900088F87008C03197825AE6F000CDD
+:1092B0008CED0014AE6000188FB10024AE6D001468
+:1092C0008CF000188FAE0028AE70001C8CE50008F2
+:1092D000022E6021AE6500248CEB000CA6600038E5
+:1092E000A660003AAE6C002CAE600028AE6B002089
+:1092F0008CEA00148FA30028015148230123302356
+:1093000010C00011AE66001090E9003D8E620004AE
+:109310008E7F00000009910000527821000020217A
+:1093200001F2C82B03E4C02103197021AE6F0004C1
+:10933000AE6E000090ED003DA26D000A8F90008C93
+:1093400096060006A66600088F98002024190002E1
+:109350003C0F80088FA4002435EE0080A319000084
+:1093600095CD005C8F9200200E000E8F31B0FFFF74
+:1093700000022B80020560253C0642008F85008C90
+:1093800001865825AE4B00048F8400208CB1003834
+:10939000AC9100188CA30034AC83001CAC80000C92
+:1093A000AC800010A4800014A4800016A4800020CB
+:1093B000A4800022AC80002490AA003F8FA7002444
+:1093C000A48A000210E0000C240900018FBF0028CD
+:1093D00053E0018890A2003D90A2003E2448000185
+:1093E000A08800018F8500208FA40024ACA4000871
+:1093F0000A0012133C118008A08900018F8500200B
+:1094000024020001ACA200083C1180083623008031
+:10941000906A007C3147000214E000022406003408
+:10942000240600308F8D008C3C0F800835EE0080C4
+:1094300091AC000091C8007C8FB00024A0AC00303B
+:109440008F91008C8F8200208FAA00249227000128
+:1094500032120003240B0004A047003101721823CC
+:109460008F84008C8F8B0020241FC00094980012E2
+:109470009579003230690003330F3FFF033F7024BA
+:1094800001CF6825A56D00329165003200CA3021F8
+:1094900000C9302130B0003F360C0040A16C0032D2
+:1094A0008FB2002431070004124000028F85002093
+:1094B00000C730213C048008ACA600343488010089
+:1094C0008D1900C08FBF0024240DFFBFACB9003838
+:1094D00090AF003C2FF800012412FFDF31EE007F37
+:1094E000A0AE003C8F8B0020001889409170003C9A
+:1094F000020D6024A16C003C8F87002090E3003CAB
+:109500000072502401511025A0E2003C8F88008C8D
+:109510008F9900208D090020AF2900408D0600247E
+:10952000AF2600448D040028AF2400488D1F002C76
+:10953000AF3F004C0E000EAE000000008FB80020C0
+:10954000240500025705009F8FA300203C1F8000C8
+:109550003C1280088FE40100925800088F92FF4C63
+:109560000E000E343305007F8F8E00208FAF002059
+:109570008FA40028A1CF00009659005C8F91002095
+:109580000E000E8F3330FFFF00025B80020B682558
+:109590003C0842008F8B008C01A83025AE260004C9
+:1095A0008D7000388F8600200000282100051100F2
+:1095B000ACD000188D6C00343C047FFF3488FFFF72
+:1095C000ACCC001C9171003E8CCA001C8CDF0018D2
+:1095D0000011390000111F02014770210043482586
+:1095E00001C7C02B03E9782101F8C821ACCE001CCB
+:1095F000ACD90018ACC0000CACC00010916D003E9E
+:109600008FAA002824070005A4CD0014957000043B
+:109610002418C0000148C824A4D00016916C003E54
+:1096200001402021A4CC002095650004A4C500229F
+:10963000ACC000249163003FA4C300029171003DBF
+:1096400026220001A0C200018F8900203C02800870
+:1096500034460100AD2A0008A12700308F91002078
+:109660008F9F008C2402FF80962F003297EE00120D
+:10967000030F802431CD3FFF020D6025A62C003260
+:10968000922500322418FFBF2410FFDF30AB003FCB
+:1096900035630040A22300328F9F00202403FFFF88
+:1096A000AFE000348CCA00C0AFEA003893E7003C5A
+:1096B00030E9007FA3E9003C8F8D00203C09800049
+:1096C00091AF003C01F87024A1AE003C8F8B0020CC
+:1096D000916C003C01902824A165003C8F870020FC
+:1096E000ACE300408FB100243C038008ACF100449F
+:1096F00090EA004801423025A0E600488F90002003
+:109700008F8E008C8E1F004803E9C0240319782532
+:10971000AE0F004891CD003EA20D004C8F8C008C06
+:109720008F8B002095850004A565004E0E0002F089
+:109730008C650060924A007C004028218FA600289A
+:109740000002114000058900005138213149000212
+:109750001120000300C71821000520800064182193
+:109760003C028008344A00809147007C30E90004C4
+:10977000112000038FB9002800056080006C1821BB
+:10978000240B00048F91002033300003017040232C
+:10979000310D0003006D3021AE2600343C038008FB
+:1097A000A66500383C0580008CA401009073000879
+:1097B0000E000E793265007F0E000EAE0000000034
+:1097C0008FA300200003782B000F80230290A02499
+:1097D00000608021006088210A0010330010802B77
+:1097E0008F91001C8CD8003824190003A620000893
+:1097F000AE3800008CCF0034A220000A8F8E008C7F
+:10980000AE2F00043C05008091CB003FA239000C34
+:109810008E28000C3C0DFF9FA22B000B010510258C
+:1098200035A3FFFF3C13FFEF8F8E008C00433824DD
+:10983000366AFFFF00EA4824AE29000C8DC40014EC
+:1098400095D800128F860088AE2400108DCC0014AD
+:10985000AE200018AE200020AE2C0014AE20002454
+:109860008DDF0018330C3FFF000C9180AE3F0028C5
+:109870008DCF00080246C821330B0001AE2F003007
+:109880008DC3000C8F930020001941C2000B2B8068
+:1098900001056821240200023C0A8008A62D001C54
+:1098A000A6200034AE23002C35470080A2620000C1
+:1098B00094E9005C8F9900203C044200313FFFFF97
+:1098C00003E43025AF2600048F98008C240E00019D
+:1098D0002402C0008F12003824060034AF32001872
+:1098E0008F0F00343C12800836580080AF2F001CC8
+:1098F000AF20000CAF200010A7200014A7200016F6
+:10990000A7200020A7200022AF200024A7300002BB
+:10991000A32E00018F8D00208F8B008CADB000082E
+:1099200091680000A1A800308F91008C8F830020E7
+:1099300092250001A06500318F9F002097F300322F
+:1099400002625024014C3825A7E7003293E9003227
+:109950003124003FA3E40032930F007C31EE00027B
+:1099600015C000028F840020240600303C0E8008C1
+:10997000AC86003435D101008E3900C02403FFBF0E
+:1099800002008821AC990038908B003C0010802B9D
+:109990003165007FA085003C8F8D002091A8003CA0
+:1099A00001031024A1A2003C8F87002090F3003C0B
+:1099B000366A0020A0EA003C8F9F008C8F92002026
+:1099C0008FE90020AE4900408FE40024AE440044FB
+:1099D0008FEC0028AE4C00488FE6002C0E000EAE37
+:1099E000AE46004C0A001033000000000A0010A42C
+:1099F0008CE2004024480001A08800018F850020EF
+:109A00008FA40024ACA400080A0012133C118008A3
+:109A100094CB00523C0808008D080024010B102153
+:109A2000A4C200520A000FDF8FB3001027BDFFE071
+:109A30003C0D8008AFB20018AFB00010AFBF001CE3
+:109A4000AFB1001435B200808E4C001835A801006B
+:109A5000964B000695A70050910900EC000C5602A9
+:109A6000016728233143007F312600FF24020003D1
+:109A7000A3830090AF84008810C2001B30B0FFFFAA
+:109A8000910600EC2412000530C200FF1052003392
+:109A900000000000160000098FBF001C8FB20018E4
+:109AA0008FB100148FB00010240D0C003C0C80000E
+:109AB00027BD002003E00008AD8D00240E000FC27A
+:109AC000020020218FBF001C8FB200188FB100143C
+:109AD0008FB00010240D0C003C0C800027BD00202E
+:109AE00003E00008AD8D0024965800789651007A66
+:109AF000924E007D0238782631E8FFFF31C400C065
+:109B0000148000092D11000116000037000000002C
+:109B10005620FFE28FBF001C0E000EC300000000A5
+:109B20000A0013B78FBF001C1620FFDA00000000E8
+:109B30000E000EC3000000001440FFD88FBF001CB1
+:109B40001600002200000000925F007D33E2003F1B
+:109B5000A242007D0A0013B78FBF001C950900DAEE
+:109B60008F86006400802821240400050E0006660C
+:109B70003130FFFF978300763C0480002465FFFFAF
+:109B8000A78500768C8A01B80540FFFE0000000022
+:109B9000AC8001808FBF001CAC9001848FB2001894
+:109BA0008FB100148FB000103C0760133C0B100005
+:109BB000240D0C003C0C800027BD0020AC870188E0
+:109BC000AC8B01B803E00008AD8D00240E000FC27D
+:109BD000020020215040FFB18FBF001C925F007D2A
+:109BE0000A0013E433E2003F0E000FC202002021FE
+:109BF0001440FFAA8FBF001C1220000700000000C5
+:109C00009259007D3330003F36020040A242007D71
+:109C10000A0013B78FBF001C0E000EC30000000027
+:109C20005040FF9E8FBF001C9259007D3330003F93
+:109C30000A00141336020040000411C003E00008BB
+:109C4000244202403C050006008510253C038000AC
+:109C5000AC620030000000000000000000000000C6
+:109C60003C0580008CA7000030E6001010C0FFFD0E
+:109C7000000000008CAB003C8CAA003C0164482131
+:109C8000012A402B110000043C0680008CAD0038F6
+:109C900025AC0001ACAC00388CCF003C01E4702155
+:109CA00003E00008ACCE003C27BDFFD0AFB20018E7
+:109CB000AFB00010AFBF0028AFB50024AFB4002094
+:109CC000AFB3001CAFB1001400A0902114A000128B
+:109CD000008080218F8200240002188014600037E9
+:109CE000240400100E001421000000008FBF002883
+:109CF0008FB500248FB400208FB3001C8FB20018E2
+:109D00008FB100148FB000100000102127BD00306B
+:109D100003E00008AF80002410A0001E000088218E
+:109D20003C138000241400200A0014603C15000538
+:109D3000263100040232502B11400017024010213E
+:109D40008F8800248E0700002404008000084880CB
+:109D50000133182125060001AC6704002610000419
+:109D600014D4FFF3AF8600240E001421000000007D
+:109D7000AE75003000000000000000000000000090
+:109D800000000000263100040232502B1540FFEC89
+:109D9000AF800024024010218FBF00288FB500241F
+:109DA0008FB400208FB3001C8FB200188FB1001445
+:109DB0008FB0001003E0000827BD0030000320230F
+:109DC0003085000F0A0014490065202127BDFFD807
+:109DD0003C03800000A03821AC670038AFB100140C
+:109DE000AC66003C008088213C060022AC66003056
+:109DF000AFB00010AC7100283C10800C3C04800C0B
+:109E000024050070AFBF0024AFB40020AFB3001C26
+:109E10000E00143AAFB20018260400800E00143A67
+:109E200024050080260401000E00143A240500F0E9
+:109E30003C0208008C4200641040001300008021A6
+:109E40003C1480002413FF803C12800C0E00141E72
+:109E50000200202100514821312A007F0133402493
+:109E60000152202124050050AE8800280E00143A2B
+:109E7000261000013C0508008CA500640205202B7B
+:109E80001480FFF2000000003C0608008CC6006051
+:109E900010C00015000080213C1480002413FF80B6
+:109EA0003C12800C3C1908008F3900580010C1800A
+:109EB000240500400331782101F8682131AE007F8C
+:109EC00001B3602401D22021AE8C00280E00143A88
+:109ED000261000013C0608008CC600600206582BC4
+:109EE0001560FFF0000000003C1008008E10005CC0
+:109EF0002414FF803C1F800C0211982102749024CE
+:109F00003262007F3C118000005F2021AE320028C9
+:109F10000E00143A000628408FBF00248FB40020A2
+:109F20008FB3001C8FB200188FB100148FB00010D7
+:109F300000002021000028210A00143A27BD002833
+:109F40008F83003C8C62000410400003000000007E
+:109F500003E00008000000008C6400108C6500081D
+:089F60000A0014838C66000C5A
+:089F6800000000000000001BD6
+:109F70000000000F0000000A0000000800000006BA
+:109F800000000005000000050000000400000004BF
+:109F900000000003000000030000000300000003B5
+:109FA00000000003000000020000000200000002A8
+:109FB0000000000200000002000000020000000299
+:109FC0000000000200000002000000020000000289
+:109FD0000000000200000002000000020000000279
+:0C9FE00000000001000000010000000172
+:049FEC0080080100E8
+:109FF0008008008080080000080017900800179073
+:10A00000080017C8080017C8080017DC080017ACBC
+:10A0100008001A04080019D008001A5C08001A5C2D
+:10A0200008001AE408001A148008024008002154AD
+:10A0300008001FA00800217C0800221408002364E7
+:10A04000080023B0080024D4080023DC08002460A2
+:10A0500008002010080029880800292C08001FBCCF
+:10A0600008001FBC08001FBC080025480800254840
+:10A0700008001FBC08001FBC0800280408001FBC03
+:10A0800008001FBC08001FBC08001FBC0800286493
+:10A0900008001FBC08001FBC08001FBC08001FBC34
+:10A0A00008001FBC08001FBC08001FBC08001FBC24
+:10A0B00008001FBC08001FBC08001FBC08001FBC14
+:10A0C00008001FBC08001FBC080023D008001FBCEC
+:10A0D00008001FBC080028D408001FBC08001FBCD3
+:10A0E00008001FBC08001FBC08001FBC08001FBCE4
+:10A0F00008001FBC08001FBC08001FBC08001FBCD4
+:10A1000008001FBC08001FBC08001FBC08001FBCC3
+:10A1100008001FBC08001FBC08001FBC080027283F
+:10A1200008001FBC08001FBC08002690080025EC92
+:10A130000800375008003724080036F0080036C4FD
+:10A14000080036A408003658800801008008008006
+:08A15000800800008008008077
+:08A158000A000C760000000073
+:10A16000000000000000000D727870342E362E3191
+:10A17000360000000406100300000000000000018B
+:10A1800000000000000000000000000000000000CF
+:10A1900000000000000000000000000000000000BF
+:10A1A00000000000000000000000000000000000AF
+:10A1B000000000000000000000000000000000009F
+:10A1C000000000000000000000000000000000008F
+:10A1D000000000000000000000000000000000007F
+:10A1E000000000000000000000000000000000006F
+:10A1F000000000000000000000000000000000005F
+:10A20000000000000000000000000000000000004E
+:10A21000000000000000000000000000000000003E
+:10A22000000000000000000000000000000000002E
+:10A23000000000000000000000000000000000001E
+:10A24000000000000000000000000000000000000E
+:10A2500000000000000000000000000000000000FE
+:10A2600000000000000000000000000000000000EE
+:10A2700000000000000000000000000000000000DE
+:10A2800000000000000000000000000000000000CE
+:10A2900000000000000000000000000000000000BE
+:10A2A00000000000000000000000000000000000AE
+:10A2B000000000000000000000000000000000009E
+:10A2C000000000000000000000000000000000008E
+:10A2D000000000000000000000000000000000007E
+:10A2E000000000000000000000000000000000006E
+:10A2F000000000000000000000000000000000005E
+:10A30000000000000000000000000000000000004D
+:10A31000000000000000000000000000000000003D
+:10A32000000000000000000000000000000000002D
+:10A33000000000000000000000000000000000001D
+:10A34000000000000000000000000000000000000D
+:10A3500000000000000000000000000000000000FD
+:10A3600000000000000000000000000000000000ED
+:10A3700000000000000000000000000000000000DD
+:10A3800000000000000000000000000000000000CD
+:10A3900000000000000000000000000000000000BD
+:10A3A00000000000000000000000000000000000AD
+:10A3B000000000000000000000000000000000009D
+:10A3C000000000000000000000000000000000008D
+:10A3D000000000000000000000000000000000007D
+:10A3E000000000000000000000000000000000006D
+:10A3F000000000000000000000000000000000005D
+:10A40000000000000000000000000000000000004C
+:10A41000000000000000000000000000000000003C
+:10A42000000000000000000000000000000000002C
+:10A43000000000000000000000000000000000001C
+:10A44000000000000000000000000000000000000C
+:10A4500000000000000000000000000000000000FC
+:10A4600000000000000000000000000000000000EC
+:10A4700000000000000000000000000000000000DC
+:10A4800000000000000000000000000000000000CC
+:10A4900000000000000000000000000000000000BC
+:10A4A00000000000000000000000000000000000AC
+:10A4B000000000000000000000000000000000009C
+:10A4C000000000000000000000000000000000008C
+:10A4D000000000000000000000000000000000007C
+:10A4E000000000000000000000000000000000006C
+:10A4F000000000000000000000000000000000005C
+:10A50000000000000000000000000000000000004B
+:10A51000000000000000000000000000000000003B
+:10A52000000000000000000000000000000000002B
+:10A53000000000000000000000000000000000001B
+:10A54000000000000000000000000000000000000B
+:10A5500000000000000000000000000000000000FB
+:10A5600000000000000000000000000000000000EB
+:10A5700000000000000000000000000000000000DB
+:10A5800000000000000000000000000000000000CB
+:10A5900000000000000000000000000000000000BB
+:10A5A00000000000000000000000000000000000AB
+:10A5B000000000000000000000000000000000009B
+:10A5C000000000000000000000000000000000008B
+:10A5D000000000000000000000000000000000007B
+:10A5E000000000000000000000000000000000006B
+:10A5F000000000000000000000000000000000005B
+:10A60000000000000000000000000000000000004A
+:10A61000000000000000000000000000000000003A
+:10A62000000000000000000000000000000000002A
+:10A63000000000000000000000000000000000001A
+:10A64000000000000000000000000000000000000A
+:10A6500000000000000000000000000000000000FA
+:10A6600000000000000000000000000000000000EA
+:10A6700000000000000000000000000000000000DA
+:10A6800000000000000000000000000000000000CA
+:10A6900000000000000000000000000000000000BA
+:10A6A00000000000000000000000000000000000AA
+:10A6B000000000000000000000000000000000009A
+:10A6C000000000000000000000000000000000008A
+:10A6D000000000000000000000000000000000007A
+:10A6E000000000000000000000000000000000006A
+:10A6F000000000000000000000000000000000005A
+:10A700000000000000000000000000000000000049
+:10A710000000000000000000000000000000000039
+:10A720000000000000000000000000000000000029
+:10A730000000000000000000000000000000000019
+:10A740000000000000000000000000000000000009
+:10A7500000000000000000000000000000000000F9
+:10A7600000000000000000000000000000000000E9
+:10A7700000000000000000000000000000000000D9
+:10A7800000000000000000000000000000000000C9
+:10A7900000000000000000000000000000000000B9
+:10A7A00000000000000000000000000000000000A9
+:10A7B0000000000000000000000000000000000099
+:10A7C0000000000000000000000000000000000089
+:10A7D0000000000000000000000000000000000079
+:10A7E0000000000000000000000000000000000069
+:10A7F0000000000000000000000000000000000059
+:10A800000000000000000000000000000000000048
+:10A810000000000000000000000000000000000038
+:10A820000000000000000000000000000000000028
+:10A830000000000000000000000000000000000018
+:10A840000000000000000000000000000000000008
+:10A8500000000000000000000000000000000000F8
+:10A8600000000000000000000000000000000000E8
+:10A8700000000000000000000000000000000000D8
+:10A8800000000000000000000000000000000000C8
+:10A8900000000000000000000000000000000000B8
+:10A8A00000000000000000000000000000000000A8
+:10A8B0000000000000000000000000000000000098
+:10A8C0000000000000000000000000000000000088
+:10A8D0000000000000000000000000000000000078
+:10A8E0000000000000000000000000000000000068
+:10A8F0000000000000000000000000000000000058
+:10A900000000000000000000000000000000000047
+:10A910000000000000000000000000000000000037
+:10A920000000000000000000000000000000000027
+:10A930000000000000000000000000000000000017
+:10A940000000000000000000000000000000000007
+:10A9500000000000000000000000000000000000F7
+:10A9600000000000000000000000000000000000E7
+:10A9700000000000000000000000000000000000D7
+:10A9800000000000000000000000000000000000C7
+:10A9900000000000000000000000000000000000B7
+:10A9A00000000000000000000000000000000000A7
+:10A9B0000000000000000000000000000000000097
+:10A9C0000000000000000000000000000000000087
+:10A9D0000000000000000000000000000000000077
+:10A9E0000000000000000000000000000000000067
+:10A9F0000000000000000000000000000000000057
+:10AA00000000000000000000000000000000000046
+:10AA10000000000000000000000000000000000036
+:10AA20000000000000000000000000000000000026
+:10AA30000000000000000000000000000000000016
+:10AA40000000000000000000000000000000000006
+:10AA500000000000000000000000000000000000F6
+:10AA600000000000000000000000000000000000E6
+:10AA700000000000000000000000000000000000D6
+:10AA800000000000000000000000000000000000C6
+:10AA900000000000000000000000000000000000B6
+:10AAA00000000000000000000000000000000000A6
+:10AAB0000000000000000000000000000000000096
+:10AAC0000000000000000000000000000000000086
+:10AAD0000000000000000000000000000000000076
+:10AAE0000000000000000000000000000000000066
+:10AAF0000000000000000000000000000000000056
+:10AB00000000000000000000000000000000000045
+:10AB10000000000000000000000000000000000035
+:10AB20000000000000000000000000000000000025
+:10AB30000000000000000000000000000000000015
+:10AB40000000000000000000000000000000000005
+:10AB500000000000000000000000000000000000F5
+:10AB600000000000000000000000000000000000E5
+:10AB700000000000000000000000000000000000D5
+:10AB800000000000000000000000000000000000C5
+:10AB900000000000000000000000000000000000B5
+:10ABA00000000000000000000000000000000000A5
+:10ABB0000000000000000000000000000000000095
+:10ABC0000000000000000000000000000000000085
+:10ABD0000000000000000000000000000000000075
+:10ABE0000000000000000000000000000000000065
+:10ABF0000000000000000000000000000000000055
+:10AC00000000000000000000000000000000000044
+:10AC10000000000000000000000000000000000034
+:10AC20000000000000000000000000000000000024
+:10AC30000000000000000000000000000000000014
+:10AC40000000000000000000000000000000000004
+:10AC500000000000000000000000000000000000F4
+:10AC600000000000000000000000000000000000E4
+:10AC700000000000000000000000000000000000D4
+:10AC800000000000000000000000000000000000C4
+:10AC900000000000000000000000000000000000B4
+:10ACA00000000000000000000000000000000000A4
+:10ACB0000000000000000000000000000000000094
+:10ACC0000000000000000000000000000000000084
+:10ACD0000000000000000000000000000000000074
+:10ACE0000000000000000000000000000000000064
+:10ACF0000000000000000000000000000000000054
+:10AD00000000000000000000000000000000000043
+:10AD10000000000000000000000000000000000033
+:10AD20000000000000000000000000000000000023
+:10AD30000000000000000000000000000000000013
+:10AD40000000000000000000000000000000000003
+:10AD500000000000000000000000000000000000F3
+:10AD600000000000000000000000000000000000E3
+:10AD700000000000000000000000000000000000D3
+:10AD800000000000000000000000000000000000C3
+:10AD900000000000000000000000000000000000B3
+:10ADA00000000000000000000000000000000000A3
+:10ADB0000000000000000000000000000000000093
+:10ADC0000000000000000000000000000000000083
+:10ADD0000000000000000000000000000000000073
+:10ADE0000000000000000000000000000000000063
+:10ADF0000000000000000000000000000000000053
+:10AE00000000000000000000000000000000000042
+:10AE10000000000000000000000000000000000032
+:10AE20000000000000000000000000000000000022
+:10AE30000000000000000000000000000000000012
+:10AE40000000000000000000000000000000000002
+:10AE500000000000000000000000000000000000F2
+:10AE600000000000000000000000000000000000E2
+:10AE700000000000000000000000000000000000D2
+:10AE800000000000000000000000000000000000C2
+:10AE900000000000000000000000000000000000B2
+:10AEA00000000000000000000000000000000000A2
+:10AEB0000000000000000000000000000000000092
+:10AEC0000000000000000000000000000000000082
+:10AED0000000000000000000000000000000000072
+:10AEE0000000000000000000000000000000000062
+:10AEF0000000000000000000000000000000000052
+:10AF00000000000000000000000000000000000041
+:10AF10000000000000000000000000000000000031
+:10AF20000000000000000000000000000000000021
+:10AF30000000000000000000000000000000000011
+:10AF40000000000000000000000000000000000001
+:10AF500000000000000000000000000000000000F1
+:10AF600000000000000000000000000000000000E1
+:10AF700000000000000000000000000000000000D1
+:10AF800000000000000000000000000000000000C1
+:10AF900000000000000000000000000000000000B1
+:10AFA00000000000000000000000000000000000A1
+:10AFB0000000000000000000000000000000000091
+:10AFC0000000000000000000000000000000000081
+:10AFD0000000000000000000000000000000000071
+:10AFE0000000000000000000000000000000000061
+:10AFF0000000000000000000000000000000000051
+:10B000000000000000000000000000000000000040
+:10B010000000000000000000000000000000000030
+:10B020000000000000000000000000000000000020
+:10B030000000000000000000000000000000000010
+:10B040000000000000000000000000000000000000
+:10B0500000000000000000000000000000000000F0
+:10B0600000000000000000000000000000000000E0
+:10B0700000000000000000000000000000000000D0
+:10B0800000000000000000000000000000000000C0
+:10B0900000000000000000000000000000000000B0
+:10B0A00000000000000000000000000000000000A0
+:10B0B0000000000000000000000000000000000090
+:10B0C0000000000000000000000000000000000080
+:10B0D0000000000000000000000000000000000070
+:10B0E0000000000000000000000000000000000060
+:10B0F0000000000000000000000000000000000050
+:10B10000000000000000000000000000000000003F
+:10B11000000000000000000000000000000000002F
+:10B12000000000000000000000000000000000001F
+:10B13000000000000000000000000000000000000F
+:10B1400000000000000000000000000000000000FF
+:10B1500000000000000000000000000000000000EF
+:10B1600000000000000000000000000000000000DF
+:10B1700000000000000000000000000000000000CF
+:10B1800000000000000000000000000000000000BF
+:10B1900000000000000000000000000000000000AF
+:10B1A000000000000000000000000000000000009F
+:10B1B000000000000000000000000000000000008F
+:10B1C000000000000000000000000000000000007F
+:10B1D000000000000000000000000000000000006F
+:10B1E000000000000000000000000000000000005F
+:10B1F000000000000000000000000000000000004F
+:10B20000000000000000000000000000000000003E
+:10B21000000000000000000000000000000000002E
+:10B22000000000000000000000000000000000001E
+:10B23000000000000000000000000000000000000E
+:10B2400000000000000000000000000000000000FE
+:10B2500000000000000000000000000000000000EE
+:10B2600000000000000000000000000000000000DE
+:10B2700000000000000000000000000000000000CE
+:10B2800000000000000000000000000000000000BE
+:10B2900000000000000000000000000000000000AE
+:10B2A000000000000000000000000000000000009E
+:10B2B000000000000000000000000000000000008E
+:10B2C000000000000000000000000000000000007E
+:10B2D000000000000000000000000000000000006E
+:10B2E000000000000000000000000000000000005E
+:10B2F000000000000000000000000000000000004E
+:10B30000000000000000000000000000000000003D
+:10B31000000000000000000000000000000000002D
+:10B32000000000000000000000000000000000001D
+:10B33000000000000000000000000000000000000D
+:10B3400000000000000000000000000000000000FD
+:10B3500000000000000000000000000000000000ED
+:10B3600000000000000000000000000000000000DD
+:10B3700000000000000000000000000000000000CD
+:10B3800000000000000000000000000000000000BD
+:10B3900000000000000000000000000000000000AD
+:10B3A000000000000000000000000000000000009D
+:10B3B000000000000000000000000000000000008D
+:10B3C000000000000000000000000000000000007D
+:10B3D000000000000000000000000000000000006D
+:10B3E000000000000000000000000000000000005D
+:10B3F000000000000000000000000000000000004D
+:10B40000000000000000000000000000000000003C
+:10B41000000000000000000000000000000000002C
+:10B42000000000000000000000000000000000001C
+:10B43000000000000000000000000000000000000C
+:10B4400000000000000000000000000000000000FC
+:10B4500000000000000000000000000000000000EC
+:10B4600000000000000000000000000000000000DC
+:10B4700000000000000000000000000000000000CC
+:10B4800000000000000000000000000000000000BC
+:10B4900000000000000000000000000000000000AC
+:10B4A000000000000000000000000000000000009C
+:10B4B000000000000000000000000000000000008C
+:10B4C000000000000000000000000000000000007C
+:10B4D000000000000000000000000000000000006C
+:10B4E000000000000000000000000000000000005C
+:10B4F000000000000000000000000000000000004C
+:10B50000000000000000000000000000000000003B
+:10B51000000000000000000000000000000000002B
+:10B52000000000000000000000000000000000001B
+:10B53000000000000000000000000000000000000B
+:10B5400000000000000000000000000000000000FB
+:10B5500000000000000000000000000000000000EB
+:10B5600000000000000000000000000000000000DB
+:10B5700000000000000000000000000000000000CB
+:10B5800000000000000000000000000000000000BB
+:10B5900000000000000000000000000000000000AB
+:10B5A000000000000000000000000000000000009B
+:10B5B000000000000000000000000000000000008B
+:10B5C000000000000000000000000000000000007B
+:10B5D000000000000000000000000000000000006B
+:10B5E000000000000000000000000000000000005B
+:10B5F000000000000000000000000000000000004B
+:10B60000000000000000000000000000000000003A
+:10B61000000000000000000000000000000000002A
+:10B62000000000000000000000000000000000001A
+:10B63000000000000000000000000000000000000A
+:10B6400000000000000000000000000000000000FA
+:10B6500000000000000000000000000000000000EA
+:10B6600000000000000000000000000000000000DA
+:10B6700000000000000000000000000000000000CA
+:10B6800000000000000000000000000000000000BA
+:10B6900000000000000000000000000000000000AA
+:10B6A000000000000000000000000000000000009A
+:10B6B000000000000000000000000000000000008A
+:10B6C000000000000000000000000000000000007A
+:10B6D000000000000000000000000000000000006A
+:10B6E000000000000000000000000000000000005A
+:10B6F000000000000000000000000000000000004A
+:10B700000000000000000000000000000000000039
+:10B710000000000000000000000000000000000029
+:10B720000000000000000000000000000000000019
+:10B730000000000000000000000000000000000009
+:10B7400000000000000000000000000000000000F9
+:10B7500000000000000000000000000000000000E9
+:10B7600000000000000000000000000000000000D9
+:10B7700000000000000000000000000000000000C9
+:10B7800000000000000000000000000000000000B9
+:10B7900000000000000000000000000000000000A9
+:10B7A0000000000000000000000000000000000099
+:10B7B0000000000000000000000000000000000089
+:10B7C0000000000000000000000000000000000079
+:10B7D0000000000000000000000000000000000069
+:10B7E0000000000000000000000000000000000059
+:10B7F0000000000000000000000000000000000049
+:10B800000000000000000000000000000000000038
+:10B810000000000000000000000000000000000028
+:10B820000000000000000000000000000000000018
+:10B830000000000000000000000000000000000008
+:10B8400000000000000000000000000000000000F8
+:10B8500000000000000000000000000000000000E8
+:10B8600000000000000000000000000000000000D8
+:10B8700000000000000000000000000000000000C8
+:10B8800000000000000000000000000000000000B8
+:10B8900000000000000000000000000000000000A8
+:10B8A0000000000000000000000000000000000098
+:10B8B0000000000000000000000000000000000088
+:10B8C0000000000000000000000000000000000078
+:10B8D0000000000000000000000000000000000068
+:10B8E0000000000000000000000000000000000058
+:10B8F0000000000000000000000000000000000048
+:10B900000000000000000000000000000000000037
+:10B910000000000000000000000000000000000027
+:10B920000000000000000000000000000000000017
+:10B930000000000000000000000000000000000007
+:10B9400000000000000000000000000000000000F7
+:10B9500000000000000000000000000000000000E7
+:10B9600000000000000000000000000000000000D7
+:10B9700000000000000000000000000000000000C7
+:10B9800000000000000000000000000000000000B7
+:10B9900000000000000000000000000000000000A7
+:10B9A0000000000000000000000000000000000097
+:10B9B0000000000000000000000000000000000087
+:10B9C0000000000000000000000000000000000077
+:10B9D0000000000000000000000000000000000067
+:10B9E0000000000000000000000000000000000057
+:10B9F0000000000000000000000000000000000047
+:10BA00000000000000000000000000000000000036
+:10BA10000000000000000000000000000000000026
+:10BA20000000000000000000000000000000000016
+:10BA30000000000000000000000000000000000006
+:10BA400000000000000000000000000000000000F6
+:10BA500000000000000000000000000000000000E6
+:10BA600000000000000000000000000000000000D6
+:10BA700000000000000000000000000000000000C6
+:10BA800000000000000000000000000000000000B6
+:10BA900000000000000000000000000000000000A6
+:10BAA0000000000000000000000000000000000096
+:10BAB0000000000000000000000000000000000086
+:10BAC0000000000000000000000000000000000076
+:10BAD0000000000000000000000000000000000066
+:10BAE0000000000000000000000000000000000056
+:10BAF0000000000000000000000000000000000046
+:10BB00000000000000000000000000000000000035
+:10BB10000000000000000000000000000000000025
+:10BB20000000000000000000000000000000000015
+:10BB30000000000000000000000000000000000005
+:10BB400000000000000000000000000000000000F5
+:10BB500000000000000000000000000000000000E5
+:10BB600000000000000000000000000000000000D5
+:10BB700000000000000000000000000000000000C5
+:10BB800000000000000000000000000000000000B5
+:10BB900000000000000000000000000000000000A5
+:10BBA0000000000000000000000000000000000095
+:10BBB0000000000000000000000000000000000085
+:10BBC0000000000000000000000000000000000075
+:10BBD0000000000000000000000000000000000065
+:10BBE0000000000000000000000000000000000055
+:10BBF0000000000000000000000000000000000045
+:10BC00000000000000000000000000000000000034
+:10BC10000000000000000000000000000000000024
+:10BC20000000000000000000000000000000000014
+:10BC30000000000000000000000000000000000004
+:10BC400000000000000000000000000000000000F4
+:10BC500000000000000000000000000000000000E4
+:10BC600000000000000000000000000000000000D4
+:10BC700000000000000000000000000000000000C4
+:10BC800000000000000000000000000000000000B4
+:10BC900000000000000000000000000000000000A4
+:10BCA0000000000000000000000000000000000094
+:10BCB0000000000000000000000000000000000084
+:10BCC0000000000000000000000000000000000074
+:10BCD0000000000000000000000000000000000064
+:10BCE0000000000000000000000000000000000054
+:10BCF0000000000000000000000000000000000044
+:10BD00000000000000000000000000000000000033
+:10BD10000000000000000000000000000000000023
+:10BD20000000000000000000000000000000000013
+:10BD30000000000000000000000000000000000003
+:10BD400000000000000000000000000000000000F3
+:10BD500000000000000000000000000000000000E3
+:10BD600000000000000000000000000000000000D3
+:10BD700000000000000000000000000000000000C3
+:10BD800000000000000000000000000000000000B3
+:10BD900000000000000000000000000000000000A3
+:10BDA0000000000000000000000000000000000093
+:10BDB0000000000000000000000000000000000083
+:10BDC0000000000000000000000000000000000073
+:10BDD0000000000000000000000000000000000063
+:10BDE0000000000000000000000000000000000053
+:10BDF0000000000000000000000000000000000043
+:10BE00000000000000000000000000000000000032
+:10BE10000000000000000000000000000000000022
+:10BE20000000000000000000000000000000000012
+:10BE30000000000000000000000000000000000002
+:10BE400000000000000000000000000000000000F2
+:10BE500000000000000000000000000000000000E2
+:10BE600000000000000000000000000000000000D2
+:10BE700000000000000000000000000000000000C2
+:10BE800000000000000000000000000000000000B2
+:10BE900000000000000000000000000000000000A2
+:10BEA0000000000000000000000000000000000092
+:10BEB0000000000000000000000000000000000082
+:10BEC0000000000000000000000000000000000072
+:10BED0000000000000000000000000000000000062
+:10BEE0000000000000000000000000000000000052
+:10BEF0000000000000000000000000000000000042
+:10BF00000000000000000000000000000000000031
+:10BF10000000000000000000000000000000000021
+:10BF20000000000000000000000000000000000011
+:10BF30000000000000000000000000000000000001
+:10BF400000000000000000000000000000000000F1
+:10BF500000000000000000000000000000000000E1
+:10BF600000000000000000000000000000000000D1
+:10BF700000000000000000000000000000000000C1
+:10BF800000000000000000000000000000000000B1
+:10BF900000000000000000000000000000000000A1
+:10BFA0000000000000000000000000000000000091
+:10BFB0000000000000000000000000000000000081
+:10BFC0000000000000000000000000000000000071
+:10BFD0000000000000000000000000000000000061
+:10BFE0000000000000000000000000000000000051
+:10BFF0000000000000000000000000000000000041
+:10C000000000000000000000000000000000000030
+:10C010000000000000000000000000000000000020
+:10C020000000000000000000000000000000000010
+:10C030000000000000000000000000000000000000
+:10C0400000000000000000000000000000000000F0
+:10C0500000000000000000000000000000000000E0
+:10C0600000000000000000000000000000000000D0
+:10C0700000000000000000000000000000000000C0
+:10C0800000000000000000000000000000000000B0
+:10C0900000000000000000000000000000000000A0
+:10C0A0000000000000000000000000000000000090
+:10C0B0000000000000000000000000000000000080
+:10C0C0000000000000000000000000000000000070
+:10C0D0000000000000000000000000000000000060
+:10C0E0000000000000000000000000000000000050
+:10C0F0000000000000000000000000000000000040
+:10C10000000000000000000000000000000000002F
+:10C11000000000000000000000000000000000001F
+:10C12000000000000000000000000000000000000F
+:10C1300000000000000000000000000000000000FF
+:10C1400000000000000000000000000000000000EF
+:10C1500000000000000000000000000000000000DF
+:10C1600000000000000000000000000000000000CF
+:10C1700000000000000000000000000000000000BF
+:10C1800000000000000000000000000000000000AF
+:10C19000000000000000000000000000000000009F
+:10C1A000000000000000000000000000000000008F
+:10C1B000000000000000000000000000000000007F
+:10C1C000000000000000000000000000000000006F
+:10C1D000000000000000000000000000000000005F
+:10C1E000000000000000000000000000000000004F
+:10C1F000000000000000000000000000000000003F
+:10C20000000000000000000000000000000000002E
+:10C21000000000000000000000000000000000001E
+:10C22000000000000000000000000000000000000E
+:10C2300000000000000000000000000000000000FE
+:10C2400000000000000000000000000000000000EE
+:10C2500000000000000000000000000000000000DE
+:10C2600000000000000000000000000000000000CE
+:10C2700000000000000000000000000000000000BE
+:10C2800000000000000000000000000000000000AE
+:10C29000000000000000000000000000000000009E
+:10C2A000000000000000000000000000000000008E
+:10C2B000000000000000000000000000000000007E
+:10C2C000000000000000000000000000000000006E
+:10C2D000000000000000000000000000000000005E
+:10C2E000000000000000000000000000000000004E
+:10C2F000000000000000000000000000000000003E
+:10C30000000000000000000000000000000000002D
+:10C31000000000000000000000000000000000001D
+:10C32000000000000000000000000000000000000D
+:10C3300000000000000000000000000000000000FD
+:10C3400000000000000000000000000000000000ED
+:10C3500000000000000000000000000000000000DD
+:10C3600000000000000000000000000000000000CD
+:10C3700000000000000000000000000000000000BD
+:10C3800000000000000000000000000000000000AD
+:10C39000000000000000000000000000000000009D
+:10C3A000000000000000000000000000000000008D
+:10C3B000000000000000000000000000000000007D
+:10C3C000000000000000000000000000000000006D
+:10C3D000000000000000000000000000000000005D
+:10C3E000000000000000000000000000000000004D
+:10C3F000000000000000000000000000000000003D
+:10C40000000000000000000000000000000000002C
+:10C41000000000000000000000000000000000001C
+:10C42000000000000000000000000000000000000C
+:10C4300000000000000000000000000000000000FC
+:10C4400000000000000000000000000000000000EC
+:10C4500000000000000000000000000000000000DC
+:10C4600000000000000000000000000000000000CC
+:10C4700000000000000000000000000000000000BC
+:10C4800000000000000000000000000000000000AC
+:10C49000000000000000000000000000000000009C
+:10C4A000000000000000000000000000000000008C
+:10C4B000000000000000000000000000000000007C
+:10C4C000000000000000000000000000000000006C
+:10C4D000000000000000000000000000000000005C
+:10C4E000000000000000000000000000000000004C
+:10C4F000000000000000000000000000000000003C
+:10C50000000000000000000000000000000000002B
+:10C51000000000000000000000000000000000001B
+:10C52000000000000000000000000000000000000B
+:10C5300000000000000000000000000000000000FB
+:10C5400000000000000000000000000000000000EB
+:10C5500000000000000000000000000000000000DB
+:10C5600000000000000000000000000000000000CB
+:10C5700000000000000000000000000000000000BB
+:10C5800000000000000000000000000000000000AB
+:10C59000000000000000000000000000000000009B
+:10C5A000000000000000000000000000000000008B
+:10C5B000000000000000000000000000000000007B
+:10C5C000000000000000000000000000000000006B
+:10C5D000000000000000000000000000000000005B
+:10C5E000000000000000000000000000000000004B
+:10C5F000000000000000000000000000000000003B
+:10C60000000000000000000000000000000000002A
+:10C61000000000000000000000000000000000001A
+:10C62000000000000000000000000000000000000A
+:10C6300000000000000000000000000000000000FA
+:10C6400000000000000000000000000000000000EA
+:10C6500000000000000000000000000000000000DA
+:10C6600000000000000000000000000000000000CA
+:10C6700000000000000000000000000000000000BA
+:10C6800000000000000000000000000000000000AA
+:10C69000000000000000000000000000000000009A
+:10C6A000000000000000000000000000000000008A
+:10C6B000000000000000000000000000000000007A
+:10C6C000000000000000000000000000000000006A
+:10C6D000000000000000000000000000000000005A
+:10C6E000000000000000000000000000000000004A
+:10C6F000000000000000000000000000000000003A
+:10C700000000000000000000000000000000000029
+:10C710000000000000000000000000000000000019
+:10C720000000000000000000000000000000000009
+:10C7300000000000000000000000000000000000F9
+:10C7400000000000000000000000000000000000E9
+:10C7500000000000000000000000000000000000D9
+:10C7600000000000000000000000000000000000C9
+:10C7700000000000000000000000000000000000B9
+:10C7800000000000000000000000000000000000A9
+:10C790000000000000000000000000000000000099
+:10C7A0000000000000000000000000000000000089
+:10C7B0000000000000000000000000000000000079
+:10C7C0000000000000000000000000000000000069
+:10C7D0000000000000000000000000000000000059
+:10C7E0000000000000000000000000000000000049
+:10C7F0000000000000000000000000000000000039
+:10C800000000000000000000000000000000000028
+:10C810000000000000000000000000000000000018
+:10C820000000000000000000000000000000000008
+:10C8300000000000000000000000000000000000F8
+:10C8400000000000000000000000000000000000E8
+:10C8500000000000000000000000000000000000D8
+:10C8600000000000000000000000000000000000C8
+:10C8700000000000000000000000000000000000B8
+:10C8800000000000000000000000000000000000A8
+:10C890000000000000000000000000000000000098
+:10C8A0000000000000000000000000000000000088
+:10C8B0000000000000000000000000000000000078
+:10C8C0000000000000000000000000000000000068
+:10C8D0000000000000000000000000000000000058
+:10C8E0000000000000000000000000000000000048
+:10C8F0000000000000000000000000000000000038
+:10C900000000000000000000000000000000000027
+:10C910000000000000000000000000000000000017
+:10C920000000000000000000000000000000000007
+:10C9300000000000000000000000000000000000F7
+:10C9400000000000000000000000000000000000E7
+:10C9500000000000000000000000000000000000D7
+:10C9600000000000000000000000000000000000C7
+:10C9700000000000000000000000000000000000B7
+:10C9800000000000000000000000000000000000A7
+:10C990000000000000000000000000000000000097
+:10C9A0000000000000000000000000000000000087
+:10C9B0000000000000000000000000000000000077
+:10C9C0000000000000000000000000000000000067
+:10C9D0000000000000000000000000000000000057
+:10C9E0000000000000000000000000000000000047
+:10C9F0000000000000000000000000000000000037
+:10CA00000000000000000000000000000000000026
+:10CA10000000000000000000000000000000000016
+:10CA20000000000000000000000000000000000006
+:10CA300000000000000000000000000000000000F6
+:10CA400000000000000000000000000000000000E6
+:10CA500000000000000000000000000000000000D6
+:10CA600000000000000000000000000000000000C6
+:10CA700000000000000000000000000000000000B6
+:10CA800000000000000000000000000000000000A6
+:10CA90000000000000000000000000000000000096
+:10CAA0000000000000000000000000000000000086
+:10CAB0000000000000000000000000000000000076
+:10CAC0000000000000000000000000000000000066
+:10CAD0000000000000000000000000000000000056
+:10CAE0000000000000000000000000000000000046
+:10CAF0000000000000000000000000000000000036
+:10CB00000000000000000000000000000000000025
+:10CB10000000000000000000000000000000000015
+:10CB20000000000000000000000000000000000005
+:10CB300000000000000000000000000000000000F5
+:10CB400000000000000000000000000000000000E5
+:10CB500000000000000000000000000000000000D5
+:10CB600000000000000000000000000000000000C5
+:10CB700000000000000000000000000000000000B5
+:10CB800000000000000000000000000000000000A5
+:10CB90000000000000000000000000000000000095
+:10CBA0000000000000000000000000000000000085
+:10CBB0000000000000000000000000000000000075
+:10CBC0000000000000000000000000000000000065
+:10CBD0000000000000000000000000000000000055
+:10CBE0000000000000000000000000000000000045
+:10CBF0000000000000000000000000000000000035
+:10CC00000000000000000000000000000000000024
+:10CC10000000000000000000000000000000000014
+:10CC20000000000000000000000000000000000004
+:10CC300000000000000000000000000000000000F4
+:10CC400000000000000000000000000000000000E4
+:10CC500000000000000000000000000000000000D4
+:10CC600000000000000000000000000000000000C4
+:10CC700000000000000000000000000000000000B4
+:10CC800000000000000000000000000000000000A4
+:10CC90000000000000000000000000000000000094
+:10CCA0000000000000000000000000000000000084
+:10CCB0000000000000000000000000000000000074
+:10CCC0000000000000000000000000000000000064
+:10CCD0000000000000000000000000000000000054
+:10CCE0000000000000000000000000000000000044
+:10CCF0000000000000000000000000000000000034
+:10CD00000000000000000000000000000000000023
+:10CD10000000000000000000000000000000000013
+:10CD20000000000000000000000000000000000003
+:10CD300000000000000000000000000000000000F3
+:10CD400000000000000000000000000000000000E3
+:10CD500000000000000000000000000000000000D3
+:10CD600000000000000000000000000000000000C3
+:10CD700000000000000000000000000000000000B3
+:10CD800000000000000000000000000000000000A3
+:10CD90000000000000000000000000000000000093
+:10CDA0000000000000000000000000000000000083
+:10CDB0000000000000000000000000000000000073
+:10CDC0000000000000000000000000000000000063
+:10CDD0000000000000000000000000000000000053
+:10CDE0000000000000000000000000000000000043
+:10CDF0000000000000000000000000000000000033
+:10CE00000000000000000000000000000000000022
+:10CE10000000000000000000000000000000000012
+:10CE20000000000000000000000000000000000002
+:10CE300000000000000000000000000000000000F2
+:10CE400000000000000000000000000000000000E2
+:10CE500000000000000000000000000000000000D2
+:10CE600000000000000000000000000000000000C2
+:10CE700000000000000000000000000000000000B2
+:10CE800000000000000000000000000000000000A2
+:10CE90000000000000000000000000000000000092
+:10CEA0000000000000000000000000000000000082
+:10CEB0000000000000000000000000000000000072
+:10CEC0000000000000000000000000000000000062
+:10CED0000000000000000000000000000000000052
+:10CEE0000000000000000000000000000000000042
+:10CEF0000000000000000000000000000000000032
+:10CF00000000000000000000000000000000000021
+:10CF10000000000000000000000000000000000011
+:10CF20000000000000000000000000000000000001
+:10CF300000000000000000000000000000000000F1
+:10CF400000000000000000000000000000000000E1
+:10CF500000000000000000000000000000000000D1
+:10CF600000000000000000000000000000000000C1
+:10CF700000000000000000000000000000000000B1
+:10CF800000000000000000000000000000000000A1
+:10CF90000000000000000000000000000000000091
+:10CFA0000000000000000000000000000000000081
+:10CFB0000000000000000000000000000000000071
+:10CFC0000000000000000000000000000000000061
+:10CFD0000000000000000000000000000000000051
+:10CFE0000000000000000000000000000000000041
+:10CFF0000000000000000000000000000000000031
+:10D000000000000000000000000000000000000020
+:10D010000000000000000000000000000000000010
+:10D020000000000000000000000000000000000000
+:10D0300000000000000000000000000000000000F0
+:10D0400000000000000000000000000000000000E0
+:10D0500000000000000000000000000000000000D0
+:10D0600000000000000000000000000000000000C0
+:10D0700000000000000000000000000000000000B0
+:10D0800000000000000000000000000000000000A0
+:10D090000000000000000000000000000000000090
+:10D0A0000000000000000000000000000000000080
+:10D0B0000000000000000000000000000000000070
+:10D0C0000000000000000000000000000000000060
+:10D0D0000000000000000000000000000000000050
+:10D0E0000000000000000000000000000000000040
+:10D0F0000000000000000000000000000000000030
+:10D10000000000000000000000000000000000001F
+:10D11000000000000000000000000000000000000F
+:10D1200000000000000000000000000000000000FF
+:10D1300000000000000000000000000000000000EF
+:10D1400000000000000000000000000000000000DF
+:10D1500000000000000000000000000000000000CF
+:10D1600000000000000000000000000000000000BF
+:10D1700000000000000000000000000000000000AF
+:10D18000000000000000000000000000000000009F
+:10D19000000000000000000000000000000000008F
+:10D1A000000000000000000000000000000000007F
+:10D1B000000000000000000000000000000000006F
+:10D1C000000000000000000000000000000000005F
+:10D1D000000000000000000000000000000000004F
+:10D1E000000000000000000000000000000000003F
+:10D1F000000000000000000000000000000000002F
+:10D20000000000000000000000000000000000001E
+:10D21000000000000000000000000000000000000E
+:10D2200000000000000000000000000000000000FE
+:10D2300000000000000000000000000000000000EE
+:10D2400000000000000000000000000000000000DE
+:10D2500000000000000000000000000000000000CE
+:10D2600000000000000000000000000000000000BE
+:10D2700000000000000000000000000000000000AE
+:10D28000000000000000000000000000000000009E
+:10D29000000000000000000000000000000000008E
+:10D2A000000000000000000000000000000000007E
+:10D2B000000000000000000000000000000000006E
+:10D2C000000000000000000000000000000000005E
+:10D2D000000000000000000000000000000000004E
+:10D2E000000000000000000000000000000000003E
+:10D2F000000000000000000000000000000000002E
+:10D30000000000000000000000000000000000001D
+:10D31000000000000000000000000000000000000D
+:10D3200000000000000000000000000000000000FD
+:10D330000000000010000003000000000000000DCD
+:10D340000000000D3C02080024427A603C03080003
+:10D3500024637AD8AC4000000043202B1480FFFDEA
+:10D36000244200043C1D080037BD9FFC03A0F021AF
+:10D370003C100800261031D83C1C0800279C7A601D
+:10D380000E001253000000000000000D3C0280005F
+:10D3900030A5FFFF30C600FF344301803C08800009
+:10D3A0008D0901B80520FFFE00000000AC640000FC
+:10D3B00024040002A4650008A066000AA064000B13
+:10D3C000AC6700183C03100003E00008AD0301B88F
+:10D3D0003C0560008CA24FF80440FFFE00000000F6
+:10D3E000ACA44FC03C0310003C040200ACA44FC4EA
+:10D3F00003E00008ACA34FF827BDFFE8AFBF00145F
+:10D40000AFB000100E0012A5008080213C048008FF
+:10D410003485008090A600052403FFFE0200202131
+:10D4200000C310248FBF00148FB00010A0A200050D
+:10D430000A0012AF27BD001827BDFFE8AFB00010EB
+:10D44000AFBF00140E000ED6008080213C0680087D
+:10D4500034C5008090A4000024020050308300FFF7
+:10D46000106200073C098000020020218FBF0014D9
+:10D470008FB00010AD2001800A000FC527BD001835
+:10D48000240801003C078000020020218FBF001407
+:10D490008FB00010ACE801800A000FC527BD00184E
+:10D4A00027BDFF883C088008AFBE0070AFB600689B
+:10D4B000AFB40060AFB00050AFBF0074AFB7006C46
+:10D4C000AFB50064AFB3005CAFB20058AFB1005469
+:10D4D000350500803C0780008CF1012890A40009EC
+:10D4E000ACE0008490A60005309000FF0000A02171
+:10D4F00000061827306200010000B02114400067C8
+:10D500000000F02190A9000024050020312400FF34
+:10D5100010850016240A0050108A008D00000000BB
+:10D520003C0C08008D8C00DC258B00013C010800C0
+:10D53000AC2B00DC0E00139B000000008FBF0074BA
+:10D540008FBE00708FB7006C8FB600688FB5006417
+:10D550008FB400608FB3005C8FB200588FB100545D
+:10D560008FB0005003E0000827BD00780000000DD8
+:10D570003C158000AFA0003096A201168EB90104C0
+:10D580003C1F002036B20C00033FC0240018B82B0B
+:10D5900000173140AFA600308EAE01043053FFFFBC
+:10D5A0003C0F00400272382101CF682490F2000D38
+:10D5B00011A0004834C4004032430020146000022F
+:10D5C000348600800080302114C00094AFA6003063
+:10D5D0003C0980083525008090A8000831060040ED
+:10D5E00050C000063C088008240A0004120A00A368
+:10D5F000240B0012120B00293C088008351501008D
+:10D600003C17800096F3011A94EE000E92AF0008CA
+:10D61000324C00043275FFFF01EE6804AFAD003CF0
+:10D620008CF30004118000318CF700083503008072
+:10D63000907800083307004014E000280000000044
+:10D640008C72005002728823062000063C0680007F
+:10D650008C7F0034027FC823072200848E8200085A
+:10D660003C068000ACC00044240200018FBF00745F
+:10D670008FBE00708FB7006C8FB600688FB50064E6
+:10D680008FB400608FB3005C8FB200588FB100542C
+:10D690008FB0005003E0000827BD00780E000CB8E2
+:10D6A000000020218FBF00748FBE00708FB7006C08
+:10D6B0008FB600688FB500648FB400608FB3005CD4
+:10D6C0008FB200588FB100548FB0005003E00008B3
+:10D6D00027BD00780A000D1800C020210E00146C30
+:10D6E000026020211440FFDF3C0680003C038008DC
+:10D6F000346300808C6400340264102304400018FA
+:10D70000000000003C1408008E94310026900001B7
+:10D710003C010800AC3031000E0012A5022020218F
+:10D720003C048008349F008093FE002502202021C5
+:10D7300037C90004A3E900250E0012AF0000000065
+:10D740000E000C9E022020210A000D45240200013B
+:10D750003C14080026947AC80A000D073C15800086
+:10D760008C6800300268302318C00008240B000CBD
+:10D770003C0908008D293100325200FC0000A8212C
+:10D78000252500013C010800AC253100AFAB00307D
+:10D790008C6A003001534023190000E002A8602A7F
+:10D7A0001580FFDD0000000012A8002A02A87823DF
+:10D7B0000268982131F5FFFF3247000210E0003483
+:10D7C000325900103C13800836700080921E000809
+:10D7D00033D6004052C000D38E82000802202021A0
+:10D7E0000E0012A524120018A212000992170005BB
+:10D7F0002418FFFE0220202102F8A8240E0012AFF8
+:10D80000A215000524040039000028210E00144749
+:10D81000240600180A000D45240200019296000C0F
+:10D820003C048008349E00808FC700380016A30097
+:10D830003690008130C600FF022020210E000C8DA2
+:10D840003205F0813C068000ACC000440A000D4562
+:10D85000240200013A4E000131CD000115A0FFAEB7
+:10D86000026898210A000D97000000000040F809A6
+:10D87000240400160A000D45240200010220202184
+:10D880000E00152900E028210A000CFA8FBF007451
+:10D890001320FF733C048008348900808D230038F6
+:10D8A0008C82000402E2F8231FE0FF6E3C06800039
+:10D8B00002E3302304C200010060B821AFA80018C1
+:10D8C0003C198000AFB30010AFB5001497260120BB
+:10D8D0008D2A00309524005C8FB8003C8FAD00305D
+:10D8E0003087FFFF30DFFFFF03E87021372F400054
+:10D8F0000307282B8E82000401CF602101A5582543
+:10D90000AFA90048AFAC0020AFAA0028AFAB0030F1
+:10D91000AFAA0024AFA0002CAFB700340040F80934
+:10D9200027A400108FA8003031030002106000020D
+:10D930008FA90048325200FE912300083069004050
+:10D94000512000138FA400243C0280088C4800045E
+:10D95000111700A4240A0014325800015300000CCF
+:10D960008FA400242419000C121900C02A1F000DD6
+:10D9700013E000BA2406000E2404000A5204000139
+:10D98000241600088FA9002425240001AFA4002438
+:10D990003C188008370500808FA700148CAF00303A
+:10D9A000340CFFFF00877021ACAE0030AFAF003801
+:10D9B00090AD004E8CAB00308FA8003C01AC100441
+:10D9C00001625021ACAA00348FA6003002E8202169
+:10D9D00030C300081060000BAFA400408CB90020D9
+:10D9E0001324008F30C600FF9289000C8FA70034EB
+:10D9F00000098300360400803085F0800E000C8D15
+:10DA0000022020213C0A8008355000808E0300301F
+:10DA10008FA800380068302318C00065262F0080CA
+:10DA20003C0E08008DCE31982407FF8001E7682462
+:10DA300031EC007F3C0680003C02800431CB0010BA
+:10DA4000ACCD00901160003B0182282190B8006BA2
+:10DA5000570000393C048008241F0001A0BF006B60
+:10DA600094C5007A24B9000AA61900123C0A80085D
+:10DA70003545008090A800083110004016000004D1
+:10DA80003C038008324B00011560006B0000000071
+:10DA9000346400808C8C00208FB200401192000909
+:10DAA000346301008C6D0000026D102318400012D9
+:10DAB0008FB80040241E0001AC980020AC73000019
+:10DAC000AC77000416C0002D0000000017C000272E
+:10DAD0000000000012A00005000018218FA50030F2
+:10DAE00030B5000452A0FE9500601021240300010F
+:10DAF0000A000CF9006010218C6E000015D3FFF1B4
+:10DB0000000000008C67000402E7782305E1FFE9CC
+:10DB10008FB800400A000E5B000000000A000D985C
+:10DB2000000040210040F809240400170A000D45B8
+:10DB3000240200013C04800834900080241E00016F
+:10DB4000022020210E0012A5A61E00129209002517
+:10DB500002202021241E0001352200010E0012AFF8
+:10DB6000A20200250A000E463C0A80080E000C9E08
+:10DB7000022020210A000E5F000000000E0012A506
+:10DB8000022020213C198008373700800220202104
+:10DB90000E0012AFA2F6000902C0302124040037A3
+:10DBA0000E001447000028210A000E5D000000004E
+:10DBB0008FA6001858C0FFAE3C0A80080E0012A5C0
+:10DBC000022020219203002502202021241E000192
+:10DBD000346200040E0012AFA20200250A000E46B5
+:10DBE0003C0A8008120A00302A0B0015116000243C
+:10DBF000240D0016240C000C560CFF58325800015E
+:10DC00003C05800890AF001B2407FFBD2416000EC2
+:10DC100001E77024A0AE001B0A000E01325800017B
+:10DC20003C1F800097E5011A50A0FF6F34C600101A
+:10DC30000A000E259289000C8CB300308E960008E5
+:10DC4000240400182674000102C0F809ACB40030A6
+:10DC50008FB100300A000CF9322200041606FF4A88
+:10DC60008FA900240A000E0C241600102410000EA8
+:10DC700052D0FF44241600100A000E0B2416001682
+:10DC8000560DFF36325800013C05800890AF001B4E
+:10DC90002407FFBD2416001001E77024A0AE001B6E
+:10DCA0000A000E01325800010A000E00241600126C
+:10DCB0003C0380008C6201B80440FFFE240408008D
+:10DCC000AC6401B803E00008000000003C058008D7
+:10DCD00094A200483084FFFF1040001924840012F1
+:10DCE00094A900483C0380003128FFFF0104382A32
+:10DCF00010E0001334660180946D01208F8C0004C5
+:10DD0000240B001A31AAFFFF31834000A0CB000B87
+:10DD1000106000102544FFFE94AF004831EEFFFF75
+:10DD200001C4282B14A0000C8F98000CA4C400146C
+:10DD30008F86000C34C2000103E00008AF82000CA3
+:10DD40003C0780002404000334E2018003E0000863
+:10DD5000A044000B8F98000C2419FFFE0319102417
+:10DD600003E00008AF82000C27BDFFD8AFB400204D
+:10DD7000AFB3001CAFB20018AFB10014AFBF0024A6
+:10DD8000AFB000100080182130B3FFFF30D2FFFF8A
+:10DD900030F4FFFF3C1180008E2201B80440FFFEEA
+:10DDA00036300180AE030000024020210E000EDD5F
+:10DDB000AE2300208F86000C8F8500048F83000027
+:10DDC00030C48000A613000CA612000EA605001099
+:10DDD000AE030028A61400081080000E3C0F80003F
+:10DDE000962C0116318BFFFC256A00040151482155
+:10DDF0008D2840003107FFFF14E000072414BFFF07
+:10DE00003C0EFFFF35CD7FFF00CD3024AF86000CE8
+:10DE10003C0F80002414BFFF35F1018000D498240A
+:10DE2000A63300268DF20104AE32002C3C06100011
+:10DE3000ADE601B88FBF00248FB400208FB3001C63
+:10DE40008FB200188FB100148FB0001003E00008EB
+:10DE500027BD002827BDFFD8AFB100143C118000BA
+:10DE600000804021AFB40020AFB0001030D4FFFFDD
+:10DE70003630018002802021AE080000AE2800204C
+:10DE8000AFB3001CAFB2001830F3FFFFAFBF0024E8
+:10DE90000E000EDD30B2FFFF8F85000C8F83000473
+:10DEA0002406BFFF00A62024A612000CA614000E14
+:10DEB000A6130008A6040026A60300103C021000CA
+:10DEC000AE2201B88FBF00248FB400208FB3001C96
+:10DED0008FB200188FB100148FB0001003E000085B
+:10DEE00027BD00283C028000344501803C048000AE
+:10DEF0008C8301B80460FFFE240720002406000282
+:10DF0000A4A70008A0A6000BA4A000103C051000C8
+:10DF1000AC8501B803E00008000000003C0580006B
+:10DF200034A400708C8A000090A601128F84000433
+:10DF300027BDFFF030C300FF0003188230820100CC
+:10DF4000000038211040003924660003308740006B
+:10DF500050E0003930882000000610800045C821BC
+:10DF60008F2F40002478000400187080AFAF0000AD
+:10DF700001C568218DAC4000AFAC000494AB011624
+:10DF80003169FFFC012540218D054000AFA5000847
+:10DF90008FA9000800003021000028213C0708005C
+:10DFA00024E701000A000F9E2408000890420000A8
+:10DFB00024A500012CAD000C0062C8210019C0800E
+:10DFC000030778218DEE000011A0000600CE302658
+:10DFD00003A5102114A8FFF500051A005520FFF431
+:10DFE000904200003C048000348700703C0508002B
+:10DFF0008CA531048CE300002CA80020110000093E
+:10E00000006A3823000558803C0C0800258C310834
+:10E01000016C482124AA0001AD2700003C01080042
+:10E02000AC2A3104AF8600002407000100E0102173
+:10E0300003E0000827BD00101100FFFC000038219C
+:10E0400000066080018558218D6440002469000429
+:10E0500000093880AFA4000000E518218C6640005C
+:10E06000AFA000080A000F8EAFA600043C02080013
+:10E070008C42003827BDFFD8AFB40020AFB20018E3
+:10E08000AFBF0024AFB3001CAFB10014AFB000109D
+:10E090003C14080026940038144000022452FFFF6C
+:10E0A000000090218F85000430A340001060000F15
+:10E0B00030A980003C06002000A620241080000B20
+:10E0C0008F87000C2408BFFF00A8282434E3100029
+:10E0D000AF85000430AF200015E0000A3C110004B9
+:10E0E0002413FFBF0A000FEF0073102415200062F5
+:10E0F0003C0B002030AF200011E0FFF98F83000CB3
+:10E100003C11000400B180241200FFF62413FFBF6D
+:10E110003462004030B801001300000FAF82000CE1
+:10E120003C1F002000BFC824132000053C0A8000CB
+:10E130003C03000400A31024104000C800000000AD
+:10E140009549011E9548011C3126FFFF00083C003F
+:10E1500000C72025AF8400003C0D800095AC010C69
+:10E1600030AB1000116000083186FFFF30AE002098
+:10E1700015C00006241100053C10100000B07824E2
+:10E1800015E000733C1F0C002411000130A20100B7
+:10E19000544000093C0C00018F83001454600006B9
+:10E1A0003C0C00018F87000C30E440001080009A86
+:10E1B0003C0A1F013C0C000100AC302414C0006C70
+:10E1C0003C1080008F84000C3093400012600006E9
+:10E1D0003C0310003C190F0000B9C0241300008B51
+:10E1E0003C1F80003C03100000A310241040002CB2
+:10E1F0003C0680003C0708008CE7003014E0007308
+:10E200003088400030A6010010C000983C0E0F007E
+:10E2100000AE68243C0C020011AC00948F93000007
+:10E22000027280240214782191F4000426920004E2
+:10E23000001221C03C0E800095C6010E3627000258
+:10E2400024D400043286FFFF240500020E000F04D0
+:10E25000000000008FBF00248FB400208FB3001C8B
+:10E260008FB200188FB100148FB000100000102181
+:10E2700003E0000827BD002800AB50241140FF9E9A
+:10E2800030AF20008F8C000C3C0EFFFF35CD7FFFA0
+:10E2900000AD2824358380000A000FDFAF8500041D
+:10E2A0008CD04000320F010011E0003C30B801007A
+:10E2B0003C1008008E1000241300001432330004B8
+:10E2C0003C020F0000A2F8243C19020013F9000FD1
+:10E2D0008F83000094C9010E022038210072582457
+:10E2E0000174502191480004252400043086FFFF6A
+:10E2F00025140004001421C0240500020E000F04A0
+:10E300002412FFFE021280243231FFFB2407000199
+:10E310001207006F3206000114C000903C0E80000E
+:10E32000320F000411E000048F980004331008003D
+:10E33000160000783C1F80005660FFC78FBF002486
+:10E340000E000F63000000000A0010408FBF002481
+:10E350003C190BFF00BFC0243733FFFF0278882B26
+:10E360005220FF8A241100010A00100D241100051B
+:10E370003C0E08008DCE00D8960F010E24040080BC
+:10E3800025CD000131E6FFFF240500023C01080015
+:10E39000AC2D00D80A00103D240700033C120800F1
+:10E3A0008E520024324200011040FFAB8FBF002488
+:10E3B00094C6010E362700020000202124D4000458
+:10E3C0003286FFFF0A00103D240500021100FF8E77
+:10E3D00030A601003C0B0F0000AB50243C090100AB
+:10E3E000012A202B1480FF88000000003C058000DB
+:10E3F00094A6010E362700022404008024D40004D1
+:10E400003286FFFF0A00103D2405000297E3011643
+:10E410000A0010243C03100000AA48243C08100005
+:10E420001528FF653C0C000130CB02001560FF632E
+:10E4300000AC30243C1480009692010E3627000276
+:10E44000000020212645000430A6FFFF0E000F3FEC
+:10E45000240500020A0010408FBF00240E000F7137
+:10E46000000000000A0010008F850004000000007A
+:10E470003C0608008CC600D0000516023050000F84
+:10E4800038DF00012FF900012E03000C0323C02404
+:10E490001700FF68001021C02608FFFC2D070004AC
+:10E4A00014E000073C0E800038CA00022D4900012C
+:10E4B000012320245080000E000532423C0E8000D3
+:10E4C00095C6010E000020210A00103A36270002EE
+:10E4D0003233000452600001363100023C0C8000EF
+:10E4E0009586010E022038210A0010990000202193
+:10E4F0000010182B00C358241560000F3C05800045
+:10E50000001021C03C0E800095C6010E0A00103A92
+:10E510003627000297F9010E022038212404010059
+:10E52000273100043226FFFF0E000F0424050002ED
+:10E530000A0010780000000094AD010E00002021B8
+:10E540002405000225AC00043186FFFF0E000F04F5
+:10E550003227FFFB0A0010EB001021C095C5010E09
+:10E56000022038210000202124AD000431A6FFFF45
+:10E570000E000F04240500020A0010723231FFFB66
+:10E580003C0580008CA701482403000434A60180C8
+:10E5900000072402308200FF104300103C0480007A
+:10E5A0008C8901B80520FFFE000000008C8F014817
+:10E5B000240D00023C0A1000000F7402A4CE0008D3
+:10E5C000A0CD000B8C8C0148A4CC00108C8B014496
+:10E5D000ACCB002403E00008AC8A01B88CA4014055
+:10E5E0003C03800000C028218C6601B804C0FFFEF7
+:10E5F0002408001CACA40000A0A8000B3C051000DF
+:10E60000AC6501B803E000080000000027BDFFE88A
+:10E61000AFB00010AFBF00143C10600C8E0D500066
+:10E62000240EFF7F2406000301AE60243588380CD9
+:10E630003C058000AE085000ACA600083C01080074
+:10E64000AC2000200E001555000000003C086016AC
+:10E650008D0A00003C0BFFFF3C0900103523805160
+:10E660003C046000014B38243C025353AE03537CFE
+:10E67000348420203C05080024A579082406000ADB
+:10E6800010E2000935037C008C7F007C8C790078D7
+:10E690008FB00010AF9F00108FBF001427BD00186F
+:10E6A0000A0013B1AF9900088D0F00043C186000F8
+:10E6B0008FB0001001F818218C7F007C8C790078D5
+:10E6C000AF9F00108FBF001427BD00180A0013B1C0
+:10E6D000AF9900083C0480008C8340003402FFFFA7
+:10E6E0001062003A000000008C87400030E5010015
+:10E6F00010A00021000000009487010E3C020800D9
+:10E700008C4200EC9485010E3C0D08008DAD31CC9F
+:10E7100030E3FFFF3C1808008F1800E83C090800B0
+:10E720008D2931C80043602130ABFFFF0183782B76
+:10E730000000C82101AB18210000502103197021ED
+:10E74000006B302B012A402101CF2021010610212E
+:10E750003C010800AC2C00EC3C010800AC2400E8B3
+:10E760003C010800AC2331CC3C010800AC2231C88C
+:10E7700003E00008000000008C8840008F8C000837
+:10E78000110C00323C0D800095AB010E3C0A0800D4
+:10E790008D4A00E43C0808008D0800E03169FFFF65
+:10E7A000014928210000302100A9602B01063821F1
+:10E7B00000EC10213C010800AC2500E43C010800FD
+:10E7C000AC2200E003E00008000000009483010E8A
+:10E7D0009482010E3C1908008F3900F43C090800AE
+:10E7E0008D2931CC3C0E08008DCE00F03C0808008D
+:10E7F0008D0831C83078FFFF304BFFFF03382821E8
+:10E80000012B1821000078210000502100B8682B4E
+:10E8100001CF6021006B302B010A3821018D2021AE
+:10E8200000E610213C010800AC2500F43C01080082
+:10E83000AC2400F03C010800AC2331CC3C010800C2
+:10E84000AC2231C803E00008000000008C894004BD
+:10E850008F8600101526FFCC3C0D80009483010E9E
+:10E860003C1908008F3931BC3C0E08008DCE31B800
+:10E870003078FFFF03385821000078210178202BE1
+:10E8800001CF682101A450213C010800AC2B31BC10
+:10E890003C010800AC2A31B803E000080000000089
+:10E8A00027BDFFE83C058000AFBF0014AFB00010EB
+:10E8B0008CB00128ACB000208CA301048CA4010012
+:10E8C000AF8300040E000ED6AF84000C0E00115F63
+:10E8D000000000003C0208008C4200C010400026EE
+:10E8E0008F8400043C0708008CE700C424E6000184
+:10E8F0003C010800AC2600C43C0280008C4401248A
+:10E900003C1F6020AFE40014000000003C068000C3
+:10E910003C034000ACC301380000000012000013AB
+:10E920008FBF0014260F0140261900802404FF80A9
+:10E9300001E4C0240324F824001F6940332E007F23
+:10E940000018594031EC007F3C0A20003548000295
+:10E9500001AE3825016C48250128802500E82825CE
+:10E96000ACC50830ACD008308FBF00148FB0001099
+:10E9700003E0000827BD00183C090010008940246E
+:10E980001100000F8F83000C240DBFFF006D602469
+:10E9900011800007240F87FF006F702415C000133B
+:10E9A0003C1900600099C024130000100000000012
+:10E9B0000E000CD2000000000A001221000000002E
+:10E9C0003C0B08008D6B0020256A00013C0108000B
+:10E9D000AC2A00200E000FC5000020211040FFCC03
+:10E9E0003C0680000A0011E93C0280000E00128EF5
+:10E9F000000000000A0012210000000027BDFFE80F
+:10EA00003C028000AFBF00108C4601403C03700008
+:10EA10003C054000AC4600208C4401480083202483
+:10EA20001085001300A4102B1040000B3C072000A1
+:10EA30003C08600010880017000000003C0A4000FD
+:10EA40003C098000AD2A0178000000008FBF001053
+:10EA500003E0000827BD00185487FFF93C0A400076
+:10EA60000E00110A000000000A00123A3C0A4000A1
+:10EA70000E0012B4000000003C0A40003C09800077
+:10EA8000AD2A0178000000008FBF001003E00008ED
+:10EA900027BD00180E001D6F000000000A00123A8A
+:10EAA0003C0A400027BDFFE0AFB200183C128000D6
+:10EAB000AFB10014AFBF001CAFB000100E00112D9D
+:10EAC000365100708E260000AF8600188E28000098
+:10EAD0003C0B08008D6B00FC3C0708008CE700F83D
+:10EAE00001066023016C28210000482100AC302B76
+:10EAF00000E91821006620213C010800AC2500FC3B
+:10EB00003C010800AC2400F88E50000032020003E3
+:10EB10001040FFEE010030218E2600003C05080069
+:10EB20008CA500FC3C1F08008FFF00F800C81823CC
+:10EB300000A378210000102101E3C82B03E2C021CB
+:10EB400003197021320D00013C010800AC2F00FCBC
+:10EB5000AF8800183C010800AC2E00F815A0000892
+:10EB600000000000320800021100FFD60000000083
+:10EB70000E001229000000000A00125B00000000D5
+:10EB80000E0011D2000000000A00128432080002B8
+:10EB90003C0380008C6401003082003E1440000879
+:10EBA00000000000AC6000488C66010030C507C062
+:10EBB00010A0000500000000AC60004CAC600050EC
+:10EBC00003E0000824020001AC600054AC60004087
+:10EBD0008C6801003107380010E0FFF900000000E8
+:10EBE0002402000103E00008AC6000443C039000F4
+:10EBF00034620001008220253C038000AC640020C8
+:10EC00008C65002004A0FFFE0000000003E0000867
+:10EC1000000000003C0280003443000100832025F6
+:10EC200003E00008AC44002027BDFFD8AFB10014BA
+:10EC30003C048000AFBF0020AFB3001CAFB200188F
+:10EC4000AFB000108C9201408C9001482402000E5D
+:10EC500000108C02322300FF1062005902042824A5
+:10EC60002866000F10C00013286A0037240700062A
+:10EC70001067008E286800075100002D2404000949
+:10EC8000106000783C06800024090001106900B083
+:10EC9000000000000000000D8FBF00208FB3001C9B
+:10ECA0008FB200188FB100148FB0001003E000087D
+:10ECB00027BD002811400059240D0038286B00356D
+:10ECC000116000053C058000240C001F146CFFF14E
+:10ECD000000000003C0580008CB801B80700FFFE72
+:10ECE00034B90180AF320000241F00012412000259
+:10ECF0003C021000AF200004A7310008A33F000A27
+:10ED0000A332000BA7300010AF200024AF20002852
+:10ED1000ACA201B88FBF00208FB3001C8FB20018C7
+:10ED20008FB100148FB0001003E0000827BD002849
+:10ED3000106400232405000B1465FFD63218FFFF72
+:10ED4000170000203C0580008F93FED4927F0005C1
+:10ED500033F900041720FFCF000000000E0012A5B9
+:10ED6000024020219269000502402021352800043C
+:10ED70000E0012AFA26800059267000530E20004A1
+:10ED800014400002000000000000000D926B000023
+:10ED900024060020316A00FF1546000A3C05800069
+:10EDA0008CA401B80480FFFE34AD0180240E000560
+:10EDB0003C0C1000ADB20000A1AE000BACAC01B831
+:10EDC0003C0580008CA301B80460FFFE34AF0180D5
+:10EDD00024130002ADE00000ADF20004A5F100082C
+:10EDE000A1F3000AA1F3000BA5F00010ADE0002490
+:10EDF0008CB101443C101000ADF10028ACB001B85A
+:10EE00008FBF00208FB3001C8FB200188FB1001489
+:10EE10008FB0001003E0000827BD0028106DFFAD83
+:10EE2000240E0080146EFF9B000000003C05800053
+:10EE30008CA301B80460FFFE34AF018024120002ED
+:10EE4000A1F2000BA5F10008A5F000108CB301445D
+:10EE50003C021000A5F30012ACA201B80A0012F0A7
+:10EE60008FBF00208CC301B80460FFFE34D3018043
+:10EE7000AE720000AE60000424120001A67100080A
+:10EE800024110002A272000AA271000BA6700010E9
+:10EE90008CD001443C0F1000AE700024AE600028FE
+:10EEA000ACCF01B80A00132B8FBF00203C038000B9
+:10EEB0008C6601B804C0FFFE346201803C06080085
+:10EEC00090C67AB8AC52000010C000030000382190
+:10EED0003C0708008CE77AC03C05800034AA01801A
+:10EEE0002404000234CC0001AC470004A551000802
+:10EEF000A14C000AA144000BA55000108CAB0144AA
+:10EF00000000202101402821AD4B002410C0000347
+:10EF10008FBF00203C0408008C847ABC8FB3001C97
+:10EF20008FB200188FB100148FB000103C0E10008B
+:10EF30003C0D800027BD0028ACA40028ADAE01B870
+:10EF40003C010800A0207AB803E00008000000009F
+:10EF500010A0000B3C0680008C980144241900028C
+:10EF60003C010800A0397AB83C010800AC327AC0F4
+:10EF70003C010800AC387ABC0A00132B8FBF00207C
+:10EF80008CDF01B807E0FFFE34C7018024090002CE
+:10EF9000ACE00000ACF20004A4F10008A0E9000A13
+:10EFA000A0E9000BA4F00010ACE000248CC80144E0
+:10EFB0003C021000ACE80028ACC201B80A00132BD8
+:10EFC0008FBF002027BDFFE8AFBF00100E000ED698
+:10EFD000000000003C0280008FBF001000002021D4
+:10EFE000AC4001800A000FC527BD00183084FFFF28
+:10EFF00030A5FFFF108000070000182130820001BB
+:10F000001040000200042042006518211480FFFB1C
+:10F010000005284003E000080060102110C0000730
+:10F02000000000008CA2000024C6FFFF24A50004FD
+:10F03000AC82000014C0FFFB2484000403E000083D
+:10F040000000000010A0000824A3FFFFAC86000011
+:10F0500000000000000000002402FFFF2463FFFF07
+:10F060001462FFFA2484000403E00008000000009A
+:10F0700027BDFFE0AFB20018AFB10014AFB0001071
+:10F08000AFBF001C9486000C00A0902124900014B7
+:10F0900000061B020003108000448821000030217C
+:10F0A00000A020210E0013BB240500050211202B17
+:10F0B0001080001200001021920300002C6500094E
+:10F0C00050A0000992020001000348803C0A080099
+:10F0D000254A793C012A40218D07000000E0000804
+:10F0E0000000000092020001020280210211202B88
+:10F0F0005480FFF292030000000010218FBF001C1B
+:10F100008FB200188FB100148FB0001003E0000818
+:10F1100027BD00200A0013D526100001920C000123
+:10F12000240B000C158B0040023070232DCD000AFB
+:10F1300015A0003D260800068E43000026020002AE
+:10F1400034640100AE440000921F00029059000197
+:10F15000904E0002904B0003001F7E000019C40077
+:10F1600001F86025000E6A00018D5025014B4825ED
+:10F17000AE490004920700069105000191040002C7
+:10F180009119000300071E00000534000066F825F1
+:10F190000004120003E2C025031978252610000A96
+:10F1A0000A0013D5AE4F0008921F0001260400028A
+:10F1B0002410000257F00001022020210A0013D57C
+:10F1C00000808021920E0001240D000315CDFFCB9D
+:10F1D000240200018E59000092180002261000033C
+:10F1E000372F0008A25800100A0013D5AE4F0000B8
+:10F1F000920500012406000414A6FFC024020001A9
+:10F20000920C0002920B00038E490000000C520089
+:10F21000014B40253527000426100004AE48000CA1
+:10F220000A0013D5AE4700000A0013E924020001CA
+:10F2300027BDFFE8AFBF0014AFB000100E0012A54D
+:10F24000008080213C048008348300809065002584
+:10F250000200202134A200200E0012AFA06200257F
+:10F26000020020218FBF00148FB000100A000C9EF6
+:10F2700027BD00183C03800027BDFFF834620180E1
+:10F28000AFA20000308C00FF30AD00FF30CE00FF99
+:10F290003C0B80008D6401B80480FFFE000000007C
+:10F2A0008FA900008D6801288FAA00008FA7000099
+:10F2B0008FA400002405000124020002A085000A9A
+:10F2C0008FA30000359940003C051000A062000BA0
+:10F2D0008FB800008FAC00008FA600008FAF000039
+:10F2E00027BD0008AD280000AD400004AD8000241B
+:10F2F000ACC00028A4F90008A70D0010A5EE00126C
+:10F3000003E00008AD6501B83C06800827BDFFE8B2
+:10F3100034C50080AFBF001090A70009240200127E
+:10F3200030E300FF1062000B008030218CA80050F9
+:10F3300000882023048000088FBF00108CAA0034AE
+:10F34000240400390000282100CA482305200005B4
+:10F35000240600128FBF00102402000103E0000801
+:10F3600027BD00180E001447000000008FBF0010DA
+:10F370002402000103E0000827BD001827BDFFC8D4
+:10F38000AFB1002C00A08821AFB2003027A500103B
+:10F390000080902102202021AFBF00340E0013C650
+:10F3A000AFB00028144000813C0C8008918B001104
+:10F3B000918A0012358600808CC80054316500FFA8
+:10F3C000314900FF00A9282100A8382B14E0004F84
+:10F3D0008FA3001094DF005C3066000410C000565C
+:10F3E00033E4FFFF8FA2001C0082102B5440000565
+:10F3F0002C8300803067000414E0007E240402188F
+:10F400002C83008010600002008080212410008086
+:10F410000E0012A5024020213C03800834660080C3
+:10F4200024070001ACC7000C90C200080010604027
+:10F4300034670100305F007FA0DF00088E390004D0
+:10F4400027380001ACD80030A4D0005C8CCE003C42
+:10F45000962F000E01CF6821ACCD00208CCB003C54
+:10F46000016C5021ACCA001C8E290004ACE90000DC
+:10F470008E250008ACE500048FA8001031040008B8
+:10F480005480002F93A60020A0C0004E90C5004ECF
+:10F490002408FFDF3C188008A0E5000890C400089D
+:10F4A000370C00802409005000888024A0D0000878
+:10F4B0008E390008AD9900388F0E00148D8F003002
+:10F4C00001CF6821AD8D0034918B0000316A00FFBF
+:10F4D00011490029264801000E0012AF02402021E8
+:10F4E00024040038000028210E0014472406000AD6
+:10F4F0008FBF00348FB200308FB1002C8FB0002846
+:10F500002402000103E0000827BD003894D8005C05
+:10F510008CD00054330EFFFF0205782301CF682BF7
+:10F5200015A0FFAC8FA300108CD9005430660004E6
+:10F5300014C0FFAC032520230A0014A52C82021856
+:10F540003C188008370C0080A0E600088E390008BF
+:10F5500024090050AD9900388F0E00148D8F0030B3
+:10F5600001CF6821AD8D0034918B0000316A00FF1E
+:10F570001549FFD9264801002406FF8001062824EA
+:10F580003C048000AC8500288E2700083103007FF2
+:10F590003C10800C0070F821AFE700D08E220008EC
+:10F5A000AF9F00240A0014E0AFE200D48E230008CD
+:10F5B0003C04800834820080AC4300540240202187
+:10F5C0000E001436AC400030240400382405008DB1
+:10F5D0000E001447240600128FBF00348FB2003093
+:10F5E0008FB1002C8FB000282402000103E0000836
+:10F5F00027BD00380A0014AA8FA4001C27BDFFE80D
+:10F60000AFBF001090A6000D30C7001010E0000C36
+:10F61000008040213C0280088C4400048CA3000838
+:10F620001064000830C9000430C5000410A0001C9C
+:10F630008FBF00102402000103E0000827BD00185E
+:10F6400030C900041120001030CB001210E0FFF987
+:10F650008FBF00103C0880088CA700088D060004AE
+:10F6600014E6FFF524020001240400382405008D6F
+:10F670000E001447240600128FBF00102402000160
+:10F6800003E0000827BD0018240A0012156AFFE9EC
+:10F690008FBF0010010020210A00148927BD001827
+:10F6A000000020210A000CB827BD00183C05080006
+:10F6B00024A555983C040800248473583C02080093
+:10F6C000244255A0240300063C010800AC257AC85A
+:10F6D0003C010800AC247ACC3C010800AC227AD072
+:10F6E0003C010800A0237AD403E0000800000000D9
+:10F6F00003E00008240200013C028000308800FF83
+:10F70000344701803C0680008CC301B80460FFFED2
+:10F71000000000008CC501282418FF803C0D800AE1
+:10F7200024AF010001F8702431EC007FACCE00243E
+:10F73000018D2021ACE50000948B00DA35096000D2
+:10F7400024080002316AFFFFACEA00042402000131
+:10F75000A4E90008A0E8000BACE000243C0710007E
+:10F76000ACC701B8AF84002403E00008AF850054A3
+:10F770008C9900048F8D00242409FFBF0325C0232A
+:10F78000AC98000491AF00C42403FFEF31EE007F7A
+:10F79000A1AE00C48C8C0020938B00308F86002497
+:10F7A000358A0002AF8B0048A7800044AC8A002055
+:10F7B000A4C000AC90C800C401093824A0C700C48C
+:10F7C0008F840024AC8000DC908500C400A310244A
+:10F7D00003E00008A08200C43C02800034450180A0
+:10F7E0003C0480008C8301B80460FFFE8F890054C4
+:10F7F0002407608324060002ACA900008C88012441
+:10F80000ACA80004A4A70008A0A6000B3C051000AB
+:10F8100003E00008AC8501B8938800308F89004868
+:10F820008F82002430C600FF0109382330E900FF31
+:10F830000122182130A500FF2468007810C00002C2
+:10F84000012438210080382130E4000314800003B3
+:10F8500030AA00031140000D312B000310A0000955
+:10F860000000102190ED0000244E000131C200FF85
+:10F870000045602BA10D000024E700011580FFF971
+:10F880002508000103E00008000000001560FFF3F8
+:10F890000000000010A0FFFB000010218CF8000009
+:10F8A00024590004332200FF0045782BAD180000D6
+:10F8B00024E7000415E0FFF92508000403E0000830
+:10F8C0000000000093850030938800408F87004837
+:10F8D000000432003103007F00E5102B30C47F00AC
+:10F8E0001040000F006428258F8400243C0980000C
+:10F8F0008C8A00DCAD2A00A43C03800000A35825BC
+:10F90000AC6B00A08C6C00A00580FFFE0000000026
+:10F910008C6D00ACAC8D00DC03E000088C6200A8AC
+:10F920000A0015E88F840024938800413C0280007F
+:10F9300000805021310300FEA383004130ABFFFF64
+:10F9400030CC00FF30E7FFFF344801803C098000E5
+:10F950008D2401B80480FFFE8F8D005424180016FA
+:10F96000AD0D00008D2201248F8D0024AD02000416
+:10F970008D590020A5070008240201B4A119000A2E
+:10F98000A118000B952F01208D4E00088D47000413
+:10F99000978300448D59002401CF302100C72821CE
+:10F9A00000A320232418FFFFA504000CA50B000EC4
+:10F9B000A5020010A50C0012AD190018AD18002406
+:10F9C00095AF00D83C0B10002407FFF731EEFFFF86
+:10F9D000AD0E00288DAC0074AD0C002CAD2B01B821
+:10F9E0008D46002000C7282403E00008AD45002014
+:10F9F0008F8800240080582130E7FFFF910900C65E
+:10FA00003C02800030A5FFFF312400FF00041A00F3
+:10FA10000067502530C600FF344701803C09800054
+:10FA20008D2C01B80580FFFE8F820054240F001733
+:10FA3000ACE200008D390124ACF900048D7800207F
+:10FA4000A4EA0008241901B4A0F8000AA0EF000BF2
+:10FA5000952301208D6E00088D6D0004978400446D
+:10FA600001C35021014D602101841023A4E2000C48
+:10FA7000A4E5000EA4F90010A4E60012ACE0001406
+:10FA80008D780024240DFFFFACF800188D0F006C5A
+:10FA9000ACEF001C8D0E00683C0F1000ACEE002097
+:10FAA000ACED0024950A00AE240DFFF73146FFFFB0
+:10FAB000ACE60028950C00709504007231837FFF3E
+:10FAC0000003CA003082FFFF0322C021ACF8002CE3
+:10FAD000AD2F01B8950E00728D6A002000AE302166
+:10FAE000014D2824A506007203E00008AD65002042
+:10FAF0003C028000344601803C0580008CA301B8A4
+:10FB00000460FFFE24090018ACC40000A0C9000B6B
+:10FB10008F8800243C041000950700AEA4C7001095
+:10FB2000ACC0003003E00008ACA401B83C02800087
+:10FB3000344501803C0480008C8301B80460FFFEE2
+:10FB40008F8A002C240600199549001C3128FFFFDC
+:10FB5000000839C0ACA70000A0A6000B3C051000AF
+:10FB600003E00008AC8501B88F8700340080402195
+:10FB700030C400FF3C0680008CC201B80440FFFE88
+:10FB80008F8900549383005034996000ACA9000021
+:10FB9000A0A300058CE20010240F00022403FFF74D
+:10FBA000A4A20006A4B900088D180020A0B8000A7D
+:10FBB000A0AF000B8CEE0000ACAE00108CED00048A
+:10FBC000ACAD00148CEC001CACAC00248CEB002021
+:10FBD000ACAB00288CEA002C3C071000ACAA002C2F
+:10FBE0008D090024ACA90018ACC701B88D05002010
+:10FBF00000A3202403E00008AD04002093850050FA
+:10FC00002403000127BDFFE800A330042CA200203C
+:10FC1000AFB00010AFBF001400C018211040001397
+:10FC20002410FFFE3C0708008CE7319000E610240A
+:10FC30003C0880003505018014400005240600843E
+:10FC40008F890024240A00042410FFFFA12A00EC5D
+:10FC50000E00168400000000020010218FBF001467
+:10FC60008FB0001003E0000827BD00183C06080014
+:10FC70008CC631940A0016B600C310248F87002C5E
+:10FC800027BDFFE0AFB20018AFB10014AFB0001055
+:10FC9000AFBF001C30D000FF90E6000D00A088210F
+:10FCA0000080902130C5007FA0E5000D8F850024E5
+:10FCB0008E2300188CA200C01062002E240A000EB1
+:10FCC0000E0016A9A38A00502409FFFF1049002244
+:10FCD0002404FFFF52000020000020218E26000097
+:10FCE0003C0C001000CC5824156000393C0E000874
+:10FCF00000CE682455A0003F024020213C1800029D
+:10FD000000D880241200001F3C0A00048F87002CBA
+:10FD10008CE200148CE300108CE500140043F823FF
+:10FD200003E5C82B13200005024020218E24002C5F
+:10FD30008CF10010109100310240202124020012A9
+:10FD4000A38200500E0016A92412FFFF10520002D9
+:10FD50002404FFFF000020218FBF001C8FB2001879
+:10FD60008FB100148FB000100080102103E0000854
+:10FD700027BD002090A800C4350400200A0016DF2B
+:10FD8000A0A400C400CA48241520000B8F8B002CAF
+:10FD90008F8D002C8DAC00101580000B02402021AF
+:10FDA0008E2E002C51C0FFEC0000202102402021AB
+:10FDB0000A0016FA240200178D66001050C0FFE6F4
+:10FDC00000002021024020210A0016FA240200111E
+:10FDD00002402021240200150E0016A9A382005023
+:10FDE000240FFFFF104FFFDC2404FFFF0A0016E979
+:10FDF0008E2600000A001720240200143C0800048C
+:10FE000000C8382450E0FFD4000020210240202107
+:10FE10000A0016FA240200138F86002427BDFFE093
+:10FE2000AFB10014AFBF0018AFB0001090C300C452
+:10FE300030A500FF306200201040000800808821BB
+:10FE40008CCB00C02409FFDF256A0001ACCA00C0CA
+:10FE500090C800C401093824A0C700C414A0004001
+:10FE60003C0C80008F840024908700C42418FFBFBE
+:10FE70002406FFEF30E3007FA08300C4979F004477
+:10FE80008F8200488F8D002403E2C823A799004485
+:10FE9000A5A000AC91AF00C401F87024A1AE00C4CD
+:10FEA0008F8C0024A18000C78F8A0024A540007297
+:10FEB000AD4000DC914500C400A65824A14B00C40D
+:10FEC0008F9000208F8400489786004402042821E8
+:10FED00010C0000FAF850020A38000403C078000C9
+:10FEE0008E2C000894ED01208E2B0004018D5021F2
+:10FEF000014B8021020620233086FFFF30C8000F0F
+:10FF0000390900013131000116200009A3880040A1
+:10FF1000938600308FBF00188FB100148FB000108F
+:10FF200027BD0020AF85004C03E00008AF860048E5
+:10FF300000C870238FBF0018938600308FB1001463
+:10FF40008FB0001034EF0C00010F282127BD0020D6
+:10FF5000ACEE0084AF85004C03E00008AF8600489B
+:10FF600035900180020028210E00168424060082AC
+:10FF70008F840024908600C430C5004050A0FFBA92
+:10FF8000A38000508F8500343C0680008CCD01B8E2
+:10FF900005A0FFFE8F890054240860822407000218
+:10FFA000AE090000A6080008A207000B8CA30008F9
+:10FFB0003C0E1000AE0300108CA2000CAE02001428
+:10FFC0008CBF0014AE1F00188CB90018AE190024A5
+:10FFD0008CB80024AE1800288CAF0028AE0F002C7F
+:10FFE000ACCE01B80A001744A38000508F8A0024C9
+:10FFF00027BDFFE0AFB10014AFB000108F880048FC
+:020000040001F9
+:10000000AFBF001893890028954200AC30D100FFA3
+:100010000109182B0080802130AC00FF3047FFFF22
+:100020000000582114600003310600FF0120302138
+:1000300001095823978300440068202B1480001B7B
+:100040000000000010680043240A0001118A0048E3
+:1000500034E708803165FFFF0E00162602002021DC
+:100060000E0016668F8400548F840024948D0070D7
+:1000700025AC0001A48C0070948B00703C06080035
+:100080008CC6318831677FFF10E6004F000000000A
+:1000900002002021022028218FBF00188FB10014F8
+:1000A0008FB000100A00173027BD0020914400C413
+:1000B0002406FF8000868825A15100C4978400444F
+:1000C0003088FFFF1100001C938900288F8E0024C8
+:1000D0002419EFFF008BF82395D800AC0168682B3A
+:1000E00033E900FF03197824A5CF00AC51A0002A02
+:1000F000010058218E0500202408FFFB2403000185
+:1001000000A81024AE0200201183002534E78000EF
+:10011000020020213165FFFF0E001626012030214C
+:10012000978B00448F870048A780004400EB802312
+:10013000AF900048938900288F8C00248FBF00184F
+:100140008FB100148FB0001027BD002003E000081D
+:10015000A18900C78E0800202409FFFB34E7800036
+:1001600001092824AE050020158AFFBA34E708806B
+:10017000020020210E0015F43165FFFF020020214E
+:10018000022028218FBF00188FB100148FB00010FB
+:100190000A00173027BD00200A0017E70000482199
+:1001A000020020213165FFFF0E0015F401203021EF
+:1001B000978B00448F870048A780004400EB802382
+:1001C0000A0017F7AF90004894890070240A800055
+:1001D000012A4024A48800709085007090990070D6
+:1001E00030A200FF000219C20003F827001FC1C09F
+:1001F000332F007F01F87025A08E00700A0017CF02
+:10020000020020218F88002424030001910A007835
+:10021000910500C7250900783147003F24E6FFE03B
+:1002200000C318042CC2002030670019A3850028E1
+:100230001040001AAF8900343C0A8000354B0002A0
+:10024000240500012406000114E00016006B1024B0
+:10025000000028211440000F306300201060000FC0
+:10026000240500018D0600748D1900742403FF809D
+:1002700000C31024000279403338007F01F868255C
+:100280003C0E100001AE6025AD4C083091280001F5
+:10029000310600010A0017A50000000003E0000875
+:1002A000000000008D0F00748D0D00742418FF8075
+:1002B00001F87024000E414031AC007F010C502544
+:1002C0003C0B1000014B38253C0980000A0017A5A3
+:1002D000AD27083027BDFFD8AFB000108F90003495
+:1002E000AFB40020AFB10014AFBF0024AFB3001C07
+:1002F000AFB200188E0500103C0208008C4231B0ED
+:100300008F86003830A73FFF00E2182B8CD20014F4
+:10031000008088218CD30020106000070000A021FD
+:1003200090CB000D240AFF80014B4824312800FFA8
+:100330001500000C00056382022020212411000D0D
+:10034000A39100508FBF00248FB400208FB3001CF6
+:100350008FB200188FB100148FB000100A0016A9D8
+:1003600027BD00283185000354A0FFF4022020217E
+:1003700094CF001C8F8E00248E070028A5CF00D8B4
+:100380008CCD0010024D302310E6005C2402001FCB
+:100390000E0016A9A3820050241FFFFF105F004E1D
+:1003A0002404FFFF8F83003C8F88002C0263982178
+:1003B0008D090010012310238F83001CAD02001053
+:1003C000AD1300208C67007400F3202B14800062B2
+:1003D000022020218F8600388E0C00248CC500243A
+:1003E0001185000702202021240E001C0E0016A9F2
+:1003F000A38E0050240DFFFF104D00372404FFFF93
+:100400008F84002C8C980024270F0001AC8F0024CF
+:10041000127200448F99001C8F32007412530041F5
+:100420003C0A00808E090000012A10241440003A82
+:10043000000000008E0400142412FFFF109200063A
+:10044000240B001B022020210E0016A9A38B0050B4
+:10045000105200212404FFFF8E0300003C0C000119
+:10046000006C282410A000133C0600800066A02425
+:10047000168000090200282102202021240E001AE3
+:100480000E0016A9A38E0050240DFFFF104D001280
+:100490002404FFFF02002821022020210E0016C99B
+:1004A000240600012410FFFF2404FFFF1050000A5F
+:1004B000241400018F8F002C022020210280302183
+:1004C00095F2003424050001265800010E0017A5FE
+:1004D000A5F80034000020218FBF00248FB4002035
+:1004E0008FB3001C8FB200188FB100148FB00010B2
+:1004F0000080102103E0000827BD00288F83003C06
+:1005000000E3C8210259C02B1300FFA88F88002CDC
+:100510000A00188E24020018AC8000200A0018B8C7
+:100520008E0400148E1F00003C07008003E798240F
+:100530001660FFF92408001A022020210E0016A9D7
+:10054000A38800502403FFFF1443FFBA2404FFFFD5
+:100550000A0018E18FBF0024240B001D0E0016A90D
+:10056000A38B0050240AFFFF144AFF9A2404FFFFC4
+:100570000A0018E18FBF00248F85002427BDFFD813
+:10058000AFB3001CAFB20018AFB10014AFB0001091
+:10059000AFBF002090A700C48F9000342412FFFF4B
+:1005A00034E2004092060000A0A200C48E030010B6
+:1005B000008098211072000630D1003F2408000D01
+:1005C0000E0016A9A3880050105200262406FFFF33
+:1005D0008F8A00248E0900188D4400C01124000762
+:1005E000240C000E026020210E0016A9A38C0050DE
+:1005F000240BFFFF104B001B2406FFFF24040020E8
+:10060000122400048F8D002491AF00C435EE002029
+:10061000A1AE00C48F85003C10A0001A00000000AD
+:100620001224004B8F9800248F92FED42406FFFDE5
+:10063000971000709651000A1230000B8FBF0020F7
+:100640003C1F08008FFF318C03E5C82B1720001ECC
+:1006500002602021000028210E0017A524060001B9
+:10066000000030218FBF00208FB3001C8FB2001814
+:100670008FB100148FB0001000C0102103E00008FB
+:1006800027BD00285224002A8E0300148F840024E2
+:100690009489007025280001A48800709487007058
+:1006A0003C0508008CA5318830E27FFF1045000E24
+:1006B00000000000026020210E0017302405000118
+:1006C0000A001943000030212402002DA3820050AB
+:1006D0000E0016A92413FFFF1453FFE12406FFFFA9
+:1006E0000A0019448FBF00209498007024198000DC
+:1006F0002405000103199024A492007090910070C9
+:10070000908D0070323000FF001079C2000F70270A
+:10071000000E61C031AB007F016C5025A08A0070D3
+:100720000E001730026020210A001943000030211A
+:100730002406FFFF1466FFD68F8400240260202168
+:100740000E001730240500010A0019430000302173
+:10075000026020210A00195D2402000A8F8800240B
+:1007600027BDFFE8AFB00010AFBF0014910A00C46E
+:100770008F87003400808021354900408CE60010CE
+:10078000A10900C43C0208008C4231B030C53FFFD3
+:1007900000A2182B106000078F850038240DFF8001
+:1007A00090AE000D01AE6024318B00FF1560000893
+:1007B0000006C382020020212403000D8FBF001415
+:1007C0008FB0001027BD00180A0016A9A38300509F
+:1007D00033060003240F000254CFFFF7020020214C
+:1007E00094A2001C8F85002424190023A4A200D801
+:1007F0008CE8000000081E02307F003F13F900352E
+:100800003C0A00838CE800188CA600C01106000882
+:10081000000000002405000E0E0016A9A38500505C
+:100820002407FFFF104700182404FFFF8F850024D2
+:1008300090A900C435240020A0A400C48F8C002CF3
+:10084000918E000D31CD007FA18D000D8F83003C76
+:100850001060001C020020218F8400388C9800104A
+:100860000303782B11E0000D241900180200202149
+:10087000A39900500E0016A92410FFFF105000028B
+:100880002404FFFF000020218FBF00148FB0001050
+:100890000080102103E0000827BD00188C8600109E
+:1008A0008F9F002C0200202100C31023AFE2001014
+:1008B000240500010E0017A5240600010A0019CC2A
+:1008C000000020210E001730240500010A0019CC79
+:1008D00000002021010A5824156AFFD98F8C002CB2
+:1008E000A0A600EC0A0019B9A386004227BDFFD8D4
+:1008F000AFB000108F900034AFB20018AFBF00202F
+:10090000AFB3001CAFB100148E1100103C030800FF
+:100910008C6331B032253FFF00A3102B104000083C
+:10092000008090218F8600382409FF8090CA000D36
+:10093000012A4024310700FF14E0000B00116B82F4
+:10094000024020212412000DA39200508FBF0020EE
+:100950008FB3001C8FB200188FB100148FB000103D
+:100960000A0016A927BD002831AC0003240B0001A2
+:10097000558BFFF40240202190CF000D31EE00088E
+:1009800011C000608F93003C16600009240200270C
+:100990008E19000C8CD80020173800052402002086
+:1009A0008E0200088CDF0024105F0040240200202B
+:1009B0000E0016A9A38200502406FFFF1046003344
+:1009C0002404FFFF8F99002C240AFFF73C13800EAC
+:1009D0009329000D2404FF803C0D8000012AF82497
+:1009E000A33F000D8F99001C3C0808008D0831AC16
+:1009F0008F830054972700788F9F002C01031021CC
+:100A000030E57FFF000530400046782131F8007F57
+:100A10000313602101E47024ADAE002CA591000009
+:100A20008FEB0028256A0001AFEA00288FE3002C35
+:100A30008E09002C00694021AFE8002C8E07002CA5
+:100A4000AFE700308E050014AFE5003497E6003ABA
+:100A500024C20001A7E2003A973300783C10080056
+:100A60008E1031B02663000130717FFF12300027F5
+:100A7000006030218F8F001C0240202124050001DE
+:100A80000E001730A5E60078000020218FBF00205F
+:100A90008FB3001C8FB200188FB100148FB00010FC
+:100AA0000080102103E0000827BD00288E050014F7
+:100AB0002413FFFF10B3001D8F8300248E0800183D
+:100AC0008C6700C0150700092402000E8E0A00245E
+:100AD0008CC9002815490005240200218E07002832
+:100AE0008CCB002C10EB00132402001F0E0016A963
+:100AF000A38200501453FFB32404FFFF0A001A4ED0
+:100B00008FBF00200A001A1624020024240E800041
+:100B1000006E682431ACFFFF000C5BC2317100FF36
+:100B2000001180270A001A47001033C00A001A6516
+:100B3000240200258E05002C10A0FFEC24020023C7
+:100B40008F8E001C8DCD007401A5602B1580FFE7F2
+:100B5000240200268CCF001400A7C02101F8202B0E
+:100B60001080FF998F99002C024020210A001A65FD
+:100B70002402002227BDFFE0AFB000108F900034A8
+:100B8000AFB10014AFBF00188E0500103C03080081
+:100B90008C6331B00080882130A43FFF0083102B8C
+:100BA000104000078F8600382409FF8090CA000D8E
+:100BB000012A4024310700FF14E000098F8B003C1C
+:100BC0002410000D02202021A39000508FBF001898
+:100BD0008FB100148FB000100A0016A927BD0020A5
+:100BE000116000080005C3828F8F00248F8EFED411
+:100BF0002407FFFD95EC007095CD000A11AC00387C
+:100C00008FBF00183305000314A00010000000007F
+:100C10009219000213200041000000008E060024FB
+:100C200050C0000F92040003022020212402000F74
+:100C30000E0016A9A38200502408FFFF14480007E5
+:100C40002407FFFF0A001AE28FBF001890C3000DAF
+:100C50003064000810800037022020219204000335
+:100C600024070002308900FF15270005308F00FFA0
+:100C70008F8A003C11400031240C002C308F00FF83
+:100C800039E500102CAD00012DEE000102002821F5
+:100C900001CD30250E0016C9022020212410FFFFAF
+:100CA0001050000E2407FFFF8F83003C10600017D8
+:100CB000022020213C1908008F39318C0323C02BDE
+:100CC0005700000C2411002D0220202100002821B3
+:100CD0000E0017A524060001000038218FBF001860
+:100CE0008FB100148FB0001000E0102103E0000865
+:100CF00027BD00200E0016A9A39100501450FFF646
+:100D00002407FFFF0A001AE28FBF00180E001730F9
+:100D1000240500010A001AE1000038218CDF0024BC
+:100D20008E020024545FFFC1022020210A001AC253
+:100D3000920400030A001AB62402001002202021A7
+:100D40000E0016A9A38C0050240BFFFF104BFFE3ED
+:100D50002407FFFF0A001AC99204000330A500FF10
+:100D60002406000124A9000100C9102B1040000C2A
+:100D700000004021240A000100A61823308B000146
+:100D800024C60001006A38040004204211600002F9
+:100D900000C9182B010740251460FFF800A618238E
+:100DA00003E000080100102127BDFFD8AFB00018F4
+:100DB0008F900034AFB1001CAFBF00202403FFFFB1
+:100DC0002411002FAFA30010920600002405000894
+:100DD00026100001006620260E001B01308400FF53
+:100DE00000021E003C021EDC34466F410A001B2933
+:100DF0000000102110A000090080182124450001E6
+:100E000030A2FFFF2C4500080461FFFA00032040D8
+:100E10000086202614A0FFF9008018210E001B0177
+:100E2000240500208FA300102629FFFF313100FF89
+:100E300000034202240700FF1627FFE201021826E2
+:100E400000035027AFAA0014AFAA00100000302101
+:100E500027A8001027A7001400E6782391ED0003CF
+:100E600024CE000100C8602131C600FF2CCB000455
+:100E70001560FFF9A18D00008FA200108FBF002028
+:100E80008FB1001C8FB0001803E0000827BD0028B8
+:100E90009383003027BDFFE024020034AFB100147B
+:100EA000AFB00010AFBF001CAFB2001800808821A7
+:100EB0001062006200A080219204000414800045AA
+:100EC0008F880024A38000288E0500048D0600C8AA
+:100ED0003C0700FF34E3FFFF00A3282400C5102BCC
+:100EE0001440004DAF85003C978A00448F8700482E
+:100EF0000147102310A00032A78200448F98001CE5
+:100F0000304CFFFF9312007C0012788231F1000117
+:100F10000011708001C56821018D582B116000619E
+:100F20008F8600248F8900208F84004C1089005EFA
+:100F30003C023F018E1F00003C10250003E2C82444
+:100F40001730007A8F8400348F8700348F86002416
+:100F50008CE30000ACC300788CE50010ACC50088C1
+:100F60008F8700488F85003C938D002830AE0003AA
+:100F7000000E4023310A0003014D4021A3880028C0
+:100F800094CB00AC01276021AF8C002035691000A4
+:100F9000A4C900AC1620005101452021AF840048AF
+:100FA000000020218FBF001C8FB200188FB10014E9
+:100FB0008FB000100080102103E0000827BD002042
+:100FC0008F840020AF800048008730210A001B92E8
+:100FD000AF860020241F000CA39F00500E0016A90E
+:100FE000022020212419FFFF1059FFEE2404FFFFE7
+:100FF0008F880024A38000288E0500048D0600C879
+:101000003C0700FF34E3FFFF00A3282400C5102B9A
+:101010001040FFB5AF85003C0220202124090019B3
+:10102000A38900500E0016A92411FFFF1051FFDD07
+:101030002404FFFF0A001B648F85003C8F8400247A
+:101040008F8700348CF20030908600C430C50010C9
+:1010500014A000108F8300482C680005150000289C
+:1010600000000000908A00C4246BFFFC314900108E
+:1010700015200008316400FF8F8D004C8F8C0020FC
+:1010800011AC0004388F000131EE000115C0002FB3
+:10109000000000000E001B14000000000A001BEB03
+:1010A000000000008F890020938D002830AE0003DF
+:1010B000000E4023310A0003014D4021A38800287F
+:1010C00094CB00AC01276021AF8C00203569100063
+:1010D000A4C900AC1220FFB101452021251800044D
+:1010E000A398002894CF00AC24920004AF9200484B
+:1010F00035F12000A4D100AC0A001B930000202190
+:101100008C8200DC1242FF6C022020212418000592
+:10111000A39800500E0016A92412FFFF1452FF6678
+:101120002404FFFF0A001B948FBF001C30E500FF62
+:101130000E0015B0000030218F8600248F870048F4
+:101140008F8900200A001B848F85003C0E0015DB70
+:10115000000000000A001BEB000000009383004227
+:1011600027BDFFE024020002AFB20018AFB10014A7
+:10117000AFBF001C00808821AFB00010000090219C
+:10118000106200552404FFFD978300448F850048BA
+:101190003066FFFF00C5202B1480005B9387003072
+:1011A0003C0880009504012010E500528F8A002041
+:1011B0008F84004C30A500FF0E0015B024060001FE
+:1011C0008F9F00543C0580003C19408027ED01783A
+:1011D00031B00078240EFF800219582534AF090081
+:1011E00031B8000701AE6024ACAC0800030F8021C9
+:1011F000ACAB081002202021020028210E001B4E5B
+:10120000AF9000342403FFFF104300332404FFFF9A
+:101210008E0C00103C0708008CE731B092060000ED
+:1012200031843FFF0087102B1040002330CD003F5A
+:101230008F980054000471803C0408008C8431A80D
+:101240002409FF809390004100984021010E202145
+:1012500000897024000E51403C0980003099007FC5
+:101260003C0F00808F8800243525094035E20001BD
+:1012700001593825308B0078308600073C03100078
+:101280003C1F800C00C5C0210162582500E3502599
+:10129000033F782136050001AD2E0804AF980038D1
+:1012A000AD2B0814AF8F002CAD2E0028AD040074B8
+:1012B000AD2A0830A3850041938300422410000327
+:1012C0005070002725A3FFE0240C0001106C001CC7
+:1012D00024060023024020218FBF001C8FB200187B
+:1012E0008FB100148FB000100080102103E00008BF
+:1012F00027BD0020314900035520FFAE8F84004CEC
+:101300000A001C278F90004C8F84004C306500FF32
+:101310000E0015B024060001938B00302405003424
+:1013200011650018978300448F8500483062FFFFE5
+:1013300000A25823AF8B00480A001C5FA78000441E
+:1013400011A6003700000000022020212411000B0C
+:101350000E0016A9A39100500A001C5F00409021C6
+:101360002C7200201240FFF80003F8803C070800B0
+:1013700024E7796003E7C8218F2D000001A0000851
+:10138000000000008F8500482CA200055440001D7D
+:10139000A7800044978A00443148FFFF00A84823F3
+:1013A0002D2F000511E00003314400FF24AEFFFCA7
+:1013B00031C400FF8F90004C8F9800201218000459
+:1013C00038990001332D000115A00029000000000C
+:1013D0008F910024922500C434A30010A22300C4DE
+:1013E000978300448F8500488F8400243062FFFF7C
+:1013F00000A25823AC8000DCA78000440A001C5FD8
+:10140000AF8B00483062FFFF00A258230A001C5F28
+:10141000AF8B00482403FFFF11830005000000008C
+:101420000E001981022020210A001C5F004090213B
+:101430000E001908022020210A001C5F00409021A4
+:101440000E0019E5022020210A001C5F00409021B7
+:101450000E00185F022020210A001C5F004090212E
+:101460000E001A87022020210A001C5F00409021F4
+:101470000E0015DB00000000978300448F850048B4
+:10148000306CFFFF00AC38232CFF000553E0FFA8B1
+:101490003062FFFF8F860024A7800044ACC200DCCE
+:1014A0003062FFFF00A258230A001C5FAF8B004888
+:1014B00027BDFFD0AFB20018AFB00010AFBF0028FB
+:1014C000AFB50024AFB40020AFB3001CAFB100141F
+:1014D0003C0C80008D880128240FFF803C07800A87
+:1014E00025100100250B0080020F68243205007FC3
+:1014F000016F7024AD8E009000A72821AD8D0024CF
+:1015000090A700EC3169007F3C0A8004012A182171
+:10151000A38700429066007C00809021AF83001C6E
+:1015200030C20002AF880054AF85002400A018210B
+:10153000144000022404003424040030A38400304A
+:101540008C6600CC30F100FF24040004AF86004814
+:1015500012240004A38000508E5300041660001D66
+:101560003C0880009387004130F200011240000FD8
+:101570008FBF00288CB800748CA400742419FF80DD
+:101580000319882400117140308F007F01CF60253E
+:101590003C0D2000018D582530F500FE3C0A8000EE
+:1015A000AD4B0830A39500418FBF00288FB50024B4
+:1015B0008FB400208FB3001C8FB200188FB10014BD
+:1015C0008FB000102402000127BD003003E00008A6
+:1015D000ACA600CC8E590008951F01208E46001045
+:1015E000033FC0213307FFFF30F5000F32B4000185
+:1015F000AF8600201680003BA395004035060C0006
+:1016000002A6102100F51823AD030084AF82004C20
+:101610008E4900043128FFFF1100002BA7890044E8
+:101620002410FF803C1580003C1420000A001D4D52
+:101630002413FFFE90AE00C4020E682431AC00FFFC
+:101640001580002A0240202193840041978600449F
+:10165000308F000111E0000B026428248F890024E0
+:101660008D2300748D280074A38500410070102420
+:101670000002C940311F007F033FC02503148825A5
+:10168000AEB1083010C000108F85002490A700C4B0
+:1016900002075824316A00FF1540FFE6024020216E
+:1016A0000E001C01979100441040FFE89384004114
+:1016B0002405FFFD544500058E430020022028210B
+:1016C0000E001586024020218E4300203070000459
+:1016D0001600000A2414FFFB8F8500240A001D0356
+:1016E0008F8600480A001D2EAF86004C0E00182B76
+:1016F000000000000A001D3D9384004100749824FE
+:101700000E0015A0AE5300208F8500240A001D0393
+:101710008F86004827BDFFD8AFB3001CAFB10014BF
+:10172000AFBF0020AFB20018AFB000103C02800085
+:101730008C5201408C4B01483C048000000B8C0211
+:10174000322300FF317300FF8C8501B804A0FFFE37
+:1017500034900180AE1200008C8701442464FFF0B5
+:10176000240600022C830013AE070004A611000813
+:10177000A206000BAE1300241060004F8FBF0020A4
+:10178000000448803C0A0800254A79E0012A4021EB
+:101790008D04000000800008000000003C100800DC
+:1017A0008E1031A831733FFF001389800212282167
+:1017B000240CFF8000B12021264D01002647008027
+:1017C0003C0F80003C03800431A8007F30E9007F9B
+:1017D000308A007F3C0E800A3C02800C008CC024C2
+:1017E00001AC302400ECC82401239821014280215F
+:1017F000ADE60024010EF821ADF90090ADF8002807
+:10180000AF90002CAF9F0024AF93001C0E00167504
+:10181000016080213C0380008C6B01B80560FFFEF5
+:101820008F87002C8F8600243465018090F9000D8D
+:10183000ACB2000024C200780019C60000187E0374
+:10184000000F9027001227C2A4B00006108000707D
+:10185000240E6082A4AE0008A0A00005240F0002A0
+:10186000A0AF000B0004C4008F8B001C3C192700A4
+:1018700003199025ACB20010ACA00014ACA0002459
+:10188000ACA00028ACA0002C8D7300382411FF8080
+:10189000ACB3001890F0000D0230282430A400FFF3
+:1018A000108000058FBF002090EC000D319F007F5D
+:1018B000A0FF000D8FBF00208FB3001C8FB2001857
+:1018C0008FB100148FB000103C0A10003C0D800056
+:1018D00027BD002803E00008ADAA01B8265F01007B
+:1018E0002405FF8033F8007F3C06800003E5782460
+:1018F0003C19800A03192021ACCF0024908E00C42B
+:1019000000AE682431AC00FF1180FFEAAF840024F0
+:10191000248E007895CD00123C0C08008D8C31A8E7
+:101920003C03800C31AB3FFF01924821000B5180FA
+:10193000012A40213104007F010510240083382151
+:10194000ACC200280E001675AF87002C3C03800047
+:101950008C6501B804A0FFFE00000000AE1200007C
+:101960008C720144AE120004A6110008241100027A
+:10197000A211000BAE1300240A001DD88FBF002057
+:101980003C1260008E452C083C03F0033462FFFFDC
+:1019900000A2F824AE5F2C088E582C083C1901B028
+:1019A00003199825AE532C080A001DD88FBF0020BC
+:1019B000264D010031AF007F3C10800A240EFF80CD
+:1019C00001F0282101AE60243C0B8000AD6C0024A6
+:1019D0001660FFB8AF85002424110003A0B100EC0D
+:1019E0000A001DD88FBF002026480100310A007F61
+:1019F0003C0B800A2409FF80014B3021010920247F
+:101A00003C078000ACE400240A001DD7AF86002408
+:101A1000944D0012321F3FFF31AC3FFF159FFF8DE9
+:101A2000240E608290C300C42409FF800123102487
+:101A3000304A00FF1140FF87000000002407000427
+:101A4000A0C700EC8F87002C240860842406000DBA
+:101A5000A4A80008A0A600050A001DC2240F0002C9
+:101A60005F865437E4AC62CC50103A453662198533
+:101A7000BF14C0E81BC27A1E84F4B556094EA6FEF8
+:101A80007DDA01E7C04D7481800801008008008084
+:101A90008008000008004FBC08004FBC08005098A8
+:101AA0000800506C0800505008004F8C08004F8C04
+:101AB00008004F8C08004FC4080072BC080073086F
+:101AC000080072C8080071F0080072C8080072F8B7
+:101AD000080072C8080071F0080071F0080071F089
+:101AE000080071F0080071F0080071F0080071F052
+:101AF000080071F0080071F0080071F0080072E849
+:101B0000080072D8080071F0080071F0080071F048
+:101B1000080071F0080071F0080071F0080071F021
+:101B2000080071F0080071F0080071F0080071F011
+:101B3000080071F0080072D8080078900800775CFF
+:101B4000080078580800775C080078280800764478
+:101B50000800775C0800775C0800775C0800775C19
+:101B60000800775C0800775C0800775C0800775C09
+:101B70000800775C0800775C0800775C0800775CF9
+:041B8000080077845E
+:0C1B84000A000122000000000000000028
+:101B90000000000D747061342E362E3135000000C7
+:101BA00004060F010000000000000000000000001B
+:101BB0000000000000000000000000000000000025
+:101BC0000000000000000000000000000000000015
+:101BD0000000000000000000000000000000000005
+:101BE00000000000000000000000000000000000F5
+:101BF00000000000000000000000000000000000E5
+:101C000000000000000000000000000000000000D4
+:101C100010000003000000000000000D0000000D97
+:101C20003C020800244217C03C03080024632AB485
+:101C3000AC4000000043202B1480FFFD2442000430
+:101C40003C1D080037BD2FFC03A0F0213C1008000C
+:101C5000261004883C1C0800279C17C00E00025E5A
+:101C6000000000000000000D2402FF8027BDFFE0FF
+:101C700000821024AFB00010AF420020AFBF0018A8
+:101C8000AFB10014936500043084007F0344182131
+:101C90003C0200080062182130A50020036080216A
+:101CA0003C080111277B000814A000022466005C98
+:101CB0002466005892020004974301049204000431
+:101CC0003047000F3063FFFF308400400067282357
+:101CD00010800009000048219202000530420004F3
+:101CE000104000050000000010A0000300000000EC
+:101CF00024A5FFFC240900049202000530420004E0
+:101D0000104000120000000010A0001000000000B1
+:101D10009602000200A72021010440252442FFFE74
+:101D2000A7421016920300042402FF8000431024EF
+:101D3000304200FF104000033C0204000A00017220
+:101D4000010240258CC20000AF4210188F4201787A
+:101D50000440FFFE2402000AA7420140960200024E
+:101D6000240400093042000700021023304200071B
+:101D7000A7420142960200022442FFFEA74201440C
+:101D8000A740014697420104A74201488F4201083B
+:101D9000304200205040000124040001920200045F
+:101DA00030420010144000023483001000801821DB
+:101DB000A743014A000000000000000000000000EE
+:101DC00000000000AF48100000000000000000000C
+:101DD00000000000000000008F4210000441FFFEE0
+:101DE0003102FFFF104000070000000092020004D3
+:101DF0003042004014400003000000008F421018E1
+:101E0000ACC20000960200063042FFFF24420002EE
+:101E10000002104300021040036288219622000055
+:101E20001120000D3044FFFF00A710218F83003CDC
+:101E30008F45101C00021082000210800043102108
+:101E4000AC45000030A6FFFF0E0005B700052C02D0
+:101E500000402021A6220000920300042402FF80FB
+:101E600000431024304200FF1040001F000000001B
+:101E700092020005304200021040001B00000000EA
+:101E80009742100C2442FFFEA742101600000000EB
+:101E90003C02040034420030AF4210000000000059
+:101EA0000000000000000000000000008F42100051
+:101EB0000441FFFE000000009742100C8F45101CEB
+:101EC0003042FFFF244200300002108200021080E6
+:101ED000005B1021AC45000030A6FFFF0E0005B7E7
+:101EE00000052C02A62200009604000224840008AB
+:101EF0000E0001E73084FFFF974401040E0001F556
+:101F00003084FFFF8FBF00188FB100148FB0001016
+:101F10003C02100027BD002003E00008AF4201781A
+:101F20003084FFFF308200078F85002410400002BC
+:101F3000248300073064FFF800A4102130421FFF03
+:101F400003421821247B4000AF850028AF82002483
+:101F500003E00008AF4200843084FFFF3082000FAE
+:101F60008F85002C8F860034104000022483000FE0
+:101F70003064FFF000A410210046182BAF8500301C
+:101F80000046202314600002AF82002CAF84002C96
+:101F90008F82002C34048000034218210064182131
+:101FA000AF83003C03E00008AF4200808F82001442
+:101FB000104000088F8200048F82FFE41440000567
+:101FC0008F8200043C02FFBF3442FFFF00822024C6
+:101FD0008F82000430430006240200021062000FCA
+:101FE0003C0201012C620003504000052402000461
+:101FF0001060000F3C0200010A00022E00000000E9
+:1020000010620005240200061462000C3C0201115B
+:102010000A000227008210253C02001100821025D0
+:10202000AF421000240200010A00022EAF82000C11
+:1020300000821025AF421000AF80000C00000000AD
+:10204000000000000000000003E0000800000000A5
+:102050008F82000C10400004000000008F4210002E
+:102060000441FFFE0000000003E000080000000043
+:102070008F820010000229C224A3FFF0000318423F
+:102080002444F80000031140004310210002108096
+:1020900000431021000210803C0308002463180054
+:1020A0002C84030114800013004330218F84001816
+:1020B00000A4102B1440000F0000302100A41023B6
+:1020C00000021940006218210003188000621821E4
+:1020D0008F82001C008210212442FFFF0045102B3C
+:1020E00014400004000318803C02080024421A1423
+:1020F0000062302103E0000800C0102127BDFFE08E
+:10210000AFBF0018AFB10014AFB000103C046008BE
+:102110008C8250002403FF7F3C06600000431024A3
+:102120003442380CAC8250008CC24C1C3C1A8000EB
+:10213000000216023042000F10400007AF82001C60
+:102140008CC34C1C3C02001F3442FC00006218246B
+:10215000000319C2AF8300188F420008275B4000BC
+:1021600034420001AF420008AF8000243C02601CF2
+:10217000AF400080AF4000848C4500088CC3080845
+:1021800034028000034220212402FFF00062182460
+:102190003C0200803C010800AC2204203C025709AC
+:1021A000AF84003C14620004AF85003424020001B7
+:1021B0000A00028EAF820014AF8000143C0280003F
+:1021C000344400708C8300008F42000038420001CC
+:1021D0003042000110400018AF83003800804021D9
+:1021E000006030218D0700003C0508008CA5045CD0
+:1021F0003C0408008C84045800E6302300001021C1
+:1022000000A6282100A6302B008220210086202154
+:102210003C010800AC25045C3C010800AC240458D7
+:102220008F42000038420001304200011440FFEDAF
+:1022300000E03021AF8700383C028000344200705B
+:102240008C4700008F8600383C0508008CA5045C94
+:102250003C0408008C84045800E638230000102158
+:1022600000A72821008220218F82001400A7302B94
+:10227000008620213C010800AC25045C3C010800DC
+:10228000AC240458104000160000000097420104DE
+:10229000104000058F830000146000072462FFFFD8
+:1022A0000A0002D02C62000A2C6200105040000488
+:1022B0008F83000024620001AF8200008F83000042
+:1022C0002C62000A144000032C6200070A0002D7A7
+:1022D000AF80FFE41040000224020001AF82FFE45F
+:1022E0008F4301088F44010030622000AF83000457
+:1022F00010400008AF8400103C0208008C42042CFF
+:10230000244200013C010800AC22042C0A0005B361
+:102310003C0240003065020014A0000324020F00BC
+:102320001482026024020D0097420104104002C88A
+:102330003C02400030624000144000AD8F82003CFF
+:102340008C4400088F4201780440FFFE24020800FC
+:10235000AF42017824020008A7420140A740014291
+:10236000974201048F8400043051FFFF3082000146
+:1023700010400007022080212623FFFE24020002D5
+:102380003070FFFFA74201460A000304A74301483B
+:10239000A74001463C0208008C42043C1440000D5A
+:1023A0008F830010308200201440000224030009B3
+:1023B00024030001006020218F8300102402090003
+:1023C0005062000134840004A744014A0A00031F3C
+:1023D0000000000024020F0014620005308200207B
+:1023E000144000062403000D0A00031E2403000508
+:1023F000144000022403000924030001A743014AFA
+:102400003C0208008C4204203C0400480E00020AF2
+:10241000004420250E000233000000008F82000CD3
+:102420001040003E000000008F4210003C030020DE
+:1024300000431024104000398F8200043042000213
+:102440001040003600000000974210141440003382
+:1024500000000000974210088F88003C3042FFFFC8
+:1024600024420006000218820003388000E8302170
+:10247000304300018CC400001060000430420003AF
+:102480000000000D0A00036000E810215440001015
+:102490003084FFFF3C05FFFF0085202400851826BF
+:1024A0000003182B0004102B0043102410400005DB
+:1024B00000000000000000000000000D000000000F
+:1024C000240001CB8CC200000A00035F00452025D8
+:1024D0003883FFFF0003182B0004102B0043102447
+:1024E0001040000500000000000000000000000D8A
+:1024F00000000000240001D48CC200003444FFFF1F
+:1025000000E81021AC4400003C0208008C4204307A
+:10251000244200013C010800AC2204308F6200001C
+:102520008F84003CAF8200088C8300003402FFFFE0
+:102530001462000F000010213C0508008CA5045413
+:102540003C0408008C84045000B0282100B0302BDB
+:1025500000822021008620213C010800AC25045483
+:102560003C010800AC2404500A0005A9240400081A
+:102570008C820000304201001040000F000010214A
+:102580003C0508008CA5044C3C0408008C840448DD
+:1025900000B0282100B0302B0082202100862021AD
+:1025A0003C010800AC25044C3C010800AC24044864
+:1025B0000A0005A9240400083C0508008CA5044471
+:1025C0003C0408008C84044000B0282100B0302B6B
+:1025D00000822021008620213C010800AC25044413
+:1025E0003C010800AC2404400A0005A924040008AA
+:1025F0008F6200088F62000000021602304300F074
+:10260000240200301062000524020040106200E045
+:102610008F8200200A0005B12442000114A00005A9
+:1026200000000000000000000000000D000000009D
+:10263000240001FE8F4201780440FFFE00000000EC
+:102640000E00023B00000000144000050040802105
+:10265000000000000000000D000000002400020542
+:102660008E02000010400005000000000000000085
+:102670000000000D00000000240002088F62000C22
+:1026800004430003240200010A000457AE000000C6
+:10269000AE0200008F82003C8C480008A2000007B8
+:1026A0008F65000C8F64000430A3FFFF0004240238
+:1026B00000852023308200FF0043102124420005C2
+:1026C000000230832CC20081A605000A14400005D8
+:1026D000A2040004000000000000000D0000000043
+:1026E000240002208F85003C0E0005D5260400142E
+:1026F0008F6200048F430108A60200083C0210000C
+:1027000000621824106000080000000097420104D5
+:10271000920300072442FFEC346300023045FFFFC0
+:102720000A0003ECA2030007974201042442FFF0D1
+:102730003045FFFF960600082CC2001354400005E8
+:10274000920300079202000734420001A202000730
+:102750009203000724020001106200052402000316
+:102760001062000B8F82003C0A00040930C6FFFF94
+:102770008F82003C3C04FFFF8C43000C0064182453
+:1027800000651825AC43000C0A00040930C6FFFFA1
+:102790003C04FFFF8C4300100064182400651825DA
+:1027A000AC43001030C6FFFF24C2000200021083B9
+:1027B000A20200058F83003C304200FF000210801F
+:1027C000004328218CA800008CA2000024030004F0
+:1027D0000002170214430012000000009742010497
+:1027E0003C03FFFF010318243042FFFF0046102383
+:1027F0002442FFFE00624025ACA8000092030005C1
+:10280000306200FF0002108000501021904200143E
+:102810003042000F004310210A00043EA2020006CD
+:102820008CA40004974201049603000A3088FFFF3D
+:102830003042FFFF004610232442FFD6000214005E
+:1028400001024025ACA80004920200079204000592
+:102850002463002800031883006418213442000414
+:10286000A2030006A20200078F8200042403FFFBDC
+:102870003442000200431024AF8200049203000699
+:102880008F87003C00031880007010218C440020CA
+:102890003C02FFF63442FFFF00824024006718210B
+:1028A000AE04000CAC68000C920500063C03FF7FF0
+:1028B0008E02000C0005288000B020213463FFFF49
+:1028C000010330249488002600A728210043102407
+:1028D000AE02000CAC860020AC880024ACA800102E
+:1028E00024020010A742014024020002A740014236
+:1028F000A7400144A7420146974201043C04000856
+:102900002442FFFEA7420148240200010E00020AF1
+:10291000A742014A9603000A9202000400431021D4
+:102920002442000230420007000210233042000718
+:102930000E000233AE0200108F6200003C0308005C
+:102940008C63044424040010AF8200089742010401
+:102950003042FFFF2442FFFE00403821000237C30F
+:102960003C0208008C420440006718210067282BB5
+:1029700000461021004510213C010800AC2304440E
+:102980003C010800AC2204400A00053E00000000A3
+:1029900014A0000500000000000000000000000D71
+:1029A000000000002400029E8F4201780440FFFED8
+:1029B000000000000E00023B000000001440000573
+:1029C00000408021000000000000000D0000000019
+:1029D000240002A58E020000544000069202000767
+:1029E000000000000000000D00000000240002A80C
+:1029F0009202000730420004104000058F8200045C
+:102A00002403FFFB3442000200431024AF82000481
+:102A10008F6200040443000892020007920200063D
+:102A20008E03000CAE000000000210800050102148
+:102A3000AC430020920200073042000454400009D9
+:102A40009602000A920200053C0300010002108079
+:102A5000005010218C46001800C33021AC460018ED
+:102A60009602000A92060004277100080220202125
+:102A700000C2302124C60005260500140E0005D52D
+:102A800000063082920400068F6500043C027FFF3E
+:102A900000042080009120218C8300043442FFFF39
+:102AA00000A2282400651821AC83000492020007CC
+:102AB0009204000592030004304200041040001408
+:102AC00096070008308400FF000420800091202138
+:102AD0008C860004974201049605000A306300FFCB
+:102AE0003042FFFF004310210045102130E3FFFF7B
+:102AF000004310232442FFD830C6FFFF0002140019
+:102B000000C23025AC8600040A0004F292030007DC
+:102B1000308500FF0005288000B128218CA400002A
+:102B200097420104306300FF3042FFFF0043102151
+:102B3000004710233C03FFFF008320243042FFFFA7
+:102B400000822025ACA400009203000724020001AB
+:102B50001062000600000000240200031062001151
+:102B6000000000000A0005158E03001097420104C2
+:102B7000920300049605000A8E24000C00431021E5
+:102B8000004510212442FFF23C03FFFF0083202474
+:102B90003042FFFF00822025AE24000C0A000515FC
+:102BA0008E03001097420104920300049605000A68
+:102BB0008E24001000431021004510212442FFEE16
+:102BC0003C03FFFF008320243042FFFF00822025CA
+:102BD000AE2400108E0300102402000AA742014018
+:102BE000A74301429603000A920200043C040040FD
+:102BF00000431021A7420144A74001469742010427
+:102C0000A7420148240200010E00020AA742014A1D
+:102C10000E000233000000008F62000092030004E7
+:102C200000002021AF820008974201049606000AA6
+:102C30003042FFFF00621821006028213C03080099
+:102C40008C6304443C0208008C4204400065182157
+:102C5000004410210065382B004710213C0108007A
+:102C6000AC2304443C010800AC220440920400045C
+:102C7000008620212484000A3084FFFF0E0001E733
+:102C800000000000974401043084FFFF0E0001F5AE
+:102C9000000000003C021000AF4201780A0005B0BD
+:102CA0008F820020148200273062000697420104C0
+:102CB000104000673C0240003062400010400005B8
+:102CC00000000000000000000000000D00000000F7
+:102CD000240003968F4201780440FFFE240208007E
+:102CE000AF42017824020008A7420140A7400142F8
+:102CF0008F82000497430104304200011040000716
+:102D00003070FFFF2603FFFE24020002A7420146A7
+:102D1000A74301480A0005682402000DA7400146A8
+:102D20002402000DA742014A8F620000240400081B
+:102D3000AF8200080E0001E7000000000A00054213
+:102D400002002021104000423C024000936200003B
+:102D5000304300F0240200101062000524020070CD
+:102D600010620035000000000A0005B08F820020CC
+:102D70008F620000974301043050FFFF3071FFFF66
+:102D80008F4201780440FFFE320200070002102348
+:102D9000304200072403000A2604FFFEA743014037
+:102DA000A7420142A7440144A7400146A751014858
+:102DB0008F42010830420020144000022403000921
+:102DC00024030001A743014A0E00020A3C0400400C
+:102DD0000E000233000000003C0708008CE70444AA
+:102DE000021110212442FFFE3C0608008CC604405C
+:102DF0000040182100E33821000010218F650000F9
+:102E000000E3402B00C230212604000800C8302116
+:102E10003084FFFFAF8500083C010800AC27044464
+:102E20003C010800AC2604400E0001E70000000051
+:102E30000A000542022020210E0001390000000096
+:102E40008F82002024420001AF8200203C0240001B
+:102E5000AF420138000000000A00028F3C028000EF
+:102E60003084FFFF30C6FFFF00052C0000A6282598
+:102E70003882FFFF004510210045282B0045102116
+:102E800000021C023042FFFF0043102100021C021E
+:102E90003042FFFF004310213842FFFF03E00008EB
+:102EA0003042FFFF3084FFFF30A5FFFF00001821F4
+:102EB0001080000700000000308200011040000276
+:102EC00000042042006518210A0005CB00052840B7
+:102ED00003E000080060102110C0000624C6FFFFB8
+:102EE0008CA2000024A50004AC8200000A0005D5D5
+:102EF0002484000403E000080000000010A0000883
+:102F000024A3FFFFAC8600000000000000000000CA
+:102F10002402FFFF2463FFFF1462FFFA24840004ED
+:082F200003E0000800000000BE
+:042F280000000001A4
+:042F2C000A00002671
+:102F300000000000000000000000000D74787034F4
+:102F40002E362E3136000000040610000000000A64
+:102F5000000001360000EA600000000000000000F0
+:102F60000000000000000000000000000000000061
+:102F70000000000000000000000000000000000051
+:102F80000000000000000000000000000000001D24
+:102F90000000000000000000000000000000000031
+:102FA0000000000000000000000000000000000021
+:102FB0000000000000000000000000000000000011
+:102FC00000000000000000001000000300000000EE
+:102FD0000000000D0000000D3C02080024423B6090
+:102FE0003C03080024633E18AC4000000043202B43
+:102FF0001480FFFD244200043C1D080037BD7FFC07
+:1030000003A0F0213C100800261000983C1C08008A
+:10301000279C3B600E0004AE000000000000000D85
+:103020003C0580008F83003034A800708D070000BD
+:10303000008330253C02900000C22025ACA4002073
+:10304000AF8700243C0480008C8900200520FFFE0F
+:1030500000000000348400708C8500003C180800DB
+:103060008F18007C3C0D08008DAD007800A7C823A8
+:1030700003195021000070210159602B01AE582125
+:10308000016C38213C010800AC2A007C3C0108009E
+:10309000AC27007803E00008000000000A00003DB3
+:1030A000240400018F8500303C048000348300013B
+:1030B00000A3102503E00008AC82002003E0000814
+:1030C000000010213084FFFF30A5FFFF10800007B3
+:1030D000000018213082000110400002000420424C
+:1030E000006518211480FFFB0005284003E000085C
+:1030F0000060102110C00007000000008CA200003A
+:1031000024C6FFFF24A50004AC82000014C0FFFB0E
+:103110002484000403E000080000000010A0000860
+:1031200024A3FFFFAC8600000000000000000000A8
+:103130002402FFFF2463FFFF1462FFFA24840004CB
+:1031400003E000080000000090AA00318FAB0010DF
+:103150008CAC00403C0300FF8D680004AD6C002087
+:103160008CAD004400E060213462FFFFAD6D0024AF
+:103170008CA700483C09FF000109C024AD67002866
+:103180008CAE004C0182C82403197825AD6F000471
+:10319000AD6E002C8CAD0038314A00FFAD6D001CC7
+:1031A00094A900323128FFFFAD68001090A70030CD
+:1031B000A5600002A1600004A167000090A3003296
+:1031C000306200FF00021982106000052405000132
+:1031D0001065000E0000000003E00008A16A000175
+:1031E0008CD80028354A0080AD7800188CCF0014A8
+:1031F000AD6F00148CCE0030AD6E00088CC4002C76
+:10320000A16A000103E00008AD64000C8CCD001C35
+:10321000AD6D00188CC90014AD6900148CC8002471
+:10322000AD6800088CC70020AD67000C8CC200148C
+:103230008C8300700043C82B13200007000000009F
+:103240008CC20014144CFFE400000000354A0080DA
+:1032500003E00008A16A00018C8200700A0000C629
+:10326000000000009089003027BDFFF88FA8001CE7
+:10327000A3A900008FA300003C0DFF8035A2FFFF33
+:103280008CAC002C00625824AFAB0000A1000004FD
+:1032900000C05821A7A000028D06000400A048210C
+:1032A0000167C8218FA50000008050213C18FF7FD6
+:1032B000032C20263C0E00FF2C8C0001370FFFFF53
+:1032C00035CDFFFF3C02FF0000AFC82400EDC02455
+:1032D00000C27824000C1DC00323682501F8702566
+:1032E000AD0D0000AD0E00048D240024AFAD000034
+:1032F000AD0400088D2C00202404FFFFAD0C000C51
+:103300009547003230E6FFFFAD06001091450048BA
+:1033100030A200FF000219C2506000018D24003469
+:10332000AD0400148D4700388FAA001827BD00088F
+:10333000AD0B0028AD0A0024AD07001CAD00002C29
+:10334000AD00001803E00008AD00002027BDFFE03D
+:10335000AFB20018AFB10014AFB00010AFBF001C87
+:103360009098003000C088213C0D00FF330F007F93
+:10337000A0CF0000908E003135ACFFFF3C0AFF006B
+:10338000A0CE000194A6001EA22000048CAB001465
+:103390008E29000400A08021016C2824012A4024E9
+:1033A0000080902101052025A6260002AE240004FD
+:1033B00026050020262400080E00007224060002C4
+:1033C00092470030260500282624001400071E001E
+:1033D0000003160324060004044000032403FFFF37
+:1033E000965900323323FFFF0E000072AE23001007
+:1033F000262400248FBF001C8FB200188FB1001448
+:103400008FB0001024050003000030210A00007C6A
+:1034100027BD002027BDFFD8AFB1001CAFB00018FA
+:10342000AFBF002090A900302402000100E050212D
+:103430003123003F00A040218FB000400080882150
+:1034400000C04821106200148FA70038240B00052B
+:1034500000A0202100C02821106B001302003021A1
+:103460000E000108000000009225007C30A400023C
+:103470001080000326030030AE0000302603003425
+:103480008FBF00208FB1001C8FB00018006010218A
+:1034900003E0000827BD00280E000087AFB0001031
+:1034A0000A00014F000000008FA3003C0100202112
+:1034B0000120282101403021AFA300100E0000CED2
+:1034C000AFB000140A00014F000000008F820050CE
+:1034D00024430001304200FFAF83005003E00008A6
+:1034E000000000003C0580008CA30E108F84004477
+:1034F000AC8300208CA20E1803E00008AC820024EC
+:103500003C0580008CA30E148F840044AC83002003
+:103510008CA20E1C03E00008AC82002493820038C9
+:103520001040001B2483000F2404FFF000643824A3
+:1035300010E00019978B002C9784004C9389002E83
+:103540003C0A601C0A0001900164402301037021C1
+:10355000006428231126000231C2FFFF30A2FFFFC2
+:103560000047302B50C0000E00E448218D4D000C68
+:1035700031A3FFFF00036400000C2C0304A1FFF340
+:103580000000302130637FFF0A000188240600011B
+:1035900003E00008000000009784004C00E448218C
+:1035A0003123FFFF3168FFFF0068382B54E0FFF83C
+:1035B000A783004C938A002E11400005240F0001C0
+:1035C000006BC023A380002E03E00008A798004CE6
+:1035D000006BC023A38F002E03E00008A798004CC7
+:1035E00003E000080000000027BDFFE8AFB00010B6
+:1035F0003084FFFF3C10800093A8002BAFBF001465
+:10360000A6040144960A0E1630C600FF8FA90030AA
+:10361000A60A0146AE050148A2060152A608015AB3
+:10362000AE0701608FA3002CA609015801202021BC
+:103630000E00017CAE0301543C021000AE02017882
+:103640008FBF00148FB0001003E0000827BD0018E2
+:103650003C038000346200708C4900008F87003C7E
+:103660002484000727BDFFF83084FFF8AF890024C9
+:103670003C088000950E008A31CDFFFFAFAD000001
+:103680008FAC000001875823256AFFFF31461FFFDA
+:1036900000C4282B14A0FFF7350D00708DAC00007E
+:1036A0003C0508008CA500843C0A08008D4A008077
+:1036B000018958230000102100ABC0210007C882F7
+:1036C00001422021030B302B0019388035094000BE
+:1036D0000086782100E9102127BD00083C01080080
+:1036E000AC3800843C010800AC2F008003E00008E7
+:1036F000000000008F82003C2486000730C5FFF8E0
+:1037000000A2182130641FFF03E00008AF84003CD2
+:103710003C0320FF27BDFFE83C0760003C08800019
+:10372000240500103464FFFDACE53008AFBF001085
+:10373000AD040E00000000000000000000000000CA
+:1037400000000000000000003C0200FF345FFFFDAD
+:10375000AD1F0E003C0B60048D7850002419FF7FD4
+:103760003C0E00020319782435EC380C35CD0109E4
+:10377000ACED4C1824060009AD6C50008CEA0438FE
+:10378000AD060008AD0000148CE94C1C3145FFFF6C
+:103790003C06570900091E0238A42F713062000F41
+:1037A00034C80010AF820048104000072485C0B321
+:1037B0008CEB4C1C3C0D001F35ACFC00016C502404
+:1037C000000A49C2AF8900348CF90808241FF000B0
+:1037D000033FC02403087026030678262DE8000165
+:1037E0002DC600010106382550E00009A3800038ED
+:1037F0003C09601C8D24000824030001A3830038C9
+:1038000030827C00A780004CA380002EA782002C71
+:10381000AF80005014A00003AF80003C3C05600066
+:10382000ACA0442C0E000559000000008FBF001012
+:103830000A000E9927BD001827BDFFC8AFB3002CA2
+:10384000AFB20028AFBF0030AFB10024AFB000204E
+:10385000936200080080982100A090211440003558
+:10386000240400100E0001C9000000000E000168D1
+:10387000004080210002C4003C1932000319882551
+:10388000AE110000936F0009976E0012936A000A50
+:1038900031EC00FF31CDFFFF018D5821000B4400BA
+:1038A000314900FF01093825AE0700048F8500501B
+:1038B0009784004000403021308320001460004D88
+:1038C000AE050008AE00000C3C0580009784004067
+:1038D0000662004F8E03000C3090000816000002B4
+:1038E000264800062648000294A40E148CA50E1C3F
+:1038F0008F670004936A00023084FFFF314900FFA4
+:10390000AFA900108F720014AFA800180E0001AF0D
+:10391000AFB200148FBF00308FB3002C8FB20028DD
+:103920008FB100248FB00020240400100A0001F29F
+:1039300027BD00389365000997710012936C000B46
+:1039400030AD00FF01B13021318B00FF00CB802171
+:103950002602000A3050FFFF0E0001C9020020219C
+:103960000E000168004088219368000997640012E6
+:103970000002FC00310900FF308AFFFF012A3821D4
+:1039800024E3000203E3C0253C1941000319782514
+:10399000AE2F00008F6E000C3C0D800095AC0E1415
+:1039A00001D32825AE2500048DA50E1C8F670004C9
+:1039B000936B00023184FFFF316600FFAFA6001059
+:1039C0008F68001400403021AFB200180E0001AF24
+:1039D000AFA80014020020218FBF00308FB3002C4D
+:1039E0008FB200288FB100248FB000200A0001F2AE
+:1039F00027BD0038976200123C0580009784004084
+:103A0000305FFFFF0661FFB4AE1F000C8E03000C99
+:103A10003C078000006798250A00026BAE13000C7B
+:103A200027BDFFD8AFB40020AFBF0024AFB3001C48
+:103A3000AFB20018AFB10014AFB00010936200082D
+:103A4000144000940080A021AF60000C97850040D6
+:103A500030A440001080009E24030016241040076C
+:103A6000A363000AAF700014938F00428F6C0014A0
+:103A700031EE0001000E6A40018D5825AF6B001435
+:103A8000978A00408F6800143149001001093825D9
+:103A9000AF6700149786004030C300081060009F95
+:103AA000000000008F6600143C0310003C048000FE
+:103AB00000C32825AF65001494820E0A3C1F8100C4
+:103AC0002413000E3059FFFF033FC025AF780004D8
+:103AD000A37300029372000A3406FFFC265100040F
+:103AE000A371000A978800403107200010E0009180
+:103AF000000000003C0B80009789004095680E0C88
+:103B000097840040000918423107C0003065000367
+:103B100000071303309F100000A2C025001FCA0336
+:103B200003199825001390C0A772001297910040C6
+:103B3000936F000A00118182320E003C01CF682190
+:103B400025AC003CA36C0009956A0E0C31493FFF7F
+:103B5000A7690010976D0012936C0009018D582120
+:103B6000256A00023149000700094023310300079C
+:103B7000A363000B93670009976400129765001018
+:103B800030E200FF8F900028979800400044F82111
+:103B900003E5C82103269821331200401240000596
+:103BA0003266FFFF00D0702B3C11800011C0001660
+:103BB000000090210206782B15E0002D0000202146
+:103BC0003C1080008E120E143C058000AE120E10C8
+:103BD0008E110E1CAE110E18AE060E008CB8000031
+:103BE000331300081260FFFD0000000094B90E08B6
+:103BF00000C0802100008821A79900408CA60E04F7
+:103C000024120001AF860028977F001033F3FFFFD6
+:103C10008E8900000130202310800058AE840000FF
+:103C2000022020210E000243020028218E8C000079
+:103C300015800005000000008F6D0014240EFFBFEA
+:103C400001AEA024AF7400148F78000C03138821F8
+:103C5000AF71000C936F000815E000030000000036
+:103C60001640004000000000A3720008020020215E
+:103C70008FBF00248FB400208FB3001C8FB20018B8
+:103C80008FB100148FB000100080102103E00008F5
+:103C900027BD00288F900028978200403C118000AB
+:103CA000020098213045004014A0FFD90000902167
+:103CB000976800108F8700283103FFFF1467FFEC1F
+:103CC00000002021000088210A000339241200018D
+:103CD0002403000E24104007A363000AAF700014F1
+:103CE000938F00428F6C001431EE0001000E6A4089
+:103CF000018D5825AF6B0014978A00408F6800141F
+:103D00003149001001093825AF670014978600403B
+:103D100030C300081460FF6300000000AF600004BF
+:103D2000A3600002978800403107200014E0FF7173
+:103D300000003021A760001297910040936F000AA5
+:103D40003C0B800032301F000010718301CF6821CE
+:103D500025AC0028A36C0009956A0E0C0A00030A22
+:103D6000A76A00108F6600143C1FEFFF37F9FFFEB3
+:103D700000D998240A00034FAF7300148F6B00140E
+:103D8000356A00400E00016EAF6A00140A00033E5F
+:103D9000022020218F8500448F8A003027BDFFC07C
+:103DA0003C048000AFB70034AFB40028AFB1001CB2
+:103DB000AFBF0038AFB60030AFB5002CAFB30024B2
+:103DC000AFB20020AFB000188C8701048CA900248A
+:103DD000AC8A00808CA8002000E988230000B8216C
+:103DE000AC880E108CA600240000A021AC860E1812
+:103DF0008C820E10AC820E148C830E18AC830E1CB9
+:103E0000122000333C168000936B000811600054B0
+:103E100000000000976E001031CDFFFF022D602BD7
+:103E20001580004F0000000097700010320FFFFF58
+:103E3000AECF0E003C0580008CB30000327200084B
+:103E40001240FFFD0000000094B50E088CA50E0482
+:103E500032B0FFFF32140001128000440000000065
+:103E60000000000D3219A04024180040133800450E
+:103E70003214A0001280003F00000000937300087D
+:103E80001260000927A4001097620010305FFFFF46
+:103E900000BFC82B53200005AFB10010320800400E
+:103EA0001100003400000000AFB10010A7900040E6
+:103EB000AF8500280E0002BD000000000040A021D8
+:103EC000104000BE8FB100101620FFCF0000000090
+:103ED0002E96000102D78825122000178FBF0038C8
+:103EE0008F85003024170F0010B700713C0480004C
+:103EF0008C8F017805E0FFFE24180F0050B8008F6A
+:103F00003C0480008C990E14241402403C051000DF
+:103F1000AC9901448C930E1CAC930148A0800152D3
+:103F2000A480015AAC800160A4800158AC94015473
+:103F3000AC8501788FBF00388FB700348FB6003062
+:103F40008FB5002C8FB400288FB300248FB20020CF
+:103F50008FB1001C8FB0001803E0000827BD00409F
+:103F6000AED10E000A0003C33C05800014A0FFBEC2
+:103F70003219A0400E0001750000A0210A0003EADA
+:103F80002E9600013C0380008C7F017807E0FFFE45
+:103F9000240208008F84003CAC6201783C0380005E
+:103FA000946B008A316AFFFF0144382324E9FFFF44
+:103FB00031281FFF2D06000814C0FFF9346C4000A3
+:103FC00000A0A0210E000168008C90218F8300309A
+:103FD00024040F000040A821023488233C068000FE
+:103FE0001064000524050001938E004231C50001D4
+:103FF00000056A4035A500010015FC003C020100E7
+:1040000003E2C825AE5900008F93005032180036E5
+:10401000320F0008AE53000411E0004100B89825AB
+:1040200094C30E0A8F84003C3C0B8100306AFFFF72
+:104030002492000832481FFF014B48253C0710001E
+:10404000269200062410000EACC901600267982574
+:10405000A4D0015AAF88003CA4D201581620000811
+:104060003C1080008F8E003024050F0051C50002E7
+:1040700024170001367300400E00016E3C108000D2
+:104080008E180E1402402021AE1801448E0F0E1C13
+:10409000AE0F0148A2150152AE1301540E00017C6F
+:1040A0003C151000AE1501780A0003E7000000007F
+:1040B000128000053C07800094F20E08324900404F
+:1040C00011200042000000008C8A01780540FFFEAC
+:1040D0000000000094950E103C1005002403200001
+:1040E00032AEFFFF01D06825AC8D014C8C8C0E14D4
+:1040F0003C0B1000AC8C01448C860E1CAC86014835
+:10410000A0800152A480015AAC800160A4800158B3
+:10411000AC830154AC8B01780A0003F13C048000AD
+:104120008F8D003C26920002A4D2015825AC0008D5
+:1041300031861FFF0A00044CAF86003CAC80014C66
+:1041400012800019000000008C9F0E10AC9F0144EB
+:104150008C830E183C08800024110040AC83014879
+:104160008FBF0038A10001528FB70034A500015A5B
+:104170008FB60030AD0001608FB5002CA50001584E
+:104180008FB40028AD1101548FB300248FB20020EA
+:104190008FB1001C8FB000183C04100027BD0040F8
+:1041A00003E00008AD0401788C820E14AC82014457
+:1041B0008C830E1C0A00048B3C0880000E000175E5
+:1041C0002E9600010A0003EB02D7882500000000AC
+:1041D0000000000D000000002400033A0A000467FC
+:1041E0003C04800027BDFFD8AFB100143C11800013
+:1041F000AFB00010AFB40020AFB3001CAFB20018D6
+:10420000AFBF00243C13080026733C340E0001F9B4
+:10421000363000703C14080026943CB40200902113
+:104220008E0800008E2400003883000130620001F7
+:10423000104000163C0A8000024048218D270000F3
+:104240003C1F08008FFF006C3C0F08008DEF0068DA
+:1042500000E8102303E260210000C0210182702BDE
+:1042600001F8682101AE40213C010800AC2C006C33
+:104270003C010800AC2800688D4B00003966000145
+:1042800030C5000114A0FFED00E040218E1F0000AA
+:104290003C1808008F18006C3C0D08008DAD0068BC
+:1042A00003E8C823031938210000702100F9602BAE
+:1042B00001AE4021010C58213C010800AC27006CE4
+:1042C0003C010800AC2B00688E2801002406FF800A
+:1042D0003C04800A2505024000A64824AE280020A0
+:1042E000AE2900248E09000030A3007F0064502115
+:1042F0003C078000AF8A0044AF880030AF890024BB
+:104300008CE201780440FFFE000000008E1F0000D8
+:104310003C1808008F1800743C0D08008DAD00702B
+:1043200003E9C82303195821000070210179302BBB
+:1043300001AE602101864821240508003C010800E7
+:10434000AC2B00743C010800AC290070ACE501788E
+:1043500090E40108A384004293830042306A000184
+:104360001140000F240E0D002502F8002C47030118
+:1043700010E0001C000819C22464FFF00004504241
+:10438000000A41400E00039A0113D8213C0A400064
+:104390003C088000AD0A01380A0004BD000000009E
+:1043A000110E0026240F0F00110F002A3C02800876
+:1043B0003447008090FF00002418005033F900FFBC
+:1043C0001738FFF33C0A40000E0009A3000000006C
+:1043D0003C0A40003C088000AD0A01380A0004BDD8
+:1043E000000000008F8400340064282B14A0000B10
+:1043F0008F86004800866021258BFFFF0163482BD4
+:104400001520000600646823000D19400E00039A71
+:104410000074D8210A0005193C0A40000000000081
+:104420000000000D00000000240003AD0E00039A00
+:10443000000000000A0005193C0A40003C1B08006F
+:10444000277B3DB40E00039A000000000A00051906
+:104450003C0A40003C1B0800277B3DD40E00039A19
+:10446000000000000A0005193C0A40008F8200503D
+:1044700024430001304200FFAF83005003E00008F6
+:1044800000000000000411C003E0000824420240C4
+:104490003C04080024843BCC2405001A0A00007C5C
+:1044A0000000302127BDFFE0AFBF001CAFB20018F5
+:1044B000AFB10014AFB000103C108000920B0109A6
+:1044C0002412FF800E0005563164007F8F9100306A
+:1044D0000051502101524024AE08002492030109EA
+:1044E0000E0005563064007F24060080240700C0BB
+:1044F00024040040AE000810AE040814AE060818EC
+:10450000AE07081C920C01090051F82133F8007F16
+:104510003C19800A031910213184007F0E000556D2
+:10452000AF8200448E1101003C0C008035850001F3
+:104530000222782101F24824AE0908048E0E0100FF
+:10454000359800023609090001C2682131AB0078B4
+:1045500001655025AE0A08208E0501008E08010075
+:10456000360509800102182124640040009230249D
+:10457000AE0608088E07010000E2F82127F9004086
+:104580003332007802588825AE1108248E040100C9
+:10459000952F000C8FBF001C8FB2001831EEFFFF6B
+:1045A000000E69C0AE0D0800AE0C0828952B000C5B
+:1045B0008FB10014316AFFFF000A41C0AE08002C21
+:1045C0008CA300508FB000108CA2003C8D240004FE
+:1045D0008CA6001C8CA7003827BD0020AF83006884
+:1045E000AF820058AF840054AF86006003E000083B
+:1045F000AF8700643C0A0800914A3BF13C0908007F
+:1046000095293BEA3C051100000A3C0025280002E0
+:1046100000E8302500C5182524820008AC8300007E
+:1046200003E00008AC8000043C0880003507090066
+:1046300090E60011240200280080502130C300FFC2
+:1046400000A0602110620002340B86DD240B0800FC
+:104650003C07800034E20A9A9459000034EF0A9C27
+:1046600034ED0AA03338FFFFAD5800008DEE000096
+:1046700034E80A8024040001AD4E00048DA9000036
+:10468000AD4900089105001930A3000310640043F0
+:104690002866000214C000B0240400021064008BDD
+:1046A000240500031065009634E60AA43C090800BE
+:1046B00095293BE0240208005162004D3C0E800029
+:1046C0003C0E800035C5090090A6001290B9001973
+:1046D00035CB09808D68002830C700FF000778803F
+:1046E0003138FFFF332300FF01F8102100032500BC
+:1046F0000088702500025C003C0D600001CD302573
+:10470000356906FFAD490004AD4600008CA7002CBA
+:1047100025490028AD4700088CB90030AD59000C80
+:104720008CB80034AD5800108CAF0038AD4F001479
+:104730008CA3001CAD4300188CA800203C03800013
+:104740003462093CAD48001C8CA40024346F09007D
+:10475000AD4400208CAD0028AD4D00248C590000E4
+:10476000AD2C000425220014AD3900008C78010C1A
+:10477000AD38000891E800123C04080090843BF03A
+:10478000AD20001000082F0000046C0000AD602573
+:10479000358AFFFF03E00008AD2A000C3C09080041
+:1047A00095293BE03C0F080095EF3BEA34F90AA459
+:1047B0003C0E080095CE3BDC972800003138FFFF07
+:1047C00001F8682101AE382300082C0024E3FFF231
+:1047D00000A3202524020800AD44000CAD400010C9
+:1047E000AD4B00141562FFB6254A00183C0E800040
+:1047F00035CD090091A2001191A700193C050800D0
+:1048000094A53BE6304600FF35CB0A80956E002A22
+:104810000006C88230F800FF9787005C00191E0070
+:1048200000187C003128FFFF00A82021006F4825D8
+:104830000124102501C730213C0B4000004BC82546
+:104840000006C400AD590000AD58000491AF001837
+:104850003C03000624E90001000F46000103702517
+:10486000AD4E00088DA5002C3C0380003462093C4D
+:10487000AD45000C8DAB001C31247FFF2549001491
+:10488000AD4B00108C590000AD2C0004346F0900B2
+:10489000AD3900008C78010CA784005C252200143F
+:1048A000AD38000891E800123C04080090843BF009
+:1048B000AD20001000082F0000046C0000AD602542
+:1048C000358AFFFF03E00008AD2A000C34E20AA499
+:1048D00094460000951900283C09080095293BE002
+:1048E0000006C40000197C00370E810001EB68252A
+:1048F000AD4E000CAD4D00100A0005E2254A001433
+:104900003C09080095293BE03C18080097183BEA51
+:104910003C0F080095EF3BDC94CE00003139FFFFDF
+:10492000950D002803194021010F3823000E2400A3
+:10493000000D2C0024E3FFEE00A33025348281001B
+:10494000AD42000CAD460010AD400014AD4B001858
+:104950000A0005E2254A001C1460FF5434E90AA449
+:10496000952800003C09080095293BE000083C0020
+:1049700000EB1825AD43000C0A0005E2254A0010A3
+:1049800003E00008240207D027BDFFE0AFB2001803
+:10499000AFB10014AFB00010AFBF001C0E00005C40
+:1049A000008088218F8800588F8700543C0580083C
+:1049B00034B20080011128213C10800024020080C4
+:1049C000240300C000A72023AE0208183C0680087C
+:1049D000AE03081C18800004AF850058ACC5000465
+:1049E0008CC90004AF8900541220000936040980E4
+:1049F0000E00069500000000924C00278E0B0074FC
+:104A000001825004014B3021AE46000C360409806F
+:104A10008C8E001C8F8F006001CF682319A00004CA
+:104A20008FBF001C8C90001CAF9000608FBF001CDB
+:104A30008FB200188FB100148FB000100A00005E12
+:104A400027BD00208F8600688F8300588F82005416
+:104A50003C05800834A40080AC860050AC83003C48
+:104A600003E00008ACA200043C038000346700703F
+:104A70008CE30000308700FF3C0408008C84005465
+:104A800027BDFFF830AA00FF248200013C01080086
+:104A9000AC22005430C800FFAF8300243C098000E2
+:104AA0008D25017804A0FFFE352B00708D65000078
+:104AB000A3A700033C1808008F1800748FB90000EA
+:104AC0003C0D08008DAD007000A338233C047FFF2F
+:104AD00000E078213482FFFF0307382100007021B5
+:104AE0000322582401AE302100EF602B000847C09C
+:104AF00000CC182101682825AFA500003C01080062
+:104B0000AC2700743C010800AC2300709124010A1A
+:104B1000A3A000023C0280FFA3A400018FB8000004
+:104B2000314F007F3459FFFF03196824000F7600CE
+:104B30003C0B002001AE6025356A20002408FF8070
+:104B40003C06100027BD0008AD2C014CAD2A0154D5
+:104B5000A5200158A128015203E00008AD260178E4
+:104B60003C038000346200708C480000308A00FFF3
+:104B700030A900FFAF8800243C0480008C850178B8
+:104B800004A0FFFE348700708CEB00003C05080099
+:104B90008CA500743C1908008F390070016820232F
+:104BA00000A470210000102101C4C02B0322782131
+:104BB0003C07800001F868213C010800AC2E00741D
+:104BC00034E60A003C010800AC2D00708CCC0020BB
+:104BD0000009582B34E80980ACEC01448CC900244E
+:104BE000000B1540ACE90148A0EA01509104004CCB
+:104BF000A0E4016D03E00008A4E0015827BDFFE830
+:104C0000308400FFAFBF00100E00070D30A500FF7D
+:104C10008F8300588FBF00103C0580003446004051
+:104C20002404FF903C02100027BD0018ACA3014CE7
+:104C3000A0A40152ACA6015403E00008ACA2017884
+:104C400027BDFFE03C088008AFBF001CAFB20018D2
+:104C5000AFB10014AFB00010351000808E06001800
+:104C60003C078000309200FF00C72025AE040018EA
+:104C70000E00005C30B100FF9203000534620008B2
+:104C80000E00005EA2020005024020210E00073443
+:104C900002202821024020218FBF001C8FB2001863
+:104CA0008FB100148FB00010240500052406000108
+:104CB0000A0006CF27BD00203C08800027BDFFE882
+:104CC000AFB0001035050980AFBF001490A70009F0
+:104CD000240200063506090030E300FF241000041A
+:104CE000106200722408000294AE005C3C0D0204C5
+:104CF00031CCFFFF018D5825AC8B000090AA000835
+:104D000031490020112000080000000090BF004E33
+:104D10003C1901033738030033EF00FF01F8282561
+:104D200024100008AC85000490CC001190C900113B
+:104D3000318A00FF000A5882312700FF256A0005EA
+:104D4000000A108038E300281460002900824823FC
+:104D500090CF00123C1980003722090031E500FF96
+:104D60000005708001D06821000D340034C406FFB6
+:104D7000AD240004904C001190580012373F098078
+:104D80008FE400348F2F010C00105882330500FF90
+:104D900000AB702100083400008F1823000E6F0054
+:104DA00001A61025319F00FC3067FFFF03E9C021F9
+:104DB0000047C825014B7821000F2880AF19000C4F
+:104DC0000E00005C012580213C0A800824090004B3
+:104DD000354800800E00005EA10900090200102184
+:104DE0008FBF00148FB0001003E0000827BD00182B
+:104DF00090CE001190CD00193C07080094E73BE6E7
+:104E000031C600FF0006208231AC00FF00045E00C6
+:104E1000000C1C00016310250047C8253C1F400002
+:104E2000033FC0253C198000AD380000372209003F
+:104E3000904C001190580012373F09808FE40034E5
+:104E40008F2F010C00105882330500FF00AB70213A
+:104E500000083400008F1823000E6F0001A61025F3
+:104E6000319F00FC3067FFFF03E9C0210047C825E0
+:104E7000014B7821000F2880AF19000C0E00005C58
+:104E8000012580213C0A800824090004354800805F
+:104E90000E00005EA1090009020010218FBF00145E
+:104EA0008FB0001003E0000827BD00180A00076F4C
+:104EB0002408001227BDFFD8AFB40020AFB3001CF8
+:104EC000AFB20018AFB10014AFBF0024AFB00010F4
+:104ED0003C06800090C3010B309200FF30B300FF0E
+:104EE000306200300000A0211040007000008821D6
+:104EF00034C409809088000800083E0000072E0393
+:104F000004A00097240400048F8800583C01080086
+:104F1000A0243BF03C0C8000AD8000483C038000A6
+:104F2000906E010B31C5002010A000073C028000EC
+:104F300034790980933800080018860000107E0339
+:104F400005E2009C3C0280083450090034470A8086
+:104F5000904D010B94EB002C92030011921F001254
+:104F600090E50018307800FF33F900FF00197880D1
+:104F700001F8702101D1502130B100FF01514821C9
+:104F80002524000A31AC00403091FFFF000C302B8B
+:104F900002202021A78B005C3C010800A42A3BE6EC
+:104FA0003C010800A4293BE83C010800A4293BEA95
+:104FB0003C010800A4203BE03C010800A4203BDCAD
+:104FC0000E0001C9010680230E0005B20040202119
+:104FD000004020210E0005BF020028211680005C41
+:104FE000000000000E0001F2022020213C08080011
+:104FF00091083BF031140003128000163C1F80081A
+:105000008F8400583C0C800835860080248B00017A
+:10501000ACCB003C3C0580088CAA00040160202138
+:10502000014B482319200002AF8B00588CA40004C8
+:105030000E000695ACA400043C0F80008DEE0074B9
+:105040003C05800834AD0080004E8821ADB1000CD5
+:105050003C1F800837F9008002402021026028218F
+:10506000A320006B0E00070D3C1280008F980058A3
+:1050700034500006AE58014C0E0005503C13100091
+:10508000A24201528FBF0024AE5001548FB40020C1
+:10509000AE5301788FB100148FB3001C8FB200188B
+:1050A0008FB0001003E0000827BD002834C309803A
+:1050B000906F0008000F7600000E6E0305A000330D
+:1050C00034C209009059001B241F00103C01080045
+:1050D000A03F3BF0333800021300FF908F88005848
+:1050E0008F8300641468FF8E3C0380000E00005C18
+:1050F000000000003C0980083525008090A40009CC
+:1051000024070016308800FF1107000D0000000082
+:1051100090A600093C0C0800918C3BF0240A000882
+:1051200030C400FF358B00013C010800A02B3BF090
+:10513000108A002F240D000A108D00282402000C74
+:105140000E00005E000000000A0007FC8F88005877
+:105150000E000763004020210A00082E0000000016
+:105160003C0B8008356A00808D4800548CC9010CC6
+:105170001120FF66AF880058240600143C01080087
+:10518000A0263BF00A0007FB3C0C80009071000851
+:10519000241400023C010800A0343BF0323000200F
+:1051A0001200000B241400018F8800580A0007FC2D
+:1051B00024110008345F00808FE70038AC470004FA
+:1051C0008C430004AFE3003C0A0008073C02800067
+:1051D0008F8800580A0007FC24110004A0A20009CF
+:1051E0000E00005E000000000A0007FC8F880058D7
+:1051F000240200140A0008ADA0A2000927BDFFE8A0
+:10520000AFBF0014AFB000103C1080009202010943
+:10521000240500010E00070D304400FF3C1F8008EC
+:1052200093F8000E37E3008093F9000F906E00268C
+:1052300093E9000A332F00FF00186600000F6C008E
+:1052400031CB00FF018D5025000B3200014638257F
+:10525000312800FF3445600000E820252402FF814A
+:105260003C031000AE04014C8FBF0014AE05015486
+:10527000A2020152AE0301788FB0001003E00008D3
+:1052800027BD001827BDFFE8308400FFAFBF001026
+:105290000E00070D30A500FF344600403C0480009E
+:1052A0002405FF92AC860154A08501528F830058DB
+:1052B0008FBF00103C02100027BD0018AC83014CCA
+:1052C00003E00008AC82017827BDFFD8AFB2001818
+:1052D000AFB10014AFB00010AFBF0020AFB3001CDF
+:1052E0003C07800090E20109308600FF30B000FFEB
+:1052F000000618C232040002307100011480000759
+:10530000305200FF3C098008353300809268000568
+:105310003105000810A0000C30CA00100240202106
+:105320000E00074502202821240200018FBF002023
+:105330008FB3001C8FB200188FB100148FB0001013
+:1053400003E0000827BD00281540003034E50A00BE
+:105350008CB900248CB800081338004700004021A5
+:105360003C0E800835D30080926D0068240B00024B
+:1053700031AC00FF118B00803C068000927F004C16
+:1053800090C40109509F00043213007C1100006793
+:10539000000000003213007C1660005A02402021F9
+:1053A00016200008320C00013C07800034EB0A0094
+:1053B0008D6500248CE8010414A8FFDC0000102196
+:1053C000320C00011180000D024020213C108000B1
+:1053D0008E0E010C8F8D006811CD000800000000BA
+:1053E0000E0007E2022028218E0F010C3C188008D5
+:1053F00037100080AE0F0050024020210E0007340D
+:10540000022028210A000900240200013C070800AC
+:105410008CE7006424E600013C010800AC2600642F
+:105420001600000D00000000022028210E000734A5
+:1054300002402021926F0068240D000231EE00FF2F
+:1054400011CD0022024020210E0008B4000000000F
+:105450000A000900240200010E00003D240400019E
+:10546000926C0025020C58250E00005EA26B0025F0
+:105470000A000940022028218E6300188CE40104F0
+:105480008CBF002400031602149FFFB53045007F37
+:105490009269004C264400013093007F1265004061
+:1054A000312300FF1464FFAF3C0E80082648000142
+:1054B0003111007F310200FF1225000B240800018A
+:1054C000004090210A00090D241100012405000468
+:1054D0000E0006CF240600010E0008B400000000F4
+:1054E0000A000900240200012407FF800247282443
+:1054F00000A79026324200FF004090210A00090DCB
+:10550000241100010E0007E202202821320600309B
+:1055100010C0FFA332100082024020210E00074578
+:10552000022028210A000900240200018E630018CD
+:105530000240202102202821006610250E0008D6F6
+:10554000AE6200189264004C24050003240600019A
+:105550000E0006CF308400FF0E00003D2404000141
+:10556000926A0025020A48250E00005EA269002505
+:105570000A000900240200018E7800183C198000FE
+:105580000240202103197825022028210E0007342B
+:10559000AE6F00189264004C0A00098824050004CC
+:1055A0003246008038CA0080146AFF6E3C0E8008C4
+:1055B0000A0009612648000127BDFFC0AFB00018EE
+:1055C0003C108000AFBF0038AFB70034AFB600303A
+:1055D000AFB5002CAFB40028AFB30024AFB20020A9
+:1055E0000E00055EAFB1001C920401089205010B8C
+:1055F000308400FF0E0008E730A500FF144000D6FD
+:105600008FBF00383C09800835280080A100006B5E
+:105610003607098090E60000240200503C1708007D
+:1056200026F73DF430C300FF3C14080026943E04E6
+:10563000106200033C1080000000B8210000A0218F
+:10564000241F001036110A00361309808E1601043B
+:105650008F8D00588E38002436190A808E720020F3
+:105660003C010800A03F3BF0972C002C8EF5000079
+:10567000932B0018024D702302D878233C010800B8
+:10568000AC2F3BCC3C010800AC2E3BD03C010800C9
+:10569000AC2D3BF4A78C005C02A0F809317200FF2E
+:1056A000304A0002154000DA3045000110A000B475
+:1056B00000000000360509008E2B002490BF001169
+:1056C00090B9001290B6001133EF00FF333800FF9D
+:1056D00032CD00FF0018708001CF8021024D602183
+:1056E0000212A821258A00103C010800A4353BE8DD
+:1056F0003C010800AC2B3BF83C010800A42A3BE429
+:105700003C010800A4303BE60260B0213C1580005B
+:105710008F9200588F8400608ED3002024110006E1
+:1057200000923023027228233C010800AC313BEC8C
+:1057300004C000AF0000982104A000AD00C5102BEC
+:10574000104000AF000000003C010800AC263BD038
+:105750008E9000000200F8090000000030430002B3
+:105760001460006F004088213046000154C00011D1
+:105770008E9200043C0808008D083BD43C09C00010
+:105780003C04800001093825AEA70E008C8B000078
+:10579000316A00081140FFFD00000000948D0E08E2
+:1057A00024130001A78D00408C8C0E04AF8C0028C0
+:1057B0008E9200040240F8090000000002228825B1
+:1057C000322E000215C000A5000000003C180800A1
+:1057D00097183BDC3C12080096523BE83C19080045
+:1057E00097393BDE3C0708008CE73BD4031240218D
+:1057F0003C0B08008D6B3BF83C0E080095CE3BF24D
+:105800003C128000011978218E46010C00F86821B5
+:1058100025EC000201AE482101675021AF860068E7
+:105820003C010800AC2A3BF83C010800A4293BE0FD
+:105830003C010800A4283BEA0E0001C93184FFFFA7
+:105840000E000550004080213C010800A0223BF1E1
+:105850008E8200080040F809020020218F85005840
+:105860000E0005BF004020218E90000C0200F809B8
+:10587000004020213C03080094633BEA3C020800FE
+:1058800094423BDE00622021248500020E0001F2DA
+:1058900030A4FFFF3C1908008F393BCC3C1F0800A7
+:1058A0008FFF3BD4033FC0233C010800AC383BCC06
+:1058B00017000006000000003C0508008CA53BEC2A
+:1058C00034BF00403C010800AC3F3BEC126000429A
+:1058D0008F8200448E430E108F930044AE630020ED
+:1058E0008E440E18AE6400243C04080094843BE00F
+:1058F0000E000697000000008F8600588E8A001068
+:105900003C010800AC263BF40140F809000000000F
+:105910003C0908008D293BCC1520FF7E8F92005852
+:105920009796005C3C14800E323500100E0006C6BF
+:10593000A696002C56A000458EEB000432270040AE
+:1059400054E0001E8EF100088EEC000C0180F80976
+:10595000000000008FBF00388FB700348FB60030D2
+:105960008FB5002C8FB400288FB300248FB2002095
+:105970008FB1001C8FB0001803E0000827BD004065
+:10598000920901098F88003000093E0000E83025A7
+:10599000AE0600808E2300208E240024AFA30010CA
+:1059A000AE030E148FA20010AE020E10AE040E1C39
+:1059B000AE040E180A0009E3360509000220F809B2
+:1059C000000000008EEC000C0180F80900000000CF
+:1059D0000A000A8B8FBF0038240800012410000140
+:1059E000A4400020A44800220A000A6FAC50002402
+:1059F0003C010800AC203BD00A000A0A8E9000004F
+:105A00003C010800AC253BD00A000A0A8E90000039
+:105A100092110109000028210E000734322400FFF2
+:105A20008FBF00388FB700348FB600308FB5002C91
+:105A30008FB400288FB300248FB200208FB1001CD8
+:105A40008FB0001803E0000827BD00400160F8098E
+:105A5000000000000A000A85322700405260FFB1B2
+:105A60009796005C8EB60E148F940044AE9600207C
+:105A70008EAF0E1CAE8F00240A000A7E9796005C43
+:105A80008F8200000004218003E0000800821021C2
+:105A90003C07800834E20080904300690080402188
+:105AA000106000093C0401003C0708008CE73BF44F
+:105AB0008F83001C00E320230480000893890008E2
+:105AC00014E300030100202103E0000800801021FE
+:105AD0003C04010003E00008008010211120000BAD
+:105AE000006738233C0D800035AC0980918B007C29
+:105AF000316A0002114000202409003400E9702BB3
+:105B000015C0FFF10100202100E938232403FFFC28
+:105B100000A3C82400E3C02400F9782B15E0FFEAB5
+:105B20000308202130C400030004102314C0001413
+:105B3000304900030000302100A9782101E67021DE
+:105B400000EE682B11A0FFE03C0401002D3800019D
+:105B50000006C82B010548210319382414E0FFDA98
+:105B60002524FFFC2402FFFC00A218240068202149
+:105B700003E00008008010210A000AF42409003024
+:105B80003C0C80003586098090CB007C316A000493
+:105B90001540FFE9240600040A000B030000302131
+:105BA0003C0308008C63005C8F82000427BDFFE883
+:105BB000AFBF001410620005AFB00010000329C091
+:105BC00024A40280AF840000AF8300043C10800056
+:105BD00036030A00946500320E000AD530A43FFF58
+:105BE0008E0401003C180080370F00030082C8219A
+:105BF0002402FF80032260243329007F000CF94037
+:105C000003E94025332E00783C0D1000010D50258E
+:105C100001CF5825AE0C002836080980AE0C080CC0
+:105C2000AE0B082CAE0A0830910300693C06800CCC
+:105C30000126382110600006AF8700208D09003C46
+:105C40008D06006C0126382318E0007F000000005C
+:105C50003C0C8008358B00803C0A8000A160006904
+:105C6000355009808E0200383C06800034C50A0099
+:105C700090AD003C31A8002011000019AF82001C3B
+:105C8000240E00013C19800037300A00A38E000862
+:105C9000AF8000108E0400248F85001024180008A7
+:105CA000AF80000CAF8000143C010800A4383BDE3C
+:105CB0003C010800A4203BF20E000AD9000030216C
+:105CC000920F003C8FBF00148FB00010000F714284
+:105CD000AF82001827BD001803E0000831C20001A0
+:105CE00090B90032240F0001333800FF00182182E0
+:105CF000108F003F241F0002109F006234C20AC0B0
+:105D00003C03800034640A008C9900241720001D95
+:105D10003466090090830030241F00053062003F84
+:105D2000105F004C240500018F86000CA38500083D
+:105D3000AF860014AF8600103C19800037300A008F
+:105D40008E0400248F850010241800083C010800F0
+:105D5000A4383BDE3C010800A4203BF20E000AD927
+:105D600000000000920F003C8FBF00148FB00010A5
+:105D7000000F7142AF82001827BD001803E0000831
+:105D800031C200018C8800088C8D00248CCB00640B
+:105D90003C19800037300A00AF8B0010A380000848
+:105DA0008E0400248F86000C8F850010010D602367
+:105DB00024180008AF8C00143C010800A4383BDE16
+:105DC0003C010800A4203BF20E000AD900000000AC
+:105DD000920F003C8FBF00148FB00010000F714273
+:105DE000AF82001827BD001803E0000831C200018F
+:105DF00090A7003030E3003F5064002834C50AC04B
+:105E00008CAA00241540002234C809008CAB00483D
+:105E10003C0C7FFF3585FFFF016510243C18800096
+:105E2000AF82000C370509008F8E000C8CAF00602C
+:105E300001CF682B15A0000201C020218CA40060B6
+:105E40000A000B75AF84000C8D02006C0A000B5029
+:105E50003C0680008C8900488F86000C3C0A7FFF3E
+:105E60003550FFFF013038243C0480082405000130
+:105E7000AF870014AC80006CA38500080A000B8378
+:105E8000AF8600108C4400140A000B75AF84000C20
+:105E90008D0200680A000BBD3C18800034C40980E4
+:105EA0008C8600708CB0001400D0482B11200004A8
+:105EB000000000008C8200700A000BBD3C188000BE
+:105EC0008CA200140A000BBD3C1880008F850010C6
+:105ED00027BDFFE0AFBF0018AFB1001414A0000849
+:105EE000AFB000103C04800034870A0090E6003018
+:105EF0002402000530C3003F106200B7348409005B
+:105F00008F91000C00A080213C048000348E0A0098
+:105F10008DCD00043C0608008CC63BD031A73FFF66
+:105F200000E6602B5580000100E03021938F0008CF
+:105F300011E0007600D0102B349909809338007C52
+:105F400033040002108000772403003400C3F82BD0
+:105F500017E000D600C3302300D0102B3C0108000E
+:105F6000A4233BDC1440006D020018213C0408000F
+:105F70008C843BCC0064282B54A0000100602021BD
+:105F80003C05800034A90A009128003C3C0108002F
+:105F9000AC243BD4310300201460000200004821EF
+:105FA0008CA90E188F8800180128502B1140005F13
+:105FB000000000003C0508008CA53BD400A960212E
+:105FC000010C582B1160005C00B0682B01093823CC
+:105FD00000E028213C010800AC273BD4120000035C
+:105FE0002402FFFC10B0008C322A000300A2F82427
+:105FF0003C010800A4203BF23C010800AC3F3BD42C
+:1060000003E028218F840010120400063C0380085E
+:106010008C6A006C02002021AF91000C2550000119
+:10602000AC70006C8F8B001400858823AF9100103A
+:1060300001652023AF8400141220000224070018F9
+:10604000240700103C0E800835C6008090CD006803
+:10605000240C00013C010800A0273BF031A700FF01
+:1060600010EC0047000000001480001800002821F8
+:106070003C0B800091650109357109808E23001861
+:1060800030A500FF0003560224A300013146007F23
+:106090003070007F1206007E240CFF803C0F8008C9
+:1060A00035E90080A123004C3C0808008D083BEC3A
+:1060B000240E00023C010800A02E3C31350D0008E2
+:1060C0003C010800AC2D3BEC240500103C1F800077
+:1060D00037E40A009099003C333800201300000593
+:1060E00000A02021240200013C010800AC223BD486
+:1060F00034A400018FBF00188FB100148FB00010BE
+:106100000080102103E0000827BD00203C010800AA
+:10611000A4203BDC1040FF95020018210A000C105F
+:1061200000C018210A000C08240300303C050800B8
+:106130008CA53BD400B0682B11A0FFA80000000084
+:106140003C04080094843BDC0085782101E7702B37
+:1061500011C000072CA200043C1F60008FF95404FA
+:106160003338003F1700FFE3240400422CA2000450
+:106170001040FF9A240400420A000C738FBF0018DD
+:106180001528FFB9000000008CC200183C188000E0
+:10619000241900020058F825ACDF001837040A0063
+:1061A000A0D900689089003C240F000400A01021B1
+:1061B000312800203C010800A02F3C3111000002D2
+:1061C00024050010240200013C010800AC223BCC55
+:1061D0000A000C693C1F80008F8800148C890060C5
+:1061E0000109282B14A00002010088218C91006075
+:1061F0003C0B80008D640E18240A00010220282127
+:1062000002203021A38A00080E000AD90220802132
+:106210000A000BF7AF820018000A182312200007AB
+:10622000306400033C0D800035A7098090EC007CB1
+:10623000318B000415600019248E00043C01080015
+:10624000A4243BF23C18080097183BF203052021D8
+:1062500000C4782B11E0FF6C8F8400102CA6000581
+:1062600014C0FFA42404004230B900031720000228
+:1062700000B9182324A3FFFC3C010800AC233BD445
+:106280003C010800A4203BF20A000C3600602821E3
+:1062900000AC38240A000C5C00EC18263C01080015
+:1062A000A42E3BF20A000CC6000000003C010800CE
+:1062B000AC203BD40A000C72240400428F830014EB
+:1062C0003C0B8000356A0A001460000600001021B3
+:1062D000914600302405000530C400FF10850003FE
+:1062E0000000000003E000080000000091490048A1
+:1062F000312800FF000839C214E0FFFA3C0480088E
+:106300003C06080094C63BDC3C0308008C633BF46D
+:106310003C0508008CA53BD43C18080097183BF2BC
+:106320000066C8218C8E00040325782101F86821BD
+:1063300001AE60231980001D000000009158004C40
+:106340008F8D0020956E0E10330F00FF8DA9000475
+:1063500001CF30238DAA000030CFFFFF000F610076
+:10636000012C2821000038210147202100AC182BE6
+:106370000083C821ADA50004ADB9000091B8000AA2
+:1063800001F87021A1AE000A956C0E128F8A0020D0
+:10639000A54C00089549003825280001A54800387B
+:1063A0009147000D34EB0008A14B000D03E00008FD
+:1063B0000000000027BDFFD8AFB00018938F000881
+:1063C0008FB000143C087FFF8F8700103C0C8000CA
+:1063D0003518FFFFAFBF0020AFB1001C35990A0090
+:1063E00002181824932A003C000F5FC03C02BFFF34
+:1063F0002CF000013449FFFF006BF8253C08080031
+:106400008D083BF48F99001C3C18080097183BEA54
+:1064100003E9582400107F803C07EFFF3C05F0FFA4
+:10642000016F18253C1180003149002034E2FFFF44
+:1064300034ADFFFF362E098027A500102406000288
+:1064400001194023270A00020062182400808021DD
+:1064500015200002000058218D8B0E1CA7AA0012E7
+:106460000500003A2407000030EF00FF000F3F0056
+:10647000006740253C028008AFA80014344B008020
+:10648000916A00683C0F080091EF3BF13C09DFFF87
+:10649000353FFFFF000A602B3C02080094423BE4BA
+:1064A000A3AF0011011FC024000CCF400319182511
+:1064B0008FA70010AFA300143C1F080093FF3BF30D
+:1064C000A7A200168FA8001400ED48243C0B010081
+:1064D0003C0A0FFF012BC82533F80003354CFFFFA2
+:1064E000010D78243C027000032C382400181E0093
+:1064F00000E2482501E35825AFAB0014AFA9001016
+:1065000091DF007CA3BF00150E00007200000000A8
+:10651000362D0A0091A6003C30C4002010800006F1
+:10652000260200083C11080096313BE0262EFFFFB2
+:106530003C010800A42E3BE08FBF00208FB1001C5F
+:106540008FB0001803E0000827BD00288F8A0018CC
+:10655000016A602B5580FFC4240700010A000D501A
+:1065600030EF00FF938300083C02800027BDFFD876
+:1065700034480A0000805021AFBF002034460AC0D2
+:10658000010028211060000E34440980910700307A
+:10659000240B00058F89000C30EC003F118B000BA1
+:1065A00000003821AFA900103C0B80088D69006CF9
+:1065B000AFAA00180E00013AAFA90014A38000088A
+:1065C0008FBF002003E0000827BD00288D1F004872
+:1065D0003C1808008F183BD48F9900143C027FFFB1
+:1065E0008D0800443443FFFFAFA900103C0B800826
+:1065F0008D69006C03E370240319782101CF6823AF
+:1066000001A83821AFAA00180E00013AAFA9001462
+:106610000A000DA5A38000083C05800034A60A00EE
+:1066200090C7003C3C06080094C63BF23C020800C0
+:106630008C423BEC30E30020000624001060003167
+:10664000004448253C0880083505008090A3006878
+:1066500000006821240C000100005021240B0001DF
+:106660003C188000370F00708DE800003C07800068
+:10667000AF8800248CF901780720FFFE34E5007014
+:106680008CA200003C0308008C6300743C0F0800DF
+:106690008DEF007000482023006428210000C021F5
+:1066A00000A4302B01F8702101C640213C010800F4
+:1066B000AC2500743C010800AC280070ACEC01482B
+:1066C0003C0208008C423BF4A4EA0144A4EB0146DE
+:1066D000ACE2014C3C04080090843BF13C03800890
+:1066E000A0E40152ACE90154A4ED0158346D0080DE
+:1066F00091AC004C3C091000A0EC016D03E00008D7
+:10670000ACE901788CAC0E1C3C0B08008D6B3BD4C3
+:1067100094AA0E1694AE0E1401666821314BFFFF49
+:106720000A000DCD31CAFFFF3C04800034830A000B
+:106730009065003C30A200201040002B00000000BB
+:106740000000582100005021000048213C08800032
+:10675000350400708C8800003C078000AF8800245E
+:106760008CEC01780580FFFE34EE00708DCD0000CA
+:106770003C0508008CA500743C0408008C84007063
+:1067800001A8602300ACC02100001021030C302BB5
+:106790000082C821032678213C010800AC3800742F
+:1067A0003C010800AC2F0070ACEB01483C0E080027
+:1067B0008DCE3BF4240DFF91240B0040A4E901444D
+:1067C000A4EA0146ACEE014CA0ED0152ACEB015441
+:1067D000A4E0015890EA01093C091000A0EA016D0B
+:1067E00003E00008ACE901788C8B0E1894870E1238
+:1067F00094860E1030EAFFFF0A000E0830C9FFFF32
+:106800003C04800034830A009065003C30A20020E4
+:106810001040003927BDFFF8240C00010000502172
+:10682000240B00013C088000350400708C890000B6
+:106830003C088000AF8900248D0D017805A0FFFE83
+:10684000350E00708DC700003C0508008CA5007453
+:106850003C0408008C84007000E9682300ADC0216E
+:1068600000001021030D302B0082C821032678215F
+:106870003C010800AC3800743C010800AC2F0070EB
+:10688000910901093C0E080091CE3C313C0380FF88
+:10689000A3A900038FAD000031C7007F3462FFFF62
+:1068A00001A82025AFA400009106010AA3A00002C0
+:1068B0000007CE00A3A600018FA50000240E300023
+:1068C0003C09100000A2C02403197825AD0F014C2B
+:1068D00027BD0008AD0E0154A5000158AD0C0148BC
+:1068E000A50A0144240AFF80A50B0146A10A015212
+:1068F00003E00008AD0901788C8C0E1894870E1205
+:1069000094860E1030EBFFFF0A000E3E30CAFFFFE8
+:1069100027BDFFE8AFB000103C108000AFBF0014EF
+:1069200036180A00970F00320E000AD531E43FFFF7
+:106930008E0E0100240DFF803C04200001C258216E
+:10694000016D6024000C4940316A007F012A402516
+:10695000010438253C048008AE07083034860080E6
+:1069600090C500682403000230A200FF1043000419
+:106970008F9F000C8F990010AC9F0068AC99006449
+:106980008FBF00148FB0001003E0000827BD00186F
+:106990003C0A0800254A37FC3C090800252938D460
+:1069A0003C08080025082C743C07080024E739E45B
+:1069B0003C06080024C636383C05080024A5339060
+:1069C0003C04080024842FA03C030800246336EC18
+:1069D0003C020800244234883C010800AC2A3DFCFB
+:1069E0003C010800AC293DF83C010800AC283DF40E
+:1069F0003C010800AC273E003C010800AC263E10DC
+:106A00003C010800AC253E083C010800AC243E04D3
+:106A10003C010800AC233E143C010800AC223E0CB3
+:086A200003E000080000000083
+:086A2800800009408000090014
+:106A3000800801008008008080080000800E0000AF
+:106A4000800800808008000080000A8080000A0022
+:086A50008000098080000900AC
+:00000001FF
+/*
+ * This file contains firmware data derived from proprietary unpublished
+ * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
+ *
+ * Permission is hereby granted for the distribution of this firmware data
+ * in hexadecimal or equivalent format, provided this copyright notice is
+ * accompanying it.
+ */
diff --git a/firmware/bnx2/bnx2-rv2p-06-4.6.16.fw.ihex b/firmware/bnx2/bnx2-rv2p-06-4.6.16.fw.ihex
new file mode 100644 (file)
index 0000000..871de9e
--- /dev/null
@@ -0,0 +1,441 @@
+:100000000000000000000CA00000005800000000EC
+:1000100000000000000000000000000000000000E0
+:1000200000000000000000000000000000000000D0
+:1000300000000DE000000CF80000000500000000CA
+:1000400000000000000000000000000000000000B0
+:080050000000000000000000A8
+:0800580000000010B18000025D
+:100060000000001F0103010000000008AC000001B7
+:1000700000000000050000000000000C2F800001BF
+:10008000000000002B000000000000002B8000009A
+:1000900000000010203F006300000010213F00031B
+:1000A0000000001020BF0032000000188000FFFD9B
+:1000B00000000010B1B8B00D0000000B2FDF0002EF
+:1000C0000000000003D80000000000002C380000F1
+:1000D0000000001091D400000000000806005555F3
+:1000E0000000001880000075000000188000010B5F
+:1000F00000000008020000020000000F42E0001CA7
+:100100000000001091840A11000000102C62000B06
+:10011000000000188000001E00000008020000021D
+:100120000000000F42E0001C0000001091840A183B
+:10013000000000082C8000B1000000082D0000091C
+:100140000000001091D40000000000082D8001077D
+:10015000000000188000006F0000001880000015EB
+:1001600000000008B1000001000000082C8000B071
+:10017000000000082D000008000000082D8000018C
+:1001800000000018800000690000000B2FDF000253
+:100190000000000C1F800002000000002C0700007F
+:1001A0000000001091DE00000000000005000000CB
+:1001B000000000188000FFDC0000000B2FDF0002B1
+:1001C0000000000C1F800000000000002C07000051
+:1001D0000000001091DE000000000000050000009B
+:1001E000000000188000FFD60000000C1F800002F5
+:1001F0000000000005000000000000188000FFD390
+:100200000000000C298000020000000C1F8000028A
+:10021000000000002ADF0000000000082A0000059E
+:100220000000000805005555000000188000FFCDB3
+:10023000000000080224003C000000180004000038
+:10024000000000188000001C000000188000001E44
+:100250000000001880000052000000188000009E7E
+:10026000000000188000009D0000001880000000C1
+:10027000000000188000000000000018800000004E
+:10028000000000188000000000000018800000003E
+:10029000000000188000000000000018800000002E
+:1002A000000000188000000000000018800000DF3F
+:1002B000000000188000000000000018800000000E
+:1002C0000000001880000015000000188000001BCE
+:1002D000000000188000000000000018800000B43A
+:1002E000000000188000002E00000018800000DFD1
+:1002F000000000188000010A00000018800000D5EE
+:10030000000000188000012E000000188000003B53
+:10031000000000188000000000000018800000713C
+:100320000000000C1F80000100000000050000001C
+:10033000000000188000FFAC0000001091D4000005
+:100340000000000C298000010000000C1F8000014B
+:10035000000000082A000002000000000500000064
+:10036000000000188000FFA60000001091D40000DB
+:100370000000000C298000010000000C1F8000011B
+:100380000000000029420000000000082A000002CE
+:100390000000000005000000000000188000FF9F22
+:1003A000000000188000FF9E00000010B1BCB00AE1
+:1003B0000000000B2FDF00020000000003D8000047
+:1003C000000000002C3C00000000001091D4000050
+:1003D00000000008060055550000001880000016B7
+:1003E00000000018800000AC000000102C6201BA70
+:1003F0000000001880000005000000082C8000B1FB
+:10040000000000082D0000090000001091D4000039
+:10041000000000082D8001070000000C298000006A
+:100420000000000C1F8000000000001091DE0000A2
+:10043000000000002ADF0000000000082A0000067B
+:100440000000000805005555000000188000FF89D5
+:100450000000001091D400000000000C2980000171
+:100460000000000C1F800001000000082A00000BA3
+:100470000000000005000000000000188000FF835D
+:1004800000000018000200000000000006820000CA
+:1004900000000010B18A000600000000860C140065
+:1004A00000000010B18C00040000000005000000F6
+:1004B000000000082A0000010000001091D4000094
+:1004C00000000018000D0000000000000502000000
+:1004D0000000001091DE000000000018000A00007B
+:1004E00000000010B1A0B0130000000B2FDF0002CD
+:1004F000000000002C200000000000082C800000FC
+:10050000000000082D0000000000001091D4000041
+:100510000000000806005555000000188000FFEE9E
+:10052000000000082D80011C00000010001F0000CA
+:100530000000001091DE00000000000F476000087E
+:100540000000000F060E0001000000000F58000020
+:10055000000000000A640000000000000AE500003E
+:10056000000000090B66FFFF000000000D610000A5
+:1005700000000018800000130000000F4760000812
+:100580000000000B2FDF0002000000082C8000009C
+:10059000000000082D0000000000001091D40000B1
+:1005A000000000082D80011C0000000F060E000155
+:1005B00000000010001F0000000000000F580000A5
+:1005C0000000001091DE0000000000000A6400003E
+:1005D000000000000AE50000000000090B66FFFFB4
+:1005E000000000000D610000000000000262000039
+:1005F0000000000B2FDF00020000000031040000AB
+:1006000000000000309A0000000000000C96180066
+:10061000000000090C99FFFF00000004CC99340091
+:1006200000000010B1963202000000080F800000A8
+:100630000000000C298000010000001000220002D0
+:100640000000000C295200010000000C295200009B
+:10065000000000080200000E000000080280001ADE
+:1006600000000010B1C40A020000000802000003EC
+:1006700000000008220000010000000C1F800001A3
+:10068000000000002ADF0000000000002A0008002F
+:100690000000000805005555000000188000FF3FCD
+:1006A0000000000B2FDF00020000001091D40000BA
+:1006B000000000082A000001000000002C200000BB
+:1006C000000000082C800000000000082D00000041
+:1006D000000000082D80011C0000001091D40000D3
+:1006E0000000001091DE0000000000082C800006D1
+:1006F000000000082D00000600000000308000000F
+:100700000000000031000000000000082D800006FD
+:100710000000000C298000010000000C1F80000177
+:100720000000001091DE0000000000002ADF000041
+:10073000000000082A000010000000000500000072
+:10074000000000188000FF2A0000001091A0B009EE
+:10075000000000082C8000B1000000082D000009F6
+:100760000000001091D40000000000082D80010757
+:10077000000000188000FFAB00000018800000108F
+:1007800000000008AC000001000000188000000B11
+:10079000000000000380B0000000000B2FDF00020B
+:1007A000000000002C0040000000001091D4000068
+:1007B0000000000806005555000000188000FF9A50
+:1007C00000000018800000300000001880000006C3
+:1007D0000000000B2FDF0002000000002C000E00C4
+:1007E000000000082A000007000000080500555519
+:1007F000000000188000FF140000000006820000C6
+:100800000000000C298000010000000C1F80000186
+:10081000000000100CE70007000000090562FFFF60
+:1008200000000010BA6C1405000000002ADF000070
+:100830000000000021000000000000082A00000560
+:100840000000001091D40000000000082C8000B0CF
+:10085000000000082D0000080000000C31620018A4
+:10086000000000082D800001000000188000FF8CAF
+:1008700000000018000D000000000010B1A0B00E34
+:100880000000000B2FDF00020000000003D8000072
+:10089000000000002C2000000000001091D4000097
+:1008A0000000001880000014000000102C620002FC
+:1008B000000000188000000B0000000B2FDF00027A
+:1008C000000000002C0700000000000C1F80000149
+:1008D0000000001091DE0000000000000500000094
+:1008E000000000188000FEF6000000082C8000B117
+:1008F000000000082D0000090000001091D4000045
+:10090000000000082D8001070000000C2980000174
+:100910000000000C1F8000010000001091DE0000AC
+:10092000000000002ADF0000000000082A00000A82
+:100930000000000005000000000000188000FEEB31
+:100940000000000005020000000000082C8000B03C
+:10095000000000082D000008000000082D80015054
+:10096000000000000000000000000010205F0000F8
+:10097000000000082C800000000000082D0000008E
+:10098000000000082D8001080000000000000000A9
+:100990000000001091DE000000000018000A0000B6
+:1009A0000000001091D40000000000080600AAAA70
+:1009B000000000188000FF5B0000000C298000018F
+:1009C0000000000C1F800001000000082A00000940
+:1009D000000000080500AAAA000000188000FED749
+:1009E0000000001091D400000000000806005555DA
+:1009F000000000188000FF530000001091A03C028E
+:100A000000000010B1E662070000000B2FDF0002BB
+:100A1000000000002C310000000000092CB1007F14
+:100A2000000000082CD90000000000082D00000084
+:100A3000000000082D80010D00000010B1A8000684
+:100A400000000010205F0000000000002C200000CB
+:100A5000000000002CA70000000000082D0000107E
+:100A6000000000082D800108000000188000FF4CE5
+:100A700000000010B1A6001000000010001F0000D0
+:100A80000000000F0F300007000000000A600000A7
+:100A9000000000000AE100000000000F4B620008A7
+:100AA000000000090B1600FF000000000D620000AE
+:100AB000000000090D1A00FF0000001007300003BD
+:100AC0000000000C0D1A00080000000C0B160008B6
+:100AD0000000000F4CE30018000000000C992C00EF
+:100AE00000000004CC993400000000080F800000D2
+:100AF0000000000C298000010000000033310000DC
+:100B00000000000822000016000000002ADF00009C
+:100B1000000000082A00000C00000010009F0000E8
+:100B2000000000000F2000000000000C1F800001EA
+:100B30000000000805005555000000188000FEABBD
+:100B40000000001091D40000000000080600AAAACE
+:100B5000000000188000FF270000000F4722000857
+:100B600000000009070E000F00000008070E000833
+:100B700000000008028000010000000702851C0040
+:100B800000000008828500010000000002854C0082
+:100B90000000000742851C0000000003C3AA5200A9
+:100BA0000000000003B10E00000000074B071C000E
+:100BB0000000000F0F3000070000000F0A9600032E
+:100BC000000000000A955C00000000004A005A0086
+:100BD000000000000C960A00000000090C99FFFFBD
+:100BE000000000080D00FFFF00000010B196320267
+:100BF000000000080F80000500000010B1A80008E8
+:100C000000000010205F00000000000B2FDF00023A
+:100C1000000000002C200000000000002CA70000B5
+:100C2000000000082D000010000000082D800108C1
+:100C3000000000188000FF130000000C2980000154
+:100C400000000010001F00000000000C1F800001C9
+:100C5000000000002ADF0000000000082A00000D4C
+:100C6000000000080500AAAA000000188000FE8508
+:100C70000000001091D40000000000080600555547
+:100C8000000000188000FF010000000C2980000116
+:100C90000000000C1F800001000000082A0000076F
+:100CA0000000000805005555000000188000FE7D7A
+:100CB00000000008030500040000000683040C0087
+:100CC00000000008028502000000000086050C00FC
+:100CD00000000001860C0E00000000080204000461
+:100CE00000000000020418000000000083871800C4
+:080CF0000000001800020000E2
+:080CF80000000010B1800004AF
+:100D00000000001F0103010000000008050000FFB3
+:100D10000000001800020000000000002A0000008F
+:100D200000000010B1D400000000000C2980000178
+:100D30000000000802540008000000180004000031
+:100D40000000001880000010000000188000001152
+:100D5000000000188000003A000000188000010424
+:100D6000000000188000010300000018800001024C
+:100D70000000001880000102000000188000000040
+:100D8000000000188000011400000018800000FE20
+:100D9000000000188000000C0000001880000118FE
+:100DA000000000188000016A000000188000006741
+:100DB00000000018800000DA00000018800000E742
+:100DC000000000002A000000000000188000FFEB77
+:100DD000000000002A0000000000000C2980000034
+:100DE0000000001020530000000000188000FFE702
+:100DF000000000002A000000000000188000FFE54D
+:100E000000000018000200000000000005020000C1
+:100E1000000000109196342100000010205F0000B7
+:100E2000000000002C1E0000000000082C800006BE
+:100E3000000000082D000006000000082D800102BF
+:100E400000000000000000000000001091DE000023
+:100E5000000000000D61000000000018000A000002
+:100E600000000000050200000000001091963416FA
+:100E700000000010205F00000000000009D8000002
+:100E8000000000002C1E0000000000082C8000B2B2
+:100E9000000000082D00000A000000082D8001025B
+:100EA00000000000000000000000001091DE0000C3
+:100EB000000000000D620000000000002C13000084
+:100EC00000000018000A00000000000005020000F9
+:100ED000000000109196340900000010205F00000F
+:100EE000000000002C1E0000000000082C800006FE
+:100EF000000000082D00006A000000082D8001029B
+:100F000000000000000000000000001091DE000062
+:100F1000000000000D7A000000000018000A000028
+:100F20000000001091DE000000000010001F000013
+:100F3000000000002F80AA00000000002A0000002E
+:100F4000000000000D6100000000000003620000CE
+:100F5000000000002C4000000000000002638C0034
+:100F600000000000264600000000000802040012F5
+:100F700000000010B9060827000000000F5800000C
+:100F8000000000000A640000000000000AE5000004
+:100F9000000000090B66FFFF000000000C000000CD
+:100FA000000000000B800000000000080CC60012CA
+:100FB000000000188000FFCB000000080F80000335
+:100FC000000000000000000000000010009F000072
+:100FD00000000008271100120000000066900000C9
+:100FE00000000008A31B001200000010B1980003CD
+:100FF00000000010001F0000000000080F80000427
+:101000000000000822000003000000082C80000CF3
+:10101000000000082D00000C00000010009F0000E0
+:1010200000000000259600000000000C2980000050
+:101030000000000006660000000000008661180045
+:10104000000000090260000F0000000F020400020F
+:1010500000000010B60C08030000000C1FBF0000C9
+:101060000000000C33660010000000003214000085
+:1010700000000000329500000000000573662C009F
+:101080000000000031E32E00000000082D80001059
+:1010900000000010205300000000001091DE00004E
+:1010A000000000188000FF900000000023000000F6
+:1010B0000000000925E6FFFF000000082200000BE9
+:1010C0000000000C695200000000000C29800000A4
+:1010D0000000001020530000000000188000FF896D
+:1010E0000000001091DE000000000010001F000052
+:1010F000000000002F80AA00000000002A0000006D
+:10110000000000002C400000000000082C8000407F
+:10111000000000082D000020000000082D80011CA8
+:1011200000000000000000000000001091DE000040
+:101130000000000F42EA001000000010004F000401
+:1011400000000010B746920000000008024900129B
+:1011500000000010B5840A00000000000D610000CE
+:1011600000000010BA66345A00000000036200005C
+:1011700000000010B8630C5800000008830500123E
+:1011800000000010004F00020000000003490000B2
+:101190000000000183068C000000000083C60C00E4
+:1011A00000000010B1870010000000000B6E00006E
+:1011B000000000188000FF6B0000000106691400A9
+:1011C00000000010918C000200000008B4E900014A
+:1011D00000000010B1E92C4C0000000086692C00D2
+:1011E00000000000020000000000000902EAFFFF0A
+:1011F00000000010000C00020000000002040A00C1
+:101200000000000F460C00010000000F02850001E5
+:1012100000000010918C01FC00000010B7040E4388
+:10122000000000002C400000000000000F40000003
+:10123000000000000D610000000000000A640000D2
+:10124000000000000AE50000000000090B66FFFF37
+:10125000000000000C000000000000000B800000F7
+:10126000000000080C860012000000080F80000338
+:101270000000000C2952000000000010009F000038
+:101280000000000827110012000000006690000016
+:1012900000000000264600000000000023060000B9
+:1012A00000000010B198000500000010001F0000B1
+:1012B000000000080F800004000000000000000093
+:1012C00000000010001F00000000000032140000A9
+:1012D00000000000329500000000000031E32E0005
+:1012E0000000000573662C00000000002596000039
+:1012F00000000010B18700160000000C29800000DB
+:101300000000000F0F6B0007000000000D690000D7
+:10131000000000000A6C0000000000000AED000060
+:10132000000000000B6E0000000000000B800000B9
+:10133000000000000C870000000000080F80000380
+:1013400000000010205300000000000C6952000152
+:1013500000000010001F00000000000022C58C00EB
+:1013600000000000231B0000000000002711000007
+:10137000000000002690000000000010B8170E03C7
+:101380000000000C29800000000000188000FFF61B
+:1013900000000010B1980002000000080F80000457
+:1013A000000000082200001A000000082C80000C39
+:1013B000000000082D00000C000000082D80001027
+:1013C00000000010001F0000000000000D6E000073
+:1013D00000000003E7CF34000000000C298000006B
+:1013E0000000001091DE000000000010B18700072F
+:1013F00000000000361400000000000036950000D8
+:101400000000000037160000000000082C8000508B
+:10141000000000082D000030000000082D80000CA6
+:101420000000001020530000000000188000FF1F83
+:10143000000000002646000000000000230000001D
+:101440000000000925E6FFFF000000000B6E000011
+:1014500000000003E7CF2C00000000082200001B62
+:101460000000000C695200000000000C2980000000
+:101470000000001020530000000000188000FF153D
+:10148000000000002FD50000000000002A0000002E
+:1014900000000010003F000B000000000666000086
+:1014A000000000008661180000000009026000F0E2
+:1014B00000000010B70C08070000000C7366001055
+:1014C000000000082C800018000000082D00001803
+:1014D000000000082D8000020000000C5FBF00002B
+:1014E0000000001091DE0000000000188000FF07DF
+:1014F000000000002FD50000000000002A000000BE
+:10150000000000002C4000000000000C29800000BA
+:101510000000001091DE0000000000082C80001A7E
+:10152000000000082D00001A000000003300000039
+:10153000000000082D800002000000003180000043
+:101540000000001091DE0000000000082C80000C5C
+:10155000000000082D00000C000000082D80000491
+:1015600000000010205300000000001091DE000079
+:10157000000000188000FEF6000000188000FEF554
+:10158000000000002A00000000000010001F000002
+:10159000000000000F008000000000080F8000071E
+:1015A0000000001880000014000000000502000088
+:1015B000000000082200000900000000286D000063
+:1015C00000000000290000000000000F6568001006
+:1015D00000000003F66C940000000010B972A00433
+:1015E0000000000C73E700190000000C2142000409
+:1015F000000000003BF600000000000C2980000005
+:101600000000001020530000000000082200000825
+:101610000000000C6142000400000018000A0000F5
+:10162000000000002A00000000000010001F000061
+:101630000000000F0F470007000000080F8000089F
+:101640000000000C29800000000000102053000062
+:10165000000000188000FEDA0000001091DE00009B
+:10166000000000002FD5000000000010001F000047
+:101670000000000033510000000000002A000000BC
+:1016800000000010B1C600230000000F0F5000073B
+:10169000000000000A600000000000000AE10000F5
+:1016A0000000000F4B620008000000090B1600FF4D
+:1016B0000000000F4C620010000000000D620000EE
+:1016C000000000090D1A00FF000000100750000381
+:1016D0000000000C0D1A00080000000C0B1600089A
+:1016E000000000000CC60000000000000B8000009D
+:1016F0000000000006980000000000080F800003B2
+:101700000000001006C200040000000C29000002C6
+:1017100000000010264200020000000C29520003C5
+:10172000000000082200000100000010009F0000DF
+:1017300000000000231B00000000000027111A0019
+:1017400000000000669000000000000C295200001C
+:1017500000000010B19732090000000C2980000041
+:101760000000000006980000000000102053000058
+:101770000000000C295200030000000022C58C006C
+:1017800000000010001F0000000000080F80000390
+:10179000000000188000FFF300000010B1C8001323
+:1017A00000000010B1C600030000000C29800000FA
+:1017B00000000010205300000000000C295200001F
+:1017C0000000000C295200030000001006C20002B5
+:1017D0000000000C295200020000000022C58C000D
+:1017E00000000000276500000000000026E4000063
+:1017F000000000082200001600000010B1C600031F
+:10180000000000002348000000000010B180000527
+:1018100000000000234800000000000C29800000A8
+:101820000000000F0F500007000000188000001299
+:1018300000000008220000160000000C29800000B3
+:10184000000000003014000000000000309500008F
+:101850000000001007500003000000090B1600FFF5
+:10186000000000090D1A00FF0000000F31160008EB
+:10187000000000003162340000000003F16230001B
+:1018800000000010205F0000000000002C5100004C
+:10189000000000092CD1007F000000082CD90000B6
+:1018A000000000082D000000000000082D80000C42
+:1018B00000000000000000000000001091DE0000A9
+:1018C0000000001005C2000300000000330000000B
+:1018D000000000080F8000070000001020530000E7
+:1018E00000000010009F0000000000188000FE872C
+:1018F000000000002FD50000000000002A000000BA
+:101900000000000F0F50000700000010B1C6002DAE
+:101910000000000F4742000800000009070E000FFA
+:1019200000000008070E000800000010001F000063
+:1019300000000008090000010000000709121C0057
+:1019400000000003CBCA9200000000000B97A20029
+:101950000000000742171C00000000000B040000FC
+:101960000000000F0A840003000000000A959C009C
+:10197000000000004A009A000000000882120001E6
+:10198000000000010C170800000000000C978C00FC
+:101990000000000002180000000000080D00FFFF1A
+:1019A000000000080F8000060000000C2900000065
+:1019B0000000001006C200040000000C29520002C2
+:1019C00000000010264200020000000C2952000313
+:1019D000000000082200000100000010009F00002D
+:1019E00000000010B197320C00000000231B000023
+:1019F00000000000271108000000000066900000B1
+:101A00000000000C29800000000000000218000007
+:101A100000000010205300000000000C29520003B9
+:101A20000000000022C5360000000010001F00006A
+:101A3000000000080F800006000000188000FFF47E
+:101A400000000000231B0000000000002711080018
+:101A5000000000006690000000000010B1C8000BFC
+:101A60000000000C2980000000000010205300003E
+:101A70000000000C295200000000000C2952000355
+:101A80000000001006C200020000000C29520002F3
+:101A90000000000022C58C00000000002765000047
+:101AA0000000000026E400000000000023480000C1
+:101AB00000000008220000170000000C2980000030
+:101AC00000000010001F0000000000102053000064
+:081AD000000000188000FE4A2E
+:00000001FF
+/*
+ * This file contains firmware data derived from proprietary unpublished
+ * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
+ *
+ * Permission is hereby granted for the distribution of this firmware data
+ * in hexadecimal or equivalent format, provided this copyright notice is
+ * accompanying it.
+ */
diff --git a/firmware/bnx2/bnx2-rv2p-09-4.6.15.fw.ihex b/firmware/bnx2/bnx2-rv2p-09-4.6.15.fw.ihex
new file mode 100644 (file)
index 0000000..63995bb
--- /dev/null
@@ -0,0 +1,490 @@
+:100000000000000000000D88000000580000000003
+:1000100000000000000000000000000000000000E0
+:1000200000000000000000000000000000000000D0
+:100030000000101800000DE00000000500000000A6
+:1000400000000000000000000000000000000000B0
+:080050000000000000000000A8
+:0800580000000010B18000025D
+:100060000000001F0303010000000008AC000001B5
+:1000700000000000050000000000000C2F800001BF
+:10008000000000002B000000000000002B8000009A
+:1000900000000010203F006C00000010213F000312
+:1000A0000000001020BF003B000000188000FFFD92
+:1000B00000000010B1B8B0150000000B2FDF0002E7
+:1000C0000000000003D80000000000002C380000F1
+:1000D000000000082C800000000000082D00000037
+:1000E0000000001091D400000000000806005555E3
+:1000F000000000188000008F000000082D80011C07
+:1001000000000008020000010000001091DE000065
+:100110000000000F42E0001C0000001091840A174C
+:1001200000000010086600160000000C2980000284
+:100130000000000C1F800002000000002ADF000009
+:10014000000000082A00000F0000000805005555B7
+:10015000000000188000FFE8000000080200000115
+:100160000000000F42E0001C0000001091840A19FA
+:10017000000000082C800006000000082D0000068A
+:100180000000001091D40000000000082D8001063E
+:1001900000000018800000830000001008660013B3
+:1001A000000000188000FFF100000008B10000010D
+:1001B000000000082C80010C000000082D00000841
+:1001C000000000082D800001000000188000007C65
+:1001D0000000000B2FDF00020000000C1F80000257
+:1001E000000000002C0700000000001091DE00005D
+:1001F0000000000005000000000000188000FFD390
+:100200000000000B2FDF00020000000C1F80000028
+:10021000000000002C0700000000001091DE00002C
+:100220000000000005000000000000188000FFCD65
+:100230000000000C1F80000200000000050000000C
+:10024000000000188000FFCA0000000C2980000296
+:100250000000000C1F800002000000002ADF0000E8
+:10026000000000082A0000050000000805005555A0
+:10027000000000188000FFC40000000802240045B0
+:100280000000001800040000000000188000001C9E
+:10029000000000188000001E0000001880000065AB
+:1002A00000000018800000AD00000018800000ACC5
+:1002B000000000188000000000000018800000000E
+:1002C00000000018800000000000001880000000FE
+:1002D00000000018800000000000001880000000EE
+:1002E00000000018800000000000001880000000DE
+:1002F00000000018800000F30000001880000000DB
+:1003000000000018800000000000001880000015A8
+:10031000000000188000001B000000188000000092
+:1003200000000018800000C3000000188000002EAC
+:1003300000000018800000F3000000188000011E7B
+:1003400000000018800000E9000000188000014251
+:10035000000000188000004E00000018800000001F
+:1003600000000018800000800000000C1F800001C9
+:100370000000000005000000000000188000FFA33E
+:100380000000001091D400000000000C2980000142
+:100390000000000C1F800001000000082A0000027D
+:1003A0000000000005000000000000188000FF9D14
+:1003B0000000001091D400000000000C2980000112
+:1003C0000000000C1F800001000000002942000016
+:1003D000000000082A0000020000000005000000E4
+:1003E000000000188000FF96000000188000FF95B4
+:1003F00000000010B1BCB00A0000000B2FDF0002AB
+:100400000000000003D80000000000002C3C0000A9
+:100410000000001091D400000000000806005555AF
+:10042000000000188000002900000018800000BBB8
+:10043000000000102C6201BA0000001880000005C6
+:10044000000000082C80010D000000082D000009AC
+:100450000000001091D40000000000082D8001076A
+:100460000000000C298000000000000C1F8000002C
+:100470000000001091DE0000000000002ADF0000F4
+:10048000000000082A00000600000008050055557D
+:10049000000000188000FF800000001091D40000D0
+:1004A0000000000C298000010000000C1F800001EA
+:1004B000000000082A00000B0000000005000000FA
+:1004C000000000188000FF7A000000000202000017
+:1004D00000000000029A000000000000060C2C0042
+:1004E00000000004C60C340000000010001F0000D3
+:1004F00000000010B196180C0000000806960004D9
+:1005000000000009068DFFFC00000004CD051A0064
+:1005100000000004CC9A18000000001020D7000052
+:100520000000000C2B56000000000000000000003E
+:1005300000000000000000000000001020D70000B4
+:10054000000000080F80000100000010B18001F4DD
+:1005500000000010001F00000000000C6B5600009F
+:1005600000000018000400000000000006820000E7
+:1005700000000010B18A000600000000860C140084
+:1005800000000010B18C0004000000000500000015
+:10059000000000082A0000010000001091D40000B3
+:1005A00000000018000D000000000000050200001F
+:1005B0000000001091DE000000000018000A00009A
+:1005C00000000010B1A0B0130000000B2FDF0002EC
+:1005D000000000002C200000000000082C8000001B
+:1005E000000000082D0000000000001091D4000061
+:1005F0000000000806005555000000188000FFEEBE
+:10060000000000082D80011C00000010001F0000E9
+:100610000000001091DE00000000000F476000089D
+:100620000000000F060E0001000000000F5800003F
+:10063000000000000A640000000000000AE500005D
+:10064000000000090B66FFFF000000000D610000C4
+:1006500000000018800000130000000F4760000831
+:100660000000000B2FDF0002000000082C800000BB
+:10067000000000082D0000000000001091D40000D0
+:10068000000000082D80011C0000000F060E000174
+:1006900000000010001F0000000000000F580000C4
+:1006A0000000001091DE0000000000000A6400005D
+:1006B000000000000AE50000000000090B66FFFFD3
+:1006C000000000000D610000000000000262000058
+:1006D0000000000B2FDF00020000000031040000CA
+:1006E00000000000309A0000000000188000FFBCED
+:1006F0000000000C29800001000000100022000210
+:100700000000000C295200010000000C29520000DA
+:10071000000000080200000E000000080280001A1D
+:1007200000000010B1C40A0200000008020000032B
+:1007300000000008220000010000000C1F800001E2
+:10074000000000002ADF0000000000002A0008006E
+:100750000000000805005555000000188000FF2724
+:100760000000000B2FDF00020000001091D40000F9
+:10077000000000082A000001000000002C200000FA
+:10078000000000082C800000000000082D00000080
+:10079000000000082D80011C0000001091D4000012
+:1007A0000000001091DE0000000000082C80000610
+:1007B000000000082D00000600000000308000004E
+:1007C0000000000031000000000000082D8000063D
+:1007D0000000000C298000010000000C1F800001B7
+:1007E0000000001091DE0000000000002ADF000081
+:1007F000000000082A0000100000000005000000B2
+:10080000000000188000FF120000001091A0B00945
+:10081000000000082C80010D000000082D000009D8
+:100820000000001091D40000000000082D80010796
+:10083000000000188000FFAF0000001880000010CA
+:1008400000000008AC000001000000188000000B50
+:10085000000000000380B0000000000B2FDF00024A
+:10086000000000002C0040000000001091D40000A7
+:100870000000000806005555000000188000FF9E8B
+:100880000000001880000030000000188000000602
+:100890000000000B2FDF0002000000002C000E0003
+:1008A000000000082A000007000000080500555558
+:1008B000000000188000FEFC00000000068200001E
+:1008C0000000000C298000010000000C1F800001C6
+:1008D000000000100CE70007000000090562FFFFA0
+:1008E00000000010BA6C1405000000002ADF0000B0
+:1008F0000000000021000000000000082A000005A0
+:100900000000001091D40000000000082C80010CB1
+:10091000000000082D0000080000000C31620018E3
+:10092000000000082D800001000000188000FF90EA
+:1009300000000018000D000000000010B1A0B00E73
+:100940000000000B2FDF00020000000003D80000B1
+:10095000000000002C2000000000001091D40000D6
+:100960000000001880000014000000102C6200023B
+:10097000000000188000000B0000000B2FDF0002B9
+:10098000000000002C0700000000000C1F80000188
+:100990000000001091DE00000000000005000000D3
+:1009A000000000188000FEDE000000082C80010D11
+:1009B000000000082D0000090000001091D4000084
+:1009C000000000082D8001070000000C29800001B4
+:1009D0000000000C1F8000010000001091DE0000EC
+:1009E000000000002ADF0000000000082A00000AC2
+:1009F0000000000005000000000000188000FED389
+:100A00000000000005020000000000082C80010C1E
+:100A1000000000082D000008000000082D800134AF
+:100A2000000000000000000000000010205F000037
+:100A3000000000082C800140000000082D00003C50
+:100A4000000000082D80011C0000000000000000D4
+:100A500000000010205F0000000000082C800080D3
+:100A6000000000082D000000000000082D80010893
+:100A700000000000000000000000001091DE0000F7
+:100A800000000018000A00000000001091D40000CF
+:100A9000000000080600AAAA000000188000FF5A03
+:100AA0000000000C298000010000000C1F800001E4
+:100AB000000000082A000009000000080500AAAA9A
+:100AC000000000188000FEBA0000001091D4000061
+:100AD0000000000806005555000000188000FF5275
+:100AE0000000001091A03C0200000010B1E6620777
+:100AF0000000000B2FDF0002000000002C3100007E
+:100B0000000000092CB1007F000000082CD9000073
+:100B1000000000082D000000000000082D80010DDD
+:100B200000000010B1A8000600000010205F0000C7
+:100B3000000000002C200000000000002CA7000096
+:100B4000000000082D000010000000082D800108A2
+:100B5000000000188000FF4B00000010B1A600103C
+:100B600000000010001F00000000000F0F30000701
+:100B7000000000000A600000000000000AE1000020
+:100B80000000000F4B620008000000090B1600FF78
+:100B9000000000000D620000000000090D1A00FFB7
+:100BA00000000010073000030000000C0D1A0008C0
+:100BB0000000000C0B1600080000000F4CE30018AA
+:100BC000000000000C992C0000000004CC993400B7
+:100BD000000000080F8000000000000C29800001C8
+:100BE0000000000033310000000000082200001661
+:100BF000000000002ADF0000000000082A00000CAE
+:100C000000000010009F0000000000000F20000006
+:100C10000000000C1F800001000000080500555571
+:100C2000000000188000FE8E0000001091D400002B
+:100C3000000000080600AAAA000000188000FF2695
+:100C40000000000F4722000800000009070E000FF7
+:100C500000000008070E00080000000802800001E4
+:100C60000000000702851C000000000882850001CA
+:100C70000000000002854C000000000742851C00B7
+:100C800000000003C3AA52000000000003B10E00E0
+:100C9000000000074B071C000000000F0F3000078A
+:100CA0000000000F0A960003000000000A955C0097
+:100CB000000000004A005A00000000000C960A00E4
+:100CC000000000090C99FFFF000000080D00FFFF65
+:100CD00000000010B1963202000000080F800005ED
+:100CE00000000010B1A8000800000010205F000004
+:100CF0000000000B2FDF0002000000002C2000008D
+:100D0000000000002CA70000000000082D000010CB
+:100D1000000000082D800108000000188000FF126C
+:100D20000000000C2980000100000010001F0000DE
+:100D30000000000C1F800001000000002ADF0000FE
+:100D4000000000082A00000D000000080500AAAA03
+:100D5000000000188000FE680000001091D4000020
+:100D60000000000806005555000000188000FF0034
+:100D70000000000C298000010000000C1F80000111
+:100D8000000000082A000007000000080500555573
+:100D9000000000188000FE60000000080305000449
+:100DA0000000000683040C00000000080285020019
+:100DB0000000000086050C0000000001860C0E00FB
+:100DC00000000008020400040000000002041800F3
+:100DD00000000000838718000000001800020000D7
+:100DE00000000010B18000040000001F0303010098
+:100DF00000000008050000FF0000001800020000CD
+:100E0000000000002A00000000000010B1D4000023
+:100E10000000000C298000010000000802540009B5
+:100E2000000000092952003F0000001800040000E3
+:100E30000000001880000010000000188000001161
+:100E4000000000188000004B000000188000013CEA
+:100E5000000000188000013B000000188000013AEB
+:100E6000000000188000013A000000188000000017
+:100E7000000000188000014D0000001880000136BD
+:100E8000000000188000000C0000001880000152D3
+:100E900000000018800001AC0000001880000080F5
+:100EA00000000018800001070000001880000115F4
+:100EB000000000002A000000000000188000FFEA87
+:100EC000000000002A0000000000000C2980000043
+:100ED0000000001020530000000000188000FFE612
+:100EE000000000002A000000000000188000FFE45D
+:100EF0000000000003820000000000188000FFDFF7
+:100F0000000000010C161400000000008C181400F2
+:100F10000000001091980003000000080C960002E9
+:100F200000000010B1800003000000080C960001D2
+:100F3000000000000C000000000000000D1900007F
+:100F400000000010205600000000000C2BD700010C
+:100F5000000000080F8000010000000000000000F9
+:100F600000000010001F00000000000C6BD7000103
+:100F700000000010011301F100000018000700003C
+:100F800000000000050200000000001091963421CE
+:100F900000000010205F0000000000002C1E000078
+:100FA000000000082C800006000000082D0000064C
+:100FB000000000082D800102000000000000000079
+:100FC0000000001091DE0000000000000D61000034
+:100FD00000000018000A00000000000005020000E8
+:100FE000000000109196341600000010205F0000F1
+:100FF0000000000009D80000000000002C1E0000C6
+:10100000000000082C80010E000000082D00000ADE
+:10101000000000082D800102000000000000000018
+:101020000000001091DE0000000000000D620000D2
+:10103000000000002C13000000000018000A00004F
+:101040000000000005020000000000109196340925
+:1010500000000010205F0000000000002C1E0000B7
+:10106000000000082C800006000000082D00006A27
+:10107000000000082D8001020000000000000000B8
+:101080000000001091DE0000000000000D7A00005A
+:1010900000000018000A00000000001091DE0000AF
+:1010A00000000010001F00000000000C6BD70001C2
+:1010B000000000002F80AA00000000002A000000AD
+:1010C000000000000D61000000000000036200004D
+:1010D000000000002C4000000000000002638C00B3
+:1010E0000000000026460000000000080204001274
+:1010F00000000010B906082E000000000F58000084
+:10110000000000000A640000000000000AE5000082
+:10111000000000090B66FFFF000000000C0000004B
+:10112000000000000B800000000000080CC6001248
+:10113000000000188000FFCA0000001020560000C8
+:101140000000000C2BD70001000000080F800003F6
+:10115000000000000000000000000010001F000060
+:101160000000000C6BD700010000000827110012DE
+:10117000000000006690000000000008A31B0012A1
+:1011800000000010B198000600000010001F0000D1
+:101190000000000C6BD7000100000010205600007A
+:1011A0000000000C2BD70001000000080F80000495
+:1011B0000000000822000003000000082C80000C42
+:1011C000000000082D00000C00000010001F0000AF
+:1011D0000000000C6BD70001000000002596000005
+:1011E0000000000C298000000000000006660000DE
+:1011F0000000000086611800000000090260000F76
+:101200000000000F0204000200000010B60C0803EA
+:101210000000000C1FBF00000000000C336600102F
+:1012200000000000321400000000000032950000B1
+:101230000000000573662C000000000031E32E0062
+:10124000000000082D800010000000102053000056
+:101250000000001091DE0000000000188000FF7602
+:1012600000000000230000000000000925E6FFFF49
+:10127000000000082200000B0000000C6952000072
+:101280000000000C29800000000000102053000026
+:10129000000000188000FF6F0000001091DE0000C9
+:1012A00000000010001F00000000000C6BD70001C0
+:1012B000000000002F80AA00000000002A000000AB
+:1012C000000000002C400000000000082C800040BE
+:1012D000000000082D000020000000082D80011CE7
+:1012E00000000000000000000000001091DE00007F
+:1012F0000000000F42EA001000000010004F000440
+:1013000000000010B74692000000000802490012D9
+:1013100000000010B5840A00000000000D6100000C
+:1013200000000010BA66346D000000000362000087
+:1013300000000010B8630C6B000000088305001269
+:1013400000000010004F00020000000003490000F0
+:101350000000000183068C000000000083C60C0022
+:1013600000000010B1870010000000000B6E0000AC
+:10137000000000188000FF50000000010669140002
+:1013800000000010918C000200000008B4E9000188
+:1013900000000010B1E92C5F0000000086692C00FD
+:1013A00000000000020000000000000902EAFFFF48
+:1013B00000000010000C00020000000002040A00FF
+:1013C0000000000F460C00010000000F0285000124
+:1013D00000000010918C01FC00000010B7040E56B4
+:1013E000000000002C400000000000000F40000042
+:1013F000000000000D610000000000000A64000011
+:10140000000000000AE50000000000090B66FFFF75
+:10141000000000000C000000000000000B80000035
+:10142000000000080C86001200000010205600008A
+:101430000000000C2BD70001000000080F80000303
+:101440000000000C2952000000000010001F0000E6
+:101450000000000C6BD700010000000827110012EB
+:10146000000000006690000000000000264600001A
+:10147000000000002306000000000010B1980009E1
+:1014800000000010001F00000000000C6BD70001DE
+:1014900000000010205600000000000C2BD70001B7
+:1014A000000000080F8000040000000000000000A1
+:1014B00000000010001F00000000000C6BD70001AE
+:1014C000000000003214000000000000329500000F
+:1014D0000000000031E32E000000000573662C00C0
+:1014E000000000002596000000000010B1870021D8
+:1014F0000000000C298000000000000F0F6B0007A7
+:10150000000000000D690000000000000A6C0000EF
+:10151000000000000AED0000000000000B6E00005B
+:10152000000000000B800000000000000C8700009D
+:10153000000000188000FF18000000010C161400C5
+:10154000000000008C181400000000080C96000138
+:101550000000001091980002000000080C990001A2
+:10156000000000000D190000000000000C00000049
+:1015700000000010205600000000000C2BD70001D6
+:10158000000000080F800001000000102053000040
+:101590000000000C6952000100000010001F000054
+:1015A0000000000C6BD700010000000022C58C0079
+:1015B00000000000231200000000000027110000BE
+:1015C000000000002690000000000010B8170E0375
+:1015D0000000000C29800000000000188000FFEBD4
+:1015E0000000000082970E0000000000A3120A0015
+:1015F000000000082200001A000000082C80000CE7
+:10160000000000082D00000C000000082D800010D4
+:1016100000000010001F00000000000C6BD700014C
+:10162000000000000D6E000000000003E7CF340052
+:101630000000000C298000000000001091DE000076
+:1016400000000010B1870007000000003614000001
+:101650000000000036950000000000003716000072
+:10166000000000082C800050000000082D00003011
+:10167000000000082D80000C000000102053000026
+:10168000000000188000FEF1000000002646000067
+:1016900000000000230000000000000925E6FFFF15
+:1016A000000000000B6E000000000003E7CF2C00DC
+:1016B000000000082200001B0000000C695200001E
+:1016C0000000000C298000000000001020530000E2
+:1016D000000000188000FEE7000000002FD5000089
+:1016E000000000002A00000000000010003F000C75
+:1016F000000000000666000000000000866118007F
+:1017000000000009026000F000000010B70C08089B
+:10171000000000002C4000000000000C7366001068
+:10172000000000082C800018000000082D000018A0
+:10173000000000082D8000020000000C5FBF0000C8
+:101740000000001091DE0000000000188000FED8AC
+:10175000000000002FD50000000000002A0000005B
+:10176000000000002C4000000000000C7366001018
+:10177000000000082C800018000000082D00001850
+:10178000000000082D8000020000000C5FBF000078
+:101790000000001091DE0000000000082C80000313
+:1017A000000000082D000003000000093060FFF079
+:1017B000000000082D8000010000000C29800000BE
+:1017C0000000001091DE0000000000082C80001ACC
+:1017D000000000082D00001A000000003300000087
+:1017E000000000082D800002000000003180000091
+:1017F0000000001091DE0000000000082C80000CAA
+:10180000000000082D00000C000000082D800004DE
+:1018100000000010205300000000001091DE0000C6
+:10182000000000188000FEBD000000188000FEBC13
+:10183000000000002A00000000000010001F00004F
+:101840000000000C6BD70001000000000F008000BA
+:10185000000000080F80000700000018800000153D
+:10186000000000000502000000000008220000093E
+:1018700000000000286D00000000000029000000AA
+:101880000000000F6568001000000003F66C940073
+:1018900000000010B972A0040000000C73E70019EA
+:1018A0000000000C21420004000000003BF6000094
+:1018B0000000000C298000000000001020530000F0
+:1018C00000000008220000080000000C6142000433
+:1018D00000000018000A0000000000002A000000BC
+:1018E00000000010001F00000000000C6BD700017A
+:1018F0000000000F0F470007000000080F800008DD
+:101900000000000C2980000000000010205300009F
+:10191000000000188000FE9F0000001091DE000013
+:10192000000000002FD5000000000010001F000084
+:101930000000000C6BD700010000000033510000D4
+:10194000000000002A00000000000010B1C60029BD
+:101950000000000F0F500007000000000A600000A8
+:10196000000000000AE100000000000F4B620008C8
+:10197000000000090B1600FF0000000F4C62001071
+:10198000000000000D620000000000090D1A00FFB9
+:1019900000000010075000030000000C0D1A0008A2
+:1019A0000000000C0B160008000000000CC6000030
+:1019B000000000000B8000000000000006980000FE
+:1019C00000000010205600000000000C2BD7000182
+:1019D000000000080F8000030000001006C2000491
+:1019E0000000000C29000002000000102642000246
+:1019F0000000000C29520003000000082200000132
+:101A000000000010001F00000000000C6BD7000158
+:101A100000000000231B00000000000027111A0036
+:101A200000000000669000000000000C2952000039
+:101A300000000010B197320C0000000C298000005B
+:101A40000000000006980000000000102053000075
+:101A50000000000C295200030000000022C58C0089
+:101A600000000010001F00000000000C6BD70001F8
+:101A700000000010205600000000000C2BD70001D1
+:101A8000000000080F800003000000188000FFEF36
+:101A900000000010B1C8001300000010B1C6000320
+:101AA0000000000C298000000000001020530000FE
+:101AB0000000000C295200000000000C2952000315
+:101AC0000000001006C200020000000C29520002B3
+:101AD0000000000022C58C00000000002765000007
+:101AE0000000000026E400000000000822000016AC
+:101AF00000000010B1C600030000000023480000F1
+:101B000000000010B1800005000000002348000024
+:101B10000000000C298000000000000F0F5000079B
+:101B200000000018800000120000000822000016CB
+:101B30000000000C298000000000000030140000AC
+:101B40000000000030950000000000100750000366
+:101B5000000000090B1600FF000000090D1A00FF2D
+:101B60000000000F31160008000000003162340050
+:101B700000000003F162300000000010205F000050
+:101B8000000000002C510000000000092CD1007F53
+:101B9000000000082CD90000000000082D00000003
+:101BA000000000082D80000C000000000000000074
+:101BB0000000001091DE00000000001005C20003CC
+:101BC0000000000033000000000000080F80000744
+:101BD000000000102053000000000010001F000053
+:101BE0000000000C6BD70001000000188000FE44CC
+:101BF000000000002FD50000000000002A000000B7
+:101C00000000000F0F50000700000010B1C60030A8
+:101C10000000000F4742000800000009070E000FF7
+:101C200000000008070E000800000010001F000060
+:101C30000000000C6BD70001000000080900000143
+:101C40000000000709121C0000000003CBCA92002C
+:101C5000000000000B97A2000000000742171C00C4
+:101C6000000000000B0400000000000F0A840003C5
+:101C7000000000000A959C00000000004A009A0045
+:101C80000000000882120001000000010C1708008B
+:101C9000000000000C978C000000000002180000FB
+:101CA000000000080D00FFFF000000080F80000684
+:101CB0000000000C290000000000001006C2000413
+:101CC0000000000C29520002000000102642000211
+:101CD0000000000C2952000300000008220000014F
+:101CE00000000010001F00000000000C6BD7000176
+:101CF00000000010B197320D00000000231B00000F
+:101D0000000000002711080000000000669000009D
+:101D10000000000C298000000000000002180000F4
+:101D200000000010205300000000000C29520003A6
+:101D30000000000022C5360000000010001F000057
+:101D40000000000C6BD70001000000080F800006A7
+:101D5000000000188000FFF200000000231B0000BC
+:101D6000000000002711080000000000669000003D
+:101D700000000010B1C8000B0000000C298000001A
+:101D800000000010205300000000000C2952000049
+:101D90000000000C295200030000001006C20002DF
+:101DA0000000000C295200020000000022C58C0037
+:101DB00000000000276500000000000026E400008D
+:101DC0000000000023480000000000082200001767
+:101DD0000000000C2980000000000010001F00001F
+:101DE0000000000C6BD70001000000102053000021
+:081DF000000000188000FE0352
+:00000001FF
+/*
+ * This file contains firmware data derived from proprietary unpublished
+ * source code, Copyright (c) 2004 - 2009 Broadcom Corporation.
+ *
+ * Permission is hereby granted for the distribution of this firmware data
+ * in hexadecimal or equivalent format, provided this copyright notice is
+ * accompanying it.
+ */
diff --git a/firmware/myricom/lanai.bin.ihex b/firmware/myricom/lanai.bin.ihex
new file mode 100644 (file)
index 0000000..bf47f4c
--- /dev/null
@@ -0,0 +1,4771 @@
+:100000004FF8F20EFE00C290000007880008E001E1
+:10001000014C9793FFFCE000001400000001000079
+:1000200000009293FFFC02900008F7062A6C9713D9
+:10003000FFFCF7062C109713FFFC07880008E00070
+:1000400015489793FFFCF702053C9713FFFCF70256
+:1000500000039713FFFCF70629E09713FFFC0788BE
+:100060000008E000161C9793FFFCF7062B849713FB
+:10007000FFFCF7062C1C9713FFFC07880008E00024
+:1000800015489793FFFCF7020ABC9713FFFCF70291
+:1000900000029713FFFCF7062AF89713FFFC078866
+:1000A0000008E000161C9793FFFC8796FFFC8296E1
+:1000B000FFF802140000013C0000000000019293D0
+:1000C000FFFC02900008F7044A9C85160000203AC5
+:1000D0000001EE00010100000001F70475EC0000D2
+:1000E0000001203A0000E600010000000001F704D2
+:1000F00075F000000001203A0000E600012D00002C
+:100100000001F7042D38F6862C2806380001F60584
+:100110002D3877390002F482001220320044E600C4
+:1001200001E0B4BA6802E00001E0F0052D38F70400
+:100130003B64F5844F54F7057A10202E0000E6004A
+:100140000199972A002095AA001CF6064A9826AC29
+:10015000000177350001C738680077390002073899
+:10016000000CA4BA60020000000194AA0010C73875
+:100170006000873A000400000001972A0014F70489
+:100180004A9C0000000127380001C02E7200D700F1
+:100190000A01E00001D0F7057A1895AA001CF606BE
+:1001A0004A9806AC000177350001C73868007739F6
+:1001B00000020738000CA4BA60020000000194AAF3
+:1001C0000010C7386000873A0004F0057A18972AB3
+:1001D0000014F50579D807880008E00001F497932A
+:1001E000FFFC8796FFFC8296FFF802140004013C96
+:1001F0000000000000019293FFFC02900008221012
+:100200000038F7047A10F6843B6400000001C03A1D
+:100210006A00470C0001D7000A70203A0000E6008F
+:10022000024C00000001F70475EC00000001203AC8
+:100230000000E600024C00000001F70475F0000029
+:100240000001203A0000E6000285F4820000F70475
+:100250002D38F6862C2806380001F6052D3877391A
+:100260000002F302001220320044E6000274B33AA6
+:100270006802F0052D38F3062A6CF3052C10E00017
+:100280000528F0057A18F38479D8F6844AA0231457
+:1002900000209316FFC4841E00109696FFD4F70426
+:1002A0004A9C9416FFE0851E0014C0367200EC00D4
+:1002B000036C9516FFE477350001C738680077397D
+:1002C0000002F3064A98C6B8300006B4000CC58494
+:1002D00000008736000000000001C03A4200E6003E
+:1002E00002FCC62400008736000400000001C03A6A
+:1002F0005200E600030020320000F6020001203226
+:100300000000E600030D00000001F58200008636C3
+:1003100000008716FFE000000001C0327200E2001A
+:100320000348F5020000C0327200E6000350202AA4
+:10033000000086B600048716FFE400000001C03606
+:100340007200E2000351202A0000F5020001202A79
+:100350000000E6000361202E0000F5820001202E3F
+:100360000000E600037020260000F4820001202631
+:100370000000E60003A5F60200018716FFD4F3068D
+:100380004A9876B90001C6B4700076B50002C6B4CA
+:10039000300006B4001486B600009716FFD8E000BF
+:1003A00004189696FFDC2714002C9713FFFC831685
+:1003B000FFC4000000019313FFFCF3064A98931357
+:1003C000FFFC9396FFCC07880008E001256897930F
+:1003D000FFFC8396FFCC20220000E6000415F60205
+:1003E00000018716FFD4F3064A9876B90001C6B417
+:1003F000700076B50002C6B4300006B4001486B6AC
+:1004000000009716FFD89696FFDCF7054AA0E0009B
+:10041000041C20320000F602000020320000E6003A
+:10042000042CF4820001E0000484F482000086962B
+:10043000FFD80000000177350002C738680077391F
+:100440000002F68642C8A63A6802C73868007539C5
+:10045000001E7528FFE505B8000286AE00000738CB
+:1004600000049716FFECC63057C07630FFF09616A2
+:10047000FFF475AD001E75ACFFE5C6B45FC076B481
+:10048000FFF09696FFF020260000E6000525F30613
+:1004900029E08696FFF0F5820000C7346800C49C0E
+:1004A0007200C02E6A00EC0004F0C5240000C62CC7
+:1004B00000008716FFEC00000001A6B2700205AC38
+:1004C0000001C73070007739001E7738FFE5C6B4E9
+:1004D00077C076B4FFF0F6AB280005280002871637
+:1004E000FFF000000001C02E7200EC0004B10630E5
+:1004F0000002F3020003F30576F48716FFF0869EF0
+:100500000004C7387000C7384800C6B470008716AA
+:10051000FFF406B400209702FF6C9482FF5096828D
+:10052000FF58F30629E0F3052C108796FFFC82960E
+:10053000FFF802140000013C00000000000192934B
+:10054000FFFC02900008F7047A1800000001203A2E
+:100550000000E60005CD00000001F7047A10F684E3
+:100560003B6400000001C03A6A00470C0001203AD9
+:100570000000E60005CDF5864A98F60479D8F684A1
+:100580004F540000000196B2001C06B400017735FC
+:100590000001C7386800773900020738000CA53A17
+:1005A00058020000000195320010C7385800873A01
+:1005B0000004F0057A189732001407880008E0005C
+:1005C00001F49793FFFCE00005FC00000001F70434
+:1005D0002D38F6862C2806380001F6052D38773997
+:1005E0000002F502001220320044E60005F4B53A9C
+:1005F0006802F0052D38F5062A6CF5052C10879653
+:10060000FFFC8296FFF802140000013C000000008D
+:1006100000019293FFFC0290000885960000F70409
+:1006200075EC852E0020203A0000E60006CCF5058A
+:100630007A08F70475F000000001203A0000E60097
+:1006400006CC00000001F7047A08F6843B64000041
+:100650000001C03A6A00470C0001D7000A70203A36
+:100660000000E60006CC00000001872E001CF68486
+:100670004F54F7057A00C7347200203A0000EE00AC
+:10068000068DF5020001E0000690F50579F8F08589
+:1006900079F8F6847A00C7387000C6B47000F704A1
+:1006A00079F8F68579E8C7387000C6347000F70429
+:1006B0004A9C00000001C0367200EC0006CCF60532
+:1006C00079F020360000EC0006F800000001F70485
+:1006D0002D38F6862C2806380001F6052D38773996
+:1006E0000002F502001320320044E6000738B53A54
+:1006F0006802E0000738F0052D38F7044A9C000036
+:100700000001C0327200EE00071900000001F7047A
+:100710004A9CE0000728F70579F020320000EC0041
+:10072000072800000001F08579F0F58579E0078859
+:100730000008E000074C9793FFFC8796FFFC829629
+:10074000FFF802140004013C000000000001929335
+:10075000FFFC0290000822100038F70475EC00003E
+:100760000001203A0000E60007A400000001F704A1
+:1007700075F000000001203A0000E60007A4000028
+:100780000001F7047A08F6843B6400000001C03AD7
+:100790006A00470C0001D7000A70203A0000E6000A
+:1007A00007D5F4020000F7042D38F6862C28063809
+:1007B0000001F6052D3877390002F30200132032CC
+:1007C0000044E60007CCB33A6802F0052D38E0009B
+:1007D0000AA4F3062B84F68479E8F6064A9877355E
+:1007E0000001C738680077390002F68479E00738DD
+:1007F000000CA33A6002C3B4000093360010C7385F
+:100800006000873A0004231400209316FFC4973633
+:100810000014849E0010F6844AA09496FFE09696F9
+:10082000FFD4851E0014F7044A9C00000001C03666
+:100830007200EC0008EC9516FFE477350001C7382C
+:10084000680077390002C6B8600006B4000CC584A1
+:1008500000008736000000000001C03A4A00E600B0
+:10086000087CC62000008736000400000001C03A62
+:100870005200E600088020320000F602000120321B
+:100880000000E600088D00000001F58200008636B9
+:1008900000008716FFE000000001C0327200E20095
+:1008A00008C8F5020000C0327200E60008D0202A15
+:1008B000000086B600048716FFE400000001C03681
+:1008C0007200E20008D1202A0000F5020001202A6F
+:1008D0000000E60008E1202E0000F5820001202E35
+:1008E0000000E60008F020220000F40200012022AF
+:1008F0000000E6000925F60200018716FFD4F30682
+:100900004A9876B90001C6B4700076B50002C6B444
+:10091000300006B4001486B600009716FFD8E00039
+:1009200009989696FFDC2714002C9713FFFC83167A
+:10093000FFC4000000019313FFFCF3064A989313D1
+:10094000FFFC9396FFCC07880008E0012568979389
+:10095000FFFC8396FFCC20220000E6000995F602FA
+:1009600000018716FFD4F3064A9876B90001C6B491
+:10097000700076B50002C6B4300006B4001486B626
+:1009800000009716FFD89696FFDCF7054AA0E00016
+:10099000099C20320000F602000020320000E60030
+:1009A00009ACF4820001E0000A04F482000086969B
+:1009B000FFD80000000177350002C738680077399A
+:1009C0000002F68642C8A63A6802C7386800753940
+:1009D000001E7528FFE505B8000286AE0000073846
+:1009E00000049716FFECC63057C07630FFF096161D
+:1009F000FFF475AD001E75ACFFE5C6B45FC076B4FC
+:100A0000FFF09696FFF020260000E6000AA5F30608
+:100A10002AF88696FFF0F5820000C7346800C49C6F
+:100A20007200C02E6A00EC000A70C5240000C62CBB
+:100A300000008716FFEC00000001A6B2700205ACB2
+:100A40000001C73070007739001E7738FFE5C6B463
+:100A500077C076B4FFF0F6AB2800052800028716B1
+:100A6000FFF000000001C02E7200EC000A310630D9
+:100A70000002F3020002F30576F48716FFF0869E6B
+:100A80000004C7387000C7384800C6B47000871625
+:100A9000FFF406B400209702FF6C9482FF50968208
+:100AA000FF58F3062AF8F3052C1C8796FFFC829664
+:100AB000FFF802140000013C0000000000019293C6
+:100AC000FFFC02900008F68479E8F70479F800004A
+:100AD0000001C6B47000F7047A20F68579E807387B
+:100AE0000001F7057A20F70479F0F6047A20C03681
+:100AF0007200E6000B2CF6862C28F7042D38000037
+:100B0000000106380001F6052D3877390002F5821C
+:100B1000001320320044E6000B20B5BA6802F0054D
+:100B20002D38F5862B84E0000B38F5852C1C0788C2
+:100B30000008E000074C9793FFFC8796FFFC829625
+:100B4000FFF802140000013C000000000001929335
+:100B5000FFFC02900008F7062C109713FFFCF70625
+:100B600029E09713FFFC07880008E00014F497932E
+:100B7000FFFCF7062C109713FFFCF7062A6C97135F
+:100B8000FFFC07880008E00014F49793FFFCF706C9
+:100B90002C1C9713FFFCF7062AF89713FFFC078815
+:100BA0000008E00014F49793FFFCF7062C1C971341
+:100BB000FFFCF7062B849713FFFC07880008E00072
+:100BC00014F49793FFFC8796FFFC8296FFF80214BB
+:100BD0000000013C0000000000019293FFFC029025
+:100BE0000008F0052D38F0052D3C8796FFFC829615
+:100BF000FFF802140000013C000000000001929385
+:100C0000FFFC0290000822100018FF852EDCF7067A
+:100C10000C3EC77C7400203A0000E60014299716A9
+:100C2000FFF44738FFFBF6846F50CFB8000083967F
+:100C3000FFF4F702003FC39C6D80C71C7400203A8C
+:100C4000003FE20012609396FFF477390002F682CB
+:100C50000C5CA6B6700200000001C1340000000068
+:100C600012600000126000000D6800000D680000B6
+:100C70000D5C00000D5C00000D6800000D680000B8
+:100C80001250000012500000123C0000123C000004
+:100C90000DE000000DE00000123C0000123C0000DE
+:100CA0000DE800000DF400000E0000000E20000012
+:100CB0000E4000000E6000000E8000000EA000003C
+:100CC0000EC000000EC800000ED000001228000068
+:100CD0000ED800000EF400000F10000012280000D3
+:100CE0000F1800000F1800000F2400000F24000050
+:100CF0000F4400000F4400000F6400000F64000068
+:100D00000F8400000F8400000F8C00000F8C000087
+:100D10000F9400000F9400000FB000000FB000000F
+:100D20000FB800000FD800000FF80000102C0000D2
+:100D3000106000001094000010C8000010FC0000BB
+:100D400011300000114C0000116800001214000066
+:100D50001184000011B4000011E400001214F382A9
+:100D60000006E00012549393FFFCF60200052032C7
+:100D70000014E6000DB527000010203A0001E20043
+:100D80000DB5F7062DCCF6842ECC0000000175B50C
+:100D90000002B62E700206B40001F6852ECC860243
+:100DA000FF34F7062E4C2036001FE2000DB5B62E9C
+:100DB0007002F0052ECCF7042D5800000001873A90
+:100DC000000000000001873A0018000000010788B9
+:100DD0000008C13800009793FFFCE000126000009B
+:100DE0000001E0001240F3820006F382000BE000F5
+:100DF00012549393FFFCF3820007E0001254939384
+:100E0000FFFCF382000B9393FFFC07880008E000CF
+:100E100015849793FFFCF3820005E000125493932E
+:100E2000FFFCF38200079393FFFC07880008E000B3
+:100E300015849793FFFCF3820005E000125493930E
+:100E4000FFFCF382000B9393FFFC07880008E0008F
+:100E500015849793FFFCF3820006E00012549393ED
+:100E6000FFFCF38200079393FFFC07880008E00073
+:100E700015849793FFFCF3820006E00012549393CD
+:100E8000FFFCF382000B9393FFFC07880008E0004F
+:100E900015849793FFFCF3820005E00012549393AE
+:100EA000FFFCF38200079393FFFC07880008E00033
+:100EB00015849793FFFCF3820005E000125493938E
+:100EC000FFFCE0001240F382000BE0001240F382CE
+:100ED0000007E000122CF382000BF382000B9393C7
+:100EE000FFFC07880008E00015849793FFFCE000F2
+:100EF0001240F3820006F38200079393FFFC0788F9
+:100F00000008E00015849793FFFCE0001240F38294
+:100F10000006E000122CF382000BF3820014E000C4
+:100F200012549393FFFCF38200149393FFFC078801
+:100F30000008E00015849793FFFCF3820005E000B1
+:100F400012549393FFFCF38200149393FFFC0788E1
+:100F50000008E00015849793FFFCF3820006E00090
+:100F600012549393FFFCF38200149393FFFC0788C1
+:100F70000008E00015849793FFFCF3820005E00071
+:100F800012549393FFFCE0001240F3820014E0003F
+:100F9000122CF3820014F38200149393FFFC078851
+:100FA0000008E00015849793FFFCE0001240F382F4
+:100FB0000006E000122CF3820014F38200149393D5
+:100FC000FFFC07880008E00015849793FFFCF3827C
+:100FD000000BE00012549393FFFCF38200149393F0
+:100FE000FFFC07880008E00015849793FFFCF3825C
+:100FF0000007E00012549393FFFCF38200149393D4
+:10100000FFFC07880008E00015849793FFFCF3823B
+:10101000000B9393FFFC07880008E000158497936A
+:10102000FFFCF3820005E00012549393FFFCF3826F
+:1010300000149393FFFC07880008E0001584979341
+:10104000FFFCF38200079393FFFC07880008E00091
+:1010500015849793FFFCF3820005E00012549393EC
+:10106000FFFCF38200149393FFFC07880008E00064
+:1010700015849793FFFCF382000B9393FFFC078882
+:101080000008E00015849793FFFCF3820006E0005F
+:1010900012549393FFFCF38200149393FFFC078890
+:1010A0000008E00015849793FFFCF38200079393F8
+:1010B000FFFC07880008E00015849793FFFCF3828B
+:1010C0000006E00012549393FFFCF3820014939304
+:1010D000FFFC07880008E00015849793FFFCF3826B
+:1010E000000B9393FFFC07880008E000158497939A
+:1010F000FFFCF3820005E00012549393FFFCF3829F
+:1011000000149393FFFC07880008E0001584979370
+:10111000FFFCF38200079393FFFC07880008E000C0
+:1011200015849793FFFCF3820005E000125493931B
+:10113000FFFCF38200149393FFFC07880008E00093
+:1011400015849793FFFCE0001240F382000BF382BA
+:1011500000149393FFFC07880008E0001584979320
+:10116000FFFCE0001240F3820007F3820014939327
+:10117000FFFC07880008E00015849793FFFCE0005F
+:10118000122CF382000BF38200149393FFFC078868
+:101190000008E00015849793FFFCF382000B939303
+:1011A000FFFC07880008E00015849793FFFCE0002F
+:1011B0001240F3820006F38200149393FFFC078829
+:1011C0000008E00015849793FFFCF38200079393D7
+:1011D000FFFC07880008E00015849793FFFCE000FF
+:1011E0001240F3820006F38200149393FFFC0788F9
+:1011F0000008E00015849793FFFCE000122CF382B6
+:10120000000BF7043528F682000107380008E000DB
+:1012100013CCF7053544F38200149393FFFC078841
+:101220000008E00015849793FFFCF3820007939376
+:10123000FFFC07880008E00015849793FFFCF38209
+:1012400000059393FFFC07880008E000158497933E
+:10125000FFFC9013FFFC07880008E00015849793BB
+:10126000FFFC8396FFF400000001779C0014703EA1
+:10127000FFE1E600129DF7060400F7046F5C000032
+:10128000000107380001F7056F5CF7046F5CE000B0
+:101290000000000000018396FFF4F7060400C01E62
+:1012A0007400E600142900000001F7042ED0F68433
+:1012B00035240738000120360000E6001405F70544
+:1012C0002ED0F704E01400000001203A0000E600F0
+:1012D0001405F6820000F685E014F7042ED8C53414
+:1012E000000007380001F7052ED8202A0002EE0082
+:1012F00013CCF6820000F684352800000001873602
+:10130000000000000001203A0002E60013A005B42E
+:1013100000089593FFFC9516FFE89596FFE49696D6
+:10132000FFE007880008E00016649793FFFC85162D
+:10133000FFE88596FFE48696FFE020220000E600A5
+:101340001390F70200008636000C000000012032E6
+:10135000000FE20013750000000187360014000042
+:101360000001073800019736001487360014E000AA
+:101370001390F702000076B10002C6B46000773522
+:101380000005C7386A00C738600007380010C72C4E
+:101390007000203A0000E6001200F705352CF684B4
+:1013A0003528F7046F4C00000001C0367200E600DB
+:1013B00013C007341494F3846F44E00013C4F3851E
+:1013C0003528F7053528E00012E805280001203609
+:1013D0000000E6001429F6862C28F7042D38F005C5
+:1013E000352406380001F6052D3877390002F382DE
+:1013F000000D20320044E6001428B3BA6802E00071
+:101400001428F0052D38F704E01000000001203A00
+:101410000000E6001429F7020000F705E010078835
+:101420000008E00102989793FFFCF4842D38F7043C
+:101430002D3C00000001C03A4A00E6000C09F68687
+:101440002C2877390002A53A680200000001202A02
+:101450000014E600149127280015203A0001E2004C
+:101460001491F7062DCCF6842ECC8602FF3475B588
+:101470000002B52E700206B40001F6852ECCF706E8
+:101480002E4C2036001FE2001491B62E7002F0059B
+:101490002ECCF7062D4476A90002A7367002000074
+:1014A0000001873A000000000001C6B470008736D2
+:1014B00000049496FFEC07880008C1380000979359
+:1014C000FFFCF7042D3C8496FFEC07380001203A1E
+:1014D0000044E600142CF7052D3CE000142CF00528
+:1014E0002D3C8796FFFC8296FFF802140000013C19
+:1014F0000000000000019293FFFC02900008841697
+:101500000000F702000085960004203A0021EE005A
+:10151000153495A20000F606233807200084C6A0E3
+:101520000000963A000427380004C03A6A00EC0034
+:101530001520000000018796FFFC8296FFF8021438
+:101540000008013C0000000000019293FFFC0290A3
+:1015500000088696000087160004F6042D40973692
+:1015600000009736000407300001F7052D4096363D
+:1015700000088796FFFC8296FFF802140008013CE1
+:101580000000000000019293FFFC02900008851605
+:10159000000000000001202A0014E60015D92728C9
+:1015A0000015203A0001E20015D9F7062DCCF6848B
+:1015B0002ECC8602FF3475B50002B52E700206B43B
+:1015C0000001F6852ECCF7062E4C2036001FE200D7
+:1015D00015D9B62E7002F0052ECCF6862D4477294B
+:1015E0000002A6BA68020000000186B600000000F2
+:1015F0000001C7386800873A00040000000107882E
+:101600000008C13800009793FFFC8796FFFC829684
+:10161000FFF802140004013C000000000001929356
+:10162000FFFC029000088716000086960004F6066C
+:101630002D4476B5000285BA000000000001B5B661
+:101640006002C6B47000859600080000000195B6DF
+:1016500000048796FFFC8296FFF80214000C013C00
+:101660000000000000019293FFFC02900008861623
+:101670000000000000018732000400000001203A51
+:10168000000F86B20000C5380000EE0016B4C5B4E5
+:1016900000002036000FEE0016B400000001203AD2
+:1016A0000000EC0016B50000000120360000EC0040
+:1016B00016D0000000018732000C0000000107383E
+:1016C00000019732000C8732000CE00016D8F402BB
+:1016D0000000C02A5A00440C00018796FFFC829645
+:1016E000FFF802140004013C0000000000010000AB
+:1016F00000009293FFFC02900008F7062EE097137B
+:10170000FFFCF70632D49713FFFC07880008E000BF
+:1017100015489793FFFCF702182C9713FFFCF782EC
+:1017200000099793FFFCF7062EE09713FFFC07884C
+:101730000008E000161C9793FFFCF702345897133B
+:10174000FFFCF702000C9713FFFCF7062F6C9713B2
+:10175000FFFC07880008E000161C9793FFFCF702C7
+:101760003F949713FFFCF782000B9793FFFCF7065B
+:101770002FF89713FFFC07880008E000161C9793CA
+:10178000FFFCF7023B849713FFFCF782000B979353
+:10179000FFFCF70632289713FFFC07880008E000DB
+:1017A000161C9793FFFCF70226E49713FFFCF70241
+:1017B00000139713FFFCF70630849713FFFC07888C
+:1017C0000008E000161C9793FFFCF70226A0971371
+:1017D000FFFCF70200119713FFFCF7063110971377
+:1017E000FFFC07880008E000161C9793FFFCF70237
+:1017F000182C9713FFFCF78200099793FFFCF7065C
+:10180000319C9713FFFC07880008E000161C979393
+:10181000FFFCF0057A78F00532E88796FFFC8296A7
+:10182000FFF802140000013C000000000001929348
+:10183000FFFC0290000822100050F70471C800005D
+:101840000001203A0000E6001855F68671C4E00059
+:10185000186CF6020000F70471D40000000177391B
+:101860000002C7386800863A001800000001F6053B
+:1018700032C486B2000807018000C5B47400F58543
+:1018800032D087320018F6866F4477390002A73AC3
+:101890006802202E0000F70532C0073809D886B24A
+:1018A0000004F70532CCE6001941F68532C8F7048A
+:1018B0007198F6847A782738000120360000E60017
+:1018C0001910F7057198F70476FC00000001203A22
+:1018D0000000E60018E8F3020011F30632D4F30525
+:1018E00076FCE00018F8F7020001F30576F8F3063D
+:1018F00032D4F3057700F7020000203A0000E6003A
+:101900001914F3020001F3063110E000268CF305F0
+:1019100032D4F3020001F3057A78F3063084F3053C
+:1019200032D4F30432C4000000019313FFFC078893
+:101930000008E00006109793FFFCE000268C0000F2
+:101940000001F3020000202E0000E6001CB99316EF
+:10195000FFE4873200088696FFE4C3040000C03A23
+:101960003200E6001984203600008732000C0000A7
+:101970000001C03A3200E600198420360000F682E9
+:10198000000120360000E6001CB8F3020000F70456
+:1019900032C09316FFACF58432C4863A142803B8DB
+:1019A0001420042C000886BA142400000001C03260
+:1019B0006A00EC001A709616FFEC77310001C73808
+:1019C000600077390002C63838000630000C86B255
+:1019D0000000872E00088516FFACC0367200E600B6
+:1019E0001A00C484000086B20004872E000C000098
+:1019F0000001C0367200E6001A04202A0000F50239
+:101A00000001202A0000E6001A1100000001F48203
+:101A1000000086B200008722000000000001C036EE
+:101A20007200E2001A4CF5820000C0367200E60037
+:101A30001A54202E000086B2000487220004000001
+:101A40000001C0367200E2001A55202E0000F58217
+:101A50000001202E0000E6001A6520260000F48216
+:101A6000000120260000E6001A70F3020001931620
+:101A7000FFAC8316FFAC00000001201A0000E60056
+:101A80001AB1F60200018716FFEC0000000176B9DA
+:101A90000001C6B4700076B50002C6B4380006B4C2
+:101AA000001486B600009716FFF0E0001B1896960B
+:101AB000FFF4271400149713FFFC9413FFFC939377
+:101AC000FFFC9396FFBC07880008E0012568979308
+:101AD000FFFC8396FFBC20220000E6001B15F602E7
+:101AE00000018716FFEC0000000176B90001C6B4C2
+:101AF000700076B50002C6B4380006B4001486B68D
+:101B000000009716FFF09696FFF4971E0008E0007D
+:101B10001B1C20320000F602000020320000E6000C
+:101B20001CB8F3020000F60432C09316FFAC86B274
+:101B3000142803B014200430148C873214240000BD
+:101B40000001C0367200EC001C049696FFEC77355D
+:101B50000001C738680077390002C5B8380005AC05
+:101B6000000C86AE00008732148C8516FFACC036A0
+:101B70007200E6001B94C484000086AE0004873225
+:101B8000149000000001C0367200E6001B98202A65
+:101B90000000F5020001202A0000E6001BA500005D
+:101BA0000001F482000086AE0000872200000000E1
+:101BB0000001C0367200E2001BE0F6020000C036F1
+:101BC0007200E6001BE82032000086AE0004872287
+:101BD000000400000001C0367200E2001BE9203260
+:101BE0000000F602000120320000E6001BF920266A
+:101BF0000000F482000120260000E6001C04F3022D
+:101C000000019316FFAC8316FFAC00000001201A00
+:101C10000000E6001C45F60200018716FFEC0000FC
+:101C2000000176B90001C6B4700076B50002C6B4F2
+:101C3000380006B4001486B600009716FFF0E000E6
+:101C40001CAC9696FFF4271400149713FFFC941312
+:101C5000FFFC9393FFFC9396FFBC07880008E0010C
+:101C600025689793FFFC8396FFBC20220000E600C6
+:101C70001CA9F60200018716FFEC0000000176B9EE
+:101C80000001C6B4700076B50002C6B4380006B4D0
+:101C9000001486B600009716FFF09696FFF4971E84
+:101CA0000008E0001CB020320000F60200002032E4
+:101CB0000000E6001E15F3020001F68432C00000A9
+:101CC000000185B60EF486360EF8202E0010E200D4
+:101CD0001CDC20320010E2001CF9000000018736F5
+:101CE0000F00000000010738000197360F0087360B
+:101CF0000F00E0001D24F702000007300001C03A89
+:101D00005A00E6001D1DF682000020320010E60099
+:101D10001D20202E0000E6001D24C7340000F6829E
+:101D20000001C7340000203A0000E6001E14F30250
+:101D30000001F30432CC000000019316FFDC931382
+:101D4000FFFC07880008E00043689793FFFC20220F
+:101D50000000E6001DFCF30200008316FFDC00001B
+:101D60000001861A00000000000120320010E2008D
+:101D70001D9176B10002871A000C0000000107389F
+:101D80000001971A000C871A000CE0001DFCF302FA
+:101D90000000F302004C9313FFFCC6B460007735DB
+:101DA0000004C7386A008316FFDCC7386000C738F4
+:101DB0003000073800109713FFFCF3067A289313BE
+:101DC000FFFC9616FFB407880008E00126F89793F9
+:101DD000FFFC8616FFB4000000010630000120322F
+:101DE0000011E6001DEC00000001F6020000831661
+:101DF000FFDC00000001961A0000F30200019316B8
+:101E0000FFD48316FFD400000001201A0000E60072
+:101E10001E18F30200019316FFE48316FFE400008E
+:101E20000001201A0000E6001F35F6820CABF70413
+:101E300032B48316FFD407380001F70532B4F70433
+:101E400032B4201A0000E6001E7000000001F70402
+:101E500032C0F306E030C03A3200E6001E700000E7
+:101E60000001F70432E80000000107380001F7051F
+:101E700032E8F70471C400000001203A0000E600D7
+:101E80001EADF6862C28F7042D3800000001063818
+:101E90000001F6052D3877390002F302000A2032DE
+:101EA0000044E6001EACB33A6802F0052D38F70492
+:101EB00071D4F68471CC07380001C03A6A00E6009C
+:101EC0001EC8F70571D4F00571D4F68471D4F704F7
+:101ED00071D0F00571C4C0367200470C0001F68461
+:101EE00032D00000000120360000E60025D9F705B9
+:101EF00071C8F704719800000001203A0000E60064
+:101F0000257900000001F70475EC00000001203A7B
+:101F10000000E600257800000001F70475F00000DD
+:101F20000001203A0000E600257800000001E000F2
+:101F300025DCF306319CF00532E8F70432C0F604E4
+:101F40006F5496BA000420320000E6001F60F302CE
+:101F5000000CF3020001F3056F54E0001F68F70264
+:101F60000001F3056F58F7020000203A0000E60078
+:101F70001F7CF3062F6CE000268CF30532D4F58429
+:101F80007A7024940010202E0001E6002284F5854A
+:101F90007AA0F7020001F60432C8F7057A70F70458
+:101FA00032C4F68432C0F6057A2C9002FF8090028B
+:101FB000FF38F5847A28073800249582FF3C970281
+:101FC000FF409602FF448736141000000001C73816
+:101FD0006000973614108736141800000001073887
+:101FE00000019736141887361418F0056F50F7045F
+:101FF00032B89596FFECC7386000F70532B8F704A1
+:1020000032BCF3062FF807380001F70532BCF7049D
+:1020100032BCF30532D4F7060C3EC07E7400E600F5
+:10202000203400000001C07E7400E600202500007E
+:102030000001F7060C3EC77C7400203A0010E60051
+:10204000268C00000001F70432E4FF820010F584C2
+:102050006F5807380001202E0021E2002090F7057C
+:1020600032E4F7042D38F6862C2806380001F605F0
+:102070002D387739000220320044E6002084B5BABA
+:102080006802F0052D38F3020022E0002094F305E9
+:102090006F58F0056F54F58432C000000001902E97
+:1020A0000004872E000000000001203A0002E60034
+:1020B00021C0000000018702FF38032C0EF49316A4
+:1020C000FFCCF7057A689313FFFC9596FFB8078855
+:1020D0000008E00043A09793FFFC8596FFB82022FC
+:1020E0000000E600217C00000001862E0EF80000B2
+:1020F000000120320010E2002119F302004C872E6B
+:102100000F000000000107380001972E0F00872EF6
+:102110000F00E000217C000000019313FFFCF30698
+:102120007A289313FFFC76B10002C6B460007735BD
+:102130000004C7386A008316FFCCC7386000C73870
+:102140003000073800109713FFFC9596FFB89616DD
+:10215000FFB407880008E00126F89793FFFC861675
+:10216000FFB48596FFB80630000120320011E6006A
+:10217000217800000001F6020000962E0EF8F70408
+:1021800032C0F306E030C03A3200E60021C0000061
+:102190000001F704E0180000000177B8001E703E4F
+:1021A000FFE1E60021C1000000010F814000F704BB
+:1021B00079C80000000107380001F70579C8F70465
+:1021C00079C8F70471C400000001203A0000E6005D
+:1021D00021FDF6862C28F7042D3800000001063872
+:1021E0000001F6052D3877390002F302000A20328B
+:1021F0000044E60021FCB33A6802F0052D38F704EC
+:1022000071D4F68471CC07380001C03A6A00E60048
+:102210002218F70571D4F00571D4F68471D4F7044F
+:1022200071D0F00571C4C0367200470C0001F6840D
+:1022300032D00000000120360000E60025D9F70565
+:1022400071C8F704719800000001203A0000E60010
+:10225000257900000001F70475EC00000001203A28
+:102260000000E600257800000001F70475F000008A
+:102270000001203A0000E600257800000001E0009F
+:1022800025DCF306319CF0057A889002FF38F005D2
+:102290006F509002FF80F70432C4F3063228F30532
+:1022A00032D4F60432C8F6847A2CF50200000738DE
+:1022B0000024F7057A9820320000E60022D5F605C2
+:1022C0007A90C02A5A00E6002620C0326A00EE004A
+:1022D000262100000001F68432C00000000187368C
+:1022E000141000000001C7386000973614108736BC
+:1022F00014180000000107380001973614188736BB
+:102300001418F70432B800000001C7386000F70560
+:1023100032B8F70432BC0000000107380001F705AD
+:1023200032BCF70432BC20320000E6002345000036
+:102330000001F70432E0F5057A7007380001E0008B
+:102340002348F70532E0F5057A70F5846F580000F0
+:102350000001202E0021E200238CF6862C28F704B1
+:102360002D380000000106380001F6052D387739B8
+:10237000000220320044E6002380B5BA6802F0056E
+:102380002D38F3020022E0002390F3056F58F0058A
+:102390006F54F58432C000000001902E0004872E97
+:1023A000000000000001203A0002E60024BC00000A
+:1023B00000018702FF38032C0EF49316FFC4F705C3
+:1023C0007A689313FFFC9596FFB807880008E00031
+:1023D00043A09793FFFC8596FFB820220000E600FB
+:1023E000247800000001862E0EF800000001203243
+:1023F0000010E2002415F302004C872E0F000000AD
+:10240000000107380001972E0F00872E0F00E00013
+:102410002478000000019313FFFCF3067A2893133D
+:10242000FFFC76B10002C6B4600077350004C738FF
+:102430006A008316FFC4C7386000C7383000073809
+:1024400000109713FFFC9596FFB89616FFB4078807
+:102450000008E00126F89793FFFC8616FFB48596E6
+:10246000FFB80630000120320011E600247400009D
+:102470000001F6020000962E0EF8F70432C0F306B3
+:10248000E030C03A3200E60024BC00000001F7044E
+:10249000E0180000000177B8001E703EFFE1E60082
+:1024A00024BD000000010F814000F70479C800003E
+:1024B000000107380001F70579C8F70479C8F70467
+:1024C00071C400000001203A0000E60024F9F686FD
+:1024D0002C28F7042D380000000106380001F6050D
+:1024E0002D3877390002F302000A20320044E6005A
+:1024F00024F8B33A6802F0052D38F70471D4F68455
+:1025000071CC07380001C03A6A00E6002514F705CF
+:1025100071D4F00571D4F68471D4F70471D0F0054C
+:1025200071C4C0367200470C0001F68432D000003E
+:10253000000120360000E60025D9F70571C8F70430
+:10254000719800000001203A0000E60025790000A3
+:102550000001F70475EC00000001203A0000E600DD
+:10256000257800000001F70475F000000001203A12
+:102570000000E60025D100000001F58476F8000097
+:102580000001202E0021E20025C4F6862C28F70445
+:102590002D380000000106380001F6052D38773986
+:1025A000000220320044E60025B0B5BA6802F0050A
+:1025B0002D38F3020022F30576F8F3047700E000EB
+:1025C00025C8F30576FCF00576FCE00025D8F0057B
+:1025D0007A78E00025DCF306319CF3062EE0F30563
+:1025E00032D4F70471C800000001203A0000E60070
+:1025F000268CF6862C28F7042D38000000010638BA
+:102600000001F6052D3877390002F3020009203267
+:102610000044E600268CB33A6802E000268CF00500
+:102620002D38F7047A9000000001C03A6A00EE00ED
+:102630002641C5B40000C7385A00E0002648F70517
+:102640007A90C5B80000F0057A90F6847A88F7068B
+:102650007A2876350003A732700206B40001971677
+:10266000FFEC84A6FFFCF7067A2CF3047A98948298
+:10267000FF3C9302FF409582FF44B5B27002F7041D
+:102680007A98F6857A88C7385800F7057A98879639
+:10269000FFFC8296FFF802140000013C00000000DD
+:1026A00000019293FFFC02900008F7020001F70579
+:1026B0007A78F7063084F70532D4F70432C4000084
+:1026C00000019713FFFC07880008E00006109793AD
+:1026D000FFFC8796FFFC8296FFF802140000013C85
+:1026E0000000000000019293FFFC029000082210FD
+:1026F0000050F70432D0F3020000203A0000E60058
+:102700002A719316FFE4F68432C48616FFE48736F6
+:102710000008C3040000C03A3200E600273C203223
+:1027200000008736000C00000001C03A3200E600CD
+:10273000273C20320000F602000120320000E600B3
+:102740002A70F3020000F70432C09316FFACF58440
+:1027500032C4863A142803B81420042C000886BA20
+:10276000142400000001C0326A00EC0028289616EC
+:10277000FFEC77310001C738600077390002C638B6
+:1027800038000630000C86B20000872E000885163F
+:10279000FFACC0367200E60027B8C484000086B2E1
+:1027A0000004872E000C00000001C0367200E60015
+:1027B00027BC202A0000F5020001202A0000E600C4
+:1027C00027C900000001F482000086B200008722C1
+:1027D000000000000001C0367200E2002804F5820B
+:1027E0000000C0367200E600280C202E000086B2E1
+:1027F00000048722000400000001C0367200E200DD
+:10280000280D202E0000F5820001202E0000E60099
+:10281000281D20260000F482000120260000E6008A
+:102820002828F30200019316FFAC8316FFAC0000CA
+:102830000001201A0000E6002869F6020001871650
+:10284000FFEC0000000176B90001C6B4700076B557
+:102850000002C6B4380006B4001486B6000097160D
+:10286000FFF0E00028D09696FFF427140014971389
+:10287000FFFC9413FFFC9393FFFC9396FFBC078827
+:102880000008E00125689793FFFC8396FFBC202297
+:102890000000E60028CDF60200018716FFEC0000DC
+:1028A000000176B90001C6B4700076B50002C6B466
+:1028B000380006B4001486B600009716FFF096960E
+:1028C000FFF4971E0008E00028D420320000F60232
+:1028D000000020320000E6002A70F3020000F60437
+:1028E00032C09316FFAC86B2142803B01420043013
+:1028F000148C8732142400000001C0367200EC00F2
+:1029000029BC9696FFEC77350001C7386800773907
+:102910000002C5B8380005AC000C86AE0000873256
+:10292000148C8516FFACC0367200E600294CC484B6
+:10293000000086AE00048732149000000001C0360B
+:102940007200E6002950202A0000F5020001202A2A
+:102950000000E600295D00000001F482000086AE60
+:1029600000008722000000000001C0367200E20073
+:102970002998F6020000C0367200E60029A0203235
+:10298000000086AE00048722000400000001C0366B
+:102990007200E20029A120320000F602000120327C
+:1029A0000000E60029B120260000F4820001202664
+:1029B0000000E60029BCF30200019316FFAC831669
+:1029C000FFAC00000001201A0000E60029FDF6021D
+:1029D00000018716FFEC0000000176B90001C6B4C3
+:1029E000700076B50002C6B4380006B4001486B68E
+:1029F00000009716FFF0E0002A649696FFF4271473
+:102A000000149713FFFC9413FFFC9393FFFC939621
+:102A1000FFBC07880008E00125689793FFFC8396B8
+:102A2000FFBC20220000E6002A61F60200018716A2
+:102A3000FFEC0000000176B90001C6B4700076B565
+:102A40000002C6B4380006B4001486B6000097161B
+:102A5000FFF09696FFF4971E0008E0002A682032E7
+:102A60000000F602000020320000E6002BCDF30249
+:102A70000001F68432C00000000185B60EF48636EF
+:102A80000EF8202E0010E2002A9420320010E200FE
+:102A90002AB10000000187360F000000000107384E
+:102AA000000197360F0087360F00E0002ADCF7029E
+:102AB000000007300001C03A5A00E6002AD5F6822D
+:102AC000000020320010E6002AD8202E0000E60088
+:102AD0002ADCC7340000F6820001C7340000203A27
+:102AE0000000E6002BCCF3020001F30432CC00001E
+:102AF00000019316FFDC9313FFFC07880008E00039
+:102B000043689793FFFC20220000E6002BB4F302F9
+:102B100000008316FFDC00000001861A00000000A0
+:102B2000000120320010E2002B4976B10002871A22
+:102B3000000C0000000107380001971A000C871AEA
+:102B4000000CE0002BB4F3020000F302004C9313DE
+:102B5000FFFCC6B4600077350004C7386A008316EE
+:102B6000FFDCC7386000C738300007380010971303
+:102B7000FFFCF3067A289313FFFC9616FFB4078830
+:102B80000008E00126F89793FFFC8616FFB40000CA
+:102B900000010630000120320011E6002BA40000E5
+:102BA0000001F60200008316FFDC00000001961A07
+:102BB0000000F30200019316FFD48316FFD4000037
+:102BC0000001201A0000E6002BD0F302000193164A
+:102BD000FFE48316FFE400000001201A0000E60075
+:102BE0002CEDF6820CABF70432B48316FFD4073811
+:102BF0000001F70532B4F70432B4201A0000E600F1
+:102C00002C2800000001F70432C0F306E030C03A7F
+:102C10003200E6002C2800000001F70432E8000032
+:102C2000000107380001F70532E8F70471C400001D
+:102C30000001203A0000E6002C65F6862C28F704F7
+:102C40002D380000000106380001F6052D387739CF
+:102C50000002F302000A20320044E6002C64B33A7A
+:102C60006802F0052D38F70471D4F68471CC07386A
+:102C70000001C03A6A00E6002C80F70571D4F00527
+:102C800071D4F68471D4F70471D0F00571C4C036E4
+:102C90007200470C0001F68432D00000000120369B
+:102CA0000000E6003391F70571C8F7047198000041
+:102CB0000001203A0000E600333100000001F70473
+:102CC00075EC00000001203A0000E60033300000FF
+:102CD0000001F70475F000000001203A0000E60052
+:102CE000333000000001E0003394F306319CF0051E
+:102CF00032E8F70432C0F6046F5496BA000420326A
+:102D00000000E6002D18F302000CF3020001F305A9
+:102D10006F54E0002D20F7020001F3056F58F70211
+:102D20000000203A0000E6002D34F3062F6CE0008E
+:102D30003444F30532D4F5847A7024940010202EA4
+:102D40000001E600303CF5857AA0F7020001F604A8
+:102D500032C8F7057A70F70432C4F68432C0F6053B
+:102D60007A2C9002FF809002FF38F5847A28073889
+:102D700000249582FF3C9702FF409602FF4487366D
+:102D8000141000000001C738600097361410873611
+:102D90001418000000010738000197361418873610
+:102DA0001418F0056F50F70432B89596FFECC73849
+:102DB0006000F70532B8F70432BCF3062FF8073885
+:102DC0000001F70532BCF70432BCF30532D4F70634
+:102DD0000C3EC07E7400E6002DEC00000001C07EB9
+:102DE0007400E6002DDD00000001F7060C3EC77CF4
+:102DF0007400203A0010E600344400000001F7049B
+:102E000032E4FF820010F5846F5807380001202E4D
+:102E10000021E2002E48F70532E4F7042D38F6864B
+:102E20002C2806380001F6052D38773900022032AB
+:102E30000044E6002E3CB5BA6802F0052D38F302D6
+:102E40000022E0002E4CF3056F58F0056F54F58416
+:102E500032C000000001902E0004872E0000000008
+:102E60000001203A0002E6002F78000000018702EE
+:102E7000FF38032C0EF49316FFCCF7057A689313F2
+:102E8000FFFC9596FFB807880008E00043A09793E1
+:102E9000FFFC8596FFB820220000E6002F340000DA
+:102EA0000001862E0EF80000000120320010E20022
+:102EB0002ED1F302004C872E0F00000000010738CE
+:102EC0000001972E0F00872E0F00E0002F34000026
+:102ED00000019313FFFCF3067A289313FFFC76B1ED
+:102EE0000002C6B4600077350004C7386A00831654
+:102EF000FFCCC7386000C738300007380010971380
+:102F0000FFFC9596FFB89616FFB407880008E0010D
+:102F100026F89793FFFC8616FFB48596FFB8063017
+:102F2000000120320011E6002F3000000001F602FF
+:102F30000000962E0EF8F70432C0F306E030C03AD7
+:102F40003200E6002F7800000001F704E0180000CE
+:102F5000000177B8001E703EFFE1E6002F79000007
+:102F600000010F814000F70479C800000001073814
+:102F70000001F70579C8F70479C8F70471C40000A7
+:102F80000001203A0000E6002FB5F6862C28F70451
+:102F90002D380000000106380001F6052D3877397C
+:102FA0000002F302000A20320044E6002FB4B33AD4
+:102FB0006802F0052D38F70471D4F68471CC073817
+:102FC0000001C03A6A00E6002FD0F70571D4F00581
+:102FD00071D4F68471D4F70471D0F00571C4C03691
+:102FE0007200470C0001F68432D000000001203648
+:102FF0000000E6003391F70571C8F70471980000EE
+:103000000001203A0000E600333100000001F7041F
+:1030100075EC00000001203A0000E60033300000AB
+:103020000001F70475F000000001203A0000E600FE
+:10303000333000000001E0003394F306319CF005CA
+:103040007A889002FF38F0056F509002FF80F704F5
+:1030500032C4F3063228F30532D4F60432C8F684BB
+:103060007A2CF502000007380024F7057A98203200
+:103070000000E600308DF6057A90C02A5A00E6007E
+:1030800033D8C0326A00EE0033D900000001F68464
+:1030900032C0000000018736141000000001C7385C
+:1030A00060009736141087361418000000010738A6
+:1030B00000019736141887361418F70432B8000048
+:1030C0000001C7386000F70532B8F70432BC0000D1
+:1030D000000107380001F70532BCF70432BC20328A
+:1030E0000000E60030FD00000001F70432E0F505C5
+:1030F0007A7007380001E0003100F70532E0F5058D
+:103100007A70F5846F5800000001202E0021E20043
+:103110003144F6862C28F7042D38000000010638CB
+:103120000001F6052D387739000220320044E60010
+:103130003138B5BA6802F0052D38F3020022E000FC
+:103140003148F3056F58F0056F54F58432C0000024
+:103150000001902E0004872E000000000001203A9C
+:103160000002E6003274000000018702FF38032CE1
+:103170000EF49316FFC4F7057A689313FFFC959637
+:10318000FFB807880008E00043A09793FFFC8596EE
+:10319000FFB820220000E600323000000001862E39
+:1031A0000EF80000000120320010E20031CDF302E1
+:1031B000004C872E0F000000000107380001972EF9
+:1031C0000F00872E0F00E000323000000001931343
+:1031D000FFFCF3067A289313FFFC76B10002C6B415
+:1031E000600077350004C7386A008316FFC4C7380B
+:1031F0006000C7383000073800109713FFFC959621
+:10320000FFB89616FFB407880008E00126F89793E8
+:10321000FFFC8616FFB48596FFB806300001203209
+:103220000011E600322C00000001F6020000962E8C
+:103230000EF8F70432C0F306E030C03A3200E60080
+:10324000327400000001F704E0180000000177B8B4
+:10325000001E703EFFE1E6003275000000010F81A4
+:103260004000F70479C80000000107380001F705A5
+:1032700079C8F70479C8F70471C400000001203A46
+:103280000000E60032B1F6862C28F7042D38000045
+:10329000000106380001F6052D3877390002F302E7
+:1032A000000A20320044E60032B0B33A6802F0056A
+:1032B0002D38F70471D4F68471CC07380001C03A78
+:1032C0006A00E60032CCF70571D4F00571D4F684BB
+:1032D00071D4F70471D0F00571C4C0367200470C88
+:1032E0000001F68432D00000000120360000E60024
+:1032F0003391F70571C8F704719800000001203A76
+:103300000000E600333100000001F70475EC000016
+:103310000001203A0000E600333000000001F7040D
+:1033200075F000000001203A0000E600338900003B
+:103330000001F58476F800000001202E0021E20053
+:10334000337CF6862C28F7042D380000000106385F
+:103350000001F6052D387739000220320044E600DE
+:103360003368B5BA6802F0052D38F3020022F30580
+:1033700076F8F3047700E0003380F30576FCF0057F
+:1033800076FCE0003390F0057A78E0003394F306A1
+:10339000319CF3062EE0F30532D4F70471C8000027
+:1033A0000001203A0000E6003444F6862C28F70499
+:1033B0002D380000000106380001F6052D38773958
+:1033C0000002F302000920320044E6003444B33A1C
+:1033D0006802E0003444F0052D38F7047A900000CC
+:1033E0000001C03A6A00EE0033F9C5B40000C738E6
+:1033F0005A00E0003400F7057A90C5B80000F005E7
+:103400007A90F6847A88F7067A2876350003A73210
+:10341000700206B400019716FFEC84A6FFFCF706C5
+:103420007A2CF3047A989482FF3C9302FF409582B1
+:10343000FF44B5B27002F7047A98F6857A88C738E7
+:103440005800F7057A988796FFFC8296FFF80214D9
+:103450000000013C0000000000019293FFFC02907C
+:10346000000822100020F5847A7000000001202E50
+:103470000001E600376CF5857AA0F7020001F6043A
+:1034800032C8F7057A70F70432C4F68432C0F60504
+:103490007A2C9002FF809002FF38F5847A28073852
+:1034A00000249582FF3C9702FF409602FF44873636
+:1034B000141000000001C7386000973614108736DA
+:1034C00014180000000107380001973614188736D9
+:1034D0001418F0056F50F70432B89596FFF4C7380A
+:1034E0006000F70532B8F70432BCF4862FF80738CD
+:1034F0000001F70532BCF70432BCF48532D4F7067C
+:103500000C3EC07E7400E600351C00000001C07E49
+:103510007400E600350D00000001F7060C3EC77C84
+:103520007400203A0010E6003B7000000001F70430
+:1035300032E4FF820010F5846F5807380001202E16
+:103540000021E2003578F70532E4F7042D38F686DD
+:103550002C2806380001F6052D3877390002203274
+:103560000044E600356CB5BA6802F0052D38F482E7
+:103570000022E000357CF4856F58F0056F54F58427
+:1035800032C000000001902E0004872E00000000D1
+:103590000001203A0002E60036A800000001870280
+:1035A000FF3804AC0EF49496FFECF7057A68949318
+:1035B000FFFC9596FFDC07880008E00043A0979386
+:1035C000FFFC8596FFDC20220000E6003664000048
+:1035D0000001862E0EF80000000120320010E200EB
+:1035E0003601F482004C872E0F00000000010738DE
+:1035F0000001972E0F00872E0F00E00036640000B8
+:1036000000019493FFFCF4867A289493FFFC76B132
+:103610000002C6B4600077350004C7386A0084969B
+:10362000FFECC7386000C738480007380010971310
+:10363000FFFC9596FFDC9616FFD807880008E0018E
+:1036400026F89793FFFC8616FFD88596FFDC063098
+:10365000000120320011E600366000000001F60291
+:103660000000962E0EF8F70432C0F486E030C03A1F
+:103670004A00E60036A800000001F704E018000048
+:10368000000177B8001E703EFFE1E60036A9000099
+:1036900000010F814000F70479C8000000010738DD
+:1036A0000001F70579C8F70479C8F70471C4000070
+:1036B0000001203A0000E60036E5F6862C28F704E3
+:1036C0002D380000000106380001F6052D38773945
+:1036D0000002F482000A20320044E60036E4B4BA64
+:1036E0006802F0052D38F70471D4F68471CC0738E0
+:1036F0000001C03A6A00E6003700F70571D4F00512
+:1037000071D4F68471D4F70471D0F00571C4C03659
+:103710007200470C0001F68432D000000001203610
+:103720000000E6003AC1F70571C8F704719800007F
+:103730000001203A0000E6003A6100000001F704B1
+:1037400075EC00000001203A0000E6003A6000003D
+:103750000001F70475F000000001203A0000E600C7
+:103760003A6000000001E0003AC4F486319CF005A4
+:103770007A889002FF38F0056F509002FF80F704BE
+:1037800032C4F4863228F48532D4F60432C8F68482
+:103790007A2CF502000007380024F7057A982032C9
+:1037A0000000E60037BDF6057A90C02A5A00E60010
+:1037B0003B08C0326A00EE003B0900000001F684BD
+:1037C00032C0000000018736141000000001C73825
+:1037D000600097361410873614180000000107386F
+:1037E00000019736141887361418F70432B8000011
+:1037F0000001C7386000F70532B8F70432BC00009A
+:10380000000107380001F70532BCF70432BC203252
+:103810000000E600382D00000001F70432E0F50555
+:103820007A7007380001E0003830F70532E0F5051E
+:103830007A70F5846F5800000001202E0021E2000C
+:103840003874F6862C28F7042D380000000106385D
+:103850000001F6052D387739000220320044E600D9
+:103860003868B5BA6802F0052D38F4820022E0000D
+:103870003878F4856F58F0056F54F58432C0000035
+:103880000001902E0004872E000000000001203A65
+:103890000002E60039A4000000018702FF3804ACF2
+:1038A0000EF49496FFE4F7057A689493FFFC9596DE
+:1038B000FFDC07880008E00043A09793FFFC859693
+:1038C000FFDC20220000E600396000000001862EA7
+:1038D0000EF80000000120320010E20038FDF482F2
+:1038E000004C872E0F000000000107380001972EC2
+:1038F0000F00872E0F00E000396000000001949354
+:10390000FFFCF4867A289493FFFC76B10002C6B4DB
+:10391000600077350004C7386A008496FFE4C73832
+:103920006000C7384800073800109713FFFC9596D1
+:10393000FFDC9616FFD807880008E00126F8979369
+:10394000FFFC8616FFD88596FFDC0630000120328A
+:103950000011E600395C00000001F6020000962E1E
+:103960000EF8F70432C0F486E030C03A4A00E600B0
+:1039700039A400000001F704E0180000000177B846
+:10398000001E703EFFE1E60039A5000000010F8136
+:103990004000F70479C80000000107380001F7056E
+:1039A00079C8F70479C8F70471C400000001203A0F
+:1039B0000000E60039E1F6862C28F7042D380000D7
+:1039C000000106380001F6052D3877390002F4822F
+:1039D000000A20320044E60039E0B4BA6802F0057B
+:1039E0002D38F70471D4F68471CC07380001C03A41
+:1039F0006A00E60039FCF70571D4F00571D4F6844D
+:103A000071D4F70471D0F00571C4C0367200470C50
+:103A10000001F68432D00000000120360000E600EC
+:103A20003AC1F70571C8F704719800000001203A07
+:103A30000000E6003A6100000001F70475EC0000A8
+:103A40000001203A0000E6003A6000000001F7049F
+:103A500075F000000001203A0000E6003AB90000CD
+:103A60000001F58476F800000001202E0021E2001C
+:103A70003AACF6862C28F7042D38000000010638F1
+:103A80000001F6052D387739000220320044E600A7
+:103A90003A98B5BA6802F0052D38F4820022F48510
+:103AA00076F8F4847700E0003AB0F48576FCF0050F
+:103AB00076FCE0003AC0F0057A78E0003AC4F4867B
+:103AC000319CF4862EE0F48532D4F70471C80000EE
+:103AD0000001203A0000E6003B70F6862C28F7042F
+:103AE0002D380000000106380001F6052D38773921
+:103AF0000002F482000920320044E6003B70B4BAB0
+:103B00006802E0003B70F0052D38F7047A90000061
+:103B10000001C03A6A00EE003B29C5B40000C73876
+:103B20005A00E0003B30F7057A90C5B80000F00578
+:103B30007A90F7047A88F6867A2876390003A6B256
+:103B4000680207380001F7057A88F7047A98969694
+:103B5000FFF49682FF3CF4847A98F6867A2CC73874
+:103B600058009482FF409582FF44B5B26802F70581
+:103B70007A988796FFFC8296FFF802140000013CB9
+:103B80000000000000019293FFFC02900008221048
+:103B90000018F5047A88F7067A2CF5847A9076A9CD
+:103BA0000003A6B67002202E0000E6003BCD000008
+:103BB0000001F7047AA000000001C02A7200E600AC
+:103BC0003F18C02E6A00EE003F1900000001F68485
+:103BD00032C0F60432C88736141000000001C7381E
+:103BE000600097361410873614180000000107385B
+:103BF00000019736141887361418F70432B80000FD
+:103C00000001C7386000F70532B8F70432BC000085
+:103C1000000107380001F70532BCF70432BC202E42
+:103C20000000E6003C3DF6820000F70432E0F68535
+:103C30007A7007380001E0003C40F70532E0F505F6
+:103C40007A70F5846F5800000001202E0021E200F8
+:103C50003C84F6862C28F7042D3800000001063835
+:103C60000001F6052D387739000220320044E600C5
+:103C70003C78B5BA6802F0052D38F4820022E000E5
+:103C80003C88F4856F58F0056F54F58432C000000D
+:103C90000001902E0004872E000000000001203A51
+:103CA0000002E6003DB4000000018702FF3804ACCA
+:103CB0000EF49496FFECF7057A689493FFFC9596C2
+:103CC000FFE407880008E00043A09793FFFC859677
+:103CD000FFE420220000E6003D7000000001862E77
+:103CE0000EF80000000120320010E2003D0DF482C9
+:103CF000004C872E0F000000000107380001972EAE
+:103D00000F00872E0F00E0003D700000000194932B
+:103D1000FFFCF4867A289493FFFC76B10002C6B4C7
+:103D2000600077350004C7386A008496FFECC73816
+:103D30006000C7384800073800109713FFFC9596BD
+:103D4000FFE49616FFE007880008E00126F8979345
+:103D5000FFFC8616FFE08596FFE406300001203266
+:103D60000011E6003D6C00000001F6020000962EF6
+:103D70000EF8F70432C0F486E030C03A4A00E6009C
+:103D80003DB400000001F704E0180000000177B81E
+:103D9000001E703EFFE1E6003DB5000000010F810E
+:103DA0004000F70479C80000000107380001F7055A
+:103DB00079C8F70479C8F70471C400000001203AFB
+:103DC0000000E6003DF1F6862C28F7042D380000AF
+:103DD000000106380001F6052D3877390002F4821B
+:103DE000000A20320044E6003DF0B4BA6802F00553
+:103DF0002D38F70471D4F68471CC07380001C03A2D
+:103E00006A00E6003E0CF70571D4F00571D4F68423
+:103E100071D4F70471D0F00571C4C0367200470C3C
+:103E20000001F68432D00000000120360000E600D8
+:103E30003ED1F70571C8F704719800000001203ADF
+:103E40000000E6003E7100000001F70475EC000080
+:103E50000001203A0000E6003E7000000001F70477
+:103E600075F000000001203A0000E6003EC90000A5
+:103E70000001F58476F800000001202E0021E20008
+:103E80003EBCF6862C28F7042D38000000010638C9
+:103E90000001F6052D387739000220320044E60093
+:103EA0003EA8B5BA6802F0052D38F4820022F485E8
+:103EB00076F8F4847700E0003EC0F48576FCF005E7
+:103EC00076FCE0003ED0F0057A78E0003ED4F4863F
+:103ED000319CF4862EE0F48532D4F70471C80000DA
+:103EE0000001203A0000E6003F80F6862C28F70407
+:103EF0002D380000000106380001F6052D3877390D
+:103F00000002F482000920320044E6003F80B4BA87
+:103F10006802E0003F80F0052D38F7047A90000039
+:103F20000001C03A6A00EE003F39C5B40000C7384E
+:103F30005A00E0003F40F7057A90C5B80000F00550
+:103F40007A90F7047A88F6867A2876390003A6B242
+:103F5000680207380001F7057A88F7047A98969680
+:103F6000FFF49682FF3CF4847A98F6867A2CC73860
+:103F700058009482FF409582FF44B5B26802F7056D
+:103F80007A988796FFFC8296FFF802140000013CA5
+:103F90000000000000019293FFFC02900008221034
+:103FA0000010F5846F5800000001202E0021E2006F
+:103FB0003FE4F6862C28F7042D380000000106386F
+:103FC0000001F6052D387739000220320044E60062
+:103FD0003FD8B5BA6802F0052D38F5020022E0009E
+:103FE0003FE8F5056F58F0056F54F58432C00000C6
+:103FF0000001902E0004872E000000000001203AEE
+:104000000002E6004114000000018702FF38052C81
+:104010000EF49516FFF4F7057A689513FFFC959654
+:10402000FFEC07880008E00043A09793FFFC85960B
+:10403000FFEC20220000E60040D000000001862EA8
+:104040000EF80000000120320010E200406DF50281
+:10405000004C872E0F000000000107380001972E4A
+:104060000F00872E0F00E00040D0000000019513E4
+:10407000FFFCF5067A289513FFFC76B10002C6B462
+:10408000600077350004C7386A008516FFF4C7382A
+:104090006000C7385000073800109713FFFC959652
+:1040A000FFEC9616FFE807880008E00126F89793D2
+:1040B000FFFC8616FFE88596FFEC063000012032F3
+:1040C0000011E60040CC00000001F6020000962E30
+:1040D0000EF8F70432C0F506E030C03A5200E600B0
+:1040E000411400000001F704E0180000000177B857
+:1040F000001E703EFFE1E6004115000000010F8147
+:104100004000F70479C80000000107380001F705F6
+:1041100079C8F70479C8F70471C400000001203A97
+:104120000000E6004151F6862C28F7042D380000E7
+:10413000000106380001F6052D3877390002F50236
+:10414000000A20320044E6004150B53A6802F0050A
+:104150002D38F70471D4F68471CC07380001C03AC9
+:104160006A00E600416CF70571D4F00571D4F6845D
+:1041700071D4F70471D0F00571C4C0367200470CD9
+:104180000001F68432D00000000120360000E60075
+:104190004231F70571C8F704719800000001203A18
+:1041A0000000E60041D100000001F70475EC0000BA
+:1041B0000001203A0000E60041D000000001F704B1
+:1041C00075F000000001203A0000E60042290000DE
+:1041D0000001F58476F800000001202E0021E200A5
+:1041E000421CF6862C28F7042D3800000001063802
+:1041F0000001F6052D387739000220320044E60030
+:104200004208B5BA6802F0052D38F5020022F5051E
+:1042100076F8F5047700E0004220F50576FCF0051D
+:1042200076FCE0004230F0057A78E0004234F50692
+:10423000319CF5062EE0F50532D4F70471C8000074
+:104240000001203A0000E6004274F6862C28F704AC
+:104250002D380000000106380001F6052D387739A9
+:104260000002F502000920320044E6004274B53A2B
+:104270006802F0052D388796FFFC8296FFF802143D
+:104280000000013C0000000000019293FFFC02903E
+:104290000008F70632D49713FFFCF7062EE09713B9
+:1042A000FFFC07880008E00014F49793FFFCF70672
+:1042B00032D49713FFFCF7062F6C9713FFFC078887
+:1042C0000008E00014F49793FFFCF70632D497132C
+:1042D000FFFCF7062FF89713FFFC07880008E000A3
+:1042E00014F49793FFFCF70632D49713FFFCF706FC
+:1042F00030849713FFFC07880008E00014F49793BC
+:10430000FFFCF70632D49713FFFCF7063110971322
+:10431000FFFC07880008E00014F49793FFFCF70601
+:1043200032D49713FFFCF706319C9713FFFC0788E4
+:104330000008E00014F49793FFFCF70632D49713BB
+:10434000FFFCF70632289713FFFC07880008E000FF
+:1043500014F49793FFFC8796FFFC8296FFF80214F3
+:104360000000013C0000000000019293FFFC02905D
+:104370000008871600000000000186BA0000873A96
+:10438000000400000001C0367200440C0001879652
+:10439000FFFC8296FFF802140004013C00000000BC
+:1043A00000019293FFFC0290000885960000000037
+:1043B0000001862E000086AE000420320010E200CC
+:1043C00043D00000000120360010E20043ED073426
+:1043D0000001872E000C0000000107380001972E15
+:1043E000000C872E000CE0004414F4020000C03AD8
+:1043F0006200E6004411F402000020360010E600DE
+:1044000044140000000120320000E60044140000C3
+:104410000001F40200018796FFFC8296FFF8021467
+:104420000004013C0000000000019293FFFC029098
+:104430000008F7020001F7053524F7046F44000077
+:104440000001F7053528F70632F49713FFFCF7064D
+:1044500035309713FFFC07880008E0001548979354
+:10446000FFFCF70245049713FFFCF702000D9713BA
+:10447000FFFCF70632F49713FFFC07880008E00002
+:10448000161C9793FFFCF7024A049713FFFCF702F0
+:10449000000F9713FFFCF70633809713FFFC078884
+:1044A0000008E000161C9793FFFCF7024EEC9713F0
+:1044B000FFFCF70200089713FFFCF706340C971374
+:1044C000FFFC07880008E000161C9793FFFCF7022A
+:1044D00057649713FFFCF70200079713FFFCF706DA
+:1044E00034989713FFFC07880008E000161C979388
+:1044F000FFFC8796FFFC8296FFF802140000013C47
+:104500000000000000019293FFFC029000082210BE
+:104510000014F70475F800000001203A0000E600DE
+:10452000452DF68675F8E0004544F7020000F704D3
+:1045300076040000000177390002C7386800873A26
+:10454000001800000001203A0000E600455CF70575
+:104550003548F4863380E00049F0F4853530F704BF
+:104560006F5400000001203A0000E6004580F4820C
+:104570000008F4820001F4856F54E0004588F702DA
+:104580000001F4856F58F7020000203A0000E600B1
+:1045900045A0F4820004F486340CE00049F0F48570
+:1045A0003530F6843548F604352CF4B72800073446
+:1045B0000002F4820001F4BB28008732008CF482F0
+:1045C00000019736001887320090F4856F509736B7
+:1045D000000484B200840000000194B6001084B28C
+:1045E00000880000000194B6001484B6001000009A
+:1045F000000194B6000884B600140000000194B6CF
+:10460000000C84B2009800000001F4853554F48257
+:1046100000019482FF80F5043554F4863498F485C3
+:1046200035309502FF3885B2000006B4002495822B
+:10463000FF3C9682FF4087320004F6853550970292
+:10464000FF4486B20004F005354CF704354095165A
+:10465000FFF49596FFF4C7386800F7053540F584F8
+:10466000352886B20004872E141400000001C738D4
+:104670006800972E14148732008000000001203A51
+:104680000001EE0049F0F7060C3EC07E7400E60023
+:1046900046A400000001C07E7400E60046950000BC
+:1046A0000001F7060C3EC77C7400203A0010E600BB
+:1046B00049F000000001FF8200108682FF38F704F5
+:1046C0003558F5846F58F685355407380001202E8B
+:1046D0000021E2004708F7053558F7042D38F68623
+:1046E0002C2806380001F6052D38773900022032D3
+:1046F0000044E60046FCB5BA6802F0052D38F482A5
+:104700000022E000470CF4856F58F0056F54F684E2
+:10471000352C0000000187360094C4840000C03AA4
+:104720004A00E60047710000000186360094F684D6
+:1047300035540000000176B4FFF0F7043554969626
+:10474000FFF4473900009716FFF0C6B47000F70475
+:10475000354877B4000F703EFFE107380024E600CB
+:104760004769C638600006B40001C7046E00F7331D
+:104770002800F6843544000000018736000400005C
+:104780000001203A000FE20047BD073800018736DC
+:10479000000C00000001073800019736000C873636
+:1047A000000CE00047D000000001F7043528F68235
+:1047B000000107380008E0004968F7053544203A51
+:1047C0000010E60047CC00000001F7020000973619
+:1047D0000004F704353CF684352807380001F70556
+:1047E000353CF704353C8736141C000000010738BF
+:1047F00000019736141CF704760486B6141CF604E0
+:1048000075FC07380001F684760000000001C03A0C
+:104810006A00E600481CF7057604F0057604F68485
+:104820007604F7047608F00575FCC0367200470C74
+:10483000000120320000E6004881F70575F8F70412
+:104840007648F4867218C03A4A00470C0001203AB4
+:104850000000E6004881F6862C28F7042D38000079
+:10486000000106380001F6052D3877390002F48280
+:10487000000E20320044E6004880B4BA6802F00519
+:104880002D38F5020000202A0002EE004968F68269
+:104890000000F68435280000000187360000000083
+:1048A0000001203A0002E600493C05B40008959357
+:1048B000FFFC9516FFEC9596FFE89696FFE40788B7
+:1048C0000008E0005EDC9793FFFC8516FFEC859600
+:1048D000FFE88696FFE420220000E600492CF7025C
+:1048E00000008636000C000000012032000FE200BC
+:1048F000491100000001873600140000000107384C
+:1049000000019736001487360014E000492CF702A6
+:10491000000076B10002C6B4600077350005C738E4
+:104920006A00C738600007380010C72C7000203AB2
+:104930000000E60047A8F705352CF6843528F70473
+:104940006F4C00000001C0367200E600495C07347D
+:104950001494F4846F44E0004960F4853528F70529
+:104960003528E00048840528000120360000E600D4
+:1049700049A1F6862C28F7042D38000000010638DE
+:104980000001F6052D3877390002F482000D20323F
+:104990000044E60049A8B4BA6802E00049A8F0055E
+:1049A0002D38F4820001F4853524F6843528F70487
+:1049B0006F44F48632F4C0367200E60049F0F485A4
+:1049C0003530F704E0180000000177B8001F703E92
+:1049D000FFE1E60049F1000000010F814000F7040B
+:1049E00079C80000000107380001F70579C8F7040D
+:1049F00079C88796FFFC8296FFF802140000013CFC
+:104A00000000000000019293FFFC029000082210B9
+:104A10000014F70475F800000001203A0000E600D9
+:104A20004A2DF68675F8E0004A40F6820000F70449
+:104A300076040000000177390002C738680086BAA2
+:104A40000018F7046F5400000001203A0000E6004F
+:104A50004A64F6853548F4820001F4856F54E0001D
+:104A60004A70F7020001F4820008F4856F58F702DB
+:104A70000000203A0000E6004A88F4820004F48630
+:104A8000340CE0004ED8F4853530F6843548F60411
+:104A9000352CF4B7280007340002F4820001F4BB7F
+:104AA00028008732008CF482000197360018873284
+:104AB0000090F4856F509736000484B200840000A3
+:104AC000000194B6001084B200880000000194B682
+:104AD000001484B600100000000194B6000884B6EB
+:104AE00000140000000194B6000C84B2009800008D
+:104AF0000001F4853554F48200019482FF80F504AE
+:104B00003554F4863498F48535309502FF3885B2F3
+:104B1000000006B400249582FF3C9682FF40873255
+:104B20000004F68535509702FF4486B20004F00574
+:104B3000354CF70435409516FFF49596FFF4C738C9
+:104B40006800F7053540F584352886B20004872EC5
+:104B5000141400000001C7386800972E141487321F
+:104B6000008000000001203A0001EE004ED8F70658
+:104B70000C3EC07E7400E6004B8C00000001C07E3D
+:104B80007400E6004B7D00000001F7060C3EC77C78
+:104B90007400203A0010E6004ED800000001FF82A9
+:104BA00000108682FF38F7043558F5846F58F68573
+:104BB000355407380001202E0021E2004BF0F705A4
+:104BC0003558F7042D38F6862C2806380001F605EE
+:104BD0002D387739000220320044E6004BE4B5BAA4
+:104BE0006802F0052D38F4820022E0004BF4F485D1
+:104BF0006F58F0056F54F684352C0000000187369D
+:104C00000094C4840000C03A4A00E6004C590000F9
+:104C1000000186360094F68435540000000176B415
+:104C2000FFF0F70435549696FFF4473900009716C5
+:104C3000FFF0C6B47000F704354877B4000F703E3B
+:104C4000FFE107380024E6004C51C638600006B486
+:104C50000001C7046E00F7332800F68435440000D5
+:104C600000018736000400000001203A000FE20036
+:104C70004CA5073800018736000C000000010738FA
+:104C800000019736000C8736000CE0004CB800009D
+:104C90000001F7043528F682000107380008E0001B
+:104CA0004E50F7053544203A0010E6004CB40000A1
+:104CB0000001F702000097360004F704353CF68443
+:104CC000352807380001F705353CF704353C8736B1
+:104CD000141C00000001073800019736141CF7046B
+:104CE000760486B6141CF60475FC07380001F684B9
+:104CF000760000000001C03A6A00E6004D04F705A6
+:104D00007604F0057604F6847604F7047608F00558
+:104D100075FCC0367200470C000120320000E6002E
+:104D20004D69F70575F8F7047648F4867218C03AAD
+:104D30004A00470C0001203A0000E6004D69F68663
+:104D40002C28F7042D380000000106380001F60574
+:104D50002D3877390002F482000E20320044E6003C
+:104D60004D68B4BA6802F0052D38F5020000202A1B
+:104D70000002EE004E50F6820000F6843528000056
+:104D800000018736000000000001203A0002E60022
+:104D90004E2405B400089593FFFC9516FFEC9596FC
+:104DA000FFE89696FFE407880008E0005EDC979332
+:104DB000FFFC8516FFEC8596FFE88696FFE420222F
+:104DC0000000E6004E14F70200008636000C0000DA
+:104DD00000012032000FE2004DF90000000187368B
+:104DE00000140000000107380001973600148736D0
+:104DF0000014E0004E14F702000076B10002C6B4C1
+:104E0000600077350005C7386A00C738600007388A
+:104E10000010C72C7000203A0000E6004C90F70507
+:104E2000352CF6843528F7046F4C00000001C0369D
+:104E30007200E6004E4407341494F4846F44E0009A
+:104E40004E48F4853528F7053528E0004D6C0528D7
+:104E5000000120360000E6004E89F6862C28F70473
+:104E60002D380000000106380001F6052D3877398D
+:104E70000002F482000D20320044E6004E90B4BAE5
+:104E80006802E0004E90F0052D38F4820001F485B0
+:104E90003524F6843528F7046F44F48632F4C0369E
+:104EA0007200E6004ED8F4853530F704E0180000B3
+:104EB000000177B8001F703EFFE1E6004ED9000008
+:104EC00000010F814000F70479C800000001073895
+:104ED0000001F70579C8F70479C88796FFFC829628
+:104EE000FFF802140000013C000000000001929352
+:104EF000FFFC0290000822100014F6843548F604E6
+:104F0000352CF4820004F4B7280007340002F48240
+:104F10000001F4BB28008732008CF4820001973630
+:104F2000001887320090F4856F509736000484B2E1
+:104F300000840000000194B6001084B200880000D4
+:104F4000000194B6001484B600100000000194B66D
+:104F5000000884B600140000000194B6000C84B26E
+:104F6000009800000001F4853554F4820001948219
+:104F7000FF80F5043554F4863498F4853530950275
+:104F8000FF3885B2000006B400249582FF3C96826B
+:104F9000FF4087320004F68535509702FF4486B201
+:104FA0000004F005354CF70435409516FFF495964E
+:104FB000FFF4C7386800F7053540F584352886B218
+:104FC0000004872E141400000001C7386800972ED3
+:104FD00014148732008000000001203A0001EE0026
+:104FE000534CF7060C3EC07E7400E60050000000F3
+:104FF0000001C07E7400E6004FF100000001F706DA
+:105000000C3EC77C7400203A0010E600534C0000B0
+:105010000001FF8200108682FF38F7043558F584BE
+:105020006F58F685355407380001202E0021E20024
+:105030005064F7053558F7042D38F6862C280638C5
+:105040000001F6052D387739000220320044E600D1
+:105050005058B5BA6802F0052D38F4820022E000FD
+:105060005068F4856F58F0056F54F684352C0000B5
+:10507000000187360094C4840000C03A4A00E6006C
+:1050800050CD0000000186360094F68435540000AF
+:10509000000176B4FFF0F70435549696FFF44739D3
+:1050A00000009716FFF0C6B47000F704354877B4D7
+:1050B000000F703EFFE107380024E60050C5C638F7
+:1050C000600006B40001C7046E00F7332800F684C0
+:1050D0003544000000018736000400000001203A3A
+:1050E000000FE2005119073800018736000C00005C
+:1050F0000001073800019736000C8736000CE000ED
+:10510000512C00000001F7043528F6820001073811
+:105110000008E00052C4F7053544203A0010E600CC
+:10512000512800000001F702000097360004F70440
+:10513000353CF684352807380001F705353CF7047F
+:10514000353C8736141C00000001073800019736F3
+:10515000141CF704760486B6141CF60475FC073894
+:105160000001F684760000000001C03A6A00E60003
+:105170005178F7057604F0057604F6847604F70492
+:105180007608F00575FCC0367200470C000120322D
+:105190000000E60051DDF70575F8F7047648F4865F
+:1051A0007218C03A4A00470C0001203A0000E6009D
+:1051B00051DDF6862C28F7042D3800000001063852
+:1051C0000001F6052D3877390002F482000E2032F6
+:1051D0000044E60051DCB4BA6802F0052D38F5024F
+:1051E0000000202A0002EE0052C4F6820000F6847D
+:1051F0003528000000018736000000000001203A39
+:105200000002E600529805B400089593FFFC95163D
+:10521000FFEC9596FFE89696FFE407880008E0000B
+:105220005EDC9793FFFC8516FFEC8596FFE886967B
+:10523000FFE420220000E6005288F70200008636D4
+:10524000000C000000012032000FE200526D00004F
+:10525000000187360014000000010738000197366E
+:10526000001487360014E0005288F702000076B17F
+:105270000002C6B4600077350005C7386A00C73839
+:10528000600007380010C72C7000203A0000E600CC
+:105290005104F705352CF6843528F7046F4C0000CF
+:1052A0000001C0367200E60052B807341494F4844A
+:1052B0006F44E00052BCF4853528F7053528E0003E
+:1052C00051E00528000120360000E60052FDF68678
+:1052D0002C28F7042D380000000106380001F605DF
+:1052E0002D3877390002F482000D20320044E600A8
+:1052F0005304B4BA6802E0005304F0052D38F48278
+:105300000001F4853524F6843528F7046F44F486CB
+:1053100032F4C0367200E600534CF4853530F704A1
+:10532000E0180000000177B8001F703EFFE1E600C2
+:10533000534D000000010F814000F70479C80000C0
+:10534000000107380001F70579C8F70479C8879686
+:10535000FFFC8296FFF802140000013C00000000F0
+:1053600000019293FFFC0290000822100014F484C4
+:105370003554F684354CF584352C9482FF3876B557
+:105380000003A52E6802000000019502FF3CF38493
+:105390003550C6AC68009382FF4087360004000099
+:1053A00000019702FF4486360004F70435400000F0
+:1053B0000001C7386000F7053540F604352886B689
+:1053C0000004873214149496FFF4C73868009732AB
+:1053D0001414872E008000000001203A0001EE0026
+:1053E00057509516FFF4F7060C3EC07E7400E60099
+:1053F000540400000001C07E7400E60053F5000074
+:105400000001F7060C3EC77C7400203A0010E6004D
+:10541000575000000001FF8200108682FF38F70419
+:105420003558F5846F58F685355407380001202E1D
+:105430000021E2005468F7053558F7042D38F68648
+:105440002C2806380001F6052D3877390002203265
+:105450000044E600545CB5BA6802F0052D38F382CA
+:105460000022E000546CF3856F58F0056F54F68409
+:10547000352C0000000187360094C3840000C03A38
+:105480003A00E60054D10000000186360094F6840C
+:1054900035540000000176B4FFF0F70435549696B9
+:1054A000FFF4473900009716FFF0C6B47000F70408
+:1054B000354877B4000F703EFFE107380024E6005E
+:1054C00054C9C638600006B40001C7046E00F73343
+:1054D0002800F684354400000001873600040000EF
+:1054E0000001203A000FE200551D07380001873601
+:1054F000000C00000001073800019736000C8736C9
+:10550000000CE000553000000001F7043528F68259
+:10551000000107380008E00056C8F7053544203A76
+:105520000010E600552C00000001F702000097363D
+:105530000004F704353CF684352807380001F705E8
+:10554000353CF704353C8736141C00000001073851
+:1055500000019736141CF704760486B6141CF60472
+:1055600075FC07380001F684760000000001C03A9F
+:105570006A00E600557CF7057604F0057604F684AB
+:105580007604F7047608F00575FCC0367200470C07
+:10559000000120320000E60055E1F70575F8F70438
+:1055A0007648F3867218C03A3A00470C0001203A58
+:1055B0000000E60055E1F6862C28F7042D3800009F
+:1055C000000106380001F6052D3877390002F38214
+:1055D000000E20320044E60055E0B3BA6802F00540
+:1055E0002D38F5020000202A0002EE0056C8F6828F
+:1055F0000000F68435280000000187360000000016
+:105600000001203A0002E600569C05B4000895937C
+:10561000FFFC9516FFEC9596FFE89696FFE4078849
+:105620000008E0005EDC9793FFFC8516FFEC859692
+:10563000FFE88696FFE420220000E600568CF70281
+:1056400000008636000C000000012032000FE2004E
+:105650005671000000018736001400000001073871
+:1056600000019736001487360014E000568CF702CC
+:10567000000076B10002C6B4600077350005C73877
+:105680006A00C738600007380010C72C7000203A45
+:105690000000E6005508F705352CF6843528F70498
+:1056A0006F4C00000001C0367200E60056BC0734A3
+:1056B0001494F3846F44E00056C0F3853528F70551
+:1056C0003528E00055E40528000120360000E600FA
+:1056D0005701F6862C28F7042D3800000001063803
+:1056E0000001F6052D3877390002F382000D2032D3
+:1056F0000044E6005708B3BA6802E0005708F00516
+:105700002D38F3820001F3853524F6843528F7041B
+:105710006F44F38632F4C0367200E6005750F385CA
+:105720003530F704E0180000000177B8001F703E24
+:10573000FFE1E6005751000000010F814000F7042F
+:1057400079C80000000107380001F70579C8F7049F
+:1057500079C88796FFFC8296FFF802140000013C8E
+:105760000000000000019293FFFC0290000822104C
+:1057700000148702FF38F384352CF7053554871E53
+:105780000080F504354C27380001C02A7200E6007D
+:105790005A4C00000001F5846F5800000001202ED3
+:1057A0000021E20057D8F6862C28F7042D38000097
+:1057B000000106380001F6052D3877390002203245
+:1057C0000044E60057CCB5BA6802F0052D38F30264
+:1057D0000022E00057DCF3056F58F0056F54F684A3
+:1057E000352C0000000187360094C3040000C03A45
+:1057F0003200E60058410000000186360094F6842D
+:1058000035540000000176B4FFF0F7043554969645
+:10581000FFF4473900009716FFF0C6B47000F70494
+:10582000354877B4000F703EFFE107380024E600EA
+:105830005839C638600006B40001C7046E00F7335B
+:105840002800F6843544000000018736000400007B
+:105850000001203A000FE200588D0738000187361A
+:10586000000C00000001073800019736000C873655
+:10587000000CE00058A000000001F7043528F68273
+:10588000000107380008E0005A38F7053544203A8F
+:105890000010E600589C00000001F7020000973657
+:1058A0000004F704353CF684352807380001F70575
+:1058B000353CF704353C8736141C000000010738DE
+:1058C00000019736141CF704760486B6141CF604FF
+:1058D00075FC07380001F684760000000001C03A2C
+:1058E0006A00E60058ECF7057604F0057604F684C5
+:1058F0007604F7047608F00575FCC0367200470C94
+:10590000000120320000E6005951F70575F8F70450
+:105910007648F3067218C03A3200470C0001203A6C
+:105920000000E6005951F6862C28F7042D380000B7
+:10593000000106380001F6052D3877390002F30220
+:10594000000E20320044E6005950B33A6802F005D8
+:105950002D38F5020000202A0002EE005A38F682A7
+:105960000000F684352800000001873600000000A2
+:105970000001203A0002E6005A0C05B40008959395
+:10598000FFFC9516FFEC9596FFE89696FFE40788D6
+:105990000008E0005EDC9793FFFC8516FFEC85961F
+:1059A000FFE88696FFE420220000E60059FCF7029B
+:1059B00000008636000C000000012032000FE200DB
+:1059C00059E100000001873600140000000107388B
+:1059D00000019736001487360014E00059FCF702E6
+:1059E000000076B10002C6B4600077350005C73804
+:1059F0006A00C738600007380010C72C7000203AD2
+:105A00000000E6005878F705352CF6843528F704B1
+:105A10006F4C00000001C0367200E6005A2C0734BB
+:105A20001494F3046F44E0005A30F3053528F70569
+:105A30003528E00059540528000120360000E60012
+:105A40005DC4F3020001E0005DF000000001772971
+:105A50000003C71C7000873A00040528000176A9DE
+:105A60000003F4843554F60435509482FF38A41EA4
+:105A70006802C63070009402FF3C9602FF40C69C4C
+:105A8000680087360004000000019702FF4485B6D5
+:105A90000004F704354000000001C7385800F7053E
+:105AA000354085B60004F505354CF6843528F605F5
+:105AB0003550873614149496FFF4C738580097363B
+:105AC0001414871E008000000001203A0001EE003F
+:105AD0005E3C9416FFF4F7060C3EC07E7400E600B0
+:105AE0005AF400000001C07E7400E6005AE5000090
+:105AF0000001F7060C3EC77C7400203A0010E60057
+:105B00005E3C00000001FF8200108682FF38F7042F
+:105B10003558F5846F58F685355407380001202E26
+:105B20000021E2005B58F7053558F7042D38F6865A
+:105B30002C2806380001F6052D387739000220326E
+:105B40000044E6005B4CB5BA6802F0052D38F3025C
+:105B50000022E0005B5CF3056F58F0056F54F6849B
+:105B6000352C0000000187360094C3040000C03AC1
+:105B70003200E6005BC10000000186360094F68426
+:105B800035540000000176B4FFF0F70435549696C2
+:105B9000FFF4473900009716FFF0C6B47000F70411
+:105BA000354877B4000F703EFFE107380024E60067
+:105BB0005BB9C638600006B40001C7046E00F73355
+:105BC0002800F684354400000001873600040000F8
+:105BD0000001203A000FE2005C0D07380001873613
+:105BE000000C00000001073800019736000C8736D2
+:105BF000000CE0005C2000000001F7043528F6826C
+:105C0000000107380008E0005DB8F7053544203A88
+:105C10000010E6005C1C00000001F702000097364F
+:105C20000004F704353CF684352807380001F705F1
+:105C3000353CF704353C8736141C0000000107385A
+:105C400000019736141CF704760486B6141CF6047B
+:105C500075FC07380001F684760000000001C03AA8
+:105C60006A00E6005C6CF7057604F0057604F684BD
+:105C70007604F7047608F00575FCC0367200470C10
+:105C8000000120320000E6005CD1F70575F8F7044A
+:105C90007648F3067218C03A3200470C0001203AE9
+:105CA0000000E6005CD1F6862C28F7042D380000B1
+:105CB000000106380001F6052D3877390002F3029D
+:105CC000000E20320044E6005CD0B33A6802F005D2
+:105CD0002D38F5020000202A0002EE005DB8F682A1
+:105CE0000000F6843528000000018736000000001F
+:105CF0000001203A0002E6005D8C05B4000895938F
+:105D0000FFFC9516FFEC9596FFE89696FFE4078852
+:105D10000008E0005EDC9793FFFC8516FFEC85969B
+:105D2000FFE88696FFE420220000E6005D7CF70293
+:105D300000008636000C000000012032000FE20057
+:105D40005D61000000018736001400000001073883
+:105D500000019736001487360014E0005D7CF702DE
+:105D6000000076B10002C6B4600077350005C73880
+:105D70006A00C738600007380010C72C7000203A4E
+:105D80000000E6005BF8F705352CF6843528F704AB
+:105D90006F4C00000001C0367200E6005DAC0734B5
+:105DA0001494F3046F44E0005DB0F3053528F70563
+:105DB0003528E0005CD40528000120360000E6000C
+:105DC0005DF1F3020001F7042D38F6862C28063821
+:105DD0000001F6052D3877390002F302000D20325C
+:105DE0000044E6005DF4B33A6802E0005DF4F005BB
+:105DF0002D38F3053524F6843528F7046F44F3066F
+:105E000032F4C0367200E6005E3CF3053530F7042C
+:105E1000E0180000000177B8001F703EFFE1E600C7
+:105E20005E3D000000010F814000F70479C80000CA
+:105E3000000107380001F70579C8F70479C887968B
+:105E4000FFFC8296FFF802140000013C00000000F5
+:105E500000019293FFFC02900008F706353097137B
+:105E6000FFFCF70632F49713FFFC07880008E000F8
+:105E700014F49793FFFCF70635309713FFFCF706F1
+:105E800033809713FFFC07880008E00014F4979311
+:105E9000FFFCF70635309713FFFCF706340C971319
+:105EA000FFFC07880008E00014F49793FFFCF70656
+:105EB00035309713FFFCF70634989713FFFC0788DB
+:105EC0000008E00014F49793FFFC8796FFFC82968D
+:105ED000FFF802140000013C000000000001929352
+:105EE000FFFC0290000886160000000000018732C7
+:105EF000000400000001203A000F86B20000C538FF
+:105F00000000EE005F2CC5B400002036000FEE004C
+:105F10005F2C00000001203A0000EC005F2D000023
+:105F2000000120360000EC005F48000000018732CD
+:105F3000000C00000001073800019732000C873286
+:105F4000000CE0005F50F4020000C02A5A00440C2C
+:105F500000018796FFFC8296FFF802140004013CC2
+:105F6000000000000001000000009293FFFC02907E
+:105F70000008F68635609693FFFCF68642309693CD
+:105F8000FFFC07880008E00015489793FFFCF682A5
+:105F900066F89693FFFCF78200179793FFFCF6864E
+:105FA00035609693FFFC07880008E000161C979365
+:105FB000FFFCF68269809693FFFCF78200189793A6
+:105FC000FFFCF68635609693FFFC07880008E0002A
+:105FD000161C9793FFFCF6826B509693FFFCF7829A
+:105FE00000169793FFFCF68635609693FFFC0788B2
+:105FF0000008E000161C9793FFFCF68261789693E8
+:10600000FFFCF782001F9793FFFCF686356096939E
+:10601000FFFC07880008E000161C9793FFFCF6823F
+:10602000627C9693FFFCF78200209793FFFCF68634
+:1060300035609693FFFC07880008E000161C9793D4
+:10604000FFFCF68266F89693FFFCF78200179793A1
+:10605000FFFCF68635EC9693FFFC07880008E0000D
+:10606000161C9793FFFCF68269809693FFFCF782DB
+:1060700000189793FFFCF68635EC9693FFFC078893
+:106080000008E000161C9793FFFCF6826B50969375
+:10609000FFFCF78200169793FFFCF68635EC96938B
+:1060A000FFFC07880008E000161C9793FFFCF682AF
+:1060B00061789693FFFCF782001F9793FFFCF686AA
+:1060C00035EC9693FFFC07880008E000161C9793B8
+:1060D000FFFCF682627C9693FFFCF7820020979388
+:1060E000FFFCF68635EC9693FFFC07880008E0007D
+:1060F000161C9793FFFCF704E02800000001203AEB
+:106100000000E600611500000001F704E028E0004F
+:10611000611877390002F70200F0F7054228F70608
+:10612000408AF03B2800F706408CF03B2800F7023D
+:106130000000F7057AC0F7057AB8F7057AB0F705D9
+:106140007AC8F682C3509693FFFCF68200169693A7
+:10615000FFFCF68642309693FFFC07880008E001BA
+:106160001EC09793FFFC8796FFFC8296FFF80214EF
+:106170000000013C0000000000019293FFFC02902F
+:106180000008F6046F340000000120320000E60031
+:1061900061ED76B1001E8732000076B4FFE5C738A6
+:1061A0006FC07739FFF0203A0007E60061EC06B0D7
+:1061B00000028736000076B5001E76B4FFE5C738CA
+:1061C0006FC07739FFF0203A0001E60061ECF50678
+:1061D00035ECF704423000000001C03A5200470C91
+:1061E0000001203A0000E6006211F5820000F70489
+:1061F00042A0F60642A276B1001E76B4FFE5C7388B
+:106200006FC07739FFF007380001E0006268F733AC
+:1062100028008732000400000001F705E00086B284
+:106220000008203A0000E600623CF685E0042036D3
+:106230000000E6006240202E0000F5820001202EC2
+:106240000000E6006265F60642A2F70442A076B1BD
+:10625000001E76B4FFE5C7386FC07739FFF0073806
+:106260000001F7332800F00542288796FFFC82964C
+:10627000FFF802140000013C0000000000019293AE
+:10628000FFFC02900008F704423CF6846F340738A4
+:10629000000120360000E60062B1F705423C873677
+:1062A0000000F59E0002C03A5A00E60062BDF58685
+:1062B00035ECF70442A0E00062DCF60642A2F704E7
+:1062C000423000000001C03A5A00470C0001203A59
+:1062D0000000E60062F9F60642A4F70442A476B193
+:1062E000001E76B4FFE5C7386FC07739FFF0073876
+:1062F0000001E000630CF73328009693FFFC078849
+:106300000008E00063209793FFFCF0054228879681
+:10631000FFFC8296FFF802140000013C0000000020
+:1063200000019293FFFC02900008221000208316C7
+:10633000000000000001871A001800000001203A48
+:106340000000E600636CF7020000839A001C000066
+:106350000001F3857AC0849A0014F7057AC8F485A1
+:106360007AB0F7057AB88316000000000001869A1B
+:106370000014F7047AB000000001C0367200E60095
+:1063800063D0F6020000869A001CF7047AC0000071
+:106390000001C0367200E60063D000000001869A5A
+:1063A0000018F7047AB800000001C0367200E60059
+:1063B00063D000000001869A0020F7047AC800002C
+:1063C0000001C7386800203A0064EE0063D920322B
+:1063D0000000F602000120320000E60064580000D0
+:1063E00000018396000000000001871E00180000D5
+:1063F0000001203A0000E600643CF7020000F705C7
+:106400004080F7054084F6846E50F482FFFF831EBF
+:10641000000CF4854F5493360010839E0010849630
+:10642000000093B6001484A600080000000194B692
+:106430001DDCF6820064F6854A98F7054A9C8316AF
+:10644000000000000001871A002000000001203A2F
+:106450000000EE00647CF3820000F70442A4F6061C
+:1064600042A676B1001E76B4FFE5C7386FC0773913
+:10647000FFF007380001E00066E4F7332800939648
+:10648000FFF484160000F48642C89496FFECF302F1
+:10649000000C9316FFE4839600008496FFF4871E99
+:1064A000002000000001C0267200EC006648F38660
+:1064B0004A9884A200248316FFE4C5040000B49A1D
+:1064C0003802C7183800832200288396FFF4849688
+:1064D000FFE4933A000493BA0008F604E000F306E0
+:1064E0004A98A6A63002F5820000C0326A00E60093
+:1064F0006510C6380000F684E0048732000400000E
+:106500000001C0367200E6006514202E0000F582FE
+:106510000001202E0000E600652100000001F502C8
+:106520000000F684E0008732000000000001C03661
+:106530007200E200655CF5820000C0367200E60081
+:106540006564202E0000F684E00487320004000019
+:106550000001C0367200E2006565202E0000F58261
+:106560000001202E0000E6006575202A0000F502DB
+:106570000001202A0000E6006588000000018396E3
+:10658000FFF400000001F3854F548722002C76A110
+:10659000001E76B4FFE505A0002E762D001E763095
+:1065A000FFE5F48200009496FFDC8316FFEC2026C2
+:1065B0000007C7386FC07738FFF0F71B2800872E19
+:1065C000000006980002C73867C07738FFF0E20085
+:1065D000661CF73728008516FFEC8596FFDC000067
+:1065E0000001C72C400086BA0030062800040528A8
+:1065F000000205AC00028396FFDC7739001E773875
+:10660000FFE5039C00019396FFDC201E0007C6B443
+:1066100077C076B4FFF0E20065E1F6B3280004200D
+:10662000001C8496FFEC8316FFE48396FFF404A419
+:1066300000149496FFEC0318000C9316FFE4039CDF
+:106640000001E00064949396FFF48496000000003B
+:1066500000018726002000000001F7054A9C85A65E
+:106660000020F7047AB80000000107380001F705A0
+:106670007AB8F7047AB8F6847AC886260018C6B4C1
+:1066800058008726001C0000000127380001C03296
+:106690007200470C0001203A0000E60066E5F6852E
+:1066A0007AC883260008F7046E50F3053B6483A67E
+:1066B0000008F682000093BA1DDC84A6000C831645
+:1066C000000094BA0010831A0010F6857AC8933A35
+:1066D0000014F7020001F7054084F6857AC0F685BC
+:1066E0007AB8F6857AB08796FFFC8296FFF8021496
+:1066F0000004013C0000000000019293FFFC0290A6
+:10670000000822100008F3846F3400000001871E87
+:106710000018F684E01C00000001C0367200EC0096
+:106720006729F7020001F7020000203A0000E600A6
+:1067300067E8F5820001F704E01C869E001800005F
+:106740000001C03A6A00470C0001203A0000E60050
+:1067500067E9C5840000869E0010F704E000F60299
+:106760000000C0367200E6006788051C0010869E97
+:106770000014F704E00400000001C0367200E600D7
+:10678000678C20320000F602000120320000E60093
+:10679000679900000001F582000086AA0000F70456
+:1067A000E00000000001C0367200E20067D4F6028B
+:1067B0000000C0367200E60067DC2032000086AAC6
+:1067C0000004F704E00400000001C0367200E2009B
+:1067D00067DD20320000F602000120320000E600F2
+:1067E00067ED202E0000F5820001202E0000E6005B
+:1067F0006810F606429CF704429C76B1001E76B4FF
+:10680000FFE5C7386FC07739FFF007380001F7336D
+:106810002800F70475F475ACFFE1203A0000E600AB
+:1068200068459596FFF4F7044298F606429876B1CB
+:10683000001E76B4FFE5C7386FC07739FFF0073820
+:106840000001F7332800871E0020041C002076A1D9
+:10685000001E76B4FFE5C7386FC07739FFF0203AE5
+:106860000008EE0068C4F3061554F5020000059C0C
+:106870000022C4AC0000F60200018722000076A1CD
+:10688000001E76B4FFE5C7386FC07739FFF0C02A25
+:106890007200EC0068C0C6A46000A726600276B54E
+:1068A000001E76B4FFE505280001C7386FC07739B0
+:1068B000FFE8F72F680005AC0001E00068780630BB
+:1068C0000002F30615549313FFFCF704E0240000C4
+:1068D00000019713FFFCF704E01C00000001971370
+:1068E000FFFCF306E0009313FFFC9393FFFCF3021D
+:1068F00000019313FFFC07880008E000EE64979303
+:10690000FFFC20220000E6006928F606429EF704FC
+:10691000429C76B1001E76B4FFE5C7386FC0773968
+:10692000FFF007380001F73328008316FFF400005A
+:106930000001201A0000E600696CF30635ECF7044C
+:10694000423000000001C03A3200470C0001203AFA
+:106950000000E600696DF0054228F3063560F30596
+:10696000423007880008E000789C9793FFFC8796E8
+:10697000FFFC8296FFF802140000013C00000000BA
+:1069800000019293FFFC0290000822100004F5041D
+:106990006F34F7044240862A001807380001F68455
+:1069A000E01CF7054240C0366200EC0069B5F70212
+:1069B0000001F7020000203A0000E6006A80F702BA
+:1069C0000001F704E01C86AA001800000001C03A8C
+:1069D0006A00470C0001203A0000E6006A7DC58489
+:1069E000000086AA0010F704E000F6020000C0369E
+:1069F0007200E6006A1404A8001086AA0014F704C6
+:106A0000E00400000001C0367200E6006A1820327F
+:106A10000000F602000120320000E6006A250000B6
+:106A20000001F582000086A60000F704E0000000E7
+:106A30000001C0367200E2006A60F6020000C03653
+:106A40007200E6006A682032000086A60004F7049F
+:106A5000E00400000001C0367200E2006A692032E2
+:106A60000000F602000120320000E6006A81C72C17
+:106A70000000F5820001E0006A80C72C0000C70416
+:106A80000000203A0000EE006B3DF686408AF704D5
+:106A9000408876B5001E76B4FFE5C7386FC07738FA
+:106AA000FFF0203A0000E6006B3CF6820000F6851D
+:106AB0004080F68540849693FFFC9693FFFCF70494
+:106AC000E01C000000019713FFFCF386E0009393A5
+:106AD000FFFC9513FFFCF38200029393FFFC969654
+:106AE000FFF407880008E000EE649793FFFCF405CC
+:106AF00040848696FFF4F7046E50F38635ECF685F5
+:106B00004090F6854094873A1DDCF6854228F705CB
+:106B10003B64F7044230F4054080C03A3A00470C29
+:106B20000001203A0000E6006B3DF3863560F385F6
+:106B3000423007880008E000789C9793FFFC879616
+:106B4000FFFC8296FFF802140000013C00000000E8
+:106B500000019293FFFC02900008F4864230949367
+:106B6000FFFC07880008E00120E49793FFFC202247
+:106B70000000E6006DD9F5820000F704408CF606AF
+:106B8000408C7631001EF68442287630FFE506B44C
+:106B90000001C73867C07738FFF0203A0000E600F0
+:106BA0006BC8F6854228F7044088F686408A76B599
+:106BB000001E76B4FFE5C7386FC07738FFF0203A83
+:106BC0000000E6006D0D00000001F704408CF68621
+:106BD000408C76B5001E76B4FFE5C7386FC07738B5
+:106BE000FFF0203A0000E6006C35F606408AF70414
+:106BF000408876B1001E76B4FFE5C7386FC077389D
+:106C0000FFF0203A0000E6006C34F4863678F70492
+:106C1000424400000001C03A4A00470C0001203AFB
+:106C20000000E6006C35F4820001F4B32800E000B7
+:106C30006D10F005422CF704408CF506408C76A9C7
+:106C4000001E76B4FFE5C7386FC07738FFF0203AF2
+:106C50000000E6006CC1F606408AF704408876B171
+:106C6000001E76B4FFE5C7386FC07738FFF0203AD2
+:106C70000000E6006CC100000001F704422C000097
+:106C8000000107380001203A0009EE006D11F705F8
+:106C9000422CF02B2800F0332800F5820001F70485
+:106CA0004294F606429476B1001E76B4FFE5C738EA
+:106CB0006FC07739FFF007380001E0006D10F7333F
+:106CC0002800F704408CF686408C76B5001E76B41A
+:106CD000FFE5C7386FC07738FFF0203A0000E600C4
+:106CE0006D14202E0000F7044088F606408A76B125
+:106CF000001E76B4FFE5C7386FC07738FFF0203A42
+:106D00000000E6006D15202E0000F0332800F5820B
+:106D10000001202E0000E6006DB5F48635ECF70486
+:106D2000423000000001C03A4A00470C0001203AFE
+:106D30000000E6006D5900000001F704E0280000A3
+:106D40000001203A0000E6006D79F682003CF684EE
+:106D5000E028E0006D7800000001F704E028000062
+:106D60000001203A0000E6006D79F68200F0F70499
+:106D7000E0280000000176B90002F7044228000074
+:106D80000001C03A6A00EC006DB5F6862C28F704C5
+:106D90002D38F005422806380001F6052D387739E0
+:106DA0000002F482001920320044E6006DB4B4BA47
+:106DB0006802F0052D38F482C3509493FFFCF482EE
+:106DC00000169493FFFCF48642309493FFFC0788EE
+:106DD0000008E0011EC09793FFFC8796FFFC829697
+:106DE000FFF802140000013C000000000001929333
+:106DF000FFFC0290000822100004F5863678959377
+:106E0000FFFCF58642449593FFFC07880008E000EC
+:106E100015489793FFFCF58274189593FFFCF58253
+:106E200000199593FFFCF58636789593FFFC07884B
+:106E30000008E000161C9793FFFCF58274AC959354
+:106E4000FFFCF782001D9793FFFCF58637049593AE
+:106E5000FFFC07880008E000161C9793FFFCF582F2
+:106E600078009593FFFCF782001B9793FFFCF58653
+:106E700037049593FFFC07880008E000161C9793E1
+:106E8000FFFCF58278FC9593FFFCF782001A97933C
+:106E9000FFFCF58637909593FFFC07880008E0001B
+:106EA000161C9793FFFCF58280D89593FFFCF78220
+:106EB000001B9793FFFCF58637909593FFFC07889E
+:106EC0000008E000161C9793FFFCF58281749593EF
+:106ED000FFFCF782001D9793FFFCF586381C959305
+:106EE000FFFC07880008E000161C9793FFFCF58262
+:106EF00087749593FFFCF782001B9793FFFCF58640
+:106F0000381C9593FFFC07880008E000161C979337
+:106F1000FFFCF58294F89593FFFCF782001B979392
+:106F2000FFFCF58639349593FFFC07880008E000E4
+:106F3000161C9793FFFCF5828A009593FFFCF7825D
+:106F4000001C9793FFFCF58639349593FFFC078866
+:106F50000008E000161C9793FFFCF5828E089593BD
+:106F6000FFFCF782001A9793FFFCF586393495935E
+:106F7000FFFC07880008E000161C9793FFFCF582D1
+:106F8000969C9593FFFCF782001E9793FFFCF58675
+:106F900038A89593FFFC07880008E000161C97931B
+:106FA000FFFCF5829B2C9593FFFCF782001B9793C7
+:106FB000FFFCF58638A89593FFFC07880008E000E1
+:106FC000161C9793FFFCF582A2DC9593FFFCF782D9
+:106FD000001E9793FFFCF5863AD89593FFFC07882F
+:106FE0000008E000161C9793FFFCF5829E549593D1
+:106FF000FFFCF782001B9793FFFCF5863AD8959328
+:10700000FFFC07880008E000161C9793FFFCF58240
+:10701000A3C09593FFFCF782001C9793FFFCF586B5
+:1070200039C09593FFFC07880008E000161C979371
+:10703000FFFCF582A7649593FFFCF782001E9793EF
+:10704000FFFCF58639C09593FFFC07880008E00037
+:10705000161C9793FFFCF582AA049593FFFCF78218
+:10706000001B9793FFFCF58639C09593FFFC0788BA
+:107070000008E000161C9793FFFCF582AEF895938C
+:10708000FFFCF782001C9793FFFCF5863A4C959322
+:10709000FFFC07880008E000161C9793FFFCF7062A
+:1070A0004250F03B2800F7064088F03B2800F602EB
+:1070B0000000F6054080F6054084F7063B70F63B7D
+:1070C0002800F7063B72F0BB2800F582CA20F58540
+:1070D0003B74F7063B78F03B2800F7063B7AF0BBA1
+:1070E0002800F582B194F5853B7CF7063B80F03BA8
+:1070F0002800F7063B82F0BB2800F582C754F585CF
+:107100003B84F7063B88F03B2800F7063B8AF0BB40
+:107110002800F582BEF8F5853B8CF7063B90F03BE6
+:107120002800F7063B92F0BB2800F582C8F8F585E9
+:107130003B94F7063B98F03B2800F7063B9AF0BBE0
+:107140002800F582C5D8F5853B9CF7063BA0F03BAF
+:107150002800F7063BA2F0BB2800F582C770F58532
+:107160003BA4F7063BA8F03B2800F7063BAAF0BB80
+:107170002800F582C1B4F5853BAC9616FFF407886C
+:107180000008E000D5409793FFFCF6846E50861609
+:10719000FFF40000000196361DDCF6053B6487967F
+:1071A000FFFC8296FFF802140000013C0000000082
+:1071B00000019293FFFC02900008221000302594F9
+:1071C0000020F02F280026140038F03328009013F8
+:1071D000FFFCF7044250F686425076B5001E76B4A6
+:1071E000FFE5C7386FC07739FFF09713FFFC9613A0
+:1071F000FFFC9593FFFC07880008E000F5F49793E7
+:10720000FFFC20220000E600721DF5021770F70453
+:1072100042540000000127380001F705425495133D
+:10722000FFFCF502001B9513FFFCF5064244951385
+:10723000FFFC07880008E0011EC09793FFFC8796BB
+:10724000FFFC8296FFF802140000013C00000000E1
+:1072500000019293FFFC02900008F704E0048616F8
+:107260000000F68200FF7739FFF0C7386C00F73373
+:107270002800F706E006873A000006B00002F7375C
+:107280002800F6843B6407300004F6BB2800870220
+:10729000FF3406300006F73328008796FFFC8296FD
+:1072A000FFF802140004013C00000000000192936A
+:1072B000FFFC029000082210003026140020F0335A
+:1072C000280027140038F03B28009713FFFC909308
+:1072D000FFFCF7044250F686425076B5001E76B4A5
+:1072E000FFE5C7386FC07739FFF09713FFFC96139F
+:1072F000FFFC07880008E000F3389793FFFC20228A
+:107300000000E6007319F5821770F704425400007C
+:10731000000127380001F70542549593FFFCF582E0
+:10732000001B9593FFFCF58642449593FFFC07886C
+:107330000008E0011EC09793FFFC8796FFFC829631
+:10734000FFF802140000013C0000000000019293CD
+:10735000FFFC029000082210004026140020961620
+:10736000FFC4F03328009013FFFC9613FFFC261493
+:1073700000389616FFBC9613FFFC07880008E00053
+:10738000D0DC9793FFFC9013FFFCF7044250F68685
+:10739000425076B5001E76B4FFE5C7386FC0773926
+:1073A000FFF09713FFFC8616FFBC00000001961348
+:1073B000FFFC8616FFC4000000019613FFFC07883F
+:1073C0000008E000F5F49793FFFC20220000E6009F
+:1073D00073E5F6021770F7044254000000012738E5
+:1073E0000001F70542549613FFFCF602001B9613AA
+:1073F000FFFCF60642449613FFFC07880008E001F4
+:107400001EC09793FFFC8796FFFC8296FFF802143C
+:107410000000013C0000000000019293FFFC02907C
+:10742000000822100004F5820000F5854080959642
+:10743000FFF407880008E000CB509793FFFC859687
+:10744000FFF4F5020064F5053BB4F7044250F486FE
+:10745000425076A5001E76B4FFE5F6044F5CF402B8
+:107460000006F4054254F5853B6CF5853BB8953232
+:10747000000095B20004C7386FC07739FFF00738B5
+:107480000001F727280007880008E00071B09793F3
+:10749000FFFCF4063704F40542448796FFFC82960D
+:1074A000FFF802140000013C00000000000192936C
+:1074B000FFFC0290000822100050F7044250F686AC
+:1074C000425076B5001E76B4FFE5F6046F34C73837
+:1074D0006FC086B2000C7739FFF0C0367200E6004C
+:1074E00077ECC504000086B20010F704E000F30258
+:1074F0000000C0367200E600751804B0001086B2B5
+:107500000014F704E00400000001C0367200E60039
+:10751000751C201A0000F3020001201A0000E6008A
+:10752000752900000001F502000086A60000F7049E
+:10753000E00000000001C0367200E2007564F6024F
+:107540000000C0367200E600756C2032000086A68E
+:107550000004F704E00400000001C0367200E200FD
+:10756000756D20320000F602000120320000E600B6
+:10757000757D202A0000F5020001202A0000E600A7
+:1075800077EC0000000107880008E000CBCC97935F
+:10759000FFFC26140020F033280004A00002F0278E
+:1075A0002800F582000023940022F59F280003A004
+:1075B000001A9396FFD42594002285AE000077AD83
+:1075C000001E77BCFFE5C5AC7FC075ADFFF076311E
+:1075D000001E7630FFE506A400022314001E751578
+:1075E000001EF59F2800F384E0007528FFE593A2B4
+:1075F000001CF584E0047399001E739CFFE59396CC
+:10760000FFAC7395001E739CFFE59396FFCC23940B
+:10761000004295A200208716FFE07595001E75AC0C
+:10762000FFE59596FFB47595001E75ACFFE5959640
+:10763000FFC4C73867C07738FFF0F7272800F48405
+:107640004F58871A0000C4A04A0074A4FFFAC5A4CA
+:107650000000F59F28008396FFAC2314001A7619CA
+:10766000001E7630FFE58596FFB4C7383FC07738F7
+:10767000FFF0F737280006B400028716FFE4839670
+:10768000FFCCC73857C07738FFF0F7372800871A84
+:10769000000006B40002C73867C07738FFF0F7373C
+:1076A000280006B400028716FFE823140016761996
+:1076B000001E7630FFE5C7385FC07738FFF0F73738
+:1076C0002800871A000006B40002C73867C0773860
+:1076D000FFF0F737280006B400028716FFEC2314EA
+:1076E00000127619001E7630FFE5C7383FC07738A4
+:1076F000FFF0F7372800871A000006B400028596CD
+:10770000FFC4C73867C07738FFF0F73728008716FF
+:10771000FFF006B40002C7385FC07738FFF0F737D4
+:107720002800F3820002F3A3280004200018259407
+:10773000002285AE000077AD001E77BCFFE5C5AC2A
+:107740007FC075ADFFF08396FFD4F5A32800F49FAA
+:1077500028002594004285AE000077AD001E77BC5E
+:10776000FFE5C5AC7FC075ADFFF044AD000094935C
+:10777000FFFCF786E0009793FFFCF3844F5C00006A
+:1077800000019393FFFC07880008E00123409793D2
+:10779000FFFC07880008E00078D89793FFFCF0050D
+:1077A0004084F786E0009793FFFC07880008E0001C
+:1077B000D5A09793FFFCF7046E50F4054084873AF8
+:1077C0001DDC00000001F7053B64F5863678F58581
+:1077D0004244F3863560F3854230F5864244959302
+:1077E000FFFC07880008E0011F489793FFFC87967D
+:1077F000FFFC8296FFF802140000013C000000002C
+:1078000000019293FFFC02900008F5864244959394
+:10781000FFFC07880008E00120E49793FFFC20228A
+:107820000000E600788900000001F70442540000DF
+:107830000001203A0000EE007851F6064250078819
+:107840000008E00071B09793FFFCE000788800002A
+:107850000001F704425076B1001E76B4FFE5F582D0
+:107860000006F5854254C7386FC07739FFF00738F6
+:107870000001F733280007880008E00072AC9793F6
+:10788000FFFCF5863790F58542448796FFFC82968B
+:10789000FFF802140000013C000000000001929378
+:1078A000FFFC02900008F6063678F6054244F7021F
+:1078B0000000F7054080F7054094F6846E50F70508
+:1078C000409097361DDC8796FFFC8296FFF80214E5
+:1078D0000000013C0000000000019293FFFC0290B8
+:1078E0000008F7020001F70540808796FFFC8296AA
+:1078F000FFF802140000013C000000000001929318
+:10790000FFFC02900008221000A8F7044250F58600
+:10791000425076AD001EF4846F3476B4FFE5949641
+:10792000FFC4C7386FC086A6000C7739FFF0C03699
+:107930007200E6007955F606429AF704429876B14D
+:10794000001E76B4FFE5C7386FC07739FFF00738FF
+:107950000001F7332800F704425076AD001E76B4DC
+:10796000FFE58516FFC4C7386FC086AA000C7739BB
+:10797000FFF0C0367200E60080A8F606429A872A19
+:107980000010862A001C203A0000E60079A8F68242
+:107990000000872A001400000001203A0000E600E1
+:1079A00079AC20360000F682000120360000E600A7
+:1079B0007A05249400209496FFBC8516FFC4F02716
+:1079C0002800052800109516FFB49513FFFC0788C2
+:1079D0000008E00072509793FFFC8496FFB400000B
+:1079E00000019493FFFC8516FFBC00000001951375
+:1079F000FFFC07880008E000F9349793FFFCE000E3
+:107A000080C40000000120320000E600806C00000D
+:107A1000000107880008E000CBCC9793FFFC259479
+:107A20000020F02F280004A000029496FF5CF027AD
+:107A30002800F48200002514005AF4AB2800072027
+:107A4000001A2514005A852A000077A9001E77BC69
+:107A5000FFE5C5287FC07529FFF075AD001E75AC28
+:107A6000FFE52314001E7619001EF53B2800F48460
+:107A7000E0007630FFE594A2001CF504E004849653
+:107A8000FF5C952200208716FFE006A40002751512
+:107A9000001E7528FFE59516FF547495001E74A40A
+:107AA000FFE59496FF9C7515001E7528FFE5951659
+:107AB000FF947495001E8516FF5C74A4FFE59496F0
+:107AC000FF8C8496FF54C7385FC07738FFF0F72BE0
+:107AD0002800871A00008516FF9CC73867C07738D2
+:107AE000FFF0F737280006B400028716FFE42314DE
+:107AF000001A7619001E7630FFE5C7384FC0773878
+:107B0000FFF0F7372800871A000006B400028496B9
+:107B1000FF94C73867C07738FFF0F737280006B4FE
+:107B200000028716FFE8231400167619001E76302F
+:107B3000FFE5C73857C07738FFF0F7372800871AB6
+:107B4000000006B40002C73867C07738FFF0F73787
+:107B5000280006B400028716FFEC231400127619E1
+:107B6000001E7630FFE5C7384FC07738FFF0F73793
+:107B70002800871A000006B400028516FF8CC7385B
+:107B800067C07738FFF0F73728008716FFF006B494
+:107B90000002C73857C07738FFF0F7372800F48263
+:107BA0000002F4A328002514005A852A000077A9B2
+:107BB000001E77BCFFE5C5287FC07529FFF00720B0
+:107BC0000018F53B28009416FFAC07880008E00079
+:107BD000CBCC9793FFFC261400382494005A84A63B
+:107BE000000077A5001E77BCFFE5C4A47FC074A584
+:107BF000FFF005A0000206AC000223940036751DBC
+:107C0000001E7528FFE50720001AF4B3280076311E
+:107C1000001E7630FFE59516FF547495001E74A47F
+:107C2000FFE59496FF5C7515001E7528FFE5951617
+:107C3000FF7C7495001E8516FFC474A4FFE594961E
+:107C4000FF74852A00342494005A9516FF8484A674
+:107C5000000077A5001E77BCFFE5C4A47FC074A513
+:107C6000FFF02514005AF4AF2800852A000077A9F8
+:107C7000001E77BCFFE5C5287FC07529FFF08496FC
+:107C8000FFC4F53B280084A600108516FFC494A20B
+:107C9000001C852A00147495001E74A4FFE59496B8
+:107CA000FF6C952200208716FFC88516FF54C73841
+:107CB00067C07738FFF0F72F2800871E00008496F2
+:107CC000FF5CC73857C07738FFF0F737280006B495
+:107CD00000028716FFCC23940032761D001E7630FA
+:107CE000FFE58516FF7CC7384FC07738FFF0F737C0
+:107CF0002800871E000006B40002C73867C0773826
+:107D0000FFF0F737280006B400028716FFD023944F
+:107D1000002E761D001E7630FFE5C73857C0773835
+:107D2000FFF0F7372800871E000006B40002849693
+:107D3000FF748516FF6CC73867C07738FFF0F737D8
+:107D4000280006B400028716FFD42394002A761D6B
+:107D5000001E7630FFE5C7384FC07738FFF0F737A1
+:107D60002800871E000006B40002C73867C07738B5
+:107D7000FFF0F73728008716FFD806B40002C7388F
+:107D800057C07738FFF0F7372800F4820002F4A3D9
+:107D90002800072000182514007A852A000077A9FA
+:107DA000001E77BCFFE5C5287FC07529FFF08496CB
+:107DB000FFC4F53B28008726000400000001203A9C
+:107DC0000024F7044F58E6007EF99416FF54C720AC
+:107DD0007200F6846E508626002C7738FFFA251440
+:107DE000005A842A000077A9001E77BCFFE5C42052
+:107DF0007FC07421FFF04739000086B61DDC77395B
+:107E00000002C0326A00468C0001D6800A68203623
+:107E10000000F6864098E6007EC0C3B86800C584BE
+:107E2000000086A60024F704E000F6020000C03639
+:107E30007200E6007E540324002486A60028F7047E
+:107E4000E00400000001C0367200E6007E582032D7
+:107E50000000F602000120320000E6007E6500000E
+:107E60000001F5820000869A0000F704E00000009F
+:107E70000001C0367200E2007EA0F6020000C036AB
+:107E80007200E6007EA820320000869A0004F70403
+:107E9000E00400000001C0367200E2007EA920323A
+:107EA0000000F602000120320000E6007EB9202E1C
+:107EB0000000F5820001202E0000E6007EC50000D3
+:107EC0000001F4020001F7044F58F41F28008496C3
+:107ED000FF548516FFC4F686409AC724720077388F
+:107EE000FFFA862A00304739000077390002C73888
+:107EF0006800E0007F4CF63B28008496FF54F606AD
+:107F00004098C72472007738FFFAC6B8000046B51B
+:107F1000000076B50002C6B46000F5020001F53736
+:107F200028004739000077390002C73860002494E0
+:107F3000005A84A6000077A5001E77BCFFE5C4A404
+:107F40007FC074A5FFF007380002F4BB2800F704D7
+:107F50004F588516FF548496FFACC6A8720076B4BD
+:107F6000FFFA0624001AF6B32800C72472007738F7
+:107F7000FFFA06A8001AF7372800473900009713C0
+:107F8000FFFC0724001C9713FFFCF5044F5C000066
+:107F900000019513FFFC07880008E0012340979338
+:107FA000FFFCF7044F588496FF5400000001C724DB
+:107FB00072007738FFFA473900009713FFFC072457
+:107FC000001C9713FFFCF5044F5C000000019513A3
+:107FD000FFFC07880008E00123409793FFFC078817
+:107FE0000008E00078D89793FFFCF6846E500000FC
+:107FF000000187361DDC00000001073800019736BC
+:108000001DDC87361DDCF0054084F486E000949387
+:10801000FFFC07880008E000D5A09793FFFCF4055B
+:108020004084F7046E50F005425C873A1DDCF6860A
+:108030002C28F7053B64F7042D38F5063A4CF50576
+:10804000424406380001F6052D3877390002F482E3
+:10805000001C20320044E6008060B4BA6802F005DB
+:108060002D38F50635ECE000808CF50542302032E5
+:108070000001E60080C40000000107880008E0005D
+:10808000789C9793FFFCF4863560F4854230F506C2
+:1080900042449513FFFC07880008E0011F489793AE
+:1080A000FFFCE00080C400000001F704429876B1B4
+:1080B000001E76B4FFE5C7386FC07739FFF0073888
+:1080C0000001F73328008796FFFC8296FFF8021420
+:1080D0000000013C0000000000019293FFFC0290B0
+:1080E0000008F58642449593FFFC07880008E001EC
+:1080F00020E49793FFFC20220000E600816100004D
+:108100000001F704425400000001203A0000EE0094
+:108110008129F606425007880008E00072AC979368
+:10812000FFFCE000816000000001F704425076B1DE
+:10813000001E76B4FFE5F5820006F5854254C73887
+:108140006FC07739FFF007380001F7332800078840
+:108150000008E000734C9793FFFCF586381CF5850A
+:1081600042448796FFFC8296FFF802140000013C0F
+:108170000000000000019293FFFC02900008221012
+:108180000058F7044250F686425076B5001E76B489
+:10819000FFE5F6046F34C7386FC086B2000C77393C
+:1081A000FFF0C0367200E6008250F4820000C50481
+:1081B000000086B20010F704E000C5A40000C0363D
+:1081C0007200E60081E40430001086B20014F70467
+:1081D000E00400000001C0367200E60081E8202EB5
+:1081E0000000F5820001202E0000E60081F500006D
+:1081F0000001F502000086A20000F704E000000084
+:108200000001C0367200E2008230F6020000C03683
+:108210007200E60082382032000086A20004F704D3
+:10822000E00400000001C0367200E2008239203212
+:108230000000F602000120320000E6008249202AF8
+:108240000000F5020001202A0000E60082592026E5
+:108250000000F482000120260000E6008760000094
+:10826000000107880008E000CBCC9793FFFC0720B3
+:108270000002F03B2800F7044F58F4053BB006A07D
+:108280000014C72072007738FFFAF737280006A0DD
+:108290000016F7372800F3020001F32328000788AF
+:1082A0000008E000CBCC9793FFFC26140020F033AD
+:1082B000280004A00002F0272800F3020000239405
+:1082C000002AF31F28000720001A2394002A839E07
+:1082D0000000779D001E77BCFFE5C39C7FC0739DA7
+:1082E000FFF07631001E7630FFE506A4000275151A
+:1082F000001EF3BB2800F304E0007528FFE593227D
+:10830000001CF384E0042314001E9316FFA4759947
+:10831000001E75ACFFE57315001E7318FFE593167C
+:10832000FFCC8316FFA493A200208716FFE073956D
+:10833000001E739CFFE59396FFAC7395001E739C23
+:10834000FFE5C73867C07738FFF0F7272800871A9E
+:1083500000009396FFC4C7385FC07738FFF0F73747
+:10836000280006B400028716FFE42394001A9396AF
+:10837000FFA4761D001E7630FFE5C73857C077385A
+:10838000FFF0F7372800871E000006B40002C73848
+:1083900067C07738FFF0F737280006B40002871669
+:1083A000FFE8231400169316FFA47619001E839687
+:1083B000FFAC7630FFE5C7383FC07738FFF0F737BE
+:1083C0002800871A000006B40002C73867C0773853
+:1083D000FFF0F737280006B400028716FFEC2314DD
+:1083E00000129316FFA47619001E8396FFCC7630F8
+:1083F000FFE5C7383FC07738FFF0F7372800871A06
+:10840000000006B40002C73867C07738FFF0F737BE
+:1084100028008716FFF08316FFC406B40002C73891
+:1084200037C07738FFF0F7372800F3820002F3A354
+:1084300028002314002A831A00007799001E77BCB5
+:10844000FFE5C3187FC07319FFF007200018F33B46
+:1084500028009416FFDC07880008E000CBCC979337
+:10846000FFFC072000022394002A839E0000779DD2
+:10847000001E77BCFFE5C39C7FC0739DFFF0248086
+:1084800000070520000AF3BB280020260007EE00A5
+:1084900084E00628000E86B200007731001E77388F
+:1084A000FFE575B1001E75ACFFE50528000204A4C8
+:1084B0000001C6B477C076B5FFF0F702FF00C6B47E
+:1084C0007400F6B3280087320000F30200FFC738BB
+:1084D0005FC07739FFF0C7383400E0008488F73395
+:1084E000280005200026862A000076A9001EF584B3
+:1084F0004F5876B4FFE58396FFDCF30200FF941635
+:10850000FFBCC71C5A007738FFFAC6306FC07631FF
+:10851000FFF047390000C7383400F682FF00C6304C
+:108520006C00C7386000F6843B6CF72B2800C5A0B0
+:108530005A0075ACFFFA8316FFDC07340001F7051B
+:108540003B6C0720003AF6BB280007200036F03BC2
+:108550002800F3820003F3A328000718001AF5BBD4
+:10856000280007880008E000CBCC9793FFFC072089
+:108570000002F03B2800248000070520000A202686
+:108580000007EE0085D40628000E86B20000773181
+:10859000001E7738FFE575B1001E75ACFFE50528B4
+:1085A000000204A40001C6B477C076B5FFF0F7025C
+:1085B000FF00C6B47400F6B3280087320000F382CF
+:1085C00000FFC7385FC07739FFF0C7383C00E000D4
+:1085D000857CF733280005A00026862E000076ADA6
+:1085E000001E76B4FFE5C520000024000007F3025A
+:1085F00000019316FFA4F7044F588396FFBC248014
+:10860000000EC71C72007738FFFAC6306FC0763193
+:10861000FFF047390000F68200FFC7386C00F68291
+:10862000FF00C6306C00C7386000F6843B6CF72F43
+:10863000280007340001F7053B6C0728003AF6BB19
+:10864000280007280036F03B2800F3020003F32B34
+:10865000280020220007EE008694C6284800063035
+:1086600000268732000076B1001E76B4FFE504A430
+:108670000002042000018396FFA4C7386FC0773939
+:10868000FFF0F682FF00C7386C00C71C7000E000E6
+:108690008650F73328000628002686B2000077317E
+:1086A000001E7738FFE5C6B477C076B5FFF0F70255
+:1086B000FF00C6B47400F6B328009513FFFCF30462
+:1086C0003BB0000000019313FFFC9516FFB4078830
+:1086D0000008E000D42C9793FFFC8516FFB4F0054A
+:1086E000407C8396FFBC23000007F3054258F70443
+:1086F0004250F606425076B1001E76B4FFE5F3060E
+:108700003934F3054244F5054074F3854260F38241
+:108710000006F3854254C7386FC07739FFF0F684FE
+:108720002D3807380001F733280006340001F6051C
+:108730002D38F7062C2876B50002F382001C203273
+:108740000044E600874CB3B67002F0052D38F306FE
+:1087500042449313FFFC07880008E0011F489793E9
+:10876000FFFC8796FFFC8296FFF802140000013C94
+:108770000000000000019293FFFC0290000822100C
+:108780000048F38642449393FFFC07880008E00109
+:1087900020E49793FFFC20220000E60089ED000012
+:1087A0000001F704425400000001203A0000EE00EE
+:1087B00087C90000000107880008E000734C979308
+:1087C000FFFCE00089EC0000000107880008E000E1
+:1087D000CBCC9793FFFC26140020F033280005A093
+:1087E0000002F02F2800F382000024940022F3A757
+:1087F000280004A0001A9496FFD423940022839E9C
+:108800000000779D001E77BCFFE5C39C7FC0739D71
+:10881000FFF07631001E7630FFE506AC000223142F
+:10882000001E7519001EF3A72800F484E0007528C7
+:10883000FFE594A2001CF384E0047495001E74A468
+:10884000FFE59496FFB47495001E74A4FFE594961A
+:10885000FFCC8496FFB493A200208716FFE07395A7
+:10886000001E739CFFE59396FFBC7395001E739CDE
+:10887000FFE59396FFC48396FFBCC73867C077387F
+:10888000FFF0F72F2800F5844F58871A0000C5A085
+:108890005A0075ACFFFAC73857C07738FFF0F73782
+:1088A000280006B400028716FFE42314001A761984
+:1088B000001E7630FFE545AD0000C7384FC0773861
+:1088C000FFF0F7372800871A000006B400028496EC
+:1088D000FFCCC73867C07738FFF0F737280006B4F9
+:1088E00000028716FFE8231400167619001E763062
+:1088F000FFE5C7383FC07738FFF0F7372800871A01
+:10890000000006B40002C73867C07738FFF0F737B9
+:10891000280006B400028716FFEC23140012761913
+:10892000001E7630FFE5C7384FC07738FFF0F737C5
+:108930002800871A000006B400028396FFC4C738D7
+:1089400067C07738FFF0F73728008716FFF006B4C6
+:108950000002C7383FC07738FFF0F7372800F482AD
+:108960000002F4A328000420001823940022839E10
+:108970000000779D001E77BCFFE5C39C7FC0739D00
+:10898000FFF08496FFD4F3A32800F3820001F3A73D
+:1089900028009593FFFCF486E0009493FFFCF38499
+:1089A0004F5C000000019393FFFC07880008E00182
+:1089B00023409793FFFC07880008E00078D897933E
+:1089C000FFFCF4863678F4854244F0054084F68452
+:1089D0004F5CF70200649736000090360004F702FF
+:1089E0000001F7054084F38635ECF3854230879625
+:1089F000FFFC8296FFF802140000013C000000001A
+:108A000000019293FFFC0290000822100090F704EE
+:108A10004260F502000005B80018F6044258000054
+:108A2000000120320007EE008A70C7306000C738AE
+:108A300058000738000E86BA00007739001E7738D4
+:108A4000FFE5C6B477C076B5FFF0F70200FFC6B405
+:108A50007400C0365200470C0001D7000A70203A5B
+:108A60000000E6008A7107300001E0008A18F7056F
+:108A70004258F40442580000000120220007EE0092
+:108A80008D9424940036F604426025140038239413
+:108A90000020063000028732000076B1001E76B456
+:108AA000FFE50630000275B1001EC7386FC0773889
+:108AB000FFF0F72B28008732000075ACFFE5C738C0
+:108AC0005FC07738FFF0F727280024940034063081
+:108AD00000028732000076B1001E76B4FFE5C73889
+:108AE0006FC07738FFF0F727280024940032063053
+:108AF00000028732000076B1001E76B4FFE5C73869
+:108B00006FC07738FFF0F727280024940030063034
+:108B100000028732000076B1001E76B4FFE5C73848
+:108B20006FC07738FFF0F72728002494002E063016
+:108B300000028732000076B1001E76B4FFE5C73828
+:108B40006FC07738FFF0F72728002494002C0630F8
+:108B500000028732000076B1001E76B4FFE5C73808
+:108B60006FC07738FFF0F72728002494002A0630DA
+:108B700000028732000076B1001E76B4FFE5C738E8
+:108B80006FC07738FFF0F7272800063000028732E1
+:108B90000000249400287631001E7630FFE5C738A7
+:108BA00067C07738FFF0F72728009413FFFC951370
+:108BB000FFFC9396FF7C9393FFFC07880008E0007E
+:108BC000D0DC9793FFFCF60442602494007E2514C9
+:108BD000008023940068063000028732000076B1DE
+:108BE000001E76B4FFE50630000275B1001EC738DE
+:108BF0006FC07738FFF0F72B28008732000075AC84
+:108C0000FFE5C7385FC07738FFF0F72728002494C6
+:108C1000007C063000028732000076B1001E76B478
+:108C2000FFE5C7386FC07738FFF0F7272800249496
+:108C3000007A063000028732000076B1001E76B45A
+:108C4000FFE5C7386FC07738FFF0F7272800249476
+:108C50000078063000028732000076B1001E76B43C
+:108C6000FFE5C7386FC07738FFF0F7272800249456
+:108C70000076063000028732000076B1001E76B41E
+:108C8000FFE5C7386FC07738FFF0F7272800249436
+:108C90000074063000028732000076B1001E76B400
+:108CA000FFE5C7386FC07738FFF0F7272800249416
+:108CB0000072063000028732000076B1001E76B4E2
+:108CC000FFE5C7386FC07738FFF0F7272800063078
+:108CD000000287320000249400707631001E763046
+:108CE000FFE5C73867C07738FFF0F72728009513EE
+:108CF000FFFC9396FF749393FFFC07880008E00045
+:108D0000D2589793FFFC8396FF7400000001939361
+:108D1000FFFCF704425823940050C70072009713D9
+:108D2000FFFC9396FF6C9393FFFC07880008E0001C
+:108D3000CF249793FFFC8396FF6CF6864250939363
+:108D4000FFFCF384425876B5001E9393FFFCF704B2
+:108D5000425076B4FFE5C7386FC07739FFF09713FC
+:108D6000FFFC8396FF7C000000019393FFFC0788C3
+:108D70000008E000F3389793FFFC20220000E60093
+:108D80008D9500000001F7044258000000010738EB
+:108D90000001F7054258F704425800000001203A4C
+:108DA0000007EE008DD4F3821770F7042D38F68695
+:108DB0002C2806380001F6052D3877390002F38299
+:108DC000001C20320044E6008DF4B3BA6802E000D3
+:108DD0008DF4F0052D389393FFFCF382001B9393E1
+:108DE000FFFCF38642449393FFFC07880008E001F0
+:108DF0001EC09793FFFC8796FFFC8296FFF8021433
+:108E00000000013C0000000000019293FFFC029072
+:108E1000000822100088F7044250F686425076B5CA
+:108E2000001EF3846F3476B4FFE59396FFC4C73811
+:108E30006FC0869E000C7739FFF0C0367200E600E6
+:108E40008E65F60642A0F70442A076B1001E76B405
+:108E5000FFE5C7386FC07739FFF007380001E00041
+:108E600094E4F7332800F604426024940036851613
+:108E7000FFC423940038063000028732000076B128
+:108E8000001E76B4FFE5852A001C0630000275B18D
+:108E9000001EC7386FC07738FFF09516FFBCF71F6C
+:108EA00028008732000075ACFFE58516FFC4C7387F
+:108EB0005FC07738FFF0F72728002494003406308D
+:108EC00000028732000076B1001E76B4FFE5C73895
+:108ED0006FC07738FFF0F72728002494003206305F
+:108EE00000028732000076B1001E76B4FFE5C73875
+:108EF0006FC07738FFF0F727280024940030063041
+:108F000000028732000076B1001E76B4FFE5C73854
+:108F10006FC07738FFF0F72728002494002E063022
+:108F200000028732000076B1001E76B4FFE5C73834
+:108F30006FC07738FFF0F72728002494002C063004
+:108F400000028732000076B1001E76B4FFE5C73814
+:108F50006FC07738FFF0F72728002494002A0630E6
+:108F600000028732000076B1001E76B4FFE5C738F4
+:108F70006FC07738FFF0F7272800063000028732ED
+:108F80000000249400287631001E7630FFE5C738B3
+:108F900067C07738FFF0F7272800872A00200000F5
+:108FA00000019713FFFC9393FFFC271400209713F5
+:108FB000FFFC07880008E000D0DC9793FFFC839655
+:108FC000FFC400000001871E001000000001203ACD
+:108FD0000000E6008FF0F6820000871E00140000FB
+:108FE0000001203A0000E6008FF420360000F682EF
+:108FF000000120360000E6009041000000018516C7
+:10900000FFC400000001052800109516FFB4951359
+:10901000FFFC07880008E00072509793FFFC8396DE
+:10902000FFB4271400209393FFFC9713FFFC0788DD
+:109030000008E000F9349793FFFCE00094E400009E
+:1090400000018516FFBC00000001202A0000E60098
+:1090500094BC0000000107880008E000CBCC979387
+:10906000FFFCF502000023940062F51F28007595AF
+:10907000001E75ACFFE50620000206B000022314B6
+:10908000001E7399001E739CFFE59396FF7475157F
+:10909000001E7528FFE59516FF7C7395001E739CD6
+:1090A000FFE59396FF8C8516FFC47395001E93967B
+:1090B000FF84852A0034239400629516FFACF033B8
+:1090C00028000520001A9516FF94839E0000779DC6
+:1090D000001E77BCFFE5C39C7FC0739DFFF07495B5
+:1090E000001EF3AB28008516FFC474A4FFE5852A93
+:1090F00000108396FFC49522001C839E00148516E1
+:10910000FF8493A200208716FFE07528FFE59516DF
+:10911000FF84F3844F588516FF74C7385FC07738D3
+:10912000FFF0F7332800871A00009396FFA4C022AF
+:109130003A008396FF7CC73857C07738FFF0F7377F
+:10914000280006B400028716FFE42314001A7619DB
+:10915000001E7630FFE5C7384FC07738FFF0F7378D
+:109160002800871A000006B40002C73867C07738A5
+:10917000FFF0F737280006B400028716FFE8231433
+:1091800000167619001E7630FFE5C7383FC07738E5
+:10919000FFF0F7372800871A000006B40002851692
+:1091A000FF8C8396FF84C73867C07738FFF0F737A6
+:1091B000280006B400028716FFEC2314001276196B
+:1091C000001E7630FFE5C73857C07738FFF0F73715
+:1091D0002800871A000006B40002C73867C0773835
+:1091E000FFF0F73728008716FFF006B40002C738F3
+:1091F0003FC07738FFF0F7372800F5020002F5236B
+:10920000280023940052839E0000779D001E77BCA7
+:10921000FFE5C39C7FC0739DFFF003200018E600AC
+:109220009230F39B2800F7044270E000929CF6060F
+:1092300042728516FFC40000000186AA00200000CB
+:10924000000107340007203A000EE2009294C73470
+:109250006800F5844260F38200FFC72C7000073875
+:10926000002686BA00009716FF747739001E7738FB
+:10927000FFE5C6B477C076B5FFF0C6B43C00203633
+:109280000000470C0001D7000A70203A0000E600F9
+:1092900092C900000001F7044274F606427476B1E8
+:1092A000001E76B4FFE5C7386FC07739FFF0073886
+:1092B0000001F733280007880008E000789C9793A6
+:1092C000FFFCE00094E4000000018516FFA48396F3
+:1092D000FF74C720520074B8FFFAC6240000871E2E
+:1092E0000000769D001E76B4FFE5C5AC520075AC5B
+:1092F000FFFA46310000F50200FFC6305400C738BF
+:109300006FC07739FFF0F682FF00C7386C00C630B7
+:109310007000F61F28008396FF948516FFC4F59F02
+:109320002800872A000400000001203A0024E600FB
+:109330009469F6864098F7046E50862A002CC6A4DD
+:10934000000023940062849E0000779D001E77BC7D
+:10935000FFE5C4A47FC074A5FFF046B50000873ABE
+:109360001DDC76B50002C0327200470C0001D70048
+:109370000A70203A0000F7064098E6009434C3349F
+:109380007000C584000086AA0024F704E000F602FD
+:109390000000C036720005280024E60093C495162C
+:1093A000FF748396FFC400000001869E0028F70426
+:1093B000E00400000001C0367200E60093C82032CD
+:1093C0000000F602000120320000E60093D5000004
+:1093D0000001F58200008516FF74F704E00086AAFC
+:1093E000000000000001C0367200E2009414F60292
+:1093F0000000C0367200E600941C2032000086AAED
+:109400000004F704E00400000001C0367200E2002E
+:10941000941D20320000F602000120320000E60018
+:10942000942D202E0000F5820001202E0000E60081
+:10943000943900000001F4820001F7044F58F49BB6
+:1094400028008396FFC4F686409AC72072007738BA
+:10945000FFFA861E00304739000077390002C7380E
+:109460006800E00094E4F63B2800472500007739C7
+:109470000002C7386800F5020001F53B28000738F4
+:10948000000223940062839E0000779D001E77BC3B
+:10949000FFE5C39C7FC0739DFFF025140062F3BB02
+:1094A0002800852A000077A9001E77BCFFE5C528A3
+:1094B0007FC07529FFF0E00094E4F51B2800839637
+:1094C000FFBC00000001201E0001E60094E4000043
+:1094D000000107880008E000789C9793FFFCF506E0
+:1094E0003560F50542308796FFFC8296FFF802143E
+:1094F0000000013C0000000000019293FFFC02907C
+:109500000008F50642449513FFFC07880008E001B7
+:1095100020E49793FFFC20220000E60096890000DB
+:109520000001F68442540000000120360000EE00E5
+:10953000958DF5864250F7044250762D001E763008
+:10954000FFE526B40001F685425425000007F50525
+:109550004258F6842D38C73867C07739FFF007388E
+:109560000001F72F280006340001F6052D38F70614
+:109570002C2876B50002F502001C20320044E600DB
+:109580009688B5367002E0009688F0052D38F5040F
+:109590004260000000019513FFFC07880008E0000E
+:1095A000B2849793FFFCF6844F5800000001073403
+:1095B0000040C0227200E60095ECF6064276F70401
+:1095C000427476B1001E76B4FFE5C7386FC07739B4
+:1095D000FFF007380001F733280007880008E00093
+:1095E000789C9793FFFCE000968800000001F70448
+:1095F000426000000001C0227200E60096240000D4
+:1096000000019713FFFCF5043BB000000001951327
+:10961000FFFC07880008E000D42C9793FFFCE000D3
+:10962000964000000001C0226A00E600967100002A
+:1096300000019713FFFC07880008E000CC609793B7
+:10964000FFFCF704407C000000010738000197137D
+:10965000FFFCF5044074000000019513FFFC07882F
+:109660000008E000BEF89793FFFCE0009688000039
+:109670000001F5044074000000019513FFFC078809
+:109680000008E000C1B49793FFFC8796FFFC829628
+:10969000FFF802140000013C00000000000192935A
+:1096A000FFFC0290000822100070F6046F34F704EB
+:1096B000426486B2000400000001C0367200E60079
+:1096C0009B1806B0000287360000F404407C76B593
+:1096D000001E76B4FFE5C7386FC07739FFF0C03A97
+:1096E0004200E6009B1824940036F604407423944C
+:1096F0000038063000028732000076B1001E76B4D2
+:10970000FFE50630000275B1001EC7386FC077381C
+:10971000FFF0F71F28008732000075ACFFE5C7385F
+:109720005FC07738FFF0F727280024940034063014
+:1097300000028732000076B1001E76B4FFE5C7381C
+:109740006FC07738FFF0F7272800249400320630E6
+:1097500000028732000076B1001E76B4FFE5C738FC
+:109760006FC07738FFF0F7272800249400300630C8
+:1097700000028732000076B1001E76B4FFE5C738DC
+:109780006FC07738FFF0F72728002494002E0630AA
+:1097900000028732000076B1001E76B4FFE5C738BC
+:1097A0006FC07738FFF0F72728002494002C06308C
+:1097B00000028732000076B1001E76B4FFE5C7389C
+:1097C0006FC07738FFF0F72728002494002A06306E
+:1097D00000028732000076B1001E76B4FFE5C7387C
+:1097E0006FC07738FFF0F727280006300002873275
+:1097F0000000249400287631001E7630FFE5C7383B
+:1098000067C07738FFF0F72728009413FFFC939385
+:10981000FFFC271400209713FFFC07880008E000D6
+:10982000D0DC9793FFFC07880008E000CBCC97932F
+:10983000FFFCF50440749416FFC407200002F03BBF
+:10984000280024800007F40200FF8396FFC49516C9
+:10985000FFBC031C000A20260007EE0098A806188B
+:10986000000E86B200007731001E7738FFE575B133
+:10987000001E75ACFFE503180002C6B477C076B5CC
+:10988000FFF0F702FF00C6B47400F6B32800873279
+:10989000000004A40001C7385FC07739FFF0C73863
+:1098A0004400E0009854F73328008516FFC47495EF
+:1098B000001E74A4FFE58396FFC42314001E7419D0
+:1098C000001E7420FFE5052800269516FF8C85AA4A
+:1098D000000076A9001E76B4FFE5039C0002939673
+:1098E000FFB4061C00027395001E739CFFE593965F
+:1098F000FFAC7395001E739CFFE59396FF9C8396C7
+:10990000FFBC7515001E7528FFE59516FF947515AB
+:10991000001E7528FFE59516FFA48516FFC4C5AC8B
+:109920006FC075ADFFF0F5054260F5044F58F68243
+:1099300000FFC71C52007738FFFA47390000C738CC
+:109940006C00F682FF00C5AC6C00C73858008396E7
+:10995000FF8CF5843B6C8516FFB4F71F2800871633
+:10996000FFE006AC0001F6853B6C8396FFC4C73868
+:109970004FC07738FFF0F72B2800F5044F58871AAF
+:109980000000C01E5200C73847C07738FFF0F733D9
+:109990002800063000028716FFE42314001A769987
+:1099A000001E8396FF9476B4FFE5C7383FC0773832
+:1099B000FFF0F7332800871A000006300002C7388E
+:1099C0006FC07738FFF0F7332800063000028716A3
+:1099D000FFE8231400167699001E76B4FFE585167D
+:1099E000FFAC8396FFA4C73857C07738FFF0F73332
+:1099F0002800871A0000063000028516FF9CC73831
+:109A00006FC07738FFF0F733280006300002871662
+:109A1000FFEC231400127699001E76B4FFE5C738D8
+:109A20003FC07738FFF0F7332800871A0000063070
+:109A300000028396FFC4C7386FC07738FFF0F73352
+:109A400028008716FFF006300002C73857C0773865
+:109A5000FFF0F7332800071C003AF5BB2800071C6D
+:109A60000036F03B2800F5020003E6009AA4F51F3B
+:109A70002800F7044278F606427876B1001E76B4E4
+:109A8000FFE5C7386FC07739FFF007380001F733BB
+:109A9000280007880008E000789C9793FFFCE0000E
+:109AA0009B1800000001F38642449393FFFC078853
+:109AB0000008E0011F489793FFFC25000007F5050B
+:109AC0004258F7044250F606425076B1001E76B472
+:109AD000FFE5F3820006F3854254F5063934F505B7
+:109AE0004244C7386FC07739FFF0F6842D38073805
+:109AF0000001F733280006340001F6052D38F7067B
+:109B00002C2876B50002F382001C20320044E600C7
+:109B10009B18B3B67002F0052D388796FFFC82962D
+:109B2000FFF802140000013C0000000000019293C5
+:109B3000FFFC0290000822100078F38642449393C1
+:109B4000FFFC07880008E00120E49793FFFC202237
+:109B50000000E6009E4100000001F70442540000AE
+:109B60000001203A0000EE009D8524940036F604A2
+:109B7000407425140038063000028732000076B1A8
+:109B8000001E76B4FFE50630000275B1001EC7382E
+:109B90006FC07738FFF0F72B28008732000075ACD4
+:109BA000FFE5C7385FC07738FFF0F7272800249417
+:109BB0000034063000028732000076B1001E76B411
+:109BC000FFE5C7386FC07738FFF0F72728002494E7
+:109BD0000032063000028732000076B1001E76B4F3
+:109BE000FFE5C7386FC07738FFF0F72728002494C7
+:109BF0000030063000028732000076B1001E76B4D5
+:109C0000FFE5C7386FC07738FFF0F72728002494A6
+:109C1000002E063000028732000076B1001E76B4B6
+:109C2000FFE5C7386FC07738FFF0F7272800249486
+:109C3000002C063000028732000076B1001E76B498
+:109C4000FFE5C7386FC07738FFF0F7272800249466
+:109C5000002A063000028732000076B1001E76B47A
+:109C6000FFE5C7386FC07738FFF0F72728000630C8
+:109C7000000287320000249400287631001E7630DE
+:109C8000FFE5C73867C07738FFF0F7272800F3846F
+:109C9000407C000000019393FFFC9513FFFC23948C
+:109CA00000209396FF949393FFFC07880008E00040
+:109CB000D0DC9793FFFC8396FF9400000001939300
+:109CC000FFFC239400689396FF8C9393FFFC078816
+:109CD0000008E000D2589793FFFC8396FF8C0000A9
+:109CE00000019393FFFC9013FFFC23940050939684
+:109CF000FF849393FFFC07880008E000CF2497932C
+:109D0000FFFC8702FF3400000001F7054264F38482
+:109D1000407C000000019393FFFC9713FFFC8396A7
+:109D2000FF84000000019393FFFC8396FF940000E2
+:109D300000019393FFFC07880008E000F7C89793A1
+:109D4000FFFC20220000E6009D5DF3821770F704FF
+:109D500042540000000127380001F7054254939354
+:109D6000FFFCF382001B9393FFFCF3864244939322
+:109D7000FFFC07880008E0011EC09793FFFCE0008D
+:109D80009E4000000001F504407CF4844074C72824
+:109D90005000C724700005B8002686AE0000772D5D
+:109DA000001E7738FFE5C6B477C077B40008703E70
+:109DB000FFE8470C0001D7000A70203A0000F704C2
+:109DC0004F58E6009DFDF60200FFF7044278F606C4
+:109DD000427A76B1001E76B4FFE5C7386FC0773996
+:109DE000FFF007380001F733280007880008E0007B
+:109DF000789C9793FFFCE0009E400000000186AE37
+:109E00000000772D001E7738FFE5C6B477C076B521
+:109E1000FFF0F7020001C7386400F602FF00C6B485
+:109E20006400C7386800F72F28000728000197133F
+:109E3000FFFC9493FFFC07880008E000BEF89793AE
+:109E4000FFFC8796FFFC8296FFF802140000013C9D
+:109E50000000000000019293FFFC02900008221015
+:109E600000D8F38642449393FFFC07880008E00182
+:109E700020E49793FFFC20220000E600A2C9000026
+:109E80000001F704425400000001203A0000EE00F7
+:109E9000A03524940036F6044074251400380630AA
+:109EA00000028732000076B1001E76B4FFE506306E
+:109EB000000275B1001EC7386FC07738FFF0F72B6E
+:109EC00028008732000075ACFFE5C7385FC07738DF
+:109ED000FFF0F72728002494003406300002873270
+:109EE000000076B1001E76B4FFE5C7386FC0773842
+:109EF000FFF0F72728002494003206300002873252
+:109F0000000076B1001E76B4FFE5C7386FC0773821
+:109F1000FFF0F72728002494003006300002873233
+:109F2000000076B1001E76B4FFE5C7386FC0773801
+:109F3000FFF0F72728002494002E06300002873215
+:109F4000000076B1001E76B4FFE5C7386FC07738E1
+:109F5000FFF0F72728002494002C063000028732F7
+:109F6000000076B1001E76B4FFE5C7386FC07738C1
+:109F7000FFF0F72728002494002A063000028732D9
+:109F8000000076B1001E76B4FFE5C7386FC07738A1
+:109F9000FFF0F727280006300002873200002494E3
+:109FA00000287631001E7630FFE5C73867C0773865
+:109FB000FFF0F7272800F384407C00000001939312
+:109FC000FFFC9513FFFC239400209396FF4C939382
+:109FD000FFFC07880008E000D0DC9793FFFC839625
+:109FE000FF4C000000019393FFFC239400509396D4
+:109FF000FF449393FFFC07880008E000D258979332
+:10A00000FFFC8702FF3400000001F7054264F3847F
+:10A01000407C000000019393FFFC9713FFFC8396A4
+:10A02000FF44000000019393FFFC8396FF4CE00087
+:10A03000A2809393FFFCF404407CF6044074F38206
+:10A040000000C7204000C73070000738002686BADD
+:10A0500000007739001E7738FFE5C6B477C077B4C3
+:10A060000008703EFFE8470C0001D7000A70203A54
+:10A070000000E600A0AD9396FF3CF70442A0F60670
+:10A0800042A076B1001E76B4FFE5C7386FC07739BD
+:10A09000FFF007380001F733280007880008E000C8
+:10A0A000789C9793FFFCE000A2C8000000010630F6
+:10A0B00000028732000076B1001E76B4FFE52494DA
+:10A0C000007E25140080239400680630000275B1DC
+:10A0D000001EC7386FC07738FFF0F72B2800873293
+:10A0E000000075ACFFE5C7385FC07738FFF0F72791
+:10A0F00028002494007C063000028732000076B1EC
+:10A10000001E76B4FFE5C7386FC07738FFF0F72739
+:10A1100028002494007A063000028732000076B1CD
+:10A12000001E76B4FFE5C7386FC07738FFF0F72719
+:10A13000280024940078063000028732000076B1AF
+:10A14000001E76B4FFE5C7386FC07738FFF0F727F9
+:10A15000280024940076063000028732000076B191
+:10A16000001E76B4FFE5C7386FC07738FFF0F727D9
+:10A17000280024940074063000028732000076B173
+:10A18000001E76B4FFE5C7386FC07738FFF0F727B9
+:10A19000280024940072063000028732000076B155
+:10A1A000001E76B4FFE5C7386FC07738FFF0F72799
+:10A1B00028000630000287320000249400707631B7
+:10A1C000001E7630FFE5C73867C07738FFF0F72705
+:10A1D00028009413FFFC9513FFFC9396FF34939390
+:10A1E000FFFC07880008E000D0DC9793FFFC839613
+:10A1F000FF34000000019393FFFC239400B093967A
+:10A20000FF2C9393FFFC07880008E000D258979337
+:10A21000FFFC8396FF2C000000019393FFFC8396C4
+:10A22000FF3C000000019393FFFC23940098939659
+:10A23000FF249393FFFC07880008E000CF24979346
+:10A24000FFFCF3820006F38542548702FF34F38655
+:10A2500038A8F3854244F7054264F384407C00004B
+:10A2600000019393FFFC9713FFFC8396FF240000EB
+:10A2700000019393FFFC8396FF3400000001939349
+:10A28000FFFC07880008E000F7C89793FFFC202236
+:10A290000000E600A2A9F3821770F7044254000000
+:10A2A000000127380001F70542549393FFFCF38225
+:10A2B000001B9393FFFCF38642449393FFFC0788B3
+:10A2C0000008E0011EC09793FFFC8796FFFC829672
+:10A2D000FFF802140000013C00000000000192930E
+:10A2E000FFFC02900008F6046F34F704426486B263
+:10A2F000000400000001C0367200E600A3AC06B006
+:10A3000000028736000076B5001E76B4FFE5C73838
+:10A310006FC0F684407C7739FFF0C03A6A00E600EF
+:10A32000A3ACC7346800F5844074F6044F580000AD
+:10A330000001C62C62007630FFFAC5AC700005AC97
+:10A34000002686AE0000772D001E7738FFE54631E7
+:10A350000000C6B477C076B5FFF0F70200FFC63044
+:10A360007400F702FF00C6B47400C6306800F62F10
+:10A370002800F50642449513FFFC07880008E00119
+:10A380001F489793FFFCF704407C0000000107384A
+:10A3900000019713FFFCF5044074000000019513C1
+:10A3A000FFFC07880008E000BEF89793FFFC879643
+:10A3B000FFFC8296FFF802140000013C0000000040
+:10A3C00000019293FFFC0290000822100080F70425
+:10A3D000425800000001203A0000E600A3F4203AB1
+:10A3E0000007F5020001F5054258F7044258000045
+:10A3F0000001203A0007EE00A6F02394001EF604A8
+:10A40000426023140066F4844078063000028732EC
+:10A41000000076B1001E76B4FFE504A400027425A6
+:10A42000001E7420FFE5063000027531001E7528FD
+:10A43000FFE59516FF7CC7386FC07738FFF025140D
+:10A4400000209516FF94F72B280087320000851610
+:10A45000FF7C05A40002C73857C07738FFF0F71F0C
+:10A4600028002394001C063000028732000076B1D9
+:10A47000001E76B4FFE525140050C7386FC077384A
+:10A48000FFF0F71F28002394001A063000028732DD
+:10A49000000076B1001E76B4FFE5C7386FC077388C
+:10A4A000FFF0F71F280023940018063000028732BF
+:10A4B000000076B1001E76B4FFE5C7386FC077386C
+:10A4C000FFF0F71F280023940016063000028732A1
+:10A4D000000076B1001E76B4FFE5C7386FC077384C
+:10A4E000FFF0F71F28002394001406300002873283
+:10A4F000000076B1001E76B4FFE5C7386FC077382C
+:10A50000FFF0F71F28002394001206300002873264
+:10A51000000076B1001E76B4FFE5C7386FC077380B
+:10A52000FFF0F71F28002394001006300002873246
+:10A53000000076AD001E7631001E7630FFE5C7388C
+:10A5400067C07738FFF0F71F280087260000261421
+:10A550000068C73847C07738FFF0F7332800872EE8
+:10A56000000076B4FFE5C7386FC07738FFF0F71BFF
+:10A5700028002314006405AC0002872E000076AD8D
+:10A58000001E76B4FFE5C7386FC07738FFF0F71BC1
+:10A5900028002314006205AC0002872E000076AD6F
+:10A5A000001E76B4FFE5C7386FC07738FFF0F71BA1
+:10A5B00028002314006005AC0002872E000076AD51
+:10A5C000001E76B4FFE5C7386FC07738FFF0F71B81
+:10A5D00028002314005E05AC0002872E000076AD33
+:10A5E000001E76B4FFE5C7386FC07738FFF0F71B61
+:10A5F00028002314005C05AC0002872E000076AD15
+:10A60000001E76B4FFE5C7386FC07738FFF0F71B40
+:10A6100028002314005A05AC0002872E000076ADF6
+:10A62000001E76B4FFE5C7386FC07738FFF0F71B20
+:10A63000280005AC0002872E00002314005875ADD9
+:10A64000001E75ACFFE5C7385FC07738FFF0F71B19
+:10A6500028009613FFFC9516FF8C9513FFFC0788C6
+:10A660000008E000D2589793FFFC8516FF8C00008D
+:10A6700000019513FFFCF5044258000000019513FA
+:10A68000FFFC251400389516FF849513FFFC0788FE
+:10A690000008E000CF249793FFFCF5044258000027
+:10A6A00000019513FFFCF5044264000000019513BE
+:10A6B000FFFC8516FF84000000019513FFFC851642
+:10A6C000FF94000000019513FFFC07880008E000DC
+:10A6D000F7C89793FFFC20220000E600A6F10000D7
+:10A6E0000001F70442580000000107380001F70597
+:10A6F0004258F704425800000001203A0007EE00DB
+:10A70000A730F5021770F7042D38F6862C28063886
+:10A710000001F6052D3877390002F502001C2032C1
+:10A720000044E600A750B53A6802E000A750F005E3
+:10A730002D389513FFFCF502001B9513FFFCF50661
+:10A7400042449513FFFC07880008E0011EC0979360
+:10A75000FFFC8796FFFC8296FFF802140000013C84
+:10A760000000000000019293FFFC029000082210FC
+:10A770000030F6046F34F704426486B2000400002F
+:10A780000001C0367200E600A9F007300002863AE8
+:10A790000000F5820000F684407C7739001E77388F
+:10A7A000FFE5C63077C0F7044074C6B46800763160
+:10A7B000FFF0C60062009616FFF4C738680007383D
+:10A7C000002686BA00007739001E7738FFE5C6B448
+:10A7D00077C077B40008703EFFE8470C0001D7004F
+:10A7E0000A70203A0000E600A834F60200FF831643
+:10A7F000FFF48396FFF4F7044078C6983800C73812
+:10A8000068000738002686BA00007739001E7738BE
+:10A81000FFE5C6B477C076B5FFF0C6B46400C036B5
+:10A820005A00470C0001D7000A70203A0000E600E9
+:10A83000A83D202E0000F5820001202E0000E60039
+:10A84000A875F606427CF704427C76B1001E76B409
+:10A85000FFE5C7386FC07739FFF007380001F733DD
+:10A86000280007880008E000789C9793FFFCE00030
+:10A87000A9F000000001F3044260000000019313FE
+:10A88000FFFC07880008E000CC609793FFFCF4040D
+:10A890004078F7044F58F5044074F384407CF30487
+:10A8A000407CC62072007630FFFAC59C3000C5A8F7
+:10A8B000580005AC002686AE000074AD001E74A4DE
+:10A8C000FFE573AD001E739CFFE59396FFD4C5288A
+:10A8D00072007528FFFA8316FFF48396FFF4463161
+:10A8E000000045290000C7183800C420700004206B
+:10A8F00000267321001EC6B44FC076B5FFF0F48267
+:10A9000000FFC6304C00F382FF00C6B43C00C630E6
+:10A910006800F62F2800872E00007318FFE59316B5
+:10A92000FFCC8316FFD48396FFF4C5284C00C738AC
+:10A9300037C07739FFF0769D001076B5FFF8C7383D
+:10A940004C00C6B47000F6AF28008722000076A144
+:10A95000001E8316FFCCF382FF0076B4FFE5C738F4
+:10A9600037C07739FFF0C7383C00C5287000F523A1
+:10A97000280087220000F304407CC7386FC0773975
+:10A98000FFF0731900109316FFEC7399FFF8C738A6
+:10A990004C00C71C70009716FFDC23140022831A9A
+:10A9A00000007799001E77BCFFE5C3187FC07319BC
+:10A9B000FFF0F3232800F38642449393FFFC0788BB
+:10A9C0000008E0011F489793FFFCF704407C00005B
+:10A9D0000001073800019713FFFCF30440740000E6
+:10A9E00000019313FFFC07880008E000BEF897936E
+:10A9F000FFFC8796FFFC8296FFF802140000013CE2
+:10AA00000000000000019293FFFC02900008221059
+:10AA10000098F30642449313FFFC07880008E00106
+:10AA200020E49793FFFC20220000E600AEE5000042
+:10AA30000001F704425400000001203A0000EE003B
+:10AA4000AD8927380001F70542542394001EF6040F
+:10AA50004260249400669496FF64F3044078249442
+:10AA600000209496FF94063000028732000076B1F1
+:10AA7000001E76B4FFE5031800029316FF747419E4
+:10AA8000001E7420FFE505980002063000027531B3
+:10AA9000001EC7386FC07738FFF0F72728008732CD
+:10AAA00000007528FFE5C73857C07738FFF0F71F5B
+:10AAB00028002394001C063000028732000076B183
+:10AAC000001E76B4FFE58516FF64C7386FC077387F
+:10AAD000FFF0F71F28002394001A06300002873287
+:10AAE000000076B1001E76B4FFE5C7386FC0773836
+:10AAF000FFF0F71F28002394001806300002873269
+:10AB0000000076B1001E76B4FFE5C7386FC0773815
+:10AB1000FFF0F71F2800239400160630000287324A
+:10AB2000000076B1001E76B4FFE5C7386FC07738F5
+:10AB3000FFF0F71F2800239400140630000287322C
+:10AB4000000076B1001E76B4FFE5C7386FC07738D5
+:10AB5000FFF0F71F2800239400120630000287320E
+:10AB6000000076B1001E76B4FFE5C7386FC07738B5
+:10AB7000FFF0F71F280023940010063000028732F0
+:10AB8000000076AD001E7631001E7630FFE5C73836
+:10AB900067C07738FFF0F71F2800871A00002614D7
+:10ABA0000068C73847C07738FFF0F7332800872E92
+:10ABB000000076B4FFE5C7386FC07738FFF0F72B99
+:10ABC0002800231400649316FF6405AC0002872E4E
+:10ABD000000076AD001E76B4FFE5C7386FC0773849
+:10ABE000FFF0F71B2800249400629496FF6405ACE4
+:10ABF0000002872E000076AD001E76B4FFE5C73850
+:10AC00006FC07738FFF0F7272800251400609516ED
+:10AC1000FF6405AC0002872E000076AD001E76B4FE
+:10AC2000FFE5C7386FC07738FFF0F72B28002314F3
+:10AC3000005E9316FF6405AC0002872E000076AD1F
+:10AC4000001E76B4FFE5C7386FC07738FFF0F71BFA
+:10AC500028002494005C9496FF6405AC0002872EC3
+:10AC6000000076AD001E76B4FFE5C7386FC07738B8
+:10AC7000FFF0F72728002514005A9516FF6405AC4D
+:10AC80000002872E000076AD001E76B4FFE5249406
+:10AC90000050C7386FC07738FFF0F72B2800231417
+:10ACA000005805AC0002872E00009316FF6475ADB6
+:10ACB000001E75ACFFE5C7385FC07738FFF0F71BA3
+:10ACC00028009613FFFC9496FF8C9493FFFC078852
+:10ACD0000008E000D2589793FFFC8516FF8C2314E0
+:10ACE00000389513FFFC278000079793FFFC93160D
+:10ACF000FF849313FFFC07880008E000CF2497939C
+:10AD0000FFFC27800007F7854258278000079793AC
+:10AD1000FFFCF4844264000000019493FFFC85165C
+:10AD2000FF84000000019513FFFC8316FF940000D0
+:10AD300000019313FFFC07880008E000F7C8979311
+:10AD4000FFFC20220000E600AD5D00000001F704DA
+:10AD500042580000000107380001F7054258F70487
+:10AD60002D38F6862C2806380001F6052D3877395F
+:10AD70000002F482001C20320044E600AEE4B4BAC3
+:10AD80006802E000AEE4F0052D38F7044078F58461
+:10AD90004F580738001686BA0000F4063B90773902
+:10ADA000001E7738FFE5C6B477C076B4FFF076357D
+:10ADB0000006A72E6002C52C600076A9001E76B49E
+:10ADC000FFE5C7386FC07739FFF077390003C73820
+:10ADD00040000738000286BA00007739001E773835
+:10ADE000FFE5C6B477C073B7FFF0EE00AE55951619
+:10ADF000FF64A72E600276A9001E76B4FFE5C7386F
+:10AE00006FC07739FFF077390003C738400086BA42
+:10AE10000004231400887739001E7738FFE5C6B494
+:10AE200077C076B5FFF0A6AA6802771D0003C73881
+:10AE3000680027380008853A000484BA0000000042
+:10AE40000001951A0004949A00008596FF7CE000AA
+:10AE5000AE78000000018496FF64A72E600276A5FC
+:10AE6000001E76B4FFE5C7386FC07739FFF0773939
+:10AE70000003C738400085BA00048516FF64F60653
+:10AE80003B90872A000076A9001E76B4FFE5C738FC
+:10AE90006FC07739FFF077390003A6BA6002201E31
+:10AEA0000000C73860007739001E7738FFE5C6B468
+:10AEB00077C0EE00AEC976B5FFF08316FF780000CC
+:10AEC00000017719FFF0C6B868008496FF6400009F
+:10AED0000001C72468009713FFFC07880008C12CF5
+:10AEE00000009793FFFC8796FFFC8296FFF8021400
+:10AEF0000000013C0000000000019293FFFC029062
+:10AF0000000822100010F704408400000001203ADD
+:10AF10000000E600AF3CF60642B8F70442B876B14E
+:10AF2000001E76B4FFE5F3063678F3054244C738D1
+:10AF30006FC07739FFF007380001F7332800F704B6
+:10AF40004F5CF384425C833A0004C43800009316DB
+:10AF5000FFEC771D0001C73838007739000204B8CC
+:10AF6000000C8316FFEC00000001C01E3200EC0054
+:10AF7000B070C5040000A6A24802F704E000F58204
+:10AF80000000C0367200E600AFA8C620480086B2B6
+:10AF90000004F704E00400000001C0367200E6007F
+:10AFA000AFAC202E0000F5820001202E0000E6004C
+:10AFB000AFB900000001F502000086B20000F704FE
+:10AFC000E00000000001C0367200E200AFF4F5823C
+:10AFD0000000C0367200E600AFFC202E000086B2F2
+:10AFE0000004F704E00400000001C0367200E20033
+:10AFF000AFFD202E0000F5820001202E0000E600AB
+:10B00000B00D202A0000F5020001202A0000E60011
+:10B01000B05900000001F7047AD000000001203A86
+:10B020000000E600B064C7204800873A0008F60632
+:10B03000409877390002A6BA6002C73860007739B5
+:10B04000001E7738FFE5C6B477C076B5FFF020362E
+:10B050000000E600B0640000000104A4000CE00061
+:10B06000AF60039C00018316FFEC00000001C01ECE
+:10B070003200EC00B104F3063678F6844F5C771D9D
+:10B080000001C7383800773900020738000CC6B411
+:10B09000700087360008F6844F5877390006C6B42A
+:10B0A00070009693FFFC9396FFF407880008E00079
+:10B0B000FA989793FFFC20220000F684426C839656
+:10B0C000FFF4470C0001D7000A70C71C7000F70599
+:10B0D000425C06B40001F7042D38F685426CF68612
+:10B0E0002C2806380001F6052D3877390002F302C6
+:10B0F000001C20320044E600B108B33A6802E000C8
+:10B10000B108F0052D38F30542448796FFFC82967E
+:10B11000FFF802140000013C0000000000019293BF
+:10B12000FFFC02900008F4020000C5A00000F682B7
+:10B130000770F7046E5020360000E600B16D063847
+:10B14000001C8732000000000001C4207000C022F3
+:10B150007200E400B15D0000000105AC000126B4FE
+:10B16000000120360000E600B14006300004C42093
+:10B170005800C0225A00E400B18100000001042000
+:10B1800000018796FFFC8296FFF802140000013C44
+:10B190000000000000019293FFFC02900008078865
+:10B1A0000008E00078D89793FFFC07880008E000CB
+:10B1B000B11C9793FFFCF704409400000001C022EB
+:10B1C0007200E600B1EDF4054090F7046E50000007
+:10B1D000000186BA1DDCF582000106B4000196BAB2
+:10B1E0001DDC873A1DDCE000B1F0F5857AD0F00572
+:10B1F0007AD0F5844090F0054084F5854094F5863A
+:10B20000E0009593FFFC07880008E000D5A0979325
+:10B21000FFFCF7046E50F405408485BA1DDC000085
+:10B220000001F5853B64F584E000F005425C95BAC9
+:10B230000010F584E004F6862C2895BA0014F70473
+:10B240002D38F5863A4CF585424406380001F6055E
+:10B250002D3877390002F582001C20320044E600C8
+:10B26000B268B5BA6802F0052D38F58635ECF5857B
+:10B2700042308796FFFC8296FFF802140008013CDA
+:10B280000000000000019293FFFC029000082210D1
+:10B2900000C8F30200009316FF94248000089496DF
+:10B2A000FF84238000078316FF940000000193169B
+:10B2B000FF54201E0007EE00B564C71C38008496BA
+:10B2C000000000000001C72470000738002686BA7D
+:10B2D0000000F5844F587739001E7738FFE5C6B473
+:10B2E00077C076B5FFF0F70200FFC6B67400E6003F
+:10B2F000B32D20360001E600B32D77350006A6BA3F
+:10B300005802C73858007639001E7630FFE5C6B4BB
+:10B3100067C076B5FFF020360002E600B331C6B84C
+:10B320000000C72C0000E000B330C6B80000F6846F
+:10B330004F58F7044F58C5340000C02A7200E60089
+:10B34000B55D00000001F6843BBCF30200009316DB
+:10B35000FF3C0428001CF7043BB800000001C03685
+:10B360007200EC00B4409696FFAC77350001C73808
+:10B37000680077390002F4863BB4C63848000630CE
+:10B38000000CC30400009316FF3486B20000872A25
+:10B39000001C8596FF3CC0367200E600B3C0202E2C
+:10B3A000000086B20004872A002000000001C03699
+:10B3B0007200E600B3C0202E0000F5820001202EAE
+:10B3C0000000E600B3D100000001F4820000949672
+:10B3D000FF3486B200008722000000000001C03662
+:10B3E0007200E200B40CF5820000C0367200E60084
+:10B3F000B414202E000086B200048722000400004E
+:10B400000001C0367200E200B415202E0000F58263
+:10B410000001202E0000E600B42500000001F30228
+:10B4200000019316FF348496FF34000000012026AB
+:10B430000000E600B44000000001F3020001931692
+:10B44000FF3C8496FF3C0000000120260000E6003F
+:10B45000B481F60200018716FFACF3063BB476B95F
+:10B460000001C6B4700076B50002C6B4300006B460
+:10B47000001486B600009716FFB0E000B4F496966C
+:10B48000FFB4271400549713FFFC9413FFFCF486B9
+:10B490003BB49493FFFC9396FF4C9516FF440788AA
+:10B4A0000008E00125689793FFFC8396FF4C851602
+:10B4B000FF4420220000E600B4F1F60200018716E6
+:10B4C000FFACF3063BB476B90001C6B4700076B5A4
+:10B4D0000002C6B4300006B4001486B60000971609
+:10B4E000FFB09696FFB4F7053BBCE000B4F82032FD
+:10B4F0000000F602000020320000E600B52D2714FF
+:10B5000000088496FF5400000001C72470008316D1
+:10B51000FFB404A400049496FF548496FF94933AD5
+:10B52000FFC004A40001E000B5549496FF94831674
+:10B53000FF5400000001C7187000F4844F5803182E
+:10B5400000049316FF548316FF9494BAFFC00318A7
+:10B5500000019316FF949516FF3C9396FF8CE00034
+:10B56000B2B0039C00018496FF94000000012026E5
+:10B570000000E600B584F3820001F4044F58E000B7
+:10B58000BEE4000000018316FFB88496FF9400001B
+:10B590000001C01E4A00EC00B5CC9316FF7C269437
+:10B5A00000048736FFC08316FF7C00000001C03A0C
+:10B5B0003200E600BB98039C00018496FF940000D3
+:10B5C0000001C01E4A00EC00B5A106B40004F4045A
+:10B5D0004F588316FF7C00000001C01A4200E600AD
+:10B5E000BA2DF48200009496FF7423800007201E79
+:10B5F0000007EE00B748C71C38008316FF7C000028
+:10B600000001C71870000738002686BA0000F584CC
+:10B610004F587739001E7738FFE5C6B477C076B546
+:10B62000FFF0F70200FFC6B67400E600B6692036E8
+:10B630000001E600B66977350006A6BA5802C73899
+:10B6400058007639001E7630FFE5C6B467C076B57F
+:10B65000FFF020360002E600B66DC6B80000C72C29
+:10B660000000E000B66CC6B80000F6844F58F7043E
+:10B670004F58C5340000C02A7200E600B741C584A7
+:10B6800000008496FF7486AA001C8316FF3CF60215
+:10B69000000004A400019496FF74871A001C04A8FB
+:10B6A000001C9496FF34C0367200E600B6CC041835
+:10B6B000001C86AA0020871A002000000001C03666
+:10B6C0007200E600B6D020320000F60200012032FF
+:10B6D0000000E600B6DD00000001F58200008316E0
+:10B6E000FF3487220000869A000000000001C03667
+:10B6F0007200E200B71CF6020000C0367200E600DD
+:10B70000B72420320000869A00048722000400003B
+:10B710000001C0367200E200B72520320000F602B8
+:10B72000000120320000E600B735202E0000F5822F
+:10B730000001202E0000E600B740000000019396B3
+:10B74000FF84E000B5EC039C00018496FF7483162F
+:10B75000FF9400000001C0263200E600BB982300E1
+:10B7600000088496FF8400000001C0263200E60035
+:10B77000BB99F6020000F684407CF7044074C6B41E
+:10B780006800C73868000738002686BA0000773995
+:10B79000001E7738FFE5C6B477C077B40008703E66
+:10B7A000FFE8470C0001D7000A70203A0000E600CD
+:10B7B000B804F58200FF8496FF848316FF8C000096
+:10B7C0000001C72432008496FF7CC7387000C7246C
+:10B7D00070000738002686BA00007739001E7738D7
+:10B7E000FFE5C6B477C076B5FFF0C6B45C00C036DE
+:10B7F0006200470C0001D7000A70203A0000E60002
+:10B80000B80D20320000F602000120320000E600F0
+:10B81000BB9823800007201E0007EE00B8C8C71C95
+:10B8200038008316000000000001C71870000738B8
+:10B83000002686BA0000F5844F587739001E773805
+:10B84000FFE5C6B477C076B5FFF0F70200FFC6B6D5
+:10B850007400E600B89120360001E600B891773513
+:10B860000006A6BA5802C73858007639001E76304E
+:10B87000FFE5C6B467C076B5FFF020360002E600EB
+:10B88000B895C6B80000C72C0000E000B894C6B850
+:10B890000000F6844F58F7044F58C5340000C02A02
+:10B8A0007200E600B8C1000000019513FFFC9396FA
+:10B8B000FF4C07880008E000CC609793FFFC83965C
+:10B8C000FF4CE000B814039C00018496FF848316AB
+:10B8D000FF8CF384407CF5044074C4A43200949639
+:10B8E000FF348316FF34C59C3800C5A8580005AC4A
+:10B8F000002686AE0000772D001E7738FFE5742DF8
+:10B90000001E7420FFE5739D0010739DFFF8C4A412
+:10B9100030009496FF3C8316FF7CC6B477C0C49871
+:10B9200048009496FF3C04A400269496FF3C73259F
+:10B93000001E7318FFE59316FF6C74A5001E949605
+:10B94000FF6474A4FFE59496FF648316FF7CF4847F
+:10B950004F5876B5FFF0C6184A007630FFFA4631E8
+:10B960000000F30200FFC6303400F482FF00C6B4CA
+:10B970004C00C6306800F62F2800872E0000831682
+:10B98000FF34C73847C07739FFF07319001093169A
+:10B99000FF347499FFF8F30200FFC7383400C7245E
+:10B9A00070009716FF34249400CA84A6000077A57F
+:10B9B000001E77BCFFE5C4A47FC074A5FFF083160A
+:10B9C000FF3CF4AF2800F4844F58871A0000C528C4
+:10B9D0004A007528FFFA8316FF6C45290000F4829F
+:10B9E00000FFC5284C008496FF3CC73837C0773924
+:10B9F000FFF0F302FF00C7383400C5287000F527B8
+:10BA00002800872600008316FF648416FF7CC73851
+:10BA100037C07739FFF0F48200FFC7384C00831637
+:10BA2000FF3CC39C7000E000BEE4F39B2800F704D9
+:10BA3000407CF6044074C7387000C7307000073887
+:10BA4000002686BA00007739001E7738FFE5C6B4B5
+:10BA500077C077B40008703EFFE8470C0001D700BC
+:10BA60000A70203A0000E600BA7D25800007E00059
+:10BA7000BEE404200040E000BAD8C42C0000C73067
+:10BA80004200849600007538FFFA0624000A202E32
+:10BA90000007EE00BAD40730000E86BA00007739EE
+:10BAA000001E7738FFE5C6B477C076B5FFF0F70221
+:10BAB00000FFC6B4740047290000C0367200470C6E
+:10BAC0000001203A0000E600BA7406300002E000EF
+:10BAD000BA8C05AC0001F402000807200007203AE8
+:10BAE000000EE200BBA4C5A0400083160000F504D0
+:10BAF000407CF48200FFF6044F58C598580005AC0E
+:10BB0000002686AE0000772D001E7738FFE5C618A8
+:10BB100062007630FFFA46310000C6304C00C6B4F1
+:10BB200077C076B5FFF0772900107739FFF8C6B4F3
+:10BB30004C00C7386800F72F2800F5844074C528EA
+:10BB40005000C5AC500005AC002686AE0000772D35
+:10BB5000001E7738FFE5752D001E7528FFE5C6B479
+:10BB600077C076B5FFF0F702FF00C6B47400C630A8
+:10BB70006800F62F2800872E000076A1001076B509
+:10BB8000FFF8C73857C07739FFF0C7384C00C6B444
+:10BB90007000E000BBF8F6AF2800F4044F58E00056
+:10BBA000BEE404200040F6044F5883160000F7045A
+:10BBB000407CF5844074C61862007630FFFAC738BE
+:10BBC0007000C5AC700005AC002686AE0000772D75
+:10BBD000001E7738FFE546310000C6B477C076B561
+:10BBE000FFF0F70200FFC6307400F702FF00C6B492
+:10BBF0007400C6306800F62F280023800007201E3E
+:10BC00000007EE00BEE0C71C38008496000000006C
+:10BC10000001C72470000738002686BA0000F584AA
+:10BC20004F587739001E7738FFE5C6B477C076B530
+:10BC3000FFF0F70200FFC6B67400E600BC792036BC
+:10BC40000001E600BC7977350006A6BA5802C7386D
+:10BC500058007639001E7630FFE5C6B467C076B569
+:10BC6000FFF020360002E600BC7DC6B80000C72CFD
+:10BC70000000E000BC7CC6B80000F6844F58F70412
+:10BC80004F58C5340000C02A7200E600BED906A88D
+:10BC9000001C83160000000000019313FFFC969324
+:10BCA000FFFCF4863BB49493FFFC9396FF4C9516EF
+:10BCB000FF449696FF4007880008E00123409793D1
+:10BCC000FFFCF3044F5CF48200009496FF5C8696C0
+:10BCD000FF408396FF4C8516FF449316FF34861A67
+:10BCE00000089696FF3C871A000400000001C0324D
+:10BCF0007200EC00BDB89616FF9C77310001C73882
+:10BD0000600077390002C63830000630000C86B279
+:10BD10000000872A001C8596FF5CC0367200E60092
+:10BD2000BD40C404000086B20004872A0020000041
+:10BD30000001C0367200E600BD44202E0000F582EE
+:10BD40000001202E0000E600BD5100000001F402B9
+:10BD500000008316FF3C86B20000871A0000000036
+:10BD60000001C0367200E200BD90F5820000C036CE
+:10BD70007200E600BD98202E000086B20004871AEB
+:10BD8000000400000001C0367200E200BD99202EC0
+:10BD90000000F5820001202E0000E600BDA920224F
+:10BDA0000000F402000120220000E600BDB80000FF
+:10BDB0000001F48200019496FF5C8316FF5C000092
+:10BDC0000001201A0000E600BDF9F6020001871606
+:10BDD000FF9C8496FF3476B90001C6B4700076B536
+:10BDE0000002C6B4480006B4001486B600009716D8
+:10BDF000FFA0E000BE709696FFA42714006497137E
+:10BE0000FFFC8316FF3C000000019313FFFC8496A7
+:10BE1000FF34000000019493FFFC9396FF4C9516AD
+:10BE2000FF4407880008E00125689793FFFC83968C
+:10BE3000FF4C8516FF4420220000E600BE71F6028A
+:10BE400000008716FF9C8316FF3476B90001C6B444
+:10BE5000700076B50002C6B4300006B4001486B691
+:10BE600000009716FFA09696FFA4971A0008F60206
+:10BE7000000120320000E600BE99F606429CF7045D
+:10BE8000429C76B1001E76B4FFE5C7386FC07739A3
+:10BE9000FFF007380001F7332800F7044F5800007F
+:10BEA0000001C72872007738FFFA4739000097135E
+:10BEB000FFFC0728001C9713FFFCF4844F5C000074
+:10BEC00000019493FFFC9396FF4C07880008E00163
+:10BED00023409793FFFC8396FF4CE000BBFC039C40
+:10BEE0000001841600008796FFFC8296FFF802147A
+:10BEF0000004013C0000000000019293FFFC02904E
+:10BF0000000822100060851600008616000406A8AE
+:10BF10000018C7306000C5B8680020320007EE0086
+:10BF2000BF64072C000E86BA00007739001E7738F0
+:10BF3000FFE5C6B477C076B5FFF0F70200FFC6B4E0
+:10BF4000740020360000470C0001D7000A70203A28
+:10BF50000000E600BF6105AC0002E000BF1806303B
+:10BF6000000120320007EE00C04C06A80016F505BF
+:10BF70004074F605407CF3020006F3054254961324
+:10BF8000FFFC052800029516FFC49513FFFC2394BF
+:10BF900000209396FFBC9393FFFC9616FFAC078896
+:10BFA0000008E000D0DC9793FFFC8496FFC42314C4
+:10BFB00000389493FFFC9316FFB49313FFFC07889B
+:10BFC0000008E000D2589793FFFC8702FF348616E2
+:10BFD000FFACF70542649613FFFC9713FFFC8396B2
+:10BFE000FFB4000000019393FFFC8496FFBC0000A7
+:10BFF00000019493FFFC07880008E000F7C89793BE
+:10C00000FFFC20220000E600C01DF3063AD8F7042A
+:10C0100042540000000127380001F7054254F3059F
+:10C020004244F38217709393FFFCF482001B9493B5
+:10C03000FFFCF30642449313FFFC07880008E0016D
+:10C040001EC09793FFFCE000C1A0000000018736EE
+:10C050000000F5844F58F4063B7076B5001E76B4A8
+:10C06000FFE5C7386FC07738FFF076390006A72E96
+:10C070006002C52C600076A9001E76B4FFE5C738C3
+:10C080006FC07739FFF077390003C73840000738B1
+:10C09000000286BA00007739001E7738FFE5C6B483
+:10C0A00077C076B7FFF0EE00C1159696FF9CA72EDD
+:10C0B000600276A9001E76B4FFE58396FF9CC73820
+:10C0C0006FC07739FFF077390003C738400086BA70
+:10C0D0000004249400607739001E7738FFE5C6B469
+:10C0E00077C076B5FFF0A6AA6802771D0003C738AF
+:10C0F00068002738000883BA0004833A0000000073
+:10C10000000193A60004932600008596FFA4E0009A
+:10C11000C13823000007A72E600276A9001E76B45E
+:10C12000FFE5C7386FC07739FFF077390003C738AC
+:10C13000400085BA0004230000079313FFFC872A00
+:10C14000000076A9001E76B4FFE58396FF9CF606F4
+:10C150003B70C7386FC07739FFF077390003A6BA54
+:10C160006002201E0000C73860007739001E773853
+:10C17000FFE5C6B477C0EE00C18D76B5FFF08496BA
+:10C18000FFA0000000017725FFF0C6B86800C728AF
+:10C1900068009713FFFC07880008C12C00009793E4
+:10C1A000FFFC8796FFFC8296FFF802140008013C12
+:10C1B0000000000000019293FFFC02900008221092
+:10C1C000007025000007202A0007EE00C3B8C7282A
+:10C1D00050008316000000000001C71870000738E7
+:10C1E000002686BA0000F5844F587739001E77384C
+:10C1F000FFE5C6B477C076B5FFF0F70200FFC6B61C
+:10C200007400E600C23D20360001E600C23D7735ED
+:10C210000006A6BA5802C73858007639001E763094
+:10C22000FFE5C6B467C076B5FFF020360002E60031
+:10C23000C24DC03A5A00E000C248C72C0000F704C3
+:10C240004F58F5844F5800000001C03A5A00E600EC
+:10C25000C3B1F4863B908396000000000001069C69
+:10C2600000168736000076B5001E76B4FFE5C738A5
+:10C270006FC07738FFF076390006A72E6002C52C14
+:10C28000600076A9001E76B4FFE5C7386FC0773925
+:10C29000FFF077390003C73848000738000286BA34
+:10C2A00000007739001E7738FFE5C6B477C076B74F
+:10C2B000FFF0EE00C3219696FF8CA72E600276A9B0
+:10C2C000001E76B4FFE58316FF8CC7386FC0773940
+:10C2D000FFF077390003C738480086BA0004249479
+:10C2E00000707739001E7738FFE5C6B477C076B5A1
+:10C2F000FFF0A6AA680277190003C738680027383C
+:10C30000000883BA0004833A00000000000193A6ED
+:10C310000004932600008616FF94E000C34400004A
+:10C320000001A72E600276A9001E76B4FFE5F30691
+:10C330003B90C7386FC07739FFF077390003C738B3
+:10C340003000863A0004872A000076A9001E76B4E1
+:10C35000FFE58396FF8CF4863B90C7386FC0773932
+:10C36000FFF077390003A6BA4802201E0000C73844
+:10C3700048007739001E7738FFE5C6B477C0EE0075
+:10C38000C39576B5FFF08316FF9000000001771982
+:10C39000FFF0C6B86800C72868009713FFFC07883D
+:10C3A0000008C13000009793FFFCE000C5C4000006
+:10C3B0000001E000C1C40528000183960000F4825A
+:10C3C0000006F4854254F60442602514001E23142E
+:10C3D00000209316FFACF3854078063000028732C8
+:10C3E000000076B1001E76B4FFE50630000275B19C
+:10C3F000001EC7386FC07738FFF0F71B2800873260
+:10C40000000075ACFFE5C7385FC07738FFF0F72B49
+:10C4100028002514001C063000028732000076B187
+:10C42000001E76B4FFE5C7386FC07738FFF0F72BF2
+:10C4300028002514001A063000028732000076B169
+:10C44000001E76B4FFE5C7386FC07738FFF0F72BD2
+:10C45000280025140018063000028732000076B14B
+:10C46000001E76B4FFE5C7386FC07738FFF0F72BB2
+:10C47000280025140016063000028732000076B12D
+:10C48000001E76B4FFE5C7386FC07738FFF0F72B92
+:10C49000280025140014063000028732000076B10F
+:10C4A000001E76B4FFE5C7386FC07738FFF0F72B72
+:10C4B000280025140012063000028732000076B1F1
+:10C4C000001E76B4FFE5C7386FC07738FFF0F72B52
+:10C4D0002800063000028732000025140010763153
+:10C4E000001E7630FFE5C73867C07738FFF0F72BBE
+:10C4F0002800071C00029713FFFC2394005093961A
+:10C50000FFA49393FFFC07880008E000D25897939C
+:10C51000FFFC8496FFA4231400389493FFFC27802B
+:10C5200000079793FFFC9316FF9C9313FFFC07886B
+:10C530000008E000CF249793FFFC8702FF34278098
+:10C540000007F7854258F705426427800007979354
+:10C55000FFFC9713FFFC8396FF9C00000001939360
+:10C56000FFFC8496FFAC000000019493FFFC078859
+:10C570000008E000F5F49793FFFC20220000E6009D
+:10C58000C59500000001F70442580000000107387B
+:10C590000001F7054258F7042D38F30639C0F305BA
+:10C5A0004244F6862C2806380001F6052D387739E6
+:10C5B0000002F382001C20320044E600C5C4B3BA76
+:10C5C0006802F0052D388796FFFC8296FFF802146A
+:10C5D0000004013C0000000000019293FFFC029067
+:10C5E000000825000007F7044074F6844F58F6044D
+:10C5F0004260C7386A0075B8FFFA0630000A202A80
+:10C600000007EE00C6480730000E86BA00007739F2
+:10C61000001E7738FFE5C6B477C076B5FFF0F702A5
+:10C6200000FFC6B47400472D0000C0367200470CEE
+:10C630000001203A0000E600C64CC3280000063086
+:10C640000002E000C5FC05280001F3020008C5183F
+:10C650003000F3844260F6044F58F704407CF484C1
+:10C660004074C51C50000528002685AA00007429C6
+:10C67000001E7420FFE5C61C62007630FFFAC6B8C3
+:10C680007000C4A4680004A4002676A5001E76B439
+:10C69000FFE5773900107739FFF846310000C5AC67
+:10C6A00047C075ADFFF0F40200FFC5AC4400C738C9
+:10C6B0005800F72B28008726000075A5001EC630FD
+:10C6C000440075ACFFE5C7386FC07739FFF0F682DC
+:10C6D000FF00C7386C00C6307000F6272800872698
+:10C6E00000007699001076B5FFF8C7385FC077393B
+:10C6F000FFF0C7384400C6B47000F6A72800939333
+:10C70000FFFCF3843BB0000000019393FFFC07881B
+:10C710000008E000D42C9793FFFCF704407C000055
+:10C720000001073800019713FFFCF38440740000F8
+:10C7300000019393FFFC07880008E000BEF8979380
+:10C74000FFFC8796FFFC8296FFF802140004013C70
+:10C750000000000000019293FFFC02900008879601
+:10C76000FFFC8296FFF802140008013C0000000064
+:10C7700000019293FFFC029000088796FFFC8296CE
+:10C78000FFF802140004013C000000000001929335
+:10C79000FFFC029000088796FFFC8296FFF80214C7
+:10C7A0000000013C0000000000019293FFFC029099
+:10C7B0000008F70642309713FFFCF7063560971321
+:10C7C000FFFC07880008E00014F49793FFFCF706CD
+:10C7D00042309713FFFCF70635EC9713FFFC0788F0
+:10C7E0000008E00014F49793FFFCF7064244971307
+:10C7F000FFFCF70636789713FFFC07880008E00077
+:10C8000014F49793FFFCF70642449713FFFCF706D6
+:10C8100037049713FFFC07880008E00014F497938F
+:10C82000FFFCF70642449713FFFCF7063790971377
+:10C83000FFFC07880008E00014F49793FFFCF7065C
+:10C8400042449713FFFCF706381C9713FFFC078838
+:10C850000008E00014F49793FFFCF7064244971396
+:10C86000FFFCF70638A89713FFFC07880008E000D4
+:10C8700014F49793FFFCF70642449713FFFCF70666
+:10C8800039349713FFFC07880008E00014F49793ED
+:10C89000FFFCF70642449713FFFCF70639C09713D5
+:10C8A000FFFC07880008E00014F49793FFFCF706EC
+:10C8B00042449713FFFCF7063A4C9713FFFC078896
+:10C8C0000008E00014F49793FFFCF7064244971326
+:10C8D000FFFCF7063AD89713FFFC07880008E00032
+:10C8E00014F49793FFFC8796FFFC8296FFF80214DE
+:10C8F0000000013C0000000000019293FFFC029048
+:10C90000000885960000F5063B90872E000076AD66
+:10C91000001E76B4FFE5C7386FC07739FFF077396E
+:10C920000003C73850000738000286BA0000773984
+:10C93000001E7738FFE5C6B477C07637FFF0EE000B
+:10C94000C99500000001872E000076AD001E76B468
+:10C95000FFE5C7386FC07739FFF077390003C73874
+:10C96000500086BA00047739001E7738FFE5C6B458
+:10C9700077C076B5FFF0A6AE680277310003C738FE
+:10C9800068002738000884BA0004843A0000E000F8
+:10C99000C9B4C5240000872E000076AD001E76B411
+:10C9A000FFE5C7386FC07739FFF077390003C73824
+:10C9B0005000853A0004872E000076AD001E76B444
+:10C9C000FFE520320000F6063B90C7386FC077398C
+:10C9D000FFF077390003A6BA6002C73860007739E4
+:10C9E000001E7738FFE5C6B477C0EE00C9F976B50A
+:10C9F000FFF07721FFF0C6B86800C72C68009713D6
+:10CA0000FFFC07880008C12800009793FFFC879669
+:10CA1000FFFC8296FFF802140004013C00000000B5
+:10CA200000019293FFFC0290000885960000F50635
+:10CA30003B70872E000076AD001E76B4FFE5C73848
+:10CA40006FC07739FFF077390003C73850000738D7
+:10CA5000000286BA00007739001E7738FFE5C6B4B9
+:10CA600077C07637FFF0EE00CABD00000001872EC8
+:10CA7000000076AD001E76B4FFE5C7386FC0773989
+:10CA8000FFF077390003C738500086BA00047739C1
+:10CA9000001E7738FFE5C6B477C076B5FFF0A6AEC6
+:10CAA000680277310003C73868002738000884BA65
+:10CAB0000004843A0000E000CADCC5240000872E90
+:10CAC000000076AD001E76B4FFE5C7386FC0773939
+:10CAD000FFF077390003C7385000853A0004839689
+:10CAE000000476AD001E76B4FFE52032000093937B
+:10CAF000FFFC872E0000F6063B70C7386FC0773901
+:10CB0000FFF077390003A6BA6002C73860007739B2
+:10CB1000001E7738FFE5C6B477C0EE00CB2976B5A6
+:10CB2000FFF07721FFF0C6B86800C72C68009713A4
+:10CB3000FFFC07880008C12800009793FFFC879638
+:10CB4000FFFC8296FFF802140008013C0000000080
+:10CB500000019293FFFC02900008F5044F58F58203
+:10CB6000000206280080202E0062EE00CB900730E5
+:10CB70000040F0332800C6B8520076B4FFFA063001
+:10CB80000014F6B32800C6380000E000CB6405AC02
+:10CB90000001F7044F580000000106B818D4F482D1
+:10CBA0000001F4B72800073818C0F03B2800F7064A
+:10CBB00042C0F4820002F4BB28008796FFFC8296F4
+:10CBC000FFF802140000013C0000000000019293F5
+:10CBD000FFFC02900008F68442C0F60642C077319E
+:10CBE000001E7738FFE575B1001EC6B477C076B475
+:10CBF000FFF0F7044F5876B50006C4386800872266
+:10CC0000001476A1001E76B4FFE5C7386FC07738F0
+:10CC1000FFF0F7332800F70442C075ACFFE5C738D2
+:10CC20005FC07738FFF0203A0001E600CC4CF606F2
+:10CC30004290F704429076B1001E76B4FFE5C73803
+:10CC40006FC07739FFF007380001F7332800879667
+:10CC5000FFFC8296FFF802140000013C0000000077
+:10CC600000019293FFFC0290000822100004851638
+:10CC70000000000000019513FFFC9516FFF40788E3
+:10CC80000008E000CD009793FFFC8516FFF42022FA
+:10CC90000000E600CCBCF58642C0F7044290F606E0
+:10CCA000429276B1001E76B4FFE5C7386FC077397F
+:10CCB000FFF007380001E000CCECF7332800F02B40
+:10CCC0002800F68442C0772D001E7738FFE506283D
+:10CCD0000014C6B477C076B4FFF0F7044F58F6B32B
+:10CCE0002800C72872007738FFFAF72F28008796A8
+:10CCF000FFFC8296FFF802140004013C00000000D3
+:10CD000000019293FFFC0290000886960000F70451
+:10CD10004F58F4020000C6B472007734FFFA273887
+:10CD20000002203A0061F702003FE200CD40C6B4A5
+:10CD3000740020360000E600CD4000000001F4023F
+:10CD400000018796FFFC8296FFF802140004013C64
+:10CD50000000000000019293FFFC0290000886167C
+:10CD600000008716000885960004C5307000C032A8
+:10CD70005200E600CDA10000000186B2000077312C
+:10CD8000001E7738FFE5C6B477C076B5FFE8F6AF8A
+:10CD9000680006300001C0325200E600CD7805ACD4
+:10CDA00000018796FFFC8296FFF80214000C013CFC
+:10CDB000000000000001000000009293FFFC0290C0
+:10CDC000000884960000841600048596000886A654
+:10CDD00000007725001E7738FFE5C6B477C07535AB
+:10CDE000FFF0202A0010E200CE0DF606428EF5027A
+:10CDF0000010F704428C76B1001E76B4FFE5C73808
+:10CE00006FC07739FFF007380001F7332800202E74
+:10CE10000001E600CE70202A0000EE00CE7107244B
+:10CE2000000225280001A5BA50028622000076A142
+:10CE3000001E76B4FFE5C73850007739001E7738FA
+:10CE4000FFE5C5AC77C0C6306FC07631FFF075AD79
+:10CE5000FFE8F68200FFF702F15475AD0002A72E3D
+:10CE60007002C6306C00C6307580F623280024207E
+:10CE7000000225A80001F302F24603A40002C4AC9C
+:10CE80003800252C0001202E0000EC00CF110000FE
+:10CE90000001E600CEA0C71C5000E000CEB4F602B0
+:10CEA0000000A69E50027739001E7738FFE5C6B411
+:10CEB00077C07635FFE886A600007725001E773814
+:10CEC000FFE52528000225AC0002C6B477C076B580
+:10CED000FFE877310004C738620077390001C738AE
+:10CEE0003000C6B46800C6B4700006B4000E8736C1
+:10CEF000000024A4000276B5001E76B4FFE5C73812
+:10CF00006FC07738FFF0F7232800E000CE8424209C
+:10CF100000028796FFFC8296FFF80214000C013C89
+:10CF20000000000000019293FFFC029000088616AA
+:10CF3000000883160004839600008732000076B153
+:10CF4000001E76B4FFE5059C0002749D001E74A4CB
+:10CF5000FFE5741D001E063000027531001EC73843
+:10CF60006FC07738FFF0F71F280087320000752860
+:10CF7000FFE5C73857C07738FFF0F72F280005AC1A
+:10CF80000002063000028732000076B1001E76B43F
+:10CF9000FFE5C7386FC07738FFF0F72F280005ACE2
+:10CFA0000002063000028732000076B1001E76B41F
+:10CFB000FFE5C7386FC07738FFF0F72F280005ACC2
+:10CFC0000002063000028732000076B1001E76B4FF
+:10CFD000FFE5C7386FC07738FFF0F72F280005ACA2
+:10CFE0000002063000028732000076B1001E76B4DF
+:10CFF000FFE5C7386FC07738FFF0F72F280005AC82
+:10D000000002063000028732000076B1001E76B4BE
+:10D01000FFE5C7386FC07738FFF0F72F280005AC61
+:10D020000002063000028732000076B1001E76B49E
+:10D03000FFE5C7386FC07738FFF0F72F28000630BC
+:10D0400000028732000005AC00027631001E763007
+:10D05000FFE5C73867C07738FFF0F72F2800871E35
+:10D0600000007420FFE5C7384FC07739FFF007385C
+:10D070000001F71F2800871E0000049C0002C7382B
+:10D0800047C07739FFF025380001202A0000EE0064
+:10D09000D0BD26280001A7266002C6A4600076B590
+:10D0A000001E76B4FFE5C5A45000C5300000C738A7
+:10D0B0006FC07739FFE8E000D088F72F6800071CC1
+:10D0C0000002F33B6800C41C00008796FFFC8296B8
+:10D0D000FFF80214000C013C0000000000019293D4
+:10D0E000FFFC0290000886160004841600008732B8
+:10D0F000000076B1001E76B4FFE505A0000274A121
+:10D10000001E74A4FFE5063000027531001EC7380A
+:10D110006FC07738FFF0F7232800873200007528AA
+:10D12000FFE5C73857C07738FFF0F72F280005AC68
+:10D130000002063000028732000076B1001E76B48D
+:10D14000FFE5C7386FC07738FFF0F72F280005AC30
+:10D150000002063000028732000076B1001E76B46D
+:10D16000FFE5C7386FC07738FFF0F72F280005AC10
+:10D170000002063000028732000076B1001E76B44D
+:10D18000FFE5C7386FC07738FFF0F72F280005ACF0
+:10D190000002063000028732000076B1001E76B42D
+:10D1A000FFE5C7386FC07738FFF0F72F280005ACD0
+:10D1B0000002063000028732000076B1001E76B40D
+:10D1C000FFE5C7386FC07738FFF0F72F280005ACB0
+:10D1D0000002063000028732000076B1001E76B4ED
+:10D1E000FFE5C7386FC07738FFF0F72F280005AC90
+:10D1F0000002063000028732000006A000027631ED
+:10D20000001E7630FFE5C73867C07738FFF0F72F8C
+:10D210002800872200007621001E85960008C73866
+:10D220004FC07739FFF0C6B47000F5B768008722A9
+:10D2300000007630FFE5C73867C07739FFF0073860
+:10D240000001F72328008796FFFC8296FFF802145E
+:10D25000000C013C0000000000019293FFFC0290D2
+:10D2600000082210002027140020F03B280084969C
+:10D270000004F502000086A600007625001E763028
+:10D28000FFE504240002C6B467C076B4FFF0F6BB25
+:10D2900028008726000076A5001E76B4FFE5C73873
+:10D2A0006FC07739FFF0C02A7200EC00D2F876A583
+:10D2B000001E8726000076B4FFE5062800012594AD
+:10D2C000001EC5AC5000C5300000C7386FC07739AC
+:10D2D000FFF0C7385200A6A27002C720700077394D
+:10D2E000001E7738FFE5C6B477C076B5FFE8C68084
+:10D2F0006A00E000D290F6AF68008716FFE076156E
+:10D30000001E7630FFE5839600002314001E7599F9
+:10D31000001E75ACFFE57515001E7528FFE57495B8
+:10D32000001E74A4FFE57415001E7420FFE5069C22
+:10D3300000027395001E9396FFDCC73867C0839682
+:10D3400000007738FFF0F71F28008396FFDC871A6C
+:10D350000000739CFFE59396FFDCC7385FC0773809
+:10D36000FFF0F737280006B400028716FFE4231405
+:10D37000001A7619001E7630FFE5C73857C0773897
+:10D38000FFF0F7372800871A000006B40002C738FC
+:10D3900067C07738FFF0F737280006B40002871619
+:10D3A000FFE8231400167619001E7630FFE5C73813
+:10D3B0004FC07738FFF0F7372800871A000006B40F
+:10D3C0000002C73867C07738FFF0F737280006B487
+:10D3D00000028716FFEC231400127619001E763027
+:10D3E000FFE5C73847C07738FFF0F7372800871ABE
+:10D3F000000006B4000284160000C73867C0773802
+:10D40000FFF0F73728008716FFF006B40002C73890
+:10D410003FC07738FFF0F73728008796FFFC8296E9
+:10D42000FFF802140008013C000000000001929384
+:10D43000FFFC029000088616000084160004F684A3
+:10D440004F5887320014033000147519001E7528D8
+:10D45000FFE5C3A06A00739CFFFA04A0001475A541
+:10D46000001EC6306A007630FFFAC73857C07738DA
+:10D47000FFF0F7272800F39B280007200016F63B53
+:10D4800028008722001475ACFFE5C7385FC07738E5
+:10D49000FFF077390006C6B4700006B40016F3B783
+:10D4A00028008796FFFC8296FFF802140008013CD2
+:10D4B0000000000000019293FFFC02900008861615
+:10D4C0000000F5844F5805300016872A000076A921
+:10D4D000001E76B4FFE5C7386FC07738FFF07739A4
+:10D4E0000006C42C7000C0226200E600D52906A008
+:10D4F000001687360000C6305A007630FFFA76B53F
+:10D50000001E76B4FFE5C7386FC07738FFF0773973
+:10D51000000676B8FFFAF6AB2800C72C7000073873
+:10D520000014E000D52CF63B2800C42C00008796A0
+:10D53000FFFC8296FFF802140004013C000000008A
+:10D5400000019293FFFC02900008F7064F844738D1
+:10D55000FFFCF7056F30F686505C46B4FFFCF6859D
+:10D560006E50F7066E7C4738FFFCF7056E540734A3
+:10D57000191CF7054F5CF70200649736191CF70277
+:10D5800000009736192006B4001CF6854F58879680
+:10D59000FFFC8296FFF802140000013C000000002E
+:10D5A00000019293FFFC0290000822100090F30209
+:10D5B000FFFFF3054F54F38200009396FFAC231452
+:10D5C00000209316FF9C239400389396FF948316B3
+:10D5D000FFACF7044F5CF382000C9396FF74931634
+:10D5E000FF8C873A0004000000019716FFA4831601
+:10D5F000FFAC8396FFA400000001C01A3A00EC00C3
+:10D60000DB78F30204BCF7044F5C8316FF74000060
+:10D610000001C7383000873A0008F6844F58773940
+:10D620000006C4B470009493FFFC9496FF7C0788B6
+:10D630000008E000CD009793FFFC8496FF7C202239
+:10D640000000E600D654C5040000F7044288E0005C
+:10D65000D87CF6064288F6044F5C83960000831659
+:10D66000FF74869E0000A7323002F5820000C036AB
+:10D670007200E600D694C6303000869E00048732E1
+:10D68000000400000001C0367200E600D698202E8B
+:10D690000000F5820001202E0000E600D6A5000063
+:10D6A0000001F50200008396000087320000869E8C
+:10D6B000000000000001C0367200E200D6E4F582EE
+:10D6C0000000C0367200E600D6EC202E0000869ED8
+:10D6D00000048732000400000001C0367200E2003E
+:10D6E000D6ED202E0000F5820001202E0000E6007D
+:10D6F000D6FD202A0000F5020001202A0000E600E5
+:10D70000D72804A400028316FFACF70642C883960C
+:10D71000FF8CF3054F54C71C7000F03B28000738FE
+:10D720000002E000DB50F03B28009496FF6C872657
+:10D73000000076A5001E76B4FFE58316FF6C839685
+:10D74000FF9C2494001E0618000275B1001E75ACE3
+:10D75000FFE5C7386FC07738FFF0F71F2800873222
+:10D760000000751D001E7528FFE5C7385FC07738BB
+:10D77000FFF0F72728002494001C063000028732AF
+:10D78000000076B1001E76B4FFE5C7386FC0773869
+:10D79000FFF0F72728002494001A06300002873291
+:10D7A000000076B1001E76B4FFE5C7386FC0773849
+:10D7B000FFF0F72728002494001806300002873273
+:10D7C000000076B1001E76B4FFE5C7386FC0773829
+:10D7D000FFF0F72728002494001606300002873255
+:10D7E000000076B1001E76B4FFE5C7386FC0773809
+:10D7F000FFF0F72728002494001406300002873237
+:10D80000000076B1001E76B4FFE5C7386FC07738E8
+:10D81000FFF0F72728002494001206300002873218
+:10D82000000076B1001E76B4FFE5C7386FC07738C8
+:10D83000FFF0F7272800063000028732000024940A
+:10D8400000107631001E7630FFE5C73867C07738A4
+:10D85000FFF0F72728008716FFE0F682FFFCC738A5
+:10D8600057C07739FFF007380003C4B86C00202692
+:10D870000010E200D89DF606428AF704428876B18D
+:10D88000001E76B4FFE5F4020000C7386FC0773998
+:10D89000FFF007380001E000DBA0F7332800831613
+:10D8A000FF6C251400368396FF94871A0000769942
+:10D8B000001E76B4FFE50618000275B1001EC738D9
+:10D8C0006FC07738FFF0F71F28008732000075AC73
+:10D8D000FFE5C7385FC07738FFF0F72B2800251425
+:10D8E0000034063000028732000076B1001E76B4A4
+:10D8F000FFE5C7386FC07738FFF0F72B28002514F5
+:10D900000032063000028732000076B1001E76B485
+:10D91000FFE5C7386FC07738FFF0F72B28002514D4
+:10D920000030063000028732000076B1001E76B467
+:10D93000FFE5C7386FC07738FFF0F72B28002514B4
+:10D94000002E063000028732000076B1001E76B449
+:10D95000FFE5C7386FC07738FFF0F72B2800251494
+:10D96000002C063000028732000076B1001E76B42B
+:10D97000FFE5C7386FC07738FFF0F72B2800251474
+:10D98000002A063000028732000076B1001E76B40D
+:10D99000FFE5C7386FC07738FFF0F72B2800251454
+:10D9A0000028063000028732000026A4000274A47A
+:10D9B000FFFF7631001E7630FFE5C73867C0773845
+:10D9C000FFF0F72B28009013FFFC8316FF8CF7065F
+:10D9D00042CCC7187000C73868009713FFFC9393B8
+:10D9E000FFFC9496FF7C07880008E000CDB8979371
+:10D9F000FFFC8396FF6C2414004E25140050831600
+:10DA0000FF8C8496FF7C871E0000769D001E76B4F6
+:10DA1000FFE5061C000275B1001E75ACFFE5C738B6
+:10DA20006FC07738FFF0F72B280087320000752988
+:10DA3000001E7528FFE5C7385FC07738FFF0F72371
+:10DA400028002414004C063000028732000076B112
+:10DA5000001E76B4FFE5C7386FC07738FFF0F723B4
+:10DA600028002414004A063000028732000076B1F4
+:10DA7000001E76B4FFE5C7386FC07738FFF0F72394
+:10DA8000280024140048063000028732000076B1D6
+:10DA9000001E76B4FFE5C7386FC07738FFF0F72374
+:10DAA000280024140046063000028732000076B1B8
+:10DAB000001E76B4FFE5C7386FC07738FFF0F72354
+:10DAC000280024140044063000028732000076B19A
+:10DAD000001E76B4FFE5C7386FC07738FFF0F72334
+:10DAE000280024140042063000028732000076B17C
+:10DAF000001E76B4FFE5C7386FC07738FFF0F72314
+:10DB000028000630000287320000241400407631DD
+:10DB1000001E7630FFE5C73867C07738FFF0F7237F
+:10DB200028008696FFB0F60642C8C6186000F702C5
+:10DB30000003C6B457C076B5FFF0C6B47400F70250
+:10DB40000004C7386A00F733280006300002F4B337
+:10DB500028008396FF8C8316FF74039C0014939611
+:10DB6000FF8C0318000C8396FFAC9316FF74039C84
+:10DB70000001E000D5EC9396FFAC9313FFFCF38417
+:10DB80004F5C000000019393FFFCF3064A98931347
+:10DB9000FFFC07880008E00126F89793FFFCF402D9
+:10DBA00000018796FFFC8296FFF802140004013CF6
+:10DBB0000000000000019293FFFC02900008221078
+:10DBC00001A0F5020000F3846E50F602001C202A2A
+:10DBD0000063EE00DC08C59C6000A69E6002772D05
+:10DBE000001E7738FFE5C6B477C076B5FFF0203663
+:10DBF0000003E600DBFC072C0036F03B2800063073
+:10DC00000040E000DBCC05280001F5844F5C0000FB
+:10DC1000000186AE0008F4020000872E0004000018
+:10DC20000001C0367200EC00DCF09696FFEC773510
+:10DC30000001C738680077390002C638580006303E
+:10DC4000000CC38400008316000086B20000871A0F
+:10DC5000000000000001C0367200E600DC7CC52038
+:10DC6000000086B20004871A000400000001C036DC
+:10DC70007200E600DC80202A0000F5020001202A64
+:10DC80000000E600DC8D00000001F38200008496B5
+:10DC9000000086B200008726000000000001C036A8
+:10DCA0007200E200DCCCF5020000C0367200E60033
+:10DCB000DCD4202A000086B200048726000400007D
+:10DCC0000001C0367200E200DCD5202A0000F50217
+:10DCD0000001202A0000E600DCE5201E0000F3829F
+:10DCE0000001201E0000E600DCF420220000F40207
+:10DCF000000120220000E600DD29F602000187165F
+:10DD0000FFEC0000000176B90001C6B4700076B5E2
+:10DD10000002C6B4580006B4001486B60000971678
+:10DD2000FFF0E000DD989696FFF427140014971397
+:10DD3000FFFC83160000000000019313FFFC959385
+:10DD4000FFFC9596FE7007880008E0012568979310
+:10DD5000FFFC8596FE7020220000E600DD95F602AD
+:10DD600000018716FFEC0000000176B90001C6B47F
+:10DD7000700076B50002C6B4580006B4001486B62A
+:10DD800000009716FFF09696FFF4972E0008E0002B
+:10DD9000DD9C20320000F602000020320000E60088
+:10DDA000DDB0F4820000F704427CE000E09CF6065F
+:10DDB000427E9496FF448716FFF4F6044F58773955
+:10DDC0000006C73070009716FF5406B8001A873651
+:10DDD00000008316FF5476B5001E76B4FFE5C73801
+:10DDE0006FC09313FFFC7738FFF077390006C63019
+:10DDF00070009616FF4C07880008E000CD0097934E
+:10DE0000FFFC20220000E600DE35F30200018496CC
+:10DE1000FF4C000000019493FFFC07880008E0001D
+:10DE2000CD009793FFFC20220000E600DE380000C2
+:10DE30000001F30200019316FF448496FF440000A2
+:10DE4000000120260000E600DE59F60642A4F70491
+:10DE500042A4E000E0A076B1001E8316FF4C8616B7
+:10DE6000FF4C871A00007699001E76B4FFE5C7388C
+:10DE70006FC07739FFF0203A0002E600DE8500002F
+:10DE80000001F6044F58F5844F5800000001C032DD
+:10DE90005A00E600E025000000018496FF4C0000D7
+:10DEA000000106A4001A873600008316FF5476B5D9
+:10DEB000001E76B4FFE5C7386FC07738FFF07739BA
+:10DEC0000006C72C7000C03A3200E600DEDDF60620
+:10DED0004280F7044280E000E0A076B1001E2614E4
+:10DEE0000030F03328008716FFD07631001E7630E0
+:10DEF000FFE58496FF4C2314002E9316FE6475995B
+:10DF0000001E75ACFFE57515001E7528FFE573153D
+:10DF1000001E7318FFE59316FF348316FE64042475
+:10DF2000000206A000027495001E74A4FFE59496FA
+:10DF3000FF3C7495001EC73867C07738FFF0F723A1
+:10DF40002800871A000074A4FFE59496FF2CC738B8
+:10DF50005FC07738FFF0F737280006B40002871655
+:10DF6000FFD42494002A9496FE647625001E763011
+:10DF7000FFE5C73857C07738FFF0F7372800872606
+:10DF8000000006B40002C73867C07738FFF0F737E3
+:10DF9000280006B400028716FFD823140026931623
+:10DFA000FE647619001E8496FF3C7630FFE5C73884
+:10DFB0004FC07738FFF0F7372800871A000006B403
+:10DFC00000028496FF34C73867C07738FFF0F73710
+:10DFD000280006B400028716FFDC231400229316E3
+:10DFE000FE647619001E7630FFE5C7384FC07738DB
+:10DFF000FFF0F7372800871A000006B40002C73880
+:10E0000067C07738FFF0F73728008716FFE08316E0
+:10E01000FF2C06B40002C73837C07738FFF0E000A5
+:10E02000EAA0F737280007880008E000CBCC9793D8
+:10E03000FFFC06A00002F7044F58F037280006A0A6
+:10E0400000149416FF24C72072007738FFFAF737C0
+:10E05000280006A00016F7372800F4820001F4A378
+:10E0600028009413FFFC07880008E000CD00979378
+:10E07000FFFC20220000E600E0BC26940048F704E4
+:10E080004280E000E09CF60642828696FEF4E000C4
+:10E09000E29400000001F7044284F606428476B15F
+:10E0A000001E76B4FFE5F4020000C7386FC0773970
+:10E0B000FFF007380001E000EAA4F73328008316D8
+:10E0C000FF4C7515001E7528FFE59316FF1C0718F9
+:10E0D0000036F4820001F4BB2800F03728008716D0
+:10E0E000FFB876B5001E76B4FFE5041800020620DE
+:10E0F0000002231400469316FF147599001E75AC98
+:10E10000FFE57495001E74A4FFE59496FF0C73154B
+:10E11000001E7318FFE59316FF047495001E74A487
+:10E12000FFE59496FEFC230000079316FEF4849608
+:10E13000FF1C8316FF1404A4000A9496FE7CC738C3
+:10E140006FC07738FFF0F7232800F6844F58849685
+:10E15000FF54871A0000C6A46A007434FFFAC73857
+:10E160005FC07738FFF0F7332800063000028716CB
+:10E17000FFBC231400429316FF147699001E76B458
+:10E18000FFE5C73857C07738FFF0F7332800871A04
+:10E19000000006300002C7386FC07738FFF0F73351
+:10E1A0002800063000028716FFC02494003E949693
+:10E1B000FF1476A5001E8316FF0C76B4FFE5C73862
+:10E1C00037C07738FFF0F733280087260000063085
+:10E1D0000002C7386FC07738FFF0F73328000630E9
+:10E1E00000028716FFC42494003A9496FF1476A583
+:10E1F000001E8316FF0476B4FFE5C73837C07738B2
+:10E20000FFF0F73328008726000006300002C738E9
+:10E210006FC07738FFF0F73328008716FFC8849661
+:10E22000FEFC06300002C7384FC07738FFF0F733E6
+:10E2300028008316FEF400000001201A0007EE00FB
+:10E24000E294F68200088496FE7C00000001072418
+:10E25000000E86BA00007739001E7738FFE5C6B495
+:10E2600077C076B5FFF0F70200FFC6B4740047210F
+:10E270000000C0367200470C0001203A0000E600A2
+:10E28000E08804A400029496FE7C03180001E000DC
+:10E29000E2309316FEF48316FF1C000000010718FD
+:10E2A0000038F6BB28009313FFFC8496FF2400007F
+:10E2B00000019493FFFC07880008E000D42C97939A
+:10E2C000FFFC231400789316FEBC849600002314F0
+:10E2D00000A886A60004872600009316FE9CC6B4FC
+:10E2E00070009696FEECF7020001C7347400971692
+:10E2F000FEE48496FF24000000019493FFFC07884D
+:10E300000008E000D4B49793FFFCF7044F580000D6
+:10E310000001C0227200E600EAA19416FF1C86A24A
+:10E3200000387721001E7738FFE5F30200009316CE
+:10E33000FED4C6B477C076B5FFF09696FEDC849620
+:10E34000FED4000000012026000EEE00E2F0F302F1
+:10E35000000F9313FFFC8316FEEC00000001C718AA
+:10E3600048009713FFFC07880008E00127E897930F
+:10E37000FFFCC3A000008496FEE4000000012026FC
+:10E380000000E600E38D239C0007C3803A00C71C11
+:10E3900038008316FF1CF48200FFF6044F58C7189C
+:10E3A00070000738002686BA00009716FEC4773939
+:10E3B000001E7738FFE5C6B477C076B5FFF0C6B467
+:10E3C0004C0076B50006C330680007300040C01A24
+:10E3D0007200E600E40D9316FECC9313FFFC9396B7
+:10E3E000FE749616FE6C9696FE6807880008E0009C
+:10E3F000CD009793FFFC8396FE748616FE6C86967E
+:10E40000FE6820220000E600E09500000001F5848F
+:10E410004F588496FECC072C0040C0267200E600C0
+:10E42000EA8D00000001A732680276A5001E76B4CE
+:10E43000FFE58616FECCC7386FC07739FFF0203A6B
+:10E440000002E600E451C0325A00C62C0000C0327F
+:10E450005A00E600E6E5251400768316FF1C849634
+:10E46000FEBC061800028732000076B1001E76B4AA
+:10E47000FFE58316FEDC0630000275B1001EC738CA
+:10E480006FC07738FFF0F72728008732000075AC9F
+:10E49000FFE5C7385FC07738FFF0F72B2800251459
+:10E4A0000074063000028732000076B1001E76B498
+:10E4B000FFE5C7386FC07738FFF0F72B2800251429
+:10E4C0000072063000028732000076B1001E76B47A
+:10E4D000FFE5C7386FC07738FFF0F72B2800251409
+:10E4E0000070063000028732000076B1001E76B45C
+:10E4F000FFE5C7386FC07738FFF0F72B28002514E9
+:10E50000006E063000028732000076B1001E76B43D
+:10E51000FFE5C7386FC07738FFF0F72B28002514C8
+:10E52000006C063000028732000076B1001E76B41F
+:10E53000FFE5C7386FC07738FFF0F72B28002514A8
+:10E54000006A063000028732000076B1001E76B401
+:10E55000FFE5C7386FC07738FFF0F72B280006308B
+:10E56000000287320000251400687631001E7630E4
+:10E57000FFE5C73867C07738FFF0F72B2800C71CC6
+:10E5800032009713FFFC9493FFFC2614006096134F
+:10E59000FFFC9616FE6C07880008E000D0DC97931D
+:10E5A000FFFC8716FFA08616FE6C8496FECC231413
+:10E5B000005E9316FE5C7599001E75ACFFE5741540
+:10E5C000001E7420FFE57315001E7318FFE59316F7
+:10E5D000FEAC8316FE5C7631001E7630FFE5052426
+:10E5E000000206A800027495001E74A4FFE594962C
+:10E5F000FEB47495001EC73867C07738FFF0F72B5C
+:10E600002800871A000074A4FFE59496FEA4C7387A
+:10E610005FC07738FFF0F737280006B4000287168E
+:10E62000FFA42494005A9496FE5C7625001E83165F
+:10E63000FEB47630FFE5C73837C07738FFF0F737DC
+:10E6400028008726000006B40002C73867C0773864
+:10E65000FFF0F737280006B400028716FFA82494BD
+:10E6600000569496FE5C7625001E7630FFE5C7388E
+:10E6700047C07738FFF0F73728008726000006B438
+:10E680000002C73867C07738FFF0F737280006B4B4
+:10E6900000028716FFAC231400529316FE5C761915
+:10E6A000001E8496FEAC7630FFE5C7384FC0773841
+:10E6B000FFF0F7372800871A000006B40002C738B9
+:10E6C00067C07738FFF0F73728008716FFB083164A
+:10E6D000FEA406B40002C73837C07738FFF0E00068
+:10E6E000EA8CF73728008496FECC0000000104A4D1
+:10E6F00000369496FE5C8726000076A5001E76B450
+:10E70000FFE5C7386FC07739FFF0203A0000470CAB
+:10E710000001203A0000E600EA8D000000018316A7
+:10E72000FECC8496FF1C0618003A85B20000072430
+:10E73000003A86BA00007631001E7630FFE5773960
+:10E74000001E7738FFE5C5AC67C0C6B477C075ADAD
+:10E75000FFF076B5FFF0C02E6A00EC00E764F5022A
+:10E760000002F50200018316FF1C000000010718DB
+:10E77000003686BA00007739001E7738FFE5C6B448
+:10E7800077C076B5FFF020360002E600E79C000077
+:10E790000001202A0001E600EA8D000000018496B5
+:10E7A000FE5C8316FF1CF52728000618000287323E
+:10E7B000000076B1001E76B4FFE5251400A684960D
+:10E7C000FE9C8316FEDC0630000275B1001EC738C1
+:10E7D0006FC07738FFF0F72728008732000075AC4C
+:10E7E000FFE5C7385FC07738FFF0F72B2800251406
+:10E7F00000A4063000028732000076B1001E76B415
+:10E80000FFE5C7386FC07738FFF0F72B28002514D5
+:10E8100000A2063000028732000076B1001E76B4F6
+:10E82000FFE5C7386FC07738FFF0F72B28002514B5
+:10E8300000A0063000028732000076B1001E76B4D8
+:10E84000FFE5C7386FC07738FFF0F72B2800251495
+:10E85000009E063000028732000076B1001E76B4BA
+:10E86000FFE5C7386FC07738FFF0F72B2800251475
+:10E87000009C063000028732000076B1001E76B49C
+:10E88000FFE5C7386FC07738FFF0F72B2800251455
+:10E89000009A063000028732000076B1001E76B47E
+:10E8A000FFE5C7386FC07738FFF0F72B2800063038
+:10E8B000000287320000251400987631001E763061
+:10E8C000FFE5C73867C07738FFF0F72B2800C71C73
+:10E8D00032009713FFFC9493FFFC261400909613CC
+:10E8E000FFFC9616FE6C07880008E000D0DC9793CA
+:10E8F000FFFC8716FF708616FE6C8496FECC239470
+:10E90000008E759D001E75ACFFE57315001E731813
+:10E91000FFE59316FE947415001E7420FFE5731531
+:10E92000001E7318FFE59316FE848316FE9476315D
+:10E93000001E7630FFE50524000206A8000274954B
+:10E94000001E74A4FFE59496FE8CC73867C0773824
+:10E95000FFF0F72B28008496FEC4871E0000752563
+:10E96000001EC7385FC07738FFF0F737280006B4BD
+:10E9700000028716FF742394008A761D001E7630ED
+:10E98000FFE58496FE8C7528FFE5C73837C07738D9
+:10E99000FFF0F7372800871E000006B40002831638
+:10E9A000FE84C73867C07738FFF0F737280006B411
+:10E9B00000028716FF7823940086761D001E7630AD
+:10E9C000FFE5C73847C07738FFF0F7372800871EC4
+:10E9D000000006B40002C73867C07738FFF0F73789
+:10E9E000280006B400028716FF7C23940082761D5F
+:10E9F000001E7630FFE5C7384FC07738FFF0F73795
+:10EA00002800871E000006B400028496FEC4C738A2
+:10EA100067C07738FFF0F73728008716FF8006B405
+:10EA20000002C73837C07738FFF0F737280087264D
+:10EA30000000F30200FFC73857C07738FFE8C6B8B8
+:10EA40003400F7020080C73474007739001077393A
+:10EA5000FFF0203A0000E600EA6127000100C6B49A
+:10EA600075808496FECC0000000107240038F6BBB8
+:10EA700028009493FFFC8316FF24000000019313E9
+:10EA8000FFFC07880008E000D42C9793FFFC8496D5
+:10EA9000FED40000000104A40001E000E33C9496D1
+:10EAA000FED4F40200018796FFFC8296FFF8021460
+:10EAB0000004013C0000000000019293FFFC029062
+:10EAC0000008861600088696000CF502FFFC859665
+:10EAD000000484160010F484E0000730000294B2B1
+:10EAE0000010F484E00406B4000394B20014F4842B
+:10EAF000E01CC6B4540094B20018F4820005F4B3CC
+:10EB00002800F4820001F4BB280027340008973263
+:10EB1000000486160000072C0003C7385400C6B84E
+:10EB200068009693FFFCC63072009613FFFCF70254
+:10EB30000003C5AC7400F7020004C7385A009713ED
+:10EB4000FFFC07880008C12000009793FFFC879610
+:10EB5000FFFC8296FFF802140014013C0000000044
+:10EB600000019293FFFC0290000822100018871603
+:10EB700000040000000183BA000084960000939610
+:10EB8000FFF0F3846E54873A00049396FFEC9716D7
+:10EB9000FFF49013FFFC271C00029713FFFC0724CF
+:10EBA00000209713FFFC9496FFE407880008E0001C
+:10EBB000CDB89793FFFC8496FFE4839600088726E0
+:10EBC00000188516FFECC03A3A00EE00EC7CF582A6
+:10EBD0000001872600188396000800000001C01E6F
+:10EBE0007200E600EC7CC584000086A60010871643
+:10EBF000FFF0F6020000C0367200E600EC1C0424B0
+:10EC0000001086A600148716FFF400000001C0362D
+:10EC10007200E600EC2020320000F60200012032F3
+:10EC20000000E600EC2D00000001F582000086A245
+:10EC300000008716FFF000000001C0367200E200FD
+:10EC4000EC68F6020000C0367200E600EC7020327C
+:10EC5000000086A200048716FFF400000001C03601
+:10EC60007200E200EC7120320000F6020001203256
+:10EC70000000E600EC81202E0000F5820001202E2D
+:10EC80000000E600ECACF7020001F704429CF60637
+:10EC9000429C76B1001E76B4FFE5C7386FC0773965
+:10ECA000FFF007380001F7332800F7020001972A28
+:10ECB000000883A6000C772CFFE193AA000C972A8A
+:10ECC000001C83A6001CF7046E5093AA002083BA90
+:10ECD0001DDCF682000093AA002C8396000CC5B4BC
+:10ECE000000093AA003083BA0010C634000093AA33
+:10ECF0000024873A001400000001972A00282036DB
+:10ED0000001FEE00ED1CC73050000738003495BAE4
+:10ED1000000006300004E000ECFC06B4000183961D
+:10ED2000001076A5001E9393FFFCF38200B493932A
+:10ED3000FFFC9513FFFC8726002076B4FFE5C7385B
+:10ED40006FC07739FFF09713FFFC8396FFEC00004C
+:10ED500000019393FFFC07880008E000EAB897934E
+:10ED6000FFFC8796FFFC8296FFF802140014013C1A
+:10ED70000000000000019293FFFC029000082210A6
+:10ED800000188716000400000001863A0000000009
+:10ED900000019616FFF0873A000400000001971664
+:10EDA000FFF4F6021DE09613FFFC8616000000003B
+:10EDB00000019613FFFCF6046E500000000196134C
+:10EDC000FFFC261400109616FFEC07880008E001EF
+:10EDD00026F89793FFFCF6846E50F6020000873603
+:10EDE0001DD89616FFE476B5001E76B4FFE5C73849
+:10EDF0006FC07738FFF0F68642C0F73728008616D6
+:10EE0000FFEC000000019613FFFC07880008E000FB
+:10EE1000DBB49793FFFC20220000E600EE4D0000DB
+:10EE200000018616FFEC000000019613FFFC078826
+:10EE30000008E000D5A09793FFFC20220000E60028
+:10EE4000EE4D00000001F60200019616FFE4841664
+:10EE5000FFE48796FFFC8296FFF802140008013C4D
+:10EE60000000000000019293FFFC029000088696CB
+:10EE70000004861600008736000885960008203AB0
+:10EE80000000E600EE99203A0003E600EEE9F40205
+:10EE90000000E000EF0C0000000177B0001F703EA2
+:10EEA000FFE1E600EF0DF4020000851600140000FB
+:10EEB00000019513FFFC851600100000000195135A
+:10EEC000FFFC8516000C000000019513FFFC9593D4
+:10EED000FFFC9693FFFC07880008E000EB60979327
+:10EEE000FFFCE000EF0C0000000177B0001E703E58
+:10EEF000FFE1E600EF0D000000019593FFFC969303
+:10EF0000FFFC07880008E000ED749793FFFC8796EC
+:10EF1000FFFC8296FFF802140018013C000000007C
+:10EF200000019293FFFC0290000822100018F48266
+:10EF3000000086960000F6044AA023940010843650
+:10EF400000009616FFE4F7044A9C9416FFF08536FD
+:10EF50000004C0327200EC00F0149516FFF4773113
+:10EF60000001C738600077390002F3064A98C6B836
+:10EF7000300006B4000CC584000087360000000095
+:10EF80000001C03A4200E600EFA4C6240000873624
+:10EF9000000400000001C03A5200E600EFA8203251
+:10EFA0000000F602000120320000E600EFB500008C
+:10EFB0000001F5820000863600008716FFF0000091
+:10EFC0000001C0327200E200EFF0F5020000C03232
+:10EFD0007200E600EFF8202A000086B600048716CB
+:10EFE000FFF400000001C0367200E200EFF9202AB1
+:10EFF0000000F5020001202A0000E600F009202EA2
+:10F000000000F5820001202E0000E600F018202606
+:10F010000000F482000120260000E600F04DF60218
+:10F0200000018716FFE4F3064A9876B90001C6B4DA
+:10F03000700076B50002C6B4300006B4001486B67F
+:10F0400000009716FFE8E000F0B09696FFEC27145A
+:10F05000001C9713FFFC9393FFFCF3064A9893134D
+:10F06000FFFC07880008E00125689793FFFC202239
+:10F070000000E600F0ADF60200018716FFE4F3069B
+:10F080004A9876B90001C6B4700076B50002C6B4DD
+:10F09000300006B4001486B600009716FFE8969676
+:10F0A000FFECF7054AA0E000F0B420320000F602C1
+:10F0B000000020320000E600F121F4020001871672
+:10F0C000FFE8F60642C876B90002C6B4700076B50D
+:10F0D0000002A736600283160004C6B460007635CD
+:10F0E000001E7630FFE50534000275A9001EC73802
+:10F0F00067C07738FFF0971A0000872A000075ACC8
+:10F10000FFE583160008C7385FC07738FFF0971A0D
+:10F1100000008316000C06B40004E000F124969A67
+:10F120000000F40200008796FFFC8296FFF80214AC
+:10F130000010013C0000000000010000B9000000C8
+:10F14000BA000000BB000000BC000000BD000000D1
+:10F15000BE000000BF000000800000008100000031
+:10F160008200000083000000840000008500000091
+:10F17000860000008700B9B9B9BAB9BBB9BCB9BD3E
+:10F18000B9BEB9BFB980B981B982B983B984B9852B
+:10F19000B986B987BAB9BABABABBBABCBABDBABE2F
+:10F1A000BABFBA80BA81BA82BA83BA84BA85BA863B
+:10F1B000BA87BBB9BBBABBBBBBBCBBBDBBBEBBBFCD
+:10F1C000BB80BB81BB82BB83BB84BB85BB86BB874B
+:10F1D000BCB9BCBABCBBBCBCBCBDBCBEBCBFBC80AB
+:10F1E000BC81BC82BC83BC84BC85BC86BC87BDB9E9
+:10F1F000BDBABDBBBDBCBDBDBDBEBDBFBD80BD81BB
+:10F20000BD82BD83BD84BD85BD86BD87BEB9BEBA86
+:10F21000BEBBBEBCBEBDBEBEBEBFBE80BE81BE82CA
+:10F22000BE83BE84BE85BE86BE87BFB9BFBABFBB24
+:10F23000BFBCBFBDBFBEBFBFBF80BF81BF82BF83DA
+:10F24000BF84BF85BF86BF8780B980BA80BB80BCC2
+:10F2500080BD80BE80BF80808081808280838084EA
+:10F2600080858086808781B981BA81BB81BC81BD60
+:10F2700081BE81BF818081818182818381848185FA
+:10F280008186818782B982BA82BB82BC82BD82BEFE
+:10F2900082BF82808281828282838284828582860A
+:10F2A000828783B983BA83BB83BC83BD83BE83BF9C
+:10F2B000838083818382838383848385838683871A
+:10F2C00084B984BA84BB84BC84BD84BE84BF84807A
+:10F2D000848184828483848484858486848785B9B8
+:10F2E00085BA85BB85BC85BD85BE85BF858085818A
+:10F2F00085828583858485858586858786B986BA56
+:10F3000086BB86BC86BD86BE86BF86808681868299
+:10F310008683868486858686868787B987BA87BBF3
+:10F3200087BC87BD87BE87BF8780878187828783A9
+:10F33000878487858786878700009293FFFC0290E9
+:10F34000000822100018F70475EC00000001203AB4
+:10F350000000E600F37DF6064296F704429476B18B
+:10F36000001E76B4FFE5F4020000C7386FC077399D
+:10F37000FFF007380001E000F5E0F7332800F384E0
+:10F380006F309013FFFC271C00029713FFFC8316BD
+:10F390000000000000019313FFFC9396FFEC078828
+:10F3A0000008E000CDB89793FFFC8396FFECF702CE
+:10F3B0000000971E00088316000400000001931E41
+:10F3C000000C83160008049C0022931E001C831668
+:10F3D000000C9396FFF4871A00007699001E76B40D
+:10F3E000FFE50618000275B1001E75ACFFE5C738D1
+:10F3F0006FC07738FFF0069C0020F737280087326F
+:10F4000000009696FFE47535001EC7385FC0773858
+:10F41000FFF0F7272800049C002406300002873202
+:10F42000000076B1001E76B4FFE5C7386FC07738AC
+:10F43000FFF0F7272800049C0026063000028732E0
+:10F44000000076B1001E76B4FFE5C7386FC077388C
+:10F45000FFF0F7272800049C0028063000028732BE
+:10F46000000076B1001E76B4FFE5C7386FC077386C
+:10F47000FFF0F7272800049C002A0630000287329C
+:10F48000000076B1001E76B4FFE5C7386FC077384C
+:10F49000FFF0F7272800049C002C0630000287327A
+:10F4A000000076B1001E76B4FFE5C7386FC077382C
+:10F4B000FFF0F7272800049C002E06300002873258
+:10F4C000000076B1001E76B4FFE5C7386FC077380C
+:10F4D000FFF0F72728000630000287320000049C66
+:10F4E00000307631001E7630FFE5C73867C07738C8
+:10F4F000FFF0F7272800871E00207528FFE5C73892
+:10F5000057C07739FFF0203A0008EE00F598F3066F
+:10F5100014D88316FFE4871E00207699001E76B467
+:10F52000FFE5C7386FC07739FFF025B80001C4ACDC
+:10F53000580004240001202E0000EC00F595F5028F
+:10F5400000008316FFE40000000106180002A73245
+:10F550005802C6B0580076B5001E76B4FFE5C7382D
+:10F560006FC07739FFE8C6B0400077B80018703E2A
+:10F57000FFE1E600F57DF7376800F502FFFFC730D1
+:10F580004800F53B680024A4000224200002E000AB
+:10F59000F53425AC0001F30614D89313FFFCF302F5
+:10F5A00000349313FFFC8316FFF400000001931353
+:10F5B000FFFC8316000000000001871A0000769906
+:10F5C000001E76B4FFE5C7386FC07739FFF0971398
+:10F5D000FFFC9393FFFC07880008E000EAB89793CC
+:10F5E000FFFC8796FFFC8296FFF802140010013C96
+:10F5F0000000000000019293FFFC0290000822101E
+:10F600000010F70475EC00000001203A0000E6004D
+:10F61000F639F6064296F704429476B1001E76B4A7
+:10F62000FFE5F4020000C7386FC07739FFF00738F4
+:10F630000001E000F748F7332800F5046F300000C0
+:10F6400000019516FFF49013FFFC27280002971382
+:10F65000FFFC85960004000000019593FFFC0788DD
+:10F660000008E000CDB89793FFFC85160004F60271
+:10F67000000086AA00007729001E7738FFE5C6B48F
+:10F6800077C076B5FFF0F7020001C0367400E600DF
+:10F69000F6999696FFECC63800009613FFFC859607
+:10F6A000FFEC8516FFF4472CFFFE07380002C72841
+:10F6B00072009713FFFC85960000000000019593EF
+:10F6C000FFFC07880008E000CDB89793FFFC851683
+:10F6D000FFF4F7020002972A000885960008000050
+:10F6E000000195AA000C8596000C0000000195AA67
+:10F6F000001CF50614D89513FFFCF58200209593A5
+:10F70000FFFC8516FFF4000000019513FFFC8596B1
+:10F7100000008516FFEC872E000076AD001E76B443
+:10F72000FFE5C7386FC07739FFF0C738500097132F
+:10F73000FFFC8596FFF4000000019593FFFC07880D
+:10F740000008E000EAB89793FFFC8796FFFC8296DA
+:10F75000FFF802140010013C000000000001929329
+:10F76000FFFC0290000885960000851600048716AD
+:10F770000008F602FFFC06A80003C6B464000738C0
+:10F780000003C7386400C73470009713FFFCC5AC92
+:10F790006A009593FFFCF7020003C5287400F70286
+:10F7A0000004C73852009713FFFC07880008E001E7
+:10F7B00014D89793FFFC8796FFFC8296FFF80214FB
+:10F7C0000010013C0000000000019293FFFC029039
+:10F7D000000822100010F70475EC00000001203A28
+:10F7E0000000E600F80DF6064296F704429476B162
+:10F7F000001E76B4FFE5F4020000C7386FC0773909
+:10F80000FFF007380001E000F920F7332800F50485
+:10F810006F30000000019516FFF49013FFFC2728BD
+:10F8200000029713FFFC85960004000000019593E9
+:10F83000FFFC07880008E000CDB89793FFFC851611
+:10F840000004F602000086AA00007729001E77381F
+:10F85000FFE5C6B477C076B5FFF0F7020001C03609
+:10F860007400E600F86D9696FFECC638000096131B
+:10F87000FFFC8596FFEC8516FFF4472CFFFE07384A
+:10F880000002C72872009713FFFC85960000000055
+:10F8900000019593FFFC07880008E000CDB897931E
+:10F8A000FFFC8516FFF4F5820006F5AB280085966F
+:10F8B00000080728000295AA00040514000E852AF6
+:10F8C000000077A9001E77BCFFE5C5287FC0752919
+:10F8D000FFF0F53B2800F58614D89593FFFCF50260
+:10F8E00000089513FFFC859600008516FFEC872E17
+:10F8F000000076AD001E76B4FFE5C7386FC07739DB
+:10F90000FFF0C73850009713FFFC8596FFF4000006
+:10F9100000019593FFFC07880008E000F75C9793CF
+:10F92000FFFC8796FFFC8296FFF802140010013C52
+:10F930000000000000019293FFFC029000082210DA
+:10F940000008F70475EC83960004203A0000E600F6
+:10F95000FA64F6064296F5046F309013FFFC2728F0
+:10F9600000029713FFFC83160000000000019313B0
+:10F97000FFFC9396FFF49516FFF007880008E0005F
+:10F98000CDB89793FFFC8516FFF0F302000783962E
+:10F99000FFF4F32B280007280002F3020001F33BD9
+:10F9A0002800871E0000769D001E76B4FFE5059CAA
+:10F9B0000002762D001E7630FFE5749D001E74A4B3
+:10F9C000FFE5041C000683160000C7386FC07738B7
+:10F9D000FFF006A80004F7372800872E000006A8CD
+:10F9E000000675A1001EC73867C07738FFF0F737EB
+:10F9F0002800871E000475ACFFE506A800087619EC
+:10FA0000001EC7384FC07738FFF0F737280087222D
+:10FA1000000006A8000AC7385FC07738FFF0F73744
+:10FA20002800F30614D89313FFFCF302000C931381
+:10FA3000FFFC8316000000000001871A00007630EA
+:10FA4000FFE5C73867C07739FFF09713FFFC9513C0
+:10FA5000FFFC07880008E000F75C9793FFFCE000DC
+:10FA6000FA8400000001F704429476B1001E76B4D7
+:10FA7000FFE5F4020000C7386FC07739FFF00738A0
+:10FA80000001F73328008796FFFC8296FFF80214E6
+:10FA90000008013C0000000000019293FFFC02906E
+:10FAA000000822100048F70475EC85960000203A03
+:10FAB0000000E600FD98F606429605AC0002872E8F
+:10FAC000000076AD001E76B4FFE52414001E062C5F
+:10FAD00000027531001E249400207528FFE5F38490
+:10FAE0006E50C7386FC07738FFF0F727280087328D
+:10FAF00000009396FFC4C73857C07738FFF0F7234C
+:10FB000028002414001C063000028732000076B161
+:10FB1000001E76B4FFE5C7386FC07738FFF0F723D3
+:10FB200028002414001A063000028732000076B143
+:10FB3000001E76B4FFE5C7386FC07738FFF0F723B3
+:10FB4000280024140018063000028732000076B125
+:10FB5000001E76B4FFE5C7386FC07738FFF0F72393
+:10FB6000280024140016063000028732000076B107
+:10FB7000001E76B4FFE5C7386FC07738FFF0F72373
+:10FB8000280024140014063000028732000076B1E9
+:10FB9000001E76B4FFE5C7386FC07738FFF0F72353
+:10FBA000280024140012063000028732000076B1CB
+:10FBB000001E76B4FFE5C7386FC07738FFF0F72333
+:10FBC000280006300002873200002414001076312D
+:10FBD000001E7630FFE5C73867C07738FFF0F7239F
+:10FBE00028009013FFFC271C00029713FFFC94933E
+:10FBF000FFFC9596FFBC07880008E000CDB89793FE
+:10FC0000FFFC8596FFBC231400362494003873A5AE
+:10FC1000001E739CFFE5F40442C0F68642C076B530
+:10FC2000001E76B4FFE5872E0000762D001E76308C
+:10FC3000FFE5C4206FC07420FFF005AC0002752DF5
+:10FC4000001E7528FFE5C73867C07738FFF0F72733
+:10FC50002800872E0000F6046E50C73857C077384A
+:10FC6000FFF0F71B28002314003405AC0002872E98
+:10FC7000000076AD001E76B4FFE5C7386FC0773858
+:10FC8000FFF0F71B28002314003205AC0002872E7A
+:10FC9000000076AD001E76B4FFE5C7386FC0773838
+:10FCA000FFF0F71B28002314003005AC0002872E5C
+:10FCB000000076AD001E76B4FFE5C7386FC0773818
+:10FCC000FFF0F71B28002314002E05AC0002872E3E
+:10FCD000000076AD001E76B4FFE5C7386FC07738F8
+:10FCE000FFF0F71B28002314002C05AC0002872E20
+:10FCF000000076AD001E76B4FFE5C7386FC07738D8
+:10FD0000FFF0F71B28002314002A05AC0002872E01
+:10FD1000000076AD001E76B4FFE5C7386FC07738B7
+:10FD2000FFF0F71B280005AC0002872E000023140B
+:10FD3000002875AD001E75ACFFE5C7385FC0773889
+:10FD4000FFF0F71B28008716FFC8F6820003C738AC
+:10FD50003FC096B2000806B01DD8F4372800F386DD
+:10FD600014D89393FFFCF3821DE09393FFFC96134A
+:10FD7000FFFC7739FFF09713FFFC8396FFC4000068
+:10FD800000019393FFFC07880008E000EAB897930E
+:10FD9000FFFCE000FDB800000001F704429476B1DA
+:10FDA000001E76B4FFE5F4020000C7386FC0773953
+:10FDB000FFF007380001F73328008796FFFC829692
+:10FDC000FFF802140004013C0000000000019293BF
+:10FDD000FFFC029000088616000000000001873238
+:10FDE000000076B1001E76B4FFE5C7386FC07739E2
+:10FDF000FFF0203A0006E600FE21F582001EF7041F
+:10FE000042A8F60642A876B1001E76B4FFE5C738D0
+:10FE10006FC07739FFF007380001E000FE34F73398
+:10FE20002800F6056F349593FFFC07880008E00072
+:10FE300015849793FFFC8796FFFC8296FFF80214C7
+:10FE40000004013C0000000000019293FFFC0290BE
+:10FE5000000886160000859600048732000076B1FF
+:10FE6000001E76B4FFE5C7386FC07739FFF0203A3F
+:10FE70000007E600FE9DF4020000F70442A8F60623
+:10FE800042AA76B1001E76B4FFE5C7386FC0773955
+:10FE9000FFF007380001E000FF1CF73328000730AF
+:10FEA000000286BA00007739001E7738FFE5C6B435
+:10FEB00077C076B5FFF020360001E600FED5F605E6
+:10FEC0006F3420360002E600FEE5F5020020E00077
+:10FED000FEFCF60642AC202E000CE600FF1CF402ED
+:10FEE0000000F502001F9513FFFC07880008E000E2
+:10FEF00015849793FFFCE000FF1CF4020001F70457
+:10FF000042AC76B1001E76B4FFE5C7386FC07739D2
+:10FF1000FFF007380001F7332800F402000187964C
+:10FF2000FFFC8296FFF802140008013C000000006C
+:10FF300000019293FFFC02900008869600000000EA
+:10FF4000000187360004F6020000073800089736E3
+:10FF500000048736000800000001203A0000EC0091
+:10FF6000FF7DF6856F348736000800000001203AD7
+:10FF70000003EE00FF8020320000F6020001203274
+:10FF80000000E600FFBDF60642AEF7046F34000045
+:10FF90000001873A0008F682FFEC77390002A73AA1
+:10FFA0006802000000019713FFFC07880008E000CA
+:10FFB00015849793FFFCE000FFD800000001F704D0
+:10FFC00042AC76B1001E76B4FFE5C7386FC0773912
+:10FFD000FFF007380001F73328008796FFFC829670
+:10FFE000FFF802140004013C0000000000010000C2
+:10FFF00000170000001A0000001D0000001800009B
+:020000021000EC
+:10000000000056657273696F6E537472696E673A59
+:10001000206D63702D6C34763320332E303863209E
+:1000200044656320313120313939362031333A305B
+:10003000363A313600009293FFFC02900008F70434
+:10004000E00CFF0200009702FF84F7060C3ECFFC95
+:100050007580F60200029602FF8C9002FF88F7047A
+:10006000E02000000001203A0000E6010074F68262
+:100070000000F68200039682FF988796FFFC829626
+:10008000FFF802140000013C000000000001929300
+:10009000FFFC029000082210000CF5021494F505F4
+:1000A0007B00F50EF014F5057B08F706E000F686F8
+:1000B0007B68C7386A00F7057AF0F502004CF682D3
+:1000C000000020360002EE010124F5057AF8C5B4DF
+:1000D0000000C6340000F706E030C72C7000F506BB
+:1000E0006F44B73250029013FFFC9713FFFC9596B4
+:1000F000FFF49616FFF09696FFEC07880008E001E3
+:10010000031C9793FFFC8596FFF48616FFF08696F6
+:10011000FFEC05AC149406B4000120360002EE0199
+:1001200000D506300004F5020022F5056F58F005F1
+:100130006F54F0056F50F0052D408796FFFC8296B6
+:10014000FFF802140000013C00000000000192933F
+:10015000FFFC0290000807880008E00129589793E7
+:10016000FFFCF7020003F705E008F7047AD8F6026F
+:1001700000019602FF94203A0000E6010191F70683
+:100180007AE807880008E00103DC9793FFFCF70694
+:100190007AE8F6020005F63B2800F7067AE0868248
+:1001A000FF44F602000320360000E60101C9F63BD9
+:1001B0002800F7046F648682FF4407380001203668
+:1001C0000000E60101B0F7056F6407880008E00150
+:1001D00000349793FFFC07880008E001008C979398
+:1001E000FFFC07880008E00044289793FFFC07887D
+:1001F0000008E00016F09793FFFC07880008E00174
+:100200000C609793FFFC07880008E00104089793AF
+:10021000FFFC07880008E00000209793FFFC078898
+:100220000008E0000BD89793FFFC07880008E00166
+:100230001D689793FFFC07880008E0011E50979304
+:10024000FFFC07880008E0005F689793FFFC0788C1
+:100250000008E0006DEC9793FFFC07880008E001C0
+:1002600021D09793FFFC07880008E001222C979388
+:10027000FFFC9002FF9407880008E0000BFC9793B6
+:10028000FFFCF40200008796FFFC8296FFF8021440
+:100290000000013C0000000000019293FFFC02906E
+:1002A000000822100008F6020000C5B0000020324D
+:1002B0000002EE010308F5066F44A6AE50020000EE
+:1002C00000018736000000000001203A0001E6012D
+:1002D00002FCF50200029513FFFC9693FFFC959635
+:1002E000FFF49616FFF007880008E001031C9793BF
+:1002F000FFFC8616FFF08596FFF40000000105ACB8
+:100300000004E00102AC063000018796FFFC8296F3
+:10031000FFF802140000013C00000000000192936D
+:10032000FFFC0290000887160000F6020000F6822B
+:100330000008963A0008963A000C963A09D8963A80
+:1003400009DC963A0EF4963A0EF896BA1420963ACC
+:10035000142490BA148C8696000490BA149096BA1D
+:100360000000963A00048796FFFC8296FFF802147C
+:100370000008013C0000000000019293FFFC029085
+:100380000008859600008716000886160004773856
+:10039000FFFFC5307000C0325200E40103C9000005
+:1003A0000001872E000076AD001E76B4FFE5C73849
+:1003B0006FC07738FFF0F733280006300002C032F4
+:1003C0005200E40103A005AC00028796FFFC829670
+:1003D000FFF80214000C013C0000000000019293A1
+:1003E000FFFC02900008F7020001E00103E8F705B6
+:1003F0007AD88796FFFC8296FFF802140000013C31
+:10040000000000000001000000009293FFFC029039
+:100410000008F502000AF50571CCF00571D4F0056D
+:1004200071D0F00571C4F5020001F682000020369B
+:10043000000AEC010464F50571C8F58A1E00F60691
+:1004400071C4472CFFFC973200180630000406B434
+:100450000001F70471CC00000001C0367200EC010D
+:10046000044105AC214CF0057198F5066F689513B1
+:10047000FFFCF5067B189513FFFC07880008E000D9
+:1004800015489793FFFCF50605D49513FFFCF782FA
+:1004900000059793FFFCF5066F689513FFFC07882E
+:1004A0000008E000161C9793FFFCF5060B709513EF
+:1004B000FFFCF78200069793FFFCF5066F68951323
+:1004C000FFFC07880008E000161C9793FFFCF50668
+:1004D0000BA09513FFFCF78200059793FFFCF50630
+:1004E00070809513FFFC07880008E000161C9793A6
+:1004F000FFFCF5060B709513FFFCF782000697933F
+:10050000FFFCF50670809513FFFC07880008E000EB
+:10051000161C9793FFFCF50605589513FFFCF50292
+:10052000000A9513FFFCF506710C9513FFFC078874
+:100530000008E000161C9793FFFC07880008E00104
+:1005400005589793FFFC8796FFFC8296FFF80214EC
+:100550000000013C0000000000019293FFFC0290AB
+:100560000008F70471C400000001203A0000E60111
+:10057000057DF68671C4E0010594F7020000F704DA
+:1005800071D00000000177390002C7386800873A4F
+:10059000001800000001203A0000E60105ACF70554
+:1005A0007B10F606710CE00105C0F6057B18F60617
+:1005B0006F68F6057B189702FF48073821289702D5
+:1005C000FF4C8796FFFC8296FFF802140000013C66
+:1005D0000000000000019293FFFC0290000822102E
+:1005E00000108682FF48F4866F68F4857B18F50456
+:1005F0007B1026B4000285B60000872A0000762909
+:10060000001E7630FFE576B5001E76B4FFE5C5AC7A
+:100610006FC0C73867C07739FFF077B80010703EF9
+:10062000FFE1E601064575ACFFF0F70471AC000090
+:10063000000107380001F70571ACF70471ACE00167
+:1006400008C4F7020001772CFFF8203A0000E60109
+:10065000067176A9001EF70471A800000001073892
+:100660000001F70571A8F70471A8E00108C4F702BA
+:100670000001872A000076B4FFE5C7386FC07739DC
+:10068000FFF027380004203A0003E20108A400002C
+:10069000000177390002F68606A4A6B670020000B3
+:1006A0000001C1340000000106B40001077C000114
+:1006B00007EC00010844872A0004C4840000C03A03
+:1006C0004A00E60106D8000000018702FF4800004A
+:1006D0000001C7385200972A0004872A000400004E
+:1006E0000001203A2100EE01073CF602000086AA34
+:1006F00000048702FF4800000001C7385200273875
+:100700000028C0367200E601073C0000000177FCBB
+:10071000001D703EFFE1E601073C0000000177FC90
+:100720000017703EFFE1E601073D0000000177FC85
+:100730000016703EFFE1E601074420320000F60299
+:10074000000120320000E601088800000001872A2D
+:10075000001800000001203A0002EE0108C100006C
+:100760000001F70471A40000000107380001F7053B
+:1007700071A4F70471A4E00108C4F7020001872AFC
+:10078000000400000001203A2100EE0107E0F6021B
+:10079000000086AA00048702FF4800000001C73855
+:1007A00052002738000CC0367200E60107E0000056
+:1007B000000177FC001D703EFFE1E60107E000004C
+:1007C000000177FC0017703EFFE1E60107E1000041
+:1007D000000177FC0016703EFFE1E6010880203240
+:1007E0000000F6020001E0010880203200008702CC
+:1007F000FF4800000001C738520027380004203AA3
+:100800000008E6010838F682000077FC001D703E03
+:10081000FFE1E60108380000000177FC0017703E98
+:10082000FFE1E60108390000000177FC0016703E88
+:10083000FFE1E601088020360000F6820001E001B9
+:10084000088020360000F702000077FC001D703E93
+:10085000FFE1E60108780000000177FC0017703E18
+:10086000FFE1E60108790000000177FC0016703E08
+:10087000FFE1E6010880203A0000F7020001203A7B
+:100880000000E60108C100000001F70471A00000AB
+:10089000000107380001F70571A0F70471A0E0011D
+:1008A00008C4F7020001F704719C0000000107383A
+:1008B0000001F705719CF704719CE00108C4F70280
+:1008C0000001F7020000203A0000E601096800007C
+:1008D0000001F6847B10000000018736000076B529
+:1008E000001E76B4FFE5C7386FC07739FFF02738B0
+:1008F0000004203A0003E2010B5077390002F6862B
+:10090000090CA6B6700200000001C134000000010D
+:10091000091C00010AE000010AAC00010B14F704F5
+:1009200071D0F60471CC06B80001C0366200E60151
+:100930000938C7340000F7020000F58471D40000C4
+:100940000001C03A5A00470C0001203A0000E601BD
+:10095000098500000001F70471B0000000010738AC
+:100960000001F70571B0F70471B0F70471B400002D
+:10097000000107380001F70571B4F70471B4E00114
+:100980000B5000000001F48471C8F68571D0949674
+:10099000FFF4F4847B10C0366200E60109A494964B
+:1009A000FFECF00571D0F70471D0F00571C88496A2
+:1009B000FFECC03A5A00470C0001F70571C48726C6
+:1009C000000800000001703AFFE1E60109E10000C3
+:1009D0000001F70471980000000107380001F705D5
+:1009E00071988496FFF40000000120260000E601C3
+:1009F0000A710000000107880008E001055897937C
+:100A0000FFFCF602000920320014E6010A4D27001F
+:100A1000000C203A0001E2010A4DF7062DCCF684C5
+:100A20002ECC0000000175B50002B62E700206B48F
+:100A30000001F6852ECC8602FF34F7062E4C2036B8
+:100A4000001FE2010A4DB62E7002F0052ECCF7040D
+:100A50002D6800000001873A000000000001873A7D
+:100A600000280000000107880008C13800009793A3
+:100A7000FFFCF70471BC8496FFEC07380001F70512
+:100A800071BCF70471BC86A600048496FFF4F704D9
+:100A900071B820260000C7386800F70571B8E60174
+:100AA0000B5100000001E0010B5C00000001F704A5
+:100AB00071C00000000107380001F70571C0F7049C
+:100AC00071C0F4847B10000000019493FFFC078840
+:100AD0000008E000FDCC9793FFFCE0010B50000004
+:100AE0000001F70471C00000000107380001F7059C
+:100AF00071C0F70471C0F4847B100000000194936E
+:100B0000FFFC07880008E000FF309793FFFCE0013E
+:100B10000B5000000001F70471C00000000107380D
+:100B20000001F70571C0F70471C0F6847B108702DD
+:100B3000FF4800000001C7386A00273800049713F7
+:100B4000FFFC9693FFFC07880008E000FE4897939F
+:100B5000FFFC07880008E00105589793FFFC879683
+:100B6000FFFC8296FFF802140000013C0000000028
+:100B700000019293FFFC02900008F7067080F705D1
+:100B80007B1807880008E00105589793FFFC8796BB
+:100B9000FFFC8296FFF802140000013C00000000F8
+:100BA00000019293FFFC02900008F7066F68F705BA
+:100BB0007B1807880008E00105589793FFFC87968B
+:100BC000FFFC8296FFF802140000013C00000000C8
+:100BD00000019293FFFC02900008F7067B18971320
+:100BE000FFFCF7066F689713FFFC07880008E0001A
+:100BF00014F49793FFFCF7067B189713FFFCF70696
+:100C00006FF49713FFFC07880008E00014F4979333
+:100C1000FFFCF7067B189713FFFCF706708097130D
+:100C2000FFFC07880008E00014F49793FFFCF70628
+:100C30007B189713FFFCF706710C9713FFFC0788CE
+:100C40000008E00014F49793FFFC8796FFFC82965F
+:100C5000FFF802140000013C000000000001000049
+:100C600000009293FFFC02900008F5020004F505D5
+:100C70007600F0057608F0057604F00575F8F502C3
+:100C80000001F682000020360004EC010CBCF505E2
+:100C900075FCF58E6AF8F60675F8472CFFFC97325E
+:100CA00000180630000406B40001F70476000000C6
+:100CB0000001C0367200EC010C9905AC214CF50620
+:100CC00072189513FFFCF50676489513FFFC07880C
+:100CD0000008E00015489793FFFCF5060DF4951306
+:100CE000FFFCF782000E9793FFFCF5067218951330
+:100CF000FFFC07880008E000161C9793FFFCF50630
+:100D00000DF49513FFFCF782000E9793FFFCF50698
+:100D100072A49513FFFC07880008E000161C979347
+:100D2000FFFCF506132C9513FFFCF7820001979347
+:100D3000FFFCF50673309513FFFC07880008E00000
+:100D4000161C9793FFFCF50616C89513FFFCF78257
+:100D500000019793FFFCF50673BC9513FFFC078811
+:100D60000008E000161C9793FFFCF5061800951389
+:100D7000FFFCF78200109793FFFCF506744895136B
+:100D8000FFFC07880008E000161C9793FFFCF5069F
+:100D900016409513FFFCF78200109793FFFCF506B1
+:100DA00074D49513FFFC07880008E000161C979385
+:100DB000FFFCF506132C9513FFFCF50200129513AA
+:100DC000FFFCF50675609513FFFC07880008E0003E
+:100DD000161C9793FFFCF00575F0F00575ECF00517
+:100DE00075F48796FFFC8296FFF802140000013C20
+:100DF0000000000000019293FFFC02900008221006
+:100E00000038F70475EC00000001203A0000E6010C
+:100E10000E2800000001F70475F000000001203AE0
+:100E20000000E6010E3D0000000107880008E00117
+:100E300015D09793FFFCE001131800000001F704A0
+:100E400075FC00000001203A0000E6010E59F6860C
+:100E500075F8E0010E6CF6820000F70476080000D9
+:100E6000000177390002C738680086BA0018F70415
+:100E700076FC00000001203A0000E6010E90F685A5
+:100E80007660F3067648F30576FCE0010EA4F702DF
+:100E90000001F3020010F30576F8F3067648F30537
+:100EA0007700F7020000203A0000E6011315F30670
+:100EB0007448F70475EC00000001203A0000E601D8
+:100EC0000ED800000001F70475F000000001203A80
+:100ED0000000E6010EED0000000107880008E001B7
+:100EE00016409793FFFCE001131800000001F68400
+:100EF0007660000000018736000800000001703AAB
+:100F0000FFE1E6010F21F48200009693FFFC0788C1
+:100F10000008E00000BC9793FFFCE0011314F30607
+:100F20007560C3B40000841E0010F6844AA0231428
+:100F300000209316FFC49416FFE09696FFD4851EFA
+:100F40000014F7044A9C00000001C0367200EC0156
+:100F5000100C9516FFE477350001C7386800773923
+:100F60000002F3064A98C6B8300006B4000CC584E7
+:100F700000008736000000000001C03A4200E60190
+:100F80000F9CC62400008736000400000001C03A10
+:100F90005200E6010FA020320000F60200012032CC
+:100FA0000000E6010FAD00000001F582000086366A
+:100FB00000008716FFE000000001C0327200E2016D
+:100FC0000FE8F5020000C0327200E6010FF0202A9F
+:100FD000000086B600048716FFE400000001C0365A
+:100FE0007200E2010FF1202A0000F5020001202A20
+:100FF0000000E6011001202E0000F5820001202EE5
+:101000000000E601101020260000F48200012026D6
+:101010000000E6011045F60200018716FFD4F30632
+:101020004A9876B90001C6B4700076B50002C6B41D
+:10103000300006B4001486B600009716FFD8E00111
+:1010400010B89696FFDC2714002C9713FFFC83162C
+:10105000FFC4000000019313FFFCF3064A989313AA
+:10106000FFFC9396FFCC07880008E0012568979362
+:10107000FFFC8396FFCC20220000E60110B5F602AB
+:1010800000018716FFD4F3064A9876B90001C6B46A
+:10109000700076B50002C6B4300006B4001486B6FF
+:1010A00000009716FFD89696FFDCF7054AA0E001EE
+:1010B00010BC20320000F602000020320000E601E1
+:1010C00010CCF4820001E0011124F4820000869625
+:1010D000FFD80000000177350002C7386800773973
+:1010E0000002F68642C8A63A6802C7386800753919
+:1010F000001E7528FFE505B8000286AE000007381F
+:1011000000049716FFECC63057C07630FFF09616F5
+:10111000FFF475AD001E75ACFFE5C6B45FC076B4D4
+:10112000FFF09696FFF020260000E6011138F582C8
+:101130000000E00111CCF60200008696FFF00000EE
+:101140000001C7346800C49C7200C02E6A00EC0124
+:101150001198C5240000C62C00008716FFEC000083
+:101160000001A6B2700205AC0001C73070007739EB
+:10117000001E7738FFE5C6B477C076B4FFF0F6AB53
+:101180002800052800028716FFF000000001C02E8D
+:101190007200EC01115906300002F3020001F30560
+:1011A00076F4F60200018716FFF0869E0004C73829
+:1011B0007000C7384800C6B470008716FFF406B444
+:1011C00000209702FF6C9482FF509682FF582032D5
+:1011D0000000E601131000000001F704765CF584BE
+:1011E00076F807380001F705765CF704765C202E68
+:1011F0000021E2011230F6862C28F7042D38000079
+:10120000000106380001F6052D387739000220323A
+:101210000044E601121CB5BA6802F0052D38F3024D
+:101220000022F30576F8F3047700E0011234F305A9
+:1012300076FCF00576FCF70475F800000001203A12
+:101240000000E6011271F6862C28F7042D38000004
+:10125000000106380001F6052D3877390002F30247
+:10126000000F20320044E6011270B33A6802F00524
+:101270002D38F7047608F684760007380001C03A66
+:101280006A00E601128CF7057608F0057608F68408
+:101290007608F7047604F00575F8F60675F8C0369A
+:1012A0007200470C0001203A0000E60112B9F70570
+:1012B00075FCE00112C8F702000077350002C7385C
+:1012C0006000873A001800000001203A0000E601A3
+:1012D0001309F7057660F7042D38F30672A4F305B9
+:1012E0007648F6862C2806380001F6052D38773921
+:1012F0000002F302000E20320044E6011318B33A54
+:101300006802E0011318F0052D38E0011314F3060C
+:101310007218F3067330F30576488796FFFC8296C1
+:10132000FFF802140000013C00000000000192934D
+:10133000FFFC02900008F70476600000000186BA06
+:101340000004F704765400000001C7386800F70570
+:101350007654F70476580000000107380001F705BD
+:101360007658F70475F8F6847658203A0000E601BE
+:10137000139DF6862C28F7042D380000000106384E
+:101380000001F6052D3877390002F502000F2032F2
+:101390000044E601139CB53A6802F0052D38F704C5
+:1013A0007608F684760007380001C03A6A00E60144
+:1013B00013B8F7057608F0057608F7047608F68482
+:1013C0007604F00575F8F58476F8C03A6A00470CA3
+:1013D0000001202E0021E2011414F70575FCF7042A
+:1013E0002D38F6862C2806380001F6052D38773979
+:1013F000000220320044E6011400B5BA6802F0058C
+:101400002D38F5020022F50576F8F5047700E001A5
+:101410001418F50576FCF00576FCF70475ECF50676
+:101420007218203A0000E6011440F5057648F704EA
+:1014300075F000000001203A0000E601145500009C
+:10144000000107880008E00115D09793FFFCE00138
+:1014500014C400000001F70475FC00000001203AEC
+:101460000000E6011471F68675F8E0011488F702B1
+:101470000000F70476080000000177390002C73841
+:101480006800873A001800000001203A0000E601D9
+:1014900014C5F7057660F7042D38F6862C28063833
+:1014A0000001F6052D3877390002F502000E2032D2
+:1014B0000044E60114BCB53A6802F0052D38F50683
+:1014C00072A4F50576488796FFFC8296FFF8021411
+:1014D0000000013C0000000000019293FFFC02901C
+:1014E0000008F70475EC00000001203A0000E60156
+:1014F0001540F40200008696000400000001F68505
+:1015000075EC8696000800000001F6857B3886960B
+:101510000000F7047648F6857B30F6867218C03AEC
+:101520006A00470C0001203A0000E6011541F40270
+:10153000000107880008E00115D09793FFFCF40232
+:1015400000018796FFFC8296FFF80214000C013C14
+:101550000000000000019293FFFC02900008F704D5
+:1015600075F400000001203A0000E60115BCF40209
+:1015700000008696000400000001F68575F086964E
+:10158000000800000001F6857B4886960000F704FD
+:101590007648F6857B40F6867218C03A6A00470C9A
+:1015A0000001203A0000E60115BDF40200010788A1
+:1015B0000008E00115D09793FFFCF4020001879624
+:1015C000FFFC8296FFF80214000C013C00000000B2
+:1015D00000019293FFFC02900008F70476FC0000E3
+:1015E0000001203A0000E60115FCF6820010F686A4
+:1015F0007648F68576FCE001160CF7020001F685C8
+:1016000076F8F6867648F6857700F7020000203AED
+:101610000000E6011620F68674D4E001162CF6854B
+:10162000764807880008E00116409793FFFC8796EC
+:10163000FFFC8296FFF802140000013C000000004D
+:1016400000019293FFFC02900008F60475F0000080
+:10165000000120320000E6011685F7020001F705BF
+:1016600075F4F6847B48F70576F4F7047B40C6B042
+:10167000680026B400049702FF6C9602FF50E00158
+:1016800016A800000001F70475ECF6847B38F5829B
+:101690000001F58576F4F6047B30C6B8680026B400
+:1016A00000049602FF6C9702FF509682FF58F58661
+:1016B00073BCF58576488796FFFC8296FFF8021486
+:1016C0000000013C0000000000019293FFFC02902A
+:1016D0000008F7047B280000000107380001F70527
+:1016E0007B28F70475F4F6847B28203A0000E60195
+:1016F000172100000001F00575F4F70475EC0000F7
+:101700000001203A0000E6011725F00575F0078872
+:101710000008E00116409793FFFCE00117EC000081
+:101720000001F00575ECF70475FC00000001203A9B
+:101730000000E6011741F68675F8E0011758F70238
+:101740000000F70476080000000177390002C7386E
+:101750006800873A001800000001203A0000E60106
+:101760001795F7057660F7042D38F6862C2806388D
+:101770000001F6052D3877390002F502000E2032FF
+:101780000044E601178CB53A6802F0052D38E001F7
+:101790001798F50672A4F5067218F5057648F584D3
+:1017A00076F800000001202E0021E20117E8F686FD
+:1017B0002C28F7042D380000000106380001F6053A
+:1017C0002D387739000220320044E60117D4B5BA2B
+:1017D0006802F0052D38F5020022F50576F8F504CB
+:1017E0007700E00117ECF50576FCF00576FC8796AE
+:1017F000FFFC8296FFF802140000013C000000008C
+:1018000000019293FFFC0290000822100038F704B8
+:1018100075EC00000001203A0000E60118340000D9
+:101820000001F70475F000000001203A0000E60115
+:1018300018490000000107880008E001164097934E
+:10184000FFFCE0011C7400000001F68476600000DB
+:1018500000018736000800000001703AFFE1E60150
+:10186000187DF48200009693FFFC07880008E000D2
+:1018700000BC9793FFFCE0011C70F3067560C3B4D5
+:101880000000841E0010F6844AA023140020931642
+:10189000FFC49416FFE09696FFD4851E0014F7044B
+:1018A0004A9C00000001C0367200EC0119689516D0
+:1018B000FFE477350001C738680077390002F30686
+:1018C0004A98C6B8300006B4000CC58400008736BC
+:1018D000000000000001C03A4200E60118F8C624EA
+:1018E00000008736000400000001C03A5200E60103
+:1018F00018FC20320000F602000120320000E60150
+:10190000190900000001F5820000863600008716E4
+:10191000FFE000000001C0327200E2011944F5024C
+:101920000000C0327200E601194C202A000086B681
+:1019300000048716FFE400000001C0367200E201D7
+:10194000194D202A0000F5020001202A0000E601BE
+:10195000195D202E0000F5820001202E0000E60116
+:10196000196C20260000F482000120260000E60108
+:1019700019A1F60200018716FFD4F3064A9876B93A
+:101980000001C6B4700076B50002C6B4300006B4DB
+:10199000001486B600009716FFD8E0011A14969638
+:1019A000FFDC2714002C9713FFFC8316FFC40000F4
+:1019B00000019313FFFCF3064A989313FFFC9396E0
+:1019C000FFCC07880008E00125689793FFFC839609
+:1019D000FFCC20220000E6011A11F6020001871652
+:1019E000FFD4F3064A9876B90001C6B4700076B504
+:1019F0000002C6B4300006B4001486B60000971684
+:101A0000FFD89696FFDCF7054AA0E0011A182032AD
+:101A10000000F602000020320000E6011A28F482DD
+:101A20000001E0011A80F48200008696FFD80000D1
+:101A3000000177350002C738680077390002F68662
+:101A400042C8A63A6802C73868007539001E752872
+:101A5000FFE505B8000286AE0000073800049716BF
+:101A6000FFECC63057C07630FFF09616FFF475AD28
+:101A7000001E75ACFFE5C6B45FC076B4FFF0969665
+:101A8000FFF020260000E6011A94F5820000E00134
+:101A90001B28F60200008696FFF000000001C73404
+:101AA0006800C49C7200C02E6A00EC011AF4C524C0
+:101AB0000000C62C00008716FFEC00000001A6B253
+:101AC000700205AC0001C73070007739001E77380E
+:101AD000FFE5C6B477C076B4FFF0F6AB2800052862
+:101AE00000028716FFF000000001C02E7200EC011A
+:101AF0001AB506300002F3020001F30576F4F6028F
+:101B000000018716FFF0869E0004C7387000C738B2
+:101B10004800C6B470008716FFF406B40020970290
+:101B2000FF6C9482FF509682FF5820320000E6013D
+:101B30001C6C00000001F704765CF58476F8073829
+:101B40000001F705765CF704765C202E0021E201A7
+:101B50001B8CF6862C28F7042D380000000106386F
+:101B60000001F6052D387739000220320044E601E5
+:101B70001B78B5BA6802F0052D38F3020022F30590
+:101B800076F8F3047700E0011B90F30576FCF0058E
+:101B900076FCF70475F800000001203A0000E60129
+:101BA0001BCDF6862C28F7042D38000000010638DE
+:101BB0000001F6052D3877390002F302000F2032BC
+:101BC0000044E6011BCCB33A6802F0052D38F70457
+:101BD0007608F684760007380001C03A6A00E6010C
+:101BE0001BE8F7057608F0057608F6847608F70412
+:101BF0007604F00575F8F60675F8C0367200470CE5
+:101C00000001203A0000E6011C15F70575FCE00113
+:101C10001C24F702000077350002C7386000873ABD
+:101C2000001800000001203A0000E6011C65F705DD
+:101C30007660F7042D38F30672A4F3057648F6862D
+:101C40002C2806380001F6052D3877390002F302FA
+:101C5000000E20320044E6011C74B33A6802E00131
+:101C60001C74F0052D38E0011C70F3067218F306A1
+:101C70007330F30576488796FFFC8296FFF80214CE
+:101C80000000013C0000000000019293FFFC029064
+:101C90000008F70676489713FFFCF70672189713AB
+:101CA000FFFC07880008E00014F49793FFFCF70698
+:101CB00076489713FFFCF70672A49713FFFC07887A
+:101CC0000008E00014F49793FFFCF706764897139A
+:101CD000FFFCF70673309713FFFC07880008E0004D
+:101CE00014F49793FFFCF70676489713FFFCF7066A
+:101CF00073BC9713FFFC07880008E00014F4979367
+:101D0000FFFCF70676489713FFFCF7067448971315
+:101D1000FFFC07880008E00014F49793FFFCF70627
+:101D200076489713FFFCF70674D49713FFFC0788D7
+:101D30000008E00014F49793FFFCF7067648971329
+:101D4000FFFCF70675609713FFFC07880008E000AA
+:101D500014F49793FFFC8796FFFC8296FFF8021419
+:101D60000000013C0000000000019293FFFC029083
+:101D70000008F68676689693FFFCF68677049693BD
+:101D8000FFFC07880008E00015489793FFFCF686E3
+:101D90001DD49693FFFC9013FFFCF686766896930D
+:101DA000FFFC07880008E000161C9793FFFCF70271
+:101DB0000022F70576F4F70576F8F00576FCF005D5
+:101DC00077008796FFFC8296FFF802140000013C22
+:101DD0000000000000019293FFFC02900008F7044D
+:101DE00076F400000001203A0022E6011E01000006
+:101DF00000019713FFFC07880008E0001584979303
+:101E0000FFFC8796FFFC8296FFF802140000013C5D
+:101E10000000000000019293FFFC02900008F7060A
+:101E200077049713FFFCF70676689713FFFC078883
+:101E30000008E00014F49793FFFC8796FFFC82965D
+:101E4000FFF802140000013C000000000001000047
+:101E500000009293FFFC02900008F686781096939B
+:101E6000FFFCF68678A49693FFFC07880008E00044
+:101E700015489793FFFCF6861FBC9693FFFCF682ED
+:101E800000149693FFFCF68678109693FFFC078863
+:101E90000008E000161C9793FFFCF005789C900268
+:101EA000FF34F7027FFFF70578A09702FF3087968F
+:101EB000FFFC8296FFF802140000013C00000000C5
+:101EC00000019293FFFC02900008F604789C8716AC
+:101ED000000084960008F5867710873A0008F68699
+:101EE000218C7539000477390002A73A6802203244
+:101EF0000000C6A8580084160004C63075809436C9
+:101F00000004B4AA580287360008F605789C073802
+:101F10000001E6011F2D973600088702FF30000000
+:101F20000001C03A4A00EE011F3500000001F485AF
+:101F300078A09482FF308796FFFC8296FFF8021407
+:101F4000000C013C0000000000019293FFFC029095
+:101F500000088596000000000001872E0008F68624
+:101F6000218C77390002A73A6802F604789CC704EE
+:101F7000760086AE0008C6307400F7067710F605C6
+:101F8000789C76B50004C6B470008736000820320D
+:101F9000000007380001E6011FA897360008F70285
+:101FA0007FFFF70578A09702FF308796FFFC8296A7
+:101FB000FFF802140004013C0000000000019293AD
+:101FC000FFFC0290000822100008F704789C000033
+:101FD0000001203A0000E60120D1F6027FFF9616AC
+:101FE000FFF4F6842D40F606771026B4000177350D
+:101FF0000004C4B86000C338000074350002F6065F
+:102000007710C0266200EC0120C1F606218CF38413
+:10201000789CA722600200000001C01E7400E60147
+:1020200020B10000000186A60000F70478A000009F
+:102030000001C6B4720020360000EE01209896A67A
+:102040000000F7042D38F6067710C5186000F686F4
+:102050002C28862A000405B80001F5852D3877392B
+:102060000002202E0044E6012070B63A6802F00516
+:102070002D38862A000800000001962A000CF6067A
+:10208000218CA722600200000001C7047600C71C53
+:102090007400E00120B0F705789C8616FFF400007C
+:1020A0000001C0366200EC0120B0000000019696ED
+:1020B000FFF424A4001023180010E0011FFC2420CA
+:1020C00000048616FFF400000001F60578A09602D1
+:1020D000FF308796FFFC8296FFF802140000013C57
+:1020E0000000000000019293FFFC02900008871698
+:1020F000000000000001873A0008F6867710773963
+:102100000004C738680086BA000C873A000800004F
+:102110000001C0367200440C00018796FFFC8296D5
+:10212000FFF802140004013C00000000000192933B
+:10213000FFFC02900008F702000F203A0000EC01BB
+:10214000215DF68677189036000027380001C60416
+:102150000000C03A6200E601214406B40010F60611
+:1021600078A49613FFFCF60678109613FFFC0788F8
+:102170000008E00014F49793FFFC8796FFFC82961A
+:10218000FFF802140000013C000000000001000004
+:102190000001000000020000000400000008000030
+:1021A000001000000020000000400000008000003F
+:1021B0000100000002000000040000000800000010
+:1021C000100000002000000040000000800000001F
+:1021D00000009293FFFC02900008F70678B0971376
+:1021E000FFFCF70679CC9713FFFC07880008E00096
+:1021F00015489793FFFCF706222C9713FFFCF70274
+:1022000000159713FFFCF70678B09713FFFC0788BB
+:102210000008E000161C9793FFFC8796FFFC82964F
+:10222000FFF802140000013C00000000000192933E
+:10223000FFFC02900008F6846F440000000187361E
+:10224000000000000001203A0002E6012270F602C0
+:10225000000087360EF486B60EF800000001C03A82
+:102260006A00470C0001203A0000E6012278203283
+:102270000000F602000120320000E6012294000076
+:102280000001F70432E800000001203A0000E601F6
+:1022900022B1F58203E80F814000F70479C80000FD
+:1022A000000107380001F70579C8F70479C8F582FD
+:1022B00003E89593FFFCF58200159593FFFCF586E6
+:1022C00079CC9593FFFC07880008E0011EC0979326
+:1022D000FFFC8796FFFC8296FFF802140000013C89
+:1022E0000000000000019293FFFC02900008F70636
+:1022F00079CC9713FFFCF70678B09713FFFC07889B
+:102300000008E00014F49793FFFCF70679CC9713CC
+:10231000FFFCF706793C9713FFFC07880008E000F4
+:1023200014F49793FFFC8796FFFC8296FFF8021443
+:102330000000013C000000000001C13C0000021050
+:1023400000049293FFFC029000082210000C859676
+:1023500000000000000186AE0004000000012036ED
+:102360000000E60123842714000C872E00040000DF
+:10237000000107380001972E0004872E0004E001B9
+:1023800024349696FFF49713FFFC85160004000092
+:1023900000019513FFFC9593FFFC9596FFEC0788D1
+:1023A0000008E00125689793FFFC8596FFEC20224A
+:1023B0000000E60124340000000186AE0004861609
+:1023C000FFF400000001C0366200EE0124217735E1
+:1023D0000001C738680077390002C6B85800773165
+:1023E0000001C738600077390002C73858008536C9
+:1023F0000000000000019536000C85360004000046
+:102400000001953600108536000800000001953661
+:10241000001426B4000CC0367200EE0123EC00005C
+:102420000001872E00040000000107380001972EEC
+:102430000004872E00048696FFF485160004773585
+:102440000001C738680077390002C72C7000852A60
+:10245000000000000001953A000C85160004000001
+:102460000001852A000400000001953A001085163D
+:102470000008F4020001953A001496AE0008879611
+:10248000FFFC8296FFF80214000C013C00000000E3
+:1024900000019293FFFC029000082210000C859628
+:1024A000000000000001842E000400000001202232
+:1024B0000000E60125552714000C9713FFFC851634
+:1024C0000004000000019513FFFC9593FFFC959616
+:1024D000FFEC07880008E00125689793FFFC8596CC
+:1024E000FFEC20220000E6012555000000018616C1
+:1024F000FFF40000000120320000EE012545773195
+:102500000001C6AC0000C738600077390002C73848
+:10251000580085360018000000019536000C8536FD
+:10252000001C0000000195360010853600200000D8
+:1025300000019536001406B4000CC0367200EC01A0
+:10254000251100000001872E0004F4020001273845
+:102550000001972E00048796FFFC8296FFF8021474
+:102560000008013C0000000000019293FFFC029073
+:102570000008221000088396000483160000C5009E
+:102580000000841A0004C4A800009416FFF4C026BA
+:102590004200E60126D1000000018316FFF400008E
+:1025A0000001C02A3200E60126D1C7204A00951654
+:1025B000FFF476B8FFE1C73868007739FFFFC5241C
+:1025C000700077290001C738500077390002831660
+:1025D0000000869E0000C5B8300005AC000C872EB8
+:1025E0000000C6000000C0367200E601261020324E
+:1025F0000000869E0004872E000400000001C03603
+:102600007200E601261020320000F602000120329E
+:102610000000E601262500000001C7000000E001DF
+:102620002678203A0000869E0000872E00000000D9
+:102630000001C0367200E201265C00000001E601E4
+:10264000266420320000869E0004872E00040000CD
+:102650000001C0367200E201266520320000F60259
+:102660000001203200004704FFFFE6012679203AEE
+:102670000000F7020001203A0000E60126B1203AEE
+:102680000000EE0126A0203A00014304FFFFC03AFB
+:102690003200E60126C9C0264200E0012590000074
+:1026A0000001E60126C1C0264200E001259000009D
+:1026B000000183160008F4020001E00126E0951AEB
+:1026C0000000E001258CC4A80000E001258CC4288E
+:1026D00000008316000800000001941A0000C400E6
+:1026E00000008796FFFC8296FFF80214000C013C64
+:1026F000000000000001000000009293FFFC029027
+:102700000008859600048416000084960008F702ED
+:102710000003C6A04D80C6B67400E6012771C6202E
+:10272000000020360002E60127A0C5204800C7208F
+:10273000480027380002C0227200E201279CC538F9
+:102740000000872E000076AD001E76B4FFE5C73886
+:102750006FC07738FFF0F733280006300002C03230
+:102760005200E201274105AC0002E00127A0C5208C
+:102770004800C720480027380004C0227200E20148
+:1027800027A0C520480083AD00040000000193B1DC
+:102790000004C0327200E201278500000001C5205C
+:1027A0004800C0325200E40127D50000000186AE87
+:1027B0000000772D001E7738FFE5C6B477C076B5E8
+:1027C000FFE8F6B3680006300001C0325200E401B1
+:1027D00027AC05AC00018796FFFC8296FFF8021437
+:1027E000000C013C0000000000019293FFFC0290ED
+:1027F0000008841600008696000400000001C7222D
+:102800006D80E601281020360000E0012874C438ED
+:102810000000F7020001EE012841F602000076B543
+:10282000000120360000EE01281C77390001E0018C
+:10283000284420220000742100017738FFFF063071
+:10284000000120220000EE012834203A0000E601B9
+:10285000287100000001C0226A00E4012864000021
+:102860000001C4206A00773AFFFFE601285476B4DD
+:10287000FFFFD42007628796FFFC8296FFF80214C0
+:102880000008013C0000000000019293FFFC029050
+:10289000000822100004E00128CCF70629DC86BAE3
+:1028A00000000000000120360000E60128C90000F9
+:1028B00000019716FFF407880008C13400009793C1
+:1028C000FFFC8716FFF40000000127380004F6061D
+:1028D00029E0C03A6200E401289D000000018796CB
+:1028E000FFFC8296FFF802140000013C000000008B
+:1028F00000019293FFFC0290000822100004E00106
+:102900002934F706299886BA000000000001203615
+:102910000000E6012931000000019716FFF4078846
+:102920000008C13400009793FFFC8716FFF40000F5
+:10293000000107380004F60629E0C03A6200E4010D
+:102940002904000000018796FFFC8296FFF802141C
+:102950000000013C0000000000019293FFFC029087
+:102960000008F7047B5000000001203A0000E60157
+:102970002984F6820001F6857B5007880008E00173
+:1029800028F09793FFFC8796FFFC8296FFF80214CD
+:102990000000013C00000000000100000B4C0000A2
+:1029A0000000000042880000000000005E500000AF
+:1029B00000000000C7A80000000000010BD00000CC
+:1029C000000000011C880000000000011E1400002F
+:1029D00000000001212C00000000000122E40000A2
+:0229E0000000F5
+:00000001FF
+/* This is the Myrinet MCP code for LANai4.x */
+/* Generated by  cat $MYRI_HOME/lib/lanai/mcp4.dat > myri_code4.h */
diff --git a/firmware/qlogic/1040.bin.ihex b/firmware/qlogic/1040.bin.ihex
new file mode 100644 (file)
index 0000000..d121330
--- /dev/null
@@ -0,0 +1,2111 @@
+:1000000007410600001078003A1000005841000037
+:100010004320504F525947495448312039392035EF
+:100020004C51474F43494320524F4F50415249543E
+:100030004E4F49205053303130324920542F462002
+:100040007269776D726120655620726569736E6F93
+:1000500030202E3735362020432073756F74656D40
+:1000600020726F4E202E303050206F727564746392
+:100070004E202E6F2020313024200120FD0404204A
+:1000800082A005004800451038004B10780047104A
+:1000900028004B10B920121278004D10B9202222EE
+:1000A000C120080071201000C3700400C920FF782F
+:1000B00089208611C7705349CB702050CF70202003
+:1000C000D3700700003FD670C1200800192000003F
+:1000D0000920FFFE00210B20A5A5ECA1FF7F642DC8
+:1000E0006B200A0ADCADFF3F542B5B2050501421DB
+:1000F00086A2A5A54000BF1086A30F004000851072
+:100100006A2C5A2AC120000019200F0078006510BF
+:100110006A2C5A2AC12008000920FF7F482144295F
+:100120004B200A0ABCA9FF3F34273B205050142122
+:1001300086A20A0A4000A9104A283A26C1200400D3
+:100140000920FF3F34210B205050142186A250502B
+:100150004000AA1078008E114A283A26C09888A13B
+:1001600000102C210B20A5A5142186A2A5A54000D6
+:10017000BC100A258AA10010C1987800C1100A2578
+:100180007800C1106A2C5A2A30218AA14000282107
+:10019000A2A10052248424842484248424842484DA
+:1001A00092A1007909200000012031007810261D5D
+:1001B000182279200052A02F082411200000A92025
+:1001C0004000A4420981C000DC10F27E2885E67D53
+:1001D000EA7CEE7B8378000031203000CF7801018B
+:1001E0000B7802000F7802004F780300692040521C
+:1001F0000120FD04042082A00500480004113800FD
+:100200000011780008111B683C0078000A11A80052
+:1002100008111B683C001B682800076807000B6872
+:10022000FA000F68080013680500236800002768BB
+:100230000600176808002B6800001F681900692075
+:10024000805411202000092010000B680C080F6852
+:100250001900036800FD076818001A6A002DE8A05D
+:10026000080090A204000981C000221169200055F5
+:1002700009200200A9200001376800000B68400037
+:10028000F07B86A3FFFEC0004811176800011F68BD
+:10029000640078004C11176864001F680200E8AD24
+:1002A000100070005211780039110981C000371117
+:1002B0007810A72278103D497810B5197810334E80
+:1002C000003285A00D009020C370000090006C11DA
+:1002D000C07086A00200C0006C11781084127810E3
+:1002E0009611CC7805A0C0007A1178104F1D10002F
+:1002F000801168008011781086211000801168003C
+:1003000080117810B91AE0006C117810BA4C78009E
+:100310006C118E119011AC24AC24BE49BE49AC24A2
+:10032000AC2478008E11780090117800921178003A
+:1003300094116800011261200000186084A001007F
+:10034000C0000112147805A0C000A711100002120D
+:100350007800011209205B52042105A0C00001129F
+:10036000092064520B200000147986A14200C000CD
+:10037000CC1116780920625264210B20000018600D
+:10038000C6701460CA701C618CA100FF206084A03C
+:10039000FF0005A1CE7078109A197800FF1114782B
+:1003A00086A01800C000D3117810781617780000C6
+:1003B00009206252042165A04000EF117E0C9C6070
+:1003C00060207810171A7F0C9F60000078104E177D
+:1003D00009200C000760030178107619C000FB119A
+:1003E00078109A19092062520B20000009205C52F3
+:1003F00004210B20000005A04000FF110120054052
+:1004000078008612780084127C00C3700000C770E8
+:100410000000CB700000CF700000C070BCA0C0FF17
+:10042000C00052123820790012128412E512A9126B
+:10043000FE120D131313A012661717139812AD12A4
+:10044000AF12B112B3126B179812291365139016DD
+:100450006017B512AF15CB15E7151216681576158E
+:100460008A159E15E913981297139D13A213A713CB
+:10047000AD13B213B713BC13C113C513DA13E613CC
+:100480009812981298129812F513FE130D14511425
+:100490005B146214A814B714C614D8144815581560
+:1004A00098129812981298125D15BCA0A0FFC00077
+:1004B0009812382084A01F0079005B12A417A71798
+:1004C000B7179812981231194E199812981298125B
+:1004D00052195A199812981298129812DB12F412A3
+:1004E0001F135B1386168217961798124718601908
+:1004F0000D1917191B19291998129812CA72C67169
+:100500000120064078008612CE73CA72C67101209F
+:100510000040C27068008712612000001B6001006B
+:1005200091200050E0008F12E000911268009112BB
+:10053000912080407C00C370014078008712C37016
+:1005400006407800871299204100A1204100A9208F
+:100550000500A35378008412C470C37004007A00AD
+:100560007800841278008412780084127800841253
+:1005700091200080C3700000C7705349CB70205099
+:10058000CF702020D3700700003FD6707920000084
+:100590001B78010031203000592000102920570419
+:1005A0005120700461207204B920FFFFC1200000B7
+:1005B0009120005091208040780055047810C41B91
+:1005C000C0009C12D875DC74DA75DE747800E8120D
+:1005D000292000002025D071C873CC72C470781017
+:1005E000FE1A40008412C370024078008412781012
+:1005F000C41BC0009C12D875DC74DA75DE747800F8
+:100600000113292000002025D071C873CC72C4705A
+:1006100078105E1B40008412C37002407800841280
+:10062000C471C87014210A2078008212C471142188
+:1006300078008212C7700700CB704100CF700600AF
+:10064000780084127810C41BC0009C12D875DC7628
+:10065000DA75DE7678002C13292000003025C4706E
+:10066000C872CC73D074C670CA72CE73D27405A02F
+:10067000400055130AA440003C13C80046130180F3
+:10068000927884A000FC40004A13CC7885A0010039
+:10069000CE7801200540780086129A7A9E7BA27D52
+:1006A000A67E967CCC7884A0FCFFCE787800591387
+:1006B000CC7885A00100CE78780084127810C41B15
+:1006C000C0009C12D875DC76DA75DE767800681387
+:1006D000292000003025C470C872CC73D474C67051
+:1006E000CA72CE73D67405A0400091130AA44000CC
+:1006F0007813C80082130180AE7884A000FC40000B
+:100700008613CC7885A00001CE78012005407800C2
+:100710008612B67ABA7BBE7DC27EB27CCC7884A0CB
+:10072000FFFCCE7878009513CC7885A00001CE78B8
+:1007300078008412092061520C21EC7A7800821230
+:10074000092041520C2178008312092042520C21C9
+:1007500078008312612040520C611062780082128E
+:10076000092045520C2178008312092046520C21A1
+:1007700078008312092048520C2178008312092046
+:1007800049520C217800831208790C7A7800821281
+:10079000C471078184A00F00038003800380E8A058
+:1007A0008054006A046884A008004000D713086BD6
+:1007B0007800D8130C6B78008112C4777810C519B3
+:1007C000912000801C6B146A91200180082778001A
+:1007D00081124C7978008312C4777810C519912062
+:1007E00000800869186A106B9120018078008112DE
+:1007F000C47182A11000C8007C1278107F23780099
+:100800008112C47182A11000C8007C1211204152D3
+:1008100004227E001221781038237F017800831291
+:10082000C47119200001042382A0060048001B1493
+:1008300011204914A920080078001F141120411428
+:10084000A9200800042206A140002A14108270008A
+:10085000281478001F1478007C12042382A006005C
+:100860004800331492A249147800351492A241141E
+:100870007E0211204252042212217F017E00781054
+:1008800044237F0178008312E803FA00F401EE02AA
+:100890006400190032004B00E803FA00F401EE0294
+:1008A0000400010002000300612040520C6110624C
+:1008B000C4700E60C87012607800821261204052CD
+:1008C0001461C47016607800831261204052C471B4
+:1008D000112004001F6019001920121286A128009F
+:1008E00040008314112005001F6019001920121206
+:1008F00086A1320040008314112006001F600C0006
+:100900001920222286A13C00C0007C1218607E00C3
+:100910001A61007884A00100C0009E140120FD042B
+:10092000042082A005004800961438009A1478002C
+:100930009E1428009A1478009E1419202222780010
+:10094000A01419201212B823781055237810334EB2
+:100950007F0178008312C47184A1CFFFC0007C1294
+:1009600011204852042212217E00781077237F0143
+:1009700078008312C47182A11000C8007C1211207B
+:10098000495204227E001221781066237F017800EC
+:100990008312C471C87284A1FDFFC0007B1284A2BF
+:1009A000FDFFC0007B12002108790A7800220C7A32
+:1009B0000E7878008212C471078184A00F00038032
+:1009C00003800380E8A0805419200000C872BCD2C4
+:1009D0004000E9149DA31000B4D24000EE149DA382
+:1009E000080000687E0026A240001115026A84A457
+:1009F00000204000FA149DA3100084A400104000C1
+:100A000000159DA3080084A40040400011150F812B
+:100A100084A2004040000D1578109923780011152C
+:100A200078108B2378001115CC72086806A240005C
+:100A30004015A4A2FF0061204052186186A1280041
+:100A40004000271586A1320040002D1586A13C00EC
+:100A50004000331582A4640048003D157800371526
+:100A600082A4500048003D157800371582A4430049
+:100A700048003D15C471C6717F02CA7278007D12AC
+:100A80000A6A9DA30A00046805A306687F020C6B2E
+:100A9000C47178008112C4777810C5199120008044
+:100AA000146A1C6B91200180C8701668CC701E6897
+:100AB000082778008112C4704C794E787800831230
+:100AC000C471C872CC7382A11000C8007C12781067
+:100AD000A72378008112C4777810C519912000806F
+:100AE000086A95A202000A6A91200180082778000E
+:100AF0008212C4777810C51991200080086A94A2E8
+:100B0000F9FF0A6A046805A04000851578106F2275
+:100B100091200180082778008212C4777810C519C7
+:100B200091200080086A95A204000A6A046805A062
+:100B30004000991578106F229120018008277800D5
+:100B40008212C47741200100492005005120200075
+:100B5000912000807810D219912001800827086A1E
+:100B600078008212C477C872CC73C677CA72CE730B
+:100B70007810521AC000C715186805A04000C715A4
+:100B800008277810B723C000C715177815009120E3
+:100B900001807C009120018078008412C477C677A0
+:100BA0004120210049200500512020009120008093
+:100BB0007810D219612040526F6003008267936001
+:100BC0000F00736000001778160078106F229120D4
+:100BD00001807C00C877CA77C477C677BCA700FFBE
+:100BE00091200080612040526F600200736000001D
+:100BF000826793600F001778170078106F2291209A
+:100C00000180412021004920040051201000912042
+:100C100000807810D219C8703668388784A71F0002
+:100C2000C0000616912001807C00CC7884A00300CF
+:100C3000C000361639200000412021004920040060
+:100C4000512008007810C5199120008008680DA86F
+:100C50000A6991200180388784A71F00C0001F16F1
+:100C6000BCA700FF3F8738873F8784A7000FC000DD
+:100C70001F169120008069200001306884A0400088
+:100C800040005F164B680400A9201400486884A047
+:100C9000040040004C1670004C16780043164B6858
+:100CA0000900A9201400486884A0010040005916DA
+:100CB0007000591678005016A920FA0070005F16CF
+:100CC00078005B1679200052177818006120405296
+:100CD0006F6001007360000093600F00CC7885A006
+:100CE0000200CE78086884A0FDFF0A681B684800EF
+:100CF000912001807C00CC7884A0FDFFCE7884A078
+:100D00000100C000821678109C1AC471C6714A791D
+:100D10007C007810C41BC0009C12D875DC74DA7596
+:100D2000DE7478009316292000002025C471C87352
+:100D3000CC72C671CA73CE727920005291200080A5
+:100D4000781080199120018040004A17A9200500E1
+:100D5000A120185291200080A141912001800920FA
+:100D6000200078107B194000B61678109A19780088
+:100D70004A17046084A000FF07800980400019170B
+:100D80007E0C682C912000807810801991200180C1
+:100D90004000EA16002C9E680981C000BE169F60C4
+:100DA00000007F0C7E0C18721C7320742475682C54
+:100DB0009C6865A0400018170920200078107B1956
+:100DC000C0000117046084A0FF0086A00200C000DC
+:100DD000EA16002D02607800D0167F0C7E0C9C6015
+:100DE00060207810171A7F0C9F60000078104E1753
+:100DF00009200C00086085A000020A6078107619AE
+:100E000078109A1978004A177F0C7E0C9C6060203D
+:100E10007810171A7F0C9F60000078104E17092079
+:100E20000C00076003011B6003007810761978102E
+:100E30009A1978004A177F0CC474C873CC72146076
+:100E400091200080177812007E0E712040526F7042
+:100E500005007370000076737A727E7482708770FA
+:100E60000000002C8A708F7000002EA030251C61BD
+:100E7000A26184A1600040003C177810D3487F0E27
+:100E80009665A6659A66AA66AF600000B36000002A
+:100E900078106F22912001807C00C370054078009B
+:100EA0008712A920050099201852912000800A532A
+:100EB00091200180002110A299A30000A1A40000AC
+:100EC000A9A500007C00C471C770000006797800F5
+:100ED0008412C471C671682178006D1769200010F2
+:100EE0000C6916A0042D10A2688D0981C0006F172F
+:100EF00085A20000C0007D17C370004078007F17F6
+:100F0000C3700340CA7078008712112067520C2208
+:100F1000C470038048008F177810513C84A1FF7F74
+:100F2000780093177810443C85A100801220780047
+:100F30008312C47178103B3C006101206752042089
+:100F400084A000800DA10462086378008112E47916
+:100F500078008312C471C6719821A1204200A92093
+:100F60000400A353A02199204200A9200400A35308
+:100F700078008412C470682079200052912000808B
+:100F8000781080199120018040004318076001000B
+:100F90000B6000002B6000001B600600106A8CA232
+:100FA0000F0084A2F000038003800380038005A16A
+:100FB000166084A200084000DE171B600A0078005B
+:100FC000E41784A200104000E4171B600C0084A208
+:100FD00000034000ED172B600100048004800480B2
+:100FE00085A001001E60236000002760000084A22D
+:100FF00000044000FA172B600000A920060080AC16
+:101000000B00A02080AD05009820A35384A200030C
+:10101000C0000F1846604A604E60526096609A6049
+:10102000780019180068466004684A60086E4E66C9
+:101030000C6D526596659A66146091200080177851
+:101040004200082C612040526F6005007360000070
+:10105000776000007B6000007F60000082608A6132
+:1010600084A200048E60912001807E0E71202000F9
+:1010700007700A0007700200037000007F0E9120C5
+:10108000008078106F22912001807C00C3700540A1
+:10109000780087127E0C7E0D7E0E7E0F91200080E0
+:1010A000712040527920000161201000A0706DA0D5
+:1010B00040000319046A94A2FF0086A207004000C2
+:1010C000621886A20F00C00003191C6984A1C00029
+:1010D0004000031984A18000C000D318246884A0B4
+:1010E00000FF85A019002668B071FF8140008918B3
+:1010F0007E0D69202000076810000869086806A1B5
+:10110000C0007A180C690C6806A1C0007F1884A181
+:10111000FF00C0007F187F0DB87884A01F80C0003A
+:101120008918487885A00C004A78B071FF8140008A
+:10113000AC18B37000007E0D69202000076818000D
+:10114000046884A00800C0009D18076808000468AF
+:1011500084A00800C000A418076802007F0DC461C5
+:10116000C862CC63C661CA62CE637E0E7120005233
+:1011700066726A7380AE19007F0E487884A00C00F6
+:10118000C000BA187810E147A3780000587884A00E
+:10119000FFED5A78B47080A0DA001A787F0F7F0EC6
+:1011A0007F0D7F0C9120018078008412246884A038
+:1011B00000FF85A019002668B87884A01F80C000B1
+:1011C000D918487885A00C004A78487884A00C008B
+:1011D000C000E218B071FF8140000119B370000037
+:1011E0007E0D6920200007681800046884A00800AC
+:1011F000C000F21807680800046884A00800C00056
+:10120000F918076802007F0D7800CB187F0F7F0E5A
+:101210007F0D7F0C9120018001200540780086120F
+:101220008079C671C47182A10300C8007C128279E2
+:10123000780084128079C671780084127479C6713E
+:10124000C47176797879CA71C8717A797C79CE71EE
+:10125000CC717E79780084127479C6717879CA71FC
+:101260007C79CE71780084120079C671C4710279DC
+:101270000120FD04042082A0050048004019380028
+:10128000421978004C19A8004C198CA10100C0002B
+:101290004A19B920222278004C19B920121278007C
+:1012A00084120079C67178008412092074520421D6
+:1012B000C670C4700A207800841209207452042178
+:1012C000C67078008412C471078184A00F00038067
+:1012D00003800380E8A08054146AB4D240007119DE
+:1012E0001120010078007319112000000C6B7800A8
+:1012F000811280AC01007810801B7C0080AC010062
+:101300007810201B7C00507865A040008819042CC0
+:101310005278632000007C007E0F792000525078C4
+:101320006DA040009819042D5278036800000768EA
+:1013300000000B6800007F0F7C00912000807E0F72
+:101340007920005250786220002C05A0C000A71917
+:1013500078108C2452787F0F912001807C007E0FC2
+:101360007920005250786A20002D52787F0F7C003F
+:1013700011200079527AEC7B19834000C21980A2B7
+:101380003100122010207800B919132000007C00D1
+:1013900084A7000F0B8084A71F00038003800380B5
+:1013A000038005A1E8A000557C007810C51900292C
+:1013B0002A68002A2E68086884A0EFFF0DA80A6931
+:1013C000092052520C21046805A04000041A16A1FD
+:1013D000C000EF196020006006687E010B2000004D
+:1013E0007800F219092000007E01046865A0400021
+:1013F000011A006006687810311A7810CB1C10684A
+:1014000001801268C000F2197F01026906697C0040
+:1014100065A04000161A08209C6005A04000131A21
+:1014200062209F60000065A07800091A5078527908
+:1014300062207C0065A04000301A08209C6005A056
+:101440004000251A62209F60000065A078001B1AEA
+:101450007E0F7920005291200080507852797F0FC2
+:101460006220912001807C00076003018F600000F2
+:10147000A9201C0080AC0500A02001200000A44091
+:1014800028681A602C6822607C007E0E7120405211
+:101490004C708CA00002C000501A88A080520A2D07
+:1014A00000804E7006A07F0E7C007810C519912038
+:1014B000008004681E7865A040009B1A7800631ABB
+:1014C000002C1E78006065A040009B1A0C6006A3EB
+:1014D000C0005D1A106006A2C0005D1A282C012011
+:1014E0005252042006ACC000741A7800991A04689D
+:1014F00006ACC000811A006065A00668C0008B1AA7
+:101500000368000078008B1A00641C786020026475
+:1015100086A40000C0008B1A002C02686025781099
+:10152000311A1B600500236020007810CB1C106866
+:10153000018050108C24126885A0FFFF7C003920A8
+:101540000000412021004920040051200800912082
+:1015500000807810D219388784A71F00C000A61A0F
+:10156000BCA700FF3F8738873F8784A7000FC000D4
+:10157000A61A912001807C0061200000186084A0E0
+:101580000100C000CA1A91200080E078E3780000D2
+:101590009120018005A0C000CB1A7C008CA0F0FF38
+:1015A0004000D11A78108C247900D31AE31AE61A75
+:1015B000EC1AF01AE41AF41AFA1AE41AE41A951C4E
+:1015C000B91CBD1CE41AE41AE41AE41A7C00781071
+:1015D0008C2478109C1A012001807800C31C012003
+:1015E00003807800C31C012004807800C31C78109D
+:1015F0009C1A012006807800C31C01200780780017
+:10160000C31C3020382182A721004800061B092076
+:10161000200000267810201BC0001F1BBAA7200046
+:1016200048001E1B40001E1B0827B0A6200090A2E9
+:10163000400099A30000A1A40000A9A50000780023
+:10164000001B06A07C00FF8140005B1B992030003E
+:10165000A0200C7084A0FF004000321B0770040023
+:10166000047084A00400C0002D1BA8211770000086
+:101670000B8112711A721E73227426750C7885A064
+:1016800001000270077001000120FD04042082A007
+:101690000500C8004F1B09202200042184A000403F
+:1016A000C000411B08700B80C800411B077002007E
+:1016B0008CA0E001C0005B1BA55306A003700000D6
+:1016C0007C003020382182A721004800661B0920B9
+:1016D000200000267810801BC0007F1BBAA72000C6
+:1016E00048007E1B40007E1B0827B0A6200090A269
+:1016F000400099A30000A1A40000A9A50000780063
+:10170000601B06A07C00FF814000C11B9820A12027
+:1017100030000C7084A0FF004000921B0770040092
+:10172000047084A00400C0008D1BA8211770000065
+:101730000B8112711A721E73227426750C7885A0A3
+:1017400000000270A653077001000120FD04042070
+:1017500082A00500C800B01B09202200042184A03B
+:101760000040C000A21B107084A000F04000B91B14
+:10177000077008007800BD1B08710381C800A21B18
+:101780000770020084A1E001037000007C000120CA
+:10179000FD04042082A00400C800CD1B7800D01BEB
+:1017A00006A07800D21B85A001007C007E0E71206F
+:1017B0000052082D5870026805A0C000DD1B5E7144
+:1017C0005A717F0E7C00082C5878026005A0C0007A
+:1017D000E71B5E795A797C009120008014617810B3
+:1017E0008021006984A10001C000352084A100028D
+:1017F000C00031201C6805A0C0003D20036000002F
+:10180000082C5C7865A0C000051C5A797800061C7D
+:1018100002615E799120018078108C227C007E0E1E
+:101820007120005258706DA040001A1C00685A7058
+:1018300005A0C000191C5E70FF8D7F0E7C007E0D20
+:101840007E0C7E0F7920005280AF16006020006071
+:1018500005A04000431C6820146806A3C000331C88
+:10186000286884A0FF0006A44000361C602D780084
+:10187000241C006805A00260C000421C80AF160056
+:1018800006AC4000411C002C5E78002D7F0F7F0CC1
+:101890007F0D05A07C007E0D7E0C7E0F792000520E
+:1018A00080AF16006020006005A040006B1C68201F
+:1018B000146884A0FF0006A340005E1C602D780021
+:1018C000501C006805A00260C0006A1C80AF1600B2
+:1018D00006AC4000691C002C5E78002D7F0F7F0C49
+:1018E0007F0D05A07C007E0D7E0C7E0F79200052BE
+:1018F00080AF1600602000606DA04000901C14684E
+:1019000006A34000831C602D7800781C006805A0A9
+:101910000260C0008F1C80AF160006AC40008E1C19
+:10192000002C5E78002D7F0F7F0C7F0D05A07C00C2
+:101930009120008069204052006886A0000040008D
+:10194000A31C91200180E37809007C008068BCA082
+:1019500000FF412021004920040051201000781090
+:10196000D219388784A71F00C000AC1C91200180C9
+:1019700001200A807800C31C01200C807800C31C61
+:1019800078109C1A01200D807800C31CC270612061
+:1019900000001B600100912080407C000460082C46
+:1019A00063200000847800808678887805A08A7992
+:1019B0004000DA1C022C7800DB1C8E797C00076862
+:1019C00003017E0C61200052082D6B200000846012
+:1019D00000808660886005A08A614000EF1C022DAF
+:1019E0007800F01C8E617F0C7C007810031D400095
+:1019F000021D7E0C9C6065A04000FD1C7810171A2B
+:101A00007F0C9F60000078109A197C008C7865A08C
+:101A10004000151D91200080847801808678042C78
+:101A20008E7805A0C000131D8A7800809120018067
+:101A30007C00A920100006A0048086808E81C8004A
+:101A40001F1D00A27000231D78001A1D86808E8144
+:101A50007C007E15A920100005A04000491D1AA198
+:101A6000C800491D13828D8148003A1D1AA1C80083
+:101A70003B1D7000411D78002F1D1AA10823108204
+:101A80007000411D78002F1D7E00003284A0FFF7FA
+:101A900080207F007F157C007E00003285A000083A
+:101AA0007800451D9479D07006A14000BD1D91209D
+:101AB000008071202000047005A0C000BD1D0870CA
+:101AC000087206A2C000BD1D86A20800C000BD1D90
+:101AD00071201000781080194000BD1D9C7A987B01
+:101AE000A47CA07D84A100FF40008B1D312000005C
+:101AF0000B81B5860B81B5860B81B5860B81B586CA
+:101B00000B81B5860B81B586002110A2002619A392
+:101B1000A1A40000A9A500007800951D07810480FC
+:101B2000048010A299A30000A1A40000A9A50000B0
+:101B30000920200078107B19912001804000B41DFD
+:101B400078109A19A8780080AA7886A00200C000B0
+:101B5000BD1D91200080E3780200AB780000CC78B6
+:101B600085A00300CE78912001807800BD1DAB7860
+:101B7000000078104921046084A00F007900C21D84
+:101B800071201000912001807C00D21DF41D1A1ECE
+:101B9000D21D371EE11DC91FE41FD21DEE1D141EEC
+:101BA0007F1EEE1E571F691FE01F39200004DC78DE
+:101BB00005A7DE78086005A70A60781064209C609D
+:101BC000DA78781031217C00DC7884A000014000B4
+:101BD000E81D7800D21D1C6085A080001E60780082
+:101BE000FB1D7810C41BC000D21D78106321DC7867
+:101BF00084A000014000FB1D7800D21DDF780000AA
+:101C00000460078084A0FF00D27801809F600000FC
+:101C10004000111E781064204000111EDC7885A061
+:101C20000001DE787800131E781088207C00781080
+:101C3000C41BC000D21D78105F21DC788CA0000E80
+:101C4000C000231E84A00001C000251E7800D21D04
+:101C500078106420C000361E04618CA1FF0086A1AC
+:101C600007004000212086A10F00400021207810AD
+:101C700088207C00DC7884A0000140003E1E7800B3
+:101C8000D21DDF780000146711200100A920010097
+:101C9000186084A0FF0005A04000611E1120010013
+:101CA000BCA700FFA92020008EA001004000611EFB
+:101CB0003920000011200200A92000018EA002009E
+:101CC0004000611E78007C1E7810C51991200080AC
+:101CD0002B6800002F680000086884A0DEFF0A68F7
+:101CE000E8AD1000912001807000751E7800631E21
+:101CF000118240007C1EA92000017800631E78102C
+:101D00009A197C0001206752042084A000804000C2
+:101D10004920146178108021006984A101004000ED
+:101D2000A01E286084A0FF00C0004120006884A09D
+:101D3000010040004920036800000B6800000768AC
+:101D4000000078005120112001002060F4D04000F4
+:101D5000A81E95A20200C4D04000AD1E95A20800A6
+:101D6000CCD04000B21E95A200041C6084A00200EA
+:101D70004000B91E95A204002C608CA0FF0082A137
+:101D8000020048004D2082A11B00C8004D204000E9
+:101D90004D200E692C6007808CA0FF0082A10200FC
+:101DA00048004D2082A11B00C8004D2040004D205E
+:101DB0001269306005A0C000DC1E01201E000080FA
+:101DC0001668286084A0FF0040004920066828604B
+:101DD000078084A0FF00400049200A68026A78005A
+:101DE000512001204052042086A00700C000531F4C
+:101DF00001206752042084A0008040004920146123
+:101E0000781080210120525204201020FF824000CF
+:101E10000E1F80A00500042084A0FF0006A1C000C2
+:101E2000531F91200080046A086B186484A4030087
+:101E300040002D1F28618CA1FF000180C000231FDE
+:101E4000002110A24800531F78002D1F0180C00000
+:101E5000531F002112A24800531FFF824000531F4E
+:101E600084A40C004000471F28610F818CA1FF0053
+:101E700082A00400C0003F1F002118A34800531F88
+:101E80007800471F82A00400C000531F00211AA33E
+:101E90004800531F306005A040004D1F00801668A9
+:101EA000066A0A6B91200180780051209120018000
+:101EB00078004D2014617810802191200080086BFB
+:101EC00018834800651F0A6B91200180780060200C
+:101ED0009120018078004D202460078084A0FF00BD
+:101EE0004000871F86A08000C000C71FA9200800EF
+:101EF0006920107691200080006884A0FFFC0268B1
+:101F0000E8AD08007000831F7800791F91200180E0
+:101F100078005120286015A04000C71F1461781078
+:101F200080217E0C7E0DE8AD0700912000800068C6
+:101F30000DA04000C31F06A240009E1F682178002C
+:101F4000941F602100600268682C7810AC197F0D26
+:101F500018680DA04000BB1F602000621A6A1C6A4E
+:101F600002621E6878108919A02D9821A9203100DD
+:101F7000A353602D7810CB1C7800BE1F086800802A
+:101F80000A68912001807F0C7800602091200180F8
+:101F90007F0D7F0C78004920146178108021006843
+:101FA00084A001004000392091200080046A108242
+:101FB0004800DC1F066A9120018078006020912093
+:101FC000018078004D207810C41BC000D21D146120
+:101FD00078108021BE60BB600000006984A1080009
+:101FE0004000F31F206085A00001226084A1010051
+:101FF0004000492084A10001C000352084A10002D6
+:10200000C00031201C6805A0C0003D20046084A0F1
+:10201000FF0086A00F00C0000C2078106321DF783D
+:1020200000000460078084A0FF00D27801809F60D8
+:102030000000400021207810642040002120DC783E
+:1020400085A00001DE787C00D7780000DB780000F6
+:10205000246084A000FF26607810AC3A40004F1D39
+:102060007810E91B78004F1D0920170078005320D5
+:1020700009200E0078005320092007007800532023
+:10208000092035007800532009203E0078005320B5
+:10209000092004007800532009200600780053200E
+:1020A000092016007800532009200100246084A034
+:1020B00000FF05A12660912000807810CB1C9120A4
+:1020C000018078004F1D78109A1978004F1DD47840
+:1020D0006DA0C0006F20002CD678DA789F600000D9
+:1020E00078007B20002C9E689F600000D678002D31
+:1020F0000260D87806ADC0007B200260D0780180F5
+:10210000D278C0008720DC7884A0FFFEDE78D87803
+:10211000602006A07C002EA030251C61A26184A155
+:10212000FFE11E6084A16000400097207E0E7810C1
+:10213000D3487F0E9665A6659A66AA66AF600000D2
+:10214000B360000014677810C51991200080A0606A
+:1021500084A00080C000BE20086884A00100400068
+:10216000BE20912001807810311A912000807810D3
+:10217000CB1C91200180D7780000DB78000078002C
+:102180003021246096A00100C000C5200080266098
+:10219000106A14689120018002A24800D4204000F7
+:1021A000D420392000027810312178003021082C09
+:1021B00091200080A06084A0008040000121006880
+:1021C00065A040000621046A7E0E71204052007016
+:1021D00084A001004000FB20487006A2C000FB2044
+:1021E000046B1C2360210263002305A0C000F620BD
+:1021F0000269602202617F0E78000D216021026277
+:1022000006697F0E78000D21006865A04000062158
+:1022100002610269C0000A210669602103600000B2
+:102220006021A06084A0008040001721086884A07D
+:10223000FCFF0A681068008012689120018008681D
+:102240008CA040004000262186A040000A6878103B
+:10225000421A9120008078106F2291200180DB7853
+:102260000000D77800007C00086005A70A60912074
+:1022700000807810CB1C91200180D87865A04000A8
+:1022800044219C60DA789F60000078003421D77880
+:102290000000DB7800007C009079947800800AA12F
+:1022A000C800502106A09678D270047805A040009E
+:1022B0005E2101800678C0005E2168005E219120C9
+:1022C00080407C00392077217800652139207D21EC
+:1022D000042705A04000762100AC6820086B0C6C38
+:1022E0001069146A0A690E6A126B166C38877800D6
+:1022F00065217C00030009000F0015001B00000091
+:1023000015001B0000007E0C78103B3C682C7F0CF5
+:102310007C001000F7216800F72129200000CB780D
+:1023200000008C7865A04000F0210920745204213F
+:1023300084A001004000BE21046086A00301C0000B
+:10234000BE21186005A0C000BE21146005A0C00019
+:10235000BE217E0D69200000186884A00100C00025
+:10236000BD210C60C6701060CA70C37020801B68ED
+:102370000100912080407F0D7810F21C7800F5213B
+:102380007F0D7810F8214000F021046294A2FF0034
+:1023900096A203004000D021046296A21001C00062
+:1023A000DE21CB780100046294A200FF1782118223
+:1023B0004000DE21FF85C000F021108202A2C8008B
+:1023C000F0217E05781007227F054000EB21E078A0
+:1023D00086A003004000F0217800DE212885C8781F
+:1023E00005A040008E21FF854000F721912080400C
+:1023F000B078D6707C00AC7BB079D47002A1C000FC
+:102400000122002305A07C004800052202A37C00D5
+:1024100002807C000120FD04042082A00500C80089
+:1024200021229120008071202000047005A0C000AE
+:1024300056220870087206A2C000562286A2080022
+:10244000C00056227120100078105B220920200065
+:10245000046086A00301C0003022286005A0C000EF
+:10246000302209200C007810761940004922C478E7
+:102470000080C67886A00200C0005622912000800D
+:10248000E3780300C7780000CC7885A00003CE78FD
+:102490009120018078005622C77800007810F21C45
+:1024A000AC79B07800800AA1C800542206A0B278A6
+:1024B00006A071201000912001807C00078104801B
+:1024C0000480B87AB47BC07CBC7D10A299A30000C4
+:1024D000A1A40000A9A500007C0009205B52912066
+:1024E00000800A207E0F7E0E71204052007086A070
+:1024F0000000C000892209201252042105A0C0005A
+:10250000892279200001307884A0C000C00089228F
+:10251000180089221B784B007F0E7F0F7C007E0FF6
+:102520007E0E7120405291200080007086A0000035
+:10253000C000A22279200001307884A0C000C00031
+:10254000A2221800A2221B784D00912001807F0E4C
+:102550007F0F7C007E129120002371204052792051
+:1025600000014B780F009800B52238787800AE2231
+:10257000A9204000007882A004004800BE22A920C3
+:1025800060009B780000AF780000AF78000070001A
+:10259000C8227800C022007882A004004800D72218
+:1025A000B77093001920F04F781013232F7001801B
+:1025B0007800E322B77000001920704E78101323C2
+:1025C0001920AF4E781013232F7000800370000085
+:1025D00078102024047084A00F007E010920FD04DF
+:1025E0000C218AA105004800F8223800FE2285A0AF
+:1025F0008062780000232800FE2285A08062780097
+:10260000002385A0C0627F0106780F7804B243786A
+:10261000D800537880000B7808004770080053708A
+:102620007F524F7000007F1200207C007E137E14CA
+:102630007E157E04A1202B01042305A09A7840007A
+:1026400033231883242318839823A82484A400FF09
+:1026500040002B2382A40001A92000012020A653C2
+:1026600005A0C00022231833780019237F047F15AA
+:102670007F147F137C008CA10F0011200101042224
+:1026800084A0F0FF05A11220781020247C001120E6
+:102690000101A92009000B8170004D237800482317
+:1026A0008CA1000E042284A0FFF105A112207C0061
+:1026B00009200101A9200500138270005E23780023
+:1026C000592394A2E000042184A01FFF05A20A2040
+:1026D0007C0011200101A9200C000B8170006F23E8
+:1026E00078006A238CA100F0042284A0FF0F05A1CA
+:1026F00012207C0011200201042284A0CFFF05A13A
+:1027000012207C000381038080A020007E0C6120C9
+:1027100000019A60AC62AC637F0C7C000381038093
+:1027200080A022007E0C612000019A60A46084A039
+:10273000DFFFAE607F0C7C000381038080A022005D
+:102740007E0C612000019A60A46085A02000AE602C
+:102750007F0C7C000381038080A020007E0C612020
+:1027600000019A60A460AE621020A460AE631820DD
+:102770007F0C7C00912000807E0C7E0E186805A0E6
+:102780004000FE2361200076781006244000E823F4
+:10279000A9200000612000757E0C781006244000FE
+:1027A000D6237F0C608C7000D4237800C923780076
+:1027B000FE237F0082A000757120405286708271D6
+:1027C000012004006E7093700F0073700000781089
+:1027D0006A227800FA23C06005A0C000FE237120A1
+:1027E00040528271002C8A70012006006E70937036
+:1027F0000F007370000078106A220120000078003A
+:102800000024012001009120018005A07F0E7F0C93
+:102810007C00042C05A040001D2460200C6006A351
+:10282000C0001A24106006A2C0001A24146006A179
+:10283000C0001A2406A078001F2400607800072436
+:1028400085A001007C00112041520C228CA10F00B8
+:1028500011203B01042284A00001400036242120E5
+:1028600004FF22210B810B810B810B818DA1000FB5
+:1028700004217C007E0EE4688CA0200040008A24A5
+:1028800084A00600C0008A241460078084A00F0082
+:10289000038003800380F0A08054047084A00A00A9
+:1028A000C0008A24087194A100FF40008A248CA1F2
+:1028B000FF0001200C0006A140007124012012003D
+:1028C00006A1400075240120140006A140007924CF
+:1028D0000120190006A140007D240120320006A13C
+:1028E0004000812478008524092012007800872484
+:1028F0000920140078008724092019007800872413
+:10290000092020007800872409203F0078008724D0
+:1029100011200000002105A20A707F0E7C006800D3
+:102920008C2491200080712000007E00187084A00B
+:102930000100C00093247F0071201000CA707F0046
+:10294000C670C3700280DB704107DF700600712023
+:1029500000001B700100912080407800AA247E10A6
+:102960007E007E12912000233C7F587E307C387D93
+:10297000C277C674CA76CE7594A53F009CA40300A6
+:1029800084A40F007900C124D324D324D3240D2898
+:10299000093AD12402250C25D124D124D124D124D3
+:1029A000D124D124D124D12478108C24078584A06B
+:1029B0001F007900D82416250D28C729C42AEC2A1F
+:1029C0008C2D37309A30FB3080313832D6320225A8
+:1029D000E9280C30F824AC3DCC3D8F3F9B3F744040
+:1029E000F824F82449414D41AA3DF824FA3EF82440
+:1029F0005E3C0C25F82478108C241800B1247F123A
+:102A0000912001807F007F107C001920494F7810B1
+:102A100013232F7001001B784F007800FA2419202F
+:102A2000AF4E781013232F7000801B78CD007800F4
+:102A3000FA24427209200F520B20000084A50100E5
+:102A4000C000723C4000332578108C2403700000D5
+:102A50004B70000043700000377000007810E039C0
+:102A60001800B12409200F520B200000687005A047
+:102A7000C000FE256C7084A0070079003C25352637
+:102A8000442550256D258F25DC25B5254425781056
+:102A9000C839092048007810D82EC0004E25037090
+:102AA00004007800FA247810C839C0006B258070C3
+:102AB000078082789B781000AB780C009B786000D0
+:102AC000AB7801005B7804000920DD007810CC2E83
+:102AD000C0006B250370040093700F007800FA2487
+:102AE0007810C839C0008D258071078182789B7865
+:102AF00010008CA11F008DA1C000AA79AB78060040
+:102B00009B786000AB7802005B7804000920DD0050
+:102B10007810CC2EC0008D250370040093700F0038
+:102B20007800FA247810C839C000B3258071078175
+:102B300082789B7810008CA11F008DA1C000AA791B
+:102B4000AB7820008471AA79AB780D009B78600087
+:102B5000AB7804005B7804000920DD007810CC2EEF
+:102B6000C000B3250370040093700F007800FA24AE
+:102B70007810C839C000DA258071078182789B7887
+:102B800010008CA11F008DA1C000AA79AB780600AF
+:102B90009B786000AB7802005B7804000920DD00C0
+:102BA0007810CC2EC000DA2588708B700000682069
+:102BB0004A700370020093700F007800FA247810B6
+:102BC000C839C000FA2488706820146F7810BD38A6
+:102BD000502C78107A3A9B781000146884A01F005B
+:102BE00085A08000AA781C6E412001008C7084A012
+:102BF0000004012004004000FC25012006007800AC
+:102C00001D277810C839C000FA249B78100068701E
+:102C10006820146F7810BD38502C78107A3A08600C
+:102C200085A010000A60246805A040001C2682A030
+:102C3000060048001A2678001C2627680500146B39
+:102C40009CA31F009DA3C000587084A0008040007A
+:102C50002A2684A6010040002C269CA3BFFFAA7B45
+:102C600031202000412001000120030078001D27B1
+:102C70001800B1244C7485A4000040004F2680A0A9
+:102C800080523020507108812AA148004626092030
+:102C9000805264210465FF85C00060262184C00045
+:102CA00040265271037000004B700000407005A078
+:102CB0004000723C7800FA244C76B0A680525071E5
+:102CC000002678004B265271682558254A75502CED
+:102CD000346085A00000C0005D2608673A7784A7AD
+:102CE0003F034000962684A72100C0005D2684A7EC
+:102CF000020040007F2684A7040040005D26BCA798
+:102D0000FBFF0A6784A70800C0005D2684A71000A7
+:102D1000C0005D2684A70002C0005D2684A70001D4
+:102D200040009626186005A0C0005D26BCA7FFFEE7
+:102D30000A67236800001C6E84A60E00186140001C
+:102D4000A6261C6002A14800A9264000A9267800FA
+:102D50005926FF81C0005926C368000084A780005F
+:102D6000C000B1260C702260BCA77FFF0A677810F4
+:102D70007A3A1800B1249B78100046A07810C83920
+:102D8000C000FA24146B9CA31F009DA3C0005870C0
+:102D900084A000804000CD2684A601004000CF26FC
+:102DA0009CA3BFFF84A610004000D5269DA3200051
+:102DB000AA7B408884A60E00C000E026BDA71000B4
+:102DC0000A6778001B2758718CA100084000CB349B
+:102DD0001120200084A60800C000F126108284A6DD
+:102DE0000200C000F1261082AA7A40887810E039EB
+:102DF000146A0C6108818CA1FF00E0A10075642CAD
+:102E0000FF8C40001227146006A2C000FC26B860A8
+:102E10000180BA60C000F7267E0C602A086085A099
+:102E200000010A607F0C780035267810C839C00090
+:102E3000FA24602A0E61AA794088327101200100CB
+:102E40007E005C7184A118004000382784A1100026
+:102E500040002B277810D036C0005B2784A10800E3
+:102E600040003827A06984A10006C00038277810E8
+:102E7000BB3578005B27A06984A1000840004F277C
+:102E80007E0C7E026029006085A000200260046143
+:102E90008DA1100006617F027F0C7810D036C00033
+:102EA0005B27A06984A100024000572778100C36E8
+:102EB00078005B2784A10004C0003427A06984A1A6
+:102EC00000104000662714698CA100FF0F81781064
+:102ED0008B237F0002708CA6E00084A66000400077
+:102EE000742786A06000C00074278DA10040FF8871
+:102EF000400079278DA104005A79B6699B7860005B
+:102F00000028AA789B78610018688DA0008084A0B2
+:102F1000FF7F1A698CA680004000982797700000F8
+:102F20008AA00D00500096278AA00C0096710120FF
+:102F30000C000C809A71AA7808800C814000D13472
+:102F40008CA1F800C000D1347E157E137E14A12020
+:102F50002B019B7800000080AC8080AD0B00982096
+:102F6000A6537F147F137F15146807808278946DB1
+:102F7000D67DDE7D986ED27EDA7E7810C839C000AC
+:102F8000CF272C7003804800C8271920AF4E781037
+:102F900013232F700080307884A0C000C000CF279A
+:102FA0009800D727086084A0EFFF0A607810E03906
+:102FB00078002325007284A2070086A00100C000CB
+:102FC000E4271B784F007810E0397800F527B46AC1
+:102FD00095A200205A7A1B784F007810E0390072D1
+:102FE000002505A64000F52784A2070079100328D4
+:102FF00080AD0900367084A2070086A00100C000E1
+:10300000FA24186000801A607800FA240B284B4BD1
+:103010004B4B3A4B4B4B0B283A4B0B2878108C24DC
+:103020007810C8397E0F79200052CC787F0F84A0A9
+:103030000100400031286C7086A00100C0002028EB
+:103040006E707800C4286C7086A00500C0002F2820
+:10305000887068201B68040017680000206885A03D
+:10306000080022686F700000112004006C7186A1B6
+:1030700001004000522886A10700C0004228092014
+:1030800038520B20050078005228092013520421E1
+:10309000092012520A20092038520B2001006F70BB
+:1030A000000073700100780054286F7000007810E1
+:1030B00087487E15A9201000392000007810B0370D
+:1030C000B8A700017000632878005B287F150070A6
+:1030D0007900672895287C287C286F2895289528D2
+:1030E0009528952821205A52042405A040009528AF
+:1030F00006ADC0007C280068222078008C2820685B
+:1031000084A00100C0008828146F7810BD387810A2
+:10311000A23478008C2860706020006802601A6A0F
+:1031200017680000206885A0080022687810DC1C61
+:10313000212000767810D12821205A527810D128E9
+:103140007E15A9200000212000757810D128208448
+:103150007000A9287800A2286120005521200200D3
+:10316000A920000118601061FF814000B82802A169
+:103170005000B82812601B600000E0AC1000700026
+:10318000C0287800AF282184C000AD287F159C702E
+:1031900084A000804000CB287810CE3A0370000055
+:1031A0004B7000007800FA247E04042405A040003F
+:1031B000E528682000687E001A6A17680000206809
+:1031C00085A0080022687810DC1C7F007800D328D6
+:1031D0007F04232000007C0082A203005000EF281F
+:1031E00078108C2400237900F228F5286829852995
+:1031F00082A202004000FB2878108C246C706F7053
+:10320000000093700000790002290A290A290C297C
+:103210004029D7340A2940290A2978108C2480773C
+:103220007810B0378077BCA7000F7810BD381860D1
+:1032300005A0400037292120007609200400112034
+:1032400010007810A029400037297E15A920000021
+:10325000212000757E040920040011201000781040
+:10326000A0297F0440003629208470003629780088
+:1032700027297F15388784A71F00C00012297800EE
+:1032800023257800232580777810BD38186005A0A5
+:103290004000662921200076092005001120200029
+:1032A0007810A029400066297E15A9200000212061
+:1032B00000757E0409200500112020007810A02947
+:1032C0007F04400065292084700065297800562914
+:1032D0007F1578002325002279006B296E2970293B
+:1032E000702978108C24092012006C7086A00200CE
+:1032F0004000792909200E00186884A00080400051
+:103300007F291A696F7000007370010078005639C8
+:103310000022790088298D2970298B2978108C2426
+:1033200078108748007086A00100C00067347810CC
+:10333000B834086084A0EFFF0A6078105A34400067
+:10334000673478003526042405A04000C32968208E
+:10335000042D7E00146806A74000AF29202D7F00B1
+:103360007800A1297F0022201A69176800002068D0
+:1033700005A222687810DC1C1060018012600860D1
+:1033800084A0EFFF0A607810B8347C0085A00100AB
+:103390007800C22900237900CA29CF29CD29682ABB
+:1033A00078108C24EC7884A00100C000E329007020
+:1033B00086A00400C000DB297800062A7810B83403
+:1033C000086084A0EFFF0A6078006734E47805A005
+:1033D000D000062A1800FA24082084A03000C0007B
+:1033E000F2291B784F007800FA24EC7884A00300BF
+:1033F0004000EE29002184A007007900FC293F2A23
+:103400004A2A302A042ABB39BB39042A592A78109F
+:103410008C24007086A00400C000202A6C7086A056
+:103420000200C000162A11200200192000007800B6
+:10343000E9286C7086A006004000102A6C7086A0F7
+:1034400004004000102AE47984A1300040002A2AB8
+:10345000EC7884A00300C0002C2A78000C300120F6
+:1034600003007800A02D186884A000804000372A4F
+:103470001B681D0078108F372B7808301B7856009A
+:103480007800FA24186884A000804000462A1B684F
+:103490001D0078108F3778008639186884A0008066
+:1034A0004000512A1B681D0078108F372B78083098
+:1034B0001B78CA007800FA24186884A000804000B5
+:1034C000602A1B681D0078108F372B7808301B7816
+:1034D0008F007800FA2484A50F00C000852A0070B0
+:1034E00079006F2A2325792A772A6734673467346D
+:1034F0006734772A78108C247810B834086084A058
+:10350000EFFF0A6078105A3440006734780035269F
+:10351000E47805A0D000062A1800062A082084A016
+:103520003000C000942A1B784F007800FA24EC7811
+:1035300084A003004000902A002184A107007900A4
+:103540009E2AB02AB42AA82AA62ABB39BB39A62AA1
+:10355000B13978108C24781097372B7808301B7885
+:1035600056007800FA24781097377800863978105A
+:1035700097372B7808301B78CA007800FA24781027
+:1035800097372B7808301B788F007800FA240023B7
+:103590007900C72ACC2ACA2ACE2A78108C2478002F
+:1035A00080311B680800A3780000E47984A1300012
+:1035B00040008031EC7884A003004000803184A179
+:1035C00007007900E02AE82AB42A302A5639BB39A4
+:1035D000BB39E82AB13978106A397800FA2482A216
+:1035E00005005000F22A78108C2400237900F52A77
+:1035F000F82A4D2D5B2D00227900FB2A152B022B7A
+:10360000152B002B322D78108C249B781800A8786D
+:1036100084A0FF0082A0200048006B378AA004002D
+:10362000C8006B377900112B6B376B376B37193745
+:103630009B781800A87984A180004000262B780090
+:103640006B37007005A0C0001C2B1120040078000F
+:10365000E93284A1FF008AA01000C8006B3779000E
+:103660002E2B402B3E2B582B5C2B172C6B376B379C
+:10367000192C6B376B372E2D2E2D6B376B376B3725
+:10368000302D78108C2484A6001040004D2B012092
+:103690000005008000803A781B788D007800FA24BD
+:1036A000186884A000804000562B1B681D0078001D
+:1036B000442B780056391B681D0078007B37206941
+:1036C000226984A60018C0009D2B206884A00100F8
+:1036D000C000A52B186886A00800C0006E2B1B68D0
+:1036E000000084A600044000132C84A68000400043
+:1036F000992B97700000186884A03F008AA00D00E5
+:103700005000992B8AA00C00967101200C000C80AF
+:103710009A719B786100AA787E157E137E14A12091
+:103720002B019B7800000080AC8080AD0B009820BE
+:10373000A6537F147F137F151B7858007800FA2456
+:1037400084A600104000A52B1B7865007800FA24A1
+:1037500084A6600040000F2C84A6000840000F2CB7
+:1037600084A60080C000B32B7800CB2BB4A6FF7FCB
+:103770005A7EB66EDC7AD879D0781B80C800BE2B12
+:10378000008084A03F0008A191A20000986B002156
+:1037900002A3B268946B002203A3AE6884A6004023
+:1037A0004000D32BB4A6FFBF5A7EB66E007086A031
+:1037B0000300C000E02B78103D4978103A4B1B788D
+:1037C00064007800FA2406A07810414CB06AAC6915
+:1037D000986C946B002205A14000EF2B002222A4DC
+:1037E00000211BA3AA6CD27CDA7CA66BD67BDE7B85
+:1037F000002305A4C000012CB5A600405A7EB66E79
+:103800001B7864007800FA241B786400002215A15C
+:10381000C0000B2C78104B4B7800FA247810964B94
+:103820007800FA241B7865007800FA241B78580089
+:103830007800FA2478108C2478007A2C206984A1EE
+:1038400000014000312C8CA1FFFE22697E0C5470D7
+:103850006020006084A0FFEF0260046084A0F5FF98
+:1038600006607F0C7800692C84A100024000692C5E
+:103870008CA1FFFD22697E0C54706020006084A042
+:10388000FFDF0260046084A0EFFF06600820482C80
+:103890007F0C84A108004000692C7810B93878109A
+:1038A000BB35FF884000692C9B7860000028AA780F
+:1038B000587EB5A604005A7E84A60004C000632C7E
+:1038C0002B7808301B7856007800FA242B780830C3
+:1038D0001B7865007800FA24587E84A60004C00096
+:1038E000722C1B7858007800FA241B786500780049
+:1038F000FA24780073377800733719200000907924
+:103900008CA10700C000882C206884A00001400022
+:10391000782C092008009B781000A87894A0FF005C
+:1039200086A20100C000BF2C0023A87C00A41820A0
+:1039300002A14000B72C48009C2C7800B92C80A331
+:10394000020002A1C800B72C20698CA1FFFC2269EB
+:103950007E0C54706020006084A0EFEF0260046071
+:1039600084A0E5FF06607F0C587EB4A6FBFF5A7E5C
+:1039700078006A2C78001B2CA824A87AF000B92CB7
+:1039800078008A2C84A2F00086A02000C0001F2DA1
+:1039900018831883002302A14000CF2C4800CF2CAD
+:1039A00078001C2D86A223004000782C1C6884A07F
+:1039B000F1FF1E68587E84A6F1FF85A0100030201C
+:1039C0005A7E086085A010000A607E0C547060204A
+:1039D00004600820482C7F0C84A110004000F32CC8
+:1039E0007810B9387810D0367800022D7E0C5470DB
+:1039F000602004600820482C7F0C84A1080040004F
+:103A0000692C7810B9387810BB35FF884000692CD4
+:103A10009B7860000028AA78B5A604005A7E84A688
+:103A20000004C000162D2B7808301B785600780053
+:103A3000FA242B7808301B7865007800FA24A87ADD
+:103A400078008A2C1883002302A14000282D48000A
+:103A5000282D78008A2C84A28000C0007B37780053
+:103A6000733778007B3778006B379B781800A8781D
+:103A700084A0FF008EA0010040003D2D78108C2412
+:103A8000A87A94A2FF00A87884A0FF008AA004006E
+:103A9000C8006B377900492D6B3708356B376536B1
+:103AA00082A20000C000532D78108C2478108F372C
+:103AB0002B7808301B7865007800FA2482A2030076
+:103AC000C000612D78108C2484A40080C000842D57
+:103AD0006C7005A040006B2D78108C24146F8277D9
+:103AE000BCA7000F7810BD38086085A021000A60CF
+:103AF000388784A71F00C0006F2D781093376F7030
+:103B00000200092038520B2009007800862D781019
+:103B10009F372B7808301B7865007800FA2482A242
+:103B200004005000922D78108C2400237900952DEC
+:103B3000982D812EB42E86A2030040009E2D781071
+:103B40008C24012000007E00C06805A04000A72D45
+:103B500003700300A06884A000204000B02D08601E
+:103B600085A002000A607F003E70007084A00700FC
+:103B70007900B72D2325C12DC12DB62FF22F232576
+:103B8000F22FBF2D78108C2484A60010C000C92D00
+:103B90007810874840005B2E68788CA0FF004000BA
+:103BA000112E86A10800C000E02D7810B8340860FE
+:103BB00084A0EFFF0A6078105A344000112E78106C
+:103BC00087487800F82D86A12800C000112E7810B3
+:103BD0008748086084A0EFFF0A60186005A04000D5
+:103BE000F82D01801A6005A04000F82D018005A085
+:103BF0004000F82D1E60206884A0010040002325AD
+:103C0000206884A0FEFF226860707E0C602000683F
+:103C100002607F0C0460026805A0002DC0000E2E1B
+:103C200002600660780023257E017810E52E7F0172
+:103C300084A600DF1E682B680000146FFF8140001F
+:103C40005B2E86A10200C0005B2E84A60008C00087
+:103C50002E2E84A6600040002E2ED878DC7A2E68A6
+:103C6000326A206884A00008C0005B2E178794A2E7
+:103C70000F0013821382138290A2805490A200003E
+:103C80001C2284A30001C000442E78004A2E10821A
+:103C9000042285A018001220118284A30004400091
+:103CA000572EA06884A00001C000572E7810692FFD
+:103CB00078002325086085A002000A60166918684C
+:103CC00084A000804000632E3C701A688CA600DF40
+:103CD0001E697810A9347810B834C000702E0860BE
+:103CE00084A0EFFF0A60206884A00100C000792E44
+:103CF0007810A23478007D2E607060200068026029
+:103D00007810DC1C7800232582A204004800872E4E
+:103D100078108C24002279008A2E852E8E2E9B2EE0
+:103D20008E2E007086A005004000972E78108F37E9
+:103D30002B7808301B7865007800FA24907807808B
+:103D4000018084A0070080A018009A78A8798CA12F
+:103D5000FF0086A103004000B02E86A100004000B5
+:103D6000B02E78006B371B7865007800FA24206845
+:103D700085A004002268FF82C000BF2E78108F3714
+:103D80007800C62E11824000C42E78108C24781042
+:103D90009F372B7808301B7865007800FA242C7048
+:103DA00003804800D62E1920AF4E781013232F70B1
+:103DB00000807810E039307884A0C000C000E22E86
+:103DC0001800E22E1A7906A07C0085A001007C0074
+:103DD00084A66000C000EF2E2F680000336800004A
+:103DE0007800682F84A60008C000112FB46884A052
+:103DF000004835A684A60008C000112F9869946A6F
+:103E00002E69326A3C7005A0C000092F002205A16E
+:103E10004000102F3F701500007086A00600400083
+:103E2000102F781087487C0084A620004000332F94
+:103E300084A6004040001F2F2F6800003368000058
+:103E40007800092FB46884A0004835A684A60040F5
+:103E5000C000192F3C7005A0C0002D2F3F70150029
+:103E6000D879DC7A2E69326A7800092F84A600405E
+:103E700040003D2F2F680000336800007800092FB4
+:103E8000B46884A0004835A684A60040C000372F3F
+:103E90003C7005A0C0004B2F3F701500D879DC7A2C
+:103EA000D078FB80C800522F008084A03F0008A17A
+:103EB00091A200002E69326A002105A2C0005F2F86
+:103EC0007800092F007086A006004000682F781047
+:103ED000414C7800092F7C00086085A000020A6030
+:103EE00084A300024000752F086085A002000A60CC
+:103EF0001B6806008F68000093680000306A2C6918
+:103F00003E6A42692F68030033680000376820006A
+:103F1000976800009B682000B3680000AF6800004D
+:103F200000707900902F23259A2FA32F982F982F78
+:103F3000982F982F982F78108C24206884A0010047
+:103F4000C000A32F7810A2347800A92F6070502CE5
+:103F5000602000680260602A21205A52042405A0D3
+:103F60004000B22F20207800AB2F222D6B200000C4
+:103F70007C007810A9347810B834086084A0FFFD64
+:103F80000A602B6800009B780E00146F176802000F
+:103F90007810894C84A600084000CF2F1C698DA1A1
+:103FA00000201E69186884A000804000DF2F687818
+:103FB0008CA0FF004000DD2F1B681E007800DF2F63
+:103FC0001B68000021205A52042406AD4000E62F51
+:103FD000607400682220C36800003C6A4069326A4D
+:103FE0002E697810DC1C780023257810E52E2B68CC
+:103FF000000001200E00146F7810E6398CA0FF003D
+:104000001669186884A00080400005303C701A686A
+:104010008CA600DF1E696F700000780023250070F9
+:1040200005A0C00012307800232506A0781087482C
+:10403000176800001B6814008CA600DF1E692B683F
+:104040000000206885A0FF002268007079002530FC
+:1040500023252F302F3031303130313031302D3079
+:1040600078108C247810B834086084A0EFFF0A60C0
+:1040700078007234002379003A303D303F30983078
+:1040800078108C2484A60080C0007D3000707900F8
+:1040900046302325503050306C30503079306C3001
+:1040A0004E3078108C2484A6600086A06000C0008A
+:1040B0006830B4A6DFFFB4A6FFBFB5A600205A7EC5
+:1040C000B66E1C6884A0DFFF1E68781087487810E1
+:1040D0004B4B7800563984A6002040005A301868AF
+:1040E00084A00080400079301B68150084A6004041
+:1040F000400079301B68070078106A397800FA248C
+:10410000B4A6FF7F5A7EDC7AD879D078D2791B802A
+:10411000C8008830008084A03F0008A191A2000060
+:10412000986B002102A3B268946B002203A3AE68CF
+:104130001B7865007C0078108C24002379009D306A
+:10414000A030A230EB3078108C2484A60080C00010
+:10415000DA3000707900A9302325B330B330CF3086
+:10416000B330D630CF30B13078108C2484A66000C4
+:1041700086A06000C000CB30B4A6BFFFB4A6FFBFCE
+:10418000B5A600205A7EB66E1C6884A0BFFF1E68CC
+:104190007810874878104B4B7800563984A6002059
+:1041A0004000BD30186884A000804000D6301B68F5
+:1041B00007001B78CA007800FA24B4A6FF7F5A7E55
+:1041C000DC7AD879986B002102A3B268946B002244
+:1041D00003A3AE68D2791B7865007C00206885A0B7
+:1041E0000400226878102139B5A6000878108F37AE
+:1041F0002B7808301B7865007800FA2400237900BA
+:10420000FE3001310331053178108C2478007B3782
+:1042100084A60004C0002E31E47984A1200040006F
+:104220001531EC7884A00300400015312B7809305B
+:104230009B786000AB78000084A6FBFF5A78E47995
+:1042400084A1200040002631EC7884A00300C00047
+:104250002A31012014007800A02D84A107007900E4
+:104260006631907A94A207009B786000A879FF815C
+:10427000400064319B781000A87B84A30100C0003B
+:104280005531A87BA87B86A30100C00048310920D6
+:10429000F7FF78004E3186A30300C0005531092096
+:1042A000EFFF7E0C54706020046004A106607F0C58
+:1042B0009B786000AB78000084A6FBFF5A782B78CF
+:1042C000093020698CA1FFFD8CA1FFFE22697800D6
+:1042D00056393F2A4A2A703178316E316E3156395B
+:1042E000563978108C2420698CA1FFFD8CA1FFFE2B
+:1042F00022697800603920698CA1FFFD8CA1FFFE46
+:10430000226978005639E47984A1300040008A316E
+:10431000EC7884A00300C000B131007086A00400D6
+:10432000C000A4316C7086A00200C0009A31112038
+:104330000200192000007800E9286C7086A00600B1
+:10434000400094316C7086A00400400094310070ED
+:1043500086A000004000FA24186885A000801A6832
+:10436000012014007800A02D84A107007900B53148
+:1043700056395639BD315639BB39BB39563956399C
+:1043800084A680004000EC319471FF814000EC3144
+:1043900082A10D00D000CD31977000007800D2319D
+:1043A00082A10C00967009200C009B786100AA790C
+:1043B0007E157E137E149870148110A29A7280A0CC
+:1043C0000B0000AD9820A1202B019B7800000881F4
+:1043D000AC81A6537F147F137F157800603984A6C3
+:1043E0000004C0002D32206884A001004000603924
+:1043F0008CA6600084A660004000013286A06000A8
+:10440000C00001328DA100408CA1FBFF5A79B66932
+:104410009B786000AB7800009B786100186885A0ED
+:1044200000801A68AA7808800C814000D1348CA1E1
+:10443000F800C000D1347E157E137E14A1202B011C
+:104440009B7800000080AC8080AD0B009820A653C4
+:104450007F147F137F151468078082787800603995
+:10446000186884A00080400034321B6808001B7864
+:10447000C0007800FA24002379003B324032D43265
+:104480003E3278108C24007084A0070079004532F9
+:1044900023254F3284325A324D3223254D324D324C
+:1044A00078108C241C6884A00020400068320860CA
+:1044B00085A002000A6078006832C06805A0C000CC
+:1044C000843220698DA101002269C368010000685F
+:1044D0006A7078007E3220698DA10100226900682F
+:1044E000066005A0C000723202601C6884A00E0045
+:1044F00040007E321470BA68307188A1007578006F
+:10450000803209200076042102680A2D6271B66E9D
+:1045100084A660004000D23284A60008C000983211
+:1045200084A6FF7FB6689468A6689868AA68781021
+:1045300087487800D23284A620004000AD32C0689F
+:1045400005A04000A4327810894C7800A73206A05C
+:104550007810414CD879DC7AAA69A66A7800B3321F
+:104560007810CA38AA69A66A7810414C84A60080DF
+:104570004000D23284A6FF7FB668DC7AD87984A660
+:104580002000C000CA32D0781B80C800C53200802D
+:1045900084A03F0008A191A20000986B002102A313
+:1045A000B268946B002203A3AE68780023257800DC
+:1045B0007B373770000082A206005000DE32781090
+:1045C0008C24007084A00700C0108C3A002379006E
+:1045D000E632E9321233263300227900EC3210330E
+:1045E0007B37F232103342338433037005000120ED
+:1045F000107768204A707E15A92031000320000042
+:104600000080700002337800FB327F1580AD090016
+:10461000367017680000B76800072368000827682D
+:10462000030078006B3778108C240370050001209C
+:10463000107768204A7080AD09003670002279003A
+:104640001E337B3724332433423324337B377810B3
+:104650008C24037005000120107768204A7080AD1B
+:10466000090036700022790032333A333833383358
+:104670003A3338333A3378108C2478109F372B78BC
+:1046800008301B7865007800FA2403700200807AF5
+:1046900094A2000F9B781800A87C84A41F0015A288
+:1046A00069200076042D082D6271682005A0400065
+:1046B0005D33146806A240007933006878005033F7
+:1046C000037005000120107768204A7036707E154F
+:1046D000A920310003200000008070006E337800B4
+:1046E00067337F1580AD09003670166AB76800071A
+:1046F0002368000827680300B46E5A7E206884A0EF
+:10470000000C4000D333781097377800D333037010
+:104710000200807A94A2000F9B781800A87C84A4E1
+:104720001F0015A2A879A8798CA1FF00E8A1007547
+:10473000042D082D6271682005A04000A333146881
+:1047400006A24000BE33006878009633037005006F
+:104750000120107768204A707E15A92031000320BF
+:10476000000000807000B3337800AC337F1580AD5B
+:1047700009003670166AB7680007236800082768C2
+:104780000300B46E5A7E206884A0000C4000D3332E
+:1047900084A000084000CD3378109B377800D333D5
+:1047A000781097378B7000007800D3337E02078231
+:1047B00084A00F0003800380038080A080546020C9
+:1047C000567000605A7004605E7084A660004000FD
+:1047D0002B34986B946CAC69B06805A1C0000D34A3
+:1047E000D27BDA7BD67CDE7CB4A6FFB75A7E84A669
+:1047F000600086A0600040002B34C06805A0400027
+:104800000634037003002B68000078103A4B7800E0
+:10481000083478104B4BB5A600205A7E78002B3414
+:10482000B0681AA3002123A4002405A340002B3460
+:10483000D27BDA7BD67CDE7CB068B4A6FFBF5A7E22
+:104840007E00C06805A07F0040002934037003008B
+:1048500078103A4B78002B347810964B7F077810FD
+:10486000BD380920650084A6040040004C34E4787B
+:1048700084A0300040004434EC7884A00300400061
+:1048800044342B7808300920650078004C347E0FC2
+:1048900079200052781087487F0F400023251A792D
+:1048A000002D4A70078284A00F00038003800380DC
+:1048B00080A0805448207800FA24206005A04000A1
+:1048C000663401802260086085A008000A601070CC
+:1048D00026607C0006A078108748176800001B68D7
+:1048E0000100236840001F680001007084A00700D9
+:1048F000790077342325813481349E348934873498
+:1049000089347F3478108C247810A9347810A2343C
+:104910007810DC1C780023256C706F700000937099
+:104920000000790090349A349A349834983498344A
+:104930009A3498349A34790002296F700000780014
+:1049400023251B6800007800B62F006805A0C00072
+:10495000A734026006607C00106005A04000B234FD
+:104960000180D000B23478108C241260086084A0DA
+:10497000EFFF0A607C00186005A04000BE34018093
+:104980001A607C007810E0391B6818007800F53454
+:104990007810E0391B6819007800F5347810E03998
+:1049A0001B681A007800F5347810E0391B680300A2
+:1049B0007800F53480777810BD3884718CA1FF00C1
+:1049C000E8A10075042D082D682005A0C000E7347B
+:1049D000780023251468807206A24000EF34006836
+:1049E0007800E03400680A201B6805008B70000026
+:1049F0007810A934206884A00100C000FE3478102B
+:104A0000A2347810B8341F680000236820007810A2
+:104A1000DC1C7800232582A20300C0006B37A87D30
+:104A2000ACA5FF00A87CA4A4FF0020698DA1800094
+:104A3000226984A1000140006C358CA1FFFE22692F
+:104A4000A4A4FF004000563582A40C00480029357C
+:104A50004000293521200C002B852B8578102E381D
+:104A6000400033357810273678005F357810E93705
+:104A70007E0C6029046084A0F5FF06607810523631
+:104A80007F0C20698DA100012269587EB5A6040023
+:104A90005A7E84A60004C00050352B7808301B785D
+:104AA00056007800FA242B7808301B7865007800CF
+:104AB000FA247E0C6029046084A0F5FF066078105B
+:104AC00052367F0C587E84A60004C00068351B78DF
+:104AD00058007800FA241B7865007800FA247E0CD0
+:104AE0005470602000618CA100104000AC35086259
+:104AF000178294A2FF0082A20C004800803540007B
+:104B0000803511200C00002402A2C8008535202227
+:104B1000086294A2FF00187086A02800C000953596
+:104B200082A21900C8009B351120190078009B351E
+:104B300082A20C00C8009B3511200C00002202A5A7
+:104B4000C800A03528227810ED372B852B857810EA
+:104B50002E384000AC35781027367800B035781004
+:104B6000E93778105236587885A004005A787F0CBF
+:104B70002B7808301B7865007800FA247E0C6029B9
+:104B80000060E4D0C000D535B4D0C000CF3510608F
+:104B900084A00F00C000CF3504618CA1F5FF066131
+:104BA0007F0C7C0011203200192000007800FC35B9
+:104BB000A06884A00002C000CF35086294A2FF0064
+:104BC000187086A02800C000EA3582A21900C8002B
+:104BD000F035112019007800F03582A20C00C800D1
+:104BE000F03511200C0008631F839CA3FF0082A3F3
+:104BF0000C004800FC354000FC3519200C00AB7857
+:104C00000100AB780300AB780100AA7AAA7BC0A8A8
+:104C10000500206885A0000122687F0C7C007E0CC6
+:104C200060298CA1F5FF06611120320019200000D7
+:104C300078001736AB780100AB780300AB78010041
+:104C4000AA7AAA7BC0A80500206885A00001226876
+:104C50007F0C7C007E0C5471602178102E367F0C06
+:104C60007C00082084A0F0FF25A4867C18609A7838
+:104C7000AE7C1264A47884A0F8FF8CA1070005A183
+:104C8000A67816608A78A4A40F0027840482048082
+:104C900084A0FF0005A40E60EC788CD0C0005136D3
+:104CA000046084A0F5FF06607C007E0C54706020D8
+:104CB000781059367F0C7C0018609A78A47884A00C
+:104CC000F0FFA6781260847884A0F0FF86787C00DC
+:104CD00082A20200C0006B37A87A20698DA18000F3
+:104CE000226984A100024000AE368CA1FFFD22693A
+:104CF00094A2FF0082A20200C8006B377810F93638
+:104D00007810523680A901000C207810B93878103C
+:104D1000BB35FF884000A1369B7860000028AA7848
+:104D2000587EB5A604005A7E84A60004C0009B36B7
+:104D30002B7808301B7856007800FA242B7808303E
+:104D40001B7865007800FA24587E84A60004C00011
+:104D5000AA361B7858007800FA241B786500780082
+:104D6000FA2482A20200C800B63684A201004000E4
+:104D7000C036547188A100000C218CA10020C00015
+:104D8000C036112000007810DB377810F936781023
+:104D90005236587885A004005A782B7808301B7852
+:104DA00065007800FA247E0C7E02602900601120E4
+:104DB0000100ECD0C000E936BCD0C000E73614607A
+:104DC00084A04000C000E7368CA1EFFF066106A07A
+:104DD0007800F63611200000AB780100AB780200B5
+:104DE000AB780300AA7AC0A80400206885A000025E
+:104DF00022687F027F0C7C007E0C5470602078104B
+:104E000000377F0C7C00FF824000053711204000F6
+:104E1000186080A002009A78A47884A0BFFF05A241
+:104E2000A6788A781660EC788CD0C00018370460B9
+:104E300084A0EFFF06607C007E00007086A0030067
+:104E4000400022377F00780025377F0078006737E1
+:104E500084A6200040006737887884A04000400086
+:104E60006737B87B84A33F001B83C80035370080B9
+:104E700005A040004B371B83C8003E37018040002F
+:104E8000633784A6004040004B37B8781B80C800C9
+:104E90004737008084A03F00C0006337B4A6FFBF3F
+:104EA0005A7ED879DC7A0120010008A1C800573762
+:104EB00091A20000D279DA79D67ADE7A7810414C64
+:104EC0001B7864007810C64A7800FA241B786400C6
+:104ED0007800FA241B7865007800FA247810A3374C
+:104EE0002B7808301B7865007800FA2478108F370B
+:104EF0002B7808301B7865007800FA2427680200B8
+:104F000078109737E47884A0300040002325EC78AF
+:104F100084A00300400023252B7808301B7865000F
+:104F20007800FA24012005007800A53701200C0044
+:104F30007800A537012006007800A53701200D0074
+:104F40007800A537012009007800A5370120070067
+:104F50009B781000AA789B786000AB780100B5A61A
+:104F600004005A7E7C007E073F87BCA70F003B876A
+:104F70003B870387E0A08054B8A720009A7FA479DC
+:104F800084A10F004000C93784A1F0FFA678126009
+:104F9000046085A008000660388738879A7FA47966
+:104FA00084A140004000D93784A1BFFFA6781660D5
+:104FB000046085A0100006607F077C009B781000CD
+:104FC000AB780100AB780200AB780300AA7A9B783B
+:104FD0006000AB7804007C00212000002920320012
+:104FE0009B781000AB780100AB780300AB78010030
+:104FF000AA7DAA7C9B786000AB7805007C007E15BA
+:10500000078084A0FF000380038080A020009A789E
+:10501000A4798CA1F0FF01204652042082A0280030
+:10502000400017382120A03819201400A9200C00B6
+:1050300078001D382120AC3819201900A9200D0056
+:1050400011206400042484A0F0FF06A140002C3845
+:105050002084002310A270002C3878001F387F15A0
+:105060007C007E15092046520C2182A132004800A6
+:105070004238400046380920923819201100A920F2
+:105080000E00112032007800583882A1280040001C
+:1050900050380920A03819201400A9200C00112034
+:1050A0006400780058380920AC3819201900A9206C
+:1050B0000D0011206400002202A54000683848005D
+:1050C00068380881002310A27000653878005838CD
+:1050D0007F1506A07C007F1582A56400C800773884
+:1050E000087885A070000A78447085A0700046702A
+:1050F00078007738EC7884A0000340007F380421E2
+:105100007800903804219EA00211C0009038012040
+:10511000FD04042082A0050048008F380120011200
+:1051200078009038042105A07C0002110230023280
+:105130000342034404540456056605680678067A5B
+:10514000070C070C070E0232024202520262027280
+:10515000056605760578057A057C057E057F0222C1
+:105160000232024202520454046404740476047845
+:10517000047A047C047E047F9B78100046A07C00A7
+:1051800084A7000F0B8084A71F0003800380038087
+:10519000038005A1E0A000557C00D879DC7AD078A6
+:1051A0001B80C800D138008084A03F0008A191A2D4
+:1051B00000007C007E0F79200001092040529120E0
+:1051C000008004217900E1381739EB38EB38EB38EF
+:1051D000EB38EB38EB381B3978108C244B78040013
+:1051E000487884A00400C000ED384B780800487867
+:1051F00084A00800C000F438B46885A00040B668F8
+:10520000587885A000405A78307884A08000C0008B
+:105210001739180017391C6884A02000C000153900
+:105220007E0E7120405278106A397F0E780017394F
+:105230001B78CA00912001807F0F7C00B3700000B2
+:105240007810443B780017397E0C1468078084A0DE
+:105250000F00038003800380E0A08054046084A0DA
+:105260000A00C0005439086194A100FF400054397D
+:105270008CA1FF000120190006A140004339012044
+:10528000320006A14000473978004B390920200040
+:1052900078004D3909203F0078004D391120000079
+:1052A000002105A20A60046085A0020006607F0C50
+:1052B0007C001B7865007800FA242B7808301B7876
+:1052C00065007800FA241B7858007800FA242B78BF
+:1052D00008301B7856007800FA24092020520C214F
+:1052E00086A1000040007E3986A10100400081397E
+:1052F000092038520B200B006F7001001B7848000A
+:105300007C001B78C4007C00092038520B200A0066
+:105310007C00092020520C2186A100004000A13908
+:1053200086A1010040009B39092038520B200B0058
+:105330006F7001001B7848007800FA240920385269
+:105340000B200A007800FA242B7808301B78C40060
+:105350007800FA241B78CA007800FA242B780830E9
+:105360001B78CA007800FA241B788F007800FA2492
+:105370002B7808301B788F007800FA24186884A0F6
+:1053800000804000C2391B681D006F7001001B784F
+:1053900048007800FA247E00307884A0C000C00065
+:1053A000DE39087884A0FCFF0A78050005000500B6
+:1053B0000500EC7884A021004000DE3944700A78B2
+:1053C00005A07F007C00447085A0020046700A782A
+:1053D0007C007E00307884A04000C000E73998004F
+:1053E000F2397F009A78AC787C00087884A0FDFFC1
+:1053F0000A780500050005000500EC7884A021006E
+:105400004000013A9800FF397F009A78AC787E001E
+:1054100044700A787F007C00EC7884A00200C00011
+:10542000714884A77D00C000153A002778108C24AD
+:1054300084A70100C0000C3084A770004000253A0A
+:105440007E0C602D682F78103724782D682C7F0C07
+:1054500084A708004000323A4B780800EC7884A01A
+:105460000300400023257800563984A7040040003B
+:10547000653AB87884A001404000653A4B7808004E
+:10548000EC7884A0030040002325E47884A0070082
+:1054900086A00100C000653AC07885A00048302091
+:1054A0005A7E1B78CA007800FA244B7808001868E6
+:1054B00084A000804000613A1B68150084A600406B
+:1054C0004000613A1B68070078106A397800FA24B6
+:1054D0001B680300587884A0003F1E682F680000F6
+:1054E000336800004B780800EC7884A0030040008B
+:1054F000062A1800FA2478007337146B078384A0F7
+:105500000F0003800380038080A080546020482027
+:10551000567000605A7004605E70602A7C007900EA
+:105520008E3A963A973A963A993A963A963A963AFF
+:105530009E3A7C007810B8347810874838700A603A
+:105540007C00A07005A04000AB3A68207810D31B07
+:105550007810FE4778100548A37000007C007E0E8E
+:105560009120008071204052007086A00700C0008A
+:10557000C23A1061BC7006A1C000C23A7F0E78101A
+:10558000E01B7810C83A06A07C00912001807F0EB5
+:1055900085A001007C007E0F7E0E712040527800B5
+:1055A00097225B780000AF700E00092000017E0199
+:1055B000A0706DA04000DD3AA37000007800E33ACF
+:1055C000B370000078100C1C4000E93AAC702668FB
+:1055D0007810C63B7800DD3A7F017E157E0C7E0D8B
+:1055E000A920080061201076006005A102601C60FF
+:1055F0006DA04000013B00681E607810AC19086087
+:1056000000800A607800F43A18606DA040000B3BFF
+:1056100000681A607810AC197800013BE0AC080013
+:105620007000113B7800F13A9C7084A0008040002B
+:10563000183B7810443C7F0D7F0C7F157C007E1258
+:1056400091200023046884A00F007900243B343BA0
+:10565000343B343B343B343B343B363B3C3B343BC8
+:10566000343B343B343B343B3E3B343B363B78109D
+:105670008C247810D3457810AC197800423B276809
+:105680000B007810D3457810C63B7F127C007E1249
+:10569000912000239800603B307884A0C000C000B7
+:1056A000603B7E0D78101248002D2E680920040002
+:1056B00001200000276884007810C7477810C63B97
+:1056C0007F0D7800943B487985A100404A78980086
+:1056D000693B4A7978004E3B287886A03418C00090
+:1056E000723B85A104007800793B287886A01418C5
+:1056F000C000663B85A10C004A789B780E00AB7811
+:105700000200587884A0FF0085A000045A78B47085
+:1057100080A091001A78276884022C683668306867
+:105720003A6809200400012000007810C7477F1262
+:105730007C007E0D146B7810701C4000A33B682029
+:10574000276802007810C63B7800983B7F0D7C00EC
+:105750007E0D146B286CA4A4FF0078101C1C400064
+:10576000B33B6820276802007810C63B7F0D7C00A1
+:105770007E0D146B9CA3FF007810481C4000C43BB6
+:105780006820276802007810C63B7800B93B7F0D7F
+:105790007C007E0C146978103B3C04698CA1FF00EE
+:1057A00086A106004000E13B86A10D004000003CC0
+:1057B00086A11700C000DD3B7810AC197800DF3BF4
+:1057C0007810DE1C7F0C7C00046001804800FE3BEA
+:1057D00006600920000084A60100C000EE3B8DA1F8
+:1057E000008084A604004000F43B8DA102001E69E5
+:1057F0002368000004710F81186805A11A687800F9
+:10580000DD3B78108C24186005A0C0000F3C0860B8
+:10581000018048000F3C0A601C600268002D1E6079
+:105820007800253C88AC0600042105A04000183C07
+:1058300008207800113C02680A2D086001804800A9
+:10584000DF3B0A601860682000681A607800093C35
+:105850007E157E137E147E0C7E0D78108919C00093
+:10586000303C78108C24A02D7F13A9203100A35345
+:105870007F0C7F147F137F157800DD3B84A11F0010
+:1058800003800380038080A0107660207C001920B4
+:105890005152042385A001001A201920020104237B
+:1058A00085A001001A207C0019205152042384A0F5
+:1058B000FEFF1A2019200201042384A0FEFF1A20F3
+:1058C0007C0090798CA1F8FF9279B47080A0D80008
+:1058D0001A787800FA24A370000003700000437067
+:1058E0000100377000001800B12478100C1C400033
+:1058F000993C09200F520B200000BC686020006119
+:1059000084A1000340008D3C27680E0084A00002A3
+:105910004000893C276817007810C63B7800683C37
+:10592000007086A00700C0000D3D002DA27080AD64
+:105930000F0036707800A03C407086A00100400047
+:1059400033257800FA24312000001C6984A102006C
+:105950004000A93CB5A6040084A1C00003800380D8
+:10596000078080A0A63D042035A6206884A00004FE
+:105970004000C13C9B781800AB7803009B78810005
+:10598000AB780100B5A60050206884A000804000DC
+:10599000CF3CB5A600049B780E0024680780AA7847
+:1059A0007800EF3C1C68FCD0C000DD3CB5A60008C8
+:1059B0002068C4D04000EF3CB5A600407800EF3C22
+:1059C0002068C4D04000E53CB5A600407800EF3C1C
+:1059D0009B781800AB7802009B788100AB780100BF
+:1059E000B5A6001084A600024000093D2C68D278BC
+:1059F0003068D67884A600014000073D2C6884A05A
+:105A000001004000073D887884A040004000073D29
+:105A1000B5A600807810F6475A7EB66E78003548F5
+:105A20007810C839C000A03D2C70048048001B3D90
+:105A30001920494F781013232F70010041200100D5
+:105A4000312000109B781800146884A01F0085A0E6
+:105A50008000AA781C6984A102004000343DB5A6EC
+:105A60000400AB7820002868AA78C0A802001C684F
+:105A7000F4D040003D3D502C78107A3A781002471F
+:105A8000206884A0008040004B3DB5A600049B78B0
+:105A90000E0024680780AA787800523D1C6884A014
+:105AA0000080C000523DB5A60008206884A0000117
+:105AB0004000593DB5A600401C6884A0C00003808A
+:105AC0000380078080A0A63D042035A684A600019F
+:105AD0004000733D2C6884A001004000733D88782D
+:105AE00084A040004000733DB5A600809B787E00F6
+:105AF000AE7EB66E14680780AA7882781028AA7ADB
+:105B0000307884A0C000C000A03D1800A03DB47053
+:105B100080A0DD001A787810E03984A600024000E9
+:105B2000943D2C68D2783068D6787810F647002DEE
+:105B3000A2704A701068BE700370070080AD0F003D
+:105B400036707800FA247810D31B7810E03978008A
+:105B5000FA24000000030002000078108C240023C7
+:105B60007900AF3DB23DB23DB43D78108C24781041
+:105B70000548246984A1FF0086A00A004000C63DB4
+:105B800084A100FF85A00A0026687810D31B780046
+:105B9000683C01200A00781097477800683C82A290
+:105BA00005005000D23D78108C24007084A00700BE
+:105BB000C0108C3A78108919C000F43D6920FFFFAD
+:105BC00084A604004000E53D012000287800E73D60
+:105BD00001200008B47188A191009B780E00078015
+:105BE000AA78312000045A7E1A797800FA240768CE
+:105BF00006010B6800009F6800002768000086A36C
+:105C00000200C000153E86A20200C000153EA0782A
+:105C100005A0C000153E84A40080C000153EE478B5
+:105C200084A008004000153EB5A608001920000019
+:105C300078101742002DA2704A7003700700377069
+:105C40000000246884A080004000273E7810CD42E8
+:105C50007800FA24002379002A3E2D3EAE3EC73E4E
+:105C600000227900303E353E453E6B3E773E9A3EFF
+:105C70002920010026A0112000007810F3437900AC
+:105C80003E3E433EFA24683C433E433E78108C241B
+:105C900090798CA10700C0004C3E0920080011201B
+:105CA000010084A604004000543E1120030020227D
+:105CB0002AA1112001007810F34379005C3E613E77
+:105CC000FA24683C693E633E78003B48AB70673E0F
+:105CD0007800FA247800613E78108C2484A61000A5
+:105CE0004000753E78109C424000753E7800FA24D2
+:105CF00078000D43006084A002004000943EB47020
+:105D000080A0CD001A787E0D78101248002D2E68E4
+:105D1000276800007810C63B7F0D7810AC1903701F
+:105D20000000377000004B7000007800683C84A6CB
+:105D30000400C0009A3E78003B48006084A0040044
+:105D4000C000AC3E006084A001004000AC3EAB70DF
+:105D5000AC3E0120070078108F477800414878005A
+:105D60003B4800227900B13EB63EB83EB63EB63E54
+:105D7000B63E78108C24A770BC3E78004748E47883
+:105D800084A00800C000B83E78108147AB70C53EC3
+:105D900078003B4800227900CA3ECF3ED13ED13E3A
+:105DA000CF3ECF3E78108C24E47884A008004000D9
+:105DB000E63EA770DA3E78004748112004007810CC
+:105DC000ED437900E03EE63EFA24683CE63EF03ED4
+:105DD000F43EAB70EE3E0120030078108F47780050
+:105DE000414878003B48AB70E63E7800FA24AB703F
+:105DF000F83E7800FA247800EE3E82A203005000BC
+:105E0000003F78108C2486A30200C000193F86A2B0
+:105E10000200C0001F3FA07805A0C0001F3F84A45F
+:105E20000080C0001F3FE47884A008004000193FB4
+:105E3000B5A608001920000084A6080040001F3FF6
+:105E4000781079421068BE70037007000023790053
+:105E5000263F293F563F5E3F002279002C3F313FCD
+:105E60002F3F4A3F78108C249079ACA1070026A0E0
+:105E7000112001007810F34379003B3F403FFA24A2
+:105E8000683C483F423F78003B48AB70463F780053
+:105E9000FA247800403F78108C2484A6100040003B
+:105EA000543F78109C424000543F7800FA24780018
+:105EB0000D4300227900593F5C3F5C3F5C3F781006
+:105EC0008C2400227900613F643F663F663F781072
+:105ED0008C24E47884A0080040007B3FA7706F3FCB
+:105EE00078004748112004007810ED437900753F91
+:105EF0007B3FFA24683C7B3F853F893FAB70833F03
+:105F00000120030078108F477800414878003B4813
+:105F1000AB707B3F7800FA24AB708D3F7800FA2499
+:105F20007800833F00237900923F973F993F953F48
+:105F300078108C24A4707A00A4707A0082A20200E7
+:105F40005000A13F78108C2484A600024000AB3F93
+:105F50007810FE477810D543781005480023790063
+:105F6000AE3FB13FD93F3F4086ADFFFF4000683CA8
+:105F700086A201004000BB3F78108C2484A600025A
+:105F80004000C33F7810FE4778100548012001000B
+:105F900078109747B87884A001C04000D53F487872
+:105FA00085A008004A78487884A00800C000D03F47
+:105FB000037000007800683C00227900DC3FDE3F7F
+:105FC0000F40A770E23F7800474811200D0078107D
+:105FD000ED437900E83FEF3FFA24683CF73FFF3F8D
+:105FE00005400740B4A6FF00B5A60004B66E5A7E71
+:105FF00078003548B4A6FF00B5A60004B66E5A7EF8
+:1060000078003548AB7003407800FA247800EF3F01
+:1060100078108C24AB700B407800FA2478104D482F
+:106020007800FA24A7701340780047481120120026
+:106030007810ED43790019401F40FA24683C2B404A
+:1060400033403940B4A6FF00B5A60004B66E5A7EB0
+:10605000B47080A0AA001A787800FA24B4A6FF00D1
+:10606000B5A60004B66E5A7E78003548AB7037404E
+:106070007800FA2478001F40AB703D407800FA2485
+:1060800078002B4086A201004000454078108C2407
+:10609000A770494078004748112015007810ED435B
+:1060A00079004F405440FA24683C62406E40B4A6E8
+:1060B000FF00B5A60004B66E5A7E3B780113B4709B
+:1060C00080A0B5001A787800FA24B4A6FF00B5A61F
+:1060D0000004B66E5A7EB47080A0AA001A787800C8
+:1060E000FA24AB7072407800FA247800544082A2FF
+:1060F000030050007A4078108C24002379007D4002
+:106100008040B740144186A20100400086407810CC
+:106110008C24046884A0FF0086A00600C000934081
+:106120007810C63B037000007800683C3B680000B4
+:106130003768000084A600024000A1407810FE47A6
+:106140007810D54378100548012001007810974752
+:10615000B87884A001C04000B340487885A008000A
+:106160004A78487884A00800C000AE400370000060
+:106170007800683C00227900BA40BC40EF40A7702C
+:10618000C0407800474811200D007810ED43790099
+:10619000C640CD40FA24683CD540DD40E340E540B0
+:1061A000B4A6FF00B5A60008B66E5A7E7800354842
+:1061B000B4A6FF00B5A60008B66E5A7E7800354832
+:1061C000AB70E1407800FA247800CD4078108C2440
+:1061D000AB70EB40781005487800FA2478104D48F1
+:1061E0007800FA24A770F340780047481120050092
+:1061F0007810ED437900F940FE40FA24683C0641EE
+:106200000E41B4A6FF00B5A60008B66E5A7E78000F
+:106210003548B4A6FF00B5A60008B66E5A7E7800D1
+:106220003548AB7012417800FA247800FE4086A20F
+:10623000010040001A4178108C24A7701E4178009C
+:106240004748112006007810ED4379002441294188
+:10625000FA24683C2F413941B5A60008B66E5A7E33
+:1062600078003548B4A6FF00B5A60008B66EB5A6FE
+:1062700000405A7E78003548AB703D417800FA24E2
+:106280007800294100237900424147414541454179
+:1062900078108C2478108C240023A87105A07A0132
+:1062A0001068BE7082A203005000554178108C2403
+:1062B0000023790058415B4169418B4184A600026B
+:1062C000400063417810FE47781005480120010026
+:1062D000781097477800FA2496A202004000724195
+:1062E000FF824000724178108C24A77076417800BC
+:1062F0004748112018007810ED4379007C41814116
+:10630000FA24683C83418541780035487800354857
+:10631000AB7089417800FA2478008141002279002D
+:106320008E419041A941A7709441780047481120BF
+:1063300017007810ED4379009A419F41FA24683C98
+:10634000A141A3417800354878003548AB70A7419A
+:106350007800FA2478009F4184A40080C0000542A0
+:1063600084A600014000B5417810FE477810D5435F
+:10637000D878D278DC78D678B4A6FFEF5A7EA770AA
+:10638000C0417800474811200D007810ED43790096
+:10639000C641CD41FA24683CCD41F341F941FB416E
+:1063A000D878DC7905A1C000DF41B87884A01F004F
+:1063B000C000DF41B3700000587884A0FFFD5A7818
+:1063C0007800354884A600014000F141487885A056
+:1063D00008004A787810BC472C68D2783068D678A4
+:1063E000B37000007810F64778003548AB70F7417D
+:1063F0007800FA247800CD4178108C24AB700142EB
+:10640000781005487800FA2478104D487800FA246E
+:1064100078100548AB700F420120030078108F47B9
+:10642000780041487810F6472C68D2783068D678E2
+:1064300078003548B8701268BE700080BA701B686A
+:10644000000084A6080040003A427E157E137E14A8
+:106450009078048004800480048084A00F001A686F
+:10646000AC809B78000080AF2B00982080AD0B00A3
+:10647000A020A5537F147F137F15C4A6000F84A608
+:106480000200C00049422C690D810D810D8184A15B
+:106490000700082078005C429B781000AC7984A14A
+:1064A000200040005C427E01092005000120003DE3
+:1064B0007810C747246885A03B0026687F0184A127
+:1064C0001F0005A8166878103B3CBE6884A604002F
+:1064D00040006D428CA100FFA87884A0FF0005A1B8
+:1064E0002A68B4A6FF00006084A00800400077423C
+:1064F000B5A60040B66E7C007E157E137E1418692A
+:106500009078048004800480048084A00F007E00C2
+:1065100000A11A687F000080048040009842A820F3
+:10652000048180A00B0000ADA0209B78000080AF0C
+:106530002B009820A5537F147F137F157C002C68B7
+:1065400084A02000C000A4420C627800A542106222
+:10655000186B002302A24000C542182082A30E003F
+:106560004800B5424000B54219200E007800B942FB
+:10657000587884A0EFFF5A783B78011B937800008D
+:10658000A27BB47080A08E001A7885A001007C00E8
+:10659000587884A0EFFF5A789378000006A07C001A
+:1065A00004698CA1FF0096A107004000DA4296A181
+:1065B0000F004000DA4207681701146978103B3C6D
+:1065C00000610481C800F5421C6005A04000E9425A
+:1065D000012000087800F7427E0D24687E007810C4
+:1065E00012487F002668002D2E687810C63B7F0D6C
+:1065F0000120000224698CA1FF000DA126690780FB
+:106600009B780E00AA78206885A00080226831203F
+:106610000004B66E5A7EB47188A191001A797C008C
+:10662000C4A6000F84A60200C00021432C690D817E
+:106630000D810D8184A10700082005A81668781037
+:106640003B3CBE6878002443146978103B3C0061F1
+:106650000481C800824384A10003400030430768DE
+:10666000170178004E43046005A0C0005743076837
+:1066700017011C6005A0C00044437E0D781012482D
+:1066800027683400002D2E687810C63B7F0D84A645
+:10669000040040004E43312000040120002878000F
+:1066A00052433120000401200008B47188A19100F8
+:1066B0007800B043186005A0C00044431C6005A0EA
+:1066C000C00044439F68000027683D0084A6010085
+:1066D0004000BE4394D6C0007B430061D4D140004B
+:1066E0007B432C698CA1FF004000BE4386A10300C0
+:1066F0004000BE4386A112004000BE43B5A600087C
+:10670000B47188A1AE007800B94307681701312041
+:1067100000042C698CA1FF0086A11200C0009343E5
+:106720000120CB43092001007800A44386A1030087
+:10673000C0009D430120CC43092012007800A443EF
+:1067400001200002B47188A191007800B043781054
+:10675000E147A37800001C6885A040001E68B47162
+:1067600088A1DA0006A0266807809B780E00AA7828
+:10677000206885A000802268B66E5A7E1A7978005B
+:10678000FA24B66E7810C63B1068BE70037007001E
+:10679000A37000004B7000007800FA242300700002
+:1067A00005000000000A00000000250000000000B5
+:1067B0003B6800003768000084A600024000EC43FC
+:1067C000B8788CA01F0084A000804000E5430881B9
+:1067D000D87800A13668DC7881A000003A687C0097
+:1067E00090790F81ACA507002120000080A4100043
+:1067F0009A78A8798CA1FF0084A18000C0001B4476
+:1068000082A12000C800394482A11200C80081473B
+:106810000021791009447C008147EB45814781477D
+:10682000464449448344B944ED44F0448147814798
+:10683000A44414454E4581478147744584A12000F6
+:10684000C000A8458CA11F00146884A01F0006A1E9
+:1068500040003644B47080A0CD001A7801201400A6
+:106860007810974778100548037000000120020057
+:106870007C00012000007C0082A12400C800814728
+:1068800084A10300791009447C0081478147814736
+:106890008147781081477C00002279004C4477457D
+:1068A0007745704470447044704470447044704440
+:1068B00070446E4470446544704470447044704445
+:1068C000704478447B4477457B4470447044704402
+:1068D0007E0C7E07146F7810B0377F077F0C78002E
+:1068E000704478108E462768B30209200B000120FF
+:1068F00000487800AB45781073477C002768930008
+:1069000009200B000120004878009345582D0468A9
+:1069100084A0FF0086A00600C0008D440768170110
+:106920002768020078101248276836003269002D67
+:106930002E687E0D7810963B7810D345682B781022
+:10694000C63B7F0D7810C63B012002007C0078100A
+:10695000D3450120170078109747A3700000092045
+:1069600038520B200600AF70170009200002781083
+:10697000D43A012001007C0000227900BC44774514
+:10698000A845A845A845DD44BA45E544BA45BA45F9
+:10699000BD45BD45C245C245D544D544A845A845D9
+:1069A000BA45A845E5447745E544E544E544E54472
+:1069B0002768840009200B00012000437800CC45A3
+:1069C00027680D0009200B00012000437800AB452B
+:1069D0002768930009200B000120004378009345AD
+:1069E000012000007C0000227900F34477450C452B
+:1069F0000C450C450C45BA45BA45BA45BA45BA45A9
+:106A0000BA45BA45BA450C450C450C450C45BA4546
+:106A10000C450C45BA45BA45BA45BA45774527688D
+:106A2000930009200B00012000437800934584A6C1
+:106A30000400C0002845046884A0FF0086A006006A
+:106A4000C00081477810D345076817017810C63B0E
+:106A5000012002007C00006084A004004000814707
+:106A6000582D046884A0FF0086A00600C0003745AA
+:106A70000768170127680200781012482768360057
+:106A80003269002D2E687E0D7810A53B7810D34515
+:106A9000682B7810C63B7F0D7810C63B01200200A2
+:106AA0007C00006084A0040040008147046A94A236
+:106AB000FF0086A20600C0005C4507681701276832
+:106AC0000200582D78101248276836003269002DD0
+:106AD0002E687E0D7810B53B7810D345682B781062
+:106AE000C63B7F0D7810C63B012002007C00781069
+:106AF00081477C00B47080A0CD001A78012001008D
+:106B000078109747781005480370000001200200B4
+:106B10007C007810C7477810FE477810D54378106E
+:106B2000CD4278100548012001007C007810C7474D
+:106B30007810FE477810D543B47080A0CD001A7845
+:106B40000120130078109747781005480370000063
+:106B5000012002007C00781081477C007810C74734
+:106B60007810FE477810D5437810CD42781005484C
+:106B700078104D48012001007C00012003007C00BA
+:106B800078108E46012000007C007E0C7E07146F7A
+:106B90007810B0377F077F0C012000007C00781050
+:106BA000C74778108147012006007C0004698CA14A
+:106BB000FF0086A107004000DE4586A10F00C0004F
+:106BC000E2457810FE477810D543B47080A0CD0020
+:106BD0001A7878100548037000007C00A87A94A207
+:106BE000FF00A87884A0FF008AA00400C8008147A5
+:106BF0007910F8457C008147FC458147954682A283
+:106C0000030040000346781081477C00A87DACA5B6
+:106C1000FF00A87CA4A4FF00B86984A10001400083
+:106C200042468CA1FFFEBA69A07805A0C00042468A
+:106C3000A4A4FF004000364682A40C0040001F467A
+:106C4000C80029462B852B8578102E384000294610
+:106C5000781027367800384678106047781052361A
+:106C6000B8698DA10001BA69B5A600105A7E7800F6
+:106C70003B4678105236B4A6FFEF5A7EB47080A01F
+:106C800091001A78012001007C007E0C7810824669
+:106C90000062E4D2400073460862178294A2FF00AB
+:106CA00082A20C00480055464000554611200C00B9
+:106CB000002402A2C8005A462022086294A2FF00C3
+:106CC0001C7002A2C80062461C72002202A5C80005
+:106CD00067462822781064472B852B8578102E383C
+:106CE0004000734678102E3678007746781060475B
+:106CF00078105936B5A600105A7EB47080A0B9003D
+:106D00001A78012004007F0C7C007E001468078044
+:106D100084A00F00038003800380E0A080547F00E4
+:106D20007C007E0C78108246781059367F0C7C00EF
+:106D300082A20200C0008147A87A94A2FF00B8692D
+:106D400084A100024000CC468CA1FFFDBA69A07866
+:106D500005A0C000CC4682A20200C8006B377810A4
+:106D60002A477810F9367810523684A60001400080
+:106D7000C2462C6884A001004000C246FCC6887848
+:106D800084A040004000C246FDC6B5A600105A7E51
+:106D9000B47080A091001A78012001007C007E0C64
+:106DA0007810824684A2FEFF4000D74611200100E1
+:106DB0007800DB4684A201004000E1460061ECD18E
+:106DC000C000E1461120000078101C477810003701
+:106DD0007810593684A600014000F7462C6884A03C
+:106DE00001004000F746FCC6887884A040004000BF
+:106DF000F746FDC6B5A600105A7EB47080A0B90053
+:106E00001A78012004007F0C7C007E0C6029006051
+:106E10001120010084A00020C0000D4711200000B7
+:106E2000AB780100AB780200AB780300AA7AC0A867
+:106E30000400B86885A00002BA687F0C7C009B78CB
+:106E40001800AB780100AB780200AB780300AA7A97
+:106E50009B788100AB7804007C007E0C547060202D
+:106E6000006084A00010C000384729203200212093
+:106E70000000780058470865ACA5FF00187086A090
+:106E80002800C000484782A51900C8004E472920A5
+:106E9000190078004E4782A50C00C8004E472920F3
+:106EA0000C0008642784A4A4FF0082A40C004800FE
+:106EB000584721200C0078106447B86885A000016D
+:106EC000BA687F0C7C0021200000292032009B78CA
+:106ED0001800AB780100AB780300AB780100AA7D05
+:106EE000AA7C9B788100AB7805007C000120030020
+:106EF00078108F47B5A600105A7EB47080A0B900F4
+:106F00001A78012005007C000120070078108F47C7
+:106F1000B5A600105A7EB47080A0B9001A7801207E
+:106F200004007C009B781800AA789B788100AB78DD
+:106F300001007C0004698CA1FF0096A107004000BD
+:106F4000A54796A10F004000A5477810AC197C001A
+:106F5000246994A13F00C000AE478CA1C0FF05A1E9
+:106F600026687810C63B1C6984A100014000BB471D
+:106F7000146978103B3C0462108206627C002C6924
+:106F800034682E6812A13069386832681BA100A2EB
+:106F900001A37C007E0CE0AD180003607000066168
+:106FA0000B6000000F60000A136000001760000013
+:106FB00007801A601F600000236000007F0C2468B7
+:106FC00085A0800026687C007E157E137E149820A4
+:106FD00080AF2D00A020AC814000EC47A65384A1D7
+:106FE00001004000F2470433BE787F147F137F1501
+:106FF0007C00B07005A0C0108C24B37000807800B5
+:107000004B4BB071FF81400004487810414C7C002C
+:10701000B071FF8140001148487885A008004A7887
+:10702000B3700000781087487C007E0C7E0D7810CD
+:107030008919C0001A4878108C247F0C7E157E13A5
+:107040007E14A02D982CA9203100A3537F147F1308
+:107050007F1507680D010B680000047007801A682F
+:10706000236800001F6800009F6800007F0C7C0000
+:10707000B47080A091001A787800FA24B47080A0CF
+:1070800081001A787800FA24B47080A0B9001A78C8
+:107090007800FA24B47080A0C3001A787800FA242B
+:1070A00004698CA1FF0096A1070040005A4896A1F0
+:1070B0000F0040005A4807681701246884A0FF00A9
+:1070C00085A00002266807809B780E00AA782068B9
+:1070D00085A00080226831200004B66E5A7EB4710B
+:1070E00088A191001A797C0078100548487885A01D
+:1070F0000C004A78B47080A0CD001A7809200B00EB
+:10710000012000447810C7470120130078109747EA
+:107110007800683C7E129120002249208748007048
+:10712000047205A20C7215A2087084A0F7FF05A2D4
+:107130004000994878009E48037000007F120020AC
+:107140007C00007084A00100C000CC48087103815D
+:10715000C800AB487810CE497800A3480C708CA0CA
+:10716000FF004000CC4804700480C800C34814707D
+:1071700005A0C000BF48107005A04000C34802A190
+:10718000C800A348077010007800CC48FF8A400070
+:10719000CC487810184CC000C6484000A34878106E
+:1071A0005749037000007F1200207C007E010461BB
+:1071B0008CA1FF0086A107004000DF488EA10F00D0
+:1071C000C000E24840607800E34828647F01FF8403
+:1071D00040000D49702C0470BCA00F00B8A71D49D9
+:1071E0003C27FB87C000FB484800F54878108C24FA
+:1071F0009C6075A040000D497800E848042768AEFF
+:10720000086830A60C6829A5218440000D493887FC
+:10721000042705A0C000FC489C7075A0C000E84889
+:107220007C000000050009000D0011001500190088
+:107230001D000000030009000F0015001B000000E6
+:10724000000012490F4900000000008000001249B0
+:1072500000001A49174900000000000000001A4908
+:107260000000154915490000000000800000154984
+:1072700000001B491B4900000000000000001B49E2
+:107280007E12912000227920005271201000077098
+:107290000A000770020003700000712020000770D0
+:1072A0000A000770020003700000492000007F12EE
+:1072B00000207C00492057491920000004700480F8
+:1072C000C800AA49077012000871087006A1C00022
+:1072D000614984A1E00140006C4978108C240120B0
+:1072E000FD04042082A00500C800774984A1004065
+:1072F000C00061499CA10C3086A304204000854950
+:1073000086A308004000904986A30C20C000614974
+:1073100000720482480090490C7384A3FF0040006F
+:10732000904978108C2407701200007084A001002E
+:10733000C000AA49087084A0E001C000AA491073E7
+:10734000147005A34000AA490C7184A10003C00079
+:10735000AA4984A1FF00C0005749077012000770B6
+:107360000800047084A00800C000AE490770120035
+:10737000087103814800B3490370000049200000F0
+:107380007C007E107E007E127E1591200022087106
+:107390007810CE497F157F12912001807F007F10E9
+:1073A0007C00047200750C7384A30003C000F549CF
+:1073B00084A1E001C000194A087184A1E001C00065
+:1073C000194A0120FD04042082A00500C800E949F3
+:1073D00084A10040C000D94984A107007900ED498B
+:1073E000F749094AF549094AF549554AF549534AC1
+:1073F00078108C24047084A0100085A00200067010
+:10740000FF8AC000044A492000007800084A78102A
+:10741000184CC000044A7C00047084A0100085A0B1
+:1074200002000670FF8AC000144A7800184A7810DB
+:10743000184CC000144A7C00077012000871E0006C
+:107440001C4A91200060E000204A912000600770F3
+:10745000120007700800047084A00800C000284AC9
+:10746000077012000871038148002D4A0370000064
+:10747000007005A0C000414A047005A0C000414A48
+:107480000C7005A04000434A7800244A49200000BF
+:107490007810D738186884A0008040004E4A1B68D6
+:1074A00002007C0078108C2478108C247810B14A6B
+:1074B000107214710C709CA0FF00002800A311A290
+:1074C00089A100007810B14A0427582C60AC0863E9
+:1074D000002222A30C6300211BA3002405A340006B
+:1074E000784AC800784A128410820A8389A1000071
+:1074F000602B78005F4A602B078A7E00046084A0BE
+:1075000008004000844ABAA717497800864ABAA7FB
+:107510000F497F003DA7002C86688A6F926C8E6BA6
+:1075200007701200781057497C003887042705A09F
+:10753000C000A54A9C6005A04000AE4A60200460DF
+:1075400084A00F0080A01D493C20FB8740108C24A4
+:10755000518A4000AD4A087084A0030086A0030051
+:107560007C00512000007C00508A3987042704A049
+:10757000C000C54A006064A0C000BC4A602D046021
+:1075800084A00F0080A02D493C20FB8740108C2454
+:107590007C007E127E0D912000227F0D8468602089
+:1075A00088688C6B906C5780D4AAFF0084A0FF0081
+:1075B0007E00046884A008007F004000E04AB8A074
+:1075C00017497800E24AB8A00F49087EB5A60C001A
+:1075D00004698CA1FF0086A107004000F04A8EA13B
+:1075E0000F00C000F94A1C6884A040004000004B16
+:1075F000B5A601007800004B1C6884A04000400044
+:10760000004BB5A6010007700400047084A00400BC
+:10761000C000024B002405A3C0000D4B7800334B83
+:10762000582C0427046160AC006000A41A70046048
+:1076300001A31E7084A108004000234B106081A0AC
+:1076400000002270146081A00000267008620024EF
+:1076500002A212700C62002303A216700276077059
+:107660000100602B7810924A7800354B7810184C46
+:10767000C000334B7F1200207C007E127E0D9120D3
+:1076800000227F0D07700400047084A00400C00075
+:10769000414B037008007F1200207C007E127E0D9B
+:1076A000912000227F0D49204B4B0770040004708D
+:1076B00084A00400C000544B087EB5A60C000469E9
+:1076C0008CA1FF0086A107004000674B8EA10F0030
+:1076D000C000724B1C6884A0400040006E4BB5A6F1
+:1076E00001004068502078007B4B1C6884A020007B
+:1076F000C000794BB5A6010028685020602D0460B9
+:10770000BCA00F00B8A71D493C27FB87C0008F4BCA
+:107710004800894B78108C249C6865A04000934BEE
+:1077200078007C4B7810184CC0008F4B7F120020E3
+:107730007C007E127E007E017E0D912000227F0D56
+:107740007F037F04087EB5A60C0004698CA1FF00AE
+:1077500086A107004000AD4B8EA10F00C000B64BC4
+:107760001C6884A040004000BD4BB5A60100780015
+:10777000BD4B1C6884A040004000BD4BB5A6010075
+:107780004920964B7E0104698CA1FF0086A1070069
+:107790004000CB4B8EA10F00C000CE4B406878005C
+:1077A000CF4B28687F0155A04000154C702D602EEE
+:1077B0000470BCA00F00B8A71D493C27FB87C00080
+:1077C000E94B4800E24B78108C249C7075A0602037
+:1077D0004000154C7800D54B042768AE086822A4F9
+:1077E0000C681BA34800024C518AC000F64B78106D
+:1077F0008C243887042705A0C000EA4B9C7075A034
+:1078000060204000154C7800D54B228420841A83D8
+:1078100099A300000869002422A10C6900231BA180
+:10782000C800114C78108C24712020007800004B87
+:107830007F1200207C00087084A0030086A0030053
+:107840004000404C042708AC04211A700881042130
+:107850001E700881042112700881042116700460D2
+:1078600084A008004000374C088104212270088160
+:10787000042126700276047084A0100085A0010007
+:1078800006707810924A7C007E127E007E0D912058
+:1078900000224920414C7F0D7F08087184A103001C
+:1078A000C0006B4C7E0104698CA1FF0086A107001B
+:1078B00040005B4C8EA10F00C0005E4C4068780019
+:1078C0005F4C28687F0105A04000794C78009E48F5
+:1078D00020006B4C7810554A7800794CA000724C0F
+:1078E00008717810CE4978004A4C07701000A0004B
+:1078F000744C08717810CE49087086A00800C0004A
+:107900004A4C007005A0C0004A4C0370000049209A
+:1079100000007F1200207C007E127E147E137E15F4
+:107920007E0C7E0D912000227F0D4920894C80AD78
+:107930001100A020992031000C7084A0FF002A685B
+:107940000770080007700200037001004000A84C97
+:107950000080AC80A55307700400047084A004006C
+:10796000C000AA4C7F0C49200000037000007F1566
+:107970007F137F147F1200207C00912000609120F3
+:107980000080CC7805A04000D14C9479D07006A13D
+:10799000C000D14C047805A04000D14C077800000D
+:1079A0006800D14C91208040207801802278C0006E
+:1079B0002C4D2478227869204052006884A007006A
+:1079C0004000EF4C86A002004000EF4C34680DA050
+:1079D0004000EF4C042105A04000EF4C01800A203C
+:1079E0004000D44D487805A04000FD4C01804A7805
+:1079F000C000FD4C0920020144680A2078106F2263
+:107A0000906805A04000094D01809268C000094DB2
+:107A10006F6800007368010061200055A920000113
+:107A200009200200346005A040001F4D018036602F
+:107A3000C0001F4D106005A040001F4D7E01781052
+:107A40006F227F01E0AC10007000254D78000F4DD3
+:107A5000098140002C4DA920000178000F4D7810BD
+:107A6000394D78105E4D0920515204210920020140
+:107A70000A20912001807C00347801803678C00093
+:107A80005D4D3878367891200080447805A0C0009C
+:107A9000484D012001010180467880A000754020FA
+:107AA000042065A040005D4D246005A04000594DB4
+:107AB0000180266040008D4D0060402C78004E4DC6
+:107AC0007C00287801802A78C0008C4D2C782A7898
+:107AD000307805A0C0006B4D012000020180327893
+:107AE000038003800380038090A0005598A20200C9
+:107AF000042384A0080040008C4D90A209000422B9
+:107B000005A04000844D01801220C0008C4D04234C
+:107B100084A0F7FF85A080001A2078106F227C00D7
+:107B200069204052006805A04000974D486806ACA7
+:107B30004000D44D1B600600B46084A0003F1E606E
+:107B4000206084A0FF0085A06000226000604220C9
+:107B50001467826F7810C519186805A04000AF4DF2
+:107B600001801A68086884A0EFFF0A681068018025
+:107B7000D000B94D78108C2412682F60000033605B
+:107B80000000682C7810DC1C69204052447984A1E4
+:107B90000001012006006E68C000CF4D86690120FB
+:107BA00004006E6878106A22912001807C006920B0
+:107BB000000109204052042184A007004000304EFB
+:107BC00086A00700C000EA4D7E0D092052526C21AC
+:107BD00078101C3B7F0D7800304E092052526421F2
+:107BE000781037241B600600586884A0003F1E6090
+:107BF000206084A0FF0085A0480022602F60000064
+:107C000033600000306884A040004000244E4B6880
+:107C10000400A9201400486884A004004000114E0C
+:107C20007000114E7800084E4B680900A92014001E
+:107C3000486884A0010040001E4E70001E4E78006F
+:107C4000154EA920FA007000244E7800204E0868D6
+:107C500084A0FDFF0A681B68480009205B520B20C6
+:107C600007004C784A78912001807C0079200052EE
+:107C700078105E4E7810424E7810504E33780000E7
+:107C8000477800004B7800007C0019200300112089
+:107C90004652042286A03C0040004D4E19200200AE
+:107CA0002A7B2E7B7C0019203900112046520422A9
+:107CB00086A03C0040005B4E19202700367B3A7BB3
+:107CC0007C001920713911204652042286A03C0004
+:107CD0004000694E19202626227B267B3F78000033
+:107CE00043780A007C0020002B00000020000000E8
+:107CF0002000000020000000200000002000000004
+:107D000020000000200000002000000020000000F3
+:107D100020000000200000002000000020000000E3
+:107D200020000000200000002000000014001400CB
+:107D300049981400140014001400140014001400D6
+:107D400080000F00000001020406080C20212240E0
+:107D500080F818000B3001A2140000A2140000A249
+:107D6000140200006C0002001400CD989E009300E5
+:107D700002A2388806383988C32064088598C1284B
+:107D8000AE9C03A20C30462861816A840083561899
+:107D90003A886598F228919C58980C30E128919C7B
+:107DA000022806A2C3642E2807A2A064E06DA06783
+:107DB000C06F14183B882478C16864783E8879982D
+:107DC000768577866B20C128AE9C44200321A220B3
+:107DD0008120659809A201298D98140005A200A3AD
+:107DE00072189A873C88E21F01C60AA26E850407B2
+:107DF000919C140004A200A30930E21964F86E8576
+:107E00003F88E608919881F88C9801C81400C1F861
+:107E10001600B285F080329502FBE21D1400328517
+:107E200041F21400E21DA884A0D7E61F140008A2A6
+:107E300043600880C11D1600008360812A8441F0E0
+:107E40000830A884D6114270DD201100D520228888
+:107E50001600008047281110C098008000A002285A
+:107E60001110C69865983E281110CA980BA21700E9
+:107E70000C3000A3E21D81DB14001002D79814001F
+:107E8000E0263A8702FBF219E21F14000DA2063821
+:107E90001002B39C040700006C0002004F9814000D
+:107EA0009E00A0001700FF600C30208711A2D09C1C
+:107EB0007287378801217A98D210E278D39C59983A
+:107EC00084D9E2F0A1F0CD981400318866D13088D1
+:107ED0000F80019420B502C820887A9801237A98EF
+:107EE000D210E478D39C21882088599823F142F15C
+:107EF00001F1C698D210F670328803820C879ED9A1
+:107F000001601400456814021BA2D09C0120C59892
+:107F10000182521884D163D1348801808D98273032
+:107F2000A884561A3388140018A28169BC9C26695B
+:107F30000269341A9998141A2170140000A341613F
+:107F40006469108092852680B984E4692380E116F3
+:107F50000180F110466913A2621413A20080E11699
+:107F6000B598696914A2C2610280E1140480E11627
+:107F700001010A302788140017A2BC9C140000A33A
+:107F800081812A84A884E61C2C88160012A2D09C29
+:107F9000D210E4700400078024941ACCD39CC598B6
+:107FA00027880A3013000080A4841600C2111E2105
+:107FB0000E871DA214008E8716001CA23510919802
+:107FC00010A200A0108092853B8544D02280073803
+:107FD000BB84EA9821800738B9840C307E812B87D6
+:107FE00072879198000020002B0000002000000004
+:107FF0002000000020000000200000002000000001
+:1080000020000000200000002000000020000000F0
+:1080100020000000200000002000000020000000E0
+:1080200020000000200000002000000014001400C8
+:10803000499814001400E298CD981400140014001C
+:1080400080003701000001020406080C20212240B4
+:1080500080F818000B3001A2140000A2140000A246
+:10806000140202A2388806383988C32064082FA871
+:10807000C128AE9C03A20C30462861816A8400832B
+:1080800056183A8804A8F228919CF4A80C30E128EC
+:10809000919C022806A2C3642E2807A2A064E06D6A
+:1080A000A067C06F14183B882478C16864783E8844
+:1080B00002A8768577866B20C128AE9C44200321D8
+:1080C000A2208120E4A809A2012909A8140005A280
+:1080D00000A372189A873C88E21F01C60AA26E8527
+:1080E0000407919C140004A200A30930E21964F86B
+:1080F0006E853F88E608F7A881F8F0A801C814004B
+:10810000C1F81600B285F080329502FBE21D140022
+:10811000328541F21400E21DA884A0D7E61F1400A6
+:1081200008A243600880C11D1600008360812A8474
+:1081300041F00830A884D6114270DD201100D5200E
+:1081400022881600008047281110FCA8008000A09B
+:1081500002281110FDA89BA83E281110FDA80BA213
+:1081600017000C3000A3E21D81DB1400100201A8EF
+:108170001400E0263A8702FBF219E21F14000DA258
+:1081800006381002B39C04071700FF600C302087EC
+:1081900011A2639D72873788012121A8D210E2784D
+:1081A000669DFCA884D9E2F0A1F06CA81400318887
+:1081B00066D130880F80019420B502C820880FA8AE
+:1081C00001230DA8D210E478669D21882088E6A8B6
+:1081D00023F142F101F14FA8D210F67032880382E8
+:1081E0000C879ED901601400456814021BA2639D90
+:1081F000012040A80182521884D163D134880180C3
+:1082000001A82730A884561A3388140018A281695F
+:108210004F9D26690269341A01A8141A21701400AE
+:1082200000A341616469108092852680B984E46965
+:108230002380E1160180F110466913A2621413A293
+:108240000080E11607A8696914A2C2610280E114E6
+:108250000480E11601010A302788140017A24F9DFF
+:10826000140000A381812A84A884E61C2C881600AF
+:1082700012A2639DD210E4700400078024941ACCEB
+:10828000669DF8A827880A3013000080A484160091
+:10829000C2111E210E871DA214008E8716001CA27B
+:1082A0003510B4A810A207380C307E812B87728756
+:0682B000ADA800000C0D5A
+:00000001FF
+/**************************************************************************
+ *                  QLOGIC LINUX SOFTWARE
+ *
+ * Copyright (C) 2004 QLogic Corporation
+ * (www.qlogic.com)
+ *
+ *************************************************************************/
+
+/************************************************************************
+ *                                                                     *
+ *             --- ISP1040 Initiator/Target Firmware ---               *
+ *                         32 LUN Support                              *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     Firmware Version 7.65.06 (14:38 Jan 07, 2002)
+ */
diff --git a/firmware/qlogic/12160.bin.ihex b/firmware/qlogic/12160.bin.ihex
new file mode 100644 (file)
index 0000000..dc800ec
--- /dev/null
@@ -0,0 +1,1771 @@
+:100000000A042A000010040841100000C93600004C
+:100010004320504F525947495448312039392C31E7
+:1000200039313239312C39392C3339313439512085
+:100030004F4C494720434F435052524F54414F4930
+:10004000004E492050533231363146207269776D67
+:10005000726120655620726569736E6F31202E3093
+:1000600034302020432073756F74656D20726F4E9D
+:10007000202E303050206F72756474634E202E6FC6
+:100080002020303020200024C920FF907120000261
+:10009000A070A2700120FF010420FCD0201171206B
+:1000A0000001A070A270C1202000892021127120BF
+:1000B0001000C3700400C7705349CB702050CF703C
+:1000C0002020D3700A000120FD040420D6700920EE
+:1000D000FFFE30212821A2A1004724842484248407
+:1000E00024842484248492A100910920000001200A
+:1000F00032000C08051E182279200047A02F082482
+:1001000011200000A9204000A4420981D81D092027
+:1001100000FF003402A118021001A820A4421B789D
+:1001200064001478CDC0D5C0167871200002D600C6
+:10013000692040470C085C460120FF010420FCD0E8
+:10014000301169208047712000010C085C4614784A
+:10015000D4C01678DE00CA7EC27CC67B67780000F9
+:1001600000788DC0027831203000AF78010123780B
+:1001700002002778020009200200692040471B681E
+:100180000300236807002768FA002B6808002F681F
+:10019000280037680600336808003B6800000981C2
+:1001A0000005CF680A00BF68C04779200047D368C0
+:1001B0002D76C368C04CC768C04BCB68C08CA7689D
+:1001C000448FAB68498FAF68448FB368448FA3688E
+:1001D00001000120FF010420FCD0C81169208047E4
+:1001E0007008CF680A00BF68C049D3683978C3680F
+:1001F000C06CC768404CCB68D08DA768498FAB688E
+:100200004E8FAF68498FB368498FA3680100E6003D
+:100210006920C04B71200002EC70E4D0192009184D
+:1002200021200900201119200C1821200C000C0895
+:10023000751D0120FF010420FCD088116920404C6D
+:1002400071200001EC70E4D0192009182120090068
+:10025000201119200C1821200C000C08751DEE002F
+:10026000112002006920C04C09200200A9200001D1
+:10027000376800000B684000C87B86A3FFFE28118A
+:10028000176800011F6864002000176864001F6879
+:100290000200E8AD1000041F35110981381D01204E
+:1002A000FF010420FCD02811118218016920C06CC4
+:1002B000D8080C08F6220C083D400C088C1B0C08D2
+:1002C000154691200022792000477120500091208E
+:1002D00000247920004771202000912000267920F9
+:1002E00000027120404791200028792000017120F0
+:1002F00080479120002079200047712010000032B3
+:1003000085A03D30902071201000C37000000410C3
+:100310008C11C07086A0020010110C08BA1339208D
+:1003200000000C08AB12AC7805A08011040E9A11E5
+:100330006C7865A010010C08A1200C08261E040E84
+:10034000AF116C7865A010010C08A120040EAF114C
+:10035000092047471120874704210C2205A11001DD
+:100360000C089B1C71204047A07005A0E8014C744C
+:1003700085A40000C8017920000291200080D0727D
+:100380008CA23D3090210C084C27912000809120B8
+:100390003D30040ED111792000476C7865A0200112
+:1003A000712010000C08A120041DD91179200047EC
+:1003B000712010000C08294471208047A07005A00E
+:1003C00088014C7025A070017920000191200080E7
+:1003D000D0728CA23D3090210C084C2791200080D7
+:1003E00091203D307920004771201000040EFA1151
+:1003F0006C7865A010010C08A120041D8E110C085A
+:10040000294404088E11003C84A0070002000C124D
+:100410000C120E120E1213121312181218120C08CC
+:100420007525912000240C08D5400500912000225C
+:100430000C08D5400500912000220C08D5409120E1
+:1004400000240C08D540050041124112421242120C
+:100450004D124D124D124D1256125612611261126A
+:100460004D124D124D124D12701270127012701208
+:10047000701270127012701270127012701270126C
+:100480007012701270127012F80C0600060126012C
+:10049000912000280C0892252E010E010E000D005F
+:1004A0000600060126010C0800122E010E010E00A6
+:1004B0000D00060006012601912000260C08922559
+:1004C0002E010E010E000D000600060126019120EE
+:1004D00000260C089225912000280C0892252E0158
+:1004E0000E010E000D00060006012601D600E600F2
+:1004F000F600792000477120000269204047003D46
+:100500008CD03001EC7084A0001CE2780C085C46B2
+:10051000003D84D050016920804771200001EC70BB
+:1005200084A0001CE6780C085C460C082625FE001A
+:10053000EE00DE002E010E010E000D0008700B8093
+:100540004012077002008CA0E00120119CD008012D
+:1005500087089708C37002400408BD13040E1E13D9
+:1005600061200000186084D004191E13287805A0AB
+:10057000201104001F1304081E13FCD030010600D4
+:100580000C08291B0E005001280006000C081E1B39
+:100590000E002001012007400408BC131079FCD094
+:1005A0002811612040479CC1FCC720006120804782
+:1005B0009DC1FDC7606005A004191E1312797E60FD
+:1005C0002878FCC086A018002011C6000C08261947
+:1005D000CE002B780000786065A0E001C6009C602A
+:1005E0000C08F31BCE009F6000000C08601A092065
+:1005F00018008760030110780600FF841011FF8542
+:100600001001C5C012780C08341B0E001278981126
+:100610000C087F1B10789CD01811612040472000E7
+:10062000612080479CC012787B600000D060C4D0FD
+:100630003001C4C0D260012005400408BC13040886
+:10064000BA13050006A0C270C670CA70CE70DA7008
+:10065000C0703DA08AA04000041A6C130200BA13B7
+:100660000814D6133C1470147014CE13781A7A142C
+:10067000C813DA13DB13DC13DD137C1AC8138714D9
+:10068000DB144119721ADE13C817FE1730187618DA
+:1006900085179217A517B717BF15C8130D1518158D
+:1006A000261534154B1559155C156E157C158615D8
+:1006B000A515B115C813C813C813C813CC15DD157B
+:1006C000F7152B165416661669169316CC16DE16F9
+:1006D00053176317C813C813C813C813751700211D
+:1006E0008AA04000041AC8130200C813C813C81314
+:1006F000C813C8139E1AA41AC813C813C813A81A7B
+:10070000E81AC813C813C813C81303146B1482144F
+:10071000D6143C19C813C8130B19C813EC1A901A35
+:100720009A1AC813C813C813C813C813C813C81318
+:10073000C813C813C813C813C813C813C813C813E1
+:10074000C813C813C813C813C813C813C813C813D1
+:10075000C813C813C813C813C813C813C813C813C1
+:10076000C813C813C813C813C813CA72C6710120AE
+:1007700006402800CE73CA72C67101200040C270C4
+:10078000040EBD13612000001B6001009120005089
+:10079000912080400500C3700140900CC37006405A
+:1007A000780C99204100A1204100A9200500A35305
+:1007B000200CC470C37004000708F808F008E808AB
+:1007C000E00891200080C3700400C7705349CB70CB
+:1007D0002050CF702020D3700A0001200400D67072
+:1007E000792000001B7801003120300059200010D2
+:1007F00029201A045120450461204704C12020000B
+:10080000912000509120804004081804D875DC74B1
+:10081000DA75DE741800292000002025D071C87216
+:10082000CC73C470A02099203000037001000770C1
+:1008300006001A731E722274267521204000FF8163
+:100840000409BA1382A140001012202106A008203A
+:100850000384127007700400077001000870FCD058
+:10086000E80D0770020084A0E0012001C37002407F
+:100870000408BD13A824A553100C0408BA1329209A
+:1008800000002025D071C872CC73C4709820A120BC
+:10089000300003700000077006001A731E72227485
+:1008A00026752120400007700600FF810409BA1355
+:1008B00082A140001012202106A00820038412709B
+:1008C000A824A653077001000870FCD0E80D84A08E
+:1008D000E001480DC37002400408BD13D875DC74F4
+:1008E000DA75DE747808C471C87014219EA70400FC
+:1008F00008110A20CA720408B913C7700A00CB7025
+:100900000400CF702A000408BA13D875DC76DA75B3
+:10091000DE761800292000003025C470C872CC7320
+:10092000D074C670CA72CE73D27405A0E8050AA44A
+:10093000080140120180727884A000FC3801AC7874
+:1009400085C0AE78012005400408BC137E7B7A7A0E
+:10095000867E827D767C8CA400FF700107840480F3
+:1009600004800C810C810F8118A191A20000B1A616
+:10097000000081A50000500007840480048018A3B3
+:1009800091A20000B1A6000081A500001A731E729A
+:100990002276267005A61801107AC5C2127AAC78A4
+:1009A00084A0FCFFAE781800AC7885C0AE7804084F
+:1009B000BA13D875DC76DA75DE76180029200000C7
+:1009C0003025C470C872CC73D474C670CA72CE732A
+:1009D000D67405A000050AA41001041ABC130180F6
+:1009E000927884A000FC3801AC78C5C0AE780120B4
+:1009F00005400408BC139A7A9E7BA27DA67E002641
+:100A000005A51801107AC5C2127A967CAC7884A02C
+:100A1000FFFCAE781800AC78C5C0AE780408BA13F5
+:100A2000092000006C7865A0180108810060D80CCE
+:100A3000C47A0408B813092048470C210120FF019B
+:100A40000420FCD00419B91311208847142204088B
+:100A5000B813092049470C210120FF010420FCD0D4
+:100A60000419B9131120894714220408B81361200E
+:100A7000404728612C621482148214820120FF01F5
+:100A80000420FCD04811612080472863DA732C636E
+:100A90001C831C831C83DE730408B81309204C4795
+:100AA0000C210120FF010420FCD00419B9131120EE
+:100AB0008C4714220408B81318790408B9130920C4
+:100AC00002020C218CA1300F0120FF010420FCD078
+:100AD0000419B91311200201142294A2300F040842
+:100AE000B81309204D470C210120FF010420FCD040
+:100AF0000419B91311208D4714220408B813207962
+:100B00000120FF010420FCD00419B913247A040841
+:100B1000B8131120404CC471FCD110111120C04BEE
+:100B2000078184A00F0003800380038068A2006A0D
+:100B3000086B1C6CDA74FCD1181121203B021000E8
+:100B400021203B012424A4A4001CDE740408B71354
+:100B5000C4770C089A1B912000801C6B146A9120AA
+:100B6000018008270408B71361204047186101205D
+:100B7000FF010420FCD00419B913612080471862DA
+:100B80000408B813C4770C089A1B912000800869E8
+:100B9000186A106BDA77912001800408B713C471CA
+:100BA000102194A20F0082A21000041AB3130C08A3
+:100BB000B42384A30040100195A220000408B713B9
+:100BC000C4710021BCC082A01000041AB313BCD1B0
+:100BD00020111120484704222000112088470422B8
+:100BE000BDC006000021BCC012200C0858231E0006
+:100BF0000408B913C471212049470424C670192080
+:100C000000003000C871212089470424CA70FDC348
+:100C100011202316A9200800042206A13801108201
+:100C2000041F0916C471C8720408B21392A22316D5
+:100C3000260022211E000C086A230120FF01042047
+:100C4000FCD01011FCD3F0090408BA13E803FA0031
+:100C5000F401EE020400010002000300612040479D
+:100C600028612C62148214821482C4702A60C870B5
+:100C70000380038003802E600120FF010420FCD04C
+:100C8000A011260016006120804728612C62148282
+:100C900014821482D8702A60DC7003800380038081
+:100CA0002E60DA71DE721E002E000408B813612077
+:100CB00040473061C47032600120FF010420FCD045
+:100CC0000419B913612080473062C870326004088B
+:100CD000B81318790408B913C47184A1CFF048017E
+:100CE0000120FF010420FCD00419B313C8720408CA
+:100CF000B213192000000C08A62336000120FF01C2
+:100D00000420FCD018011E000408B913C87184A186
+:100D1000CFF028010E001021C4710408B213FDC3E6
+:100D20000C08A62310231E000408B813C47182A166
+:100D3000100048020120FF010420FCD00419B31365
+:100D4000C8720408B21311204D4704220600048122
+:100D5000081208811221192000000C089323012099
+:100D6000FF010420FCD018011E000408B913C8714B
+:100D700082A11000280206001021C4710408B213D9
+:100D800011208D47042206000481081208811221D7
+:100D9000FDC30C0893232E001E000408B813C47171
+:100DA000C87284A1FDFF0419B21384A2FDFF0419C7
+:100DB000B2130021207922780022247A26780408B0
+:100DC000B8131120404CC471FCD110111120C04B3C
+:100DD000078184A00F0003800380038068A2C8728B
+:100DE000CC73D874C6710068CA70CE73DA7491205F
+:100DF0000080026AACD2181121200000900084A467
+:100E0000FF0082A00200041A4F173F84BCA7FF0016
+:100E1000400186A7020004194F1784A4FF000409AB
+:100E20004F1761200002FCD1100161200001292030
+:100E30000900312062003F84BCA7FF003001078316
+:100E400084A0FF0010113DA738114120190084A390
+:100E5000FF0082A01A001002A4A4FF00078384A050
+:100E6000FF00880142A8F00286A0100020119CA378
+:100E7000FF009DA3000FBCA3FF00002502A7900266
+:100E8000002602A7781239203A00046805A70668F0
+:100E90000A6B0C6BCE731C68DA701E6C912001809B
+:100EA0000408BA13912001800408B413C4770C0815
+:100EB0009A1B91200080146A1C6B91200180C870DD
+:100EC0001668CC701E6808270408B713C470612028
+:100ED000404718611A600120FF010420FCD004196A
+:100EE000B913C8706120804718621A600408B813EB
+:100EF000C471C872CC7382A11000041AB3130C0819
+:100F0000D82384A30040100195A220000408B71341
+:100F1000C4770C089A1B91200080086A8DC20A6A67
+:100F20009120018008270408B813C4770C089A1B85
+:100F300091200080086A94A2F9FF0A6A046805A05B
+:100F400010010C08D5229120018008270408B8134D
+:100F5000C4770C089A1B91200080086A95C20A6A1F
+:100F6000046805A010010C08D522912001800827F3
+:100F70000408B813C477412001004920050051201E
+:100F80002000912000800C08B21B912001800827CE
+:100F9000086A0408B813C477FCD728010C08291B79
+:100FA00038010408BC130C081E1B10010408BC13F4
+:100FB000C873CC72C677CA73CE720C082A1CE811AB
+:100FC000186805A0A001082776000C08F7237E000A
+:100FD000701101201500FCD718116120404718003E
+:100FE000FDC0612080472A78912001800500912072
+:100FF0000180012005400408BC13912001800408F1
+:10100000BA13C477FCD728010C08291B380104083F
+:10101000BC130C081E1B10010408BC13C67741202A
+:1010200021004920050051202000912000800C085B
+:10103000B21B09201600FCD7181161204047180088
+:1010400061208047FDC1636003007B600000726720
+:101050007F600F002A79D061C4C1D2610C08D5220B
+:10106000912001800500C877CA77C477C677FCD77E
+:1010700028010C08291B38010408BC130C081E1B8E
+:1010800010010408BC13BCA700FF912000800920B8
+:101090001700FCD7181161204047180061208047D5
+:1010A000FDC17B6000006360020072677F600F001B
+:1010B0002A79D061C4C1D2610C08D5229120018067
+:1010C000412021004920050051201000912000807E
+:1010D000C87005A01801D060FDC0D2600C08B21B1A
+:1010E000C8703668388784A71F00C01D9120018012
+:1010F000050019200000C87284D228010C08291BA1
+:1011000038010408BC130C081E1B10010408BC1392
+:10111000C872CA72AC7884A0030018153920000088
+:1011200084D20801FDC7412021004920040051203C
+:1011300008000C089A1B912000800868D4C00DA8F4
+:101140000A693768000091200180388784A71F0052
+:10115000801DBCA700FF3F8738873F8784A7000F0B
+:10116000401D91200080C8726920000184D21011B6
+:1011700069200002086884A0FDFF0A683068B4D0C6
+:10118000B0014B680400A9201400486894D01001F5
+:10119000041FC2184B680900A9201400486884D0B5
+:1011A0001001041FCB18A920FA00041FD2187920BF
+:1011B000004709201800C87284D2181161204047E6
+:1011C000180061208047FDC17B6000002A796360C0
+:1011D00001007F600F00A3600000A460AE60B260F9
+:1011E000D060B4D06001B4C0D260C600B46065A065
+:1011F0000860D4C00A60186001801A60CE00D06018
+:1012000084A0FF7ED260AC788DC0AE78FF830801E9
+:1012100005001B685400912001800500CC730C0868
+:101220007818EC69486A85A100184A6885A14000D1
+:10123000EE68CC7321200400A920FF09041F1B19AC
+:101240002184D01D1983B01DEE694A6A9120018066
+:101250000500FCD71811692040471000692080471D
+:10126000C471C6711669FF811011A3680100AC78C2
+:101270008CC0AE7884D010110C087A1C0500D8758B
+:10128000DC74DA75DE7410002EA02025C471C873DA
+:10129000CC72C671CA73CE7279200047DE7DDA7CCB
+:1012A000D67BD27A0C08771B04095C1AA9200500AA
+:1012B000A120144791200080A141912001800920A4
+:1012C00040000C08411D20010C087F1B04085C1A1B
+:1012D00004608CA0FF008EA10900201106000C08FC
+:1012E00086200E0084A000FF078009800409F11900
+:1012F000C600682C0C08771BA805002C9E68098185
+:10130000C01D9F600000CE00C600DC7DD87CD47B71
+:10131000D07A90A2400099A30000A1A40000A9A542
+:101320000000DE7DDA7CD67BD27A682C9C6865A0D2
+:101330000409F019092040000C08411DA0150460A3
+:1013400084A0FF0086A002005001046084A0FF007A
+:1013500086A00A00381116000C0883201E00002DFC
+:1013600002609808CE00C6009C600C08F31BCE00FB
+:101370009F6000000C08601A092018000860CDC0AA
+:101380000A600460866010780600FF841011FF85F3
+:101390001001C5C012780C08341B0E0012780C081E
+:1013A0007F1B04085C1ACE00C6009C600C08F31B6F
+:1013B000CE009F6000000C08601A092018008760AA
+:1013C00003011B60030010780600FF841011FF85E5
+:1013D0001001C5C012780C08341B0E0012780C08DE
+:1013E0007F1B04085C1ACE001461FCD120010C089C
+:1013F000291BF00118000C081E1BD0010C08601AF4
+:1014000009201800876003011B6021001078060086
+:10141000FF841011FF851001C5C012780C08341B21
+:101420000E0012780C087F1B012007400408BC1333
+:1014300004618CA1FF0086A1050018111C60BDC0CD
+:101440001E60C474C873CC72146091200080E600E2
+:1014500009201200FCD0181171204047180071209B
+:101460008047FDC12A7963700500D071C4C1D27173
+:1014700066736A726E74727077700000002C7A70F6
+:101480002EA030251C6184A1600010010C08E93FEA
+:10149000EE009665A6659A66AA66AF600000B36026
+:1014A0000000146723600000246096A00100101162
+:1014B000008026600C08D522912001800500C370B1
+:1014C00005400408BD13A920050099201447912068
+:1014D00000800A5391200180002110A299A30000EE
+:1014E000A1A40000A9A500000500C471C7700000F8
+:1014F0001E790408BA13C471C671682110006920EE
+:1015000000100C6916A0042D10A2688D0981D81D49
+:1015100085A200001811C37000401000C370034082
+:10152000CA700408BD136479C671C47182A1030036
+:10153000041AB31366790408BA136479C6710408EF
+:10154000BA130079C671C47102790408BA1300791C
+:10155000C6710408BA13C470112000008CA00D00DD
+:1015600060010C81300210820C810C81100210820B
+:101570000C81FF810419B41310820E7A8CD23805C5
+:101580001079CDC11279092021001920030084D2DD
+:10159000C00108811920410011204E8F122319200B
+:1015A00042001082122319204300108212231920B6
+:1015B000460010821223192047001082122319209E
+:1015C00006001120538F12211120738F12230479EA
+:1015D00006780408B9130478C6700408BA13C471F5
+:1015E000FCD118111120C04B10001120404C078174
+:1015F00084A00F0003800380038068A211200000F4
+:101600001468FCD0100195A20002B4D0100195A27C
+:1016100001000C6B0068DA700408B7131478F4D07A
+:10162000300101200740DB70000005A04800FCD01D
+:10163000300101200740DB70010005A0080006A072
+:1016400005001478F4D0300101200740DB70000061
+:1016500005A0080006A005001478FCD03001012088
+:101660000740DB70010005A0080006A0050012710C
+:101670001A721E731078C4D010012274267580ACC3
+:10168000010008810C81A9819880A120300003709D
+:1016900000008460A220A65307700100747984A121
+:1016A00000FF40010F810C810C81048004800780C1
+:1016B00000A118000781048004807C7908A1787A51
+:1016C00006A011A2107DC4D52001847B19A3807CC3
+:1016D00021A40870FCD0E80D03700100077006001B
+:1016E0001A711E72107DC4D510012273267484A055
+:1016F000E0010500487865A02001042C4A786320A9
+:1017000000000500F6007920004748786220002C90
+:1017100005A010110C0875254A78FE00050011205F
+:1017200000914A7AC47B1983280180A232001220DA
+:101730001020C80C13200000050016002600FCD75E
+:1017400018111120C04C10001120C06C84A7000F8C
+:101750000B8084A71F002001038003800380038087
+:1017600005A168A22E001E000500390C00292A6878
+:10177000002A2E68086884A0EFF90DA80A69E6001F
+:10178000FCD728110920524771204047200009202A
+:101790009247712080470C21046805A0480116A1DA
+:1017A000381160200060066816000B200000180049
+:1017B000092000001600046865A078010060066832
+:1017C00021040C08B21D1068087909810A7901808A
+:1017D0001268881D1079A5C112791E000269066978
+:1017E000002D60200C08BF26EE00050065A06001FA
+:1017F00008209C6005A0280162209F60000065A071
+:10180000C00C48784A7962200500076003018F60A8
+:101810000000A9201C0080AC0500A02001200000D1
+:10182000A44028681A602C6822600500E600FCD7F6
+:101830002811712040473120C04720007120804787
+:101840003120C0494C708CA00002281108A60A2D36
+:1018500000804E7006A0EE000500F600FCD71811BF
+:10186000792040471000792080470C089A1B91206E
+:10187000008004680A7865A0F0053000002C0A7822
+:101880006020006065A0B805106006A3B81D0C605C
+:1018900006A2A01D282C487806AC0811480404684C
+:1018A00006AC401100606020066805A018110368AE
+:1018B00000004800006408786020026486A40000EC
+:1018C0001011002C026860250C08021C1B6005002A
+:1018D00023602000FE000C08B21DF6000879098183
+:1018E0000A7910680180126818111078A5C0127862
+:1018F0000120FFFF05A0FE0005007600002739202B
+:101900000000FCD00801FDC741202100492004004F
+:1019100051200800912000800C08B21B388784A752
+:101920001F00D01DBCA700FF3F8738873F8784A7D3
+:10193000000F901D912001807E0005006C78092029
+:10194000748F0C210DA1180165A00408A12061204D
+:101950000000186084D0B81110788CD030018CC091
+:101960001278FCC76920404728008DC01278692092
+:101970008047FDC7912000801C681F6800009120EF
+:10198000018005A0081105008CA0F0FF10010C08D3
+:1019900075250200D71CDA1CE01CE41CD81CE81CCE
+:1019A000D81CD81CD81CEE1C181D1B1D201D291D61
+:1019B000D81CD81C05000C0875250C087A1C0120C1
+:1019C00001800408321D012003800408321D01201B
+:1019D00004800408321D0C087A1C012006800408CB
+:1019E000321D11200A8091200080FCD71811692037
+:1019F00040471000692080473820006886A000001A
+:101A000020011E6F91200180050026007068BCA097
+:101A100000FF4120210049200400512010000C0843
+:101A2000B21B388784A71F00D01D912001800E00B3
+:101A30007069C671D00001200C80B8000C087A1CB7
+:101A400001200D809000FCD71001E4780800E078B8
+:101A5000C67001200E804800FCD71001EC78080009
+:101A6000E878C67001200F800000C270FCD7181102
+:101A7000DB7000001000DB700100612000001B60C3
+:101A8000010091208040050080AC0100FF81180515
+:101A900099203000A0200C7084A0FF07000118706E
+:101AA00006001C70060020700600247006001271EB
+:101AB000AC811A721E7322742675037001000770C0
+:101AC000010008700B80E81E077002008CA0E00186
+:101AD0001011A55306A003700000077004000E004B
+:101AE00026700E0022700E001E700E001A70050087
+:101AF00011202000092010000A6B0E6C1F680102E3
+:101B0000036820FD076838001A6A002DE8A0080065
+:101B100090A204000981801D0500EC70DCD0201526
+:101B2000292001001478CCD06011EC70E4D0192089
+:101B30000A0C21200A00201119200C0C21200C0075
+:101B40007000EC70E4D0281119200C1821200C0032
+:101B500030001920091821200900ADA500020A6BE8
+:101B60000E6C1E6D07683800050004608660082C46
+:101B700063200000687805A06A791001022C080033
+:101B80006E790500C6006120004787680301082DB3
+:101B90006B200000686005A06A611001022D08003A
+:101BA0006E61CE00050091200080042C6E7805A0A7
+:101BB00008116A78912001809C6005A08801C60008
+:101BC000602008209C6005A0380162209F60000012
+:101BD00065A09C6005A0C81D48784A796220CE00A7
+:101BE000487862209F60000085AC000010110C084E
+:101BF00075254A780500A920100006A0048086807B
+:101C00008E81081200A2041FFC1D86808E810500B3
+:101C10005601A920100005A0B8011AA1A81213822C
+:101C20008D8128021AA12012041F0C1E28001AA15F
+:101C300008231082041F0C1E0600003284A0FFEF50
+:101C400080200E005E0105000600003285A0001015
+:101C5000B80C747DD07006A50409DA1E10785020E7
+:101C60000C08771B0409DA1E46A070790025008055
+:101C700012A10920400008123000D07206A21801FB
+:101C8000408809208000C600127107700100992069
+:101C90003000A920200080AC0100A02061200000BD
+:101CA000FF8810010C08771B0870FCD0E80D077046
+:101CB0000200912001808CA0E0013815A553FF8C13
+:101CC0002011FF880409C71E5000002C8E78A9201F
+:101CD000200080AC0100A020A5530408C71E46A028
+:101CE00018721C73C4DA10012074247592A240008B
+:101CF0009BA30000A3A40000ABA500001A721E73F2
+:101D0000C4DA18012274267506A0077004000409BD
+:101D1000C71EFF8C10010C087F1BCE000C087F1B18
+:101D200046A0887800808A7886A00200C0017C7A6C
+:101D3000787BC4DA1001847C807D7479078104800B
+:101D4000048010A299A30000A1A40000A9A500008E
+:101D50001A721E73C4DA8805227426757004146022
+:101D6000FCD018116920404710006920804791205D
+:101D700000801F680200FF88200146A08C78602048
+:101D8000700C8B780000AC7885A00300AE789120B1
+:101D900001809800CE008B7800000C085C20046065
+:101DA00084A00F005900FF8830018C786020046007
+:101DB00084A00F0019000408261E05000200EC1E76
+:101DC000071F201FEC1E2D1FFD1EEC1EEC1EEC1E1F
+:101DD000051F1E1FEC1EEC1EEC1EEC1EEC1E392017
+:101DE0000004BC7805A7BE78086005A70A600C0847
+:101DF000691F9C60BA789F6000000C0848200500AD
+:101E0000BC78C4D00801580C1C60BDC01E603000F6
+:101E10000C088620BC78C4D00801080CBF780000EC
+:101E20000460078084A0FF00B278018038010C08AC
+:101E3000691F2001BC78C5C0BE7810000408841F4B
+:101E400005000C088320BC788CA0000E1011C4D0B3
+:101E5000081128080C08691F10110408841F0500C8
+:101E6000BC78C4D010010408EC1EBF7800001467D1
+:101E700011200100A822186084A0FF0005A088019D
+:101E8000BCA700FFA92020008EA001005001BCA724
+:101E9000008011200200A92000018EA0020008018C
+:101EA000C0000C089A1B002D912000802B680000B8
+:101EB0002F680000086884A0DEFF0A68E8AD100003
+:101EC00091200180041F511F11821801A9200001D7
+:101ED000580C0C087F1B05009F600000B4786DA0B3
+:101EE000002CB6781011BA7838009E68002D026078
+:101EF000B87806AD08110260B0780180B278301170
+:101F0000BC78C4C0BE78B878602006A00500E600A2
+:101F10002EA03025BA7DB67DAE65B2651C60A2608C
+:101F2000482084A9FFE11E6084A9600060010C08BC
+:101F3000E93FFF864011FF853011392000080C0869
+:101F40004820040846209665A6659A66AA66146726
+:101F500071208047FCD710117120404784A7000FE3
+:101F60000B8084A71F00200103800380038003806F
+:101F700005A1C07168A10027078084A00F0003801D
+:101F800003800380C47100A1C26091200080147896
+:101F9000C4D03801FCD71811F4D040111000FCD087
+:101FA0002811086E84D6F001FCD9E011912001803F
+:101FB0000C08021C912000800C08B21D91200180A9
+:101FC0001478C4D004094620FCD72011F4D0301175
+:101FD00004084620FCD01011040846201B60210094
+:101FE00004084620246096A001001011008026609D
+:101FF000106A146802A268026001912001803920F1
+:1020000000029C60BA789F6000000C084820040819
+:102010004620082CFCD9F001006865A0D801046AAC
+:10202000007084A002006801487006A25011046B81
+:1020300060210423026005A0081102696022026188
+:102040009800002D60200C08BF26086E60210262F7
+:10205000066950000068026965A01001026108006D
+:1020600006696021036000006021FCD91801B4A654
+:10207000FCFF0A6E1068087D28850A7D00801268C2
+:1020800091200180B4D62801B6A640000A6E0C0843
+:10209000131CEE000500086005A70A60912000806F
+:1020A0000C08B21D91200180B87865A028019C60C1
+:1020B000BA789F600000780CB678BA78050070791D
+:1020C0007478182884D31801008012A1200200809F
+:1020D00012A1781284C37C7A1A72787A1E72C4DADA
+:1020E0002001847A2272807A267206A084D30801A5
+:1020F00000807678D2701C7805A0380101801E78A7
+:102100002011040E82209120804005003920982063
+:10211000100039209E20042705A0600100AC682033
+:102120000869106812690A680C69146816690E68F3
+:102130003887880C0500030009000F0015001B00FC
+:10214000000015001B000000412000000C78020078
+:102150004A222522A92019213920748F3427107D85
+:10216000C000846086A00301041903211461186073
+:1021700005A12001FF86D81104080321038680A051
+:10218000558F0C6202220080106202220C08D01DC2
+:1021900030868EA60F00040984216C7865A0081D86
+:1021A000087802A62012ACD510113A26050082A6A6
+:1021B0000300041A8421912000806920000018681F
+:1021C00084D0F8111120558F0422C6701082042289
+:1021D000CA7084D6301110820422DA701082042270
+:1021E000DE7085A62080C2701B68010091208040AF
+:1021F000107884A0CFFF1278912001803B2000004E
+:1022000005001078ADC01278040884213A260C0825
+:10221000502204196C226C7865A00419AE2091201C
+:102220000080107884A0CFFFFF860801ADC012782F
+:102230009120018004086C223920748F3427107D8E
+:10224000A000846086A0030104196E211461186047
+:1022500005A12001FF86B81104086E2180A6558FC4
+:102260000C6202220C08D01D30868EA61E000409C6
+:1022700084216C7865A0281D087802A62012ACD5B0
+:1022800010113A26050082A60600041A8421912026
+:10229000008069200000186884D0F8111120558F43
+:1022A00009204E8FA8261C2104221A2008811082A2
+:1022B000041F502185A63080C2701B680100912048
+:1022C0008040107884A0CFFF12789120018006A072
+:1022D0000920758F0A203A2005001078ADC01278C9
+:1022E000B0003A260C08502204196C226C7865A0C4
+:1022F00004191E2191200080107884A0CFFFFF8652
+:102300000801ADC012789120018004086C22912050
+:102310000080077004009479D47002A1280268013B
+:10232000907B02A350111000028038113A261078D9
+:10233000ADC0127891200180050084A100FF40010A
+:102340000F810C810C8104800480078000A118009B
+:102350000781048004809C7A10A21A72987A06A0E1
+:1023600011A21E72C4D43001A47A11A22272A07AE2
+:1023700011A22672A1203000037000000920548FA2
+:102380000A2609819821042184D008013386B0A649
+:102390000200A826A65303861270077001009079E8
+:1023A000947800800AA1081206A02820747984A1DC
+:1023B00000FF40010F810C810C81048004800780A4
+:1023C00000A118000781048004807C7908A1787A34
+:1023D00006A011A2C4D42001847B19A3807C21A46F
+:1023E0000870FCD0E80D84A0E001D001107D312000
+:1023F000548F3426A8780080AA788CD038110770C2
+:102400000600047094D0E81D04088621692047471F
+:102410006B200300AC7885A00003AE7806A04800CE
+:102420003020D67591208040967D107DACA5CFFFE1
+:10243000127D91200180AA78077006003A26037069
+:1024400001001A711E72C4D5100122732674050092
+:10245000846086A00301D8111461186005A1B81129
+:1024600069200000186884D090110C60C67010605C
+:10247000CA70C37020801B680100912080400C0846
+:10248000D01D040E43226C7865A0101D0500590074
+:1024900030156C7865A0E0191004290000156C78DF
+:1024A00065A0D81DE000846086A003016811186053
+:1024B000FCC01A6086A0040038110478A4D0200162
+:1024C0000C08D01D06A005007900181185A0010098
+:1024D0000500B900101141200100107D0500FF88A2
+:1024E0001001912080400500907B9479D47002A166
+:1024F000181185A300000500100202A30500028048
+:10250000050084A100FF40010F810C810C81048033
+:102510000480078000A118000781048004809C7A51
+:10252000987BA47CA07D10A206A019A321A429A5B4
+:1025300009201800286005A01001092040000C089F
+:10254000341BD001A8780080AA788CD010151460B4
+:10255000FCD0181169204047100069208047912065
+:1025600000801F680300AB780000AC7885A00003F2
+:10257000AE78912001806800AB7800000C08D01D77
+:102580009079947800800AA1081206A09678D670F7
+:1025900006A071201000912001800500FCD71811C1
+:1025A00009205847100009209847912000800A20F0
+:1025B000F6000920804779200001FCD7201109206E
+:1025C000404779200002042186A000008011FCD73A
+:1025D000181109204547100009208547042105A04E
+:1025E0003011307884A0C00010111B785200FE001A
+:1025F000050009200200692000470120FF01042096
+:10260000FCD004194B237120804779200001212040
+:10261000BF494B780F000120FF010420FCD01801B6
+:102620001920373E3000A1202B011920373E84D1DC
+:102630001001A1202B02042305A040019A781883E1
+:10264000AC2318839823A6531833A80C9B7800005A
+:102650009B782000A9201000AF780000AF782020E0
+:10266000041F29230370000016008CD109200000EC
+:102670000801BDC10C086C241E00207084A00F004E
+:1026800085A0006306780F7800904378D8005378CF
+:1026900090000B78082F52744F70000009814001A0
+:1026A00071204047792000022120BF4704080623FB
+:1026B0000C0826250500160011200101BCD11011BF
+:1026C000112001028CA10F00042284A0F0FF05A1BB
+:1026D00012201E000C086C24050011200101FCD3FF
+:1026E000101111200102A92009000B81041F72237F
+:1026F0008CA1000E042284A0FFF105A11220050088
+:102700001920020009200101A92005001382041FDD
+:10271000832394A2E000042184A01FFF05A20A20C5
+:102720001983180109200102780C0500112001010C
+:10273000FCD3101111200102A9200C000B81041FF1
+:102740009B238CA100F0042284A0FF0F05A112207E
+:10275000050011200201FCD31011112002020422F5
+:102760009CA0300F84A0CFF005A112200500C60068
+:1027700061200001BCD1101161200002BCC10381A5
+:10278000038080A020009A60AC62AC63CE0005009C
+:10279000C60061200001BCD1101161200002BCC143
+:1027A0000381038080A022009A60A46084A0DFFFE0
+:1027B000AE60CE000500C60061200001BCD1101142
+:1027C00061200002BCC10381038080A020009A60C8
+:1027D000A4608CA220001801ACC29DA30040ECC3F1
+:1027E000B4D30811EDC3AE621020A460AE6318200C
+:1027F000CE00050091200080C600E600186805A004
+:1028000004095024FCD118016120D08E10006120F1
+:10281000C08D0C0858246005A9200101FCD11801C5
+:102820006120D08D10006120C08CC6000C08582497
+:102830002801CE00608C041F1224A8040E00FCD1D5
+:10284000280182A0D08D71208047200082A0C08CFA
+:102850007120404776707271382101200400627047
+:102860007F700F00D071C4C1D2710C08CB22C000A0
+:10287000FCD1181171204047100071208047206062
+:10288000DDC0226072713821002C7A7001200600B0
+:1028900062707F700F00D071C4C1D2710C08CB225E
+:1028A000012000001000012001009120018005A0FE
+:1028B000EE00CE000500042C05A070016020106021
+:1028C00006A340110C6006A22811146006A1101185
+:1028D00006A020000060800C85A001000500F60025
+:1028E000E60016007920804771200001BCD120113C
+:1028F000792040477120000220798CA10F00EC70F4
+:10290000C4D010111E0060000B810B810B810B8164
+:102910000E008DA10008BCD010118DA1000F042164
+:10292000EE00FE000500012001470420ACD0381164
+:10293000E468ACD0200184A006000811090005005D
+:102940001460E600360018207120404CFCD01011B5
+:102950007120C04B078084A00F0003800380038098
+:1029600070AE047084A00A0004192325087194A194
+:1029700000FF040923258CA1FF001C7084A000FF28
+:10298000C001047085A03A0006700120090002A170
+:10299000D81601200A0002A1D01601200C0002A1C5
+:1029A000C8161C7084A0FF001E70047084A0DFFF96
+:1029B000067001200A0006A1A80101200C0006A152
+:1029C000A0010120120006A198010120140006A117
+:1029D00090010120190006A188010120320006A102
+:1029E0008001D80009200C00D00009201200B80096
+:1029F00009201400A00009201900880009202000E7
+:102A0000700009203F00580009200A0040000920FA
+:102A10000C002800092019001000112000000021DE
+:102A200005A20A70047085A00A0006707120004794
+:102A30000470BCD05801FCD32011EA7371204047C8
+:102A40001800EE73712080471F700D003E00EE00ED
+:102A500005000120FF010420FCD0D0110120FD045D
+:102A6000042082A00500A01271200002EC718CA14C
+:102A7000001C0F810C810C8179200001EC7884A06E
+:102A8000001C07800480048005A18AA007000802BA
+:102A90000500020074255B2574255B254E256825FD
+:102AA0004E25087084A0FFC385A000300A70087806
+:102AB00084A0FFC385A000300A780500087084A0B8
+:102AC000FFC385A000200A70087884A0FFC385A0FA
+:102AD00000200A780500087084A0FFC385A0000CC0
+:102AE0000A70087884A0FFC385A0000C0A7805004E
+:102AF000040E7525912000807120000006001870DA
+:102B000084D0E81D0E0071201000CA700E00C6703F
+:102B1000C3700280DB70040ADF702A00712000009D
+:102B20001B70010091208040F80C3C7F587E307C67
+:102B3000387DA0788A708E75927496769A7794A56F
+:102B40003F00F4D43801BCD7281184A77D000419B4
+:102B50009C3C71089CA40F0082A304002003A6A340
+:102B6000070030191824078584A00F0002006C2B81
+:102B7000572C952CFB2E7932D03276330534D9344C
+:102B8000AB35C725C4259E29852A4D32C4250C089E
+:102B90007525050006A0380008788DC00A7806A0C3
+:102BA00002704A704270CE705C7005A0041918273C
+:102BB000607084A007000200E12552265A26632691
+:102BC0006C26FE26752652263078BCD0101DD0719A
+:102BD000BCD1F819B4D104192F26A07086A0010029
+:102BE000C009147005A0A819B0706DA0006865A098
+:102BF00055A09B7880000C6BAA7B086845A0106DDF
+:102C000004686DA05DA086A801001801BC69AA7DBA
+:102C1000AA79C0684DA01C6E0120100004084B2842
+:102C20005C7005A00419C625C600D600B0706DA062
+:102C3000006865A055A09B7880000C6BAA7B086893
+:102C400045A0106D04686DA05DA086A80100180164
+:102C5000BC69AA7DAA79C0684DA01C6E0120200025
+:102C600004084B280C085B3C0419C6251B78680037
+:102C7000B8706DA0B4685A789468D678DE78986891
+:102C8000D278DA7808788DC00A78BC683E70B4C112
+:102C9000D271B47065A0C068567003700200002D38
+:102CA0004A7080AD0900427005000C085B3C2011A1
+:102CB0001B7854000370040005000C085B3C2811CD
+:102CC00011200C0019040370040005000C085B3C83
+:102CD000281111200600D1000370040005000C0823
+:102CE0005B3C281111200D008900037004000500D1
+:102CF0000C085B3C501111200600410078707B707D
+:102D0000000068204A700370040005007071FCC167
+:102D1000078182789B78800086A20C002011AA7A15
+:102D20000120010098008CA11F008DA1C000AA798C
+:102D300086A20D002001AA7A012002003800AB789B
+:102D400020007471AA79AA7A012004009B7860009F
+:102D5000AA785B7804001B7813010C086E3C7F7026
+:102D60000F00D070B4D06801B4C0D270C600B47087
+:102D700065A0086084A0EFFB0A60186001801A60FB
+:102D8000CE000500147005A03811D070B4D0280111
+:102D9000B47006AC1011290C05001600A07186A1B4
+:102DA00001002805D600260000211120010012A2F2
+:102DB000B0706820006806AC20011182B001C90023
+:102DC000C80CC60000211120010012A2B0706820BA
+:102DD00000686020086084A0EFFB0A601182100187
+:102DE0004100B00CA3700100CE002E00DE001E00DA
+:102DF0000500E8AD0500A87006AD1011A4706820AC
+:102E000005000C085B3C0419C625787068207077B3
+:102E10000C08953B502C0C08F63C9B7880001468FD
+:102E200084A01F00BDC0AA781C6E412001000120B3
+:102E30000400040850280C085B3C0419C6259B7844
+:102E400080005C706820146FD070B4D06801B4C08A
+:102E5000D270C600B47065A0086084A0EFFB0A6061
+:102E6000186001801A60CE000C08953B502C0C08AD
+:102E7000F63C246805A0300182A00600080210007C
+:102E800027680500146884A01F00BDC0AA783120FF
+:102E900020004120010001200300040850288DC2B9
+:102EA000D272BC7200A215A0507108812AA108023A
+:102EB000BC7164210465FF85701152712184A81DC5
+:102EC000D0708CD02801CC7005A01011CF700A00F2
+:102ED00005000022900CD0708CC0D270CF70000022
+:102EE000346005A0B01D086784A73F07D001D4D780
+:102EF000801D84A72100681D84A70200300184A7DB
+:102F00000400380DBCA7FBFF0A6784A71802081D40
+:102F100084A700013001186005A0D819BCA7FFFEE6
+:102F20000A676825236800001C6E84A60E001863DB
+:102F300028011C6002A3200218015808FF834819C9
+:102F4000582D502C5271BCD72011287022603A6045
+:102F50001000BCC70A67C06865A04DA00061602A68
+:102F600041200100146B9CA31F009DA3C000FCD155
+:102F7000100184D610019CA3BFFFA4D610019DA30D
+:102F8000200084A60E0004190228A5C70A67002C99
+:102F9000C668A07786A701007811D070B4D0601100
+:102FA000007082A0020040123078BCD028119B78BB
+:102FB0008000AA7B040849283987A2775027AC777C
+:102FC000B0A70500A87006A60811A476AE763A2C24
+:102FD00038873A2D38873A2838873A2338873A2570
+:102FE0003078BCD050019120008091203D30D070CD
+:102FF00084A03D30912000809020D5AA00002001BF
+:1030000021840022041951270500DCD10409F1377D
+:10301000292020009CD6201128858CD608112885CF
+:103020004088146F0C6108818CA1FF00C87060A1FA
+:10303000642CFF8C8801146006A7D01DB860018045
+:10304000BA60881D602A086085A000010A6000221D
+:103050002184041951270500602A0E61BE69002CE5
+:10306000C66840880860D5C00A60A07786A70100BE
+:103070000419D927D070B4D00419D927007082A0C0
+:103080000200041AD9273078BCD00419D9279B78BC
+:103090008000AA7BAA7DAA790120020006001860A0
+:1030A00000801A600800060060290461602A0C088C
+:1030B000093D901584A11800800184A11000180119
+:1030C0000C089A39481584A108003801A06984A128
+:1030D000000618110C08B838F800A06984A1001E79
+:1030E000280584A100087801C6006029006085A039
+:1030F0000020026004618DA110000661CE000C0862
+:103100009A395011A06984A1000218010C08FD38F9
+:10311000180084A10004F019A06984A100103001F6
+:1031200014698CA100FF0F810C08C5232E008CA60A
+:10313000E00084A66000280186A0600010118DA127
+:1031400000408DA10401B6699B7860000028AA7830
+:103150001868FDC01A68BCD66801FCC08370000006
+:103160008AA00D0028038AA00C00827101200C00A7
+:103170000C808671AA781835403328340080AC80E2
+:1031800080AF2B00A0209B78000080AD0B00982022
+:10319000A653A8239828A02586A220000815D07041
+:1031A000B5C0D270002CB670002DBA701468FCC087
+:1031B0000780827886A2020004092129A07000807D
+:1031C000A270B07498A40500A87006A30811A47397
+:1031D000B27386A210000409C625DE00CE000500E9
+:1031E000007005A0E01986A20200041938290C0815
+:1031F0005B3CA8191468FCC007808278912000808D
+:103200001B786800B4685A789468D678DE78986835
+:10321000D278DA789120018008788DC00A7826016A
+:10322000D600C600D07084A0002E9020CE00DE0014
+:103230002E0100295670BC683E7003700200002DFC
+:103240004A7080AD090042703078BCD040019120B6
+:103250003D30D07084A03D30912000809020A0703F
+:1032600005A0081105002184E80D4C72BC7000A275
+:1032700015A00408512786A2100060150C085B3CBD
+:103280000419CC281468FCC0078082781B78680079
+:10329000B4685A789468D678DE789868D278DA7804
+:1032A00008788DC00A78A0700080A270B07490A4D5
+:1032B0000500A87006A20811A472B2720029567007
+:1032C000BC683E7003700200002D4A7080AD09009A
+:1032D00042700500B46B9DA300205A7B1468FCC0AB
+:1032E00007808278946BD67BDE7B986ED27EDA7E06
+:1032F0001B78680000295670027208788DC00A7821
+:10330000002305A67001D07084A0002E86A00026A0
+:1033100018110920000010000920010084A20F00EC
+:10332000330080AD09004270002D4A7005009C29D1
+:1033300008420842F64108429C299C299C290C0815
+:103340007525087884A0FDFF0A78F60079200047EB
+:10335000AC78FE0084D0C001607186A10100040930
+:10336000612A86A10700700186A1050058117870B6
+:1033700068201B68040017680000206884A0FF0014
+:103380009DC0226863700000A3700000A470AE703E
+:10339000B2700C08AE26560111200400607186A19F
+:1033A0000100580186A1070018111F7005001000C8
+:1033B0001F700100D070C5C0D27001200A470420E0
+:1033C00084A0FF0086A0180030011870167005A0B8
+:1033D0001011A370010066000C084E3FA9201000D8
+:1033E000392000000C088B3AB8A70001041FEF2910
+:1033F0006E00007002002C2A0A2A0A2A022A2C2AAD
+:103400002C2A2C2A002A0C0875255C7005A038058A
+:1034100006AD181100685E708000206884D04811E5
+:10342000146F0C08953B0860D4C00A600C08C737BD
+:103430002000587060200068026084A6005F1E684B
+:103440001868FCD008011A6A176800002B68000091
+:10345000206884A0FF009DC022680C08BF1D1120B9
+:103460000400C874A0A40001B104A0AE1700990420
+:10347000A9200101C87479042084041F382AC0706F
+:10348000602021200200A92000011061FF81980125
+:10349000186016000600112002470C2202A112201B
+:1034A0000E001E0002A138031260281111200447EB
+:1034B0000422A5C012201B600000E0AC1000041F15
+:1034C000422A2184001D5E01637000000370000029
+:1034D0004B70000005004600042405A0A8016820E8
+:1034E000006806001A6A176800002B680000B468BC
+:1034F00084A0005F1E68206884A0FF009DC0226831
+:103500000C08BF1D0E00480C4E00232000000500D3
+:1035100082A2030010030C087525002302008F2AE5
+:103520000C2B1A2B82A2020010010C08752560706A
+:10353000637000007F7000002200D077C5C7D2778B
+:103540000200A62AA62AA82AE02AFB37A62AE02AF1
+:10355000A62A0C08752570770C088B3A7077BCA7E3
+:10356000008F0C08953B186005A02805FCD71811A2
+:103570002120C08D10002120D08E092005001120AF
+:1035800010000C08342BB8015601A9200101FCD70A
+:1035900018112120C08C10002120D08D4600092058
+:1035A0000500112010000C08342B4E001801208457
+:1035B000041FCB2A5E01388784A71F0090190408D6
+:1035C000C9250408C92570770C08953B186005A02B
+:1035D0002005FCD718112120C08D10002120D08E8D
+:1035E00009200500112020000C08342BB0015601E1
+:1035F000A9200101FCD718112120C08C1000212026
+:10360000D08D4600092005001120200081044E00C5
+:1036100018012084041FFE2A5E010408C925002227
+:103620000200112B132B132B0C087525637000005F
+:10363000D070C5C0D2700408C92500220200212B19
+:10364000132B1F2B0C0875250C084E3F007086A00D
+:103650000200041980370C08E137086084A0EFFBF2
+:103660000A600C087237040980370408C92504244D
+:1036700005A090056820042D0600146806A718010F
+:10368000202D0E00A80C0E0022201A6917680000D9
+:103690002B680000B46884A0005F1E68206884A0C6
+:1036A000FF0005A222680C08BF1D212002471C2430
+:1036B0001983222310600180126028112120044701
+:1036C0000424A5C02220086084A0EFF90A600C0839
+:1036D000CA260C08E137050085A00100E00C002394
+:1036E0000200732B712BEE2B0C087525E47805A0D6
+:1036F000B01708328CA1000818010401C62510007B
+:103700000403C625082084A03000101104084D329F
+:10371000EC7884A00300D00D8478FCD0181184A12B
+:103720000700900084A1070086A004001811012062
+:103730000000500084A1070086A00500180184A1A4
+:1037400007001000012001000200D12BDA2BC72B4B
+:10375000AA2B4F3C4F3CAA2BE42B0C08752500707C
+:1037600086A004009011607086A002003011112024
+:103770000200192000000408852A607086A0060057
+:10378000B00D607086A00400900DE4790120030064
+:1037900004083B2F1868FCD010011B681D000C08A2
+:1037A000613A1B786E0005001868FCD010011B6898
+:1037B0001D000C08613A04082D3C1868FCD010016B
+:1037C0001B681D000C08613A1B78FA000500186898
+:1037D000FCD010011B681D000C08613A1B78CB005F
+:1037E000050084A50F00C01100700200C925FB2B45
+:1037F000FD2B803780378037FB2BFB2B0C08752582
+:103800000C08E137086084A0EFFB0A600C087237EF
+:10381000040980370408C925E47805A0041BAC2BF3
+:1038200008328CA1000818010401AC2B100004031D
+:10383000AC2B082084A0300018111B78680005000C
+:10384000EC7884A00300C80D8478FCD0181184A102
+:103850000700900084A1070086A004001811012031
+:103860000000500084A1070086A00500180184A173
+:1038700007001000012001000200492C4D2C442CAF
+:10388000422C4F3C4F3C422C493C0C0875250C08FF
+:10389000673A1B786E0005000C08673A04082D3C57
+:1038A0000C08673A1B78FA0005000C08673A1B7889
+:1038B000CB000500002302005E2C5C2C602C0C0861
+:1038C0007525040805341B681600A3780000E47908
+:1038D00084A1300004090534EC7884A003000409B5
+:1038E000053484A10001980D8478FCD0181184A1BE
+:1038F0000700900084A1070086A004001811012091
+:103900000000500084A1070086A00500180184A1D2
+:1039100007001000012001000200922C4D2CC72B43
+:103920000B3C4F3C4F3C0B3C493C0C08173C050002
+:1039300082A2050010030C0875259878402000230A
+:103940000200A12CCB2ED52E00220200BD2CAA2CC9
+:10395000BD2CA82CAD2E0C0875259B781800A878D6
+:10396000102084A0FF0082A02000040A303A8AA020
+:103970000400041A303A0200303A303A303AE4395E
+:103980009B781800A87984A1800048010408303A87
+:10399000007005A0D81D112004000408B73584A1CB
+:1039A000FF008AA01000041A303A0200E52CE32C34
+:1039B000F72CFB2CA92D303A303AAB2D303A303A67
+:1039C000A92EA92E303A303A303AAB2E0C08752584
+:1039D000E4D6400101200003008000803A781B7883
+:1039E000C70005001868FCD018011B681D00900C6A
+:1039F00004080B3C1B681D0004085B3A206922691F
+:103A000084A6001804194C2D206884D00419542D64
+:103A1000186886A0080010111B680000D4D668053D
+:103A2000BCD6580583700000186884A03F008AA0A7
+:103A30000D0018078AA00C00827101200C000C8078
+:103A400086719B786100AA785601360146011600FE
+:103A500008328CA100061801A1202B021000A12021
+:103A60002B011E009B7800000080AC8080AD0B0015
+:103A70009820A6534E013E015E01386005A050110A
+:103A80001C6884A00E0004095B3A0C086D3A2B7880
+:103A90000830100001803A601B7871000500E4D600
+:103AA00030011B78830005001B788300050084A685
+:103AB0006000D00DDCD6C00DFCD6A001FCC65A7E3D
+:103AC000B66EDC7AD879D078078084A07F0008A110
+:103AD00091A20000986B002102A3B268946B0022AF
+:103AE00003A3AE68F4D61801F4C65A7EB66E007011
+:103AF00086A00300481106000C084E3F0C0808423F
+:103B00000E001B788000050006A00C08E842B06A91
+:103B1000AC69986C946B002205A12001002222A4BC
+:103B200000211BA3AA6CD27CDA7CA66BD67BDE7B41
+:103B3000002305A43011F5C65A7EB66E1B788000AE
+:103B400005001B788000002215A118110C080842FE
+:103B500005000C08354205000C08752504083F2EA9
+:103B6000C6005470602020698CA1FFEC22690060BF
+:103B700084A0DFCF02600C08173906A0402038204F
+:103B80000C08BF390408332EC60054706020482C3E
+:103B9000A87A94A2FF0086A20400D8112069E4D17B
+:103BA000701139200000412000003120000006A0E3
+:103BB00010200C081A390C08BF390408332E8CA1C8
+:103BC000FFEC226904618CA1DDFF06610060ACC0DE
+:103BD000026086A20300D001046184A110004805A0
+:103BE0000C08913B0C089A39FF881805CE009B7889
+:103BF00060000028AA78587E95C65A7ED4D618113F
+:103C00001B786E0005001B78820005002069CCD16E
+:103C100030018CA1FFFD22690060ECC002603920F8
+:103C20000000412000003120000006A010200C08F8
+:103C3000BF3986A201005801046184A10800B001C7
+:103C40000C08913B0C08B838FF888019780020696F
+:103C5000C4D130018CA1FFFE22690060E4C0026083
+:103C60003120000006A010200C081A39CE00587E22
+:103C7000D4D618111B78710005001B78830005004D
+:103C80000408573A08289B78800019208000A878FB
+:103C900094A0FF0086A20100B811002302A186A013
+:103CA00001000409AD2DA87CA4A4FF0080A402009B
+:103CB00000A3182002A1040AC12D0409C12DA824C3
+:103CC000A87A041F5D2E180C84A2F00082A02000A8
+:103CD000B806002282A021009816A87A18831883BB
+:103CE000002102A3A00A86A2230050091C6884A018
+:103CF000F1FF1E68587E84A6F1FFA5C030205A7ED1
+:103D00000860A5C00A60A07805A00409342EA82088
+:103D100098799B786000AA78112080009A79A87819
+:103D200098799A7AAA78987A041F8B2E95C65A7E2B
+:103D3000D4D618111B786E0005001B788200050090
+:103D40001883002102A3040A442E84A280000419CF
+:103D50005B3AA07805A0C80804085B3A0408303A2A
+:103D600054704DA09B781800A87884A0FF008EA006
+:103D7000010010010C087525A87A94A2FF004B7869
+:103D80000800A87884A0FF008AA00500041A303A31
+:103D90000200303A2F38303A4A39593D82A20000A9
+:103DA00010110C0875250C08613A1B78820005007B
+:103DB00082A2030010110C087525FCD4D01160708C
+:103DC00005A010010C087525146F7277BCA7008F31
+:103DD0000C08953B086085A021000A60388784A7FD
+:103DE0001F00B01D0C08643A637002001F700900C8
+:103DF00010000C08703A1B788200050082A20400B3
+:103E000010030C08752500230200052F9B30D730C6
+:103E100086A2030098050072D87CDC7DD07FD0712B
+:103E2000B4D12805BCD11815012001470420C4D005
+:103E3000F011687884A0FF00D01182A20200B812AD
+:103E4000D6003B7800831B785900B8706DA0B46829
+:103E50005A789468D678DE789868D278DA78B4C1DF
+:103E6000D27103703000DE000120000058003B7862
+:103E700000131B7857000120000020000072D87C3E
+:103E8000DC7DD07F4670A068ECD0180108608DC042
+:103E90000A6084A20F0002007C30562F532FA731F6
+:103EA0003232C925512F512F0C0875250860D4C016
+:103EB0000A60E4D62001447086A01400E8110C08C2
+:103EC0004E3F092000001868FCD00801447086A00D
+:103ED00014006801186886A0080004193E3058785C
+:103EE0009CD004093E302068ACD004093E301B68E9
+:103EF000140009200200A80468788CA0FF0088053F
+:103F000086A1080058110860A4C00A600C08723726
+:103F100040050C08E1370C084E3F600086A12800E0
+:103F20000015186005A0780D0180680D0180580DFE
+:103F30001E60480C206884D00409C92584C022680A
+:103F40000C08BF265870C600602000680260CE00D2
+:103F50000460026805A0002D0811026006600408D4
+:103F6000C9251600FF81F015007086A03000D0052D
+:103F7000D071BCD1B815B4D1E8115C7005A0901512
+:103F8000A07086A001007005037000004600560076
+:103F900076006600C600D6000C08F125DE00CE00D3
+:103FA0006E007E005E004E00D071B4D1D811037057
+:103FB0004000C0000C085B3CA8111B786800D600CC
+:103FC000B8706DA0B4685A789468D678DE7898682E
+:103FD000D278DA78B4C1D2710370300008788DC01D
+:103FE0000A78DE000C08FF301E00FF8104093E3015
+:103FF00084A600DF1E682B680000146F86A10200F3
+:1040000004193F30186886A0140030110820E4D647
+:10401000180168788CA0FF000C087A3A0C08CA26B0
+:104020002068DCD07815178794A20F0013821382C2
+:10403000138284B20006180190A2C04B100090A217
+:10404000404C90A200001C22C4D370012068E4D030
+:10405000280184A0FFEF2268ACC31223108204223F
+:1040600085A0380012201182D4D33801A068C4D0B2
+:1040700020110C0867310408C92508608DC00A604A
+:1040800008002A6916691868FCD0100144701A6883
+:104090008CA600DF1E691064FF84680109200247B6
+:1040A000042101800A202184126428112120044760
+:1040B0000424A5C02220186005A0180101801A6000
+:1040C00018110860A4C00A60206884D0301100680C
+:1040D00005A008110260066020005870602000688A
+:1040E00002606120004787680301082D6B200000F3
+:1040F000686005A06A611001022D08006E610072FF
+:1041000086A23000580186A240000419C925037018
+:10411000020048706820C468602005000370020037
+:10412000B8706DA0BC683E70B47065A0C068567071
+:10413000002D4A7080AD09004270050082A2040083
+:1041400010020C08752500220200A630B530C130DF
+:10415000B53086A50013600186A50083901D03700D
+:104160000000186001801A60086084A0EFFB0A60FC
+:10417000007086A0050028010C08613A1B788200B7
+:1041800005001B788300050090780780018084A0DB
+:10419000070080A018009A78A8798CA1FF0086A15A
+:1041A0000300280186A1000010010408303A1B78A2
+:1041B00083000500206895C02268FF8218110C0852
+:1041C000613A3000118210010C0875250C08703A14
+:1041D0001B78820005000C086E3C307884A0C0007B
+:1041E0007011160008328CA100081E00180104018D
+:1041F000FC3010000403FC301A7906A0050085A0ED
+:104200000100050084A6600030112F6800003368AB
+:10421000000004086631DCD69811B468DCD0801147
+:104220009869946A2E69326A447005A030110022A0
+:1042300005A104094E3F4770150004084E3F0500D4
+:10424000ACD6F001F4D630012F68000033680000CE
+:1042500004084E3FB46884A0004035A6F4D6A01DE3
+:10426000447005A0101147701500DCD62811B46801
+:10427000DCD01001A86CA46D2E6C326D04084E3F8A
+:10428000F4D630012F6800003368000004084E3F68
+:10429000B46884A0004835A6F4D6A01D447005A0DB
+:1042A000101147701500082410250027078084A0EE
+:1042B0007F0008A191A200002E69326A002105A2A8
+:1042C000101104084E3F007086A00600100104087B
+:1042D0004E3F050046690860CDC0CCD308018DC0B3
+:1042E0000A6018683A681B6806008F6800009368C7
+:1042F0000000306A2C693E6A42692F680300336807
+:10430000000037682000976800009B68200000705C
+:104310000200C925963190318E318E318E318E3129
+:104320008E310C087525206884D018110C08C73709
+:1043300030005870502C602000680260602AA0AEE7
+:104340001700042405A010012020D80C222D6B207A
+:10435000000005000C08CD370C08E1370860CCC020
+:104360000A602B6800009B780E00146F38691A6988
+:10437000446916690920000086AE404710010920F3
+:1043800001000C081F43DCD6C8011C69EDC11E6981
+:10439000286882A00E009002486884A00F0086A0C2
+:1043A0000B0060115C6886A04700401101200147A6
+:1043B0000420ACD0181100270C089E241868FCD0EB
+:1043C00040011B68000068788CA0FF0010011B688A
+:1043D0001E00A0AE1700006822203C6A4069326AC5
+:1043E0002E69C06860200060A4D0800541202100B3
+:1043F0004920050051202000D600F6005601460154
+:10440000792000470C08B21B4E015E01FE00C87007
+:10441000102009200101260004226DA0400114682B
+:1044200006A710010068C80C2068D5C022682E00BD
+:1044300010820981801DDE00637003007B70000024
+:1044400072777F700F00D071C4C1D271186886A0D6
+:1044500002003811176800002B6800001C68ECC0CF
+:104460001E680C08BF1D0408C925D87CDC7DD07FE0
+:104470000C08FF302B6800009B780E00146F0C08AE
+:10448000723C8CA0FF0016691868FCD010014470C3
+:104490001A688CA600DF1E69637000000408C92535
+:1044A000007005A010110408C92506A00C084E3F95
+:1044B0002069ACD110111B6814008CA600DF1E69A6
+:1044C0002B680000206884A0FF00226800700200B2
+:1044D000C9256F326F327232723272326D326D3282
+:1044E0000C087525186804083B2F0860A4C00A60F2
+:1044F0001768000004089537002302007E328032DE
+:10450000CE320C087525FCD604195B2D00700DA069
+:104510000200C92590329032BA329032CB328E32BC
+:104520008E320C08752584A66000380586A06000D0
+:104530001015ACC6F4C6EDC65A7EB66E1C68ACC08B
+:104540001E6886A1020048010C084E3FAC69B068A5
+:1045500015A118010C08354210000C0808421B7800
+:104560008300D071B4D10419C625A07086A00100C3
+:1045700004190D260500ECD6F0091868FCD070016E
+:10458000F4D630111B6815001B7883000408C6257B
+:104590001B6807002F680000336800000C08173CF8
+:1045A00005000C08752500230200D732F93251337B
+:1045B0000C08752500700200E132E332EA32E13284
+:1045C000E132E132E132E1320C087525AC69B068C4
+:1045D00015A118010C08354210000C0808421C688F
+:1045E000B4C01E68D070B4D00419C625A07086A0CF
+:1045F000010004190D260500FCD604194133007092
+:104600000DA00200C9250F33093339330F333E3370
+:10461000073307330C0875259468D678DE789868D8
+:10462000D278DA7884A66000380586A0600010157C
+:10463000B4A6BFBFEDC65A7EB66E86A10200480181
+:104640000C084E3FAC69B06815A118010C08354242
+:1046500010000C0808421B7883001C68B4C01E6858
+:10466000D071B4D10419C625A07086A00100041928
+:104670000D260500ECD6F0091868FCD010011B6867
+:1046800007001B78FB000500FCC65A7EDC7AD8794F
+:10469000986B002102A3B268946B002203A3AE685A
+:1046A000D2791B7883000500DCD630012B780930E5
+:1046B0001B7883000408C6258478ACC08678E4782B
+:1046C00084A00800501184A400020801F5C6DDC6CC
+:1046D0005A7E1B7883000408C625206895C022688E
+:1046E0000C08023CDDC60C08613A1B788200040805
+:1046F000C625002302007B337D337F330C087525EC
+:1047000004085B3A987DD4D6A815E479ACD1300181
+:10471000EC7884A0030010012B7809309B786000AE
+:10472000AB78000084A6FBFF5A789A7DE479ACD17F
+:104730002001EC7884A0030020110120140004085B
+:104740003B2F8478FCD0181184A10700900084A12D
+:10475000070086A00400181101200000500084A169
+:10476000070086A00500180184A1070010000120A1
+:104770000100C204907A94A207009B786000A87997
+:10478000FF8168059B788000A87B84A30100D0117D
+:10479000A87BA87B86A3040018110920DFFF58001E
+:1047A00086A3010018110920F7FF280086A3030043
+:1047B00048110920EFFFC60054706020046004A176
+:1047C0000660CE009B786000AB78000084A6FBFFFB
+:1047D0005A782B78093020698CA1FFEC22699A7DE8
+:1047E00004080B3CD12BDA2BF933FF33F733F733C3
+:1047F0000B3C0B3C0C08752520698CA1FFFC226941
+:104800000408113C20698CA1FFFC226904080B3CC0
+:10481000E47984A130002001EC7884A003007015B5
+:10482000007086A004009011607086A00200301114
+:1048300011200200192000000408852A607086A05B
+:104840000600B00D607086A00400900D007086A078
+:1048500000000409C625206984A120042801D4C1D0
+:104860002269186804083B2F18688EA002002001F6
+:10487000FDC01A680120140004083B2F8478FCD086
+:10488000181184A10700900084A1070086A00400ED
+:10489000181101200000500084A1070086A0050027
+:1048A000180184A1070010000120010002000B3C48
+:1048B0000B3C5C340B3C4F3C4F3C0B3C0B3CBCD6A4
+:1048C00070058071FF81580582A10D001813837057
+:1048D0000000280082A10C00827009200C009B7847
+:1048E0006100AA795601360146018470148110A234
+:1048F000867280A00B0000AD982084B200061801DB
+:10490000A1202B021000A1202B019B780000088120
+:10491000AC81A6534E013E015E010408113CD4D681
+:104920000419CF34206884D00409113C8CA660009F
+:1049300084A66000200186A060000811F5C194C122
+:104940005A79B6699B786000AB7800009B7861006B
+:104950001868FDC01A68AA7808800C810409F63727
+:104960008CA1F8000419F6375601360146011600ED
+:10497000A1202B0108328CA100061001A1202B02DE
+:104980001E009B7800000080AC8080AD0B0098205A
+:10499000A6534E013E015E011468FCC00780827878
+:1049A0000408113C1868FCD010011B6808000C08B2
+:1049B000613A1B78ED00050000230200E0349D35CC
+:1049C000DE340C087525D87CDC7DD07FFF8228156D
+:1049D000007286A203000409092FD071BCD1F8111E
+:1049E000B4D1E801012001470420C4D0C011D60091
+:1049F0003B7800881B785900B8706DA0B468A5C0DA
+:104A00005A789468D678DE789868D278DA78B4C123
+:104A1000D27103703000DE003000007220003B785D
+:104A200000181B78570084A20F0002008835453516
+:104A30001D35382F1B3588351B351B350C08752562
+:104A40001C68ECD0180108608DC00A60206985C11F
+:104A500022690068066005A0081102600860D4C0E1
+:104A60000A601C6884A00E002011C87188A1000192
+:104A700028003070BA683C71C87008A1042102682F
+:104A80000A2D5A71DCD62011FCC6B66E0408883592
+:104A9000B66E84A66000201184A6FF7FB668D80495
+:104AA000DCD6501184A6FF7FB6689468A668986823
+:104AB000AA680C084E3F7804ACD6400106A00C084A
+:104AC0004E3F08241025AA69A66A6800082410250C
+:104AD0000027078084A07F0008A191A20000AA6996
+:104AE000A66A0C084E3FFCD6B00184A6FF7FB668CC
+:104AF00010250824ACD638110027078084A07F0039
+:104B000008A191A20000986B002102A3B268946BE7
+:104B1000002203A3AE68007086A030000419C925E6
+:104B200003700200B8706DA0BC683E70B47065A0E0
+:104B3000C0685670002D4A7080AD090042700500B3
+:104B400086A50088481103700000186001801A6073
+:104B5000086084A0EFFB0A6004085B3A4370000021
+:104B600082A2060010030C08752500230200B73549
+:104B7000C835D23500220200BF355B3AC135BF359A
+:104B8000033651360C087525807A94A2000F0C0864
+:104B9000A5360408303AC10002005B3AD035D03562
+:104BA0000336D0355B3A0C08752571000200DC3500
+:104BB000DA35DA35DC35DA35DC350C0875250C08E4
+:104BC000703A1B7882000500007086A00200501128
+:104BD0000C08E13710000C084E3F086084A0EFFB82
+:104BE0000A602000007086A00300A80D0370050075
+:104BF0000120E08E8EAE404710010120128F682008
+:104C00004A7080AD0900427000220500007086A045
+:104C100002005811D070B5C0D270002CB670002DB3
+:104C2000BA7038000C084E3F2000007086A00300C8
+:104C3000C80D03700100807A94A2000F9B781800C1
+:104C4000A87C84A41F0015A26920C08D84B2000630
+:104C50001811FDC26920D08E042D082D5A716DA047
+:104C60002801146806A220010068B80C0C08A536BB
+:104C7000B46E5A7E206984A1000C0409CB366070A2
+:104C800086A006002811707006A2101162707A705A
+:104C90001B680500ADC11B680500ADC1D4C1226908
+:104CA0000C08673A0408CB36007286A2020058113D
+:104CB000D070B5C0D270002CB670002DBA70300024
+:104CC0000C084E3F180086A20300D00D03700100AF
+:104CD000807A94A2000F9B781800A87C84A41F00FF
+:104CE00015A286AE40470801FDC2A879A8798CA11B
+:104CF000FF001821C87068A1042D082D5A716DA0FD
+:104D00002801146806A218010068B80C0904B46EE2
+:104D1000206984A1000C0409CB36DCD078016070D6
+:104D200086A004004011707006A22811747006A3BA
+:104D3000101162707A700C086D3A80041B680500CF
+:104D4000ADC1D4C122690C08673A7B700000300401
+:104D50000370050084B2000618010120E08E1000E7
+:104D60000120128F68204A705601A92032000320CA
+:104D700000000080041FB4365E0184B200061001FA
+:104D8000FCC20800FDC2166A80AD09004270B76817
+:104D9000000723680008276803000500ECC6ACA6DE
+:104DA000600004091237986B946CAC69B06805A177
+:104DB000E011D27BDA7BD67CDE7C86A56000C8055C
+:104DC000F4D60811EDC6B4A6FFB75A7E09208300B9
+:104DD0009CD62801092082001920000020231A797E
+:104DE000ECD688050C0808427004B0681AA30021AC
+:104DF00023A4002405A3F801D27BDA7BD67CDE7CD9
+:104E0000B068F4D60811EDC6F4C65A7E11208300AE
+:104E10009CD62801112082001920000020231A7A34
+:104E2000ECD688010C0835427000192000002023C0
+:104E30001000B4A6FFB75A7E092083009CD610014B
+:104E4000092082001A79C0685670002D4A70C46823
+:104E50006020D071012001470420C4D0C815D4704F
+:104E60002DA0B801BCD14805807A94A2000FD8705B
+:104E700006A21801E07804A55815D670BCC1D271FD
+:104E80003804312001002C85180233861082D80C9A
+:104E90000500E07D94A500FF3001112008002F855A
+:104EA000810C37860800690C1782807884A0000F77
+:104EB00006A27001DA72D6765800807A94A2000FAA
+:104EC000D87036A2C00DE07834A5A80DBDC1D2714E
+:104ED000B4D10419C625002305A40409C625A07071
+:104EE00086A0010004190D260500206005A05001D0
+:104EF00001802260086085A008000A600F70000130
+:104F00002C702660050006A00C084E3F007086A09D
+:104F100002002001607086A0050050112B6800007F
+:104F2000176800001B680100236840001F6800012B
+:104F3000007084A00F000200C925A637A337C3372D
+:104F4000AF37C925A137A1370C08752549041104CD
+:104F50002800310458706020006802600C08BF1DF2
+:104F60000408C9256070637000007F7000000200B3
+:104F7000BF37BF37BD37BD37BD37BF37BD37BF3789
+:104F800004089A2A637000000408C9251B68000001
+:104F90000408A731006805A008110260066005003A
+:104FA0001064FF84680109200247042101800A205F
+:104FB000218412642811212004470424A5C0222042
+:104FC0000860A4C00A600500186005A010010180F7
+:104FD0001A6005000C086E3C1B68180090040C0851
+:104FE0006E3C1B68190068040C086E3C1B681A00B4
+:104FF00040040C086E3C1B680300180470770C0812
+:10500000953B74718CA1FF00103294A20006180128
+:10501000E8A1C08C1000E8A1D08D042D082D6820D7
+:1050200005A018117A700408C9251468707206A2C8
+:1050300010010068980C00680A201B6805007B704E
+:1050400000000C08CD37206884D010110C08C73739
+:105050000C08E1371F680000236820000C08BF1D02
+:105060000408C92582A203000419353AA87DACA51D
+:10507000FF00A87EB4A6FF002069BDC12269C4D18B
+:10508000B005C4C12269B4A6FF00300582A618008D
+:10509000180210013120180086A610000811308671
+:1050A0002B852B85412000000C08EE3A18010C08D6
+:1050B0001A39A0000C08BA3A0C0817392069C5C182
+:1050C0002269587E95C65A7ED4D618111B786E0078
+:1050D00005001B78820005000C081739587ED4D6CD
+:1050E00018111B78710005001B7883000500C600AD
+:1050F000547060200061E4D198050862178294A280
+:10510000FF0082A2180018021001112018000026CA
+:1051100002A20812302286A610000811308608620A
+:1051200094A2FF00EC78E4D0300182A20A00401281
+:1051300011200A00280082A20C00101211200C007D
+:10514000002202A5081228220C08BE3A2B852B85C6
+:10515000412000000C08EE3A18010C081A39200012
+:105160000C08BA3A0C081739587895C05A78CE000E
+:105170001B7882000500C60060290060E4D0881119
+:10518000B4D05011106084A00F00301104618CA1C4
+:10519000F5FF0661CE000500112032001920000045
+:1051A000F000A068CCD0C01D086294A2FF00EC788B
+:1051B000E4D0300182A20B00181211200A0028004E
+:1051C00082A20C00101211200C0008631F839CA304
+:1051D000FF0082A318001802100119201800AB78F4
+:1051E0000100AB780300AB780100AA7AAA7BC0A8C3
+:1051F00005002068C5C022680C087A3ACE00050078
+:10520000C600602904618CA1F5FF066111203200FF
+:10521000192000000000AB780100AB780300AB78E8
+:105220000100AA7AAA7BC0A805002068C5C0226830
+:10523000CE00050006A030201020C6005471602169
+:105240001820082084A0E0FF35A6867E18609A7892
+:10525000AE7E1266A47884A070778CA10F0005A1A1
+:10526000292005472C25CCD54001A4D3100185A0C9
+:105270000008FCD3100185A08080A67816608A788B
+:10528000B4A61F0037860482048005A60E60046061
+:1052900084A0D5FF0660CE00050082A2020004199A
+:1052A0003F3AA87A2069BDC12269CCD16805CCC13A
+:1052B000226994A2FF0082A20200041A303A0C086C
+:1052C000C1390C08173980A901000C200C08913B4A
+:1052D0000C08B838FF8878019B7860000028AA780D
+:1052E000587E95C65A7ED4D618111B786E000500DC
+:1052F0001B7882000500587ED4D618111B787100E7
+:1053000005001B788300050082A20200181284A207
+:1053100001004001547188A100000C21ECD1101152
+:10532000112000000C08AC3A79040C0817395878A1
+:1053300095C05A781B7882000500C60026006029B7
+:10534000006011200100ECD05811BCD0381114605D
+:10535000B4D02011A4C1066106A08800112000006D
+:10536000AB780100AB780200AB780300AA7AC0A842
+:1053700004000C087A3A206885A0000222682E00FA
+:10538000CE000500078815A7C6000920000054704C
+:105390006020FF82100109204000186080A00200F8
+:1053A0009A78A47884A09FFF05A1ECC0B4D008111E
+:1053B000EDC00061F4D1100185A02000A678166030
+:1053C0008A78046084A0EFFF0660CE000500060026
+:1053D000007086A0030010010E0010000E0098045B
+:1053E000ACD68805887884A040006805B87B078320
+:1053F00084A07F001815078284A0FF000409573A93
+:105400009AA00400041A573AF4D6D011D879DC7A5D
+:1054100008A191A20000D279DA79D67ADE7A0C0856
+:10542000E8421B78800084B20006180101200000C9
+:105430001000012001000C089A4105000C08752598
+:105440001B78800005001B788300050039200000D0
+:10545000412000003120000006A010200C081A395D
+:105460000C08BF39587E0C08733A1B78820005007F
+:10547000D10C2068C4C02268C600547060200C089B
+:105480004439B000810C2068CCC02268C60054703A
+:1054900060200C08DE396000310C206884A0FFEC2D
+:1054A0002268C60054706020046084A0C5FF0660B6
+:1054B000CE00050049001B78820005002768020025
+:1054C00049001B78820005000120050088000120AA
+:1054D0000C0070002068D5C0226801200600400042
+:1054E00001200D0028000120090010000120070004
+:1054F0009B787E00AA789DC65A7ED070B4D0680191
+:10550000B4C0D270C600B47065A0086084A0EFFB80
+:105510000A60186001801A60CE00050076003F879F
+:10552000BCA70F003B873B870387E0A0C04B8EAE34
+:1055300040471001E0A0404CB8A720009A7FA47912
+:1055400084A1E07FAE781260A47984A13F77A67829
+:105550001660046085A0380006607E0005009B7818
+:105560008000AB780100AB780200AB780300AA7A28
+:105570009B786000AB7804000008312000002920EF
+:1055800032009B788000AB780100AB780300AB78E9
+:105590000100AA7DAA7E9B786000AB780500040814
+:1055A0007A3A5601078084A0FF000380038080A020
+:1055B00020009A78A4798CA1E0FF21207A3B192061
+:1055C0001100A9200E0011203200042484A0E0FF65
+:1055D00006A128012084002310A2041FE23A5E01E4
+:1055E000050056010408303B2120883BA920090012
+:1055F0001120290082A5280050052084A99511209A
+:10560000330082A5330018062084A99519200A00CA
+:1056100011206500002202A5D0022084002310A2E0
+:10562000041F073B5E01880021207A3B19201100EE
+:10563000A9200E0011203300002202A54002208480
+:10564000002310A2041F193B5E0106A00500118271
+:105650005E0182A564002012087885A070000A7897
+:10566000042405A0050086A80200E8012120663B6D
+:10567000A9200D001120280082A52800480D2084B3
+:105680001920190011203300002202A5000E2084E9
+:10569000002310A2041F413B5E011120840182A55A
+:1056A0008501B00A90082120753BA9200300112034
+:1056B000240086A52400600920841120280086A5E6
+:1056C0002800300920841920190011203300040813
+:1056D000193B21100222033404460558066A077C50
+:1056E000104612461258125A146A146C146E177E21
+:1056F000219002B004E210E210E2091202300232FC
+:105700000342034404540456056605680678067A85
+:10571000070C070C070EE1100A330558055A066AF4
+:10572000066C077C077E000E9B78800046A0050073
+:1057300084A7000F0B8084A71F00038003800380D1
+:10574000038005A1FCD71801E0A0C06C1000E0A008
+:10575000C04C0500E600F60084D038017920000135
+:105760000920804771208047300009204047792078
+:1057700000027120404791200080042184A00F0086
+:105780000200C83BC83BC83BC83BC83BC83BC63B04
+:10579000C63B0C087525B469F5C18CA19FFFB6699D
+:1057A00005A08005587884A09FFF85A000605A78E6
+:1057B000287886A0141830154B780400487884A007
+:1057C0000400E01D4B780800487884A00800E01D24
+:1057D0003078BCD0B81184B2000818010401FF3B36
+:1057E00010000403FF3BE47984A130005801EC78F9
+:1057F00084A0030038011C68ACD01011D90010003F
+:105800001B78FB00FE00EE0005000120014704208C
+:10581000ACD0181114680C089E2405001B78830076
+:1058200005001B78820005001B78710005001B78BD
+:105830006E000500092019470C2186A100005001C7
+:1058400086A1010050011F700B00637001001B78DE
+:10585000540005001B78F30005001F700A000500C6
+:10586000092019470C2186A10000680186A10100CA
+:1058700038011F700B00637001001B785400050095
+:105880001F700A0005001B78F20005001B78FB0062
+:1058900005001B78FA0005001B78CC0005001B787A
+:1058A000CB0005001868FCD010011B681D001F709C
+:1058B0000B00637001001B7854000500307884A051
+:1058C000C000701108788CC00A7800E000E000E0A9
+:1058D00000E0EC7884A02100180108788DC00A78D7
+:1058E000050008788DC00A780500307884A0400053
+:1058F000E01D84B2000818010411803C100004135C
+:10590000803CAC780500087884A0FDFF0A7800E0B0
+:1059100000E000E000E0EC7884A02100400184B2C7
+:105920000008180104118F3C10000413923CAC785D
+:105930000600087885A002000A780E00050084A7FA
+:10594000010004194D3284A770004001C600602D8B
+:10595000682F0C089024782D682CCE0084A70800AE
+:1059600048014B780800EC7884A0030004094D320C
+:1059700004080B3C84A70400C801B87884A0008008
+:10598000A8014B780800EC7884A0030004094D328C
+:10599000E47884A0070086A001004011C07885A6A5
+:1059A000004830205A7E1B78FB00050084A7800049
+:1059B00040018478FCD028010C08573A1B6822006B
+:1059C00005001B680300587884A0005F1E682F68DC
+:1059D0000000336800004B780800EC7884A00300D6
+:1059E0000409AC2B84B2000810010401C62504038D
+:1059F000C625146B078384A00F00038003800380F7
+:105A0000FCD3180180A0404C100080A0C04B602047
+:105A100048205670602A0500C60060290060ACD09E
+:105A20000409573DA068ACD1201184A0000E0409E0
+:105A3000553D086117818CA1FF001C632F83DCD0CA
+:105A400010019DA30100CCD0C81184A5FF0038012E
+:105A5000EC78E4D010011382B8002920000082A164
+:105A60000C009012EC78E4D0181109200C006000B2
+:105A700082A10B00481209200A00300009203200E0
+:105A80001120000029200000AB780100AB7806004F
+:105A9000AB780400AA79AB780000AA7AAA7BAA7D29
+:105AA000C0A80800206885A0001022680C087A3A77
+:105AB00085A00100CE00050082A206000419493A23
+:105AC000A87DAC7E3786ACA5FF00B4A6FF00AC7FF6
+:105AD0004787BCA7FF00C4A8FF002069BDC1226999
+:105AE000E4D10409CB3D8CA1FFEC226982A702001E
+:105AF000041A233AB4A6FF000409C83D82A6310067
+:105B0000041A233A82A50900040A233A82A8030052
+:105B1000041A233A86A80200D00186A800000419BE
+:105B2000233A01200C00EC79E4D1100101200A0095
+:105B300002A590120C08233AC6006029046085A0D3
+:105B40001A0006600060ACC00260CE00050086A7A7
+:105B500000000409233A348682A618002802200196
+:105B6000312018000408193E86A61000081130865E
+:105B70002B852B850C08EE3A0409233A0C081A39B8
+:105B80000C08BF39587ED4D618111B787100050057
+:105B90001B78830005000C081739900C86A80200BA
+:105BA00008113486547188A100000C21ACD104097D
+:105BB000233AECD120113920000041200000E4D12B
+:105BC0002011312000004120000082A70200C812ED
+:105BD0001C6284A2FF0006A710013920000005A660
+:105BE000900108611F819CA3FF00680102A30812B5
+:105BF0003023078805A786A00102600186A800005F
+:105C0000680139200000412000003120000006A07A
+:105C10001020700084A200FF0811402084A1FF0022
+:105C200002A5080128212B852B850C08EE3A580D7A
+:105C30000C081A390C08BF399B788000AB7801003A
+:105C4000AB780600AB780400AA7DAB780000AA7E92
+:105C5000AA7F0028AA789B786000AB7808002068AB
+:105C6000E5C022680C087A3A587895C05A781B78B3
+:105C7000820005002000200000002000000020001D
+:105C80000000200000002000000020000000200094
+:105C90000000200000002000000020000000200084
+:105CA0000000200000002000000020000000200074
+:105CB0000000200000002000620009001400140011
+:105CC00055984D9814001199FF98140014009000F5
+:105CD000E70000010204082080F8180017000F8474
+:105CE000C1D8140016000AA214000B300CA2140034
+:105CF00000251300002510001000100010001000F7
+:105D00001000100010001000100010001000100013
+:105D1000100000A206383988C420640850A8083052
+:105D2000C128189D01A20C30472861816A84008037
+:105D3000A48456183A8808A8E228CE9CF3A86408E0
+:105D40003EA80C3001A80830E128CE9CA22863713F
+:105D500031A8212018A805A20C87DED8A064E06D28
+:105D6000C06FA467806C120205A23D882B881418AE
+:105D70003B882770F28537A732A503F076857786B2
+:105D800013A83E8811A88228627114A80A2804A2C8
+:105D9000C064E06DA067C06F14183B8823707685DF
+:105DA000778602A861783E886A20C128189D422023
+:105DB0000121CAA802290EA20BA807A2140003A25F
+:105DC0000080A48572189A873C88E21F01F608A219
+:105DD0006E852171140004070830CE9C140002A2C5
+:105DE0000080A4850930A884E21944F86E853F88B4
+:105DF000E608F5A861F8EBA801F8140081F8160090
+:105E0000B285F0803295A2FAE21D1400328521F2AB
+:105E10001400E21DA884E0D6E61F140008300080BC
+:105E200049281110FCA80830008000A08120022819
+:105E30001110FCA889A80830A1203C281110FCA84A
+:105E400009A217000C300080A485E21DC1DA1400FD
+:105E5000100201A81400E0263A87A3FAF219E026FE
+:105E6000F21814000BA214000DA206381002229D95
+:105E7000040706A265687E812A84C11D2388160056
+:105E800042600880FAA860812A84808121F008306D
+:105E9000A884D7114270DD201100D5202288160079
+:105EA00000002601D07084A0004C04809020047271
+:105EB00008709CC005A2A0110C72FF822801FF8A05
+:105EC0007811007284D260110478CCD010010C08D3
+:105ED0005B4307700800037008002E0100200500D6
+:105EE000007084A0030002709CC684D088050871ED
+:105EF00000E0087006A1D81D84A103000409CA3F70
+:105F000084A1E0010419CA3FF4D1881D84A10030A6
+:105F100086A00010600D112080010C7111823001EB
+:105F20000870F4D0201D0C7006A1C00D077012007F
+:105F3000087100E0087006A1D81D84A1030068055F
+:105F400094D1B00DF4D148050770020080082804F0
+:105F50000871FCD130010C08D640FF8A0409543F77
+:105F6000B80C0C708CA0FF07E801047084D0780195
+:105F7000147005A048111070107306A3E01D0023D3
+:105F800005A0280102A1201E077010003000FF8A22
+:105F900048010C089A42E81DD8090C085C402E0103
+:105FA00000200500047208719CC10381181207705B
+:105FB0000200C00C05A2881D0770080003700800CD
+:105FC0000600012001470420CCD010010C085B43DF
+:105FD0000E002E01002005002864FF840805702CA7
+:105FE0000470BCA00F00B8A71D403C27FB874811D8
+:105FF00010020C0875259C6075A09001880C392052
+:106000001240042768AE086830A60C6829A52184D0
+:1060100038013887042705A0A81D9C7075A0001DB5
+:1060200005000000050009000D0011001500190011
+:106030001D000000030009000F0015001B000000F8
+:10604000000012400F4000000000008000001240DD
+:1060500000001A40174000000000000000001A4035
+:1060600000001540154000000000008000001540B1
+:1060700000001B401B4000000000000000001B400F
+:10608000792000477120100007700A000770020095
+:1060900003700100092002007120500007700A00FF
+:1060A00007700200037000000120FF010420FCD0F3
+:1060B00028110981180171202000800C050004704E
+:1060C0000480041AB2400871087006A1E01D84A182
+:1060D000E00120010C080E410408D24007701200B4
+:1060E000192000000871087006A1E01D84A1E001DC
+:1060F00020010C080E410408D2409CA10C3086A35C
+:106100000420900186A30800C001047084D04811C7
+:106110000871087006A1E01D84A1030010010408A5
+:106120000E4186A30C20F0190072048230020C7319
+:1061300084A3FF0710010C0875250871087006A1DB
+:10614000E01D84A1E00118010C080E4170040770E5
+:106150001200007084D048111073147005A3280138
+:106160000C7184A1FF0704195C400871087006A136
+:10617000E01D84A1E00118010C080E41B000077079
+:1061800012000770080004709CD0E81D08710870A8
+:1061900006A1E01D84A1E00118010C080E412800B1
+:1061A0000770120008710381880E03700800050053
+:1061B000087184A1E001A815087184A1E001881587
+:1061C00084A107000200EA40F840E840F840E840B7
+:1061D0004841E84046410C087525047084A0100031
+:1061E0008DC00670FF8A18114920000005000C08B8
+:1061F0009A42E81D0500047084A010008DC006704E
+:10620000047084D040110871087006A1E01D84A1BB
+:10621000030008013000FF8A18010C089A42E81DAB
+:106220000500077012000871041D114191200060E3
+:10623000041D1541912000600770120007700800CE
+:1062400004709CD0E81D077012000871FCD1D81DA5
+:1062500003700000007005A03011047005A0181133
+:106260000C7005A00801400C4920000084B2000217
+:106270001801012000001000012001000C08A73BBC
+:106280001B6802005120000005000C0875250C0851
+:1062900075250C088741107214710C709CA0FF07C3
+:1062A000002800A311A289A10000A1040427582CF2
+:1062B00060AC0863002222A30C6300211BA300240E
+:1062C00005A340013812128410820A8389A10000BC
+:1062D000602B580C602B078A060004609CD01801C4
+:1062E000BAA717401000BAA70F400E003DA7002C18
+:1062F00086688A6F926C8E6B0871087006A1E01D2B
+:1063000084A1E00110010C080E41077012000C0876
+:106310005C400500508A3987042704A0681100609A
+:1063200064A00811602D046084A00F0080A02D409F
+:106330003C20FB870C09752505002601D600D0708E
+:1063400084A0004C04809020DE008468602088686F
+:106350008C6B906C5780D4AAFF0084A0FF000600CD
+:10636000046884A008000E001801B8A017401000AF
+:10637000B8A00F4084B200021001207E0800247EE5
+:10638000B5A60C001C68B4D0080185C6002405A37E
+:106390005005582C0427046160AC006000A448201C
+:1063A000CCA9040018010C08A34300041A7004606F
+:1063B00001A31E709CD14001106081A000002270DA
+:1063C000146081A0000026700862002402A21270EE
+:1063D0000C62002303A21670027607700100602B86
+:1063E0000C08C54210000C089A42E81D2E0100203E
+:1063F00005002601D600D07084A0004C04809020B7
+:10640000DE0007700400047094D0E81D03700800DB
+:106410002E01002005002601D600D07084A0004C7B
+:1064200004809020DE00207E84B200020811247EC9
+:10643000B5A60C001C68ACD0181185C6037000000E
+:1064400028685020602D0460BCA00F00B8A71D4034
+:106450003C27FB87381110020C0875259C6865A045
+:106460002001880C0C089A42E81D2E01002005002E
+:10647000260106001600D600D07084A0004C0480CF
+:106480009020207E84B200020811247EDE003E00AF
+:106490004E00B5A60C001C68B4D0280185C6037058
+:1064A00000000770040049203542286855A0D60036
+:1064B00004099642702D602E0470BCA00F00B8A78E
+:1064C0001D403C27FB87401110020C0875259C706D
+:1064D00075A060207005800C042768AE086822A4AF
+:1064E0000C681BA36802518A10110C0875253887A7
+:1064F000042705A0901D9C7075A06020D001E008C5
+:10650000228420841A8399A300000869002422A110
+:106510000C6900231BA110120C08752584B200021F
+:10652000180171205000100071202000DE000408C6
+:10653000C341DE002E01002005000870060084A083
+:10654000E0010E00100106A0050084A0030086A053
+:10655000030008110500042778AC0078082F94D0B8
+:106560000419A6431A7004781E70087812700C780B
+:10657000167004609CD02001107822701478267068
+:106580000276047084A0100085C006707920004750
+:10659000518AE8013887042705A068119C6005A08E
+:1065A000B8016020046084A00F0080A01D403C2042
+:1065B000FB870C0975250870060084A0E0010E0019
+:1065C000100106A0280084A0030086A00300050097
+:1065D00051200000050026010600D600D07084A0DE
+:1065E000004C04809020DE008E00087184A103001E
+:1065F0002811286805A0780104086D3F0871FCD1B6
+:1066000018010C08D640880C077010000871FCD1E6
+:10661000E80D0C08D640087086A00800301D0070F8
+:1066200005A0181D0370000049200000060001208D
+:1066300001470420CCD010010C085B430E002E0152
+:10664000002005002601460136015601C600D6008D
+:10665000D07084A0004C04809020DE0049201F43AD
+:1066600080AD1100A02084B20002180199203200F0
+:106670001000992031000C7084A0FF072A68077071
+:106680000800077002000370010018010080AC8050
+:10669000A5530C7084A0FF0730010770040004703C
+:1066A00084A00400E01DCE0049200000037000001B
+:1066B0005E013E014E012E01002005001468FCD051
+:1066C00004099E43007084D0E005247EB5A6040032
+:1066D00007700400047084A00400E01D1871160007
+:1066E0001C71160020711600247116001B7000002A
+:1066F0001F70FF3F2370000027700000137004001C
+:10670000177000000276077001000120FFFF0920CA
+:1067100031000A200A200871087006A1E01DFCD192
+:10672000D00D2E0026722E0022722E001E722E0018
+:106730001A7207700200087086A008001001040891
+:106740000E41077004000370000005004920C3419A
+:106750006800087084A00300100106A0050006A0D0
+:1067600020201820582C602149200000588B0061FF
+:10677000002108A41A71046001A31E700600042BF6
+:1067800084A008005001106081A000002270060063
+:10679000146081A000002670060084A1070011206B
+:1067A00008002AA20862002412A226000C624022DD
+:1067B000002343A82E00FF887011002502A20801C3
+:1067C0005012202241200000042B9CD010010E000A
+:1067D0000E000E005004127517700000027686A994
+:1067E000C3411811077001002800047084A0100034
+:1067F00085C00670002500A11A70042B84A0080033
+:1068000010010E004E001E0089A100001E710C2B0D
+:106810008CA108003001A1A40000227481A0000016
+:106820002670002522A2C3A8000012742028167426
+:10683000027686A9C3411811077001002800047070
+:1068400084A0100085C00670598B602B792000470A
+:106850000C08C54206A00500912000809120006030
+:10686000AC7805A068117479D07006A148111C7825
+:1068700005A030011F780000040E3D4491208040A7
+:1068800069208047FDC7006884A00F009811D06878
+:10689000B4D08001BCD07011F60079200001FCD783
+:1068A000101179200002307884A0C00010110C086B
+:1068B000D522FE00FCD7200169204047FCC7180CF8
+:1068C0003078018032780419C744347832786120F6
+:1068D000C06C69208047FDC7CC6805A028010180F5
+:1068E000CE6810110C083946006884A00F006801BA
+:1068F00086A00100500140680DA03801042105A0C8
+:10690000200101800A200409D645146805A0A801C9
+:10691000018016689011A3680100F600FCD71811D9
+:10692000792000021000792000010C086E3CFE0066
+:10693000606805A010010C08D5227C6805A0400104
+:1069400001807E68281163680000D068C5C0D268E5
+:10695000D068FCD0B001FCC0D268A920000234602D
+:1069600005A0580101803660D068FDC0D2682811AA
+:10697000106005A010010C08D522E0AC1000041F27
+:10698000AC44FCD738016120C04C69204047FCC7AB
+:10699000040869445904387801803A78A0113C7899
+:1069A0003A786120C04C69204047FCC70C6805A0BC
+:1069B00010010C084345FCD730116120C06C6920E0
+:1069C0008047FDC7980C1078CCD06801ACD020115E
+:1069D000A4D04801ADC0127891200180040EEF448C
+:1069E0000C08A1200500912001800500407801805D
+:1069F0004278041942454478427869204047FCC7F0
+:106A000079200002D46805A03801E07D04A520119A
+:106A1000D668D068BCC0D26879200047106805A04D
+:106A200010110120010101801268FCD7180180A01B
+:106A3000D08D100080A0C08C4020042065A0E00113
+:106A4000246005A0B001018026609811006805A0AF
+:106A50003001486806AC18110C08D645680060681B
+:106A600005A018012760010020000C0884450428B7
+:106A7000280C0060402C100CFCD73811692080478E
+:106A8000FDC7792000010408FF440500092000002B
+:106A9000A920000208609CD05805246005A01801B8
+:106AA00001802660180408609CC084D01011ACD00E
+:106AB000C0010A60046005A0D801D600C600160017
+:106AC00068201060018012600C08C737002D682C08
+:106AD00060200C08021C0C08B21D1E00CE00DE0057
+:106AE0003800BDC00A608DA1010010008DA1000119
+:106AF000E0AC1000041F474584A1010030018CA1C7
+:106B0000FEFF0E690C08D52208000E690500002C56
+:106B10007A681467726F176000002B6000001B60BA
+:106B20000600B46084A0005F1E60206084A0FF00A7
+:106B300085A0600022600060422069208047FCD769
+:106B4000101169204047586806AC101100285A6897
+:106B50000C089A1B186805A0100101801A680868C3
+:106B6000A4C00A681068087909810A7901801013A5
+:106B70000C087525126818111079A5C112792F60BB
+:106B8000000033600000682C0C08BF1DFCD71811F2
+:106B900069204047100069208047106984A10001E6
+:106BA0000120060018117669012004000C08CB2290
+:106BB0000500D60048696021FCD718116920000241
+:106BC0001000692000010C0890241B600600586822
+:106BD00084A0005F1E60206084A0FF0085A04800A4
+:106BE00022602F60000033600000086884A0FDFF71
+:106BF0000A683068B4D0B0014B680400A9201400C2
+:106C0000486894D01001041FFD454B680900A92075
+:106C10001400486884D01001041F0646A920FA0019
+:106C2000041F0D461B685400DE0063680700050062
+:106C300079200047E1008900A900092002006920AD
+:106C400080470F6800001368000017680000098182
+:106C5000180169204047A80C05001920A3003A7BC1
+:106C60003E7B050019203300427B467B050019203E
+:106C7000DD32327B367B05004C6A85A20000F001D4
+:106C80005069BC6B00A3C60064210463FF83381104
+:106C90001182480108811AA1B80EBC69A80CCF68FE
+:106CA0000A00CE0005004C69BC6A64220860B5C0C9
+:106CB0000A6010820981C81D4E69CE0005001600C9
+:106CC000041D5D4691200060041D61469120006016
+:106CD000EC70DCD01811D4D09001A0008EAE000171
+:106CE00038011478F5C0C5C01678D4D0801560047A
+:106CF0001478FDC0C5C01678D4D048152804E4D057
+:106D00000409C446041D7F469120006009200C0040
+:106D1000041D8546912000600981D01DE47084A087
+:106D2000FF0186A0FF011011EC70C0088EAE0001BB
+:106D300028011478F4C0FCD0301120001478FCC075
+:106D4000F4D00811C4C0167804788CD00005C600B1
+:106D500061200000186084D0B81186AE0002E60001
+:106D6000712010002001DB700100E4781800DB7056
+:106D70000000E078C670C3700E801B600100912097
+:106D80008040EE00CE001800CE001F680C001E00F0
+:086D9000A070A2700500260CA2
+:00000001FF
+/*****************************************************************************
+ *                  QLOGIC LINUX SOFTWARE
+ *
+ * QLogic ISP12160 device driver for Linux 2.2.x and 2.4.x
+ * Copyright (C) 2002 Qlogic Corporation (www.qlogic.com)
+ *
+ *****************************************************************************/
+
+/************************************************************************
+ *                --- ISP12160A Initiator Firmware ---                 *
+ *                           32 LUN Support                            *
+ ************************************************************************/
+
+/*
+ *     Firmware Version 10.04.42 (15:44 Apr 18, 2003)
+ */
diff --git a/firmware/qlogic/1280.bin.ihex b/firmware/qlogic/1280.bin.ihex
new file mode 100644 (file)
index 0000000..612c263
--- /dev/null
@@ -0,0 +1,2008 @@
+:10000000080F0B0000107800411000002E3E000089
+:100010004320504F525947495448312039392C31E7
+:1000200039313239312C39392C3339313439512085
+:100030004F4C494720434F435052524F54414F4930
+:10004000004E492050533231303446207269776D6A
+:10005000726120655620726569736E6F30202E388C
+:1000600035312020432073756F74656D20726F4E9B
+:10007000202E303050206F72756474634E202E6FC6
+:100080002020303020200024C920FF980120FC04CB
+:10009000042086A08010C000541071200001A070C0
+:1000A000A270C12010008920741378006D10012007
+:1000B000FC04042086A08012C00069107120000298
+:1000C000A070A27071200001A070A270C120100069
+:1000D0008920F81378006D10C120200089201C139E
+:1000E00071201000C3700400C7705349CB702050BA
+:1000F000CF702020D37008000120FE04D670C120EC
+:100100002100192000000920FFFE00210B20A5A5D9
+:10011000ECA1FF7F642D6B200A0ADCADFF3F542B5E
+:100120005B205050142186A2A5A54000A41086A3F0
+:100130000F004000A0106A2C5A2AC120200019206C
+:100140000F00780080106A2C5A2A7800A2106A2CBE
+:100150005A2A30212821A2A1004F248424842484F7
+:1001600024842484248492A1009909200000012081
+:1001700032007810C12018227920004FA02F0824C7
+:1001800011200000A9204000A4420981C000BF1036
+:10019000092000FF003402A14800CF104000CF101A
+:1001A000A820A4420120FC04042086A08010C000E6
+:1001B000E510712000017E0D6920404F7810B04D90
+:1001C0007F0D1078EDC012781B78640078000A115A
+:1001D0000120FC04042086A08012C00005111478C0
+:1001E000EDC0D5C016781B786400712000027E0D2A
+:1001F0006920404F7810B04D6920804F7120000178
+:100200007810B04D1478D4C016787F0D78000A119C
+:100210001478E5C016781B783C00CA7EC27CC67B89
+:100220006778000000788DC0027831203000AF7808
+:1002300001012378020027780200092002006920CA
+:10024000404F1B680300236807002768FA002B68EB
+:1002500008002F682800376800003B6806003368F4
+:1002600008003F680000098140005E11D3680A0061
+:10027000C368C04F7920004F1478E4D0C000441107
+:10028000ECD0C0004811D768297378004A11D768AC
+:100290000D7378004A11D7682D73C768C054CB68B6
+:1002A000C053CF68C094AB684497AF684997B368B0
+:1002B0004497B7684497A76801006920804F780089
+:1002C0001E11D3680A00C368C0511478E4D0C0007E
+:1002D0006A11D768397478006C11D7681974C768C7
+:1002E000C074CB684054CF68D095AB684997AF686D
+:1002F0004E97B3684997B7684997A7680100107887
+:10030000ECD0C000C2111478E4D0C000B4117E0E4D
+:100310006920C05371200002EC70E4D0C000951138
+:1003200019200C0C21200C007810502078009B1113
+:1003300019200A0C21200A0078105020692040540E
+:1003400071200001EC70E4D0C000AB1119200C0C3E
+:1003500021200C00781050207800B11119200A0CCF
+:1003600021200A00781050207F0E7800DB11192020
+:100370000C0C21200C006920C053781050206920FB
+:100380004054781050207800DB116920C0537E0E55
+:1003900071200001EC70E4D0C000D41119200C0CC5
+:1003A00021200C00781050207F0E7800DB111920DE
+:1003B0000A0C21200A00781050207F0E1120020024
+:1003C0006920C05409200200A920000137680000FC
+:1003D0000B684000C87B86A3FFFEC000F2111768BF
+:1003E00000011F6864007800F611176864001F6838
+:1003F0000200E8AD1000F000E3110981C000E11136
+:100400001182400004126920C0747800DF11781056
+:10041000A2267810124778101B1E7810424D9120AA
+:1004200000217920004F1078ECD040001812712084
+:10043000200078001A1271205000912000227920AB
+:10044000004F71202000912000237920004F107868
+:10045000ECD040002C127920000178002E12792077
+:1004600000027120404F912000247920000171206A
+:10047000804F912000207920004F71201000003221
+:1004800085A03D30902071201000C37000009000C6
+:100490004D12C07086A00200C0004D127810C11528
+:1004A000392000001078ECD0C000CF1278108E14E4
+:1004B000AC7805A0C0006B12680061126C7865A072
+:1004C000400061127810DC237810E8206800781270
+:1004D0006C7865A040006B127810DC2368007812FD
+:1004E0000920474F1120874F04210C2205A140000D
+:1004F00078127810511F7120404FA47005A0400061
+:100500009D12507485A4000040009D1279200002C5
+:1005100091200080D4728CA23D3090217810B12BB4
+:100520009120008091203D3068009D127920004F7D
+:100530006C7865A040009D12712010007810DC23BB
+:10054000E000A5127920004F712010007810164BA2
+:100550007120804FA47005A04000BD12507025A0EE
+:100560004000BD127920000191200080D4728CA23D
+:100570003D3090217810B12B9120008091203D30AA
+:100580007920004F712010006800C9126C7865A0B6
+:100590004000C9127810DC23E00053127810164B8B
+:1005A0007800531278108E14AC7805A0C000E712C2
+:1005B0006800DD126C7865A04000DD127810DC2345
+:1005C0007810E8206800F1126C7865A04000E7120E
+:1005D0007810DC236800F1120920474F042105A0A0
+:1005E0004000F1127810511F7120404FA47005A0F7
+:1005F00040000C13507485A4000040000C137920B7
+:10060000000191200080D4728CA23D30902178109E
+:10061000B12B9120008091203D307920004F712036
+:100620001000680016136C7865A04000161378104F
+:10063000DC23E000CF127810164B7800CF123C1369
+:100640003C133E133E134B134B134B134B135613D8
+:100650005613631363134B134B134B134B133C137E
+:100660003C133E133E134B134B134B134B135613B8
+:100670005613631363134B134B134B134B13780035
+:100680003C137E007E107E12912000247810D12928
+:100690007F127F107F00912001807C007E007E1001
+:1006A0007E127810C8137F127F107F009120018086
+:1006B0007C007E007E107E12912000237810D129CC
+:1006C0007F127F107F00912001807C007E007E10D1
+:1006D0007E12912000237810D129912000247810D7
+:1006E000D1297F127F107F00912001807C0094131C
+:1006F000941396139613A313A313A313A313AE1368
+:10070000AE1396139613A313A313A313A313AF133C
+:10071000AF13AF13AF13AF13AF13AF13AF13AF13C9
+:10072000AF13AF13AF13AF13AF13AF13AF13780003
+:1007300094137E007E107E12912000237810D12920
+:100740007F127F107F00912001807C007E007E1050
+:100750007E127810D5137F127F107F0091200180C8
+:100760007C007C007E107E127E0D7E0E7E0F7E0051
+:10077000712000016920404F7920004FEC7084A067
+:10078000001CE2787810B04D7F007F0F7F0E7F0D48
+:100790007F127F107C00003C84A007007900CD13FD
+:1007A000DE13DE13E013E013E513E513EA13EA1397
+:1007B000003C84A003007900DA13DE13DE13F31388
+:1007C000F3137810B229912000227810EC477C00B6
+:1007D000912000217810EC477C00912000217810B6
+:1007E000EC47912000227810EC477C0091200021FA
+:1007F0007810EC477C00181418141A141A142714D3
+:10080000271427142714321432143F143F142714CA
+:100810002714271427145014501450145014501433
+:1008200050145014501450145014501450145014A8
+:10083000501450145014780018147E007E107E124C
+:10084000912000247810D1297F127F107F00912001
+:1008500001807C007E007E107E127810C8137F120B
+:100860007F107F00912001807C007E007E107E1230
+:10087000912000237810D1297F127F107F009120D2
+:1008800001807C007E007E107E1291200023781073
+:10089000D129912000247810D1297F127F107F0068
+:1008A000912001807C007E007E107E127E0D7E0EE7
+:1008B0007E0F7920004F712000026920404F003DDB
+:1008C0008CD040006614EC7084A0001CE278781094
+:1008D000B04D003D84D0400074146920804F7120D9
+:1008E0000001EC7084A0001CE6787810B04D7F0FFA
+:1008F0007F0E7F0D7F127F107F007C0008700B80C1
+:10090000C8008914077002008CA0E001C0008A149E
+:100910009CD0400089147A087A09C370024078009C
+:10092000C41568001A1561200000186084D0C0004A
+:100930001A15287805A0C0009E1410001B15780019
+:100940001A151079F4D14000A4147800B914147960
+:10095000ECD14000BD14FCD04000B3147E007810F0
+:10096000AE1D7F004000BD147800B9147E007810E1
+:10097000A11D7F004000BD14012007407800C31571
+:100980001079FCD0C000C7146120404F9CC1FCC747
+:100990007800CB146120804F9DC1FDC7646005A025
+:1009A000C0001A15127982602878FCC086A0180051
+:1009B000C000DB147E0C7810851B7F0C2B780000A8
+:1009C0007C6065A0400000157E0C9C607810901E35
+:1009D0007F0C9F6000007810D51C092018008760EC
+:1009E000030110787E00FF84C000F614FF854000EC
+:1009F000F814C5C012787810BB1D7F001278C000B3
+:100A0000141578100D1E10789CD0C00008156120B8
+:100A1000404F78000C156120804F9CC012787F6099
+:100A20000000D460DCD040001815DCC0D660012086
+:100A300005407800C3157800C1157C001078F4D00B
+:100A400040002315012007407800C31506A0C2709E
+:100A5000C670CA70CE70DA70C0703DA08AA0400027
+:100A6000C80031157900381500218AA04000C8005F
+:100A7000CF1579007815C1151716E0154F16871692
+:100A80008716D715ED1C9216CF15E415E615E81557
+:100A9000EA15F21CCF15A016FD16A51BE71CEC15D8
+:100AA000EA192C1A671AB81AA519B219C619D91950
+:100AB000EB17CF15341741174D1759176F177B17C1
+:100AC0007E178A1796179E17D317DF17CF15CF15E6
+:100AD000CF15CF15F8170A1826185C188418941823
+:100AE0009718C818F9180B1974198419CF15CF1550
+:100AF000CF15CF159419CF15CF15CF15CF15CF150D
+:100B0000171D1D1DCF15CF15CF15211D661DCF1526
+:100B1000CF15CF15CF15111681169A16F7169F1BF4
+:100B2000CF15CF15681BCF156A1D091D131DCF15D5
+:100B3000CF15CF15CF15CF15CF15CF15CF15CF1595
+:100B4000CF15CF15CF15CF15CF15CF15CF15CF1585
+:100B5000CF15CF15CF15CF15CF15CF15CF15CF1575
+:100B6000CF15CF15CF15CF15CF15CF15CF15CF1565
+:100B7000CF15CF15CF15CA72C67101200640780077
+:100B8000C315CE73CA72C67101200040C2706800DE
+:100B9000C415612000001B600100912000509120CD
+:100BA00080407C00C37001407800C415C3700640CB
+:100BB0007800C41599204100A1204100A92005001A
+:100BC000A3537800C115C470C37004007A00780084
+:100BD000C1157800C1157800C1157800C1159120A4
+:100BE0000080C3700400C7705349CB702050CF7091
+:100BF0002020D370080001200F00D670792000005B
+:100C00001B780100312030005920001029201A04DF
+:100C10005120450461204704C1202000912000504C
+:100C20009120804078001804D875DC74DA75DE7481
+:100C300078001A16292000002025D071C872CC73C4
+:100C4000C470A020992030000370010007700600D6
+:100C50001A731E722274267521204000FF81400005
+:100C6000C11582A14000C8003416202106A008202A
+:100C70000384127007700400077001000870FCD034
+:100C800040003B160770020084A0E00140004916B6
+:100C9000C37002407800C415A824A55378002B1611
+:100CA0007800C115292000002025D071C872CC73AE
+:100CB000C4709820A1203000037000000770060067
+:100CC0001A731E72227426752120400007700600D8
+:100CD000FF814000C11582A14000C8006E1620218E
+:100CE00006A0082003841270A824A65307700100F0
+:100CF0000870FCD04000751684A0E0014000631627
+:100D0000C37002407800C415D875DC74DA75DE74DF
+:100D100078005216C471C87014219EA70400C00048
+:100D20008F160A20CA727800C015C7700800CB70F1
+:100D30000F00CF700B007800C115D875DC76DA751E
+:100D4000DE767800A316292000003025C470C87212
+:100D5000CC73D074C670CA72CE73D27405A0400032
+:100D6000F2160AA44000B316C800BC1601807278BF
+:100D700084A000FC4000C016AC7885C0AE7801208D
+:100D800005407800C3157E7B7A7A867E827D767CEC
+:100D90008CA400FF4000D8160784048004800C81D6
+:100DA0000C810F8118A191A20000B1A6000081A5BD
+:100DB00000007800E21607840480048018A391A242
+:100DC0000000B1A6000081A500001A731E722276F1
+:100DD000267005A64000EC16107AC5C2127AAC78CF
+:100DE00084A0FCFFAE787800F516AC7885C0AE78AC
+:100DF0007800C115D875DC76DA75DE7678000017D4
+:100E0000292000003025C470C872CC73D474C67019
+:100E1000CA72CE73D67405A040002F170AA44000F2
+:100E20001017C80019170180927884A000FC4000B8
+:100E30001D17AC78C5C0AE78012005407800C315F9
+:100E40009A7A9E7BA27DA67E002605A540002817E3
+:100E5000107AC5C2127A967CAC7884A0FFFCAE787A
+:100E600078003217AC78C5C0AE787800C11509207B
+:100E700000006C7865A040003E1708810060780093
+:100E80003717C47A7800BF150920484F0C21107815
+:100E9000ECD0C000C0151120884F14227800BF1577
+:100EA0000920494F0C211078ECD0C000C01511204A
+:100EB000894F14227800BF156120404F28612C62B1
+:100EC0001482148214821078ECD0C0006D17612057
+:100ED000804F2863DA732C631C831C831C83DE73AE
+:100EE0007800BF1509204C4F0C211078ECD0C000C1
+:100EF000C01511208C4F14227800BF151879780086
+:100F0000C01509204D4F0C211078ECD0C000C01541
+:100F100011208D4F14227800BF1509204E4F0C214F
+:100F20001078ECD0C000C01511208E4F142278002C
+:100F3000BF1520791078ECD0C000C015247A780055
+:100F4000BF15C471FCD1C000A6171120C053780092
+:100F5000A81711204054078184A00F00038003804C
+:100F6000038068A2006A04689CD04000B717086B31
+:100F70007800B8170C6BFCD1C000BF1721203B02D2
+:100F80007800C11721203B0124241479E4D14000CA
+:100F9000CD17C4D4C000CC17D5C47800CD17DDC49C
+:100FA000A4A4001CDE74C4717800BE15C477781048
+:100FB0002B1E912000801C6B146A91200180082751
+:100FC0007800BE156120404F18611078ECD0C00049
+:100FD000C0156120804F18627800BF15C477781063
+:100FE0002B1E912000800869186A106BDA77912017
+:100FF00001807800BE15C471102194A20F0082A256
+:101000001000C800B9157810C62784A3004040001E
+:10101000081895A220007800BE15C4710021BCC03C
+:1010200082A01000C800B915BCD1C0001918112049
+:10103000484F042278001D181120884F0422BDC09B
+:101040007E000021BCC01220781023277F01780089
+:10105000C015C4712120494F0424C6701920000016
+:1010600078003518C8712120894F0424CA70FDC347
+:1010700011205418A9200800042206A14000441899
+:101080001082F0003918C471C8727800B81592A2A5
+:1010900054187E0222217F01781044271078ECD06A
+:1010A000C0005218FCD340002F187800C115E80387
+:1010B000FA00F401EE0204000100020003006120C6
+:1010C000404F28612C62148214821482C4702A60FA
+:1010D000C8700380038003802E601078ECD0C000BD
+:1010E00082187E027E016120804F28612C6214826A
+:1010F00014821482D8702A60DC700380038003801D
+:101100002E60DA71DE727F017F027800BF156120E8
+:10111000404F3061C47032601078ECD0C000C01510
+:101120006120804F3062C87032607800BF15187936
+:101130007800C015C47184A1CFFF4000A3181078B7
+:10114000ECD0C000B915C8727800B81511204D4F09
+:10115000042212217E00192000007810AB2710789D
+:10116000ECD04000B3187F017800C015C87184A18D
+:10117000CFFF4000BC181021C4717800B8151120B1
+:101180008D4F042212217E00FDC37810AB277F0211
+:101190007F017800BF15C47182A110004800D418E7
+:1011A0001078ECD0C000B915C8727800B8151120BD
+:1011B0004E4F04227E00122119200000781089274A
+:1011C0001078ECD04000E4187F017800C015C87199
+:1011D00082A110004800ED181021C4717800B815E4
+:1011E00011208E4F04227E001221FDC37810892722
+:1011F0007F027F017800BF15C471C87284A1FDFF12
+:10120000C000B81584A2FDFFC000B81500212079E8
+:1012100022780022247A26787800BF15C471FCD188
+:10122000C00013191120C053780015191120405423
+:10123000078184A00F0003800380038068A2192027
+:101240000000C872BCD2400024199DA31000B4D283
+:10125000400029199DA308009120008000687E00AD
+:1012600026A240004819026AECD440003519A5C3F3
+:10127000E4D4400039199DC3F4D4400048190F81CB
+:10128000F4D24000441978100828780048197810E2
+:10129000E62778004819CC72086806A240006A194F
+:1012A000A4A2FF001478E4D0C0005B1982A4280037
+:1012B000480067194000671978005F1982A443004D
+:1012C00048006719C471C6717F02CA7291200180FB
+:1012D0007800BA150A6A9DA30A00046805A3066887
+:1012E0007F020C6BC471912001807800BE15C47719
+:1012F00078102B1E91200080146A1C6B91200180B5
+:10130000C8701668CC701E6808277800BE15C470B7
+:101310006120404F18611A601078ECD0C000C015F1
+:10132000C8706120804F18621A607800BF15C471C0
+:10133000C872CC7382A11000C800B91578102A2891
+:1013400084A300404000A31995A220007800BE1598
+:10135000C47778102B1E91200080086A8DC20A6A1B
+:101360009120018008277800BF15C47778102B1EC4
+:1013700091200080086A94A2F9FF0A6A046805A017
+:101380004000C11978106F2691200180082778004D
+:10139000BF15C47778102B1E91200080086A95C273
+:1013A0000A6A046805A04000D41978106F269120BD
+:1013B000018008277800BF15C4774120010049202B
+:1013C000050051202000912000807810461E9120B9
+:1013D00001800827086A7800BF15C4771478E4D024
+:1013E000C000FE19FCD74000F8197810AE1D40006F
+:1013F000FE197800C3157810A11D4000FE19780071
+:10140000C315C873CC72C677CA73CE727810CD1E5E
+:10141000C000281A186805A04000221A08277E0775
+:1014200078105A287F07C000221A01201500FCD727
+:10143000C0001B1A6120404F78001E1AFDC06120B9
+:10144000804F2A78912001807C009120018001202A
+:1014500005407800C315912001807800C115C4773C
+:101460001478E4D0C000401AFCD740003A1A781033
+:10147000AE1D4000401A7800C3157810A11D400031
+:10148000401A7800C315C677412021004920050085
+:1014900051202000912000807810461E092016005F
+:1014A000FCD7C000541A6120404F7800571A6120C1
+:1014B000804FFDC1676003007F6000007667836036
+:1014C0000F002A79D461DCC1D66178106F26912093
+:1014D00001807C00C877CA77C477C6771478E4D0D7
+:1014E000C0007E1AFCD74000781A7810AE1D40006C
+:1014F0007E1A7800C3157810A11D40007E1A78006E
+:10150000C315BCA700FF9120008009201700FCD75D
+:10151000C0008B1A6120404F78008E1A6120804FE6
+:10152000FDC17F60000067600200766783600F0086
+:101530002A79D461DCC1D66178106F2691200180B0
+:1015400041202100492005005120100091200080F9
+:10155000C87005A04000AC1AD460FDC0D6607810F9
+:10156000461EC8703668388784A71F00C000AC1AB2
+:10157000912001807C00192000001478E4D0C00084
+:10158000CE1AC87284D24000C81A7810AE1D40002E
+:10159000CE1A7800C3157810A11D4000CE1A78002D
+:1015A000C315C872CA72AC7884A00300C000F91ACF
+:1015B0003920000084D24000DB1AFDC74120210001
+:1015C000492004005120080078102B1E9120008033
+:1015D0000868D4C00DA80A6991200180388784A7C3
+:1015E0001F00C000E11ABCA700FF3F8738873F8774
+:1015F00084A7000FC000E11A91200080C87284D235
+:10160000C0000B1B1078ECD04000071B69200001C4
+:1016100078000D1B6920000278000D1B6920000175
+:10162000086884A0FDFF0A683068B4D040002D1B14
+:101630004B680400A9201400486894D040001F1B88
+:10164000F000191B4B680900A9201400486884D0D9
+:101650004000291BF000231BA920FA00F0002B1BDF
+:101660007920004F09201800C87284D2C000391BAD
+:101670006120404F78003C1B6120804FFDC17F609E
+:1016800000002A796760010083600F00A7600000F6
+:10169000A860B260B660D460B4D04000581BB4C03B
+:1016A000D6607E0CB86065A00860D4C00A6018607F
+:1016B00001801A607F0CD46084A0FF77D660AC787C
+:1016C0008DC0AE78FF834000631B7C001B68470021
+:1016D000912001807C00CC737810BA1AEC69486ABA
+:1016E00085A100184A6885A14000EE68CC732120CE
+:1016F0000400A920FF09F000781B2184C000761B9C
+:101700001983C000741BEE694A6A912001807C0035
+:10171000FCD7C0008C1B6920404F78008E1B6920CD
+:10172000804FC471C6711669FF81C000961BA768FF
+:101730000100AC788CC0AE7884D0C0009E1B7810BD
+:101740002D1F7C00D875DC74DA75DE747800A71B59
+:101750002EA02025C471C873CC72C671CA73CE7214
+:101760007920004FDE7DDA7CD67BD27A7810041E99
+:101770004000D11CA9200500A120144F9120008019
+:10178000A1419120018009204000781018204000DC
+:10179000CA1B78100D1E7800D11C04608CA0FF00BD
+:1017A0008EA10900C000D51B7E007810BF237F00EA
+:1017B00084A000FF078009804000611C7E0C682C1B
+:1017C0007810041E40001B1C002C9E680981C0007C
+:1017D000DC1B9F6000007F0C7E0CDC7DD87CD47B02
+:1017E000D07A90A2400099A30000A1A40000A9A56E
+:1017F0000000DE7DDA7CD67BD27A682C9C6865A0FE
+:101800004000601C0920400078101820C0003E1CD9
+:10181000046084A0FF0086A00200C0001B1C0460BE
+:1018200084A0FF0086A00A00C000171C7E0178106B
+:10183000BB237F01002D02607800EA1B7F0C7E0C29
+:101840009C607810901E7F0C9F6000007810D51C63
+:10185000092018000860CDC00A6004608660107816
+:101860007E00FF84C000341CFF854000361CC5C0CC
+:1018700012787810BB1D7F00127878100D1E78004A
+:10188000D11C7F0C7E0C9C607810901E7F0C9F609A
+:1018900000007810D51C09201800876003011B6028
+:1018A000030010787E00FF84C000561CFF854000B6
+:1018B000581CC5C012787810BB1D7F0012787810B4
+:1018C0000D1E7800D11C7F0C1478E4D0C0008F1C52
+:1018D0001461FCD140006F1C7810AE1D40008F1CBD
+:1018E0007800731C7810A11D40008F1C7810D51C47
+:1018F00009201800876003011B60210010787E001A
+:10190000FF84C000831CFF854000851CC5C0127881
+:101910007810BB1D7F00127878100D1E0120074043
+:101920007800C315C474C873CC7214609120008011
+:101930007E0E09201200FCD0C0009F1C7120404F79
+:101940007800A21C7120804FFDC12A7967700500C4
+:10195000D471DCC1D6716A736E72727476707B70EA
+:101960000000002C7E702EA030251C6184A1600038
+:101970004000B91C7810B6467F0E9665A6659A663B
+:10198000AA66AF600000B360000014672360000027
+:10199000246096A00100C000CC1C00802660781056
+:1019A0006F26912001807C00C37005407800C4152B
+:1019B000A92005009920144F912000800A539120FE
+:1019C0000180002110A299A30000A1A40000A9A5F4
+:1019D00000007C00C471C77000001E797800C1153A
+:1019E000C471C67168217800F41C692000100C696C
+:1019F00016A0042D10A2688D0981C000F61C85A2D6
+:101A00000000C000041DC37000407800061DC370B4
+:101A10000340CA707800C4156479C671C47182A18C
+:101A20000300C800B91566797800C1156479C671DC
+:101A30007800C1150079C671C47102797800C115AA
+:101A40000079C6717800C115C470112000008CA007
+:101A50000D004000361D0C814800321D10820C81A3
+:101A60000C814800321D10820C81FF81C000BA1524
+:101A700010820E7A8CD24000621D1079CDC112798D
+:101A8000092021001920030084D240005C1D088138
+:101A90001920410011204E97122319204200108274
+:101AA00012231920430010821223192046001082AD
+:101AB000122319204700108212231920060011203A
+:101AC0005397122111207397122304790678780016
+:101AD000C0150478C6707800C115C471FCD1C0006F
+:101AE000721D1120C0537800741D112040540781CD
+:101AF00084A00F0003800380038068A2146AB4D21C
+:101B00004000831D112001007800851D1120000078
+:101B10000C6B0068DA707800BE151478F4D04000C1
+:101B2000951D01200740DB70000005A07800A01D76
+:101B3000FCD040009F1D01200740DB70010005A084
+:101B40007800A01D06A07C001478F4D04000AC1DE5
+:101B500001200740DB70000005A07800AD1D06A045
+:101B60007C001478FCD04000B91D01200740DB70D8
+:101B7000010005A07800BA1D06A07C0012711A723F
+:101B80001E731078C4D04000C41D2274267580AC2A
+:101B9000010008810C81A9819880A1203000037088
+:101BA00000008460A220A65307700100747984A10C
+:101BB00000FF4000E11D0F810C810C810480048036
+:101BC000078000A17800E41D0781048004807C79EF
+:101BD00008A1787A06A011A2107DC4D54000F11D9D
+:101BE000847B19A3807C21A40870FCD04000F11DE7
+:101BF00003700100077006001A711E72107DC4D5B3
+:101C00004000011E2273267484A0E0017C00487805
+:101C100065A040000C1E042C4A78632000007C0064
+:101C20007E0F7920004F48786220002C05A0C0006C
+:101C3000181E7810B2294A787F0F7C001120009975
+:101C40004A7AC47B19834000281E80A232001220E9
+:101C5000102078001F1E132000007C007E017E02F1
+:101C6000FCD7C000341E1120C0547800361E11204D
+:101C7000C07484A7000F0B8084A71F004000411E82
+:101C8000038003800380038005A168A27F027F0197
+:101C90007C0078102B1E00292A68002A2E6808680C
+:101CA00084A0EFF90DA80A697E0EFCD7C0005B1E68
+:101CB0000920534F7120404F78005F1E0920934F39
+:101CC0007120804F0C21046805A040006F1E16A1F2
+:101CD000C0006F1E6020006006687E010B200000BF
+:101CE0007800721E092000007E01046865A0400093
+:101CF000871E006006687810A21E781064201068A5
+:101D0000087909810A7901801268C000721E107971
+:101D1000A5C112797F0102690669002D6020781043
+:101D2000132B7F0E7C0065A04000A11E08209C6044
+:101D300005A040009E1E62209F60000065A0780004
+:101D4000941E48784A7962207C00076003018F6006
+:101D50000000A9201C0080AC0500A020012000008C
+:101D6000A44028681A602C6822607C007E0EFCD794
+:101D7000C000BD1E7120404F3120C04F7800C11EF1
+:101D80007120804F3120C05150708CA00002C000E3
+:101D9000CB1E08A60A2D0080527006A07F0E7C0084
+:101DA0007E0FFCD7C000D51E7920404F7800D71E8B
+:101DB0007920804F78102B1E9120008004680A78CB
+:101DC00065A040002B1F7800E91E002C0A786020D7
+:101DD000006065A040002B1F106006A3C000E21E3B
+:101DE0000C6006A2C000E21E282C4C7806ACC00095
+:101DF000F81E7800281F046806ACC000061F0060AB
+:101E00006020066805A0C000061F03680000780077
+:101E1000101F006408786020026486A40000C000DF
+:101E2000101F002C026860257F0F7810A21E7E0F05
+:101E30001B600500236020007F0F781064207E0F58
+:101E4000087909810A79106801801268C000281F8A
+:101E50001078A5C012780120FFFF05A07F0F7C003D
+:101E60007E07002739200000FCD04000351FFDC749
+:101E700041202100492004005120080091200080C9
+:101E80007810461E388784A71F00C0003D1FBCA7DE
+:101E900000FF3F8738873F8784A7000FC0003D1FA2
+:101EA000912001807F077C006C78092074970C21B9
+:101EB0000DA140005B1F65A07800DC2361200000BD
+:101EC000186084D0C0007B1F10788CD040006C1F3D
+:101ED0008CC01278FCC76920404F7800711F8DC0FC
+:101EE00012786920804FFDC7912000801C681F6810
+:101EF00000009120018005A0C0007C1F7C008CA008
+:101F0000F0FF4000821F7810B2297900841F941FCF
+:101F1000971F9D1FA11F951FA51F951F951F951FFB
+:101F2000AB1FDC1FE01FE61FFB1F951F951F7C00EA
+:101F30007810B22978102D1F012001807800072029
+:101F4000012003807800072001200480780007200A
+:101F500078102D1F01200680780007209120008036
+:101F60007E07FCD7C000B71F6920404F3920090009
+:101F70007800BB1F6920804F39200900006886A0C7
+:101F800000004000C51F7F001E6F912001807C0073
+:101F900074687F07BCA000FF412021004920040095
+:101FA000512010007810461E388784A71F00C000FB
+:101FB000CF1F9120018001200A8078000720012096
+:101FC0000C807800072078102D1F01200D807800EC
+:101FD00007201478E4D0C000F91FECD04000F31FB4
+:101FE000FCD74000F31FE4787800F41FE078C67057
+:101FF00001200E80780007207800951FFCD7400054
+:102000000120EC7878000220E878C67001200F806B
+:1020100078000720C270FCD7C0000F20DB700000E2
+:1020200078001120DB700100612000001B600100BE
+:10203000912080407C0080AC0100FF814000432063
+:1020400099203000A0200C7084A0FF0340002520C0
+:1020500018707E001C707E0020707E0024707E0050
+:102060001271AC811A721E732274267503700100FE
+:102070000770010008700B80C8003720077002004D
+:102080008CA0E001C0004320A55306A0037000000F
+:10209000077004007F0026707F0022707F001E7092
+:1020A0007F001A707C0011202000092010000A6BAC
+:1020B0000E6C036800FD076818001A6A002DE8A07E
+:1020C000080090A204000981C00054207C00046034
+:1020D0008660082C63200000687805A06A794000BB
+:1020E0007120022C780072206E797C007E0C6120B9
+:1020F000004F87680301082D6B200000686005A071
+:102100006A6140008320022D780084206E617F0C7C
+:102110007C0091200080042C6E7805A0C0008E20E9
+:102120006A78912001809C6005A04000A7207E0C69
+:10213000602008209C6005A04000A32062209F60D2
+:10214000000065A09C6005A0C0009B2048784A79EB
+:1021500062207F0C487862209F60000085AC000000
+:10216000C000B1207810B2294A787C00A920100064
+:1021700006A0048086808E81C800BC2000A2F000EA
+:10218000B72086808E817C007E15A920100005A0D6
+:102190004000E2201AA1C800E22013828D8148008D
+:1021A000D5201AA1C800D620F000CA207800DA2075
+:1021B0001AA108231082F000CA207E00003284A0F9
+:1021C000FFF780207F007F157C007E00003285A015
+:1021D00000087800DE20747DD07006A54000CE2176
+:1021E0001078502000788CD040000A21ECDA4000B2
+:1021F0000A217E0E9120008071202000047005A02D
+:10220000C000072108707F0E86A0080040000A2148
+:102210007800CE217F0E7800CE217810041E400079
+:10222000CE2146A070790025008012A1092040002F
+:10223000C800192178002021D07206A24000202178
+:102240004088092080007E0C1271077001009920DF
+:102250003000A920200080AC0100A02061200000F7
+:10226000FF88400032217810041E0870FCD0400026
+:10227000322107700200912001808CA0E001C00093
+:102280006921A553FF8CC0004721FF884000B82179
+:1022900078005121002C8E78A920200080AC01000C
+:1022A000A020A5537800B82146A018721C73C4DA88
+:1022B000400059212074247592A240009BA3000085
+:1022C000A3A40000ABA500001A721E73C4DA40007C
+:1022D00069212274267506A0077004004000B82109
+:1022E000FF8C4000722178100D1E7F0C78100D1E9F
+:1022F00046A0887800808A7886A002004000982155
+:102300007C7A787BC4DA40008421847C807D747977
+:1023100007810480048010A299A30000A1A40000FA
+:10232000A9A500001A721E73C4DA4000CE212274DF
+:1023300026757800CE211460FCD0C000A021692051
+:10234000404F7800A2216920804F912000801F68B3
+:102350000200FF884000AE2146A08C786020780003
+:1023600098218B780000AC7885A00300AE7891208E
+:1023700001807800CE217F0C8B78000078108D23AF
+:10238000046084A00F007810CF21FF884000CC218A
+:102390008C786020046084A00F007810CF21780032
+:1023A000E8207C007900D121E121FF211D22E121DB
+:1023B0002E22F221E121E121E121FD211B22E12157
+:1023C000E121E121E121E12139200004BC7805A7C8
+:1023D000BE78086005A70A60781071229C60BA7800
+:1023E0009F600000781077237C00BC78C4D0400048
+:1023F000F8217800E1211C60BDC01E607800052234
+:102400007810BF23BC78C4D0400005227800E121B9
+:10241000BF7800000460078084A0FF00B2780180CC
+:10242000400018227810712240001822BC78C5C0E4
+:10243000BE7878001A22780090227C007810BB23A6
+:10244000BC788CA0000EC0002522C4D0C00027227A
+:102450007800E12178107122C0002D2278009022AE
+:102460007C00BC78C4D0400034227800E121BF78E1
+:102470000000146711200100A822186084A0FF004A
+:1024800005A040005422BCA700FFA92020008EA078
+:10249000010040005422BCA7008011200200A920A6
+:1024A00000018EA002004000542278006E227810B5
+:1024B0002B1E002D912000802B6800002F6800004B
+:1024C000086884A0DEFF0A68E8AD10009120018052
+:1024D000F0005722118240006E22A92000017800EE
+:1024E000572278100D1E7C009F600000B4786DA00C
+:1024F000002CB678C0007C22BA78780084229E68CE
+:10250000002D0260B87806ADC00084220260B07869
+:102510000180B278C0008F22BC78C4C0BE78B87881
+:10252000602006A07C007E0E2EA03025BA7DB67DF0
+:10253000AE65B2651C60A260482084A9FFE11E6000
+:1025400084A960004000A3227810B6469665A6656F
+:102550009A66AA6614677120804FFCD7C000AF222C
+:102560007120404F84A7000F0B8084A71F004000FC
+:10257000BA22038003800380038005A1C47168A18F
+:102580000027078084A00F00038003800380C871A8
+:1025900000A1C260912000801478C4D04000DF22E6
+:1025A000ECD04000DB22FCD7C000D822F4D0C00021
+:1025B000E6227800DF22FCD0C000E6221078F4D0BA
+:1025C000C000E622086E84D640001023FCD9C0006B
+:1025D0001023912001807810A21E91200080781095
+:1025E0006420912001801478E4D0C0007523147811
+:1025F000C4D040007523ECD040000823FCD7C000B5
+:102600000323F4D0C0000C2378007523FCD0C00055
+:102610000C23780075231078F4D0400075231B60DC
+:10262000210078007523246096A00100C0001723C4
+:1026300000802660106A146802A248002A23400025
+:102640002A2391200180392000029C60BA789F6083
+:1026500000007810772378007523082CFCD94000FF
+:102660005223006865A040005223046A007084A0D1
+:102670000200400048234C7006A2C0004823046BAF
+:1026800060210423026005A0C00044230269602287
+:10269000026178005E23002D60207810132B086EF5
+:1026A00060210262066978005E230068026965A005
+:1026B00040005A23026178005B23066960210360B1
+:1026C00000006021FCD940006523B4A6FCFF0A6E1F
+:1026D0001068087D28850A7D00801268912001809D
+:1026E000B4D640007523B6A640000A6E7810B31E1B
+:1026F0007F0E7C00086005A70A609120008078109A
+:10270000642091200180B87865A040008A239C60F5
+:10271000BA789F60000078007723B678BA787C009A
+:1027200070797478182884D340009723008012A110
+:1027300048009C23008012A1C800AC2384C37C7A8B
+:102740001A72787A1E72C4DA4000A723847A227241
+:10275000807A267206A084D34000AC23008076786D
+:10276000D2701C7805A04000BA2301801E78C000FA
+:10277000BA236800BA23912080407C003920D323FB
+:102780007800C1233920D923042705A04000D22393
+:1027900000AC68200869106812690A680C6914683E
+:1027A00016690E6838877800C1237C000300090091
+:1027B0000F0015001B00000015001B000000412049
+:1027C00000000C787900E123B3258625E5235E24FB
+:1027D000392074973427107D78000524846086A002
+:1027E0000301C00047241461186005A14000FA23CA
+:1027F000FF86C000162478004724038680A05597E2
+:102800000C6202220080106202227810862030863C
+:102810008EA60F004000D2246C7865A0C000EB2388
+:10282000087802A6C8001624ACD5C00016243A26A3
+:102830007C0082A60300C800D22491200080692079
+:102840000000186884D0C00042241120559704224B
+:10285000C67010820422CA7084D6C000322410824E
+:102860000422DA7010820422DE7085A62080C270F5
+:102870001B68010091208040107884A0CFFF12785F
+:10288000912001803B2000007C001078ADC01278C0
+:102890007800D2243A267810BD25C000E0256C7857
+:1028A00065A0C000EB2391200080107884A0CFFFAA
+:1028B000FF8640005924ADC0127891200180780035
+:1028C000E025392074973427107D78007A248460BD
+:1028D00086A00301C000BB241461186005A140005C
+:1028E0007324FF86C0008B247800BB2480A65597F4
+:1028F0000C6202227810862030868EA61E004000D0
+:10290000D2246C7865A0C0006424087802A6C800B0
+:102910008B24ACD5C0008B243A267C0082A606000E
+:10292000C800D2249120008069200000186884D05B
+:10293000C000B6241120559709204E97A8261C21C7
+:1029400004221A2008811082F0009C2485A6308081
+:10295000C2701B68010091208040107884A0CFFFD6
+:1029600012789120018006A0092075970A203A204C
+:102970007C001078ADC012787800D2243A26781006
+:10298000BD25C000E0256C7865A0C00064249120BE
+:102990000080107884A0CFFFFF864000CD24ADC01A
+:1029A0001278912001807800E02591200080077046
+:1029B00004009479D47002A14800E3244000ED247F
+:1029C000907B02A3C000ED247800E6240280C000C2
+:1029D000ED243A261078ADC01278912001807C0059
+:1029E00084A100FF4000FA240F810C810C81048037
+:1029F0000480078000A17800FD2407810480048002
+:102A00009C7A10A21A72987A06A011A21E72C4D4DF
+:102A100040000D25A47A11A22272A07A11A226727A
+:102A2000A120300003700000092054970A26098174
+:102A30009821042184D040001B253386B0A60200D3
+:102A4000A826A65303861270077001009079947827
+:102A500000800AA1C8002A2506A02820747984A134
+:102A600000FF400039250F810C810C810480048017
+:102A7000078000A178003C250781048004807C79D0
+:102A800008A1787A06A011A2C4D440004825847B0E
+:102A900019A3807C21A40870FCD04000482584A0A4
+:102AA000E00140006D25107D312054973426A87830
+:102AB0000080AA788CD0C0006225077006000470E0
+:102AC00094D0C0005C257800D4246920474F6B2047
+:102AD0000300AC7885A00003AE7806A078007625C8
+:102AE0003020D67591208040967D107DACA5CFFF1B
+:102AF000127D91200180AA78077006003A260370A3
+:102B000001001A711E72C4D54000852522732674F7
+:102B10007C00846086A00301C000A92514611860B0
+:102B200005A1C000A92569200000186884D0C00054
+:102B3000A9250C60C6701060CA70C37020801B6825
+:102B4000010091208040781086206800A8256C78CC
+:102B500065A0C00086257C007810BD25C000E0255A
+:102B60006C7865A0C00086257800E0257810BD252A
+:102B7000C000E0256C7865A0C000B3257800E02592
+:102B8000846086A00301C000D1251860FCC01A60D3
+:102B900086A00400C000D1250478A4D04000D1252F
+:102BA0007810862006A07C007810E625C000D82585
+:102BB00085A001007C007810F525C000DE254120AD
+:102BC0000100107D7C00FF884000E52591208040B9
+:102BD0007C00907B9479D47002A1C000EF2585A37E
+:102BE00000007C004800F32502A37C0002807C00EA
+:102BF0001078ECD040000D267E0E912000807120D0
+:102C00002000047005A0C0000A2608707F0E86A070
+:102C1000080040000D2678005E267F0E78005E26B4
+:102C200084A100FF40001A260F810C810C810480D2
+:102C30000480078000A178001D260781048004809D
+:102C40009C7A987BA47CA07D10A206A019A321A445
+:102C500029A509201800286005A040002E2609207B
+:102C600040007810BB1D40005026A8780080AA784C
+:102C70008CD0C0005E261460FCD0C00040266920C5
+:102C8000404F780042266920804F912000801F68C5
+:102C90000300AB780000AC7885A00003AE789120EB
+:102CA000018078005E26AB7800007810862090794D
+:102CB000947800800AA1C8005B2606A09678D6709A
+:102CC00006A071201000912001807C00FCD7C0007C
+:102CD0006A260920594F78006C260920994F9120C7
+:102CE00000800A207E0FFCD7C00083260920404FB9
+:102CF0000120044F0420ECD040007F267920000101
+:102D00007800872679200002780087260920804FE6
+:102D100079200001042186A00000C000A026FCD775
+:102D2000C00093260920454F780095260920854F3D
+:102D3000042105A0C000A026307884A0C000C000F7
+:102D4000A0261B7845007F0F7C0009200200692027
+:102D5000004F1068ECD0C0000F277120804F792001
+:102D600000012120BF514B780F001920A74484D1C6
+:102D70004000C3261068ECD04000BF26A1202B01E4
+:102D80007800C526A1202B027800C526A1202B01A2
+:102D9000042305A04000D2269A781883AC23188318
+:102DA0009823A65318337800C5269B782000A920C5
+:102DB00010001468E4D04000E226AF780000AF783D
+:102DC0002090F000DA267800E826AF780000AF788F
+:102DD0002080F000E226037000007E018CD10920E3
+:102DE00000004000F126BDC17810E2287F0120706C
+:102DF00084A00F007E001468E4D07F00C00001278B
+:102E000085A040637800032785A0C06206780F780C
+:102E100000924378D800537880000B7808005674ED
+:102E2000537000000981400022277120404F106834
+:102E3000ECD040001C277920000178001E27792063
+:102E400000022120BF4F7800B0267C007E01BCD15B
+:102E5000C00037277E000120044F0420ECD07F0003
+:102E60004000332711200101780039271120010289
+:102E700078003927112001018CA10F00042284A0C1
+:102E8000F0FF05A112207F017810E2287C00FCD31E
+:102E9000C00057277E000120044F0420ECD07F00A3
+:102EA0004000532711200101780059271120010209
+:102EB0007800592711200101A92009000B81F00099
+:102EC0005B278CA1000E042284A0FFF105A1122033
+:102ED0007C00192002000120044F0420ECD04000A7
+:102EE0007327198309200101780075270920010142
+:102EF000A92005001382F000772794A2E0000421A6
+:102F000084A01FFF05A20A201983400088270920FA
+:102F10000102780075277C00FCD3C0009C277E004E
+:102F20000120044F0420ECD07F004000982711209E
+:102F3000010178009E271120010278009E271120B0
+:102F40000101A9200C000B81F000A0278CA100F04A
+:102F5000042284A0FF0F05A112207C00FCD3C00036
+:102F6000BE277E000120044F0420ECD07F004000EB
+:102F7000BA27112002017800C02711200202780030
+:102F8000C02711200201042284A0CFFF05A1122036
+:102F90007C007E0CBCD1C000DA277E000120044FEB
+:102FA0000420ECD07F004000D6276120000178008B
+:102FB000DC27612000027800DC2761200001BCC111
+:102FC0000381038080A020009A60AC62AC637F0C18
+:102FD0007C007E0CBCD1C000FA277E000120044F8B
+:102FE0000420ECD07F004000F6276120000178002B
+:102FF000FC27612000027800FC2761200001BCC191
+:103000000381038080A022009A60A46084A0DFFF77
+:10301000AE607F0C7C007E0CBCD1C0001C287E0002
+:103020000120044F0420ECD07F00400018286120CC
+:10303000000178001E286120000278001E2861200F
+:103040000001BCC10381038080A022009A60A460BB
+:1030500085A02000AE607F0C7C007E0CBCD1C0003F
+:103060003E287E000120044F0420ECD07F00400069
+:103070003A28612000017800402861200002780091
+:10308000402861200001BCC10381038080A0200092
+:103090009A60A4608CA2200040004E28ACC29DA380
+:1030A0000040FCC3B4D3C0005328FDC3AE6210205F
+:1030B000A460AE6318207F0C7C00912000807E0C01
+:1030C0007E0E186805A04000C028FCD14000692889
+:1030D0006120D09678006B286120C0957810C828B0
+:1030E0004000A228A9200101FCD1400078286120DD
+:1030F000D09578007A286120C0947E0C7810C8287A
+:10310000400085287F0C608CF0007A287800C02869
+:103110007F00FCD140008F2882A0D0957120804F85
+:103120007800932882A0C0947120404F7A70767105
+:10313000382101200400667083700F00D471DCC157
+:10314000D671781063267800BC28FCD1C000A9286D
+:103150007120404F7800AB287120804F2060DDC087
+:10316000226076713821002C7E7001200600667086
+:1031700083700F00D471DCC1D671781063260120F2
+:1031800000007800C228012001009120018005A0E4
+:103190007F0E7F0C7C00042C05A04000DF286020FF
+:1031A000106006A3C000DC280C6006A2C000DC286A
+:1031B000146006A1C000DC2806A07800E1280060A9
+:1031C0007800C92885A001007C007E0F7E0E7E015C
+:1031D000BCD1C000FA287920404F7E000120044F66
+:1031E0000420ECD07F004000F62871200001780018
+:1031F000FE28712000027800FE287920804F71207F
+:10320000000120798CA10F00EC70C4D0C000082907
+:103210007F01780023290B810B810B810B817F00BB
+:10322000BCD0C00020297E000120044F0420ECD037
+:103230007F0040001C298DA1000F780022298DA15C
+:10324000000F780022298DA1000804217F0E7F0F36
+:103250007C007E0E0120014F0420ACD0C000A329C9
+:10326000E468ACD04000A32984A00600C000A329D4
+:103270001460FCD0C0003D297120C05378003F2964
+:1032800071204054078084A00F00038003800380D6
+:1032900070AE047084A00A00C000A329087194A134
+:1032A00000FF4000A3298CA1FF0001200A0006A115
+:1032B0004000722901200C0006A14000762901205F
+:1032C000120006A140007A290120140006A1400046
+:1032D0007E290120190006A1400082290120320028
+:1032E00006A14000862978008A2909200C00780070
+:1032F0008C290920120078008C29092014007800FC
+:103300008C290920190078008C29092020007800D8
+:103310008C2909203F0078008C2911200000002111
+:1033200005A20A707120004F0470BCD04000A32990
+:103330001460FCD0C0009E29EA707120404F7800D4
+:10334000A129EE707120804F1F700D007F0E7C0050
+:103350000120054F0420E4D0C000B129047884A0E6
+:103360001FFF85A0406306787C006800B229912089
+:103370000080712000007E00187084D0C000B92940
+:103380007F0071201000CA707F00C670C370028079
+:10339000DB700F08DF700B00712000001B70010054
+:1033A000912080407800CF293C7F587E307C387D4A
+:1033B000A0788E70927596749A769E7794A53F0049
+:1033C000F4D44000E62984A77D00C0001D44781095
+:1033D000B2299CA40F0082A304005000F129A6A3E7
+:1033E0000700C000B2291824078584A00F007900C7
+:1033F000F629713062318D31FF33E8376238173981
+:10340000A839963A853B092A062A422E652FB937F4
+:10341000062A7810B2297C0006A07800132A0878C2
+:103420008DC00A7806A002704E704670D27060702F
+:1034300005A0C000792B647084A0070079001D2AC4
+:10344000252A982AA12AAC2AB72A5F2BC22A982AB1
+:103450003078BCD0C000082AD471BCD1C000082A82
+:10346000B4D1C000752AA47086A001004000082ACB
+:10347000B4706DA0006865A055A09B7810000C6B1F
+:10348000AA7B086845A0106D04686DA05DA086A8A1
+:10349000010040004B2ABC69AA7DAA79C0684DA0F2
+:1034A0001C6E012010007800D32C607005A0C000B5
+:1034B000082A7E0C7E0DB4706DA0006865A055A032
+:1034C0009B7810000C6BAA7B086845A0106D0468FF
+:1034D0006DA05DA086A8010040006E2ABC69AA7D8F
+:1034E000AA79C0684DA01C6E012020007800D32C62
+:1034F0007810B043C000082A1B785B00BC706DA038
+:10350000B4685A789468D678DE789868D278DA7891
+:1035100008788DC00A78BC684270B4C1D671B870A2
+:1035200065A0C0685A7003700200002D4E7080AD17
+:10353000090046707C007810B043C000A02A1B78B8
+:103540004700037004007C007810B043C000AB2A31
+:1035500011200C007810D22A037004007C0078102F
+:10356000B043C000B62A112006007810D22A03709A
+:1035700004007C007810B043C000C12A11200D0067
+:103580007810D22A037004007C007810B043C00089
+:10359000D12A112006007810D22A7C707F7000009A
+:1035A00068204E70037001007C007471FCC10781BB
+:1035B00082789B78100086A20C00C000E12AAA7ACB
+:1035C000012001007800F62A8CA11F008DA1C00007
+:1035D000AA7986A20D004000EF2AAA7A01200200F3
+:1035E0007800F62AAB7820007871AA79AA7A0120AF
+:1035F00004009B786000AA785B7804001B781601B1
+:103600007810D34383700F00D470B4D04000122BD5
+:10361000B4C0D6707E0CB87065A0086084A0EFFBC3
+:103620000A60186001801A607F0C7C00147005A08D
+:10363000C000212BD470B4D04000222BB87006AC4F
+:10364000C000222B7810012B7C007E01A47186A182
+:1036500001004000542B7E0D7E020021112001004C
+:1036600012A2B4706820006806AC40003B2B1182A7
+:103670004000522B7810562B7800302B7E0C002106
+:103680001120010012A2B470682000686020086058
+:1036900084A0EFFB0A60118240004F2B7810562B5C
+:1036A0007800422BA77001007F0C7F027F0D7F0105
+:1036B0007C00E8AD0500AC7006ADC0005E2BA870C4
+:1036C00068207C007810B043C000082A7C70682015
+:1036D000747778104E42502C781092449B781000EA
+:1036E000146884A01F00BDC0AA781C6E4120010090
+:1036F000012004007800D92C7810B043C000082ABB
+:103700009B78100060706820146FD470B4D04000B3
+:10371000932BB4C0D6707E0CB87065A0086084A0EE
+:10372000EFFB0A60186001801A607F0C78104E422F
+:10373000502C78109244246805A04000A42B82A04D
+:1037400006004800A22B7800A42B27680500146807
+:1037500084A01F00BDC0AA783120200041200100B4
+:10376000012003007800D92C8DC2D672C07200A24D
+:1037700015A0547108812AA14800BC2BC071642196
+:103780000465FF85C000D32B56712184C000B72B80
+:10379000D4708CD04000CF2BD07005A0C000CF2BB0
+:1037A000D3700A007C0000227800C12BD4708CC03A
+:1037B000D670D3700000346005A0C000D02B08671D
+:1037C00084A73F074000022CD4D7C000D02B84A789
+:1037D0002100C000D02B84A702004000F32B84A757
+:1037E00004004000D02BBCA7FBFF0A6784A7180287
+:1037F000C000D02B84A700014000022C186005A057
+:10380000C000D02BBCA7FFFE0A6768252368000014
+:103810001C6E84A60E0018634000132C1C6002A3CB
+:103820004800162C4000162C7800D02BFF83C000D7
+:10383000D02B582D502C5671BCD7C0001F2C28708F
+:1038400022603A60BCC70A67C06865A04DA00061ED
+:10385000602A41200100146B9CA31F009DA3C0009F
+:10386000FCD14000332C84D64000352C9CA3BFFFF4
+:10387000A4D640003A2C9DA3200084A60E00C000D0
+:10388000852CA5C70A67002CC668A47786A7010007
+:10389000C000592CD470B4D0C000592C007082A044
+:1038A0000200C800592C3078BCD0C000592C9B783D
+:1038B0001000AA7B7800D12C3987A6775027B077E3
+:1038C000B0A70500AC7006A6C000642CA876B2763E
+:1038D0003A2C38873A2D38873A2838873A23388760
+:1038E0003A253078BCD040007C2C9120008091207B
+:1038F0003D30D47084A03D30912000809020D5AA26
+:1039000000004000842C21840022C000B62B7C00E3
+:10391000DCD14000493E292020009CD6C000922CDA
+:1039200028858CD6C000922C28854088146F0C61A5
+:1039300008818CA1FF00CC7060A1642CFF8C40003A
+:10394000B12C146006A7C0009A2CB8600180BA6040
+:10395000C000952C602A086085A000010A60002242
+:103960002184C000B62B7C00602A0E61BE69002C49
+:10397000C66840880860D5C00A60A47786A70100A1
+:10398000C000592CD470B4D0C000592C007082A053
+:103990000200C800592C3078BCD0C000592C9B784C
+:1039A0001000AA7BAA7DAA79012002007E0018607F
+:1039B00000801A607800DA2C7E0060290461602A99
+:1039C00084A118004000F62C84A110004000E92CCE
+:1039D00078105E40C0001B2D84A108004000F62C2A
+:1039E000A06984A10006C000F62C78103E3F780044
+:1039F0001B2DA06984A1001E4000262D84A1000873
+:103A000040000F2D7E0C6029006085A00020026020
+:103A100004618DA1100006617F0C78105E40C0002B
+:103A20001B2DA06984A100024000172D7810A13F32
+:103A300078001B2D84A10004C000F22CA06984A191
+:103A400000104000262D14698CA100FF0F81781012
+:103A5000E6277F028CA6E00084A660004000332D9C
+:103A600086A06000C000332D8DA100408DA104010F
+:103A7000B6699B7860000028AA781868FDC01A68AB
+:103A8000BCD640004E2DFCC0877000008AA00D00FF
+:103A900050004C2D8AA00C00867101200C000C8077
+:103AA0008A71AA781835403328340080AC8080AF02
+:103AB0002B00A0209B78000080AD0B009820A6531F
+:103AC000A8239828A02586A22000C000862DD470A7
+:103AD000B5C0D670002CBA70002DBE701468FCC042
+:103AE0000780827886A202004000BC2DA47000806E
+:103AF000A670B47498A40500AC7006A3C0007E2D17
+:103B0000A873B67386A210004000082A7F0D7F0CB0
+:103B10007C00007005A0C000642D86A20200C000D9
+:103B2000D62D7810B043C000642D1468FCC0078007
+:103B30008278912000801B785B00B4685A78946882
+:103B4000D678DE789868D278DA7891200180087883
+:103B50008DC00A787E127E0D7E0CD47084A0002762
+:103B600090207F0C7F0D7F1200295A70BC68427034
+:103B700003700200002D4E7080AD09004670307851
+:103B8000BCD04000C82D91203D30D47084A03D3081
+:103B9000912000809020A47005A0C000CD2D7C0055
+:103BA00021844000CC2D5072C07000A215A0780076
+:103BB000B62B86A21000C000072E7810B043C000BC
+:103BC000642D1468FCC0078082781B785B00B468A1
+:103BD0005A789468D678DE789868D278DA78087857
+:103BE0008DC00A78A4700080A670B47490A40500FB
+:103BF000AC7006A2C000FA2DA872B67200295A70E5
+:103C0000BC68427003700200002D4E7080AD090048
+:103C100046707C00B46B9DA300205A7B1468FCC0E6
+:103C200007808278946BD67BDE7B986ED27EDA7EBC
+:103C30001B785B0000295A70027208788DC00A78E0
+:103C4000002305A64000322ED47084A0002786A051
+:103C50000023C0002C2E0920000078002E2E092001
+:103C6000010084A20F007910382E80AD0900467043
+:103C7000002D4E707C00402E3F493F492C493F4962
+:103C8000402E402E402E7810B229087884A0FDFFE7
+:103C90000A787810A5297E0F7920004FAC787F0F25
+:103CA00084D040006A2E647086A00100C000582EA7
+:103CB00066707800412F647086A00500C000682EF1
+:103CC0007C7068201B68040017680000206884A0CE
+:103CD000FF009DC0226867700000A7700000A870F8
+:103CE000B270B6707810012B7E151120040064713B
+:103CF00086A1010040008A2E86A10700C000812E07
+:103D00001F70050078008A2E1F7001006770000088
+:103D1000D470DDC0D67078008C2E67700000012052
+:103D20000A4F042084A0FF0086A0180040009C2EAB
+:103D30001870167005A0C0009C2EA77001007E06AA
+:103D40007810D645A920100039200000781048418D
+:103D5000B8A70001F000A32E7F0600707900AD2EF9
+:103D6000E72EC22EC22EB72EE72EE72EE72EB52E57
+:103D70007810B229607005A04000E72E06ADC000A3
+:103D8000C22E006862707800D42E206884D0C000F3
+:103D9000D02E146F78104E420860D4C00A6078109C
+:103DA000193E7800D42E5C7060200068026084A602
+:103DB000005F1E681868FCD04000DC2E1A6A176885
+:103DC00000002B680000206884A0FF009DC02268CE
+:103DD0007810732084B200044000EF2E2120D0968A
+:103DE0007800F12E2120C0957810462F84B200046F
+:103DF0004000FB2E2120984F7800FD2E2120584FA7
+:103E00007810462FA920010184B200044000092F38
+:103E10002120D09578000B2F2120C0947810462FB8
+:103E20002084F0000B2F84B200034000182F612083
+:103E3000C05478001A2F6120C07421200200A920EC
+:103E400000011061FF814000372F18607E017E0065
+:103E50001120024F0C2202A112207F007F0102A13B
+:103E60005000372F1260C000372F1120044F04225A
+:103E7000A5C012201B600000E0AC1000F0001E2F57
+:103E80002184C0001C2F7F15037000004F700000BC
+:103E90007C007E04042405A04000612F6820006897
+:103EA0007E001A6A176800002B680000B46884A0BE
+:103EB000005F1E68206884A0FF009DC02268781003
+:103EC00073207F007800482F7F04232000007C00AF
+:103ED00082A2030050006B2F7810B22900237900D2
+:103EE0006E2F712FFC2F193082A202004000772F15
+:103EF0007810B22964706770000083700000790048
+:103F00007E2F862F862F882FC82F553E862FC82FAD
+:103F1000862F7810B2297477781048417477BCA73F
+:103F2000008F78104E42186005A04000BF2FFCD7CC
+:103F3000C0009B2F2120C09578009D2F2120D09676
+:103F40000920050011201000781034304000BF2FE8
+:103F50007E15A9200101FCD7C000AF2F2120C094FD
+:103F60007800B12F2120D0957E0409200500112072
+:103F70001000781034307F044000BE2F2084F00001
+:103F8000B12F7F15388784A71F00C0008E2F7800BF
+:103F90000C2A78000C2A747778104E42186005A01D
+:103FA0004000FA2FFCD7C000D62F2120C095780002
+:103FB000D82F2120D096092005001120200078104C
+:103FC00034304000FA2F7E15A9200101FCD7C00033
+:103FD000EA2F2120C0947800EC2F2120D0957E0478
+:103FE0000920050011202000781034307F044000A3
+:103FF000F92F2084F000EC2F7F1578000C2A002286
+:104000007900FF2F0230043004307810B2290920E3
+:104010001200647086A0020040000D3009200E00DE
+:104020001868FCD0400012301A6967700000D47024
+:10403000DDC0D67078005D43002279001C3021304D
+:1040400004301F307810B2297810D645007086A051
+:104050000200C000C73D7810363E086084A0EFFB28
+:104060000A607810B83D4000C73D78000C2A04244F
+:1040700005A040006D306820042D7E00146806A75E
+:1040800040004330202D7F00780035307F00222013
+:104090001A69176800002B680000B46884A0005FEC
+:1040A0001E68206884A0FF0005A222687810732093
+:1040B0002120024F1C2419832223106001801260EA
+:1040C000C00064302120044F0424A5C022200860D1
+:1040D00084A0EFF90A607810222B7810363E7C001D
+:1040E00085A0010078006C300023790074307930AD
+:1040F0007730F9307810B229E47805A0D000AF30DD
+:1041000008327E000120044F0420ECD07F004000E4
+:104110008A308CA1000378008C308CA10004400010
+:1041200092301800082A780094302800082A0820C5
+:1041300084A03000C0009B307800B937EC7884A0B0
+:10414000030040009930002184A007007900A530C9
+:10415000D930E330CE30AD30A543A543AD30EE309D
+:104160007810B229007086A00400C000C9306470C5
+:1041700086A00200C000BF301120020019200000FC
+:104180007800652F647086A006004000B930647026
+:1041900086A004004000B930E479012003007800D3
+:1041A00043341868FCD04000D4301B681D007810E0
+:1041B00018411B7864007C001868FCD04000DF3098
+:1041C0001B681D0078101841780081431868FCD0E6
+:1041D0004000E9301B681D00781018411B78F8007A
+:1041E0007C001868FCD04000F4301B681D0078107B
+:1041F00018411B78C8007C0084A50F00C00018314E
+:104200007810A5290070790002310C2A0A310C318E
+:10421000C73DC73DC73D0A310A317810B229781031
+:10422000363E086084A0EFFB0A607810B83D40007D
+:10423000C73D78000C2AE47805A0D000AF300832E2
+:104240007E000120044F0420ECD07F004000293183
+:104250008CA1000378002B318CA100044000313187
+:104260001800AF30780033312800AF30082084A028
+:104270003000C0003B311B785B007C00EC7884A0F0
+:10428000030040003831002184A107007900453146
+:10429000543158314F314D31A543A5434D319F43E2
+:1042A0007810B229781020411B7864007C007810C7
+:1042B000204178008143781020411B78F8007C0071
+:1042C000781020411B78C8007C00002379006531FC
+:1042D0006A3168316C317810B2297800A8391B68CE
+:1042E0001600A3780000E47984A130004000A839CA
+:1042F000EC7884A003004000A83984A100014000AC
+:10430000703184A10700790082318A315831CE3072
+:104310005D43A543A5435D439F43781069437C00FB
+:1043200082A20500500093317810B2290023790051
+:1043300096319931C933D433002279009C31B6319A
+:10434000A331B631A131AC337810B2299B78180073
+:10435000A87884A0FF0082A02000480007418AA01E
+:104360000400C80007417900B23107410741074105
+:10437000B1409B781800A87984A180004000C73123
+:1043800078000741007005A0C000BD311120040075
+:104390007800933B84A1FF008AA01000C800074169
+:1043A0007900CF31E131DF31F631FA31CD320741D9
+:1043B0000741CF3207410741A833A83307410741DE
+:1043C0000741AA337810B229E4D64000EC3101202D
+:1043D0000003008000803A781B78C3007C001868D6
+:1043E000FCD04000F4311B681D007800E4317800F7
+:1043F0005D431B681D00780011412069226984A675
+:104400000018C0005F32206884D0C0006532186890
+:1044100086A00800C0000B321B680000D4D6400004
+:10442000CA32BCD640004B3287700000186884A0A6
+:104430003F008AA00D0050004B328AA00C0086710C
+:1044400001200C000C808A719B786100AA787E158F
+:104450007E137E147E0108328CA1000340003D32A1
+:104460007E000120044F0420ECD07F004000393250
+:10447000A1202B0178003F32A1202B0278003F328F
+:10448000A1202B017F019B7800000080AC8080ADD3
+:104490000B009820A6537F147F137F15386005A06A
+:1044A000C0005A321C6884A00E00400011417810F0
+:1044B00027412B78083078005C3201803A601B7805
+:1044C00067007C00E4D6400065321B7879007C00F0
+:1044D00084A660004000C732DCD64000C732FCD65C
+:1044E000C000713278008832FCC65A7EB66EDC7A23
+:1044F000D879D0781B80C8007B32008084A03F0030
+:1045000008A191A20000986B002102A3B268946BED
+:10451000002203A3AE68F4D640008E32F4C65A7E61
+:10452000B66E007086A00300C0009C327E0078103A
+:10453000D64578103F497F001B7876007C0006A0A6
+:104540007810444AB06AAC69986C946B002205A15B
+:104550004000AB32002222A400211BA3AA6CD27C13
+:10456000DA7CA66BD67BDE7B002305A4C000BB32C1
+:10457000F5C65A7EB66E1B7876007C001B787600F6
+:10458000002215A1C000C43278103F497C00781089
+:1045900077497C001B7879007C001B7867007C00E1
+:1045A0007810B22978001B332069C4D14000E4326E
+:1045B000C4C122697E0C587060200060E4C00260B3
+:1045C000046084A0F5FF06607F0C78000F33CCD127
+:1045D00040000F33CCC122697E0C5870602000600F
+:1045E000ECC002600460A4C006600820482C7F0C68
+:1045F0009CD140000F3378104A4278103E3FFF882C
+:1046000040000F339B7860000028AA78587E95C63A
+:104610005A7ED4D6C0000C331B7864007C001B7813
+:1046200078007C00587ED4D6C00016331B78670013
+:104630007C001B7879007C0078000C411920000078
+:1046400090798CA10700C0002933206884A0000164
+:1046500040001933092008009B781000A87894A026
+:10466000FF0086A20100C00045330023A87C00A4FF
+:10467000182002A140003D3348003D3378003F330D
+:104680007800D132A824A87AF0003F3378002B3389
+:1046900084A2F00086A02000C000993318831883FC
+:1046A000002302A14000553348005533780096336B
+:1046B00086A22300400019331C6884A0F1FF1E6805
+:1046C000587E84A6F1FFA5C030205A7E0860A5C0A0
+:1046D0000A607E0C5870602004600820482C7F0C13
+:1046E000A4D14000763378104A4278105E407800BA
+:1046F00084337E0C5870602004600820482C7F0CA6
+:104700009CD140000F3378104A4278103E3FFF881A
+:1047100040000F339B7860000028AA7895C65A7E27
+:10472000D4D6C00093331B7864007C001B787800DB
+:104730007C00A87A78002B331883002302A1400064
+:10474000A2334800A23378002B3384A28000C0003B
+:10475000114178000C4178001141780007415870F0
+:104760004DA09B781800A87884A0FF008EA00100BF
+:104770004000B9337810B229A87A94A2FF00A87833
+:1047800084A0FF008AA00400C80007417900C53357
+:1047900007418F3E0741064082A20000C000CF3390
+:1047A0007810B229781018411B7878007C0082A21A
+:1047B0000300C000DA337810B229FCD4C000FA3309
+:1047C000647005A04000E3337810B229146F767747
+:1047D000BCA7008F78104E42086085A021000A60B7
+:1047E000388784A71F00C000E73378101C4167702A
+:1047F00002001F7009007800FC3378102B411B78F1
+:1048000078007C0082A20400500005347810B229A0
+:104810000023790008340B34CB350E3686A2030012
+:10482000400043340072D87CDC7DD07FD471BCD191
+:10483000C0003B34B4D140003B34687884A0FF0012
+:10484000C0003B3482A20200C8003B347E0D3B789E
+:1048500000831B784C00BC706DA0B4685A789468D3
+:10486000D678DE789868D278DA78B4C1D6710370D9
+:1048700030007F0D01200000780047343B780013A2
+:104880001B784A0001200000780047340072D87C71
+:10489000DC7DD07F4A70A068ECD040004F340860C7
+:1048A0008DC00A6084A20F0079005334AB356034A8
+:1048B0005D3411379D370C2A5B345B347810B22994
+:1048C0000860D4C00A60E4D640006834487086A00E
+:1048D0001400C00088347810D645092000001868FC
+:1048E000FCD040007134487086A01400400082342F
+:1048F000186886A00800C000633558789CD0400036
+:1049000063352068ACD0400063351B681400092073
+:1049100002007800C73468788CA0FF004000C734DC
+:1049200086A10800C0009E340860A4C00A60781008
+:10493000B83D4000C7347810363E7810D645780030
+:10494000AF3486A12800C000C734186005A040001D
+:1049500091340180400091340180400091341E6008
+:1049600078009134206884D040000C2A84C02268EA
+:104970007810132B5C707E0C6020006802607F0C46
+:104980000460026805A0002DC000C4340260066007
+:1049900078000C2A7E01FF81C0001135007086A0CE
+:1049A000300040001135D471BCD1C0001135B4D1F4
+:1049B000C000F834607005A0C0001135A47086A056
+:1049C000010040001135037000007E047E057E0763
+:1049D0007E067E0C7E0D7810352A7F0D7F0C7F06BB
+:1049E0007F077F057F04D471B4D1C00011350370F7
+:1049F0004000780011357810B043C00011351B78A5
+:104A00005B007E0DBC706DA0B4685A789468D6784F
+:104A1000DE789868D278DA78B4C1D6710370300045
+:104A200008788DC00A787F0D781048367F01FF81A5
+:104A30004000633584A600DF1E682B680000146FF9
+:104A400086A10200C0006435186886A01400C0006A
+:104A50002D350820E4D640002D3568788CA0FF0065
+:104A60007810012B7810222B2068DCD0C000643530
+:104A7000178794A20F0013821382138284B200035B
+:104A80004000433590A2C0537800453590A2405471
+:104A900090A200001C22C4D3C0004D3578005335CD
+:104AA0001082042285A0180012201182D4D3400065
+:104AB0005E35A068C4D0C0005E357810C23678007C
+:104AC0000C2A08608DC00A60780064352A6916696E
+:104AD0001868FCD040006B3548701A688CA600DF5F
+:104AE0001E691064FF84400080350920024F0421B4
+:104AF00001800A2021841264C00080352120044FE7
+:104B00000424A5C02220186005A04000883501803B
+:104B10001A60C0008B350860A4C00A60206884D089
+:104B2000C0009735006805A0C0009435026006609B
+:104B300078009B355C706020006802606120004F47
+:104B400087680301082D6B200000686005A06A617A
+:104B50004000AA35022D7800AB356E61007286A246
+:104B600030004000BB3586A24000C0000C2A037014
+:104B700002004C706820C46860207C000370020052
+:104B8000BC706DA0BC684270B87065A0C0685A70F7
+:104B9000002D4E7080AD090046707C0082A204009A
+:104BA0004800D1357810B22900227900D435D835A3
+:104BB000E935F635E93586A500134000E93586A5C7
+:104BC0000083C000CF3503700000186001801A60B8
+:104BD000086084A0EFFB0A60007086A0050040001A
+:104BE000F335781018411B7878007C001B78790029
+:104BF0007C0090780780018084A0070080A01800C6
+:104C00009A78A8798CA1FF0086A1030040000B369A
+:104C100086A1000040000B36780007411B78790020
+:104C20007C00206895C02268FF82C000183678108A
+:104C3000184178001F36118240001D367810B229C5
+:104C400078102B411B7878007C007810D3433078A3
+:104C500084A0C000C00045367E0108327E000120DD
+:104C6000044F0420ECD07F00400037368CA10003B5
+:104C7000780039368CA100047F01400040361800CE
+:104C8000453678004236280045361A7906A07C0061
+:104C900085A001007C0084A66000C00052362F6809
+:104CA0000000336800007800C136DCD6C0006A36E8
+:104CB000B468DCD0C0006A369869946A2E69326A9A
+:104CC000487005A0C0006736002205A14000D64507
+:104CD0004B7015007800D6457C00ACD6400090366D
+:104CE000F4D6400076362F68000033680000780064
+:104CF000D645B46884A0004035A6F4D6C00070360E
+:104D0000487005A0C00083364B701500DCD6C0008B
+:104D10008C36B468DCD040008C36A86CA46D2E6C48
+:104D2000326D7800D645F4D6400099362F680000E1
+:104D3000336800007800D645B46884A0004835A6E2
+:104D4000F4D6C0009336487005A0C000A6364B705C
+:104D50001500082410250027FB80C800AD36008010
+:104D600084A03F0008A191A200002E69326A0021B0
+:104D700005A2C000BA367800D645007086A00600AD
+:104D80004000C1367800D6457C0046690860CDC039
+:104D9000CCD34000C9368DC00A6018683A681B68D9
+:104DA00006008F68000093680000306A2C693E6A34
+:104DB00042692F6803003368000037682000976855
+:104DC00000009B68200000707900E3360C2AF5365D
+:104DD000ED36EB36EB36EB36EB36EB367810B229A8
+:104DE000206884D0C000F5367810193E7800FB3674
+:104DF0005C70502C602000680260602A08328CA130
+:104E00000003400004372120584F78000637212046
+:104E1000984F042405A040000D3720207800063765
+:104E2000222D6B2000007C007810203E7810363E4A
+:104E30000860CCC00A602B6800009B780E00146FDD
+:104E400038691A694469166908328CA10003400068
+:104E50002A370920000078002C370920010078103B
+:104E6000814ADCD6400034371C69EDC11E691868E0
+:104E7000FCD04000433768788CA0FF0040004137E9
+:104E80001B681E00780043371B68000084B20003D3
+:104E9000C0004B372120984F78004D372120584FC4
+:104EA000006822203C6A4069326A2E69C06860202E
+:104EB0000060A4D040008D3741202100492005002A
+:104EC000512020007E0D7E0F7E157E147920004F2C
+:104ED0007810461E7F147F157F0FCC70102009209C
+:104EE00001017E0204226DA040007D37146806A7F0
+:104EF00040007A370068780070372068D5C0226893
+:104F00007F0210820981C0006E377F0D6770030039
+:104F10007F700000767783700F00D471DCC1D6718A
+:104F2000186886A00200C0009937176800002B6837
+:104F300000001C68ECC01E687810732078000C2AF2
+:104F4000D87CDC7DD07F781048362B6800009B78B9
+:104F50000E00146F7810D7438CA0FF0016691868F4
+:104F6000FCD04000B23748701A688CA600DF1E697A
+:104F70006770000078000C2A007005A0C000BF37E1
+:104F800078000C2A06A07810D6452069ACD1C00064
+:104F9000C8371B6814008CA600DF1E692B68000050
+:104FA000206884A0FF00226800707900D4370C2AA2
+:104FB000DE37DE37E137E137E137DC37DC377810D1
+:104FC000B2291868780043340860A4C00A601768E2
+:104FD00000007800DE3D00237900EB37EE37F03734
+:104FE00060387810B229FCD6C000473800700DA098
+:104FF0007900F7370C2A0138013831380138443844
+:10500000FF37FF377810B22984A66000400031389E
+:1050100086A06000C0002E38ACC6F4C6EDC65A7E2D
+:10502000B66E1C68ACC01E6886A102004000203825
+:105030007810D645AC69B06815A1400020387810CA
+:1050400077497800223878103F491B787900D4716D
+:10505000B4D1C000082AA47086A00100C000522A62
+:105060007C00ECD640000B381868FCD04000443877
+:10507000F4D6C0003E381B6815001B787900780014
+:10508000082A1B6807002F680000336800007810AA
+:1050900069437C00FCC65A7EDC7AD879D0781B80C4
+:1050A000C8005038008084A03F0008A191A20000F1
+:1050B000986B002102A3B268946B002203A3AE6830
+:1050C0001B7879007C007810B229002379006538BC
+:1050D0006A388F38EF387810B229007079006D384F
+:1050E000753877388038753875387538753875384B
+:1050F0007810B229AC69B06815A1400080387810EA
+:1051000077497800823878103F491C68B4C01E681F
+:10511000D470B4D0C000082AA47086A00100C000DA
+:10512000522A7C00FCD6C000DF3800700DA0790048
+:1051300096380C2AA638A038D638A638DC389E38DF
+:105140009E387810B2299468D678DE789868D2783C
+:10515000DA7884A660004000D63886A06000C000DF
+:10516000D338B4A6BFBFEDC65A7EB66E86A1020084
+:105170004000C2387810D645AC69B06815A140002F
+:10518000C238781077497800C43878103F491B78C6
+:1051900079001C68B4C01E68D471B4D1C000082A5C
+:1051A000A47086A00100C000522A7C00ECD640000A
+:1051B000B0381868FCD04000DC381B6807001B784A
+:1051C000F9007C00FCC65A7EDC7AD879986B002105
+:1051D00002A3B268946B002203A3AE68D2791B7855
+:1051E00079007C00DCD64000F8382B7809301B7839
+:1051F00079007800082A8478ACC08678E47884A0A6
+:105200000800C0000B3984A4000240000539F5C62F
+:10521000DDC65A7E1B7879007800082A206895C080
+:1052200022687810E242DDC6781018411B787800B9
+:105230007800082A002379001A391D391F392139CD
+:105240007810B22978001141D4D6C0005C39E479D5
+:10525000ACD140002F39EC7884A0030040002F39F6
+:105260002B7809309B786000AB78000084A6FBFFA8
+:105270005A78E479ACD140003F39EC7884A003003F
+:10528000C00058390120044F0420E4D0C000543934
+:105290002068C4D0400054397E0C587060200460EF
+:1052A0009DC00660086084A0FF000A607F0C01209A
+:1052B00014007800433484A1070079009239907A71
+:1052C00094A207009B786000A879FF814000903984
+:1052D0009B781000A87B84A30100C0008339A87BC1
+:1052E000A87B86A30100C00076390920F7FF78006B
+:1052F0007C3986A30300C00083390920EFFF7E0CB0
+:1053000058706020046004A106607F0C9B786000E8
+:10531000AB78000084A6FBFF5A782B78093020690F
+:105320008CA1FFFC226978005D43D930E3309C39C1
+:10533000A2399A399A395D435D437810B2292069C0
+:105340008CA1FFFC22697800634320698CA1FFFCDB
+:10535000226978005D43E47984A130004000B239CD
+:10536000EC7884A00300C000E639007086A0040039
+:10537000C000CC39647086A00200C000C239112080
+:105380000200192000007800652F647086A00600D6
+:105390004000BC39647086A004004000BC39007035
+:1053A00086A000004000082A206984A12004400053
+:1053B000DB39D4C1226918687800433418688EA09C
+:1053C00002004000E439FDC01A6801201400780092
+:1053D000433484A107007900EA395D435D43F23923
+:1053E0005D43A543A5435D435D43BCD64000343ACD
+:1053F0008471FF814000343A82A10D00D000013A4F
+:10540000877000007800063A82A10C00867009209F
+:105410000C009B786100AA797E157E137E1488703B
+:10542000148110A28A7280A00B0000AD982084B273
+:1054300000034000283A7E000120044F0420ECD0F5
+:105440007F004000243AA1202B0178002A3AA120B5
+:105450002B0278002A3AA1202B019B7800000881BA
+:10546000AC81A6537F147F137F1578006343D4D695
+:10547000C000883A206884D0400063438CA6600056
+:1054800084A660004000463A86A06000C000463A0C
+:10549000F5C194C15A79B6699B786000AB78000079
+:1054A0009B7861001868FDC01A68AA7808800C8192
+:1054B00040004F3E8CA1F800C0004F3E7E157E1389
+:1054C0007E147E0108328CA100034000743A7E00F5
+:1054D0000120044F0420ECD07F004000703AA1204E
+:1054E0002B017800763AA1202B027800763AA12091
+:1054F0002B017F019B7800000080AC8080AD0B0009
+:105500009820A6537F147F137F151468FCC0078072
+:105510008278780063431868FCD040008E3A1B689C
+:1055200008002068ADC02268781020411B78EA008E
+:105530007C0000237900993A9E3A763B9C3A781099
+:10554000B229D87CDC7DD07FFF82C000C73A0072D0
+:1055500086A2030040001034D471BCD1C000CA3A06
+:10556000B4D14000CA3A7E0D3B7800881B784C00CD
+:10557000BC706DA0B468A5C05A789468D678DE78FF
+:105580009868D278DA78B4C1D671037030007F0D94
+:105590007800CE3A00727800CE3A3B7800181B783B
+:1055A0004A0084A20F007900D23A613B103BDC3AFA
+:1055B0003F34DA3A613BDA3ADA3A7810B2291C68B9
+:1055C000ECD04000E33A08608DC00A60206985C1D4
+:1055D00022690068066005A0C000EC3A026008601D
+:1055E000D4C00A601C6884A00E00C000003B84B2D6
+:1055F00000034000FC3A0920C0957800053B0920D3
+:10560000D0967800053B3070BA684071CC7008A124
+:10561000042102680A2D5E71DCD6C000103BFCC676
+:10562000B66E7800613BB66E84A66000C0001A3B7F
+:1056300084A6FF7FB6687800613BDCD6C000283BBB
+:1056400084A6FF7FB6689468A6689868AA687810F0
+:10565000D6457800613BACD64000343B06A07810BC
+:10566000D64508241025AA69A66A7800443B082478
+:10567000102500271B80C8003B3B008084A03F0012
+:1056800008A191A20000AA69A66A7810D645FCD6A6
+:105690004000613B84A6FF7FB66810250824ACD685
+:1056A000C000593B00271B80C800543B008084A0E9
+:1056B0003F0008A191A20000986B002102A3B268EC
+:1056C000946B002203A3AE68007086A03000C00077
+:1056D0000C2A03700200BC706DA0BC684270B870E8
+:1056E00065A0C0685A70002D4E7080AD09004670EC
+:1056F0007C0086A50088C000833B03700000186012
+:1057000001801A60086084A0EFFB0A6078001141F4
+:105710004770000082A2060050008D3B7810B2292D
+:1057200000237900903B933BA53BB13B00227900DD
+:10573000963B9C3B11419E3B9C3BEB3B403C781095
+:10574000B229807A94A2000F7810CA3C78000741F1
+:105750007810C23B7900A93B1141AF3BAF3BEB3B1B
+:10576000AF3B11417810B2297810C23B7900B53BAC
+:10577000BD3BBB3BBB3BBD3BBB3BBD3B7810B229FC
+:1057800078102B411B7878007C00007086A0020006
+:10579000C000D33B7810363E7800CD3B7810D6451C
+:1057A000086084A0EFFB0A607800D83B007086A0F8
+:1057B00003004000CB3B0370050084B200034000AF
+:1057C000E23B0120E0967800E43B0120129768203C
+:1057D0004E7080AD0900467000227C00007086A0EB
+:1057E0000200C000FD3BD470B5C0D670002CBA706A
+:1057F000002DBE707800023C7810D6457800023C3F
+:10580000007086A003004000F93B03700100807A1D
+:1058100094A2000F9B781800A87C84A41F0015A2F6
+:105820006920C09584B20003C000163CFDC2692007
+:10583000D096042D082D5E716DA04000233C1468A5
+:1058400006A24000253C00687800173C7810CA3C4E
+:10585000B46E5A7E206984A1000C4000F43C647050
+:1058600086A00600C000373C747006A2C000373C1A
+:1058700066707E701B680500ADC1D4C122697810C6
+:1058800020417800F43C007286A20200C000523C25
+:10589000D470B5C0D670002CBA70002DBE707800E0
+:1058A000563C7810D6457800563C86A2030040004E
+:1058B0004E3C03700100807A94A2000F9B78180080
+:1058C000A87C84A41F0015A284B20003C000663C1B
+:1058D000FDC2A879A8798CA1FF001821CC7068A11D
+:1058E000042D082D5E716DA040007A3C146806A25C
+:1058F0004000A33C006878006E3C0370050084B251
+:1059000000034000843C0120E0967800863C0120A2
+:10591000129768204E707E15A920320003200000E7
+:105920000080F0008B3C7F1584B200034000983C5F
+:10593000FCC27800993CFDC2166A80AD0900467031
+:10594000B76800072368000827680300B46E206961
+:1059500084A1000C4000F43CDCD04000BF3C6470EB
+:1059600086A00400C000BB3C747006A2C000BB3C13
+:10597000787006A3C000BB3C66707E70781027412B
+:105980007800F43C1B680500ADC1D4C122697810D1
+:1059900020417F7000007800F43C0370050084B261
+:1059A00000034000D43C0120E0967800D63C012062
+:1059B000129768204E707E15A92032000320000047
+:1059C0000080F000DB3C7F1584B200034000E83C1F
+:1059D000FCC27800E93CFDC2166A80AD0900467041
+:1059E000B768000723680008276803007C00ECC63E
+:1059F000ACA660004000463D986B946CAC69B06802
+:105A000005A1C000213DD27BDA7BD67CDE7C86A559
+:105A1000600040004B3DF4D6C0000C3DEDC6B4A67E
+:105A2000FFB75A7E092079009CD64000193D092015
+:105A300078001920000020231A79ECD64000563D4A
+:105A400078103F497800563DB0681AA3002123A47E
+:105A5000002405A340004D3DD27BDA7BD67CDE7C62
+:105A6000B068F4D6C000323DEDC6F4C65A7E1120AF
+:105A700079009CD640003E3D11207800192000009E
+:105A800020231A7AECD64000563D781077497800EA
+:105A9000563D19200000202378004D3DB4A6FFB7E5
+:105AA0005A7E092079009CD64000553D0920780097
+:105AB0001A79C0685A70002D4E70C4686020D47185
+:105AC0000120014F0420C4D0C000AB3DD8702DA0F0
+:105AD0004000843DBCD140009E3D807A94A2000FDE
+:105AE000DC7006A24000753DE07804A5C000AB3D27
+:105AF000DA70BCC1D6717800AB3D312001002C8535
+:105B00004800833D3386108278007C3D7C00E07D38
+:105B100094A500FF4000913D112008002F857810CA
+:105B20007A3D37867800933D78107A3D17828078E9
+:105B300084A0000F06A24000AB3DDE72DA7678004A
+:105B4000AB3D807A94A2000FDC7036A240009B3DF2
+:105B5000E07834A540009B3DBDC1D671B4D1C000F2
+:105B6000082A002305A44000082AA47086A001008A
+:105B7000C000522A7C00206005A04000C63D018084
+:105B80002260086085A008000A600F7000012C7078
+:105B900026607C0006A07810D645007086A0020022
+:105BA0004000D43D647086A00500C000DE3D2B6837
+:105BB0000000176800001B680100236840001F6890
+:105BC0000001007084A00F007900E33D0C2AF33D32
+:105BD000ED3D153EFD3D0C2AEB3DEB3D7810B22925
+:105BE0007810203E7810193E7800F93D7810203E5C
+:105BF0005C706020006802607810732078000C2AC6
+:105C0000647067700000837000007900043E113EEC
+:105C1000113E0C3E0C3E0C3E113E0C3E113ED47724
+:105C2000DDC7D67779007E2F6770000078000C2AD8
+:105C30001B68000078001137006805A0C0001E3EF8
+:105C4000026006607C001064FF844000323E092040
+:105C5000024F042101800A2021841264C000323ED8
+:105C60002120044F0424A5C022200860A4C00A609B
+:105C70007C00186005A040003C3E01801A607C005A
+:105C80007810D3431B68180078007D3E7810D3430A
+:105C90001B68190078007D3E7810D3431B681A00FA
+:105CA00078007D3E7810D3431B68030078007D3E6A
+:105CB000747778104E4278718CA1FF00103294A254
+:105CC00000034000643EE8A1C0947800663EE8A16D
+:105CD000D095042D082D682005A0C0006F3E7E7071
+:105CE00078000C2A1468747206A24000773E00689F
+:105CF0007800673E00680A201B6805007F7000007E
+:105D00007810203E206884D0C000853E7810193E6F
+:105D10007810363E1F68000023682000781073203A
+:105D200078000C2A82A20300C0000741A87DACA520
+:105D3000FF005A7EA87EB4A6FF002069BDC122697B
+:105D4000C4D14000EA3EC4C12269B4A6FF004000AD
+:105D5000D73E82A60C004800AE3E4000AE3E312049
+:105D60000C00002586A00A004000B53E2B852B853F
+:105D70007810E0414000BD3E7810BC3F7800E03E26
+:105D800078109B417E0C6029046084A0F5FF0660BA
+:105D90007810F23F7F0C2069C5C12269587E95C6F4
+:105DA0005A7ED4D6C000D43E1B7864007C001B7899
+:105DB00078007C007E0C6029046084A0F5FF0660FA
+:105DC0007810F23F7F0C587ED4D6C000E73E1B7897
+:105DD00067007C001B7879007C007E0C5870602086
+:105DE0000061E4D14000333F0862178294A2FF00B3
+:105DF00082A20C004800FD3E4000FD3E11200C0038
+:105E0000002602A2C800023F3022086294A2FF00CE
+:105E10000120054F0420E4D0C000173FEC78E4D007
+:105E20004000173F82A20A00C8001D3F11200A004F
+:105E300078001D3F82A20C00C8001D3F11200C00FD
+:105E4000002202A5C800223F282278109F41002589
+:105E500086A00A0040002B3F2B852B857810E0415F
+:105E60004000333F7810BC3F7800373F78109B41AB
+:105E70007810F23F587895C05A787F0C1B787800DC
+:105E80007C007E0C60290060E4D0C000583FB4D094
+:105E9000C000523F106084A00F00C000523F046158
+:105EA0008CA1F5FF06617F0C7C00112032001920C7
+:105EB00000007800833FA068CCD0C000523F086249
+:105EC00094A2FF000120054F0420E4D0C000713FE0
+:105ED000EC78E4D04000713F82A20B00C800713F13
+:105EE00011200A007800773F82A20C00C800773F9B
+:105EF00011200C0008631F839CA3FF0082A30C00E9
+:105F00004800833F4000833F19200C00AB7801001C
+:105F1000AB780300AB780100AA7AAA7BC0A8050081
+:105F20002068C5C02268D470B4D040009F3FB4C080
+:105F3000D670B87065A0086084A0EFFB0A60186096
+:105F400001801A607F0C7C007E0C602904618CA1AA
+:105F5000F5FF066111203200192000007800AD3FE6
+:105F6000AB780100AB780300AB780100AA7AAA7B7A
+:105F7000C0A805002068C5C022687F0C7C007E0C8C
+:105F80005871602118208CA020004000C53FACC093
+:105F9000082084A0F0FF35A6867E18609A78AE7E31
+:105FA0001266A47884A0F0FF8CA10F0005A1F4C0B4
+:105FB0009CA320004000DB3F85A00040FCC0B4D083
+:105FC000C000E03FFDC0A67816608A78B4A60F0036
+:105FD00037860482048084A0FF0005A60E6004605A
+:105FE00084A0F5FF06607F0C7C007E0C587060205A
+:105FF00018609A78A47884A0F0FFA678126084785C
+:1060000084A0F0FF86780C6084A0FF000E607F0CF7
+:106010007C0082A20200C0000741A87A2069BDC1AD
+:106020002269CCD140004140CCC1226994A2FF003A
+:1060300082A20200C8000741781094407810F23F15
+:1060400080A901000C2078104A4278103E3FFF885A
+:10605000400037409B7860000028AA78587E95C69B
+:106060005A7ED4D6C00034401B7864007C001B7874
+:1060700078007C00587ED4D6C0003E401B78670074
+:106080007C001B7879007C0082A20200C800494095
+:1060900084A2010040005240587188A100000C21E8
+:1060A000ECD1C00052401120000078107C417810E3
+:1060B00094407810F23F587895C05A781B78780051
+:1060C0007C007E0C7E026029006011200100ECD073
+:1060D000C0007540BCD0C00073401460B4D0C00094
+:1060E0007340A4C1066106A0780091401120000011
+:1060F000AB780100AB780200AB780300AA7AC0A8A5
+:106100000400D470B4D040008D40B4C0D670B870D4
+:1061100065A0086084A0EFFB0A60186001801A6027
+:10612000206885A0000222687F027F0C7C007E0C24
+:1061300058706020FF8240009C4011204000186091
+:1061400080A002009A78A47884A0BFFF05A2FCC0BA
+:10615000B4D0C000A940FDC0A67816608A7804605B
+:10616000A4C006607F0C7C007E00007086A0030047
+:106170004000BA407F007800BD407F0078000441B5
+:10618000ACD640000441887884A04000400004411F
+:10619000B87B84A33F001B83C800CC40008005A0CF
+:1061A0004000E1401B83C800D54001804000014110
+:1061B000F4D64000E140B8781B80C800DD40008084
+:1061C00084A03F00C0000141F4C65A7ED879DC7A31
+:1061D0000120010008A1C800EC4091A20000D27982
+:1061E000DA79D67ADE7A7810444A1B78760084B25F
+:1061F00000034000FC40012000007800FE40012028
+:1062000001007810CE487C001B7876007C001B785B
+:1062100079007C0078102F411B7878007C00781082
+:1062200018411B7878007C00276802007810204114
+:106230001B7878007C0001200500780031410120A6
+:106240000C00780031412068D5C02268012006008A
+:106250007800314101200D00780031410120090012
+:1062600078003141012007009B787E00AA789DC606
+:106270005A7ED470B4D040004741B4C0D6707E0C72
+:10628000B87065A0086084A0EFFB0A601860018008
+:106290001A607F0C7C007E073F87BCA70F003B87FE
+:1062A0003B8703877E018CB2000340005841E0A089
+:1062B000C05378005A41E0A040547F01B8A72000A5
+:1062C0009A7FA47984A10F0040006A4184A1F0FF65
+:1062D000A678126004609DC00660388738879A7F70
+:1062E000A47984A1400040007A4184A1BFFFFDC091
+:1062F000A67816600460A5C006607F077C009B78C6
+:106300001000AB780100AB780200AB780300AA7AEA
+:106310009B786000AB780400D470B4D040009A4100
+:10632000B4C0D6707E0CB87065A0086084A0EFFB86
+:106330000A60186001801A607F0C7C003120000028
+:10634000292032009B781000AB780100AB78030065
+:10635000AB780100AA7DAA7E9B786000AB7805002F
+:10636000D470B4D04000BE41B4C0D6707E0CB870BA
+:1063700065A0086084A0EFFB0A60186001801A60C5
+:106380007F0C7C007E15078084A0FF0003800380C3
+:1063900080A020009A78A4798CA1F0FF21203342BC
+:1063A00019201100A9200E0011203200042484A01D
+:1063B000F0FF06A14000DE412084002310A2F0007F
+:1063C000D3417F157C007E150120054F0420E4D0C9
+:1063D000C000114221204142A920090011202800BB
+:1063E00082A5190040002742480027422084A99531
+:1063F0001120320082A53200400027424800274287
+:106400002084A99519200A0011206400002202A509
+:1064100040002742480027422084002310A2F000B9
+:1064200003427F15780025422120334219201100B4
+:10643000A9200E0011203200002202A540002742B0
+:10644000480027422084002310A2F00019427F1543
+:1064500006A07C007F1582A56400C8003042087841
+:1064600085A070000A78042405A07C00091202307F
+:106470000232034203440454045605660568067854
+:10648000067A070C070C070EE1100A330558055A67
+:10649000066A066C077C077E000E9B78100046A0FB
+:1064A0007C0084A7000F0B8084A71F00038003805B
+:1064B0000380038005A1FCD740005F42E0A0C074C8
+:1064C00078006142E0A0C0547C007E0E7E0F84D034
+:1064D00040006F42792000010920804F7120804FD9
+:1064E00078007F420920404F7120404F0120044F27
+:1064F0000420ECD040007D427920000178007F42EA
+:106500007920000291200080042184A00F007900EE
+:1065100086429042904290429042904290428E42F7
+:106520008E427810B229B469F5C18CA19FFFB6697B
+:1065300005A04000DF42587884A09FFF85A000603E
+:106540005A78287886A01418C000DF424B780400DF
+:10655000487884A00400C000A5424B780800487821
+:1065600084A00800C000AC423078BCD0C000DF423C
+:106570007E000120044F0420ECD07F004000C14287
+:1065800084B200037800C34284B200044000C942D0
+:106590001800DF427800CB422800DF42E47984A172
+:1065A00030004000DF42EC7884A003004000DF426E
+:1065B0001C68ACD0C000DD42781069437800DF422F
+:1065C0001B78F9007F0F7F0E7C007E0C0120014FAD
+:1065D0000420ACD0C0005B431468078084A00F0087
+:1065E0000380038003808CB200034000F842E0A0E7
+:1065F000C0537800FA42E0A04054046084A00A002E
+:10660000C0005B43086194A100FF40005B438CA184
+:10661000FF0001200A0006A14000264301200C00D3
+:1066200006A140002A430120120006A140002E438B
+:106630000120140006A1400032430120190006A1E8
+:10664000400036430120320006A140003A43780062
+:106650003E4309200C0078004043092012007800D6
+:1066600040430920140078004043092019007800B5
+:106670004043092020007800404309203F00780073
+:10668000404311200000002105A20A60046085A09B
+:10669000020006606120004F0460BCD040005B43F4
+:1066A0001468FCD0C0005643EA606120404F780077
+:1066B0005943EE606120804F1F600F807F0C7C008B
+:1066C0001B7879007C001B7878007C001B786700C1
+:1066D0007C001B7864007C000920194F0C2186A1E6
+:1066E000000040007B4386A1010040007E431F70F4
+:1066F0000B00677001001B7847007C001B78F000DE
+:106700007C001F700A007C000920194F0C2186A113
+:1067100000004000964386A10100400093431F7093
+:106720000B00677001001B7847007C001F700A0097
+:106730007C001B78EF007C001B78F9007C001B7844
+:10674000F8007C001B78C9007C001B78C8007C0026
+:106750001868FCD04000AB431B681D006770010047
+:106760001B7847007C00307884A0C000C000D24372
+:1067700008788CC00A780500050005000500EC7853
+:1067800084A02100C000CF430120054F0420E4D0A5
+:10679000C000CD43047884A01FFF85A0E0000678E8
+:1067A00006A07C0008788DC00A787C0008788DC02F
+:1067B0000A787C00307884A04000C000D7430120D4
+:1067C000044F0420ECD04000E64384B2000378007C
+:1067D000E84384B200044000EE439800F24378009E
+:1067E000F043A800F243AC787C00087884A0FDFF59
+:1067F0000A780500050005000500EC7884A021005A
+:10680000400015447E000120044F0420ECD07F009E
+:1068100040000B4484B2000378000D4484B20004AD
+:106820004000134498000F4478001544A800134416
+:10683000AC787E00087885A002000A787F007C0092
+:1068400084A70100C000B93784A7700040002D4420
+:106850007E0C602D682F78102629782D682C7F0CEF
+:1068600084A7080040003A444B780800EC7884A0E4
+:1068700003004000B93778005D4384A7040040005E
+:106880006944B87884A00140400069444B7808000E
+:10689000EC7884A003004000B937E47884A00700B6
+:1068A00086A00100C0006944C07885A60048302059
+:1068B0005A7E1B78F9007C004B7808001868FCD0E1
+:1068C000400066441B681500F4D6400066441B680F
+:1068D0000700781069437C001B680300587884A087
+:1068E000003F1E682F680000336800004B780800E6
+:1068F000EC7884A003004000AF307E000120044FFC
+:106900000420ECD07F004000864484B2000378006D
+:10691000884484B2000440008E441800082A78009D
+:1069200090442800082A78000C41146B078384A047
+:106930000F00038003800380FCD34000A04480A0AC
+:1069400040547800A24480A0C053602048205A7070
+:10695000602A7C00200020000000200000002000B1
+:1069600000002000000020000000200000002000A7
+:106970000000200000002000000020000000200097
+:106980000000200000002000000020000000200087
+:106990000000200000002000620009001400140024
+:1069A0004898140014001499FD98140014008000F5
+:1069B000FF0000010204082080F818000AA2140059
+:1069C0000B300CA21400002513000025100010004D
+:1069D0001000100010001000100010001000100037
+:1069E000100010001000100000A2063802715F8035
+:1069F00081943988C420640856A80830C1281B9D9A
+:106A000001A20C30472861816A840080A484561852
+:106A10003A8808A8E228CB9CF3A8640844A80C3064
+:106A200001A80830E128CB9C21201DA805A20C87D5
+:106A3000DED8A064E06DC06FA463806C120205A272
+:106A40003D8842792080A1A42B8814183B88DF80E0
+:106A5000A1942770F28537A732A503F07685778653
+:106A600016A83E8814A8012012A804A2C064E06DF4
+:106A7000A067C06F42792080A1A41418DF80A19480
+:106A80003B8823707685778602A861783E886B20E4
+:106A9000C1281B9D44200321A2208120C3A807A256
+:106AA00004090EA209A803A20080A48572189A877F
+:106AB0003C88E21F01F608A26E856F8661711400A2
+:106AC00004070830CB9C140002A20080A485093082
+:106AD000A884E21944F86E853F88E608F5A861F8B5
+:106AE000EAA801F8140081F81600B285F08032950A
+:106AF000A2FAE21D1400328521F21400E21DA884DE
+:106B0000E0D6E61F1400083000804A281110FCA8C7
+:106B10000830339D008000A002281110FDA8399D87
+:106B2000BDA80830339D3B281110FDA809A20271B1
+:106B30005F80819417000C3009A20080A485E21DBB
+:106B400009A2C1DA1400100201A81400E0263A8755
+:106B5000A3FAF219E026F21814000BA214000DA2F9
+:106B600006381002259D040706A265687E812A84E6
+:106B7000C11D2388160042600880FAA80080A48402
+:106B800060812A8421F00830A884D6114270DD206B
+:106B90001100D420228816004479218420A032A537
+:106BA000A184160044792184DFA03295A1841600C7
+:106BB00000007E12D47084A00046048090200472ED
+:106BC00008709CC005A2C00002460C72FF82400003
+:106BD000ED45FF8AC0000246007284D2C000024622
+:106BE0000478CCD04000F3457810CC4A23700000E4
+:106BF00027700000007084D04000FD45077004003D
+:106C0000037008007F1200207C00007084A0030045
+:106C100002709CC684D040005B4608710500087075
+:106C200006A1C0000A4684A1030040008C4684A14E
+:106C3000E001C0008C46F4D1C0000A4684A10030B7
+:106C400086A0001040000A460120054F0420E4D031
+:106C500040003746112080010C71118240004546EA
+:106C60000870F4D0C0000A460C7006A140002A4605
+:106C700078002746112080010C71118240004546A2
+:106C80000870F4D0C0000A460C7006A140003A46D5
+:106C90000770120008710500087006A1C000474681
+:106CA00084A1030040008C4694D140004746F4D1B3
+:106CB00040008C460770020078000A460871FCD13B
+:106CC000400066467810ED47FF8A4000DC457800BA
+:106CD0005B460C708CA0FF0340009146047084D08A
+:106CE00040008346147005A0C0007F4610701073EA
+:106CF00006A3C0007346002305A04000834602A1FE
+:106D0000C8005B460770100078008C46FF8A400080
+:106D100091467810F249C000864640005B467810E4
+:106D200038477F1200207C00047208719CC10381E7
+:106D3000C800A04607700200780091460370080062
+:106D40007F1200207C0005A2C0008C46237000004A
+:106D500027700000037008007E000120014F04200E
+:106D6000CCD04000B2467810CC4A7F007F12002081
+:106D70007C002864FF844000E246702C0470BCA0B4
+:106D80000F00B8A7F2463C27FB87C000D04648005A
+:106D9000C8467810B2299C6075A04000E246780091
+:106DA000BB463920E746042768AE086830A60C6861
+:106DB00029A521844000E2463887042705A0C000A9
+:106DC000D1469C7075A0C000BB467C000000050049
+:106DD00009000D001100150019001D00000003003E
+:106DE00009000F0015001B0000000000E746E44604
+:106DF0000000000000800000E7460000EF46EC467F
+:106E00000000000000000000EF460000EA46EA46ED
+:106E10000000000000800000EA460000F046F04656
+:106E20000000000000000000F0467920004F7120B3
+:106E3000100007700A00077002000370010010784C
+:106E4000ECD0400026470920010071202000780086
+:106E50002A47092002007120500007700A000770BD
+:106E600002000370000009814000374771202000B4
+:106E700078002A477C0004700480C800C14708716C
+:106E8000087006A1C0003C4784A1E00140004947CA
+:106E9000781030487800E947077012001920000088
+:106EA0000871087006A1C0004D4784A1E0014000B0
+:106EB0005A47781030487800E9471078ECD0400005
+:106EC00074470120FD04042086A00300C000784719
+:106ED00084A1004040007C4782A30300C8007C4797
+:106EE00084A1040040004D47188378004D47147872
+:106EF000ECD0C0007C4784A10040C0004D479CA15D
+:106F00000C3086A304204000994786A30800400067
+:106F1000A447047084D0C00095470871087006A18A
+:106F2000C0008A4784A1030040009547780030489C
+:106F300086A30C20C0004D47007204824800A4477D
+:106F40000C7384A3FF034000A4477810B229087192
+:106F5000087006A1C000A44784A1E0014000B14729
+:106F6000781030487800E94707701200007084D02C
+:106F7000C000C1471073147005A34000C1470C71D5
+:106F800084A1FF03C00038470871087006A1C00043
+:106F9000C14784A1E0014000CE4778103048780016
+:106FA000E947077012000770080004709CD0C00009
+:106FB000D2470871087006A1C000D64784A1E0013D
+:106FC0004000E347781030487800E9470770120026
+:106FD000087103814800D647037008007C000871DF
+:106FE00084A1E001C0003048087184A1E001C00024
+:106FF000304884A107007900FA4704481448024841
+:10700000144802487248024870487810B229047047
+:1070100084A010008DC00670FF8AC0000F48492070
+:1070200000007C007810F249C0000F487C0004701A
+:1070300084A010008DC00670047084D0C000284861
+:107040000871087006A1C0001D4884A1030040001B
+:10705000284878003048FF8A40002F487810F249CD
+:10706000C0002B487C00077012000871E000334814
+:1070700091200060E0003748912000600770120006
+:107080000770080004709CD0C0003F4807701200D1
+:107090000871FCD1C000434803700000007005A0D7
+:1070A000C0005748047005A0C00057480C7005A0E8
+:1070B0004000594878003B484920000084B2000154
+:1070C000400063480120000078006548012001006D
+:1070D000781062421B680200512000007C0078108A
+:1070E000B2297810B2297810B948107214710C7056
+:1070F0009CA0FF03002800A311A289A10000781022
+:10710000B9480427582C60AC0863002222A30C6302
+:1071100000211BA3002405A340009548C800954802
+:10712000128410820A8389A10000602B78007C48B9
+:10713000602B078A7E0004609CD04000A048BAA75C
+:10714000EC467800A248BAA7E4467F003DA7002C91
+:1071500086688A6F926C8E6B0871087006A1C000F9
+:10716000A94884A1E0014000B44878103048077075
+:107170001200781038477C00508A3987042704A011
+:10718000C000CD48006064A0C000C448602D046009
+:1071900084A00F0080A002473C20FB874010B2294A
+:1071A0007C007E127E0DD47084A000460480902066
+:1071B0007F0D8468602088688C6B906C5780D4AA9F
+:1071C000FF0084A0FF007E00046884A008007F0008
+:1071D0004000EB48B8A0EC467800ED48B8A0E44683
+:1071E00084B200014000F448207E7800F548247EF7
+:1071F000B5A60C001C68B4D04000FC4885C600242D
+:1072000005A340002549582C0427046160AC0060A8
+:1072100000A41A70046001A31E709CD1400015499F
+:10722000106081A000002270146081A00000267010
+:107230000862002402A212700C62002303A21670DE
+:10724000027607700100602B78101C4A78002749ED
+:107250007810F249C00025497F1200207C007E1280
+:107260007E0DD47084A00046048090207F0D0770AE
+:107270000400047094D0C0003649037008007F12E7
+:1072800000207C007E127E0DD47084A00046048015
+:107290007E0090207F007F0D207E84B20001C00020
+:1072A0004F49247EB5A60C001C68ACD0C0005A49DA
+:1072B00085C6037000000770040028685020602D08
+:1072C0000460BCA00F00B8A7F2463C27FB87C000B3
+:1072D000704948006A497810B2299C6865A040004E
+:1072E000744978005D497810F249C00070497F12F6
+:1072F00000207C007E127E007E017E0DD47084A072
+:10730000004604807E0090207F00207E84B2000131
+:10731000C0008849247E7F0D7F037F04B5A60C0042
+:107320001C68B4D04000964985C603700000077001
+:10733000040049207749286855A07E0D4000EE4999
+:10734000702D602E0470BCA00F00B8A7F2463C2739
+:10735000FB87C000B3494800AC497810B2299C7043
+:1073600075A060204000EE4978009F49042768AE70
+:10737000086822A40C681BA34800CC49518AC000AD
+:10738000C0497810B2293887042705A0C000B44945
+:107390009C7075A060204000EE4978009F492284CF
+:1073A00020841A8399A300000869002422A10C6993
+:1073B00000231BA1C800DB497810B22984B2000168
+:1073C0004000E9490120044F0420ECD0C000E94905
+:1073D000712050007800EB49712020007F0D78006B
+:1073E000FC487F0D7F1200207C0008707E0084A086
+:1073F000E0017F004000FB4906A07C0084A0030060
+:1074000086A00300C000024A7C00042778AC007804
+:107410001A7004781E70087812700C781670046068
+:107420009CD04000144A107822701478267002769E
+:10743000047084A0100085C006707920004F388742
+:10744000518A4000404A042705A0C000324A9C608F
+:1074500005A04000414A6020046084A00F0080A085
+:10746000F2463C20FB874010B22908707E0084A0C1
+:10747000E0017F0040003C4A06A07800414A84A019
+:10748000030086A003007C00512000007C007E12D7
+:107490007E007E0DD47084A00046048090207F0D75
+:1074A0007F08087184A10300C000594A286805A01C
+:1074B0004000694A780002460871FCD14000614AE8
+:1074C0007810ED4778004E4A077010000871FCD123
+:1074D0004000634A7810ED47087086A00800C0009D
+:1074E0004E4A007005A0C0004E4A037000004920BB
+:1074F00000007E000478CCD040007D4A7810CC4A51
+:107500007F007F1200207C007E127E147E137E1589
+:107510007E0C7E0DD47084A00046048090207F0DE8
+:107520004920814A80AD1100A02084B200014000B2
+:10753000A44A0120044F0420ECD04000A04A992026
+:1075400031007800A64A992032007800A64A992096
+:1075500031000C7084A0FF032A68077008000770D0
+:107560000200037001004000B54A0080AC80A553C2
+:107570000C7084A0FF034000C14A0770040004702F
+:1075800084A00400C000BC4A7F0C492000000370A6
+:1075900000007F157F137F147F1200207C00146889
+:1075A000FCD04000114B007084D04000114B247E71
+:1075B000B5A6040007700400047084A00400C00095
+:1075C000D94A18717E011C717E0120717E012471DF
+:1075D0007E010EA01A711F70FF3F22712671137079
+:1075E000040016710276077001000120FFFF0920D8
+:1075F00031000A200A200871087006A1C000F84A6C
+:10760000FCD14000F84A7F0226727F0222727F027C
+:107610001E727F021A7207700200087086A00800AE
+:107620004000114B780030480770040003700000E0
+:107630007C009120008091200060AC7805A0C00003
+:107640002D4B7479D07006A1C0002D4B1C7805A07D
+:1076500040002D4B1F78000068002D4B912080408A
+:10766000307801803278C000B54B347832781078A9
+:10767000ECD0C000AE4B6120C0746920804FFDC7C4
+:10768000D06805A04000474B0180D268C000474B3E
+:107690007810834D006884A00F0040005C4B86A0EA
+:1076A000010040005C4B44680DA040005C4B04218D
+:1076B00005A040005C4B01800A204000F64C146895
+:1076C00005A04000814B01801668C000814BA7686F
+:1076D00001007E0FFCD7C000764B1078ECD0400044
+:1076E000724B792000017800784B792000027800F5
+:1076F000784B792000017810D3437F0F646805A090
+:107700004000814B78106F26806805A040008E4BAA
+:1077100001808268C0008E4B67680000D468DDC0BD
+:10772000D668D468FCD04000AB4BFCC0D668A9201A
+:107730000002346005A04000A74B01803660D46889
+:10774000FDC0D668C000A74B106005A04000A74B45
+:1077500078106F26E0AC1000F000964BFCD740008C
+:10776000B54B6120C0546920404FFCC778003D4BA9
+:107770007810F14B387801803A78C000D74B3C78CC
+:107780003A786120C0546920404FFCC70C6805A0BE
+:107790004000C94B78105B4CFCD7C000D74B107829
+:1077A000ECD0C000D74B6120C0746920804FFDC76A
+:1077B0007800C34B1478E4D0C000DB4B1078CCD0F9
+:1077C0004000EE4BACD0C000E74BA4D04000EE4BE5
+:1077D000ADC01278912001806800ED4B7810DC2359
+:1077E0007C00912001807C00407801804278C000BC
+:1077F0005A4C447842786920404FFCC71078792071
+:107800000002ECD04000034C79200001D86805A0AC
+:1078100040000F4CE07D04A5C0000F4CDA68D4682E
+:10782000BCC0D6687920004F106805A0C000174C76
+:107830000120010101801268FCD74000204C80A08B
+:10784000D0957800224C80A0C0944020042065A0F0
+:1078500040004C4C246005A04000484C018026604C
+:10786000C000484C006805A040003B4C4C6806AC8A
+:10787000C0003B4C7810F64C78004C4C646805A076
+:107880004000434C276001007800484C7810A94C18
+:1078900004287800244C0060402C7800244CFCD74D
+:1078A000C0005A4C1078ECD0C0005A4C6920804F70
+:1078B000FDC7792000017800034C7C0009200000FE
+:1078C000A920000208609CD04000954C246005A0CF
+:1078D00040006B4C018026607800934C08609CC08F
+:1078E00084D0C000734CACD040008D4C0A60046062
+:1078F00005A04000954C7E0D7E0C7E016820106036
+:10790000018012607810193E002D682C60207810DC
+:10791000A21E781064207F017F0C7F0D7800954CAB
+:10792000BDC00A608DA101007800954C8DA10001B9
+:10793000E0AC1000F0005F4C84A101004000A44CBA
+:107940008CA1FEFF0E6978106F267800A54C0E6999
+:107950007C00C000A54C6C78002C7E681467766FA4
+:10796000176000002B6000001B600600B46084A05C
+:10797000003F1E60206084A0FF0085A060002260A0
+:107980000060422078102B1E186805A04000C74CEC
+:1079900001801A680868A4C00A681068087909811B
+:1079A0000A790180D000D34C7810B2291268C00047
+:1079B000D94C1079A5C112792F6000003360000006
+:1079C000682C78107320FCD7C000E74C6920404F2A
+:1079D0007800E94C6920804F106984A100010120E2
+:1079E0000600C000F34C7A69012004007810632679
+:1079F0007C007E0D4C696021FCD7C000084D1078DA
+:107A0000ECD04000044D6920000178000A4D692047
+:107A1000000278000A4D69200001781026291B60B9
+:107A20000600586884A0003F1E60206084A0FF000C
+:107A300085A0480022602F600000336000000868C5
+:107A400084A0FDFF0A683068B4D040003C4D4B680C
+:107A50000400A9201400486894D040002E4DF00086
+:107A6000284D4B680900A9201400486884D04000C4
+:107A7000384DF000324DA920FA00F0003A4D1B6855
+:107A800047007F0D676807007C007920004F781061
+:107A9000764D78105C4D7810694D09200200692000
+:107AA000804F0F680000136800001768000009810C
+:107AB00040005B4D6920404F78004E4D7C001078AF
+:107AC000ECD04000644D1920CC007800664D1920A0
+:107AD0007B003A7B3E7B7C001478E4D0C000714D83
+:107AE000192040007800734D19202600427B467B08
+:107AF0007C001478E4D0C0007E4D1920943F7800BB
+:107B0000804D19202426327B367B7C00506A85A26A
+:107B100000004000AF4D5469C06B00A37E0C64218F
+:107B20000463FF83C0009B4D118240009F4D08817C
+:107B30001AA148008C4DC06978008C4DD3680A00AA
+:107B40007F0C7C005069C06A64222B6000002F60AB
+:107B500000000860B5C00A6010820981C000A14D14
+:107B600052697F0C7C00E000B04D91200060E00085
+:107B7000B44D91200060EC70DCD0C000C14DD4D079
+:107B80004000EA4D7800ED4D08201078ECD0400020
+:107B9000D44DC4D1C0000E4E1478C5C016781078EC
+:107BA000F5C01278ECD040000A4E7800064E8EAE3A
+:107BB00000014000E14D1478F5C0C5C01678D4D05E
+:107BC000C0000A4E7800064E1478FDC0C5C0167875
+:107BD000D4D0C0000A4E7800064EE4D040000C4ECF
+:107BE000E000ED4D9120006009200C00E000F34D15
+:107BF000912000600981C000F34DE47084A0FF0172
+:107C000086A0FF01C000044EEC707800C14D7810D2
+:107C10000F4E04788CD040000C4E1F680C00A070F2
+:107C2000A2707C001079ECD14000194E1478C4C0C9
+:107C3000F4C1127978002B4E8EAE00014000254E23
+:107C40001478F4C0FCD0C0002B4EC4C078002B4E7A
+:107C50001478FCC0F4D0C0002B4EC4C016787C0051
+:027C6000E3142B
+:00000001FF
+/*****************************************************************************
+ *                  QLOGIC LINUX SOFTWARE
+ *
+ * QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x
+ * Copyright (C) 2001 Qlogic Corporation (www.qlogic.com)
+ *
+ *****************************************************************************/
+
+/************************************************************************
+ *              --- ISP1240/1080/1280 Initiator Firmware ---           *
+ *                           32 LUN Support                            *
+ ************************************************************************/
+
+/*
+ *     Firmware Version 8.15.11 (10:20 Jan 02, 2002)
+ */
diff --git a/firmware/qlogic/isp1000.bin.ihex b/firmware/qlogic/isp1000.bin.ihex
new file mode 100644 (file)
index 0000000..a5c242c
--- /dev/null
@@ -0,0 +1,1158 @@
+:1000000078003010000019240000FF124320504FE8
+:10001000525947495448312039392C313931323914
+:10002000312C39392C333931343951204F4C49472F
+:1000300020434F435052524F54414F49004E4920A4
+:1000400050533031303046207269776D72612065CF
+:100050005620726569736E6F30202E313133202047
+:10006000B9201212C120080071201000C3700400D2
+:10007000C920FF3F8920C810C7705349CB7020505A
+:10008000CF702020D3700100003FD67031203000A7
+:100090007920003563780000A02F09202703112064
+:1000A0000000A9204000A4420981C00051109B78A3
+:1000B00001010B7802000F7802004F78B80B69201D
+:1000C0004035A8006A101B683C0009201313B821B2
+:1000D00078006C101B682800076807000B68FA009E
+:1000E0000F680800136805001F68000023680600F9
+:1000F00017680800276800006920003611202000DA
+:10010000092010000B68190C0F681900036800DD46
+:1001100007681A001A6A002DE8A0080090A20400DF
+:100120000981C000821069208036A92080003768CC
+:1001300000000B684000176800011F686400E8AD0C
+:1001400010007000A510780097107810381A7810F9
+:100150003A2F781081167810BA33003285A00D003E
+:100160009020C37000009000BC10C07086A00200F8
+:10017000C000BC107810BA117810EC107810171865
+:100180007810A81978107D3278107D177800BC108F
+:10019000D010D210C31BC31B982F982FC31BC31B97
+:1001A0007800D0107800D2107800D4107800D610E3
+:1001B00008700C80C800E710077002008CA00C00CB
+:1001C000C000E81004800480C800E7107A087A09AB
+:1001D000C37002407800BD11147805A0C000F4106F
+:1001E0001000301178002F1109206835042105A076
+:1001F000C0002F11147886A00100C00001117810F2
+:1002000036151778000009206F35042165A04000DD
+:100210001D1109206A351C2108811421088104213F
+:1002200010A299A3000009201C008360030178102C
+:100230001116C00029117810781609206F350B208F
+:1002400000000920693504210B20000005A04000B2
+:100250002D11012005407800BC117800BA117C00F6
+:1002600061200000186084A00100400038117C006B
+:10027000C3700000C7700000CB700000CF7000009A
+:10028000C070BCA0C0FFC0008811382079004811A0
+:10029000BA110512D311051256125612CA11901531
+:1002A0006112C611D711D911DB11DD119515C611D7
+:1002B0006712831244158A15DF116B148D14A7146D
+:1002C000D0142414321446145A14EF12C6119F127B
+:1002D000A612AB12B012B612BB12C012C512CA12CD
+:1002E000CE12E312C611C611C611C611C611FB12F9
+:1002F00004131313391343134A1370137F138E130C
+:10030000A0130914C611C611C611C611C6111914BD
+:10031000BCA0A0FFC000C611382084A01F00790037
+:100320009111C611C611C611C611C611C611C6114A
+:10033000C611C611C611C611C611C611C611C61105
+:10034000C611C611C611C611C611C611C611C611F5
+:10035000C611C611C611ED15F715FB150916C61104
+:10036000C611CA72C671012006407800BC11CE7356
+:10037000CA72C67101200040C270612000001B607B
+:10038000010091200050912080407C00C37001400A
+:100390007800BD1199204100A1204100A92005004D
+:1003A000A3537800BA11C470C37004007A007800B7
+:1003B000BA117800BA117800BA117800BA119120F8
+:1003C0000080C3700000C7705349CB702050CF70BD
+:1003D0002020D3700100003FD670792000001B78E8
+:1003E00001003120300059200010292057045120ED
+:1003F000700461207204B920FFFFC1200000912029
+:1004000000509120804078005504D071C872CC73A0
+:10041000C470A020982031203000FF814000BA1124
+:10042000077004001A731E72512012004920341202
+:100430004120BA110370020086A70100C0002612F5
+:100440004920421241204E12037003001770000031
+:100450000B811271C8002E12177001000770010085
+:1004600086A70100400042120C7084A07F00048027
+:100470000920200002A142094A09A820A026A6536B
+:100480007800D8100C7084A07F0040004212AC802D
+:10049000480042129826A5537800D8100C7084A00A
+:1004A0007F00AC809826A5537800BA11C471C8703B
+:1004B00014219EA70400C0005E120A20CA727800B0
+:1004C000B911C7700100CB701F007800BA11C47059
+:1004D000C872CC73D074C670CA72CE73D27405A0C1
+:1004E00040007D12018072787A7A7E7B767C9878E3
+:1004F00084A0FCFF9A7878008112987885A001008A
+:100500009A787800BA11C470C872CC73D474C6706B
+:10051000CA72CE73D67405A0400099120180867805
+:100520008E7A927B8A7C987884A0FFFC9A787800F7
+:100530009D12987885A000019A787800BA11092058
+:1005400059350C21112010047800B81109204135CB
+:100550000C217800B911092042350C217800B9111D
+:10056000612040350C6110627800B81109204535D2
+:100570000C217800B911092046350C217800B911F9
+:10058000092047350C217800B911092048350C2184
+:100590007800B91108790C7A7800B811C471078114
+:1005A00084A00F00038003800380E8A00036006A67
+:1005B000046884A008004000E012086B7800E11293
+:1005C0000C6B7800B711C4777810921691200080D8
+:1005D0001C6B146A9120018008277800B711C4773A
+:1005E00078109216912000800869186A106B91208B
+:1005F00001807800B711C47182A11000C800B21147
+:100600007810BC1A7800B711C47182A11000C8001C
+:10061000B2111120413504227E0012217810751A82
+:100620007F017800B911C47111203113A92008008D
+:10063000042206A1400023131082700021137800C9
+:1006400018137800B21192A231137E0211204235A4
+:10065000042212217F017E007810811A7F01780028
+:10066000B911E803FA00F401EE0264001900320047
+:100670004B00612040350C611062C4700E60C87080
+:1006800012607800B811612040351461C4701660A2
+:100690007800B911C471112004001920121286A12A
+:1006A000280040006313112005001920121286A1B2
+:1006B000320040006313112006001920131386A195
+:1006C0003C00C000B2116120403518607E001A6104
+:1006D000B8237810921A7810BA337F017800B911D4
+:1006E000C47184A1CFFFC000B2111120473504228C
+:1006F00012217E007810B41A7F017800B911C471FC
+:1007000082A11000C800B2111120483504227E00D9
+:1007100012217810A31A7F017800B911C471C87230
+:1007200084A1FDFFC000B11184A2FDFFC000B11182
+:10073000002108790A7800220C7A0E787800B81126
+:10074000C471078184A00F00038003800380E8A0A8
+:10075000003619200000C87200687E0026A2400002
+:10076000CF13026A84A400204000B8139DA3100098
+:1007700084A400104000BE139DA3080084A4004080
+:100780004000CF130F8184A200404000CB137810AB
+:10079000D61A7800CF137810C81A7800CF13CC720D
+:1007A000FF8240000114086806A240000114A4A2C0
+:1007B000FF0061204035186186A128004000E81341
+:1007C00086A132004000EE1386A13C004000F413E5
+:1007D00082A464004800FE137800F81382A450003D
+:1007E0004800FE137800F81382A443004800FE136B
+:1007F000C471C6717F02CA727800B3110A6A9DA3E0
+:100800000A00046805A306687F020C6BC4717800B7
+:10081000B711C4777810921691200080146A1C6B6F
+:1008200091200180C8701668CC701E680827780077
+:10083000B711C471C872CC7382A11000C800B21184
+:100840007810E41A7800B711C477781092169120C6
+:100850000080086A95A202000A6A91200180082798
+:100860007800B811C4777810921691200080086A39
+:1008700094A2F9FF0A6A046805A0400041147810A8
+:10088000191A9120018008277800B811C4777810D0
+:10089000921691200080086A95A204000A6A0468F2
+:1008A00005A0400055147810191A912001800827DE
+:1008B0007800B811C477412001004920050051207B
+:1008C00020009120008078109F1691200180082739
+:1008D000086A7800B811C477C872CC73C677CA7238
+:1008E000CE7378101817C0008914186805A040004E
+:1008F000831408277810F41AC00083141778FFFFB8
+:10090000912001807C009120018001200540780029
+:10091000BC11912001807800BA11C477C6774120BC
+:1009200021004920050051202000912000807810EE
+:100930009F1661204035A3600300B667A7600000E2
+:100940001778FFFF912001807810191A7C00C87772
+:10095000CA77C477C677BCA700FF912000806120CA
+:100960004035A3600200A7600000B6671778FFFF5C
+:100970007810191A9120018041202100492004009B
+:10098000512010009120008078109F16C8703668A2
+:10099000388784A70700C000C414912001807C0020
+:1009A000987884A00300C000F4143920000041208E
+:1009B000210049200400512008007810921691204F
+:1009C000008008680DA80A6991200180388784A7F3
+:1009D0000700C000DD14BCA700FF3F8738873F87B2
+:1009E00084A7000FC000DD14912000806920000161
+:1009F000306884A0400040001D154B680400A92009
+:100A00001400486884A0040040000A1570000A150C
+:100A1000780001154B680900A9201400486884A0DB
+:100A20000100400017157000171578000E15A92059
+:100A3000FA0070001D157800191579200035177817
+:100A4000010061204035A3600100A7600000C36081
+:100A50000F00987885A002009A78086884A0FDFFAE
+:100A60000A681B684600912001807C00987884A069
+:100A7000FDFF9A7884A00100C0004015781060172F
+:100A8000C471C6714A797C00C474C873CC72C674D0
+:100A9000CA73CE72792000350920400078106F1695
+:100AA0004000861578103F1640005A1578107816C9
+:100AB000780086151060912001801778FFFF0920CB
+:100AC00068350B20050008810B20000008810A23EF
+:100AD00008810A2208810A2408810A2008810B2043
+:100AE000000008810A2C2EA030257E0E7810132FCE
+:100AF0007F0E9265A2659666A666AB600000AF6049
+:100B00000000912001807810191A7C00C370054004
+:100B10007800BD11C471C770000006797800BA1161
+:100B2000C471C671682178009715692000100C699E
+:100B300016A0042D10A2688D0981C000991585A208
+:100B40000000C000A715C37000407800A915C3704D
+:100B50000340CA707800BD11C471C872CC73002103
+:100B600084A1FCFFC000C61100217900B715CE1585
+:100B7000E315E515E715C3700340CE71D272D67345
+:100B80007800CA15C3700040CF700000D370000019
+:100B9000D7700000C677CA717800BA113120E91504
+:100BA000242630861224042246A4C000BB1584A447
+:100BB000FFFFC000D0153120E9151082198384A3EE
+:100BC000FFFFC000D0157800C2157800C21578006C
+:100BD000C2155555AAAAFFFF00006079C671C471FD
+:100BE00082A10300C800B21162797800BA1160795D
+:100BF000C6717800BA115479C671C47156795879A2
+:100C0000CA71C8715A795C79CE71CC715E797800FD
+:100C1000BA115479C6715879CA715C79CE7178006D
+:100C2000BA110C7084A07F0040001D1607700400EC
+:100C3000047084A00400C000181617700000127120
+:100C40001A721E7308810C81A981988CA120300032
+:100C50008060A220A6530C7885A000000270077067
+:100C6000010008710481C80031160770020084A1D8
+:100C70000C000C7184A10003037000007C000C7058
+:100C800084A07F0040004B1607700400047084A00D
+:100C90000400C00046161770000012711A721E730D
+:100CA000992030000881AC810C7885A00100027089
+:100CB0000770010008700C80C8005A160770020007
+:100CC0008CA00C00C0006C160C7184A10003C00045
+:100CD0006C16A02CA55306A0037000007C00507871
+:100CE00065A040007716042C5278632000007C0039
+:100CF0007E0F7920003550786220002C52787F0FCB
+:100D00007C0011200040527A192010041983400001
+:100D10008F1680A22F001220102078008616132034
+:100D200000007C0084A7000F0C8084A707000380CC
+:100D300003800380038005A1E8A080367C00781042
+:100D4000921600292A68002A2E68086884A0EFFFFE
+:100D50000DA80A6909204F350C21046805A0400040
+:100D6000BC1616A1C000BC166020006006687E019B
+:100D70000B2000007800BF16092000007E010468E7
+:100D800065A04000CE16006006687810DF16781067
+:100D9000CB17106801801268C000BF167F0102697E
+:100DA00006697C0065A04000DE1698609B6000002C
+:100DB00008207810781600217800D2167C00036095
+:100DC0000301A9201C0080AC0400A0200120000029
+:100DD000A440286816602C681E607C007E0E71207E
+:100DE000403540708CA08000C000FC1688A0803583
+:100DF0000A2D0080427006A07F0E7C007E0E7120BE
+:100E00004035092080354072218211824800161732
+:100E10000421088106ADC000051719811E21088133
+:100E200018831182C8000E17427406A07F0E7C0042
+:100E3000781092169120008004681E7865A040000A
+:100E40005F1778002917002C1E78006065A040000D
+:100E50005F170C6006A3C0002317086006A2C0003D
+:100E60002317282C01204F35042006AC40005F17C3
+:100E7000046806ACC000461700606020066805A044
+:100E8000C0004617036800007800501700641C7803
+:100E90006020026486A40000C0005017002C026885
+:100EA00060257810DF16176005001F60200078109D
+:100EB000CB171068018012680120FFFF05A07C009D
+:100EC0003920000041202100492004005120080061
+:100ED0009120008078109F16388784A70700C000F3
+:100EE0006A17BCA700FF3F8738873F8784A7000F9A
+:100EF000C0006A17912001807C006120000018600A
+:100F000084A00100C0008A17AC78AF78000005A06B
+:100F1000C0008B177C008CA0F0FF40009117781068
+:100F2000A51B79009317A317A517AB17AF17A31726
+:100F3000B317A317A317A317A317B917BD17A317A1
+:100F4000A317A317A3177810A51B7810601701200B
+:100F500001807800C317012003807800C3170120A7
+:100F600004807800C317781060170120068078008D
+:100F7000C31701200C807800C31778106017012078
+:100F80000D807800C317C270612000001B60010053
+:100F9000912080407C00042C8260082C632000009B
+:100FA000647800806678687805A06A794000DB176D
+:100FB000022C7800DC176E797C007E0C61200035F5
+:100FC00083680301082D6B20000064600080666068
+:100FD000686005A06A614000F017022D7800F117E3
+:100FE0006E617F0C7C0078100418400003187E0CA2
+:100FF000986065A04000FE177810D2167F0C9B60A9
+:101000000000781078167C006C7865A040001618F7
+:1010100091200080647801806678042C6E7805A0A9
+:10102000C00014186A780080912001807C009878B4
+:1010300005A0C00065187479D07005000500D07255
+:1010400006A2C0001C18002206A1C00033180478B4
+:1010500005A0400065180778000068006518912019
+:1010600080407800651878106F16400065187C7A0B
+:10107000787B07810480048010A299A300000920D6
+:10108000400078103F1640005C1878107816807881
+:101090000080827886A00200C00065189120008040
+:1010A000AF78020083780000987885A003009A78D2
+:1010B00091200180780065188378000078109219DB
+:1010C000006084A00700790066187C006E187D1807
+:1010D0009D186E18AF186E186E186E18392000041F
+:1010E000A87805A7AA78046005A706607810ED180F
+:1010F0001860A67878107A197C00A87884A000017E
+:101100004000841878006E18AB78000000600780FB
+:1011100084A0FF009E7801809B60000040009A1828
+:101120007810ED1840009A18A87885A00001AA78D8
+:1011300078009C18781011197C00A8788CA0000EFB
+:10114000C000A61884A00001C000A81878006E187E
+:101150007810ED18C000AE18781011197C00A8782E
+:1011600084A000014000B61878006E18AB7800002B
+:101170001067A9200100146084A0FF0005A04000B2
+:10118000D318BCA700FFA92008008EA001004000D2
+:10119000D31839200000A92080008EA00200400052
+:1011A000D3187800EA1878109216002D912000804C
+:1011B0002B6800002F680000086884A0DEFF0A6822
+:1011C000002D80A010006820912001807000EA1896
+:1011D0007800D618781078167C00A0786DA0C00032
+:1011E000F818002CA278A6789B60000078000419FB
+:1011F000002C9A689B600000A278002D0260A47801
+:1012000006ADC000041902609C7801809E78C00081
+:101210001019A87884A00000AA78A478602006A0FD
+:101220007C002EA03025186184A160009E614000E2
+:101230001D197E0E7810132F7F0E9265A26596669B
+:10124000A666AB600000AF600000106778109216D1
+:1012500091200080086884A0010040003F1991207F
+:1012600001807810DF16912000807810CB17912034
+:101270000180A3780000A778000078007919206029
+:1012800096A00100C000461900802260106A146810
+:101290009120018002A248005519400055193920BB
+:1012A000000278107A1978007919082C91200080B2
+:1012B000006865A040005D1902610269C000611903
+:1012C00006696021036000001068008012689120A8
+:1012D000018008688CA040004000731986A040007F
+:1012E0000A687810EE167810191AA7780000A3780B
+:1012F00000007C00046005A7066091200080781043
+:10130000CB1791200180A47865A040008D199860CA
+:10131000A6789B60000078007D19A3780000A7786C
+:1013200000007C007079747800800AA1C8009919C7
+:1013300006A07678D270047805A04000A719018035
+:101340000678C000A7196800A719912080407C008A
+:101350006800C219292000006C7865A04000BD1902
+:101360007810C3194000BD197E057810D9197F0582
+:10137000C000BD1928857800AC19FF854000C2194E
+:10138000912080407C00847B8879D4720500050020
+:10139000D47006A2C000C519002202A1C000D31952
+:1013A000002305A07C004800D71902A37C0002801E
+:1013B0007C0078100B1A09201C00246005A0400056
+:1013C000E31909204000781011164000FC199478A8
+:1013D0000080967886A00200C0000A1A9120008042
+:1013E000AF78030097780000987885A000039A787A
+:1013F0009120018078000A1A977800007810F3177E
+:101400008479887800800AA1C800071A06A08A7823
+:10141000D67006A07C00078104800480907A8C7BC3
+:1014200010A299A300007C0009206835912000805B
+:101430000A207E0F7920000109204035912000808C
+:10144000042186A00000C000341A092012350421AE
+:1014500005A0C000341A307884A0C000C000341A3F
+:101460001800341A1B784400912001807F0F7C0003
+:101470007E1291200023712040357920000119202F
+:10148000D82DA1202B01042305A04000501A9A78E2
+:101490001883AC2318839823A65318337800431A73
+:1014A0009B782000A9201000AF780000AF782002C0
+:1014B00070005C1A7800541A0370000078105B1BEF
+:1014C000047084A00F0085A0806206780F780092D7
+:1014D0004378D800537880000B78380047707F3508
+:1014E000437000007F1200207C008CA10F001120AF
+:1014F0000101042284A0F0FF05A1122078105B1BDB
+:101500007C0011200101A92009000B8170008A1ABA
+:101510007800851A8CA1000E042284A0FFF105A199
+:1015200012207C0009200101A9200500138270000F
+:101530009B1A7800961A94A2E000042184A01FFF51
+:1015400005A20A207C0011200101A9200C000B81BA
+:101550007000AC1A7800A71A8CA100F0042284A0B5
+:10156000FF0F05A112207C0011200201042284A09B
+:10157000CFFF05A112207C000381038080A0200002
+:101580007E0C612000019A60AC62AC637F0C7C0031
+:101590000381038080A022007E0C612000019A60FC
+:1015A000A46084A0DFFFAE607F0C7C000381038019
+:1015B00080A022007E0C612000019A60A46085A0BA
+:1015C0002000AE607F0C7C000381038080A020009F
+:1015D0007E0C612000019A60A460AE621020A460BD
+:1015E000AE6318207F0C7C00912000807E0C7E0E64
+:1015F000186805A04000391B6120803F7810411B0E
+:101600004000271BA92000006120803E7E0C78103E
+:10161000411B4000131B7F0C608C7000111B780075
+:10162000061B7800391B7F0082A0803E7120403568
+:10163000BA701C6085A000081E60B671A76000002B
+:1016400001200400A2707810141A7800351B712054
+:1016500040351C6085A000081E60B671A7600000C0
+:1016600001200600A2707810141A012000007800F2
+:101670003B1B012001009120018005A07F0E7F0C03
+:101680007C00042C05A04000581B60200C6006A3C1
+:10169000C000551B086006A2C000551B106006A1C3
+:1016A000C000551B06A078005A1B00607800421B42
+:1016B00085A001007C00112041350C228CA10F0077
+:1016C00011203B01042284A0000140006A1B21205C
+:1016D00080FF22217C007E0EE4688CA02000400068
+:1016E000A31B84A00600C000A31B1060078084A079
+:1016F0000F00038003800380F0A00036047084A0F4
+:101700000A00C000A31B087194A100FF4000A31BA6
+:101710008CA1FF000120190006A14000961B0120AA
+:10172000320006A140009A1B78009E1B0920200071
+:101730007800A01B09203F007800A01B11200000AA
+:10174000002105A20A707F0E7C006800A51B7E00A8
+:1017500071200000187084A00100C000AA1B7F0047
+:10176000082E71201000CA707F00C670C3700280FE
+:10177000712000001B700100912080407F007020CC
+:101780007F007800C11B7E107E007E129120002316
+:101790003C7F587E307C387D94A53F0084A4004077
+:1017A0004000D81B84A77C00C0009C2D7810A51B8E
+:1017B0009CA40F0082A304005000E01B7810A51B1E
+:1017C000078584A00F007900E51BEA1F9A20C0203E
+:1017D000E6226B25B325EA256526BF2644270B1C88
+:1017E000F51B531E1D1F4A25F51B7810A51B18005D
+:1017F000C81B7F12912001807F007F107C00037046
+:1018000000003F700000307005A04000091C3370DC
+:1018100000001800C81B5C7005A0C000B61CA070BA
+:1018200084A007007900141CD61C1C1C2A1C4B1C0D
+:10183000711C9D1C9B1C1C1C087884A0FDFF0A7851
+:101840000920460078101224C000281C03700400F0
+:101850007800F71B78105E2DC000491CB47007801B
+:101860009B787E00AA789B781000AB780C009B7860
+:101870006000AB7801005B7804000920F700781065
+:101880001024C000491C03700400C3700F003370A3
+:1018900070357800F71B78105E2DC0006F1CB47196
+:1018A00007819B787E00AA789B7810008CA10700A6
+:1018B0008DA1C000AA79AB7806009B786000AB7858
+:1018C00002005B7804000920F70078101024C000A3
+:1018D0006F1C03700400C3700F0033707035780004
+:1018E000F71B78105E2DC000991CB47107819B789E
+:1018F0007E00AA789B7810008CA107008DA1C00003
+:10190000AA79AB782000B871AA79AB780D009B78E2
+:101910006000AB7804005B7804000920F7007810C1
+:101920001024C000991C03700400C3700F003370B2
+:1019300070357800F71B78004B1C78105E2DC000C6
+:10194000F71BBC7068209B781000106F7810A12CDA
+:10195000502C106884A0070085A08000AA78186E1B
+:1019600041200100012004007800DE1D78105E2D6A
+:10197000C000F71B9B7810005C706820106F781017
+:10198000A12C502C086085A010000A60106884A06B
+:10199000070085A08000AA783120200041200100A6
+:1019A0007810C52D012003007800C91D1800C81B40
+:1019B000407485A400004000F01C80A080353020D9
+:1019C000447108812AA14800E71C09208035642160
+:1019D0000465FF85C000FD1C2184C000E11C467128
+:1019E000037000003F7000007800F71B4076B0A63F
+:1019F0008035447100267800EC1C46716825582516
+:101A00003E75502C346085A00000C000FA1C0867A9
+:101A1000367784A73F0140002F1D84A72100C00016
+:101A2000FA1C84A7020040001C1D84A7040040008B
+:101A3000FA1CBCA7FBFF0A6784A70800C000FA1CB9
+:101A400084A71000C000FA1C84A7000140002F1DCD
+:101A5000186005A0C000FA1CBCA7FFFE0A671F683B
+:101A60000000186E84A60E00186140003F1D1C6027
+:101A700002A14800421D4000421D7800F61CFF8173
+:101A8000C000F61C84A78000C000481D0C702260B6
+:101A9000BCA77FFF0A67106B078384A00F00038039
+:101AA0000380038080A00036602048204A700060D8
+:101AB0004E7004605270602A1800C81B9B7810009A
+:101AC00046A078105E2DC000F71B106B9CA307008A
+:101AD0009DA3C0004C7084A000804000731D84A6AC
+:101AE00001004000751D9CA3BFFF84A610004000AC
+:101AF0007B1D9DA32000AA7B408884A60E00C00009
+:101B0000861DBDA710000A677800C71D4C718CA107
+:101B100000084000022911202100048004804800B0
+:101B20009D1D11202200048048009D1D11202000D1
+:101B3000048048009D1D4000C71DAA7A4088781087
+:101B4000772D106A0C6108818CA1FF00E0A1803E16
+:101B5000642CFF8C4000BE1D106006A2C000A81DB2
+:101B6000B4600180B660C000A31D7E0C602A0860CE
+:101B700085A000010A607F0C7800D61C78105E2DCD
+:101B8000C000F71B602A0E61AA7940882E710120DF
+:101B900001007E00507184A118004000DD1D84A169
+:101BA00010004000D71D7810CC2AC000DD1D84A194
+:101BB00008004000DD1D7810E6297F0002708CA629
+:101BC0006000FF884000E61D8DA104005A79B269CB
+:101BD0009B7860000028AA789B786100146885A033
+:101BE00000801668AA787E157E137E14A1202C0131
+:101BF0009B7800000080AC8080AD0A009820A6533E
+:101C00007F147F137F15106807809B787E00AA7869
+:101C1000906DD67DDE7D946ED27EDA7E307884A0A3
+:101C2000C000C000151E98001D1E086084A0EFFFB4
+:101C30000A607810772D7800FF1B007284A20700DD
+:101C400086A00100C0002A1E1B7849007810772D5D
+:101C500078003B1EB06A95A200205A7A1B78490092
+:101C60007810772D0072002505A640003B1E84A247
+:101C700007007910491E80AD0800327084A2070069
+:101C800086A00100C000471E186000801A6078001E
+:101C9000F71B511EF030F030DF30F030511E511E76
+:101CA000511E7810A51B087884A0FDFF0A787E0FCE
+:101CB0007920003598787F0F84A001004000791EBC
+:101CC000A07086A00100C000681EA2707800011FED
+:101CD000A07086A00500C000771EBC706820176841
+:101CE0000400136800001C6885A008001E68A3702B
+:101CF00000007E1511200400A07186A101004000A3
+:101D00009B1E86A10700C0008B1E09202B350B20CF
+:101D1000050078009B1E0920133504210920123587
+:101D20000A2009202B350B200100A3700000A770AA
+:101D3000010078009D1EA37000007810C72EA92016
+:101D40001000392000007810A62BB8A70001700001
+:101D5000AB1E7800A31E007020207900AF1EDD1E90
+:101D6000C61EC61EB91EDD1EDD1EB71EB71E7810AC
+:101D7000A51B21205735042405A04000C61E06AD32
+:101D8000C000C61E006822207800D61E1C6884A0F1
+:101D90000100C000D21E106F7810A12C7810D92835
+:101DA0007800D61E5470602000680260166A1C68B5
+:101DB00085A008001E687810DD172120803F78106C
+:101DC000071F212057357810071FA9200000212068
+:101DD000803E7810071F20847000F01E7800E91EF6
+:101DE000A9208000612080361860106102A1126075
+:101DF0001B600000E0AC10007000001F7800F41EB3
+:101E00007F15037000003F7000007800F71B7E0410
+:101E1000042405A04000191F682000687E00166A8F
+:101E20001C6885A008001E687810DD177F00780008
+:101E3000091F7F04232000007C0082A203005000C1
+:101E4000231F7810A51B00237900261F291F9C1F24
+:101E5000AA1F82A2020040002F1F7810A51BA070AD
+:101E6000A3700000C37000007900361F3E1F3E1FA4
+:101E7000401F741F08293E1F741F3E1F7810A51BAA
+:101E8000B4777810A62BB477BCA7000F7810A12CDC
+:101E9000186005A040006B1F2120803F092004002E
+:101EA000112010007810C51F40006B1F7E15A9205F
+:101EB00000002120803E7E04092004001120100033
+:101EC0007810C51F7F0440006A1F208470006A1FBD
+:101ED00078005B1F7F15388784A70700C000461F66
+:101EE0007800FF1B7800FF1BB4777810A12C1860D6
+:101EF00005A040009A1F2120803F092005001120E5
+:101F000020007810C51F40009A1F7E15A9200000F0
+:101F10002120803E7E040920050011202000781039
+:101F2000C51F7F044000991F20847000991F78000E
+:101F30008A1F7F157800FF1B002279009F1FA21FB8
+:101F4000A41FA41F7810A51BA3700000A770010098
+:101F50007800F71B00227900AD1FB21FA41FB01F2D
+:101F60007810A51B78101F24007086A00100C00007
+:101F7000AF287810EF28086084A0EFFF0A6078107F
+:101F8000A2284000AF287800D61C042405A04000F9
+:101F9000E61F6820042D7E00106806A74000D41FAD
+:101FA000202D7F007800C61F7F00222016691C6844
+:101FB00005A21E687810DD171060018012600860AD
+:101FC00084A0EFFF0A607810EF287C0085A0010054
+:101FD0007800E51F00237900ED1FF21FF01F352068
+:101FE0007810A51BE47805A0D00015201800152056
+:101FF000082084A03000C00001201B784900780030
+:10200000F71BEC7884A003004000FD1F002184A092
+:10201000070079000B20232029201D201320582D94
+:10202000582D13202F207810A51B007005A040000C
+:10203000FF1B012003007800FA227810892B1B78FF
+:1020400055007800F71B7810892B1B78DC0078008E
+:10205000F71B7810892B1B78E3007800F71B7810AA
+:10206000892B1B789D007800F71B84A50F00C0000A
+:102070005F2078101F24007079003E2046205320F6
+:102080004620AF284820AF28462046207810A51BC0
+:10209000A071A370000086A10400C0005120780048
+:1020A00008297800AF287810EF28086084A0EFFF97
+:1020B0000A607810A2284000AF287800D61CE47887
+:1020C00005A0D000152018001520082084A030009D
+:1020D000C0006E201B7849007800F71BEC7884A0C4
+:1020E000030040006A20002184A1070079007820C5
+:1020F00088208E2082208020582D582D8020502D21
+:102100007810A51B7810912B1B7855007800F71BD1
+:102110007810912B1B78DC007800F71B7810912B3E
+:102120001B78E3007800F71B7810912B1B789D003B
+:102130007800F71B002379009D20A220A020A42076
+:102140007810A51B7800652617680800A3780000A2
+:10215000E47984A1300040006526EC7884A0030077
+:102160004000652684A107007900B620232029209D
+:102170001D20302D582D582DBE20502D7810A51B18
+:1021800082A205005000C6207810A51B002379000C
+:10219000C920CC20CE22DA2200227900CF20D42000
+:1021A000D620E920D420B3227810A51B9B781800F4
+:1021B000A87884A0FF0082A0200048006A2B8AA093
+:1021C0000400C8006A2B7900E5206A2B6A2B6A2B71
+:1021D0000C2B9B781800A87984A180004000FE2079
+:1021E00084A118004000FA2078006A2B007005A036
+:1021F000C000F420112003007800522784A1FF00C2
+:102200008AA01000C8006A2B790006211821162127
+:102210002E213021C2216A2B6A2BC4216A2B6A2B02
+:10222000AF22AF226A2B6A2B6A2BB1227810A51B32
+:1022300084A60010400025210120000300800080BA
+:102240003A781B789A007800F71B146884A0008005
+:1022500040002C21176803007800302D7810A51B52
+:102260001C691E6984A60018C0004A211C6884A04D
+:102270000100C0005221146886A00800C00042215D
+:102280001768000084A600044000BE211B78580097
+:102290007800F71B84A60010400052211B785800DC
+:1022A0007800F71B84A660004000BA2184A60008CD
+:1022B0004000BA2184A60080C000602178007A2105
+:1022C000B4A6FF7F5A7EB26E9B787400AC7AAC796C
+:1022D000AC781B80C8006D21008084A03F0008A15D
+:1022E00091A20000946B002102A3AE68906B0022C3
+:1022F00003A3AA6884A6004040008221B4A6FFBFC1
+:102300005A7EB26E007086A00300C0008F21781044
+:102310003A2F7810DF301B7867007800F71B06A093
+:1023200078109431AC6AA869946C906B002205A176
+:1023300040009E21002222A400211BA3D27CD67B38
+:10234000002305A4C000AC21B5A600405A7EB26EA1
+:102350001B7867007800F71B1B786700002215A127
+:10236000C000B6217810F0307800F71B78101D31CE
+:102370007800F71B1B786A007800F71B1B78580061
+:102380007800F71B7810A51B780021221C6984A116
+:1023900000014000DC218CA1FFFE1E697E0C48700C
+:1023A0006020006084A0FFEF0260046084A0F5FF5D
+:1023B00006607F0C7800102284A1000240001022E9
+:1023C0008CA1FFFD1E697E0C48706020006084A017
+:1023D000FFDF0260046084A0EFFF06600820482C45
+:1023E0007F0C84A108004000102278109D2C7810EA
+:1023F000E629FF88400010229B7860000028AA7818
+:10240000587EB5A604005A7E84A60004C0000C22A3
+:102410001B7855007800F71B1B7869007800F71BC4
+:10242000587E84A60004C00019221B78580078004A
+:10243000F71B1B786A007800F71B7800702B780078
+:10244000702B1920000090798CA1070040001F22FA
+:102450009B781000A87894A0FF0086A20100C0001D
+:1024600044220023A87C00A4182002A140003C22A2
+:1024700048003C2278003E227800C621A824A87A91
+:10248000F0003E2278002A2284A2F00086A02000DC
+:10249000C000A02218831883002302A14000542208
+:1024A0004800542278009D2286A2230040001F226B
+:1024B000186884A0F1FF1A68587E84A6F1FF85A0F1
+:1024C000100030205A7E086085A010000A607E0C43
+:1024D0004870602004600820482C7F0C84A1100004
+:1024E0004000782278109D2C7810CC2A7800872222
+:1024F0007E0C4870602004600820482C7F0C84A16A
+:1025000008004000102278109D2C7810E629FF88E2
+:10251000400010229B7860000028AA78B5A604002D
+:102520005A7E84A60004C00099221B7855007800CA
+:10253000F71B1B7869007800F71BA87A78002A221D
+:102540001883002302A14000A9224800A922780094
+:102550002A2284A28000C000762B7800702B78009D
+:10256000762B78006A2B9B781800A87884A0FF004F
+:102570008EA001004000BE227810A51BA87A94A26C
+:10258000FF00A87884A0FF008AA00400C8006A2B7E
+:102590007900CA226A2B39296A2B672A82A2000095
+:1025A000C000D4227810A51B7810892B1B786900F5
+:1025B0007800F71B82A20300C000E0227810A51B60
+:1025C0007810992B1B7869007800F71B82A2040011
+:1025D0005000EC227810A51B00237900EF22F22294
+:1025E000C923FA2386A203004000F8227810A51B15
+:1025F000012000003A70007084A0070079000023D9
+:1026000008230A230A2308253025D2240823082377
+:102610007810A51B84A60010C00012237810C72EC6
+:102620004000A32368788CA0FF0040005A2386A1B5
+:102630000800C00029237810EF28086084A0EFFF6D
+:102640000A607810A22840005A237810C72E78001C
+:10265000412386A12800C0005A237810C72E0860A5
+:1026600084A0EFFF0A60186005A0400041230180AC
+:102670001A6005A040004123018005A040004123CD
+:102680001E601C6884A001004000FF1B1C6884A021
+:10269000FEFF1E6854707E0C6020006802607F0C94
+:1026A0000460026805A0002DC00057230260066088
+:1026B0007800FF1B7E0178101F247F0184A600DFB5
+:1026C0001A6827680000106FFF814000A32386A1CD
+:1026D0000200C0009B2384A60008C000772384A6C4
+:1026E000600040007723D878DC7A2E682A6A178742
+:1026F00094A20F0013821382138290A2003690A23C
+:1027000000001C2284A30001C000882378008E23CF
+:102710001082042285A018001220118284A30004D4
+:1027200040009B239C6884A00001C0009B2378107C
+:1027300091247800FF1B86A118004000A32386A1E6
+:1027400014004000FF1B1269146884A00080400040
+:10275000AB23387016688CA600DF1A697810E02861
+:102760007810EF28C000B823086084A0EFFF0A604B
+:102770001C6884A00100C000C1237810D92878000B
+:10278000C52354706020006802607810DD1778005F
+:10279000FF1B82A204004800CF237810A51B002253
+:1027A0007900D223D623D823E523D8237810A51B7C
+:1027B000007086A005004000E1237810892B1B786B
+:1027C00069001B786A007800F71B90780780018009
+:1027D00084A0070080A018009A78A8798CA1FF0037
+:1027E00086A103004000F62378006A2B1B786A005C
+:1027F0007800F71B1C6885A004001E68FF82C000DB
+:1028000005247810892B78000C24118240000A24BA
+:102810007810A51B7810992B1B7869007800F71B9E
+:102820007810772D307884A0C000C0001C241800D8
+:102830001C241A7906A07C0085A001007C0084A6D7
+:102840006000C00029242F6800002B680000780079
+:10285000902484A60008C0003824B06884A00048F2
+:1028600035A684A60008C00038247810C72E7C0046
+:1028700084A6200040006224D0780380C80046244B
+:1028800006A078109431D4787810F93184A60040ED
+:10289000400050242F6800002B6800007800352489
+:1028A000B06884A0004835A684A60040C0004A2431
+:1028B000387005A0C0005C24D879DC7A2E692A6AB9
+:1028C0007800352484A6004040006C242F68000066
+:1028D0002B68000078003524B06884A0004835A635
+:1028E00084A60040C0006624387005A0C0007A2489
+:1028F0003B700700D879DC7AD078F380C800812457
+:10290000008084A03F0008A191A200002E692A6ADD
+:10291000002105A2C0008E2478003524781094315F
+:102920007C0084A3000240009924086085A0020076
+:102930000A6017680600286A2C693A6A3E692B68A3
+:1029400000032F6800003368002093680000976838
+:10295000200000707900AC24B424B624BF24B42431
+:10296000B424B424B424B4247810A51B1C6884A017
+:102970000100C000BF247810D9287800C524547005
+:10298000502C602000680260602A21205735042402
+:1029900005A04000CE2420207800C724222D6B20E3
+:1029A00000007C00B4777810A62BBCA7000F78102D
+:1029B000A12C186005A0400001257E0D0120903F4C
+:1029C00068207F0D2120803F092004001120100085
+:1029D0007810C51F400001257E15A9200000212088
+:1029E000803E7E0409200400112010007810C51FCD
+:1029F0007F04400000252084700000257800F12429
+:102A00007F15388784A70700C000D7247800FF1BF4
+:102A10007810E0287810EF28276800009B780E00D7
+:102A2000106F136802007810CA3184A600084000B5
+:102A30001D2518698DA100201A69146884A00080E2
+:102A40004000242517680000212057350068222007
+:102A5000386A3C692A6A2E697810DD177800FF1BF6
+:102A600078101F24276800009B780E00106F7810E4
+:102A70007C2D8CA0FF001269146884A000804000A7
+:102A80004325387016688CA600DF1A69A370000011
+:102A90007800FF1B06A07810C72E13680000176887
+:102AA00001008CA600DF1A69276800000070790019
+:102AB00059256125632563256525652565256125DE
+:102AC00061257810A51B7810EF28086084A0EFFF1F
+:102AD0000A607800BA28002379006E2571257325D5
+:102AE000B1257810A51B0070790076257E258025FC
+:102AF00080258B25802592257E257E257810A51B97
+:102B000084A60020C0008B25B5A600205A7E781030
+:102B1000F0307800302D146884A0008040009225A9
+:102B200017680700092018350C2186A10000400015
+:102B3000A72586A101004000AB2509202B350B20DD
+:102B40000B00A37001001B7846007800F71B1B7870
+:102B5000DD007800F71B09202B350B200A007800D8
+:102B6000F71B7810A51B00237900B625B925BB25D6
+:102B7000DE257810A51B00707900BE25C625C82566
+:102B8000C825D325C825DA25C625C6257810A51B56
+:102B900084A60020C000D325B5A600205A7E781058
+:102BA000F0307800302D146884A000804000DA25D1
+:102BB000176807001B78E4007800F71B1C6885A0E5
+:102BC00004001E68B5A600087810892B1B786900E0
+:102BD0007800F71B00237900ED25F025F225F42578
+:102BE0007810A51B7810A51B84A60004C00013262E
+:102BF0002B7809309B786000AB78000084A6FBFF3F
+:102C00005A78E47984A1200040000B26EC7884A057
+:102C10000300C0000F26012014007800FA2284A1CE
+:102C2000070079004B26907A94A207009B786000F9
+:102C3000A879FF81400049269B781000A87B84A3D7
+:102C40000100C0003A26A87BA87B86A30100C00033
+:102C50002D260920F7FF7800332686A30300C00045
+:102C60003A260920EFFF7E0C48706020046004A122
+:102C700006607F0C9B786000AB78000084A6FBFFA9
+:102C80005A782B7809301C698CA1FFFD8CA1FFFEBE
+:102C90001E697800302D2320292055265D265326D5
+:102CA00053265326302D7810A51B1C698CA1FFFDDF
+:102CB0008CA1FFFE1E697800382D1C698CA1FFFDD8
+:102CC0008CA1FFFE1E697800302DE47984A13000CC
+:102CD00040006F26EC7884A00300C00077261468BB
+:102CE00085A000801668012014007800FA2284A1D3
+:102CF000070079007B26302D302D8326302D582D6E
+:102D0000582D302D302D84A60004C000B4261C6838
+:102D100084A001004000382D8CA660208CA1FBFF10
+:102D20005A79B2699B786000AB7800009B786100AB
+:102D3000146885A000801668AA787E157E137E141C
+:102D4000A1202C019B7800000080AC8080AD0A009F
+:102D50009820A6537F147F137F15106807809B78F7
+:102D60007E00AA787800382D146884A00080400086
+:102D7000BB26176808001B78D8007800F71B0023D3
+:102D80007900C226C7264227C5267810A51B0070E9
+:102D900084A007007900CC26D426D626F226D42695
+:102DA000D426D224D426D4267810A51B1C698DA144
+:102DB00001001E690068066005A0C000E0260260F0
+:102DC000186884A00E004000EC261470B6682C71C0
+:102DD00088A1803E7800EE260920803F0421026809
+:102DE0000A2D5671B26E84A660004000402784A66A
+:102DF0000008C000042784A6FF7FB268906894682A
+:102E00007810C72E7800402784A62000400016279F
+:102E100006A078109431D0780380C8001227D478A7
+:102E20007810F931D879DC7A78001A277810AE2C2E
+:102E30007810943184A600804000402784A6FF7F4C
+:102E4000B2689B78740078107C2D102078107C2D4F
+:102E5000082084A62000C000382778107C2D1B8015
+:102E6000C8003327008084A03F0008A191A2000081
+:102E7000946B002102A3AE68906B002203A3AA68A2
+:102E80007800FF1B7800762B3370000082A20500CB
+:102E900050004C277810A51B002379004F2752279C
+:102EA0005C277F270022790055275A27762B5A273F
+:102EB000A827F9277810A51B007086A00100C00084
+:102EC00069277810EF287810C72E34700A607800D0
+:102ED0006E27007086A00300400063270370050082
+:102EE0000120903F68203E703270002279007827E0
+:102EF000762B7D27A8277D27762B7810A51B0070C1
+:102F000086A00100C0008C277810EF287810C72E0B
+:102F100034700A6078009127007086A0030040009A
+:102F20008627037005000120903F68203E703270B4
+:102F3000002279009B27A227A027A227A027A2274B
+:102F40007810A51B7810992B1B7869007800F71B67
+:102F5000007086A00100C000B5277810EF28781017
+:102F6000C72E34700A607800BA27007086A003006C
+:102F70004000AF2703700200807A94A2000F9B7874
+:102F80001800A87C84A4070015A26920803F042DA6
+:102F9000082D5671682005A04000D527106806A2AC
+:102FA0004000EE2700687800C82703700500012064
+:102FB000903F68203E7032707E15A9202F000320BC
+:102FC000000000807000E6277800DF277F15126A76
+:102FD000B36800071F68000823680300B06E5A7EBC
+:102FE0001C6884A0000C40004F287810912B7800BA
+:102FF0004F28007086A00100C00006287810EF2836
+:103000007810C72E34700A6078000B28007086A0F4
+:1030100003004000002803700200807A94A2000F91
+:103020009B781800A87C84A4070015A2A879A87929
+:103030008CA1FF00E8A1803E042D082D5671682068
+:1030400005A040002A28106806A240004328006816
+:1030500078001D28037005000120903F68203E7015
+:1030600032707E15A9202F00032000000080700020
+:103070003B28780034287F15126AB36800071F6860
+:10308000000823680300B06E5A7E1C6884A0000C00
+:1030900040004F2878108D2B587E78004F287E02F4
+:1030A000078284A00F0003800380038080A0003685
+:1030B00060204A7000604E700460527084A6600008
+:1030C00040008628946B906CA869AC6805A1C0008C
+:1030D0007428D27BDA7BD67CDE7CB4A6FFB75A7E1E
+:1030E0007810F03078008628AC681AA3002123A459
+:1030F000002405A340008628D27BDA7BD67CDE7CC8
+:10310000AC68B4A6FFBF5A7E78101D317F077810D7
+:10311000A12C09206A0084A60800400091280920FB
+:103120006900B5A600205A7E1A79002D3E700782EC
+:1031300084A00F0003800380038080A00036482015
+:103140007800F71B206005A04000AE2801802260B7
+:10315000086085A008000A60107026607C0006A048
+:103160007810C72E13680000176801001F68400020
+:103170001B680001007084A007007900BF28C728E1
+:10318000C928C928D528D128C728C728C728781012
+:10319000A51B7810E0287810D9287810DD17780062
+:1031A000FF1BA37000007800FF1B17680000780069
+:1031B0000825006805A0C000DE28026006607C00CB
+:1031C000106005A04000E9280180D000E9287810AF
+:1031D000A51B1260086084A0EFFF0A607C001860E5
+:1031E00005A04000F52801801A607C007810772D3A
+:1031F00017681800780026297810772D17681900AD
+:10320000780026297810772D17681A00780026296B
+:10321000B4777810A12CB8718CA1FF00E8A1803E92
+:10322000042D082D682005A0C00018297800FF1B78
+:103230001068B47206A240002029006878001129A5
+:1032400000680A2017680500BF7000007810E028A9
+:103250001C6884A00100C0002F297810D92878109C
+:10326000EF281B6800001F6820007810DD17780029
+:10327000FF1B82A20300C0006A2BA87DACA5FF0043
+:10328000A87EB4A6FF001C698DA180001E6984A1E0
+:103290000001400099298CA1FFFE1E69B4A6FF0021
+:1032A0004000832982A60F0048005A2940005A296D
+:1032B00031200F002B852B857810242C40006429A9
+:1032C0007810332A78008C297810DF2B7E0C602947
+:1032D000046084A0F5FF06607810572A7F0C1C69F3
+:1032E0008DA100011E69587EB5A604005A7E84A6F1
+:1032F0000004C0007F291B7855007800F71B1B785D
+:1033000069007800F71B7E0C6029046084A0F5FF3B
+:1033100006607810572A7F0C587E84A60004C000EF
+:1033200095291B7858007800F71B1B786A007800F5
+:10333000F71B7E0C4870602000618CA100104000DB
+:10334000D9290862178294A2FF0082A20F004800C8
+:10335000AD294000AD2911200F00002602A2C800AF
+:10336000B2293022086294A2FF00187086A02800BB
+:10337000C000C22982A21900C800C8291120190062
+:103380007800C82982A20C00C800C82911200C00AE
+:10339000002202A5C800CD2928227810E32B2B8516
+:1033A0002B857810242C4000D9297810332A7800F6
+:1033B000DD297810DF2B7810572A587885A0040073
+:1033C0005A787F0C1B7869007800F71B7E0C602907
+:1033D000006084A00010C000012A106084A00F00CB
+:1033E000C000FB298CA10200C000FB298CA1F5FFC5
+:1033F00006617F0C7C00112032001920000078004B
+:10340000232A086294A2FF00187086A02800C0003A
+:10341000112A82A21900C800172A11201900780069
+:10342000172A82A20C00C800172A11200C0008637A
+:103430001F839CA3FF0082A30F004800232A4000A3
+:10344000232A19200F00AB780100AB780300AB787A
+:103450000100AA7AAA7BC0A805001C6885A000010B
+:103460001E687F0C7C007E0C48716021082084A0BF
+:10347000F0FF35A6867E18609A78AE7E1266A47834
+:1034800084A0F8FF8CA1070005A1A67816608A78B1
+:10349000B4A60F0037860482048084A0FF0005A62E
+:1034A0000E60046084A0F5FF06607F0C7C007E0C3B
+:1034B0004870602018609A78A47884A0F0FFA678FD
+:1034C0001260847884A0F0FF86787F0C7C0082A252
+:1034D0000200C0006A2BA87A1C698DA180001E69B9
+:1034E00084A100024000AC2A8CA1FFFD1E6994A2B9
+:1034F000FF0082A20200C8006A2B7810F32A78101D
+:10350000572A80A901000C2078109D2C7810E629FC
+:10351000FF8840009F2A9B7860000028AA78587E88
+:10352000B5A604005A7E84A60004C0009B2A1B781E
+:1035300055007800F71B1B7869007800F71B587E50
+:1035400084A60004C000A82A1B7858007800F71B46
+:103550001B786A007800F71B82A20200C800B42A18
+:1035600084A201004000BE2A487188A100000C21FD
+:103570008CA10020C000BE2A112000007810D12BA1
+:103580007810F32A7810572A587885A004005A78C2
+:103590001B7869007800F71B7E0C7E0260290060B2
+:1035A0001120010084A00020C000E32A146084A040
+:1035B0004000C000E12A8CA1EFFF066106A0780060
+:1035C000F02A11200000AB780100AB780200AB7844
+:1035D0000300AA7AC0A804001C6885A000021E6827
+:1035E0007F027F0C7C007E0C48706020FF824000D0
+:1035F000FB2A11204000186080A002009A78A4786D
+:1036000084A0BFFF05A2A67816608A78046084A013
+:10361000EFFF06607F0C7C007E00007086A0030038
+:103620004000152B7F007800182B7F007800662B58
+:1036300084A620004000662B887884A040004000CB
+:10364000662BA87801804000252BB87B84A33F001F
+:103650001B83C8002C2B008005A040004D2B1B8332
+:10366000C800352B01804000622B06A078109431F1
+:10367000B4787810F9317800662B84A600404000B9
+:103680004D2BB8781B80C800462B008084A03F00DB
+:10369000C000622BB4A6FFBF5A7ED879DC7A012025
+:1036A000010008A1C800562B91A20000D279DA7956
+:1036B000D67ADE7A781094311B78670078105E3005
+:1036C0007800F71B1B7867007800F71B1B786A00EF
+:1036D0007800F71B78109D2B1B7869007800F71B8A
+:1036E0007810892B1B7869007800F71B236802008B
+:1036F0007810912B1C698DA120001E69146884A08C
+:1037000000804000852B176805001B786900780051
+:10371000F71B0120050078009F2B01200C0078008A
+:103720009F2B0120060078009F2B01200D007800C0
+:103730009F2B0120090078009F2B012007009B7818
+:103740007F00AA78B5A608005A7E7C007E073F87D6
+:10375000BCA70F003B873B870387E0A00036B8A7D4
+:1037600020009A7FA47984A10F004000BF2B84A180
+:10377000F0FFA6781260046085A008000660388714
+:1037800038879A7FA47984A140004000CF2B84A180
+:10379000BFFFA6781660046085A0100006607F0752
+:1037A0007C009B781000AB780100AB780200AB780E
+:1037B0000300AA7A9B786000AB7804007C0031207B
+:1037C0000000292032009B781000AB780100AB7814
+:1037D0000300AB780100AA7DAA7E9B786000AB78DD
+:1037E00005007C007E15078084A0FF000380038015
+:1037F00080A020009A78A4798CA1F0FF01204635A2
+:10380000042082A0280040000D2C2120842C1920A7
+:103810001400A9200C007800132C2120902C1920D2
+:103820001900A9200D0011206400042484A0F0FFD9
+:1038300006A14000222C2084002310A27000222C1C
+:103840007800152C7F157C007E151120463514223A
+:1038500082A232004800382C40003C2C2120762CDB
+:1038600019201100A9200E001120320078004C2CE4
+:1038700082A228004000442C2120842C192014000E
+:10388000A9200C0078004A2C2120902C1920190026
+:10389000A9200D0011206400002202A540005C2C2C
+:1038A00048005C2C2084002310A27000592C780062
+:1038B0004C2C7F1506A07C007F1582A56400C800F3
+:1038C000652C087885A070000A78EC7884A0000345
+:1038D0004000732C04249EA00112C000732C012010
+:1038E00001217800742C042405A07C000112023010
+:1038F0000232034203440454045605660568067800
+:10390000067A070A070C070E0232024202520262CE
+:103910000272056605760578057A057C057E057FC9
+:1039200002220232024202520454046404740476F5
+:103930000478047A047C047E047F9B78100046A0FF
+:103940007C0084A7000F0C8084A7070003800380FD
+:103950000380038005A1E0A080367C00D879DC7A62
+:10396000D0781B80C800B52C008084A03F0008A13F
+:1039700091A200007C007E0F7920000109204035D3
+:103980009120008004217900C52CF72CCF2CCF2C5E
+:10399000CF2CCF2CCF2CCD2CCD2C7810A51B4B7839
+:1039A0000400487884A00400C000D12C4B780800A3
+:1039B000487884A00800C000D82CB06885A00040DA
+:1039C000B268587885A000405A78307884A080008A
+:1039D000C000F72C1800F72C186884A02000C00045
+:1039E000F52C1B78DD007800F72C1B78E400912083
+:1039F00001807F0F7C007E0C1068078084A00F0080
+:103A0000038003800380E0A00036046084A00A00E5
+:103A1000C0002E2D086194A100FF40002E2D8CA126
+:103A2000FF000120190006A140001D2D01203200D9
+:103A300006A14000212D7800252D092020007800C6
+:103A4000272D09203F007800272D1120000000219C
+:103A500005A20A60046085A0020006607F0C7C005D
+:103A60001B786A007800F71B1B7869007800F71B49
+:103A70001B7858007800F71B1B7855007800F71B5F
+:103A80001B78DD007800F71B1B78DC007800F71B43
+:103A90001B78E4007800F71B1B78E3007800F71B25
+:103AA0001B789E007800F71B1B789D007800F71BA1
+:103AB000A37001001B7846007800F71B7E00307869
+:103AC00084A0C000C000752D087884A0FDFF0A788E
+:103AD0000500050005000500EC7884A021004000E9
+:103AE000752D087885A002000A787F007C00087890
+:103AF00085A002000A787C00307884A04000C000D5
+:103B00007C2D9800852DAC787C00087884A0FDFF82
+:103B10000A780500050005000500EC7884A0210066
+:103B20004000942D9800922DAC787E00087885A0F6
+:103B300002000A787F007C0084A770004000A82D56
+:103B40007E0C602D682F78106B1B782D682C7F0CF5
+:103B500017680300587884A0003F1A682F68000097
+:103B60002B6800004B780800E47805A0D0001520F1
+:103B700084A0200040001520EC7884A003004000C1
+:103B80001520180015207800702B7E0C1068078017
+:103B900084A00F0003800380038080A00036602093
+:103BA00048204A7000604E70046052707F0C7C00A8
+:103BB0002000200000002000000020000000200065
+:103BC0000000200000002000000020000000200075
+:103BD0000000200000002000000020000000200065
+:103BE0000000200000002000000020000000200055
+:103BF000000020006200090014001400479814001F
+:103C00001400F598E798140014008000BF0000012C
+:103C10000204082080F80AA214000B300CA2140041
+:103C200000A238887E812A84A08406383988C22878
+:103C3000C39C05A864083BA80830C128C39C01A206
+:103C40000C30472861816A840080A48456183A8821
+:103C500008A8E228A09CF3A8640829A80C3001A8B1
+:103C60000830E128A09C0D2804A2C064A067C06FA2
+:103C700014183B882370768577860FA86E783E8867
+:103C80000CA82B2805A2A064A067C06F14183B885D
+:103C900023707685778601A83E886920C128C39C59
+:103CA00044200321A2208120DCA807A2140003A243
+:103CB0000080A884A48572189A843C88E21F01F6CB
+:103CC00008A26E856F8604070830A09C140002A22B
+:103CD0000080A4850930A884E21948F87481EB8635
+:103CE000EB852E87A9873F88E608F1A861F8E8A848
+:103CF00001F8140081F81600B285F0803295A2FA1E
+:103D0000E21D1400328521F21400E21DA884E0D6E1
+:103D1000E61F140006A265687F812A84C11D2388DE
+:103D2000160042600880FAA80080A48460812A847A
+:103D300021F00830A884C61DD720228816000080F4
+:103D400048281110FCA80830008000A0022811109B
+:103D5000FDA887A808303D281110FDA809A217006A
+:103D60000C300080A485E21DC1DA1400E0263A87F9
+:103D7000A2FAF219E21F14000BA214000DA27E8118
+:103D80002A84A08406381002CD9C040700007E120D
+:103D9000912000224920C72E0070047205A20C72E7
+:103DA00015A2087084A0FDFF05A24000D92E78005E
+:103DB000DE2E037000007F1200207C00007084A0C3
+:103DC0000100C0000C2F08710481C800EB2E781090
+:103DD000A82F7800E32E0C708CA07F0040000C2FE1
+:103DE00004700480C800032F147005A0C000FF2ECB
+:103DF000107005A04000032F02A1C800E32E077039
+:103E0000100078000C2FFF8A40000C2F78106B31C7
+:103E1000C000062F4000E32E7810562F03700000DC
+:103E20007F1200207C002464FF844000302F702C1F
+:103E30003920352F042768AE0C6830A6086829A5FC
+:103E400021844000302F3887042705A0C0001B2F95
+:103E5000987075A04000302F3920322F78001A2F2B
+:103E60007C000000040008000C0010001400180082
+:103E70001C0000007E129120002279200035712064
+:103E8000100007700A000770020003700000712024
+:103E9000200007700A00077002000370000049202C
+:103EA0000000B37800007F1200207C004920562FCC
+:103EB00004700480C800822F077012000871087017
+:103EC00006A1C0005E2F84A1300040006B2F86A0A9
+:103ED0003000C0005E2F007084A00100C000822F5F
+:103EE000087084A00C00C000802F0C7184A1000316
+:103EF000C000802F84A17F00C000562F7800822F41
+:103F0000176803000770120007700800047084A08F
+:103F10000800C000862F0770120008710481480055
+:103F20008B2FB378000003700000492000007C0054
+:103F30007E107E007E127E1591200022087178107E
+:103F4000A82F7F157F12912001807F007F107C00B9
+:103F50000472182108710C7084A00003C000EA2FBD
+:103F600084A10C00C000EA2F1382138213821382F3
+:103F700084A200010DA10B810B810F8184A1070098
+:103F80007900C22FCC2FDC2FEA2FDC2FFE2FFE2F43
+:103F9000EA2FFC2F7810A51B07700200FF8AC000D3
+:103FA000D52F492000007800D92F78106B31C00040
+:103FB000D52FB37800007C0007700200FF8AC00094
+:103FC000E32F7800E72F78106B31C000E32FB37830
+:103FD00000007C00077002007810562F7810BB2C70
+:103FE000146884A000804000F72F176802007C004E
+:103FF0007810A51B7810A51B781050301072147122
+:104000000C709CA07F00002800A311A289A10000D1
+:10401000B07805A040001030B3780000780033304D
+:10402000781050300427582C60AC0C63002222A377
+:10403000086300211BA3002405A340002930C80009
+:104040002930128410820A8389A10000602B780035
+:104050001030602B078ABAA7322F3DA7002C826848
+:10406000866F8E6C8A6B077012007810562F7C005A
+:104070003887042705A0C0004430986005A04000A0
+:104080004D3060203920322F518A40004C3008706A
+:1040900084A0C00086A0C0007C00512000007C00ED
+:1040A000508A3987042704A0C0005D303920382F9A
+:1040B000006064A0C0005D30602D7C007E127E0D2B
+:1040C000912000227F0D806860208468886B8C6C52
+:1040D0005780D4AAFF0084A0FF00B8A0322F087E2A
+:1040E000B5A60C00186884A0400040007930B5A641
+:1040F00001007E0F7920000158787F0F84A04000D6
+:104100004000883084A60100C0008830B5A60100B8
+:1041100007700400047084A00400C0008A3000709E
+:1041200005A0400095307810A51B002405A3C00011
+:104130009B307800D830582C042760AC046000A471
+:104140007E001A70006001A31E700920FD04042186
+:1041500086A0FD047F00C000C83084A0010040009C
+:10416000C83084A60100C000C83013700100177069
+:104170000000027607700100B3780100A0A40100DE
+:1041800099A30000046000A41A70006001A31E70CF
+:104190000C62002402A212700862002303A21670AF
+:1041A000027607700100602B781038307800DA3022
+:1041B00078106B31C000D8307F1200207C007E1256
+:1041C0007E0D912000227F0D07700400047084A0F2
+:1041D0000400C000E630037008007F1200207C005D
+:1041E0007E127E0D912000227F0D4920F030077055
+:1041F0000400047084A00400C000F930007005A021
+:10420000400004317810A51B087EB5A60C00186884
+:1042100084A0400040000E31B5A60100246805A02E
+:1042200040001A3150203920352F602D78106B3125
+:10423000C00016317F1200207C007E127E007E01BD
+:104240007E0D912000227F0D7F037F04087EB5A69E
+:104250000C00186884A0400040003031B5A6010071
+:1042600049201D31246855A040006831702D602E12
+:104270003920352F042768AE0C6822A408681BA3D8
+:1042800048005531518AC00047317810A51B388746
+:10429000042705A0C0003B31987075A06020400045
+:1042A00068313920322F78003A31228420841A83F1
+:1042B00099A300000C69002422A1086900231BA116
+:1042C000C80064317810A51B712020007800883068
+:1042D0007F1200207C00087084A0C00086A0C0006F
+:1042E00040009331042708AC04211E70088104218A
+:1042F0001A700881042116700881042112707E0F43
+:104300007920000158787F0F84A0400040008E3152
+:1043100084A60100C0008E31B5A6010002760770A8
+:104320000100781038307C007E127E007E0D9120D6
+:104330000022492094317F0D7F08087184A1C000BC
+:10434000C000AA31246805A04000BA317800DE2EF2
+:104350007800BA3108710481C800B2317810A82FF2
+:1043600078009D310770100008710481C800B431D5
+:104370007810A82F087086A00200C0009D31007040
+:1043800005A0C0009D3103700000492000007F128D
+:1043900000207C007E127E147E137E157E0D9120FF
+:1043A00000227F0D4920CA3180AD1000A020992045
+:1043B00031000C7084A07F00266807700800077029
+:1043C0000200037001004000E8310080AC80A5537A
+:1043D00007700400047084A00400C000EA31492082
+:1043E0000000037000007F157F137F147F120020F0
+:1043F0007C007E127E007E0D912000227F0D4920E0
+:10440000F931806860208468886B8C6C5780D4AAEE
+:10441000FF0084A0FF00B8A0322F087EB5A60400DC
+:1044200007700400047084A00400C0001232582CED
+:10443000042760AC046000A41A70006001A31E7021
+:1044400013700100177000000276077001007F00F2
+:104450000780092031000A20A0002C320871077063
+:1044600002000C81C8002C320C81480039327800DF
+:10447000EA2FA0A4010099A300008A6B8E6C07703C
+:10448000040049200000037000007F1200207C001F
+:10449000A920100006A0048086808E81C8005132B9
+:1044A00000A2F0004C3286808E817C007E15A9200F
+:1044B000100005A0400077321AA1C800773213829D
+:1044C0008D8148006A321AA1C8006B32F0005F3259
+:1044D00078006F321AA108231082F0005F327E004C
+:1044E000003284A0FFF780207F007F157C007E00D3
+:1044F000003285A0000878007332E000BF329120BE
+:104500000060207801802278C000B93224782278B7
+:104510009120008069204035006884A00700400099
+:10452000A13286A002004000A13230680DA04000F8
+:10453000A132042105A04000A13201800A204000E0
+:104540006F3361208036A9208000346005A04000D0
+:10455000B33201803660C000B332106005A0400065
+:10456000B3327810191AE0AC10007000B93278003C
+:10457000A5327810D4327810C2327810F9329120F6
+:1045800001807C003C7801803E78C000D3324078C6
+:104590003E78487805A04000D33201804A78C000B8
+:1045A000D3327810191A7C00347801803678C00034
+:1045B000F8323878367891200080447805A0C00021
+:1045C000E332012001010180467880A0803E402036
+:1045D000042065A04000F832206005A04000F432BD
+:1045E00001802260400028330060402C7800E932CE
+:1045F0007C00287801802A78C00027332C782A781C
+:10460000307805A0C0000633012080000180327898
+:10461000038003800380038090A0803698A202006C
+:10462000042384A008004000273390A2090004223C
+:1046300005A040001F3301801220C000273304234F
+:1046400084A0F7FF85A080001A207810191A7C003A
+:1046500069204035006805A0400032333C6806AC54
+:1046600040006F3317600600B06084A0003F1A60FE
+:104670001C6084A0FF0085A060001E6000604220D6
+:104680001067B66F78109216186805A040004A337C
+:1046900001801A68086884A0EFFF0A68106801802A
+:1046A000D00054337810A51B12682F6000002B60D7
+:1046B0000000682C7810DD176920403501200600C5
+:1046C000A268447984A10001C0006A33BA6901205C
+:1046D0000400A2687810141A912001807C0009203F
+:1046E0004F3564216920000178106B1B17600600AC
+:1046F000586884A0003F1A601C6084A0FF0085A059
+:1047000048001E602F6000002B600000306884A00D
+:1047100040004000AB334B680400A92014004868F7
+:1047200084A00400400098337000983378008F33E1
+:104730004B680900A9201400486884A001004000CB
+:10474000A5337000A53378009C33A920FA007000CF
+:10475000AB337800A733086884A0FDFF0A681B68A4
+:104760004600092068350B2007004C784A789120D4
+:1047700001807C0079200035781003347810CB3329
+:104780007810E0337810F533337800004778000074
+:104790004B7800007C0019200A00112046350422C5
+:1047A00086A032004000DD3319200C00042286A0D0
+:1047B0003C004000DD33192008002A7B2E7B7C0062
+:1047C0001920300011204635042286A03200400016
+:1047D000F23319203900042286A03C004000F23355
+:1047E00019202700367B3A7B7C0019200D00112010
+:1047F0004635042286A03C004000003419200A00FF
+:104800003E7B427B7C001920AF2F112046350422CD
+:1048100086A032004000153419207139042286A088
+:104820003C004000153419202626227B267B7C0084
+:02483000A7924D
+:00000001FF
+/* Version 1.31.00 ISP1000 Initiator RISC firmware */
index 86b203fc3c56af2b41e0118dd3cc3bddd8a002d4..9f7270f36b2af4e207b26ff52f9b98ad502d8c00 100644 (file)
@@ -175,9 +175,34 @@ source "fs/qnx4/Kconfig"
 source "fs/romfs/Kconfig"
 source "fs/sysv/Kconfig"
 source "fs/ufs/Kconfig"
-
 source "fs/exofs/Kconfig"
 
+config NILFS2_FS
+       tristate "NILFS2 file system support (EXPERIMENTAL)"
+       depends on BLOCK && EXPERIMENTAL
+       select CRC32
+       help
+         NILFS2 is a log-structured file system (LFS) supporting continuous
+         snapshotting.  In addition to versioning capability of the entire
+         file system, users can even restore files mistakenly overwritten or
+         destroyed just a few seconds ago.  Since this file system can keep
+         consistency like conventional LFS, it achieves quick recovery after
+         system crashes.
+
+         NILFS2 creates a number of checkpoints every few seconds or per
+         synchronous write basis (unless there is no change).  Users can
+         select significant versions among continuously created checkpoints,
+         and can change them into snapshots which will be preserved for long
+         periods until they are changed back to checkpoints.  Each
+         snapshot is mountable as a read-only file system concurrently with
+         its writable mount, and this feature is convenient for online backup.
+
+         Some features including atime, extended attributes, and POSIX ACLs,
+         are not supported yet.
+
+         To compile this file system support as a module, choose M here: the
+         module will be called nilfs2.  If unsure, say N.
+
 endif # MISC_FILESYSTEMS
 
 menuconfig NETWORK_FILESYSTEMS
index 70b2aed87133328997e0754737f7ea49a499b21b..af6d04700d9c1ff74ff855521d282d6c72fa2bf2 100644 (file)
@@ -114,6 +114,7 @@ obj-$(CONFIG_JFS_FS)                += jfs/
 obj-$(CONFIG_XFS_FS)           += xfs/
 obj-$(CONFIG_9P_FS)            += 9p/
 obj-$(CONFIG_AFS_FS)           += afs/
+obj-$(CONFIG_NILFS2_FS)                += nilfs2/
 obj-$(CONFIG_BEFS_FS)          += befs/
 obj-$(CONFIG_HOSTFS)           += hostfs/
 obj-$(CONFIG_HPPFS)            += hppfs/
index b8e304a0661e473ba7b44ca74ceebd3e8f228c52..622e73775c83e91da573ff7266688d19e25f3dca 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/spinlock.h>
 #include <linux/kernel.h>
 #include <linux/fs.h>
+#include <linux/slab.h>
 
 #endif                         /* __KERNEL__ */
 
index 5d55a896ff78f2a79ab9bc2dee72dae77ddb93eb..6e35762b6169be2a30a69462764b71967369a1d8 100644 (file)
@@ -737,7 +737,7 @@ static int fsync_buffers_list(spinlock_t *lock, struct list_head *list)
 {
        struct buffer_head *bh;
        struct list_head tmp;
-       struct address_space *mapping;
+       struct address_space *mapping, *prev_mapping = NULL;
        int err = 0, err2;
 
        INIT_LIST_HEAD(&tmp);
@@ -762,7 +762,18 @@ static int fsync_buffers_list(spinlock_t *lock, struct list_head *list)
                                 * contents - it is a noop if I/O is still in
                                 * flight on potentially older contents.
                                 */
-                               ll_rw_block(SWRITE_SYNC, 1, &bh);
+                               ll_rw_block(SWRITE_SYNC_PLUG, 1, &bh);
+
+                               /*
+                                * Kick off IO for the previous mapping. Note
+                                * that we will not run the very last mapping,
+                                * wait_on_buffer() will do that for us
+                                * through sync_buffer().
+                                */
+                               if (prev_mapping && prev_mapping != mapping)
+                                       blk_run_address_space(prev_mapping);
+                               prev_mapping = mapping;
+
                                brelse(bh);
                                spin_lock(lock);
                        }
@@ -2957,12 +2968,13 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[])
        for (i = 0; i < nr; i++) {
                struct buffer_head *bh = bhs[i];
 
-               if (rw == SWRITE || rw == SWRITE_SYNC)
+               if (rw == SWRITE || rw == SWRITE_SYNC || rw == SWRITE_SYNC_PLUG)
                        lock_buffer(bh);
                else if (!trylock_buffer(bh))
                        continue;
 
-               if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) {
+               if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC ||
+                   rw == SWRITE_SYNC_PLUG) {
                        if (test_clear_buffer_dirty(bh)) {
                                bh->b_end_io = end_buffer_write_sync;
                                get_bh(bh);
@@ -2998,7 +3010,7 @@ int sync_dirty_buffer(struct buffer_head *bh)
        if (test_clear_buffer_dirty(bh)) {
                get_bh(bh);
                bh->b_end_io = end_buffer_write_sync;
-               ret = submit_bh(WRITE, bh);
+               ret = submit_bh(WRITE_SYNC, bh);
                wait_on_buffer(bh);
                if (buffer_eopnotsupp(bh)) {
                        clear_buffer_eopnotsupp(bh);
index b6d43908ff7a890f741c3076308c1a9da965f59b..da258e7249cc718b8a46ddec08ba04a62e7e4790 100644 (file)
@@ -1126,7 +1126,7 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
        int acquire_i_mutex = 0;
 
        if (rw & WRITE)
-               rw = WRITE_SYNC;
+               rw = WRITE_ODIRECT;
 
        if (bdev)
                bdev_blkbits = blksize_bits(bdev_hardsect_size(bdev));
index 8e0cfe44b0fcf68f8a2f78987ce77ab16c5961be..fb3c1a21b13594d1edf76fd09e6fdc35b0a5f216 100644 (file)
@@ -28,6 +28,25 @@ config EXT3_FS
          To compile this file system support as a module, choose M here: the
          module will be called ext3.
 
+config EXT3_DEFAULTS_TO_ORDERED
+       bool "Default to 'data=ordered' in ext3 (legacy option)"
+       depends on EXT3_FS
+       help
+         If a filesystem does not explicitly specify a data ordering
+         mode, and the journal capability allowed it, ext3 used to
+         historically default to 'data=ordered'.
+
+         That was a rather unfortunate choice, because it leads to all
+         kinds of latency problems, and the 'data=writeback' mode is more
+         appropriate these days.
+
+         You should probably always answer 'n' here, and if you really
+         want to use 'data=ordered' mode, set it in the filesystem itself
+         with 'tune2fs -o journal_data_ordered'.
+
+         But if you really want to enable the legacy default, you can do
+         so by answering 'y' to this question.
+
 config EXT3_FS_XATTR
        bool "Ext3 extended attributes"
        depends on EXT3_FS
index 9e5b8e387e1eadee90b24acca96fbc92d0f103a0..599dbfe504c39ef8370dd28a4c65aa05346499b4 100644 (file)
 #include "acl.h"
 #include "namei.h"
 
+#ifdef CONFIG_EXT3_DEFAULTS_TO_ORDERED
+  #define EXT3_MOUNT_DEFAULT_DATA_MODE EXT3_MOUNT_ORDERED_DATA
+#else
+  #define EXT3_MOUNT_DEFAULT_DATA_MODE EXT3_MOUNT_WRITEBACK_DATA
+#endif
+
 static int ext3_load_journal(struct super_block *, struct ext3_super_block *,
                             unsigned long journal_devnum);
 static int ext3_create_journal(struct super_block *, struct ext3_super_block *,
@@ -1919,7 +1925,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
                    cope, else JOURNAL_DATA */
                if (journal_check_available_features
                    (sbi->s_journal, 0, 0, JFS_FEATURE_INCOMPAT_REVOKE))
-                       set_opt(sbi->s_mount_opt, ORDERED_DATA);
+                       set_opt(sbi->s_mount_opt, DEFAULT_DATA_MODE);
                else
                        set_opt(sbi->s_mount_opt, JOURNAL_DATA);
                break;
index f8077b9c898160513b1e958a532401653ac96123..a8e8513a78a94db46246a0dbee992e43f1861d5d 100644 (file)
@@ -351,8 +351,13 @@ void journal_commit_transaction(journal_t *journal)
        spin_lock(&journal->j_state_lock);
        commit_transaction->t_state = T_LOCKED;
 
+       /*
+        * Use plugged writes here, since we want to submit several before
+        * we unplug the device. We don't do explicit unplugging in here,
+        * instead we rely on sync_buffer() doing the unplug for us.
+        */
        if (commit_transaction->t_synchronous_commit)
-               write_op = WRITE_SYNC;
+               write_op = WRITE_SYNC_PLUG;
        spin_lock(&commit_transaction->t_handle_lock);
        while (commit_transaction->t_updates) {
                DEFINE_WAIT(wait);
index 4ea72377c7a28797b609c77084b03be21485800d..073c8c3df7cd03af77a6eec17167d8f9c431b7e7 100644 (file)
@@ -138,7 +138,7 @@ static int journal_submit_commit_record(journal_t *journal,
                set_buffer_ordered(bh);
                barrier_done = 1;
        }
-       ret = submit_bh(WRITE_SYNC, bh);
+       ret = submit_bh(WRITE_SYNC_PLUG, bh);
        if (barrier_done)
                clear_buffer_ordered(bh);
 
@@ -159,7 +159,7 @@ static int journal_submit_commit_record(journal_t *journal,
                lock_buffer(bh);
                set_buffer_uptodate(bh);
                clear_buffer_dirty(bh);
-               ret = submit_bh(WRITE_SYNC, bh);
+               ret = submit_bh(WRITE_SYNC_PLUG, bh);
        }
        *cbh = bh;
        return ret;
@@ -190,7 +190,7 @@ retry:
                set_buffer_uptodate(bh);
                bh->b_end_io = journal_end_buffer_io_sync;
 
-               ret = submit_bh(WRITE_SYNC, bh);
+               ret = submit_bh(WRITE_SYNC_PLUG, bh);
                if (ret) {
                        unlock_buffer(bh);
                        return ret;
@@ -402,8 +402,13 @@ void jbd2_journal_commit_transaction(journal_t *journal)
        spin_lock(&journal->j_state_lock);
        commit_transaction->t_state = T_LOCKED;
 
+       /*
+        * Use plugged writes here, since we want to submit several before
+        * we unplug the device. We don't do explicit unplugging in here,
+        * instead we rely on sync_buffer() doing the unplug for us.
+        */
        if (commit_transaction->t_synchronous_commit)
-               write_op = WRITE_SYNC;
+               write_op = WRITE_SYNC_PLUG;
        stats.u.run.rs_wait = commit_transaction->t_max_wait;
        stats.u.run.rs_locked = jiffies;
        stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
index 77ccf8cb0823c805ff9af233aba63404d0df01a2..043740dde20c75fb317bfdedac040abedf9004aa 100644 (file)
@@ -38,12 +38,12 @@ static int jffs2_acl_count(size_t size)
        size_t s;
 
        size -= sizeof(struct jffs2_acl_header);
-       s = size - 4 * sizeof(struct jffs2_acl_entry_short);
-       if (s < 0) {
+       if (size < 4 * sizeof(struct jffs2_acl_entry_short)) {
                if (size % sizeof(struct jffs2_acl_entry_short))
                        return -1;
                return size / sizeof(struct jffs2_acl_entry_short);
        } else {
+               s = size - 4 * sizeof(struct jffs2_acl_entry_short);
                if (s % sizeof(struct jffs2_acl_entry))
                        return -1;
                return s / sizeof(struct jffs2_acl_entry) + 4;
index f9211252b5f16f424fda655a0e5881680fc8eb78..9eff2bdae8a798631cb2c987215e92eaddd75538 100644 (file)
@@ -284,10 +284,9 @@ void jffs2_free_inode_cache(struct jffs2_inode_cache *x)
 struct jffs2_xattr_datum *jffs2_alloc_xattr_datum(void)
 {
        struct jffs2_xattr_datum *xd;
-       xd = kmem_cache_alloc(xattr_datum_cache, GFP_KERNEL);
+       xd = kmem_cache_zalloc(xattr_datum_cache, GFP_KERNEL);
        dbg_memalloc("%p\n", xd);
 
-       memset(xd, 0, sizeof(struct jffs2_xattr_datum));
        xd->class = RAWNODE_CLASS_XATTR_DATUM;
        xd->node = (void *)xd;
        INIT_LIST_HEAD(&xd->xindex);
@@ -303,10 +302,9 @@ void jffs2_free_xattr_datum(struct jffs2_xattr_datum *xd)
 struct jffs2_xattr_ref *jffs2_alloc_xattr_ref(void)
 {
        struct jffs2_xattr_ref *ref;
-       ref = kmem_cache_alloc(xattr_ref_cache, GFP_KERNEL);
+       ref = kmem_cache_zalloc(xattr_ref_cache, GFP_KERNEL);
        dbg_memalloc("%p\n", ref);
 
-       memset(ref, 0, sizeof(struct jffs2_xattr_ref));
        ref->class = RAWNODE_CLASS_XATTR_REF;
        ref->node = (void *)ref;
        return ref;
index 4910a36f516e3081bcb61713260bb2ca637a9612..cd223190c4e948c5bb1f55416049a88cadbd04a4 100644 (file)
@@ -575,6 +575,21 @@ ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
  * possibly a read which collects the result - which is stored in a
  * file-local buffer.
  */
+
+void simple_transaction_set(struct file *file, size_t n)
+{
+       struct simple_transaction_argresp *ar = file->private_data;
+
+       BUG_ON(n > SIMPLE_TRANSACTION_LIMIT);
+
+       /*
+        * The barrier ensures that ar->size will really remain zero until
+        * ar->data is ready for reading.
+        */
+       smp_mb();
+       ar->size = n;
+}
+
 char *simple_transaction_get(struct file *file, const char __user *buf, size_t size)
 {
        struct simple_transaction_argresp *ar;
@@ -820,6 +835,7 @@ EXPORT_SYMBOL(simple_sync_file);
 EXPORT_SYMBOL(simple_unlink);
 EXPORT_SYMBOL(simple_read_from_buffer);
 EXPORT_SYMBOL(memory_read_from_buffer);
+EXPORT_SYMBOL(simple_transaction_set);
 EXPORT_SYMBOL(simple_transaction_get);
 EXPORT_SYMBOL(simple_transaction_read);
 EXPORT_SYMBOL(simple_transaction_release);
index 763b78a6e9de41dc9b6c5c0fb6bd438563f14c14..83ee34203bd7748ffa138a93c21ea964b140a1b8 100644 (file)
@@ -426,8 +426,15 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
                        ret = nlm_granted;
                        goto out;
                case -EAGAIN:
+                       /*
+                        * If this is a blocking request for an
+                        * already pending lock request then we need
+                        * to put it back on lockd's block list
+                        */
+                       if (wait)
+                               break;
                        ret = nlm_lck_denied;
-                       break;
+                       goto out;
                case FILE_LOCK_DEFERRED:
                        if (wait)
                                break;
@@ -443,10 +450,6 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
                        goto out;
        }
 
-       ret = nlm_lck_denied;
-       if (!wait)
-               goto out;
-
        ret = nlm_lck_blocked;
 
        /* Append to list of blocked */
index 82eaadbff40872f6fbae90e52a8acf28bca52d7c..6717200923fe31c0b8f733c9544e8d5307b9d2a5 100644 (file)
@@ -1228,7 +1228,6 @@ static int nfs_parse_mount_options(char *raw,
                                goto out_nomem;
                        token = match_token(string,
                                            nfs_xprt_protocol_tokens, args);
-                       kfree(string);
 
                        switch (token) {
                        case Opt_xprt_udp:
@@ -1258,6 +1257,7 @@ static int nfs_parse_mount_options(char *raw,
                                goto out_nomem;
                        token = match_token(string,
                                            nfs_xprt_protocol_tokens, args);
+                       kfree(string);
 
                        switch (token) {
                        case Opt_xprt_udp:
index 44d7d04dab95db965e50c8e86e58567fca2bb351..503b9da159a3d3def44ca3cb5d752d1020eb1e50 100644 (file)
@@ -1,6 +1,7 @@
 config NFSD
        tristate "NFS server support"
        depends on INET
+       depends on FILE_LOCKING
        select LOCKD
        select SUNRPC
        select EXPORTFS
index 9dbd2eb91281b14a4f3472c3ac5dad046c4525c9..7c9fe838f038c2a72bfc3cad37698edc6e946656 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/unistd.h>
 #include <linux/slab.h>
 #include <linux/major.h>
+#include <linux/magic.h>
 
 #include <linux/sunrpc/svc.h>
 #include <linux/nfsd/nfsd.h>
@@ -202,6 +203,7 @@ nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
                                         struct nfsd3_writeres  *resp)
 {
        __be32  nfserr;
+       unsigned long cnt = argp->len;
 
        dprintk("nfsd: WRITE(3)    %s %d bytes at %ld%s\n",
                                SVCFH_fmt(&argp->fh),
@@ -214,9 +216,9 @@ nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
        nfserr = nfsd_write(rqstp, &resp->fh, NULL,
                                   argp->offset,
                                   rqstp->rq_vec, argp->vlen,
-                                  argp->len,
+                                  &cnt,
                                   &resp->committed);
-       resp->count = argp->count;
+       resp->count = cnt;
        RETURN_STATUS(nfserr);
 }
 
@@ -569,7 +571,7 @@ nfsd3_proc_fsinfo(struct svc_rqst * rqstp, struct nfsd_fhandle    *argp,
                struct super_block *sb = argp->fh.fh_dentry->d_inode->i_sb;
 
                /* Note that we don't care for remote fs's here */
-               if (sb->s_magic == 0x4d44 /* MSDOS_SUPER_MAGIC */) {
+               if (sb->s_magic == MSDOS_SUPER_MAGIC) {
                        resp->f_properties = NFS3_FSF_BILLYBOY;
                }
                resp->f_maxfilesize = sb->s_maxbytes;
@@ -610,7 +612,7 @@ nfsd3_proc_pathconf(struct svc_rqst * rqstp, struct nfsd_fhandle      *argp,
                        resp->p_link_max = EXT2_LINK_MAX;
                        resp->p_name_max = EXT2_NAME_LEN;
                        break;
-               case 0x4d44:    /* MSDOS_SUPER_MAGIC */
+               case MSDOS_SUPER_MAGIC:
                        resp->p_case_insensitive = 1;
                        resp->p_case_preserving  = 0;
                        break;
index c464181b59941465dcc3bbde6bf2cd26e8559a43..290289bd44f76ccadb54614df6f5bb4775be1f35 100644 (file)
@@ -218,7 +218,7 @@ static int
 encode_cb_recall(struct xdr_stream *xdr, struct nfs4_cb_recall *cb_rec)
 {
        __be32 *p;
-       int len = cb_rec->cbr_fhlen;
+       int len = cb_rec->cbr_fh.fh_size;
 
        RESERVE_SPACE(12+sizeof(cb_rec->cbr_stateid) + len);
        WRITE32(OP_CB_RECALL);
@@ -226,7 +226,7 @@ encode_cb_recall(struct xdr_stream *xdr, struct nfs4_cb_recall *cb_rec)
        WRITEMEM(&cb_rec->cbr_stateid.si_opaque, sizeof(stateid_opaque_t));
        WRITE32(cb_rec->cbr_trunc);
        WRITE32(len);
-       WRITEMEM(cb_rec->cbr_fhval, len);
+       WRITEMEM(&cb_rec->cbr_fh.fh_base, len);
        return 0;
 }
 
@@ -361,9 +361,8 @@ static struct rpc_program cb_program = {
 /* Reference counting, callback cleanup, etc., all look racy as heck.
  * And why is cb_set an atomic? */
 
-static int do_probe_callback(void *data)
+static struct rpc_clnt *setup_callback_client(struct nfs4_client *clp)
 {
-       struct nfs4_client *clp = data;
        struct sockaddr_in      addr;
        struct nfs4_callback    *cb = &clp->cl_callback;
        struct rpc_timeout      timeparms = {
@@ -384,17 +383,10 @@ static int do_probe_callback(void *data)
                .flags          = (RPC_CLNT_CREATE_NOPING | RPC_CLNT_CREATE_QUIET),
                .client_name    = clp->cl_principal,
        };
-       struct rpc_message msg = {
-               .rpc_proc       = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL],
-               .rpc_argp       = clp,
-       };
        struct rpc_clnt *client;
-       int status;
 
-       if (!clp->cl_principal && (clp->cl_flavor >= RPC_AUTH_GSS_KRB5)) {
-               status = nfserr_cb_path_down;
-               goto out_err;
-       }
+       if (!clp->cl_principal && (clp->cl_flavor >= RPC_AUTH_GSS_KRB5))
+               return ERR_PTR(-EINVAL);
 
        /* Initialize address */
        memset(&addr, 0, sizeof(addr));
@@ -404,9 +396,29 @@ static int do_probe_callback(void *data)
 
        /* Create RPC client */
        client = rpc_create(&args);
+       if (IS_ERR(client))
+               dprintk("NFSD: couldn't create callback client: %ld\n",
+                       PTR_ERR(client));
+       return client;
+
+}
+
+static int do_probe_callback(void *data)
+{
+       struct nfs4_client *clp = data;
+       struct nfs4_callback    *cb = &clp->cl_callback;
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL],
+               .rpc_argp       = clp,
+       };
+       struct rpc_clnt *client;
+       int status;
+
+       client = setup_callback_client(clp);
        if (IS_ERR(client)) {
-               dprintk("NFSD: couldn't create callback client\n");
                status = PTR_ERR(client);
+               dprintk("NFSD: couldn't create callback client: %d\n",
+                                                               status);
                goto out_err;
        }
 
@@ -422,10 +434,10 @@ static int do_probe_callback(void *data)
 out_release_client:
        rpc_shutdown_client(client);
 out_err:
-       dprintk("NFSD: warning: no callback path to client %.*s\n",
-               (int)clp->cl_name.len, clp->cl_name.data);
+       dprintk("NFSD: warning: no callback path to client %.*s: error %d\n",
+               (int)clp->cl_name.len, clp->cl_name.data, status);
        put_nfs4_client(clp);
-       return status;
+       return 0;
 }
 
 /*
@@ -451,7 +463,6 @@ nfsd4_probe_callback(struct nfs4_client *clp)
 
 /*
  * called with dp->dl_count inc'ed.
- * nfs4_lock_state() may or may not have been called.
  */
 void
 nfsd4_cb_recall(struct nfs4_delegation *dp)
index 9fa60a3ad48cdc540542730c91d0724ef6213659..b2883e9c6381f22b51bc788174d149a20a5e2e54 100644 (file)
@@ -93,6 +93,21 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o
        open->op_truncate = 0;
 
        if (open->op_create) {
+               /* FIXME: check session persistence and pnfs flags.
+                * The nfsv4.1 spec requires the following semantics:
+                *
+                * Persistent   | pNFS   | Server REQUIRED | Client Allowed
+                * Reply Cache  | server |                 |
+                * -------------+--------+-----------------+--------------------
+                * no           | no     | EXCLUSIVE4_1    | EXCLUSIVE4_1
+                *              |        |                 | (SHOULD)
+                *              |        | and EXCLUSIVE4  | or EXCLUSIVE4
+                *              |        |                 | (SHOULD NOT)
+                * no           | yes    | EXCLUSIVE4_1    | EXCLUSIVE4_1
+                * yes          | no     | GUARDED4        | GUARDED4
+                * yes          | yes    | GUARDED4        | GUARDED4
+                */
+
                /*
                 * Note: create modes (UNCHECKED,GUARDED...) are the same
                 * in NFSv4 as in v3.
@@ -103,11 +118,13 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o
                                        (u32 *)open->op_verf.data,
                                        &open->op_truncate, &created);
 
-               /* If we ever decide to use different attrs to store the
-                * verifier in nfsd_create_v3, then we'll need to change this
+               /*
+                * Following rfc 3530 14.2.16, use the returned bitmask
+                * to indicate which attributes we used to store the
+                * verifier:
                 */
                if (open->op_createmode == NFS4_CREATE_EXCLUSIVE && status == 0)
-                       open->op_bmval[1] |= (FATTR4_WORD1_TIME_ACCESS |
+                       open->op_bmval[1] = (FATTR4_WORD1_TIME_ACCESS |
                                                FATTR4_WORD1_TIME_MODIFY);
        } else {
                status = nfsd_lookup(rqstp, current_fh,
@@ -118,13 +135,11 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o
                goto out;
 
        set_change_info(&open->op_cinfo, current_fh);
-
-       /* set reply cache */
        fh_dup2(current_fh, &resfh);
-       open->op_stateowner->so_replay.rp_openfh_len = resfh.fh_handle.fh_size;
-       memcpy(open->op_stateowner->so_replay.rp_openfh,
-                       &resfh.fh_handle.fh_base, resfh.fh_handle.fh_size);
 
+       /* set reply cache */
+       fh_copy_shallow(&open->op_stateowner->so_replay.rp_openfh,
+                       &resfh.fh_handle);
        if (!created)
                status = do_open_permission(rqstp, current_fh, open,
                                            NFSD_MAY_NOP);
@@ -150,10 +165,8 @@ do_open_fhandle(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_
        memset(&open->op_cinfo, 0, sizeof(struct nfsd4_change_info));
 
        /* set replay cache */
-       open->op_stateowner->so_replay.rp_openfh_len = current_fh->fh_handle.fh_size;
-       memcpy(open->op_stateowner->so_replay.rp_openfh,
-               &current_fh->fh_handle.fh_base,
-               current_fh->fh_handle.fh_size);
+       fh_copy_shallow(&open->op_stateowner->so_replay.rp_openfh,
+                       &current_fh->fh_handle);
 
        open->op_truncate = (open->op_iattr.ia_valid & ATTR_SIZE) &&
                (open->op_iattr.ia_size == 0);
@@ -164,12 +177,23 @@ do_open_fhandle(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_
        return status;
 }
 
+static void
+copy_clientid(clientid_t *clid, struct nfsd4_session *session)
+{
+       struct nfsd4_sessionid *sid =
+                       (struct nfsd4_sessionid *)session->se_sessionid.data;
+
+       clid->cl_boot = sid->clientid.cl_boot;
+       clid->cl_id = sid->clientid.cl_id;
+}
 
 static __be32
 nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
           struct nfsd4_open *open)
 {
        __be32 status;
+       struct nfsd4_compoundres *resp;
+
        dprintk("NFSD: nfsd4_open filename %.*s op_stateowner %p\n",
                (int)open->op_fname.len, open->op_fname.data,
                open->op_stateowner);
@@ -178,16 +202,19 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        if (open->op_create && open->op_claim_type != NFS4_OPEN_CLAIM_NULL)
                return nfserr_inval;
 
+       if (nfsd4_has_session(cstate))
+               copy_clientid(&open->op_clientid, cstate->session);
+
        nfs4_lock_state();
 
        /* check seqid for replay. set nfs4_owner */
-       status = nfsd4_process_open1(open);
+       resp = rqstp->rq_resp;
+       status = nfsd4_process_open1(&resp->cstate, open);
        if (status == nfserr_replay_me) {
                struct nfs4_replay *rp = &open->op_stateowner->so_replay;
                fh_put(&cstate->current_fh);
-               cstate->current_fh.fh_handle.fh_size = rp->rp_openfh_len;
-               memcpy(&cstate->current_fh.fh_handle.fh_base, rp->rp_openfh,
-                               rp->rp_openfh_len);
+               fh_copy_shallow(&cstate->current_fh.fh_handle,
+                               &rp->rp_openfh);
                status = fh_verify(rqstp, &cstate->current_fh, 0, NFSD_MAY_NOP);
                if (status)
                        dprintk("nfsd4_open: replay failed"
@@ -209,10 +236,6 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        switch (open->op_claim_type) {
                case NFS4_OPEN_CLAIM_DELEGATE_CUR:
-                       status = nfserr_inval;
-                       if (open->op_create)
-                               goto out;
-                       /* fall through */
                case NFS4_OPEN_CLAIM_NULL:
                        /*
                         * (1) set CURRENT_FH to the file being opened,
@@ -455,8 +478,9 @@ nfsd4_getattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        if (getattr->ga_bmval[1] & NFSD_WRITEONLY_ATTRS_WORD1)
                return nfserr_inval;
 
-       getattr->ga_bmval[0] &= NFSD_SUPPORTED_ATTRS_WORD0;
-       getattr->ga_bmval[1] &= NFSD_SUPPORTED_ATTRS_WORD1;
+       getattr->ga_bmval[0] &= nfsd_suppattrs0(cstate->minorversion);
+       getattr->ga_bmval[1] &= nfsd_suppattrs1(cstate->minorversion);
+       getattr->ga_bmval[2] &= nfsd_suppattrs2(cstate->minorversion);
 
        getattr->ga_fhp = &cstate->current_fh;
        return nfs_ok;
@@ -520,9 +544,8 @@ nfsd4_read(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        nfs4_lock_state();
        /* check stateid */
-       if ((status = nfs4_preprocess_stateid_op(&cstate->current_fh,
-                               &read->rd_stateid,
-                               CHECK_FH | RD_STATE, &read->rd_filp))) {
+       if ((status = nfs4_preprocess_stateid_op(cstate, &read->rd_stateid,
+                                                RD_STATE, &read->rd_filp))) {
                dprintk("NFSD: nfsd4_read: couldn't process stateid!\n");
                goto out;
        }
@@ -548,8 +571,9 @@ nfsd4_readdir(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        if (readdir->rd_bmval[1] & NFSD_WRITEONLY_ATTRS_WORD1)
                return nfserr_inval;
 
-       readdir->rd_bmval[0] &= NFSD_SUPPORTED_ATTRS_WORD0;
-       readdir->rd_bmval[1] &= NFSD_SUPPORTED_ATTRS_WORD1;
+       readdir->rd_bmval[0] &= nfsd_suppattrs0(cstate->minorversion);
+       readdir->rd_bmval[1] &= nfsd_suppattrs1(cstate->minorversion);
+       readdir->rd_bmval[2] &= nfsd_suppattrs2(cstate->minorversion);
 
        if ((cookie > ~(u32)0) || (cookie == 1) || (cookie == 2) ||
            (cookie == 0 && memcmp(readdir->rd_verf.data, zeroverf.data, NFS4_VERIFIER_SIZE)))
@@ -653,8 +677,8 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        if (setattr->sa_iattr.ia_valid & ATTR_SIZE) {
                nfs4_lock_state();
-               status = nfs4_preprocess_stateid_op(&cstate->current_fh,
-                       &setattr->sa_stateid, CHECK_FH | WR_STATE, NULL);
+               status = nfs4_preprocess_stateid_op(cstate,
+                       &setattr->sa_stateid, WR_STATE, NULL);
                nfs4_unlock_state();
                if (status) {
                        dprintk("NFSD: nfsd4_setattr: couldn't process stateid!\n");
@@ -685,6 +709,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        struct file *filp = NULL;
        u32 *p;
        __be32 status = nfs_ok;
+       unsigned long cnt;
 
        /* no need to check permission - this will be done in nfsd_write() */
 
@@ -692,8 +717,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                return nfserr_inval;
 
        nfs4_lock_state();
-       status = nfs4_preprocess_stateid_op(&cstate->current_fh, stateid,
-                                       CHECK_FH | WR_STATE, &filp);
+       status = nfs4_preprocess_stateid_op(cstate, stateid, WR_STATE, &filp);
        if (filp)
                get_file(filp);
        nfs4_unlock_state();
@@ -703,7 +727,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                return status;
        }
 
-       write->wr_bytes_written = write->wr_buflen;
+       cnt = write->wr_buflen;
        write->wr_how_written = write->wr_stable_how;
        p = (u32 *)write->wr_verifier.data;
        *p++ = nfssvc_boot.tv_sec;
@@ -711,10 +735,12 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        status =  nfsd_write(rqstp, &cstate->current_fh, filp,
                             write->wr_offset, rqstp->rq_vec, write->wr_vlen,
-                            write->wr_buflen, &write->wr_how_written);
+                            &cnt, &write->wr_how_written);
        if (filp)
                fput(filp);
 
+       write->wr_bytes_written = cnt;
+
        if (status == nfserr_symlink)
                status = nfserr_inval;
        return status;
@@ -737,8 +763,9 @@ _nfsd4_verify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        if (status)
                return status;
 
-       if ((verify->ve_bmval[0] & ~NFSD_SUPPORTED_ATTRS_WORD0)
-           || (verify->ve_bmval[1] & ~NFSD_SUPPORTED_ATTRS_WORD1))
+       if ((verify->ve_bmval[0] & ~nfsd_suppattrs0(cstate->minorversion))
+           || (verify->ve_bmval[1] & ~nfsd_suppattrs1(cstate->minorversion))
+           || (verify->ve_bmval[2] & ~nfsd_suppattrs2(cstate->minorversion)))
                return nfserr_attrnotsupp;
        if ((verify->ve_bmval[0] & FATTR4_WORD0_RDATTR_ERROR)
            || (verify->ve_bmval[1] & NFSD_WRITEONLY_ATTRS_WORD1))
@@ -766,7 +793,8 @@ _nfsd4_verify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        if (status)
                goto out_kfree;
 
-       p = buf + 3;
+       /* skip bitmap */
+       p = buf + 1 + ntohl(buf[0]);
        status = nfserr_not_same;
        if (ntohl(*p++) != verify->ve_attrlen)
                goto out_kfree;
@@ -813,39 +841,17 @@ static inline void nfsd4_increment_op_stats(u32 opnum)
                nfsdstats.nfs4_opcount[opnum]++;
 }
 
-static void cstate_free(struct nfsd4_compound_state *cstate)
-{
-       if (cstate == NULL)
-               return;
-       fh_put(&cstate->current_fh);
-       fh_put(&cstate->save_fh);
-       BUG_ON(cstate->replay_owner);
-       kfree(cstate);
-}
-
-static struct nfsd4_compound_state *cstate_alloc(void)
-{
-       struct nfsd4_compound_state *cstate;
-
-       cstate = kmalloc(sizeof(struct nfsd4_compound_state), GFP_KERNEL);
-       if (cstate == NULL)
-               return NULL;
-       fh_init(&cstate->current_fh, NFS4_FHSIZE);
-       fh_init(&cstate->save_fh, NFS4_FHSIZE);
-       cstate->replay_owner = NULL;
-       return cstate;
-}
-
 typedef __be32(*nfsd4op_func)(struct svc_rqst *, struct nfsd4_compound_state *,
                              void *);
+enum nfsd4_op_flags {
+       ALLOWED_WITHOUT_FH = 1 << 0,    /* No current filehandle required */
+       ALLOWED_ON_ABSENT_FS = 2 << 0,  /* ops processed on absent fs */
+       ALLOWED_AS_FIRST_OP = 3 << 0,   /* ops reqired first in compound */
+};
 
 struct nfsd4_operation {
        nfsd4op_func op_func;
        u32 op_flags;
-/* Most ops require a valid current filehandle; a few don't: */
-#define ALLOWED_WITHOUT_FH 1
-/* GETATTR and ops not listed as returning NFS4ERR_MOVED: */
-#define ALLOWED_ON_ABSENT_FS 2
        char *op_name;
 };
 
@@ -853,6 +859,51 @@ static struct nfsd4_operation nfsd4_ops[];
 
 static const char *nfsd4_op_name(unsigned opnum);
 
+/*
+ * This is a replay of a compound for which no cache entry pages
+ * were used. Encode the sequence operation, and if cachethis is FALSE
+ * encode the uncache rep error on the next operation.
+ */
+static __be32
+nfsd4_enc_uncached_replay(struct nfsd4_compoundargs *args,
+                        struct nfsd4_compoundres *resp)
+{
+       struct nfsd4_op *op;
+
+       dprintk("--> %s resp->opcnt %d ce_cachethis %u \n", __func__,
+               resp->opcnt, resp->cstate.slot->sl_cache_entry.ce_cachethis);
+
+       /* Encode the replayed sequence operation */
+       BUG_ON(resp->opcnt != 1);
+       op = &args->ops[resp->opcnt - 1];
+       nfsd4_encode_operation(resp, op);
+
+       /*return nfserr_retry_uncached_rep in next operation. */
+       if (resp->cstate.slot->sl_cache_entry.ce_cachethis == 0) {
+               op = &args->ops[resp->opcnt++];
+               op->status = nfserr_retry_uncached_rep;
+               nfsd4_encode_operation(resp, op);
+       }
+       return op->status;
+}
+
+/*
+ * Enforce NFSv4.1 COMPOUND ordering rules.
+ *
+ * TODO:
+ * - enforce NFS4ERR_NOT_ONLY_OP,
+ * - DESTROY_SESSION MUST be the final operation in the COMPOUND request.
+ */
+static bool nfs41_op_ordering_ok(struct nfsd4_compoundargs *args)
+{
+       if (args->minorversion && args->opcnt > 0) {
+               struct nfsd4_op *op = &args->ops[0];
+               return (op->status == nfserr_op_illegal) ||
+                      (nfsd4_ops[op->opnum].op_flags & ALLOWED_AS_FIRST_OP);
+       }
+       return true;
+}
+
 /*
  * COMPOUND call.
  */
@@ -863,12 +914,13 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
 {
        struct nfsd4_op *op;
        struct nfsd4_operation *opdesc;
-       struct nfsd4_compound_state *cstate = NULL;
+       struct nfsd4_compound_state *cstate = &resp->cstate;
        int             slack_bytes;
        __be32          status;
 
        resp->xbuf = &rqstp->rq_res;
-       resp->p = rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len;
+       resp->p = rqstp->rq_res.head[0].iov_base +
+                                               rqstp->rq_res.head[0].iov_len;
        resp->tagp = resp->p;
        /* reserve space for: taglen, tag, and opcnt */
        resp->p += 2 + XDR_QUADLEN(args->taglen);
@@ -877,18 +929,25 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
        resp->tag = args->tag;
        resp->opcnt = 0;
        resp->rqstp = rqstp;
+       resp->cstate.minorversion = args->minorversion;
+       resp->cstate.replay_owner = NULL;
+       fh_init(&resp->cstate.current_fh, NFS4_FHSIZE);
+       fh_init(&resp->cstate.save_fh, NFS4_FHSIZE);
+       /* Use the deferral mechanism only for NFSv4.0 compounds */
+       rqstp->rq_usedeferral = (args->minorversion == 0);
 
        /*
         * According to RFC3010, this takes precedence over all other errors.
         */
        status = nfserr_minor_vers_mismatch;
-       if (args->minorversion > NFSD_SUPPORTED_MINOR_VERSION)
+       if (args->minorversion > nfsd_supported_minorversion)
                goto out;
 
-       status = nfserr_resource;
-       cstate = cstate_alloc();
-       if (cstate == NULL)
-               goto out;
+       if (!nfs41_op_ordering_ok(args)) {
+               op = &args->ops[0];
+               op->status = nfserr_sequence_pos;
+               goto encode_op;
+       }
 
        status = nfs_ok;
        while (!status && resp->opcnt < args->opcnt) {
@@ -897,7 +956,6 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
                dprintk("nfsv4 compound op #%d/%d: %d (%s)\n",
                        resp->opcnt, args->opcnt, op->opnum,
                        nfsd4_op_name(op->opnum));
-
                /*
                 * The XDR decode routines may have pre-set op->status;
                 * for example, if there is a miscellaneous XDR error
@@ -938,6 +996,15 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
                        BUG_ON(op->status == nfs_ok);
 
 encode_op:
+               /* Only from SEQUENCE or CREATE_SESSION */
+               if (resp->cstate.status == nfserr_replay_cache) {
+                       dprintk("%s NFS4.1 replay from cache\n", __func__);
+                       if (nfsd4_not_cached(resp))
+                               status = nfsd4_enc_uncached_replay(args, resp);
+                       else
+                               status = op->status;
+                       goto out;
+               }
                if (op->status == nfserr_replay_me) {
                        op->replay = &cstate->replay_owner->so_replay;
                        nfsd4_encode_replay(resp, op);
@@ -961,15 +1028,24 @@ encode_op:
 
                nfsd4_increment_op_stats(op->opnum);
        }
+       if (!rqstp->rq_usedeferral && status == nfserr_dropit) {
+               dprintk("%s Dropit - send NFS4ERR_DELAY\n", __func__);
+               status = nfserr_jukebox;
+       }
 
-       cstate_free(cstate);
+       resp->cstate.status = status;
+       fh_put(&resp->cstate.current_fh);
+       fh_put(&resp->cstate.save_fh);
+       BUG_ON(resp->cstate.replay_owner);
 out:
        nfsd4_release_compoundargs(args);
+       /* Reset deferral mechanism for RPC deferrals */
+       rqstp->rq_usedeferral = 1;
        dprintk("nfsv4 compound returned %d\n", ntohl(status));
        return status;
 }
 
-static struct nfsd4_operation nfsd4_ops[OP_RELEASE_LOCKOWNER+1] = {
+static struct nfsd4_operation nfsd4_ops[] = {
        [OP_ACCESS] = {
                .op_func = (nfsd4op_func)nfsd4_access,
                .op_name = "OP_ACCESS",
@@ -1045,7 +1121,7 @@ static struct nfsd4_operation nfsd4_ops[OP_RELEASE_LOCKOWNER+1] = {
                .op_name = "OP_PUTFH",
        },
        [OP_PUTPUBFH] = {
-               /* unsupported, just for future reference: */
+               .op_func = (nfsd4op_func)nfsd4_putrootfh,
                .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_ON_ABSENT_FS,
                .op_name = "OP_PUTPUBFH",
        },
@@ -1119,6 +1195,28 @@ static struct nfsd4_operation nfsd4_ops[OP_RELEASE_LOCKOWNER+1] = {
                .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_ON_ABSENT_FS,
                .op_name = "OP_RELEASE_LOCKOWNER",
        },
+
+       /* NFSv4.1 operations */
+       [OP_EXCHANGE_ID] = {
+               .op_func = (nfsd4op_func)nfsd4_exchange_id,
+               .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP,
+               .op_name = "OP_EXCHANGE_ID",
+       },
+       [OP_CREATE_SESSION] = {
+               .op_func = (nfsd4op_func)nfsd4_create_session,
+               .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP,
+               .op_name = "OP_CREATE_SESSION",
+       },
+       [OP_DESTROY_SESSION] = {
+               .op_func = (nfsd4op_func)nfsd4_destroy_session,
+               .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP,
+               .op_name = "OP_DESTROY_SESSION",
+       },
+       [OP_SEQUENCE] = {
+               .op_func = (nfsd4op_func)nfsd4_sequence,
+               .op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP,
+               .op_name = "OP_SEQUENCE",
+       },
 };
 
 static const char *nfsd4_op_name(unsigned opnum)
index 74f7b67567fda431dbeb9a0a6a8d3b0a32df8a10..3444c0052a8764d3098a9a34f2c53872b4d2f3ad 100644 (file)
@@ -182,36 +182,26 @@ out_unlock:
 
 typedef int (recdir_func)(struct dentry *, struct dentry *);
 
-struct dentry_list {
-       struct dentry *dentry;
+struct name_list {
+       char name[HEXDIR_LEN];
        struct list_head list;
 };
 
-struct dentry_list_arg {
-       struct list_head dentries;
-       struct dentry *parent;
-};
-
 static int
-nfsd4_build_dentrylist(void *arg, const char *name, int namlen,
+nfsd4_build_namelist(void *arg, const char *name, int namlen,
                loff_t offset, u64 ino, unsigned int d_type)
 {
-       struct dentry_list_arg *dla = arg;
-       struct list_head *dentries = &dla->dentries;
-       struct dentry *parent = dla->parent;
-       struct dentry *dentry;
-       struct dentry_list *child;
+       struct list_head *names = arg;
+       struct name_list *entry;
 
-       if (name && isdotent(name, namlen))
+       if (namlen != HEXDIR_LEN - 1)
                return 0;
-       dentry = lookup_one_len(name, parent, namlen);
-       if (IS_ERR(dentry))
-               return PTR_ERR(dentry);
-       child = kmalloc(sizeof(*child), GFP_KERNEL);
-       if (child == NULL)
+       entry = kmalloc(sizeof(struct name_list), GFP_KERNEL);
+       if (entry == NULL)
                return -ENOMEM;
-       child->dentry = dentry;
-       list_add(&child->list, dentries);
+       memcpy(entry->name, name, HEXDIR_LEN - 1);
+       entry->name[HEXDIR_LEN - 1] = '\0';
+       list_add(&entry->list, names);
        return 0;
 }
 
@@ -220,11 +210,9 @@ nfsd4_list_rec_dir(struct dentry *dir, recdir_func *f)
 {
        const struct cred *original_cred;
        struct file *filp;
-       struct dentry_list_arg dla = {
-               .parent = dir,
-       };
-       struct list_head *dentries = &dla.dentries;
-       struct dentry_list *child;
+       LIST_HEAD(names);
+       struct name_list *entry;
+       struct dentry *dentry;
        int status;
 
        if (!rec_dir_init)
@@ -233,31 +221,34 @@ nfsd4_list_rec_dir(struct dentry *dir, recdir_func *f)
        status = nfs4_save_creds(&original_cred);
        if (status < 0)
                return status;
-       INIT_LIST_HEAD(dentries);
 
        filp = dentry_open(dget(dir), mntget(rec_dir.mnt), O_RDONLY,
                           current_cred());
        status = PTR_ERR(filp);
        if (IS_ERR(filp))
                goto out;
-       INIT_LIST_HEAD(dentries);
-       status = vfs_readdir(filp, nfsd4_build_dentrylist, &dla);
+       status = vfs_readdir(filp, nfsd4_build_namelist, &names);
        fput(filp);
-       while (!list_empty(dentries)) {
-               child = list_entry(dentries->next, struct dentry_list, list);
-               status = f(dir, child->dentry);
+       while (!list_empty(&names)) {
+               entry = list_entry(names.next, struct name_list, list);
+
+               dentry = lookup_one_len(entry->name, dir, HEXDIR_LEN-1);
+               if (IS_ERR(dentry)) {
+                       status = PTR_ERR(dentry);
+                       goto out;
+               }
+               status = f(dir, dentry);
+               dput(dentry);
                if (status)
                        goto out;
-               list_del(&child->list);
-               dput(child->dentry);
-               kfree(child);
+               list_del(&entry->list);
+               kfree(entry);
        }
 out:
-       while (!list_empty(dentries)) {
-               child = list_entry(dentries->next, struct dentry_list, list);
-               list_del(&child->list);
-               dput(child->dentry);
-               kfree(child);
+       while (!list_empty(&names)) {
+               entry = list_entry(names.next, struct name_list, list);
+               list_del(&entry->list);
+               kfree(entry);
        }
        nfs4_reset_creds(original_cred);
        return status;
@@ -353,7 +344,8 @@ purge_old(struct dentry *parent, struct dentry *child)
 {
        int status;
 
-       if (nfs4_has_reclaimed_state(child->d_name.name))
+       /* note: we currently use this path only for minorversion 0 */
+       if (nfs4_has_reclaimed_state(child->d_name.name, false))
                return 0;
 
        status = nfsd4_clear_clid_dir(parent, child);
index b6f60f48e94b4038473faf04b766ce706e60a9d4..c65a27b76a9dd48f83f16de8452bfe0338094cb9 100644 (file)
@@ -68,6 +68,7 @@ static u32 current_delegid = 1;
 static u32 nfs4_init;
 static stateid_t zerostateid;             /* bits all 0 */
 static stateid_t onestateid;              /* bits all 1 */
+static u64 current_sessionid = 1;
 
 #define ZERO_STATEID(stateid) (!memcmp((stateid), &zerostateid, sizeof(stateid_t)))
 #define ONE_STATEID(stateid)  (!memcmp((stateid), &onestateid, sizeof(stateid_t)))
@@ -75,18 +76,21 @@ static stateid_t onestateid;              /* bits all 1 */
 /* forward declarations */
 static struct nfs4_stateid * find_stateid(stateid_t *stid, int flags);
 static struct nfs4_delegation * find_delegation_stateid(struct inode *ino, stateid_t *stid);
-static void release_stateid_lockowners(struct nfs4_stateid *open_stp);
 static char user_recovery_dirname[PATH_MAX] = "/var/lib/nfs/v4recovery";
 static void nfs4_set_recdir(char *recdir);
 
-/* Locking:
- *
- * client_mutex:
- *     protects clientid_hashtbl[], clientstr_hashtbl[],
- *     unconfstr_hashtbl[], uncofid_hashtbl[].
- */
+/* Locking: */
+
+/* Currently used for almost all code touching nfsv4 state: */
 static DEFINE_MUTEX(client_mutex);
 
+/*
+ * Currently used for the del_recall_lru and file hash table.  In an
+ * effort to decrease the scope of the client_mutex, this spinlock may
+ * eventually cover more:
+ */
+static DEFINE_SPINLOCK(recall_lock);
+
 static struct kmem_cache *stateowner_slab = NULL;
 static struct kmem_cache *file_slab = NULL;
 static struct kmem_cache *stateid_slab = NULL;
@@ -117,37 +121,23 @@ opaque_hashval(const void *ptr, int nbytes)
        return x;
 }
 
-/* forward declarations */
-static void release_stateowner(struct nfs4_stateowner *sop);
-static void release_stateid(struct nfs4_stateid *stp, int flags);
-
-/*
- * Delegation state
- */
-
-/* recall_lock protects the del_recall_lru */
-static DEFINE_SPINLOCK(recall_lock);
 static struct list_head del_recall_lru;
 
-static void
-free_nfs4_file(struct kref *kref)
-{
-       struct nfs4_file *fp = container_of(kref, struct nfs4_file, fi_ref);
-       list_del(&fp->fi_hash);
-       iput(fp->fi_inode);
-       kmem_cache_free(file_slab, fp);
-}
-
 static inline void
 put_nfs4_file(struct nfs4_file *fi)
 {
-       kref_put(&fi->fi_ref, free_nfs4_file);
+       if (atomic_dec_and_lock(&fi->fi_ref, &recall_lock)) {
+               list_del(&fi->fi_hash);
+               spin_unlock(&recall_lock);
+               iput(fi->fi_inode);
+               kmem_cache_free(file_slab, fi);
+       }
 }
 
 static inline void
 get_nfs4_file(struct nfs4_file *fi)
 {
-       kref_get(&fi->fi_ref);
+       atomic_inc(&fi->fi_ref);
 }
 
 static int num_delegations;
@@ -220,9 +210,7 @@ alloc_init_deleg(struct nfs4_client *clp, struct nfs4_stateid *stp, struct svc_f
        dp->dl_stateid.si_stateownerid = current_delegid++;
        dp->dl_stateid.si_fileid = 0;
        dp->dl_stateid.si_generation = 0;
-       dp->dl_fhlen = current_fh->fh_handle.fh_size;
-       memcpy(dp->dl_fhval, &current_fh->fh_handle.fh_base,
-                       current_fh->fh_handle.fh_size);
+       fh_copy_shallow(&dp->dl_fh, &current_fh->fh_handle);
        dp->dl_time = 0;
        atomic_set(&dp->dl_count, 1);
        list_add(&dp->dl_perfile, &fp->fi_delegations);
@@ -311,6 +299,291 @@ static struct list_head   unconf_id_hashtbl[CLIENT_HASH_SIZE];
 static struct list_head client_lru;
 static struct list_head close_lru;
 
+static void unhash_generic_stateid(struct nfs4_stateid *stp)
+{
+       list_del(&stp->st_hash);
+       list_del(&stp->st_perfile);
+       list_del(&stp->st_perstateowner);
+}
+
+static void free_generic_stateid(struct nfs4_stateid *stp)
+{
+       put_nfs4_file(stp->st_file);
+       kmem_cache_free(stateid_slab, stp);
+}
+
+static void release_lock_stateid(struct nfs4_stateid *stp)
+{
+       unhash_generic_stateid(stp);
+       locks_remove_posix(stp->st_vfs_file, (fl_owner_t)stp->st_stateowner);
+       free_generic_stateid(stp);
+}
+
+static void unhash_lockowner(struct nfs4_stateowner *sop)
+{
+       struct nfs4_stateid *stp;
+
+       list_del(&sop->so_idhash);
+       list_del(&sop->so_strhash);
+       list_del(&sop->so_perstateid);
+       while (!list_empty(&sop->so_stateids)) {
+               stp = list_first_entry(&sop->so_stateids,
+                               struct nfs4_stateid, st_perstateowner);
+               release_lock_stateid(stp);
+       }
+}
+
+static void release_lockowner(struct nfs4_stateowner *sop)
+{
+       unhash_lockowner(sop);
+       nfs4_put_stateowner(sop);
+}
+
+static void
+release_stateid_lockowners(struct nfs4_stateid *open_stp)
+{
+       struct nfs4_stateowner *lock_sop;
+
+       while (!list_empty(&open_stp->st_lockowners)) {
+               lock_sop = list_entry(open_stp->st_lockowners.next,
+                               struct nfs4_stateowner, so_perstateid);
+               /* list_del(&open_stp->st_lockowners);  */
+               BUG_ON(lock_sop->so_is_open_owner);
+               release_lockowner(lock_sop);
+       }
+}
+
+static void release_open_stateid(struct nfs4_stateid *stp)
+{
+       unhash_generic_stateid(stp);
+       release_stateid_lockowners(stp);
+       nfsd_close(stp->st_vfs_file);
+       free_generic_stateid(stp);
+}
+
+static void unhash_openowner(struct nfs4_stateowner *sop)
+{
+       struct nfs4_stateid *stp;
+
+       list_del(&sop->so_idhash);
+       list_del(&sop->so_strhash);
+       list_del(&sop->so_perclient);
+       list_del(&sop->so_perstateid); /* XXX: necessary? */
+       while (!list_empty(&sop->so_stateids)) {
+               stp = list_first_entry(&sop->so_stateids,
+                               struct nfs4_stateid, st_perstateowner);
+               release_open_stateid(stp);
+       }
+}
+
+static void release_openowner(struct nfs4_stateowner *sop)
+{
+       unhash_openowner(sop);
+       list_del(&sop->so_close_lru);
+       nfs4_put_stateowner(sop);
+}
+
+static DEFINE_SPINLOCK(sessionid_lock);
+#define SESSION_HASH_SIZE      512
+static struct list_head sessionid_hashtbl[SESSION_HASH_SIZE];
+
+static inline int
+hash_sessionid(struct nfs4_sessionid *sessionid)
+{
+       struct nfsd4_sessionid *sid = (struct nfsd4_sessionid *)sessionid;
+
+       return sid->sequence % SESSION_HASH_SIZE;
+}
+
+static inline void
+dump_sessionid(const char *fn, struct nfs4_sessionid *sessionid)
+{
+       u32 *ptr = (u32 *)(&sessionid->data[0]);
+       dprintk("%s: %u:%u:%u:%u\n", fn, ptr[0], ptr[1], ptr[2], ptr[3]);
+}
+
+static void
+gen_sessionid(struct nfsd4_session *ses)
+{
+       struct nfs4_client *clp = ses->se_client;
+       struct nfsd4_sessionid *sid;
+
+       sid = (struct nfsd4_sessionid *)ses->se_sessionid.data;
+       sid->clientid = clp->cl_clientid;
+       sid->sequence = current_sessionid++;
+       sid->reserved = 0;
+}
+
+/*
+ * Give the client the number of slots it requests bound by
+ * NFSD_MAX_SLOTS_PER_SESSION and by sv_drc_max_pages.
+ *
+ * If we run out of pages (sv_drc_pages_used == sv_drc_max_pages) we
+ * should (up to a point) re-negotiate active sessions and reduce their
+ * slot usage to make rooom for new connections. For now we just fail the
+ * create session.
+ */
+static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
+{
+       int status = 0, np = fchan->maxreqs * NFSD_PAGES_PER_SLOT;
+
+       spin_lock(&nfsd_serv->sv_lock);
+       if (np + nfsd_serv->sv_drc_pages_used > nfsd_serv->sv_drc_max_pages)
+               np = nfsd_serv->sv_drc_max_pages - nfsd_serv->sv_drc_pages_used;
+       nfsd_serv->sv_drc_pages_used += np;
+       spin_unlock(&nfsd_serv->sv_lock);
+
+       if (np <= 0) {
+               status = nfserr_resource;
+               fchan->maxreqs = 0;
+       } else
+               fchan->maxreqs = np / NFSD_PAGES_PER_SLOT;
+
+       return status;
+}
+
+/*
+ * fchan holds the client values on input, and the server values on output
+ */
+static int init_forechannel_attrs(struct svc_rqst *rqstp,
+                                   struct nfsd4_session *session,
+                                   struct nfsd4_channel_attrs *fchan)
+{
+       int status = 0;
+       __u32   maxcount = svc_max_payload(rqstp);
+
+       /* headerpadsz set to zero in encode routine */
+
+       /* Use the client's max request and max response size if possible */
+       if (fchan->maxreq_sz > maxcount)
+               fchan->maxreq_sz = maxcount;
+       session->se_fmaxreq_sz = fchan->maxreq_sz;
+
+       if (fchan->maxresp_sz > maxcount)
+               fchan->maxresp_sz = maxcount;
+       session->se_fmaxresp_sz = fchan->maxresp_sz;
+
+       /* Set the max response cached size our default which is
+        * a multiple of PAGE_SIZE and small */
+       session->se_fmaxresp_cached = NFSD_PAGES_PER_SLOT * PAGE_SIZE;
+       fchan->maxresp_cached = session->se_fmaxresp_cached;
+
+       /* Use the client's maxops if possible */
+       if (fchan->maxops > NFSD_MAX_OPS_PER_COMPOUND)
+               fchan->maxops = NFSD_MAX_OPS_PER_COMPOUND;
+       session->se_fmaxops = fchan->maxops;
+
+       /* try to use the client requested number of slots */
+       if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
+               fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
+
+       /* FIXME: Error means no more DRC pages so the server should
+        * recover pages from existing sessions. For now fail session
+        * creation.
+        */
+       status = set_forechannel_maxreqs(fchan);
+
+       session->se_fnumslots = fchan->maxreqs;
+       return status;
+}
+
+static int
+alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp,
+                  struct nfsd4_create_session *cses)
+{
+       struct nfsd4_session *new, tmp;
+       int idx, status = nfserr_resource, slotsize;
+
+       memset(&tmp, 0, sizeof(tmp));
+
+       /* FIXME: For now, we just accept the client back channel attributes. */
+       status = init_forechannel_attrs(rqstp, &tmp, &cses->fore_channel);
+       if (status)
+               goto out;
+
+       /* allocate struct nfsd4_session and slot table in one piece */
+       slotsize = tmp.se_fnumslots * sizeof(struct nfsd4_slot);
+       new = kzalloc(sizeof(*new) + slotsize, GFP_KERNEL);
+       if (!new)
+               goto out;
+
+       memcpy(new, &tmp, sizeof(*new));
+
+       new->se_client = clp;
+       gen_sessionid(new);
+       idx = hash_sessionid(&new->se_sessionid);
+       memcpy(clp->cl_sessionid.data, new->se_sessionid.data,
+              NFS4_MAX_SESSIONID_LEN);
+
+       new->se_flags = cses->flags;
+       kref_init(&new->se_ref);
+       spin_lock(&sessionid_lock);
+       list_add(&new->se_hash, &sessionid_hashtbl[idx]);
+       list_add(&new->se_perclnt, &clp->cl_sessions);
+       spin_unlock(&sessionid_lock);
+
+       status = nfs_ok;
+out:
+       return status;
+}
+
+/* caller must hold sessionid_lock */
+static struct nfsd4_session *
+find_in_sessionid_hashtbl(struct nfs4_sessionid *sessionid)
+{
+       struct nfsd4_session *elem;
+       int idx;
+
+       dump_sessionid(__func__, sessionid);
+       idx = hash_sessionid(sessionid);
+       dprintk("%s: idx is %d\n", __func__, idx);
+       /* Search in the appropriate list */
+       list_for_each_entry(elem, &sessionid_hashtbl[idx], se_hash) {
+               dump_sessionid("list traversal", &elem->se_sessionid);
+               if (!memcmp(elem->se_sessionid.data, sessionid->data,
+                           NFS4_MAX_SESSIONID_LEN)) {
+                       return elem;
+               }
+       }
+
+       dprintk("%s: session not found\n", __func__);
+       return NULL;
+}
+
+/* caller must hold sessionid_lock */
+static void
+unhash_session(struct nfsd4_session *ses)
+{
+       list_del(&ses->se_hash);
+       list_del(&ses->se_perclnt);
+}
+
+static void
+release_session(struct nfsd4_session *ses)
+{
+       spin_lock(&sessionid_lock);
+       unhash_session(ses);
+       spin_unlock(&sessionid_lock);
+       nfsd4_put_session(ses);
+}
+
+static void nfsd4_release_respages(struct page **respages, short resused);
+
+void
+free_session(struct kref *kref)
+{
+       struct nfsd4_session *ses;
+       int i;
+
+       ses = container_of(kref, struct nfsd4_session, se_ref);
+       for (i = 0; i < ses->se_fnumslots; i++) {
+               struct nfsd4_cache_entry *e = &ses->se_slots[i].sl_cache_entry;
+               nfsd4_release_respages(e->ce_respages, e->ce_resused);
+       }
+       kfree(ses->se_slots);
+       kfree(ses);
+}
+
 static inline void
 renew_client(struct nfs4_client *clp)
 {
@@ -330,8 +603,8 @@ STALE_CLIENTID(clientid_t *clid)
 {
        if (clid->cl_boot == boot_time)
                return 0;
-       dprintk("NFSD stale clientid (%08x/%08x)\n", 
-                       clid->cl_boot, clid->cl_id);
+       dprintk("NFSD stale clientid (%08x/%08x) boot_time %08lx\n",
+               clid->cl_boot, clid->cl_id, boot_time);
        return 1;
 }
 
@@ -376,6 +649,8 @@ static inline void
 free_client(struct nfs4_client *clp)
 {
        shutdown_callback_client(clp);
+       nfsd4_release_respages(clp->cl_slot.sl_cache_entry.ce_respages,
+                            clp->cl_slot.sl_cache_entry.ce_resused);
        if (clp->cl_cred.cr_group_info)
                put_group_info(clp->cl_cred.cr_group_info);
        kfree(clp->cl_principal);
@@ -420,7 +695,13 @@ expire_client(struct nfs4_client *clp)
        list_del(&clp->cl_lru);
        while (!list_empty(&clp->cl_openowners)) {
                sop = list_entry(clp->cl_openowners.next, struct nfs4_stateowner, so_perclient);
-               release_stateowner(sop);
+               release_openowner(sop);
+       }
+       while (!list_empty(&clp->cl_sessions)) {
+               struct nfsd4_session  *ses;
+               ses = list_entry(clp->cl_sessions.next, struct nfsd4_session,
+                                se_perclnt);
+               release_session(ses);
        }
        put_nfs4_client(clp);
 }
@@ -439,6 +720,7 @@ static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir)
        INIT_LIST_HEAD(&clp->cl_strhash);
        INIT_LIST_HEAD(&clp->cl_openowners);
        INIT_LIST_HEAD(&clp->cl_delegations);
+       INIT_LIST_HEAD(&clp->cl_sessions);
        INIT_LIST_HEAD(&clp->cl_lru);
        return clp;
 }
@@ -568,25 +850,45 @@ find_unconfirmed_client(clientid_t *clid)
        return NULL;
 }
 
+/*
+ * Return 1 iff clp's clientid establishment method matches the use_exchange_id
+ * parameter. Matching is based on the fact the at least one of the
+ * EXCHGID4_FLAG_USE_{NON_PNFS,PNFS_MDS,PNFS_DS} flags must be set for v4.1
+ *
+ * FIXME: we need to unify the clientid namespaces for nfsv4.x
+ * and correctly deal with client upgrade/downgrade in EXCHANGE_ID
+ * and SET_CLIENTID{,_CONFIRM}
+ */
+static inline int
+match_clientid_establishment(struct nfs4_client *clp, bool use_exchange_id)
+{
+       bool has_exchange_flags = (clp->cl_exchange_flags != 0);
+       return use_exchange_id == has_exchange_flags;
+}
+
 static struct nfs4_client *
-find_confirmed_client_by_str(const char *dname, unsigned int hashval)
+find_confirmed_client_by_str(const char *dname, unsigned int hashval,
+                            bool use_exchange_id)
 {
        struct nfs4_client *clp;
 
        list_for_each_entry(clp, &conf_str_hashtbl[hashval], cl_strhash) {
-               if (same_name(clp->cl_recdir, dname))
+               if (same_name(clp->cl_recdir, dname) &&
+                   match_clientid_establishment(clp, use_exchange_id))
                        return clp;
        }
        return NULL;
 }
 
 static struct nfs4_client *
-find_unconfirmed_client_by_str(const char *dname, unsigned int hashval)
+find_unconfirmed_client_by_str(const char *dname, unsigned int hashval,
+                              bool use_exchange_id)
 {
        struct nfs4_client *clp;
 
        list_for_each_entry(clp, &unconf_str_hashtbl[hashval], cl_strhash) {
-               if (same_name(clp->cl_recdir, dname))
+               if (same_name(clp->cl_recdir, dname) &&
+                   match_clientid_establishment(clp, use_exchange_id))
                        return clp;
        }
        return NULL;
@@ -685,6 +987,534 @@ out_err:
        return;
 }
 
+void
+nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp)
+{
+       struct nfsd4_compoundres *resp = rqstp->rq_resp;
+
+       resp->cstate.statp = statp;
+}
+
+/*
+ * Dereference the result pages.
+ */
+static void
+nfsd4_release_respages(struct page **respages, short resused)
+{
+       int i;
+
+       dprintk("--> %s\n", __func__);
+       for (i = 0; i < resused; i++) {
+               if (!respages[i])
+                       continue;
+               put_page(respages[i]);
+               respages[i] = NULL;
+       }
+}
+
+static void
+nfsd4_copy_pages(struct page **topages, struct page **frompages, short count)
+{
+       int i;
+
+       for (i = 0; i < count; i++) {
+               topages[i] = frompages[i];
+               if (!topages[i])
+                       continue;
+               get_page(topages[i]);
+       }
+}
+
+/*
+ * Cache the reply pages up to NFSD_PAGES_PER_SLOT + 1, clearing the previous
+ * pages. We add a page to NFSD_PAGES_PER_SLOT for the case where the total
+ * length of the XDR response is less than se_fmaxresp_cached
+ * (NFSD_PAGES_PER_SLOT * PAGE_SIZE) but the xdr_buf pages is used for a
+ * of the reply (e.g. readdir).
+ *
+ * Store the base and length of the rq_req.head[0] page
+ * of the NFSv4.1 data, just past the rpc header.
+ */
+void
+nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
+{
+       struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
+       struct svc_rqst *rqstp = resp->rqstp;
+       struct nfsd4_compoundargs *args = rqstp->rq_argp;
+       struct nfsd4_op *op = &args->ops[resp->opcnt];
+       struct kvec *resv = &rqstp->rq_res.head[0];
+
+       dprintk("--> %s entry %p\n", __func__, entry);
+
+       /* Don't cache a failed OP_SEQUENCE. */
+       if (resp->opcnt == 1 && op->opnum == OP_SEQUENCE && resp->cstate.status)
+               return;
+
+       nfsd4_release_respages(entry->ce_respages, entry->ce_resused);
+       entry->ce_opcnt = resp->opcnt;
+       entry->ce_status = resp->cstate.status;
+
+       /*
+        * Don't need a page to cache just the sequence operation - the slot
+        * does this for us!
+        */
+
+       if (nfsd4_not_cached(resp)) {
+               entry->ce_resused = 0;
+               entry->ce_rpchdrlen = 0;
+               dprintk("%s Just cache SEQUENCE. ce_cachethis %d\n", __func__,
+                       resp->cstate.slot->sl_cache_entry.ce_cachethis);
+               return;
+       }
+       entry->ce_resused = rqstp->rq_resused;
+       if (entry->ce_resused > NFSD_PAGES_PER_SLOT + 1)
+               entry->ce_resused = NFSD_PAGES_PER_SLOT + 1;
+       nfsd4_copy_pages(entry->ce_respages, rqstp->rq_respages,
+                        entry->ce_resused);
+       entry->ce_datav.iov_base = resp->cstate.statp;
+       entry->ce_datav.iov_len = resv->iov_len - ((char *)resp->cstate.statp -
+                               (char *)page_address(rqstp->rq_respages[0]));
+       /* Current request rpc header length*/
+       entry->ce_rpchdrlen = (char *)resp->cstate.statp -
+                               (char *)page_address(rqstp->rq_respages[0]);
+}
+
+/*
+ * We keep the rpc header, but take the nfs reply from the replycache.
+ */
+static int
+nfsd41_copy_replay_data(struct nfsd4_compoundres *resp,
+                       struct nfsd4_cache_entry *entry)
+{
+       struct svc_rqst *rqstp = resp->rqstp;
+       struct kvec *resv = &resp->rqstp->rq_res.head[0];
+       int len;
+
+       /* Current request rpc header length*/
+       len = (char *)resp->cstate.statp -
+                       (char *)page_address(rqstp->rq_respages[0]);
+       if (entry->ce_datav.iov_len + len > PAGE_SIZE) {
+               dprintk("%s v41 cached reply too large (%Zd).\n", __func__,
+                       entry->ce_datav.iov_len);
+               return 0;
+       }
+       /* copy the cached reply nfsd data past the current rpc header */
+       memcpy((char *)resv->iov_base + len, entry->ce_datav.iov_base,
+               entry->ce_datav.iov_len);
+       resv->iov_len = len + entry->ce_datav.iov_len;
+       return 1;
+}
+
+/*
+ * Keep the first page of the replay. Copy the NFSv4.1 data from the first
+ * cached page.  Replace any futher replay pages from the cache.
+ */
+__be32
+nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
+                        struct nfsd4_sequence *seq)
+{
+       struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
+       __be32 status;
+
+       dprintk("--> %s entry %p\n", __func__, entry);
+
+       /*
+        * If this is just the sequence operation, we did not keep
+        * a page in the cache entry because we can just use the
+        * slot info stored in struct nfsd4_sequence that was checked
+        * against the slot in nfsd4_sequence().
+        *
+        * This occurs when seq->cachethis is FALSE, or when the client
+        * session inactivity timer fires and a solo sequence operation
+        * is sent (lease renewal).
+        */
+       if (seq && nfsd4_not_cached(resp)) {
+               seq->maxslots = resp->cstate.session->se_fnumslots;
+               return nfs_ok;
+       }
+
+       if (!nfsd41_copy_replay_data(resp, entry)) {
+               /*
+                * Not enough room to use the replay rpc header, send the
+                * cached header. Release all the allocated result pages.
+                */
+               svc_free_res_pages(resp->rqstp);
+               nfsd4_copy_pages(resp->rqstp->rq_respages, entry->ce_respages,
+                       entry->ce_resused);
+       } else {
+               /* Release all but the first allocated result page */
+
+               resp->rqstp->rq_resused--;
+               svc_free_res_pages(resp->rqstp);
+
+               nfsd4_copy_pages(&resp->rqstp->rq_respages[1],
+                                &entry->ce_respages[1],
+                                entry->ce_resused - 1);
+       }
+
+       resp->rqstp->rq_resused = entry->ce_resused;
+       resp->opcnt = entry->ce_opcnt;
+       resp->cstate.iovlen = entry->ce_datav.iov_len + entry->ce_rpchdrlen;
+       status = entry->ce_status;
+
+       return status;
+}
+
+/*
+ * Set the exchange_id flags returned by the server.
+ */
+static void
+nfsd4_set_ex_flags(struct nfs4_client *new, struct nfsd4_exchange_id *clid)
+{
+       /* pNFS is not supported */
+       new->cl_exchange_flags |= EXCHGID4_FLAG_USE_NON_PNFS;
+
+       /* Referrals are supported, Migration is not. */
+       new->cl_exchange_flags |= EXCHGID4_FLAG_SUPP_MOVED_REFER;
+
+       /* set the wire flags to return to client. */
+       clid->flags = new->cl_exchange_flags;
+}
+
+__be32
+nfsd4_exchange_id(struct svc_rqst *rqstp,
+                 struct nfsd4_compound_state *cstate,
+                 struct nfsd4_exchange_id *exid)
+{
+       struct nfs4_client *unconf, *conf, *new;
+       int status;
+       unsigned int            strhashval;
+       char                    dname[HEXDIR_LEN];
+       nfs4_verifier           verf = exid->verifier;
+       u32                     ip_addr = svc_addr_in(rqstp)->sin_addr.s_addr;
+
+       dprintk("%s rqstp=%p exid=%p clname.len=%u clname.data=%p "
+               " ip_addr=%u flags %x, spa_how %d\n",
+               __func__, rqstp, exid, exid->clname.len, exid->clname.data,
+               ip_addr, exid->flags, exid->spa_how);
+
+       if (!check_name(exid->clname) || (exid->flags & ~EXCHGID4_FLAG_MASK_A))
+               return nfserr_inval;
+
+       /* Currently only support SP4_NONE */
+       switch (exid->spa_how) {
+       case SP4_NONE:
+               break;
+       case SP4_SSV:
+               return nfserr_encr_alg_unsupp;
+       default:
+               BUG();                          /* checked by xdr code */
+       case SP4_MACH_CRED:
+               return nfserr_serverfault;      /* no excuse :-/ */
+       }
+
+       status = nfs4_make_rec_clidname(dname, &exid->clname);
+
+       if (status)
+               goto error;
+
+       strhashval = clientstr_hashval(dname);
+
+       nfs4_lock_state();
+       status = nfs_ok;
+
+       conf = find_confirmed_client_by_str(dname, strhashval, true);
+       if (conf) {
+               if (!same_verf(&verf, &conf->cl_verifier)) {
+                       /* 18.35.4 case 8 */
+                       if (exid->flags & EXCHGID4_FLAG_UPD_CONFIRMED_REC_A) {
+                               status = nfserr_not_same;
+                               goto out;
+                       }
+                       /* Client reboot: destroy old state */
+                       expire_client(conf);
+                       goto out_new;
+               }
+               if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
+                       /* 18.35.4 case 9 */
+                       if (exid->flags & EXCHGID4_FLAG_UPD_CONFIRMED_REC_A) {
+                               status = nfserr_perm;
+                               goto out;
+                       }
+                       expire_client(conf);
+                       goto out_new;
+               }
+               if (ip_addr != conf->cl_addr &&
+                   !(exid->flags & EXCHGID4_FLAG_UPD_CONFIRMED_REC_A)) {
+                       /* Client collision. 18.35.4 case 3 */
+                       status = nfserr_clid_inuse;
+                       goto out;
+               }
+               /*
+                * Set bit when the owner id and verifier map to an already
+                * confirmed client id (18.35.3).
+                */
+               exid->flags |= EXCHGID4_FLAG_CONFIRMED_R;
+
+               /*
+                * Falling into 18.35.4 case 2, possible router replay.
+                * Leave confirmed record intact and return same result.
+                */
+               copy_verf(conf, &verf);
+               new = conf;
+               goto out_copy;
+       } else {
+               /* 18.35.4 case 7 */
+               if (exid->flags & EXCHGID4_FLAG_UPD_CONFIRMED_REC_A) {
+                       status = nfserr_noent;
+                       goto out;
+               }
+       }
+
+       unconf  = find_unconfirmed_client_by_str(dname, strhashval, true);
+       if (unconf) {
+               /*
+                * Possible retry or client restart.  Per 18.35.4 case 4,
+                * a new unconfirmed record should be generated regardless
+                * of whether any properties have changed.
+                */
+               expire_client(unconf);
+       }
+
+out_new:
+       /* Normal case */
+       new = create_client(exid->clname, dname);
+       if (new == NULL) {
+               status = nfserr_resource;
+               goto out;
+       }
+
+       copy_verf(new, &verf);
+       copy_cred(&new->cl_cred, &rqstp->rq_cred);
+       new->cl_addr = ip_addr;
+       gen_clid(new);
+       gen_confirm(new);
+       add_to_unconfirmed(new, strhashval);
+out_copy:
+       exid->clientid.cl_boot = new->cl_clientid.cl_boot;
+       exid->clientid.cl_id = new->cl_clientid.cl_id;
+
+       new->cl_slot.sl_seqid = 0;
+       exid->seqid = 1;
+       nfsd4_set_ex_flags(new, exid);
+
+       dprintk("nfsd4_exchange_id seqid %d flags %x\n",
+               new->cl_slot.sl_seqid, new->cl_exchange_flags);
+       status = nfs_ok;
+
+out:
+       nfs4_unlock_state();
+error:
+       dprintk("nfsd4_exchange_id returns %d\n", ntohl(status));
+       return status;
+}
+
+static int
+check_slot_seqid(u32 seqid, struct nfsd4_slot *slot)
+{
+       dprintk("%s enter. seqid %d slot->sl_seqid %d\n", __func__, seqid,
+               slot->sl_seqid);
+
+       /* The slot is in use, and no response has been sent. */
+       if (slot->sl_inuse) {
+               if (seqid == slot->sl_seqid)
+                       return nfserr_jukebox;
+               else
+                       return nfserr_seq_misordered;
+       }
+       /* Normal */
+       if (likely(seqid == slot->sl_seqid + 1))
+               return nfs_ok;
+       /* Replay */
+       if (seqid == slot->sl_seqid)
+               return nfserr_replay_cache;
+       /* Wraparound */
+       if (seqid == 1 && (slot->sl_seqid + 1) == 0)
+               return nfs_ok;
+       /* Misordered replay or misordered new request */
+       return nfserr_seq_misordered;
+}
+
+__be32
+nfsd4_create_session(struct svc_rqst *rqstp,
+                    struct nfsd4_compound_state *cstate,
+                    struct nfsd4_create_session *cr_ses)
+{
+       u32 ip_addr = svc_addr_in(rqstp)->sin_addr.s_addr;
+       struct nfsd4_compoundres *resp = rqstp->rq_resp;
+       struct nfs4_client *conf, *unconf;
+       struct nfsd4_slot *slot = NULL;
+       int status = 0;
+
+       nfs4_lock_state();
+       unconf = find_unconfirmed_client(&cr_ses->clientid);
+       conf = find_confirmed_client(&cr_ses->clientid);
+
+       if (conf) {
+               slot = &conf->cl_slot;
+               status = check_slot_seqid(cr_ses->seqid, slot);
+               if (status == nfserr_replay_cache) {
+                       dprintk("Got a create_session replay! seqid= %d\n",
+                               slot->sl_seqid);
+                       cstate->slot = slot;
+                       cstate->status = status;
+                       /* Return the cached reply status */
+                       status = nfsd4_replay_cache_entry(resp, NULL);
+                       goto out;
+               } else if (cr_ses->seqid != conf->cl_slot.sl_seqid + 1) {
+                       status = nfserr_seq_misordered;
+                       dprintk("Sequence misordered!\n");
+                       dprintk("Expected seqid= %d but got seqid= %d\n",
+                               slot->sl_seqid, cr_ses->seqid);
+                       goto out;
+               }
+               conf->cl_slot.sl_seqid++;
+       } else if (unconf) {
+               if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
+                   (ip_addr != unconf->cl_addr)) {
+                       status = nfserr_clid_inuse;
+                       goto out;
+               }
+
+               slot = &unconf->cl_slot;
+               status = check_slot_seqid(cr_ses->seqid, slot);
+               if (status) {
+                       /* an unconfirmed replay returns misordered */
+                       status = nfserr_seq_misordered;
+                       goto out;
+               }
+
+               slot->sl_seqid++; /* from 0 to 1 */
+               move_to_confirmed(unconf);
+
+               /*
+                * We do not support RDMA or persistent sessions
+                */
+               cr_ses->flags &= ~SESSION4_PERSIST;
+               cr_ses->flags &= ~SESSION4_RDMA;
+
+               conf = unconf;
+       } else {
+               status = nfserr_stale_clientid;
+               goto out;
+       }
+
+       status = alloc_init_session(rqstp, conf, cr_ses);
+       if (status)
+               goto out;
+
+       memcpy(cr_ses->sessionid.data, conf->cl_sessionid.data,
+              NFS4_MAX_SESSIONID_LEN);
+       cr_ses->seqid = slot->sl_seqid;
+
+       slot->sl_inuse = true;
+       cstate->slot = slot;
+       /* Ensure a page is used for the cache */
+       slot->sl_cache_entry.ce_cachethis = 1;
+out:
+       nfs4_unlock_state();
+       dprintk("%s returns %d\n", __func__, ntohl(status));
+       return status;
+}
+
+__be32
+nfsd4_destroy_session(struct svc_rqst *r,
+                     struct nfsd4_compound_state *cstate,
+                     struct nfsd4_destroy_session *sessionid)
+{
+       struct nfsd4_session *ses;
+       u32 status = nfserr_badsession;
+
+       /* Notes:
+        * - The confirmed nfs4_client->cl_sessionid holds destroyed sessinid
+        * - Should we return nfserr_back_chan_busy if waiting for
+        *   callbacks on to-be-destroyed session?
+        * - Do we need to clear any callback info from previous session?
+        */
+
+       dump_sessionid(__func__, &sessionid->sessionid);
+       spin_lock(&sessionid_lock);
+       ses = find_in_sessionid_hashtbl(&sessionid->sessionid);
+       if (!ses) {
+               spin_unlock(&sessionid_lock);
+               goto out;
+       }
+
+       unhash_session(ses);
+       spin_unlock(&sessionid_lock);
+
+       /* wait for callbacks */
+       shutdown_callback_client(ses->se_client);
+       nfsd4_put_session(ses);
+       status = nfs_ok;
+out:
+       dprintk("%s returns %d\n", __func__, ntohl(status));
+       return status;
+}
+
+__be32
+nfsd4_sequence(struct svc_rqst *rqstp,
+              struct nfsd4_compound_state *cstate,
+              struct nfsd4_sequence *seq)
+{
+       struct nfsd4_compoundres *resp = rqstp->rq_resp;
+       struct nfsd4_session *session;
+       struct nfsd4_slot *slot;
+       int status;
+
+       if (resp->opcnt != 1)
+               return nfserr_sequence_pos;
+
+       spin_lock(&sessionid_lock);
+       status = nfserr_badsession;
+       session = find_in_sessionid_hashtbl(&seq->sessionid);
+       if (!session)
+               goto out;
+
+       status = nfserr_badslot;
+       if (seq->slotid >= session->se_fnumslots)
+               goto out;
+
+       slot = &session->se_slots[seq->slotid];
+       dprintk("%s: slotid %d\n", __func__, seq->slotid);
+
+       status = check_slot_seqid(seq->seqid, slot);
+       if (status == nfserr_replay_cache) {
+               cstate->slot = slot;
+               cstate->session = session;
+               /* Return the cached reply status and set cstate->status
+                * for nfsd4_svc_encode_compoundres processing */
+               status = nfsd4_replay_cache_entry(resp, seq);
+               cstate->status = nfserr_replay_cache;
+               goto replay_cache;
+       }
+       if (status)
+               goto out;
+
+       /* Success! bump slot seqid */
+       slot->sl_inuse = true;
+       slot->sl_seqid = seq->seqid;
+       slot->sl_cache_entry.ce_cachethis = seq->cachethis;
+       /* Always set the cache entry cachethis for solo sequence */
+       if (nfsd4_is_solo_sequence(resp))
+               slot->sl_cache_entry.ce_cachethis = 1;
+
+       cstate->slot = slot;
+       cstate->session = session;
+
+replay_cache:
+       /* Renew the clientid on success and on replay.
+        * Hold a session reference until done processing the compound:
+        * nfsd4_put_session called only if the cstate slot is set.
+        */
+       renew_client(session->se_client);
+       nfsd4_get_session(session);
+out:
+       spin_unlock(&sessionid_lock);
+       dprintk("%s: return %d\n", __func__, ntohl(status));
+       return status;
+}
+
 __be32
 nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                  struct nfsd4_setclientid *setclid)
@@ -716,14 +1546,13 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        strhashval = clientstr_hashval(dname);
 
        nfs4_lock_state();
-       conf = find_confirmed_client_by_str(dname, strhashval);
+       conf = find_confirmed_client_by_str(dname, strhashval, false);
        if (conf) {
                /* RFC 3530 14.2.33 CASE 0: */
                status = nfserr_clid_inuse;
-               if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)
-                               || conf->cl_addr != sin->sin_addr.s_addr) {
-                       dprintk("NFSD: setclientid: string in use by clientat %pI4\n",
-                               &conf->cl_addr);
+               if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
+                       dprintk("NFSD: setclientid: string in use by client"
+                               " at %pI4\n", &conf->cl_addr);
                        goto out;
                }
        }
@@ -732,7 +1561,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
         * has a description of SETCLIENTID request processing consisting
         * of 5 bullet points, labeled as CASE0 - CASE4 below.
         */
-       unconf = find_unconfirmed_client_by_str(dname, strhashval);
+       unconf = find_unconfirmed_client_by_str(dname, strhashval, false);
        status = nfserr_resource;
        if (!conf) {
                /*
@@ -887,7 +1716,7 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
                        unsigned int hash =
                                clientstr_hashval(unconf->cl_recdir);
                        conf = find_confirmed_client_by_str(unconf->cl_recdir,
-                                                                       hash);
+                                                           hash, false);
                        if (conf) {
                                nfsd4_remove_clid_dir(conf);
                                expire_client(conf);
@@ -923,11 +1752,13 @@ alloc_init_file(struct inode *ino)
 
        fp = kmem_cache_alloc(file_slab, GFP_KERNEL);
        if (fp) {
-               kref_init(&fp->fi_ref);
+               atomic_set(&fp->fi_ref, 1);
                INIT_LIST_HEAD(&fp->fi_hash);
                INIT_LIST_HEAD(&fp->fi_stateids);
                INIT_LIST_HEAD(&fp->fi_delegations);
+               spin_lock(&recall_lock);
                list_add(&fp->fi_hash, &file_hashtbl[hashval]);
+               spin_unlock(&recall_lock);
                fp->fi_inode = igrab(ino);
                fp->fi_id = current_fileid++;
                fp->fi_had_conflict = false;
@@ -1037,48 +1868,6 @@ alloc_init_open_stateowner(unsigned int strhashval, struct nfs4_client *clp, str
        return sop;
 }
 
-static void
-release_stateid_lockowners(struct nfs4_stateid *open_stp)
-{
-       struct nfs4_stateowner *lock_sop;
-
-       while (!list_empty(&open_stp->st_lockowners)) {
-               lock_sop = list_entry(open_stp->st_lockowners.next,
-                               struct nfs4_stateowner, so_perstateid);
-               /* list_del(&open_stp->st_lockowners);  */
-               BUG_ON(lock_sop->so_is_open_owner);
-               release_stateowner(lock_sop);
-       }
-}
-
-static void
-unhash_stateowner(struct nfs4_stateowner *sop)
-{
-       struct nfs4_stateid *stp;
-
-       list_del(&sop->so_idhash);
-       list_del(&sop->so_strhash);
-       if (sop->so_is_open_owner)
-               list_del(&sop->so_perclient);
-       list_del(&sop->so_perstateid);
-       while (!list_empty(&sop->so_stateids)) {
-               stp = list_entry(sop->so_stateids.next,
-                       struct nfs4_stateid, st_perstateowner);
-               if (sop->so_is_open_owner)
-                       release_stateid(stp, OPEN_STATE);
-               else
-                       release_stateid(stp, LOCK_STATE);
-       }
-}
-
-static void
-release_stateowner(struct nfs4_stateowner *sop)
-{
-       unhash_stateowner(sop);
-       list_del(&sop->so_close_lru);
-       nfs4_put_stateowner(sop);
-}
-
 static inline void
 init_stateid(struct nfs4_stateid *stp, struct nfs4_file *fp, struct nfsd4_open *open) {
        struct nfs4_stateowner *sop = open->op_stateowner;
@@ -1100,29 +1889,12 @@ init_stateid(struct nfs4_stateid *stp, struct nfs4_file *fp, struct nfsd4_open *
        stp->st_stateid.si_generation = 0;
        stp->st_access_bmap = 0;
        stp->st_deny_bmap = 0;
-       __set_bit(open->op_share_access, &stp->st_access_bmap);
+       __set_bit(open->op_share_access & ~NFS4_SHARE_WANT_MASK,
+                 &stp->st_access_bmap);
        __set_bit(open->op_share_deny, &stp->st_deny_bmap);
        stp->st_openstp = NULL;
 }
 
-static void
-release_stateid(struct nfs4_stateid *stp, int flags)
-{
-       struct file *filp = stp->st_vfs_file;
-
-       list_del(&stp->st_hash);
-       list_del(&stp->st_perfile);
-       list_del(&stp->st_perstateowner);
-       if (flags & OPEN_STATE) {
-               release_stateid_lockowners(stp);
-               stp->st_vfs_file = NULL;
-               nfsd_close(filp);
-       } else if (flags & LOCK_STATE)
-               locks_remove_posix(filp, (fl_owner_t) stp->st_stateowner);
-       put_nfs4_file(stp->st_file);
-       kmem_cache_free(stateid_slab, stp);
-}
-
 static void
 move_to_close_lru(struct nfs4_stateowner *sop)
 {
@@ -1160,20 +1932,33 @@ find_file(struct inode *ino)
        unsigned int hashval = file_hashval(ino);
        struct nfs4_file *fp;
 
+       spin_lock(&recall_lock);
        list_for_each_entry(fp, &file_hashtbl[hashval], fi_hash) {
                if (fp->fi_inode == ino) {
                        get_nfs4_file(fp);
+                       spin_unlock(&recall_lock);
                        return fp;
                }
        }
+       spin_unlock(&recall_lock);
        return NULL;
 }
 
-static inline int access_valid(u32 x)
+static inline int access_valid(u32 x, u32 minorversion)
 {
-       if (x < NFS4_SHARE_ACCESS_READ)
+       if ((x & NFS4_SHARE_ACCESS_MASK) < NFS4_SHARE_ACCESS_READ)
                return 0;
-       if (x > NFS4_SHARE_ACCESS_BOTH)
+       if ((x & NFS4_SHARE_ACCESS_MASK) > NFS4_SHARE_ACCESS_BOTH)
+               return 0;
+       x &= ~NFS4_SHARE_ACCESS_MASK;
+       if (minorversion && x) {
+               if ((x & NFS4_SHARE_WANT_MASK) > NFS4_SHARE_WANT_CANCEL)
+                       return 0;
+               if ((x & NFS4_SHARE_WHEN_MASK) > NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED)
+                       return 0;
+               x &= ~(NFS4_SHARE_WANT_MASK | NFS4_SHARE_WHEN_MASK);
+       }
+       if (x)
                return 0;
        return 1;
 }
@@ -1409,7 +2194,8 @@ static struct lock_manager_operations nfsd_lease_mng_ops = {
 
 
 __be32
-nfsd4_process_open1(struct nfsd4_open *open)
+nfsd4_process_open1(struct nfsd4_compound_state *cstate,
+                   struct nfsd4_open *open)
 {
        clientid_t *clientid = &open->op_clientid;
        struct nfs4_client *clp = NULL;
@@ -1432,10 +2218,13 @@ nfsd4_process_open1(struct nfsd4_open *open)
                        return nfserr_expired;
                goto renew;
        }
+       /* When sessions are used, skip open sequenceid processing */
+       if (nfsd4_has_session(cstate))
+               goto renew;
        if (!sop->so_confirmed) {
                /* Replace unconfirmed owners without checking for replay. */
                clp = sop->so_client;
-               release_stateowner(sop);
+               release_openowner(sop);
                open->op_stateowner = NULL;
                goto renew;
        }
@@ -1709,6 +2498,7 @@ out:
 __be32
 nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
 {
+       struct nfsd4_compoundres *resp = rqstp->rq_resp;
        struct nfs4_file *fp = NULL;
        struct inode *ino = current_fh->fh_dentry->d_inode;
        struct nfs4_stateid *stp = NULL;
@@ -1716,7 +2506,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
        __be32 status;
 
        status = nfserr_inval;
-       if (!access_valid(open->op_share_access)
+       if (!access_valid(open->op_share_access, resp->cstate.minorversion)
                        || !deny_valid(open->op_share_deny))
                goto out;
        /*
@@ -1764,12 +2554,17 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
                init_stateid(stp, fp, open);
                status = nfsd4_truncate(rqstp, current_fh, open);
                if (status) {
-                       release_stateid(stp, OPEN_STATE);
+                       release_open_stateid(stp);
                        goto out;
                }
+               if (nfsd4_has_session(&resp->cstate))
+                       update_stateid(&stp->st_stateid);
        }
        memcpy(&open->op_stateid, &stp->st_stateid, sizeof(stateid_t));
 
+       if (nfsd4_has_session(&resp->cstate))
+               open->op_stateowner->so_confirmed = 1;
+
        /*
        * Attempt to hand out a delegation. No error return, because the
        * OPEN succeeds even if we fail.
@@ -1790,7 +2585,8 @@ out:
        * To finish the open response, we just need to set the rflags.
        */
        open->op_rflags = NFS4_OPEN_RESULT_LOCKTYPE_POSIX;
-       if (!open->op_stateowner->so_confirmed)
+       if (!open->op_stateowner->so_confirmed &&
+           !nfsd4_has_session(&resp->cstate))
                open->op_rflags |= NFS4_OPEN_RESULT_CONFIRM;
 
        return status;
@@ -1898,7 +2694,7 @@ nfs4_laundromat(void)
                }
                dprintk("NFSD: purging unused open stateowner (so_id %d)\n",
                        sop->so_id);
-               release_stateowner(sop);
+               release_openowner(sop);
        }
        if (clientid_val < NFSD_LAUNDROMAT_MINTIMEOUT)
                clientid_val = NFSD_LAUNDROMAT_MINTIMEOUT;
@@ -1983,10 +2779,7 @@ out:
 static inline __be32
 check_special_stateids(svc_fh *current_fh, stateid_t *stateid, int flags)
 {
-       /* Trying to call delegreturn with a special stateid? Yuch: */
-       if (!(flags & (RD_STATE | WR_STATE)))
-               return nfserr_bad_stateid;
-       else if (ONE_STATEID(stateid) && (flags & RD_STATE))
+       if (ONE_STATEID(stateid) && (flags & RD_STATE))
                return nfs_ok;
        else if (locks_in_grace()) {
                /* Answer in remaining cases depends on existance of
@@ -2005,14 +2798,20 @@ check_special_stateids(svc_fh *current_fh, stateid_t *stateid, int flags)
  * that are not able to provide mandatory locking.
  */
 static inline int
-io_during_grace_disallowed(struct inode *inode, int flags)
+grace_disallows_io(struct inode *inode)
 {
-       return locks_in_grace() && (flags & (RD_STATE | WR_STATE))
-               && mandatory_lock(inode);
+       return locks_in_grace() && mandatory_lock(inode);
 }
 
-static int check_stateid_generation(stateid_t *in, stateid_t *ref)
+static int check_stateid_generation(stateid_t *in, stateid_t *ref, int flags)
 {
+       /*
+        * When sessions are used the stateid generation number is ignored
+        * when it is zero.
+        */
+       if ((flags & HAS_SESSION) && in->si_generation == 0)
+               goto out;
+
        /* If the client sends us a stateid from the future, it's buggy: */
        if (in->si_generation > ref->si_generation)
                return nfserr_bad_stateid;
@@ -2028,74 +2827,77 @@ static int check_stateid_generation(stateid_t *in, stateid_t *ref)
         */
        if (in->si_generation < ref->si_generation)
                return nfserr_old_stateid;
+out:
        return nfs_ok;
 }
 
+static int is_delegation_stateid(stateid_t *stateid)
+{
+       return stateid->si_fileid == 0;
+}
+
 /*
 * Checks for stateid operations
 */
 __be32
-nfs4_preprocess_stateid_op(struct svc_fh *current_fh, stateid_t *stateid, int flags, struct file **filpp)
+nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
+                          stateid_t *stateid, int flags, struct file **filpp)
 {
        struct nfs4_stateid *stp = NULL;
        struct nfs4_delegation *dp = NULL;
-       stateid_t *stidp;
+       struct svc_fh *current_fh = &cstate->current_fh;
        struct inode *ino = current_fh->fh_dentry->d_inode;
        __be32 status;
 
-       dprintk("NFSD: preprocess_stateid_op: stateid = (%08x/%08x/%08x/%08x)\n",
-               stateid->si_boot, stateid->si_stateownerid, 
-               stateid->si_fileid, stateid->si_generation); 
        if (filpp)
                *filpp = NULL;
 
-       if (io_during_grace_disallowed(ino, flags))
+       if (grace_disallows_io(ino))
                return nfserr_grace;
 
+       if (nfsd4_has_session(cstate))
+               flags |= HAS_SESSION;
+
        if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
                return check_special_stateids(current_fh, stateid, flags);
 
-       /* STALE STATEID */
        status = nfserr_stale_stateid;
        if (STALE_STATEID(stateid)) 
                goto out;
 
-       /* BAD STATEID */
        status = nfserr_bad_stateid;
-       if (!stateid->si_fileid) { /* delegation stateid */
-               if(!(dp = find_delegation_stateid(ino, stateid))) {
-                       dprintk("NFSD: delegation stateid not found\n");
+       if (is_delegation_stateid(stateid)) {
+               dp = find_delegation_stateid(ino, stateid);
+               if (!dp)
                        goto out;
-               }
-               stidp = &dp->dl_stateid;
+               status = check_stateid_generation(stateid, &dp->dl_stateid,
+                                                 flags);
+               if (status)
+                       goto out;
+               status = nfs4_check_delegmode(dp, flags);
+               if (status)
+                       goto out;
+               renew_client(dp->dl_client);
+               if (filpp)
+                       *filpp = dp->dl_vfs_file;
        } else { /* open or lock stateid */
-               if (!(stp = find_stateid(stateid, flags))) {
-                       dprintk("NFSD: open or lock stateid not found\n");
+               stp = find_stateid(stateid, flags);
+               if (!stp)
                        goto out;
-               }
-               if ((flags & CHECK_FH) && nfs4_check_fh(current_fh, stp))
+               if (nfs4_check_fh(current_fh, stp))
                        goto out;
                if (!stp->st_stateowner->so_confirmed)
                        goto out;
-               stidp = &stp->st_stateid;
-       }
-       status = check_stateid_generation(stateid, stidp);
-       if (status)
-               goto out;
-       if (stp) {
-               if ((status = nfs4_check_openmode(stp,flags)))
+               status = check_stateid_generation(stateid, &stp->st_stateid,
+                                                 flags);
+               if (status)
+                       goto out;
+               status = nfs4_check_openmode(stp, flags);
+               if (status)
                        goto out;
                renew_client(stp->st_stateowner->so_client);
                if (filpp)
                        *filpp = stp->st_vfs_file;
-       } else {
-               if ((status = nfs4_check_delegmode(dp, flags)))
-                       goto out;
-               renew_client(dp->dl_client);
-               if (flags & DELEG_RET)
-                       unhash_delegation(dp);
-               if (filpp)
-                       *filpp = dp->dl_vfs_file;
        }
        status = nfs_ok;
 out:
@@ -2113,10 +2915,14 @@ setlkflg (int type)
  * Checks for sequence id mutating operations. 
  */
 static __be32
-nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *stateid, int flags, struct nfs4_stateowner **sopp, struct nfs4_stateid **stpp, struct nfsd4_lock *lock)
+nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
+                        stateid_t *stateid, int flags,
+                        struct nfs4_stateowner **sopp,
+                        struct nfs4_stateid **stpp, struct nfsd4_lock *lock)
 {
        struct nfs4_stateid *stp;
        struct nfs4_stateowner *sop;
+       struct svc_fh *current_fh = &cstate->current_fh;
        __be32 status;
 
        dprintk("NFSD: preprocess_seqid_op: seqid=%d " 
@@ -2134,6 +2940,10 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei
 
        if (STALE_STATEID(stateid))
                return nfserr_stale_stateid;
+
+       if (nfsd4_has_session(cstate))
+               flags |= HAS_SESSION;
+
        /*
        * We return BAD_STATEID if filehandle doesn't match stateid, 
        * the confirmed flag is incorrecly set, or the generation 
@@ -2166,8 +2976,9 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei
                if (lock->lk_is_new) {
                        if (!sop->so_is_open_owner)
                                return nfserr_bad_stateid;
-                       if (!same_clid(&clp->cl_clientid, lockclid))
-                              return nfserr_bad_stateid;
+                       if (!(flags & HAS_SESSION) &&
+                           !same_clid(&clp->cl_clientid, lockclid))
+                               return nfserr_bad_stateid;
                        /* stp is the open stateid */
                        status = nfs4_check_openmode(stp, lkflg);
                        if (status)
@@ -2190,7 +3001,7 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei
        *  For the moment, we ignore the possibility of 
        *  generation number wraparound.
        */
-       if (seqid != sop->so_seqid)
+       if (!(flags & HAS_SESSION) && seqid != sop->so_seqid)
                goto check_replay;
 
        if (sop->so_confirmed && flags & CONFIRM) {
@@ -2203,7 +3014,7 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei
                                " confirmed yet!\n");
                return nfserr_bad_stateid;
        }
-       status = check_stateid_generation(stateid, &stp->st_stateid);
+       status = check_stateid_generation(stateid, &stp->st_stateid, flags);
        if (status)
                return status;
        renew_client(sop->so_client);
@@ -2239,7 +3050,7 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        nfs4_lock_state();
 
-       if ((status = nfs4_preprocess_seqid_op(&cstate->current_fh,
+       if ((status = nfs4_preprocess_seqid_op(cstate,
                                        oc->oc_seqid, &oc->oc_req_stateid,
                                        CONFIRM | OPEN_STATE,
                                        &oc->oc_stateowner, &stp, NULL)))
@@ -2304,12 +3115,12 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp,
                        (int)cstate->current_fh.fh_dentry->d_name.len,
                        cstate->current_fh.fh_dentry->d_name.name);
 
-       if (!access_valid(od->od_share_access)
+       if (!access_valid(od->od_share_access, cstate->minorversion)
                        || !deny_valid(od->od_share_deny))
                return nfserr_inval;
 
        nfs4_lock_state();
-       if ((status = nfs4_preprocess_seqid_op(&cstate->current_fh,
+       if ((status = nfs4_preprocess_seqid_op(cstate,
                                        od->od_seqid,
                                        &od->od_stateid, 
                                        OPEN_STATE,
@@ -2362,7 +3173,7 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        nfs4_lock_state();
        /* check close_lru for replay */
-       if ((status = nfs4_preprocess_seqid_op(&cstate->current_fh,
+       if ((status = nfs4_preprocess_seqid_op(cstate,
                                        close->cl_seqid,
                                        &close->cl_stateid, 
                                        OPEN_STATE | CLOSE_STATE,
@@ -2373,7 +3184,7 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        memcpy(&close->cl_stateid, &stp->st_stateid, sizeof(stateid_t));
 
        /* release_stateid() calls nfsd_close() if needed */
-       release_stateid(stp, OPEN_STATE);
+       release_open_stateid(stp);
 
        /* place unused nfs4_stateowners on so_close_lru list to be
         * released by the laundromat service after the lease period
@@ -2394,16 +3205,40 @@ __be32
 nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                  struct nfsd4_delegreturn *dr)
 {
+       struct nfs4_delegation *dp;
+       stateid_t *stateid = &dr->dr_stateid;
+       struct inode *inode;
        __be32 status;
+       int flags = 0;
 
        if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
-               goto out;
+               return status;
+       inode = cstate->current_fh.fh_dentry->d_inode;
 
+       if (nfsd4_has_session(cstate))
+               flags |= HAS_SESSION;
        nfs4_lock_state();
-       status = nfs4_preprocess_stateid_op(&cstate->current_fh,
-                                           &dr->dr_stateid, DELEG_RET, NULL);
-       nfs4_unlock_state();
+       status = nfserr_bad_stateid;
+       if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
+               goto out;
+       status = nfserr_stale_stateid;
+       if (STALE_STATEID(stateid))
+               goto out;
+       status = nfserr_bad_stateid;
+       if (!is_delegation_stateid(stateid))
+               goto out;
+       dp = find_delegation_stateid(inode, stateid);
+       if (!dp)
+               goto out;
+       status = check_stateid_generation(stateid, &dp->dl_stateid, flags);
+       if (status)
+               goto out;
+       renew_client(dp->dl_client);
+
+       unhash_delegation(dp);
 out:
+       nfs4_unlock_state();
+
        return status;
 }
 
@@ -2684,11 +3519,12 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                struct nfs4_file *fp;
                
                status = nfserr_stale_clientid;
-               if (STALE_CLIENTID(&lock->lk_new_clientid))
+               if (!nfsd4_has_session(cstate) &&
+                   STALE_CLIENTID(&lock->lk_new_clientid))
                        goto out;
 
                /* validate and update open stateid and open seqid */
-               status = nfs4_preprocess_seqid_op(&cstate->current_fh,
+               status = nfs4_preprocess_seqid_op(cstate,
                                        lock->lk_new_open_seqid,
                                        &lock->lk_new_open_stateid,
                                        OPEN_STATE,
@@ -2715,7 +3551,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                        goto out;
        } else {
                /* lock (lock owner + lock stateid) already exists */
-               status = nfs4_preprocess_seqid_op(&cstate->current_fh,
+               status = nfs4_preprocess_seqid_op(cstate,
                                       lock->lk_old_lock_seqid, 
                                       &lock->lk_old_lock_stateid, 
                                       LOCK_STATE,
@@ -2788,7 +3624,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        }
 out:
        if (status && lock->lk_is_new && lock_sop)
-               release_stateowner(lock_sop);
+               release_lockowner(lock_sop);
        if (lock->lk_replay_owner) {
                nfs4_get_stateowner(lock->lk_replay_owner);
                cstate->replay_owner = lock->lk_replay_owner;
@@ -2838,7 +3674,7 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        nfs4_lock_state();
 
        status = nfserr_stale_clientid;
-       if (STALE_CLIENTID(&lockt->lt_clientid))
+       if (!nfsd4_has_session(cstate) && STALE_CLIENTID(&lockt->lt_clientid))
                goto out;
 
        if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0))) {
@@ -2911,7 +3747,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        nfs4_lock_state();
                                                                                
-       if ((status = nfs4_preprocess_seqid_op(&cstate->current_fh,
+       if ((status = nfs4_preprocess_seqid_op(cstate,
                                        locku->lu_seqid, 
                                        &locku->lu_stateid, 
                                        LOCK_STATE,
@@ -3037,7 +3873,7 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
                /* unhash_stateowner deletes so_perclient only
                 * for openowners. */
                list_del(&sop->so_perclient);
-               release_stateowner(sop);
+               release_lockowner(sop);
        }
 out:
        nfs4_unlock_state();
@@ -3051,12 +3887,12 @@ alloc_reclaim(void)
 }
 
 int
-nfs4_has_reclaimed_state(const char *name)
+nfs4_has_reclaimed_state(const char *name, bool use_exchange_id)
 {
        unsigned int strhashval = clientstr_hashval(name);
        struct nfs4_client *clp;
 
-       clp = find_confirmed_client_by_str(name, strhashval);
+       clp = find_confirmed_client_by_str(name, strhashval, use_exchange_id);
        return clp ? 1 : 0;
 }
 
@@ -3153,6 +3989,8 @@ nfs4_state_init(void)
                INIT_LIST_HEAD(&unconf_str_hashtbl[i]);
                INIT_LIST_HEAD(&unconf_id_hashtbl[i]);
        }
+       for (i = 0; i < SESSION_HASH_SIZE; i++)
+               INIT_LIST_HEAD(&sessionid_hashtbl[i]);
        for (i = 0; i < FILE_HASH_SIZE; i++) {
                INIT_LIST_HEAD(&file_hashtbl[i]);
        }
index 9250067943d8ec1defaf0400a508818149cfa527..b820c311931c8e7d73218f6aae5cbcfe2bbe4993 100644 (file)
@@ -45,6 +45,7 @@
 #include <linux/fs.h>
 #include <linux/namei.h>
 #include <linux/vfs.h>
+#include <linux/utsname.h>
 #include <linux/sunrpc/xdr.h>
 #include <linux/sunrpc/svc.h>
 #include <linux/sunrpc/clnt.h>
@@ -188,6 +189,11 @@ static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes)
        return p;
 }
 
+static int zero_clientid(clientid_t *clid)
+{
+       return (clid->cl_boot == 0) && (clid->cl_id == 0);
+}
+
 static int
 defer_free(struct nfsd4_compoundargs *argp,
                void (*release)(const void *), void *p)
@@ -230,6 +236,7 @@ nfsd4_decode_bitmap(struct nfsd4_compoundargs *argp, u32 *bmval)
 
        bmval[0] = 0;
        bmval[1] = 0;
+       bmval[2] = 0;
 
        READ_BUF(4);
        READ32(bmlen);
@@ -241,13 +248,27 @@ nfsd4_decode_bitmap(struct nfsd4_compoundargs *argp, u32 *bmval)
                READ32(bmval[0]);
        if (bmlen > 1)
                READ32(bmval[1]);
+       if (bmlen > 2)
+               READ32(bmval[2]);
 
        DECODE_TAIL;
 }
 
+static u32 nfsd_attrmask[] = {
+       NFSD_WRITEABLE_ATTRS_WORD0,
+       NFSD_WRITEABLE_ATTRS_WORD1,
+       NFSD_WRITEABLE_ATTRS_WORD2
+};
+
+static u32 nfsd41_ex_attrmask[] = {
+       NFSD_SUPPATTR_EXCLCREAT_WORD0,
+       NFSD_SUPPATTR_EXCLCREAT_WORD1,
+       NFSD_SUPPATTR_EXCLCREAT_WORD2
+};
+
 static __be32
-nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, struct iattr *iattr,
-    struct nfs4_acl **acl)
+nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, u32 *writable,
+                  struct iattr *iattr, struct nfs4_acl **acl)
 {
        int expected_len, len = 0;
        u32 dummy32;
@@ -263,9 +284,12 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, struct iattr *ia
         * According to spec, unsupported attributes return ERR_ATTRNOTSUPP;
         * read-only attributes return ERR_INVAL.
         */
-       if ((bmval[0] & ~NFSD_SUPPORTED_ATTRS_WORD0) || (bmval[1] & ~NFSD_SUPPORTED_ATTRS_WORD1))
+       if ((bmval[0] & ~nfsd_suppattrs0(argp->minorversion)) ||
+           (bmval[1] & ~nfsd_suppattrs1(argp->minorversion)) ||
+           (bmval[2] & ~nfsd_suppattrs2(argp->minorversion)))
                return nfserr_attrnotsupp;
-       if ((bmval[0] & ~NFSD_WRITEABLE_ATTRS_WORD0) || (bmval[1] & ~NFSD_WRITEABLE_ATTRS_WORD1))
+       if ((bmval[0] & ~writable[0]) || (bmval[1] & ~writable[1]) ||
+           (bmval[2] & ~writable[2]))
                return nfserr_inval;
 
        READ_BUF(4);
@@ -400,6 +424,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, struct iattr *ia
                        goto xdr_error;
                }
        }
+       BUG_ON(bmval[2]);       /* no such writeable attr supported yet */
        if (len != expected_len)
                goto xdr_error;
 
@@ -493,7 +518,9 @@ nfsd4_decode_create(struct nfsd4_compoundargs *argp, struct nfsd4_create *create
        if ((status = check_filename(create->cr_name, create->cr_namelen, nfserr_inval)))
                return status;
 
-       if ((status = nfsd4_decode_fattr(argp, create->cr_bmval, &create->cr_iattr, &create->cr_acl)))
+       status = nfsd4_decode_fattr(argp, create->cr_bmval, nfsd_attrmask,
+                                   &create->cr_iattr, &create->cr_acl);
+       if (status)
                goto out;
 
        DECODE_TAIL;
@@ -583,6 +610,8 @@ nfsd4_decode_lockt(struct nfsd4_compoundargs *argp, struct nfsd4_lockt *lockt)
        READ_BUF(lockt->lt_owner.len);
        READMEM(lockt->lt_owner.data, lockt->lt_owner.len);
 
+       if (argp->minorversion && !zero_clientid(&lockt->lt_clientid))
+               return nfserr_inval;
        DECODE_TAIL;
 }
 
@@ -652,13 +681,26 @@ nfsd4_decode_open(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
                switch (open->op_createmode) {
                case NFS4_CREATE_UNCHECKED:
                case NFS4_CREATE_GUARDED:
-                       if ((status = nfsd4_decode_fattr(argp, open->op_bmval, &open->op_iattr, &open->op_acl)))
+                       status = nfsd4_decode_fattr(argp, open->op_bmval,
+                               nfsd_attrmask, &open->op_iattr, &open->op_acl);
+                       if (status)
                                goto out;
                        break;
                case NFS4_CREATE_EXCLUSIVE:
                        READ_BUF(8);
                        COPYMEM(open->op_verf.data, 8);
                        break;
+               case NFS4_CREATE_EXCLUSIVE4_1:
+                       if (argp->minorversion < 1)
+                               goto xdr_error;
+                       READ_BUF(8);
+                       COPYMEM(open->op_verf.data, 8);
+                       status = nfsd4_decode_fattr(argp, open->op_bmval,
+                               nfsd41_ex_attrmask, &open->op_iattr,
+                               &open->op_acl);
+                       if (status)
+                               goto out;
+                       break;
                default:
                        goto xdr_error;
                }
@@ -851,7 +893,7 @@ nfsd4_decode_setattr(struct nfsd4_compoundargs *argp, struct nfsd4_setattr *seta
        status = nfsd4_decode_stateid(argp, &setattr->sa_stateid);
        if (status)
                return status;
-       return nfsd4_decode_fattr(argp, setattr->sa_bmval,
+       return nfsd4_decode_fattr(argp, setattr->sa_bmval, nfsd_attrmask,
                                  &setattr->sa_iattr, &setattr->sa_acl);
 }
 
@@ -993,6 +1035,241 @@ nfsd4_decode_release_lockowner(struct nfsd4_compoundargs *argp, struct nfsd4_rel
        READ_BUF(rlockowner->rl_owner.len);
        READMEM(rlockowner->rl_owner.data, rlockowner->rl_owner.len);
 
+       if (argp->minorversion && !zero_clientid(&rlockowner->rl_clientid))
+               return nfserr_inval;
+       DECODE_TAIL;
+}
+
+static __be32
+nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp,
+                        struct nfsd4_exchange_id *exid)
+{
+       int dummy;
+       DECODE_HEAD;
+
+       READ_BUF(NFS4_VERIFIER_SIZE);
+       COPYMEM(exid->verifier.data, NFS4_VERIFIER_SIZE);
+
+       READ_BUF(4);
+       READ32(exid->clname.len);
+
+       READ_BUF(exid->clname.len);
+       SAVEMEM(exid->clname.data, exid->clname.len);
+
+       READ_BUF(4);
+       READ32(exid->flags);
+
+       /* Ignore state_protect4_a */
+       READ_BUF(4);
+       READ32(exid->spa_how);
+       switch (exid->spa_how) {
+       case SP4_NONE:
+               break;
+       case SP4_MACH_CRED:
+               /* spo_must_enforce */
+               READ_BUF(4);
+               READ32(dummy);
+               READ_BUF(dummy * 4);
+               p += dummy;
+
+               /* spo_must_allow */
+               READ_BUF(4);
+               READ32(dummy);
+               READ_BUF(dummy * 4);
+               p += dummy;
+               break;
+       case SP4_SSV:
+               /* ssp_ops */
+               READ_BUF(4);
+               READ32(dummy);
+               READ_BUF(dummy * 4);
+               p += dummy;
+
+               READ_BUF(4);
+               READ32(dummy);
+               READ_BUF(dummy * 4);
+               p += dummy;
+
+               /* ssp_hash_algs<> */
+               READ_BUF(4);
+               READ32(dummy);
+               READ_BUF(dummy);
+               p += XDR_QUADLEN(dummy);
+
+               /* ssp_encr_algs<> */
+               READ_BUF(4);
+               READ32(dummy);
+               READ_BUF(dummy);
+               p += XDR_QUADLEN(dummy);
+
+               /* ssp_window and ssp_num_gss_handles */
+               READ_BUF(8);
+               READ32(dummy);
+               READ32(dummy);
+               break;
+       default:
+               goto xdr_error;
+       }
+
+       /* Ignore Implementation ID */
+       READ_BUF(4);    /* nfs_impl_id4 array length */
+       READ32(dummy);
+
+       if (dummy > 1)
+               goto xdr_error;
+
+       if (dummy == 1) {
+               /* nii_domain */
+               READ_BUF(4);
+               READ32(dummy);
+               READ_BUF(dummy);
+               p += XDR_QUADLEN(dummy);
+
+               /* nii_name */
+               READ_BUF(4);
+               READ32(dummy);
+               READ_BUF(dummy);
+               p += XDR_QUADLEN(dummy);
+
+               /* nii_date */
+               READ_BUF(12);
+               p += 3;
+       }
+       DECODE_TAIL;
+}
+
+static __be32
+nfsd4_decode_create_session(struct nfsd4_compoundargs *argp,
+                           struct nfsd4_create_session *sess)
+{
+       DECODE_HEAD;
+
+       u32 dummy;
+       char *machine_name;
+       int i;
+       int nr_secflavs;
+
+       READ_BUF(16);
+       COPYMEM(&sess->clientid, 8);
+       READ32(sess->seqid);
+       READ32(sess->flags);
+
+       /* Fore channel attrs */
+       READ_BUF(28);
+       READ32(dummy); /* headerpadsz is always 0 */
+       READ32(sess->fore_channel.maxreq_sz);
+       READ32(sess->fore_channel.maxresp_sz);
+       READ32(sess->fore_channel.maxresp_cached);
+       READ32(sess->fore_channel.maxops);
+       READ32(sess->fore_channel.maxreqs);
+       READ32(sess->fore_channel.nr_rdma_attrs);
+       if (sess->fore_channel.nr_rdma_attrs == 1) {
+               READ_BUF(4);
+               READ32(sess->fore_channel.rdma_attrs);
+       } else if (sess->fore_channel.nr_rdma_attrs > 1) {
+               dprintk("Too many fore channel attr bitmaps!\n");
+               goto xdr_error;
+       }
+
+       /* Back channel attrs */
+       READ_BUF(28);
+       READ32(dummy); /* headerpadsz is always 0 */
+       READ32(sess->back_channel.maxreq_sz);
+       READ32(sess->back_channel.maxresp_sz);
+       READ32(sess->back_channel.maxresp_cached);
+       READ32(sess->back_channel.maxops);
+       READ32(sess->back_channel.maxreqs);
+       READ32(sess->back_channel.nr_rdma_attrs);
+       if (sess->back_channel.nr_rdma_attrs == 1) {
+               READ_BUF(4);
+               READ32(sess->back_channel.rdma_attrs);
+       } else if (sess->back_channel.nr_rdma_attrs > 1) {
+               dprintk("Too many back channel attr bitmaps!\n");
+               goto xdr_error;
+       }
+
+       READ_BUF(8);
+       READ32(sess->callback_prog);
+
+       /* callback_sec_params4 */
+       READ32(nr_secflavs);
+       for (i = 0; i < nr_secflavs; ++i) {
+               READ_BUF(4);
+               READ32(dummy);
+               switch (dummy) {
+               case RPC_AUTH_NULL:
+                       /* Nothing to read */
+                       break;
+               case RPC_AUTH_UNIX:
+                       READ_BUF(8);
+                       /* stamp */
+                       READ32(dummy);
+
+                       /* machine name */
+                       READ32(dummy);
+                       READ_BUF(dummy);
+                       SAVEMEM(machine_name, dummy);
+
+                       /* uid, gid */
+                       READ_BUF(8);
+                       READ32(sess->uid);
+                       READ32(sess->gid);
+
+                       /* more gids */
+                       READ_BUF(4);
+                       READ32(dummy);
+                       READ_BUF(dummy * 4);
+                       for (i = 0; i < dummy; ++i)
+                               READ32(dummy);
+                       break;
+               case RPC_AUTH_GSS:
+                       dprintk("RPC_AUTH_GSS callback secflavor "
+                               "not supported!\n");
+                       READ_BUF(8);
+                       /* gcbp_service */
+                       READ32(dummy);
+                       /* gcbp_handle_from_server */
+                       READ32(dummy);
+                       READ_BUF(dummy);
+                       p += XDR_QUADLEN(dummy);
+                       /* gcbp_handle_from_client */
+                       READ_BUF(4);
+                       READ32(dummy);
+                       READ_BUF(dummy);
+                       p += XDR_QUADLEN(dummy);
+                       break;
+               default:
+                       dprintk("Illegal callback secflavor\n");
+                       return nfserr_inval;
+               }
+       }
+       DECODE_TAIL;
+}
+
+static __be32
+nfsd4_decode_destroy_session(struct nfsd4_compoundargs *argp,
+                            struct nfsd4_destroy_session *destroy_session)
+{
+       DECODE_HEAD;
+       READ_BUF(NFS4_MAX_SESSIONID_LEN);
+       COPYMEM(destroy_session->sessionid.data, NFS4_MAX_SESSIONID_LEN);
+
+       DECODE_TAIL;
+}
+
+static __be32
+nfsd4_decode_sequence(struct nfsd4_compoundargs *argp,
+                     struct nfsd4_sequence *seq)
+{
+       DECODE_HEAD;
+
+       READ_BUF(NFS4_MAX_SESSIONID_LEN + 16);
+       COPYMEM(seq->sessionid.data, NFS4_MAX_SESSIONID_LEN);
+       READ32(seq->seqid);
+       READ32(seq->slotid);
+       READ32(seq->maxslots);
+       READ32(seq->cachethis);
+
        DECODE_TAIL;
 }
 
@@ -1005,7 +1282,7 @@ nfsd4_decode_noop(struct nfsd4_compoundargs *argp, void *p)
 static __be32
 nfsd4_decode_notsupp(struct nfsd4_compoundargs *argp, void *p)
 {
-       return nfserr_opnotsupp;
+       return nfserr_notsupp;
 }
 
 typedef __be32(*nfsd4_dec)(struct nfsd4_compoundargs *argp, void *);
@@ -1031,7 +1308,7 @@ static nfsd4_dec nfsd4_dec_ops[] = {
        [OP_OPEN_CONFIRM]       = (nfsd4_dec)nfsd4_decode_open_confirm,
        [OP_OPEN_DOWNGRADE]     = (nfsd4_dec)nfsd4_decode_open_downgrade,
        [OP_PUTFH]              = (nfsd4_dec)nfsd4_decode_putfh,
-       [OP_PUTPUBFH]           = (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_PUTPUBFH]           = (nfsd4_dec)nfsd4_decode_noop,
        [OP_PUTROOTFH]          = (nfsd4_dec)nfsd4_decode_noop,
        [OP_READ]               = (nfsd4_dec)nfsd4_decode_read,
        [OP_READDIR]            = (nfsd4_dec)nfsd4_decode_readdir,
@@ -1050,6 +1327,67 @@ static nfsd4_dec nfsd4_dec_ops[] = {
        [OP_RELEASE_LOCKOWNER]  = (nfsd4_dec)nfsd4_decode_release_lockowner,
 };
 
+static nfsd4_dec nfsd41_dec_ops[] = {
+       [OP_ACCESS]             (nfsd4_dec)nfsd4_decode_access,
+       [OP_CLOSE]              (nfsd4_dec)nfsd4_decode_close,
+       [OP_COMMIT]             (nfsd4_dec)nfsd4_decode_commit,
+       [OP_CREATE]             (nfsd4_dec)nfsd4_decode_create,
+       [OP_DELEGPURGE]         (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_DELEGRETURN]        (nfsd4_dec)nfsd4_decode_delegreturn,
+       [OP_GETATTR]            (nfsd4_dec)nfsd4_decode_getattr,
+       [OP_GETFH]              (nfsd4_dec)nfsd4_decode_noop,
+       [OP_LINK]               (nfsd4_dec)nfsd4_decode_link,
+       [OP_LOCK]               (nfsd4_dec)nfsd4_decode_lock,
+       [OP_LOCKT]              (nfsd4_dec)nfsd4_decode_lockt,
+       [OP_LOCKU]              (nfsd4_dec)nfsd4_decode_locku,
+       [OP_LOOKUP]             (nfsd4_dec)nfsd4_decode_lookup,
+       [OP_LOOKUPP]            (nfsd4_dec)nfsd4_decode_noop,
+       [OP_NVERIFY]            (nfsd4_dec)nfsd4_decode_verify,
+       [OP_OPEN]               (nfsd4_dec)nfsd4_decode_open,
+       [OP_OPENATTR]           (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_OPEN_CONFIRM]       (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_OPEN_DOWNGRADE]     (nfsd4_dec)nfsd4_decode_open_downgrade,
+       [OP_PUTFH]              (nfsd4_dec)nfsd4_decode_putfh,
+       [OP_PUTPUBFH]           (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_PUTROOTFH]          (nfsd4_dec)nfsd4_decode_noop,
+       [OP_READ]               (nfsd4_dec)nfsd4_decode_read,
+       [OP_READDIR]            (nfsd4_dec)nfsd4_decode_readdir,
+       [OP_READLINK]           (nfsd4_dec)nfsd4_decode_noop,
+       [OP_REMOVE]             (nfsd4_dec)nfsd4_decode_remove,
+       [OP_RENAME]             (nfsd4_dec)nfsd4_decode_rename,
+       [OP_RENEW]              (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_RESTOREFH]          (nfsd4_dec)nfsd4_decode_noop,
+       [OP_SAVEFH]             (nfsd4_dec)nfsd4_decode_noop,
+       [OP_SECINFO]            (nfsd4_dec)nfsd4_decode_secinfo,
+       [OP_SETATTR]            (nfsd4_dec)nfsd4_decode_setattr,
+       [OP_SETCLIENTID]        (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_SETCLIENTID_CONFIRM](nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_VERIFY]             (nfsd4_dec)nfsd4_decode_verify,
+       [OP_WRITE]              (nfsd4_dec)nfsd4_decode_write,
+       [OP_RELEASE_LOCKOWNER]  (nfsd4_dec)nfsd4_decode_notsupp,
+
+       /* new operations for NFSv4.1 */
+       [OP_BACKCHANNEL_CTL]    (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_BIND_CONN_TO_SESSION](nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_EXCHANGE_ID]        (nfsd4_dec)nfsd4_decode_exchange_id,
+       [OP_CREATE_SESSION]     (nfsd4_dec)nfsd4_decode_create_session,
+       [OP_DESTROY_SESSION]    (nfsd4_dec)nfsd4_decode_destroy_session,
+       [OP_FREE_STATEID]       (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_GET_DIR_DELEGATION] (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_GETDEVICEINFO]      (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_GETDEVICELIST]      (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_LAYOUTCOMMIT]       (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_LAYOUTGET]          (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_LAYOUTRETURN]       (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_SECINFO_NO_NAME]    (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_SEQUENCE]           (nfsd4_dec)nfsd4_decode_sequence,
+       [OP_SET_SSV]            (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_TEST_STATEID]       (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_WANT_DELEGATION]    (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_DESTROY_CLIENTID]   (nfsd4_dec)nfsd4_decode_notsupp,
+       [OP_RECLAIM_COMPLETE]   (nfsd4_dec)nfsd4_decode_notsupp,
+};
+
 struct nfsd4_minorversion_ops {
        nfsd4_dec *decoders;
        int nops;
@@ -1057,6 +1395,7 @@ struct nfsd4_minorversion_ops {
 
 static struct nfsd4_minorversion_ops nfsd4_minorversion[] = {
        [0] = { nfsd4_dec_ops, ARRAY_SIZE(nfsd4_dec_ops) },
+       [1] = { nfsd41_dec_ops, ARRAY_SIZE(nfsd41_dec_ops) },
 };
 
 static __be32
@@ -1412,6 +1751,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
 {
        u32 bmval0 = bmval[0];
        u32 bmval1 = bmval[1];
+       u32 bmval2 = bmval[2];
        struct kstat stat;
        struct svc_fh tempfh;
        struct kstatfs statfs;
@@ -1425,12 +1765,16 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
        int err;
        int aclsupport = 0;
        struct nfs4_acl *acl = NULL;
+       struct nfsd4_compoundres *resp = rqstp->rq_resp;
+       u32 minorversion = resp->cstate.minorversion;
 
        BUG_ON(bmval1 & NFSD_WRITEONLY_ATTRS_WORD1);
-       BUG_ON(bmval0 & ~NFSD_SUPPORTED_ATTRS_WORD0);
-       BUG_ON(bmval1 & ~NFSD_SUPPORTED_ATTRS_WORD1);
+       BUG_ON(bmval0 & ~nfsd_suppattrs0(minorversion));
+       BUG_ON(bmval1 & ~nfsd_suppattrs1(minorversion));
+       BUG_ON(bmval2 & ~nfsd_suppattrs2(minorversion));
 
        if (exp->ex_fslocs.migrated) {
+               BUG_ON(bmval[2]);
                status = fattr_handle_absent_fs(&bmval0, &bmval1, &rdattr_err);
                if (status)
                        goto out;
@@ -1476,22 +1820,42 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
        if ((buflen -= 16) < 0)
                goto out_resource;
 
-       WRITE32(2);
-       WRITE32(bmval0);
-       WRITE32(bmval1);
+       if (unlikely(bmval2)) {
+               WRITE32(3);
+               WRITE32(bmval0);
+               WRITE32(bmval1);
+               WRITE32(bmval2);
+       } else if (likely(bmval1)) {
+               WRITE32(2);
+               WRITE32(bmval0);
+               WRITE32(bmval1);
+       } else {
+               WRITE32(1);
+               WRITE32(bmval0);
+       }
        attrlenp = p++;                /* to be backfilled later */
 
        if (bmval0 & FATTR4_WORD0_SUPPORTED_ATTRS) {
-               u32 word0 = NFSD_SUPPORTED_ATTRS_WORD0;
+               u32 word0 = nfsd_suppattrs0(minorversion);
+               u32 word1 = nfsd_suppattrs1(minorversion);
+               u32 word2 = nfsd_suppattrs2(minorversion);
+
                if ((buflen -= 12) < 0)
                        goto out_resource;
                if (!aclsupport)
                        word0 &= ~FATTR4_WORD0_ACL;
                if (!exp->ex_fslocs.locations)
                        word0 &= ~FATTR4_WORD0_FS_LOCATIONS;
-               WRITE32(2);
-               WRITE32(word0);
-               WRITE32(NFSD_SUPPORTED_ATTRS_WORD1);
+               if (!word2) {
+                       WRITE32(2);
+                       WRITE32(word0);
+                       WRITE32(word1);
+               } else {
+                       WRITE32(3);
+                       WRITE32(word0);
+                       WRITE32(word1);
+                       WRITE32(word2);
+               }
        }
        if (bmval0 & FATTR4_WORD0_TYPE) {
                if ((buflen -= 4) < 0)
@@ -1801,6 +2165,13 @@ out_acl:
                }
                WRITE64(stat.ino);
        }
+       if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {
+               WRITE32(3);
+               WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD0);
+               WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD1);
+               WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD2);
+       }
+
        *attrlenp = htonl((char *)p - (char *)attrlenp - 4);
        *countp = p - buffer;
        status = nfs_ok;
@@ -2571,6 +2942,143 @@ nfsd4_encode_write(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_w
        return nfserr;
 }
 
+static __be32
+nfsd4_encode_exchange_id(struct nfsd4_compoundres *resp, int nfserr,
+                        struct nfsd4_exchange_id *exid)
+{
+       ENCODE_HEAD;
+       char *major_id;
+       char *server_scope;
+       int major_id_sz;
+       int server_scope_sz;
+       uint64_t minor_id = 0;
+
+       if (nfserr)
+               return nfserr;
+
+       major_id = utsname()->nodename;
+       major_id_sz = strlen(major_id);
+       server_scope = utsname()->nodename;
+       server_scope_sz = strlen(server_scope);
+
+       RESERVE_SPACE(
+               8 /* eir_clientid */ +
+               4 /* eir_sequenceid */ +
+               4 /* eir_flags */ +
+               4 /* spr_how (SP4_NONE) */ +
+               8 /* so_minor_id */ +
+               4 /* so_major_id.len */ +
+               (XDR_QUADLEN(major_id_sz) * 4) +
+               4 /* eir_server_scope.len */ +
+               (XDR_QUADLEN(server_scope_sz) * 4) +
+               4 /* eir_server_impl_id.count (0) */);
+
+       WRITEMEM(&exid->clientid, 8);
+       WRITE32(exid->seqid);
+       WRITE32(exid->flags);
+
+       /* state_protect4_r. Currently only support SP4_NONE */
+       BUG_ON(exid->spa_how != SP4_NONE);
+       WRITE32(exid->spa_how);
+
+       /* The server_owner struct */
+       WRITE64(minor_id);      /* Minor id */
+       /* major id */
+       WRITE32(major_id_sz);
+       WRITEMEM(major_id, major_id_sz);
+
+       /* Server scope */
+       WRITE32(server_scope_sz);
+       WRITEMEM(server_scope, server_scope_sz);
+
+       /* Implementation id */
+       WRITE32(0);     /* zero length nfs_impl_id4 array */
+       ADJUST_ARGS();
+       return 0;
+}
+
+static __be32
+nfsd4_encode_create_session(struct nfsd4_compoundres *resp, int nfserr,
+                           struct nfsd4_create_session *sess)
+{
+       ENCODE_HEAD;
+
+       if (nfserr)
+               return nfserr;
+
+       RESERVE_SPACE(24);
+       WRITEMEM(sess->sessionid.data, NFS4_MAX_SESSIONID_LEN);
+       WRITE32(sess->seqid);
+       WRITE32(sess->flags);
+       ADJUST_ARGS();
+
+       RESERVE_SPACE(28);
+       WRITE32(0); /* headerpadsz */
+       WRITE32(sess->fore_channel.maxreq_sz);
+       WRITE32(sess->fore_channel.maxresp_sz);
+       WRITE32(sess->fore_channel.maxresp_cached);
+       WRITE32(sess->fore_channel.maxops);
+       WRITE32(sess->fore_channel.maxreqs);
+       WRITE32(sess->fore_channel.nr_rdma_attrs);
+       ADJUST_ARGS();
+
+       if (sess->fore_channel.nr_rdma_attrs) {
+               RESERVE_SPACE(4);
+               WRITE32(sess->fore_channel.rdma_attrs);
+               ADJUST_ARGS();
+       }
+
+       RESERVE_SPACE(28);
+       WRITE32(0); /* headerpadsz */
+       WRITE32(sess->back_channel.maxreq_sz);
+       WRITE32(sess->back_channel.maxresp_sz);
+       WRITE32(sess->back_channel.maxresp_cached);
+       WRITE32(sess->back_channel.maxops);
+       WRITE32(sess->back_channel.maxreqs);
+       WRITE32(sess->back_channel.nr_rdma_attrs);
+       ADJUST_ARGS();
+
+       if (sess->back_channel.nr_rdma_attrs) {
+               RESERVE_SPACE(4);
+               WRITE32(sess->back_channel.rdma_attrs);
+               ADJUST_ARGS();
+       }
+       return 0;
+}
+
+static __be32
+nfsd4_encode_destroy_session(struct nfsd4_compoundres *resp, int nfserr,
+                            struct nfsd4_destroy_session *destroy_session)
+{
+       return nfserr;
+}
+
+__be32
+nfsd4_encode_sequence(struct nfsd4_compoundres *resp, int nfserr,
+                     struct nfsd4_sequence *seq)
+{
+       ENCODE_HEAD;
+
+       if (nfserr)
+               return nfserr;
+
+       RESERVE_SPACE(NFS4_MAX_SESSIONID_LEN + 20);
+       WRITEMEM(seq->sessionid.data, NFS4_MAX_SESSIONID_LEN);
+       WRITE32(seq->seqid);
+       WRITE32(seq->slotid);
+       WRITE32(seq->maxslots);
+       /*
+        * FIXME: for now:
+        *   target_maxslots = maxslots
+        *   status_flags = 0
+        */
+       WRITE32(seq->maxslots);
+       WRITE32(0);
+
+       ADJUST_ARGS();
+       return 0;
+}
+
 static __be32
 nfsd4_encode_noop(struct nfsd4_compoundres *resp, __be32 nfserr, void *p)
 {
@@ -2579,6 +3087,11 @@ nfsd4_encode_noop(struct nfsd4_compoundres *resp, __be32 nfserr, void *p)
 
 typedef __be32(* nfsd4_enc)(struct nfsd4_compoundres *, __be32, void *);
 
+/*
+ * Note: nfsd4_enc_ops vector is shared for v4.0 and v4.1
+ * since we don't need to filter out obsolete ops as this is
+ * done in the decoding phase.
+ */
 static nfsd4_enc nfsd4_enc_ops[] = {
        [OP_ACCESS]             = (nfsd4_enc)nfsd4_encode_access,
        [OP_CLOSE]              = (nfsd4_enc)nfsd4_encode_close,
@@ -2617,8 +3130,77 @@ static nfsd4_enc nfsd4_enc_ops[] = {
        [OP_VERIFY]             = (nfsd4_enc)nfsd4_encode_noop,
        [OP_WRITE]              = (nfsd4_enc)nfsd4_encode_write,
        [OP_RELEASE_LOCKOWNER]  = (nfsd4_enc)nfsd4_encode_noop,
+
+       /* NFSv4.1 operations */
+       [OP_BACKCHANNEL_CTL]    = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_BIND_CONN_TO_SESSION] = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_EXCHANGE_ID]        = (nfsd4_enc)nfsd4_encode_exchange_id,
+       [OP_CREATE_SESSION]     = (nfsd4_enc)nfsd4_encode_create_session,
+       [OP_DESTROY_SESSION]    = (nfsd4_enc)nfsd4_encode_destroy_session,
+       [OP_FREE_STATEID]       = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_GET_DIR_DELEGATION] = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_GETDEVICEINFO]      = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_GETDEVICELIST]      = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_LAYOUTCOMMIT]       = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_LAYOUTGET]          = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_LAYOUTRETURN]       = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_SECINFO_NO_NAME]    = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_SEQUENCE]           = (nfsd4_enc)nfsd4_encode_sequence,
+       [OP_SET_SSV]            = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_TEST_STATEID]       = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_WANT_DELEGATION]    = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_DESTROY_CLIENTID]   = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_RECLAIM_COMPLETE]   = (nfsd4_enc)nfsd4_encode_noop,
 };
 
+/*
+ * Calculate the total amount of memory that the compound response has taken
+ * after encoding the current operation.
+ *
+ * pad: add on 8 bytes for the next operation's op_code and status so that
+ * there is room to cache a failure on the next operation.
+ *
+ * Compare this length to the session se_fmaxresp_cached.
+ *
+ * Our se_fmaxresp_cached will always be a multiple of PAGE_SIZE, and so
+ * will be at least a page and will therefore hold the xdr_buf head.
+ */
+static int nfsd4_check_drc_limit(struct nfsd4_compoundres *resp)
+{
+       int status = 0;
+       struct xdr_buf *xb = &resp->rqstp->rq_res;
+       struct nfsd4_compoundargs *args = resp->rqstp->rq_argp;
+       struct nfsd4_session *session = NULL;
+       struct nfsd4_slot *slot = resp->cstate.slot;
+       u32 length, tlen = 0, pad = 8;
+
+       if (!nfsd4_has_session(&resp->cstate))
+               return status;
+
+       session = resp->cstate.session;
+       if (session == NULL || slot->sl_cache_entry.ce_cachethis == 0)
+               return status;
+
+       if (resp->opcnt >= args->opcnt)
+               pad = 0; /* this is the last operation */
+
+       if (xb->page_len == 0) {
+               length = (char *)resp->p - (char *)xb->head[0].iov_base + pad;
+       } else {
+               if (xb->tail[0].iov_base && xb->tail[0].iov_len > 0)
+                       tlen = (char *)resp->p - (char *)xb->tail[0].iov_base;
+
+               length = xb->head[0].iov_len + xb->page_len + tlen + pad;
+       }
+       dprintk("%s length %u, xb->page_len %u tlen %u pad %u\n", __func__,
+               length, xb->page_len, tlen, pad);
+
+       if (length <= session->se_fmaxresp_cached)
+               return status;
+       else
+               return nfserr_rep_too_big_to_cache;
+}
+
 void
 nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
 {
@@ -2635,6 +3217,9 @@ nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
        BUG_ON(op->opnum < 0 || op->opnum >= ARRAY_SIZE(nfsd4_enc_ops) ||
               !nfsd4_enc_ops[op->opnum]);
        op->status = nfsd4_enc_ops[op->opnum](resp, op->status, &op->u);
+       /* nfsd4_check_drc_limit guarantees enough room for error status */
+       if (!op->status && nfsd4_check_drc_limit(resp))
+               op->status = nfserr_rep_too_big_to_cache;
 status:
        /*
         * Note: We write the status directly, instead of using WRITE32(),
@@ -2735,6 +3320,18 @@ nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compo
                iov = &rqstp->rq_res.head[0];
        iov->iov_len = ((char*)resp->p) - (char*)iov->iov_base;
        BUG_ON(iov->iov_len > PAGE_SIZE);
+       if (nfsd4_has_session(&resp->cstate)) {
+               if (resp->cstate.status == nfserr_replay_cache &&
+                               !nfsd4_not_cached(resp)) {
+                       iov->iov_len = resp->cstate.iovlen;
+               } else {
+                       nfsd4_store_cache_entry(resp);
+                       dprintk("%s: SET SLOT STATE TO AVAILABLE\n", __func__);
+                       resp->cstate.slot->sl_inuse = 0;
+               }
+               if (resp->cstate.session)
+                       nfsd4_put_session(resp->cstate.session);
+       }
        return 1;
 }
 
index a4ed8644d69c0f5050d8e11cc6b66686b7804084..af16849d243ac543c1192b04c49362b8c3eac958 100644 (file)
@@ -60,6 +60,7 @@ enum {
        NFSD_FO_UnlockFS,
        NFSD_Threads,
        NFSD_Pool_Threads,
+       NFSD_Pool_Stats,
        NFSD_Versions,
        NFSD_Ports,
        NFSD_MaxBlkSize,
@@ -172,6 +173,16 @@ static const struct file_operations exports_operations = {
        .owner          = THIS_MODULE,
 };
 
+extern int nfsd_pool_stats_open(struct inode *inode, struct file *file);
+
+static struct file_operations pool_stats_operations = {
+       .open           = nfsd_pool_stats_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = seq_release,
+       .owner          = THIS_MODULE,
+};
+
 /*----------------------------------------------------------------------------*/
 /*
  * payload - write methods
@@ -781,8 +792,9 @@ out_free:
 static ssize_t __write_versions(struct file *file, char *buf, size_t size)
 {
        char *mesg = buf;
-       char *vers, sign;
+       char *vers, *minorp, sign;
        int len, num;
+       unsigned minor;
        ssize_t tlen = 0;
        char *sep;
 
@@ -803,9 +815,20 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
                do {
                        sign = *vers;
                        if (sign == '+' || sign == '-')
-                               num = simple_strtol((vers+1), NULL, 0);
+                               num = simple_strtol((vers+1), &minorp, 0);
                        else
-                               num = simple_strtol(vers, NULL, 0);
+                               num = simple_strtol(vers, &minorp, 0);
+                       if (*minorp == '.') {
+                               if (num < 4)
+                                       return -EINVAL;
+                               minor = simple_strtoul(minorp+1, NULL, 0);
+                               if (minor == 0)
+                                       return -EINVAL;
+                               if (nfsd_minorversion(minor, sign == '-' ?
+                                                    NFSD_CLEAR : NFSD_SET) < 0)
+                                       return -EINVAL;
+                               goto next;
+                       }
                        switch(num) {
                        case 2:
                        case 3:
@@ -815,6 +838,7 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
                        default:
                                return -EINVAL;
                        }
+               next:
                        vers += len + 1;
                        tlen += len;
                } while ((len = qword_get(&mesg, vers, size)) > 0);
@@ -833,6 +857,13 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size)
                                       num);
                        sep = " ";
                }
+       if (nfsd_vers(4, NFSD_AVAIL))
+               for (minor = 1; minor <= NFSD_SUPPORTED_MINOR_VERSION; minor++)
+                       len += sprintf(buf+len, " %c4.%u",
+                                       (nfsd_vers(4, NFSD_TEST) &&
+                                        nfsd_minorversion(minor, NFSD_TEST)) ?
+                                               '+' : '-',
+                                       minor);
        len += sprintf(buf+len, "\n");
        return len;
 }
@@ -1248,6 +1279,7 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent)
                [NFSD_Fh] = {"filehandle", &transaction_ops, S_IWUSR|S_IRUSR},
                [NFSD_Threads] = {"threads", &transaction_ops, S_IWUSR|S_IRUSR},
                [NFSD_Pool_Threads] = {"pool_threads", &transaction_ops, S_IWUSR|S_IRUSR},
+               [NFSD_Pool_Stats] = {"pool_stats", &pool_stats_operations, S_IRUGO},
                [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR},
                [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO},
                [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO},
index 6f7f26351227f250625430a75268594efc0206ab..e298e260b5f13d10433da9d66bd87c3dee2d0f1f 100644 (file)
@@ -180,6 +180,7 @@ nfsd_proc_write(struct svc_rqst *rqstp, struct nfsd_writeargs *argp,
 {
        __be32  nfserr;
        int     stable = 1;
+       unsigned long cnt = argp->len;
 
        dprintk("nfsd: WRITE    %s %d bytes at %d\n",
                SVCFH_fmt(&argp->fh),
@@ -188,7 +189,7 @@ nfsd_proc_write(struct svc_rqst *rqstp, struct nfsd_writeargs *argp,
        nfserr = nfsd_write(rqstp, fh_copy(&resp->fh, &argp->fh), NULL,
                                   argp->offset,
                                   rqstp->rq_vec, argp->vlen,
-                                  argp->len,
+                                  &cnt,
                                   &stable);
        return nfsd_return_attrs(nfserr, resp);
 }
index 7c09852be713b91ef9de1f507aafb04ad61a35a9..cbba4a935786db386ecf0b60e3a001b6f15ebf03 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/freezer.h>
 #include <linux/fs_struct.h>
 #include <linux/kthread.h>
+#include <linux/swap.h>
 
 #include <linux/sunrpc/types.h>
 #include <linux/sunrpc/stats.h>
@@ -40,9 +41,6 @@
 extern struct svc_program      nfsd_program;
 static int                     nfsd(void *vrqstp);
 struct timeval                 nfssvc_boot;
-static atomic_t                        nfsd_busy;
-static unsigned long           nfsd_last_call;
-static DEFINE_SPINLOCK(nfsd_call_lock);
 
 /*
  * nfsd_mutex protects nfsd_serv -- both the pointer itself and the members
@@ -123,6 +121,8 @@ struct svc_program          nfsd_program = {
 
 };
 
+u32 nfsd_supported_minorversion;
+
 int nfsd_vers(int vers, enum vers_op change)
 {
        if (vers < NFSD_MINVERS || vers >= NFSD_NRVERS)
@@ -149,6 +149,28 @@ int nfsd_vers(int vers, enum vers_op change)
        }
        return 0;
 }
+
+int nfsd_minorversion(u32 minorversion, enum vers_op change)
+{
+       if (minorversion > NFSD_SUPPORTED_MINOR_VERSION)
+               return -1;
+       switch(change) {
+       case NFSD_SET:
+               nfsd_supported_minorversion = minorversion;
+               break;
+       case NFSD_CLEAR:
+               if (minorversion == 0)
+                       return -1;
+               nfsd_supported_minorversion = minorversion - 1;
+               break;
+       case NFSD_TEST:
+               return minorversion <= nfsd_supported_minorversion;
+       case NFSD_AVAIL:
+               return minorversion <= NFSD_SUPPORTED_MINOR_VERSION;
+       }
+       return 0;
+}
+
 /*
  * Maximum number of nfsd processes
  */
@@ -200,6 +222,28 @@ void nfsd_reset_versions(void)
        }
 }
 
+/*
+ * Each session guarantees a negotiated per slot memory cache for replies
+ * which in turn consumes memory beyond the v2/v3/v4.0 server. A dedicated
+ * NFSv4.1 server might want to use more memory for a DRC than a machine
+ * with mutiple services.
+ *
+ * Impose a hard limit on the number of pages for the DRC which varies
+ * according to the machines free pages. This is of course only a default.
+ *
+ * For now this is a #defined shift which could be under admin control
+ * in the future.
+ */
+static void set_max_drc(void)
+{
+       /* The percent of nr_free_buffer_pages used by the V4.1 server DRC */
+       #define NFSD_DRC_SIZE_SHIFT     7
+       nfsd_serv->sv_drc_max_pages = nr_free_buffer_pages()
+                                               >> NFSD_DRC_SIZE_SHIFT;
+       nfsd_serv->sv_drc_pages_used = 0;
+       dprintk("%s svc_drc_max_pages %u\n", __func__,
+               nfsd_serv->sv_drc_max_pages);
+}
 
 int nfsd_create_serv(void)
 {
@@ -227,11 +271,12 @@ int nfsd_create_serv(void)
                        nfsd_max_blksize /= 2;
        }
 
-       atomic_set(&nfsd_busy, 0);
        nfsd_serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize,
                                      nfsd_last_thread, nfsd, THIS_MODULE);
        if (nfsd_serv == NULL)
                err = -ENOMEM;
+       else
+               set_max_drc();
 
        do_gettimeofday(&nfssvc_boot);          /* record boot time */
        return err;
@@ -375,26 +420,6 @@ nfsd_svc(unsigned short port, int nrservs)
        return error;
 }
 
-static inline void
-update_thread_usage(int busy_threads)
-{
-       unsigned long prev_call;
-       unsigned long diff;
-       int decile;
-
-       spin_lock(&nfsd_call_lock);
-       prev_call = nfsd_last_call;
-       nfsd_last_call = jiffies;
-       decile = busy_threads*10/nfsdstats.th_cnt;
-       if (decile>0 && decile <= 10) {
-               diff = nfsd_last_call - prev_call;
-               if ( (nfsdstats.th_usage[decile-1] += diff) >= NFSD_USAGE_WRAP)
-                       nfsdstats.th_usage[decile-1] -= NFSD_USAGE_WRAP;
-               if (decile == 10)
-                       nfsdstats.th_fullcnt++;
-       }
-       spin_unlock(&nfsd_call_lock);
-}
 
 /*
  * This is the NFS server kernel thread
@@ -460,8 +485,6 @@ nfsd(void *vrqstp)
                        continue;
                }
 
-               update_thread_usage(atomic_read(&nfsd_busy));
-               atomic_inc(&nfsd_busy);
 
                /* Lock the export hash tables for reading. */
                exp_readlock();
@@ -470,8 +493,6 @@ nfsd(void *vrqstp)
 
                /* Unlock export hash tables */
                exp_readunlock();
-               update_thread_usage(atomic_read(&nfsd_busy));
-               atomic_dec(&nfsd_busy);
        }
 
        /* Clear signals before calling svc_exit_thread() */
@@ -539,6 +560,10 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
                + rqstp->rq_res.head[0].iov_len;
        rqstp->rq_res.head[0].iov_len += sizeof(__be32);
 
+       /* NFSv4.1 DRC requires statp */
+       if (rqstp->rq_vers == 4)
+               nfsd4_set_statp(rqstp, statp);
+
        /* Now call the procedure handler, and encode NFS status. */
        nfserr = proc->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
        nfserr = map_new_errors(rqstp->rq_vers, nfserr);
@@ -570,3 +595,10 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
        nfsd_cache_update(rqstp, proc->pc_cachetype, statp + 1);
        return 1;
 }
+
+int nfsd_pool_stats_open(struct inode *inode, struct file *file)
+{
+       if (nfsd_serv == NULL)
+               return -ENODEV;
+       return svc_pool_stats_open(nfsd_serv, file);
+}
index 78376b6c0236161009488e0bf4f3a2a707c3bc44..ab93fcfef254928360073e3452c707d1653b99c8 100644 (file)
@@ -366,8 +366,9 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
        }
 
        /* Revoke setuid/setgid on chown */
-       if (((iap->ia_valid & ATTR_UID) && iap->ia_uid != inode->i_uid) ||
-           ((iap->ia_valid & ATTR_GID) && iap->ia_gid != inode->i_gid)) {
+       if (!S_ISDIR(inode->i_mode) &&
+           (((iap->ia_valid & ATTR_UID) && iap->ia_uid != inode->i_uid) ||
+            ((iap->ia_valid & ATTR_GID) && iap->ia_gid != inode->i_gid))) {
                iap->ia_valid |= ATTR_KILL_PRIV;
                if (iap->ia_valid & ATTR_MODE) {
                        /* we're setting mode too, just clear the s*id bits */
@@ -960,7 +961,7 @@ static void kill_suid(struct dentry *dentry)
 static __be32
 nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
                                loff_t offset, struct kvec *vec, int vlen,
-                               unsigned long cnt, int *stablep)
+                               unsigned long *cnt, int *stablep)
 {
        struct svc_export       *exp;
        struct dentry           *dentry;
@@ -974,7 +975,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
        err = nfserr_perm;
 
        if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
-               (!lock_may_write(file->f_path.dentry->d_inode, offset, cnt)))
+               (!lock_may_write(file->f_path.dentry->d_inode, offset, *cnt)))
                goto out;
 #endif
 
@@ -1009,7 +1010,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
        host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset);
        set_fs(oldfs);
        if (host_err >= 0) {
-               nfsdstats.io_write += cnt;
+               nfsdstats.io_write += host_err;
                fsnotify_modify(file->f_path.dentry);
        }
 
@@ -1054,9 +1055,10 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
        }
 
        dprintk("nfsd: write complete host_err=%d\n", host_err);
-       if (host_err >= 0)
+       if (host_err >= 0) {
                err = 0;
-       else 
+               *cnt = host_err;
+       } else
                err = nfserrno(host_err);
 out:
        return err;
@@ -1098,7 +1100,7 @@ out:
  */
 __be32
 nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
-               loff_t offset, struct kvec *vec, int vlen, unsigned long cnt,
+               loff_t offset, struct kvec *vec, int vlen, unsigned long *cnt,
                int *stablep)
 {
        __be32                  err = 0;
@@ -1179,6 +1181,21 @@ nfsd_create_setattr(struct svc_rqst *rqstp, struct svc_fh *resfhp,
        return 0;
 }
 
+/* HPUX client sometimes creates a file in mode 000, and sets size to 0.
+ * setting size to 0 may fail for some specific file systems by the permission
+ * checking which requires WRITE permission but the mode is 000.
+ * we ignore the resizing(to 0) on the just new created file, since the size is
+ * 0 after file created.
+ *
+ * call this only after vfs_create() is called.
+ * */
+static void
+nfsd_check_ignore_resizing(struct iattr *iap)
+{
+       if ((iap->ia_valid & ATTR_SIZE) && (iap->ia_size == 0))
+               iap->ia_valid &= ~ATTR_SIZE;
+}
+
 /*
  * Create a file (regular, directory, device, fifo); UNIX sockets 
  * not yet implemented.
@@ -1274,6 +1291,8 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
        switch (type) {
        case S_IFREG:
                host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL);
+               if (!host_err)
+                       nfsd_check_ignore_resizing(iap);
                break;
        case S_IFDIR:
                host_err = vfs_mkdir(dirp, dchild, iap->ia_mode);
@@ -1427,6 +1446,8 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
                /* setattr will sync the child (or not) */
        }
 
+       nfsd_check_ignore_resizing(iap);
+
        if (createmode == NFS3_CREATE_EXCLUSIVE) {
                /* Cram the verifier into atime/mtime */
                iap->ia_valid = ATTR_MTIME|ATTR_ATIME
diff --git a/fs/nilfs2/Makefile b/fs/nilfs2/Makefile
new file mode 100644 (file)
index 0000000..df3e62c
--- /dev/null
@@ -0,0 +1,5 @@
+obj-$(CONFIG_NILFS2_FS) += nilfs2.o
+nilfs2-y := inode.o file.o dir.o super.o namei.o page.o mdt.o \
+       btnode.o bmap.o btree.o direct.o dat.o recovery.o \
+       the_nilfs.o segbuf.o segment.o cpfile.o sufile.o \
+       ifile.o alloc.o gcinode.o ioctl.o gcdat.o
diff --git a/fs/nilfs2/alloc.c b/fs/nilfs2/alloc.c
new file mode 100644 (file)
index 0000000..d69e6ae
--- /dev/null
@@ -0,0 +1,504 @@
+/*
+ * alloc.c - NILFS dat/inode allocator
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Original code was written by Koji Sato <koji@osrg.net>.
+ * Two allocators were unified by Ryusuke Konishi <ryusuke@osrg.net>,
+ *                                Amagai Yoshiji <amagai@osrg.net>.
+ */
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include <linux/fs.h>
+#include <linux/bitops.h>
+#include "mdt.h"
+#include "alloc.h"
+
+
+static inline unsigned long
+nilfs_palloc_groups_per_desc_block(const struct inode *inode)
+{
+       return (1UL << inode->i_blkbits) /
+               sizeof(struct nilfs_palloc_group_desc);
+}
+
+static inline unsigned long
+nilfs_palloc_groups_count(const struct inode *inode)
+{
+       return 1UL << (BITS_PER_LONG - (inode->i_blkbits + 3 /* log2(8) */));
+}
+
+int nilfs_palloc_init_blockgroup(struct inode *inode, unsigned entry_size)
+{
+       struct nilfs_mdt_info *mi = NILFS_MDT(inode);
+
+       mi->mi_bgl = kmalloc(sizeof(*mi->mi_bgl), GFP_NOFS);
+       if (!mi->mi_bgl)
+               return -ENOMEM;
+
+       bgl_lock_init(mi->mi_bgl);
+
+       nilfs_mdt_set_entry_size(inode, entry_size, 0);
+
+       mi->mi_blocks_per_group =
+               DIV_ROUND_UP(nilfs_palloc_entries_per_group(inode),
+                            mi->mi_entries_per_block) + 1;
+               /* Number of blocks in a group including entry blocks and
+                  a bitmap block */
+       mi->mi_blocks_per_desc_block =
+               nilfs_palloc_groups_per_desc_block(inode) *
+               mi->mi_blocks_per_group + 1;
+               /* Number of blocks per descriptor including the
+                  descriptor block */
+       return 0;
+}
+
+static unsigned long nilfs_palloc_group(const struct inode *inode, __u64 nr,
+                                       unsigned long *offset)
+{
+       __u64 group = nr;
+
+       *offset = do_div(group, nilfs_palloc_entries_per_group(inode));
+       return group;
+}
+
+static unsigned long
+nilfs_palloc_desc_blkoff(const struct inode *inode, unsigned long group)
+{
+       unsigned long desc_block =
+               group / nilfs_palloc_groups_per_desc_block(inode);
+       return desc_block * NILFS_MDT(inode)->mi_blocks_per_desc_block;
+}
+
+static unsigned long
+nilfs_palloc_bitmap_blkoff(const struct inode *inode, unsigned long group)
+{
+       unsigned long desc_offset =
+               group % nilfs_palloc_groups_per_desc_block(inode);
+       return nilfs_palloc_desc_blkoff(inode, group) + 1 +
+               desc_offset * NILFS_MDT(inode)->mi_blocks_per_group;
+}
+
+static unsigned long
+nilfs_palloc_group_desc_nfrees(struct inode *inode, unsigned long group,
+                              const struct nilfs_palloc_group_desc *desc)
+{
+       unsigned long nfree;
+
+       spin_lock(nilfs_mdt_bgl_lock(inode, group));
+       nfree = le32_to_cpu(desc->pg_nfrees);
+       spin_unlock(nilfs_mdt_bgl_lock(inode, group));
+       return nfree;
+}
+
+static void
+nilfs_palloc_group_desc_add_entries(struct inode *inode,
+                                   unsigned long group,
+                                   struct nilfs_palloc_group_desc *desc,
+                                   u32 n)
+{
+       spin_lock(nilfs_mdt_bgl_lock(inode, group));
+       le32_add_cpu(&desc->pg_nfrees, n);
+       spin_unlock(nilfs_mdt_bgl_lock(inode, group));
+}
+
+static unsigned long
+nilfs_palloc_entry_blkoff(const struct inode *inode, __u64 nr)
+{
+       unsigned long group, group_offset;
+
+       group = nilfs_palloc_group(inode, nr, &group_offset);
+
+       return nilfs_palloc_bitmap_blkoff(inode, group) + 1 +
+               group_offset / NILFS_MDT(inode)->mi_entries_per_block;
+}
+
+static void nilfs_palloc_desc_block_init(struct inode *inode,
+                                        struct buffer_head *bh, void *kaddr)
+{
+       struct nilfs_palloc_group_desc *desc = kaddr + bh_offset(bh);
+       unsigned long n = nilfs_palloc_groups_per_desc_block(inode);
+       __le32 nfrees;
+
+       nfrees = cpu_to_le32(nilfs_palloc_entries_per_group(inode));
+       while (n-- > 0) {
+               desc->pg_nfrees = nfrees;
+               desc++;
+       }
+}
+
+static int nilfs_palloc_get_desc_block(struct inode *inode,
+                                      unsigned long group,
+                                      int create, struct buffer_head **bhp)
+{
+       return nilfs_mdt_get_block(inode,
+                                  nilfs_palloc_desc_blkoff(inode, group),
+                                  create, nilfs_palloc_desc_block_init, bhp);
+}
+
+static int nilfs_palloc_get_bitmap_block(struct inode *inode,
+                                        unsigned long group,
+                                        int create, struct buffer_head **bhp)
+{
+       return nilfs_mdt_get_block(inode,
+                                  nilfs_palloc_bitmap_blkoff(inode, group),
+                                  create, NULL, bhp);
+}
+
+int nilfs_palloc_get_entry_block(struct inode *inode, __u64 nr,
+                                int create, struct buffer_head **bhp)
+{
+       return nilfs_mdt_get_block(inode, nilfs_palloc_entry_blkoff(inode, nr),
+                                  create, NULL, bhp);
+}
+
+static struct nilfs_palloc_group_desc *
+nilfs_palloc_block_get_group_desc(const struct inode *inode,
+                                 unsigned long group,
+                                 const struct buffer_head *bh, void *kaddr)
+{
+       return (struct nilfs_palloc_group_desc *)(kaddr + bh_offset(bh)) +
+               group % nilfs_palloc_groups_per_desc_block(inode);
+}
+
+static unsigned char *
+nilfs_palloc_block_get_bitmap(const struct inode *inode,
+                             const struct buffer_head *bh, void *kaddr)
+{
+       return (unsigned char *)(kaddr + bh_offset(bh));
+}
+
+void *nilfs_palloc_block_get_entry(const struct inode *inode, __u64 nr,
+                                  const struct buffer_head *bh, void *kaddr)
+{
+       unsigned long entry_offset, group_offset;
+
+       nilfs_palloc_group(inode, nr, &group_offset);
+       entry_offset = group_offset % NILFS_MDT(inode)->mi_entries_per_block;
+
+       return kaddr + bh_offset(bh) +
+               entry_offset * NILFS_MDT(inode)->mi_entry_size;
+}
+
+static int nilfs_palloc_find_available_slot(struct inode *inode,
+                                           unsigned long group,
+                                           unsigned long target,
+                                           unsigned char *bitmap,
+                                           int bsize)  /* size in bits */
+{
+       int curr, pos, end, i;
+
+       if (target > 0) {
+               end = (target + BITS_PER_LONG - 1) & ~(BITS_PER_LONG - 1);
+               if (end > bsize)
+                       end = bsize;
+               pos = nilfs_find_next_zero_bit(bitmap, end, target);
+               if (pos < end &&
+                   !nilfs_set_bit_atomic(
+                           nilfs_mdt_bgl_lock(inode, group), pos, bitmap))
+                       return pos;
+       } else
+               end = 0;
+
+       for (i = 0, curr = end;
+            i < bsize;
+            i += BITS_PER_LONG, curr += BITS_PER_LONG) {
+               /* wrap around */
+               if (curr >= bsize)
+                       curr = 0;
+               while (*((unsigned long *)bitmap + curr / BITS_PER_LONG)
+                      != ~0UL) {
+                       end = curr + BITS_PER_LONG;
+                       if (end > bsize)
+                               end = bsize;
+                       pos = nilfs_find_next_zero_bit(bitmap, end, curr);
+                       if ((pos < end) &&
+                           !nilfs_set_bit_atomic(
+                                   nilfs_mdt_bgl_lock(inode, group), pos,
+                                   bitmap))
+                               return pos;
+               }
+       }
+       return -ENOSPC;
+}
+
+static unsigned long
+nilfs_palloc_rest_groups_in_desc_block(const struct inode *inode,
+                                      unsigned long curr, unsigned long max)
+{
+       return min_t(unsigned long,
+                    nilfs_palloc_groups_per_desc_block(inode) -
+                    curr % nilfs_palloc_groups_per_desc_block(inode),
+                    max - curr + 1);
+}
+
+int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
+                                    struct nilfs_palloc_req *req)
+{
+       struct buffer_head *desc_bh, *bitmap_bh;
+       struct nilfs_palloc_group_desc *desc;
+       unsigned char *bitmap;
+       void *desc_kaddr, *bitmap_kaddr;
+       unsigned long group, maxgroup, ngroups;
+       unsigned long group_offset, maxgroup_offset;
+       unsigned long n, entries_per_group, groups_per_desc_block;
+       unsigned long i, j;
+       int pos, ret;
+
+       ngroups = nilfs_palloc_groups_count(inode);
+       maxgroup = ngroups - 1;
+       group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
+       entries_per_group = nilfs_palloc_entries_per_group(inode);
+       groups_per_desc_block = nilfs_palloc_groups_per_desc_block(inode);
+
+       for (i = 0; i < ngroups; i += n) {
+               if (group >= ngroups) {
+                       /* wrap around */
+                       group = 0;
+                       maxgroup = nilfs_palloc_group(inode, req->pr_entry_nr,
+                                                     &maxgroup_offset) - 1;
+               }
+               ret = nilfs_palloc_get_desc_block(inode, group, 1, &desc_bh);
+               if (ret < 0)
+                       return ret;
+               desc_kaddr = kmap(desc_bh->b_page);
+               desc = nilfs_palloc_block_get_group_desc(
+                       inode, group, desc_bh, desc_kaddr);
+               n = nilfs_palloc_rest_groups_in_desc_block(inode, group,
+                                                          maxgroup);
+               for (j = 0; j < n; j++, desc++, group++) {
+                       if (nilfs_palloc_group_desc_nfrees(inode, group, desc)
+                           > 0) {
+                               ret = nilfs_palloc_get_bitmap_block(
+                                       inode, group, 1, &bitmap_bh);
+                               if (ret < 0)
+                                       goto out_desc;
+                               bitmap_kaddr = kmap(bitmap_bh->b_page);
+                               bitmap = nilfs_palloc_block_get_bitmap(
+                                       inode, bitmap_bh, bitmap_kaddr);
+                               pos = nilfs_palloc_find_available_slot(
+                                       inode, group, group_offset, bitmap,
+                                       entries_per_group);
+                               if (pos >= 0) {
+                                       /* found a free entry */
+                                       nilfs_palloc_group_desc_add_entries(
+                                               inode, group, desc, -1);
+                                       req->pr_entry_nr =
+                                               entries_per_group * group + pos;
+                                       kunmap(desc_bh->b_page);
+                                       kunmap(bitmap_bh->b_page);
+
+                                       req->pr_desc_bh = desc_bh;
+                                       req->pr_bitmap_bh = bitmap_bh;
+                                       return 0;
+                               }
+                               kunmap(bitmap_bh->b_page);
+                               brelse(bitmap_bh);
+                       }
+
+                       group_offset = 0;
+               }
+
+               kunmap(desc_bh->b_page);
+               brelse(desc_bh);
+       }
+
+       /* no entries left */
+       return -ENOSPC;
+
+ out_desc:
+       kunmap(desc_bh->b_page);
+       brelse(desc_bh);
+       return ret;
+}
+
+void nilfs_palloc_commit_alloc_entry(struct inode *inode,
+                                    struct nilfs_palloc_req *req)
+{
+       nilfs_mdt_mark_buffer_dirty(req->pr_bitmap_bh);
+       nilfs_mdt_mark_buffer_dirty(req->pr_desc_bh);
+       nilfs_mdt_mark_dirty(inode);
+
+       brelse(req->pr_bitmap_bh);
+       brelse(req->pr_desc_bh);
+}
+
+void nilfs_palloc_commit_free_entry(struct inode *inode,
+                                   struct nilfs_palloc_req *req)
+{
+       struct nilfs_palloc_group_desc *desc;
+       unsigned long group, group_offset;
+       unsigned char *bitmap;
+       void *desc_kaddr, *bitmap_kaddr;
+
+       group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
+       desc_kaddr = kmap(req->pr_desc_bh->b_page);
+       desc = nilfs_palloc_block_get_group_desc(inode, group,
+                                                req->pr_desc_bh, desc_kaddr);
+       bitmap_kaddr = kmap(req->pr_bitmap_bh->b_page);
+       bitmap = nilfs_palloc_block_get_bitmap(inode, req->pr_bitmap_bh,
+                                              bitmap_kaddr);
+
+       if (!nilfs_clear_bit_atomic(nilfs_mdt_bgl_lock(inode, group),
+                                   group_offset, bitmap))
+               printk(KERN_WARNING "%s: entry number %llu already freed\n",
+                      __func__, (unsigned long long)req->pr_entry_nr);
+
+       nilfs_palloc_group_desc_add_entries(inode, group, desc, 1);
+
+       kunmap(req->pr_bitmap_bh->b_page);
+       kunmap(req->pr_desc_bh->b_page);
+
+       nilfs_mdt_mark_buffer_dirty(req->pr_desc_bh);
+       nilfs_mdt_mark_buffer_dirty(req->pr_bitmap_bh);
+       nilfs_mdt_mark_dirty(inode);
+
+       brelse(req->pr_bitmap_bh);
+       brelse(req->pr_desc_bh);
+}
+
+void nilfs_palloc_abort_alloc_entry(struct inode *inode,
+                                   struct nilfs_palloc_req *req)
+{
+       struct nilfs_palloc_group_desc *desc;
+       void *desc_kaddr, *bitmap_kaddr;
+       unsigned char *bitmap;
+       unsigned long group, group_offset;
+
+       group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
+       desc_kaddr = kmap(req->pr_desc_bh->b_page);
+       desc = nilfs_palloc_block_get_group_desc(inode, group,
+                                                req->pr_desc_bh, desc_kaddr);
+       bitmap_kaddr = kmap(req->pr_bitmap_bh->b_page);
+       bitmap = nilfs_palloc_block_get_bitmap(inode, req->pr_bitmap_bh,
+                                              bitmap_kaddr);
+       if (!nilfs_clear_bit_atomic(nilfs_mdt_bgl_lock(inode, group),
+                                   group_offset, bitmap))
+               printk(KERN_WARNING "%s: entry numer %llu already freed\n",
+                      __func__, (unsigned long long)req->pr_entry_nr);
+
+       nilfs_palloc_group_desc_add_entries(inode, group, desc, 1);
+
+       kunmap(req->pr_bitmap_bh->b_page);
+       kunmap(req->pr_desc_bh->b_page);
+
+       brelse(req->pr_bitmap_bh);
+       brelse(req->pr_desc_bh);
+
+       req->pr_entry_nr = 0;
+       req->pr_bitmap_bh = NULL;
+       req->pr_desc_bh = NULL;
+}
+
+int nilfs_palloc_prepare_free_entry(struct inode *inode,
+                                   struct nilfs_palloc_req *req)
+{
+       struct buffer_head *desc_bh, *bitmap_bh;
+       unsigned long group, group_offset;
+       int ret;
+
+       group = nilfs_palloc_group(inode, req->pr_entry_nr, &group_offset);
+       ret = nilfs_palloc_get_desc_block(inode, group, 1, &desc_bh);
+       if (ret < 0)
+               return ret;
+       ret = nilfs_palloc_get_bitmap_block(inode, group, 1, &bitmap_bh);
+       if (ret < 0) {
+               brelse(desc_bh);
+               return ret;
+       }
+
+       req->pr_desc_bh = desc_bh;
+       req->pr_bitmap_bh = bitmap_bh;
+       return 0;
+}
+
+void nilfs_palloc_abort_free_entry(struct inode *inode,
+                                  struct nilfs_palloc_req *req)
+{
+       brelse(req->pr_bitmap_bh);
+       brelse(req->pr_desc_bh);
+
+       req->pr_entry_nr = 0;
+       req->pr_bitmap_bh = NULL;
+       req->pr_desc_bh = NULL;
+}
+
+static int
+nilfs_palloc_group_is_in(struct inode *inode, unsigned long group, __u64 nr)
+{
+       __u64 first, last;
+
+       first = group * nilfs_palloc_entries_per_group(inode);
+       last = first + nilfs_palloc_entries_per_group(inode) - 1;
+       return (nr >= first) && (nr <= last);
+}
+
+int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems)
+{
+       struct buffer_head *desc_bh, *bitmap_bh;
+       struct nilfs_palloc_group_desc *desc;
+       unsigned char *bitmap;
+       void *desc_kaddr, *bitmap_kaddr;
+       unsigned long group, group_offset;
+       int i, j, n, ret;
+
+       for (i = 0; i < nitems; i += n) {
+               group = nilfs_palloc_group(inode, entry_nrs[i], &group_offset);
+               ret = nilfs_palloc_get_desc_block(inode, group, 0, &desc_bh);
+               if (ret < 0)
+                       return ret;
+               ret = nilfs_palloc_get_bitmap_block(inode, group, 0,
+                                                   &bitmap_bh);
+               if (ret < 0) {
+                       brelse(desc_bh);
+                       return ret;
+               }
+               desc_kaddr = kmap(desc_bh->b_page);
+               desc = nilfs_palloc_block_get_group_desc(
+                       inode, group, desc_bh, desc_kaddr);
+               bitmap_kaddr = kmap(bitmap_bh->b_page);
+               bitmap = nilfs_palloc_block_get_bitmap(
+                       inode, bitmap_bh, bitmap_kaddr);
+               for (j = i, n = 0;
+                    (j < nitems) && nilfs_palloc_group_is_in(inode, group,
+                                                             entry_nrs[j]);
+                    j++, n++) {
+                       nilfs_palloc_group(inode, entry_nrs[j], &group_offset);
+                       if (!nilfs_clear_bit_atomic(
+                                   nilfs_mdt_bgl_lock(inode, group),
+                                   group_offset, bitmap)) {
+                               printk(KERN_WARNING
+                                      "%s: entry number %llu already freed\n",
+                                      __func__,
+                                      (unsigned long long)entry_nrs[j]);
+                       }
+               }
+               nilfs_palloc_group_desc_add_entries(inode, group, desc, n);
+
+               kunmap(bitmap_bh->b_page);
+               kunmap(desc_bh->b_page);
+
+               nilfs_mdt_mark_buffer_dirty(desc_bh);
+               nilfs_mdt_mark_buffer_dirty(bitmap_bh);
+               nilfs_mdt_mark_dirty(inode);
+
+               brelse(bitmap_bh);
+               brelse(desc_bh);
+       }
+       return 0;
+}
diff --git a/fs/nilfs2/alloc.h b/fs/nilfs2/alloc.h
new file mode 100644 (file)
index 0000000..4ace547
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * alloc.h - persistent object (dat entry/disk inode) allocator/deallocator
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Original code was written by Koji Sato <koji@osrg.net>.
+ * Two allocators were unified by Ryusuke Konishi <ryusuke@osrg.net>,
+ *                                Amagai Yoshiji <amagai@osrg.net>.
+ */
+
+#ifndef _NILFS_ALLOC_H
+#define _NILFS_ALLOC_H
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include <linux/fs.h>
+
+static inline unsigned long
+nilfs_palloc_entries_per_group(const struct inode *inode)
+{
+       return 1UL << (inode->i_blkbits + 3 /* log2(8 = CHAR_BITS) */);
+}
+
+int nilfs_palloc_init_blockgroup(struct inode *, unsigned);
+int nilfs_palloc_get_entry_block(struct inode *, __u64, int,
+                                struct buffer_head **);
+void *nilfs_palloc_block_get_entry(const struct inode *, __u64,
+                                  const struct buffer_head *, void *);
+
+/**
+ * nilfs_palloc_req - persistent alloctor request and reply
+ * @pr_entry_nr: entry number (vblocknr or inode number)
+ * @pr_desc_bh: buffer head of the buffer containing block group descriptors
+ * @pr_bitmap_bh: buffer head of the buffer containing a block group bitmap
+ * @pr_entry_bh: buffer head of the buffer containing translation entries
+ */
+struct nilfs_palloc_req {
+       __u64 pr_entry_nr;
+       struct buffer_head *pr_desc_bh;
+       struct buffer_head *pr_bitmap_bh;
+       struct buffer_head *pr_entry_bh;
+};
+
+int nilfs_palloc_prepare_alloc_entry(struct inode *,
+                                    struct nilfs_palloc_req *);
+void nilfs_palloc_commit_alloc_entry(struct inode *,
+                                    struct nilfs_palloc_req *);
+void nilfs_palloc_abort_alloc_entry(struct inode *, struct nilfs_palloc_req *);
+void nilfs_palloc_commit_free_entry(struct inode *, struct nilfs_palloc_req *);
+int nilfs_palloc_prepare_free_entry(struct inode *, struct nilfs_palloc_req *);
+void nilfs_palloc_abort_free_entry(struct inode *, struct nilfs_palloc_req *);
+int nilfs_palloc_freev(struct inode *, __u64 *, size_t);
+
+#define nilfs_set_bit_atomic           ext2_set_bit_atomic
+#define nilfs_clear_bit_atomic         ext2_clear_bit_atomic
+#define nilfs_find_next_zero_bit       ext2_find_next_zero_bit
+
+#endif /* _NILFS_ALLOC_H */
diff --git a/fs/nilfs2/bmap.c b/fs/nilfs2/bmap.c
new file mode 100644 (file)
index 0000000..24638e0
--- /dev/null
@@ -0,0 +1,783 @@
+/*
+ * bmap.c - NILFS block mapping.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#include <linux/fs.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include "nilfs.h"
+#include "bmap.h"
+#include "sb.h"
+#include "btnode.h"
+#include "mdt.h"
+#include "dat.h"
+#include "alloc.h"
+
+int nilfs_bmap_lookup_at_level(struct nilfs_bmap *bmap, __u64 key, int level,
+                              __u64 *ptrp)
+{
+       __u64 ptr;
+       int ret;
+
+       down_read(&bmap->b_sem);
+       ret = bmap->b_ops->bop_lookup(bmap, key, level, ptrp);
+       if (ret < 0)
+               goto out;
+       if (bmap->b_pops->bpop_translate != NULL) {
+               ret = bmap->b_pops->bpop_translate(bmap, *ptrp, &ptr);
+               if (ret < 0)
+                       goto out;
+               *ptrp = ptr;
+       }
+
+ out:
+       up_read(&bmap->b_sem);
+       return ret;
+}
+
+
+/**
+ * nilfs_bmap_lookup - find a record
+ * @bmap: bmap
+ * @key: key
+ * @recp: pointer to record
+ *
+ * Description: nilfs_bmap_lookup() finds a record whose key matches @key in
+ * @bmap.
+ *
+ * Return Value: On success, 0 is returned and the record associated with @key
+ * is stored in the place pointed by @recp. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - A record associated with @key does not exist.
+ */
+int nilfs_bmap_lookup(struct nilfs_bmap *bmap,
+                     unsigned long key,
+                     unsigned long *recp)
+{
+       __u64 ptr;
+       int ret;
+
+       /* XXX: use macro for level 1 */
+       ret = nilfs_bmap_lookup_at_level(bmap, key, 1, &ptr);
+       if (recp != NULL)
+               *recp = ptr;
+       return ret;
+}
+
+static int nilfs_bmap_do_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr)
+{
+       __u64 keys[NILFS_BMAP_SMALL_HIGH + 1];
+       __u64 ptrs[NILFS_BMAP_SMALL_HIGH + 1];
+       int ret, n;
+
+       if (bmap->b_ops->bop_check_insert != NULL) {
+               ret = bmap->b_ops->bop_check_insert(bmap, key);
+               if (ret > 0) {
+                       n = bmap->b_ops->bop_gather_data(
+                               bmap, keys, ptrs, NILFS_BMAP_SMALL_HIGH + 1);
+                       if (n < 0)
+                               return n;
+                       ret = nilfs_btree_convert_and_insert(
+                               bmap, key, ptr, keys, ptrs, n,
+                               NILFS_BMAP_LARGE_LOW, NILFS_BMAP_LARGE_HIGH);
+                       if (ret == 0)
+                               bmap->b_u.u_flags |= NILFS_BMAP_LARGE;
+
+                       return ret;
+               } else if (ret < 0)
+                       return ret;
+       }
+
+       return bmap->b_ops->bop_insert(bmap, key, ptr);
+}
+
+/**
+ * nilfs_bmap_insert - insert a new key-record pair into a bmap
+ * @bmap: bmap
+ * @key: key
+ * @rec: record
+ *
+ * Description: nilfs_bmap_insert() inserts the new key-record pair specified
+ * by @key and @rec into @bmap.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-EEXIST - A record associated with @key already exist.
+ */
+int nilfs_bmap_insert(struct nilfs_bmap *bmap,
+                     unsigned long key,
+                     unsigned long rec)
+{
+       int ret;
+
+       down_write(&bmap->b_sem);
+       ret = nilfs_bmap_do_insert(bmap, key, rec);
+       up_write(&bmap->b_sem);
+       return ret;
+}
+
+static int nilfs_bmap_do_delete(struct nilfs_bmap *bmap, __u64 key)
+{
+       __u64 keys[NILFS_BMAP_LARGE_LOW + 1];
+       __u64 ptrs[NILFS_BMAP_LARGE_LOW + 1];
+       int ret, n;
+
+       if (bmap->b_ops->bop_check_delete != NULL) {
+               ret = bmap->b_ops->bop_check_delete(bmap, key);
+               if (ret > 0) {
+                       n = bmap->b_ops->bop_gather_data(
+                               bmap, keys, ptrs, NILFS_BMAP_LARGE_LOW + 1);
+                       if (n < 0)
+                               return n;
+                       ret = nilfs_direct_delete_and_convert(
+                               bmap, key, keys, ptrs, n,
+                               NILFS_BMAP_SMALL_LOW, NILFS_BMAP_SMALL_HIGH);
+                       if (ret == 0)
+                               bmap->b_u.u_flags &= ~NILFS_BMAP_LARGE;
+
+                       return ret;
+               } else if (ret < 0)
+                       return ret;
+       }
+
+       return bmap->b_ops->bop_delete(bmap, key);
+}
+
+int nilfs_bmap_last_key(struct nilfs_bmap *bmap, unsigned long *key)
+{
+       __u64 lastkey;
+       int ret;
+
+       down_read(&bmap->b_sem);
+       ret = bmap->b_ops->bop_last_key(bmap, &lastkey);
+       if (!ret)
+               *key = lastkey;
+       up_read(&bmap->b_sem);
+       return ret;
+}
+
+/**
+ * nilfs_bmap_delete - delete a key-record pair from a bmap
+ * @bmap: bmap
+ * @key: key
+ *
+ * Description: nilfs_bmap_delete() deletes the key-record pair specified by
+ * @key from @bmap.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - A record associated with @key does not exist.
+ */
+int nilfs_bmap_delete(struct nilfs_bmap *bmap, unsigned long key)
+{
+       int ret;
+
+       down_write(&bmap->b_sem);
+       ret = nilfs_bmap_do_delete(bmap, key);
+       up_write(&bmap->b_sem);
+       return ret;
+}
+
+static int nilfs_bmap_do_truncate(struct nilfs_bmap *bmap, unsigned long key)
+{
+       __u64 lastkey;
+       int ret;
+
+       ret = bmap->b_ops->bop_last_key(bmap, &lastkey);
+       if (ret < 0) {
+               if (ret == -ENOENT)
+                       ret = 0;
+               return ret;
+       }
+
+       while (key <= lastkey) {
+               ret = nilfs_bmap_do_delete(bmap, lastkey);
+               if (ret < 0)
+                       return ret;
+               ret = bmap->b_ops->bop_last_key(bmap, &lastkey);
+               if (ret < 0) {
+                       if (ret == -ENOENT)
+                               ret = 0;
+                       return ret;
+               }
+       }
+       return 0;
+}
+
+/**
+ * nilfs_bmap_truncate - truncate a bmap to a specified key
+ * @bmap: bmap
+ * @key: key
+ *
+ * Description: nilfs_bmap_truncate() removes key-record pairs whose keys are
+ * greater than or equal to @key from @bmap.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_bmap_truncate(struct nilfs_bmap *bmap, unsigned long key)
+{
+       int ret;
+
+       down_write(&bmap->b_sem);
+       ret = nilfs_bmap_do_truncate(bmap, key);
+       up_write(&bmap->b_sem);
+       return ret;
+}
+
+/**
+ * nilfs_bmap_clear - free resources a bmap holds
+ * @bmap: bmap
+ *
+ * Description: nilfs_bmap_clear() frees resources associated with @bmap.
+ */
+void nilfs_bmap_clear(struct nilfs_bmap *bmap)
+{
+       down_write(&bmap->b_sem);
+       if (bmap->b_ops->bop_clear != NULL)
+               bmap->b_ops->bop_clear(bmap);
+       up_write(&bmap->b_sem);
+}
+
+/**
+ * nilfs_bmap_propagate - propagate dirty state
+ * @bmap: bmap
+ * @bh: buffer head
+ *
+ * Description: nilfs_bmap_propagate() marks the buffers that directly or
+ * indirectly refer to the block specified by @bh dirty.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_bmap_propagate(struct nilfs_bmap *bmap, struct buffer_head *bh)
+{
+       int ret;
+
+       down_write(&bmap->b_sem);
+       ret = bmap->b_ops->bop_propagate(bmap, bh);
+       up_write(&bmap->b_sem);
+       return ret;
+}
+
+/**
+ * nilfs_bmap_lookup_dirty_buffers -
+ * @bmap: bmap
+ * @listp: pointer to buffer head list
+ */
+void nilfs_bmap_lookup_dirty_buffers(struct nilfs_bmap *bmap,
+                                    struct list_head *listp)
+{
+       if (bmap->b_ops->bop_lookup_dirty_buffers != NULL)
+               bmap->b_ops->bop_lookup_dirty_buffers(bmap, listp);
+}
+
+/**
+ * nilfs_bmap_assign - assign a new block number to a block
+ * @bmap: bmap
+ * @bhp: pointer to buffer head
+ * @blocknr: block number
+ * @binfo: block information
+ *
+ * Description: nilfs_bmap_assign() assigns the block number @blocknr to the
+ * buffer specified by @bh.
+ *
+ * Return Value: On success, 0 is returned and the buffer head of a newly
+ * create buffer and the block information associated with the buffer are
+ * stored in the place pointed by @bh and @binfo, respectively. On error, one
+ * of the following negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_bmap_assign(struct nilfs_bmap *bmap,
+                     struct buffer_head **bh,
+                     unsigned long blocknr,
+                     union nilfs_binfo *binfo)
+{
+       int ret;
+
+       down_write(&bmap->b_sem);
+       ret = bmap->b_ops->bop_assign(bmap, bh, blocknr, binfo);
+       up_write(&bmap->b_sem);
+       return ret;
+}
+
+/**
+ * nilfs_bmap_mark - mark block dirty
+ * @bmap: bmap
+ * @key: key
+ * @level: level
+ *
+ * Description: nilfs_bmap_mark() marks the block specified by @key and @level
+ * as dirty.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_bmap_mark(struct nilfs_bmap *bmap, __u64 key, int level)
+{
+       int ret;
+
+       if (bmap->b_ops->bop_mark == NULL)
+               return 0;
+
+       down_write(&bmap->b_sem);
+       ret = bmap->b_ops->bop_mark(bmap, key, level);
+       up_write(&bmap->b_sem);
+       return ret;
+}
+
+/**
+ * nilfs_bmap_test_and_clear_dirty - test and clear a bmap dirty state
+ * @bmap: bmap
+ *
+ * Description: nilfs_test_and_clear() is the atomic operation to test and
+ * clear the dirty state of @bmap.
+ *
+ * Return Value: 1 is returned if @bmap is dirty, or 0 if clear.
+ */
+int nilfs_bmap_test_and_clear_dirty(struct nilfs_bmap *bmap)
+{
+       int ret;
+
+       down_write(&bmap->b_sem);
+       ret = nilfs_bmap_dirty(bmap);
+       nilfs_bmap_clear_dirty(bmap);
+       up_write(&bmap->b_sem);
+       return ret;
+}
+
+
+/*
+ * Internal use only
+ */
+
+void nilfs_bmap_add_blocks(const struct nilfs_bmap *bmap, int n)
+{
+       inode_add_bytes(bmap->b_inode, (1 << bmap->b_inode->i_blkbits) * n);
+       if (NILFS_MDT(bmap->b_inode))
+               nilfs_mdt_mark_dirty(bmap->b_inode);
+       else
+               mark_inode_dirty(bmap->b_inode);
+}
+
+void nilfs_bmap_sub_blocks(const struct nilfs_bmap *bmap, int n)
+{
+       inode_sub_bytes(bmap->b_inode, (1 << bmap->b_inode->i_blkbits) * n);
+       if (NILFS_MDT(bmap->b_inode))
+               nilfs_mdt_mark_dirty(bmap->b_inode);
+       else
+               mark_inode_dirty(bmap->b_inode);
+}
+
+int nilfs_bmap_get_block(const struct nilfs_bmap *bmap, __u64 ptr,
+                        struct buffer_head **bhp)
+{
+       return nilfs_btnode_get(&NILFS_BMAP_I(bmap)->i_btnode_cache,
+                               ptr, 0, bhp, 0);
+}
+
+void nilfs_bmap_put_block(const struct nilfs_bmap *bmap,
+                         struct buffer_head *bh)
+{
+       brelse(bh);
+}
+
+int nilfs_bmap_get_new_block(const struct nilfs_bmap *bmap, __u64 ptr,
+                            struct buffer_head **bhp)
+{
+       int ret;
+
+       ret = nilfs_btnode_get(&NILFS_BMAP_I(bmap)->i_btnode_cache,
+                              ptr, 0, bhp, 1);
+       if (ret < 0)
+               return ret;
+       set_buffer_nilfs_volatile(*bhp);
+       return 0;
+}
+
+void nilfs_bmap_delete_block(const struct nilfs_bmap *bmap,
+                            struct buffer_head *bh)
+{
+       nilfs_btnode_delete(bh);
+}
+
+__u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *bmap,
+                             const struct buffer_head *bh)
+{
+       struct buffer_head *pbh;
+       __u64 key;
+
+       key = page_index(bh->b_page) << (PAGE_CACHE_SHIFT -
+                                        bmap->b_inode->i_blkbits);
+       for (pbh = page_buffers(bh->b_page); pbh != bh;
+            pbh = pbh->b_this_page, key++);
+
+       return key;
+}
+
+__u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *bmap, __u64 key)
+{
+       __s64 diff;
+
+       diff = key - bmap->b_last_allocated_key;
+       if ((nilfs_bmap_keydiff_abs(diff) < NILFS_INODE_BMAP_SIZE) &&
+           (bmap->b_last_allocated_ptr != NILFS_BMAP_INVALID_PTR) &&
+           (bmap->b_last_allocated_ptr + diff > 0))
+               return bmap->b_last_allocated_ptr + diff;
+       else
+               return NILFS_BMAP_INVALID_PTR;
+}
+
+static struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap)
+{
+       return nilfs_dat_inode(NILFS_I_NILFS(bmap->b_inode));
+}
+
+#define NILFS_BMAP_GROUP_DIV   8
+__u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *bmap)
+{
+       struct inode *dat = nilfs_bmap_get_dat(bmap);
+       unsigned long entries_per_group = nilfs_palloc_entries_per_group(dat);
+       unsigned long group = bmap->b_inode->i_ino / entries_per_group;
+
+       return group * entries_per_group +
+               (bmap->b_inode->i_ino % NILFS_BMAP_GROUP_DIV) *
+               (entries_per_group / NILFS_BMAP_GROUP_DIV);
+}
+
+static int nilfs_bmap_prepare_alloc_v(struct nilfs_bmap *bmap,
+                                     union nilfs_bmap_ptr_req *req)
+{
+       return nilfs_dat_prepare_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req);
+}
+
+static void nilfs_bmap_commit_alloc_v(struct nilfs_bmap *bmap,
+                                     union nilfs_bmap_ptr_req *req)
+{
+       nilfs_dat_commit_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req);
+}
+
+static void nilfs_bmap_abort_alloc_v(struct nilfs_bmap *bmap,
+                                    union nilfs_bmap_ptr_req *req)
+{
+       nilfs_dat_abort_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req);
+}
+
+static int nilfs_bmap_prepare_start_v(struct nilfs_bmap *bmap,
+                                     union nilfs_bmap_ptr_req *req)
+{
+       return nilfs_dat_prepare_start(nilfs_bmap_get_dat(bmap), &req->bpr_req);
+}
+
+static void nilfs_bmap_commit_start_v(struct nilfs_bmap *bmap,
+                                     union nilfs_bmap_ptr_req *req,
+                                     sector_t blocknr)
+{
+       nilfs_dat_commit_start(nilfs_bmap_get_dat(bmap), &req->bpr_req,
+                              blocknr);
+}
+
+static void nilfs_bmap_abort_start_v(struct nilfs_bmap *bmap,
+                                    union nilfs_bmap_ptr_req *req)
+{
+       nilfs_dat_abort_start(nilfs_bmap_get_dat(bmap), &req->bpr_req);
+}
+
+static int nilfs_bmap_prepare_end_v(struct nilfs_bmap *bmap,
+                                   union nilfs_bmap_ptr_req *req)
+{
+       return nilfs_dat_prepare_end(nilfs_bmap_get_dat(bmap), &req->bpr_req);
+}
+
+static void nilfs_bmap_commit_end_v(struct nilfs_bmap *bmap,
+                                   union nilfs_bmap_ptr_req *req)
+{
+       nilfs_dat_commit_end(nilfs_bmap_get_dat(bmap), &req->bpr_req, 0);
+}
+
+static void nilfs_bmap_commit_end_vmdt(struct nilfs_bmap *bmap,
+                                      union nilfs_bmap_ptr_req *req)
+{
+       nilfs_dat_commit_end(nilfs_bmap_get_dat(bmap), &req->bpr_req, 1);
+}
+
+static void nilfs_bmap_abort_end_v(struct nilfs_bmap *bmap,
+                                  union nilfs_bmap_ptr_req *req)
+{
+       nilfs_dat_abort_end(nilfs_bmap_get_dat(bmap), &req->bpr_req);
+}
+
+int nilfs_bmap_move_v(const struct nilfs_bmap *bmap, __u64 vblocknr,
+                     sector_t blocknr)
+{
+       return nilfs_dat_move(nilfs_bmap_get_dat(bmap), vblocknr, blocknr);
+}
+
+int nilfs_bmap_mark_dirty(const struct nilfs_bmap *bmap, __u64 vblocknr)
+{
+       return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(bmap), vblocknr);
+}
+
+int nilfs_bmap_prepare_update(struct nilfs_bmap *bmap,
+                             union nilfs_bmap_ptr_req *oldreq,
+                             union nilfs_bmap_ptr_req *newreq)
+{
+       int ret;
+
+       ret = bmap->b_pops->bpop_prepare_end_ptr(bmap, oldreq);
+       if (ret < 0)
+               return ret;
+       ret = bmap->b_pops->bpop_prepare_alloc_ptr(bmap, newreq);
+       if (ret < 0)
+               bmap->b_pops->bpop_abort_end_ptr(bmap, oldreq);
+
+       return ret;
+}
+
+void nilfs_bmap_commit_update(struct nilfs_bmap *bmap,
+                             union nilfs_bmap_ptr_req *oldreq,
+                             union nilfs_bmap_ptr_req *newreq)
+{
+       bmap->b_pops->bpop_commit_end_ptr(bmap, oldreq);
+       bmap->b_pops->bpop_commit_alloc_ptr(bmap, newreq);
+}
+
+void nilfs_bmap_abort_update(struct nilfs_bmap *bmap,
+                            union nilfs_bmap_ptr_req *oldreq,
+                            union nilfs_bmap_ptr_req *newreq)
+{
+       bmap->b_pops->bpop_abort_end_ptr(bmap, oldreq);
+       bmap->b_pops->bpop_abort_alloc_ptr(bmap, newreq);
+}
+
+static int nilfs_bmap_translate_v(const struct nilfs_bmap *bmap, __u64 ptr,
+                                 __u64 *ptrp)
+{
+       sector_t blocknr;
+       int ret;
+
+       ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), ptr, &blocknr);
+       if (ret < 0)
+               return ret;
+       if (ptrp != NULL)
+               *ptrp = blocknr;
+       return 0;
+}
+
+static int nilfs_bmap_prepare_alloc_p(struct nilfs_bmap *bmap,
+                                     union nilfs_bmap_ptr_req *req)
+{
+       /* ignore target ptr */
+       req->bpr_ptr = bmap->b_last_allocated_ptr++;
+       return 0;
+}
+
+static void nilfs_bmap_commit_alloc_p(struct nilfs_bmap *bmap,
+                                     union nilfs_bmap_ptr_req *req)
+{
+       /* do nothing */
+}
+
+static void nilfs_bmap_abort_alloc_p(struct nilfs_bmap *bmap,
+                                    union nilfs_bmap_ptr_req *req)
+{
+       bmap->b_last_allocated_ptr--;
+}
+
+static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_v = {
+       .bpop_prepare_alloc_ptr =       nilfs_bmap_prepare_alloc_v,
+       .bpop_commit_alloc_ptr  =       nilfs_bmap_commit_alloc_v,
+       .bpop_abort_alloc_ptr   =       nilfs_bmap_abort_alloc_v,
+       .bpop_prepare_start_ptr =       nilfs_bmap_prepare_start_v,
+       .bpop_commit_start_ptr  =       nilfs_bmap_commit_start_v,
+       .bpop_abort_start_ptr   =       nilfs_bmap_abort_start_v,
+       .bpop_prepare_end_ptr   =       nilfs_bmap_prepare_end_v,
+       .bpop_commit_end_ptr    =       nilfs_bmap_commit_end_v,
+       .bpop_abort_end_ptr     =       nilfs_bmap_abort_end_v,
+
+       .bpop_translate         =       nilfs_bmap_translate_v,
+};
+
+static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_vmdt = {
+       .bpop_prepare_alloc_ptr =       nilfs_bmap_prepare_alloc_v,
+       .bpop_commit_alloc_ptr  =       nilfs_bmap_commit_alloc_v,
+       .bpop_abort_alloc_ptr   =       nilfs_bmap_abort_alloc_v,
+       .bpop_prepare_start_ptr =       nilfs_bmap_prepare_start_v,
+       .bpop_commit_start_ptr  =       nilfs_bmap_commit_start_v,
+       .bpop_abort_start_ptr   =       nilfs_bmap_abort_start_v,
+       .bpop_prepare_end_ptr   =       nilfs_bmap_prepare_end_v,
+       .bpop_commit_end_ptr    =       nilfs_bmap_commit_end_vmdt,
+       .bpop_abort_end_ptr     =       nilfs_bmap_abort_end_v,
+
+       .bpop_translate         =       nilfs_bmap_translate_v,
+};
+
+static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_p = {
+       .bpop_prepare_alloc_ptr =       nilfs_bmap_prepare_alloc_p,
+       .bpop_commit_alloc_ptr  =       nilfs_bmap_commit_alloc_p,
+       .bpop_abort_alloc_ptr   =       nilfs_bmap_abort_alloc_p,
+       .bpop_prepare_start_ptr =       NULL,
+       .bpop_commit_start_ptr  =       NULL,
+       .bpop_abort_start_ptr   =       NULL,
+       .bpop_prepare_end_ptr   =       NULL,
+       .bpop_commit_end_ptr    =       NULL,
+       .bpop_abort_end_ptr     =       NULL,
+
+       .bpop_translate         =       NULL,
+};
+
+static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_gc = {
+       .bpop_prepare_alloc_ptr =       NULL,
+       .bpop_commit_alloc_ptr  =       NULL,
+       .bpop_abort_alloc_ptr   =       NULL,
+       .bpop_prepare_start_ptr =       NULL,
+       .bpop_commit_start_ptr  =       NULL,
+       .bpop_abort_start_ptr   =       NULL,
+       .bpop_prepare_end_ptr   =       NULL,
+       .bpop_commit_end_ptr    =       NULL,
+       .bpop_abort_end_ptr     =       NULL,
+
+       .bpop_translate         =       NULL,
+};
+
+/**
+ * nilfs_bmap_read - read a bmap from an inode
+ * @bmap: bmap
+ * @raw_inode: on-disk inode
+ *
+ * Description: nilfs_bmap_read() initializes the bmap @bmap.
+ *
+ * Return Value: On success, 0 is returned. On error, the following negative
+ * error code is returned.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_bmap_read(struct nilfs_bmap *bmap, struct nilfs_inode *raw_inode)
+{
+       if (raw_inode == NULL)
+               memset(bmap->b_u.u_data, 0, NILFS_BMAP_SIZE);
+       else
+               memcpy(bmap->b_u.u_data, raw_inode->i_bmap, NILFS_BMAP_SIZE);
+
+       init_rwsem(&bmap->b_sem);
+       bmap->b_state = 0;
+       bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode;
+       switch (bmap->b_inode->i_ino) {
+       case NILFS_DAT_INO:
+               bmap->b_pops = &nilfs_bmap_ptr_ops_p;
+               bmap->b_last_allocated_key = 0; /* XXX: use macro */
+               bmap->b_last_allocated_ptr = NILFS_BMAP_NEW_PTR_INIT;
+               break;
+       case NILFS_CPFILE_INO:
+       case NILFS_SUFILE_INO:
+               bmap->b_pops = &nilfs_bmap_ptr_ops_vmdt;
+               bmap->b_last_allocated_key = 0; /* XXX: use macro */
+               bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR;
+               break;
+       default:
+               bmap->b_pops = &nilfs_bmap_ptr_ops_v;
+               bmap->b_last_allocated_key = 0; /* XXX: use macro */
+               bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR;
+               break;
+       }
+
+       return (bmap->b_u.u_flags & NILFS_BMAP_LARGE) ?
+               nilfs_btree_init(bmap,
+                                NILFS_BMAP_LARGE_LOW,
+                                NILFS_BMAP_LARGE_HIGH) :
+               nilfs_direct_init(bmap,
+                                 NILFS_BMAP_SMALL_LOW,
+                                 NILFS_BMAP_SMALL_HIGH);
+}
+
+/**
+ * nilfs_bmap_write - write back a bmap to an inode
+ * @bmap: bmap
+ * @raw_inode: on-disk inode
+ *
+ * Description: nilfs_bmap_write() stores @bmap in @raw_inode.
+ */
+void nilfs_bmap_write(struct nilfs_bmap *bmap, struct nilfs_inode *raw_inode)
+{
+       down_write(&bmap->b_sem);
+       memcpy(raw_inode->i_bmap, bmap->b_u.u_data,
+              NILFS_INODE_BMAP_SIZE * sizeof(__le64));
+       if (bmap->b_inode->i_ino == NILFS_DAT_INO)
+               bmap->b_last_allocated_ptr = NILFS_BMAP_NEW_PTR_INIT;
+
+       up_write(&bmap->b_sem);
+}
+
+void nilfs_bmap_init_gc(struct nilfs_bmap *bmap)
+{
+       memset(&bmap->b_u, 0, NILFS_BMAP_SIZE);
+       init_rwsem(&bmap->b_sem);
+       bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode;
+       bmap->b_pops = &nilfs_bmap_ptr_ops_gc;
+       bmap->b_last_allocated_key = 0;
+       bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR;
+       bmap->b_state = 0;
+       nilfs_btree_init_gc(bmap);
+}
+
+void nilfs_bmap_init_gcdat(struct nilfs_bmap *gcbmap, struct nilfs_bmap *bmap)
+{
+       memcpy(gcbmap, bmap, sizeof(union nilfs_bmap_union));
+       init_rwsem(&gcbmap->b_sem);
+       gcbmap->b_inode = &NILFS_BMAP_I(gcbmap)->vfs_inode;
+}
+
+void nilfs_bmap_commit_gcdat(struct nilfs_bmap *gcbmap, struct nilfs_bmap *bmap)
+{
+       memcpy(bmap, gcbmap, sizeof(union nilfs_bmap_union));
+       init_rwsem(&bmap->b_sem);
+       bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode;
+}
diff --git a/fs/nilfs2/bmap.h b/fs/nilfs2/bmap.h
new file mode 100644 (file)
index 0000000..4f2708a
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * bmap.h - NILFS block mapping.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#ifndef _NILFS_BMAP_H
+#define _NILFS_BMAP_H
+
+#include <linux/types.h>
+#include <linux/fs.h>
+#include <linux/buffer_head.h>
+#include <linux/nilfs2_fs.h>
+#include "alloc.h"
+
+#define NILFS_BMAP_INVALID_PTR 0
+
+#define nilfs_bmap_dkey_to_key(dkey)   le64_to_cpu(dkey)
+#define nilfs_bmap_key_to_dkey(key)    cpu_to_le64(key)
+#define nilfs_bmap_dptr_to_ptr(dptr)   le64_to_cpu(dptr)
+#define nilfs_bmap_ptr_to_dptr(ptr)    cpu_to_le64(ptr)
+
+#define nilfs_bmap_keydiff_abs(diff)   ((diff) < 0 ? -(diff) : (diff))
+
+
+struct nilfs_bmap;
+
+/**
+ * union nilfs_bmap_ptr_req - request for bmap ptr
+ * @bpr_ptr: bmap pointer
+ * @bpr_req: request for persistent allocator
+ */
+union nilfs_bmap_ptr_req {
+       __u64 bpr_ptr;
+       struct nilfs_palloc_req bpr_req;
+};
+
+/**
+ * struct nilfs_bmap_stats - bmap statistics
+ * @bs_nblocks: number of blocks created or deleted
+ */
+struct nilfs_bmap_stats {
+       unsigned int bs_nblocks;
+};
+
+/**
+ * struct nilfs_bmap_operations - bmap operation table
+ */
+struct nilfs_bmap_operations {
+       int (*bop_lookup)(const struct nilfs_bmap *, __u64, int, __u64 *);
+       int (*bop_insert)(struct nilfs_bmap *, __u64, __u64);
+       int (*bop_delete)(struct nilfs_bmap *, __u64);
+       void (*bop_clear)(struct nilfs_bmap *);
+
+       int (*bop_propagate)(const struct nilfs_bmap *, struct buffer_head *);
+       void (*bop_lookup_dirty_buffers)(struct nilfs_bmap *,
+                                        struct list_head *);
+
+       int (*bop_assign)(struct nilfs_bmap *,
+                         struct buffer_head **,
+                         sector_t,
+                         union nilfs_binfo *);
+       int (*bop_mark)(struct nilfs_bmap *, __u64, int);
+
+       /* The following functions are internal use only. */
+       int (*bop_last_key)(const struct nilfs_bmap *, __u64 *);
+       int (*bop_check_insert)(const struct nilfs_bmap *, __u64);
+       int (*bop_check_delete)(struct nilfs_bmap *, __u64);
+       int (*bop_gather_data)(struct nilfs_bmap *, __u64 *, __u64 *, int);
+};
+
+
+/**
+ * struct nilfs_bmap_ptr_operations - bmap ptr operation table
+ */
+struct nilfs_bmap_ptr_operations {
+       int (*bpop_prepare_alloc_ptr)(struct nilfs_bmap *,
+                                     union nilfs_bmap_ptr_req *);
+       void (*bpop_commit_alloc_ptr)(struct nilfs_bmap *,
+                                     union nilfs_bmap_ptr_req *);
+       void (*bpop_abort_alloc_ptr)(struct nilfs_bmap *,
+                                    union nilfs_bmap_ptr_req *);
+       int (*bpop_prepare_start_ptr)(struct nilfs_bmap *,
+                                     union nilfs_bmap_ptr_req *);
+       void (*bpop_commit_start_ptr)(struct nilfs_bmap *,
+                                     union nilfs_bmap_ptr_req *,
+                                     sector_t);
+       void (*bpop_abort_start_ptr)(struct nilfs_bmap *,
+                                    union nilfs_bmap_ptr_req *);
+       int (*bpop_prepare_end_ptr)(struct nilfs_bmap *,
+                                   union nilfs_bmap_ptr_req *);
+       void (*bpop_commit_end_ptr)(struct nilfs_bmap *,
+                                   union nilfs_bmap_ptr_req *);
+       void (*bpop_abort_end_ptr)(struct nilfs_bmap *,
+                                  union nilfs_bmap_ptr_req *);
+
+       int (*bpop_translate)(const struct nilfs_bmap *, __u64, __u64 *);
+};
+
+
+#define NILFS_BMAP_SIZE                (NILFS_INODE_BMAP_SIZE * sizeof(__le64))
+#define NILFS_BMAP_KEY_BIT     (sizeof(unsigned long) * 8 /* CHAR_BIT */)
+#define NILFS_BMAP_NEW_PTR_INIT        \
+       (1UL << (sizeof(unsigned long) * 8 /* CHAR_BIT */ - 1))
+
+static inline int nilfs_bmap_is_new_ptr(unsigned long ptr)
+{
+       return !!(ptr & NILFS_BMAP_NEW_PTR_INIT);
+}
+
+
+/**
+ * struct nilfs_bmap - bmap structure
+ * @b_u: raw data
+ * @b_sem: semaphore
+ * @b_inode: owner of bmap
+ * @b_ops: bmap operation table
+ * @b_pops: bmap ptr operation table
+ * @b_low: low watermark of conversion
+ * @b_high: high watermark of conversion
+ * @b_last_allocated_key: last allocated key for data block
+ * @b_last_allocated_ptr: last allocated ptr for data block
+ * @b_state: state
+ */
+struct nilfs_bmap {
+       union {
+               __u8 u_flags;
+               __le64 u_data[NILFS_BMAP_SIZE / sizeof(__le64)];
+       } b_u;
+       struct rw_semaphore b_sem;
+       struct inode *b_inode;
+       const struct nilfs_bmap_operations *b_ops;
+       const struct nilfs_bmap_ptr_operations *b_pops;
+       __u64 b_low;
+       __u64 b_high;
+       __u64 b_last_allocated_key;
+       __u64 b_last_allocated_ptr;
+       int b_state;
+};
+
+/* state */
+#define NILFS_BMAP_DIRTY       0x00000001
+
+
+int nilfs_bmap_test_and_clear_dirty(struct nilfs_bmap *);
+int nilfs_bmap_read(struct nilfs_bmap *, struct nilfs_inode *);
+void nilfs_bmap_write(struct nilfs_bmap *, struct nilfs_inode *);
+int nilfs_bmap_lookup(struct nilfs_bmap *, unsigned long, unsigned long *);
+int nilfs_bmap_insert(struct nilfs_bmap *, unsigned long, unsigned long);
+int nilfs_bmap_delete(struct nilfs_bmap *, unsigned long);
+int nilfs_bmap_last_key(struct nilfs_bmap *, unsigned long *);
+int nilfs_bmap_truncate(struct nilfs_bmap *, unsigned long);
+void nilfs_bmap_clear(struct nilfs_bmap *);
+int nilfs_bmap_propagate(struct nilfs_bmap *, struct buffer_head *);
+void nilfs_bmap_lookup_dirty_buffers(struct nilfs_bmap *, struct list_head *);
+int nilfs_bmap_assign(struct nilfs_bmap *, struct buffer_head **,
+                     unsigned long, union nilfs_binfo *);
+int nilfs_bmap_lookup_at_level(struct nilfs_bmap *, __u64, int, __u64 *);
+int nilfs_bmap_mark(struct nilfs_bmap *, __u64, int);
+
+void nilfs_bmap_init_gc(struct nilfs_bmap *);
+void nilfs_bmap_init_gcdat(struct nilfs_bmap *, struct nilfs_bmap *);
+void nilfs_bmap_commit_gcdat(struct nilfs_bmap *, struct nilfs_bmap *);
+
+
+/*
+ * Internal use only
+ */
+
+int nilfs_bmap_move_v(const struct nilfs_bmap *, __u64, sector_t);
+int nilfs_bmap_mark_dirty(const struct nilfs_bmap *, __u64);
+
+
+__u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *,
+                             const struct buffer_head *);
+
+__u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *, __u64);
+__u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *);
+
+int nilfs_bmap_prepare_update(struct nilfs_bmap *,
+                             union nilfs_bmap_ptr_req *,
+                             union nilfs_bmap_ptr_req *);
+void nilfs_bmap_commit_update(struct nilfs_bmap *,
+                             union nilfs_bmap_ptr_req *,
+                             union nilfs_bmap_ptr_req *);
+void nilfs_bmap_abort_update(struct nilfs_bmap *,
+                            union nilfs_bmap_ptr_req *,
+                            union nilfs_bmap_ptr_req *);
+
+void nilfs_bmap_add_blocks(const struct nilfs_bmap *, int);
+void nilfs_bmap_sub_blocks(const struct nilfs_bmap *, int);
+
+
+int nilfs_bmap_get_block(const struct nilfs_bmap *, __u64,
+                        struct buffer_head **);
+void nilfs_bmap_put_block(const struct nilfs_bmap *, struct buffer_head *);
+int nilfs_bmap_get_new_block(const struct nilfs_bmap *, __u64,
+                            struct buffer_head **);
+void nilfs_bmap_delete_block(const struct nilfs_bmap *, struct buffer_head *);
+
+
+/* Assume that bmap semaphore is locked. */
+static inline int nilfs_bmap_dirty(const struct nilfs_bmap *bmap)
+{
+       return !!(bmap->b_state & NILFS_BMAP_DIRTY);
+}
+
+/* Assume that bmap semaphore is locked. */
+static inline void nilfs_bmap_set_dirty(struct nilfs_bmap *bmap)
+{
+       bmap->b_state |= NILFS_BMAP_DIRTY;
+}
+
+/* Assume that bmap semaphore is locked. */
+static inline void nilfs_bmap_clear_dirty(struct nilfs_bmap *bmap)
+{
+       bmap->b_state &= ~NILFS_BMAP_DIRTY;
+}
+
+
+#define NILFS_BMAP_LARGE       0x1
+
+#define NILFS_BMAP_SMALL_LOW   NILFS_DIRECT_KEY_MIN
+#define NILFS_BMAP_SMALL_HIGH  NILFS_DIRECT_KEY_MAX
+#define NILFS_BMAP_LARGE_LOW   NILFS_BTREE_ROOT_NCHILDREN_MAX
+#define NILFS_BMAP_LARGE_HIGH  NILFS_BTREE_KEY_MAX
+
+#endif /* _NILFS_BMAP_H */
diff --git a/fs/nilfs2/bmap_union.h b/fs/nilfs2/bmap_union.h
new file mode 100644 (file)
index 0000000..d41509b
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * bmap_union.h - NILFS block mapping.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#ifndef _NILFS_BMAP_UNION_H
+#define _NILFS_BMAP_UNION_H
+
+#include "bmap.h"
+#include "direct.h"
+#include "btree.h"
+
+/**
+ * nilfs_bmap_union -
+ * @bi_bmap: bmap structure
+ * @bi_btree: direct map structure
+ * @bi_direct: B-tree structure
+ */
+union nilfs_bmap_union {
+       struct nilfs_bmap bi_bmap;
+       struct nilfs_direct bi_direct;
+       struct nilfs_btree bi_btree;
+};
+
+#endif /* _NILFS_BMAP_UNION_H */
diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c
new file mode 100644 (file)
index 0000000..4cc07b2
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * btnode.c - NILFS B-tree node cache
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * This file was originally written by Seiji Kihara <kihara@osrg.net>
+ * and fully revised by Ryusuke Konishi <ryusuke@osrg.net> for
+ * stabilization and simplification.
+ *
+ */
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include <linux/mm.h>
+#include <linux/backing-dev.h>
+#include "nilfs.h"
+#include "mdt.h"
+#include "dat.h"
+#include "page.h"
+#include "btnode.h"
+
+
+void nilfs_btnode_cache_init_once(struct address_space *btnc)
+{
+       INIT_RADIX_TREE(&btnc->page_tree, GFP_ATOMIC);
+       spin_lock_init(&btnc->tree_lock);
+       INIT_LIST_HEAD(&btnc->private_list);
+       spin_lock_init(&btnc->private_lock);
+
+       spin_lock_init(&btnc->i_mmap_lock);
+       INIT_RAW_PRIO_TREE_ROOT(&btnc->i_mmap);
+       INIT_LIST_HEAD(&btnc->i_mmap_nonlinear);
+}
+
+static struct address_space_operations def_btnode_aops;
+
+void nilfs_btnode_cache_init(struct address_space *btnc)
+{
+       btnc->host = NULL;  /* can safely set to host inode ? */
+       btnc->flags = 0;
+       mapping_set_gfp_mask(btnc, GFP_NOFS);
+       btnc->assoc_mapping = NULL;
+       btnc->backing_dev_info = &default_backing_dev_info;
+       btnc->a_ops = &def_btnode_aops;
+}
+
+void nilfs_btnode_cache_clear(struct address_space *btnc)
+{
+       invalidate_mapping_pages(btnc, 0, -1);
+       truncate_inode_pages(btnc, 0);
+}
+
+int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr,
+                             sector_t pblocknr, struct buffer_head **pbh,
+                             int newblk)
+{
+       struct buffer_head *bh;
+       struct inode *inode = NILFS_BTNC_I(btnc);
+       int err;
+
+       bh = nilfs_grab_buffer(inode, btnc, blocknr, 1 << BH_NILFS_Node);
+       if (unlikely(!bh))
+               return -ENOMEM;
+
+       err = -EEXIST; /* internal code */
+       if (newblk) {
+               if (unlikely(buffer_mapped(bh) || buffer_uptodate(bh) ||
+                            buffer_dirty(bh))) {
+                       brelse(bh);
+                       BUG();
+               }
+               bh->b_bdev = NILFS_I_NILFS(inode)->ns_bdev;
+               bh->b_blocknr = blocknr;
+               set_buffer_mapped(bh);
+               set_buffer_uptodate(bh);
+               goto found;
+       }
+
+       if (buffer_uptodate(bh) || buffer_dirty(bh))
+               goto found;
+
+       if (pblocknr == 0) {
+               pblocknr = blocknr;
+               if (inode->i_ino != NILFS_DAT_INO) {
+                       struct inode *dat =
+                               nilfs_dat_inode(NILFS_I_NILFS(inode));
+
+                       /* blocknr is a virtual block number */
+                       err = nilfs_dat_translate(dat, blocknr, &pblocknr);
+                       if (unlikely(err)) {
+                               brelse(bh);
+                               goto out_locked;
+                       }
+               }
+       }
+       lock_buffer(bh);
+       if (buffer_uptodate(bh)) {
+               unlock_buffer(bh);
+               err = -EEXIST; /* internal code */
+               goto found;
+       }
+       set_buffer_mapped(bh);
+       bh->b_bdev = NILFS_I_NILFS(inode)->ns_bdev;
+       bh->b_blocknr = pblocknr; /* set block address for read */
+       bh->b_end_io = end_buffer_read_sync;
+       get_bh(bh);
+       submit_bh(READ, bh);
+       bh->b_blocknr = blocknr; /* set back to the given block address */
+       err = 0;
+found:
+       *pbh = bh;
+
+out_locked:
+       unlock_page(bh->b_page);
+       page_cache_release(bh->b_page);
+       return err;
+}
+
+int nilfs_btnode_get(struct address_space *btnc, __u64 blocknr,
+                    sector_t pblocknr, struct buffer_head **pbh, int newblk)
+{
+       struct buffer_head *bh;
+       int err;
+
+       err = nilfs_btnode_submit_block(btnc, blocknr, pblocknr, pbh, newblk);
+       if (err == -EEXIST) /* internal code (cache hit) */
+               return 0;
+       if (unlikely(err))
+               return err;
+
+       bh = *pbh;
+       wait_on_buffer(bh);
+       if (!buffer_uptodate(bh)) {
+               brelse(bh);
+               return -EIO;
+       }
+       return 0;
+}
+
+/**
+ * nilfs_btnode_delete - delete B-tree node buffer
+ * @bh: buffer to be deleted
+ *
+ * nilfs_btnode_delete() invalidates the specified buffer and delete the page
+ * including the buffer if the page gets unbusy.
+ */
+void nilfs_btnode_delete(struct buffer_head *bh)
+{
+       struct address_space *mapping;
+       struct page *page = bh->b_page;
+       pgoff_t index = page_index(page);
+       int still_dirty;
+
+       page_cache_get(page);
+       lock_page(page);
+       wait_on_page_writeback(page);
+
+       nilfs_forget_buffer(bh);
+       still_dirty = PageDirty(page);
+       mapping = page->mapping;
+       unlock_page(page);
+       page_cache_release(page);
+
+       if (!still_dirty && mapping)
+               invalidate_inode_pages2_range(mapping, index, index);
+}
+
+/**
+ * nilfs_btnode_prepare_change_key
+ *  prepare to move contents of the block for old key to one of new key.
+ *  the old buffer will not be removed, but might be reused for new buffer.
+ *  it might return -ENOMEM because of memory allocation errors,
+ *  and might return -EIO because of disk read errors.
+ */
+int nilfs_btnode_prepare_change_key(struct address_space *btnc,
+                                   struct nilfs_btnode_chkey_ctxt *ctxt)
+{
+       struct buffer_head *obh, *nbh;
+       struct inode *inode = NILFS_BTNC_I(btnc);
+       __u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey;
+       int err;
+
+       if (oldkey == newkey)
+               return 0;
+
+       obh = ctxt->bh;
+       ctxt->newbh = NULL;
+
+       if (inode->i_blkbits == PAGE_CACHE_SHIFT) {
+               lock_page(obh->b_page);
+               /*
+                * We cannot call radix_tree_preload for the kernels older
+                * than 2.6.23, because it is not exported for modules.
+                */
+               err = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM);
+               if (err)
+                       goto failed_unlock;
+               /* BUG_ON(oldkey != obh->b_page->index); */
+               if (unlikely(oldkey != obh->b_page->index))
+                       NILFS_PAGE_BUG(obh->b_page,
+                                      "invalid oldkey %lld (newkey=%lld)",
+                                      (unsigned long long)oldkey,
+                                      (unsigned long long)newkey);
+
+retry:
+               spin_lock_irq(&btnc->tree_lock);
+               err = radix_tree_insert(&btnc->page_tree, newkey, obh->b_page);
+               spin_unlock_irq(&btnc->tree_lock);
+               /*
+                * Note: page->index will not change to newkey until
+                * nilfs_btnode_commit_change_key() will be called.
+                * To protect the page in intermediate state, the page lock
+                * is held.
+                */
+               radix_tree_preload_end();
+               if (!err)
+                       return 0;
+               else if (err != -EEXIST)
+                       goto failed_unlock;
+
+               err = invalidate_inode_pages2_range(btnc, newkey, newkey);
+               if (!err)
+                       goto retry;
+               /* fallback to copy mode */
+               unlock_page(obh->b_page);
+       }
+
+       err = nilfs_btnode_get(btnc, newkey, 0, &nbh, 1);
+       if (likely(!err)) {
+               BUG_ON(nbh == obh);
+               ctxt->newbh = nbh;
+       }
+       return err;
+
+ failed_unlock:
+       unlock_page(obh->b_page);
+       return err;
+}
+
+/**
+ * nilfs_btnode_commit_change_key
+ *  commit the change_key operation prepared by prepare_change_key().
+ */
+void nilfs_btnode_commit_change_key(struct address_space *btnc,
+                                   struct nilfs_btnode_chkey_ctxt *ctxt)
+{
+       struct buffer_head *obh = ctxt->bh, *nbh = ctxt->newbh;
+       __u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey;
+       struct page *opage;
+
+       if (oldkey == newkey)
+               return;
+
+       if (nbh == NULL) {      /* blocksize == pagesize */
+               opage = obh->b_page;
+               if (unlikely(oldkey != opage->index))
+                       NILFS_PAGE_BUG(opage,
+                                      "invalid oldkey %lld (newkey=%lld)",
+                                      (unsigned long long)oldkey,
+                                      (unsigned long long)newkey);
+               if (!test_set_buffer_dirty(obh) && TestSetPageDirty(opage))
+                       BUG();
+
+               spin_lock_irq(&btnc->tree_lock);
+               radix_tree_delete(&btnc->page_tree, oldkey);
+               radix_tree_tag_set(&btnc->page_tree, newkey,
+                                  PAGECACHE_TAG_DIRTY);
+               spin_unlock_irq(&btnc->tree_lock);
+
+               opage->index = obh->b_blocknr = newkey;
+               unlock_page(opage);
+       } else {
+               nilfs_copy_buffer(nbh, obh);
+               nilfs_btnode_mark_dirty(nbh);
+
+               nbh->b_blocknr = newkey;
+               ctxt->bh = nbh;
+               nilfs_btnode_delete(obh); /* will decrement bh->b_count */
+       }
+}
+
+/**
+ * nilfs_btnode_abort_change_key
+ *  abort the change_key operation prepared by prepare_change_key().
+ */
+void nilfs_btnode_abort_change_key(struct address_space *btnc,
+                                  struct nilfs_btnode_chkey_ctxt *ctxt)
+{
+       struct buffer_head *nbh = ctxt->newbh;
+       __u64 oldkey = ctxt->oldkey, newkey = ctxt->newkey;
+
+       if (oldkey == newkey)
+               return;
+
+       if (nbh == NULL) {      /* blocksize == pagesize */
+               spin_lock_irq(&btnc->tree_lock);
+               radix_tree_delete(&btnc->page_tree, newkey);
+               spin_unlock_irq(&btnc->tree_lock);
+               unlock_page(ctxt->bh->b_page);
+       } else
+               brelse(nbh);
+}
diff --git a/fs/nilfs2/btnode.h b/fs/nilfs2/btnode.h
new file mode 100644 (file)
index 0000000..35faa86
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * btnode.h - NILFS B-tree node cache
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Seiji Kihara <kihara@osrg.net>
+ * Revised by Ryusuke Konishi <ryusuke@osrg.net>
+ */
+
+#ifndef _NILFS_BTNODE_H
+#define _NILFS_BTNODE_H
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include <linux/fs.h>
+#include <linux/backing-dev.h>
+
+
+struct nilfs_btnode_chkey_ctxt {
+       __u64 oldkey;
+       __u64 newkey;
+       struct buffer_head *bh;
+       struct buffer_head *newbh;
+};
+
+void nilfs_btnode_cache_init_once(struct address_space *);
+void nilfs_btnode_cache_init(struct address_space *);
+void nilfs_btnode_cache_clear(struct address_space *);
+int nilfs_btnode_submit_block(struct address_space *, __u64, sector_t,
+                             struct buffer_head **, int);
+int nilfs_btnode_get(struct address_space *, __u64, sector_t,
+                    struct buffer_head **, int);
+void nilfs_btnode_delete(struct buffer_head *);
+int nilfs_btnode_prepare_change_key(struct address_space *,
+                                   struct nilfs_btnode_chkey_ctxt *);
+void nilfs_btnode_commit_change_key(struct address_space *,
+                                   struct nilfs_btnode_chkey_ctxt *);
+void nilfs_btnode_abort_change_key(struct address_space *,
+                                  struct nilfs_btnode_chkey_ctxt *);
+
+#define nilfs_btnode_mark_dirty(bh)    nilfs_mark_buffer_dirty(bh)
+
+
+#endif /* _NILFS_BTNODE_H */
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c
new file mode 100644 (file)
index 0000000..6b37a27
--- /dev/null
@@ -0,0 +1,2269 @@
+/*
+ * btree.c - NILFS B-tree.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/pagevec.h>
+#include "nilfs.h"
+#include "page.h"
+#include "btnode.h"
+#include "btree.h"
+#include "alloc.h"
+
+/**
+ * struct nilfs_btree_path - A path on which B-tree operations are executed
+ * @bp_bh: buffer head of node block
+ * @bp_sib_bh: buffer head of sibling node block
+ * @bp_index: index of child node
+ * @bp_oldreq: ptr end request for old ptr
+ * @bp_newreq: ptr alloc request for new ptr
+ * @bp_op: rebalance operation
+ */
+struct nilfs_btree_path {
+       struct buffer_head *bp_bh;
+       struct buffer_head *bp_sib_bh;
+       int bp_index;
+       union nilfs_bmap_ptr_req bp_oldreq;
+       union nilfs_bmap_ptr_req bp_newreq;
+       struct nilfs_btnode_chkey_ctxt bp_ctxt;
+       void (*bp_op)(struct nilfs_btree *, struct nilfs_btree_path *,
+                     int, __u64 *, __u64 *);
+};
+
+/*
+ * B-tree path operations
+ */
+
+static struct kmem_cache *nilfs_btree_path_cache;
+
+int __init nilfs_btree_path_cache_init(void)
+{
+       nilfs_btree_path_cache =
+               kmem_cache_create("nilfs2_btree_path_cache",
+                                 sizeof(struct nilfs_btree_path) *
+                                 NILFS_BTREE_LEVEL_MAX, 0, 0, NULL);
+       return (nilfs_btree_path_cache != NULL) ? 0 : -ENOMEM;
+}
+
+void nilfs_btree_path_cache_destroy(void)
+{
+       kmem_cache_destroy(nilfs_btree_path_cache);
+}
+
+static inline struct nilfs_btree_path *
+nilfs_btree_alloc_path(const struct nilfs_btree *btree)
+{
+       return (struct nilfs_btree_path *)
+               kmem_cache_alloc(nilfs_btree_path_cache, GFP_NOFS);
+}
+
+static inline void nilfs_btree_free_path(const struct nilfs_btree *btree,
+                                        struct nilfs_btree_path *path)
+{
+       kmem_cache_free(nilfs_btree_path_cache, path);
+}
+
+static void nilfs_btree_init_path(const struct nilfs_btree *btree,
+                                 struct nilfs_btree_path *path)
+{
+       int level;
+
+       for (level = NILFS_BTREE_LEVEL_DATA;
+            level < NILFS_BTREE_LEVEL_MAX;
+            level++) {
+               path[level].bp_bh = NULL;
+               path[level].bp_sib_bh = NULL;
+               path[level].bp_index = 0;
+               path[level].bp_oldreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
+               path[level].bp_newreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
+               path[level].bp_op = NULL;
+       }
+}
+
+static void nilfs_btree_clear_path(const struct nilfs_btree *btree,
+                                  struct nilfs_btree_path *path)
+{
+       int level;
+
+       for (level = NILFS_BTREE_LEVEL_DATA;
+            level < NILFS_BTREE_LEVEL_MAX;
+            level++) {
+               if (path[level].bp_bh != NULL) {
+                       nilfs_bmap_put_block(&btree->bt_bmap,
+                                            path[level].bp_bh);
+                       path[level].bp_bh = NULL;
+               }
+               /* sib_bh is released or deleted by prepare or commit
+                * operations. */
+               path[level].bp_sib_bh = NULL;
+               path[level].bp_index = 0;
+               path[level].bp_oldreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
+               path[level].bp_newreq.bpr_ptr = NILFS_BMAP_INVALID_PTR;
+               path[level].bp_op = NULL;
+       }
+}
+
+
+/*
+ * B-tree node operations
+ */
+
+static inline int
+nilfs_btree_node_get_flags(const struct nilfs_btree *btree,
+                          const struct nilfs_btree_node *node)
+{
+       return node->bn_flags;
+}
+
+static inline void
+nilfs_btree_node_set_flags(struct nilfs_btree *btree,
+                          struct nilfs_btree_node *node,
+                          int flags)
+{
+       node->bn_flags = flags;
+}
+
+static inline int nilfs_btree_node_root(const struct nilfs_btree *btree,
+                                       const struct nilfs_btree_node *node)
+{
+       return nilfs_btree_node_get_flags(btree, node) & NILFS_BTREE_NODE_ROOT;
+}
+
+static inline int
+nilfs_btree_node_get_level(const struct nilfs_btree *btree,
+                          const struct nilfs_btree_node *node)
+{
+       return node->bn_level;
+}
+
+static inline void
+nilfs_btree_node_set_level(struct nilfs_btree *btree,
+                          struct nilfs_btree_node *node,
+                          int level)
+{
+       node->bn_level = level;
+}
+
+static inline int
+nilfs_btree_node_get_nchildren(const struct nilfs_btree *btree,
+                              const struct nilfs_btree_node *node)
+{
+       return le16_to_cpu(node->bn_nchildren);
+}
+
+static inline void
+nilfs_btree_node_set_nchildren(struct nilfs_btree *btree,
+                              struct nilfs_btree_node *node,
+                              int nchildren)
+{
+       node->bn_nchildren = cpu_to_le16(nchildren);
+}
+
+static inline int
+nilfs_btree_node_size(const struct nilfs_btree *btree)
+{
+       return 1 << btree->bt_bmap.b_inode->i_blkbits;
+}
+
+static inline int
+nilfs_btree_node_nchildren_min(const struct nilfs_btree *btree,
+                              const struct nilfs_btree_node *node)
+{
+       return nilfs_btree_node_root(btree, node) ?
+               NILFS_BTREE_ROOT_NCHILDREN_MIN :
+               NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree));
+}
+
+static inline int
+nilfs_btree_node_nchildren_max(const struct nilfs_btree *btree,
+                              const struct nilfs_btree_node *node)
+{
+       return nilfs_btree_node_root(btree, node) ?
+               NILFS_BTREE_ROOT_NCHILDREN_MAX :
+               NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(btree));
+}
+
+static inline __le64 *
+nilfs_btree_node_dkeys(const struct nilfs_btree *btree,
+                      const struct nilfs_btree_node *node)
+{
+       return (__le64 *)((char *)(node + 1) +
+                         (nilfs_btree_node_root(btree, node) ?
+                          0 : NILFS_BTREE_NODE_EXTRA_PAD_SIZE));
+}
+
+static inline __le64 *
+nilfs_btree_node_dptrs(const struct nilfs_btree *btree,
+                      const struct nilfs_btree_node *node)
+{
+       return (__le64 *)(nilfs_btree_node_dkeys(btree, node) +
+                         nilfs_btree_node_nchildren_max(btree, node));
+}
+
+static inline __u64
+nilfs_btree_node_get_key(const struct nilfs_btree *btree,
+                        const struct nilfs_btree_node *node, int index)
+{
+       return nilfs_bmap_dkey_to_key(*(nilfs_btree_node_dkeys(btree, node) +
+                                       index));
+}
+
+static inline void
+nilfs_btree_node_set_key(struct nilfs_btree *btree,
+                        struct nilfs_btree_node *node, int index, __u64 key)
+{
+       *(nilfs_btree_node_dkeys(btree, node) + index) =
+               nilfs_bmap_key_to_dkey(key);
+}
+
+static inline __u64
+nilfs_btree_node_get_ptr(const struct nilfs_btree *btree,
+                        const struct nilfs_btree_node *node,
+                        int index)
+{
+       return nilfs_bmap_dptr_to_ptr(*(nilfs_btree_node_dptrs(btree, node) +
+                                       index));
+}
+
+static inline void
+nilfs_btree_node_set_ptr(struct nilfs_btree *btree,
+                        struct nilfs_btree_node *node,
+                        int index,
+                        __u64 ptr)
+{
+       *(nilfs_btree_node_dptrs(btree, node) + index) =
+               nilfs_bmap_ptr_to_dptr(ptr);
+}
+
+static void nilfs_btree_node_init(struct nilfs_btree *btree,
+                                 struct nilfs_btree_node *node,
+                                 int flags, int level, int nchildren,
+                                 const __u64 *keys, const __u64 *ptrs)
+{
+       __le64 *dkeys;
+       __le64 *dptrs;
+       int i;
+
+       nilfs_btree_node_set_flags(btree, node, flags);
+       nilfs_btree_node_set_level(btree, node, level);
+       nilfs_btree_node_set_nchildren(btree, node, nchildren);
+
+       dkeys = nilfs_btree_node_dkeys(btree, node);
+       dptrs = nilfs_btree_node_dptrs(btree, node);
+       for (i = 0; i < nchildren; i++) {
+               dkeys[i] = nilfs_bmap_key_to_dkey(keys[i]);
+               dptrs[i] = nilfs_bmap_ptr_to_dptr(ptrs[i]);
+       }
+}
+
+/* Assume the buffer heads corresponding to left and right are locked. */
+static void nilfs_btree_node_move_left(struct nilfs_btree *btree,
+                                      struct nilfs_btree_node *left,
+                                      struct nilfs_btree_node *right,
+                                      int n)
+{
+       __le64 *ldkeys, *rdkeys;
+       __le64 *ldptrs, *rdptrs;
+       int lnchildren, rnchildren;
+
+       ldkeys = nilfs_btree_node_dkeys(btree, left);
+       ldptrs = nilfs_btree_node_dptrs(btree, left);
+       lnchildren = nilfs_btree_node_get_nchildren(btree, left);
+
+       rdkeys = nilfs_btree_node_dkeys(btree, right);
+       rdptrs = nilfs_btree_node_dptrs(btree, right);
+       rnchildren = nilfs_btree_node_get_nchildren(btree, right);
+
+       memcpy(ldkeys + lnchildren, rdkeys, n * sizeof(*rdkeys));
+       memcpy(ldptrs + lnchildren, rdptrs, n * sizeof(*rdptrs));
+       memmove(rdkeys, rdkeys + n, (rnchildren - n) * sizeof(*rdkeys));
+       memmove(rdptrs, rdptrs + n, (rnchildren - n) * sizeof(*rdptrs));
+
+       lnchildren += n;
+       rnchildren -= n;
+       nilfs_btree_node_set_nchildren(btree, left, lnchildren);
+       nilfs_btree_node_set_nchildren(btree, right, rnchildren);
+}
+
+/* Assume that the buffer heads corresponding to left and right are locked. */
+static void nilfs_btree_node_move_right(struct nilfs_btree *btree,
+                                       struct nilfs_btree_node *left,
+                                       struct nilfs_btree_node *right,
+                                       int n)
+{
+       __le64 *ldkeys, *rdkeys;
+       __le64 *ldptrs, *rdptrs;
+       int lnchildren, rnchildren;
+
+       ldkeys = nilfs_btree_node_dkeys(btree, left);
+       ldptrs = nilfs_btree_node_dptrs(btree, left);
+       lnchildren = nilfs_btree_node_get_nchildren(btree, left);
+
+       rdkeys = nilfs_btree_node_dkeys(btree, right);
+       rdptrs = nilfs_btree_node_dptrs(btree, right);
+       rnchildren = nilfs_btree_node_get_nchildren(btree, right);
+
+       memmove(rdkeys + n, rdkeys, rnchildren * sizeof(*rdkeys));
+       memmove(rdptrs + n, rdptrs, rnchildren * sizeof(*rdptrs));
+       memcpy(rdkeys, ldkeys + lnchildren - n, n * sizeof(*rdkeys));
+       memcpy(rdptrs, ldptrs + lnchildren - n, n * sizeof(*rdptrs));
+
+       lnchildren -= n;
+       rnchildren += n;
+       nilfs_btree_node_set_nchildren(btree, left, lnchildren);
+       nilfs_btree_node_set_nchildren(btree, right, rnchildren);
+}
+
+/* Assume that the buffer head corresponding to node is locked. */
+static void nilfs_btree_node_insert(struct nilfs_btree *btree,
+                                   struct nilfs_btree_node *node,
+                                   __u64 key, __u64 ptr, int index)
+{
+       __le64 *dkeys;
+       __le64 *dptrs;
+       int nchildren;
+
+       dkeys = nilfs_btree_node_dkeys(btree, node);
+       dptrs = nilfs_btree_node_dptrs(btree, node);
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       if (index < nchildren) {
+               memmove(dkeys + index + 1, dkeys + index,
+                       (nchildren - index) * sizeof(*dkeys));
+               memmove(dptrs + index + 1, dptrs + index,
+                       (nchildren - index) * sizeof(*dptrs));
+       }
+       dkeys[index] = nilfs_bmap_key_to_dkey(key);
+       dptrs[index] = nilfs_bmap_ptr_to_dptr(ptr);
+       nchildren++;
+       nilfs_btree_node_set_nchildren(btree, node, nchildren);
+}
+
+/* Assume that the buffer head corresponding to node is locked. */
+static void nilfs_btree_node_delete(struct nilfs_btree *btree,
+                                   struct nilfs_btree_node *node,
+                                   __u64 *keyp, __u64 *ptrp, int index)
+{
+       __u64 key;
+       __u64 ptr;
+       __le64 *dkeys;
+       __le64 *dptrs;
+       int nchildren;
+
+       dkeys = nilfs_btree_node_dkeys(btree, node);
+       dptrs = nilfs_btree_node_dptrs(btree, node);
+       key = nilfs_bmap_dkey_to_key(dkeys[index]);
+       ptr = nilfs_bmap_dptr_to_ptr(dptrs[index]);
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       if (keyp != NULL)
+               *keyp = key;
+       if (ptrp != NULL)
+               *ptrp = ptr;
+
+       if (index < nchildren - 1) {
+               memmove(dkeys + index, dkeys + index + 1,
+                       (nchildren - index - 1) * sizeof(*dkeys));
+               memmove(dptrs + index, dptrs + index + 1,
+                       (nchildren - index - 1) * sizeof(*dptrs));
+       }
+       nchildren--;
+       nilfs_btree_node_set_nchildren(btree, node, nchildren);
+}
+
+static int nilfs_btree_node_lookup(const struct nilfs_btree *btree,
+                                  const struct nilfs_btree_node *node,
+                                  __u64 key, int *indexp)
+{
+       __u64 nkey;
+       int index, low, high, s;
+
+       /* binary search */
+       low = 0;
+       high = nilfs_btree_node_get_nchildren(btree, node) - 1;
+       index = 0;
+       s = 0;
+       while (low <= high) {
+               index = (low + high) / 2;
+               nkey = nilfs_btree_node_get_key(btree, node, index);
+               if (nkey == key) {
+                       s = 0;
+                       goto out;
+               } else if (nkey < key) {
+                       low = index + 1;
+                       s = -1;
+               } else {
+                       high = index - 1;
+                       s = 1;
+               }
+       }
+
+       /* adjust index */
+       if (nilfs_btree_node_get_level(btree, node) >
+           NILFS_BTREE_LEVEL_NODE_MIN) {
+               if ((s > 0) && (index > 0))
+                       index--;
+       } else if (s < 0)
+               index++;
+
+ out:
+       *indexp = index;
+
+       return s == 0;
+}
+
+static inline struct nilfs_btree_node *
+nilfs_btree_get_root(const struct nilfs_btree *btree)
+{
+       return (struct nilfs_btree_node *)btree->bt_bmap.b_u.u_data;
+}
+
+static inline struct nilfs_btree_node *
+nilfs_btree_get_nonroot_node(const struct nilfs_btree *btree,
+                            const struct nilfs_btree_path *path,
+                            int level)
+{
+       return (struct nilfs_btree_node *)path[level].bp_bh->b_data;
+}
+
+static inline struct nilfs_btree_node *
+nilfs_btree_get_sib_node(const struct nilfs_btree *btree,
+                        const struct nilfs_btree_path *path,
+                        int level)
+{
+       return (struct nilfs_btree_node *)path[level].bp_sib_bh->b_data;
+}
+
+static inline int nilfs_btree_height(const struct nilfs_btree *btree)
+{
+       return nilfs_btree_node_get_level(btree, nilfs_btree_get_root(btree))
+               + 1;
+}
+
+static inline struct nilfs_btree_node *
+nilfs_btree_get_node(const struct nilfs_btree *btree,
+                    const struct nilfs_btree_path *path,
+                    int level)
+{
+       return (level == nilfs_btree_height(btree) - 1) ?
+               nilfs_btree_get_root(btree) :
+               nilfs_btree_get_nonroot_node(btree, path, level);
+}
+
+static int nilfs_btree_do_lookup(const struct nilfs_btree *btree,
+                                struct nilfs_btree_path *path,
+                                __u64 key, __u64 *ptrp, int minlevel)
+{
+       struct nilfs_btree_node *node;
+       __u64 ptr;
+       int level, index, found, ret;
+
+       node = nilfs_btree_get_root(btree);
+       level = nilfs_btree_node_get_level(btree, node);
+       if ((level < minlevel) ||
+           (nilfs_btree_node_get_nchildren(btree, node) <= 0))
+               return -ENOENT;
+
+       found = nilfs_btree_node_lookup(btree, node, key, &index);
+       ptr = nilfs_btree_node_get_ptr(btree, node, index);
+       path[level].bp_bh = NULL;
+       path[level].bp_index = index;
+
+       for (level--; level >= minlevel; level--) {
+               ret = nilfs_bmap_get_block(&btree->bt_bmap, ptr,
+                                          &path[level].bp_bh);
+               if (ret < 0)
+                       return ret;
+               node = nilfs_btree_get_nonroot_node(btree, path, level);
+               BUG_ON(level != nilfs_btree_node_get_level(btree, node));
+               if (!found)
+                       found = nilfs_btree_node_lookup(btree, node, key,
+                                                       &index);
+               else
+                       index = 0;
+               if (index < nilfs_btree_node_nchildren_max(btree, node))
+                       ptr = nilfs_btree_node_get_ptr(btree, node, index);
+               else {
+                       WARN_ON(found || level != NILFS_BTREE_LEVEL_NODE_MIN);
+                       /* insert */
+                       ptr = NILFS_BMAP_INVALID_PTR;
+               }
+               path[level].bp_index = index;
+       }
+       if (!found)
+               return -ENOENT;
+
+       if (ptrp != NULL)
+               *ptrp = ptr;
+
+       return 0;
+}
+
+static int nilfs_btree_do_lookup_last(const struct nilfs_btree *btree,
+                                     struct nilfs_btree_path *path,
+                                     __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node;
+       __u64 ptr;
+       int index, level, ret;
+
+       node = nilfs_btree_get_root(btree);
+       index = nilfs_btree_node_get_nchildren(btree, node) - 1;
+       if (index < 0)
+               return -ENOENT;
+       level = nilfs_btree_node_get_level(btree, node);
+       ptr = nilfs_btree_node_get_ptr(btree, node, index);
+       path[level].bp_bh = NULL;
+       path[level].bp_index = index;
+
+       for (level--; level > 0; level--) {
+               ret = nilfs_bmap_get_block(&btree->bt_bmap, ptr,
+                                          &path[level].bp_bh);
+               if (ret < 0)
+                       return ret;
+               node = nilfs_btree_get_nonroot_node(btree, path, level);
+               BUG_ON(level != nilfs_btree_node_get_level(btree, node));
+               index = nilfs_btree_node_get_nchildren(btree, node) - 1;
+               ptr = nilfs_btree_node_get_ptr(btree, node, index);
+               path[level].bp_index = index;
+       }
+
+       if (keyp != NULL)
+               *keyp = nilfs_btree_node_get_key(btree, node, index);
+       if (ptrp != NULL)
+               *ptrp = ptr;
+
+       return 0;
+}
+
+static int nilfs_btree_lookup(const struct nilfs_bmap *bmap,
+                             __u64 key, int level, __u64 *ptrp)
+{
+       struct nilfs_btree *btree;
+       struct nilfs_btree_path *path;
+       __u64 ptr;
+       int ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       path = nilfs_btree_alloc_path(btree);
+       if (path == NULL)
+               return -ENOMEM;
+       nilfs_btree_init_path(btree, path);
+
+       ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level);
+
+       if (ptrp != NULL)
+               *ptrp = ptr;
+
+       nilfs_btree_clear_path(btree, path);
+       nilfs_btree_free_path(btree, path);
+
+       return ret;
+}
+
+static void nilfs_btree_promote_key(struct nilfs_btree *btree,
+                                   struct nilfs_btree_path *path,
+                                   int level, __u64 key)
+{
+       if (level < nilfs_btree_height(btree) - 1) {
+               do {
+                       lock_buffer(path[level].bp_bh);
+                       nilfs_btree_node_set_key(
+                               btree,
+                               nilfs_btree_get_nonroot_node(
+                                       btree, path, level),
+                               path[level].bp_index, key);
+                       if (!buffer_dirty(path[level].bp_bh))
+                               nilfs_btnode_mark_dirty(path[level].bp_bh);
+                       unlock_buffer(path[level].bp_bh);
+               } while ((path[level].bp_index == 0) &&
+                        (++level < nilfs_btree_height(btree) - 1));
+       }
+
+       /* root */
+       if (level == nilfs_btree_height(btree) - 1) {
+               nilfs_btree_node_set_key(btree,
+                                        nilfs_btree_get_root(btree),
+                                        path[level].bp_index, key);
+       }
+}
+
+static void nilfs_btree_do_insert(struct nilfs_btree *btree,
+                                 struct nilfs_btree_path *path,
+                                 int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node;
+
+       if (level < nilfs_btree_height(btree) - 1) {
+               lock_buffer(path[level].bp_bh);
+               node = nilfs_btree_get_nonroot_node(btree, path, level);
+               nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
+                                       path[level].bp_index);
+               if (!buffer_dirty(path[level].bp_bh))
+                       nilfs_btnode_mark_dirty(path[level].bp_bh);
+               unlock_buffer(path[level].bp_bh);
+
+               if (path[level].bp_index == 0)
+                       nilfs_btree_promote_key(btree, path, level + 1,
+                                               nilfs_btree_node_get_key(
+                                                       btree, node, 0));
+       } else {
+               node = nilfs_btree_get_root(btree);
+               nilfs_btree_node_insert(btree, node, *keyp, *ptrp,
+                                       path[level].bp_index);
+       }
+}
+
+static void nilfs_btree_carry_left(struct nilfs_btree *btree,
+                                  struct nilfs_btree_path *path,
+                                  int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node, *left;
+       int nchildren, lnchildren, n, move;
+
+       lock_buffer(path[level].bp_bh);
+       lock_buffer(path[level].bp_sib_bh);
+
+       node = nilfs_btree_get_nonroot_node(btree, path, level);
+       left = nilfs_btree_get_sib_node(btree, path, level);
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       lnchildren = nilfs_btree_node_get_nchildren(btree, left);
+       move = 0;
+
+       n = (nchildren + lnchildren + 1) / 2 - lnchildren;
+       if (n > path[level].bp_index) {
+               /* move insert point */
+               n--;
+               move = 1;
+       }
+
+       nilfs_btree_node_move_left(btree, left, node, n);
+
+       if (!buffer_dirty(path[level].bp_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_bh);
+       if (!buffer_dirty(path[level].bp_sib_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
+
+       unlock_buffer(path[level].bp_bh);
+       unlock_buffer(path[level].bp_sib_bh);
+
+       nilfs_btree_promote_key(btree, path, level + 1,
+                               nilfs_btree_node_get_key(btree, node, 0));
+
+       if (move) {
+               nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_bh);
+               path[level].bp_bh = path[level].bp_sib_bh;
+               path[level].bp_sib_bh = NULL;
+               path[level].bp_index += lnchildren;
+               path[level + 1].bp_index--;
+       } else {
+               nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_sib_bh);
+               path[level].bp_sib_bh = NULL;
+               path[level].bp_index -= n;
+       }
+
+       nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
+}
+
+static void nilfs_btree_carry_right(struct nilfs_btree *btree,
+                                   struct nilfs_btree_path *path,
+                                   int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node, *right;
+       int nchildren, rnchildren, n, move;
+
+       lock_buffer(path[level].bp_bh);
+       lock_buffer(path[level].bp_sib_bh);
+
+       node = nilfs_btree_get_nonroot_node(btree, path, level);
+       right = nilfs_btree_get_sib_node(btree, path, level);
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       rnchildren = nilfs_btree_node_get_nchildren(btree, right);
+       move = 0;
+
+       n = (nchildren + rnchildren + 1) / 2 - rnchildren;
+       if (n > nchildren - path[level].bp_index) {
+               /* move insert point */
+               n--;
+               move = 1;
+       }
+
+       nilfs_btree_node_move_right(btree, node, right, n);
+
+       if (!buffer_dirty(path[level].bp_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_bh);
+       if (!buffer_dirty(path[level].bp_sib_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
+
+       unlock_buffer(path[level].bp_bh);
+       unlock_buffer(path[level].bp_sib_bh);
+
+       path[level + 1].bp_index++;
+       nilfs_btree_promote_key(btree, path, level + 1,
+                               nilfs_btree_node_get_key(btree, right, 0));
+       path[level + 1].bp_index--;
+
+       if (move) {
+               nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_bh);
+               path[level].bp_bh = path[level].bp_sib_bh;
+               path[level].bp_sib_bh = NULL;
+               path[level].bp_index -=
+                       nilfs_btree_node_get_nchildren(btree, node);
+               path[level + 1].bp_index++;
+       } else {
+               nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_sib_bh);
+               path[level].bp_sib_bh = NULL;
+       }
+
+       nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
+}
+
+static void nilfs_btree_split(struct nilfs_btree *btree,
+                             struct nilfs_btree_path *path,
+                             int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node, *right;
+       __u64 newkey;
+       __u64 newptr;
+       int nchildren, n, move;
+
+       lock_buffer(path[level].bp_bh);
+       lock_buffer(path[level].bp_sib_bh);
+
+       node = nilfs_btree_get_nonroot_node(btree, path, level);
+       right = nilfs_btree_get_sib_node(btree, path, level);
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       move = 0;
+
+       n = (nchildren + 1) / 2;
+       if (n > nchildren - path[level].bp_index) {
+               n--;
+               move = 1;
+       }
+
+       nilfs_btree_node_move_right(btree, node, right, n);
+
+       if (!buffer_dirty(path[level].bp_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_bh);
+       if (!buffer_dirty(path[level].bp_sib_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
+
+       unlock_buffer(path[level].bp_bh);
+       unlock_buffer(path[level].bp_sib_bh);
+
+       newkey = nilfs_btree_node_get_key(btree, right, 0);
+       newptr = path[level].bp_newreq.bpr_ptr;
+
+       if (move) {
+               path[level].bp_index -=
+                       nilfs_btree_node_get_nchildren(btree, node);
+               nilfs_btree_node_insert(btree, right, *keyp, *ptrp,
+                                       path[level].bp_index);
+
+               *keyp = nilfs_btree_node_get_key(btree, right, 0);
+               *ptrp = path[level].bp_newreq.bpr_ptr;
+
+               nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_bh);
+               path[level].bp_bh = path[level].bp_sib_bh;
+               path[level].bp_sib_bh = NULL;
+       } else {
+               nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
+
+               *keyp = nilfs_btree_node_get_key(btree, right, 0);
+               *ptrp = path[level].bp_newreq.bpr_ptr;
+
+               nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_sib_bh);
+               path[level].bp_sib_bh = NULL;
+       }
+
+       path[level + 1].bp_index++;
+}
+
+static void nilfs_btree_grow(struct nilfs_btree *btree,
+                            struct nilfs_btree_path *path,
+                            int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *root, *child;
+       int n;
+
+       lock_buffer(path[level].bp_sib_bh);
+
+       root = nilfs_btree_get_root(btree);
+       child = nilfs_btree_get_sib_node(btree, path, level);
+
+       n = nilfs_btree_node_get_nchildren(btree, root);
+
+       nilfs_btree_node_move_right(btree, root, child, n);
+       nilfs_btree_node_set_level(btree, root, level + 1);
+
+       if (!buffer_dirty(path[level].bp_sib_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
+
+       unlock_buffer(path[level].bp_sib_bh);
+
+       path[level].bp_bh = path[level].bp_sib_bh;
+       path[level].bp_sib_bh = NULL;
+
+       nilfs_btree_do_insert(btree, path, level, keyp, ptrp);
+
+       *keyp = nilfs_btree_node_get_key(btree, child, 0);
+       *ptrp = path[level].bp_newreq.bpr_ptr;
+}
+
+static __u64 nilfs_btree_find_near(const struct nilfs_btree *btree,
+                                  const struct nilfs_btree_path *path)
+{
+       struct nilfs_btree_node *node;
+       int level;
+
+       if (path == NULL)
+               return NILFS_BMAP_INVALID_PTR;
+
+       /* left sibling */
+       level = NILFS_BTREE_LEVEL_NODE_MIN;
+       if (path[level].bp_index > 0) {
+               node = nilfs_btree_get_node(btree, path, level);
+               return nilfs_btree_node_get_ptr(btree, node,
+                                               path[level].bp_index - 1);
+       }
+
+       /* parent */
+       level = NILFS_BTREE_LEVEL_NODE_MIN + 1;
+       if (level <= nilfs_btree_height(btree) - 1) {
+               node = nilfs_btree_get_node(btree, path, level);
+               return nilfs_btree_node_get_ptr(btree, node,
+                                               path[level].bp_index);
+       }
+
+       return NILFS_BMAP_INVALID_PTR;
+}
+
+static __u64 nilfs_btree_find_target_v(const struct nilfs_btree *btree,
+                                      const struct nilfs_btree_path *path,
+                                      __u64 key)
+{
+       __u64 ptr;
+
+       ptr = nilfs_bmap_find_target_seq(&btree->bt_bmap, key);
+       if (ptr != NILFS_BMAP_INVALID_PTR)
+               /* sequential access */
+               return ptr;
+       else {
+               ptr = nilfs_btree_find_near(btree, path);
+               if (ptr != NILFS_BMAP_INVALID_PTR)
+                       /* near */
+                       return ptr;
+       }
+       /* block group */
+       return nilfs_bmap_find_target_in_group(&btree->bt_bmap);
+}
+
+static void nilfs_btree_set_target_v(struct nilfs_btree *btree, __u64 key,
+                                    __u64 ptr)
+{
+       btree->bt_bmap.b_last_allocated_key = key;
+       btree->bt_bmap.b_last_allocated_ptr = ptr;
+}
+
+static int nilfs_btree_prepare_insert(struct nilfs_btree *btree,
+                                     struct nilfs_btree_path *path,
+                                     int *levelp, __u64 key, __u64 ptr,
+                                     struct nilfs_bmap_stats *stats)
+{
+       struct buffer_head *bh;
+       struct nilfs_btree_node *node, *parent, *sib;
+       __u64 sibptr;
+       int pindex, level, ret;
+
+       stats->bs_nblocks = 0;
+       level = NILFS_BTREE_LEVEL_DATA;
+
+       /* allocate a new ptr for data block */
+       if (btree->bt_ops->btop_find_target != NULL)
+               path[level].bp_newreq.bpr_ptr =
+                       btree->bt_ops->btop_find_target(btree, path, key);
+
+       ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr(
+               &btree->bt_bmap, &path[level].bp_newreq);
+       if (ret < 0)
+               goto err_out_data;
+
+       for (level = NILFS_BTREE_LEVEL_NODE_MIN;
+            level < nilfs_btree_height(btree) - 1;
+            level++) {
+               node = nilfs_btree_get_nonroot_node(btree, path, level);
+               if (nilfs_btree_node_get_nchildren(btree, node) <
+                   nilfs_btree_node_nchildren_max(btree, node)) {
+                       path[level].bp_op = nilfs_btree_do_insert;
+                       stats->bs_nblocks++;
+                       goto out;
+               }
+
+               parent = nilfs_btree_get_node(btree, path, level + 1);
+               pindex = path[level + 1].bp_index;
+
+               /* left sibling */
+               if (pindex > 0) {
+                       sibptr = nilfs_btree_node_get_ptr(btree, parent,
+                                                         pindex - 1);
+                       ret = nilfs_bmap_get_block(&btree->bt_bmap, sibptr,
+                                                  &bh);
+                       if (ret < 0)
+                               goto err_out_child_node;
+                       sib = (struct nilfs_btree_node *)bh->b_data;
+                       if (nilfs_btree_node_get_nchildren(btree, sib) <
+                           nilfs_btree_node_nchildren_max(btree, sib)) {
+                               path[level].bp_sib_bh = bh;
+                               path[level].bp_op = nilfs_btree_carry_left;
+                               stats->bs_nblocks++;
+                               goto out;
+                       } else
+                               nilfs_bmap_put_block(&btree->bt_bmap, bh);
+               }
+
+               /* right sibling */
+               if (pindex <
+                   nilfs_btree_node_get_nchildren(btree, parent) - 1) {
+                       sibptr = nilfs_btree_node_get_ptr(btree, parent,
+                                                         pindex + 1);
+                       ret = nilfs_bmap_get_block(&btree->bt_bmap, sibptr,
+                                                  &bh);
+                       if (ret < 0)
+                               goto err_out_child_node;
+                       sib = (struct nilfs_btree_node *)bh->b_data;
+                       if (nilfs_btree_node_get_nchildren(btree, sib) <
+                           nilfs_btree_node_nchildren_max(btree, sib)) {
+                               path[level].bp_sib_bh = bh;
+                               path[level].bp_op = nilfs_btree_carry_right;
+                               stats->bs_nblocks++;
+                               goto out;
+                       } else
+                               nilfs_bmap_put_block(&btree->bt_bmap, bh);
+               }
+
+               /* split */
+               path[level].bp_newreq.bpr_ptr =
+                       path[level - 1].bp_newreq.bpr_ptr + 1;
+               ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr(
+                       &btree->bt_bmap, &path[level].bp_newreq);
+               if (ret < 0)
+                       goto err_out_child_node;
+               ret = nilfs_bmap_get_new_block(&btree->bt_bmap,
+                                              path[level].bp_newreq.bpr_ptr,
+                                              &bh);
+               if (ret < 0)
+                       goto err_out_curr_node;
+
+               stats->bs_nblocks++;
+
+               lock_buffer(bh);
+               nilfs_btree_node_init(btree,
+                                     (struct nilfs_btree_node *)bh->b_data,
+                                     0, level, 0, NULL, NULL);
+               unlock_buffer(bh);
+               path[level].bp_sib_bh = bh;
+               path[level].bp_op = nilfs_btree_split;
+       }
+
+       /* root */
+       node = nilfs_btree_get_root(btree);
+       if (nilfs_btree_node_get_nchildren(btree, node) <
+           nilfs_btree_node_nchildren_max(btree, node)) {
+               path[level].bp_op = nilfs_btree_do_insert;
+               stats->bs_nblocks++;
+               goto out;
+       }
+
+       /* grow */
+       path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1;
+       ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr(
+               &btree->bt_bmap, &path[level].bp_newreq);
+       if (ret < 0)
+               goto err_out_child_node;
+       ret = nilfs_bmap_get_new_block(&btree->bt_bmap,
+                                      path[level].bp_newreq.bpr_ptr, &bh);
+       if (ret < 0)
+               goto err_out_curr_node;
+
+       lock_buffer(bh);
+       nilfs_btree_node_init(btree, (struct nilfs_btree_node *)bh->b_data,
+                             0, level, 0, NULL, NULL);
+       unlock_buffer(bh);
+       path[level].bp_sib_bh = bh;
+       path[level].bp_op = nilfs_btree_grow;
+
+       level++;
+       path[level].bp_op = nilfs_btree_do_insert;
+
+       /* a newly-created node block and a data block are added */
+       stats->bs_nblocks += 2;
+
+       /* success */
+ out:
+       *levelp = level;
+       return ret;
+
+       /* error */
+ err_out_curr_node:
+       btree->bt_bmap.b_pops->bpop_abort_alloc_ptr(&btree->bt_bmap,
+                                                   &path[level].bp_newreq);
+ err_out_child_node:
+       for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) {
+               nilfs_bmap_delete_block(&btree->bt_bmap, path[level].bp_sib_bh);
+               btree->bt_bmap.b_pops->bpop_abort_alloc_ptr(
+                       &btree->bt_bmap, &path[level].bp_newreq);
+
+       }
+
+       btree->bt_bmap.b_pops->bpop_abort_alloc_ptr(&btree->bt_bmap,
+                                                      &path[level].bp_newreq);
+ err_out_data:
+       *levelp = level;
+       stats->bs_nblocks = 0;
+       return ret;
+}
+
+static void nilfs_btree_commit_insert(struct nilfs_btree *btree,
+                                     struct nilfs_btree_path *path,
+                                     int maxlevel, __u64 key, __u64 ptr)
+{
+       int level;
+
+       set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
+       ptr = path[NILFS_BTREE_LEVEL_DATA].bp_newreq.bpr_ptr;
+       if (btree->bt_ops->btop_set_target != NULL)
+               btree->bt_ops->btop_set_target(btree, key, ptr);
+
+       for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
+               if (btree->bt_bmap.b_pops->bpop_commit_alloc_ptr != NULL) {
+                       btree->bt_bmap.b_pops->bpop_commit_alloc_ptr(
+                               &btree->bt_bmap, &path[level - 1].bp_newreq);
+               }
+               path[level].bp_op(btree, path, level, &key, &ptr);
+       }
+
+       if (!nilfs_bmap_dirty(&btree->bt_bmap))
+               nilfs_bmap_set_dirty(&btree->bt_bmap);
+}
+
+static int nilfs_btree_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr)
+{
+       struct nilfs_btree *btree;
+       struct nilfs_btree_path *path;
+       struct nilfs_bmap_stats stats;
+       int level, ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       path = nilfs_btree_alloc_path(btree);
+       if (path == NULL)
+               return -ENOMEM;
+       nilfs_btree_init_path(btree, path);
+
+       ret = nilfs_btree_do_lookup(btree, path, key, NULL,
+                                   NILFS_BTREE_LEVEL_NODE_MIN);
+       if (ret != -ENOENT) {
+               if (ret == 0)
+                       ret = -EEXIST;
+               goto out;
+       }
+
+       ret = nilfs_btree_prepare_insert(btree, path, &level, key, ptr, &stats);
+       if (ret < 0)
+               goto out;
+       nilfs_btree_commit_insert(btree, path, level, key, ptr);
+       nilfs_bmap_add_blocks(bmap, stats.bs_nblocks);
+
+ out:
+       nilfs_btree_clear_path(btree, path);
+       nilfs_btree_free_path(btree, path);
+       return ret;
+}
+
+static void nilfs_btree_do_delete(struct nilfs_btree *btree,
+                                 struct nilfs_btree_path *path,
+                                 int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node;
+
+       if (level < nilfs_btree_height(btree) - 1) {
+               lock_buffer(path[level].bp_bh);
+               node = nilfs_btree_get_nonroot_node(btree, path, level);
+               nilfs_btree_node_delete(btree, node, keyp, ptrp,
+                                       path[level].bp_index);
+               if (!buffer_dirty(path[level].bp_bh))
+                       nilfs_btnode_mark_dirty(path[level].bp_bh);
+               unlock_buffer(path[level].bp_bh);
+               if (path[level].bp_index == 0)
+                       nilfs_btree_promote_key(btree, path, level + 1,
+                               nilfs_btree_node_get_key(btree, node, 0));
+       } else {
+               node = nilfs_btree_get_root(btree);
+               nilfs_btree_node_delete(btree, node, keyp, ptrp,
+                                       path[level].bp_index);
+       }
+}
+
+static void nilfs_btree_borrow_left(struct nilfs_btree *btree,
+                                   struct nilfs_btree_path *path,
+                                   int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node, *left;
+       int nchildren, lnchildren, n;
+
+       nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
+
+       lock_buffer(path[level].bp_bh);
+       lock_buffer(path[level].bp_sib_bh);
+
+       node = nilfs_btree_get_nonroot_node(btree, path, level);
+       left = nilfs_btree_get_sib_node(btree, path, level);
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       lnchildren = nilfs_btree_node_get_nchildren(btree, left);
+
+       n = (nchildren + lnchildren) / 2 - nchildren;
+
+       nilfs_btree_node_move_right(btree, left, node, n);
+
+       if (!buffer_dirty(path[level].bp_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_bh);
+       if (!buffer_dirty(path[level].bp_sib_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
+
+       unlock_buffer(path[level].bp_bh);
+       unlock_buffer(path[level].bp_sib_bh);
+
+       nilfs_btree_promote_key(btree, path, level + 1,
+                               nilfs_btree_node_get_key(btree, node, 0));
+
+       nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_sib_bh);
+       path[level].bp_sib_bh = NULL;
+       path[level].bp_index += n;
+}
+
+static void nilfs_btree_borrow_right(struct nilfs_btree *btree,
+                                    struct nilfs_btree_path *path,
+                                    int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node, *right;
+       int nchildren, rnchildren, n;
+
+       nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
+
+       lock_buffer(path[level].bp_bh);
+       lock_buffer(path[level].bp_sib_bh);
+
+       node = nilfs_btree_get_nonroot_node(btree, path, level);
+       right = nilfs_btree_get_sib_node(btree, path, level);
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       rnchildren = nilfs_btree_node_get_nchildren(btree, right);
+
+       n = (nchildren + rnchildren) / 2 - nchildren;
+
+       nilfs_btree_node_move_left(btree, node, right, n);
+
+       if (!buffer_dirty(path[level].bp_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_bh);
+       if (!buffer_dirty(path[level].bp_sib_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
+
+       unlock_buffer(path[level].bp_bh);
+       unlock_buffer(path[level].bp_sib_bh);
+
+       path[level + 1].bp_index++;
+       nilfs_btree_promote_key(btree, path, level + 1,
+                               nilfs_btree_node_get_key(btree, right, 0));
+       path[level + 1].bp_index--;
+
+       nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_sib_bh);
+       path[level].bp_sib_bh = NULL;
+}
+
+static void nilfs_btree_concat_left(struct nilfs_btree *btree,
+                                   struct nilfs_btree_path *path,
+                                   int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node, *left;
+       int n;
+
+       nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
+
+       lock_buffer(path[level].bp_bh);
+       lock_buffer(path[level].bp_sib_bh);
+
+       node = nilfs_btree_get_nonroot_node(btree, path, level);
+       left = nilfs_btree_get_sib_node(btree, path, level);
+
+       n = nilfs_btree_node_get_nchildren(btree, node);
+
+       nilfs_btree_node_move_left(btree, left, node, n);
+
+       if (!buffer_dirty(path[level].bp_sib_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_sib_bh);
+
+       unlock_buffer(path[level].bp_bh);
+       unlock_buffer(path[level].bp_sib_bh);
+
+       nilfs_bmap_delete_block(&btree->bt_bmap, path[level].bp_bh);
+       path[level].bp_bh = path[level].bp_sib_bh;
+       path[level].bp_sib_bh = NULL;
+       path[level].bp_index += nilfs_btree_node_get_nchildren(btree, left);
+}
+
+static void nilfs_btree_concat_right(struct nilfs_btree *btree,
+                                    struct nilfs_btree_path *path,
+                                    int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *node, *right;
+       int n;
+
+       nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
+
+       lock_buffer(path[level].bp_bh);
+       lock_buffer(path[level].bp_sib_bh);
+
+       node = nilfs_btree_get_nonroot_node(btree, path, level);
+       right = nilfs_btree_get_sib_node(btree, path, level);
+
+       n = nilfs_btree_node_get_nchildren(btree, right);
+
+       nilfs_btree_node_move_left(btree, node, right, n);
+
+       if (!buffer_dirty(path[level].bp_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_bh);
+
+       unlock_buffer(path[level].bp_bh);
+       unlock_buffer(path[level].bp_sib_bh);
+
+       nilfs_bmap_delete_block(&btree->bt_bmap, path[level].bp_sib_bh);
+       path[level].bp_sib_bh = NULL;
+       path[level + 1].bp_index++;
+}
+
+static void nilfs_btree_shrink(struct nilfs_btree *btree,
+                              struct nilfs_btree_path *path,
+                              int level, __u64 *keyp, __u64 *ptrp)
+{
+       struct nilfs_btree_node *root, *child;
+       int n;
+
+       nilfs_btree_do_delete(btree, path, level, keyp, ptrp);
+
+       lock_buffer(path[level].bp_bh);
+       root = nilfs_btree_get_root(btree);
+       child = nilfs_btree_get_nonroot_node(btree, path, level);
+
+       nilfs_btree_node_delete(btree, root, NULL, NULL, 0);
+       nilfs_btree_node_set_level(btree, root, level);
+       n = nilfs_btree_node_get_nchildren(btree, child);
+       nilfs_btree_node_move_left(btree, root, child, n);
+       unlock_buffer(path[level].bp_bh);
+
+       nilfs_bmap_delete_block(&btree->bt_bmap, path[level].bp_bh);
+       path[level].bp_bh = NULL;
+}
+
+
+static int nilfs_btree_prepare_delete(struct nilfs_btree *btree,
+                                     struct nilfs_btree_path *path,
+                                     int *levelp,
+                                     struct nilfs_bmap_stats *stats)
+{
+       struct buffer_head *bh;
+       struct nilfs_btree_node *node, *parent, *sib;
+       __u64 sibptr;
+       int pindex, level, ret;
+
+       ret = 0;
+       stats->bs_nblocks = 0;
+       for (level = NILFS_BTREE_LEVEL_NODE_MIN;
+            level < nilfs_btree_height(btree) - 1;
+            level++) {
+               node = nilfs_btree_get_nonroot_node(btree, path, level);
+               path[level].bp_oldreq.bpr_ptr =
+                       nilfs_btree_node_get_ptr(btree, node,
+                                                path[level].bp_index);
+               if (btree->bt_bmap.b_pops->bpop_prepare_end_ptr != NULL) {
+                       ret = btree->bt_bmap.b_pops->bpop_prepare_end_ptr(
+                               &btree->bt_bmap, &path[level].bp_oldreq);
+                       if (ret < 0)
+                               goto err_out_child_node;
+               }
+
+               if (nilfs_btree_node_get_nchildren(btree, node) >
+                   nilfs_btree_node_nchildren_min(btree, node)) {
+                       path[level].bp_op = nilfs_btree_do_delete;
+                       stats->bs_nblocks++;
+                       goto out;
+               }
+
+               parent = nilfs_btree_get_node(btree, path, level + 1);
+               pindex = path[level + 1].bp_index;
+
+               if (pindex > 0) {
+                       /* left sibling */
+                       sibptr = nilfs_btree_node_get_ptr(btree, parent,
+                                                         pindex - 1);
+                       ret = nilfs_bmap_get_block(&btree->bt_bmap, sibptr,
+                                                  &bh);
+                       if (ret < 0)
+                               goto err_out_curr_node;
+                       sib = (struct nilfs_btree_node *)bh->b_data;
+                       if (nilfs_btree_node_get_nchildren(btree, sib) >
+                           nilfs_btree_node_nchildren_min(btree, sib)) {
+                               path[level].bp_sib_bh = bh;
+                               path[level].bp_op = nilfs_btree_borrow_left;
+                               stats->bs_nblocks++;
+                               goto out;
+                       } else {
+                               path[level].bp_sib_bh = bh;
+                               path[level].bp_op = nilfs_btree_concat_left;
+                               stats->bs_nblocks++;
+                               /* continue; */
+                       }
+               } else if (pindex <
+                          nilfs_btree_node_get_nchildren(btree, parent) - 1) {
+                       /* right sibling */
+                       sibptr = nilfs_btree_node_get_ptr(btree, parent,
+                                                         pindex + 1);
+                       ret = nilfs_bmap_get_block(&btree->bt_bmap, sibptr,
+                                                  &bh);
+                       if (ret < 0)
+                               goto err_out_curr_node;
+                       sib = (struct nilfs_btree_node *)bh->b_data;
+                       if (nilfs_btree_node_get_nchildren(btree, sib) >
+                           nilfs_btree_node_nchildren_min(btree, sib)) {
+                               path[level].bp_sib_bh = bh;
+                               path[level].bp_op = nilfs_btree_borrow_right;
+                               stats->bs_nblocks++;
+                               goto out;
+                       } else {
+                               path[level].bp_sib_bh = bh;
+                               path[level].bp_op = nilfs_btree_concat_right;
+                               stats->bs_nblocks++;
+                               /* continue; */
+                       }
+               } else {
+                       /* no siblings */
+                       /* the only child of the root node */
+                       WARN_ON(level != nilfs_btree_height(btree) - 2);
+                       if (nilfs_btree_node_get_nchildren(btree, node) - 1 <=
+                           NILFS_BTREE_ROOT_NCHILDREN_MAX) {
+                               path[level].bp_op = nilfs_btree_shrink;
+                               stats->bs_nblocks += 2;
+                       } else {
+                               path[level].bp_op = nilfs_btree_do_delete;
+                               stats->bs_nblocks++;
+                       }
+
+                       goto out;
+
+               }
+       }
+
+       node = nilfs_btree_get_root(btree);
+       path[level].bp_oldreq.bpr_ptr =
+               nilfs_btree_node_get_ptr(btree, node, path[level].bp_index);
+       if (btree->bt_bmap.b_pops->bpop_prepare_end_ptr != NULL) {
+               ret = btree->bt_bmap.b_pops->bpop_prepare_end_ptr(
+                       &btree->bt_bmap, &path[level].bp_oldreq);
+               if (ret < 0)
+                       goto err_out_child_node;
+       }
+       /* child of the root node is deleted */
+       path[level].bp_op = nilfs_btree_do_delete;
+       stats->bs_nblocks++;
+
+       /* success */
+ out:
+       *levelp = level;
+       return ret;
+
+       /* error */
+ err_out_curr_node:
+       if (btree->bt_bmap.b_pops->bpop_abort_end_ptr != NULL)
+               btree->bt_bmap.b_pops->bpop_abort_end_ptr(
+                       &btree->bt_bmap, &path[level].bp_oldreq);
+ err_out_child_node:
+       for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) {
+               nilfs_bmap_put_block(&btree->bt_bmap, path[level].bp_sib_bh);
+               if (btree->bt_bmap.b_pops->bpop_abort_end_ptr != NULL)
+                       btree->bt_bmap.b_pops->bpop_abort_end_ptr(
+                               &btree->bt_bmap, &path[level].bp_oldreq);
+       }
+       *levelp = level;
+       stats->bs_nblocks = 0;
+       return ret;
+}
+
+static void nilfs_btree_commit_delete(struct nilfs_btree *btree,
+                                     struct nilfs_btree_path *path,
+                                     int maxlevel)
+{
+       int level;
+
+       for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) {
+               if (btree->bt_bmap.b_pops->bpop_commit_end_ptr != NULL)
+                       btree->bt_bmap.b_pops->bpop_commit_end_ptr(
+                               &btree->bt_bmap, &path[level].bp_oldreq);
+               path[level].bp_op(btree, path, level, NULL, NULL);
+       }
+
+       if (!nilfs_bmap_dirty(&btree->bt_bmap))
+               nilfs_bmap_set_dirty(&btree->bt_bmap);
+}
+
+static int nilfs_btree_delete(struct nilfs_bmap *bmap, __u64 key)
+
+{
+       struct nilfs_btree *btree;
+       struct nilfs_btree_path *path;
+       struct nilfs_bmap_stats stats;
+       int level, ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       path = nilfs_btree_alloc_path(btree);
+       if (path == NULL)
+               return -ENOMEM;
+       nilfs_btree_init_path(btree, path);
+       ret = nilfs_btree_do_lookup(btree, path, key, NULL,
+                                   NILFS_BTREE_LEVEL_NODE_MIN);
+       if (ret < 0)
+               goto out;
+
+       ret = nilfs_btree_prepare_delete(btree, path, &level, &stats);
+       if (ret < 0)
+               goto out;
+       nilfs_btree_commit_delete(btree, path, level);
+       nilfs_bmap_sub_blocks(bmap, stats.bs_nblocks);
+
+out:
+       nilfs_btree_clear_path(btree, path);
+       nilfs_btree_free_path(btree, path);
+       return ret;
+}
+
+static int nilfs_btree_last_key(const struct nilfs_bmap *bmap, __u64 *keyp)
+{
+       struct nilfs_btree *btree;
+       struct nilfs_btree_path *path;
+       int ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       path = nilfs_btree_alloc_path(btree);
+       if (path == NULL)
+               return -ENOMEM;
+       nilfs_btree_init_path(btree, path);
+
+       ret = nilfs_btree_do_lookup_last(btree, path, keyp, NULL);
+
+       nilfs_btree_clear_path(btree, path);
+       nilfs_btree_free_path(btree, path);
+
+       return ret;
+}
+
+static int nilfs_btree_check_delete(struct nilfs_bmap *bmap, __u64 key)
+{
+       struct buffer_head *bh;
+       struct nilfs_btree *btree;
+       struct nilfs_btree_node *root, *node;
+       __u64 maxkey, nextmaxkey;
+       __u64 ptr;
+       int nchildren, ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       root = nilfs_btree_get_root(btree);
+       switch (nilfs_btree_height(btree)) {
+       case 2:
+               bh = NULL;
+               node = root;
+               break;
+       case 3:
+               nchildren = nilfs_btree_node_get_nchildren(btree, root);
+               if (nchildren > 1)
+                       return 0;
+               ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
+               ret = nilfs_bmap_get_block(bmap, ptr, &bh);
+               if (ret < 0)
+                       return ret;
+               node = (struct nilfs_btree_node *)bh->b_data;
+               break;
+       default:
+               return 0;
+       }
+
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       maxkey = nilfs_btree_node_get_key(btree, node, nchildren - 1);
+       nextmaxkey = (nchildren > 1) ?
+               nilfs_btree_node_get_key(btree, node, nchildren - 2) : 0;
+       if (bh != NULL)
+               nilfs_bmap_put_block(bmap, bh);
+
+       return (maxkey == key) && (nextmaxkey < bmap->b_low);
+}
+
+static int nilfs_btree_gather_data(struct nilfs_bmap *bmap,
+                                  __u64 *keys, __u64 *ptrs, int nitems)
+{
+       struct buffer_head *bh;
+       struct nilfs_btree *btree;
+       struct nilfs_btree_node *node, *root;
+       __le64 *dkeys;
+       __le64 *dptrs;
+       __u64 ptr;
+       int nchildren, i, ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       root = nilfs_btree_get_root(btree);
+       switch (nilfs_btree_height(btree)) {
+       case 2:
+               bh = NULL;
+               node = root;
+               break;
+       case 3:
+               nchildren = nilfs_btree_node_get_nchildren(btree, root);
+               WARN_ON(nchildren > 1);
+               ptr = nilfs_btree_node_get_ptr(btree, root, nchildren - 1);
+               ret = nilfs_bmap_get_block(bmap, ptr, &bh);
+               if (ret < 0)
+                       return ret;
+               node = (struct nilfs_btree_node *)bh->b_data;
+               break;
+       default:
+               node = NULL;
+               return -EINVAL;
+       }
+
+       nchildren = nilfs_btree_node_get_nchildren(btree, node);
+       if (nchildren < nitems)
+               nitems = nchildren;
+       dkeys = nilfs_btree_node_dkeys(btree, node);
+       dptrs = nilfs_btree_node_dptrs(btree, node);
+       for (i = 0; i < nitems; i++) {
+               keys[i] = nilfs_bmap_dkey_to_key(dkeys[i]);
+               ptrs[i] = nilfs_bmap_dptr_to_ptr(dptrs[i]);
+       }
+
+       if (bh != NULL)
+               nilfs_bmap_put_block(bmap, bh);
+
+       return nitems;
+}
+
+static int
+nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key,
+                                      union nilfs_bmap_ptr_req *dreq,
+                                      union nilfs_bmap_ptr_req *nreq,
+                                      struct buffer_head **bhp,
+                                      struct nilfs_bmap_stats *stats)
+{
+       struct buffer_head *bh;
+       struct nilfs_btree *btree;
+       int ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       stats->bs_nblocks = 0;
+
+       /* for data */
+       /* cannot find near ptr */
+       if (btree->bt_ops->btop_find_target != NULL)
+               dreq->bpr_ptr
+                       = btree->bt_ops->btop_find_target(btree, NULL, key);
+       ret = bmap->b_pops->bpop_prepare_alloc_ptr(bmap, dreq);
+       if (ret < 0)
+               return ret;
+
+       *bhp = NULL;
+       stats->bs_nblocks++;
+       if (nreq != NULL) {
+               nreq->bpr_ptr = dreq->bpr_ptr + 1;
+               ret = bmap->b_pops->bpop_prepare_alloc_ptr(bmap, nreq);
+               if (ret < 0)
+                       goto err_out_dreq;
+
+               ret = nilfs_bmap_get_new_block(bmap, nreq->bpr_ptr, &bh);
+               if (ret < 0)
+                       goto err_out_nreq;
+
+               *bhp = bh;
+               stats->bs_nblocks++;
+       }
+
+       /* success */
+       return 0;
+
+       /* error */
+ err_out_nreq:
+       bmap->b_pops->bpop_abort_alloc_ptr(bmap, nreq);
+ err_out_dreq:
+       bmap->b_pops->bpop_abort_alloc_ptr(bmap, dreq);
+       stats->bs_nblocks = 0;
+       return ret;
+
+}
+
+static void
+nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *bmap,
+                                     __u64 key, __u64 ptr,
+                                     const __u64 *keys, const __u64 *ptrs,
+                                     int n, __u64 low, __u64 high,
+                                     union nilfs_bmap_ptr_req *dreq,
+                                     union nilfs_bmap_ptr_req *nreq,
+                                     struct buffer_head *bh)
+{
+       struct nilfs_btree *btree;
+       struct nilfs_btree_node *node;
+       __u64 tmpptr;
+
+       /* free resources */
+       if (bmap->b_ops->bop_clear != NULL)
+               bmap->b_ops->bop_clear(bmap);
+
+       /* ptr must be a pointer to a buffer head. */
+       set_buffer_nilfs_volatile((struct buffer_head *)((unsigned long)ptr));
+
+       /* convert and insert */
+       btree = (struct nilfs_btree *)bmap;
+       nilfs_btree_init(bmap, low, high);
+       if (nreq != NULL) {
+               if (bmap->b_pops->bpop_commit_alloc_ptr != NULL) {
+                       bmap->b_pops->bpop_commit_alloc_ptr(bmap, dreq);
+                       bmap->b_pops->bpop_commit_alloc_ptr(bmap, nreq);
+               }
+
+               /* create child node at level 1 */
+               lock_buffer(bh);
+               node = (struct nilfs_btree_node *)bh->b_data;
+               nilfs_btree_node_init(btree, node, 0, 1, n, keys, ptrs);
+               nilfs_btree_node_insert(btree, node,
+                                       key, dreq->bpr_ptr, n);
+               if (!buffer_dirty(bh))
+                       nilfs_btnode_mark_dirty(bh);
+               if (!nilfs_bmap_dirty(bmap))
+                       nilfs_bmap_set_dirty(bmap);
+
+               unlock_buffer(bh);
+               nilfs_bmap_put_block(bmap, bh);
+
+               /* create root node at level 2 */
+               node = nilfs_btree_get_root(btree);
+               tmpptr = nreq->bpr_ptr;
+               nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
+                                     2, 1, &keys[0], &tmpptr);
+       } else {
+               if (bmap->b_pops->bpop_commit_alloc_ptr != NULL)
+                       bmap->b_pops->bpop_commit_alloc_ptr(bmap, dreq);
+
+               /* create root node at level 1 */
+               node = nilfs_btree_get_root(btree);
+               nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT,
+                                     1, n, keys, ptrs);
+               nilfs_btree_node_insert(btree, node,
+                                       key, dreq->bpr_ptr, n);
+               if (!nilfs_bmap_dirty(bmap))
+                       nilfs_bmap_set_dirty(bmap);
+       }
+
+       if (btree->bt_ops->btop_set_target != NULL)
+               btree->bt_ops->btop_set_target(btree, key, dreq->bpr_ptr);
+}
+
+/**
+ * nilfs_btree_convert_and_insert -
+ * @bmap:
+ * @key:
+ * @ptr:
+ * @keys:
+ * @ptrs:
+ * @n:
+ * @low:
+ * @high:
+ */
+int nilfs_btree_convert_and_insert(struct nilfs_bmap *bmap,
+                                  __u64 key, __u64 ptr,
+                                  const __u64 *keys, const __u64 *ptrs,
+                                  int n, __u64 low, __u64 high)
+{
+       struct buffer_head *bh;
+       union nilfs_bmap_ptr_req dreq, nreq, *di, *ni;
+       struct nilfs_bmap_stats stats;
+       int ret;
+
+       if (n + 1 <= NILFS_BTREE_ROOT_NCHILDREN_MAX) {
+               di = &dreq;
+               ni = NULL;
+       } else if ((n + 1) <= NILFS_BTREE_NODE_NCHILDREN_MAX(
+                          1 << bmap->b_inode->i_blkbits)) {
+               di = &dreq;
+               ni = &nreq;
+       } else {
+               di = NULL;
+               ni = NULL;
+               BUG();
+       }
+
+       ret = nilfs_btree_prepare_convert_and_insert(bmap, key, di, ni, &bh,
+                                                    &stats);
+       if (ret < 0)
+               return ret;
+       nilfs_btree_commit_convert_and_insert(bmap, key, ptr, keys, ptrs, n,
+                                             low, high, di, ni, bh);
+       nilfs_bmap_add_blocks(bmap, stats.bs_nblocks);
+       return 0;
+}
+
+static int nilfs_btree_propagate_p(struct nilfs_btree *btree,
+                                  struct nilfs_btree_path *path,
+                                  int level,
+                                  struct buffer_head *bh)
+{
+       while ((++level < nilfs_btree_height(btree) - 1) &&
+              !buffer_dirty(path[level].bp_bh))
+               nilfs_btnode_mark_dirty(path[level].bp_bh);
+
+       return 0;
+}
+
+static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree,
+                                       struct nilfs_btree_path *path,
+                                       int level)
+{
+       struct nilfs_btree_node *parent;
+       int ret;
+
+       parent = nilfs_btree_get_node(btree, path, level + 1);
+       path[level].bp_oldreq.bpr_ptr =
+               nilfs_btree_node_get_ptr(btree, parent,
+                                        path[level + 1].bp_index);
+       path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1;
+       ret = nilfs_bmap_prepare_update(&btree->bt_bmap,
+                                       &path[level].bp_oldreq,
+                                       &path[level].bp_newreq);
+       if (ret < 0)
+               return ret;
+
+       if (buffer_nilfs_node(path[level].bp_bh)) {
+               path[level].bp_ctxt.oldkey = path[level].bp_oldreq.bpr_ptr;
+               path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr;
+               path[level].bp_ctxt.bh = path[level].bp_bh;
+               ret = nilfs_btnode_prepare_change_key(
+                       &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
+                       &path[level].bp_ctxt);
+               if (ret < 0) {
+                       nilfs_bmap_abort_update(&btree->bt_bmap,
+                                               &path[level].bp_oldreq,
+                                               &path[level].bp_newreq);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+static void nilfs_btree_commit_update_v(struct nilfs_btree *btree,
+                                       struct nilfs_btree_path *path,
+                                       int level)
+{
+       struct nilfs_btree_node *parent;
+
+       nilfs_bmap_commit_update(&btree->bt_bmap,
+                                &path[level].bp_oldreq,
+                                &path[level].bp_newreq);
+
+       if (buffer_nilfs_node(path[level].bp_bh)) {
+               nilfs_btnode_commit_change_key(
+                       &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
+                       &path[level].bp_ctxt);
+               path[level].bp_bh = path[level].bp_ctxt.bh;
+       }
+       set_buffer_nilfs_volatile(path[level].bp_bh);
+
+       parent = nilfs_btree_get_node(btree, path, level + 1);
+       nilfs_btree_node_set_ptr(btree, parent, path[level + 1].bp_index,
+                                path[level].bp_newreq.bpr_ptr);
+}
+
+static void nilfs_btree_abort_update_v(struct nilfs_btree *btree,
+                                      struct nilfs_btree_path *path,
+                                      int level)
+{
+       nilfs_bmap_abort_update(&btree->bt_bmap,
+                               &path[level].bp_oldreq,
+                               &path[level].bp_newreq);
+       if (buffer_nilfs_node(path[level].bp_bh))
+               nilfs_btnode_abort_change_key(
+                       &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
+                       &path[level].bp_ctxt);
+}
+
+static int nilfs_btree_prepare_propagate_v(struct nilfs_btree *btree,
+                                          struct nilfs_btree_path *path,
+                                          int minlevel,
+                                          int *maxlevelp)
+{
+       int level, ret;
+
+       level = minlevel;
+       if (!buffer_nilfs_volatile(path[level].bp_bh)) {
+               ret = nilfs_btree_prepare_update_v(btree, path, level);
+               if (ret < 0)
+                       return ret;
+       }
+       while ((++level < nilfs_btree_height(btree) - 1) &&
+              !buffer_dirty(path[level].bp_bh)) {
+
+               WARN_ON(buffer_nilfs_volatile(path[level].bp_bh));
+               ret = nilfs_btree_prepare_update_v(btree, path, level);
+               if (ret < 0)
+                       goto out;
+       }
+
+       /* success */
+       *maxlevelp = level - 1;
+       return 0;
+
+       /* error */
+ out:
+       while (--level > minlevel)
+               nilfs_btree_abort_update_v(btree, path, level);
+       if (!buffer_nilfs_volatile(path[level].bp_bh))
+               nilfs_btree_abort_update_v(btree, path, level);
+       return ret;
+}
+
+static void nilfs_btree_commit_propagate_v(struct nilfs_btree *btree,
+                                          struct nilfs_btree_path *path,
+                                          int minlevel,
+                                          int maxlevel,
+                                          struct buffer_head *bh)
+{
+       int level;
+
+       if (!buffer_nilfs_volatile(path[minlevel].bp_bh))
+               nilfs_btree_commit_update_v(btree, path, minlevel);
+
+       for (level = minlevel + 1; level <= maxlevel; level++)
+               nilfs_btree_commit_update_v(btree, path, level);
+}
+
+static int nilfs_btree_propagate_v(struct nilfs_btree *btree,
+                                  struct nilfs_btree_path *path,
+                                  int level,
+                                  struct buffer_head *bh)
+{
+       int maxlevel, ret;
+       struct nilfs_btree_node *parent;
+       __u64 ptr;
+
+       get_bh(bh);
+       path[level].bp_bh = bh;
+       ret = nilfs_btree_prepare_propagate_v(btree, path, level, &maxlevel);
+       if (ret < 0)
+               goto out;
+
+       if (buffer_nilfs_volatile(path[level].bp_bh)) {
+               parent = nilfs_btree_get_node(btree, path, level + 1);
+               ptr = nilfs_btree_node_get_ptr(btree, parent,
+                                              path[level + 1].bp_index);
+               ret = nilfs_bmap_mark_dirty(&btree->bt_bmap, ptr);
+               if (ret < 0)
+                       goto out;
+       }
+
+       nilfs_btree_commit_propagate_v(btree, path, level, maxlevel, bh);
+
+ out:
+       brelse(path[level].bp_bh);
+       path[level].bp_bh = NULL;
+       return ret;
+}
+
+static int nilfs_btree_propagate(const struct nilfs_bmap *bmap,
+                                struct buffer_head *bh)
+{
+       struct nilfs_btree *btree;
+       struct nilfs_btree_path *path;
+       struct nilfs_btree_node *node;
+       __u64 key;
+       int level, ret;
+
+       WARN_ON(!buffer_dirty(bh));
+
+       btree = (struct nilfs_btree *)bmap;
+       path = nilfs_btree_alloc_path(btree);
+       if (path == NULL)
+               return -ENOMEM;
+       nilfs_btree_init_path(btree, path);
+
+       if (buffer_nilfs_node(bh)) {
+               node = (struct nilfs_btree_node *)bh->b_data;
+               key = nilfs_btree_node_get_key(btree, node, 0);
+               level = nilfs_btree_node_get_level(btree, node);
+       } else {
+               key = nilfs_bmap_data_get_key(bmap, bh);
+               level = NILFS_BTREE_LEVEL_DATA;
+       }
+
+       ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
+       if (ret < 0) {
+               if (unlikely(ret == -ENOENT))
+                       printk(KERN_CRIT "%s: key = %llu, level == %d\n",
+                              __func__, (unsigned long long)key, level);
+               goto out;
+       }
+
+       ret = btree->bt_ops->btop_propagate(btree, path, level, bh);
+
+ out:
+       nilfs_btree_clear_path(btree, path);
+       nilfs_btree_free_path(btree, path);
+
+       return ret;
+}
+
+static int nilfs_btree_propagate_gc(const struct nilfs_bmap *bmap,
+                                   struct buffer_head *bh)
+{
+       return nilfs_bmap_mark_dirty(bmap, bh->b_blocknr);
+}
+
+static void nilfs_btree_add_dirty_buffer(struct nilfs_btree *btree,
+                                        struct list_head *lists,
+                                        struct buffer_head *bh)
+{
+       struct list_head *head;
+       struct buffer_head *cbh;
+       struct nilfs_btree_node *node, *cnode;
+       __u64 key, ckey;
+       int level;
+
+       get_bh(bh);
+       node = (struct nilfs_btree_node *)bh->b_data;
+       key = nilfs_btree_node_get_key(btree, node, 0);
+       level = nilfs_btree_node_get_level(btree, node);
+       list_for_each(head, &lists[level]) {
+               cbh = list_entry(head, struct buffer_head, b_assoc_buffers);
+               cnode = (struct nilfs_btree_node *)cbh->b_data;
+               ckey = nilfs_btree_node_get_key(btree, cnode, 0);
+               if (key < ckey)
+                       break;
+       }
+       list_add_tail(&bh->b_assoc_buffers, head);
+}
+
+static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *bmap,
+                                            struct list_head *listp)
+{
+       struct nilfs_btree *btree = (struct nilfs_btree *)bmap;
+       struct address_space *btcache = &NILFS_BMAP_I(bmap)->i_btnode_cache;
+       struct list_head lists[NILFS_BTREE_LEVEL_MAX];
+       struct pagevec pvec;
+       struct buffer_head *bh, *head;
+       pgoff_t index = 0;
+       int level, i;
+
+       for (level = NILFS_BTREE_LEVEL_NODE_MIN;
+            level < NILFS_BTREE_LEVEL_MAX;
+            level++)
+               INIT_LIST_HEAD(&lists[level]);
+
+       pagevec_init(&pvec, 0);
+
+       while (pagevec_lookup_tag(&pvec, btcache, &index, PAGECACHE_TAG_DIRTY,
+                                 PAGEVEC_SIZE)) {
+               for (i = 0; i < pagevec_count(&pvec); i++) {
+                       bh = head = page_buffers(pvec.pages[i]);
+                       do {
+                               if (buffer_dirty(bh))
+                                       nilfs_btree_add_dirty_buffer(btree,
+                                                                    lists, bh);
+                       } while ((bh = bh->b_this_page) != head);
+               }
+               pagevec_release(&pvec);
+               cond_resched();
+       }
+
+       for (level = NILFS_BTREE_LEVEL_NODE_MIN;
+            level < NILFS_BTREE_LEVEL_MAX;
+            level++)
+               list_splice(&lists[level], listp->prev);
+}
+
+static int nilfs_btree_assign_p(struct nilfs_btree *btree,
+                               struct nilfs_btree_path *path,
+                               int level,
+                               struct buffer_head **bh,
+                               sector_t blocknr,
+                               union nilfs_binfo *binfo)
+{
+       struct nilfs_btree_node *parent;
+       __u64 key;
+       __u64 ptr;
+       int ret;
+
+       parent = nilfs_btree_get_node(btree, path, level + 1);
+       ptr = nilfs_btree_node_get_ptr(btree, parent,
+                                      path[level + 1].bp_index);
+       if (buffer_nilfs_node(*bh)) {
+               path[level].bp_ctxt.oldkey = ptr;
+               path[level].bp_ctxt.newkey = blocknr;
+               path[level].bp_ctxt.bh = *bh;
+               ret = nilfs_btnode_prepare_change_key(
+                       &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
+                       &path[level].bp_ctxt);
+               if (ret < 0)
+                       return ret;
+               nilfs_btnode_commit_change_key(
+                       &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache,
+                       &path[level].bp_ctxt);
+               *bh = path[level].bp_ctxt.bh;
+       }
+
+       nilfs_btree_node_set_ptr(btree, parent,
+                                path[level + 1].bp_index, blocknr);
+
+       key = nilfs_btree_node_get_key(btree, parent,
+                                      path[level + 1].bp_index);
+       /* on-disk format */
+       binfo->bi_dat.bi_blkoff = nilfs_bmap_key_to_dkey(key);
+       binfo->bi_dat.bi_level = level;
+
+       return 0;
+}
+
+static int nilfs_btree_assign_v(struct nilfs_btree *btree,
+                               struct nilfs_btree_path *path,
+                               int level,
+                               struct buffer_head **bh,
+                               sector_t blocknr,
+                               union nilfs_binfo *binfo)
+{
+       struct nilfs_btree_node *parent;
+       __u64 key;
+       __u64 ptr;
+       union nilfs_bmap_ptr_req req;
+       int ret;
+
+       parent = nilfs_btree_get_node(btree, path, level + 1);
+       ptr = nilfs_btree_node_get_ptr(btree, parent,
+                                      path[level + 1].bp_index);
+       req.bpr_ptr = ptr;
+       ret = btree->bt_bmap.b_pops->bpop_prepare_start_ptr(&btree->bt_bmap,
+                                                              &req);
+       if (ret < 0)
+               return ret;
+       btree->bt_bmap.b_pops->bpop_commit_start_ptr(&btree->bt_bmap,
+                                                       &req, blocknr);
+
+       key = nilfs_btree_node_get_key(btree, parent,
+                                      path[level + 1].bp_index);
+       /* on-disk format */
+       binfo->bi_v.bi_vblocknr = nilfs_bmap_ptr_to_dptr(ptr);
+       binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key);
+
+       return 0;
+}
+
+static int nilfs_btree_assign(struct nilfs_bmap *bmap,
+                             struct buffer_head **bh,
+                             sector_t blocknr,
+                             union nilfs_binfo *binfo)
+{
+       struct nilfs_btree *btree;
+       struct nilfs_btree_path *path;
+       struct nilfs_btree_node *node;
+       __u64 key;
+       int level, ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       path = nilfs_btree_alloc_path(btree);
+       if (path == NULL)
+               return -ENOMEM;
+       nilfs_btree_init_path(btree, path);
+
+       if (buffer_nilfs_node(*bh)) {
+               node = (struct nilfs_btree_node *)(*bh)->b_data;
+               key = nilfs_btree_node_get_key(btree, node, 0);
+               level = nilfs_btree_node_get_level(btree, node);
+       } else {
+               key = nilfs_bmap_data_get_key(bmap, *bh);
+               level = NILFS_BTREE_LEVEL_DATA;
+       }
+
+       ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1);
+       if (ret < 0) {
+               WARN_ON(ret == -ENOENT);
+               goto out;
+       }
+
+       ret = btree->bt_ops->btop_assign(btree, path, level, bh,
+                                           blocknr, binfo);
+
+ out:
+       nilfs_btree_clear_path(btree, path);
+       nilfs_btree_free_path(btree, path);
+
+       return ret;
+}
+
+static int nilfs_btree_assign_gc(struct nilfs_bmap *bmap,
+                                struct buffer_head **bh,
+                                sector_t blocknr,
+                                union nilfs_binfo *binfo)
+{
+       struct nilfs_btree *btree;
+       struct nilfs_btree_node *node;
+       __u64 key;
+       int ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       ret = nilfs_bmap_move_v(bmap, (*bh)->b_blocknr, blocknr);
+       if (ret < 0)
+               return ret;
+
+       if (buffer_nilfs_node(*bh)) {
+               node = (struct nilfs_btree_node *)(*bh)->b_data;
+               key = nilfs_btree_node_get_key(btree, node, 0);
+       } else
+               key = nilfs_bmap_data_get_key(bmap, *bh);
+
+       /* on-disk format */
+       binfo->bi_v.bi_vblocknr = cpu_to_le64((*bh)->b_blocknr);
+       binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key);
+
+       return 0;
+}
+
+static int nilfs_btree_mark(struct nilfs_bmap *bmap, __u64 key, int level)
+{
+       struct buffer_head *bh;
+       struct nilfs_btree *btree;
+       struct nilfs_btree_path *path;
+       __u64 ptr;
+       int ret;
+
+       btree = (struct nilfs_btree *)bmap;
+       path = nilfs_btree_alloc_path(btree);
+       if (path == NULL)
+               return -ENOMEM;
+       nilfs_btree_init_path(btree, path);
+
+       ret = nilfs_btree_do_lookup(btree, path, key, &ptr, level + 1);
+       if (ret < 0) {
+               WARN_ON(ret == -ENOENT);
+               goto out;
+       }
+       ret = nilfs_bmap_get_block(&btree->bt_bmap, ptr, &bh);
+       if (ret < 0) {
+               WARN_ON(ret == -ENOENT);
+               goto out;
+       }
+
+       if (!buffer_dirty(bh))
+               nilfs_btnode_mark_dirty(bh);
+       nilfs_bmap_put_block(&btree->bt_bmap, bh);
+       if (!nilfs_bmap_dirty(&btree->bt_bmap))
+               nilfs_bmap_set_dirty(&btree->bt_bmap);
+
+ out:
+       nilfs_btree_clear_path(btree, path);
+       nilfs_btree_free_path(btree, path);
+       return ret;
+}
+
+static const struct nilfs_bmap_operations nilfs_btree_ops = {
+       .bop_lookup             =       nilfs_btree_lookup,
+       .bop_insert             =       nilfs_btree_insert,
+       .bop_delete             =       nilfs_btree_delete,
+       .bop_clear              =       NULL,
+
+       .bop_propagate          =       nilfs_btree_propagate,
+
+       .bop_lookup_dirty_buffers =     nilfs_btree_lookup_dirty_buffers,
+
+       .bop_assign             =       nilfs_btree_assign,
+       .bop_mark               =       nilfs_btree_mark,
+
+       .bop_last_key           =       nilfs_btree_last_key,
+       .bop_check_insert       =       NULL,
+       .bop_check_delete       =       nilfs_btree_check_delete,
+       .bop_gather_data        =       nilfs_btree_gather_data,
+};
+
+static const struct nilfs_bmap_operations nilfs_btree_ops_gc = {
+       .bop_lookup             =       NULL,
+       .bop_insert             =       NULL,
+       .bop_delete             =       NULL,
+       .bop_clear              =       NULL,
+
+       .bop_propagate          =       nilfs_btree_propagate_gc,
+
+       .bop_lookup_dirty_buffers =     nilfs_btree_lookup_dirty_buffers,
+
+       .bop_assign             =       nilfs_btree_assign_gc,
+       .bop_mark               =       NULL,
+
+       .bop_last_key           =       NULL,
+       .bop_check_insert       =       NULL,
+       .bop_check_delete       =       NULL,
+       .bop_gather_data        =       NULL,
+};
+
+static const struct nilfs_btree_operations nilfs_btree_ops_v = {
+       .btop_find_target       =       nilfs_btree_find_target_v,
+       .btop_set_target        =       nilfs_btree_set_target_v,
+       .btop_propagate         =       nilfs_btree_propagate_v,
+       .btop_assign            =       nilfs_btree_assign_v,
+};
+
+static const struct nilfs_btree_operations nilfs_btree_ops_p = {
+       .btop_find_target       =       NULL,
+       .btop_set_target        =       NULL,
+       .btop_propagate         =       nilfs_btree_propagate_p,
+       .btop_assign            =       nilfs_btree_assign_p,
+};
+
+int nilfs_btree_init(struct nilfs_bmap *bmap, __u64 low, __u64 high)
+{
+       struct nilfs_btree *btree;
+
+       btree = (struct nilfs_btree *)bmap;
+       bmap->b_ops = &nilfs_btree_ops;
+       bmap->b_low = low;
+       bmap->b_high = high;
+       switch (bmap->b_inode->i_ino) {
+       case NILFS_DAT_INO:
+               btree->bt_ops = &nilfs_btree_ops_p;
+               break;
+       default:
+               btree->bt_ops = &nilfs_btree_ops_v;
+               break;
+       }
+
+       return 0;
+}
+
+void nilfs_btree_init_gc(struct nilfs_bmap *bmap)
+{
+       bmap->b_low = NILFS_BMAP_LARGE_LOW;
+       bmap->b_high = NILFS_BMAP_LARGE_HIGH;
+       bmap->b_ops = &nilfs_btree_ops_gc;
+}
diff --git a/fs/nilfs2/btree.h b/fs/nilfs2/btree.h
new file mode 100644 (file)
index 0000000..4766deb
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * btree.h - NILFS B-tree.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#ifndef _NILFS_BTREE_H
+#define _NILFS_BTREE_H
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include <linux/list.h>
+#include <linux/nilfs2_fs.h>
+#include "btnode.h"
+#include "bmap.h"
+
+struct nilfs_btree;
+struct nilfs_btree_path;
+
+/**
+ * struct nilfs_btree_operations - B-tree operation table
+ */
+struct nilfs_btree_operations {
+       __u64 (*btop_find_target)(const struct nilfs_btree *,
+                                 const struct nilfs_btree_path *, __u64);
+       void (*btop_set_target)(struct nilfs_btree *, __u64, __u64);
+
+       struct the_nilfs *(*btop_get_nilfs)(struct nilfs_btree *);
+
+       int (*btop_propagate)(struct nilfs_btree *,
+                             struct nilfs_btree_path *,
+                             int,
+                             struct buffer_head *);
+       int (*btop_assign)(struct nilfs_btree *,
+                          struct nilfs_btree_path *,
+                          int,
+                          struct buffer_head **,
+                          sector_t,
+                          union nilfs_binfo *);
+};
+
+/**
+ * struct nilfs_btree_node - B-tree node
+ * @bn_flags: flags
+ * @bn_level: level
+ * @bn_nchildren: number of children
+ * @bn_pad: padding
+ */
+struct nilfs_btree_node {
+       __u8 bn_flags;
+       __u8 bn_level;
+       __le16 bn_nchildren;
+       __le32 bn_pad;
+};
+
+/* flags */
+#define NILFS_BTREE_NODE_ROOT  0x01
+
+/* level */
+#define NILFS_BTREE_LEVEL_DATA         0
+#define NILFS_BTREE_LEVEL_NODE_MIN     (NILFS_BTREE_LEVEL_DATA + 1)
+#define NILFS_BTREE_LEVEL_MAX          14
+
+/**
+ * struct nilfs_btree - B-tree structure
+ * @bt_bmap: bmap base structure
+ * @bt_ops: B-tree operation table
+ */
+struct nilfs_btree {
+       struct nilfs_bmap bt_bmap;
+
+       /* B-tree-specific members */
+       const struct nilfs_btree_operations *bt_ops;
+};
+
+
+#define NILFS_BTREE_ROOT_SIZE          NILFS_BMAP_SIZE
+#define NILFS_BTREE_ROOT_NCHILDREN_MAX                                 \
+       ((NILFS_BTREE_ROOT_SIZE - sizeof(struct nilfs_btree_node)) /    \
+        (sizeof(__le64 /* dkey */) + sizeof(__le64 /* dptr */)))
+#define NILFS_BTREE_ROOT_NCHILDREN_MIN 0
+#define NILFS_BTREE_NODE_EXTRA_PAD_SIZE        (sizeof(__le64))
+#define NILFS_BTREE_NODE_NCHILDREN_MAX(nodesize)                       \
+       (((nodesize) - sizeof(struct nilfs_btree_node) -                \
+               NILFS_BTREE_NODE_EXTRA_PAD_SIZE) /                      \
+        (sizeof(__le64 /* dkey */) + sizeof(__le64 /* dptr */)))
+#define NILFS_BTREE_NODE_NCHILDREN_MIN(nodesize)                       \
+       ((NILFS_BTREE_NODE_NCHILDREN_MAX(nodesize) - 1) / 2 + 1)
+#define NILFS_BTREE_KEY_MIN    ((__u64)0)
+#define NILFS_BTREE_KEY_MAX    (~(__u64)0)
+
+
+int nilfs_btree_path_cache_init(void);
+void nilfs_btree_path_cache_destroy(void);
+int nilfs_btree_init(struct nilfs_bmap *, __u64, __u64);
+int nilfs_btree_convert_and_insert(struct nilfs_bmap *, __u64, __u64,
+                                  const __u64 *, const __u64 *,
+                                  int, __u64, __u64);
+void nilfs_btree_init_gc(struct nilfs_bmap *);
+
+#endif /* _NILFS_BTREE_H */
diff --git a/fs/nilfs2/cpfile.c b/fs/nilfs2/cpfile.c
new file mode 100644 (file)
index 0000000..e90b60d
--- /dev/null
@@ -0,0 +1,925 @@
+/*
+ * cpfile.c - NILFS checkpoint file.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/string.h>
+#include <linux/buffer_head.h>
+#include <linux/errno.h>
+#include <linux/nilfs2_fs.h>
+#include "mdt.h"
+#include "cpfile.h"
+
+
+static inline unsigned long
+nilfs_cpfile_checkpoints_per_block(const struct inode *cpfile)
+{
+       return NILFS_MDT(cpfile)->mi_entries_per_block;
+}
+
+/* block number from the beginning of the file */
+static unsigned long
+nilfs_cpfile_get_blkoff(const struct inode *cpfile, __u64 cno)
+{
+       __u64 tcno = cno + NILFS_MDT(cpfile)->mi_first_entry_offset - 1;
+       do_div(tcno, nilfs_cpfile_checkpoints_per_block(cpfile));
+       return (unsigned long)tcno;
+}
+
+/* offset in block */
+static unsigned long
+nilfs_cpfile_get_offset(const struct inode *cpfile, __u64 cno)
+{
+       __u64 tcno = cno + NILFS_MDT(cpfile)->mi_first_entry_offset - 1;
+       return do_div(tcno, nilfs_cpfile_checkpoints_per_block(cpfile));
+}
+
+static unsigned long
+nilfs_cpfile_checkpoints_in_block(const struct inode *cpfile,
+                                 __u64 curr,
+                                 __u64 max)
+{
+       return min_t(__u64,
+                    nilfs_cpfile_checkpoints_per_block(cpfile) -
+                    nilfs_cpfile_get_offset(cpfile, curr),
+                    max - curr);
+}
+
+static inline int nilfs_cpfile_is_in_first(const struct inode *cpfile,
+                                          __u64 cno)
+{
+       return nilfs_cpfile_get_blkoff(cpfile, cno) == 0;
+}
+
+static unsigned int
+nilfs_cpfile_block_add_valid_checkpoints(const struct inode *cpfile,
+                                        struct buffer_head *bh,
+                                        void *kaddr,
+                                        unsigned int n)
+{
+       struct nilfs_checkpoint *cp = kaddr + bh_offset(bh);
+       unsigned int count;
+
+       count = le32_to_cpu(cp->cp_checkpoints_count) + n;
+       cp->cp_checkpoints_count = cpu_to_le32(count);
+       return count;
+}
+
+static unsigned int
+nilfs_cpfile_block_sub_valid_checkpoints(const struct inode *cpfile,
+                                        struct buffer_head *bh,
+                                        void *kaddr,
+                                        unsigned int n)
+{
+       struct nilfs_checkpoint *cp = kaddr + bh_offset(bh);
+       unsigned int count;
+
+       WARN_ON(le32_to_cpu(cp->cp_checkpoints_count) < n);
+       count = le32_to_cpu(cp->cp_checkpoints_count) - n;
+       cp->cp_checkpoints_count = cpu_to_le32(count);
+       return count;
+}
+
+static inline struct nilfs_cpfile_header *
+nilfs_cpfile_block_get_header(const struct inode *cpfile,
+                             struct buffer_head *bh,
+                             void *kaddr)
+{
+       return kaddr + bh_offset(bh);
+}
+
+static struct nilfs_checkpoint *
+nilfs_cpfile_block_get_checkpoint(const struct inode *cpfile, __u64 cno,
+                                 struct buffer_head *bh,
+                                 void *kaddr)
+{
+       return kaddr + bh_offset(bh) + nilfs_cpfile_get_offset(cpfile, cno) *
+               NILFS_MDT(cpfile)->mi_entry_size;
+}
+
+static void nilfs_cpfile_block_init(struct inode *cpfile,
+                                   struct buffer_head *bh,
+                                   void *kaddr)
+{
+       struct nilfs_checkpoint *cp = kaddr + bh_offset(bh);
+       size_t cpsz = NILFS_MDT(cpfile)->mi_entry_size;
+       int n = nilfs_cpfile_checkpoints_per_block(cpfile);
+
+       while (n-- > 0) {
+               nilfs_checkpoint_set_invalid(cp);
+               cp = (void *)cp + cpsz;
+       }
+}
+
+static inline int nilfs_cpfile_get_header_block(struct inode *cpfile,
+                                               struct buffer_head **bhp)
+{
+       return nilfs_mdt_get_block(cpfile, 0, 0, NULL, bhp);
+}
+
+static inline int nilfs_cpfile_get_checkpoint_block(struct inode *cpfile,
+                                                   __u64 cno,
+                                                   int create,
+                                                   struct buffer_head **bhp)
+{
+       return nilfs_mdt_get_block(cpfile,
+                                  nilfs_cpfile_get_blkoff(cpfile, cno),
+                                  create, nilfs_cpfile_block_init, bhp);
+}
+
+static inline int nilfs_cpfile_delete_checkpoint_block(struct inode *cpfile,
+                                                      __u64 cno)
+{
+       return nilfs_mdt_delete_block(cpfile,
+                                     nilfs_cpfile_get_blkoff(cpfile, cno));
+}
+
+/**
+ * nilfs_cpfile_get_checkpoint - get a checkpoint
+ * @cpfile: inode of checkpoint file
+ * @cno: checkpoint number
+ * @create: create flag
+ * @cpp: pointer to a checkpoint
+ * @bhp: pointer to a buffer head
+ *
+ * Description: nilfs_cpfile_get_checkpoint() acquires the checkpoint
+ * specified by @cno. A new checkpoint will be created if @cno is the current
+ * checkpoint number and @create is nonzero.
+ *
+ * Return Value: On success, 0 is returned, and the checkpoint and the
+ * buffer head of the buffer on which the checkpoint is located are stored in
+ * the place pointed by @cpp and @bhp, respectively. On error, one of the
+ * following negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - No such checkpoint.
+ *
+ * %-EINVAL - invalid checkpoint.
+ */
+int nilfs_cpfile_get_checkpoint(struct inode *cpfile,
+                               __u64 cno,
+                               int create,
+                               struct nilfs_checkpoint **cpp,
+                               struct buffer_head **bhp)
+{
+       struct buffer_head *header_bh, *cp_bh;
+       struct nilfs_cpfile_header *header;
+       struct nilfs_checkpoint *cp;
+       void *kaddr;
+       int ret;
+
+       if (unlikely(cno < 1 || cno > nilfs_mdt_cno(cpfile) ||
+                    (cno < nilfs_mdt_cno(cpfile) && create)))
+               return -EINVAL;
+
+       down_write(&NILFS_MDT(cpfile)->mi_sem);
+
+       ret = nilfs_cpfile_get_header_block(cpfile, &header_bh);
+       if (ret < 0)
+               goto out_sem;
+       ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, create, &cp_bh);
+       if (ret < 0)
+               goto out_header;
+       kaddr = kmap(cp_bh->b_page);
+       cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, cp_bh, kaddr);
+       if (nilfs_checkpoint_invalid(cp)) {
+               if (!create) {
+                       kunmap(cp_bh->b_page);
+                       brelse(cp_bh);
+                       ret = -ENOENT;
+                       goto out_header;
+               }
+               /* a newly-created checkpoint */
+               nilfs_checkpoint_clear_invalid(cp);
+               if (!nilfs_cpfile_is_in_first(cpfile, cno))
+                       nilfs_cpfile_block_add_valid_checkpoints(cpfile, cp_bh,
+                                                                kaddr, 1);
+               nilfs_mdt_mark_buffer_dirty(cp_bh);
+
+               kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+               header = nilfs_cpfile_block_get_header(cpfile, header_bh,
+                                                      kaddr);
+               le64_add_cpu(&header->ch_ncheckpoints, 1);
+               kunmap_atomic(kaddr, KM_USER0);
+               nilfs_mdt_mark_buffer_dirty(header_bh);
+               nilfs_mdt_mark_dirty(cpfile);
+       }
+
+       if (cpp != NULL)
+               *cpp = cp;
+       *bhp = cp_bh;
+
+ out_header:
+       brelse(header_bh);
+
+ out_sem:
+       up_write(&NILFS_MDT(cpfile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_cpfile_put_checkpoint - put a checkpoint
+ * @cpfile: inode of checkpoint file
+ * @cno: checkpoint number
+ * @bh: buffer head
+ *
+ * Description: nilfs_cpfile_put_checkpoint() releases the checkpoint
+ * specified by @cno. @bh must be the buffer head which has been returned by
+ * a previous call to nilfs_cpfile_get_checkpoint() with @cno.
+ */
+void nilfs_cpfile_put_checkpoint(struct inode *cpfile, __u64 cno,
+                                struct buffer_head *bh)
+{
+       kunmap(bh->b_page);
+       brelse(bh);
+}
+
+/**
+ * nilfs_cpfile_delete_checkpoints - delete checkpoints
+ * @cpfile: inode of checkpoint file
+ * @start: start checkpoint number
+ * @end: end checkpoint numer
+ *
+ * Description: nilfs_cpfile_delete_checkpoints() deletes the checkpoints in
+ * the period from @start to @end, excluding @end itself. The checkpoints
+ * which have been already deleted are ignored.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-EINVAL - invalid checkpoints.
+ */
+int nilfs_cpfile_delete_checkpoints(struct inode *cpfile,
+                                   __u64 start,
+                                   __u64 end)
+{
+       struct buffer_head *header_bh, *cp_bh;
+       struct nilfs_cpfile_header *header;
+       struct nilfs_checkpoint *cp;
+       size_t cpsz = NILFS_MDT(cpfile)->mi_entry_size;
+       __u64 cno;
+       void *kaddr;
+       unsigned long tnicps;
+       int ret, ncps, nicps, count, i;
+
+       if (unlikely(start == 0 || start > end)) {
+               printk(KERN_ERR "%s: invalid range of checkpoint numbers: "
+                      "[%llu, %llu)\n", __func__,
+                      (unsigned long long)start, (unsigned long long)end);
+               return -EINVAL;
+       }
+
+       /* cannot delete the latest checkpoint */
+       if (start == nilfs_mdt_cno(cpfile) - 1)
+               return -EPERM;
+
+       down_write(&NILFS_MDT(cpfile)->mi_sem);
+
+       ret = nilfs_cpfile_get_header_block(cpfile, &header_bh);
+       if (ret < 0)
+               goto out_sem;
+       tnicps = 0;
+
+       for (cno = start; cno < end; cno += ncps) {
+               ncps = nilfs_cpfile_checkpoints_in_block(cpfile, cno, end);
+               ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh);
+               if (ret < 0) {
+                       if (ret != -ENOENT)
+                               goto out_sem;
+                       /* skip hole */
+                       ret = 0;
+                       continue;
+               }
+
+               kaddr = kmap_atomic(cp_bh->b_page, KM_USER0);
+               cp = nilfs_cpfile_block_get_checkpoint(
+                       cpfile, cno, cp_bh, kaddr);
+               nicps = 0;
+               for (i = 0; i < ncps; i++, cp = (void *)cp + cpsz) {
+                       WARN_ON(nilfs_checkpoint_snapshot(cp));
+                       if (!nilfs_checkpoint_invalid(cp)) {
+                               nilfs_checkpoint_set_invalid(cp);
+                               nicps++;
+                       }
+               }
+               if (nicps > 0) {
+                       tnicps += nicps;
+                       nilfs_mdt_mark_buffer_dirty(cp_bh);
+                       nilfs_mdt_mark_dirty(cpfile);
+                       if (!nilfs_cpfile_is_in_first(cpfile, cno) &&
+                           (count = nilfs_cpfile_block_sub_valid_checkpoints(
+                                   cpfile, cp_bh, kaddr, nicps)) == 0) {
+                               /* make hole */
+                               kunmap_atomic(kaddr, KM_USER0);
+                               brelse(cp_bh);
+                               ret = nilfs_cpfile_delete_checkpoint_block(
+                                       cpfile, cno);
+                               if (ret == 0)
+                                       continue;
+                               printk(KERN_ERR "%s: cannot delete block\n",
+                                      __func__);
+                               goto out_sem;
+                       }
+               }
+
+               kunmap_atomic(kaddr, KM_USER0);
+               brelse(cp_bh);
+       }
+
+       if (tnicps > 0) {
+               kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+               header = nilfs_cpfile_block_get_header(cpfile, header_bh,
+                                                      kaddr);
+               le64_add_cpu(&header->ch_ncheckpoints, -(u64)tnicps);
+               nilfs_mdt_mark_buffer_dirty(header_bh);
+               nilfs_mdt_mark_dirty(cpfile);
+               kunmap_atomic(kaddr, KM_USER0);
+       }
+       brelse(header_bh);
+
+ out_sem:
+       up_write(&NILFS_MDT(cpfile)->mi_sem);
+       return ret;
+}
+
+static void nilfs_cpfile_checkpoint_to_cpinfo(struct inode *cpfile,
+                                             struct nilfs_checkpoint *cp,
+                                             struct nilfs_cpinfo *ci)
+{
+       ci->ci_flags = le32_to_cpu(cp->cp_flags);
+       ci->ci_cno = le64_to_cpu(cp->cp_cno);
+       ci->ci_create = le64_to_cpu(cp->cp_create);
+       ci->ci_nblk_inc = le64_to_cpu(cp->cp_nblk_inc);
+       ci->ci_inodes_count = le64_to_cpu(cp->cp_inodes_count);
+       ci->ci_blocks_count = le64_to_cpu(cp->cp_blocks_count);
+       ci->ci_next = le64_to_cpu(cp->cp_snapshot_list.ssl_next);
+}
+
+static ssize_t nilfs_cpfile_do_get_cpinfo(struct inode *cpfile, __u64 *cnop,
+                                         struct nilfs_cpinfo *ci, size_t nci)
+{
+       struct nilfs_checkpoint *cp;
+       struct buffer_head *bh;
+       size_t cpsz = NILFS_MDT(cpfile)->mi_entry_size;
+       __u64 cur_cno = nilfs_mdt_cno(cpfile), cno = *cnop;
+       void *kaddr;
+       int n, ret;
+       int ncps, i;
+
+       if (cno == 0)
+               return -ENOENT; /* checkpoint number 0 is invalid */
+       down_read(&NILFS_MDT(cpfile)->mi_sem);
+
+       for (n = 0; cno < cur_cno && n < nci; cno += ncps) {
+               ncps = nilfs_cpfile_checkpoints_in_block(cpfile, cno, cur_cno);
+               ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &bh);
+               if (ret < 0) {
+                       if (ret != -ENOENT)
+                               goto out;
+                       continue; /* skip hole */
+               }
+
+               kaddr = kmap_atomic(bh->b_page, KM_USER0);
+               cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, bh, kaddr);
+               for (i = 0; i < ncps && n < nci; i++, cp = (void *)cp + cpsz) {
+                       if (!nilfs_checkpoint_invalid(cp))
+                               nilfs_cpfile_checkpoint_to_cpinfo(
+                                       cpfile, cp, &ci[n++]);
+               }
+               kunmap_atomic(kaddr, KM_USER0);
+               brelse(bh);
+       }
+
+       ret = n;
+       if (n > 0)
+               *cnop = ci[n - 1].ci_cno + 1;
+
+ out:
+       up_read(&NILFS_MDT(cpfile)->mi_sem);
+       return ret;
+}
+
+static ssize_t nilfs_cpfile_do_get_ssinfo(struct inode *cpfile, __u64 *cnop,
+                                         struct nilfs_cpinfo *ci, size_t nci)
+{
+       struct buffer_head *bh;
+       struct nilfs_cpfile_header *header;
+       struct nilfs_checkpoint *cp;
+       __u64 curr = *cnop, next;
+       unsigned long curr_blkoff, next_blkoff;
+       void *kaddr;
+       int n = 0, ret;
+
+       down_read(&NILFS_MDT(cpfile)->mi_sem);
+
+       if (curr == 0) {
+               ret = nilfs_cpfile_get_header_block(cpfile, &bh);
+               if (ret < 0)
+                       goto out;
+               kaddr = kmap_atomic(bh->b_page, KM_USER0);
+               header = nilfs_cpfile_block_get_header(cpfile, bh, kaddr);
+               curr = le64_to_cpu(header->ch_snapshot_list.ssl_next);
+               kunmap_atomic(kaddr, KM_USER0);
+               brelse(bh);
+               if (curr == 0) {
+                       ret = 0;
+                       goto out;
+               }
+       } else if (unlikely(curr == ~(__u64)0)) {
+               ret = 0;
+               goto out;
+       }
+
+       curr_blkoff = nilfs_cpfile_get_blkoff(cpfile, curr);
+       ret = nilfs_cpfile_get_checkpoint_block(cpfile, curr, 0, &bh);
+       if (unlikely(ret < 0)) {
+               if (ret == -ENOENT)
+                       ret = 0; /* No snapshots (started from a hole block) */
+               goto out;
+       }
+       kaddr = kmap_atomic(bh->b_page, KM_USER0);
+       while (n < nci) {
+               cp = nilfs_cpfile_block_get_checkpoint(cpfile, curr, bh, kaddr);
+               curr = ~(__u64)0; /* Terminator */
+               if (unlikely(nilfs_checkpoint_invalid(cp) ||
+                            !nilfs_checkpoint_snapshot(cp)))
+                       break;
+               nilfs_cpfile_checkpoint_to_cpinfo(cpfile, cp, &ci[n++]);
+               next = le64_to_cpu(cp->cp_snapshot_list.ssl_next);
+               if (next == 0)
+                       break; /* reach end of the snapshot list */
+
+               next_blkoff = nilfs_cpfile_get_blkoff(cpfile, next);
+               if (curr_blkoff != next_blkoff) {
+                       kunmap_atomic(kaddr, KM_USER0);
+                       brelse(bh);
+                       ret = nilfs_cpfile_get_checkpoint_block(cpfile, next,
+                                                               0, &bh);
+                       if (unlikely(ret < 0)) {
+                               WARN_ON(ret == -ENOENT);
+                               goto out;
+                       }
+                       kaddr = kmap_atomic(bh->b_page, KM_USER0);
+               }
+               curr = next;
+               curr_blkoff = next_blkoff;
+       }
+       kunmap_atomic(kaddr, KM_USER0);
+       brelse(bh);
+       *cnop = curr;
+       ret = n;
+
+ out:
+       up_read(&NILFS_MDT(cpfile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_cpfile_get_cpinfo -
+ * @cpfile:
+ * @cno:
+ * @ci:
+ * @nci:
+ */
+
+ssize_t nilfs_cpfile_get_cpinfo(struct inode *cpfile, __u64 *cnop, int mode,
+                               struct nilfs_cpinfo *ci, size_t nci)
+{
+       switch (mode) {
+       case NILFS_CHECKPOINT:
+               return nilfs_cpfile_do_get_cpinfo(cpfile, cnop, ci, nci);
+       case NILFS_SNAPSHOT:
+               return nilfs_cpfile_do_get_ssinfo(cpfile, cnop, ci, nci);
+       default:
+               return -EINVAL;
+       }
+}
+
+/**
+ * nilfs_cpfile_delete_checkpoint -
+ * @cpfile:
+ * @cno:
+ */
+int nilfs_cpfile_delete_checkpoint(struct inode *cpfile, __u64 cno)
+{
+       struct nilfs_cpinfo ci;
+       __u64 tcno = cno;
+       ssize_t nci;
+       int ret;
+
+       nci = nilfs_cpfile_do_get_cpinfo(cpfile, &tcno, &ci, 1);
+       if (nci < 0)
+               return nci;
+       else if (nci == 0 || ci.ci_cno != cno)
+               return -ENOENT;
+
+       /* cannot delete the latest checkpoint nor snapshots */
+       ret = nilfs_cpinfo_snapshot(&ci);
+       if (ret < 0)
+               return ret;
+       else if (ret > 0 || cno == nilfs_mdt_cno(cpfile) - 1)
+               return -EPERM;
+
+       return nilfs_cpfile_delete_checkpoints(cpfile, cno, cno + 1);
+}
+
+static struct nilfs_snapshot_list *
+nilfs_cpfile_block_get_snapshot_list(const struct inode *cpfile,
+                                    __u64 cno,
+                                    struct buffer_head *bh,
+                                    void *kaddr)
+{
+       struct nilfs_cpfile_header *header;
+       struct nilfs_checkpoint *cp;
+       struct nilfs_snapshot_list *list;
+
+       if (cno != 0) {
+               cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, bh, kaddr);
+               list = &cp->cp_snapshot_list;
+       } else {
+               header = nilfs_cpfile_block_get_header(cpfile, bh, kaddr);
+               list = &header->ch_snapshot_list;
+       }
+       return list;
+}
+
+static int nilfs_cpfile_set_snapshot(struct inode *cpfile, __u64 cno)
+{
+       struct buffer_head *header_bh, *curr_bh, *prev_bh, *cp_bh;
+       struct nilfs_cpfile_header *header;
+       struct nilfs_checkpoint *cp;
+       struct nilfs_snapshot_list *list;
+       __u64 curr, prev;
+       unsigned long curr_blkoff, prev_blkoff;
+       void *kaddr;
+       int ret;
+
+       if (cno == 0)
+               return -ENOENT; /* checkpoint number 0 is invalid */
+       down_write(&NILFS_MDT(cpfile)->mi_sem);
+
+       ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh);
+       if (ret < 0)
+               goto out_sem;
+       kaddr = kmap_atomic(cp_bh->b_page, KM_USER0);
+       cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, cp_bh, kaddr);
+       if (nilfs_checkpoint_invalid(cp)) {
+               ret = -ENOENT;
+               kunmap_atomic(kaddr, KM_USER0);
+               goto out_cp;
+       }
+       if (nilfs_checkpoint_snapshot(cp)) {
+               ret = 0;
+               kunmap_atomic(kaddr, KM_USER0);
+               goto out_cp;
+       }
+       kunmap_atomic(kaddr, KM_USER0);
+
+       ret = nilfs_cpfile_get_header_block(cpfile, &header_bh);
+       if (ret < 0)
+               goto out_cp;
+       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+       header = nilfs_cpfile_block_get_header(cpfile, header_bh, kaddr);
+       list = &header->ch_snapshot_list;
+       curr_bh = header_bh;
+       get_bh(curr_bh);
+       curr = 0;
+       curr_blkoff = 0;
+       prev = le64_to_cpu(list->ssl_prev);
+       while (prev > cno) {
+               prev_blkoff = nilfs_cpfile_get_blkoff(cpfile, prev);
+               curr = prev;
+               if (curr_blkoff != prev_blkoff) {
+                       kunmap_atomic(kaddr, KM_USER0);
+                       brelse(curr_bh);
+                       ret = nilfs_cpfile_get_checkpoint_block(cpfile, curr,
+                                                               0, &curr_bh);
+                       if (ret < 0)
+                               goto out_header;
+                       kaddr = kmap_atomic(curr_bh->b_page, KM_USER0);
+               }
+               curr_blkoff = prev_blkoff;
+               cp = nilfs_cpfile_block_get_checkpoint(
+                       cpfile, curr, curr_bh, kaddr);
+               list = &cp->cp_snapshot_list;
+               prev = le64_to_cpu(list->ssl_prev);
+       }
+       kunmap_atomic(kaddr, KM_USER0);
+
+       if (prev != 0) {
+               ret = nilfs_cpfile_get_checkpoint_block(cpfile, prev, 0,
+                                                       &prev_bh);
+               if (ret < 0)
+                       goto out_curr;
+       } else {
+               prev_bh = header_bh;
+               get_bh(prev_bh);
+       }
+
+       kaddr = kmap_atomic(curr_bh->b_page, KM_USER0);
+       list = nilfs_cpfile_block_get_snapshot_list(
+               cpfile, curr, curr_bh, kaddr);
+       list->ssl_prev = cpu_to_le64(cno);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       kaddr = kmap_atomic(cp_bh->b_page, KM_USER0);
+       cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, cp_bh, kaddr);
+       cp->cp_snapshot_list.ssl_next = cpu_to_le64(curr);
+       cp->cp_snapshot_list.ssl_prev = cpu_to_le64(prev);
+       nilfs_checkpoint_set_snapshot(cp);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       kaddr = kmap_atomic(prev_bh->b_page, KM_USER0);
+       list = nilfs_cpfile_block_get_snapshot_list(
+               cpfile, prev, prev_bh, kaddr);
+       list->ssl_next = cpu_to_le64(cno);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+       header = nilfs_cpfile_block_get_header(cpfile, header_bh, kaddr);
+       le64_add_cpu(&header->ch_nsnapshots, 1);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nilfs_mdt_mark_buffer_dirty(prev_bh);
+       nilfs_mdt_mark_buffer_dirty(curr_bh);
+       nilfs_mdt_mark_buffer_dirty(cp_bh);
+       nilfs_mdt_mark_buffer_dirty(header_bh);
+       nilfs_mdt_mark_dirty(cpfile);
+
+       brelse(prev_bh);
+
+ out_curr:
+       brelse(curr_bh);
+
+ out_header:
+       brelse(header_bh);
+
+ out_cp:
+       brelse(cp_bh);
+
+ out_sem:
+       up_write(&NILFS_MDT(cpfile)->mi_sem);
+       return ret;
+}
+
+static int nilfs_cpfile_clear_snapshot(struct inode *cpfile, __u64 cno)
+{
+       struct buffer_head *header_bh, *next_bh, *prev_bh, *cp_bh;
+       struct nilfs_cpfile_header *header;
+       struct nilfs_checkpoint *cp;
+       struct nilfs_snapshot_list *list;
+       __u64 next, prev;
+       void *kaddr;
+       int ret;
+
+       if (cno == 0)
+               return -ENOENT; /* checkpoint number 0 is invalid */
+       down_write(&NILFS_MDT(cpfile)->mi_sem);
+
+       ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh);
+       if (ret < 0)
+               goto out_sem;
+       kaddr = kmap_atomic(cp_bh->b_page, KM_USER0);
+       cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, cp_bh, kaddr);
+       if (nilfs_checkpoint_invalid(cp)) {
+               ret = -ENOENT;
+               kunmap_atomic(kaddr, KM_USER0);
+               goto out_cp;
+       }
+       if (!nilfs_checkpoint_snapshot(cp)) {
+               ret = 0;
+               kunmap_atomic(kaddr, KM_USER0);
+               goto out_cp;
+       }
+
+       list = &cp->cp_snapshot_list;
+       next = le64_to_cpu(list->ssl_next);
+       prev = le64_to_cpu(list->ssl_prev);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       ret = nilfs_cpfile_get_header_block(cpfile, &header_bh);
+       if (ret < 0)
+               goto out_cp;
+       if (next != 0) {
+               ret = nilfs_cpfile_get_checkpoint_block(cpfile, next, 0,
+                                                       &next_bh);
+               if (ret < 0)
+                       goto out_header;
+       } else {
+               next_bh = header_bh;
+               get_bh(next_bh);
+       }
+       if (prev != 0) {
+               ret = nilfs_cpfile_get_checkpoint_block(cpfile, prev, 0,
+                                                       &prev_bh);
+               if (ret < 0)
+                       goto out_next;
+       } else {
+               prev_bh = header_bh;
+               get_bh(prev_bh);
+       }
+
+       kaddr = kmap_atomic(next_bh->b_page, KM_USER0);
+       list = nilfs_cpfile_block_get_snapshot_list(
+               cpfile, next, next_bh, kaddr);
+       list->ssl_prev = cpu_to_le64(prev);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       kaddr = kmap_atomic(prev_bh->b_page, KM_USER0);
+       list = nilfs_cpfile_block_get_snapshot_list(
+               cpfile, prev, prev_bh, kaddr);
+       list->ssl_next = cpu_to_le64(next);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       kaddr = kmap_atomic(cp_bh->b_page, KM_USER0);
+       cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, cp_bh, kaddr);
+       cp->cp_snapshot_list.ssl_next = cpu_to_le64(0);
+       cp->cp_snapshot_list.ssl_prev = cpu_to_le64(0);
+       nilfs_checkpoint_clear_snapshot(cp);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+       header = nilfs_cpfile_block_get_header(cpfile, header_bh, kaddr);
+       le64_add_cpu(&header->ch_nsnapshots, -1);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nilfs_mdt_mark_buffer_dirty(next_bh);
+       nilfs_mdt_mark_buffer_dirty(prev_bh);
+       nilfs_mdt_mark_buffer_dirty(cp_bh);
+       nilfs_mdt_mark_buffer_dirty(header_bh);
+       nilfs_mdt_mark_dirty(cpfile);
+
+       brelse(prev_bh);
+
+ out_next:
+       brelse(next_bh);
+
+ out_header:
+       brelse(header_bh);
+
+ out_cp:
+       brelse(cp_bh);
+
+ out_sem:
+       up_write(&NILFS_MDT(cpfile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_cpfile_is_snapshot -
+ * @cpfile: inode of checkpoint file
+ * @cno: checkpoint number
+ *
+ * Description:
+ *
+ * Return Value: On success, 1 is returned if the checkpoint specified by
+ * @cno is a snapshot, or 0 if not. On error, one of the following negative
+ * error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - No such checkpoint.
+ */
+int nilfs_cpfile_is_snapshot(struct inode *cpfile, __u64 cno)
+{
+       struct buffer_head *bh;
+       struct nilfs_checkpoint *cp;
+       void *kaddr;
+       int ret;
+
+       if (cno == 0)
+               return -ENOENT; /* checkpoint number 0 is invalid */
+       down_read(&NILFS_MDT(cpfile)->mi_sem);
+
+       ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &bh);
+       if (ret < 0)
+               goto out;
+       kaddr = kmap_atomic(bh->b_page, KM_USER0);
+       cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, bh, kaddr);
+       ret = nilfs_checkpoint_snapshot(cp);
+       kunmap_atomic(kaddr, KM_USER0);
+       brelse(bh);
+
+ out:
+       up_read(&NILFS_MDT(cpfile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_cpfile_change_cpmode - change checkpoint mode
+ * @cpfile: inode of checkpoint file
+ * @cno: checkpoint number
+ * @status: mode of checkpoint
+ *
+ * Description: nilfs_change_cpmode() changes the mode of the checkpoint
+ * specified by @cno. The mode @mode is NILFS_CHECKPOINT or NILFS_SNAPSHOT.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - No such checkpoint.
+ */
+int nilfs_cpfile_change_cpmode(struct inode *cpfile, __u64 cno, int mode)
+{
+       struct the_nilfs *nilfs;
+       int ret;
+
+       nilfs = NILFS_MDT(cpfile)->mi_nilfs;
+
+       switch (mode) {
+       case NILFS_CHECKPOINT:
+               /*
+                * Check for protecting existing snapshot mounts:
+                * bd_mount_sem is used to make this operation atomic and
+                * exclusive with a new mount job.  Though it doesn't cover
+                * umount, it's enough for the purpose.
+                */
+               down(&nilfs->ns_bdev->bd_mount_sem);
+               if (nilfs_checkpoint_is_mounted(nilfs, cno, 1)) {
+                       /* Current implementation does not have to protect
+                          plain read-only mounts since they are exclusive
+                          with a read/write mount and are protected from the
+                          cleaner. */
+                       ret = -EBUSY;
+               } else
+                       ret = nilfs_cpfile_clear_snapshot(cpfile, cno);
+               up(&nilfs->ns_bdev->bd_mount_sem);
+               return ret;
+       case NILFS_SNAPSHOT:
+               return nilfs_cpfile_set_snapshot(cpfile, cno);
+       default:
+               return -EINVAL;
+       }
+}
+
+/**
+ * nilfs_cpfile_get_stat - get checkpoint statistics
+ * @cpfile: inode of checkpoint file
+ * @stat: pointer to a structure of checkpoint statistics
+ *
+ * Description: nilfs_cpfile_get_stat() returns information about checkpoints.
+ *
+ * Return Value: On success, 0 is returned, and checkpoints information is
+ * stored in the place pointed by @stat. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_cpfile_get_stat(struct inode *cpfile, struct nilfs_cpstat *cpstat)
+{
+       struct buffer_head *bh;
+       struct nilfs_cpfile_header *header;
+       void *kaddr;
+       int ret;
+
+       down_read(&NILFS_MDT(cpfile)->mi_sem);
+
+       ret = nilfs_cpfile_get_header_block(cpfile, &bh);
+       if (ret < 0)
+               goto out_sem;
+       kaddr = kmap_atomic(bh->b_page, KM_USER0);
+       header = nilfs_cpfile_block_get_header(cpfile, bh, kaddr);
+       cpstat->cs_cno = nilfs_mdt_cno(cpfile);
+       cpstat->cs_ncps = le64_to_cpu(header->ch_ncheckpoints);
+       cpstat->cs_nsss = le64_to_cpu(header->ch_nsnapshots);
+       kunmap_atomic(kaddr, KM_USER0);
+       brelse(bh);
+
+ out_sem:
+       up_read(&NILFS_MDT(cpfile)->mi_sem);
+       return ret;
+}
diff --git a/fs/nilfs2/cpfile.h b/fs/nilfs2/cpfile.h
new file mode 100644 (file)
index 0000000..1a8a100
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * cpfile.h - NILFS checkpoint file.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#ifndef _NILFS_CPFILE_H
+#define _NILFS_CPFILE_H
+
+#include <linux/fs.h>
+#include <linux/buffer_head.h>
+#include <linux/nilfs2_fs.h>
+
+#define NILFS_CPFILE_GFP       NILFS_MDT_GFP
+
+
+int nilfs_cpfile_get_checkpoint(struct inode *, __u64, int,
+                               struct nilfs_checkpoint **,
+                               struct buffer_head **);
+void nilfs_cpfile_put_checkpoint(struct inode *, __u64, struct buffer_head *);
+int nilfs_cpfile_delete_checkpoints(struct inode *, __u64, __u64);
+int nilfs_cpfile_delete_checkpoint(struct inode *, __u64);
+int nilfs_cpfile_change_cpmode(struct inode *, __u64, int);
+int nilfs_cpfile_is_snapshot(struct inode *, __u64);
+int nilfs_cpfile_get_stat(struct inode *, struct nilfs_cpstat *);
+ssize_t nilfs_cpfile_get_cpinfo(struct inode *, __u64 *, int,
+                               struct nilfs_cpinfo *, size_t);
+
+#endif /* _NILFS_CPFILE_H */
diff --git a/fs/nilfs2/dat.c b/fs/nilfs2/dat.c
new file mode 100644 (file)
index 0000000..bb8a581
--- /dev/null
@@ -0,0 +1,430 @@
+/*
+ * dat.c - NILFS disk address translation.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include "nilfs.h"
+#include "mdt.h"
+#include "alloc.h"
+#include "dat.h"
+
+
+#define NILFS_CNO_MIN  ((__u64)1)
+#define NILFS_CNO_MAX  (~(__u64)0)
+
+static int nilfs_dat_prepare_entry(struct inode *dat,
+                                  struct nilfs_palloc_req *req, int create)
+{
+       return nilfs_palloc_get_entry_block(dat, req->pr_entry_nr,
+                                           create, &req->pr_entry_bh);
+}
+
+static void nilfs_dat_commit_entry(struct inode *dat,
+                                  struct nilfs_palloc_req *req)
+{
+       nilfs_mdt_mark_buffer_dirty(req->pr_entry_bh);
+       nilfs_mdt_mark_dirty(dat);
+       brelse(req->pr_entry_bh);
+}
+
+static void nilfs_dat_abort_entry(struct inode *dat,
+                                 struct nilfs_palloc_req *req)
+{
+       brelse(req->pr_entry_bh);
+}
+
+int nilfs_dat_prepare_alloc(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       int ret;
+
+       ret = nilfs_palloc_prepare_alloc_entry(dat, req);
+       if (ret < 0)
+               return ret;
+
+       ret = nilfs_dat_prepare_entry(dat, req, 1);
+       if (ret < 0)
+               nilfs_palloc_abort_alloc_entry(dat, req);
+
+       return ret;
+}
+
+void nilfs_dat_commit_alloc(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       struct nilfs_dat_entry *entry;
+       void *kaddr;
+
+       kaddr = kmap_atomic(req->pr_entry_bh->b_page, KM_USER0);
+       entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr,
+                                            req->pr_entry_bh, kaddr);
+       entry->de_start = cpu_to_le64(NILFS_CNO_MIN);
+       entry->de_end = cpu_to_le64(NILFS_CNO_MAX);
+       entry->de_blocknr = cpu_to_le64(0);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nilfs_palloc_commit_alloc_entry(dat, req);
+       nilfs_dat_commit_entry(dat, req);
+}
+
+void nilfs_dat_abort_alloc(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       nilfs_dat_abort_entry(dat, req);
+       nilfs_palloc_abort_alloc_entry(dat, req);
+}
+
+int nilfs_dat_prepare_free(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       int ret;
+
+       ret = nilfs_palloc_prepare_free_entry(dat, req);
+       if (ret < 0)
+               return ret;
+       ret = nilfs_dat_prepare_entry(dat, req, 0);
+       if (ret < 0) {
+               nilfs_palloc_abort_free_entry(dat, req);
+               return ret;
+       }
+       return 0;
+}
+
+void nilfs_dat_commit_free(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       struct nilfs_dat_entry *entry;
+       void *kaddr;
+
+       kaddr = kmap_atomic(req->pr_entry_bh->b_page, KM_USER0);
+       entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr,
+                                            req->pr_entry_bh, kaddr);
+       entry->de_start = cpu_to_le64(NILFS_CNO_MIN);
+       entry->de_end = cpu_to_le64(NILFS_CNO_MIN);
+       entry->de_blocknr = cpu_to_le64(0);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nilfs_dat_commit_entry(dat, req);
+       nilfs_palloc_commit_free_entry(dat, req);
+}
+
+void nilfs_dat_abort_free(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       nilfs_dat_abort_entry(dat, req);
+       nilfs_palloc_abort_free_entry(dat, req);
+}
+
+int nilfs_dat_prepare_start(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       int ret;
+
+       ret = nilfs_dat_prepare_entry(dat, req, 0);
+       WARN_ON(ret == -ENOENT);
+       return ret;
+}
+
+void nilfs_dat_commit_start(struct inode *dat, struct nilfs_palloc_req *req,
+                           sector_t blocknr)
+{
+       struct nilfs_dat_entry *entry;
+       void *kaddr;
+
+       kaddr = kmap_atomic(req->pr_entry_bh->b_page, KM_USER0);
+       entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr,
+                                            req->pr_entry_bh, kaddr);
+       entry->de_start = cpu_to_le64(nilfs_mdt_cno(dat));
+       if (entry->de_blocknr != cpu_to_le64(0) ||
+           entry->de_end != cpu_to_le64(NILFS_CNO_MAX)) {
+               printk(KERN_CRIT
+                      "%s: vbn = %llu, start = %llu, end = %llu, pbn = %llu\n",
+                      __func__, (unsigned long long)req->pr_entry_nr,
+                      (unsigned long long)le64_to_cpu(entry->de_start),
+                      (unsigned long long)le64_to_cpu(entry->de_end),
+                      (unsigned long long)le64_to_cpu(entry->de_blocknr));
+       }
+       entry->de_blocknr = cpu_to_le64(blocknr);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nilfs_dat_commit_entry(dat, req);
+}
+
+void nilfs_dat_abort_start(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       nilfs_dat_abort_entry(dat, req);
+}
+
+int nilfs_dat_prepare_end(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       struct nilfs_dat_entry *entry;
+       __u64 start;
+       sector_t blocknr;
+       void *kaddr;
+       int ret;
+
+       ret = nilfs_dat_prepare_entry(dat, req, 0);
+       if (ret < 0) {
+               WARN_ON(ret == -ENOENT);
+               return ret;
+       }
+
+       kaddr = kmap_atomic(req->pr_entry_bh->b_page, KM_USER0);
+       entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr,
+                                            req->pr_entry_bh, kaddr);
+       start = le64_to_cpu(entry->de_start);
+       blocknr = le64_to_cpu(entry->de_blocknr);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       if (blocknr == 0) {
+               ret = nilfs_palloc_prepare_free_entry(dat, req);
+               if (ret < 0) {
+                       nilfs_dat_abort_entry(dat, req);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+void nilfs_dat_commit_end(struct inode *dat, struct nilfs_palloc_req *req,
+                         int dead)
+{
+       struct nilfs_dat_entry *entry;
+       __u64 start, end;
+       sector_t blocknr;
+       void *kaddr;
+
+       kaddr = kmap_atomic(req->pr_entry_bh->b_page, KM_USER0);
+       entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr,
+                                            req->pr_entry_bh, kaddr);
+       end = start = le64_to_cpu(entry->de_start);
+       if (!dead) {
+               end = nilfs_mdt_cno(dat);
+               WARN_ON(start > end);
+       }
+       entry->de_end = cpu_to_le64(end);
+       blocknr = le64_to_cpu(entry->de_blocknr);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       if (blocknr == 0)
+               nilfs_dat_commit_free(dat, req);
+       else
+               nilfs_dat_commit_entry(dat, req);
+}
+
+void nilfs_dat_abort_end(struct inode *dat, struct nilfs_palloc_req *req)
+{
+       struct nilfs_dat_entry *entry;
+       __u64 start;
+       sector_t blocknr;
+       void *kaddr;
+
+       kaddr = kmap_atomic(req->pr_entry_bh->b_page, KM_USER0);
+       entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr,
+                                            req->pr_entry_bh, kaddr);
+       start = le64_to_cpu(entry->de_start);
+       blocknr = le64_to_cpu(entry->de_blocknr);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       if (start == nilfs_mdt_cno(dat) && blocknr == 0)
+               nilfs_palloc_abort_free_entry(dat, req);
+       nilfs_dat_abort_entry(dat, req);
+}
+
+/**
+ * nilfs_dat_mark_dirty -
+ * @dat: DAT file inode
+ * @vblocknr: virtual block number
+ *
+ * Description:
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_dat_mark_dirty(struct inode *dat, __u64 vblocknr)
+{
+       struct nilfs_palloc_req req;
+       int ret;
+
+       req.pr_entry_nr = vblocknr;
+       ret = nilfs_dat_prepare_entry(dat, &req, 0);
+       if (ret == 0)
+               nilfs_dat_commit_entry(dat, &req);
+       return ret;
+}
+
+/**
+ * nilfs_dat_freev - free virtual block numbers
+ * @dat: DAT file inode
+ * @vblocknrs: array of virtual block numbers
+ * @nitems: number of virtual block numbers
+ *
+ * Description: nilfs_dat_freev() frees the virtual block numbers specified by
+ * @vblocknrs and @nitems.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * nagative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - The virtual block number have not been allocated.
+ */
+int nilfs_dat_freev(struct inode *dat, __u64 *vblocknrs, size_t nitems)
+{
+       return nilfs_palloc_freev(dat, vblocknrs, nitems);
+}
+
+/**
+ * nilfs_dat_move - change a block number
+ * @dat: DAT file inode
+ * @vblocknr: virtual block number
+ * @blocknr: block number
+ *
+ * Description: nilfs_dat_move() changes the block number associated with
+ * @vblocknr to @blocknr.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_dat_move(struct inode *dat, __u64 vblocknr, sector_t blocknr)
+{
+       struct buffer_head *entry_bh;
+       struct nilfs_dat_entry *entry;
+       void *kaddr;
+       int ret;
+
+       ret = nilfs_palloc_get_entry_block(dat, vblocknr, 0, &entry_bh);
+       if (ret < 0)
+               return ret;
+       kaddr = kmap_atomic(entry_bh->b_page, KM_USER0);
+       entry = nilfs_palloc_block_get_entry(dat, vblocknr, entry_bh, kaddr);
+       if (unlikely(entry->de_blocknr == cpu_to_le64(0))) {
+               printk(KERN_CRIT "%s: vbn = %llu, [%llu, %llu)\n", __func__,
+                      (unsigned long long)vblocknr,
+                      (unsigned long long)le64_to_cpu(entry->de_start),
+                      (unsigned long long)le64_to_cpu(entry->de_end));
+               kunmap_atomic(kaddr, KM_USER0);
+               brelse(entry_bh);
+               return -EINVAL;
+       }
+       WARN_ON(blocknr == 0);
+       entry->de_blocknr = cpu_to_le64(blocknr);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nilfs_mdt_mark_buffer_dirty(entry_bh);
+       nilfs_mdt_mark_dirty(dat);
+
+       brelse(entry_bh);
+
+       return 0;
+}
+
+/**
+ * nilfs_dat_translate - translate a virtual block number to a block number
+ * @dat: DAT file inode
+ * @vblocknr: virtual block number
+ * @blocknrp: pointer to a block number
+ *
+ * Description: nilfs_dat_translate() maps the virtual block number @vblocknr
+ * to the corresponding block number.
+ *
+ * Return Value: On success, 0 is returned and the block number associated
+ * with @vblocknr is stored in the place pointed by @blocknrp. On error, one
+ * of the following negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - A block number associated with @vblocknr does not exist.
+ */
+int nilfs_dat_translate(struct inode *dat, __u64 vblocknr, sector_t *blocknrp)
+{
+       struct buffer_head *entry_bh;
+       struct nilfs_dat_entry *entry;
+       sector_t blocknr;
+       void *kaddr;
+       int ret;
+
+       ret = nilfs_palloc_get_entry_block(dat, vblocknr, 0, &entry_bh);
+       if (ret < 0)
+               return ret;
+
+       kaddr = kmap_atomic(entry_bh->b_page, KM_USER0);
+       entry = nilfs_palloc_block_get_entry(dat, vblocknr, entry_bh, kaddr);
+       blocknr = le64_to_cpu(entry->de_blocknr);
+       if (blocknr == 0) {
+               ret = -ENOENT;
+               goto out;
+       }
+       if (blocknrp != NULL)
+               *blocknrp = blocknr;
+
+ out:
+       kunmap_atomic(kaddr, KM_USER0);
+       brelse(entry_bh);
+       return ret;
+}
+
+ssize_t nilfs_dat_get_vinfo(struct inode *dat, struct nilfs_vinfo *vinfo,
+                           size_t nvi)
+{
+       struct buffer_head *entry_bh;
+       struct nilfs_dat_entry *entry;
+       __u64 first, last;
+       void *kaddr;
+       unsigned long entries_per_block = NILFS_MDT(dat)->mi_entries_per_block;
+       int i, j, n, ret;
+
+       for (i = 0; i < nvi; i += n) {
+               ret = nilfs_palloc_get_entry_block(dat, vinfo[i].vi_vblocknr,
+                                                  0, &entry_bh);
+               if (ret < 0)
+                       return ret;
+               kaddr = kmap_atomic(entry_bh->b_page, KM_USER0);
+               /* last virtual block number in this block */
+               first = vinfo[i].vi_vblocknr;
+               do_div(first, entries_per_block);
+               first *= entries_per_block;
+               last = first + entries_per_block - 1;
+               for (j = i, n = 0;
+                    j < nvi && vinfo[j].vi_vblocknr >= first &&
+                            vinfo[j].vi_vblocknr <= last;
+                    j++, n++) {
+                       entry = nilfs_palloc_block_get_entry(
+                               dat, vinfo[j].vi_vblocknr, entry_bh, kaddr);
+                       vinfo[j].vi_start = le64_to_cpu(entry->de_start);
+                       vinfo[j].vi_end = le64_to_cpu(entry->de_end);
+                       vinfo[j].vi_blocknr = le64_to_cpu(entry->de_blocknr);
+               }
+               kunmap_atomic(kaddr, KM_USER0);
+               brelse(entry_bh);
+       }
+
+       return nvi;
+}
diff --git a/fs/nilfs2/dat.h b/fs/nilfs2/dat.h
new file mode 100644 (file)
index 0000000..d956065
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * dat.h - NILFS disk address translation.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#ifndef _NILFS_DAT_H
+#define _NILFS_DAT_H
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include <linux/fs.h>
+
+#define NILFS_DAT_GFP  NILFS_MDT_GFP
+
+struct nilfs_palloc_req;
+
+int nilfs_dat_translate(struct inode *, __u64, sector_t *);
+
+int nilfs_dat_prepare_alloc(struct inode *, struct nilfs_palloc_req *);
+void nilfs_dat_commit_alloc(struct inode *, struct nilfs_palloc_req *);
+void nilfs_dat_abort_alloc(struct inode *, struct nilfs_palloc_req *);
+int nilfs_dat_prepare_start(struct inode *, struct nilfs_palloc_req *);
+void nilfs_dat_commit_start(struct inode *, struct nilfs_palloc_req *,
+                           sector_t);
+void nilfs_dat_abort_start(struct inode *, struct nilfs_palloc_req *);
+int nilfs_dat_prepare_end(struct inode *, struct nilfs_palloc_req *);
+void nilfs_dat_commit_end(struct inode *, struct nilfs_palloc_req *, int);
+void nilfs_dat_abort_end(struct inode *, struct nilfs_palloc_req *);
+
+int nilfs_dat_mark_dirty(struct inode *, __u64);
+int nilfs_dat_freev(struct inode *, __u64 *, size_t);
+int nilfs_dat_move(struct inode *, __u64, sector_t);
+ssize_t nilfs_dat_get_vinfo(struct inode *, struct nilfs_vinfo *, size_t);
+
+#endif /* _NILFS_DAT_H */
diff --git a/fs/nilfs2/dir.c b/fs/nilfs2/dir.c
new file mode 100644 (file)
index 0000000..54100ac
--- /dev/null
@@ -0,0 +1,711 @@
+/*
+ * dir.c - NILFS directory entry operations
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Modified for NILFS by Amagai Yoshiji <amagai@osrg.net>
+ */
+/*
+ *  linux/fs/ext2/dir.c
+ *
+ * Copyright (C) 1992, 1993, 1994, 1995
+ * Remy Card (card@masi.ibp.fr)
+ * Laboratoire MASI - Institut Blaise Pascal
+ * Universite Pierre et Marie Curie (Paris VI)
+ *
+ *  from
+ *
+ *  linux/fs/minix/dir.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ *  ext2 directory handling functions
+ *
+ *  Big-endian to little-endian byte-swapping/bitmaps by
+ *        David S. Miller (davem@caip.rutgers.edu), 1995
+ *
+ * All code that works with directory layout had been switched to pagecache
+ * and moved here. AV
+ */
+
+#include <linux/pagemap.h>
+#include <linux/smp_lock.h>
+#include "nilfs.h"
+#include "page.h"
+
+/*
+ * nilfs uses block-sized chunks. Arguably, sector-sized ones would be
+ * more robust, but we have what we have
+ */
+static inline unsigned nilfs_chunk_size(struct inode *inode)
+{
+       return inode->i_sb->s_blocksize;
+}
+
+static inline void nilfs_put_page(struct page *page)
+{
+       kunmap(page);
+       page_cache_release(page);
+}
+
+static inline unsigned long dir_pages(struct inode *inode)
+{
+       return (inode->i_size+PAGE_CACHE_SIZE-1)>>PAGE_CACHE_SHIFT;
+}
+
+/*
+ * Return the offset into page `page_nr' of the last valid
+ * byte in that page, plus one.
+ */
+static unsigned nilfs_last_byte(struct inode *inode, unsigned long page_nr)
+{
+       unsigned last_byte = inode->i_size;
+
+       last_byte -= page_nr << PAGE_CACHE_SHIFT;
+       if (last_byte > PAGE_CACHE_SIZE)
+               last_byte = PAGE_CACHE_SIZE;
+       return last_byte;
+}
+
+static int nilfs_prepare_chunk_uninterruptible(struct page *page,
+                                              struct address_space *mapping,
+                                              unsigned from, unsigned to)
+{
+       loff_t pos = page_offset(page) + from;
+       return block_write_begin(NULL, mapping, pos, to - from,
+                                AOP_FLAG_UNINTERRUPTIBLE, &page,
+                                NULL, nilfs_get_block);
+}
+
+static int nilfs_prepare_chunk(struct page *page,
+                              struct address_space *mapping,
+                              unsigned from, unsigned to)
+{
+       loff_t pos = page_offset(page) + from;
+       return block_write_begin(NULL, mapping, pos, to - from, 0, &page,
+                                NULL, nilfs_get_block);
+}
+
+static int nilfs_commit_chunk(struct page *page,
+                             struct address_space *mapping,
+                             unsigned from, unsigned to)
+{
+       struct inode *dir = mapping->host;
+       struct nilfs_sb_info *sbi = NILFS_SB(dir->i_sb);
+       loff_t pos = page_offset(page) + from;
+       unsigned len = to - from;
+       unsigned nr_dirty, copied;
+       int err;
+
+       nr_dirty = nilfs_page_count_clean_buffers(page, from, to);
+       copied = block_write_end(NULL, mapping, pos, len, len, page, NULL);
+       if (pos + copied > dir->i_size) {
+               i_size_write(dir, pos + copied);
+               mark_inode_dirty(dir);
+       }
+       if (IS_DIRSYNC(dir))
+               nilfs_set_transaction_flag(NILFS_TI_SYNC);
+       err = nilfs_set_file_dirty(sbi, dir, nr_dirty);
+       unlock_page(page);
+       return err;
+}
+
+static void nilfs_check_page(struct page *page)
+{
+       struct inode *dir = page->mapping->host;
+       struct super_block *sb = dir->i_sb;
+       unsigned chunk_size = nilfs_chunk_size(dir);
+       char *kaddr = page_address(page);
+       unsigned offs, rec_len;
+       unsigned limit = PAGE_CACHE_SIZE;
+       struct nilfs_dir_entry *p;
+       char *error;
+
+       if ((dir->i_size >> PAGE_CACHE_SHIFT) == page->index) {
+               limit = dir->i_size & ~PAGE_CACHE_MASK;
+               if (limit & (chunk_size - 1))
+                       goto Ebadsize;
+               if (!limit)
+                       goto out;
+       }
+       for (offs = 0; offs <= limit - NILFS_DIR_REC_LEN(1); offs += rec_len) {
+               p = (struct nilfs_dir_entry *)(kaddr + offs);
+               rec_len = le16_to_cpu(p->rec_len);
+
+               if (rec_len < NILFS_DIR_REC_LEN(1))
+                       goto Eshort;
+               if (rec_len & 3)
+                       goto Ealign;
+               if (rec_len < NILFS_DIR_REC_LEN(p->name_len))
+                       goto Enamelen;
+               if (((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))
+                       goto Espan;
+       }
+       if (offs != limit)
+               goto Eend;
+out:
+       SetPageChecked(page);
+       return;
+
+       /* Too bad, we had an error */
+
+Ebadsize:
+       nilfs_error(sb, "nilfs_check_page",
+                   "size of directory #%lu is not a multiple of chunk size",
+                   dir->i_ino
+       );
+       goto fail;
+Eshort:
+       error = "rec_len is smaller than minimal";
+       goto bad_entry;
+Ealign:
+       error = "unaligned directory entry";
+       goto bad_entry;
+Enamelen:
+       error = "rec_len is too small for name_len";
+       goto bad_entry;
+Espan:
+       error = "directory entry across blocks";
+bad_entry:
+       nilfs_error(sb, "nilfs_check_page", "bad entry in directory #%lu: %s - "
+                   "offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
+                   dir->i_ino, error, (page->index<<PAGE_CACHE_SHIFT)+offs,
+                   (unsigned long) le64_to_cpu(p->inode),
+                   rec_len, p->name_len);
+       goto fail;
+Eend:
+       p = (struct nilfs_dir_entry *)(kaddr + offs);
+       nilfs_error(sb, "nilfs_check_page",
+                   "entry in directory #%lu spans the page boundary"
+                   "offset=%lu, inode=%lu",
+                   dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,
+                   (unsigned long) le64_to_cpu(p->inode));
+fail:
+       SetPageChecked(page);
+       SetPageError(page);
+}
+
+static struct page *nilfs_get_page(struct inode *dir, unsigned long n)
+{
+       struct address_space *mapping = dir->i_mapping;
+       struct page *page = read_cache_page(mapping, n,
+                               (filler_t *)mapping->a_ops->readpage, NULL);
+       if (!IS_ERR(page)) {
+               wait_on_page_locked(page);
+               kmap(page);
+               if (!PageUptodate(page))
+                       goto fail;
+               if (!PageChecked(page))
+                       nilfs_check_page(page);
+               if (PageError(page))
+                       goto fail;
+       }
+       return page;
+
+fail:
+       nilfs_put_page(page);
+       return ERR_PTR(-EIO);
+}
+
+/*
+ * NOTE! unlike strncmp, nilfs_match returns 1 for success, 0 for failure.
+ *
+ * len <= NILFS_NAME_LEN and de != NULL are guaranteed by caller.
+ */
+static int
+nilfs_match(int len, const char * const name, struct nilfs_dir_entry *de)
+{
+       if (len != de->name_len)
+               return 0;
+       if (!de->inode)
+               return 0;
+       return !memcmp(name, de->name, len);
+}
+
+/*
+ * p is at least 6 bytes before the end of page
+ */
+static struct nilfs_dir_entry *nilfs_next_entry(struct nilfs_dir_entry *p)
+{
+       return (struct nilfs_dir_entry *)((char *)p + le16_to_cpu(p->rec_len));
+}
+
+static unsigned char
+nilfs_filetype_table[NILFS_FT_MAX] = {
+       [NILFS_FT_UNKNOWN]      = DT_UNKNOWN,
+       [NILFS_FT_REG_FILE]     = DT_REG,
+       [NILFS_FT_DIR]          = DT_DIR,
+       [NILFS_FT_CHRDEV]       = DT_CHR,
+       [NILFS_FT_BLKDEV]       = DT_BLK,
+       [NILFS_FT_FIFO]         = DT_FIFO,
+       [NILFS_FT_SOCK]         = DT_SOCK,
+       [NILFS_FT_SYMLINK]      = DT_LNK,
+};
+
+#define S_SHIFT 12
+static unsigned char
+nilfs_type_by_mode[S_IFMT >> S_SHIFT] = {
+       [S_IFREG >> S_SHIFT]    = NILFS_FT_REG_FILE,
+       [S_IFDIR >> S_SHIFT]    = NILFS_FT_DIR,
+       [S_IFCHR >> S_SHIFT]    = NILFS_FT_CHRDEV,
+       [S_IFBLK >> S_SHIFT]    = NILFS_FT_BLKDEV,
+       [S_IFIFO >> S_SHIFT]    = NILFS_FT_FIFO,
+       [S_IFSOCK >> S_SHIFT]   = NILFS_FT_SOCK,
+       [S_IFLNK >> S_SHIFT]    = NILFS_FT_SYMLINK,
+};
+
+static void nilfs_set_de_type(struct nilfs_dir_entry *de, struct inode *inode)
+{
+       mode_t mode = inode->i_mode;
+
+       de->file_type = nilfs_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
+}
+
+static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
+{
+       loff_t pos = filp->f_pos;
+       struct inode *inode = filp->f_dentry->d_inode;
+       struct super_block *sb = inode->i_sb;
+       unsigned int offset = pos & ~PAGE_CACHE_MASK;
+       unsigned long n = pos >> PAGE_CACHE_SHIFT;
+       unsigned long npages = dir_pages(inode);
+/*     unsigned chunk_mask = ~(nilfs_chunk_size(inode)-1); */
+       unsigned char *types = NULL;
+       int ret;
+
+       if (pos > inode->i_size - NILFS_DIR_REC_LEN(1))
+               goto success;
+
+       types = nilfs_filetype_table;
+
+       for ( ; n < npages; n++, offset = 0) {
+               char *kaddr, *limit;
+               struct nilfs_dir_entry *de;
+               struct page *page = nilfs_get_page(inode, n);
+
+               if (IS_ERR(page)) {
+                       nilfs_error(sb, __func__, "bad page in #%lu",
+                                   inode->i_ino);
+                       filp->f_pos += PAGE_CACHE_SIZE - offset;
+                       ret = -EIO;
+                       goto done;
+               }
+               kaddr = page_address(page);
+               de = (struct nilfs_dir_entry *)(kaddr + offset);
+               limit = kaddr + nilfs_last_byte(inode, n) -
+                       NILFS_DIR_REC_LEN(1);
+               for ( ; (char *)de <= limit; de = nilfs_next_entry(de)) {
+                       if (de->rec_len == 0) {
+                               nilfs_error(sb, __func__,
+                                           "zero-length directory entry");
+                               ret = -EIO;
+                               nilfs_put_page(page);
+                               goto done;
+                       }
+                       if (de->inode) {
+                               int over;
+                               unsigned char d_type = DT_UNKNOWN;
+
+                               if (types && de->file_type < NILFS_FT_MAX)
+                                       d_type = types[de->file_type];
+
+                               offset = (char *)de - kaddr;
+                               over = filldir(dirent, de->name, de->name_len,
+                                               (n<<PAGE_CACHE_SHIFT) | offset,
+                                               le64_to_cpu(de->inode), d_type);
+                               if (over) {
+                                       nilfs_put_page(page);
+                                       goto success;
+                               }
+                       }
+                       filp->f_pos += le16_to_cpu(de->rec_len);
+               }
+               nilfs_put_page(page);
+       }
+
+success:
+       ret = 0;
+done:
+       return ret;
+}
+
+/*
+ *     nilfs_find_entry()
+ *
+ * finds an entry in the specified directory with the wanted name. It
+ * returns the page in which the entry was found, and the entry itself
+ * (as a parameter - res_dir). Page is returned mapped and unlocked.
+ * Entry is guaranteed to be valid.
+ */
+struct nilfs_dir_entry *
+nilfs_find_entry(struct inode *dir, struct dentry *dentry,
+                struct page **res_page)
+{
+       const char *name = dentry->d_name.name;
+       int namelen = dentry->d_name.len;
+       unsigned reclen = NILFS_DIR_REC_LEN(namelen);
+       unsigned long start, n;
+       unsigned long npages = dir_pages(dir);
+       struct page *page = NULL;
+       struct nilfs_inode_info *ei = NILFS_I(dir);
+       struct nilfs_dir_entry *de;
+
+       if (npages == 0)
+               goto out;
+
+       /* OFFSET_CACHE */
+       *res_page = NULL;
+
+       start = ei->i_dir_start_lookup;
+       if (start >= npages)
+               start = 0;
+       n = start;
+       do {
+               char *kaddr;
+               page = nilfs_get_page(dir, n);
+               if (!IS_ERR(page)) {
+                       kaddr = page_address(page);
+                       de = (struct nilfs_dir_entry *)kaddr;
+                       kaddr += nilfs_last_byte(dir, n) - reclen;
+                       while ((char *) de <= kaddr) {
+                               if (de->rec_len == 0) {
+                                       nilfs_error(dir->i_sb, __func__,
+                                               "zero-length directory entry");
+                                       nilfs_put_page(page);
+                                       goto out;
+                               }
+                               if (nilfs_match(namelen, name, de))
+                                       goto found;
+                               de = nilfs_next_entry(de);
+                       }
+                       nilfs_put_page(page);
+               }
+               if (++n >= npages)
+                       n = 0;
+               /* next page is past the blocks we've got */
+               if (unlikely(n > (dir->i_blocks >> (PAGE_CACHE_SHIFT - 9)))) {
+                       nilfs_error(dir->i_sb, __func__,
+                              "dir %lu size %lld exceeds block cout %llu",
+                              dir->i_ino, dir->i_size,
+                              (unsigned long long)dir->i_blocks);
+                       goto out;
+               }
+       } while (n != start);
+out:
+       return NULL;
+
+found:
+       *res_page = page;
+       ei->i_dir_start_lookup = n;
+       return de;
+}
+
+struct nilfs_dir_entry *nilfs_dotdot(struct inode *dir, struct page **p)
+{
+       struct page *page = nilfs_get_page(dir, 0);
+       struct nilfs_dir_entry *de = NULL;
+
+       if (!IS_ERR(page)) {
+               de = nilfs_next_entry(
+                       (struct nilfs_dir_entry *)page_address(page));
+               *p = page;
+       }
+       return de;
+}
+
+ino_t nilfs_inode_by_name(struct inode *dir, struct dentry *dentry)
+{
+       ino_t res = 0;
+       struct nilfs_dir_entry *de;
+       struct page *page;
+
+       de = nilfs_find_entry(dir, dentry, &page);
+       if (de) {
+               res = le64_to_cpu(de->inode);
+               kunmap(page);
+               page_cache_release(page);
+       }
+       return res;
+}
+
+/* Releases the page */
+void nilfs_set_link(struct inode *dir, struct nilfs_dir_entry *de,
+                   struct page *page, struct inode *inode)
+{
+       unsigned from = (char *) de - (char *) page_address(page);
+       unsigned to = from + le16_to_cpu(de->rec_len);
+       struct address_space *mapping = page->mapping;
+       int err;
+
+       lock_page(page);
+       err = nilfs_prepare_chunk_uninterruptible(page, mapping, from, to);
+       BUG_ON(err);
+       de->inode = cpu_to_le64(inode->i_ino);
+       nilfs_set_de_type(de, inode);
+       err = nilfs_commit_chunk(page, mapping, from, to);
+       nilfs_put_page(page);
+       dir->i_mtime = dir->i_ctime = CURRENT_TIME;
+/*     NILFS_I(dir)->i_flags &= ~NILFS_BTREE_FL; */
+       mark_inode_dirty(dir);
+}
+
+/*
+ *     Parent is locked.
+ */
+int nilfs_add_link(struct dentry *dentry, struct inode *inode)
+{
+       struct inode *dir = dentry->d_parent->d_inode;
+       const char *name = dentry->d_name.name;
+       int namelen = dentry->d_name.len;
+       unsigned chunk_size = nilfs_chunk_size(dir);
+       unsigned reclen = NILFS_DIR_REC_LEN(namelen);
+       unsigned short rec_len, name_len;
+       struct page *page = NULL;
+       struct nilfs_dir_entry *de;
+       unsigned long npages = dir_pages(dir);
+       unsigned long n;
+       char *kaddr;
+       unsigned from, to;
+       int err;
+
+       /*
+        * We take care of directory expansion in the same loop.
+        * This code plays outside i_size, so it locks the page
+        * to protect that region.
+        */
+       for (n = 0; n <= npages; n++) {
+               char *dir_end;
+
+               page = nilfs_get_page(dir, n);
+               err = PTR_ERR(page);
+               if (IS_ERR(page))
+                       goto out;
+               lock_page(page);
+               kaddr = page_address(page);
+               dir_end = kaddr + nilfs_last_byte(dir, n);
+               de = (struct nilfs_dir_entry *)kaddr;
+               kaddr += PAGE_CACHE_SIZE - reclen;
+               while ((char *)de <= kaddr) {
+                       if ((char *)de == dir_end) {
+                               /* We hit i_size */
+                               name_len = 0;
+                               rec_len = chunk_size;
+                               de->rec_len = cpu_to_le16(chunk_size);
+                               de->inode = 0;
+                               goto got_it;
+                       }
+                       if (de->rec_len == 0) {
+                               nilfs_error(dir->i_sb, __func__,
+                                           "zero-length directory entry");
+                               err = -EIO;
+                               goto out_unlock;
+                       }
+                       err = -EEXIST;
+                       if (nilfs_match(namelen, name, de))
+                               goto out_unlock;
+                       name_len = NILFS_DIR_REC_LEN(de->name_len);
+                       rec_len = le16_to_cpu(de->rec_len);
+                       if (!de->inode && rec_len >= reclen)
+                               goto got_it;
+                       if (rec_len >= name_len + reclen)
+                               goto got_it;
+                       de = (struct nilfs_dir_entry *)((char *)de + rec_len);
+               }
+               unlock_page(page);
+               nilfs_put_page(page);
+       }
+       BUG();
+       return -EINVAL;
+
+got_it:
+       from = (char *)de - (char *)page_address(page);
+       to = from + rec_len;
+       err = nilfs_prepare_chunk(page, page->mapping, from, to);
+       if (err)
+               goto out_unlock;
+       if (de->inode) {
+               struct nilfs_dir_entry *de1;
+
+               de1 = (struct nilfs_dir_entry *)((char *)de + name_len);
+               de1->rec_len = cpu_to_le16(rec_len - name_len);
+               de->rec_len = cpu_to_le16(name_len);
+               de = de1;
+       }
+       de->name_len = namelen;
+       memcpy(de->name, name, namelen);
+       de->inode = cpu_to_le64(inode->i_ino);
+       nilfs_set_de_type(de, inode);
+       err = nilfs_commit_chunk(page, page->mapping, from, to);
+       dir->i_mtime = dir->i_ctime = CURRENT_TIME;
+/*     NILFS_I(dir)->i_flags &= ~NILFS_BTREE_FL; */
+       mark_inode_dirty(dir);
+       /* OFFSET_CACHE */
+out_put:
+       nilfs_put_page(page);
+out:
+       return err;
+out_unlock:
+       unlock_page(page);
+       goto out_put;
+}
+
+/*
+ * nilfs_delete_entry deletes a directory entry by merging it with the
+ * previous entry. Page is up-to-date. Releases the page.
+ */
+int nilfs_delete_entry(struct nilfs_dir_entry *dir, struct page *page)
+{
+       struct address_space *mapping = page->mapping;
+       struct inode *inode = mapping->host;
+       char *kaddr = page_address(page);
+       unsigned from = ((char *)dir - kaddr) & ~(nilfs_chunk_size(inode) - 1);
+       unsigned to = ((char *)dir - kaddr) + le16_to_cpu(dir->rec_len);
+       struct nilfs_dir_entry *pde = NULL;
+       struct nilfs_dir_entry *de = (struct nilfs_dir_entry *)(kaddr + from);
+       int err;
+
+       while ((char *)de < (char *)dir) {
+               if (de->rec_len == 0) {
+                       nilfs_error(inode->i_sb, __func__,
+                                   "zero-length directory entry");
+                       err = -EIO;
+                       goto out;
+               }
+               pde = de;
+               de = nilfs_next_entry(de);
+       }
+       if (pde)
+               from = (char *)pde - (char *)page_address(page);
+       lock_page(page);
+       err = nilfs_prepare_chunk(page, mapping, from, to);
+       BUG_ON(err);
+       if (pde)
+               pde->rec_len = cpu_to_le16(to - from);
+       dir->inode = 0;
+       err = nilfs_commit_chunk(page, mapping, from, to);
+       inode->i_ctime = inode->i_mtime = CURRENT_TIME;
+/*     NILFS_I(inode)->i_flags &= ~NILFS_BTREE_FL; */
+       mark_inode_dirty(inode);
+out:
+       nilfs_put_page(page);
+       return err;
+}
+
+/*
+ * Set the first fragment of directory.
+ */
+int nilfs_make_empty(struct inode *inode, struct inode *parent)
+{
+       struct address_space *mapping = inode->i_mapping;
+       struct page *page = grab_cache_page(mapping, 0);
+       unsigned chunk_size = nilfs_chunk_size(inode);
+       struct nilfs_dir_entry *de;
+       int err;
+       void *kaddr;
+
+       if (!page)
+               return -ENOMEM;
+
+       err = nilfs_prepare_chunk(page, mapping, 0, chunk_size);
+       if (unlikely(err)) {
+               unlock_page(page);
+               goto fail;
+       }
+       kaddr = kmap_atomic(page, KM_USER0);
+       memset(kaddr, 0, chunk_size);
+       de = (struct nilfs_dir_entry *)kaddr;
+       de->name_len = 1;
+       de->rec_len = cpu_to_le16(NILFS_DIR_REC_LEN(1));
+       memcpy(de->name, ".\0\0", 4);
+       de->inode = cpu_to_le64(inode->i_ino);
+       nilfs_set_de_type(de, inode);
+
+       de = (struct nilfs_dir_entry *)(kaddr + NILFS_DIR_REC_LEN(1));
+       de->name_len = 2;
+       de->rec_len = cpu_to_le16(chunk_size - NILFS_DIR_REC_LEN(1));
+       de->inode = cpu_to_le64(parent->i_ino);
+       memcpy(de->name, "..\0", 4);
+       nilfs_set_de_type(de, inode);
+       kunmap_atomic(kaddr, KM_USER0);
+       err = nilfs_commit_chunk(page, mapping, 0, chunk_size);
+fail:
+       page_cache_release(page);
+       return err;
+}
+
+/*
+ * routine to check that the specified directory is empty (for rmdir)
+ */
+int nilfs_empty_dir(struct inode *inode)
+{
+       struct page *page = NULL;
+       unsigned long i, npages = dir_pages(inode);
+
+       for (i = 0; i < npages; i++) {
+               char *kaddr;
+               struct nilfs_dir_entry *de;
+
+               page = nilfs_get_page(inode, i);
+               if (IS_ERR(page))
+                       continue;
+
+               kaddr = page_address(page);
+               de = (struct nilfs_dir_entry *)kaddr;
+               kaddr += nilfs_last_byte(inode, i) - NILFS_DIR_REC_LEN(1);
+
+               while ((char *)de <= kaddr) {
+                       if (de->rec_len == 0) {
+                               nilfs_error(inode->i_sb, __func__,
+                                           "zero-length directory entry "
+                                           "(kaddr=%p, de=%p)\n", kaddr, de);
+                               goto not_empty;
+                       }
+                       if (de->inode != 0) {
+                               /* check for . and .. */
+                               if (de->name[0] != '.')
+                                       goto not_empty;
+                               if (de->name_len > 2)
+                                       goto not_empty;
+                               if (de->name_len < 2) {
+                                       if (de->inode !=
+                                           cpu_to_le64(inode->i_ino))
+                                               goto not_empty;
+                               } else if (de->name[1] != '.')
+                                       goto not_empty;
+                       }
+                       de = nilfs_next_entry(de);
+               }
+               nilfs_put_page(page);
+       }
+       return 1;
+
+not_empty:
+       nilfs_put_page(page);
+       return 0;
+}
+
+struct file_operations nilfs_dir_operations = {
+       .llseek         = generic_file_llseek,
+       .read           = generic_read_dir,
+       .readdir        = nilfs_readdir,
+       .unlocked_ioctl = nilfs_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = nilfs_ioctl,
+#endif /* CONFIG_COMPAT */
+       .fsync          = nilfs_sync_file,
+
+};
diff --git a/fs/nilfs2/direct.c b/fs/nilfs2/direct.c
new file mode 100644 (file)
index 0000000..c6379e4
--- /dev/null
@@ -0,0 +1,436 @@
+/*
+ * direct.c - NILFS direct block pointer.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#include <linux/errno.h>
+#include "nilfs.h"
+#include "page.h"
+#include "direct.h"
+#include "alloc.h"
+
+static inline __le64 *nilfs_direct_dptrs(const struct nilfs_direct *direct)
+{
+       return (__le64 *)
+               ((struct nilfs_direct_node *)direct->d_bmap.b_u.u_data + 1);
+}
+
+static inline __u64
+nilfs_direct_get_ptr(const struct nilfs_direct *direct, __u64 key)
+{
+       return nilfs_bmap_dptr_to_ptr(*(nilfs_direct_dptrs(direct) + key));
+}
+
+static inline void nilfs_direct_set_ptr(struct nilfs_direct *direct,
+                                       __u64 key, __u64 ptr)
+{
+       *(nilfs_direct_dptrs(direct) + key) = nilfs_bmap_ptr_to_dptr(ptr);
+}
+
+static int nilfs_direct_lookup(const struct nilfs_bmap *bmap,
+                              __u64 key, int level, __u64 *ptrp)
+{
+       struct nilfs_direct *direct;
+       __u64 ptr;
+
+       direct = (struct nilfs_direct *)bmap;
+       if ((key > NILFS_DIRECT_KEY_MAX) ||
+           (level != 1) ||     /* XXX: use macro for level 1 */
+           ((ptr = nilfs_direct_get_ptr(direct, key)) ==
+            NILFS_BMAP_INVALID_PTR))
+               return -ENOENT;
+
+       if (ptrp != NULL)
+               *ptrp = ptr;
+       return 0;
+}
+
+static __u64
+nilfs_direct_find_target_v(const struct nilfs_direct *direct, __u64 key)
+{
+       __u64 ptr;
+
+       ptr = nilfs_bmap_find_target_seq(&direct->d_bmap, key);
+       if (ptr != NILFS_BMAP_INVALID_PTR)
+               /* sequential access */
+               return ptr;
+       else
+               /* block group */
+               return nilfs_bmap_find_target_in_group(&direct->d_bmap);
+}
+
+static void nilfs_direct_set_target_v(struct nilfs_direct *direct,
+                                     __u64 key, __u64 ptr)
+{
+       direct->d_bmap.b_last_allocated_key = key;
+       direct->d_bmap.b_last_allocated_ptr = ptr;
+}
+
+static int nilfs_direct_prepare_insert(struct nilfs_direct *direct,
+                                      __u64 key,
+                                      union nilfs_bmap_ptr_req *req,
+                                      struct nilfs_bmap_stats *stats)
+{
+       int ret;
+
+       if (direct->d_ops->dop_find_target != NULL)
+               req->bpr_ptr = direct->d_ops->dop_find_target(direct, key);
+       ret = direct->d_bmap.b_pops->bpop_prepare_alloc_ptr(&direct->d_bmap,
+                                                              req);
+       if (ret < 0)
+               return ret;
+
+       stats->bs_nblocks = 1;
+       return 0;
+}
+
+static void nilfs_direct_commit_insert(struct nilfs_direct *direct,
+                                      union nilfs_bmap_ptr_req *req,
+                                      __u64 key, __u64 ptr)
+{
+       struct buffer_head *bh;
+
+       /* ptr must be a pointer to a buffer head. */
+       bh = (struct buffer_head *)((unsigned long)ptr);
+       set_buffer_nilfs_volatile(bh);
+
+       if (direct->d_bmap.b_pops->bpop_commit_alloc_ptr != NULL)
+               direct->d_bmap.b_pops->bpop_commit_alloc_ptr(
+                       &direct->d_bmap, req);
+       nilfs_direct_set_ptr(direct, key, req->bpr_ptr);
+
+       if (!nilfs_bmap_dirty(&direct->d_bmap))
+               nilfs_bmap_set_dirty(&direct->d_bmap);
+
+       if (direct->d_ops->dop_set_target != NULL)
+               direct->d_ops->dop_set_target(direct, key, req->bpr_ptr);
+}
+
+static int nilfs_direct_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr)
+{
+       struct nilfs_direct *direct;
+       union nilfs_bmap_ptr_req req;
+       struct nilfs_bmap_stats stats;
+       int ret;
+
+       direct = (struct nilfs_direct *)bmap;
+       if (key > NILFS_DIRECT_KEY_MAX)
+               return -ENOENT;
+       if (nilfs_direct_get_ptr(direct, key) != NILFS_BMAP_INVALID_PTR)
+               return -EEXIST;
+
+       ret = nilfs_direct_prepare_insert(direct, key, &req, &stats);
+       if (ret < 0)
+               return ret;
+       nilfs_direct_commit_insert(direct, &req, key, ptr);
+       nilfs_bmap_add_blocks(bmap, stats.bs_nblocks);
+
+       return 0;
+}
+
+static int nilfs_direct_prepare_delete(struct nilfs_direct *direct,
+                                      union nilfs_bmap_ptr_req *req,
+                                      __u64 key,
+                                      struct nilfs_bmap_stats *stats)
+{
+       int ret;
+
+       if (direct->d_bmap.b_pops->bpop_prepare_end_ptr != NULL) {
+               req->bpr_ptr = nilfs_direct_get_ptr(direct, key);
+               ret = direct->d_bmap.b_pops->bpop_prepare_end_ptr(
+                       &direct->d_bmap, req);
+               if (ret < 0)
+                       return ret;
+       }
+
+       stats->bs_nblocks = 1;
+       return 0;
+}
+
+static void nilfs_direct_commit_delete(struct nilfs_direct *direct,
+                                      union nilfs_bmap_ptr_req *req,
+                                      __u64 key)
+{
+       if (direct->d_bmap.b_pops->bpop_commit_end_ptr != NULL)
+               direct->d_bmap.b_pops->bpop_commit_end_ptr(
+                       &direct->d_bmap, req);
+       nilfs_direct_set_ptr(direct, key, NILFS_BMAP_INVALID_PTR);
+}
+
+static int nilfs_direct_delete(struct nilfs_bmap *bmap, __u64 key)
+{
+       struct nilfs_direct *direct;
+       union nilfs_bmap_ptr_req req;
+       struct nilfs_bmap_stats stats;
+       int ret;
+
+       direct = (struct nilfs_direct *)bmap;
+       if ((key > NILFS_DIRECT_KEY_MAX) ||
+           nilfs_direct_get_ptr(direct, key) == NILFS_BMAP_INVALID_PTR)
+               return -ENOENT;
+
+       ret = nilfs_direct_prepare_delete(direct, &req, key, &stats);
+       if (ret < 0)
+               return ret;
+       nilfs_direct_commit_delete(direct, &req, key);
+       nilfs_bmap_sub_blocks(bmap, stats.bs_nblocks);
+
+       return 0;
+}
+
+static int nilfs_direct_last_key(const struct nilfs_bmap *bmap, __u64 *keyp)
+{
+       struct nilfs_direct *direct;
+       __u64 key, lastkey;
+
+       direct = (struct nilfs_direct *)bmap;
+       lastkey = NILFS_DIRECT_KEY_MAX + 1;
+       for (key = NILFS_DIRECT_KEY_MIN; key <= NILFS_DIRECT_KEY_MAX; key++)
+               if (nilfs_direct_get_ptr(direct, key) !=
+                   NILFS_BMAP_INVALID_PTR)
+                       lastkey = key;
+
+       if (lastkey == NILFS_DIRECT_KEY_MAX + 1)
+               return -ENOENT;
+
+       *keyp = lastkey;
+
+       return 0;
+}
+
+static int nilfs_direct_check_insert(const struct nilfs_bmap *bmap, __u64 key)
+{
+       return key > NILFS_DIRECT_KEY_MAX;
+}
+
+static int nilfs_direct_gather_data(struct nilfs_bmap *bmap,
+                                   __u64 *keys, __u64 *ptrs, int nitems)
+{
+       struct nilfs_direct *direct;
+       __u64 key;
+       __u64 ptr;
+       int n;
+
+       direct = (struct nilfs_direct *)bmap;
+       if (nitems > NILFS_DIRECT_NBLOCKS)
+               nitems = NILFS_DIRECT_NBLOCKS;
+       n = 0;
+       for (key = 0; key < nitems; key++) {
+               ptr = nilfs_direct_get_ptr(direct, key);
+               if (ptr != NILFS_BMAP_INVALID_PTR) {
+                       keys[n] = key;
+                       ptrs[n] = ptr;
+                       n++;
+               }
+       }
+       return n;
+}
+
+int nilfs_direct_delete_and_convert(struct nilfs_bmap *bmap,
+                                   __u64 key, __u64 *keys, __u64 *ptrs,
+                                   int n, __u64 low, __u64 high)
+{
+       struct nilfs_direct *direct;
+       __le64 *dptrs;
+       int ret, i, j;
+
+       /* no need to allocate any resource for conversion */
+
+       /* delete */
+       ret = bmap->b_ops->bop_delete(bmap, key);
+       if (ret < 0)
+               return ret;
+
+       /* free resources */
+       if (bmap->b_ops->bop_clear != NULL)
+               bmap->b_ops->bop_clear(bmap);
+
+       /* convert */
+       direct = (struct nilfs_direct *)bmap;
+       dptrs = nilfs_direct_dptrs(direct);
+       for (i = 0, j = 0; i < NILFS_DIRECT_NBLOCKS; i++) {
+               if ((j < n) && (i == keys[j])) {
+                       dptrs[i] = (i != key) ?
+                               nilfs_bmap_ptr_to_dptr(ptrs[j]) :
+                               NILFS_BMAP_INVALID_PTR;
+                       j++;
+               } else
+                       dptrs[i] = NILFS_BMAP_INVALID_PTR;
+       }
+
+       nilfs_direct_init(bmap, low, high);
+
+       return 0;
+}
+
+static int nilfs_direct_propagate_v(struct nilfs_direct *direct,
+                                   struct buffer_head *bh)
+{
+       union nilfs_bmap_ptr_req oldreq, newreq;
+       __u64 key;
+       __u64 ptr;
+       int ret;
+
+       key = nilfs_bmap_data_get_key(&direct->d_bmap, bh);
+       ptr = nilfs_direct_get_ptr(direct, key);
+       if (!buffer_nilfs_volatile(bh)) {
+               oldreq.bpr_ptr = ptr;
+               newreq.bpr_ptr = ptr;
+               ret = nilfs_bmap_prepare_update(&direct->d_bmap, &oldreq,
+                                               &newreq);
+               if (ret < 0)
+                       return ret;
+               nilfs_bmap_commit_update(&direct->d_bmap, &oldreq, &newreq);
+               set_buffer_nilfs_volatile(bh);
+               nilfs_direct_set_ptr(direct, key, newreq.bpr_ptr);
+       } else
+               ret = nilfs_bmap_mark_dirty(&direct->d_bmap, ptr);
+
+       return ret;
+}
+
+static int nilfs_direct_propagate(const struct nilfs_bmap *bmap,
+                                 struct buffer_head *bh)
+{
+       struct nilfs_direct *direct;
+
+       direct = (struct nilfs_direct *)bmap;
+       return (direct->d_ops->dop_propagate != NULL) ?
+               direct->d_ops->dop_propagate(direct, bh) :
+               0;
+}
+
+static int nilfs_direct_assign_v(struct nilfs_direct *direct,
+                                __u64 key, __u64 ptr,
+                                struct buffer_head **bh,
+                                sector_t blocknr,
+                                union nilfs_binfo *binfo)
+{
+       union nilfs_bmap_ptr_req req;
+       int ret;
+
+       req.bpr_ptr = ptr;
+       ret = direct->d_bmap.b_pops->bpop_prepare_start_ptr(
+               &direct->d_bmap, &req);
+       if (ret < 0)
+               return ret;
+       direct->d_bmap.b_pops->bpop_commit_start_ptr(&direct->d_bmap,
+                                                    &req, blocknr);
+
+       binfo->bi_v.bi_vblocknr = nilfs_bmap_ptr_to_dptr(ptr);
+       binfo->bi_v.bi_blkoff = nilfs_bmap_key_to_dkey(key);
+
+       return 0;
+}
+
+static int nilfs_direct_assign_p(struct nilfs_direct *direct,
+                                __u64 key, __u64 ptr,
+                                struct buffer_head **bh,
+                                sector_t blocknr,
+                                union nilfs_binfo *binfo)
+{
+       nilfs_direct_set_ptr(direct, key, blocknr);
+
+       binfo->bi_dat.bi_blkoff = nilfs_bmap_key_to_dkey(key);
+       binfo->bi_dat.bi_level = 0;
+
+       return 0;
+}
+
+static int nilfs_direct_assign(struct nilfs_bmap *bmap,
+                              struct buffer_head **bh,
+                              sector_t blocknr,
+                              union nilfs_binfo *binfo)
+{
+       struct nilfs_direct *direct;
+       __u64 key;
+       __u64 ptr;
+
+       direct = (struct nilfs_direct *)bmap;
+       key = nilfs_bmap_data_get_key(bmap, *bh);
+       if (unlikely(key > NILFS_DIRECT_KEY_MAX)) {
+               printk(KERN_CRIT "%s: invalid key: %llu\n", __func__,
+                      (unsigned long long)key);
+               return -EINVAL;
+       }
+       ptr = nilfs_direct_get_ptr(direct, key);
+       if (unlikely(ptr == NILFS_BMAP_INVALID_PTR)) {
+               printk(KERN_CRIT "%s: invalid pointer: %llu\n", __func__,
+                      (unsigned long long)ptr);
+               return -EINVAL;
+       }
+
+       return direct->d_ops->dop_assign(direct, key, ptr, bh,
+                                        blocknr, binfo);
+}
+
+static const struct nilfs_bmap_operations nilfs_direct_ops = {
+       .bop_lookup             =       nilfs_direct_lookup,
+       .bop_insert             =       nilfs_direct_insert,
+       .bop_delete             =       nilfs_direct_delete,
+       .bop_clear              =       NULL,
+
+       .bop_propagate          =       nilfs_direct_propagate,
+
+       .bop_lookup_dirty_buffers       =       NULL,
+
+       .bop_assign             =       nilfs_direct_assign,
+       .bop_mark               =       NULL,
+
+       .bop_last_key           =       nilfs_direct_last_key,
+       .bop_check_insert       =       nilfs_direct_check_insert,
+       .bop_check_delete       =       NULL,
+       .bop_gather_data        =       nilfs_direct_gather_data,
+};
+
+
+static const struct nilfs_direct_operations nilfs_direct_ops_v = {
+       .dop_find_target        =       nilfs_direct_find_target_v,
+       .dop_set_target         =       nilfs_direct_set_target_v,
+       .dop_propagate          =       nilfs_direct_propagate_v,
+       .dop_assign             =       nilfs_direct_assign_v,
+};
+
+static const struct nilfs_direct_operations nilfs_direct_ops_p = {
+       .dop_find_target        =       NULL,
+       .dop_set_target         =       NULL,
+       .dop_propagate          =       NULL,
+       .dop_assign             =       nilfs_direct_assign_p,
+};
+
+int nilfs_direct_init(struct nilfs_bmap *bmap, __u64 low, __u64 high)
+{
+       struct nilfs_direct *direct;
+
+       direct = (struct nilfs_direct *)bmap;
+       bmap->b_ops = &nilfs_direct_ops;
+       bmap->b_low = low;
+       bmap->b_high = high;
+       switch (bmap->b_inode->i_ino) {
+       case NILFS_DAT_INO:
+               direct->d_ops = &nilfs_direct_ops_p;
+               break;
+       default:
+               direct->d_ops = &nilfs_direct_ops_v;
+               break;
+       }
+
+       return 0;
+}
diff --git a/fs/nilfs2/direct.h b/fs/nilfs2/direct.h
new file mode 100644 (file)
index 0000000..45d2c5c
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * direct.h - NILFS direct block pointer.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#ifndef _NILFS_DIRECT_H
+#define _NILFS_DIRECT_H
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include "bmap.h"
+
+
+struct nilfs_direct;
+
+/**
+ * struct nilfs_direct_operations - direct mapping operation table
+ */
+struct nilfs_direct_operations {
+       __u64 (*dop_find_target)(const struct nilfs_direct *, __u64);
+       void (*dop_set_target)(struct nilfs_direct *, __u64, __u64);
+       int (*dop_propagate)(struct nilfs_direct *, struct buffer_head *);
+       int (*dop_assign)(struct nilfs_direct *, __u64, __u64,
+                         struct buffer_head **, sector_t,
+                         union nilfs_binfo *);
+};
+
+/**
+ * struct nilfs_direct_node - direct node
+ * @dn_flags: flags
+ * @dn_pad: padding
+ */
+struct nilfs_direct_node {
+       __u8 dn_flags;
+       __u8 pad[7];
+};
+
+/**
+ * struct nilfs_direct - direct mapping
+ * @d_bmap: bmap structure
+ * @d_ops: direct mapping operation table
+ */
+struct nilfs_direct {
+       struct nilfs_bmap d_bmap;
+
+       /* direct-mapping-specific members */
+       const struct nilfs_direct_operations *d_ops;
+};
+
+
+#define NILFS_DIRECT_NBLOCKS   (NILFS_BMAP_SIZE / sizeof(__le64) - 1)
+#define NILFS_DIRECT_KEY_MIN   0
+#define NILFS_DIRECT_KEY_MAX   (NILFS_DIRECT_NBLOCKS - 1)
+
+
+int nilfs_direct_init(struct nilfs_bmap *, __u64, __u64);
+int nilfs_direct_delete_and_convert(struct nilfs_bmap *, __u64, __u64 *,
+                                   __u64 *, int, __u64, __u64);
+
+
+#endif /* _NILFS_DIRECT_H */
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c
new file mode 100644 (file)
index 0000000..6bd84a0
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * file.c - NILFS regular file handling primitives including fsync().
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Amagai Yoshiji <amagai@osrg.net>,
+ *            Ryusuke Konishi <ryusuke@osrg.net>
+ */
+
+#include <linux/fs.h>
+#include <linux/mm.h>
+#include <linux/writeback.h>
+#include "nilfs.h"
+#include "segment.h"
+
+int nilfs_sync_file(struct file *file, struct dentry *dentry, int datasync)
+{
+       /*
+        * Called from fsync() system call
+        * This is the only entry point that can catch write and synch
+        * timing for both data blocks and intermediate blocks.
+        *
+        * This function should be implemented when the writeback function
+        * will be implemented.
+        */
+       struct inode *inode = dentry->d_inode;
+       int err;
+
+       if (!nilfs_inode_dirty(inode))
+               return 0;
+
+       if (datasync)
+               err = nilfs_construct_dsync_segment(inode->i_sb, inode, 0,
+                                                   LLONG_MAX);
+       else
+               err = nilfs_construct_segment(inode->i_sb);
+
+       return err;
+}
+
+static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+{
+       struct page *page = vmf->page;
+       struct inode *inode = vma->vm_file->f_dentry->d_inode;
+       struct nilfs_transaction_info ti;
+       int ret;
+
+       if (unlikely(nilfs_near_disk_full(NILFS_SB(inode->i_sb)->s_nilfs)))
+               return VM_FAULT_SIGBUS; /* -ENOSPC */
+
+       lock_page(page);
+       if (page->mapping != inode->i_mapping ||
+           page_offset(page) >= i_size_read(inode) || !PageUptodate(page)) {
+               unlock_page(page);
+               return VM_FAULT_NOPAGE; /* make the VM retry the fault */
+       }
+
+       /*
+        * check to see if the page is mapped already (no holes)
+        */
+       if (PageMappedToDisk(page)) {
+               unlock_page(page);
+               goto mapped;
+       }
+       if (page_has_buffers(page)) {
+               struct buffer_head *bh, *head;
+               int fully_mapped = 1;
+
+               bh = head = page_buffers(page);
+               do {
+                       if (!buffer_mapped(bh)) {
+                               fully_mapped = 0;
+                               break;
+                       }
+               } while (bh = bh->b_this_page, bh != head);
+
+               if (fully_mapped) {
+                       SetPageMappedToDisk(page);
+                       unlock_page(page);
+                       goto mapped;
+               }
+       }
+       unlock_page(page);
+
+       /*
+        * fill hole blocks
+        */
+       ret = nilfs_transaction_begin(inode->i_sb, &ti, 1);
+       /* never returns -ENOMEM, but may return -ENOSPC */
+       if (unlikely(ret))
+               return VM_FAULT_SIGBUS;
+
+       ret = block_page_mkwrite(vma, vmf, nilfs_get_block);
+       if (unlikely(ret)) {
+               nilfs_transaction_abort(inode->i_sb);
+               return ret;
+       }
+       nilfs_transaction_commit(inode->i_sb);
+
+ mapped:
+       SetPageChecked(page);
+       wait_on_page_writeback(page);
+       return 0;
+}
+
+struct vm_operations_struct nilfs_file_vm_ops = {
+       .fault          = filemap_fault,
+       .page_mkwrite   = nilfs_page_mkwrite,
+};
+
+static int nilfs_file_mmap(struct file *file, struct vm_area_struct *vma)
+{
+       file_accessed(file);
+       vma->vm_ops = &nilfs_file_vm_ops;
+       vma->vm_flags |= VM_CAN_NONLINEAR;
+       return 0;
+}
+
+/*
+ * We have mostly NULL's here: the current defaults are ok for
+ * the nilfs filesystem.
+ */
+struct file_operations nilfs_file_operations = {
+       .llseek         = generic_file_llseek,
+       .read           = do_sync_read,
+       .write          = do_sync_write,
+       .aio_read       = generic_file_aio_read,
+       .aio_write      = generic_file_aio_write,
+       .unlocked_ioctl = nilfs_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = nilfs_ioctl,
+#endif /* CONFIG_COMPAT */
+       .mmap           = nilfs_file_mmap,
+       .open           = generic_file_open,
+       /* .release     = nilfs_release_file, */
+       .fsync          = nilfs_sync_file,
+       .splice_read    = generic_file_splice_read,
+};
+
+struct inode_operations nilfs_file_inode_operations = {
+       .truncate       = nilfs_truncate,
+       .setattr        = nilfs_setattr,
+       .permission     = nilfs_permission,
+};
+
+/* end of file */
diff --git a/fs/nilfs2/gcdat.c b/fs/nilfs2/gcdat.c
new file mode 100644 (file)
index 0000000..93383c5
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * gcdat.c - NILFS shadow DAT inode for GC
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Seiji Kihara <kihara@osrg.net>, Amagai Yoshiji <amagai@osrg.net>,
+ *            and Ryusuke Konishi <ryusuke@osrg.net>.
+ *
+ */
+
+#include <linux/buffer_head.h>
+#include "nilfs.h"
+#include "page.h"
+#include "mdt.h"
+
+int nilfs_init_gcdat_inode(struct the_nilfs *nilfs)
+{
+       struct inode *dat = nilfs->ns_dat, *gcdat = nilfs->ns_gc_dat;
+       struct nilfs_inode_info *dii = NILFS_I(dat), *gii = NILFS_I(gcdat);
+       int err;
+
+       gcdat->i_state = 0;
+       gcdat->i_blocks = dat->i_blocks;
+       gii->i_flags = dii->i_flags;
+       gii->i_state = dii->i_state | (1 << NILFS_I_GCDAT);
+       gii->i_cno = 0;
+       nilfs_bmap_init_gcdat(gii->i_bmap, dii->i_bmap);
+       err = nilfs_copy_dirty_pages(gcdat->i_mapping, dat->i_mapping);
+       if (unlikely(err))
+               return err;
+
+       return nilfs_copy_dirty_pages(&gii->i_btnode_cache,
+                                     &dii->i_btnode_cache);
+}
+
+void nilfs_commit_gcdat_inode(struct the_nilfs *nilfs)
+{
+       struct inode *dat = nilfs->ns_dat, *gcdat = nilfs->ns_gc_dat;
+       struct nilfs_inode_info *dii = NILFS_I(dat), *gii = NILFS_I(gcdat);
+       struct address_space *mapping = dat->i_mapping;
+       struct address_space *gmapping = gcdat->i_mapping;
+
+       down_write(&NILFS_MDT(dat)->mi_sem);
+       dat->i_blocks = gcdat->i_blocks;
+       dii->i_flags = gii->i_flags;
+       dii->i_state = gii->i_state & ~(1 << NILFS_I_GCDAT);
+
+       nilfs_bmap_commit_gcdat(gii->i_bmap, dii->i_bmap);
+
+       nilfs_clear_dirty_pages(mapping);
+       nilfs_copy_back_pages(mapping, gmapping);
+       /* note: mdt dirty flags should be cleared by segctor. */
+
+       nilfs_clear_dirty_pages(&dii->i_btnode_cache);
+       nilfs_copy_back_pages(&dii->i_btnode_cache, &gii->i_btnode_cache);
+
+       up_write(&NILFS_MDT(dat)->mi_sem);
+}
+
+void nilfs_clear_gcdat_inode(struct the_nilfs *nilfs)
+{
+       struct inode *gcdat = nilfs->ns_gc_dat;
+       struct nilfs_inode_info *gii = NILFS_I(gcdat);
+
+       gcdat->i_state = I_CLEAR;
+       gii->i_flags = 0;
+
+       truncate_inode_pages(gcdat->i_mapping, 0);
+       truncate_inode_pages(&gii->i_btnode_cache, 0);
+}
diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c
new file mode 100644 (file)
index 0000000..19d2102
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * gcinode.c - dummy inodes to buffer blocks for garbage collection
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Seiji Kihara <kihara@osrg.net>, Amagai Yoshiji <amagai@osrg.net>,
+ *            and Ryusuke Konishi <ryusuke@osrg.net>.
+ * Revised by Ryusuke Konishi <ryusuke@osrg.net>.
+ *
+ */
+/*
+ * This file adds the cache of on-disk blocks to be moved in garbage
+ * collection.  The disk blocks are held with dummy inodes (called
+ * gcinodes), and this file provides lookup function of the dummy
+ * inodes and their buffer read function.
+ *
+ * Since NILFS2 keeps up multiple checkpoints/snapshots accross GC, it
+ * has to treat blocks that belong to a same file but have different
+ * checkpoint numbers.  To avoid interference among generations, dummy
+ * inodes are managed separatly from actual inodes, and their lookup
+ * function (nilfs_gc_iget) is designed to be specified with a
+ * checkpoint number argument as well as an inode number.
+ *
+ * Buffers and pages held by the dummy inodes will be released each
+ * time after they are copied to a new log.  Dirty blocks made on the
+ * current generation and the blocks to be moved by GC never overlap
+ * because the dirty blocks make a new generation; they rather must be
+ * written individually.
+ */
+
+#include <linux/buffer_head.h>
+#include <linux/mpage.h>
+#include <linux/hash.h>
+#include <linux/swap.h>
+#include "nilfs.h"
+#include "page.h"
+#include "mdt.h"
+#include "dat.h"
+#include "ifile.h"
+
+static struct address_space_operations def_gcinode_aops = {};
+/* XXX need def_gcinode_iops/fops? */
+
+/*
+ * nilfs_gccache_submit_read_data() - add data buffer and submit read request
+ * @inode - gc inode
+ * @blkoff - dummy offset treated as the key for the page cache
+ * @pbn - physical block number of the block
+ * @vbn - virtual block number of the block, 0 for non-virtual block
+ * @out_bh - indirect pointer to a buffer_head struct to receive the results
+ *
+ * Description: nilfs_gccache_submit_read_data() registers the data buffer
+ * specified by @pbn to the GC pagecache with the key @blkoff.
+ * This function sets @vbn (@pbn if @vbn is zero) in b_blocknr of the buffer.
+ *
+ * Return Value: On success, 0 is returned. On Error, one of the following
+ * negative error code is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - The block specified with @pbn does not exist.
+ */
+int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff,
+                                  sector_t pbn, __u64 vbn,
+                                  struct buffer_head **out_bh)
+{
+       struct buffer_head *bh;
+       int err;
+
+       bh = nilfs_grab_buffer(inode, inode->i_mapping, blkoff, 0);
+       if (unlikely(!bh))
+               return -ENOMEM;
+
+       if (buffer_uptodate(bh))
+               goto out;
+
+       if (pbn == 0) {
+               struct inode *dat_inode = NILFS_I_NILFS(inode)->ns_dat;
+                                         /* use original dat, not gc dat. */
+               err = nilfs_dat_translate(dat_inode, vbn, &pbn);
+               if (unlikely(err)) { /* -EIO, -ENOMEM, -ENOENT */
+                       brelse(bh);
+                       goto failed;
+               }
+       }
+
+       lock_buffer(bh);
+       if (buffer_uptodate(bh)) {
+               unlock_buffer(bh);
+               goto out;
+       }
+
+       if (!buffer_mapped(bh)) {
+               bh->b_bdev = NILFS_I_NILFS(inode)->ns_bdev;
+               set_buffer_mapped(bh);
+       }
+       bh->b_blocknr = pbn;
+       bh->b_end_io = end_buffer_read_sync;
+       get_bh(bh);
+       submit_bh(READ, bh);
+       if (vbn)
+               bh->b_blocknr = vbn;
+ out:
+       err = 0;
+       *out_bh = bh;
+
+ failed:
+       unlock_page(bh->b_page);
+       page_cache_release(bh->b_page);
+       return err;
+}
+
+/*
+ * nilfs_gccache_submit_read_node() - add node buffer and submit read request
+ * @inode - gc inode
+ * @pbn - physical block number for the block
+ * @vbn - virtual block number for the block
+ * @out_bh - indirect pointer to a buffer_head struct to receive the results
+ *
+ * Description: nilfs_gccache_submit_read_node() registers the node buffer
+ * specified by @vbn to the GC pagecache.  @pbn can be supplied by the
+ * caller to avoid translation of the disk block address.
+ *
+ * Return Value: On success, 0 is returned. On Error, one of the following
+ * negative error code is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_gccache_submit_read_node(struct inode *inode, sector_t pbn,
+                                  __u64 vbn, struct buffer_head **out_bh)
+{
+       int ret = nilfs_btnode_submit_block(&NILFS_I(inode)->i_btnode_cache,
+                                           vbn ? : pbn, pbn, out_bh, 0);
+       if (ret == -EEXIST) /* internal code (cache hit) */
+               ret = 0;
+       return ret;
+}
+
+int nilfs_gccache_wait_and_mark_dirty(struct buffer_head *bh)
+{
+       wait_on_buffer(bh);
+       if (!buffer_uptodate(bh))
+               return -EIO;
+       if (buffer_dirty(bh))
+               return -EEXIST;
+
+       if (buffer_nilfs_node(bh))
+               nilfs_btnode_mark_dirty(bh);
+       else
+               nilfs_mdt_mark_buffer_dirty(bh);
+       return 0;
+}
+
+/*
+ * nilfs_init_gccache() - allocate and initialize gc_inode hash table
+ * @nilfs - the_nilfs
+ *
+ * Return Value: On success, 0.
+ * On error, a negative error code is returned.
+ */
+int nilfs_init_gccache(struct the_nilfs *nilfs)
+{
+       int loop;
+
+       BUG_ON(nilfs->ns_gc_inodes_h);
+
+       INIT_LIST_HEAD(&nilfs->ns_gc_inodes);
+
+       nilfs->ns_gc_inodes_h =
+               kmalloc(sizeof(struct hlist_head) * NILFS_GCINODE_HASH_SIZE,
+                       GFP_NOFS);
+       if (nilfs->ns_gc_inodes_h == NULL)
+               return -ENOMEM;
+
+       for (loop = 0; loop < NILFS_GCINODE_HASH_SIZE; loop++)
+               INIT_HLIST_HEAD(&nilfs->ns_gc_inodes_h[loop]);
+       return 0;
+}
+
+/*
+ * nilfs_destroy_gccache() - free gc_inode hash table
+ * @nilfs - the nilfs
+ */
+void nilfs_destroy_gccache(struct the_nilfs *nilfs)
+{
+       if (nilfs->ns_gc_inodes_h) {
+               nilfs_remove_all_gcinode(nilfs);
+               kfree(nilfs->ns_gc_inodes_h);
+               nilfs->ns_gc_inodes_h = NULL;
+       }
+}
+
+static struct inode *alloc_gcinode(struct the_nilfs *nilfs, ino_t ino,
+                                  __u64 cno)
+{
+       struct inode *inode = nilfs_mdt_new_common(nilfs, NULL, ino, GFP_NOFS);
+       struct nilfs_inode_info *ii;
+
+       if (!inode)
+               return NULL;
+
+       inode->i_op = NULL;
+       inode->i_fop = NULL;
+       inode->i_mapping->a_ops = &def_gcinode_aops;
+
+       ii = NILFS_I(inode);
+       ii->i_cno = cno;
+       ii->i_flags = 0;
+       ii->i_state = 1 << NILFS_I_GCINODE;
+       ii->i_bh = NULL;
+       nilfs_bmap_init_gc(ii->i_bmap);
+
+       return inode;
+}
+
+static unsigned long ihash(ino_t ino, __u64 cno)
+{
+       return hash_long((unsigned long)((ino << 2) + cno),
+                        NILFS_GCINODE_HASH_BITS);
+}
+
+/*
+ * nilfs_gc_iget() - find or create gc inode with specified (ino,cno)
+ */
+struct inode *nilfs_gc_iget(struct the_nilfs *nilfs, ino_t ino, __u64 cno)
+{
+       struct hlist_head *head = nilfs->ns_gc_inodes_h + ihash(ino, cno);
+       struct hlist_node *node;
+       struct inode *inode;
+
+       hlist_for_each_entry(inode, node, head, i_hash) {
+               if (inode->i_ino == ino && NILFS_I(inode)->i_cno == cno)
+                       return inode;
+       }
+
+       inode = alloc_gcinode(nilfs, ino, cno);
+       if (likely(inode)) {
+               hlist_add_head(&inode->i_hash, head);
+               list_add(&NILFS_I(inode)->i_dirty, &nilfs->ns_gc_inodes);
+       }
+       return inode;
+}
+
+/*
+ * nilfs_clear_gcinode() - clear and free a gc inode
+ */
+void nilfs_clear_gcinode(struct inode *inode)
+{
+       nilfs_mdt_clear(inode);
+       nilfs_mdt_destroy(inode);
+}
+
+/*
+ * nilfs_remove_all_gcinode() - remove all inodes from the_nilfs
+ */
+void nilfs_remove_all_gcinode(struct the_nilfs *nilfs)
+{
+       struct hlist_head *head = nilfs->ns_gc_inodes_h;
+       struct hlist_node *node, *n;
+       struct inode *inode;
+       int loop;
+
+       for (loop = 0; loop < NILFS_GCINODE_HASH_SIZE; loop++, head++) {
+               hlist_for_each_entry_safe(inode, node, n, head, i_hash) {
+                       hlist_del_init(&inode->i_hash);
+                       list_del_init(&NILFS_I(inode)->i_dirty);
+                       nilfs_clear_gcinode(inode); /* might sleep */
+               }
+       }
+}
diff --git a/fs/nilfs2/ifile.c b/fs/nilfs2/ifile.c
new file mode 100644 (file)
index 0000000..de86401
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * ifile.c - NILFS inode file
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Amagai Yoshiji <amagai@osrg.net>.
+ * Revised by Ryusuke Konishi <ryusuke@osrg.net>.
+ *
+ */
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include "nilfs.h"
+#include "mdt.h"
+#include "alloc.h"
+#include "ifile.h"
+
+/**
+ * nilfs_ifile_create_inode - create a new disk inode
+ * @ifile: ifile inode
+ * @out_ino: pointer to a variable to store inode number
+ * @out_bh: buffer_head contains newly allocated disk inode
+ *
+ * Return Value: On success, 0 is returned and the newly allocated inode
+ * number is stored in the place pointed by @ino, and buffer_head pointer
+ * that contains newly allocated disk inode structure is stored in the
+ * place pointed by @out_bh
+ * On error, one of the following negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOSPC - No inode left.
+ */
+int nilfs_ifile_create_inode(struct inode *ifile, ino_t *out_ino,
+                            struct buffer_head **out_bh)
+{
+       struct nilfs_palloc_req req;
+       int ret;
+
+       req.pr_entry_nr = 0;  /* 0 says find free inode from beginning of
+                                a group. dull code!! */
+       req.pr_entry_bh = NULL;
+
+       ret = nilfs_palloc_prepare_alloc_entry(ifile, &req);
+       if (!ret) {
+               ret = nilfs_palloc_get_entry_block(ifile, req.pr_entry_nr, 1,
+                                                  &req.pr_entry_bh);
+               if (ret < 0)
+                       nilfs_palloc_abort_alloc_entry(ifile, &req);
+       }
+       if (ret < 0) {
+               brelse(req.pr_entry_bh);
+               return ret;
+       }
+       nilfs_palloc_commit_alloc_entry(ifile, &req);
+       nilfs_mdt_mark_buffer_dirty(req.pr_entry_bh);
+       nilfs_mdt_mark_dirty(ifile);
+       *out_ino = (ino_t)req.pr_entry_nr;
+       *out_bh = req.pr_entry_bh;
+       return 0;
+}
+
+/**
+ * nilfs_ifile_delete_inode - delete a disk inode
+ * @ifile: ifile inode
+ * @ino: inode number
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOENT - The inode number @ino have not been allocated.
+ */
+int nilfs_ifile_delete_inode(struct inode *ifile, ino_t ino)
+{
+       struct nilfs_palloc_req req = {
+               .pr_entry_nr = ino, .pr_entry_bh = NULL
+       };
+       struct nilfs_inode *raw_inode;
+       void *kaddr;
+       int ret;
+
+       ret = nilfs_palloc_prepare_free_entry(ifile, &req);
+       if (!ret) {
+               ret = nilfs_palloc_get_entry_block(ifile, req.pr_entry_nr, 0,
+                                                  &req.pr_entry_bh);
+               if (ret < 0)
+                       nilfs_palloc_abort_free_entry(ifile, &req);
+       }
+       if (ret < 0) {
+               brelse(req.pr_entry_bh);
+               return ret;
+       }
+
+       kaddr = kmap_atomic(req.pr_entry_bh->b_page, KM_USER0);
+       raw_inode = nilfs_palloc_block_get_entry(ifile, req.pr_entry_nr,
+                                                req.pr_entry_bh, kaddr);
+       raw_inode->i_flags = 0;
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nilfs_mdt_mark_buffer_dirty(req.pr_entry_bh);
+       brelse(req.pr_entry_bh);
+
+       nilfs_palloc_commit_free_entry(ifile, &req);
+
+       return 0;
+}
+
+int nilfs_ifile_get_inode_block(struct inode *ifile, ino_t ino,
+                               struct buffer_head **out_bh)
+{
+       struct super_block *sb = ifile->i_sb;
+       int err;
+
+       if (unlikely(!NILFS_VALID_INODE(sb, ino))) {
+               nilfs_error(sb, __func__, "bad inode number: %lu",
+                           (unsigned long) ino);
+               return -EINVAL;
+       }
+
+       err = nilfs_palloc_get_entry_block(ifile, ino, 0, out_bh);
+       if (unlikely(err)) {
+               if (err == -EINVAL)
+                       nilfs_error(sb, __func__, "ifile is broken");
+               else
+                       nilfs_warning(sb, __func__,
+                                     "unable to read inode: %lu",
+                                     (unsigned long) ino);
+       }
+       return err;
+}
diff --git a/fs/nilfs2/ifile.h b/fs/nilfs2/ifile.h
new file mode 100644 (file)
index 0000000..5d30a35
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * ifile.h - NILFS inode file
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Amagai Yoshiji <amagai@osrg.net>
+ * Revised by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+
+#ifndef _NILFS_IFILE_H
+#define _NILFS_IFILE_H
+
+#include <linux/fs.h>
+#include <linux/buffer_head.h>
+#include <linux/nilfs2_fs.h>
+#include "mdt.h"
+#include "alloc.h"
+
+#define NILFS_IFILE_GFP  NILFS_MDT_GFP
+
+static inline struct nilfs_inode *
+nilfs_ifile_map_inode(struct inode *ifile, ino_t ino, struct buffer_head *ibh)
+{
+       void *kaddr = kmap(ibh->b_page);
+       return nilfs_palloc_block_get_entry(ifile, ino, ibh, kaddr);
+}
+
+static inline void nilfs_ifile_unmap_inode(struct inode *ifile, ino_t ino,
+                                          struct buffer_head *ibh)
+{
+       kunmap(ibh->b_page);
+}
+
+int nilfs_ifile_create_inode(struct inode *, ino_t *, struct buffer_head **);
+int nilfs_ifile_delete_inode(struct inode *, ino_t);
+int nilfs_ifile_get_inode_block(struct inode *, ino_t, struct buffer_head **);
+
+#endif /* _NILFS_IFILE_H */
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
new file mode 100644 (file)
index 0000000..49ab4a4
--- /dev/null
@@ -0,0 +1,785 @@
+/*
+ * inode.c - NILFS inode operations.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+
+#include <linux/buffer_head.h>
+#include <linux/mpage.h>
+#include <linux/writeback.h>
+#include <linux/uio.h>
+#include "nilfs.h"
+#include "segment.h"
+#include "page.h"
+#include "mdt.h"
+#include "cpfile.h"
+#include "ifile.h"
+
+
+/**
+ * nilfs_get_block() - get a file block on the filesystem (callback function)
+ * @inode - inode struct of the target file
+ * @blkoff - file block number
+ * @bh_result - buffer head to be mapped on
+ * @create - indicate whether allocating the block or not when it has not
+ *      been allocated yet.
+ *
+ * This function does not issue actual read request of the specified data
+ * block. It is done by VFS.
+ * Bulk read for direct-io is not supported yet. (should be supported)
+ */
+int nilfs_get_block(struct inode *inode, sector_t blkoff,
+                   struct buffer_head *bh_result, int create)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+       unsigned long blknum = 0;
+       int err = 0, ret;
+       struct inode *dat = nilfs_dat_inode(NILFS_I_NILFS(inode));
+
+       /* This exclusion control is a workaround; should be revised */
+       down_read(&NILFS_MDT(dat)->mi_sem);     /* XXX */
+       ret = nilfs_bmap_lookup(ii->i_bmap, (unsigned long)blkoff, &blknum);
+       up_read(&NILFS_MDT(dat)->mi_sem);       /* XXX */
+       if (ret == 0) { /* found */
+               map_bh(bh_result, inode->i_sb, blknum);
+               goto out;
+       }
+       /* data block was not found */
+       if (ret == -ENOENT && create) {
+               struct nilfs_transaction_info ti;
+
+               bh_result->b_blocknr = 0;
+               err = nilfs_transaction_begin(inode->i_sb, &ti, 1);
+               if (unlikely(err))
+                       goto out;
+               err = nilfs_bmap_insert(ii->i_bmap, (unsigned long)blkoff,
+                                       (unsigned long)bh_result);
+               if (unlikely(err != 0)) {
+                       if (err == -EEXIST) {
+                               /*
+                                * The get_block() function could be called
+                                * from multiple callers for an inode.
+                                * However, the page having this block must
+                                * be locked in this case.
+                                */
+                               printk(KERN_WARNING
+                                      "nilfs_get_block: a race condition "
+                                      "while inserting a data block. "
+                                      "(inode number=%lu, file block "
+                                      "offset=%llu)\n",
+                                      inode->i_ino,
+                                      (unsigned long long)blkoff);
+                               err = 0;
+                       } else if (err == -EINVAL) {
+                               nilfs_error(inode->i_sb, __func__,
+                                           "broken bmap (inode=%lu)\n",
+                                           inode->i_ino);
+                               err = -EIO;
+                       }
+                       nilfs_transaction_abort(inode->i_sb);
+                       goto out;
+               }
+               nilfs_transaction_commit(inode->i_sb); /* never fails */
+               /* Error handling should be detailed */
+               set_buffer_new(bh_result);
+               map_bh(bh_result, inode->i_sb, 0); /* dbn must be changed
+                                                     to proper value */
+       } else if (ret == -ENOENT) {
+               /* not found is not error (e.g. hole); must return without
+                  the mapped state flag. */
+               ;
+       } else {
+               err = ret;
+       }
+
+ out:
+       return err;
+}
+
+/**
+ * nilfs_readpage() - implement readpage() method of nilfs_aops {}
+ * address_space_operations.
+ * @file - file struct of the file to be read
+ * @page - the page to be read
+ */
+static int nilfs_readpage(struct file *file, struct page *page)
+{
+       return mpage_readpage(page, nilfs_get_block);
+}
+
+/**
+ * nilfs_readpages() - implement readpages() method of nilfs_aops {}
+ * address_space_operations.
+ * @file - file struct of the file to be read
+ * @mapping - address_space struct used for reading multiple pages
+ * @pages - the pages to be read
+ * @nr_pages - number of pages to be read
+ */
+static int nilfs_readpages(struct file *file, struct address_space *mapping,
+                          struct list_head *pages, unsigned nr_pages)
+{
+       return mpage_readpages(mapping, pages, nr_pages, nilfs_get_block);
+}
+
+static int nilfs_writepages(struct address_space *mapping,
+                           struct writeback_control *wbc)
+{
+       struct inode *inode = mapping->host;
+       int err = 0;
+
+       if (wbc->sync_mode == WB_SYNC_ALL)
+               err = nilfs_construct_dsync_segment(inode->i_sb, inode,
+                                                   wbc->range_start,
+                                                   wbc->range_end);
+       return err;
+}
+
+static int nilfs_writepage(struct page *page, struct writeback_control *wbc)
+{
+       struct inode *inode = page->mapping->host;
+       int err;
+
+       redirty_page_for_writepage(wbc, page);
+       unlock_page(page);
+
+       if (wbc->sync_mode == WB_SYNC_ALL) {
+               err = nilfs_construct_segment(inode->i_sb);
+               if (unlikely(err))
+                       return err;
+       } else if (wbc->for_reclaim)
+               nilfs_flush_segment(inode->i_sb, inode->i_ino);
+
+       return 0;
+}
+
+static int nilfs_set_page_dirty(struct page *page)
+{
+       int ret = __set_page_dirty_buffers(page);
+
+       if (ret) {
+               struct inode *inode = page->mapping->host;
+               struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
+               unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits);
+
+               nilfs_set_file_dirty(sbi, inode, nr_dirty);
+       }
+       return ret;
+}
+
+static int nilfs_write_begin(struct file *file, struct address_space *mapping,
+                            loff_t pos, unsigned len, unsigned flags,
+                            struct page **pagep, void **fsdata)
+
+{
+       struct inode *inode = mapping->host;
+       int err = nilfs_transaction_begin(inode->i_sb, NULL, 1);
+
+       if (unlikely(err))
+               return err;
+
+       *pagep = NULL;
+       err = block_write_begin(file, mapping, pos, len, flags, pagep,
+                               fsdata, nilfs_get_block);
+       if (unlikely(err))
+               nilfs_transaction_abort(inode->i_sb);
+       return err;
+}
+
+static int nilfs_write_end(struct file *file, struct address_space *mapping,
+                          loff_t pos, unsigned len, unsigned copied,
+                          struct page *page, void *fsdata)
+{
+       struct inode *inode = mapping->host;
+       unsigned start = pos & (PAGE_CACHE_SIZE - 1);
+       unsigned nr_dirty;
+       int err;
+
+       nr_dirty = nilfs_page_count_clean_buffers(page, start,
+                                                 start + copied);
+       copied = generic_write_end(file, mapping, pos, len, copied, page,
+                                  fsdata);
+       nilfs_set_file_dirty(NILFS_SB(inode->i_sb), inode, nr_dirty);
+       err = nilfs_transaction_commit(inode->i_sb);
+       return err ? : copied;
+}
+
+static ssize_t
+nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
+               loff_t offset, unsigned long nr_segs)
+{
+       struct file *file = iocb->ki_filp;
+       struct inode *inode = file->f_mapping->host;
+       ssize_t size;
+
+       if (rw == WRITE)
+               return 0;
+
+       /* Needs synchronization with the cleaner */
+       size = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
+                                 offset, nr_segs, nilfs_get_block, NULL);
+       return size;
+}
+
+struct address_space_operations nilfs_aops = {
+       .writepage              = nilfs_writepage,
+       .readpage               = nilfs_readpage,
+       /* .sync_page           = nilfs_sync_page, */
+       .writepages             = nilfs_writepages,
+       .set_page_dirty         = nilfs_set_page_dirty,
+       .readpages              = nilfs_readpages,
+       .write_begin            = nilfs_write_begin,
+       .write_end              = nilfs_write_end,
+       /* .releasepage         = nilfs_releasepage, */
+       .invalidatepage         = block_invalidatepage,
+       .direct_IO              = nilfs_direct_IO,
+};
+
+struct inode *nilfs_new_inode(struct inode *dir, int mode)
+{
+       struct super_block *sb = dir->i_sb;
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct inode *inode;
+       struct nilfs_inode_info *ii;
+       int err = -ENOMEM;
+       ino_t ino;
+
+       inode = new_inode(sb);
+       if (unlikely(!inode))
+               goto failed;
+
+       mapping_set_gfp_mask(inode->i_mapping,
+                            mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
+
+       ii = NILFS_I(inode);
+       ii->i_state = 1 << NILFS_I_NEW;
+
+       err = nilfs_ifile_create_inode(sbi->s_ifile, &ino, &ii->i_bh);
+       if (unlikely(err))
+               goto failed_ifile_create_inode;
+       /* reference count of i_bh inherits from nilfs_mdt_read_block() */
+
+       atomic_inc(&sbi->s_inodes_count);
+
+       inode->i_uid = current_fsuid();
+       if (dir->i_mode & S_ISGID) {
+               inode->i_gid = dir->i_gid;
+               if (S_ISDIR(mode))
+                       mode |= S_ISGID;
+       } else
+               inode->i_gid = current_fsgid();
+
+       inode->i_mode = mode;
+       inode->i_ino = ino;
+       inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
+
+       if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) {
+               err = nilfs_bmap_read(ii->i_bmap, NULL);
+               if (err < 0)
+                       goto failed_bmap;
+
+               set_bit(NILFS_I_BMAP, &ii->i_state);
+               /* No lock is needed; iget() ensures it. */
+       }
+
+       ii->i_flags = NILFS_I(dir)->i_flags;
+       if (S_ISLNK(mode))
+               ii->i_flags &= ~(NILFS_IMMUTABLE_FL | NILFS_APPEND_FL);
+       if (!S_ISDIR(mode))
+               ii->i_flags &= ~NILFS_DIRSYNC_FL;
+
+       /* ii->i_file_acl = 0; */
+       /* ii->i_dir_acl = 0; */
+       ii->i_dir_start_lookup = 0;
+#ifdef CONFIG_NILFS_FS_POSIX_ACL
+       ii->i_acl = NULL;
+       ii->i_default_acl = NULL;
+#endif
+       ii->i_cno = 0;
+       nilfs_set_inode_flags(inode);
+       spin_lock(&sbi->s_next_gen_lock);
+       inode->i_generation = sbi->s_next_generation++;
+       spin_unlock(&sbi->s_next_gen_lock);
+       insert_inode_hash(inode);
+
+       err = nilfs_init_acl(inode, dir);
+       if (unlikely(err))
+               goto failed_acl; /* never occur. When supporting
+                                   nilfs_init_acl(), proper cancellation of
+                                   above jobs should be considered */
+
+       mark_inode_dirty(inode);
+       return inode;
+
+ failed_acl:
+ failed_bmap:
+       inode->i_nlink = 0;
+       iput(inode);  /* raw_inode will be deleted through
+                        generic_delete_inode() */
+       goto failed;
+
+ failed_ifile_create_inode:
+       make_bad_inode(inode);
+       iput(inode);  /* if i_nlink == 1, generic_forget_inode() will be
+                        called */
+ failed:
+       return ERR_PTR(err);
+}
+
+void nilfs_free_inode(struct inode *inode)
+{
+       struct super_block *sb = inode->i_sb;
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+
+       clear_inode(inode);
+       /* XXX: check error code? Is there any thing I can do? */
+       (void) nilfs_ifile_delete_inode(sbi->s_ifile, inode->i_ino);
+       atomic_dec(&sbi->s_inodes_count);
+}
+
+void nilfs_set_inode_flags(struct inode *inode)
+{
+       unsigned int flags = NILFS_I(inode)->i_flags;
+
+       inode->i_flags &= ~(S_SYNC | S_APPEND | S_IMMUTABLE | S_NOATIME |
+                           S_DIRSYNC);
+       if (flags & NILFS_SYNC_FL)
+               inode->i_flags |= S_SYNC;
+       if (flags & NILFS_APPEND_FL)
+               inode->i_flags |= S_APPEND;
+       if (flags & NILFS_IMMUTABLE_FL)
+               inode->i_flags |= S_IMMUTABLE;
+#ifndef NILFS_ATIME_DISABLE
+       if (flags & NILFS_NOATIME_FL)
+#endif
+               inode->i_flags |= S_NOATIME;
+       if (flags & NILFS_DIRSYNC_FL)
+               inode->i_flags |= S_DIRSYNC;
+       mapping_set_gfp_mask(inode->i_mapping,
+                            mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
+}
+
+int nilfs_read_inode_common(struct inode *inode,
+                           struct nilfs_inode *raw_inode)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+       int err;
+
+       inode->i_mode = le16_to_cpu(raw_inode->i_mode);
+       inode->i_uid = (uid_t)le32_to_cpu(raw_inode->i_uid);
+       inode->i_gid = (gid_t)le32_to_cpu(raw_inode->i_gid);
+       inode->i_nlink = le16_to_cpu(raw_inode->i_links_count);
+       inode->i_size = le64_to_cpu(raw_inode->i_size);
+       inode->i_atime.tv_sec = le64_to_cpu(raw_inode->i_mtime);
+       inode->i_ctime.tv_sec = le64_to_cpu(raw_inode->i_ctime);
+       inode->i_mtime.tv_sec = le64_to_cpu(raw_inode->i_mtime);
+       inode->i_atime.tv_nsec = le32_to_cpu(raw_inode->i_mtime_nsec);
+       inode->i_ctime.tv_nsec = le32_to_cpu(raw_inode->i_ctime_nsec);
+       inode->i_mtime.tv_nsec = le32_to_cpu(raw_inode->i_mtime_nsec);
+       if (inode->i_nlink == 0 && inode->i_mode == 0)
+               return -EINVAL; /* this inode is deleted */
+
+       inode->i_blocks = le64_to_cpu(raw_inode->i_blocks);
+       ii->i_flags = le32_to_cpu(raw_inode->i_flags);
+#if 0
+       ii->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
+       ii->i_dir_acl = S_ISREG(inode->i_mode) ?
+               0 : le32_to_cpu(raw_inode->i_dir_acl);
+#endif
+       ii->i_cno = 0;
+       inode->i_generation = le32_to_cpu(raw_inode->i_generation);
+
+       if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
+           S_ISLNK(inode->i_mode)) {
+               err = nilfs_bmap_read(ii->i_bmap, raw_inode);
+               if (err < 0)
+                       return err;
+               set_bit(NILFS_I_BMAP, &ii->i_state);
+               /* No lock is needed; iget() ensures it. */
+       }
+       return 0;
+}
+
+static int __nilfs_read_inode(struct super_block *sb, unsigned long ino,
+                             struct inode *inode)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct inode *dat = nilfs_dat_inode(sbi->s_nilfs);
+       struct buffer_head *bh;
+       struct nilfs_inode *raw_inode;
+       int err;
+
+       down_read(&NILFS_MDT(dat)->mi_sem);     /* XXX */
+       err = nilfs_ifile_get_inode_block(sbi->s_ifile, ino, &bh);
+       if (unlikely(err))
+               goto bad_inode;
+
+       raw_inode = nilfs_ifile_map_inode(sbi->s_ifile, ino, bh);
+
+#ifdef CONFIG_NILFS_FS_POSIX_ACL
+       ii->i_acl = NILFS_ACL_NOT_CACHED;
+       ii->i_default_acl = NILFS_ACL_NOT_CACHED;
+#endif
+       if (nilfs_read_inode_common(inode, raw_inode))
+               goto failed_unmap;
+
+       if (S_ISREG(inode->i_mode)) {
+               inode->i_op = &nilfs_file_inode_operations;
+               inode->i_fop = &nilfs_file_operations;
+               inode->i_mapping->a_ops = &nilfs_aops;
+       } else if (S_ISDIR(inode->i_mode)) {
+               inode->i_op = &nilfs_dir_inode_operations;
+               inode->i_fop = &nilfs_dir_operations;
+               inode->i_mapping->a_ops = &nilfs_aops;
+       } else if (S_ISLNK(inode->i_mode)) {
+               inode->i_op = &nilfs_symlink_inode_operations;
+               inode->i_mapping->a_ops = &nilfs_aops;
+       } else {
+               inode->i_op = &nilfs_special_inode_operations;
+               init_special_inode(
+                       inode, inode->i_mode,
+                       new_decode_dev(le64_to_cpu(raw_inode->i_device_code)));
+       }
+       nilfs_ifile_unmap_inode(sbi->s_ifile, ino, bh);
+       brelse(bh);
+       up_read(&NILFS_MDT(dat)->mi_sem);       /* XXX */
+       nilfs_set_inode_flags(inode);
+       return 0;
+
+ failed_unmap:
+       nilfs_ifile_unmap_inode(sbi->s_ifile, ino, bh);
+       brelse(bh);
+
+ bad_inode:
+       up_read(&NILFS_MDT(dat)->mi_sem);       /* XXX */
+       return err;
+}
+
+struct inode *nilfs_iget(struct super_block *sb, unsigned long ino)
+{
+       struct inode *inode;
+       int err;
+
+       inode = iget_locked(sb, ino);
+       if (unlikely(!inode))
+               return ERR_PTR(-ENOMEM);
+       if (!(inode->i_state & I_NEW))
+               return inode;
+
+       err = __nilfs_read_inode(sb, ino, inode);
+       if (unlikely(err)) {
+               iget_failed(inode);
+               return ERR_PTR(err);
+       }
+       unlock_new_inode(inode);
+       return inode;
+}
+
+void nilfs_write_inode_common(struct inode *inode,
+                             struct nilfs_inode *raw_inode, int has_bmap)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+
+       raw_inode->i_mode = cpu_to_le16(inode->i_mode);
+       raw_inode->i_uid = cpu_to_le32(inode->i_uid);
+       raw_inode->i_gid = cpu_to_le32(inode->i_gid);
+       raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
+       raw_inode->i_size = cpu_to_le64(inode->i_size);
+       raw_inode->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
+       raw_inode->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
+       raw_inode->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
+       raw_inode->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
+       raw_inode->i_blocks = cpu_to_le64(inode->i_blocks);
+
+       raw_inode->i_flags = cpu_to_le32(ii->i_flags);
+       raw_inode->i_generation = cpu_to_le32(inode->i_generation);
+
+       if (has_bmap)
+               nilfs_bmap_write(ii->i_bmap, raw_inode);
+       else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
+               raw_inode->i_device_code =
+                       cpu_to_le64(new_encode_dev(inode->i_rdev));
+       /* When extending inode, nilfs->ns_inode_size should be checked
+          for substitutions of appended fields */
+}
+
+void nilfs_update_inode(struct inode *inode, struct buffer_head *ibh)
+{
+       ino_t ino = inode->i_ino;
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+       struct super_block *sb = inode->i_sb;
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct nilfs_inode *raw_inode;
+
+       raw_inode = nilfs_ifile_map_inode(sbi->s_ifile, ino, ibh);
+
+       /* The buffer is guarded with lock_buffer() by the caller */
+       if (test_and_clear_bit(NILFS_I_NEW, &ii->i_state))
+               memset(raw_inode, 0, NILFS_MDT(sbi->s_ifile)->mi_entry_size);
+       set_bit(NILFS_I_INODE_DIRTY, &ii->i_state);
+
+       nilfs_write_inode_common(inode, raw_inode, 0);
+               /* XXX: call with has_bmap = 0 is a workaround to avoid
+                  deadlock of bmap. This delays update of i_bmap to just
+                  before writing */
+       nilfs_ifile_unmap_inode(sbi->s_ifile, ino, ibh);
+}
+
+#define NILFS_MAX_TRUNCATE_BLOCKS      16384  /* 64MB for 4KB block */
+
+static void nilfs_truncate_bmap(struct nilfs_inode_info *ii,
+                               unsigned long from)
+{
+       unsigned long b;
+       int ret;
+
+       if (!test_bit(NILFS_I_BMAP, &ii->i_state))
+               return;
+ repeat:
+       ret = nilfs_bmap_last_key(ii->i_bmap, &b);
+       if (ret == -ENOENT)
+               return;
+       else if (ret < 0)
+               goto failed;
+
+       if (b < from)
+               return;
+
+       b -= min_t(unsigned long, NILFS_MAX_TRUNCATE_BLOCKS, b - from);
+       ret = nilfs_bmap_truncate(ii->i_bmap, b);
+       nilfs_relax_pressure_in_lock(ii->vfs_inode.i_sb);
+       if (!ret || (ret == -ENOMEM &&
+                    nilfs_bmap_truncate(ii->i_bmap, b) == 0))
+               goto repeat;
+
+ failed:
+       if (ret == -EINVAL)
+               nilfs_error(ii->vfs_inode.i_sb, __func__,
+                           "bmap is broken (ino=%lu)", ii->vfs_inode.i_ino);
+       else
+               nilfs_warning(ii->vfs_inode.i_sb, __func__,
+                             "failed to truncate bmap (ino=%lu, err=%d)",
+                             ii->vfs_inode.i_ino, ret);
+}
+
+void nilfs_truncate(struct inode *inode)
+{
+       unsigned long blkoff;
+       unsigned int blocksize;
+       struct nilfs_transaction_info ti;
+       struct super_block *sb = inode->i_sb;
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+
+       if (!test_bit(NILFS_I_BMAP, &ii->i_state))
+               return;
+       if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
+               return;
+
+       blocksize = sb->s_blocksize;
+       blkoff = (inode->i_size + blocksize - 1) >> sb->s_blocksize_bits;
+       nilfs_transaction_begin(sb, &ti, 0); /* never fails */
+
+       block_truncate_page(inode->i_mapping, inode->i_size, nilfs_get_block);
+
+       nilfs_truncate_bmap(ii, blkoff);
+
+       inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+       if (IS_SYNC(inode))
+               nilfs_set_transaction_flag(NILFS_TI_SYNC);
+
+       nilfs_set_file_dirty(NILFS_SB(sb), inode, 0);
+       nilfs_transaction_commit(sb);
+       /* May construct a logical segment and may fail in sync mode.
+          But truncate has no return value. */
+}
+
+void nilfs_delete_inode(struct inode *inode)
+{
+       struct nilfs_transaction_info ti;
+       struct super_block *sb = inode->i_sb;
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+
+       if (unlikely(is_bad_inode(inode))) {
+               if (inode->i_data.nrpages)
+                       truncate_inode_pages(&inode->i_data, 0);
+               clear_inode(inode);
+               return;
+       }
+       nilfs_transaction_begin(sb, &ti, 0); /* never fails */
+
+       if (inode->i_data.nrpages)
+               truncate_inode_pages(&inode->i_data, 0);
+
+       nilfs_truncate_bmap(ii, 0);
+       nilfs_free_inode(inode);
+       /* nilfs_free_inode() marks inode buffer dirty */
+       if (IS_SYNC(inode))
+               nilfs_set_transaction_flag(NILFS_TI_SYNC);
+       nilfs_transaction_commit(sb);
+       /* May construct a logical segment and may fail in sync mode.
+          But delete_inode has no return value. */
+}
+
+int nilfs_setattr(struct dentry *dentry, struct iattr *iattr)
+{
+       struct nilfs_transaction_info ti;
+       struct inode *inode = dentry->d_inode;
+       struct super_block *sb = inode->i_sb;
+       int err;
+
+       err = inode_change_ok(inode, iattr);
+       if (err)
+               return err;
+
+       err = nilfs_transaction_begin(sb, &ti, 0);
+       if (unlikely(err))
+               return err;
+       err = inode_setattr(inode, iattr);
+       if (!err && (iattr->ia_valid & ATTR_MODE))
+               err = nilfs_acl_chmod(inode);
+       if (likely(!err))
+               err = nilfs_transaction_commit(sb);
+       else
+               nilfs_transaction_abort(sb);
+
+       return err;
+}
+
+int nilfs_load_inode_block(struct nilfs_sb_info *sbi, struct inode *inode,
+                          struct buffer_head **pbh)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+       int err;
+
+       spin_lock(&sbi->s_inode_lock);
+       /* Caller of this function MUST lock s_inode_lock */
+       if (ii->i_bh == NULL) {
+               spin_unlock(&sbi->s_inode_lock);
+               err = nilfs_ifile_get_inode_block(sbi->s_ifile, inode->i_ino,
+                                                 pbh);
+               if (unlikely(err))
+                       return err;
+               spin_lock(&sbi->s_inode_lock);
+               if (ii->i_bh == NULL)
+                       ii->i_bh = *pbh;
+               else {
+                       brelse(*pbh);
+                       *pbh = ii->i_bh;
+               }
+       } else
+               *pbh = ii->i_bh;
+
+       get_bh(*pbh);
+       spin_unlock(&sbi->s_inode_lock);
+       return 0;
+}
+
+int nilfs_inode_dirty(struct inode *inode)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+       struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
+       int ret = 0;
+
+       if (!list_empty(&ii->i_dirty)) {
+               spin_lock(&sbi->s_inode_lock);
+               ret = test_bit(NILFS_I_DIRTY, &ii->i_state) ||
+                       test_bit(NILFS_I_BUSY, &ii->i_state);
+               spin_unlock(&sbi->s_inode_lock);
+       }
+       return ret;
+}
+
+int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode,
+                        unsigned nr_dirty)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+
+       atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks);
+
+       if (test_and_set_bit(NILFS_I_DIRTY, &ii->i_state))
+               return 0;
+
+       spin_lock(&sbi->s_inode_lock);
+       if (!test_bit(NILFS_I_QUEUED, &ii->i_state) &&
+           !test_bit(NILFS_I_BUSY, &ii->i_state)) {
+               /* Because this routine may race with nilfs_dispose_list(),
+                  we have to check NILFS_I_QUEUED here, too. */
+               if (list_empty(&ii->i_dirty) && igrab(inode) == NULL) {
+                       /* This will happen when somebody is freeing
+                          this inode. */
+                       nilfs_warning(sbi->s_super, __func__,
+                                     "cannot get inode (ino=%lu)\n",
+                                     inode->i_ino);
+                       spin_unlock(&sbi->s_inode_lock);
+                       return -EINVAL; /* NILFS_I_DIRTY may remain for
+                                          freeing inode */
+               }
+               list_del(&ii->i_dirty);
+               list_add_tail(&ii->i_dirty, &sbi->s_dirty_files);
+               set_bit(NILFS_I_QUEUED, &ii->i_state);
+       }
+       spin_unlock(&sbi->s_inode_lock);
+       return 0;
+}
+
+int nilfs_mark_inode_dirty(struct inode *inode)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
+       struct buffer_head *ibh;
+       int err;
+
+       err = nilfs_load_inode_block(sbi, inode, &ibh);
+       if (unlikely(err)) {
+               nilfs_warning(inode->i_sb, __func__,
+                             "failed to reget inode block.\n");
+               return err;
+       }
+       lock_buffer(ibh);
+       nilfs_update_inode(inode, ibh);
+       unlock_buffer(ibh);
+       nilfs_mdt_mark_buffer_dirty(ibh);
+       nilfs_mdt_mark_dirty(sbi->s_ifile);
+       brelse(ibh);
+       return 0;
+}
+
+/**
+ * nilfs_dirty_inode - reflect changes on given inode to an inode block.
+ * @inode: inode of the file to be registered.
+ *
+ * nilfs_dirty_inode() loads a inode block containing the specified
+ * @inode and copies data from a nilfs_inode to a corresponding inode
+ * entry in the inode block. This operation is excluded from the segment
+ * construction. This function can be called both as a single operation
+ * and as a part of indivisible file operations.
+ */
+void nilfs_dirty_inode(struct inode *inode)
+{
+       struct nilfs_transaction_info ti;
+
+       if (is_bad_inode(inode)) {
+               nilfs_warning(inode->i_sb, __func__,
+                             "tried to mark bad_inode dirty. ignored.\n");
+               dump_stack();
+               return;
+       }
+       nilfs_transaction_begin(inode->i_sb, &ti, 0);
+       nilfs_mark_inode_dirty(inode);
+       nilfs_transaction_commit(inode->i_sb); /* never fails */
+}
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c
new file mode 100644 (file)
index 0000000..108d281
--- /dev/null
@@ -0,0 +1,654 @@
+/*
+ * ioctl.c - NILFS ioctl operations.
+ *
+ * Copyright (C) 2007, 2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#include <linux/fs.h>
+#include <linux/wait.h>
+#include <linux/smp_lock.h>    /* lock_kernel(), unlock_kernel() */
+#include <linux/capability.h>  /* capable() */
+#include <linux/uaccess.h>     /* copy_from_user(), copy_to_user() */
+#include <linux/nilfs2_fs.h>
+#include "nilfs.h"
+#include "segment.h"
+#include "bmap.h"
+#include "cpfile.h"
+#include "sufile.h"
+#include "dat.h"
+
+
+static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs,
+                                struct nilfs_argv *argv, int dir,
+                                ssize_t (*dofunc)(struct the_nilfs *,
+                                                  __u64 *, int,
+                                                  void *, size_t, size_t))
+{
+       void *buf;
+       void __user *base = (void __user *)(unsigned long)argv->v_base;
+       size_t maxmembs, total, n;
+       ssize_t nr;
+       int ret, i;
+       __u64 pos, ppos;
+
+       if (argv->v_nmembs == 0)
+               return 0;
+
+       if (argv->v_size > PAGE_SIZE)
+               return -EINVAL;
+
+       buf = (void *)__get_free_pages(GFP_NOFS, 0);
+       if (unlikely(!buf))
+               return -ENOMEM;
+       maxmembs = PAGE_SIZE / argv->v_size;
+
+       ret = 0;
+       total = 0;
+       pos = argv->v_index;
+       for (i = 0; i < argv->v_nmembs; i += n) {
+               n = (argv->v_nmembs - i < maxmembs) ?
+                       argv->v_nmembs - i : maxmembs;
+               if ((dir & _IOC_WRITE) &&
+                   copy_from_user(buf, base + argv->v_size * i,
+                                  argv->v_size * n)) {
+                       ret = -EFAULT;
+                       break;
+               }
+               ppos = pos;
+               nr = dofunc(nilfs, &pos, argv->v_flags, buf, argv->v_size,
+                              n);
+               if (nr < 0) {
+                       ret = nr;
+                       break;
+               }
+               if ((dir & _IOC_READ) &&
+                   copy_to_user(base + argv->v_size * i, buf,
+                                argv->v_size * nr)) {
+                       ret = -EFAULT;
+                       break;
+               }
+               total += nr;
+               if ((size_t)nr < n)
+                       break;
+               if (pos == ppos)
+                       pos += n;
+       }
+       argv->v_nmembs = total;
+
+       free_pages((unsigned long)buf, 0);
+       return ret;
+}
+
+static int nilfs_ioctl_change_cpmode(struct inode *inode, struct file *filp,
+                                    unsigned int cmd, void __user *argp)
+{
+       struct inode *cpfile = NILFS_SB(inode->i_sb)->s_nilfs->ns_cpfile;
+       struct nilfs_transaction_info ti;
+       struct nilfs_cpmode cpmode;
+       int ret;
+
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+       if (copy_from_user(&cpmode, argp, sizeof(cpmode)))
+               return -EFAULT;
+
+       nilfs_transaction_begin(inode->i_sb, &ti, 0);
+       ret = nilfs_cpfile_change_cpmode(
+               cpfile, cpmode.cm_cno, cpmode.cm_mode);
+       if (unlikely(ret < 0)) {
+               nilfs_transaction_abort(inode->i_sb);
+               return ret;
+       }
+       nilfs_transaction_commit(inode->i_sb); /* never fails */
+       return ret;
+}
+
+static int
+nilfs_ioctl_delete_checkpoint(struct inode *inode, struct file *filp,
+                             unsigned int cmd, void __user *argp)
+{
+       struct inode *cpfile = NILFS_SB(inode->i_sb)->s_nilfs->ns_cpfile;
+       struct nilfs_transaction_info ti;
+       __u64 cno;
+       int ret;
+
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+       if (copy_from_user(&cno, argp, sizeof(cno)))
+               return -EFAULT;
+
+       nilfs_transaction_begin(inode->i_sb, &ti, 0);
+       ret = nilfs_cpfile_delete_checkpoint(cpfile, cno);
+       if (unlikely(ret < 0)) {
+               nilfs_transaction_abort(inode->i_sb);
+               return ret;
+       }
+       nilfs_transaction_commit(inode->i_sb); /* never fails */
+       return ret;
+}
+
+static ssize_t
+nilfs_ioctl_do_get_cpinfo(struct the_nilfs *nilfs, __u64 *posp, int flags,
+                         void *buf, size_t size, size_t nmembs)
+{
+       return nilfs_cpfile_get_cpinfo(nilfs->ns_cpfile, posp, flags, buf,
+                                      nmembs);
+}
+
+static int nilfs_ioctl_get_cpinfo(struct inode *inode, struct file *filp,
+                                 unsigned int cmd, void __user *argp)
+{
+       struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs;
+       struct nilfs_argv argv;
+       int ret;
+
+       if (copy_from_user(&argv, argp, sizeof(argv)))
+               return -EFAULT;
+
+       down_read(&nilfs->ns_segctor_sem);
+       ret = nilfs_ioctl_wrap_copy(nilfs, &argv, _IOC_DIR(cmd),
+                                   nilfs_ioctl_do_get_cpinfo);
+       up_read(&nilfs->ns_segctor_sem);
+       if (ret < 0)
+               return ret;
+
+       if (copy_to_user(argp, &argv, sizeof(argv)))
+               ret = -EFAULT;
+       return ret;
+}
+
+static int nilfs_ioctl_get_cpstat(struct inode *inode, struct file *filp,
+                                 unsigned int cmd, void __user *argp)
+{
+       struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs;
+       struct nilfs_cpstat cpstat;
+       int ret;
+
+       down_read(&nilfs->ns_segctor_sem);
+       ret = nilfs_cpfile_get_stat(nilfs->ns_cpfile, &cpstat);
+       up_read(&nilfs->ns_segctor_sem);
+       if (ret < 0)
+               return ret;
+
+       if (copy_to_user(argp, &cpstat, sizeof(cpstat)))
+               ret = -EFAULT;
+       return ret;
+}
+
+static ssize_t
+nilfs_ioctl_do_get_suinfo(struct the_nilfs *nilfs, __u64 *posp, int flags,
+                         void *buf, size_t size, size_t nmembs)
+{
+       return nilfs_sufile_get_suinfo(nilfs->ns_sufile, *posp, buf, nmembs);
+}
+
+static int nilfs_ioctl_get_suinfo(struct inode *inode, struct file *filp,
+                                 unsigned int cmd, void __user *argp)
+{
+       struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs;
+       struct nilfs_argv argv;
+       int ret;
+
+       if (copy_from_user(&argv, argp, sizeof(argv)))
+               return -EFAULT;
+
+       down_read(&nilfs->ns_segctor_sem);
+       ret = nilfs_ioctl_wrap_copy(nilfs, &argv, _IOC_DIR(cmd),
+                                   nilfs_ioctl_do_get_suinfo);
+       up_read(&nilfs->ns_segctor_sem);
+       if (ret < 0)
+               return ret;
+
+       if (copy_to_user(argp, &argv, sizeof(argv)))
+               ret = -EFAULT;
+       return ret;
+}
+
+static int nilfs_ioctl_get_sustat(struct inode *inode, struct file *filp,
+                                 unsigned int cmd, void __user *argp)
+{
+       struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs;
+       struct nilfs_sustat sustat;
+       int ret;
+
+       down_read(&nilfs->ns_segctor_sem);
+       ret = nilfs_sufile_get_stat(nilfs->ns_sufile, &sustat);
+       up_read(&nilfs->ns_segctor_sem);
+       if (ret < 0)
+               return ret;
+
+       if (copy_to_user(argp, &sustat, sizeof(sustat)))
+               ret = -EFAULT;
+       return ret;
+}
+
+static ssize_t
+nilfs_ioctl_do_get_vinfo(struct the_nilfs *nilfs, __u64 *posp, int flags,
+                        void *buf, size_t size, size_t nmembs)
+{
+       return nilfs_dat_get_vinfo(nilfs_dat_inode(nilfs), buf, nmembs);
+}
+
+static int nilfs_ioctl_get_vinfo(struct inode *inode, struct file *filp,
+                                unsigned int cmd, void __user *argp)
+{
+       struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs;
+       struct nilfs_argv argv;
+       int ret;
+
+       if (copy_from_user(&argv, argp, sizeof(argv)))
+               return -EFAULT;
+
+       down_read(&nilfs->ns_segctor_sem);
+       ret = nilfs_ioctl_wrap_copy(nilfs, &argv, _IOC_DIR(cmd),
+                                   nilfs_ioctl_do_get_vinfo);
+       up_read(&nilfs->ns_segctor_sem);
+       if (ret < 0)
+               return ret;
+
+       if (copy_to_user(argp, &argv, sizeof(argv)))
+               ret = -EFAULT;
+       return ret;
+}
+
+static ssize_t
+nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags,
+                         void *buf, size_t size, size_t nmembs)
+{
+       struct inode *dat = nilfs_dat_inode(nilfs);
+       struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap;
+       struct nilfs_bdesc *bdescs = buf;
+       int ret, i;
+
+       for (i = 0; i < nmembs; i++) {
+               ret = nilfs_bmap_lookup_at_level(bmap,
+                                                bdescs[i].bd_offset,
+                                                bdescs[i].bd_level + 1,
+                                                &bdescs[i].bd_blocknr);
+               if (ret < 0) {
+                       if (ret != -ENOENT)
+                               return ret;
+                       bdescs[i].bd_blocknr = 0;
+               }
+       }
+       return nmembs;
+}
+
+static int nilfs_ioctl_get_bdescs(struct inode *inode, struct file *filp,
+                                 unsigned int cmd, void __user *argp)
+{
+       struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs;
+       struct nilfs_argv argv;
+       int ret;
+
+       if (copy_from_user(&argv, argp, sizeof(argv)))
+               return -EFAULT;
+
+       down_read(&nilfs->ns_segctor_sem);
+       ret = nilfs_ioctl_wrap_copy(nilfs, &argv, _IOC_DIR(cmd),
+                                   nilfs_ioctl_do_get_bdescs);
+       up_read(&nilfs->ns_segctor_sem);
+       if (ret < 0)
+               return ret;
+
+       if (copy_to_user(argp, &argv, sizeof(argv)))
+               ret = -EFAULT;
+       return ret;
+}
+
+static int nilfs_ioctl_move_inode_block(struct inode *inode,
+                                       struct nilfs_vdesc *vdesc,
+                                       struct list_head *buffers)
+{
+       struct buffer_head *bh;
+       int ret;
+
+       if (vdesc->vd_flags == 0)
+               ret = nilfs_gccache_submit_read_data(
+                       inode, vdesc->vd_offset, vdesc->vd_blocknr,
+                       vdesc->vd_vblocknr, &bh);
+       else
+               ret = nilfs_gccache_submit_read_node(
+                       inode, vdesc->vd_blocknr, vdesc->vd_vblocknr, &bh);
+
+       if (unlikely(ret < 0)) {
+               if (ret == -ENOENT)
+                       printk(KERN_CRIT
+                              "%s: invalid virtual block address (%s): "
+                              "ino=%llu, cno=%llu, offset=%llu, "
+                              "blocknr=%llu, vblocknr=%llu\n",
+                              __func__, vdesc->vd_flags ? "node" : "data",
+                              (unsigned long long)vdesc->vd_ino,
+                              (unsigned long long)vdesc->vd_cno,
+                              (unsigned long long)vdesc->vd_offset,
+                              (unsigned long long)vdesc->vd_blocknr,
+                              (unsigned long long)vdesc->vd_vblocknr);
+               return ret;
+       }
+       bh->b_private = vdesc;
+       list_add_tail(&bh->b_assoc_buffers, buffers);
+       return 0;
+}
+
+static ssize_t
+nilfs_ioctl_do_move_blocks(struct the_nilfs *nilfs, __u64 *posp, int flags,
+                          void *buf, size_t size, size_t nmembs)
+{
+       struct inode *inode;
+       struct nilfs_vdesc *vdesc;
+       struct buffer_head *bh, *n;
+       LIST_HEAD(buffers);
+       ino_t ino;
+       __u64 cno;
+       int i, ret;
+
+       for (i = 0, vdesc = buf; i < nmembs; ) {
+               ino = vdesc->vd_ino;
+               cno = vdesc->vd_cno;
+               inode = nilfs_gc_iget(nilfs, ino, cno);
+               if (unlikely(inode == NULL)) {
+                       ret = -ENOMEM;
+                       goto failed;
+               }
+               do {
+                       ret = nilfs_ioctl_move_inode_block(inode, vdesc,
+                                                          &buffers);
+                       if (unlikely(ret < 0))
+                               goto failed;
+                       vdesc++;
+               } while (++i < nmembs &&
+                        vdesc->vd_ino == ino && vdesc->vd_cno == cno);
+       }
+
+       list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) {
+               ret = nilfs_gccache_wait_and_mark_dirty(bh);
+               if (unlikely(ret < 0)) {
+                       if (ret == -EEXIST) {
+                               vdesc = bh->b_private;
+                               printk(KERN_CRIT
+                                      "%s: conflicting %s buffer: "
+                                      "ino=%llu, cno=%llu, offset=%llu, "
+                                      "blocknr=%llu, vblocknr=%llu\n",
+                                      __func__,
+                                      vdesc->vd_flags ? "node" : "data",
+                                      (unsigned long long)vdesc->vd_ino,
+                                      (unsigned long long)vdesc->vd_cno,
+                                      (unsigned long long)vdesc->vd_offset,
+                                      (unsigned long long)vdesc->vd_blocknr,
+                                      (unsigned long long)vdesc->vd_vblocknr);
+                       }
+                       goto failed;
+               }
+               list_del_init(&bh->b_assoc_buffers);
+               bh->b_private = NULL;
+               brelse(bh);
+       }
+       return nmembs;
+
+ failed:
+       list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) {
+               list_del_init(&bh->b_assoc_buffers);
+               bh->b_private = NULL;
+               brelse(bh);
+       }
+       return ret;
+}
+
+static inline int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs,
+                                         struct nilfs_argv *argv,
+                                         int dir)
+{
+       return nilfs_ioctl_wrap_copy(nilfs, argv, dir,
+                                    nilfs_ioctl_do_move_blocks);
+}
+
+static ssize_t
+nilfs_ioctl_do_delete_checkpoints(struct the_nilfs *nilfs, __u64 *posp,
+                                 int flags, void *buf, size_t size,
+                                 size_t nmembs)
+{
+       struct inode *cpfile = nilfs->ns_cpfile;
+       struct nilfs_period *periods = buf;
+       int ret, i;
+
+       for (i = 0; i < nmembs; i++) {
+               ret = nilfs_cpfile_delete_checkpoints(
+                       cpfile, periods[i].p_start, periods[i].p_end);
+               if (ret < 0)
+                       return ret;
+       }
+       return nmembs;
+}
+
+static inline int nilfs_ioctl_delete_checkpoints(struct the_nilfs *nilfs,
+                                                struct nilfs_argv *argv,
+                                                int dir)
+{
+       return nilfs_ioctl_wrap_copy(nilfs, argv, dir,
+                                    nilfs_ioctl_do_delete_checkpoints);
+}
+
+static ssize_t
+nilfs_ioctl_do_free_vblocknrs(struct the_nilfs *nilfs, __u64 *posp, int flags,
+                             void *buf, size_t size, size_t nmembs)
+{
+       int ret = nilfs_dat_freev(nilfs_dat_inode(nilfs), buf, nmembs);
+
+       return (ret < 0) ? ret : nmembs;
+}
+
+static inline int nilfs_ioctl_free_vblocknrs(struct the_nilfs *nilfs,
+                                            struct nilfs_argv *argv,
+                                            int dir)
+{
+       return nilfs_ioctl_wrap_copy(nilfs, argv, dir,
+                                    nilfs_ioctl_do_free_vblocknrs);
+}
+
+static ssize_t
+nilfs_ioctl_do_mark_blocks_dirty(struct the_nilfs *nilfs, __u64 *posp,
+                                int flags, void *buf, size_t size,
+                                size_t nmembs)
+{
+       struct inode *dat = nilfs_dat_inode(nilfs);
+       struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap;
+       struct nilfs_bdesc *bdescs = buf;
+       int ret, i;
+
+       for (i = 0; i < nmembs; i++) {
+               /* XXX: use macro or inline func to check liveness */
+               ret = nilfs_bmap_lookup_at_level(bmap,
+                                                bdescs[i].bd_offset,
+                                                bdescs[i].bd_level + 1,
+                                                &bdescs[i].bd_blocknr);
+               if (ret < 0) {
+                       if (ret != -ENOENT)
+                               return ret;
+                       bdescs[i].bd_blocknr = 0;
+               }
+               if (bdescs[i].bd_blocknr != bdescs[i].bd_oblocknr)
+                       /* skip dead block */
+                       continue;
+               if (bdescs[i].bd_level == 0) {
+                       ret = nilfs_mdt_mark_block_dirty(dat,
+                                                        bdescs[i].bd_offset);
+                       if (ret < 0) {
+                               WARN_ON(ret == -ENOENT);
+                               return ret;
+                       }
+               } else {
+                       ret = nilfs_bmap_mark(bmap, bdescs[i].bd_offset,
+                                             bdescs[i].bd_level);
+                       if (ret < 0) {
+                               WARN_ON(ret == -ENOENT);
+                               return ret;
+                       }
+               }
+       }
+       return nmembs;
+}
+
+static inline int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs,
+                                               struct nilfs_argv *argv,
+                                               int dir)
+{
+       return nilfs_ioctl_wrap_copy(nilfs, argv, dir,
+                                    nilfs_ioctl_do_mark_blocks_dirty);
+}
+
+static ssize_t
+nilfs_ioctl_do_free_segments(struct the_nilfs *nilfs, __u64 *posp, int flags,
+                            void *buf, size_t size, size_t nmembs)
+{
+       struct nilfs_sb_info *sbi = nilfs_get_writer(nilfs);
+       int ret;
+
+       if (unlikely(!sbi))
+               return -EROFS;
+       ret = nilfs_segctor_add_segments_to_be_freed(
+               NILFS_SC(sbi), buf, nmembs);
+       nilfs_put_writer(nilfs);
+
+       return (ret < 0) ? ret : nmembs;
+}
+
+static inline int nilfs_ioctl_free_segments(struct the_nilfs *nilfs,
+                                            struct nilfs_argv *argv,
+                                            int dir)
+{
+       return nilfs_ioctl_wrap_copy(nilfs, argv, dir,
+                                    nilfs_ioctl_do_free_segments);
+}
+
+int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *nilfs,
+                                      void __user *argp)
+{
+       struct nilfs_argv argv[5];
+       const char *msg;
+       int dir, ret;
+
+       if (copy_from_user(argv, argp, sizeof(argv)))
+               return -EFAULT;
+
+       dir = _IOC_WRITE;
+       ret = nilfs_ioctl_move_blocks(nilfs, &argv[0], dir);
+       if (ret < 0) {
+               msg = "cannot read source blocks";
+               goto failed;
+       }
+       ret = nilfs_ioctl_delete_checkpoints(nilfs, &argv[1], dir);
+       if (ret < 0) {
+               /*
+                * can safely abort because checkpoints can be removed
+                * independently.
+                */
+               msg = "cannot delete checkpoints";
+               goto failed;
+       }
+       ret = nilfs_ioctl_free_vblocknrs(nilfs, &argv[2], dir);
+       if (ret < 0) {
+               /*
+                * can safely abort because DAT file is updated atomically
+                * using a copy-on-write technique.
+                */
+               msg = "cannot delete virtual blocks from DAT file";
+               goto failed;
+       }
+       ret = nilfs_ioctl_mark_blocks_dirty(nilfs, &argv[3], dir);
+       if (ret < 0) {
+               /*
+                * can safely abort because the operation is nondestructive.
+                */
+               msg = "cannot mark copying blocks dirty";
+               goto failed;
+       }
+       ret = nilfs_ioctl_free_segments(nilfs, &argv[4], dir);
+       if (ret < 0) {
+               /*
+                * can safely abort because this operation is atomic.
+                */
+               msg = "cannot set segments to be freed";
+               goto failed;
+       }
+       return 0;
+
+ failed:
+       nilfs_remove_all_gcinode(nilfs);
+       printk(KERN_ERR "NILFS: GC failed during preparation: %s: err=%d\n",
+              msg, ret);
+       return ret;
+}
+
+static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp,
+                                     unsigned int cmd, void __user *argp)
+{
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+       return nilfs_clean_segments(inode->i_sb, argp);
+}
+
+static int nilfs_ioctl_sync(struct inode *inode, struct file *filp,
+                           unsigned int cmd, void __user *argp)
+{
+       __u64 cno;
+       int ret;
+
+       ret = nilfs_construct_segment(inode->i_sb);
+       if (ret < 0)
+               return ret;
+
+       if (argp != NULL) {
+               cno = NILFS_SB(inode->i_sb)->s_nilfs->ns_cno - 1;
+               if (copy_to_user(argp, &cno, sizeof(cno)))
+                       return -EFAULT;
+       }
+       return 0;
+}
+
+long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+       struct inode *inode = filp->f_dentry->d_inode;
+       void __user *argp = (void * __user *)arg;
+
+       switch (cmd) {
+       case NILFS_IOCTL_CHANGE_CPMODE:
+               return nilfs_ioctl_change_cpmode(inode, filp, cmd, argp);
+       case NILFS_IOCTL_DELETE_CHECKPOINT:
+               return nilfs_ioctl_delete_checkpoint(inode, filp, cmd, argp);
+       case NILFS_IOCTL_GET_CPINFO:
+               return nilfs_ioctl_get_cpinfo(inode, filp, cmd, argp);
+       case NILFS_IOCTL_GET_CPSTAT:
+               return nilfs_ioctl_get_cpstat(inode, filp, cmd, argp);
+       case NILFS_IOCTL_GET_SUINFO:
+               return nilfs_ioctl_get_suinfo(inode, filp, cmd, argp);
+       case NILFS_IOCTL_GET_SUSTAT:
+               return nilfs_ioctl_get_sustat(inode, filp, cmd, argp);
+       case NILFS_IOCTL_GET_VINFO:
+               /* XXX: rename to ??? */
+               return nilfs_ioctl_get_vinfo(inode, filp, cmd, argp);
+       case NILFS_IOCTL_GET_BDESCS:
+               return nilfs_ioctl_get_bdescs(inode, filp, cmd, argp);
+       case NILFS_IOCTL_CLEAN_SEGMENTS:
+               return nilfs_ioctl_clean_segments(inode, filp, cmd, argp);
+       case NILFS_IOCTL_SYNC:
+               return nilfs_ioctl_sync(inode, filp, cmd, argp);
+       default:
+               return -ENOTTY;
+       }
+}
diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c
new file mode 100644 (file)
index 0000000..47dd815
--- /dev/null
@@ -0,0 +1,563 @@
+/*
+ * mdt.c - meta data file for NILFS
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ */
+
+#include <linux/buffer_head.h>
+#include <linux/mpage.h>
+#include <linux/mm.h>
+#include <linux/writeback.h>
+#include <linux/backing-dev.h>
+#include <linux/swap.h>
+#include "nilfs.h"
+#include "segment.h"
+#include "page.h"
+#include "mdt.h"
+
+
+#define NILFS_MDT_MAX_RA_BLOCKS                (16 - 1)
+
+#define INIT_UNUSED_INODE_FIELDS
+
+static int
+nilfs_mdt_insert_new_block(struct inode *inode, unsigned long block,
+                          struct buffer_head *bh,
+                          void (*init_block)(struct inode *,
+                                             struct buffer_head *, void *))
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+       void *kaddr;
+       int ret;
+
+       /* Caller exclude read accesses using page lock */
+
+       /* set_buffer_new(bh); */
+       bh->b_blocknr = 0;
+
+       ret = nilfs_bmap_insert(ii->i_bmap, block, (unsigned long)bh);
+       if (unlikely(ret))
+               return ret;
+
+       set_buffer_mapped(bh);
+
+       kaddr = kmap_atomic(bh->b_page, KM_USER0);
+       memset(kaddr + bh_offset(bh), 0, 1 << inode->i_blkbits);
+       if (init_block)
+               init_block(inode, bh, kaddr);
+       flush_dcache_page(bh->b_page);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       set_buffer_uptodate(bh);
+       nilfs_mark_buffer_dirty(bh);
+       nilfs_mdt_mark_dirty(inode);
+       return 0;
+}
+
+static int nilfs_mdt_create_block(struct inode *inode, unsigned long block,
+                                 struct buffer_head **out_bh,
+                                 void (*init_block)(struct inode *,
+                                                    struct buffer_head *,
+                                                    void *))
+{
+       struct the_nilfs *nilfs = NILFS_MDT(inode)->mi_nilfs;
+       struct nilfs_sb_info *writer = NULL;
+       struct super_block *sb = inode->i_sb;
+       struct nilfs_transaction_info ti;
+       struct buffer_head *bh;
+       int err;
+
+       if (!sb) {
+               writer = nilfs_get_writer(nilfs);
+               if (!writer) {
+                       err = -EROFS;
+                       goto out;
+               }
+               sb = writer->s_super;
+       }
+
+       nilfs_transaction_begin(sb, &ti, 0);
+
+       err = -ENOMEM;
+       bh = nilfs_grab_buffer(inode, inode->i_mapping, block, 0);
+       if (unlikely(!bh))
+               goto failed_unlock;
+
+       err = -EEXIST;
+       if (buffer_uptodate(bh) || buffer_mapped(bh))
+               goto failed_bh;
+#if 0
+       /* The uptodate flag is not protected by the page lock, but
+          the mapped flag is.  Thus, we don't have to wait the buffer. */
+       wait_on_buffer(bh);
+       if (buffer_uptodate(bh))
+               goto failed_bh;
+#endif
+
+       bh->b_bdev = nilfs->ns_bdev;
+       err = nilfs_mdt_insert_new_block(inode, block, bh, init_block);
+       if (likely(!err)) {
+               get_bh(bh);
+               *out_bh = bh;
+       }
+
+ failed_bh:
+       unlock_page(bh->b_page);
+       page_cache_release(bh->b_page);
+       brelse(bh);
+
+ failed_unlock:
+       if (likely(!err))
+               err = nilfs_transaction_commit(sb);
+       else
+               nilfs_transaction_abort(sb);
+       if (writer)
+               nilfs_put_writer(nilfs);
+ out:
+       return err;
+}
+
+static int
+nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff,
+                      int mode, struct buffer_head **out_bh)
+{
+       struct buffer_head *bh;
+       unsigned long blknum = 0;
+       int ret = -ENOMEM;
+
+       bh = nilfs_grab_buffer(inode, inode->i_mapping, blkoff, 0);
+       if (unlikely(!bh))
+               goto failed;
+
+       ret = -EEXIST; /* internal code */
+       if (buffer_uptodate(bh))
+               goto out;
+
+       if (mode == READA) {
+               if (!trylock_buffer(bh)) {
+                       ret = -EBUSY;
+                       goto failed_bh;
+               }
+       } else /* mode == READ */
+               lock_buffer(bh);
+
+       if (buffer_uptodate(bh)) {
+               unlock_buffer(bh);
+               goto out;
+       }
+       if (!buffer_mapped(bh)) { /* unused buffer */
+               ret = nilfs_bmap_lookup(NILFS_I(inode)->i_bmap, blkoff,
+                                       &blknum);
+               if (unlikely(ret)) {
+                       unlock_buffer(bh);
+                       goto failed_bh;
+               }
+               bh->b_bdev = NILFS_MDT(inode)->mi_nilfs->ns_bdev;
+               bh->b_blocknr = blknum;
+               set_buffer_mapped(bh);
+       }
+
+       bh->b_end_io = end_buffer_read_sync;
+       get_bh(bh);
+       submit_bh(mode, bh);
+       ret = 0;
+ out:
+       get_bh(bh);
+       *out_bh = bh;
+
+ failed_bh:
+       unlock_page(bh->b_page);
+       page_cache_release(bh->b_page);
+       brelse(bh);
+ failed:
+       return ret;
+}
+
+static int nilfs_mdt_read_block(struct inode *inode, unsigned long block,
+                               struct buffer_head **out_bh)
+{
+       struct buffer_head *first_bh, *bh;
+       unsigned long blkoff;
+       int i, nr_ra_blocks = NILFS_MDT_MAX_RA_BLOCKS;
+       int err;
+
+       err = nilfs_mdt_submit_block(inode, block, READ, &first_bh);
+       if (err == -EEXIST) /* internal code */
+               goto out;
+
+       if (unlikely(err))
+               goto failed;
+
+       blkoff = block + 1;
+       for (i = 0; i < nr_ra_blocks; i++, blkoff++) {
+               err = nilfs_mdt_submit_block(inode, blkoff, READA, &bh);
+               if (likely(!err || err == -EEXIST))
+                       brelse(bh);
+               else if (err != -EBUSY)
+                       break; /* abort readahead if bmap lookup failed */
+
+               if (!buffer_locked(first_bh))
+                       goto out_no_wait;
+       }
+
+       wait_on_buffer(first_bh);
+
+ out_no_wait:
+       err = -EIO;
+       if (!buffer_uptodate(first_bh))
+               goto failed_bh;
+ out:
+       *out_bh = first_bh;
+       return 0;
+
+ failed_bh:
+       brelse(first_bh);
+ failed:
+       return err;
+}
+
+/**
+ * nilfs_mdt_get_block - read or create a buffer on meta data file.
+ * @inode: inode of the meta data file
+ * @blkoff: block offset
+ * @create: create flag
+ * @init_block: initializer used for newly allocated block
+ * @out_bh: output of a pointer to the buffer_head
+ *
+ * nilfs_mdt_get_block() looks up the specified buffer and tries to create
+ * a new buffer if @create is not zero.  On success, the returned buffer is
+ * assured to be either existing or formatted using a buffer lock on success.
+ * @out_bh is substituted only when zero is returned.
+ *
+ * Return Value: On success, it returns 0. On error, the following negative
+ * error code is returned.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ *
+ * %-EIO - I/O error
+ *
+ * %-ENOENT - the specified block does not exist (hole block)
+ *
+ * %-EINVAL - bmap is broken. (the caller should call nilfs_error())
+ *
+ * %-EROFS - Read only filesystem (for create mode)
+ */
+int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create,
+                       void (*init_block)(struct inode *,
+                                          struct buffer_head *, void *),
+                       struct buffer_head **out_bh)
+{
+       int ret;
+
+       /* Should be rewritten with merging nilfs_mdt_read_block() */
+ retry:
+       ret = nilfs_mdt_read_block(inode, blkoff, out_bh);
+       if (!create || ret != -ENOENT)
+               return ret;
+
+       ret = nilfs_mdt_create_block(inode, blkoff, out_bh, init_block);
+       if (unlikely(ret == -EEXIST)) {
+               /* create = 0; */  /* limit read-create loop retries */
+               goto retry;
+       }
+       return ret;
+}
+
+/**
+ * nilfs_mdt_delete_block - make a hole on the meta data file.
+ * @inode: inode of the meta data file
+ * @block: block offset
+ *
+ * Return Value: On success, zero is returned.
+ * On error, one of the following negative error code is returned.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ *
+ * %-EIO - I/O error
+ *
+ * %-EINVAL - bmap is broken. (the caller should call nilfs_error())
+ */
+int nilfs_mdt_delete_block(struct inode *inode, unsigned long block)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+       int err;
+
+       err = nilfs_bmap_delete(ii->i_bmap, block);
+       if (likely(!err)) {
+               nilfs_mdt_mark_dirty(inode);
+               nilfs_mdt_forget_block(inode, block);
+       }
+       return err;
+}
+
+/**
+ * nilfs_mdt_forget_block - discard dirty state and try to remove the page
+ * @inode: inode of the meta data file
+ * @block: block offset
+ *
+ * nilfs_mdt_forget_block() clears a dirty flag of the specified buffer, and
+ * tries to release the page including the buffer from a page cache.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error code is returned.
+ *
+ * %-EBUSY - page has an active buffer.
+ *
+ * %-ENOENT - page cache has no page addressed by the offset.
+ */
+int nilfs_mdt_forget_block(struct inode *inode, unsigned long block)
+{
+       pgoff_t index = (pgoff_t)block >>
+               (PAGE_CACHE_SHIFT - inode->i_blkbits);
+       struct page *page;
+       unsigned long first_block;
+       int ret = 0;
+       int still_dirty;
+
+       page = find_lock_page(inode->i_mapping, index);
+       if (!page)
+               return -ENOENT;
+
+       wait_on_page_writeback(page);
+
+       first_block = (unsigned long)index <<
+               (PAGE_CACHE_SHIFT - inode->i_blkbits);
+       if (page_has_buffers(page)) {
+               struct buffer_head *bh;
+
+               bh = nilfs_page_get_nth_block(page, block - first_block);
+               nilfs_forget_buffer(bh);
+       }
+       still_dirty = PageDirty(page);
+       unlock_page(page);
+       page_cache_release(page);
+
+       if (still_dirty ||
+           invalidate_inode_pages2_range(inode->i_mapping, index, index) != 0)
+               ret = -EBUSY;
+       return ret;
+}
+
+/**
+ * nilfs_mdt_mark_block_dirty - mark a block on the meta data file dirty.
+ * @inode: inode of the meta data file
+ * @block: block offset
+ *
+ * Return Value: On success, it returns 0. On error, the following negative
+ * error code is returned.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ *
+ * %-EIO - I/O error
+ *
+ * %-ENOENT - the specified block does not exist (hole block)
+ *
+ * %-EINVAL - bmap is broken. (the caller should call nilfs_error())
+ */
+int nilfs_mdt_mark_block_dirty(struct inode *inode, unsigned long block)
+{
+       struct buffer_head *bh;
+       int err;
+
+       err = nilfs_mdt_read_block(inode, block, &bh);
+       if (unlikely(err))
+               return err;
+       nilfs_mark_buffer_dirty(bh);
+       nilfs_mdt_mark_dirty(inode);
+       brelse(bh);
+       return 0;
+}
+
+int nilfs_mdt_fetch_dirty(struct inode *inode)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+
+       if (nilfs_bmap_test_and_clear_dirty(ii->i_bmap)) {
+               set_bit(NILFS_I_DIRTY, &ii->i_state);
+               return 1;
+       }
+       return test_bit(NILFS_I_DIRTY, &ii->i_state);
+}
+
+static int
+nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
+{
+       struct inode *inode = container_of(page->mapping,
+                                          struct inode, i_data);
+       struct super_block *sb = inode->i_sb;
+       struct nilfs_sb_info *writer = NULL;
+       int err = 0;
+
+       redirty_page_for_writepage(wbc, page);
+       unlock_page(page);
+
+       if (page->mapping->assoc_mapping)
+               return 0; /* Do not request flush for shadow page cache */
+       if (!sb) {
+               writer = nilfs_get_writer(NILFS_MDT(inode)->mi_nilfs);
+               if (!writer)
+                       return -EROFS;
+               sb = writer->s_super;
+       }
+
+       if (wbc->sync_mode == WB_SYNC_ALL)
+               err = nilfs_construct_segment(sb);
+       else if (wbc->for_reclaim)
+               nilfs_flush_segment(sb, inode->i_ino);
+
+       if (writer)
+               nilfs_put_writer(NILFS_MDT(inode)->mi_nilfs);
+       return err;
+}
+
+
+static struct address_space_operations def_mdt_aops = {
+       .writepage              = nilfs_mdt_write_page,
+};
+
+static struct inode_operations def_mdt_iops;
+static struct file_operations def_mdt_fops;
+
+/*
+ * NILFS2 uses pseudo inodes for meta data files such as DAT, cpfile, sufile,
+ * ifile, or gcinodes.  This allows the B-tree code and segment constructor
+ * to treat them like regular files, and this helps to simplify the
+ * implementation.
+ *   On the other hand, some of the pseudo inodes have an irregular point:
+ * They don't have valid inode->i_sb pointer because their lifetimes are
+ * longer than those of the super block structs; they may continue for
+ * several consecutive mounts/umounts.  This would need discussions.
+ */
+struct inode *
+nilfs_mdt_new_common(struct the_nilfs *nilfs, struct super_block *sb,
+                    ino_t ino, gfp_t gfp_mask)
+{
+       struct inode *inode = nilfs_alloc_inode(sb);
+
+       if (!inode)
+               return NULL;
+       else {
+               struct address_space * const mapping = &inode->i_data;
+               struct nilfs_mdt_info *mi = kzalloc(sizeof(*mi), GFP_NOFS);
+
+               if (!mi) {
+                       nilfs_destroy_inode(inode);
+                       return NULL;
+               }
+               mi->mi_nilfs = nilfs;
+               init_rwsem(&mi->mi_sem);
+
+               inode->i_sb = sb; /* sb may be NULL for some meta data files */
+               inode->i_blkbits = nilfs->ns_blocksize_bits;
+               inode->i_flags = 0;
+               atomic_set(&inode->i_count, 1);
+               inode->i_nlink = 1;
+               inode->i_ino = ino;
+               inode->i_mode = S_IFREG;
+               inode->i_private = mi;
+
+#ifdef INIT_UNUSED_INODE_FIELDS
+               atomic_set(&inode->i_writecount, 0);
+               inode->i_size = 0;
+               inode->i_blocks = 0;
+               inode->i_bytes = 0;
+               inode->i_generation = 0;
+#ifdef CONFIG_QUOTA
+               memset(&inode->i_dquot, 0, sizeof(inode->i_dquot));
+#endif
+               inode->i_pipe = NULL;
+               inode->i_bdev = NULL;
+               inode->i_cdev = NULL;
+               inode->i_rdev = 0;
+#ifdef CONFIG_SECURITY
+               inode->i_security = NULL;
+#endif
+               inode->dirtied_when = 0;
+
+               INIT_LIST_HEAD(&inode->i_list);
+               INIT_LIST_HEAD(&inode->i_sb_list);
+               inode->i_state = 0;
+#endif
+
+               spin_lock_init(&inode->i_lock);
+               mutex_init(&inode->i_mutex);
+               init_rwsem(&inode->i_alloc_sem);
+
+               mapping->host = NULL;  /* instead of inode */
+               mapping->flags = 0;
+               mapping_set_gfp_mask(mapping, gfp_mask);
+               mapping->assoc_mapping = NULL;
+               mapping->backing_dev_info = nilfs->ns_bdi;
+
+               inode->i_mapping = mapping;
+       }
+
+       return inode;
+}
+
+struct inode *nilfs_mdt_new(struct the_nilfs *nilfs, struct super_block *sb,
+                           ino_t ino, gfp_t gfp_mask)
+{
+       struct inode *inode = nilfs_mdt_new_common(nilfs, sb, ino, gfp_mask);
+
+       if (!inode)
+               return NULL;
+
+       inode->i_op = &def_mdt_iops;
+       inode->i_fop = &def_mdt_fops;
+       inode->i_mapping->a_ops = &def_mdt_aops;
+       return inode;
+}
+
+void nilfs_mdt_set_entry_size(struct inode *inode, unsigned entry_size,
+                             unsigned header_size)
+{
+       struct nilfs_mdt_info *mi = NILFS_MDT(inode);
+
+       mi->mi_entry_size = entry_size;
+       mi->mi_entries_per_block = (1 << inode->i_blkbits) / entry_size;
+       mi->mi_first_entry_offset = DIV_ROUND_UP(header_size, entry_size);
+}
+
+void nilfs_mdt_set_shadow(struct inode *orig, struct inode *shadow)
+{
+       shadow->i_mapping->assoc_mapping = orig->i_mapping;
+       NILFS_I(shadow)->i_btnode_cache.assoc_mapping =
+               &NILFS_I(orig)->i_btnode_cache;
+}
+
+void nilfs_mdt_clear(struct inode *inode)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+
+       invalidate_mapping_pages(inode->i_mapping, 0, -1);
+       truncate_inode_pages(inode->i_mapping, 0);
+
+       nilfs_bmap_clear(ii->i_bmap);
+       nilfs_btnode_cache_clear(&ii->i_btnode_cache);
+}
+
+void nilfs_mdt_destroy(struct inode *inode)
+{
+       struct nilfs_mdt_info *mdi = NILFS_MDT(inode);
+
+       kfree(mdi->mi_bgl); /* kfree(NULL) is safe */
+       kfree(mdi);
+       nilfs_destroy_inode(inode);
+}
diff --git a/fs/nilfs2/mdt.h b/fs/nilfs2/mdt.h
new file mode 100644 (file)
index 0000000..df683e0
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * mdt.h - NILFS meta data file prototype and definitions
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ */
+
+#ifndef _NILFS_MDT_H
+#define _NILFS_MDT_H
+
+#include <linux/buffer_head.h>
+#include <linux/blockgroup_lock.h>
+#include "nilfs.h"
+#include "page.h"
+
+/**
+ * struct nilfs_mdt_info - on-memory private data of meta data files
+ * @mi_nilfs: back pointer to the_nilfs struct
+ * @mi_sem: reader/writer semaphore for meta data operations
+ * @mi_bgl: per-blockgroup locking
+ * @mi_entry_size: size of an entry
+ * @mi_first_entry_offset: offset to the first entry
+ * @mi_entries_per_block: number of entries in a block
+ * @mi_blocks_per_group: number of blocks in a group
+ * @mi_blocks_per_desc_block: number of blocks per descriptor block
+ */
+struct nilfs_mdt_info {
+       struct the_nilfs       *mi_nilfs;
+       struct rw_semaphore     mi_sem;
+       struct blockgroup_lock *mi_bgl;
+       unsigned                mi_entry_size;
+       unsigned                mi_first_entry_offset;
+       unsigned long           mi_entries_per_block;
+       unsigned long           mi_blocks_per_group;
+       unsigned long           mi_blocks_per_desc_block;
+};
+
+static inline struct nilfs_mdt_info *NILFS_MDT(const struct inode *inode)
+{
+       return inode->i_private;
+}
+
+static inline struct the_nilfs *NILFS_I_NILFS(struct inode *inode)
+{
+       struct super_block *sb = inode->i_sb;
+
+       return sb ? NILFS_SB(sb)->s_nilfs : NILFS_MDT(inode)->mi_nilfs;
+}
+
+/* Default GFP flags using highmem */
+#define NILFS_MDT_GFP      (__GFP_WAIT | __GFP_IO | __GFP_HIGHMEM)
+
+int nilfs_mdt_get_block(struct inode *, unsigned long, int,
+                       void (*init_block)(struct inode *,
+                                          struct buffer_head *, void *),
+                       struct buffer_head **);
+int nilfs_mdt_delete_block(struct inode *, unsigned long);
+int nilfs_mdt_forget_block(struct inode *, unsigned long);
+int nilfs_mdt_mark_block_dirty(struct inode *, unsigned long);
+int nilfs_mdt_fetch_dirty(struct inode *);
+
+struct inode *nilfs_mdt_new(struct the_nilfs *, struct super_block *, ino_t,
+                           gfp_t);
+struct inode *nilfs_mdt_new_common(struct the_nilfs *, struct super_block *,
+                                  ino_t, gfp_t);
+void nilfs_mdt_destroy(struct inode *);
+void nilfs_mdt_clear(struct inode *);
+void nilfs_mdt_set_entry_size(struct inode *, unsigned, unsigned);
+void nilfs_mdt_set_shadow(struct inode *, struct inode *);
+
+
+#define nilfs_mdt_mark_buffer_dirty(bh)        nilfs_mark_buffer_dirty(bh)
+
+static inline void nilfs_mdt_mark_dirty(struct inode *inode)
+{
+       if (!test_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state))
+               set_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state);
+}
+
+static inline void nilfs_mdt_clear_dirty(struct inode *inode)
+{
+       clear_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state);
+}
+
+static inline __u64 nilfs_mdt_cno(struct inode *inode)
+{
+       return NILFS_MDT(inode)->mi_nilfs->ns_cno;
+}
+
+#define nilfs_mdt_bgl_lock(inode, bg) \
+       (&NILFS_MDT(inode)->mi_bgl->locks[(bg) & (NR_BG_LOCKS-1)].lock)
+
+
+static inline int
+nilfs_mdt_read_inode_direct(struct inode *inode, struct buffer_head *bh,
+                           unsigned n)
+{
+       return nilfs_read_inode_common(
+               inode, (struct nilfs_inode *)(bh->b_data + n));
+}
+
+static inline void
+nilfs_mdt_write_inode_direct(struct inode *inode, struct buffer_head *bh,
+                            unsigned n)
+{
+       nilfs_write_inode_common(
+               inode, (struct nilfs_inode *)(bh->b_data + n), 1);
+}
+
+#endif /* _NILFS_MDT_H */
diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c
new file mode 100644 (file)
index 0000000..df70dad
--- /dev/null
@@ -0,0 +1,474 @@
+/*
+ * namei.c - NILFS pathname lookup operations.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Modified for NILFS by Amagai Yoshiji <amagai@osrg.net>,
+ *                       Ryusuke Konishi <ryusuke@osrg.net>
+ */
+/*
+ *  linux/fs/ext2/namei.c
+ *
+ * Copyright (C) 1992, 1993, 1994, 1995
+ * Remy Card (card@masi.ibp.fr)
+ * Laboratoire MASI - Institut Blaise Pascal
+ * Universite Pierre et Marie Curie (Paris VI)
+ *
+ *  from
+ *
+ *  linux/fs/minix/namei.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ *  Big-endian to little-endian byte-swapping/bitmaps by
+ *        David S. Miller (davem@caip.rutgers.edu), 1995
+ */
+
+#include <linux/pagemap.h>
+#include "nilfs.h"
+
+
+static inline int nilfs_add_nondir(struct dentry *dentry, struct inode *inode)
+{
+       int err = nilfs_add_link(dentry, inode);
+       if (!err) {
+               d_instantiate(dentry, inode);
+               return 0;
+       }
+       inode_dec_link_count(inode);
+       iput(inode);
+       return err;
+}
+
+/*
+ * Methods themselves.
+ */
+
+static struct dentry *
+nilfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
+{
+       struct inode *inode;
+       ino_t ino;
+
+       if (dentry->d_name.len > NILFS_NAME_LEN)
+               return ERR_PTR(-ENAMETOOLONG);
+
+       ino = nilfs_inode_by_name(dir, dentry);
+       inode = NULL;
+       if (ino) {
+               inode = nilfs_iget(dir->i_sb, ino);
+               if (IS_ERR(inode))
+                       return ERR_CAST(inode);
+       }
+       return d_splice_alias(inode, dentry);
+}
+
+struct dentry *nilfs_get_parent(struct dentry *child)
+{
+       unsigned long ino;
+       struct inode *inode;
+       struct dentry dotdot;
+
+       dotdot.d_name.name = "..";
+       dotdot.d_name.len = 2;
+
+       ino = nilfs_inode_by_name(child->d_inode, &dotdot);
+       if (!ino)
+               return ERR_PTR(-ENOENT);
+
+       inode = nilfs_iget(child->d_inode->i_sb, ino);
+       if (IS_ERR(inode))
+               return ERR_CAST(inode);
+       return d_obtain_alias(inode);
+}
+
+/*
+ * By the time this is called, we already have created
+ * the directory cache entry for the new file, but it
+ * is so far negative - it has no inode.
+ *
+ * If the create succeeds, we fill in the inode information
+ * with d_instantiate().
+ */
+static int nilfs_create(struct inode *dir, struct dentry *dentry, int mode,
+                       struct nameidata *nd)
+{
+       struct inode *inode;
+       struct nilfs_transaction_info ti;
+       int err;
+
+       err = nilfs_transaction_begin(dir->i_sb, &ti, 1);
+       if (err)
+               return err;
+       inode = nilfs_new_inode(dir, mode);
+       err = PTR_ERR(inode);
+       if (!IS_ERR(inode)) {
+               inode->i_op = &nilfs_file_inode_operations;
+               inode->i_fop = &nilfs_file_operations;
+               inode->i_mapping->a_ops = &nilfs_aops;
+               mark_inode_dirty(inode);
+               err = nilfs_add_nondir(dentry, inode);
+       }
+       if (!err)
+               err = nilfs_transaction_commit(dir->i_sb);
+       else
+               nilfs_transaction_abort(dir->i_sb);
+
+       return err;
+}
+
+static int
+nilfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
+{
+       struct inode *inode;
+       struct nilfs_transaction_info ti;
+       int err;
+
+       if (!new_valid_dev(rdev))
+               return -EINVAL;
+
+       err = nilfs_transaction_begin(dir->i_sb, &ti, 1);
+       if (err)
+               return err;
+       inode = nilfs_new_inode(dir, mode);
+       err = PTR_ERR(inode);
+       if (!IS_ERR(inode)) {
+               init_special_inode(inode, inode->i_mode, rdev);
+               mark_inode_dirty(inode);
+               err = nilfs_add_nondir(dentry, inode);
+       }
+       if (!err)
+               err = nilfs_transaction_commit(dir->i_sb);
+       else
+               nilfs_transaction_abort(dir->i_sb);
+
+       return err;
+}
+
+static int nilfs_symlink(struct inode *dir, struct dentry *dentry,
+                        const char *symname)
+{
+       struct nilfs_transaction_info ti;
+       struct super_block *sb = dir->i_sb;
+       unsigned l = strlen(symname)+1;
+       struct inode *inode;
+       int err;
+
+       if (l > sb->s_blocksize)
+               return -ENAMETOOLONG;
+
+       err = nilfs_transaction_begin(dir->i_sb, &ti, 1);
+       if (err)
+               return err;
+
+       inode = nilfs_new_inode(dir, S_IFLNK | S_IRWXUGO);
+       err = PTR_ERR(inode);
+       if (IS_ERR(inode))
+               goto out;
+
+       /* slow symlink */
+       inode->i_op = &nilfs_symlink_inode_operations;
+       inode->i_mapping->a_ops = &nilfs_aops;
+       err = page_symlink(inode, symname, l);
+       if (err)
+               goto out_fail;
+
+       /* mark_inode_dirty(inode); */
+       /* nilfs_new_inode() and page_symlink() do this */
+
+       err = nilfs_add_nondir(dentry, inode);
+out:
+       if (!err)
+               err = nilfs_transaction_commit(dir->i_sb);
+       else
+               nilfs_transaction_abort(dir->i_sb);
+
+       return err;
+
+out_fail:
+       inode_dec_link_count(inode);
+       iput(inode);
+       goto out;
+}
+
+static int nilfs_link(struct dentry *old_dentry, struct inode *dir,
+                     struct dentry *dentry)
+{
+       struct inode *inode = old_dentry->d_inode;
+       struct nilfs_transaction_info ti;
+       int err;
+
+       if (inode->i_nlink >= NILFS_LINK_MAX)
+               return -EMLINK;
+
+       err = nilfs_transaction_begin(dir->i_sb, &ti, 1);
+       if (err)
+               return err;
+
+       inode->i_ctime = CURRENT_TIME;
+       inode_inc_link_count(inode);
+       atomic_inc(&inode->i_count);
+
+       err = nilfs_add_nondir(dentry, inode);
+       if (!err)
+               err = nilfs_transaction_commit(dir->i_sb);
+       else
+               nilfs_transaction_abort(dir->i_sb);
+
+       return err;
+}
+
+static int nilfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+{
+       struct inode *inode;
+       struct nilfs_transaction_info ti;
+       int err;
+
+       if (dir->i_nlink >= NILFS_LINK_MAX)
+               return -EMLINK;
+
+       err = nilfs_transaction_begin(dir->i_sb, &ti, 1);
+       if (err)
+               return err;
+
+       inode_inc_link_count(dir);
+
+       inode = nilfs_new_inode(dir, S_IFDIR | mode);
+       err = PTR_ERR(inode);
+       if (IS_ERR(inode))
+               goto out_dir;
+
+       inode->i_op = &nilfs_dir_inode_operations;
+       inode->i_fop = &nilfs_dir_operations;
+       inode->i_mapping->a_ops = &nilfs_aops;
+
+       inode_inc_link_count(inode);
+
+       err = nilfs_make_empty(inode, dir);
+       if (err)
+               goto out_fail;
+
+       err = nilfs_add_link(dentry, inode);
+       if (err)
+               goto out_fail;
+
+       d_instantiate(dentry, inode);
+out:
+       if (!err)
+               err = nilfs_transaction_commit(dir->i_sb);
+       else
+               nilfs_transaction_abort(dir->i_sb);
+
+       return err;
+
+out_fail:
+       inode_dec_link_count(inode);
+       inode_dec_link_count(inode);
+       iput(inode);
+out_dir:
+       inode_dec_link_count(dir);
+       goto out;
+}
+
+static int nilfs_unlink(struct inode *dir, struct dentry *dentry)
+{
+       struct inode *inode;
+       struct nilfs_dir_entry *de;
+       struct page *page;
+       struct nilfs_transaction_info ti;
+       int err;
+
+       err = nilfs_transaction_begin(dir->i_sb, &ti, 0);
+       if (err)
+               return err;
+
+       err = -ENOENT;
+       de = nilfs_find_entry(dir, dentry, &page);
+       if (!de)
+               goto out;
+
+       inode = dentry->d_inode;
+       err = -EIO;
+       if (le64_to_cpu(de->inode) != inode->i_ino)
+               goto out;
+
+       if (!inode->i_nlink) {
+               nilfs_warning(inode->i_sb, __func__,
+                             "deleting nonexistent file (%lu), %d\n",
+                             inode->i_ino, inode->i_nlink);
+               inode->i_nlink = 1;
+       }
+       err = nilfs_delete_entry(de, page);
+       if (err)
+               goto out;
+
+       inode->i_ctime = dir->i_ctime;
+       inode_dec_link_count(inode);
+       err = 0;
+out:
+       if (!err)
+               err = nilfs_transaction_commit(dir->i_sb);
+       else
+               nilfs_transaction_abort(dir->i_sb);
+
+       return err;
+}
+
+static int nilfs_rmdir(struct inode *dir, struct dentry *dentry)
+{
+       struct inode *inode = dentry->d_inode;
+       struct nilfs_transaction_info ti;
+       int err;
+
+       err = nilfs_transaction_begin(dir->i_sb, &ti, 0);
+       if (err)
+               return err;
+
+       err = -ENOTEMPTY;
+       if (nilfs_empty_dir(inode)) {
+               err = nilfs_unlink(dir, dentry);
+               if (!err) {
+                       inode->i_size = 0;
+                       inode_dec_link_count(inode);
+                       inode_dec_link_count(dir);
+               }
+       }
+       if (!err)
+               err = nilfs_transaction_commit(dir->i_sb);
+       else
+               nilfs_transaction_abort(dir->i_sb);
+
+       return err;
+}
+
+static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+                       struct inode *new_dir,  struct dentry *new_dentry)
+{
+       struct inode *old_inode = old_dentry->d_inode;
+       struct inode *new_inode = new_dentry->d_inode;
+       struct page *dir_page = NULL;
+       struct nilfs_dir_entry *dir_de = NULL;
+       struct page *old_page;
+       struct nilfs_dir_entry *old_de;
+       struct nilfs_transaction_info ti;
+       int err;
+
+       err = nilfs_transaction_begin(old_dir->i_sb, &ti, 1);
+       if (unlikely(err))
+               return err;
+
+       err = -ENOENT;
+       old_de = nilfs_find_entry(old_dir, old_dentry, &old_page);
+       if (!old_de)
+               goto out;
+
+       if (S_ISDIR(old_inode->i_mode)) {
+               err = -EIO;
+               dir_de = nilfs_dotdot(old_inode, &dir_page);
+               if (!dir_de)
+                       goto out_old;
+       }
+
+       if (new_inode) {
+               struct page *new_page;
+               struct nilfs_dir_entry *new_de;
+
+               err = -ENOTEMPTY;
+               if (dir_de && !nilfs_empty_dir(new_inode))
+                       goto out_dir;
+
+               err = -ENOENT;
+               new_de = nilfs_find_entry(new_dir, new_dentry, &new_page);
+               if (!new_de)
+                       goto out_dir;
+               inode_inc_link_count(old_inode);
+               nilfs_set_link(new_dir, new_de, new_page, old_inode);
+               new_inode->i_ctime = CURRENT_TIME;
+               if (dir_de)
+                       drop_nlink(new_inode);
+               inode_dec_link_count(new_inode);
+       } else {
+               if (dir_de) {
+                       err = -EMLINK;
+                       if (new_dir->i_nlink >= NILFS_LINK_MAX)
+                               goto out_dir;
+               }
+               inode_inc_link_count(old_inode);
+               err = nilfs_add_link(new_dentry, old_inode);
+               if (err) {
+                       inode_dec_link_count(old_inode);
+                       goto out_dir;
+               }
+               if (dir_de)
+                       inode_inc_link_count(new_dir);
+       }
+
+       /*
+        * Like most other Unix systems, set the ctime for inodes on a
+        * rename.
+        * inode_dec_link_count() will mark the inode dirty.
+        */
+       old_inode->i_ctime = CURRENT_TIME;
+
+       nilfs_delete_entry(old_de, old_page);
+       inode_dec_link_count(old_inode);
+
+       if (dir_de) {
+               nilfs_set_link(old_inode, dir_de, dir_page, new_dir);
+               inode_dec_link_count(old_dir);
+       }
+
+       err = nilfs_transaction_commit(old_dir->i_sb);
+       return err;
+
+out_dir:
+       if (dir_de) {
+               kunmap(dir_page);
+               page_cache_release(dir_page);
+       }
+out_old:
+       kunmap(old_page);
+       page_cache_release(old_page);
+out:
+       nilfs_transaction_abort(old_dir->i_sb);
+       return err;
+}
+
+struct inode_operations nilfs_dir_inode_operations = {
+       .create         = nilfs_create,
+       .lookup         = nilfs_lookup,
+       .link           = nilfs_link,
+       .unlink         = nilfs_unlink,
+       .symlink        = nilfs_symlink,
+       .mkdir          = nilfs_mkdir,
+       .rmdir          = nilfs_rmdir,
+       .mknod          = nilfs_mknod,
+       .rename         = nilfs_rename,
+       .setattr        = nilfs_setattr,
+       .permission     = nilfs_permission,
+};
+
+struct inode_operations nilfs_special_inode_operations = {
+       .setattr        = nilfs_setattr,
+       .permission     = nilfs_permission,
+};
+
+struct inode_operations nilfs_symlink_inode_operations = {
+       .readlink       = generic_readlink,
+       .follow_link    = page_follow_link_light,
+       .put_link       = page_put_link,
+};
diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h
new file mode 100644 (file)
index 0000000..7558c97
--- /dev/null
@@ -0,0 +1,318 @@
+/*
+ * nilfs.h - NILFS local header file.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>
+ *            Ryusuke Konishi <ryusuke@osrg.net>
+ */
+
+#ifndef _NILFS_H
+#define _NILFS_H
+
+#include <linux/kernel.h>
+#include <linux/buffer_head.h>
+#include <linux/spinlock.h>
+#include <linux/blkdev.h>
+#include <linux/nilfs2_fs.h>
+#include "the_nilfs.h"
+#include "sb.h"
+#include "bmap.h"
+#include "bmap_union.h"
+
+/*
+ * NILFS filesystem version
+ */
+#define NILFS_VERSION          "2.0.5"
+
+/*
+ * nilfs inode data in memory
+ */
+struct nilfs_inode_info {
+       __u32 i_flags;
+       unsigned long  i_state;         /* Dynamic state flags */
+       struct nilfs_bmap *i_bmap;
+       union nilfs_bmap_union i_bmap_union;
+       __u64 i_xattr;  /* sector_t ??? */
+       __u32 i_dir_start_lookup;
+       __u64 i_cno;            /* check point number for GC inode */
+       struct address_space i_btnode_cache;
+       struct list_head i_dirty;       /* List for connecting dirty files */
+
+#ifdef CONFIG_NILFS_XATTR
+       /*
+        * Extended attributes can be read independently of the main file
+        * data. Taking i_sem even when reading would cause contention
+        * between readers of EAs and writers of regular file data, so
+        * instead we synchronize on xattr_sem when reading or changing
+        * EAs.
+        */
+       struct rw_semaphore xattr_sem;
+#endif
+#ifdef CONFIG_NILFS_POSIX_ACL
+       struct posix_acl *i_acl;
+       struct posix_acl *i_default_acl;
+#endif
+       struct buffer_head *i_bh;       /* i_bh contains a new or dirty
+                                          disk inode */
+       struct inode vfs_inode;
+};
+
+static inline struct nilfs_inode_info *NILFS_I(const struct inode *inode)
+{
+       return container_of(inode, struct nilfs_inode_info, vfs_inode);
+}
+
+static inline struct nilfs_inode_info *
+NILFS_BMAP_I(const struct nilfs_bmap *bmap)
+{
+       return container_of((union nilfs_bmap_union *)bmap,
+                           struct nilfs_inode_info,
+                           i_bmap_union);
+}
+
+static inline struct inode *NILFS_BTNC_I(struct address_space *btnc)
+{
+       struct nilfs_inode_info *ii =
+               container_of(btnc, struct nilfs_inode_info, i_btnode_cache);
+       return &ii->vfs_inode;
+}
+
+static inline struct inode *NILFS_AS_I(struct address_space *mapping)
+{
+       return (mapping->host) ? :
+               container_of(mapping, struct inode, i_data);
+}
+
+/*
+ * Dynamic state flags of NILFS on-memory inode (i_state)
+ */
+enum {
+       NILFS_I_NEW = 0,                /* Inode is newly created */
+       NILFS_I_DIRTY,                  /* The file is dirty */
+       NILFS_I_QUEUED,                 /* inode is in dirty_files list */
+       NILFS_I_BUSY,                   /* inode is grabbed by a segment
+                                          constructor */
+       NILFS_I_COLLECTED,              /* All dirty blocks are collected */
+       NILFS_I_UPDATED,                /* The file has been written back */
+       NILFS_I_INODE_DIRTY,            /* write_inode is requested */
+       NILFS_I_BMAP,                   /* has bmap and btnode_cache */
+       NILFS_I_GCINODE,                /* inode for GC, on memory only */
+       NILFS_I_GCDAT,                  /* shadow DAT, on memory only */
+};
+
+/*
+ * Macros to check inode numbers
+ */
+#define NILFS_MDT_INO_BITS   \
+  ((unsigned int)(1 << NILFS_DAT_INO | 1 << NILFS_CPFILE_INO |         \
+                 1 << NILFS_SUFILE_INO | 1 << NILFS_IFILE_INO |        \
+                 1 << NILFS_ATIME_INO | 1 << NILFS_SKETCH_INO))
+
+#define NILFS_SYS_INO_BITS   \
+  ((unsigned int)(1 << NILFS_ROOT_INO) | NILFS_MDT_INO_BITS)
+
+#define NILFS_FIRST_INO(sb)  (NILFS_SB(sb)->s_nilfs->ns_first_ino)
+
+#define NILFS_MDT_INODE(sb, ino) \
+  ((ino) < NILFS_FIRST_INO(sb) && (NILFS_MDT_INO_BITS & (1 << (ino))))
+#define NILFS_VALID_INODE(sb, ino) \
+  ((ino) >= NILFS_FIRST_INO(sb) || (NILFS_SYS_INO_BITS & (1 << (ino))))
+
+/**
+ * struct nilfs_transaction_info: context information for synchronization
+ * @ti_magic: Magic number
+ * @ti_save: Backup of journal_info field of task_struct
+ * @ti_flags: Flags
+ * @ti_count: Nest level
+ * @ti_garbage:        List of inode to be put when releasing semaphore
+ */
+struct nilfs_transaction_info {
+       u32                     ti_magic;
+       void                   *ti_save;
+                               /* This should never used. If this happens,
+                                  one of other filesystems has a bug. */
+       unsigned short          ti_flags;
+       unsigned short          ti_count;
+       struct list_head        ti_garbage;
+};
+
+/* ti_magic */
+#define NILFS_TI_MAGIC         0xd9e392fb
+
+/* ti_flags */
+#define NILFS_TI_DYNAMIC_ALLOC 0x0001  /* Allocated from slab */
+#define NILFS_TI_SYNC          0x0002  /* Force to construct segment at the
+                                          end of transaction. */
+#define NILFS_TI_GC            0x0004  /* GC context */
+#define NILFS_TI_COMMIT                0x0008  /* Change happened or not */
+#define NILFS_TI_WRITER                0x0010  /* Constructor context */
+
+
+int nilfs_transaction_begin(struct super_block *,
+                           struct nilfs_transaction_info *, int);
+int nilfs_transaction_commit(struct super_block *);
+void nilfs_transaction_abort(struct super_block *);
+
+static inline void nilfs_set_transaction_flag(unsigned int flag)
+{
+       struct nilfs_transaction_info *ti = current->journal_info;
+
+       ti->ti_flags |= flag;
+}
+
+static inline int nilfs_test_transaction_flag(unsigned int flag)
+{
+       struct nilfs_transaction_info *ti = current->journal_info;
+
+       if (ti == NULL || ti->ti_magic != NILFS_TI_MAGIC)
+               return 0;
+       return !!(ti->ti_flags & flag);
+}
+
+static inline int nilfs_doing_gc(void)
+{
+       return nilfs_test_transaction_flag(NILFS_TI_GC);
+}
+
+static inline int nilfs_doing_construction(void)
+{
+       return nilfs_test_transaction_flag(NILFS_TI_WRITER);
+}
+
+static inline struct inode *nilfs_dat_inode(const struct the_nilfs *nilfs)
+{
+       return nilfs_doing_gc() ? nilfs->ns_gc_dat : nilfs->ns_dat;
+}
+
+/*
+ * function prototype
+ */
+#ifdef CONFIG_NILFS_POSIX_ACL
+#error "NILFS: not yet supported POSIX ACL"
+extern int nilfs_permission(struct inode *, int, struct nameidata *);
+extern int nilfs_acl_chmod(struct inode *);
+extern int nilfs_init_acl(struct inode *, struct inode *);
+#else
+#define nilfs_permission   NULL
+
+static inline int nilfs_acl_chmod(struct inode *inode)
+{
+       return 0;
+}
+
+static inline int nilfs_init_acl(struct inode *inode, struct inode *dir)
+{
+       inode->i_mode &= ~current_umask();
+       return 0;
+}
+#endif
+
+#define NILFS_ATIME_DISABLE
+
+/* dir.c */
+extern int nilfs_add_link(struct dentry *, struct inode *);
+extern ino_t nilfs_inode_by_name(struct inode *, struct dentry *);
+extern int nilfs_make_empty(struct inode *, struct inode *);
+extern struct nilfs_dir_entry *
+nilfs_find_entry(struct inode *, struct dentry *, struct page **);
+extern int nilfs_delete_entry(struct nilfs_dir_entry *, struct page *);
+extern int nilfs_empty_dir(struct inode *);
+extern struct nilfs_dir_entry *nilfs_dotdot(struct inode *, struct page **);
+extern void nilfs_set_link(struct inode *, struct nilfs_dir_entry *,
+                          struct page *, struct inode *);
+
+/* file.c */
+extern int nilfs_sync_file(struct file *, struct dentry *, int);
+
+/* ioctl.c */
+long nilfs_ioctl(struct file *, unsigned int, unsigned long);
+int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *, void __user *);
+
+/* inode.c */
+extern struct inode *nilfs_new_inode(struct inode *, int);
+extern void nilfs_free_inode(struct inode *);
+extern int nilfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
+extern void nilfs_set_inode_flags(struct inode *);
+extern int nilfs_read_inode_common(struct inode *, struct nilfs_inode *);
+extern void nilfs_write_inode_common(struct inode *, struct nilfs_inode *, int);
+extern struct inode *nilfs_iget(struct super_block *, unsigned long);
+extern void nilfs_update_inode(struct inode *, struct buffer_head *);
+extern void nilfs_truncate(struct inode *);
+extern void nilfs_delete_inode(struct inode *);
+extern int nilfs_setattr(struct dentry *, struct iattr *);
+extern int nilfs_load_inode_block(struct nilfs_sb_info *, struct inode *,
+                                 struct buffer_head **);
+extern int nilfs_inode_dirty(struct inode *);
+extern int nilfs_set_file_dirty(struct nilfs_sb_info *, struct inode *,
+                               unsigned);
+extern int nilfs_mark_inode_dirty(struct inode *);
+extern void nilfs_dirty_inode(struct inode *);
+
+/* namei.c */
+extern struct dentry *nilfs_get_parent(struct dentry *);
+
+/* super.c */
+extern struct inode *nilfs_alloc_inode(struct super_block *);
+extern void nilfs_destroy_inode(struct inode *);
+extern void nilfs_error(struct super_block *, const char *, const char *, ...)
+       __attribute__ ((format (printf, 3, 4)));
+extern void nilfs_warning(struct super_block *, const char *, const char *, ...)
+       __attribute__ ((format (printf, 3, 4)));
+extern struct nilfs_super_block *
+nilfs_read_super_block(struct super_block *, u64, int, struct buffer_head **);
+extern int nilfs_store_magic_and_option(struct super_block *,
+                                       struct nilfs_super_block *, char *);
+extern int nilfs_commit_super(struct nilfs_sb_info *, int);
+extern int nilfs_attach_checkpoint(struct nilfs_sb_info *, __u64);
+extern void nilfs_detach_checkpoint(struct nilfs_sb_info *);
+
+/* gcinode.c */
+int nilfs_gccache_submit_read_data(struct inode *, sector_t, sector_t, __u64,
+                                  struct buffer_head **);
+int nilfs_gccache_submit_read_node(struct inode *, sector_t, __u64,
+                                  struct buffer_head **);
+int nilfs_gccache_wait_and_mark_dirty(struct buffer_head *);
+int nilfs_init_gccache(struct the_nilfs *);
+void nilfs_destroy_gccache(struct the_nilfs *);
+void nilfs_clear_gcinode(struct inode *);
+struct inode *nilfs_gc_iget(struct the_nilfs *, ino_t, __u64);
+void nilfs_remove_all_gcinode(struct the_nilfs *);
+
+/* gcdat.c */
+int nilfs_init_gcdat_inode(struct the_nilfs *);
+void nilfs_commit_gcdat_inode(struct the_nilfs *);
+void nilfs_clear_gcdat_inode(struct the_nilfs *);
+
+/*
+ * Inodes and files operations
+ */
+extern struct file_operations nilfs_dir_operations;
+extern struct inode_operations nilfs_file_inode_operations;
+extern struct file_operations nilfs_file_operations;
+extern struct address_space_operations nilfs_aops;
+extern struct inode_operations nilfs_dir_inode_operations;
+extern struct inode_operations nilfs_special_inode_operations;
+extern struct inode_operations nilfs_symlink_inode_operations;
+
+/*
+ * filesystem type
+ */
+extern struct file_system_type nilfs_fs_type;
+
+
+#endif /* _NILFS_H */
diff --git a/fs/nilfs2/page.c b/fs/nilfs2/page.c
new file mode 100644 (file)
index 0000000..1bfbba9
--- /dev/null
@@ -0,0 +1,540 @@
+/*
+ * page.c - buffer/page management specific to NILFS
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>,
+ *            Seiji Kihara <kihara@osrg.net>.
+ */
+
+#include <linux/pagemap.h>
+#include <linux/writeback.h>
+#include <linux/swap.h>
+#include <linux/bitops.h>
+#include <linux/page-flags.h>
+#include <linux/list.h>
+#include <linux/highmem.h>
+#include <linux/pagevec.h>
+#include "nilfs.h"
+#include "page.h"
+#include "mdt.h"
+
+
+#define NILFS_BUFFER_INHERENT_BITS  \
+       ((1UL << BH_Uptodate) | (1UL << BH_Mapped) | (1UL << BH_NILFS_Node) | \
+        (1UL << BH_NILFS_Volatile) | (1UL << BH_NILFS_Allocated))
+
+static struct buffer_head *
+__nilfs_get_page_block(struct page *page, unsigned long block, pgoff_t index,
+                      int blkbits, unsigned long b_state)
+
+{
+       unsigned long first_block;
+       struct buffer_head *bh;
+
+       if (!page_has_buffers(page))
+               create_empty_buffers(page, 1 << blkbits, b_state);
+
+       first_block = (unsigned long)index << (PAGE_CACHE_SHIFT - blkbits);
+       bh = nilfs_page_get_nth_block(page, block - first_block);
+
+       touch_buffer(bh);
+       wait_on_buffer(bh);
+       return bh;
+}
+
+/*
+ * Since the page cache of B-tree node pages or data page cache of pseudo
+ * inodes does not have a valid mapping->host pointer, calling
+ * mark_buffer_dirty() for their buffers causes a NULL pointer dereference;
+ * it calls __mark_inode_dirty(NULL) through __set_page_dirty().
+ * To avoid this problem, the old style mark_buffer_dirty() is used instead.
+ */
+void nilfs_mark_buffer_dirty(struct buffer_head *bh)
+{
+       if (!buffer_dirty(bh) && !test_set_buffer_dirty(bh))
+               __set_page_dirty_nobuffers(bh->b_page);
+}
+
+struct buffer_head *nilfs_grab_buffer(struct inode *inode,
+                                     struct address_space *mapping,
+                                     unsigned long blkoff,
+                                     unsigned long b_state)
+{
+       int blkbits = inode->i_blkbits;
+       pgoff_t index = blkoff >> (PAGE_CACHE_SHIFT - blkbits);
+       struct page *page, *opage;
+       struct buffer_head *bh, *obh;
+
+       page = grab_cache_page(mapping, index);
+       if (unlikely(!page))
+               return NULL;
+
+       bh = __nilfs_get_page_block(page, blkoff, index, blkbits, b_state);
+       if (unlikely(!bh)) {
+               unlock_page(page);
+               page_cache_release(page);
+               return NULL;
+       }
+       if (!buffer_uptodate(bh) && mapping->assoc_mapping != NULL) {
+               /*
+                * Shadow page cache uses assoc_mapping to point its original
+                * page cache.  The following code tries the original cache
+                * if the given cache is a shadow and it didn't hit.
+                */
+               opage = find_lock_page(mapping->assoc_mapping, index);
+               if (!opage)
+                       return bh;
+
+               obh = __nilfs_get_page_block(opage, blkoff, index, blkbits,
+                                            b_state);
+               if (buffer_uptodate(obh)) {
+                       nilfs_copy_buffer(bh, obh);
+                       if (buffer_dirty(obh)) {
+                               nilfs_mark_buffer_dirty(bh);
+                               if (!buffer_nilfs_node(bh) && NILFS_MDT(inode))
+                                       nilfs_mdt_mark_dirty(inode);
+                       }
+               }
+               brelse(obh);
+               unlock_page(opage);
+               page_cache_release(opage);
+       }
+       return bh;
+}
+
+/**
+ * nilfs_forget_buffer - discard dirty state
+ * @inode: owner inode of the buffer
+ * @bh: buffer head of the buffer to be discarded
+ */
+void nilfs_forget_buffer(struct buffer_head *bh)
+{
+       struct page *page = bh->b_page;
+
+       lock_buffer(bh);
+       clear_buffer_nilfs_volatile(bh);
+       if (test_clear_buffer_dirty(bh) && nilfs_page_buffers_clean(page))
+               __nilfs_clear_page_dirty(page);
+
+       clear_buffer_uptodate(bh);
+       clear_buffer_mapped(bh);
+       bh->b_blocknr = -1;
+       ClearPageUptodate(page);
+       ClearPageMappedToDisk(page);
+       unlock_buffer(bh);
+       brelse(bh);
+}
+
+/**
+ * nilfs_copy_buffer -- copy buffer data and flags
+ * @dbh: destination buffer
+ * @sbh: source buffer
+ */
+void nilfs_copy_buffer(struct buffer_head *dbh, struct buffer_head *sbh)
+{
+       void *kaddr0, *kaddr1;
+       unsigned long bits;
+       struct page *spage = sbh->b_page, *dpage = dbh->b_page;
+       struct buffer_head *bh;
+
+       kaddr0 = kmap_atomic(spage, KM_USER0);
+       kaddr1 = kmap_atomic(dpage, KM_USER1);
+       memcpy(kaddr1 + bh_offset(dbh), kaddr0 + bh_offset(sbh), sbh->b_size);
+       kunmap_atomic(kaddr1, KM_USER1);
+       kunmap_atomic(kaddr0, KM_USER0);
+
+       dbh->b_state = sbh->b_state & NILFS_BUFFER_INHERENT_BITS;
+       dbh->b_blocknr = sbh->b_blocknr;
+       dbh->b_bdev = sbh->b_bdev;
+
+       bh = dbh;
+       bits = sbh->b_state & ((1UL << BH_Uptodate) | (1UL << BH_Mapped));
+       while ((bh = bh->b_this_page) != dbh) {
+               lock_buffer(bh);
+               bits &= bh->b_state;
+               unlock_buffer(bh);
+       }
+       if (bits & (1UL << BH_Uptodate))
+               SetPageUptodate(dpage);
+       else
+               ClearPageUptodate(dpage);
+       if (bits & (1UL << BH_Mapped))
+               SetPageMappedToDisk(dpage);
+       else
+               ClearPageMappedToDisk(dpage);
+}
+
+/**
+ * nilfs_page_buffers_clean - check if a page has dirty buffers or not.
+ * @page: page to be checked
+ *
+ * nilfs_page_buffers_clean() returns zero if the page has dirty buffers.
+ * Otherwise, it returns non-zero value.
+ */
+int nilfs_page_buffers_clean(struct page *page)
+{
+       struct buffer_head *bh, *head;
+
+       bh = head = page_buffers(page);
+       do {
+               if (buffer_dirty(bh))
+                       return 0;
+               bh = bh->b_this_page;
+       } while (bh != head);
+       return 1;
+}
+
+void nilfs_page_bug(struct page *page)
+{
+       struct address_space *m;
+       unsigned long ino = 0;
+
+       if (unlikely(!page)) {
+               printk(KERN_CRIT "NILFS_PAGE_BUG(NULL)\n");
+               return;
+       }
+
+       m = page->mapping;
+       if (m) {
+               struct inode *inode = NILFS_AS_I(m);
+               if (inode != NULL)
+                       ino = inode->i_ino;
+       }
+       printk(KERN_CRIT "NILFS_PAGE_BUG(%p): cnt=%d index#=%llu flags=0x%lx "
+              "mapping=%p ino=%lu\n",
+              page, atomic_read(&page->_count),
+              (unsigned long long)page->index, page->flags, m, ino);
+
+       if (page_has_buffers(page)) {
+               struct buffer_head *bh, *head;
+               int i = 0;
+
+               bh = head = page_buffers(page);
+               do {
+                       printk(KERN_CRIT
+                              " BH[%d] %p: cnt=%d block#=%llu state=0x%lx\n",
+                              i++, bh, atomic_read(&bh->b_count),
+                              (unsigned long long)bh->b_blocknr, bh->b_state);
+                       bh = bh->b_this_page;
+               } while (bh != head);
+       }
+}
+
+/**
+ * nilfs_alloc_private_page - allocate a private page with buffer heads
+ *
+ * Return Value: On success, a pointer to the allocated page is returned.
+ * On error, NULL is returned.
+ */
+struct page *nilfs_alloc_private_page(struct block_device *bdev, int size,
+                                     unsigned long state)
+{
+       struct buffer_head *bh, *head, *tail;
+       struct page *page;
+
+       page = alloc_page(GFP_NOFS); /* page_count of the returned page is 1 */
+       if (unlikely(!page))
+               return NULL;
+
+       lock_page(page);
+       head = alloc_page_buffers(page, size, 0);
+       if (unlikely(!head)) {
+               unlock_page(page);
+               __free_page(page);
+               return NULL;
+       }
+
+       bh = head;
+       do {
+               bh->b_state = (1UL << BH_NILFS_Allocated) | state;
+               tail = bh;
+               bh->b_bdev = bdev;
+               bh = bh->b_this_page;
+       } while (bh);
+
+       tail->b_this_page = head;
+       attach_page_buffers(page, head);
+
+       return page;
+}
+
+void nilfs_free_private_page(struct page *page)
+{
+       BUG_ON(!PageLocked(page));
+       BUG_ON(page->mapping);
+
+       if (page_has_buffers(page) && !try_to_free_buffers(page))
+               NILFS_PAGE_BUG(page, "failed to free page");
+
+       unlock_page(page);
+       __free_page(page);
+}
+
+/**
+ * nilfs_copy_page -- copy the page with buffers
+ * @dst: destination page
+ * @src: source page
+ * @copy_dirty: flag whether to copy dirty states on the page's buffer heads.
+ *
+ * This fuction is for both data pages and btnode pages.  The dirty flag
+ * should be treated by caller.  The page must not be under i/o.
+ * Both src and dst page must be locked
+ */
+static void nilfs_copy_page(struct page *dst, struct page *src, int copy_dirty)
+{
+       struct buffer_head *dbh, *dbufs, *sbh, *sbufs;
+       unsigned long mask = NILFS_BUFFER_INHERENT_BITS;
+
+       BUG_ON(PageWriteback(dst));
+
+       sbh = sbufs = page_buffers(src);
+       if (!page_has_buffers(dst))
+               create_empty_buffers(dst, sbh->b_size, 0);
+
+       if (copy_dirty)
+               mask |= (1UL << BH_Dirty);
+
+       dbh = dbufs = page_buffers(dst);
+       do {
+               lock_buffer(sbh);
+               lock_buffer(dbh);
+               dbh->b_state = sbh->b_state & mask;
+               dbh->b_blocknr = sbh->b_blocknr;
+               dbh->b_bdev = sbh->b_bdev;
+               sbh = sbh->b_this_page;
+               dbh = dbh->b_this_page;
+       } while (dbh != dbufs);
+
+       copy_highpage(dst, src);
+
+       if (PageUptodate(src) && !PageUptodate(dst))
+               SetPageUptodate(dst);
+       else if (!PageUptodate(src) && PageUptodate(dst))
+               ClearPageUptodate(dst);
+       if (PageMappedToDisk(src) && !PageMappedToDisk(dst))
+               SetPageMappedToDisk(dst);
+       else if (!PageMappedToDisk(src) && PageMappedToDisk(dst))
+               ClearPageMappedToDisk(dst);
+
+       do {
+               unlock_buffer(sbh);
+               unlock_buffer(dbh);
+               sbh = sbh->b_this_page;
+               dbh = dbh->b_this_page;
+       } while (dbh != dbufs);
+}
+
+int nilfs_copy_dirty_pages(struct address_space *dmap,
+                          struct address_space *smap)
+{
+       struct pagevec pvec;
+       unsigned int i;
+       pgoff_t index = 0;
+       int err = 0;
+
+       pagevec_init(&pvec, 0);
+repeat:
+       if (!pagevec_lookup_tag(&pvec, smap, &index, PAGECACHE_TAG_DIRTY,
+                               PAGEVEC_SIZE))
+               return 0;
+
+       for (i = 0; i < pagevec_count(&pvec); i++) {
+               struct page *page = pvec.pages[i], *dpage;
+
+               lock_page(page);
+               if (unlikely(!PageDirty(page)))
+                       NILFS_PAGE_BUG(page, "inconsistent dirty state");
+
+               dpage = grab_cache_page(dmap, page->index);
+               if (unlikely(!dpage)) {
+                       /* No empty page is added to the page cache */
+                       err = -ENOMEM;
+                       unlock_page(page);
+                       break;
+               }
+               if (unlikely(!page_has_buffers(page)))
+                       NILFS_PAGE_BUG(page,
+                                      "found empty page in dat page cache");
+
+               nilfs_copy_page(dpage, page, 1);
+               __set_page_dirty_nobuffers(dpage);
+
+               unlock_page(dpage);
+               page_cache_release(dpage);
+               unlock_page(page);
+       }
+       pagevec_release(&pvec);
+       cond_resched();
+
+       if (likely(!err))
+               goto repeat;
+       return err;
+}
+
+/**
+ * nilfs_copy_back_pages -- copy back pages to orignal cache from shadow cache
+ * @dmap: destination page cache
+ * @smap: source page cache
+ *
+ * No pages must no be added to the cache during this process.
+ * This must be ensured by the caller.
+ */
+void nilfs_copy_back_pages(struct address_space *dmap,
+                          struct address_space *smap)
+{
+       struct pagevec pvec;
+       unsigned int i, n;
+       pgoff_t index = 0;
+       int err;
+
+       pagevec_init(&pvec, 0);
+repeat:
+       n = pagevec_lookup(&pvec, smap, index, PAGEVEC_SIZE);
+       if (!n)
+               return;
+       index = pvec.pages[n - 1]->index + 1;
+
+       for (i = 0; i < pagevec_count(&pvec); i++) {
+               struct page *page = pvec.pages[i], *dpage;
+               pgoff_t offset = page->index;
+
+               lock_page(page);
+               dpage = find_lock_page(dmap, offset);
+               if (dpage) {
+                       /* override existing page on the destination cache */
+                       WARN_ON(PageDirty(dpage));
+                       nilfs_copy_page(dpage, page, 0);
+                       unlock_page(dpage);
+                       page_cache_release(dpage);
+               } else {
+                       struct page *page2;
+
+                       /* move the page to the destination cache */
+                       spin_lock_irq(&smap->tree_lock);
+                       page2 = radix_tree_delete(&smap->page_tree, offset);
+                       WARN_ON(page2 != page);
+
+                       smap->nrpages--;
+                       spin_unlock_irq(&smap->tree_lock);
+
+                       spin_lock_irq(&dmap->tree_lock);
+                       err = radix_tree_insert(&dmap->page_tree, offset, page);
+                       if (unlikely(err < 0)) {
+                               WARN_ON(err == -EEXIST);
+                               page->mapping = NULL;
+                               page_cache_release(page); /* for cache */
+                       } else {
+                               page->mapping = dmap;
+                               dmap->nrpages++;
+                               if (PageDirty(page))
+                                       radix_tree_tag_set(&dmap->page_tree,
+                                                          offset,
+                                                          PAGECACHE_TAG_DIRTY);
+                       }
+                       spin_unlock_irq(&dmap->tree_lock);
+               }
+               unlock_page(page);
+       }
+       pagevec_release(&pvec);
+       cond_resched();
+
+       goto repeat;
+}
+
+void nilfs_clear_dirty_pages(struct address_space *mapping)
+{
+       struct pagevec pvec;
+       unsigned int i;
+       pgoff_t index = 0;
+
+       pagevec_init(&pvec, 0);
+
+       while (pagevec_lookup_tag(&pvec, mapping, &index, PAGECACHE_TAG_DIRTY,
+                                 PAGEVEC_SIZE)) {
+               for (i = 0; i < pagevec_count(&pvec); i++) {
+                       struct page *page = pvec.pages[i];
+                       struct buffer_head *bh, *head;
+
+                       lock_page(page);
+                       ClearPageUptodate(page);
+                       ClearPageMappedToDisk(page);
+                       bh = head = page_buffers(page);
+                       do {
+                               lock_buffer(bh);
+                               clear_buffer_dirty(bh);
+                               clear_buffer_nilfs_volatile(bh);
+                               clear_buffer_uptodate(bh);
+                               clear_buffer_mapped(bh);
+                               unlock_buffer(bh);
+                               bh = bh->b_this_page;
+                       } while (bh != head);
+
+                       __nilfs_clear_page_dirty(page);
+                       unlock_page(page);
+               }
+               pagevec_release(&pvec);
+               cond_resched();
+       }
+}
+
+unsigned nilfs_page_count_clean_buffers(struct page *page,
+                                       unsigned from, unsigned to)
+{
+       unsigned block_start, block_end;
+       struct buffer_head *bh, *head;
+       unsigned nc = 0;
+
+       for (bh = head = page_buffers(page), block_start = 0;
+            bh != head || !block_start;
+            block_start = block_end, bh = bh->b_this_page) {
+               block_end = block_start + bh->b_size;
+               if (block_end > from && block_start < to && !buffer_dirty(bh))
+                       nc++;
+       }
+       return nc;
+}
+
+/*
+ * NILFS2 needs clear_page_dirty() in the following two cases:
+ *
+ * 1) For B-tree node pages and data pages of the dat/gcdat, NILFS2 clears
+ *    page dirty flags when it copies back pages from the shadow cache
+ *    (gcdat->{i_mapping,i_btnode_cache}) to its original cache
+ *    (dat->{i_mapping,i_btnode_cache}).
+ *
+ * 2) Some B-tree operations like insertion or deletion may dispose buffers
+ *    in dirty state, and this needs to cancel the dirty state of their pages.
+ */
+int __nilfs_clear_page_dirty(struct page *page)
+{
+       struct address_space *mapping = page->mapping;
+
+       if (mapping) {
+               spin_lock_irq(&mapping->tree_lock);
+               if (test_bit(PG_dirty, &page->flags)) {
+                       radix_tree_tag_clear(&mapping->page_tree,
+                                            page_index(page),
+                                            PAGECACHE_TAG_DIRTY);
+                       spin_unlock_irq(&mapping->tree_lock);
+                       return clear_page_dirty_for_io(page);
+               }
+               spin_unlock_irq(&mapping->tree_lock);
+               return 0;
+       }
+       return TestClearPageDirty(page);
+}
diff --git a/fs/nilfs2/page.h b/fs/nilfs2/page.h
new file mode 100644 (file)
index 0000000..8abca4d
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * page.h - buffer/page management specific to NILFS
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>,
+ *            Seiji Kihara <kihara@osrg.net>.
+ */
+
+#ifndef _NILFS_PAGE_H
+#define _NILFS_PAGE_H
+
+#include <linux/buffer_head.h>
+#include "nilfs.h"
+
+/*
+ * Extended buffer state bits
+ */
+enum {
+       BH_NILFS_Allocated = BH_PrivateStart,
+       BH_NILFS_Node,
+       BH_NILFS_Volatile,
+};
+
+BUFFER_FNS(NILFS_Allocated, nilfs_allocated)   /* nilfs private buffers */
+BUFFER_FNS(NILFS_Node, nilfs_node)             /* nilfs node buffers */
+BUFFER_FNS(NILFS_Volatile, nilfs_volatile)
+
+
+void nilfs_mark_buffer_dirty(struct buffer_head *bh);
+int __nilfs_clear_page_dirty(struct page *);
+
+struct buffer_head *nilfs_grab_buffer(struct inode *, struct address_space *,
+                                     unsigned long, unsigned long);
+void nilfs_forget_buffer(struct buffer_head *);
+void nilfs_copy_buffer(struct buffer_head *, struct buffer_head *);
+int nilfs_page_buffers_clean(struct page *);
+void nilfs_page_bug(struct page *);
+struct page *nilfs_alloc_private_page(struct block_device *, int,
+                                     unsigned long);
+void nilfs_free_private_page(struct page *);
+
+int nilfs_copy_dirty_pages(struct address_space *, struct address_space *);
+void nilfs_copy_back_pages(struct address_space *, struct address_space *);
+void nilfs_clear_dirty_pages(struct address_space *);
+unsigned nilfs_page_count_clean_buffers(struct page *, unsigned, unsigned);
+
+#define NILFS_PAGE_BUG(page, m, a...) \
+       do { nilfs_page_bug(page); BUG(); } while (0)
+
+static inline struct buffer_head *
+nilfs_page_get_nth_block(struct page *page, unsigned int count)
+{
+       struct buffer_head *bh = page_buffers(page);
+
+       while (count-- > 0)
+               bh = bh->b_this_page;
+       get_bh(bh);
+       return bh;
+}
+
+#endif /* _NILFS_PAGE_H */
diff --git a/fs/nilfs2/recovery.c b/fs/nilfs2/recovery.c
new file mode 100644 (file)
index 0000000..6ade096
--- /dev/null
@@ -0,0 +1,929 @@
+/*
+ * recovery.c - NILFS recovery logic
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ */
+
+#include <linux/buffer_head.h>
+#include <linux/blkdev.h>
+#include <linux/swap.h>
+#include <linux/crc32.h>
+#include "nilfs.h"
+#include "segment.h"
+#include "sufile.h"
+#include "page.h"
+#include "seglist.h"
+#include "segbuf.h"
+
+/*
+ * Segment check result
+ */
+enum {
+       NILFS_SEG_VALID,
+       NILFS_SEG_NO_SUPER_ROOT,
+       NILFS_SEG_FAIL_IO,
+       NILFS_SEG_FAIL_MAGIC,
+       NILFS_SEG_FAIL_SEQ,
+       NILFS_SEG_FAIL_CHECKSUM_SEGSUM,
+       NILFS_SEG_FAIL_CHECKSUM_SUPER_ROOT,
+       NILFS_SEG_FAIL_CHECKSUM_FULL,
+       NILFS_SEG_FAIL_CONSISTENCY,
+};
+
+/* work structure for recovery */
+struct nilfs_recovery_block {
+       ino_t ino;              /* Inode number of the file that this block
+                                  belongs to */
+       sector_t blocknr;       /* block number */
+       __u64 vblocknr;         /* virtual block number */
+       unsigned long blkoff;   /* File offset of the data block (per block) */
+       struct list_head list;
+};
+
+
+static int nilfs_warn_segment_error(int err)
+{
+       switch (err) {
+       case NILFS_SEG_FAIL_IO:
+               printk(KERN_WARNING
+                      "NILFS warning: I/O error on loading last segment\n");
+               return -EIO;
+       case NILFS_SEG_FAIL_MAGIC:
+               printk(KERN_WARNING
+                      "NILFS warning: Segment magic number invalid\n");
+               break;
+       case NILFS_SEG_FAIL_SEQ:
+               printk(KERN_WARNING
+                      "NILFS warning: Sequence number mismatch\n");
+               break;
+       case NILFS_SEG_FAIL_CHECKSUM_SEGSUM:
+               printk(KERN_WARNING
+                      "NILFS warning: Checksum error in segment summary\n");
+               break;
+       case NILFS_SEG_FAIL_CHECKSUM_SUPER_ROOT:
+               printk(KERN_WARNING
+                      "NILFS warning: Checksum error in super root\n");
+               break;
+       case NILFS_SEG_FAIL_CHECKSUM_FULL:
+               printk(KERN_WARNING
+                      "NILFS warning: Checksum error in segment payload\n");
+               break;
+       case NILFS_SEG_FAIL_CONSISTENCY:
+               printk(KERN_WARNING
+                      "NILFS warning: Inconsistent segment\n");
+               break;
+       case NILFS_SEG_NO_SUPER_ROOT:
+               printk(KERN_WARNING
+                      "NILFS warning: No super root in the last segment\n");
+               break;
+       }
+       return -EINVAL;
+}
+
+static void store_segsum_info(struct nilfs_segsum_info *ssi,
+                             struct nilfs_segment_summary *sum,
+                             unsigned int blocksize)
+{
+       ssi->flags = le16_to_cpu(sum->ss_flags);
+       ssi->seg_seq = le64_to_cpu(sum->ss_seq);
+       ssi->ctime = le64_to_cpu(sum->ss_create);
+       ssi->next = le64_to_cpu(sum->ss_next);
+       ssi->nblocks = le32_to_cpu(sum->ss_nblocks);
+       ssi->nfinfo = le32_to_cpu(sum->ss_nfinfo);
+       ssi->sumbytes = le32_to_cpu(sum->ss_sumbytes);
+
+       ssi->nsumblk = DIV_ROUND_UP(ssi->sumbytes, blocksize);
+       ssi->nfileblk = ssi->nblocks - ssi->nsumblk - !!NILFS_SEG_HAS_SR(ssi);
+}
+
+/**
+ * calc_crc_cont - check CRC of blocks continuously
+ * @sbi: nilfs_sb_info
+ * @bhs: buffer head of start block
+ * @sum: place to store result
+ * @offset: offset bytes in the first block
+ * @check_bytes: number of bytes to be checked
+ * @start: DBN of start block
+ * @nblock: number of blocks to be checked
+ */
+static int calc_crc_cont(struct nilfs_sb_info *sbi, struct buffer_head *bhs,
+                        u32 *sum, unsigned long offset, u64 check_bytes,
+                        sector_t start, unsigned long nblock)
+{
+       unsigned long blocksize = sbi->s_super->s_blocksize;
+       unsigned long size;
+       u32 crc;
+
+       BUG_ON(offset >= blocksize);
+       check_bytes -= offset;
+       size = min_t(u64, check_bytes, blocksize - offset);
+       crc = crc32_le(sbi->s_nilfs->ns_crc_seed,
+                      (unsigned char *)bhs->b_data + offset, size);
+       if (--nblock > 0) {
+               do {
+                       struct buffer_head *bh
+                               = sb_bread(sbi->s_super, ++start);
+                       if (!bh)
+                               return -EIO;
+                       check_bytes -= size;
+                       size = min_t(u64, check_bytes, blocksize);
+                       crc = crc32_le(crc, bh->b_data, size);
+                       brelse(bh);
+               } while (--nblock > 0);
+       }
+       *sum = crc;
+       return 0;
+}
+
+/**
+ * nilfs_read_super_root_block - read super root block
+ * @sb: super_block
+ * @sr_block: disk block number of the super root block
+ * @pbh: address of a buffer_head pointer to return super root buffer
+ * @check: CRC check flag
+ */
+int nilfs_read_super_root_block(struct super_block *sb, sector_t sr_block,
+                               struct buffer_head **pbh, int check)
+{
+       struct buffer_head *bh_sr;
+       struct nilfs_super_root *sr;
+       u32 crc;
+       int ret;
+
+       *pbh = NULL;
+       bh_sr = sb_bread(sb, sr_block);
+       if (unlikely(!bh_sr)) {
+               ret = NILFS_SEG_FAIL_IO;
+               goto failed;
+       }
+
+       sr = (struct nilfs_super_root *)bh_sr->b_data;
+       if (check) {
+               unsigned bytes = le16_to_cpu(sr->sr_bytes);
+
+               if (bytes == 0 || bytes > sb->s_blocksize) {
+                       ret = NILFS_SEG_FAIL_CHECKSUM_SUPER_ROOT;
+                       goto failed_bh;
+               }
+               if (calc_crc_cont(NILFS_SB(sb), bh_sr, &crc,
+                                 sizeof(sr->sr_sum), bytes, sr_block, 1)) {
+                       ret = NILFS_SEG_FAIL_IO;
+                       goto failed_bh;
+               }
+               if (crc != le32_to_cpu(sr->sr_sum)) {
+                       ret = NILFS_SEG_FAIL_CHECKSUM_SUPER_ROOT;
+                       goto failed_bh;
+               }
+       }
+       *pbh = bh_sr;
+       return 0;
+
+ failed_bh:
+       brelse(bh_sr);
+
+ failed:
+       return nilfs_warn_segment_error(ret);
+}
+
+/**
+ * load_segment_summary - read segment summary of the specified partial segment
+ * @sbi: nilfs_sb_info
+ * @pseg_start: start disk block number of partial segment
+ * @seg_seq: sequence number requested
+ * @ssi: pointer to nilfs_segsum_info struct to store information
+ * @full_check: full check flag
+ *              (0: only checks segment summary CRC, 1: data CRC)
+ */
+static int
+load_segment_summary(struct nilfs_sb_info *sbi, sector_t pseg_start,
+                    u64 seg_seq, struct nilfs_segsum_info *ssi,
+                    int full_check)
+{
+       struct buffer_head *bh_sum;
+       struct nilfs_segment_summary *sum;
+       unsigned long offset, nblock;
+       u64 check_bytes;
+       u32 crc, crc_sum;
+       int ret = NILFS_SEG_FAIL_IO;
+
+       bh_sum = sb_bread(sbi->s_super, pseg_start);
+       if (!bh_sum)
+               goto out;
+
+       sum = (struct nilfs_segment_summary *)bh_sum->b_data;
+
+       /* Check consistency of segment summary */
+       if (le32_to_cpu(sum->ss_magic) != NILFS_SEGSUM_MAGIC) {
+               ret = NILFS_SEG_FAIL_MAGIC;
+               goto failed;
+       }
+       store_segsum_info(ssi, sum, sbi->s_super->s_blocksize);
+       if (seg_seq != ssi->seg_seq) {
+               ret = NILFS_SEG_FAIL_SEQ;
+               goto failed;
+       }
+       if (full_check) {
+               offset = sizeof(sum->ss_datasum);
+               check_bytes =
+                       ((u64)ssi->nblocks << sbi->s_super->s_blocksize_bits);
+               nblock = ssi->nblocks;
+               crc_sum = le32_to_cpu(sum->ss_datasum);
+               ret = NILFS_SEG_FAIL_CHECKSUM_FULL;
+       } else { /* only checks segment summary */
+               offset = sizeof(sum->ss_datasum) + sizeof(sum->ss_sumsum);
+               check_bytes = ssi->sumbytes;
+               nblock = ssi->nsumblk;
+               crc_sum = le32_to_cpu(sum->ss_sumsum);
+               ret = NILFS_SEG_FAIL_CHECKSUM_SEGSUM;
+       }
+
+       if (unlikely(nblock == 0 ||
+                    nblock > sbi->s_nilfs->ns_blocks_per_segment)) {
+               /* This limits the number of blocks read in the CRC check */
+               ret = NILFS_SEG_FAIL_CONSISTENCY;
+               goto failed;
+       }
+       if (calc_crc_cont(sbi, bh_sum, &crc, offset, check_bytes,
+                         pseg_start, nblock)) {
+               ret = NILFS_SEG_FAIL_IO;
+               goto failed;
+       }
+       if (crc == crc_sum)
+               ret = 0;
+ failed:
+       brelse(bh_sum);
+ out:
+       return ret;
+}
+
+static void *segsum_get(struct super_block *sb, struct buffer_head **pbh,
+                       unsigned int *offset, unsigned int bytes)
+{
+       void *ptr;
+       sector_t blocknr;
+
+       BUG_ON((*pbh)->b_size < *offset);
+       if (bytes > (*pbh)->b_size - *offset) {
+               blocknr = (*pbh)->b_blocknr;
+               brelse(*pbh);
+               *pbh = sb_bread(sb, blocknr + 1);
+               if (unlikely(!*pbh))
+                       return NULL;
+               *offset = 0;
+       }
+       ptr = (*pbh)->b_data + *offset;
+       *offset += bytes;
+       return ptr;
+}
+
+static void segsum_skip(struct super_block *sb, struct buffer_head **pbh,
+                       unsigned int *offset, unsigned int bytes,
+                       unsigned long count)
+{
+       unsigned int rest_item_in_current_block
+               = ((*pbh)->b_size - *offset) / bytes;
+
+       if (count <= rest_item_in_current_block) {
+               *offset += bytes * count;
+       } else {
+               sector_t blocknr = (*pbh)->b_blocknr;
+               unsigned int nitem_per_block = (*pbh)->b_size / bytes;
+               unsigned int bcnt;
+
+               count -= rest_item_in_current_block;
+               bcnt = DIV_ROUND_UP(count, nitem_per_block);
+               *offset = bytes * (count - (bcnt - 1) * nitem_per_block);
+
+               brelse(*pbh);
+               *pbh = sb_bread(sb, blocknr + bcnt);
+       }
+}
+
+static int
+collect_blocks_from_segsum(struct nilfs_sb_info *sbi, sector_t sum_blocknr,
+                          struct nilfs_segsum_info *ssi,
+                          struct list_head *head)
+{
+       struct buffer_head *bh;
+       unsigned int offset;
+       unsigned long nfinfo = ssi->nfinfo;
+       sector_t blocknr = sum_blocknr + ssi->nsumblk;
+       ino_t ino;
+       int err = -EIO;
+
+       if (!nfinfo)
+               return 0;
+
+       bh = sb_bread(sbi->s_super, sum_blocknr);
+       if (unlikely(!bh))
+               goto out;
+
+       offset = le16_to_cpu(
+               ((struct nilfs_segment_summary *)bh->b_data)->ss_bytes);
+       for (;;) {
+               unsigned long nblocks, ndatablk, nnodeblk;
+               struct nilfs_finfo *finfo;
+
+               finfo = segsum_get(sbi->s_super, &bh, &offset, sizeof(*finfo));
+               if (unlikely(!finfo))
+                       goto out;
+
+               ino = le64_to_cpu(finfo->fi_ino);
+               nblocks = le32_to_cpu(finfo->fi_nblocks);
+               ndatablk = le32_to_cpu(finfo->fi_ndatablk);
+               nnodeblk = nblocks - ndatablk;
+
+               while (ndatablk-- > 0) {
+                       struct nilfs_recovery_block *rb;
+                       struct nilfs_binfo_v *binfo;
+
+                       binfo = segsum_get(sbi->s_super, &bh, &offset,
+                                          sizeof(*binfo));
+                       if (unlikely(!binfo))
+                               goto out;
+
+                       rb = kmalloc(sizeof(*rb), GFP_NOFS);
+                       if (unlikely(!rb)) {
+                               err = -ENOMEM;
+                               goto out;
+                       }
+                       rb->ino = ino;
+                       rb->blocknr = blocknr++;
+                       rb->vblocknr = le64_to_cpu(binfo->bi_vblocknr);
+                       rb->blkoff = le64_to_cpu(binfo->bi_blkoff);
+                       /* INIT_LIST_HEAD(&rb->list); */
+                       list_add_tail(&rb->list, head);
+               }
+               if (--nfinfo == 0)
+                       break;
+               blocknr += nnodeblk; /* always 0 for the data sync segments */
+               segsum_skip(sbi->s_super, &bh, &offset, sizeof(__le64),
+                           nnodeblk);
+               if (unlikely(!bh))
+                       goto out;
+       }
+       err = 0;
+ out:
+       brelse(bh);   /* brelse(NULL) is just ignored */
+       return err;
+}
+
+static void dispose_recovery_list(struct list_head *head)
+{
+       while (!list_empty(head)) {
+               struct nilfs_recovery_block *rb
+                       = list_entry(head->next,
+                                    struct nilfs_recovery_block, list);
+               list_del(&rb->list);
+               kfree(rb);
+       }
+}
+
+void nilfs_dispose_segment_list(struct list_head *head)
+{
+       while (!list_empty(head)) {
+               struct nilfs_segment_entry *ent
+                       = list_entry(head->next,
+                                    struct nilfs_segment_entry, list);
+               list_del(&ent->list);
+               nilfs_free_segment_entry(ent);
+       }
+}
+
+static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs,
+                                             struct nilfs_recovery_info *ri)
+{
+       struct list_head *head = &ri->ri_used_segments;
+       struct nilfs_segment_entry *ent, *n;
+       struct inode *sufile = nilfs->ns_sufile;
+       __u64 segnum[4];
+       time_t mtime;
+       int err;
+       int i;
+
+       segnum[0] = nilfs->ns_segnum;
+       segnum[1] = nilfs->ns_nextnum;
+       segnum[2] = ri->ri_segnum;
+       segnum[3] = ri->ri_nextnum;
+
+       /*
+        * Releasing the next segment of the latest super root.
+        * The next segment is invalidated by this recovery.
+        */
+       err = nilfs_sufile_free(sufile, segnum[1]);
+       if (unlikely(err))
+               goto failed;
+
+       err = -ENOMEM;
+       for (i = 1; i < 4; i++) {
+               ent = nilfs_alloc_segment_entry(segnum[i]);
+               if (unlikely(!ent))
+                       goto failed;
+               list_add_tail(&ent->list, head);
+       }
+
+       /*
+        * Collecting segments written after the latest super root.
+        * These are marked dirty to avoid being reallocated in the next write.
+        */
+       mtime = get_seconds();
+       list_for_each_entry_safe(ent, n, head, list) {
+               if (ent->segnum == segnum[0]) {
+                       list_del(&ent->list);
+                       nilfs_free_segment_entry(ent);
+                       continue;
+               }
+               err = nilfs_open_segment_entry(ent, sufile);
+               if (unlikely(err))
+                       goto failed;
+               if (!nilfs_segment_usage_dirty(ent->raw_su)) {
+                       /* make the segment garbage */
+                       ent->raw_su->su_nblocks = cpu_to_le32(0);
+                       ent->raw_su->su_lastmod = cpu_to_le32(mtime);
+                       nilfs_segment_usage_set_dirty(ent->raw_su);
+               }
+               list_del(&ent->list);
+               nilfs_close_segment_entry(ent, sufile);
+               nilfs_free_segment_entry(ent);
+       }
+
+       /* Allocate new segments for recovery */
+       err = nilfs_sufile_alloc(sufile, &segnum[0]);
+       if (unlikely(err))
+               goto failed;
+
+       nilfs->ns_pseg_offset = 0;
+       nilfs->ns_seg_seq = ri->ri_seq + 2;
+       nilfs->ns_nextnum = nilfs->ns_segnum = segnum[0];
+       return 0;
+
+ failed:
+       /* No need to recover sufile because it will be destroyed on error */
+       return err;
+}
+
+static int nilfs_recovery_copy_block(struct nilfs_sb_info *sbi,
+                                    struct nilfs_recovery_block *rb,
+                                    struct page *page)
+{
+       struct buffer_head *bh_org;
+       void *kaddr;
+
+       bh_org = sb_bread(sbi->s_super, rb->blocknr);
+       if (unlikely(!bh_org))
+               return -EIO;
+
+       kaddr = kmap_atomic(page, KM_USER0);
+       memcpy(kaddr + bh_offset(bh_org), bh_org->b_data, bh_org->b_size);
+       kunmap_atomic(kaddr, KM_USER0);
+       brelse(bh_org);
+       return 0;
+}
+
+static int recover_dsync_blocks(struct nilfs_sb_info *sbi,
+                               struct list_head *head,
+                               unsigned long *nr_salvaged_blocks)
+{
+       struct inode *inode;
+       struct nilfs_recovery_block *rb, *n;
+       unsigned blocksize = sbi->s_super->s_blocksize;
+       struct page *page;
+       loff_t pos;
+       int err = 0, err2 = 0;
+
+       list_for_each_entry_safe(rb, n, head, list) {
+               inode = nilfs_iget(sbi->s_super, rb->ino);
+               if (IS_ERR(inode)) {
+                       err = PTR_ERR(inode);
+                       inode = NULL;
+                       goto failed_inode;
+               }
+
+               pos = rb->blkoff << inode->i_blkbits;
+               page = NULL;
+               err = block_write_begin(NULL, inode->i_mapping, pos, blocksize,
+                                       0, &page, NULL, nilfs_get_block);
+               if (unlikely(err))
+                       goto failed_inode;
+
+               err = nilfs_recovery_copy_block(sbi, rb, page);
+               if (unlikely(err))
+                       goto failed_page;
+
+               err = nilfs_set_file_dirty(sbi, inode, 1);
+               if (unlikely(err))
+                       goto failed_page;
+
+               block_write_end(NULL, inode->i_mapping, pos, blocksize,
+                               blocksize, page, NULL);
+
+               unlock_page(page);
+               page_cache_release(page);
+
+               (*nr_salvaged_blocks)++;
+               goto next;
+
+ failed_page:
+               unlock_page(page);
+               page_cache_release(page);
+
+ failed_inode:
+               printk(KERN_WARNING
+                      "NILFS warning: error recovering data block "
+                      "(err=%d, ino=%lu, block-offset=%llu)\n",
+                      err, rb->ino, (unsigned long long)rb->blkoff);
+               if (!err2)
+                       err2 = err;
+ next:
+               iput(inode); /* iput(NULL) is just ignored */
+               list_del_init(&rb->list);
+               kfree(rb);
+       }
+       return err2;
+}
+
+/**
+ * nilfs_do_roll_forward - salvage logical segments newer than the latest
+ * checkpoint
+ * @sbi: nilfs_sb_info
+ * @nilfs: the_nilfs
+ * @ri: pointer to a nilfs_recovery_info
+ */
+static int nilfs_do_roll_forward(struct the_nilfs *nilfs,
+                                struct nilfs_sb_info *sbi,
+                                struct nilfs_recovery_info *ri)
+{
+       struct nilfs_segsum_info ssi;
+       sector_t pseg_start;
+       sector_t seg_start, seg_end;  /* Starting/ending DBN of full segment */
+       unsigned long nsalvaged_blocks = 0;
+       u64 seg_seq;
+       __u64 segnum, nextnum = 0;
+       int empty_seg = 0;
+       int err = 0, ret;
+       LIST_HEAD(dsync_blocks);  /* list of data blocks to be recovered */
+       enum {
+               RF_INIT_ST,
+               RF_DSYNC_ST,   /* scanning data-sync segments */
+       };
+       int state = RF_INIT_ST;
+
+       nilfs_attach_writer(nilfs, sbi);
+       pseg_start = ri->ri_lsegs_start;
+       seg_seq = ri->ri_lsegs_start_seq;
+       segnum = nilfs_get_segnum_of_block(nilfs, pseg_start);
+       nilfs_get_segment_range(nilfs, segnum, &seg_start, &seg_end);
+
+       while (segnum != ri->ri_segnum || pseg_start <= ri->ri_pseg_start) {
+
+               ret = load_segment_summary(sbi, pseg_start, seg_seq, &ssi, 1);
+               if (ret) {
+                       if (ret == NILFS_SEG_FAIL_IO) {
+                               err = -EIO;
+                               goto failed;
+                       }
+                       goto strayed;
+               }
+               if (unlikely(NILFS_SEG_HAS_SR(&ssi)))
+                       goto confused;
+
+               /* Found a valid partial segment; do recovery actions */
+               nextnum = nilfs_get_segnum_of_block(nilfs, ssi.next);
+               empty_seg = 0;
+               nilfs->ns_ctime = ssi.ctime;
+               if (!(ssi.flags & NILFS_SS_GC))
+                       nilfs->ns_nongc_ctime = ssi.ctime;
+
+               switch (state) {
+               case RF_INIT_ST:
+                       if (!NILFS_SEG_LOGBGN(&ssi) || !NILFS_SEG_DSYNC(&ssi))
+                               goto try_next_pseg;
+                       state = RF_DSYNC_ST;
+                       /* Fall through */
+               case RF_DSYNC_ST:
+                       if (!NILFS_SEG_DSYNC(&ssi))
+                               goto confused;
+
+                       err = collect_blocks_from_segsum(
+                               sbi, pseg_start, &ssi, &dsync_blocks);
+                       if (unlikely(err))
+                               goto failed;
+                       if (NILFS_SEG_LOGEND(&ssi)) {
+                               err = recover_dsync_blocks(
+                                       sbi, &dsync_blocks, &nsalvaged_blocks);
+                               if (unlikely(err))
+                                       goto failed;
+                               state = RF_INIT_ST;
+                       }
+                       break; /* Fall through to try_next_pseg */
+               }
+
+ try_next_pseg:
+               if (pseg_start == ri->ri_lsegs_end)
+                       break;
+               pseg_start += ssi.nblocks;
+               if (pseg_start < seg_end)
+                       continue;
+               goto feed_segment;
+
+ strayed:
+               if (pseg_start == ri->ri_lsegs_end)
+                       break;
+
+ feed_segment:
+               /* Looking to the next full segment */
+               if (empty_seg++)
+                       break;
+               seg_seq++;
+               segnum = nextnum;
+               nilfs_get_segment_range(nilfs, segnum, &seg_start, &seg_end);
+               pseg_start = seg_start;
+       }
+
+       if (nsalvaged_blocks) {
+               printk(KERN_INFO "NILFS (device %s): salvaged %lu blocks\n",
+                      sbi->s_super->s_id, nsalvaged_blocks);
+               ri->ri_need_recovery = NILFS_RECOVERY_ROLLFORWARD_DONE;
+       }
+ out:
+       dispose_recovery_list(&dsync_blocks);
+       nilfs_detach_writer(sbi->s_nilfs, sbi);
+       return err;
+
+ confused:
+       err = -EINVAL;
+ failed:
+       printk(KERN_ERR
+              "NILFS (device %s): Error roll-forwarding "
+              "(err=%d, pseg block=%llu). ",
+              sbi->s_super->s_id, err, (unsigned long long)pseg_start);
+       goto out;
+}
+
+static void nilfs_finish_roll_forward(struct the_nilfs *nilfs,
+                                     struct nilfs_sb_info *sbi,
+                                     struct nilfs_recovery_info *ri)
+{
+       struct buffer_head *bh;
+       int err;
+
+       if (nilfs_get_segnum_of_block(nilfs, ri->ri_lsegs_start) !=
+           nilfs_get_segnum_of_block(nilfs, ri->ri_super_root))
+               return;
+
+       bh = sb_getblk(sbi->s_super, ri->ri_lsegs_start);
+       BUG_ON(!bh);
+       memset(bh->b_data, 0, bh->b_size);
+       set_buffer_dirty(bh);
+       err = sync_dirty_buffer(bh);
+       if (unlikely(err))
+               printk(KERN_WARNING
+                      "NILFS warning: buffer sync write failed during "
+                      "post-cleaning of recovery.\n");
+       brelse(bh);
+}
+
+/**
+ * nilfs_recover_logical_segments - salvage logical segments written after
+ * the latest super root
+ * @nilfs: the_nilfs
+ * @sbi: nilfs_sb_info
+ * @ri: pointer to a nilfs_recovery_info struct to store search results.
+ *
+ * Return Value: On success, 0 is returned.  On error, one of the following
+ * negative error code is returned.
+ *
+ * %-EINVAL - Inconsistent filesystem state.
+ *
+ * %-EIO - I/O error
+ *
+ * %-ENOSPC - No space left on device (only in a panic state).
+ *
+ * %-ERESTARTSYS - Interrupted.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ */
+int nilfs_recover_logical_segments(struct the_nilfs *nilfs,
+                                  struct nilfs_sb_info *sbi,
+                                  struct nilfs_recovery_info *ri)
+{
+       int err;
+
+       if (ri->ri_lsegs_start == 0 || ri->ri_lsegs_end == 0)
+               return 0;
+
+       err = nilfs_attach_checkpoint(sbi, ri->ri_cno);
+       if (unlikely(err)) {
+               printk(KERN_ERR
+                      "NILFS: error loading the latest checkpoint.\n");
+               return err;
+       }
+
+       err = nilfs_do_roll_forward(nilfs, sbi, ri);
+       if (unlikely(err))
+               goto failed;
+
+       if (ri->ri_need_recovery == NILFS_RECOVERY_ROLLFORWARD_DONE) {
+               err = nilfs_prepare_segment_for_recovery(nilfs, ri);
+               if (unlikely(err)) {
+                       printk(KERN_ERR "NILFS: Error preparing segments for "
+                              "recovery.\n");
+                       goto failed;
+               }
+
+               err = nilfs_attach_segment_constructor(sbi);
+               if (unlikely(err))
+                       goto failed;
+
+               set_nilfs_discontinued(nilfs);
+               err = nilfs_construct_segment(sbi->s_super);
+               nilfs_detach_segment_constructor(sbi);
+
+               if (unlikely(err)) {
+                       printk(KERN_ERR "NILFS: Oops! recovery failed. "
+                              "(err=%d)\n", err);
+                       goto failed;
+               }
+
+               nilfs_finish_roll_forward(nilfs, sbi, ri);
+       }
+
+       nilfs_detach_checkpoint(sbi);
+       return 0;
+
+ failed:
+       nilfs_detach_checkpoint(sbi);
+       nilfs_mdt_clear(nilfs->ns_cpfile);
+       nilfs_mdt_clear(nilfs->ns_sufile);
+       nilfs_mdt_clear(nilfs->ns_dat);
+       return err;
+}
+
+/**
+ * nilfs_search_super_root - search the latest valid super root
+ * @nilfs: the_nilfs
+ * @sbi: nilfs_sb_info
+ * @ri: pointer to a nilfs_recovery_info struct to store search results.
+ *
+ * nilfs_search_super_root() looks for the latest super-root from a partial
+ * segment pointed by the superblock.  It sets up struct the_nilfs through
+ * this search. It fills nilfs_recovery_info (ri) required for recovery.
+ *
+ * Return Value: On success, 0 is returned.  On error, one of the following
+ * negative error code is returned.
+ *
+ * %-EINVAL - No valid segment found
+ *
+ * %-EIO - I/O error
+ */
+int nilfs_search_super_root(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi,
+                           struct nilfs_recovery_info *ri)
+{
+       struct nilfs_segsum_info ssi;
+       sector_t pseg_start, pseg_end, sr_pseg_start = 0;
+       sector_t seg_start, seg_end; /* range of full segment (block number) */
+       u64 seg_seq;
+       __u64 segnum, nextnum = 0;
+       __u64 cno;
+       struct nilfs_segment_entry *ent;
+       LIST_HEAD(segments);
+       int empty_seg = 0, scan_newer = 0;
+       int ret;
+
+       pseg_start = nilfs->ns_last_pseg;
+       seg_seq = nilfs->ns_last_seq;
+       cno = nilfs->ns_last_cno;
+       segnum = nilfs_get_segnum_of_block(nilfs, pseg_start);
+
+       /* Calculate range of segment */
+       nilfs_get_segment_range(nilfs, segnum, &seg_start, &seg_end);
+
+       for (;;) {
+               /* Load segment summary */
+               ret = load_segment_summary(sbi, pseg_start, seg_seq, &ssi, 1);
+               if (ret) {
+                       if (ret == NILFS_SEG_FAIL_IO)
+                               goto failed;
+                       goto strayed;
+               }
+               pseg_end = pseg_start + ssi.nblocks - 1;
+               if (unlikely(pseg_end > seg_end)) {
+                       ret = NILFS_SEG_FAIL_CONSISTENCY;
+                       goto strayed;
+               }
+
+               /* A valid partial segment */
+               ri->ri_pseg_start = pseg_start;
+               ri->ri_seq = seg_seq;
+               ri->ri_segnum = segnum;
+               nextnum = nilfs_get_segnum_of_block(nilfs, ssi.next);
+               ri->ri_nextnum = nextnum;
+               empty_seg = 0;
+
+               if (!NILFS_SEG_HAS_SR(&ssi)) {
+                       if (!scan_newer) {
+                               /* This will never happen because a superblock
+                                  (last_segment) always points to a pseg
+                                  having a super root. */
+                               ret = NILFS_SEG_FAIL_CONSISTENCY;
+                               goto failed;
+                       }
+                       if (!ri->ri_lsegs_start && NILFS_SEG_LOGBGN(&ssi)) {
+                               ri->ri_lsegs_start = pseg_start;
+                               ri->ri_lsegs_start_seq = seg_seq;
+                       }
+                       if (NILFS_SEG_LOGEND(&ssi))
+                               ri->ri_lsegs_end = pseg_start;
+                       goto try_next_pseg;
+               }
+
+               /* A valid super root was found. */
+               ri->ri_cno = cno++;
+               ri->ri_super_root = pseg_end;
+               ri->ri_lsegs_start = ri->ri_lsegs_end = 0;
+
+               nilfs_dispose_segment_list(&segments);
+               nilfs->ns_pseg_offset = (sr_pseg_start = pseg_start)
+                       + ssi.nblocks - seg_start;
+               nilfs->ns_seg_seq = seg_seq;
+               nilfs->ns_segnum = segnum;
+               nilfs->ns_cno = cno;  /* nilfs->ns_cno = ri->ri_cno + 1 */
+               nilfs->ns_ctime = ssi.ctime;
+               nilfs->ns_nextnum = nextnum;
+
+               if (scan_newer)
+                       ri->ri_need_recovery = NILFS_RECOVERY_SR_UPDATED;
+               else {
+                       if (nilfs->ns_mount_state & NILFS_VALID_FS)
+                               goto super_root_found;
+                       scan_newer = 1;
+               }
+
+               /* reset region for roll-forward */
+               pseg_start += ssi.nblocks;
+               if (pseg_start < seg_end)
+                       continue;
+               goto feed_segment;
+
+ try_next_pseg:
+               /* Standing on a course, or met an inconsistent state */
+               pseg_start += ssi.nblocks;
+               if (pseg_start < seg_end)
+                       continue;
+               goto feed_segment;
+
+ strayed:
+               /* Off the trail */
+               if (!scan_newer)
+                       /*
+                        * This can happen if a checkpoint was written without
+                        * barriers, or as a result of an I/O failure.
+                        */
+                       goto failed;
+
+ feed_segment:
+               /* Looking to the next full segment */
+               if (empty_seg++)
+                       goto super_root_found; /* found a valid super root */
+
+               ent = nilfs_alloc_segment_entry(segnum);
+               if (unlikely(!ent)) {
+                       ret = -ENOMEM;
+                       goto failed;
+               }
+               list_add_tail(&ent->list, &segments);
+
+               seg_seq++;
+               segnum = nextnum;
+               nilfs_get_segment_range(nilfs, segnum, &seg_start, &seg_end);
+               pseg_start = seg_start;
+       }
+
+ super_root_found:
+       /* Updating pointers relating to the latest checkpoint */
+       list_splice(&segments, ri->ri_used_segments.prev);
+       nilfs->ns_last_pseg = sr_pseg_start;
+       nilfs->ns_last_seq = nilfs->ns_seg_seq;
+       nilfs->ns_last_cno = ri->ri_cno;
+       return 0;
+
+ failed:
+       nilfs_dispose_segment_list(&segments);
+       return (ret < 0) ? ret : nilfs_warn_segment_error(ret);
+}
diff --git a/fs/nilfs2/sb.h b/fs/nilfs2/sb.h
new file mode 100644 (file)
index 0000000..adccd4f
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * sb.h - NILFS on-memory super block structure.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+
+#ifndef _NILFS_SB
+#define _NILFS_SB
+
+#include <linux/types.h>
+#include <linux/fs.h>
+
+/*
+ * Mount options
+ */
+struct nilfs_mount_options {
+       unsigned long mount_opt;
+       __u64 snapshot_cno;
+};
+
+struct the_nilfs;
+struct nilfs_sc_info;
+
+/*
+ * NILFS super-block data in memory
+ */
+struct nilfs_sb_info {
+       /* Snapshot status */
+       __u64 s_snapshot_cno;           /* Checkpoint number */
+       atomic_t s_inodes_count;
+       atomic_t s_blocks_count;        /* Reserved (might be deleted) */
+
+       /* Mount options */
+       unsigned long s_mount_opt;
+       uid_t s_resuid;
+       gid_t s_resgid;
+
+       unsigned long s_interval;       /* construction interval */
+       unsigned long s_watermark;      /* threshold of data amount
+                                          for the segment construction */
+
+       /* Fundamental members */
+       struct super_block *s_super;    /* reverse pointer to super_block */
+       struct the_nilfs *s_nilfs;
+       struct list_head s_list;        /* list head for nilfs->ns_supers */
+
+       /* Segment constructor */
+       struct list_head s_dirty_files; /* dirty files list */
+       struct nilfs_sc_info *s_sc_info; /* segment constructor info */
+       spinlock_t s_inode_lock;        /* Lock for the nilfs inode.
+                                          It covers s_dirty_files list */
+
+       /* Metadata files */
+       struct inode *s_ifile;          /* index file inode */
+
+       /* Inode allocator */
+       spinlock_t s_next_gen_lock;
+       u32 s_next_generation;
+};
+
+static inline struct nilfs_sb_info *NILFS_SB(struct super_block *sb)
+{
+       return sb->s_fs_info;
+}
+
+static inline struct nilfs_sc_info *NILFS_SC(struct nilfs_sb_info *sbi)
+{
+       return sbi->s_sc_info;
+}
+
+/*
+ * Bit operations for the mount option
+ */
+#define nilfs_clear_opt(sbi, opt)  \
+       do { (sbi)->s_mount_opt &= ~NILFS_MOUNT_##opt; } while (0)
+#define nilfs_set_opt(sbi, opt)  \
+       do { (sbi)->s_mount_opt |= NILFS_MOUNT_##opt; } while (0)
+#define nilfs_test_opt(sbi, opt)   ((sbi)->s_mount_opt & NILFS_MOUNT_##opt)
+#define nilfs_write_opt(sbi, mask, opt)                                        \
+       do { (sbi)->s_mount_opt =                                       \
+               (((sbi)->s_mount_opt & ~NILFS_MOUNT_##mask) |           \
+                NILFS_MOUNT_##opt);                                    \
+       } while (0)
+
+#endif /* _NILFS_SB */
diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c
new file mode 100644 (file)
index 0000000..1e68821
--- /dev/null
@@ -0,0 +1,439 @@
+/*
+ * segbuf.c - NILFS segment buffer
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+
+#include <linux/buffer_head.h>
+#include <linux/writeback.h>
+#include <linux/crc32.h>
+#include "page.h"
+#include "segbuf.h"
+#include "seglist.h"
+
+
+static struct kmem_cache *nilfs_segbuf_cachep;
+
+static void nilfs_segbuf_init_once(void *obj)
+{
+       memset(obj, 0, sizeof(struct nilfs_segment_buffer));
+}
+
+int __init nilfs_init_segbuf_cache(void)
+{
+       nilfs_segbuf_cachep =
+               kmem_cache_create("nilfs2_segbuf_cache",
+                                 sizeof(struct nilfs_segment_buffer),
+                                 0, SLAB_RECLAIM_ACCOUNT,
+                                 nilfs_segbuf_init_once);
+
+       return (nilfs_segbuf_cachep == NULL) ? -ENOMEM : 0;
+}
+
+void nilfs_destroy_segbuf_cache(void)
+{
+       kmem_cache_destroy(nilfs_segbuf_cachep);
+}
+
+struct nilfs_segment_buffer *nilfs_segbuf_new(struct super_block *sb)
+{
+       struct nilfs_segment_buffer *segbuf;
+
+       segbuf = kmem_cache_alloc(nilfs_segbuf_cachep, GFP_NOFS);
+       if (unlikely(!segbuf))
+               return NULL;
+
+       segbuf->sb_super = sb;
+       INIT_LIST_HEAD(&segbuf->sb_list);
+       INIT_LIST_HEAD(&segbuf->sb_segsum_buffers);
+       INIT_LIST_HEAD(&segbuf->sb_payload_buffers);
+       return segbuf;
+}
+
+void nilfs_segbuf_free(struct nilfs_segment_buffer *segbuf)
+{
+       kmem_cache_free(nilfs_segbuf_cachep, segbuf);
+}
+
+void nilfs_segbuf_map(struct nilfs_segment_buffer *segbuf, __u64 segnum,
+                    unsigned long offset, struct the_nilfs *nilfs)
+{
+       segbuf->sb_segnum = segnum;
+       nilfs_get_segment_range(nilfs, segnum, &segbuf->sb_fseg_start,
+                               &segbuf->sb_fseg_end);
+
+       segbuf->sb_pseg_start = segbuf->sb_fseg_start + offset;
+       segbuf->sb_rest_blocks =
+               segbuf->sb_fseg_end - segbuf->sb_pseg_start + 1;
+}
+
+void nilfs_segbuf_set_next_segnum(struct nilfs_segment_buffer *segbuf,
+                                 __u64 nextnum, struct the_nilfs *nilfs)
+{
+       segbuf->sb_nextnum = nextnum;
+       segbuf->sb_sum.next = nilfs_get_segment_start_blocknr(nilfs, nextnum);
+}
+
+int nilfs_segbuf_extend_segsum(struct nilfs_segment_buffer *segbuf)
+{
+       struct buffer_head *bh;
+
+       bh = sb_getblk(segbuf->sb_super,
+                      segbuf->sb_pseg_start + segbuf->sb_sum.nsumblk);
+       if (unlikely(!bh))
+               return -ENOMEM;
+
+       nilfs_segbuf_add_segsum_buffer(segbuf, bh);
+       return 0;
+}
+
+int nilfs_segbuf_extend_payload(struct nilfs_segment_buffer *segbuf,
+                               struct buffer_head **bhp)
+{
+       struct buffer_head *bh;
+
+       bh = sb_getblk(segbuf->sb_super,
+                      segbuf->sb_pseg_start + segbuf->sb_sum.nblocks);
+       if (unlikely(!bh))
+               return -ENOMEM;
+
+       nilfs_segbuf_add_payload_buffer(segbuf, bh);
+       *bhp = bh;
+       return 0;
+}
+
+int nilfs_segbuf_reset(struct nilfs_segment_buffer *segbuf, unsigned flags,
+                      time_t ctime)
+{
+       int err;
+
+       segbuf->sb_sum.nblocks = segbuf->sb_sum.nsumblk = 0;
+       err = nilfs_segbuf_extend_segsum(segbuf);
+       if (unlikely(err))
+               return err;
+
+       segbuf->sb_sum.flags = flags;
+       segbuf->sb_sum.sumbytes = sizeof(struct nilfs_segment_summary);
+       segbuf->sb_sum.nfinfo = segbuf->sb_sum.nfileblk = 0;
+       segbuf->sb_sum.ctime = ctime;
+
+       segbuf->sb_io_error = 0;
+       return 0;
+}
+
+/*
+ * Setup segument summary
+ */
+void nilfs_segbuf_fill_in_segsum(struct nilfs_segment_buffer *segbuf)
+{
+       struct nilfs_segment_summary *raw_sum;
+       struct buffer_head *bh_sum;
+
+       bh_sum = list_entry(segbuf->sb_segsum_buffers.next,
+                           struct buffer_head, b_assoc_buffers);
+       raw_sum = (struct nilfs_segment_summary *)bh_sum->b_data;
+
+       raw_sum->ss_magic    = cpu_to_le32(NILFS_SEGSUM_MAGIC);
+       raw_sum->ss_bytes    = cpu_to_le16(sizeof(*raw_sum));
+       raw_sum->ss_flags    = cpu_to_le16(segbuf->sb_sum.flags);
+       raw_sum->ss_seq      = cpu_to_le64(segbuf->sb_sum.seg_seq);
+       raw_sum->ss_create   = cpu_to_le64(segbuf->sb_sum.ctime);
+       raw_sum->ss_next     = cpu_to_le64(segbuf->sb_sum.next);
+       raw_sum->ss_nblocks  = cpu_to_le32(segbuf->sb_sum.nblocks);
+       raw_sum->ss_nfinfo   = cpu_to_le32(segbuf->sb_sum.nfinfo);
+       raw_sum->ss_sumbytes = cpu_to_le32(segbuf->sb_sum.sumbytes);
+       raw_sum->ss_pad      = 0;
+}
+
+/*
+ * CRC calculation routines
+ */
+void nilfs_segbuf_fill_in_segsum_crc(struct nilfs_segment_buffer *segbuf,
+                                    u32 seed)
+{
+       struct buffer_head *bh;
+       struct nilfs_segment_summary *raw_sum;
+       unsigned long size, bytes = segbuf->sb_sum.sumbytes;
+       u32 crc;
+
+       bh = list_entry(segbuf->sb_segsum_buffers.next, struct buffer_head,
+                       b_assoc_buffers);
+
+       raw_sum = (struct nilfs_segment_summary *)bh->b_data;
+       size = min_t(unsigned long, bytes, bh->b_size);
+       crc = crc32_le(seed,
+                      (unsigned char *)raw_sum +
+                      sizeof(raw_sum->ss_datasum) + sizeof(raw_sum->ss_sumsum),
+                      size - (sizeof(raw_sum->ss_datasum) +
+                              sizeof(raw_sum->ss_sumsum)));
+
+       list_for_each_entry_continue(bh, &segbuf->sb_segsum_buffers,
+                                    b_assoc_buffers) {
+               bytes -= size;
+               size = min_t(unsigned long, bytes, bh->b_size);
+               crc = crc32_le(crc, bh->b_data, size);
+       }
+       raw_sum->ss_sumsum = cpu_to_le32(crc);
+}
+
+void nilfs_segbuf_fill_in_data_crc(struct nilfs_segment_buffer *segbuf,
+                                  u32 seed)
+{
+       struct buffer_head *bh;
+       struct nilfs_segment_summary *raw_sum;
+       void *kaddr;
+       u32 crc;
+
+       bh = list_entry(segbuf->sb_segsum_buffers.next, struct buffer_head,
+                       b_assoc_buffers);
+       raw_sum = (struct nilfs_segment_summary *)bh->b_data;
+       crc = crc32_le(seed,
+                      (unsigned char *)raw_sum + sizeof(raw_sum->ss_datasum),
+                      bh->b_size - sizeof(raw_sum->ss_datasum));
+
+       list_for_each_entry_continue(bh, &segbuf->sb_segsum_buffers,
+                                    b_assoc_buffers) {
+               crc = crc32_le(crc, bh->b_data, bh->b_size);
+       }
+       list_for_each_entry(bh, &segbuf->sb_payload_buffers, b_assoc_buffers) {
+               kaddr = kmap_atomic(bh->b_page, KM_USER0);
+               crc = crc32_le(crc, kaddr + bh_offset(bh), bh->b_size);
+               kunmap_atomic(kaddr, KM_USER0);
+       }
+       raw_sum->ss_datasum = cpu_to_le32(crc);
+}
+
+void nilfs_release_buffers(struct list_head *list)
+{
+       struct buffer_head *bh, *n;
+
+       list_for_each_entry_safe(bh, n, list, b_assoc_buffers) {
+               list_del_init(&bh->b_assoc_buffers);
+               if (buffer_nilfs_allocated(bh)) {
+                       struct page *clone_page = bh->b_page;
+
+                       /* remove clone page */
+                       brelse(bh);
+                       page_cache_release(clone_page); /* for each bh */
+                       if (page_count(clone_page) <= 2) {
+                               lock_page(clone_page);
+                               nilfs_free_private_page(clone_page);
+                       }
+                       continue;
+               }
+               brelse(bh);
+       }
+}
+
+/*
+ * BIO operations
+ */
+static void nilfs_end_bio_write(struct bio *bio, int err)
+{
+       const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
+       struct nilfs_write_info *wi = bio->bi_private;
+
+       if (err == -EOPNOTSUPP) {
+               set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
+               bio_put(bio);
+               /* to be detected by submit_seg_bio() */
+       }
+
+       if (!uptodate)
+               atomic_inc(&wi->err);
+
+       bio_put(bio);
+       complete(&wi->bio_event);
+}
+
+static int nilfs_submit_seg_bio(struct nilfs_write_info *wi, int mode)
+{
+       struct bio *bio = wi->bio;
+       int err;
+
+       if (wi->nbio > 0 && bdi_write_congested(wi->bdi)) {
+               wait_for_completion(&wi->bio_event);
+               wi->nbio--;
+               if (unlikely(atomic_read(&wi->err))) {
+                       bio_put(bio);
+                       err = -EIO;
+                       goto failed;
+               }
+       }
+
+       bio->bi_end_io = nilfs_end_bio_write;
+       bio->bi_private = wi;
+       bio_get(bio);
+       submit_bio(mode, bio);
+       if (bio_flagged(bio, BIO_EOPNOTSUPP)) {
+               bio_put(bio);
+               err = -EOPNOTSUPP;
+               goto failed;
+       }
+       wi->nbio++;
+       bio_put(bio);
+
+       wi->bio = NULL;
+       wi->rest_blocks -= wi->end - wi->start;
+       wi->nr_vecs = min(wi->max_pages, wi->rest_blocks);
+       wi->start = wi->end;
+       return 0;
+
+ failed:
+       wi->bio = NULL;
+       return err;
+}
+
+/**
+ * nilfs_alloc_seg_bio - allocate a bio for writing segment.
+ * @sb: super block
+ * @start: beginning disk block number of this BIO.
+ * @nr_vecs: request size of page vector.
+ *
+ * alloc_seg_bio() allocates a new BIO structure and initialize it.
+ *
+ * Return Value: On success, pointer to the struct bio is returned.
+ * On error, NULL is returned.
+ */
+static struct bio *nilfs_alloc_seg_bio(struct super_block *sb, sector_t start,
+                                      int nr_vecs)
+{
+       struct bio *bio;
+
+       bio = bio_alloc(GFP_NOWAIT, nr_vecs);
+       if (bio == NULL) {
+               while (!bio && (nr_vecs >>= 1))
+                       bio = bio_alloc(GFP_NOWAIT, nr_vecs);
+       }
+       if (likely(bio)) {
+               bio->bi_bdev = sb->s_bdev;
+               bio->bi_sector = (sector_t)start << (sb->s_blocksize_bits - 9);
+       }
+       return bio;
+}
+
+void nilfs_segbuf_prepare_write(struct nilfs_segment_buffer *segbuf,
+                               struct nilfs_write_info *wi)
+{
+       wi->bio = NULL;
+       wi->rest_blocks = segbuf->sb_sum.nblocks;
+       wi->max_pages = bio_get_nr_vecs(wi->sb->s_bdev);
+       wi->nr_vecs = min(wi->max_pages, wi->rest_blocks);
+       wi->start = wi->end = 0;
+       wi->nbio = 0;
+       wi->blocknr = segbuf->sb_pseg_start;
+
+       atomic_set(&wi->err, 0);
+       init_completion(&wi->bio_event);
+}
+
+static int nilfs_submit_bh(struct nilfs_write_info *wi, struct buffer_head *bh,
+                          int mode)
+{
+       int len, err;
+
+       BUG_ON(wi->nr_vecs <= 0);
+ repeat:
+       if (!wi->bio) {
+               wi->bio = nilfs_alloc_seg_bio(wi->sb, wi->blocknr + wi->end,
+                                             wi->nr_vecs);
+               if (unlikely(!wi->bio))
+                       return -ENOMEM;
+       }
+
+       len = bio_add_page(wi->bio, bh->b_page, bh->b_size, bh_offset(bh));
+       if (len == bh->b_size) {
+               wi->end++;
+               return 0;
+       }
+       /* bio is FULL */
+       err = nilfs_submit_seg_bio(wi, mode);
+       /* never submit current bh */
+       if (likely(!err))
+               goto repeat;
+       return err;
+}
+
+int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf,
+                      struct nilfs_write_info *wi)
+{
+       struct buffer_head *bh;
+       int res, rw = WRITE;
+
+       list_for_each_entry(bh, &segbuf->sb_segsum_buffers, b_assoc_buffers) {
+               res = nilfs_submit_bh(wi, bh, rw);
+               if (unlikely(res))
+                       goto failed_bio;
+       }
+
+       list_for_each_entry(bh, &segbuf->sb_payload_buffers, b_assoc_buffers) {
+               res = nilfs_submit_bh(wi, bh, rw);
+               if (unlikely(res))
+                       goto failed_bio;
+       }
+
+       if (wi->bio) {
+               /*
+                * Last BIO is always sent through the following
+                * submission.
+                */
+               rw |= (1 << BIO_RW_SYNCIO);
+               res = nilfs_submit_seg_bio(wi, rw);
+               if (unlikely(res))
+                       goto failed_bio;
+       }
+
+       res = 0;
+ out:
+       return res;
+
+ failed_bio:
+       atomic_inc(&wi->err);
+       goto out;
+}
+
+/**
+ * nilfs_segbuf_wait - wait for completion of requested BIOs
+ * @wi: nilfs_write_info
+ *
+ * Return Value: On Success, 0 is returned. On Error, one of the following
+ * negative error code is returned.
+ *
+ * %-EIO - I/O error
+ */
+int nilfs_segbuf_wait(struct nilfs_segment_buffer *segbuf,
+                     struct nilfs_write_info *wi)
+{
+       int err = 0;
+
+       if (!wi->nbio)
+               return 0;
+
+       do {
+               wait_for_completion(&wi->bio_event);
+       } while (--wi->nbio > 0);
+
+       if (unlikely(atomic_read(&wi->err) > 0)) {
+               printk(KERN_ERR "NILFS: IO error writing segment\n");
+               err = -EIO;
+               segbuf->sb_io_error = 1;
+       }
+       return err;
+}
diff --git a/fs/nilfs2/segbuf.h b/fs/nilfs2/segbuf.h
new file mode 100644 (file)
index 0000000..0c3076f
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * segbuf.h - NILFS Segment buffer prototypes and definitions
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+#ifndef _NILFS_SEGBUF_H
+#define _NILFS_SEGBUF_H
+
+#include <linux/fs.h>
+#include <linux/buffer_head.h>
+#include <linux/bio.h>
+#include <linux/completion.h>
+#include <linux/backing-dev.h>
+
+/**
+ * struct nilfs_segsum_info - On-memory segment summary
+ * @flags: Flags
+ * @nfinfo: Number of file information structures
+ * @nblocks: Number of blocks included in the partial segment
+ * @nsumblk: Number of summary blocks
+ * @sumbytes: Byte count of segment summary
+ * @nfileblk: Total number of file blocks
+ * @seg_seq: Segment sequence number
+ * @ctime: Creation time
+ * @next: Block number of the next full segment
+ */
+struct nilfs_segsum_info {
+       unsigned int            flags;
+       unsigned long           nfinfo;
+       unsigned long           nblocks;
+       unsigned long           nsumblk;
+       unsigned long           sumbytes;
+       unsigned long           nfileblk;
+       u64                     seg_seq;
+       time_t                  ctime;
+       sector_t                next;
+};
+
+/* macro for the flags */
+#define NILFS_SEG_HAS_SR(sum)    ((sum)->flags & NILFS_SS_SR)
+#define NILFS_SEG_LOGBGN(sum)    ((sum)->flags & NILFS_SS_LOGBGN)
+#define NILFS_SEG_LOGEND(sum)    ((sum)->flags & NILFS_SS_LOGEND)
+#define NILFS_SEG_DSYNC(sum)     ((sum)->flags & NILFS_SS_SYNDT)
+#define NILFS_SEG_SIMPLEX(sum) \
+       (((sum)->flags & (NILFS_SS_LOGBGN | NILFS_SS_LOGEND)) == \
+        (NILFS_SS_LOGBGN | NILFS_SS_LOGEND))
+
+#define NILFS_SEG_EMPTY(sum)   ((sum)->nblocks == (sum)->nsumblk)
+
+/**
+ * struct nilfs_segment_buffer - Segment buffer
+ * @sb_super: back pointer to a superblock struct
+ * @sb_list: List head to chain this structure
+ * @sb_sum: On-memory segment summary
+ * @sb_segnum: Index number of the full segment
+ * @sb_nextnum: Index number of the next full segment
+ * @sb_fseg_start: Start block number of the full segment
+ * @sb_fseg_end: End block number of the full segment
+ * @sb_pseg_start: Disk block number of partial segment
+ * @sb_rest_blocks: Number of residual blocks in the current segment
+ * @sb_segsum_buffers: List of buffers for segment summaries
+ * @sb_payload_buffers: List of buffers for segment payload
+ * @sb_io_error: I/O error status
+ */
+struct nilfs_segment_buffer {
+       struct super_block     *sb_super;
+       struct list_head        sb_list;
+
+       /* Segment information */
+       struct nilfs_segsum_info sb_sum;
+       __u64                   sb_segnum;
+       __u64                   sb_nextnum;
+       sector_t                sb_fseg_start, sb_fseg_end;
+       sector_t                sb_pseg_start;
+       unsigned                sb_rest_blocks;
+
+       /* Buffers */
+       struct list_head        sb_segsum_buffers;
+       struct list_head        sb_payload_buffers; /* including super root */
+
+       /* io status */
+       int                     sb_io_error;
+};
+
+#define NILFS_LIST_SEGBUF(head)  \
+       list_entry((head), struct nilfs_segment_buffer, sb_list)
+#define NILFS_NEXT_SEGBUF(segbuf)  NILFS_LIST_SEGBUF((segbuf)->sb_list.next)
+#define NILFS_PREV_SEGBUF(segbuf)  NILFS_LIST_SEGBUF((segbuf)->sb_list.prev)
+#define NILFS_LAST_SEGBUF(head)    NILFS_LIST_SEGBUF((head)->prev)
+#define NILFS_FIRST_SEGBUF(head)   NILFS_LIST_SEGBUF((head)->next)
+#define NILFS_SEGBUF_IS_LAST(segbuf, head)  ((segbuf)->sb_list.next == (head))
+
+#define nilfs_for_each_segbuf_before(s, t, h) \
+       for ((s) = NILFS_FIRST_SEGBUF(h); (s) != (t); \
+            (s) = NILFS_NEXT_SEGBUF(s))
+
+#define NILFS_SEGBUF_FIRST_BH(head)  \
+       (list_entry((head)->next, struct buffer_head, b_assoc_buffers))
+#define NILFS_SEGBUF_NEXT_BH(bh)  \
+       (list_entry((bh)->b_assoc_buffers.next, struct buffer_head, \
+                   b_assoc_buffers))
+#define NILFS_SEGBUF_BH_IS_LAST(bh, head)  ((bh)->b_assoc_buffers.next == head)
+
+
+int __init nilfs_init_segbuf_cache(void);
+void nilfs_destroy_segbuf_cache(void);
+struct nilfs_segment_buffer *nilfs_segbuf_new(struct super_block *);
+void nilfs_segbuf_free(struct nilfs_segment_buffer *);
+void nilfs_segbuf_map(struct nilfs_segment_buffer *, __u64, unsigned long,
+                     struct the_nilfs *);
+void nilfs_segbuf_set_next_segnum(struct nilfs_segment_buffer *, __u64,
+                                 struct the_nilfs *);
+int nilfs_segbuf_reset(struct nilfs_segment_buffer *, unsigned, time_t);
+int nilfs_segbuf_extend_segsum(struct nilfs_segment_buffer *);
+int nilfs_segbuf_extend_payload(struct nilfs_segment_buffer *,
+                               struct buffer_head **);
+void nilfs_segbuf_fill_in_segsum(struct nilfs_segment_buffer *);
+void nilfs_segbuf_fill_in_segsum_crc(struct nilfs_segment_buffer *, u32);
+void nilfs_segbuf_fill_in_data_crc(struct nilfs_segment_buffer *, u32);
+
+static inline void
+nilfs_segbuf_add_segsum_buffer(struct nilfs_segment_buffer *segbuf,
+                              struct buffer_head *bh)
+{
+       list_add_tail(&bh->b_assoc_buffers, &segbuf->sb_segsum_buffers);
+       segbuf->sb_sum.nblocks++;
+       segbuf->sb_sum.nsumblk++;
+}
+
+static inline void
+nilfs_segbuf_add_payload_buffer(struct nilfs_segment_buffer *segbuf,
+                               struct buffer_head *bh)
+{
+       list_add_tail(&bh->b_assoc_buffers, &segbuf->sb_payload_buffers);
+       segbuf->sb_sum.nblocks++;
+}
+
+static inline void
+nilfs_segbuf_add_file_buffer(struct nilfs_segment_buffer *segbuf,
+                            struct buffer_head *bh)
+{
+       get_bh(bh);
+       nilfs_segbuf_add_payload_buffer(segbuf, bh);
+       segbuf->sb_sum.nfileblk++;
+}
+
+void nilfs_release_buffers(struct list_head *);
+
+static inline void nilfs_segbuf_clear(struct nilfs_segment_buffer *segbuf)
+{
+       nilfs_release_buffers(&segbuf->sb_segsum_buffers);
+       nilfs_release_buffers(&segbuf->sb_payload_buffers);
+}
+
+struct nilfs_write_info {
+       struct bio             *bio;
+       int                     start, end; /* The region to be submitted */
+       int                     rest_blocks;
+       int                     max_pages;
+       int                     nr_vecs;
+       sector_t                blocknr;
+
+       int                     nbio;
+       atomic_t                err;
+       struct completion       bio_event;
+                               /* completion event of segment write */
+
+       /*
+        * The following fields must be set explicitly
+        */
+       struct super_block     *sb;
+       struct backing_dev_info *bdi; /* backing dev info */
+       struct buffer_head     *bh_sr;
+};
+
+
+void nilfs_segbuf_prepare_write(struct nilfs_segment_buffer *,
+                               struct nilfs_write_info *);
+int nilfs_segbuf_write(struct nilfs_segment_buffer *,
+                      struct nilfs_write_info *);
+int nilfs_segbuf_wait(struct nilfs_segment_buffer *,
+                     struct nilfs_write_info *);
+
+#endif /* _NILFS_SEGBUF_H */
diff --git a/fs/nilfs2/seglist.h b/fs/nilfs2/seglist.h
new file mode 100644 (file)
index 0000000..d39df91
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * seglist.h - expediential structure and routines to handle list of segments
+ *             (would be removed in a future release)
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+#ifndef _NILFS_SEGLIST_H
+#define _NILFS_SEGLIST_H
+
+#include <linux/fs.h>
+#include <linux/buffer_head.h>
+#include <linux/nilfs2_fs.h>
+#include "sufile.h"
+
+struct nilfs_segment_entry {
+       __u64                   segnum;
+
+#define NILFS_SLH_FREED                0x0001  /* The segment was freed provisonally.
+                                          It must be cancelled if
+                                          construction aborted */
+
+       unsigned                flags;
+       struct list_head        list;
+       struct buffer_head     *bh_su;
+       struct nilfs_segment_usage *raw_su;
+};
+
+
+void nilfs_dispose_segment_list(struct list_head *);
+
+static inline struct nilfs_segment_entry *
+nilfs_alloc_segment_entry(__u64 segnum)
+{
+       struct nilfs_segment_entry *ent = kmalloc(sizeof(*ent), GFP_NOFS);
+
+       if (likely(ent)) {
+               ent->segnum = segnum;
+               ent->flags = 0;
+               ent->bh_su = NULL;
+               ent->raw_su = NULL;
+               INIT_LIST_HEAD(&ent->list);
+       }
+       return ent;
+}
+
+static inline int nilfs_open_segment_entry(struct nilfs_segment_entry *ent,
+                                          struct inode *sufile)
+{
+       return nilfs_sufile_get_segment_usage(sufile, ent->segnum,
+                                             &ent->raw_su, &ent->bh_su);
+}
+
+static inline void nilfs_close_segment_entry(struct nilfs_segment_entry *ent,
+                                            struct inode *sufile)
+{
+       if (!ent->bh_su)
+               return;
+       nilfs_sufile_put_segment_usage(sufile, ent->segnum, ent->bh_su);
+       ent->bh_su = NULL;
+       ent->raw_su = NULL;
+}
+
+static inline void nilfs_free_segment_entry(struct nilfs_segment_entry *ent)
+{
+       kfree(ent);
+}
+
+#endif /* _NILFS_SEGLIST_H */
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
new file mode 100644 (file)
index 0000000..fb70ec3
--- /dev/null
@@ -0,0 +1,2977 @@
+/*
+ * segment.c - NILFS segment constructor.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+
+#include <linux/pagemap.h>
+#include <linux/buffer_head.h>
+#include <linux/writeback.h>
+#include <linux/bio.h>
+#include <linux/completion.h>
+#include <linux/blkdev.h>
+#include <linux/backing-dev.h>
+#include <linux/freezer.h>
+#include <linux/kthread.h>
+#include <linux/crc32.h>
+#include <linux/pagevec.h>
+#include "nilfs.h"
+#include "btnode.h"
+#include "page.h"
+#include "segment.h"
+#include "sufile.h"
+#include "cpfile.h"
+#include "ifile.h"
+#include "seglist.h"
+#include "segbuf.h"
+
+
+/*
+ * Segment constructor
+ */
+#define SC_N_INODEVEC  16   /* Size of locally allocated inode vector */
+
+#define SC_MAX_SEGDELTA 64   /* Upper limit of the number of segments
+                               appended in collection retry loop */
+
+/* Construction mode */
+enum {
+       SC_LSEG_SR = 1, /* Make a logical segment having a super root */
+       SC_LSEG_DSYNC,  /* Flush data blocks of a given file and make
+                          a logical segment without a super root */
+       SC_FLUSH_FILE,  /* Flush data files, leads to segment writes without
+                          creating a checkpoint */
+       SC_FLUSH_DAT,   /* Flush DAT file. This also creates segments without
+                          a checkpoint */
+};
+
+/* Stage numbers of dirty block collection */
+enum {
+       NILFS_ST_INIT = 0,
+       NILFS_ST_GC,            /* Collecting dirty blocks for GC */
+       NILFS_ST_FILE,
+       NILFS_ST_IFILE,
+       NILFS_ST_CPFILE,
+       NILFS_ST_SUFILE,
+       NILFS_ST_DAT,
+       NILFS_ST_SR,            /* Super root */
+       NILFS_ST_DSYNC,         /* Data sync blocks */
+       NILFS_ST_DONE,
+};
+
+/* State flags of collection */
+#define NILFS_CF_NODE          0x0001  /* Collecting node blocks */
+#define NILFS_CF_IFILE_STARTED 0x0002  /* IFILE stage has started */
+#define NILFS_CF_HISTORY_MASK  (NILFS_CF_IFILE_STARTED)
+
+/* Operations depending on the construction mode and file type */
+struct nilfs_sc_operations {
+       int (*collect_data)(struct nilfs_sc_info *, struct buffer_head *,
+                           struct inode *);
+       int (*collect_node)(struct nilfs_sc_info *, struct buffer_head *,
+                           struct inode *);
+       int (*collect_bmap)(struct nilfs_sc_info *, struct buffer_head *,
+                           struct inode *);
+       void (*write_data_binfo)(struct nilfs_sc_info *,
+                                struct nilfs_segsum_pointer *,
+                                union nilfs_binfo *);
+       void (*write_node_binfo)(struct nilfs_sc_info *,
+                                struct nilfs_segsum_pointer *,
+                                union nilfs_binfo *);
+};
+
+/*
+ * Other definitions
+ */
+static void nilfs_segctor_start_timer(struct nilfs_sc_info *);
+static void nilfs_segctor_do_flush(struct nilfs_sc_info *, int);
+static void nilfs_segctor_do_immediate_flush(struct nilfs_sc_info *);
+static void nilfs_dispose_list(struct nilfs_sb_info *, struct list_head *,
+                              int);
+
+#define nilfs_cnt32_gt(a, b)   \
+       (typecheck(__u32, a) && typecheck(__u32, b) && \
+        ((__s32)(b) - (__s32)(a) < 0))
+#define nilfs_cnt32_ge(a, b)   \
+       (typecheck(__u32, a) && typecheck(__u32, b) && \
+        ((__s32)(a) - (__s32)(b) >= 0))
+#define nilfs_cnt32_lt(a, b)  nilfs_cnt32_gt(b, a)
+#define nilfs_cnt32_le(a, b)  nilfs_cnt32_ge(b, a)
+
+/*
+ * Transaction
+ */
+static struct kmem_cache *nilfs_transaction_cachep;
+
+/**
+ * nilfs_init_transaction_cache - create a cache for nilfs_transaction_info
+ *
+ * nilfs_init_transaction_cache() creates a slab cache for the struct
+ * nilfs_transaction_info.
+ *
+ * Return Value: On success, it returns 0. On error, one of the following
+ * negative error code is returned.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ */
+int nilfs_init_transaction_cache(void)
+{
+       nilfs_transaction_cachep =
+               kmem_cache_create("nilfs2_transaction_cache",
+                                 sizeof(struct nilfs_transaction_info),
+                                 0, SLAB_RECLAIM_ACCOUNT, NULL);
+       return (nilfs_transaction_cachep == NULL) ? -ENOMEM : 0;
+}
+
+/**
+ * nilfs_detroy_transaction_cache - destroy the cache for transaction info
+ *
+ * nilfs_destroy_transaction_cache() frees the slab cache for the struct
+ * nilfs_transaction_info.
+ */
+void nilfs_destroy_transaction_cache(void)
+{
+       kmem_cache_destroy(nilfs_transaction_cachep);
+}
+
+static int nilfs_prepare_segment_lock(struct nilfs_transaction_info *ti)
+{
+       struct nilfs_transaction_info *cur_ti = current->journal_info;
+       void *save = NULL;
+
+       if (cur_ti) {
+               if (cur_ti->ti_magic == NILFS_TI_MAGIC)
+                       return ++cur_ti->ti_count;
+               else {
+                       /*
+                        * If journal_info field is occupied by other FS,
+                        * it is saved and will be restored on
+                        * nilfs_transaction_commit().
+                        */
+                       printk(KERN_WARNING
+                              "NILFS warning: journal info from a different "
+                              "FS\n");
+                       save = current->journal_info;
+               }
+       }
+       if (!ti) {
+               ti = kmem_cache_alloc(nilfs_transaction_cachep, GFP_NOFS);
+               if (!ti)
+                       return -ENOMEM;
+               ti->ti_flags = NILFS_TI_DYNAMIC_ALLOC;
+       } else {
+               ti->ti_flags = 0;
+       }
+       ti->ti_count = 0;
+       ti->ti_save = save;
+       ti->ti_magic = NILFS_TI_MAGIC;
+       current->journal_info = ti;
+       return 0;
+}
+
+/**
+ * nilfs_transaction_begin - start indivisible file operations.
+ * @sb: super block
+ * @ti: nilfs_transaction_info
+ * @vacancy_check: flags for vacancy rate checks
+ *
+ * nilfs_transaction_begin() acquires a reader/writer semaphore, called
+ * the segment semaphore, to make a segment construction and write tasks
+ * exclusive.  The function is used with nilfs_transaction_commit() in pairs.
+ * The region enclosed by these two functions can be nested.  To avoid a
+ * deadlock, the semaphore is only acquired or released in the outermost call.
+ *
+ * This function allocates a nilfs_transaction_info struct to keep context
+ * information on it.  It is initialized and hooked onto the current task in
+ * the outermost call.  If a pre-allocated struct is given to @ti, it is used
+ * instead; othewise a new struct is assigned from a slab.
+ *
+ * When @vacancy_check flag is set, this function will check the amount of
+ * free space, and will wait for the GC to reclaim disk space if low capacity.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error code is returned.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ *
+ * %-ENOSPC - No space left on device
+ */
+int nilfs_transaction_begin(struct super_block *sb,
+                           struct nilfs_transaction_info *ti,
+                           int vacancy_check)
+{
+       struct nilfs_sb_info *sbi;
+       struct the_nilfs *nilfs;
+       int ret = nilfs_prepare_segment_lock(ti);
+
+       if (unlikely(ret < 0))
+               return ret;
+       if (ret > 0)
+               return 0;
+
+       sbi = NILFS_SB(sb);
+       nilfs = sbi->s_nilfs;
+       down_read(&nilfs->ns_segctor_sem);
+       if (vacancy_check && nilfs_near_disk_full(nilfs)) {
+               up_read(&nilfs->ns_segctor_sem);
+               ret = -ENOSPC;
+               goto failed;
+       }
+       return 0;
+
+ failed:
+       ti = current->journal_info;
+       current->journal_info = ti->ti_save;
+       if (ti->ti_flags & NILFS_TI_DYNAMIC_ALLOC)
+               kmem_cache_free(nilfs_transaction_cachep, ti);
+       return ret;
+}
+
+/**
+ * nilfs_transaction_commit - commit indivisible file operations.
+ * @sb: super block
+ *
+ * nilfs_transaction_commit() releases the read semaphore which is
+ * acquired by nilfs_transaction_begin(). This is only performed
+ * in outermost call of this function.  If a commit flag is set,
+ * nilfs_transaction_commit() sets a timer to start the segment
+ * constructor.  If a sync flag is set, it starts construction
+ * directly.
+ */
+int nilfs_transaction_commit(struct super_block *sb)
+{
+       struct nilfs_transaction_info *ti = current->journal_info;
+       struct nilfs_sb_info *sbi;
+       struct nilfs_sc_info *sci;
+       int err = 0;
+
+       BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC);
+       ti->ti_flags |= NILFS_TI_COMMIT;
+       if (ti->ti_count > 0) {
+               ti->ti_count--;
+               return 0;
+       }
+       sbi = NILFS_SB(sb);
+       sci = NILFS_SC(sbi);
+       if (sci != NULL) {
+               if (ti->ti_flags & NILFS_TI_COMMIT)
+                       nilfs_segctor_start_timer(sci);
+               if (atomic_read(&sbi->s_nilfs->ns_ndirtyblks) >
+                   sci->sc_watermark)
+                       nilfs_segctor_do_flush(sci, 0);
+       }
+       up_read(&sbi->s_nilfs->ns_segctor_sem);
+       current->journal_info = ti->ti_save;
+
+       if (ti->ti_flags & NILFS_TI_SYNC)
+               err = nilfs_construct_segment(sb);
+       if (ti->ti_flags & NILFS_TI_DYNAMIC_ALLOC)
+               kmem_cache_free(nilfs_transaction_cachep, ti);
+       return err;
+}
+
+void nilfs_transaction_abort(struct super_block *sb)
+{
+       struct nilfs_transaction_info *ti = current->journal_info;
+
+       BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC);
+       if (ti->ti_count > 0) {
+               ti->ti_count--;
+               return;
+       }
+       up_read(&NILFS_SB(sb)->s_nilfs->ns_segctor_sem);
+
+       current->journal_info = ti->ti_save;
+       if (ti->ti_flags & NILFS_TI_DYNAMIC_ALLOC)
+               kmem_cache_free(nilfs_transaction_cachep, ti);
+}
+
+void nilfs_relax_pressure_in_lock(struct super_block *sb)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct nilfs_sc_info *sci = NILFS_SC(sbi);
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+
+       if (!sci || !sci->sc_flush_request)
+               return;
+
+       set_bit(NILFS_SC_PRIOR_FLUSH, &sci->sc_flags);
+       up_read(&nilfs->ns_segctor_sem);
+
+       down_write(&nilfs->ns_segctor_sem);
+       if (sci->sc_flush_request &&
+           test_bit(NILFS_SC_PRIOR_FLUSH, &sci->sc_flags)) {
+               struct nilfs_transaction_info *ti = current->journal_info;
+
+               ti->ti_flags |= NILFS_TI_WRITER;
+               nilfs_segctor_do_immediate_flush(sci);
+               ti->ti_flags &= ~NILFS_TI_WRITER;
+       }
+       downgrade_write(&nilfs->ns_segctor_sem);
+}
+
+static void nilfs_transaction_lock(struct nilfs_sb_info *sbi,
+                                  struct nilfs_transaction_info *ti,
+                                  int gcflag)
+{
+       struct nilfs_transaction_info *cur_ti = current->journal_info;
+
+       WARN_ON(cur_ti);
+       ti->ti_flags = NILFS_TI_WRITER;
+       ti->ti_count = 0;
+       ti->ti_save = cur_ti;
+       ti->ti_magic = NILFS_TI_MAGIC;
+       INIT_LIST_HEAD(&ti->ti_garbage);
+       current->journal_info = ti;
+
+       for (;;) {
+               down_write(&sbi->s_nilfs->ns_segctor_sem);
+               if (!test_bit(NILFS_SC_PRIOR_FLUSH, &NILFS_SC(sbi)->sc_flags))
+                       break;
+
+               nilfs_segctor_do_immediate_flush(NILFS_SC(sbi));
+
+               up_write(&sbi->s_nilfs->ns_segctor_sem);
+               yield();
+       }
+       if (gcflag)
+               ti->ti_flags |= NILFS_TI_GC;
+}
+
+static void nilfs_transaction_unlock(struct nilfs_sb_info *sbi)
+{
+       struct nilfs_transaction_info *ti = current->journal_info;
+
+       BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC);
+       BUG_ON(ti->ti_count > 0);
+
+       up_write(&sbi->s_nilfs->ns_segctor_sem);
+       current->journal_info = ti->ti_save;
+       if (!list_empty(&ti->ti_garbage))
+               nilfs_dispose_list(sbi, &ti->ti_garbage, 0);
+}
+
+static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci,
+                                           struct nilfs_segsum_pointer *ssp,
+                                           unsigned bytes)
+{
+       struct nilfs_segment_buffer *segbuf = sci->sc_curseg;
+       unsigned blocksize = sci->sc_super->s_blocksize;
+       void *p;
+
+       if (unlikely(ssp->offset + bytes > blocksize)) {
+               ssp->offset = 0;
+               BUG_ON(NILFS_SEGBUF_BH_IS_LAST(ssp->bh,
+                                              &segbuf->sb_segsum_buffers));
+               ssp->bh = NILFS_SEGBUF_NEXT_BH(ssp->bh);
+       }
+       p = ssp->bh->b_data + ssp->offset;
+       ssp->offset += bytes;
+       return p;
+}
+
+/**
+ * nilfs_segctor_reset_segment_buffer - reset the current segment buffer
+ * @sci: nilfs_sc_info
+ */
+static int nilfs_segctor_reset_segment_buffer(struct nilfs_sc_info *sci)
+{
+       struct nilfs_segment_buffer *segbuf = sci->sc_curseg;
+       struct buffer_head *sumbh;
+       unsigned sumbytes;
+       unsigned flags = 0;
+       int err;
+
+       if (nilfs_doing_gc())
+               flags = NILFS_SS_GC;
+       err = nilfs_segbuf_reset(segbuf, flags, sci->sc_seg_ctime);
+       if (unlikely(err))
+               return err;
+
+       sumbh = NILFS_SEGBUF_FIRST_BH(&segbuf->sb_segsum_buffers);
+       sumbytes = segbuf->sb_sum.sumbytes;
+       sci->sc_finfo_ptr.bh = sumbh;  sci->sc_finfo_ptr.offset = sumbytes;
+       sci->sc_binfo_ptr.bh = sumbh;  sci->sc_binfo_ptr.offset = sumbytes;
+       sci->sc_blk_cnt = sci->sc_datablk_cnt = 0;
+       return 0;
+}
+
+static int nilfs_segctor_feed_segment(struct nilfs_sc_info *sci)
+{
+       sci->sc_nblk_this_inc += sci->sc_curseg->sb_sum.nblocks;
+       if (NILFS_SEGBUF_IS_LAST(sci->sc_curseg, &sci->sc_segbufs))
+               return -E2BIG; /* The current segment is filled up
+                                 (internal code) */
+       sci->sc_curseg = NILFS_NEXT_SEGBUF(sci->sc_curseg);
+       return nilfs_segctor_reset_segment_buffer(sci);
+}
+
+static int nilfs_segctor_add_super_root(struct nilfs_sc_info *sci)
+{
+       struct nilfs_segment_buffer *segbuf = sci->sc_curseg;
+       int err;
+
+       if (segbuf->sb_sum.nblocks >= segbuf->sb_rest_blocks) {
+               err = nilfs_segctor_feed_segment(sci);
+               if (err)
+                       return err;
+               segbuf = sci->sc_curseg;
+       }
+       err = nilfs_segbuf_extend_payload(segbuf, &sci->sc_super_root);
+       if (likely(!err))
+               segbuf->sb_sum.flags |= NILFS_SS_SR;
+       return err;
+}
+
+/*
+ * Functions for making segment summary and payloads
+ */
+static int nilfs_segctor_segsum_block_required(
+       struct nilfs_sc_info *sci, const struct nilfs_segsum_pointer *ssp,
+       unsigned binfo_size)
+{
+       unsigned blocksize = sci->sc_super->s_blocksize;
+       /* Size of finfo and binfo is enough small against blocksize */
+
+       return ssp->offset + binfo_size +
+               (!sci->sc_blk_cnt ? sizeof(struct nilfs_finfo) : 0) >
+               blocksize;
+}
+
+static void nilfs_segctor_begin_finfo(struct nilfs_sc_info *sci,
+                                     struct inode *inode)
+{
+       sci->sc_curseg->sb_sum.nfinfo++;
+       sci->sc_binfo_ptr = sci->sc_finfo_ptr;
+       nilfs_segctor_map_segsum_entry(
+               sci, &sci->sc_binfo_ptr, sizeof(struct nilfs_finfo));
+
+       if (inode->i_sb && !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags))
+               set_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags);
+       /* skip finfo */
+}
+
+static void nilfs_segctor_end_finfo(struct nilfs_sc_info *sci,
+                                   struct inode *inode)
+{
+       struct nilfs_finfo *finfo;
+       struct nilfs_inode_info *ii;
+       struct nilfs_segment_buffer *segbuf;
+
+       if (sci->sc_blk_cnt == 0)
+               return;
+
+       ii = NILFS_I(inode);
+       finfo = nilfs_segctor_map_segsum_entry(sci, &sci->sc_finfo_ptr,
+                                                sizeof(*finfo));
+       finfo->fi_ino = cpu_to_le64(inode->i_ino);
+       finfo->fi_nblocks = cpu_to_le32(sci->sc_blk_cnt);
+       finfo->fi_ndatablk = cpu_to_le32(sci->sc_datablk_cnt);
+       finfo->fi_cno = cpu_to_le64(ii->i_cno);
+
+       segbuf = sci->sc_curseg;
+       segbuf->sb_sum.sumbytes = sci->sc_binfo_ptr.offset +
+               sci->sc_super->s_blocksize * (segbuf->sb_sum.nsumblk - 1);
+       sci->sc_finfo_ptr = sci->sc_binfo_ptr;
+       sci->sc_blk_cnt = sci->sc_datablk_cnt = 0;
+}
+
+static int nilfs_segctor_add_file_block(struct nilfs_sc_info *sci,
+                                       struct buffer_head *bh,
+                                       struct inode *inode,
+                                       unsigned binfo_size)
+{
+       struct nilfs_segment_buffer *segbuf;
+       int required, err = 0;
+
+ retry:
+       segbuf = sci->sc_curseg;
+       required = nilfs_segctor_segsum_block_required(
+               sci, &sci->sc_binfo_ptr, binfo_size);
+       if (segbuf->sb_sum.nblocks + required + 1 > segbuf->sb_rest_blocks) {
+               nilfs_segctor_end_finfo(sci, inode);
+               err = nilfs_segctor_feed_segment(sci);
+               if (err)
+                       return err;
+               goto retry;
+       }
+       if (unlikely(required)) {
+               err = nilfs_segbuf_extend_segsum(segbuf);
+               if (unlikely(err))
+                       goto failed;
+       }
+       if (sci->sc_blk_cnt == 0)
+               nilfs_segctor_begin_finfo(sci, inode);
+
+       nilfs_segctor_map_segsum_entry(sci, &sci->sc_binfo_ptr, binfo_size);
+       /* Substitution to vblocknr is delayed until update_blocknr() */
+       nilfs_segbuf_add_file_buffer(segbuf, bh);
+       sci->sc_blk_cnt++;
+ failed:
+       return err;
+}
+
+static int nilfs_handle_bmap_error(int err, const char *fname,
+                                  struct inode *inode, struct super_block *sb)
+{
+       if (err == -EINVAL) {
+               nilfs_error(sb, fname, "broken bmap (inode=%lu)\n",
+                           inode->i_ino);
+               err = -EIO;
+       }
+       return err;
+}
+
+/*
+ * Callback functions that enumerate, mark, and collect dirty blocks
+ */
+static int nilfs_collect_file_data(struct nilfs_sc_info *sci,
+                                  struct buffer_head *bh, struct inode *inode)
+{
+       int err;
+
+       err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh);
+       if (unlikely(err < 0))
+               return nilfs_handle_bmap_error(err, __func__, inode,
+                                              sci->sc_super);
+
+       err = nilfs_segctor_add_file_block(sci, bh, inode,
+                                          sizeof(struct nilfs_binfo_v));
+       if (!err)
+               sci->sc_datablk_cnt++;
+       return err;
+}
+
+static int nilfs_collect_file_node(struct nilfs_sc_info *sci,
+                                  struct buffer_head *bh,
+                                  struct inode *inode)
+{
+       int err;
+
+       err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh);
+       if (unlikely(err < 0))
+               return nilfs_handle_bmap_error(err, __func__, inode,
+                                              sci->sc_super);
+       return 0;
+}
+
+static int nilfs_collect_file_bmap(struct nilfs_sc_info *sci,
+                                  struct buffer_head *bh,
+                                  struct inode *inode)
+{
+       WARN_ON(!buffer_dirty(bh));
+       return nilfs_segctor_add_file_block(sci, bh, inode, sizeof(__le64));
+}
+
+static void nilfs_write_file_data_binfo(struct nilfs_sc_info *sci,
+                                       struct nilfs_segsum_pointer *ssp,
+                                       union nilfs_binfo *binfo)
+{
+       struct nilfs_binfo_v *binfo_v = nilfs_segctor_map_segsum_entry(
+               sci, ssp, sizeof(*binfo_v));
+       *binfo_v = binfo->bi_v;
+}
+
+static void nilfs_write_file_node_binfo(struct nilfs_sc_info *sci,
+                                       struct nilfs_segsum_pointer *ssp,
+                                       union nilfs_binfo *binfo)
+{
+       __le64 *vblocknr = nilfs_segctor_map_segsum_entry(
+               sci, ssp, sizeof(*vblocknr));
+       *vblocknr = binfo->bi_v.bi_vblocknr;
+}
+
+struct nilfs_sc_operations nilfs_sc_file_ops = {
+       .collect_data = nilfs_collect_file_data,
+       .collect_node = nilfs_collect_file_node,
+       .collect_bmap = nilfs_collect_file_bmap,
+       .write_data_binfo = nilfs_write_file_data_binfo,
+       .write_node_binfo = nilfs_write_file_node_binfo,
+};
+
+static int nilfs_collect_dat_data(struct nilfs_sc_info *sci,
+                                 struct buffer_head *bh, struct inode *inode)
+{
+       int err;
+
+       err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh);
+       if (unlikely(err < 0))
+               return nilfs_handle_bmap_error(err, __func__, inode,
+                                              sci->sc_super);
+
+       err = nilfs_segctor_add_file_block(sci, bh, inode, sizeof(__le64));
+       if (!err)
+               sci->sc_datablk_cnt++;
+       return err;
+}
+
+static int nilfs_collect_dat_bmap(struct nilfs_sc_info *sci,
+                                 struct buffer_head *bh, struct inode *inode)
+{
+       WARN_ON(!buffer_dirty(bh));
+       return nilfs_segctor_add_file_block(sci, bh, inode,
+                                           sizeof(struct nilfs_binfo_dat));
+}
+
+static void nilfs_write_dat_data_binfo(struct nilfs_sc_info *sci,
+                                      struct nilfs_segsum_pointer *ssp,
+                                      union nilfs_binfo *binfo)
+{
+       __le64 *blkoff = nilfs_segctor_map_segsum_entry(sci, ssp,
+                                                         sizeof(*blkoff));
+       *blkoff = binfo->bi_dat.bi_blkoff;
+}
+
+static void nilfs_write_dat_node_binfo(struct nilfs_sc_info *sci,
+                                      struct nilfs_segsum_pointer *ssp,
+                                      union nilfs_binfo *binfo)
+{
+       struct nilfs_binfo_dat *binfo_dat =
+               nilfs_segctor_map_segsum_entry(sci, ssp, sizeof(*binfo_dat));
+       *binfo_dat = binfo->bi_dat;
+}
+
+struct nilfs_sc_operations nilfs_sc_dat_ops = {
+       .collect_data = nilfs_collect_dat_data,
+       .collect_node = nilfs_collect_file_node,
+       .collect_bmap = nilfs_collect_dat_bmap,
+       .write_data_binfo = nilfs_write_dat_data_binfo,
+       .write_node_binfo = nilfs_write_dat_node_binfo,
+};
+
+struct nilfs_sc_operations nilfs_sc_dsync_ops = {
+       .collect_data = nilfs_collect_file_data,
+       .collect_node = NULL,
+       .collect_bmap = NULL,
+       .write_data_binfo = nilfs_write_file_data_binfo,
+       .write_node_binfo = NULL,
+};
+
+static size_t nilfs_lookup_dirty_data_buffers(struct inode *inode,
+                                             struct list_head *listp,
+                                             size_t nlimit,
+                                             loff_t start, loff_t end)
+{
+       struct address_space *mapping = inode->i_mapping;
+       struct pagevec pvec;
+       pgoff_t index = 0, last = ULONG_MAX;
+       size_t ndirties = 0;
+       int i;
+
+       if (unlikely(start != 0 || end != LLONG_MAX)) {
+               /*
+                * A valid range is given for sync-ing data pages. The
+                * range is rounded to per-page; extra dirty buffers
+                * may be included if blocksize < pagesize.
+                */
+               index = start >> PAGE_SHIFT;
+               last = end >> PAGE_SHIFT;
+       }
+       pagevec_init(&pvec, 0);
+ repeat:
+       if (unlikely(index > last) ||
+           !pagevec_lookup_tag(&pvec, mapping, &index, PAGECACHE_TAG_DIRTY,
+                               min_t(pgoff_t, last - index,
+                                     PAGEVEC_SIZE - 1) + 1))
+               return ndirties;
+
+       for (i = 0; i < pagevec_count(&pvec); i++) {
+               struct buffer_head *bh, *head;
+               struct page *page = pvec.pages[i];
+
+               if (unlikely(page->index > last))
+                       break;
+
+               if (mapping->host) {
+                       lock_page(page);
+                       if (!page_has_buffers(page))
+                               create_empty_buffers(page,
+                                                    1 << inode->i_blkbits, 0);
+                       unlock_page(page);
+               }
+
+               bh = head = page_buffers(page);
+               do {
+                       if (!buffer_dirty(bh))
+                               continue;
+                       get_bh(bh);
+                       list_add_tail(&bh->b_assoc_buffers, listp);
+                       ndirties++;
+                       if (unlikely(ndirties >= nlimit)) {
+                               pagevec_release(&pvec);
+                               cond_resched();
+                               return ndirties;
+                       }
+               } while (bh = bh->b_this_page, bh != head);
+       }
+       pagevec_release(&pvec);
+       cond_resched();
+       goto repeat;
+}
+
+static void nilfs_lookup_dirty_node_buffers(struct inode *inode,
+                                           struct list_head *listp)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+       struct address_space *mapping = &ii->i_btnode_cache;
+       struct pagevec pvec;
+       struct buffer_head *bh, *head;
+       unsigned int i;
+       pgoff_t index = 0;
+
+       pagevec_init(&pvec, 0);
+
+       while (pagevec_lookup_tag(&pvec, mapping, &index, PAGECACHE_TAG_DIRTY,
+                                 PAGEVEC_SIZE)) {
+               for (i = 0; i < pagevec_count(&pvec); i++) {
+                       bh = head = page_buffers(pvec.pages[i]);
+                       do {
+                               if (buffer_dirty(bh)) {
+                                       get_bh(bh);
+                                       list_add_tail(&bh->b_assoc_buffers,
+                                                     listp);
+                               }
+                               bh = bh->b_this_page;
+                       } while (bh != head);
+               }
+               pagevec_release(&pvec);
+               cond_resched();
+       }
+}
+
+static void nilfs_dispose_list(struct nilfs_sb_info *sbi,
+                              struct list_head *head, int force)
+{
+       struct nilfs_inode_info *ii, *n;
+       struct nilfs_inode_info *ivec[SC_N_INODEVEC], **pii;
+       unsigned nv = 0;
+
+       while (!list_empty(head)) {
+               spin_lock(&sbi->s_inode_lock);
+               list_for_each_entry_safe(ii, n, head, i_dirty) {
+                       list_del_init(&ii->i_dirty);
+                       if (force) {
+                               if (unlikely(ii->i_bh)) {
+                                       brelse(ii->i_bh);
+                                       ii->i_bh = NULL;
+                               }
+                       } else if (test_bit(NILFS_I_DIRTY, &ii->i_state)) {
+                               set_bit(NILFS_I_QUEUED, &ii->i_state);
+                               list_add_tail(&ii->i_dirty,
+                                             &sbi->s_dirty_files);
+                               continue;
+                       }
+                       ivec[nv++] = ii;
+                       if (nv == SC_N_INODEVEC)
+                               break;
+               }
+               spin_unlock(&sbi->s_inode_lock);
+
+               for (pii = ivec; nv > 0; pii++, nv--)
+                       iput(&(*pii)->vfs_inode);
+       }
+}
+
+static int nilfs_test_metadata_dirty(struct nilfs_sb_info *sbi)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       int ret = 0;
+
+       if (nilfs_mdt_fetch_dirty(sbi->s_ifile))
+               ret++;
+       if (nilfs_mdt_fetch_dirty(nilfs->ns_cpfile))
+               ret++;
+       if (nilfs_mdt_fetch_dirty(nilfs->ns_sufile))
+               ret++;
+       if (ret || nilfs_doing_gc())
+               if (nilfs_mdt_fetch_dirty(nilfs_dat_inode(nilfs)))
+                       ret++;
+       return ret;
+}
+
+static int nilfs_segctor_clean(struct nilfs_sc_info *sci)
+{
+       return list_empty(&sci->sc_dirty_files) &&
+               !test_bit(NILFS_SC_DIRTY, &sci->sc_flags) &&
+               list_empty(&sci->sc_cleaning_segments) &&
+               (!nilfs_doing_gc() || list_empty(&sci->sc_gc_inodes));
+}
+
+static int nilfs_segctor_confirm(struct nilfs_sc_info *sci)
+{
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       int ret = 0;
+
+       if (nilfs_test_metadata_dirty(sbi))
+               set_bit(NILFS_SC_DIRTY, &sci->sc_flags);
+
+       spin_lock(&sbi->s_inode_lock);
+       if (list_empty(&sbi->s_dirty_files) && nilfs_segctor_clean(sci))
+               ret++;
+
+       spin_unlock(&sbi->s_inode_lock);
+       return ret;
+}
+
+static void nilfs_segctor_clear_metadata_dirty(struct nilfs_sc_info *sci)
+{
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+
+       nilfs_mdt_clear_dirty(sbi->s_ifile);
+       nilfs_mdt_clear_dirty(nilfs->ns_cpfile);
+       nilfs_mdt_clear_dirty(nilfs->ns_sufile);
+       nilfs_mdt_clear_dirty(nilfs_dat_inode(nilfs));
+}
+
+static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci)
+{
+       struct the_nilfs *nilfs = sci->sc_sbi->s_nilfs;
+       struct buffer_head *bh_cp;
+       struct nilfs_checkpoint *raw_cp;
+       int err;
+
+       /* XXX: this interface will be changed */
+       err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, nilfs->ns_cno, 1,
+                                         &raw_cp, &bh_cp);
+       if (likely(!err)) {
+               /* The following code is duplicated with cpfile.  But, it is
+                  needed to collect the checkpoint even if it was not newly
+                  created */
+               nilfs_mdt_mark_buffer_dirty(bh_cp);
+               nilfs_mdt_mark_dirty(nilfs->ns_cpfile);
+               nilfs_cpfile_put_checkpoint(
+                       nilfs->ns_cpfile, nilfs->ns_cno, bh_cp);
+       } else
+               WARN_ON(err == -EINVAL || err == -ENOENT);
+
+       return err;
+}
+
+static int nilfs_segctor_fill_in_checkpoint(struct nilfs_sc_info *sci)
+{
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct buffer_head *bh_cp;
+       struct nilfs_checkpoint *raw_cp;
+       int err;
+
+       err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, nilfs->ns_cno, 0,
+                                         &raw_cp, &bh_cp);
+       if (unlikely(err)) {
+               WARN_ON(err == -EINVAL || err == -ENOENT);
+               goto failed_ibh;
+       }
+       raw_cp->cp_snapshot_list.ssl_next = 0;
+       raw_cp->cp_snapshot_list.ssl_prev = 0;
+       raw_cp->cp_inodes_count =
+               cpu_to_le64(atomic_read(&sbi->s_inodes_count));
+       raw_cp->cp_blocks_count =
+               cpu_to_le64(atomic_read(&sbi->s_blocks_count));
+       raw_cp->cp_nblk_inc =
+               cpu_to_le64(sci->sc_nblk_inc + sci->sc_nblk_this_inc);
+       raw_cp->cp_create = cpu_to_le64(sci->sc_seg_ctime);
+       raw_cp->cp_cno = cpu_to_le64(nilfs->ns_cno);
+
+       if (test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags))
+               nilfs_checkpoint_clear_minor(raw_cp);
+       else
+               nilfs_checkpoint_set_minor(raw_cp);
+
+       nilfs_write_inode_common(sbi->s_ifile, &raw_cp->cp_ifile_inode, 1);
+       nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, nilfs->ns_cno, bh_cp);
+       return 0;
+
+ failed_ibh:
+       return err;
+}
+
+static void nilfs_fill_in_file_bmap(struct inode *ifile,
+                                   struct nilfs_inode_info *ii)
+
+{
+       struct buffer_head *ibh;
+       struct nilfs_inode *raw_inode;
+
+       if (test_bit(NILFS_I_BMAP, &ii->i_state)) {
+               ibh = ii->i_bh;
+               BUG_ON(!ibh);
+               raw_inode = nilfs_ifile_map_inode(ifile, ii->vfs_inode.i_ino,
+                                                 ibh);
+               nilfs_bmap_write(ii->i_bmap, raw_inode);
+               nilfs_ifile_unmap_inode(ifile, ii->vfs_inode.i_ino, ibh);
+       }
+}
+
+static void nilfs_segctor_fill_in_file_bmap(struct nilfs_sc_info *sci,
+                                           struct inode *ifile)
+{
+       struct nilfs_inode_info *ii;
+
+       list_for_each_entry(ii, &sci->sc_dirty_files, i_dirty) {
+               nilfs_fill_in_file_bmap(ifile, ii);
+               set_bit(NILFS_I_COLLECTED, &ii->i_state);
+       }
+}
+
+/*
+ * CRC calculation routines
+ */
+static void nilfs_fill_in_super_root_crc(struct buffer_head *bh_sr, u32 seed)
+{
+       struct nilfs_super_root *raw_sr =
+               (struct nilfs_super_root *)bh_sr->b_data;
+       u32 crc;
+
+       crc = crc32_le(seed,
+                      (unsigned char *)raw_sr + sizeof(raw_sr->sr_sum),
+                      NILFS_SR_BYTES - sizeof(raw_sr->sr_sum));
+       raw_sr->sr_sum = cpu_to_le32(crc);
+}
+
+static void nilfs_segctor_fill_in_checksums(struct nilfs_sc_info *sci,
+                                           u32 seed)
+{
+       struct nilfs_segment_buffer *segbuf;
+
+       if (sci->sc_super_root)
+               nilfs_fill_in_super_root_crc(sci->sc_super_root, seed);
+
+       list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) {
+               nilfs_segbuf_fill_in_segsum_crc(segbuf, seed);
+               nilfs_segbuf_fill_in_data_crc(segbuf, seed);
+       }
+}
+
+static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci,
+                                            struct the_nilfs *nilfs)
+{
+       struct buffer_head *bh_sr = sci->sc_super_root;
+       struct nilfs_super_root *raw_sr =
+               (struct nilfs_super_root *)bh_sr->b_data;
+       unsigned isz = nilfs->ns_inode_size;
+
+       raw_sr->sr_bytes = cpu_to_le16(NILFS_SR_BYTES);
+       raw_sr->sr_nongc_ctime
+               = cpu_to_le64(nilfs_doing_gc() ?
+                             nilfs->ns_nongc_ctime : sci->sc_seg_ctime);
+       raw_sr->sr_flags = 0;
+
+       nilfs_mdt_write_inode_direct(
+               nilfs_dat_inode(nilfs), bh_sr, NILFS_SR_DAT_OFFSET(isz));
+       nilfs_mdt_write_inode_direct(
+               nilfs->ns_cpfile, bh_sr, NILFS_SR_CPFILE_OFFSET(isz));
+       nilfs_mdt_write_inode_direct(
+               nilfs->ns_sufile, bh_sr, NILFS_SR_SUFILE_OFFSET(isz));
+}
+
+static void nilfs_redirty_inodes(struct list_head *head)
+{
+       struct nilfs_inode_info *ii;
+
+       list_for_each_entry(ii, head, i_dirty) {
+               if (test_bit(NILFS_I_COLLECTED, &ii->i_state))
+                       clear_bit(NILFS_I_COLLECTED, &ii->i_state);
+       }
+}
+
+static void nilfs_drop_collected_inodes(struct list_head *head)
+{
+       struct nilfs_inode_info *ii;
+
+       list_for_each_entry(ii, head, i_dirty) {
+               if (!test_and_clear_bit(NILFS_I_COLLECTED, &ii->i_state))
+                       continue;
+
+               clear_bit(NILFS_I_INODE_DIRTY, &ii->i_state);
+               set_bit(NILFS_I_UPDATED, &ii->i_state);
+       }
+}
+
+static void nilfs_segctor_cancel_free_segments(struct nilfs_sc_info *sci,
+                                              struct inode *sufile)
+
+{
+       struct list_head *head = &sci->sc_cleaning_segments;
+       struct nilfs_segment_entry *ent;
+       int err;
+
+       list_for_each_entry(ent, head, list) {
+               if (!(ent->flags & NILFS_SLH_FREED))
+                       break;
+               err = nilfs_sufile_cancel_free(sufile, ent->segnum);
+               WARN_ON(err); /* do not happen */
+               ent->flags &= ~NILFS_SLH_FREED;
+       }
+}
+
+static int nilfs_segctor_prepare_free_segments(struct nilfs_sc_info *sci,
+                                              struct inode *sufile)
+{
+       struct list_head *head = &sci->sc_cleaning_segments;
+       struct nilfs_segment_entry *ent;
+       int err;
+
+       list_for_each_entry(ent, head, list) {
+               err = nilfs_sufile_free(sufile, ent->segnum);
+               if (unlikely(err))
+                       return err;
+               ent->flags |= NILFS_SLH_FREED;
+       }
+       return 0;
+}
+
+static void nilfs_segctor_commit_free_segments(struct nilfs_sc_info *sci)
+{
+       nilfs_dispose_segment_list(&sci->sc_cleaning_segments);
+}
+
+static int nilfs_segctor_apply_buffers(struct nilfs_sc_info *sci,
+                                      struct inode *inode,
+                                      struct list_head *listp,
+                                      int (*collect)(struct nilfs_sc_info *,
+                                                     struct buffer_head *,
+                                                     struct inode *))
+{
+       struct buffer_head *bh, *n;
+       int err = 0;
+
+       if (collect) {
+               list_for_each_entry_safe(bh, n, listp, b_assoc_buffers) {
+                       list_del_init(&bh->b_assoc_buffers);
+                       err = collect(sci, bh, inode);
+                       brelse(bh);
+                       if (unlikely(err))
+                               goto dispose_buffers;
+               }
+               return 0;
+       }
+
+ dispose_buffers:
+       while (!list_empty(listp)) {
+               bh = list_entry(listp->next, struct buffer_head,
+                               b_assoc_buffers);
+               list_del_init(&bh->b_assoc_buffers);
+               brelse(bh);
+       }
+       return err;
+}
+
+static size_t nilfs_segctor_buffer_rest(struct nilfs_sc_info *sci)
+{
+       /* Remaining number of blocks within segment buffer */
+       return sci->sc_segbuf_nblocks -
+               (sci->sc_nblk_this_inc + sci->sc_curseg->sb_sum.nblocks);
+}
+
+static int nilfs_segctor_scan_file(struct nilfs_sc_info *sci,
+                                  struct inode *inode,
+                                  struct nilfs_sc_operations *sc_ops)
+{
+       LIST_HEAD(data_buffers);
+       LIST_HEAD(node_buffers);
+       int err;
+
+       if (!(sci->sc_stage.flags & NILFS_CF_NODE)) {
+               size_t n, rest = nilfs_segctor_buffer_rest(sci);
+
+               n = nilfs_lookup_dirty_data_buffers(
+                       inode, &data_buffers, rest + 1, 0, LLONG_MAX);
+               if (n > rest) {
+                       err = nilfs_segctor_apply_buffers(
+                               sci, inode, &data_buffers,
+                               sc_ops->collect_data);
+                       BUG_ON(!err); /* always receive -E2BIG or true error */
+                       goto break_or_fail;
+               }
+       }
+       nilfs_lookup_dirty_node_buffers(inode, &node_buffers);
+
+       if (!(sci->sc_stage.flags & NILFS_CF_NODE)) {
+               err = nilfs_segctor_apply_buffers(
+                       sci, inode, &data_buffers, sc_ops->collect_data);
+               if (unlikely(err)) {
+                       /* dispose node list */
+                       nilfs_segctor_apply_buffers(
+                               sci, inode, &node_buffers, NULL);
+                       goto break_or_fail;
+               }
+               sci->sc_stage.flags |= NILFS_CF_NODE;
+       }
+       /* Collect node */
+       err = nilfs_segctor_apply_buffers(
+               sci, inode, &node_buffers, sc_ops->collect_node);
+       if (unlikely(err))
+               goto break_or_fail;
+
+       nilfs_bmap_lookup_dirty_buffers(NILFS_I(inode)->i_bmap, &node_buffers);
+       err = nilfs_segctor_apply_buffers(
+               sci, inode, &node_buffers, sc_ops->collect_bmap);
+       if (unlikely(err))
+               goto break_or_fail;
+
+       nilfs_segctor_end_finfo(sci, inode);
+       sci->sc_stage.flags &= ~NILFS_CF_NODE;
+
+ break_or_fail:
+       return err;
+}
+
+static int nilfs_segctor_scan_file_dsync(struct nilfs_sc_info *sci,
+                                        struct inode *inode)
+{
+       LIST_HEAD(data_buffers);
+       size_t n, rest = nilfs_segctor_buffer_rest(sci);
+       int err;
+
+       n = nilfs_lookup_dirty_data_buffers(inode, &data_buffers, rest + 1,
+                                           sci->sc_dsync_start,
+                                           sci->sc_dsync_end);
+
+       err = nilfs_segctor_apply_buffers(sci, inode, &data_buffers,
+                                         nilfs_collect_file_data);
+       if (!err) {
+               nilfs_segctor_end_finfo(sci, inode);
+               BUG_ON(n > rest);
+               /* always receive -E2BIG or true error if n > rest */
+       }
+       return err;
+}
+
+static int nilfs_segctor_collect_blocks(struct nilfs_sc_info *sci, int mode)
+{
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct list_head *head;
+       struct nilfs_inode_info *ii;
+       int err = 0;
+
+       switch (sci->sc_stage.scnt) {
+       case NILFS_ST_INIT:
+               /* Pre-processes */
+               sci->sc_stage.flags = 0;
+
+               if (!test_bit(NILFS_SC_UNCLOSED, &sci->sc_flags)) {
+                       sci->sc_nblk_inc = 0;
+                       sci->sc_curseg->sb_sum.flags = NILFS_SS_LOGBGN;
+                       if (mode == SC_LSEG_DSYNC) {
+                               sci->sc_stage.scnt = NILFS_ST_DSYNC;
+                               goto dsync_mode;
+                       }
+               }
+
+               sci->sc_stage.dirty_file_ptr = NULL;
+               sci->sc_stage.gc_inode_ptr = NULL;
+               if (mode == SC_FLUSH_DAT) {
+                       sci->sc_stage.scnt = NILFS_ST_DAT;
+                       goto dat_stage;
+               }
+               sci->sc_stage.scnt++;  /* Fall through */
+       case NILFS_ST_GC:
+               if (nilfs_doing_gc()) {
+                       head = &sci->sc_gc_inodes;
+                       ii = list_prepare_entry(sci->sc_stage.gc_inode_ptr,
+                                               head, i_dirty);
+                       list_for_each_entry_continue(ii, head, i_dirty) {
+                               err = nilfs_segctor_scan_file(
+                                       sci, &ii->vfs_inode,
+                                       &nilfs_sc_file_ops);
+                               if (unlikely(err)) {
+                                       sci->sc_stage.gc_inode_ptr = list_entry(
+                                               ii->i_dirty.prev,
+                                               struct nilfs_inode_info,
+                                               i_dirty);
+                                       goto break_or_fail;
+                               }
+                               set_bit(NILFS_I_COLLECTED, &ii->i_state);
+                       }
+                       sci->sc_stage.gc_inode_ptr = NULL;
+               }
+               sci->sc_stage.scnt++;  /* Fall through */
+       case NILFS_ST_FILE:
+               head = &sci->sc_dirty_files;
+               ii = list_prepare_entry(sci->sc_stage.dirty_file_ptr, head,
+                                       i_dirty);
+               list_for_each_entry_continue(ii, head, i_dirty) {
+                       clear_bit(NILFS_I_DIRTY, &ii->i_state);
+
+                       err = nilfs_segctor_scan_file(sci, &ii->vfs_inode,
+                                                     &nilfs_sc_file_ops);
+                       if (unlikely(err)) {
+                               sci->sc_stage.dirty_file_ptr =
+                                       list_entry(ii->i_dirty.prev,
+                                                  struct nilfs_inode_info,
+                                                  i_dirty);
+                               goto break_or_fail;
+                       }
+                       /* sci->sc_stage.dirty_file_ptr = NILFS_I(inode); */
+                       /* XXX: required ? */
+               }
+               sci->sc_stage.dirty_file_ptr = NULL;
+               if (mode == SC_FLUSH_FILE) {
+                       sci->sc_stage.scnt = NILFS_ST_DONE;
+                       return 0;
+               }
+               sci->sc_stage.scnt++;
+               sci->sc_stage.flags |= NILFS_CF_IFILE_STARTED;
+               /* Fall through */
+       case NILFS_ST_IFILE:
+               err = nilfs_segctor_scan_file(sci, sbi->s_ifile,
+                                             &nilfs_sc_file_ops);
+               if (unlikely(err))
+                       break;
+               sci->sc_stage.scnt++;
+               /* Creating a checkpoint */
+               err = nilfs_segctor_create_checkpoint(sci);
+               if (unlikely(err))
+                       break;
+               /* Fall through */
+       case NILFS_ST_CPFILE:
+               err = nilfs_segctor_scan_file(sci, nilfs->ns_cpfile,
+                                             &nilfs_sc_file_ops);
+               if (unlikely(err))
+                       break;
+               sci->sc_stage.scnt++;  /* Fall through */
+       case NILFS_ST_SUFILE:
+               err = nilfs_segctor_prepare_free_segments(sci,
+                                                         nilfs->ns_sufile);
+               if (unlikely(err))
+                       break;
+               err = nilfs_segctor_scan_file(sci, nilfs->ns_sufile,
+                                             &nilfs_sc_file_ops);
+               if (unlikely(err))
+                       break;
+               sci->sc_stage.scnt++;  /* Fall through */
+       case NILFS_ST_DAT:
+ dat_stage:
+               err = nilfs_segctor_scan_file(sci, nilfs_dat_inode(nilfs),
+                                             &nilfs_sc_dat_ops);
+               if (unlikely(err))
+                       break;
+               if (mode == SC_FLUSH_DAT) {
+                       sci->sc_stage.scnt = NILFS_ST_DONE;
+                       return 0;
+               }
+               sci->sc_stage.scnt++;  /* Fall through */
+       case NILFS_ST_SR:
+               if (mode == SC_LSEG_SR) {
+                       /* Appending a super root */
+                       err = nilfs_segctor_add_super_root(sci);
+                       if (unlikely(err))
+                               break;
+               }
+               /* End of a logical segment */
+               sci->sc_curseg->sb_sum.flags |= NILFS_SS_LOGEND;
+               sci->sc_stage.scnt = NILFS_ST_DONE;
+               return 0;
+       case NILFS_ST_DSYNC:
+ dsync_mode:
+               sci->sc_curseg->sb_sum.flags |= NILFS_SS_SYNDT;
+               ii = sci->sc_dsync_inode;
+               if (!test_bit(NILFS_I_BUSY, &ii->i_state))
+                       break;
+
+               err = nilfs_segctor_scan_file_dsync(sci, &ii->vfs_inode);
+               if (unlikely(err))
+                       break;
+               sci->sc_curseg->sb_sum.flags |= NILFS_SS_LOGEND;
+               sci->sc_stage.scnt = NILFS_ST_DONE;
+               return 0;
+       case NILFS_ST_DONE:
+               return 0;
+       default:
+               BUG();
+       }
+
+ break_or_fail:
+       return err;
+}
+
+static int nilfs_touch_segusage(struct inode *sufile, __u64 segnum)
+{
+       struct buffer_head *bh_su;
+       struct nilfs_segment_usage *raw_su;
+       int err;
+
+       err = nilfs_sufile_get_segment_usage(sufile, segnum, &raw_su, &bh_su);
+       if (unlikely(err))
+               return err;
+       nilfs_mdt_mark_buffer_dirty(bh_su);
+       nilfs_mdt_mark_dirty(sufile);
+       nilfs_sufile_put_segment_usage(sufile, segnum, bh_su);
+       return 0;
+}
+
+static int nilfs_segctor_begin_construction(struct nilfs_sc_info *sci,
+                                           struct the_nilfs *nilfs)
+{
+       struct nilfs_segment_buffer *segbuf, *n;
+       __u64 nextnum;
+       int err;
+
+       if (list_empty(&sci->sc_segbufs)) {
+               segbuf = nilfs_segbuf_new(sci->sc_super);
+               if (unlikely(!segbuf))
+                       return -ENOMEM;
+               list_add(&segbuf->sb_list, &sci->sc_segbufs);
+       } else
+               segbuf = NILFS_FIRST_SEGBUF(&sci->sc_segbufs);
+
+       nilfs_segbuf_map(segbuf, nilfs->ns_segnum, nilfs->ns_pseg_offset,
+                        nilfs);
+
+       if (segbuf->sb_rest_blocks < NILFS_PSEG_MIN_BLOCKS) {
+               nilfs_shift_to_next_segment(nilfs);
+               nilfs_segbuf_map(segbuf, nilfs->ns_segnum, 0, nilfs);
+       }
+       sci->sc_segbuf_nblocks = segbuf->sb_rest_blocks;
+
+       err = nilfs_touch_segusage(nilfs->ns_sufile, segbuf->sb_segnum);
+       if (unlikely(err))
+               return err;
+
+       if (nilfs->ns_segnum == nilfs->ns_nextnum) {
+               /* Start from the head of a new full segment */
+               err = nilfs_sufile_alloc(nilfs->ns_sufile, &nextnum);
+               if (unlikely(err))
+                       return err;
+       } else
+               nextnum = nilfs->ns_nextnum;
+
+       segbuf->sb_sum.seg_seq = nilfs->ns_seg_seq;
+       nilfs_segbuf_set_next_segnum(segbuf, nextnum, nilfs);
+
+       /* truncating segment buffers */
+       list_for_each_entry_safe_continue(segbuf, n, &sci->sc_segbufs,
+                                         sb_list) {
+               list_del_init(&segbuf->sb_list);
+               nilfs_segbuf_free(segbuf);
+       }
+       return 0;
+}
+
+static int nilfs_segctor_extend_segments(struct nilfs_sc_info *sci,
+                                        struct the_nilfs *nilfs, int nadd)
+{
+       struct nilfs_segment_buffer *segbuf, *prev, *n;
+       struct inode *sufile = nilfs->ns_sufile;
+       __u64 nextnextnum;
+       LIST_HEAD(list);
+       int err, ret, i;
+
+       prev = NILFS_LAST_SEGBUF(&sci->sc_segbufs);
+       /*
+        * Since the segment specified with nextnum might be allocated during
+        * the previous construction, the buffer including its segusage may
+        * not be dirty.  The following call ensures that the buffer is dirty
+        * and will pin the buffer on memory until the sufile is written.
+        */
+       err = nilfs_touch_segusage(sufile, prev->sb_nextnum);
+       if (unlikely(err))
+               return err;
+
+       for (i = 0; i < nadd; i++) {
+               /* extend segment info */
+               err = -ENOMEM;
+               segbuf = nilfs_segbuf_new(sci->sc_super);
+               if (unlikely(!segbuf))
+                       goto failed;
+
+               /* map this buffer to region of segment on-disk */
+               nilfs_segbuf_map(segbuf, prev->sb_nextnum, 0, nilfs);
+               sci->sc_segbuf_nblocks += segbuf->sb_rest_blocks;
+
+               /* allocate the next next full segment */
+               err = nilfs_sufile_alloc(sufile, &nextnextnum);
+               if (unlikely(err))
+                       goto failed_segbuf;
+
+               segbuf->sb_sum.seg_seq = prev->sb_sum.seg_seq + 1;
+               nilfs_segbuf_set_next_segnum(segbuf, nextnextnum, nilfs);
+
+               list_add_tail(&segbuf->sb_list, &list);
+               prev = segbuf;
+       }
+       list_splice(&list, sci->sc_segbufs.prev);
+       return 0;
+
+ failed_segbuf:
+       nilfs_segbuf_free(segbuf);
+ failed:
+       list_for_each_entry_safe(segbuf, n, &list, sb_list) {
+               ret = nilfs_sufile_free(sufile, segbuf->sb_nextnum);
+               WARN_ON(ret); /* never fails */
+               list_del_init(&segbuf->sb_list);
+               nilfs_segbuf_free(segbuf);
+       }
+       return err;
+}
+
+static void nilfs_segctor_free_incomplete_segments(struct nilfs_sc_info *sci,
+                                                  struct the_nilfs *nilfs)
+{
+       struct nilfs_segment_buffer *segbuf;
+       int ret, done = 0;
+
+       segbuf = NILFS_FIRST_SEGBUF(&sci->sc_segbufs);
+       if (nilfs->ns_nextnum != segbuf->sb_nextnum) {
+               ret = nilfs_sufile_free(nilfs->ns_sufile, segbuf->sb_nextnum);
+               WARN_ON(ret); /* never fails */
+       }
+       if (segbuf->sb_io_error) {
+               /* Case 1: The first segment failed */
+               if (segbuf->sb_pseg_start != segbuf->sb_fseg_start)
+                       /* Case 1a:  Partial segment appended into an existing
+                          segment */
+                       nilfs_terminate_segment(nilfs, segbuf->sb_fseg_start,
+                                               segbuf->sb_fseg_end);
+               else /* Case 1b:  New full segment */
+                       set_nilfs_discontinued(nilfs);
+               done++;
+       }
+
+       list_for_each_entry_continue(segbuf, &sci->sc_segbufs, sb_list) {
+               ret = nilfs_sufile_free(nilfs->ns_sufile, segbuf->sb_nextnum);
+               WARN_ON(ret); /* never fails */
+               if (!done && segbuf->sb_io_error) {
+                       if (segbuf->sb_segnum != nilfs->ns_nextnum)
+                               /* Case 2: extended segment (!= next) failed */
+                               nilfs_sufile_set_error(nilfs->ns_sufile,
+                                                      segbuf->sb_segnum);
+                       done++;
+               }
+       }
+}
+
+static void nilfs_segctor_clear_segment_buffers(struct nilfs_sc_info *sci)
+{
+       struct nilfs_segment_buffer *segbuf;
+
+       list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list)
+               nilfs_segbuf_clear(segbuf);
+       sci->sc_super_root = NULL;
+}
+
+static void nilfs_segctor_destroy_segment_buffers(struct nilfs_sc_info *sci)
+{
+       struct nilfs_segment_buffer *segbuf;
+
+       while (!list_empty(&sci->sc_segbufs)) {
+               segbuf = NILFS_FIRST_SEGBUF(&sci->sc_segbufs);
+               list_del_init(&segbuf->sb_list);
+               nilfs_segbuf_free(segbuf);
+       }
+       /* sci->sc_curseg = NULL; */
+}
+
+static void nilfs_segctor_end_construction(struct nilfs_sc_info *sci,
+                                          struct the_nilfs *nilfs, int err)
+{
+       if (unlikely(err)) {
+               nilfs_segctor_free_incomplete_segments(sci, nilfs);
+               nilfs_segctor_cancel_free_segments(sci, nilfs->ns_sufile);
+       }
+       nilfs_segctor_clear_segment_buffers(sci);
+}
+
+static void nilfs_segctor_update_segusage(struct nilfs_sc_info *sci,
+                                         struct inode *sufile)
+{
+       struct nilfs_segment_buffer *segbuf;
+       struct buffer_head *bh_su;
+       struct nilfs_segment_usage *raw_su;
+       unsigned long live_blocks;
+       int ret;
+
+       list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) {
+               ret = nilfs_sufile_get_segment_usage(sufile, segbuf->sb_segnum,
+                                                    &raw_su, &bh_su);
+               WARN_ON(ret); /* always succeed because bh_su is dirty */
+               live_blocks = segbuf->sb_sum.nblocks +
+                       (segbuf->sb_pseg_start - segbuf->sb_fseg_start);
+               raw_su->su_lastmod = cpu_to_le64(sci->sc_seg_ctime);
+               raw_su->su_nblocks = cpu_to_le32(live_blocks);
+               nilfs_sufile_put_segment_usage(sufile, segbuf->sb_segnum,
+                                              bh_su);
+       }
+}
+
+static void nilfs_segctor_cancel_segusage(struct nilfs_sc_info *sci,
+                                         struct inode *sufile)
+{
+       struct nilfs_segment_buffer *segbuf;
+       struct buffer_head *bh_su;
+       struct nilfs_segment_usage *raw_su;
+       int ret;
+
+       segbuf = NILFS_FIRST_SEGBUF(&sci->sc_segbufs);
+       ret = nilfs_sufile_get_segment_usage(sufile, segbuf->sb_segnum,
+                                            &raw_su, &bh_su);
+       WARN_ON(ret); /* always succeed because bh_su is dirty */
+       raw_su->su_nblocks = cpu_to_le32(segbuf->sb_pseg_start -
+                                        segbuf->sb_fseg_start);
+       nilfs_sufile_put_segment_usage(sufile, segbuf->sb_segnum, bh_su);
+
+       list_for_each_entry_continue(segbuf, &sci->sc_segbufs, sb_list) {
+               ret = nilfs_sufile_get_segment_usage(sufile, segbuf->sb_segnum,
+                                                    &raw_su, &bh_su);
+               WARN_ON(ret); /* always succeed */
+               raw_su->su_nblocks = 0;
+               nilfs_sufile_put_segment_usage(sufile, segbuf->sb_segnum,
+                                              bh_su);
+       }
+}
+
+static void nilfs_segctor_truncate_segments(struct nilfs_sc_info *sci,
+                                           struct nilfs_segment_buffer *last,
+                                           struct inode *sufile)
+{
+       struct nilfs_segment_buffer *segbuf = last, *n;
+       int ret;
+
+       list_for_each_entry_safe_continue(segbuf, n, &sci->sc_segbufs,
+                                         sb_list) {
+               list_del_init(&segbuf->sb_list);
+               sci->sc_segbuf_nblocks -= segbuf->sb_rest_blocks;
+               ret = nilfs_sufile_free(sufile, segbuf->sb_nextnum);
+               WARN_ON(ret);
+               nilfs_segbuf_free(segbuf);
+       }
+}
+
+
+static int nilfs_segctor_collect(struct nilfs_sc_info *sci,
+                                struct the_nilfs *nilfs, int mode)
+{
+       struct nilfs_cstage prev_stage = sci->sc_stage;
+       int err, nadd = 1;
+
+       /* Collection retry loop */
+       for (;;) {
+               sci->sc_super_root = NULL;
+               sci->sc_nblk_this_inc = 0;
+               sci->sc_curseg = NILFS_FIRST_SEGBUF(&sci->sc_segbufs);
+
+               err = nilfs_segctor_reset_segment_buffer(sci);
+               if (unlikely(err))
+                       goto failed;
+
+               err = nilfs_segctor_collect_blocks(sci, mode);
+               sci->sc_nblk_this_inc += sci->sc_curseg->sb_sum.nblocks;
+               if (!err)
+                       break;
+
+               if (unlikely(err != -E2BIG))
+                       goto failed;
+
+               /* The current segment is filled up */
+               if (mode != SC_LSEG_SR || sci->sc_stage.scnt < NILFS_ST_CPFILE)
+                       break;
+
+               nilfs_segctor_cancel_free_segments(sci, nilfs->ns_sufile);
+               nilfs_segctor_clear_segment_buffers(sci);
+
+               err = nilfs_segctor_extend_segments(sci, nilfs, nadd);
+               if (unlikely(err))
+                       return err;
+
+               nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA);
+               sci->sc_stage = prev_stage;
+       }
+       nilfs_segctor_truncate_segments(sci, sci->sc_curseg, nilfs->ns_sufile);
+       return 0;
+
+ failed:
+       return err;
+}
+
+static void nilfs_list_replace_buffer(struct buffer_head *old_bh,
+                                     struct buffer_head *new_bh)
+{
+       BUG_ON(!list_empty(&new_bh->b_assoc_buffers));
+
+       list_replace_init(&old_bh->b_assoc_buffers, &new_bh->b_assoc_buffers);
+       /* The caller must release old_bh */
+}
+
+static int
+nilfs_segctor_update_payload_blocknr(struct nilfs_sc_info *sci,
+                                    struct nilfs_segment_buffer *segbuf,
+                                    int mode)
+{
+       struct inode *inode = NULL;
+       sector_t blocknr;
+       unsigned long nfinfo = segbuf->sb_sum.nfinfo;
+       unsigned long nblocks = 0, ndatablk = 0;
+       struct nilfs_sc_operations *sc_op = NULL;
+       struct nilfs_segsum_pointer ssp;
+       struct nilfs_finfo *finfo = NULL;
+       union nilfs_binfo binfo;
+       struct buffer_head *bh, *bh_org;
+       ino_t ino = 0;
+       int err = 0;
+
+       if (!nfinfo)
+               goto out;
+
+       blocknr = segbuf->sb_pseg_start + segbuf->sb_sum.nsumblk;
+       ssp.bh = NILFS_SEGBUF_FIRST_BH(&segbuf->sb_segsum_buffers);
+       ssp.offset = sizeof(struct nilfs_segment_summary);
+
+       list_for_each_entry(bh, &segbuf->sb_payload_buffers, b_assoc_buffers) {
+               if (bh == sci->sc_super_root)
+                       break;
+               if (!finfo) {
+                       finfo = nilfs_segctor_map_segsum_entry(
+                               sci, &ssp, sizeof(*finfo));
+                       ino = le64_to_cpu(finfo->fi_ino);
+                       nblocks = le32_to_cpu(finfo->fi_nblocks);
+                       ndatablk = le32_to_cpu(finfo->fi_ndatablk);
+
+                       if (buffer_nilfs_node(bh))
+                               inode = NILFS_BTNC_I(bh->b_page->mapping);
+                       else
+                               inode = NILFS_AS_I(bh->b_page->mapping);
+
+                       if (mode == SC_LSEG_DSYNC)
+                               sc_op = &nilfs_sc_dsync_ops;
+                       else if (ino == NILFS_DAT_INO)
+                               sc_op = &nilfs_sc_dat_ops;
+                       else /* file blocks */
+                               sc_op = &nilfs_sc_file_ops;
+               }
+               bh_org = bh;
+               get_bh(bh_org);
+               err = nilfs_bmap_assign(NILFS_I(inode)->i_bmap, &bh, blocknr,
+                                       &binfo);
+               if (bh != bh_org)
+                       nilfs_list_replace_buffer(bh_org, bh);
+               brelse(bh_org);
+               if (unlikely(err))
+                       goto failed_bmap;
+
+               if (ndatablk > 0)
+                       sc_op->write_data_binfo(sci, &ssp, &binfo);
+               else
+                       sc_op->write_node_binfo(sci, &ssp, &binfo);
+
+               blocknr++;
+               if (--nblocks == 0) {
+                       finfo = NULL;
+                       if (--nfinfo == 0)
+                               break;
+               } else if (ndatablk > 0)
+                       ndatablk--;
+       }
+ out:
+       return 0;
+
+ failed_bmap:
+       err = nilfs_handle_bmap_error(err, __func__, inode, sci->sc_super);
+       return err;
+}
+
+static int nilfs_segctor_assign(struct nilfs_sc_info *sci, int mode)
+{
+       struct nilfs_segment_buffer *segbuf;
+       int err;
+
+       list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) {
+               err = nilfs_segctor_update_payload_blocknr(sci, segbuf, mode);
+               if (unlikely(err))
+                       return err;
+               nilfs_segbuf_fill_in_segsum(segbuf);
+       }
+       return 0;
+}
+
+static int
+nilfs_copy_replace_page_buffers(struct page *page, struct list_head *out)
+{
+       struct page *clone_page;
+       struct buffer_head *bh, *head, *bh2;
+       void *kaddr;
+
+       bh = head = page_buffers(page);
+
+       clone_page = nilfs_alloc_private_page(bh->b_bdev, bh->b_size, 0);
+       if (unlikely(!clone_page))
+               return -ENOMEM;
+
+       bh2 = page_buffers(clone_page);
+       kaddr = kmap_atomic(page, KM_USER0);
+       do {
+               if (list_empty(&bh->b_assoc_buffers))
+                       continue;
+               get_bh(bh2);
+               page_cache_get(clone_page); /* for each bh */
+               memcpy(bh2->b_data, kaddr + bh_offset(bh), bh2->b_size);
+               bh2->b_blocknr = bh->b_blocknr;
+               list_replace(&bh->b_assoc_buffers, &bh2->b_assoc_buffers);
+               list_add_tail(&bh->b_assoc_buffers, out);
+       } while (bh = bh->b_this_page, bh2 = bh2->b_this_page, bh != head);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       if (!TestSetPageWriteback(clone_page))
+               inc_zone_page_state(clone_page, NR_WRITEBACK);
+       unlock_page(clone_page);
+
+       return 0;
+}
+
+static int nilfs_test_page_to_be_frozen(struct page *page)
+{
+       struct address_space *mapping = page->mapping;
+
+       if (!mapping || !mapping->host || S_ISDIR(mapping->host->i_mode))
+               return 0;
+
+       if (page_mapped(page)) {
+               ClearPageChecked(page);
+               return 1;
+       }
+       return PageChecked(page);
+}
+
+static int nilfs_begin_page_io(struct page *page, struct list_head *out)
+{
+       if (!page || PageWriteback(page))
+               /* For split b-tree node pages, this function may be called
+                  twice.  We ignore the 2nd or later calls by this check. */
+               return 0;
+
+       lock_page(page);
+       clear_page_dirty_for_io(page);
+       set_page_writeback(page);
+       unlock_page(page);
+
+       if (nilfs_test_page_to_be_frozen(page)) {
+               int err = nilfs_copy_replace_page_buffers(page, out);
+               if (unlikely(err))
+                       return err;
+       }
+       return 0;
+}
+
+static int nilfs_segctor_prepare_write(struct nilfs_sc_info *sci,
+                                      struct page **failed_page)
+{
+       struct nilfs_segment_buffer *segbuf;
+       struct page *bd_page = NULL, *fs_page = NULL;
+       struct list_head *list = &sci->sc_copied_buffers;
+       int err;
+
+       *failed_page = NULL;
+       list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) {
+               struct buffer_head *bh;
+
+               list_for_each_entry(bh, &segbuf->sb_segsum_buffers,
+                                   b_assoc_buffers) {
+                       if (bh->b_page != bd_page) {
+                               if (bd_page) {
+                                       lock_page(bd_page);
+                                       clear_page_dirty_for_io(bd_page);
+                                       set_page_writeback(bd_page);
+                                       unlock_page(bd_page);
+                               }
+                               bd_page = bh->b_page;
+                       }
+               }
+
+               list_for_each_entry(bh, &segbuf->sb_payload_buffers,
+                                   b_assoc_buffers) {
+                       if (bh == sci->sc_super_root) {
+                               if (bh->b_page != bd_page) {
+                                       lock_page(bd_page);
+                                       clear_page_dirty_for_io(bd_page);
+                                       set_page_writeback(bd_page);
+                                       unlock_page(bd_page);
+                                       bd_page = bh->b_page;
+                               }
+                               break;
+                       }
+                       if (bh->b_page != fs_page) {
+                               err = nilfs_begin_page_io(fs_page, list);
+                               if (unlikely(err)) {
+                                       *failed_page = fs_page;
+                                       goto out;
+                               }
+                               fs_page = bh->b_page;
+                       }
+               }
+       }
+       if (bd_page) {
+               lock_page(bd_page);
+               clear_page_dirty_for_io(bd_page);
+               set_page_writeback(bd_page);
+               unlock_page(bd_page);
+       }
+       err = nilfs_begin_page_io(fs_page, list);
+       if (unlikely(err))
+               *failed_page = fs_page;
+ out:
+       return err;
+}
+
+static int nilfs_segctor_write(struct nilfs_sc_info *sci,
+                              struct backing_dev_info *bdi)
+{
+       struct nilfs_segment_buffer *segbuf;
+       struct nilfs_write_info wi;
+       int err, res;
+
+       wi.sb = sci->sc_super;
+       wi.bh_sr = sci->sc_super_root;
+       wi.bdi = bdi;
+
+       list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) {
+               nilfs_segbuf_prepare_write(segbuf, &wi);
+               err = nilfs_segbuf_write(segbuf, &wi);
+
+               res = nilfs_segbuf_wait(segbuf, &wi);
+               err = unlikely(err) ? : res;
+               if (unlikely(err))
+                       return err;
+       }
+       return 0;
+}
+
+static int nilfs_page_has_uncleared_buffer(struct page *page)
+{
+       struct buffer_head *head, *bh;
+
+       head = bh = page_buffers(page);
+       do {
+               if (buffer_dirty(bh) && !list_empty(&bh->b_assoc_buffers))
+                       return 1;
+               bh = bh->b_this_page;
+       } while (bh != head);
+       return 0;
+}
+
+static void __nilfs_end_page_io(struct page *page, int err)
+{
+       if (!err) {
+               if (!nilfs_page_buffers_clean(page))
+                       __set_page_dirty_nobuffers(page);
+               ClearPageError(page);
+       } else {
+               __set_page_dirty_nobuffers(page);
+               SetPageError(page);
+       }
+
+       if (buffer_nilfs_allocated(page_buffers(page))) {
+               if (TestClearPageWriteback(page))
+                       dec_zone_page_state(page, NR_WRITEBACK);
+       } else
+               end_page_writeback(page);
+}
+
+static void nilfs_end_page_io(struct page *page, int err)
+{
+       if (!page)
+               return;
+
+       if (buffer_nilfs_node(page_buffers(page)) &&
+           nilfs_page_has_uncleared_buffer(page))
+               /* For b-tree node pages, this function may be called twice
+                  or more because they might be split in a segment.
+                  This check assures that cleanup has been done for all
+                  buffers in a split btnode page. */
+               return;
+
+       __nilfs_end_page_io(page, err);
+}
+
+static void nilfs_clear_copied_buffers(struct list_head *list, int err)
+{
+       struct buffer_head *bh, *head;
+       struct page *page;
+
+       while (!list_empty(list)) {
+               bh = list_entry(list->next, struct buffer_head,
+                               b_assoc_buffers);
+               page = bh->b_page;
+               page_cache_get(page);
+               head = bh = page_buffers(page);
+               do {
+                       if (!list_empty(&bh->b_assoc_buffers)) {
+                               list_del_init(&bh->b_assoc_buffers);
+                               if (!err) {
+                                       set_buffer_uptodate(bh);
+                                       clear_buffer_dirty(bh);
+                                       clear_buffer_nilfs_volatile(bh);
+                               }
+                               brelse(bh); /* for b_assoc_buffers */
+                       }
+               } while ((bh = bh->b_this_page) != head);
+
+               __nilfs_end_page_io(page, err);
+               page_cache_release(page);
+       }
+}
+
+static void nilfs_segctor_abort_write(struct nilfs_sc_info *sci,
+                                     struct page *failed_page, int err)
+{
+       struct nilfs_segment_buffer *segbuf;
+       struct page *bd_page = NULL, *fs_page = NULL;
+
+       list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) {
+               struct buffer_head *bh;
+
+               list_for_each_entry(bh, &segbuf->sb_segsum_buffers,
+                                   b_assoc_buffers) {
+                       if (bh->b_page != bd_page) {
+                               if (bd_page)
+                                       end_page_writeback(bd_page);
+                               bd_page = bh->b_page;
+                       }
+               }
+
+               list_for_each_entry(bh, &segbuf->sb_payload_buffers,
+                                   b_assoc_buffers) {
+                       if (bh == sci->sc_super_root) {
+                               if (bh->b_page != bd_page) {
+                                       end_page_writeback(bd_page);
+                                       bd_page = bh->b_page;
+                               }
+                               break;
+                       }
+                       if (bh->b_page != fs_page) {
+                               nilfs_end_page_io(fs_page, err);
+                               if (unlikely(fs_page == failed_page))
+                                       goto done;
+                               fs_page = bh->b_page;
+                       }
+               }
+       }
+       if (bd_page)
+               end_page_writeback(bd_page);
+
+       nilfs_end_page_io(fs_page, err);
+ done:
+       nilfs_clear_copied_buffers(&sci->sc_copied_buffers, err);
+}
+
+static void nilfs_set_next_segment(struct the_nilfs *nilfs,
+                                  struct nilfs_segment_buffer *segbuf)
+{
+       nilfs->ns_segnum = segbuf->sb_segnum;
+       nilfs->ns_nextnum = segbuf->sb_nextnum;
+       nilfs->ns_pseg_offset = segbuf->sb_pseg_start - segbuf->sb_fseg_start
+               + segbuf->sb_sum.nblocks;
+       nilfs->ns_seg_seq = segbuf->sb_sum.seg_seq;
+       nilfs->ns_ctime = segbuf->sb_sum.ctime;
+}
+
+static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci)
+{
+       struct nilfs_segment_buffer *segbuf;
+       struct page *bd_page = NULL, *fs_page = NULL;
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       int update_sr = (sci->sc_super_root != NULL);
+
+       list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) {
+               struct buffer_head *bh;
+
+               list_for_each_entry(bh, &segbuf->sb_segsum_buffers,
+                                   b_assoc_buffers) {
+                       set_buffer_uptodate(bh);
+                       clear_buffer_dirty(bh);
+                       if (bh->b_page != bd_page) {
+                               if (bd_page)
+                                       end_page_writeback(bd_page);
+                               bd_page = bh->b_page;
+                       }
+               }
+               /*
+                * We assume that the buffers which belong to the same page
+                * continue over the buffer list.
+                * Under this assumption, the last BHs of pages is
+                * identifiable by the discontinuity of bh->b_page
+                * (page != fs_page).
+                *
+                * For B-tree node blocks, however, this assumption is not
+                * guaranteed.  The cleanup code of B-tree node pages needs
+                * special care.
+                */
+               list_for_each_entry(bh, &segbuf->sb_payload_buffers,
+                                   b_assoc_buffers) {
+                       set_buffer_uptodate(bh);
+                       clear_buffer_dirty(bh);
+                       clear_buffer_nilfs_volatile(bh);
+                       if (bh == sci->sc_super_root) {
+                               if (bh->b_page != bd_page) {
+                                       end_page_writeback(bd_page);
+                                       bd_page = bh->b_page;
+                               }
+                               break;
+                       }
+                       if (bh->b_page != fs_page) {
+                               nilfs_end_page_io(fs_page, 0);
+                               fs_page = bh->b_page;
+                       }
+               }
+
+               if (!NILFS_SEG_SIMPLEX(&segbuf->sb_sum)) {
+                       if (NILFS_SEG_LOGBGN(&segbuf->sb_sum)) {
+                               set_bit(NILFS_SC_UNCLOSED, &sci->sc_flags);
+                               sci->sc_lseg_stime = jiffies;
+                       }
+                       if (NILFS_SEG_LOGEND(&segbuf->sb_sum))
+                               clear_bit(NILFS_SC_UNCLOSED, &sci->sc_flags);
+               }
+       }
+       /*
+        * Since pages may continue over multiple segment buffers,
+        * end of the last page must be checked outside of the loop.
+        */
+       if (bd_page)
+               end_page_writeback(bd_page);
+
+       nilfs_end_page_io(fs_page, 0);
+
+       nilfs_clear_copied_buffers(&sci->sc_copied_buffers, 0);
+
+       nilfs_drop_collected_inodes(&sci->sc_dirty_files);
+
+       if (nilfs_doing_gc()) {
+               nilfs_drop_collected_inodes(&sci->sc_gc_inodes);
+               if (update_sr)
+                       nilfs_commit_gcdat_inode(nilfs);
+       } else
+               nilfs->ns_nongc_ctime = sci->sc_seg_ctime;
+
+       sci->sc_nblk_inc += sci->sc_nblk_this_inc;
+
+       segbuf = NILFS_LAST_SEGBUF(&sci->sc_segbufs);
+       nilfs_set_next_segment(nilfs, segbuf);
+
+       if (update_sr) {
+               nilfs_set_last_segment(nilfs, segbuf->sb_pseg_start,
+                                      segbuf->sb_sum.seg_seq, nilfs->ns_cno++);
+               sbi->s_super->s_dirt = 1;
+
+               clear_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags);
+               clear_bit(NILFS_SC_DIRTY, &sci->sc_flags);
+               set_bit(NILFS_SC_SUPER_ROOT, &sci->sc_flags);
+       } else
+               clear_bit(NILFS_SC_SUPER_ROOT, &sci->sc_flags);
+}
+
+static int nilfs_segctor_check_in_files(struct nilfs_sc_info *sci,
+                                       struct nilfs_sb_info *sbi)
+{
+       struct nilfs_inode_info *ii, *n;
+       __u64 cno = sbi->s_nilfs->ns_cno;
+
+       spin_lock(&sbi->s_inode_lock);
+ retry:
+       list_for_each_entry_safe(ii, n, &sbi->s_dirty_files, i_dirty) {
+               if (!ii->i_bh) {
+                       struct buffer_head *ibh;
+                       int err;
+
+                       spin_unlock(&sbi->s_inode_lock);
+                       err = nilfs_ifile_get_inode_block(
+                               sbi->s_ifile, ii->vfs_inode.i_ino, &ibh);
+                       if (unlikely(err)) {
+                               nilfs_warning(sbi->s_super, __func__,
+                                             "failed to get inode block.\n");
+                               return err;
+                       }
+                       nilfs_mdt_mark_buffer_dirty(ibh);
+                       nilfs_mdt_mark_dirty(sbi->s_ifile);
+                       spin_lock(&sbi->s_inode_lock);
+                       if (likely(!ii->i_bh))
+                               ii->i_bh = ibh;
+                       else
+                               brelse(ibh);
+                       goto retry;
+               }
+               ii->i_cno = cno;
+
+               clear_bit(NILFS_I_QUEUED, &ii->i_state);
+               set_bit(NILFS_I_BUSY, &ii->i_state);
+               list_del(&ii->i_dirty);
+               list_add_tail(&ii->i_dirty, &sci->sc_dirty_files);
+       }
+       spin_unlock(&sbi->s_inode_lock);
+
+       NILFS_I(sbi->s_ifile)->i_cno = cno;
+
+       return 0;
+}
+
+static void nilfs_segctor_check_out_files(struct nilfs_sc_info *sci,
+                                         struct nilfs_sb_info *sbi)
+{
+       struct nilfs_transaction_info *ti = current->journal_info;
+       struct nilfs_inode_info *ii, *n;
+       __u64 cno = sbi->s_nilfs->ns_cno;
+
+       spin_lock(&sbi->s_inode_lock);
+       list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) {
+               if (!test_and_clear_bit(NILFS_I_UPDATED, &ii->i_state) ||
+                   test_bit(NILFS_I_DIRTY, &ii->i_state)) {
+                       /* The current checkpoint number (=nilfs->ns_cno) is
+                          changed between check-in and check-out only if the
+                          super root is written out.  So, we can update i_cno
+                          for the inodes that remain in the dirty list. */
+                       ii->i_cno = cno;
+                       continue;
+               }
+               clear_bit(NILFS_I_BUSY, &ii->i_state);
+               brelse(ii->i_bh);
+               ii->i_bh = NULL;
+               list_del(&ii->i_dirty);
+               list_add_tail(&ii->i_dirty, &ti->ti_garbage);
+       }
+       spin_unlock(&sbi->s_inode_lock);
+}
+
+/*
+ * Main procedure of segment constructor
+ */
+static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode)
+{
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct page *failed_page;
+       int err, has_sr = 0;
+
+       sci->sc_stage.scnt = NILFS_ST_INIT;
+
+       err = nilfs_segctor_check_in_files(sci, sbi);
+       if (unlikely(err))
+               goto out;
+
+       if (nilfs_test_metadata_dirty(sbi))
+               set_bit(NILFS_SC_DIRTY, &sci->sc_flags);
+
+       if (nilfs_segctor_clean(sci))
+               goto out;
+
+       do {
+               sci->sc_stage.flags &= ~NILFS_CF_HISTORY_MASK;
+
+               err = nilfs_segctor_begin_construction(sci, nilfs);
+               if (unlikely(err))
+                       goto out;
+
+               /* Update time stamp */
+               sci->sc_seg_ctime = get_seconds();
+
+               err = nilfs_segctor_collect(sci, nilfs, mode);
+               if (unlikely(err))
+                       goto failed;
+
+               has_sr = (sci->sc_super_root != NULL);
+
+               /* Avoid empty segment */
+               if (sci->sc_stage.scnt == NILFS_ST_DONE &&
+                   NILFS_SEG_EMPTY(&sci->sc_curseg->sb_sum)) {
+                       nilfs_segctor_end_construction(sci, nilfs, 1);
+                       goto out;
+               }
+
+               err = nilfs_segctor_assign(sci, mode);
+               if (unlikely(err))
+                       goto failed;
+
+               if (sci->sc_stage.flags & NILFS_CF_IFILE_STARTED)
+                       nilfs_segctor_fill_in_file_bmap(sci, sbi->s_ifile);
+
+               if (has_sr) {
+                       err = nilfs_segctor_fill_in_checkpoint(sci);
+                       if (unlikely(err))
+                               goto failed_to_make_up;
+
+                       nilfs_segctor_fill_in_super_root(sci, nilfs);
+               }
+               nilfs_segctor_update_segusage(sci, nilfs->ns_sufile);
+
+               /* Write partial segments */
+               err = nilfs_segctor_prepare_write(sci, &failed_page);
+               if (unlikely(err))
+                       goto failed_to_write;
+
+               nilfs_segctor_fill_in_checksums(sci, nilfs->ns_crc_seed);
+
+               err = nilfs_segctor_write(sci, nilfs->ns_bdi);
+               if (unlikely(err))
+                       goto failed_to_write;
+
+               nilfs_segctor_complete_write(sci);
+
+               /* Commit segments */
+               if (has_sr) {
+                       nilfs_segctor_commit_free_segments(sci);
+                       nilfs_segctor_clear_metadata_dirty(sci);
+               }
+
+               nilfs_segctor_end_construction(sci, nilfs, 0);
+
+       } while (sci->sc_stage.scnt != NILFS_ST_DONE);
+
+ out:
+       nilfs_segctor_destroy_segment_buffers(sci);
+       nilfs_segctor_check_out_files(sci, sbi);
+       return err;
+
+ failed_to_write:
+       nilfs_segctor_abort_write(sci, failed_page, err);
+       nilfs_segctor_cancel_segusage(sci, nilfs->ns_sufile);
+
+ failed_to_make_up:
+       if (sci->sc_stage.flags & NILFS_CF_IFILE_STARTED)
+               nilfs_redirty_inodes(&sci->sc_dirty_files);
+
+ failed:
+       if (nilfs_doing_gc())
+               nilfs_redirty_inodes(&sci->sc_gc_inodes);
+       nilfs_segctor_end_construction(sci, nilfs, err);
+       goto out;
+}
+
+/**
+ * nilfs_secgtor_start_timer - set timer of background write
+ * @sci: nilfs_sc_info
+ *
+ * If the timer has already been set, it ignores the new request.
+ * This function MUST be called within a section locking the segment
+ * semaphore.
+ */
+static void nilfs_segctor_start_timer(struct nilfs_sc_info *sci)
+{
+       spin_lock(&sci->sc_state_lock);
+       if (sci->sc_timer && !(sci->sc_state & NILFS_SEGCTOR_COMMIT)) {
+               sci->sc_timer->expires = jiffies + sci->sc_interval;
+               add_timer(sci->sc_timer);
+               sci->sc_state |= NILFS_SEGCTOR_COMMIT;
+       }
+       spin_unlock(&sci->sc_state_lock);
+}
+
+static void nilfs_segctor_do_flush(struct nilfs_sc_info *sci, int bn)
+{
+       spin_lock(&sci->sc_state_lock);
+       if (!(sci->sc_flush_request & (1 << bn))) {
+               unsigned long prev_req = sci->sc_flush_request;
+
+               sci->sc_flush_request |= (1 << bn);
+               if (!prev_req)
+                       wake_up(&sci->sc_wait_daemon);
+       }
+       spin_unlock(&sci->sc_state_lock);
+}
+
+/**
+ * nilfs_flush_segment - trigger a segment construction for resource control
+ * @sb: super block
+ * @ino: inode number of the file to be flushed out.
+ */
+void nilfs_flush_segment(struct super_block *sb, ino_t ino)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct nilfs_sc_info *sci = NILFS_SC(sbi);
+
+       if (!sci || nilfs_doing_construction())
+               return;
+       nilfs_segctor_do_flush(sci, NILFS_MDT_INODE(sb, ino) ? ino : 0);
+                                       /* assign bit 0 to data files */
+}
+
+int nilfs_segctor_add_segments_to_be_freed(struct nilfs_sc_info *sci,
+                                          __u64 *segnum, size_t nsegs)
+{
+       struct nilfs_segment_entry *ent;
+       struct the_nilfs *nilfs = sci->sc_sbi->s_nilfs;
+       struct inode *sufile = nilfs->ns_sufile;
+       LIST_HEAD(list);
+       __u64 *pnum;
+       size_t i;
+       int err;
+
+       for (pnum = segnum, i = 0; i < nsegs; pnum++, i++) {
+               ent = nilfs_alloc_segment_entry(*pnum);
+               if (unlikely(!ent)) {
+                       err = -ENOMEM;
+                       goto failed;
+               }
+               list_add_tail(&ent->list, &list);
+
+               err = nilfs_open_segment_entry(ent, sufile);
+               if (unlikely(err))
+                       goto failed;
+
+               if (unlikely(!nilfs_segment_usage_dirty(ent->raw_su)))
+                       printk(KERN_WARNING "NILFS: unused segment is "
+                              "requested to be cleaned (segnum=%llu)\n",
+                              (unsigned long long)ent->segnum);
+               nilfs_close_segment_entry(ent, sufile);
+       }
+       list_splice(&list, sci->sc_cleaning_segments.prev);
+       return 0;
+
+ failed:
+       nilfs_dispose_segment_list(&list);
+       return err;
+}
+
+void nilfs_segctor_clear_segments_to_be_freed(struct nilfs_sc_info *sci)
+{
+       nilfs_dispose_segment_list(&sci->sc_cleaning_segments);
+}
+
+struct nilfs_segctor_wait_request {
+       wait_queue_t    wq;
+       __u32           seq;
+       int             err;
+       atomic_t        done;
+};
+
+static int nilfs_segctor_sync(struct nilfs_sc_info *sci)
+{
+       struct nilfs_segctor_wait_request wait_req;
+       int err = 0;
+
+       spin_lock(&sci->sc_state_lock);
+       init_wait(&wait_req.wq);
+       wait_req.err = 0;
+       atomic_set(&wait_req.done, 0);
+       wait_req.seq = ++sci->sc_seq_request;
+       spin_unlock(&sci->sc_state_lock);
+
+       init_waitqueue_entry(&wait_req.wq, current);
+       add_wait_queue(&sci->sc_wait_request, &wait_req.wq);
+       set_current_state(TASK_INTERRUPTIBLE);
+       wake_up(&sci->sc_wait_daemon);
+
+       for (;;) {
+               if (atomic_read(&wait_req.done)) {
+                       err = wait_req.err;
+                       break;
+               }
+               if (!signal_pending(current)) {
+                       schedule();
+                       continue;
+               }
+               err = -ERESTARTSYS;
+               break;
+       }
+       finish_wait(&sci->sc_wait_request, &wait_req.wq);
+       return err;
+}
+
+static void nilfs_segctor_wakeup(struct nilfs_sc_info *sci, int err)
+{
+       struct nilfs_segctor_wait_request *wrq, *n;
+       unsigned long flags;
+
+       spin_lock_irqsave(&sci->sc_wait_request.lock, flags);
+       list_for_each_entry_safe(wrq, n, &sci->sc_wait_request.task_list,
+                                wq.task_list) {
+               if (!atomic_read(&wrq->done) &&
+                   nilfs_cnt32_ge(sci->sc_seq_done, wrq->seq)) {
+                       wrq->err = err;
+                       atomic_set(&wrq->done, 1);
+               }
+               if (atomic_read(&wrq->done)) {
+                       wrq->wq.func(&wrq->wq,
+                                    TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE,
+                                    0, NULL);
+               }
+       }
+       spin_unlock_irqrestore(&sci->sc_wait_request.lock, flags);
+}
+
+/**
+ * nilfs_construct_segment - construct a logical segment
+ * @sb: super block
+ *
+ * Return Value: On success, 0 is retured. On errors, one of the following
+ * negative error code is returned.
+ *
+ * %-EROFS - Read only filesystem.
+ *
+ * %-EIO - I/O error
+ *
+ * %-ENOSPC - No space left on device (only in a panic state).
+ *
+ * %-ERESTARTSYS - Interrupted.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ */
+int nilfs_construct_segment(struct super_block *sb)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct nilfs_sc_info *sci = NILFS_SC(sbi);
+       struct nilfs_transaction_info *ti;
+       int err;
+
+       if (!sci)
+               return -EROFS;
+
+       /* A call inside transactions causes a deadlock. */
+       BUG_ON((ti = current->journal_info) && ti->ti_magic == NILFS_TI_MAGIC);
+
+       err = nilfs_segctor_sync(sci);
+       return err;
+}
+
+/**
+ * nilfs_construct_dsync_segment - construct a data-only logical segment
+ * @sb: super block
+ * @inode: inode whose data blocks should be written out
+ * @start: start byte offset
+ * @end: end byte offset (inclusive)
+ *
+ * Return Value: On success, 0 is retured. On errors, one of the following
+ * negative error code is returned.
+ *
+ * %-EROFS - Read only filesystem.
+ *
+ * %-EIO - I/O error
+ *
+ * %-ENOSPC - No space left on device (only in a panic state).
+ *
+ * %-ERESTARTSYS - Interrupted.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ */
+int nilfs_construct_dsync_segment(struct super_block *sb, struct inode *inode,
+                                 loff_t start, loff_t end)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct nilfs_sc_info *sci = NILFS_SC(sbi);
+       struct nilfs_inode_info *ii;
+       struct nilfs_transaction_info ti;
+       int err = 0;
+
+       if (!sci)
+               return -EROFS;
+
+       nilfs_transaction_lock(sbi, &ti, 0);
+
+       ii = NILFS_I(inode);
+       if (test_bit(NILFS_I_INODE_DIRTY, &ii->i_state) ||
+           nilfs_test_opt(sbi, STRICT_ORDER) ||
+           test_bit(NILFS_SC_UNCLOSED, &sci->sc_flags) ||
+           nilfs_discontinued(sbi->s_nilfs)) {
+               nilfs_transaction_unlock(sbi);
+               err = nilfs_segctor_sync(sci);
+               return err;
+       }
+
+       spin_lock(&sbi->s_inode_lock);
+       if (!test_bit(NILFS_I_QUEUED, &ii->i_state) &&
+           !test_bit(NILFS_I_BUSY, &ii->i_state)) {
+               spin_unlock(&sbi->s_inode_lock);
+               nilfs_transaction_unlock(sbi);
+               return 0;
+       }
+       spin_unlock(&sbi->s_inode_lock);
+       sci->sc_dsync_inode = ii;
+       sci->sc_dsync_start = start;
+       sci->sc_dsync_end = end;
+
+       err = nilfs_segctor_do_construct(sci, SC_LSEG_DSYNC);
+
+       nilfs_transaction_unlock(sbi);
+       return err;
+}
+
+struct nilfs_segctor_req {
+       int mode;
+       __u32 seq_accepted;
+       int sc_err;  /* construction failure */
+       int sb_err;  /* super block writeback failure */
+};
+
+#define FLUSH_FILE_BIT (0x1) /* data file only */
+#define FLUSH_DAT_BIT  (1 << NILFS_DAT_INO) /* DAT only */
+
+static void nilfs_segctor_accept(struct nilfs_sc_info *sci,
+                                struct nilfs_segctor_req *req)
+{
+       req->sc_err = req->sb_err = 0;
+       spin_lock(&sci->sc_state_lock);
+       req->seq_accepted = sci->sc_seq_request;
+       spin_unlock(&sci->sc_state_lock);
+
+       if (sci->sc_timer)
+               del_timer_sync(sci->sc_timer);
+}
+
+static void nilfs_segctor_notify(struct nilfs_sc_info *sci,
+                                struct nilfs_segctor_req *req)
+{
+       /* Clear requests (even when the construction failed) */
+       spin_lock(&sci->sc_state_lock);
+
+       sci->sc_state &= ~NILFS_SEGCTOR_COMMIT;
+
+       if (req->mode == SC_LSEG_SR) {
+               sci->sc_seq_done = req->seq_accepted;
+               nilfs_segctor_wakeup(sci, req->sc_err ? : req->sb_err);
+               sci->sc_flush_request = 0;
+       } else if (req->mode == SC_FLUSH_FILE)
+               sci->sc_flush_request &= ~FLUSH_FILE_BIT;
+       else if (req->mode == SC_FLUSH_DAT)
+               sci->sc_flush_request &= ~FLUSH_DAT_BIT;
+
+       spin_unlock(&sci->sc_state_lock);
+}
+
+static int nilfs_segctor_construct(struct nilfs_sc_info *sci,
+                                  struct nilfs_segctor_req *req)
+{
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       int err = 0;
+
+       if (nilfs_discontinued(nilfs))
+               req->mode = SC_LSEG_SR;
+       if (!nilfs_segctor_confirm(sci)) {
+               err = nilfs_segctor_do_construct(sci, req->mode);
+               req->sc_err = err;
+       }
+       if (likely(!err)) {
+               if (req->mode != SC_FLUSH_DAT)
+                       atomic_set(&nilfs->ns_ndirtyblks, 0);
+               if (test_bit(NILFS_SC_SUPER_ROOT, &sci->sc_flags) &&
+                   nilfs_discontinued(nilfs)) {
+                       down_write(&nilfs->ns_sem);
+                       req->sb_err = nilfs_commit_super(sbi, 0);
+                       up_write(&nilfs->ns_sem);
+               }
+       }
+       return err;
+}
+
+static void nilfs_construction_timeout(unsigned long data)
+{
+       struct task_struct *p = (struct task_struct *)data;
+       wake_up_process(p);
+}
+
+static void
+nilfs_remove_written_gcinodes(struct the_nilfs *nilfs, struct list_head *head)
+{
+       struct nilfs_inode_info *ii, *n;
+
+       list_for_each_entry_safe(ii, n, head, i_dirty) {
+               if (!test_bit(NILFS_I_UPDATED, &ii->i_state))
+                       continue;
+               hlist_del_init(&ii->vfs_inode.i_hash);
+               list_del_init(&ii->i_dirty);
+               nilfs_clear_gcinode(&ii->vfs_inode);
+       }
+}
+
+int nilfs_clean_segments(struct super_block *sb, void __user *argp)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct nilfs_sc_info *sci = NILFS_SC(sbi);
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct nilfs_transaction_info ti;
+       struct nilfs_segctor_req req = { .mode = SC_LSEG_SR };
+       int err;
+
+       if (unlikely(!sci))
+               return -EROFS;
+
+       nilfs_transaction_lock(sbi, &ti, 1);
+
+       err = nilfs_init_gcdat_inode(nilfs);
+       if (unlikely(err))
+               goto out_unlock;
+       err = nilfs_ioctl_prepare_clean_segments(nilfs, argp);
+       if (unlikely(err))
+               goto out_unlock;
+
+       list_splice_init(&nilfs->ns_gc_inodes, sci->sc_gc_inodes.prev);
+
+       for (;;) {
+               nilfs_segctor_accept(sci, &req);
+               err = nilfs_segctor_construct(sci, &req);
+               nilfs_remove_written_gcinodes(nilfs, &sci->sc_gc_inodes);
+               nilfs_segctor_notify(sci, &req);
+
+               if (likely(!err))
+                       break;
+
+               nilfs_warning(sb, __func__,
+                             "segment construction failed. (err=%d)", err);
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(sci->sc_interval);
+       }
+
+ out_unlock:
+       nilfs_clear_gcdat_inode(nilfs);
+       nilfs_transaction_unlock(sbi);
+       return err;
+}
+
+static void nilfs_segctor_thread_construct(struct nilfs_sc_info *sci, int mode)
+{
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       struct nilfs_transaction_info ti;
+       struct nilfs_segctor_req req = { .mode = mode };
+
+       nilfs_transaction_lock(sbi, &ti, 0);
+
+       nilfs_segctor_accept(sci, &req);
+       nilfs_segctor_construct(sci, &req);
+       nilfs_segctor_notify(sci, &req);
+
+       /*
+        * Unclosed segment should be retried.  We do this using sc_timer.
+        * Timeout of sc_timer will invoke complete construction which leads
+        * to close the current logical segment.
+        */
+       if (test_bit(NILFS_SC_UNCLOSED, &sci->sc_flags))
+               nilfs_segctor_start_timer(sci);
+
+       nilfs_transaction_unlock(sbi);
+}
+
+static void nilfs_segctor_do_immediate_flush(struct nilfs_sc_info *sci)
+{
+       int mode = 0;
+       int err;
+
+       spin_lock(&sci->sc_state_lock);
+       mode = (sci->sc_flush_request & FLUSH_DAT_BIT) ?
+               SC_FLUSH_DAT : SC_FLUSH_FILE;
+       spin_unlock(&sci->sc_state_lock);
+
+       if (mode) {
+               err = nilfs_segctor_do_construct(sci, mode);
+
+               spin_lock(&sci->sc_state_lock);
+               sci->sc_flush_request &= (mode == SC_FLUSH_FILE) ?
+                       ~FLUSH_FILE_BIT : ~FLUSH_DAT_BIT;
+               spin_unlock(&sci->sc_state_lock);
+       }
+       clear_bit(NILFS_SC_PRIOR_FLUSH, &sci->sc_flags);
+}
+
+static int nilfs_segctor_flush_mode(struct nilfs_sc_info *sci)
+{
+       if (!test_bit(NILFS_SC_UNCLOSED, &sci->sc_flags) ||
+           time_before(jiffies, sci->sc_lseg_stime + sci->sc_mjcp_freq)) {
+               if (!(sci->sc_flush_request & ~FLUSH_FILE_BIT))
+                       return SC_FLUSH_FILE;
+               else if (!(sci->sc_flush_request & ~FLUSH_DAT_BIT))
+                       return SC_FLUSH_DAT;
+       }
+       return SC_LSEG_SR;
+}
+
+/**
+ * nilfs_segctor_thread - main loop of the segment constructor thread.
+ * @arg: pointer to a struct nilfs_sc_info.
+ *
+ * nilfs_segctor_thread() initializes a timer and serves as a daemon
+ * to execute segment constructions.
+ */
+static int nilfs_segctor_thread(void *arg)
+{
+       struct nilfs_sc_info *sci = (struct nilfs_sc_info *)arg;
+       struct timer_list timer;
+       int timeout = 0;
+
+       init_timer(&timer);
+       timer.data = (unsigned long)current;
+       timer.function = nilfs_construction_timeout;
+       sci->sc_timer = &timer;
+
+       /* start sync. */
+       sci->sc_task = current;
+       wake_up(&sci->sc_wait_task); /* for nilfs_segctor_start_thread() */
+       printk(KERN_INFO
+              "segctord starting. Construction interval = %lu seconds, "
+              "CP frequency < %lu seconds\n",
+              sci->sc_interval / HZ, sci->sc_mjcp_freq / HZ);
+
+       spin_lock(&sci->sc_state_lock);
+ loop:
+       for (;;) {
+               int mode;
+
+               if (sci->sc_state & NILFS_SEGCTOR_QUIT)
+                       goto end_thread;
+
+               if (timeout || sci->sc_seq_request != sci->sc_seq_done)
+                       mode = SC_LSEG_SR;
+               else if (!sci->sc_flush_request)
+                       break;
+               else
+                       mode = nilfs_segctor_flush_mode(sci);
+
+               spin_unlock(&sci->sc_state_lock);
+               nilfs_segctor_thread_construct(sci, mode);
+               spin_lock(&sci->sc_state_lock);
+               timeout = 0;
+       }
+
+
+       if (freezing(current)) {
+               spin_unlock(&sci->sc_state_lock);
+               refrigerator();
+               spin_lock(&sci->sc_state_lock);
+       } else {
+               DEFINE_WAIT(wait);
+               int should_sleep = 1;
+
+               prepare_to_wait(&sci->sc_wait_daemon, &wait,
+                               TASK_INTERRUPTIBLE);
+
+               if (sci->sc_seq_request != sci->sc_seq_done)
+                       should_sleep = 0;
+               else if (sci->sc_flush_request)
+                       should_sleep = 0;
+               else if (sci->sc_state & NILFS_SEGCTOR_COMMIT)
+                       should_sleep = time_before(jiffies,
+                                                  sci->sc_timer->expires);
+
+               if (should_sleep) {
+                       spin_unlock(&sci->sc_state_lock);
+                       schedule();
+                       spin_lock(&sci->sc_state_lock);
+               }
+               finish_wait(&sci->sc_wait_daemon, &wait);
+               timeout = ((sci->sc_state & NILFS_SEGCTOR_COMMIT) &&
+                          time_after_eq(jiffies, sci->sc_timer->expires));
+       }
+       goto loop;
+
+ end_thread:
+       spin_unlock(&sci->sc_state_lock);
+       del_timer_sync(sci->sc_timer);
+       sci->sc_timer = NULL;
+
+       /* end sync. */
+       sci->sc_task = NULL;
+       wake_up(&sci->sc_wait_task); /* for nilfs_segctor_kill_thread() */
+       return 0;
+}
+
+static int nilfs_segctor_start_thread(struct nilfs_sc_info *sci)
+{
+       struct task_struct *t;
+
+       t = kthread_run(nilfs_segctor_thread, sci, "segctord");
+       if (IS_ERR(t)) {
+               int err = PTR_ERR(t);
+
+               printk(KERN_ERR "NILFS: error %d creating segctord thread\n",
+                      err);
+               return err;
+       }
+       wait_event(sci->sc_wait_task, sci->sc_task != NULL);
+       return 0;
+}
+
+static void nilfs_segctor_kill_thread(struct nilfs_sc_info *sci)
+{
+       sci->sc_state |= NILFS_SEGCTOR_QUIT;
+
+       while (sci->sc_task) {
+               wake_up(&sci->sc_wait_daemon);
+               spin_unlock(&sci->sc_state_lock);
+               wait_event(sci->sc_wait_task, sci->sc_task == NULL);
+               spin_lock(&sci->sc_state_lock);
+       }
+}
+
+static int nilfs_segctor_init(struct nilfs_sc_info *sci)
+{
+       sci->sc_seq_done = sci->sc_seq_request;
+
+       return nilfs_segctor_start_thread(sci);
+}
+
+/*
+ * Setup & clean-up functions
+ */
+static struct nilfs_sc_info *nilfs_segctor_new(struct nilfs_sb_info *sbi)
+{
+       struct nilfs_sc_info *sci;
+
+       sci = kzalloc(sizeof(*sci), GFP_KERNEL);
+       if (!sci)
+               return NULL;
+
+       sci->sc_sbi = sbi;
+       sci->sc_super = sbi->s_super;
+
+       init_waitqueue_head(&sci->sc_wait_request);
+       init_waitqueue_head(&sci->sc_wait_daemon);
+       init_waitqueue_head(&sci->sc_wait_task);
+       spin_lock_init(&sci->sc_state_lock);
+       INIT_LIST_HEAD(&sci->sc_dirty_files);
+       INIT_LIST_HEAD(&sci->sc_segbufs);
+       INIT_LIST_HEAD(&sci->sc_gc_inodes);
+       INIT_LIST_HEAD(&sci->sc_cleaning_segments);
+       INIT_LIST_HEAD(&sci->sc_copied_buffers);
+
+       sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT;
+       sci->sc_mjcp_freq = HZ * NILFS_SC_DEFAULT_SR_FREQ;
+       sci->sc_watermark = NILFS_SC_DEFAULT_WATERMARK;
+
+       if (sbi->s_interval)
+               sci->sc_interval = sbi->s_interval;
+       if (sbi->s_watermark)
+               sci->sc_watermark = sbi->s_watermark;
+       return sci;
+}
+
+static void nilfs_segctor_write_out(struct nilfs_sc_info *sci)
+{
+       int ret, retrycount = NILFS_SC_CLEANUP_RETRY;
+
+       /* The segctord thread was stopped and its timer was removed.
+          But some tasks remain. */
+       do {
+               struct nilfs_sb_info *sbi = sci->sc_sbi;
+               struct nilfs_transaction_info ti;
+               struct nilfs_segctor_req req = { .mode = SC_LSEG_SR };
+
+               nilfs_transaction_lock(sbi, &ti, 0);
+               nilfs_segctor_accept(sci, &req);
+               ret = nilfs_segctor_construct(sci, &req);
+               nilfs_segctor_notify(sci, &req);
+               nilfs_transaction_unlock(sbi);
+
+       } while (ret && retrycount-- > 0);
+}
+
+/**
+ * nilfs_segctor_destroy - destroy the segment constructor.
+ * @sci: nilfs_sc_info
+ *
+ * nilfs_segctor_destroy() kills the segctord thread and frees
+ * the nilfs_sc_info struct.
+ * Caller must hold the segment semaphore.
+ */
+static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
+{
+       struct nilfs_sb_info *sbi = sci->sc_sbi;
+       int flag;
+
+       up_write(&sbi->s_nilfs->ns_segctor_sem);
+
+       spin_lock(&sci->sc_state_lock);
+       nilfs_segctor_kill_thread(sci);
+       flag = ((sci->sc_state & NILFS_SEGCTOR_COMMIT) || sci->sc_flush_request
+               || sci->sc_seq_request != sci->sc_seq_done);
+       spin_unlock(&sci->sc_state_lock);
+
+       if (flag || nilfs_segctor_confirm(sci))
+               nilfs_segctor_write_out(sci);
+
+       WARN_ON(!list_empty(&sci->sc_copied_buffers));
+
+       if (!list_empty(&sci->sc_dirty_files)) {
+               nilfs_warning(sbi->s_super, __func__,
+                             "dirty file(s) after the final construction\n");
+               nilfs_dispose_list(sbi, &sci->sc_dirty_files, 1);
+       }
+
+       if (!list_empty(&sci->sc_cleaning_segments))
+               nilfs_dispose_segment_list(&sci->sc_cleaning_segments);
+
+       WARN_ON(!list_empty(&sci->sc_segbufs));
+
+       down_write(&sbi->s_nilfs->ns_segctor_sem);
+
+       kfree(sci);
+}
+
+/**
+ * nilfs_attach_segment_constructor - attach a segment constructor
+ * @sbi: nilfs_sb_info
+ *
+ * nilfs_attach_segment_constructor() allocates a struct nilfs_sc_info,
+ * initilizes it, and starts the segment constructor.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error code is returned.
+ *
+ * %-ENOMEM - Insufficient memory available.
+ */
+int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       int err;
+
+       /* Each field of nilfs_segctor is cleared through the initialization
+          of super-block info */
+       sbi->s_sc_info = nilfs_segctor_new(sbi);
+       if (!sbi->s_sc_info)
+               return -ENOMEM;
+
+       nilfs_attach_writer(nilfs, sbi);
+       err = nilfs_segctor_init(NILFS_SC(sbi));
+       if (err) {
+               nilfs_detach_writer(nilfs, sbi);
+               kfree(sbi->s_sc_info);
+               sbi->s_sc_info = NULL;
+       }
+       return err;
+}
+
+/**
+ * nilfs_detach_segment_constructor - destroy the segment constructor
+ * @sbi: nilfs_sb_info
+ *
+ * nilfs_detach_segment_constructor() kills the segment constructor daemon,
+ * frees the struct nilfs_sc_info, and destroy the dirty file list.
+ */
+void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       LIST_HEAD(garbage_list);
+
+       down_write(&nilfs->ns_segctor_sem);
+       if (NILFS_SC(sbi)) {
+               nilfs_segctor_destroy(NILFS_SC(sbi));
+               sbi->s_sc_info = NULL;
+       }
+
+       /* Force to free the list of dirty files */
+       spin_lock(&sbi->s_inode_lock);
+       if (!list_empty(&sbi->s_dirty_files)) {
+               list_splice_init(&sbi->s_dirty_files, &garbage_list);
+               nilfs_warning(sbi->s_super, __func__,
+                             "Non empty dirty list after the last "
+                             "segment construction\n");
+       }
+       spin_unlock(&sbi->s_inode_lock);
+       up_write(&nilfs->ns_segctor_sem);
+
+       nilfs_dispose_list(sbi, &garbage_list, 1);
+       nilfs_detach_writer(nilfs, sbi);
+}
diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h
new file mode 100644 (file)
index 0000000..a98fc1e
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * segment.h - NILFS Segment constructor prototypes and definitions
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+#ifndef _NILFS_SEGMENT_H
+#define _NILFS_SEGMENT_H
+
+#include <linux/types.h>
+#include <linux/fs.h>
+#include <linux/buffer_head.h>
+#include <linux/nilfs2_fs.h>
+#include "sb.h"
+
+/**
+ * struct nilfs_recovery_info - Recovery infomation
+ * @ri_need_recovery: Recovery status
+ * @ri_super_root: Block number of the last super root
+ * @ri_ri_cno: Number of the last checkpoint
+ * @ri_lsegs_start: Region for roll-forwarding (start block number)
+ * @ri_lsegs_end: Region for roll-forwarding (end block number)
+ * @ri_lseg_start_seq: Sequence value of the segment at ri_lsegs_start
+ * @ri_used_segments: List of segments to be mark active
+ * @ri_pseg_start: Block number of the last partial segment
+ * @ri_seq: Sequence number on the last partial segment
+ * @ri_segnum: Segment number on the last partial segment
+ * @ri_nextnum: Next segment number on the last partial segment
+ */
+struct nilfs_recovery_info {
+       int                     ri_need_recovery;
+       sector_t                ri_super_root;
+       __u64                   ri_cno;
+
+       sector_t                ri_lsegs_start;
+       sector_t                ri_lsegs_end;
+       u64                     ri_lsegs_start_seq;
+       struct list_head        ri_used_segments;
+       sector_t                ri_pseg_start;
+       u64                     ri_seq;
+       __u64                   ri_segnum;
+       __u64                   ri_nextnum;
+};
+
+/* ri_need_recovery */
+#define NILFS_RECOVERY_SR_UPDATED       1  /* The super root was updated */
+#define NILFS_RECOVERY_ROLLFORWARD_DONE         2  /* Rollforward was carried out */
+
+/**
+ * struct nilfs_cstage - Context of collection stage
+ * @scnt: Stage count
+ * @flags: State flags
+ * @dirty_file_ptr: Pointer on dirty_files list, or inode of a target file
+ * @gc_inode_ptr: Pointer on the list of gc-inodes
+ */
+struct nilfs_cstage {
+       int                     scnt;
+       unsigned                flags;
+       struct nilfs_inode_info *dirty_file_ptr;
+       struct nilfs_inode_info *gc_inode_ptr;
+};
+
+struct nilfs_segment_buffer;
+
+struct nilfs_segsum_pointer {
+       struct buffer_head     *bh;
+       unsigned                offset; /* offset in bytes */
+};
+
+/**
+ * struct nilfs_sc_info - Segment constructor information
+ * @sc_super: Back pointer to super_block struct
+ * @sc_sbi: Back pointer to nilfs_sb_info struct
+ * @sc_nblk_inc: Block count of current generation
+ * @sc_dirty_files: List of files to be written
+ * @sc_gc_inodes: List of GC inodes having blocks to be written
+ * @sc_cleaning_segments: List of segments to be freed through construction
+ * @sc_copied_buffers: List of copied buffers (buffer heads) to freeze data
+ * @sc_dsync_inode: inode whose data pages are written for a sync operation
+ * @sc_dsync_start: start byte offset of data pages
+ * @sc_dsync_end: end byte offset of data pages (inclusive)
+ * @sc_segbufs: List of segment buffers
+ * @sc_segbuf_nblocks: Number of available blocks in segment buffers.
+ * @sc_curseg: Current segment buffer
+ * @sc_super_root: Pointer to the super root buffer
+ * @sc_stage: Collection stage
+ * @sc_finfo_ptr: pointer to the current finfo struct in the segment summary
+ * @sc_binfo_ptr: pointer to the current binfo struct in the segment summary
+ * @sc_blk_cnt:        Block count of a file
+ * @sc_datablk_cnt: Data block count of a file
+ * @sc_nblk_this_inc: Number of blocks included in the current logical segment
+ * @sc_seg_ctime: Creation time
+ * @sc_flags: Internal flags
+ * @sc_state_lock: spinlock for sc_state and so on
+ * @sc_state: Segctord state flags
+ * @sc_flush_request: inode bitmap of metadata files to be flushed
+ * @sc_wait_request: Client request queue
+ * @sc_wait_daemon: Daemon wait queue
+ * @sc_wait_task: Start/end wait queue to control segctord task
+ * @sc_seq_request: Request counter
+ * @sc_seq_done: Completion counter
+ * @sc_sync: Request of explicit sync operation
+ * @sc_interval: Timeout value of background construction
+ * @sc_mjcp_freq: Frequency of creating checkpoints
+ * @sc_lseg_stime: Start time of the latest logical segment
+ * @sc_watermark: Watermark for the number of dirty buffers
+ * @sc_timer: Timer for segctord
+ * @sc_task: current thread of segctord
+ */
+struct nilfs_sc_info {
+       struct super_block     *sc_super;
+       struct nilfs_sb_info   *sc_sbi;
+
+       unsigned long           sc_nblk_inc;
+
+       struct list_head        sc_dirty_files;
+       struct list_head        sc_gc_inodes;
+       struct list_head        sc_cleaning_segments;
+       struct list_head        sc_copied_buffers;
+
+       struct nilfs_inode_info *sc_dsync_inode;
+       loff_t                  sc_dsync_start;
+       loff_t                  sc_dsync_end;
+
+       /* Segment buffers */
+       struct list_head        sc_segbufs;
+       unsigned long           sc_segbuf_nblocks;
+       struct nilfs_segment_buffer *sc_curseg;
+       struct buffer_head     *sc_super_root;
+
+       struct nilfs_cstage     sc_stage;
+
+       struct nilfs_segsum_pointer sc_finfo_ptr;
+       struct nilfs_segsum_pointer sc_binfo_ptr;
+       unsigned long           sc_blk_cnt;
+       unsigned long           sc_datablk_cnt;
+       unsigned long           sc_nblk_this_inc;
+       time_t                  sc_seg_ctime;
+
+       unsigned long           sc_flags;
+
+       spinlock_t              sc_state_lock;
+       unsigned long           sc_state;
+       unsigned long           sc_flush_request;
+
+       wait_queue_head_t       sc_wait_request;
+       wait_queue_head_t       sc_wait_daemon;
+       wait_queue_head_t       sc_wait_task;
+
+       __u32                   sc_seq_request;
+       __u32                   sc_seq_done;
+
+       int                     sc_sync;
+       unsigned long           sc_interval;
+       unsigned long           sc_mjcp_freq;
+       unsigned long           sc_lseg_stime;  /* in 1/HZ seconds */
+       unsigned long           sc_watermark;
+
+       struct timer_list      *sc_timer;
+       struct task_struct     *sc_task;
+};
+
+/* sc_flags */
+enum {
+       NILFS_SC_DIRTY,         /* One or more dirty meta-data blocks exist */
+       NILFS_SC_UNCLOSED,      /* Logical segment is not closed */
+       NILFS_SC_SUPER_ROOT,    /* The latest segment has a super root */
+       NILFS_SC_PRIOR_FLUSH,   /* Requesting immediate flush without making a
+                                  checkpoint */
+       NILFS_SC_HAVE_DELTA,    /* Next checkpoint will have update of files
+                                  other than DAT, cpfile, sufile, or files
+                                  moved by GC */
+};
+
+/* sc_state */
+#define NILFS_SEGCTOR_QUIT         0x0001  /* segctord is being destroyed */
+#define NILFS_SEGCTOR_COMMIT       0x0004  /* committed transaction exists */
+
+/*
+ * Constant parameters
+ */
+#define NILFS_SC_CLEANUP_RETRY     3  /* Retry count of construction when
+                                         destroying segctord */
+
+/*
+ * Default values of timeout, in seconds.
+ */
+#define NILFS_SC_DEFAULT_TIMEOUT    5   /* Timeout value of dirty blocks.
+                                          It triggers construction of a
+                                          logical segment with a super root */
+#define NILFS_SC_DEFAULT_SR_FREQ    30  /* Maximum frequency of super root
+                                          creation */
+
+/*
+ * The default threshold amount of data, in block counts.
+ */
+#define NILFS_SC_DEFAULT_WATERMARK  3600
+
+
+/* segment.c */
+extern int nilfs_init_transaction_cache(void);
+extern void nilfs_destroy_transaction_cache(void);
+extern void nilfs_relax_pressure_in_lock(struct super_block *);
+
+extern int nilfs_construct_segment(struct super_block *);
+extern int nilfs_construct_dsync_segment(struct super_block *, struct inode *,
+                                        loff_t, loff_t);
+extern void nilfs_flush_segment(struct super_block *, ino_t);
+extern int nilfs_clean_segments(struct super_block *, void __user *);
+
+extern int nilfs_segctor_add_segments_to_be_freed(struct nilfs_sc_info *,
+                                                 __u64 *, size_t);
+extern void nilfs_segctor_clear_segments_to_be_freed(struct nilfs_sc_info *);
+
+extern int nilfs_attach_segment_constructor(struct nilfs_sb_info *);
+extern void nilfs_detach_segment_constructor(struct nilfs_sb_info *);
+
+/* recovery.c */
+extern int nilfs_read_super_root_block(struct super_block *, sector_t,
+                                      struct buffer_head **, int);
+extern int nilfs_search_super_root(struct the_nilfs *, struct nilfs_sb_info *,
+                                  struct nilfs_recovery_info *);
+extern int nilfs_recover_logical_segments(struct the_nilfs *,
+                                         struct nilfs_sb_info *,
+                                         struct nilfs_recovery_info *);
+
+#endif /* _NILFS_SEGMENT_H */
diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c
new file mode 100644 (file)
index 0000000..c774cf3
--- /dev/null
@@ -0,0 +1,640 @@
+/*
+ * sufile.c - NILFS segment usage file.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/string.h>
+#include <linux/buffer_head.h>
+#include <linux/errno.h>
+#include <linux/nilfs2_fs.h>
+#include "mdt.h"
+#include "sufile.h"
+
+
+static inline unsigned long
+nilfs_sufile_segment_usages_per_block(const struct inode *sufile)
+{
+       return NILFS_MDT(sufile)->mi_entries_per_block;
+}
+
+static unsigned long
+nilfs_sufile_get_blkoff(const struct inode *sufile, __u64 segnum)
+{
+       __u64 t = segnum + NILFS_MDT(sufile)->mi_first_entry_offset;
+       do_div(t, nilfs_sufile_segment_usages_per_block(sufile));
+       return (unsigned long)t;
+}
+
+static unsigned long
+nilfs_sufile_get_offset(const struct inode *sufile, __u64 segnum)
+{
+       __u64 t = segnum + NILFS_MDT(sufile)->mi_first_entry_offset;
+       return do_div(t, nilfs_sufile_segment_usages_per_block(sufile));
+}
+
+static unsigned long
+nilfs_sufile_segment_usages_in_block(const struct inode *sufile, __u64 curr,
+                                    __u64 max)
+{
+       return min_t(unsigned long,
+                    nilfs_sufile_segment_usages_per_block(sufile) -
+                    nilfs_sufile_get_offset(sufile, curr),
+                    max - curr + 1);
+}
+
+static inline struct nilfs_sufile_header *
+nilfs_sufile_block_get_header(const struct inode *sufile,
+                             struct buffer_head *bh,
+                             void *kaddr)
+{
+       return kaddr + bh_offset(bh);
+}
+
+static struct nilfs_segment_usage *
+nilfs_sufile_block_get_segment_usage(const struct inode *sufile, __u64 segnum,
+                                    struct buffer_head *bh, void *kaddr)
+{
+       return kaddr + bh_offset(bh) +
+               nilfs_sufile_get_offset(sufile, segnum) *
+               NILFS_MDT(sufile)->mi_entry_size;
+}
+
+static inline int nilfs_sufile_get_header_block(struct inode *sufile,
+                                               struct buffer_head **bhp)
+{
+       return nilfs_mdt_get_block(sufile, 0, 0, NULL, bhp);
+}
+
+static inline int
+nilfs_sufile_get_segment_usage_block(struct inode *sufile, __u64 segnum,
+                                    int create, struct buffer_head **bhp)
+{
+       return nilfs_mdt_get_block(sufile,
+                                  nilfs_sufile_get_blkoff(sufile, segnum),
+                                  create, NULL, bhp);
+}
+
+/**
+ * nilfs_sufile_alloc - allocate a segment
+ * @sufile: inode of segment usage file
+ * @segnump: pointer to segment number
+ *
+ * Description: nilfs_sufile_alloc() allocates a clean segment.
+ *
+ * Return Value: On success, 0 is returned and the segment number of the
+ * allocated segment is stored in the place pointed by @segnump. On error, one
+ * of the following negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-ENOSPC - No clean segment left.
+ */
+int nilfs_sufile_alloc(struct inode *sufile, __u64 *segnump)
+{
+       struct buffer_head *header_bh, *su_bh;
+       struct the_nilfs *nilfs;
+       struct nilfs_sufile_header *header;
+       struct nilfs_segment_usage *su;
+       size_t susz = NILFS_MDT(sufile)->mi_entry_size;
+       __u64 segnum, maxsegnum, last_alloc;
+       void *kaddr;
+       unsigned long nsegments, ncleansegs, nsus;
+       int ret, i, j;
+
+       down_write(&NILFS_MDT(sufile)->mi_sem);
+
+       nilfs = NILFS_MDT(sufile)->mi_nilfs;
+
+       ret = nilfs_sufile_get_header_block(sufile, &header_bh);
+       if (ret < 0)
+               goto out_sem;
+       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+       header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr);
+       ncleansegs = le64_to_cpu(header->sh_ncleansegs);
+       last_alloc = le64_to_cpu(header->sh_last_alloc);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nsegments = nilfs_sufile_get_nsegments(sufile);
+       segnum = last_alloc + 1;
+       maxsegnum = nsegments - 1;
+       for (i = 0; i < nsegments; i += nsus) {
+               if (segnum >= nsegments) {
+                       /* wrap around */
+                       segnum = 0;
+                       maxsegnum = last_alloc;
+               }
+               ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 1,
+                                                          &su_bh);
+               if (ret < 0)
+                       goto out_header;
+               kaddr = kmap_atomic(su_bh->b_page, KM_USER0);
+               su = nilfs_sufile_block_get_segment_usage(
+                       sufile, segnum, su_bh, kaddr);
+
+               nsus = nilfs_sufile_segment_usages_in_block(
+                       sufile, segnum, maxsegnum);
+               for (j = 0; j < nsus; j++, su = (void *)su + susz, segnum++) {
+                       if (!nilfs_segment_usage_clean(su))
+                               continue;
+                       /* found a clean segment */
+                       nilfs_segment_usage_set_dirty(su);
+                       kunmap_atomic(kaddr, KM_USER0);
+
+                       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+                       header = nilfs_sufile_block_get_header(
+                               sufile, header_bh, kaddr);
+                       le64_add_cpu(&header->sh_ncleansegs, -1);
+                       le64_add_cpu(&header->sh_ndirtysegs, 1);
+                       header->sh_last_alloc = cpu_to_le64(segnum);
+                       kunmap_atomic(kaddr, KM_USER0);
+
+                       nilfs_mdt_mark_buffer_dirty(header_bh);
+                       nilfs_mdt_mark_buffer_dirty(su_bh);
+                       nilfs_mdt_mark_dirty(sufile);
+                       brelse(su_bh);
+                       *segnump = segnum;
+                       goto out_header;
+               }
+
+               kunmap_atomic(kaddr, KM_USER0);
+               brelse(su_bh);
+       }
+
+       /* no segments left */
+       ret = -ENOSPC;
+
+ out_header:
+       brelse(header_bh);
+
+ out_sem:
+       up_write(&NILFS_MDT(sufile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_sufile_cancel_free -
+ * @sufile: inode of segment usage file
+ * @segnum: segment number
+ *
+ * Description:
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_sufile_cancel_free(struct inode *sufile, __u64 segnum)
+{
+       struct buffer_head *header_bh, *su_bh;
+       struct the_nilfs *nilfs;
+       struct nilfs_sufile_header *header;
+       struct nilfs_segment_usage *su;
+       void *kaddr;
+       int ret;
+
+       down_write(&NILFS_MDT(sufile)->mi_sem);
+
+       nilfs = NILFS_MDT(sufile)->mi_nilfs;
+
+       ret = nilfs_sufile_get_header_block(sufile, &header_bh);
+       if (ret < 0)
+               goto out_sem;
+
+       ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &su_bh);
+       if (ret < 0)
+               goto out_header;
+
+       kaddr = kmap_atomic(su_bh->b_page, KM_USER0);
+       su = nilfs_sufile_block_get_segment_usage(
+               sufile, segnum, su_bh, kaddr);
+       if (unlikely(!nilfs_segment_usage_clean(su))) {
+               printk(KERN_WARNING "%s: segment %llu must be clean\n",
+                      __func__, (unsigned long long)segnum);
+               kunmap_atomic(kaddr, KM_USER0);
+               goto out_su_bh;
+       }
+       nilfs_segment_usage_set_dirty(su);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+       header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr);
+       le64_add_cpu(&header->sh_ncleansegs, -1);
+       le64_add_cpu(&header->sh_ndirtysegs, 1);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       nilfs_mdt_mark_buffer_dirty(header_bh);
+       nilfs_mdt_mark_buffer_dirty(su_bh);
+       nilfs_mdt_mark_dirty(sufile);
+
+ out_su_bh:
+       brelse(su_bh);
+ out_header:
+       brelse(header_bh);
+ out_sem:
+       up_write(&NILFS_MDT(sufile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_sufile_freev - free segments
+ * @sufile: inode of segment usage file
+ * @segnum: array of segment numbers
+ * @nsegs: number of segments
+ *
+ * Description: nilfs_sufile_freev() frees segments specified by @segnum and
+ * @nsegs, which must have been returned by a previous call to
+ * nilfs_sufile_alloc().
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+#define NILFS_SUFILE_FREEV_PREALLOC    16
+int nilfs_sufile_freev(struct inode *sufile, __u64 *segnum, size_t nsegs)
+{
+       struct buffer_head *header_bh, **su_bh,
+               *su_bh_prealloc[NILFS_SUFILE_FREEV_PREALLOC];
+       struct the_nilfs *nilfs;
+       struct nilfs_sufile_header *header;
+       struct nilfs_segment_usage *su;
+       void *kaddr;
+       int ret, i;
+
+       down_write(&NILFS_MDT(sufile)->mi_sem);
+
+       nilfs = NILFS_MDT(sufile)->mi_nilfs;
+
+       /* prepare resources */
+       if (nsegs <= NILFS_SUFILE_FREEV_PREALLOC)
+               su_bh = su_bh_prealloc;
+       else {
+               su_bh = kmalloc(sizeof(*su_bh) * nsegs, GFP_NOFS);
+               if (su_bh == NULL) {
+                       ret = -ENOMEM;
+                       goto out_sem;
+               }
+       }
+
+       ret = nilfs_sufile_get_header_block(sufile, &header_bh);
+       if (ret < 0)
+               goto out_su_bh;
+       for (i = 0; i < nsegs; i++) {
+               ret = nilfs_sufile_get_segment_usage_block(sufile, segnum[i],
+                                                          0, &su_bh[i]);
+               if (ret < 0)
+                       goto out_bh;
+       }
+
+       /* free segments */
+       for (i = 0; i < nsegs; i++) {
+               kaddr = kmap_atomic(su_bh[i]->b_page, KM_USER0);
+               su = nilfs_sufile_block_get_segment_usage(
+                       sufile, segnum[i], su_bh[i], kaddr);
+               WARN_ON(nilfs_segment_usage_error(su));
+               nilfs_segment_usage_set_clean(su);
+               kunmap_atomic(kaddr, KM_USER0);
+               nilfs_mdt_mark_buffer_dirty(su_bh[i]);
+       }
+       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+       header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr);
+       le64_add_cpu(&header->sh_ncleansegs, nsegs);
+       le64_add_cpu(&header->sh_ndirtysegs, -(u64)nsegs);
+       kunmap_atomic(kaddr, KM_USER0);
+       nilfs_mdt_mark_buffer_dirty(header_bh);
+       nilfs_mdt_mark_dirty(sufile);
+
+ out_bh:
+       for (i--; i >= 0; i--)
+               brelse(su_bh[i]);
+       brelse(header_bh);
+
+ out_su_bh:
+       if (su_bh != su_bh_prealloc)
+               kfree(su_bh);
+
+ out_sem:
+       up_write(&NILFS_MDT(sufile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_sufile_free -
+ * @sufile:
+ * @segnum:
+ */
+int nilfs_sufile_free(struct inode *sufile, __u64 segnum)
+{
+       return nilfs_sufile_freev(sufile, &segnum, 1);
+}
+
+/**
+ * nilfs_sufile_get_segment_usage - get a segment usage
+ * @sufile: inode of segment usage file
+ * @segnum: segment number
+ * @sup: pointer to segment usage
+ * @bhp: pointer to buffer head
+ *
+ * Description: nilfs_sufile_get_segment_usage() acquires the segment usage
+ * specified by @segnum.
+ *
+ * Return Value: On success, 0 is returned, and the segment usage and the
+ * buffer head of the buffer on which the segment usage is located are stored
+ * in the place pointed by @sup and @bhp, respectively. On error, one of the
+ * following negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-EINVAL - Invalid segment usage number.
+ */
+int nilfs_sufile_get_segment_usage(struct inode *sufile, __u64 segnum,
+                                  struct nilfs_segment_usage **sup,
+                                  struct buffer_head **bhp)
+{
+       struct buffer_head *bh;
+       struct nilfs_segment_usage *su;
+       void *kaddr;
+       int ret;
+
+       /* segnum is 0 origin */
+       if (segnum >= nilfs_sufile_get_nsegments(sufile))
+               return -EINVAL;
+       down_write(&NILFS_MDT(sufile)->mi_sem);
+       ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 1, &bh);
+       if (ret < 0)
+               goto out_sem;
+       kaddr = kmap(bh->b_page);
+       su = nilfs_sufile_block_get_segment_usage(sufile, segnum, bh, kaddr);
+       if (nilfs_segment_usage_error(su)) {
+               kunmap(bh->b_page);
+               brelse(bh);
+               ret = -EINVAL;
+               goto out_sem;
+       }
+
+       if (sup != NULL)
+               *sup = su;
+       *bhp = bh;
+
+ out_sem:
+       up_write(&NILFS_MDT(sufile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_sufile_put_segment_usage - put a segment usage
+ * @sufile: inode of segment usage file
+ * @segnum: segment number
+ * @bh: buffer head
+ *
+ * Description: nilfs_sufile_put_segment_usage() releases the segment usage
+ * specified by @segnum. @bh must be the buffer head which have been returned
+ * by a previous call to nilfs_sufile_get_segment_usage() with @segnum.
+ */
+void nilfs_sufile_put_segment_usage(struct inode *sufile, __u64 segnum,
+                                   struct buffer_head *bh)
+{
+       kunmap(bh->b_page);
+       brelse(bh);
+}
+
+/**
+ * nilfs_sufile_get_stat - get segment usage statistics
+ * @sufile: inode of segment usage file
+ * @stat: pointer to a structure of segment usage statistics
+ *
+ * Description: nilfs_sufile_get_stat() returns information about segment
+ * usage.
+ *
+ * Return Value: On success, 0 is returned, and segment usage information is
+ * stored in the place pointed by @stat. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_sufile_get_stat(struct inode *sufile, struct nilfs_sustat *sustat)
+{
+       struct buffer_head *header_bh;
+       struct nilfs_sufile_header *header;
+       struct the_nilfs *nilfs = NILFS_MDT(sufile)->mi_nilfs;
+       void *kaddr;
+       int ret;
+
+       down_read(&NILFS_MDT(sufile)->mi_sem);
+
+       ret = nilfs_sufile_get_header_block(sufile, &header_bh);
+       if (ret < 0)
+               goto out_sem;
+
+       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+       header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr);
+       sustat->ss_nsegs = nilfs_sufile_get_nsegments(sufile);
+       sustat->ss_ncleansegs = le64_to_cpu(header->sh_ncleansegs);
+       sustat->ss_ndirtysegs = le64_to_cpu(header->sh_ndirtysegs);
+       sustat->ss_ctime = nilfs->ns_ctime;
+       sustat->ss_nongc_ctime = nilfs->ns_nongc_ctime;
+       spin_lock(&nilfs->ns_last_segment_lock);
+       sustat->ss_prot_seq = nilfs->ns_prot_seq;
+       spin_unlock(&nilfs->ns_last_segment_lock);
+       kunmap_atomic(kaddr, KM_USER0);
+       brelse(header_bh);
+
+ out_sem:
+       up_read(&NILFS_MDT(sufile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_sufile_get_ncleansegs - get the number of clean segments
+ * @sufile: inode of segment usage file
+ * @nsegsp: pointer to the number of clean segments
+ *
+ * Description: nilfs_sufile_get_ncleansegs() acquires the number of clean
+ * segments.
+ *
+ * Return Value: On success, 0 is returned and the number of clean segments is
+ * stored in the place pointed by @nsegsp. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+int nilfs_sufile_get_ncleansegs(struct inode *sufile, unsigned long *nsegsp)
+{
+       struct nilfs_sustat sustat;
+       int ret;
+
+       ret = nilfs_sufile_get_stat(sufile, &sustat);
+       if (ret == 0)
+               *nsegsp = sustat.ss_ncleansegs;
+       return ret;
+}
+
+/**
+ * nilfs_sufile_set_error - mark a segment as erroneous
+ * @sufile: inode of segment usage file
+ * @segnum: segment number
+ *
+ * Description: nilfs_sufile_set_error() marks the segment specified by
+ * @segnum as erroneous. The error segment will never be used again.
+ *
+ * Return Value: On success, 0 is returned. On error, one of the following
+ * negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ *
+ * %-EINVAL - Invalid segment usage number.
+ */
+int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum)
+{
+       struct buffer_head *header_bh, *su_bh;
+       struct nilfs_segment_usage *su;
+       struct nilfs_sufile_header *header;
+       void *kaddr;
+       int ret;
+
+       if (unlikely(segnum >= nilfs_sufile_get_nsegments(sufile))) {
+               printk(KERN_WARNING "%s: invalid segment number: %llu\n",
+                      __func__, (unsigned long long)segnum);
+               return -EINVAL;
+       }
+       down_write(&NILFS_MDT(sufile)->mi_sem);
+
+       ret = nilfs_sufile_get_header_block(sufile, &header_bh);
+       if (ret < 0)
+               goto out_sem;
+       ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &su_bh);
+       if (ret < 0)
+               goto out_header;
+
+       kaddr = kmap_atomic(su_bh->b_page, KM_USER0);
+       su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr);
+       if (nilfs_segment_usage_error(su)) {
+               kunmap_atomic(kaddr, KM_USER0);
+               brelse(su_bh);
+               goto out_header;
+       }
+
+       nilfs_segment_usage_set_error(su);
+       kunmap_atomic(kaddr, KM_USER0);
+       brelse(su_bh);
+
+       kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
+       header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr);
+       le64_add_cpu(&header->sh_ndirtysegs, -1);
+       kunmap_atomic(kaddr, KM_USER0);
+       nilfs_mdt_mark_buffer_dirty(header_bh);
+       nilfs_mdt_mark_buffer_dirty(su_bh);
+       nilfs_mdt_mark_dirty(sufile);
+       brelse(su_bh);
+
+ out_header:
+       brelse(header_bh);
+
+ out_sem:
+       up_write(&NILFS_MDT(sufile)->mi_sem);
+       return ret;
+}
+
+/**
+ * nilfs_sufile_get_suinfo -
+ * @sufile: inode of segment usage file
+ * @segnum: segment number to start looking
+ * @si: array of suinfo
+ * @nsi: size of suinfo array
+ *
+ * Description:
+ *
+ * Return Value: On success, 0 is returned and .... On error, one of the
+ * following negative error codes is returned.
+ *
+ * %-EIO - I/O error.
+ *
+ * %-ENOMEM - Insufficient amount of memory available.
+ */
+ssize_t nilfs_sufile_get_suinfo(struct inode *sufile, __u64 segnum,
+                               struct nilfs_suinfo *si, size_t nsi)
+{
+       struct buffer_head *su_bh;
+       struct nilfs_segment_usage *su;
+       size_t susz = NILFS_MDT(sufile)->mi_entry_size;
+       struct the_nilfs *nilfs = NILFS_MDT(sufile)->mi_nilfs;
+       void *kaddr;
+       unsigned long nsegs, segusages_per_block;
+       ssize_t n;
+       int ret, i, j;
+
+       down_read(&NILFS_MDT(sufile)->mi_sem);
+
+       segusages_per_block = nilfs_sufile_segment_usages_per_block(sufile);
+       nsegs = min_t(unsigned long,
+                     nilfs_sufile_get_nsegments(sufile) - segnum,
+                     nsi);
+       for (i = 0; i < nsegs; i += n, segnum += n) {
+               n = min_t(unsigned long,
+                         segusages_per_block -
+                                 nilfs_sufile_get_offset(sufile, segnum),
+                         nsegs - i);
+               ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0,
+                                                          &su_bh);
+               if (ret < 0) {
+                       if (ret != -ENOENT)
+                               goto out;
+                       /* hole */
+                       memset(&si[i], 0, sizeof(struct nilfs_suinfo) * n);
+                       continue;
+               }
+
+               kaddr = kmap_atomic(su_bh->b_page, KM_USER0);
+               su = nilfs_sufile_block_get_segment_usage(
+                       sufile, segnum, su_bh, kaddr);
+               for (j = 0; j < n; j++, su = (void *)su + susz) {
+                       si[i + j].sui_lastmod = le64_to_cpu(su->su_lastmod);
+                       si[i + j].sui_nblocks = le32_to_cpu(su->su_nblocks);
+                       si[i + j].sui_flags = le32_to_cpu(su->su_flags) &
+                               ~(1UL << NILFS_SEGMENT_USAGE_ACTIVE);
+                       if (nilfs_segment_is_active(nilfs, segnum + i + j))
+                               si[i + j].sui_flags |=
+                                       (1UL << NILFS_SEGMENT_USAGE_ACTIVE);
+               }
+               kunmap_atomic(kaddr, KM_USER0);
+               brelse(su_bh);
+       }
+       ret = nsegs;
+
+ out:
+       up_read(&NILFS_MDT(sufile)->mi_sem);
+       return ret;
+}
diff --git a/fs/nilfs2/sufile.h b/fs/nilfs2/sufile.h
new file mode 100644 (file)
index 0000000..d595f33
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * sufile.h - NILFS segment usage file.
+ *
+ * Copyright (C) 2006-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>.
+ */
+
+#ifndef _NILFS_SUFILE_H
+#define _NILFS_SUFILE_H
+
+#include <linux/fs.h>
+#include <linux/buffer_head.h>
+#include <linux/nilfs2_fs.h>
+#include "mdt.h"
+
+#define NILFS_SUFILE_GFP       NILFS_MDT_GFP
+
+static inline unsigned long nilfs_sufile_get_nsegments(struct inode *sufile)
+{
+       return NILFS_MDT(sufile)->mi_nilfs->ns_nsegments;
+}
+
+int nilfs_sufile_alloc(struct inode *, __u64 *);
+int nilfs_sufile_cancel_free(struct inode *, __u64);
+int nilfs_sufile_freev(struct inode *, __u64 *, size_t);
+int nilfs_sufile_free(struct inode *, __u64);
+int nilfs_sufile_get_segment_usage(struct inode *, __u64,
+                                  struct nilfs_segment_usage **,
+                                  struct buffer_head **);
+void nilfs_sufile_put_segment_usage(struct inode *, __u64,
+                                   struct buffer_head *);
+int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *);
+int nilfs_sufile_get_ncleansegs(struct inode *, unsigned long *);
+int nilfs_sufile_set_error(struct inode *, __u64);
+ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, struct nilfs_suinfo *,
+                               size_t);
+
+
+#endif /* _NILFS_SUFILE_H */
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
new file mode 100644 (file)
index 0000000..e117e1e
--- /dev/null
@@ -0,0 +1,1323 @@
+/*
+ * super.c - NILFS module and super block management.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ */
+/*
+ *  linux/fs/ext2/super.c
+ *
+ * Copyright (C) 1992, 1993, 1994, 1995
+ * Remy Card (card@masi.ibp.fr)
+ * Laboratoire MASI - Institut Blaise Pascal
+ * Universite Pierre et Marie Curie (Paris VI)
+ *
+ *  from
+ *
+ *  linux/fs/minix/inode.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ *  Big-endian to little-endian byte-swapping/bitmaps by
+ *        David S. Miller (davem@caip.rutgers.edu), 1995
+ */
+
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/parser.h>
+#include <linux/random.h>
+#include <linux/crc32.h>
+#include <linux/smp_lock.h>
+#include <linux/vfs.h>
+#include <linux/writeback.h>
+#include <linux/kobject.h>
+#include <linux/exportfs.h>
+#include "nilfs.h"
+#include "mdt.h"
+#include "alloc.h"
+#include "page.h"
+#include "cpfile.h"
+#include "ifile.h"
+#include "dat.h"
+#include "segment.h"
+#include "segbuf.h"
+
+MODULE_AUTHOR("NTT Corp.");
+MODULE_DESCRIPTION("A New Implementation of the Log-structured Filesystem "
+                  "(NILFS)");
+MODULE_VERSION(NILFS_VERSION);
+MODULE_LICENSE("GPL");
+
+static int nilfs_remount(struct super_block *sb, int *flags, char *data);
+static int test_exclusive_mount(struct file_system_type *fs_type,
+                               struct block_device *bdev, int flags);
+
+/**
+ * nilfs_error() - report failure condition on a filesystem
+ *
+ * nilfs_error() sets an ERROR_FS flag on the superblock as well as
+ * reporting an error message.  It should be called when NILFS detects
+ * incoherences or defects of meta data on disk.  As for sustainable
+ * errors such as a single-shot I/O error, nilfs_warning() or the printk()
+ * function should be used instead.
+ *
+ * The segment constructor must not call this function because it can
+ * kill itself.
+ */
+void nilfs_error(struct super_block *sb, const char *function,
+                const char *fmt, ...)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       va_list args;
+
+       va_start(args, fmt);
+       printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function);
+       vprintk(fmt, args);
+       printk("\n");
+       va_end(args);
+
+       if (!(sb->s_flags & MS_RDONLY)) {
+               struct the_nilfs *nilfs = sbi->s_nilfs;
+
+               if (!nilfs_test_opt(sbi, ERRORS_CONT))
+                       nilfs_detach_segment_constructor(sbi);
+
+               down_write(&nilfs->ns_sem);
+               if (!(nilfs->ns_mount_state & NILFS_ERROR_FS)) {
+                       nilfs->ns_mount_state |= NILFS_ERROR_FS;
+                       nilfs->ns_sbp[0]->s_state |=
+                               cpu_to_le16(NILFS_ERROR_FS);
+                       nilfs_commit_super(sbi, 1);
+               }
+               up_write(&nilfs->ns_sem);
+
+               if (nilfs_test_opt(sbi, ERRORS_RO)) {
+                       printk(KERN_CRIT "Remounting filesystem read-only\n");
+                       sb->s_flags |= MS_RDONLY;
+               }
+       }
+
+       if (nilfs_test_opt(sbi, ERRORS_PANIC))
+               panic("NILFS (device %s): panic forced after error\n",
+                     sb->s_id);
+}
+
+void nilfs_warning(struct super_block *sb, const char *function,
+                  const char *fmt, ...)
+{
+       va_list args;
+
+       va_start(args, fmt);
+       printk(KERN_WARNING "NILFS warning (device %s): %s: ",
+              sb->s_id, function);
+       vprintk(fmt, args);
+       printk("\n");
+       va_end(args);
+}
+
+static struct kmem_cache *nilfs_inode_cachep;
+
+struct inode *nilfs_alloc_inode(struct super_block *sb)
+{
+       struct nilfs_inode_info *ii;
+
+       ii = kmem_cache_alloc(nilfs_inode_cachep, GFP_NOFS);
+       if (!ii)
+               return NULL;
+       ii->i_bh = NULL;
+       ii->i_state = 0;
+       ii->vfs_inode.i_version = 1;
+       nilfs_btnode_cache_init(&ii->i_btnode_cache);
+       return &ii->vfs_inode;
+}
+
+void nilfs_destroy_inode(struct inode *inode)
+{
+       kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode));
+}
+
+static void init_once(void *obj)
+{
+       struct nilfs_inode_info *ii = obj;
+
+       INIT_LIST_HEAD(&ii->i_dirty);
+#ifdef CONFIG_NILFS_XATTR
+       init_rwsem(&ii->xattr_sem);
+#endif
+       nilfs_btnode_cache_init_once(&ii->i_btnode_cache);
+       ii->i_bmap = (struct nilfs_bmap *)&ii->i_bmap_union;
+       inode_init_once(&ii->vfs_inode);
+}
+
+static int nilfs_init_inode_cache(void)
+{
+       nilfs_inode_cachep = kmem_cache_create("nilfs2_inode_cache",
+                                              sizeof(struct nilfs_inode_info),
+                                              0, SLAB_RECLAIM_ACCOUNT,
+                                              init_once);
+
+       return (nilfs_inode_cachep == NULL) ? -ENOMEM : 0;
+}
+
+static inline void nilfs_destroy_inode_cache(void)
+{
+       kmem_cache_destroy(nilfs_inode_cachep);
+}
+
+static void nilfs_clear_inode(struct inode *inode)
+{
+       struct nilfs_inode_info *ii = NILFS_I(inode);
+
+#ifdef CONFIG_NILFS_POSIX_ACL
+       if (ii->i_acl && ii->i_acl != NILFS_ACL_NOT_CACHED) {
+               posix_acl_release(ii->i_acl);
+               ii->i_acl = NILFS_ACL_NOT_CACHED;
+       }
+       if (ii->i_default_acl && ii->i_default_acl != NILFS_ACL_NOT_CACHED) {
+               posix_acl_release(ii->i_default_acl);
+               ii->i_default_acl = NILFS_ACL_NOT_CACHED;
+       }
+#endif
+       /*
+        * Free resources allocated in nilfs_read_inode(), here.
+        */
+       BUG_ON(!list_empty(&ii->i_dirty));
+       brelse(ii->i_bh);
+       ii->i_bh = NULL;
+
+       if (test_bit(NILFS_I_BMAP, &ii->i_state))
+               nilfs_bmap_clear(ii->i_bmap);
+
+       nilfs_btnode_cache_clear(&ii->i_btnode_cache);
+}
+
+static int nilfs_sync_super(struct nilfs_sb_info *sbi, int dupsb)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       int err;
+       int barrier_done = 0;
+
+       if (nilfs_test_opt(sbi, BARRIER)) {
+               set_buffer_ordered(nilfs->ns_sbh[0]);
+               barrier_done = 1;
+       }
+ retry:
+       set_buffer_dirty(nilfs->ns_sbh[0]);
+       err = sync_dirty_buffer(nilfs->ns_sbh[0]);
+       if (err == -EOPNOTSUPP && barrier_done) {
+               nilfs_warning(sbi->s_super, __func__,
+                             "barrier-based sync failed. "
+                             "disabling barriers\n");
+               nilfs_clear_opt(sbi, BARRIER);
+               barrier_done = 0;
+               clear_buffer_ordered(nilfs->ns_sbh[0]);
+               goto retry;
+       }
+       if (unlikely(err)) {
+               printk(KERN_ERR
+                      "NILFS: unable to write superblock (err=%d)\n", err);
+               if (err == -EIO && nilfs->ns_sbh[1]) {
+                       nilfs_fall_back_super_block(nilfs);
+                       goto retry;
+               }
+       } else {
+               struct nilfs_super_block *sbp = nilfs->ns_sbp[0];
+
+               /*
+                * The latest segment becomes trailable from the position
+                * written in superblock.
+                */
+               clear_nilfs_discontinued(nilfs);
+
+               /* update GC protection for recent segments */
+               if (nilfs->ns_sbh[1]) {
+                       sbp = NULL;
+                       if (dupsb) {
+                               set_buffer_dirty(nilfs->ns_sbh[1]);
+                               if (!sync_dirty_buffer(nilfs->ns_sbh[1]))
+                                       sbp = nilfs->ns_sbp[1];
+                       }
+               }
+               if (sbp) {
+                       spin_lock(&nilfs->ns_last_segment_lock);
+                       nilfs->ns_prot_seq = le64_to_cpu(sbp->s_last_seq);
+                       spin_unlock(&nilfs->ns_last_segment_lock);
+               }
+       }
+
+       return err;
+}
+
+int nilfs_commit_super(struct nilfs_sb_info *sbi, int dupsb)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct nilfs_super_block **sbp = nilfs->ns_sbp;
+       sector_t nfreeblocks;
+       time_t t;
+       int err;
+
+       /* nilfs->sem must be locked by the caller. */
+       if (sbp[0]->s_magic != NILFS_SUPER_MAGIC) {
+               if (sbp[1] && sbp[1]->s_magic == NILFS_SUPER_MAGIC)
+                       nilfs_swap_super_block(nilfs);
+               else {
+                       printk(KERN_CRIT "NILFS: superblock broke on dev %s\n",
+                              sbi->s_super->s_id);
+                       return -EIO;
+               }
+       }
+       err = nilfs_count_free_blocks(nilfs, &nfreeblocks);
+       if (unlikely(err)) {
+               printk(KERN_ERR "NILFS: failed to count free blocks\n");
+               return err;
+       }
+       spin_lock(&nilfs->ns_last_segment_lock);
+       sbp[0]->s_last_seq = cpu_to_le64(nilfs->ns_last_seq);
+       sbp[0]->s_last_pseg = cpu_to_le64(nilfs->ns_last_pseg);
+       sbp[0]->s_last_cno = cpu_to_le64(nilfs->ns_last_cno);
+       spin_unlock(&nilfs->ns_last_segment_lock);
+
+       t = get_seconds();
+       nilfs->ns_sbwtime[0] = t;
+       sbp[0]->s_free_blocks_count = cpu_to_le64(nfreeblocks);
+       sbp[0]->s_wtime = cpu_to_le64(t);
+       sbp[0]->s_sum = 0;
+       sbp[0]->s_sum = cpu_to_le32(crc32_le(nilfs->ns_crc_seed,
+                                            (unsigned char *)sbp[0],
+                                            nilfs->ns_sbsize));
+       if (dupsb && sbp[1]) {
+               memcpy(sbp[1], sbp[0], nilfs->ns_sbsize);
+               nilfs->ns_sbwtime[1] = t;
+       }
+       sbi->s_super->s_dirt = 0;
+       return nilfs_sync_super(sbi, dupsb);
+}
+
+static void nilfs_put_super(struct super_block *sb)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+
+       nilfs_detach_segment_constructor(sbi);
+
+       if (!(sb->s_flags & MS_RDONLY)) {
+               down_write(&nilfs->ns_sem);
+               nilfs->ns_sbp[0]->s_state = cpu_to_le16(nilfs->ns_mount_state);
+               nilfs_commit_super(sbi, 1);
+               up_write(&nilfs->ns_sem);
+       }
+
+       nilfs_detach_checkpoint(sbi);
+       put_nilfs(sbi->s_nilfs);
+       sbi->s_super = NULL;
+       sb->s_fs_info = NULL;
+       kfree(sbi);
+}
+
+/**
+ * nilfs_write_super - write super block(s) of NILFS
+ * @sb: super_block
+ *
+ * nilfs_write_super() gets a fs-dependent lock, writes super block(s), and
+ * clears s_dirt.  This function is called in the section protected by
+ * lock_super().
+ *
+ * The s_dirt flag is managed by each filesystem and we protect it by ns_sem
+ * of the struct the_nilfs.  Lock order must be as follows:
+ *
+ *   1. lock_super()
+ *   2.    down_write(&nilfs->ns_sem)
+ *
+ * Inside NILFS, locking ns_sem is enough to protect s_dirt and the buffer
+ * of the super block (nilfs->ns_sbp[]).
+ *
+ * In most cases, VFS functions call lock_super() before calling these
+ * methods.  So we must be careful not to bring on deadlocks when using
+ * lock_super();  see generic_shutdown_super(), write_super(), and so on.
+ *
+ * Note that order of lock_kernel() and lock_super() depends on contexts
+ * of VFS.  We should also note that lock_kernel() can be used in its
+ * protective section and only the outermost one has an effect.
+ */
+static void nilfs_write_super(struct super_block *sb)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+
+       down_write(&nilfs->ns_sem);
+       if (!(sb->s_flags & MS_RDONLY)) {
+               struct nilfs_super_block **sbp = nilfs->ns_sbp;
+               u64 t = get_seconds();
+               int dupsb;
+
+               if (!nilfs_discontinued(nilfs) && t >= nilfs->ns_sbwtime[0] &&
+                   t < nilfs->ns_sbwtime[0] + NILFS_SB_FREQ) {
+                       up_write(&nilfs->ns_sem);
+                       return;
+               }
+               dupsb = sbp[1] && t > nilfs->ns_sbwtime[1] + NILFS_ALTSB_FREQ;
+               nilfs_commit_super(sbi, dupsb);
+       }
+       sb->s_dirt = 0;
+       up_write(&nilfs->ns_sem);
+}
+
+static int nilfs_sync_fs(struct super_block *sb, int wait)
+{
+       int err = 0;
+
+       /* This function is called when super block should be written back */
+       if (wait)
+               err = nilfs_construct_segment(sb);
+       return err;
+}
+
+int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct nilfs_checkpoint *raw_cp;
+       struct buffer_head *bh_cp;
+       int err;
+
+       down_write(&nilfs->ns_sem);
+       list_add(&sbi->s_list, &nilfs->ns_supers);
+       up_write(&nilfs->ns_sem);
+
+       sbi->s_ifile = nilfs_mdt_new(
+               nilfs, sbi->s_super, NILFS_IFILE_INO, NILFS_IFILE_GFP);
+       if (!sbi->s_ifile)
+               return -ENOMEM;
+
+       err = nilfs_palloc_init_blockgroup(sbi->s_ifile, nilfs->ns_inode_size);
+       if (unlikely(err))
+               goto failed;
+
+       err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, cno, 0, &raw_cp,
+                                         &bh_cp);
+       if (unlikely(err)) {
+               if (err == -ENOENT || err == -EINVAL) {
+                       printk(KERN_ERR
+                              "NILFS: Invalid checkpoint "
+                              "(checkpoint number=%llu)\n",
+                              (unsigned long long)cno);
+                       err = -EINVAL;
+               }
+               goto failed;
+       }
+       err = nilfs_read_inode_common(sbi->s_ifile, &raw_cp->cp_ifile_inode);
+       if (unlikely(err))
+               goto failed_bh;
+       atomic_set(&sbi->s_inodes_count, le64_to_cpu(raw_cp->cp_inodes_count));
+       atomic_set(&sbi->s_blocks_count, le64_to_cpu(raw_cp->cp_blocks_count));
+
+       nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp);
+       return 0;
+
+ failed_bh:
+       nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp);
+ failed:
+       nilfs_mdt_destroy(sbi->s_ifile);
+       sbi->s_ifile = NULL;
+
+       down_write(&nilfs->ns_sem);
+       list_del_init(&sbi->s_list);
+       up_write(&nilfs->ns_sem);
+
+       return err;
+}
+
+void nilfs_detach_checkpoint(struct nilfs_sb_info *sbi)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+
+       nilfs_mdt_clear(sbi->s_ifile);
+       nilfs_mdt_destroy(sbi->s_ifile);
+       sbi->s_ifile = NULL;
+       down_write(&nilfs->ns_sem);
+       list_del_init(&sbi->s_list);
+       up_write(&nilfs->ns_sem);
+}
+
+static int nilfs_mark_recovery_complete(struct nilfs_sb_info *sbi)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       int err = 0;
+
+       down_write(&nilfs->ns_sem);
+       if (!(nilfs->ns_mount_state & NILFS_VALID_FS)) {
+               nilfs->ns_mount_state |= NILFS_VALID_FS;
+               err = nilfs_commit_super(sbi, 1);
+               if (likely(!err))
+                       printk(KERN_INFO "NILFS: recovery complete.\n");
+       }
+       up_write(&nilfs->ns_sem);
+       return err;
+}
+
+static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf)
+{
+       struct super_block *sb = dentry->d_sb;
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       unsigned long long blocks;
+       unsigned long overhead;
+       unsigned long nrsvblocks;
+       sector_t nfreeblocks;
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       int err;
+
+       /*
+        * Compute all of the segment blocks
+        *
+        * The blocks before first segment and after last segment
+        * are excluded.
+        */
+       blocks = nilfs->ns_blocks_per_segment * nilfs->ns_nsegments
+               - nilfs->ns_first_data_block;
+       nrsvblocks = nilfs->ns_nrsvsegs * nilfs->ns_blocks_per_segment;
+
+       /*
+        * Compute the overhead
+        *
+        * When distributing meta data blocks outside semgent structure,
+        * We must count them as the overhead.
+        */
+       overhead = 0;
+
+       err = nilfs_count_free_blocks(nilfs, &nfreeblocks);
+       if (unlikely(err))
+               return err;
+
+       buf->f_type = NILFS_SUPER_MAGIC;
+       buf->f_bsize = sb->s_blocksize;
+       buf->f_blocks = blocks - overhead;
+       buf->f_bfree = nfreeblocks;
+       buf->f_bavail = (buf->f_bfree >= nrsvblocks) ?
+               (buf->f_bfree - nrsvblocks) : 0;
+       buf->f_files = atomic_read(&sbi->s_inodes_count);
+       buf->f_ffree = 0; /* nilfs_count_free_inodes(sb); */
+       buf->f_namelen = NILFS_NAME_LEN;
+       return 0;
+}
+
+static struct super_operations nilfs_sops = {
+       .alloc_inode    = nilfs_alloc_inode,
+       .destroy_inode  = nilfs_destroy_inode,
+       .dirty_inode    = nilfs_dirty_inode,
+       /* .write_inode    = nilfs_write_inode, */
+       /* .put_inode      = nilfs_put_inode, */
+       /* .drop_inode    = nilfs_drop_inode, */
+       .delete_inode   = nilfs_delete_inode,
+       .put_super      = nilfs_put_super,
+       .write_super    = nilfs_write_super,
+       .sync_fs        = nilfs_sync_fs,
+       /* .write_super_lockfs */
+       /* .unlockfs */
+       .statfs         = nilfs_statfs,
+       .remount_fs     = nilfs_remount,
+       .clear_inode    = nilfs_clear_inode,
+       /* .umount_begin */
+       /* .show_options */
+};
+
+static struct inode *
+nilfs_nfs_get_inode(struct super_block *sb, u64 ino, u32 generation)
+{
+       struct inode *inode;
+
+       if (ino < NILFS_FIRST_INO(sb) && ino != NILFS_ROOT_INO &&
+           ino != NILFS_SKETCH_INO)
+               return ERR_PTR(-ESTALE);
+
+       inode = nilfs_iget(sb, ino);
+       if (IS_ERR(inode))
+               return ERR_CAST(inode);
+       if (generation && inode->i_generation != generation) {
+               iput(inode);
+               return ERR_PTR(-ESTALE);
+       }
+
+       return inode;
+}
+
+static struct dentry *
+nilfs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len,
+                  int fh_type)
+{
+       return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
+                                   nilfs_nfs_get_inode);
+}
+
+static struct dentry *
+nilfs_fh_to_parent(struct super_block *sb, struct fid *fid, int fh_len,
+                  int fh_type)
+{
+       return generic_fh_to_parent(sb, fid, fh_len, fh_type,
+                                   nilfs_nfs_get_inode);
+}
+
+static struct export_operations nilfs_export_ops = {
+       .fh_to_dentry = nilfs_fh_to_dentry,
+       .fh_to_parent = nilfs_fh_to_parent,
+       .get_parent = nilfs_get_parent,
+};
+
+enum {
+       Opt_err_cont, Opt_err_panic, Opt_err_ro,
+       Opt_barrier, Opt_snapshot, Opt_order,
+       Opt_err,
+};
+
+static match_table_t tokens = {
+       {Opt_err_cont, "errors=continue"},
+       {Opt_err_panic, "errors=panic"},
+       {Opt_err_ro, "errors=remount-ro"},
+       {Opt_barrier, "barrier=%s"},
+       {Opt_snapshot, "cp=%u"},
+       {Opt_order, "order=%s"},
+       {Opt_err, NULL}
+};
+
+static int match_bool(substring_t *s, int *result)
+{
+       int len = s->to - s->from;
+
+       if (strncmp(s->from, "on", len) == 0)
+               *result = 1;
+       else if (strncmp(s->from, "off", len) == 0)
+               *result = 0;
+       else
+               return 1;
+       return 0;
+}
+
+static int parse_options(char *options, struct super_block *sb)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       char *p;
+       substring_t args[MAX_OPT_ARGS];
+       int option;
+
+       if (!options)
+               return 1;
+
+       while ((p = strsep(&options, ",")) != NULL) {
+               int token;
+               if (!*p)
+                       continue;
+
+               token = match_token(p, tokens, args);
+               switch (token) {
+               case Opt_barrier:
+                       if (match_bool(&args[0], &option))
+                               return 0;
+                       if (option)
+                               nilfs_set_opt(sbi, BARRIER);
+                       else
+                               nilfs_clear_opt(sbi, BARRIER);
+                       break;
+               case Opt_order:
+                       if (strcmp(args[0].from, "relaxed") == 0)
+                               /* Ordered data semantics */
+                               nilfs_clear_opt(sbi, STRICT_ORDER);
+                       else if (strcmp(args[0].from, "strict") == 0)
+                               /* Strict in-order semantics */
+                               nilfs_set_opt(sbi, STRICT_ORDER);
+                       else
+                               return 0;
+                       break;
+               case Opt_err_panic:
+                       nilfs_write_opt(sbi, ERROR_MODE, ERRORS_PANIC);
+                       break;
+               case Opt_err_ro:
+                       nilfs_write_opt(sbi, ERROR_MODE, ERRORS_RO);
+                       break;
+               case Opt_err_cont:
+                       nilfs_write_opt(sbi, ERROR_MODE, ERRORS_CONT);
+                       break;
+               case Opt_snapshot:
+                       if (match_int(&args[0], &option) || option <= 0)
+                               return 0;
+                       if (!(sb->s_flags & MS_RDONLY))
+                               return 0;
+                       sbi->s_snapshot_cno = option;
+                       nilfs_set_opt(sbi, SNAPSHOT);
+                       break;
+               default:
+                       printk(KERN_ERR
+                              "NILFS: Unrecognized mount option \"%s\"\n", p);
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+static inline void
+nilfs_set_default_options(struct nilfs_sb_info *sbi,
+                         struct nilfs_super_block *sbp)
+{
+       sbi->s_mount_opt =
+               NILFS_MOUNT_ERRORS_CONT | NILFS_MOUNT_BARRIER;
+}
+
+static int nilfs_setup_super(struct nilfs_sb_info *sbi)
+{
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       struct nilfs_super_block *sbp = nilfs->ns_sbp[0];
+       int max_mnt_count = le16_to_cpu(sbp->s_max_mnt_count);
+       int mnt_count = le16_to_cpu(sbp->s_mnt_count);
+
+       /* nilfs->sem must be locked by the caller. */
+       if (!(nilfs->ns_mount_state & NILFS_VALID_FS)) {
+               printk(KERN_WARNING "NILFS warning: mounting unchecked fs\n");
+       } else if (nilfs->ns_mount_state & NILFS_ERROR_FS) {
+               printk(KERN_WARNING
+                      "NILFS warning: mounting fs with errors\n");
+#if 0
+       } else if (max_mnt_count >= 0 && mnt_count >= max_mnt_count) {
+               printk(KERN_WARNING
+                      "NILFS warning: maximal mount count reached\n");
+#endif
+       }
+       if (!max_mnt_count)
+               sbp->s_max_mnt_count = cpu_to_le16(NILFS_DFL_MAX_MNT_COUNT);
+
+       sbp->s_mnt_count = cpu_to_le16(mnt_count + 1);
+       sbp->s_state = cpu_to_le16(le16_to_cpu(sbp->s_state) & ~NILFS_VALID_FS);
+       sbp->s_mtime = cpu_to_le64(get_seconds());
+       return nilfs_commit_super(sbi, 1);
+}
+
+struct nilfs_super_block *nilfs_read_super_block(struct super_block *sb,
+                                                u64 pos, int blocksize,
+                                                struct buffer_head **pbh)
+{
+       unsigned long long sb_index = pos;
+       unsigned long offset;
+
+       offset = do_div(sb_index, blocksize);
+       *pbh = sb_bread(sb, sb_index);
+       if (!*pbh)
+               return NULL;
+       return (struct nilfs_super_block *)((char *)(*pbh)->b_data + offset);
+}
+
+int nilfs_store_magic_and_option(struct super_block *sb,
+                                struct nilfs_super_block *sbp,
+                                char *data)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+
+       sb->s_magic = le16_to_cpu(sbp->s_magic);
+
+       /* FS independent flags */
+#ifdef NILFS_ATIME_DISABLE
+       sb->s_flags |= MS_NOATIME;
+#endif
+
+       nilfs_set_default_options(sbi, sbp);
+
+       sbi->s_resuid = le16_to_cpu(sbp->s_def_resuid);
+       sbi->s_resgid = le16_to_cpu(sbp->s_def_resgid);
+       sbi->s_interval = le32_to_cpu(sbp->s_c_interval);
+       sbi->s_watermark = le32_to_cpu(sbp->s_c_block_max);
+
+       return !parse_options(data, sb) ? -EINVAL : 0 ;
+}
+
+/**
+ * nilfs_fill_super() - initialize a super block instance
+ * @sb: super_block
+ * @data: mount options
+ * @silent: silent mode flag
+ * @nilfs: the_nilfs struct
+ *
+ * This function is called exclusively by bd_mount_mutex.
+ * So, the recovery process is protected from other simultaneous mounts.
+ */
+static int
+nilfs_fill_super(struct super_block *sb, void *data, int silent,
+                struct the_nilfs *nilfs)
+{
+       struct nilfs_sb_info *sbi;
+       struct inode *root;
+       __u64 cno;
+       int err;
+
+       sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
+       if (!sbi)
+               return -ENOMEM;
+
+       sb->s_fs_info = sbi;
+
+       get_nilfs(nilfs);
+       sbi->s_nilfs = nilfs;
+       sbi->s_super = sb;
+
+       err = init_nilfs(nilfs, sbi, (char *)data);
+       if (err)
+               goto failed_sbi;
+
+       spin_lock_init(&sbi->s_inode_lock);
+       INIT_LIST_HEAD(&sbi->s_dirty_files);
+       INIT_LIST_HEAD(&sbi->s_list);
+
+       /*
+        * Following initialization is overlapped because
+        * nilfs_sb_info structure has been cleared at the beginning.
+        * But we reserve them to keep our interest and make ready
+        * for the future change.
+        */
+       get_random_bytes(&sbi->s_next_generation,
+                        sizeof(sbi->s_next_generation));
+       spin_lock_init(&sbi->s_next_gen_lock);
+
+       sb->s_op = &nilfs_sops;
+       sb->s_export_op = &nilfs_export_ops;
+       sb->s_root = NULL;
+       sb->s_time_gran = 1;
+
+       if (!nilfs_loaded(nilfs)) {
+               err = load_nilfs(nilfs, sbi);
+               if (err)
+                       goto failed_sbi;
+       }
+       cno = nilfs_last_cno(nilfs);
+
+       if (sb->s_flags & MS_RDONLY) {
+               if (nilfs_test_opt(sbi, SNAPSHOT)) {
+                       err = nilfs_cpfile_is_snapshot(nilfs->ns_cpfile,
+                                                      sbi->s_snapshot_cno);
+                       if (err < 0)
+                               goto failed_sbi;
+                       if (!err) {
+                               printk(KERN_ERR
+                                      "NILFS: The specified checkpoint is "
+                                      "not a snapshot "
+                                      "(checkpoint number=%llu).\n",
+                                      (unsigned long long)sbi->s_snapshot_cno);
+                               err = -EINVAL;
+                               goto failed_sbi;
+                       }
+                       cno = sbi->s_snapshot_cno;
+               } else
+                       /* Read-only mount */
+                       sbi->s_snapshot_cno = cno;
+       }
+
+       err = nilfs_attach_checkpoint(sbi, cno);
+       if (err) {
+               printk(KERN_ERR "NILFS: error loading a checkpoint"
+                      " (checkpoint number=%llu).\n", (unsigned long long)cno);
+               goto failed_sbi;
+       }
+
+       if (!(sb->s_flags & MS_RDONLY)) {
+               err = nilfs_attach_segment_constructor(sbi);
+               if (err)
+                       goto failed_checkpoint;
+       }
+
+       root = nilfs_iget(sb, NILFS_ROOT_INO);
+       if (IS_ERR(root)) {
+               printk(KERN_ERR "NILFS: get root inode failed\n");
+               err = PTR_ERR(root);
+               goto failed_segctor;
+       }
+       if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
+               iput(root);
+               printk(KERN_ERR "NILFS: corrupt root inode.\n");
+               err = -EINVAL;
+               goto failed_segctor;
+       }
+       sb->s_root = d_alloc_root(root);
+       if (!sb->s_root) {
+               iput(root);
+               printk(KERN_ERR "NILFS: get root dentry failed\n");
+               err = -ENOMEM;
+               goto failed_segctor;
+       }
+
+       if (!(sb->s_flags & MS_RDONLY)) {
+               down_write(&nilfs->ns_sem);
+               nilfs_setup_super(sbi);
+               up_write(&nilfs->ns_sem);
+       }
+
+       err = nilfs_mark_recovery_complete(sbi);
+       if (unlikely(err)) {
+               printk(KERN_ERR "NILFS: recovery failed.\n");
+               goto failed_root;
+       }
+
+       return 0;
+
+ failed_root:
+       dput(sb->s_root);
+       sb->s_root = NULL;
+
+ failed_segctor:
+       nilfs_detach_segment_constructor(sbi);
+
+ failed_checkpoint:
+       nilfs_detach_checkpoint(sbi);
+
+ failed_sbi:
+       put_nilfs(nilfs);
+       sb->s_fs_info = NULL;
+       kfree(sbi);
+       return err;
+}
+
+static int nilfs_remount(struct super_block *sb, int *flags, char *data)
+{
+       struct nilfs_sb_info *sbi = NILFS_SB(sb);
+       struct nilfs_super_block *sbp;
+       struct the_nilfs *nilfs = sbi->s_nilfs;
+       unsigned long old_sb_flags;
+       struct nilfs_mount_options old_opts;
+       int err;
+
+       old_sb_flags = sb->s_flags;
+       old_opts.mount_opt = sbi->s_mount_opt;
+       old_opts.snapshot_cno = sbi->s_snapshot_cno;
+
+       if (!parse_options(data, sb)) {
+               err = -EINVAL;
+               goto restore_opts;
+       }
+       sb->s_flags = (sb->s_flags & ~MS_POSIXACL);
+
+       if ((*flags & MS_RDONLY) &&
+           sbi->s_snapshot_cno != old_opts.snapshot_cno) {
+               printk(KERN_WARNING "NILFS (device %s): couldn't "
+                      "remount to a different snapshot. \n",
+                      sb->s_id);
+               err = -EINVAL;
+               goto restore_opts;
+       }
+
+       if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+               goto out;
+       if (*flags & MS_RDONLY) {
+               /* Shutting down the segment constructor */
+               nilfs_detach_segment_constructor(sbi);
+               sb->s_flags |= MS_RDONLY;
+
+               sbi->s_snapshot_cno = nilfs_last_cno(nilfs);
+               /* nilfs_set_opt(sbi, SNAPSHOT); */
+
+               /*
+                * Remounting a valid RW partition RDONLY, so set
+                * the RDONLY flag and then mark the partition as valid again.
+                */
+               down_write(&nilfs->ns_sem);
+               sbp = nilfs->ns_sbp[0];
+               if (!(sbp->s_state & le16_to_cpu(NILFS_VALID_FS)) &&
+                   (nilfs->ns_mount_state & NILFS_VALID_FS))
+                       sbp->s_state = cpu_to_le16(nilfs->ns_mount_state);
+               sbp->s_mtime = cpu_to_le64(get_seconds());
+               nilfs_commit_super(sbi, 1);
+               up_write(&nilfs->ns_sem);
+       } else {
+               /*
+                * Mounting a RDONLY partition read-write, so reread and
+                * store the current valid flag.  (It may have been changed
+                * by fsck since we originally mounted the partition.)
+                */
+               down(&sb->s_bdev->bd_mount_sem);
+               /* Check existing RW-mount */
+               if (test_exclusive_mount(sb->s_type, sb->s_bdev, 0)) {
+                       printk(KERN_WARNING "NILFS (device %s): couldn't "
+                              "remount because a RW-mount exists.\n",
+                              sb->s_id);
+                       err = -EBUSY;
+                       goto rw_remount_failed;
+               }
+               if (sbi->s_snapshot_cno != nilfs_last_cno(nilfs)) {
+                       printk(KERN_WARNING "NILFS (device %s): couldn't "
+                              "remount because the current RO-mount is not "
+                              "the latest one.\n",
+                              sb->s_id);
+                       err = -EINVAL;
+                       goto rw_remount_failed;
+               }
+               sb->s_flags &= ~MS_RDONLY;
+               nilfs_clear_opt(sbi, SNAPSHOT);
+               sbi->s_snapshot_cno = 0;
+
+               err = nilfs_attach_segment_constructor(sbi);
+               if (err)
+                       goto rw_remount_failed;
+
+               down_write(&nilfs->ns_sem);
+               nilfs_setup_super(sbi);
+               up_write(&nilfs->ns_sem);
+
+               up(&sb->s_bdev->bd_mount_sem);
+       }
+ out:
+       return 0;
+
+ rw_remount_failed:
+       up(&sb->s_bdev->bd_mount_sem);
+ restore_opts:
+       sb->s_flags = old_sb_flags;
+       sbi->s_mount_opt = old_opts.mount_opt;
+       sbi->s_snapshot_cno = old_opts.snapshot_cno;
+       return err;
+}
+
+struct nilfs_super_data {
+       struct block_device *bdev;
+       __u64 cno;
+       int flags;
+};
+
+/**
+ * nilfs_identify - pre-read mount options needed to identify mount instance
+ * @data: mount options
+ * @sd: nilfs_super_data
+ */
+static int nilfs_identify(char *data, struct nilfs_super_data *sd)
+{
+       char *p, *options = data;
+       substring_t args[MAX_OPT_ARGS];
+       int option, token;
+       int ret = 0;
+
+       do {
+               p = strsep(&options, ",");
+               if (p != NULL && *p) {
+                       token = match_token(p, tokens, args);
+                       if (token == Opt_snapshot) {
+                               if (!(sd->flags & MS_RDONLY))
+                                       ret++;
+                               else {
+                                       ret = match_int(&args[0], &option);
+                                       if (!ret) {
+                                               if (option > 0)
+                                                       sd->cno = option;
+                                               else
+                                                       ret++;
+                                       }
+                               }
+                       }
+                       if (ret)
+                               printk(KERN_ERR
+                                      "NILFS: invalid mount option: %s\n", p);
+               }
+               if (!options)
+                       break;
+               BUG_ON(options == data);
+               *(options - 1) = ',';
+       } while (!ret);
+       return ret;
+}
+
+static int nilfs_set_bdev_super(struct super_block *s, void *data)
+{
+       struct nilfs_super_data *sd = data;
+
+       s->s_bdev = sd->bdev;
+       s->s_dev = s->s_bdev->bd_dev;
+       return 0;
+}
+
+static int nilfs_test_bdev_super(struct super_block *s, void *data)
+{
+       struct nilfs_super_data *sd = data;
+
+       return s->s_bdev == sd->bdev;
+}
+
+static int nilfs_test_bdev_super2(struct super_block *s, void *data)
+{
+       struct nilfs_super_data *sd = data;
+       int ret;
+
+       if (s->s_bdev != sd->bdev)
+               return 0;
+
+       if (!((s->s_flags | sd->flags) & MS_RDONLY))
+               return 1; /* Reuse an old R/W-mode super_block */
+
+       if (s->s_flags & sd->flags & MS_RDONLY) {
+               if (down_read_trylock(&s->s_umount)) {
+                       ret = s->s_root &&
+                               (sd->cno == NILFS_SB(s)->s_snapshot_cno);
+                       up_read(&s->s_umount);
+                       /*
+                        * This path is locked with sb_lock by sget().
+                        * So, drop_super() causes deadlock.
+                        */
+                       return ret;
+               }
+       }
+       return 0;
+}
+
+static int
+nilfs_get_sb(struct file_system_type *fs_type, int flags,
+            const char *dev_name, void *data, struct vfsmount *mnt)
+{
+       struct nilfs_super_data sd;
+       struct super_block *s, *s2;
+       struct the_nilfs *nilfs = NULL;
+       int err, need_to_close = 1;
+
+       sd.bdev = open_bdev_exclusive(dev_name, flags, fs_type);
+       if (IS_ERR(sd.bdev))
+               return PTR_ERR(sd.bdev);
+
+       /*
+        * To get mount instance using sget() vfs-routine, NILFS needs
+        * much more information than normal filesystems to identify mount
+        * instance.  For snapshot mounts, not only a mount type (ro-mount
+        * or rw-mount) but also a checkpoint number is required.
+        * The results are passed in sget() using nilfs_super_data.
+        */
+       sd.cno = 0;
+       sd.flags = flags;
+       if (nilfs_identify((char *)data, &sd)) {
+               err = -EINVAL;
+               goto failed;
+       }
+
+       /*
+        * once the super is inserted into the list by sget, s_umount
+        * will protect the lockfs code from trying to start a snapshot
+        * while we are mounting
+        */
+       down(&sd.bdev->bd_mount_sem);
+       if (!sd.cno &&
+           (err = test_exclusive_mount(fs_type, sd.bdev, flags ^ MS_RDONLY))) {
+               err = (err < 0) ? : -EBUSY;
+               goto failed_unlock;
+       }
+
+       /*
+        * Phase-1: search any existent instance and get the_nilfs
+        */
+       s = sget(fs_type, nilfs_test_bdev_super, nilfs_set_bdev_super, &sd);
+       if (IS_ERR(s))
+               goto error_s;
+
+       if (!s->s_root) {
+               err = -ENOMEM;
+               nilfs = alloc_nilfs(sd.bdev);
+               if (!nilfs)
+                       goto cancel_new;
+       } else {
+               struct nilfs_sb_info *sbi = NILFS_SB(s);
+
+               /*
+                * s_umount protects super_block from unmount process;
+                * It covers pointers of nilfs_sb_info and the_nilfs.
+                */
+               nilfs = sbi->s_nilfs;
+               get_nilfs(nilfs);
+               up_write(&s->s_umount);
+
+               /*
+                * Phase-2: search specified snapshot or R/W mode super_block
+                */
+               if (!sd.cno)
+                       /* trying to get the latest checkpoint.  */
+                       sd.cno = nilfs_last_cno(nilfs);
+
+               s2 = sget(fs_type, nilfs_test_bdev_super2,
+                         nilfs_set_bdev_super, &sd);
+               deactivate_super(s);
+               /*
+                * Although deactivate_super() invokes close_bdev_exclusive() at
+                * kill_block_super().  Here, s is an existent mount; we need
+                * one more close_bdev_exclusive() call.
+                */
+               s = s2;
+               if (IS_ERR(s))
+                       goto error_s;
+       }
+
+       if (!s->s_root) {
+               char b[BDEVNAME_SIZE];
+
+               s->s_flags = flags;
+               strlcpy(s->s_id, bdevname(sd.bdev, b), sizeof(s->s_id));
+               sb_set_blocksize(s, block_size(sd.bdev));
+
+               err = nilfs_fill_super(s, data, flags & MS_VERBOSE, nilfs);
+               if (err)
+                       goto cancel_new;
+
+               s->s_flags |= MS_ACTIVE;
+               need_to_close = 0;
+       } else if (!(s->s_flags & MS_RDONLY)) {
+               err = -EBUSY;
+       }
+
+       up(&sd.bdev->bd_mount_sem);
+       put_nilfs(nilfs);
+       if (need_to_close)
+               close_bdev_exclusive(sd.bdev, flags);
+       simple_set_mnt(mnt, s);
+       return 0;
+
+ error_s:
+       up(&sd.bdev->bd_mount_sem);
+       if (nilfs)
+               put_nilfs(nilfs);
+       close_bdev_exclusive(sd.bdev, flags);
+       return PTR_ERR(s);
+
+ failed_unlock:
+       up(&sd.bdev->bd_mount_sem);
+ failed:
+       close_bdev_exclusive(sd.bdev, flags);
+
+       return err;
+
+ cancel_new:
+       /* Abandoning the newly allocated superblock */
+       up(&sd.bdev->bd_mount_sem);
+       if (nilfs)
+               put_nilfs(nilfs);
+       up_write(&s->s_umount);
+       deactivate_super(s);
+       /*
+        * deactivate_super() invokes close_bdev_exclusive().
+        * We must finish all post-cleaning before this call;
+        * put_nilfs() and unlocking bd_mount_sem need the block device.
+        */
+       return err;
+}
+
+static int nilfs_test_bdev_super3(struct super_block *s, void *data)
+{
+       struct nilfs_super_data *sd = data;
+       int ret;
+
+       if (s->s_bdev != sd->bdev)
+               return 0;
+       if (down_read_trylock(&s->s_umount)) {
+               ret = (s->s_flags & MS_RDONLY) && s->s_root &&
+                       nilfs_test_opt(NILFS_SB(s), SNAPSHOT);
+               up_read(&s->s_umount);
+               if (ret)
+                       return 0; /* ignore snapshot mounts */
+       }
+       return !((sd->flags ^ s->s_flags) & MS_RDONLY);
+}
+
+static int __false_bdev_super(struct super_block *s, void *data)
+{
+#if 0 /* XXX: workaround for lock debug. This is not good idea */
+       up_write(&s->s_umount);
+#endif
+       return -EFAULT;
+}
+
+/**
+ * test_exclusive_mount - check whether an exclusive RW/RO mount exists or not.
+ * fs_type: filesystem type
+ * bdev: block device
+ * flag: 0 (check rw-mount) or MS_RDONLY (check ro-mount)
+ * res: pointer to an integer to store result
+ *
+ * This function must be called within a section protected by bd_mount_mutex.
+ */
+static int test_exclusive_mount(struct file_system_type *fs_type,
+                               struct block_device *bdev, int flags)
+{
+       struct super_block *s;
+       struct nilfs_super_data sd = { .flags = flags, .bdev = bdev };
+
+       s = sget(fs_type, nilfs_test_bdev_super3, __false_bdev_super, &sd);
+       if (IS_ERR(s)) {
+               if (PTR_ERR(s) != -EFAULT)
+                       return PTR_ERR(s);
+               return 0;  /* Not found */
+       }
+       up_write(&s->s_umount);
+       deactivate_super(s);
+       return 1;  /* Found */
+}
+
+struct file_system_type nilfs_fs_type = {
+       .owner    = THIS_MODULE,
+       .name     = "nilfs2",
+       .get_sb   = nilfs_get_sb,
+       .kill_sb  = kill_block_super,
+       .fs_flags = FS_REQUIRES_DEV,
+};
+
+static int __init init_nilfs_fs(void)
+{
+       int err;
+
+       err = nilfs_init_inode_cache();
+       if (err)
+               goto failed;
+
+       err = nilfs_init_transaction_cache();
+       if (err)
+               goto failed_inode_cache;
+
+       err = nilfs_init_segbuf_cache();
+       if (err)
+               goto failed_transaction_cache;
+
+       err = nilfs_btree_path_cache_init();
+       if (err)
+               goto failed_segbuf_cache;
+
+       err = register_filesystem(&nilfs_fs_type);
+       if (err)
+               goto failed_btree_path_cache;
+
+       return 0;
+
+ failed_btree_path_cache:
+       nilfs_btree_path_cache_destroy();
+
+ failed_segbuf_cache:
+       nilfs_destroy_segbuf_cache();
+
+ failed_transaction_cache:
+       nilfs_destroy_transaction_cache();
+
+ failed_inode_cache:
+       nilfs_destroy_inode_cache();
+
+ failed:
+       return err;
+}
+
+static void __exit exit_nilfs_fs(void)
+{
+       nilfs_destroy_segbuf_cache();
+       nilfs_destroy_transaction_cache();
+       nilfs_destroy_inode_cache();
+       nilfs_btree_path_cache_destroy();
+       unregister_filesystem(&nilfs_fs_type);
+}
+
+module_init(init_nilfs_fs)
+module_exit(exit_nilfs_fs)
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c
new file mode 100644 (file)
index 0000000..33400cf
--- /dev/null
@@ -0,0 +1,637 @@
+/*
+ * the_nilfs.c - the_nilfs shared structure.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+
+#include <linux/buffer_head.h>
+#include <linux/slab.h>
+#include <linux/blkdev.h>
+#include <linux/backing-dev.h>
+#include <linux/crc32.h>
+#include "nilfs.h"
+#include "segment.h"
+#include "alloc.h"
+#include "cpfile.h"
+#include "sufile.h"
+#include "dat.h"
+#include "seglist.h"
+#include "segbuf.h"
+
+void nilfs_set_last_segment(struct the_nilfs *nilfs,
+                           sector_t start_blocknr, u64 seq, __u64 cno)
+{
+       spin_lock(&nilfs->ns_last_segment_lock);
+       nilfs->ns_last_pseg = start_blocknr;
+       nilfs->ns_last_seq = seq;
+       nilfs->ns_last_cno = cno;
+       spin_unlock(&nilfs->ns_last_segment_lock);
+}
+
+/**
+ * alloc_nilfs - allocate the_nilfs structure
+ * @bdev: block device to which the_nilfs is related
+ *
+ * alloc_nilfs() allocates memory for the_nilfs and
+ * initializes its reference count and locks.
+ *
+ * Return Value: On success, pointer to the_nilfs is returned.
+ * On error, NULL is returned.
+ */
+struct the_nilfs *alloc_nilfs(struct block_device *bdev)
+{
+       struct the_nilfs *nilfs;
+
+       nilfs = kzalloc(sizeof(*nilfs), GFP_KERNEL);
+       if (!nilfs)
+               return NULL;
+
+       nilfs->ns_bdev = bdev;
+       atomic_set(&nilfs->ns_count, 1);
+       atomic_set(&nilfs->ns_writer_refcount, -1);
+       atomic_set(&nilfs->ns_ndirtyblks, 0);
+       init_rwsem(&nilfs->ns_sem);
+       mutex_init(&nilfs->ns_writer_mutex);
+       INIT_LIST_HEAD(&nilfs->ns_supers);
+       spin_lock_init(&nilfs->ns_last_segment_lock);
+       nilfs->ns_gc_inodes_h = NULL;
+       init_rwsem(&nilfs->ns_segctor_sem);
+
+       return nilfs;
+}
+
+/**
+ * put_nilfs - release a reference to the_nilfs
+ * @nilfs: the_nilfs structure to be released
+ *
+ * put_nilfs() decrements a reference counter of the_nilfs.
+ * If the reference count reaches zero, the_nilfs is freed.
+ */
+void put_nilfs(struct the_nilfs *nilfs)
+{
+       if (!atomic_dec_and_test(&nilfs->ns_count))
+               return;
+       /*
+        * Increment of ns_count never occur below because the caller
+        * of get_nilfs() holds at least one reference to the_nilfs.
+        * Thus its exclusion control is not required here.
+        */
+       might_sleep();
+       if (nilfs_loaded(nilfs)) {
+               nilfs_mdt_clear(nilfs->ns_sufile);
+               nilfs_mdt_destroy(nilfs->ns_sufile);
+               nilfs_mdt_clear(nilfs->ns_cpfile);
+               nilfs_mdt_destroy(nilfs->ns_cpfile);
+               nilfs_mdt_clear(nilfs->ns_dat);
+               nilfs_mdt_destroy(nilfs->ns_dat);
+               /* XXX: how and when to clear nilfs->ns_gc_dat? */
+               nilfs_mdt_destroy(nilfs->ns_gc_dat);
+       }
+       if (nilfs_init(nilfs)) {
+               nilfs_destroy_gccache(nilfs);
+               brelse(nilfs->ns_sbh[0]);
+               brelse(nilfs->ns_sbh[1]);
+       }
+       kfree(nilfs);
+}
+
+static int nilfs_load_super_root(struct the_nilfs *nilfs,
+                                struct nilfs_sb_info *sbi, sector_t sr_block)
+{
+       struct buffer_head *bh_sr;
+       struct nilfs_super_root *raw_sr;
+       struct nilfs_super_block **sbp = nilfs->ns_sbp;
+       unsigned dat_entry_size, segment_usage_size, checkpoint_size;
+       unsigned inode_size;
+       int err;
+
+       err = nilfs_read_super_root_block(sbi->s_super, sr_block, &bh_sr, 1);
+       if (unlikely(err))
+               return err;
+
+       down_read(&nilfs->ns_sem);
+       dat_entry_size = le16_to_cpu(sbp[0]->s_dat_entry_size);
+       checkpoint_size = le16_to_cpu(sbp[0]->s_checkpoint_size);
+       segment_usage_size = le16_to_cpu(sbp[0]->s_segment_usage_size);
+       up_read(&nilfs->ns_sem);
+
+       inode_size = nilfs->ns_inode_size;
+
+       err = -ENOMEM;
+       nilfs->ns_dat = nilfs_mdt_new(
+               nilfs, NULL, NILFS_DAT_INO, NILFS_DAT_GFP);
+       if (unlikely(!nilfs->ns_dat))
+               goto failed;
+
+       nilfs->ns_gc_dat = nilfs_mdt_new(
+               nilfs, NULL, NILFS_DAT_INO, NILFS_DAT_GFP);
+       if (unlikely(!nilfs->ns_gc_dat))
+               goto failed_dat;
+
+       nilfs->ns_cpfile = nilfs_mdt_new(
+               nilfs, NULL, NILFS_CPFILE_INO, NILFS_CPFILE_GFP);
+       if (unlikely(!nilfs->ns_cpfile))
+               goto failed_gc_dat;
+
+       nilfs->ns_sufile = nilfs_mdt_new(
+               nilfs, NULL, NILFS_SUFILE_INO, NILFS_SUFILE_GFP);
+       if (unlikely(!nilfs->ns_sufile))
+               goto failed_cpfile;
+
+       err = nilfs_palloc_init_blockgroup(nilfs->ns_dat, dat_entry_size);
+       if (unlikely(err))
+               goto failed_sufile;
+
+       err = nilfs_palloc_init_blockgroup(nilfs->ns_gc_dat, dat_entry_size);
+       if (unlikely(err))
+               goto failed_sufile;
+
+       nilfs_mdt_set_shadow(nilfs->ns_dat, nilfs->ns_gc_dat);
+       nilfs_mdt_set_entry_size(nilfs->ns_cpfile, checkpoint_size,
+                                sizeof(struct nilfs_cpfile_header));
+       nilfs_mdt_set_entry_size(nilfs->ns_sufile, segment_usage_size,
+                                sizeof(struct nilfs_sufile_header));
+
+       err = nilfs_mdt_read_inode_direct(
+               nilfs->ns_dat, bh_sr, NILFS_SR_DAT_OFFSET(inode_size));
+       if (unlikely(err))
+               goto failed_sufile;
+
+       err = nilfs_mdt_read_inode_direct(
+               nilfs->ns_cpfile, bh_sr, NILFS_SR_CPFILE_OFFSET(inode_size));
+       if (unlikely(err))
+               goto failed_sufile;
+
+       err = nilfs_mdt_read_inode_direct(
+               nilfs->ns_sufile, bh_sr, NILFS_SR_SUFILE_OFFSET(inode_size));
+       if (unlikely(err))
+               goto failed_sufile;
+
+       raw_sr = (struct nilfs_super_root *)bh_sr->b_data;
+       nilfs->ns_nongc_ctime = le64_to_cpu(raw_sr->sr_nongc_ctime);
+
+ failed:
+       brelse(bh_sr);
+       return err;
+
+ failed_sufile:
+       nilfs_mdt_destroy(nilfs->ns_sufile);
+
+ failed_cpfile:
+       nilfs_mdt_destroy(nilfs->ns_cpfile);
+
+ failed_gc_dat:
+       nilfs_mdt_destroy(nilfs->ns_gc_dat);
+
+ failed_dat:
+       nilfs_mdt_destroy(nilfs->ns_dat);
+       goto failed;
+}
+
+static void nilfs_init_recovery_info(struct nilfs_recovery_info *ri)
+{
+       memset(ri, 0, sizeof(*ri));
+       INIT_LIST_HEAD(&ri->ri_used_segments);
+}
+
+static void nilfs_clear_recovery_info(struct nilfs_recovery_info *ri)
+{
+       nilfs_dispose_segment_list(&ri->ri_used_segments);
+}
+
+/**
+ * load_nilfs - load and recover the nilfs
+ * @nilfs: the_nilfs structure to be released
+ * @sbi: nilfs_sb_info used to recover past segment
+ *
+ * load_nilfs() searches and load the latest super root,
+ * attaches the last segment, and does recovery if needed.
+ * The caller must call this exclusively for simultaneous mounts.
+ */
+int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
+{
+       struct nilfs_recovery_info ri;
+       unsigned int s_flags = sbi->s_super->s_flags;
+       int really_read_only = bdev_read_only(nilfs->ns_bdev);
+       unsigned valid_fs;
+       int err = 0;
+
+       nilfs_init_recovery_info(&ri);
+
+       down_write(&nilfs->ns_sem);
+       valid_fs = (nilfs->ns_mount_state & NILFS_VALID_FS);
+       up_write(&nilfs->ns_sem);
+
+       if (!valid_fs && (s_flags & MS_RDONLY)) {
+               printk(KERN_INFO "NILFS: INFO: recovery "
+                      "required for readonly filesystem.\n");
+               if (really_read_only) {
+                       printk(KERN_ERR "NILFS: write access "
+                              "unavailable, cannot proceed.\n");
+                       err = -EROFS;
+                       goto failed;
+               }
+               printk(KERN_INFO "NILFS: write access will "
+                      "be enabled during recovery.\n");
+               sbi->s_super->s_flags &= ~MS_RDONLY;
+       }
+
+       err = nilfs_search_super_root(nilfs, sbi, &ri);
+       if (unlikely(err)) {
+               printk(KERN_ERR "NILFS: error searching super root.\n");
+               goto failed;
+       }
+
+       err = nilfs_load_super_root(nilfs, sbi, ri.ri_super_root);
+       if (unlikely(err)) {
+               printk(KERN_ERR "NILFS: error loading super root.\n");
+               goto failed;
+       }
+
+       if (!valid_fs) {
+               err = nilfs_recover_logical_segments(nilfs, sbi, &ri);
+               if (unlikely(err)) {
+                       nilfs_mdt_destroy(nilfs->ns_cpfile);
+                       nilfs_mdt_destroy(nilfs->ns_sufile);
+                       nilfs_mdt_destroy(nilfs->ns_dat);
+                       goto failed;
+               }
+               if (ri.ri_need_recovery == NILFS_RECOVERY_SR_UPDATED)
+                       sbi->s_super->s_dirt = 1;
+       }
+
+       set_nilfs_loaded(nilfs);
+
+ failed:
+       nilfs_clear_recovery_info(&ri);
+       sbi->s_super->s_flags = s_flags;
+       return err;
+}
+
+static unsigned long long nilfs_max_size(unsigned int blkbits)
+{
+       unsigned int max_bits;
+       unsigned long long res = MAX_LFS_FILESIZE; /* page cache limit */
+
+       max_bits = blkbits + NILFS_BMAP_KEY_BIT; /* bmap size limit */
+       if (max_bits < 64)
+               res = min_t(unsigned long long, res, (1ULL << max_bits) - 1);
+       return res;
+}
+
+static int nilfs_store_disk_layout(struct the_nilfs *nilfs,
+                                  struct nilfs_super_block *sbp)
+{
+       if (le32_to_cpu(sbp->s_rev_level) != NILFS_CURRENT_REV) {
+               printk(KERN_ERR "NILFS: revision mismatch "
+                      "(superblock rev.=%d.%d, current rev.=%d.%d). "
+                      "Please check the version of mkfs.nilfs.\n",
+                      le32_to_cpu(sbp->s_rev_level),
+                      le16_to_cpu(sbp->s_minor_rev_level),
+                      NILFS_CURRENT_REV, NILFS_MINOR_REV);
+               return -EINVAL;
+       }
+       nilfs->ns_sbsize = le16_to_cpu(sbp->s_bytes);
+       if (nilfs->ns_sbsize > BLOCK_SIZE)
+               return -EINVAL;
+
+       nilfs->ns_inode_size = le16_to_cpu(sbp->s_inode_size);
+       nilfs->ns_first_ino = le32_to_cpu(sbp->s_first_ino);
+
+       nilfs->ns_blocks_per_segment = le32_to_cpu(sbp->s_blocks_per_segment);
+       if (nilfs->ns_blocks_per_segment < NILFS_SEG_MIN_BLOCKS) {
+               printk(KERN_ERR "NILFS: too short segment. \n");
+               return -EINVAL;
+       }
+
+       nilfs->ns_first_data_block = le64_to_cpu(sbp->s_first_data_block);
+       nilfs->ns_nsegments = le64_to_cpu(sbp->s_nsegments);
+       nilfs->ns_r_segments_percentage =
+               le32_to_cpu(sbp->s_r_segments_percentage);
+       nilfs->ns_nrsvsegs =
+               max_t(unsigned long, NILFS_MIN_NRSVSEGS,
+                     DIV_ROUND_UP(nilfs->ns_nsegments *
+                                  nilfs->ns_r_segments_percentage, 100));
+       nilfs->ns_crc_seed = le32_to_cpu(sbp->s_crc_seed);
+       return 0;
+}
+
+static int nilfs_valid_sb(struct nilfs_super_block *sbp)
+{
+       static unsigned char sum[4];
+       const int sumoff = offsetof(struct nilfs_super_block, s_sum);
+       size_t bytes;
+       u32 crc;
+
+       if (!sbp || le16_to_cpu(sbp->s_magic) != NILFS_SUPER_MAGIC)
+               return 0;
+       bytes = le16_to_cpu(sbp->s_bytes);
+       if (bytes > BLOCK_SIZE)
+               return 0;
+       crc = crc32_le(le32_to_cpu(sbp->s_crc_seed), (unsigned char *)sbp,
+                      sumoff);
+       crc = crc32_le(crc, sum, 4);
+       crc = crc32_le(crc, (unsigned char *)sbp + sumoff + 4,
+                      bytes - sumoff - 4);
+       return crc == le32_to_cpu(sbp->s_sum);
+}
+
+static int nilfs_sb2_bad_offset(struct nilfs_super_block *sbp, u64 offset)
+{
+       return offset < ((le64_to_cpu(sbp->s_nsegments) *
+                         le32_to_cpu(sbp->s_blocks_per_segment)) <<
+                        (le32_to_cpu(sbp->s_log_block_size) + 10));
+}
+
+static void nilfs_release_super_block(struct the_nilfs *nilfs)
+{
+       int i;
+
+       for (i = 0; i < 2; i++) {
+               if (nilfs->ns_sbp[i]) {
+                       brelse(nilfs->ns_sbh[i]);
+                       nilfs->ns_sbh[i] = NULL;
+                       nilfs->ns_sbp[i] = NULL;
+               }
+       }
+}
+
+void nilfs_fall_back_super_block(struct the_nilfs *nilfs)
+{
+       brelse(nilfs->ns_sbh[0]);
+       nilfs->ns_sbh[0] = nilfs->ns_sbh[1];
+       nilfs->ns_sbp[0] = nilfs->ns_sbp[1];
+       nilfs->ns_sbh[1] = NULL;
+       nilfs->ns_sbp[1] = NULL;
+}
+
+void nilfs_swap_super_block(struct the_nilfs *nilfs)
+{
+       struct buffer_head *tsbh = nilfs->ns_sbh[0];
+       struct nilfs_super_block *tsbp = nilfs->ns_sbp[0];
+
+       nilfs->ns_sbh[0] = nilfs->ns_sbh[1];
+       nilfs->ns_sbp[0] = nilfs->ns_sbp[1];
+       nilfs->ns_sbh[1] = tsbh;
+       nilfs->ns_sbp[1] = tsbp;
+}
+
+static int nilfs_load_super_block(struct the_nilfs *nilfs,
+                                 struct super_block *sb, int blocksize,
+                                 struct nilfs_super_block **sbpp)
+{
+       struct nilfs_super_block **sbp = nilfs->ns_sbp;
+       struct buffer_head **sbh = nilfs->ns_sbh;
+       u64 sb2off = NILFS_SB2_OFFSET_BYTES(nilfs->ns_bdev->bd_inode->i_size);
+       int valid[2], swp = 0;
+
+       sbp[0] = nilfs_read_super_block(sb, NILFS_SB_OFFSET_BYTES, blocksize,
+                                       &sbh[0]);
+       sbp[1] = nilfs_read_super_block(sb, sb2off, blocksize, &sbh[1]);
+
+       if (!sbp[0]) {
+               if (!sbp[1]) {
+                       printk(KERN_ERR "NILFS: unable to read superblock\n");
+                       return -EIO;
+               }
+               printk(KERN_WARNING
+                      "NILFS warning: unable to read primary superblock\n");
+       } else if (!sbp[1])
+               printk(KERN_WARNING
+                      "NILFS warning: unable to read secondary superblock\n");
+
+       valid[0] = nilfs_valid_sb(sbp[0]);
+       valid[1] = nilfs_valid_sb(sbp[1]);
+       swp = valid[1] &&
+               (!valid[0] ||
+                le64_to_cpu(sbp[1]->s_wtime) > le64_to_cpu(sbp[0]->s_wtime));
+
+       if (valid[swp] && nilfs_sb2_bad_offset(sbp[swp], sb2off)) {
+               brelse(sbh[1]);
+               sbh[1] = NULL;
+               sbp[1] = NULL;
+               swp = 0;
+       }
+       if (!valid[swp]) {
+               nilfs_release_super_block(nilfs);
+               printk(KERN_ERR "NILFS: Can't find nilfs on dev %s.\n",
+                      sb->s_id);
+               return -EINVAL;
+       }
+
+       if (swp) {
+               printk(KERN_WARNING "NILFS warning: broken superblock. "
+                      "using spare superblock.\n");
+               nilfs_swap_super_block(nilfs);
+       }
+
+       nilfs->ns_sbwtime[0] = le64_to_cpu(sbp[0]->s_wtime);
+       nilfs->ns_sbwtime[1] = valid[!swp] ? le64_to_cpu(sbp[1]->s_wtime) : 0;
+       nilfs->ns_prot_seq = le64_to_cpu(sbp[valid[1] & !swp]->s_last_seq);
+       *sbpp = sbp[0];
+       return 0;
+}
+
+/**
+ * init_nilfs - initialize a NILFS instance.
+ * @nilfs: the_nilfs structure
+ * @sbi: nilfs_sb_info
+ * @sb: super block
+ * @data: mount options
+ *
+ * init_nilfs() performs common initialization per block device (e.g.
+ * reading the super block, getting disk layout information, initializing
+ * shared fields in the_nilfs). It takes on some portion of the jobs
+ * typically done by a fill_super() routine. This division arises from
+ * the nature that multiple NILFS instances may be simultaneously
+ * mounted on a device.
+ * For multiple mounts on the same device, only the first mount
+ * invokes these tasks.
+ *
+ * Return Value: On success, 0 is returned. On error, a negative error
+ * code is returned.
+ */
+int init_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi, char *data)
+{
+       struct super_block *sb = sbi->s_super;
+       struct nilfs_super_block *sbp;
+       struct backing_dev_info *bdi;
+       int blocksize;
+       int err;
+
+       down_write(&nilfs->ns_sem);
+       if (nilfs_init(nilfs)) {
+               /* Load values from existing the_nilfs */
+               sbp = nilfs->ns_sbp[0];
+               err = nilfs_store_magic_and_option(sb, sbp, data);
+               if (err)
+                       goto out;
+
+               blocksize = BLOCK_SIZE << le32_to_cpu(sbp->s_log_block_size);
+               if (sb->s_blocksize != blocksize &&
+                   !sb_set_blocksize(sb, blocksize)) {
+                       printk(KERN_ERR "NILFS: blocksize %d unfit to device\n",
+                              blocksize);
+                       err = -EINVAL;
+               }
+               sb->s_maxbytes = nilfs_max_size(sb->s_blocksize_bits);
+               goto out;
+       }
+
+       blocksize = sb_min_blocksize(sb, BLOCK_SIZE);
+       if (!blocksize) {
+               printk(KERN_ERR "NILFS: unable to set blocksize\n");
+               err = -EINVAL;
+               goto out;
+       }
+       err = nilfs_load_super_block(nilfs, sb, blocksize, &sbp);
+       if (err)
+               goto out;
+
+       err = nilfs_store_magic_and_option(sb, sbp, data);
+       if (err)
+               goto failed_sbh;
+
+       blocksize = BLOCK_SIZE << le32_to_cpu(sbp->s_log_block_size);
+       if (sb->s_blocksize != blocksize) {
+               int hw_blocksize = bdev_hardsect_size(sb->s_bdev);
+
+               if (blocksize < hw_blocksize) {
+                       printk(KERN_ERR
+                              "NILFS: blocksize %d too small for device "
+                              "(sector-size = %d).\n",
+                              blocksize, hw_blocksize);
+                       err = -EINVAL;
+                       goto failed_sbh;
+               }
+               nilfs_release_super_block(nilfs);
+               sb_set_blocksize(sb, blocksize);
+
+               err = nilfs_load_super_block(nilfs, sb, blocksize, &sbp);
+               if (err)
+                       goto out;
+                       /* not failed_sbh; sbh is released automatically
+                          when reloading fails. */
+       }
+       nilfs->ns_blocksize_bits = sb->s_blocksize_bits;
+
+       err = nilfs_store_disk_layout(nilfs, sbp);
+       if (err)
+               goto failed_sbh;
+
+       sb->s_maxbytes = nilfs_max_size(sb->s_blocksize_bits);
+
+       nilfs->ns_mount_state = le16_to_cpu(sbp->s_state);
+
+       bdi = nilfs->ns_bdev->bd_inode_backing_dev_info;
+       if (!bdi)
+               bdi = nilfs->ns_bdev->bd_inode->i_mapping->backing_dev_info;
+       nilfs->ns_bdi = bdi ? : &default_backing_dev_info;
+
+       /* Finding last segment */
+       nilfs->ns_last_pseg = le64_to_cpu(sbp->s_last_pseg);
+       nilfs->ns_last_cno = le64_to_cpu(sbp->s_last_cno);
+       nilfs->ns_last_seq = le64_to_cpu(sbp->s_last_seq);
+
+       nilfs->ns_seg_seq = nilfs->ns_last_seq;
+       nilfs->ns_segnum =
+               nilfs_get_segnum_of_block(nilfs, nilfs->ns_last_pseg);
+       nilfs->ns_cno = nilfs->ns_last_cno + 1;
+       if (nilfs->ns_segnum >= nilfs->ns_nsegments) {
+               printk(KERN_ERR "NILFS invalid last segment number.\n");
+               err = -EINVAL;
+               goto failed_sbh;
+       }
+       /* Dummy values  */
+       nilfs->ns_free_segments_count =
+               nilfs->ns_nsegments - (nilfs->ns_segnum + 1);
+
+       /* Initialize gcinode cache */
+       err = nilfs_init_gccache(nilfs);
+       if (err)
+               goto failed_sbh;
+
+       set_nilfs_init(nilfs);
+       err = 0;
+ out:
+       up_write(&nilfs->ns_sem);
+       return err;
+
+ failed_sbh:
+       nilfs_release_super_block(nilfs);
+       goto out;
+}
+
+int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks)
+{
+       struct inode *dat = nilfs_dat_inode(nilfs);
+       unsigned long ncleansegs;
+       int err;
+
+       down_read(&NILFS_MDT(dat)->mi_sem);     /* XXX */
+       err = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile, &ncleansegs);
+       up_read(&NILFS_MDT(dat)->mi_sem);       /* XXX */
+       if (likely(!err))
+               *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment;
+       return err;
+}
+
+int nilfs_near_disk_full(struct the_nilfs *nilfs)
+{
+       struct inode *sufile = nilfs->ns_sufile;
+       unsigned long ncleansegs, nincsegs;
+       int ret;
+
+       ret = nilfs_sufile_get_ncleansegs(sufile, &ncleansegs);
+       if (likely(!ret)) {
+               nincsegs = atomic_read(&nilfs->ns_ndirtyblks) /
+                       nilfs->ns_blocks_per_segment + 1;
+               if (ncleansegs <= nilfs->ns_nrsvsegs + nincsegs)
+                       ret++;
+       }
+       return ret;
+}
+
+int nilfs_checkpoint_is_mounted(struct the_nilfs *nilfs, __u64 cno,
+                               int snapshot_mount)
+{
+       struct nilfs_sb_info *sbi;
+       int ret = 0;
+
+       down_read(&nilfs->ns_sem);
+       if (cno == 0 || cno > nilfs->ns_cno)
+               goto out_unlock;
+
+       list_for_each_entry(sbi, &nilfs->ns_supers, s_list) {
+               if (sbi->s_snapshot_cno == cno &&
+                   (!snapshot_mount || nilfs_test_opt(sbi, SNAPSHOT))) {
+                                       /* exclude read-only mounts */
+                       ret++;
+                       break;
+               }
+       }
+       /* for protecting recent checkpoints */
+       if (cno >= nilfs_last_cno(nilfs))
+               ret++;
+
+ out_unlock:
+       up_read(&nilfs->ns_sem);
+       return ret;
+}
diff --git a/fs/nilfs2/the_nilfs.h b/fs/nilfs2/the_nilfs.h
new file mode 100644 (file)
index 0000000..30fe587
--- /dev/null
@@ -0,0 +1,298 @@
+/*
+ * the_nilfs.h - the_nilfs shared structure.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Ryusuke Konishi <ryusuke@osrg.net>
+ *
+ */
+
+#ifndef _THE_NILFS_H
+#define _THE_NILFS_H
+
+#include <linux/types.h>
+#include <linux/buffer_head.h>
+#include <linux/fs.h>
+#include <linux/blkdev.h>
+#include <linux/backing-dev.h>
+#include "sb.h"
+
+/* the_nilfs struct */
+enum {
+       THE_NILFS_INIT = 0,     /* Information from super_block is set */
+       THE_NILFS_LOADED,       /* Roll-back/roll-forward has done and
+                                  the latest checkpoint was loaded */
+       THE_NILFS_DISCONTINUED, /* 'next' pointer chain has broken */
+};
+
+/**
+ * struct the_nilfs - struct to supervise multiple nilfs mount points
+ * @ns_flags: flags
+ * @ns_count: reference count
+ * @ns_bdev: block device
+ * @ns_bdi: backing dev info
+ * @ns_writer: back pointer to writable nilfs_sb_info
+ * @ns_sem: semaphore for shared states
+ * @ns_writer_mutex: mutex protecting ns_writer attach/detach
+ * @ns_writer_refcount: number of referrers on ns_writer
+ * @ns_sbh: buffer heads of on-disk super blocks
+ * @ns_sbp: pointers to super block data
+ * @ns_sbwtime: previous write time of super blocks
+ * @ns_sbsize: size of valid data in super block
+ * @ns_supers: list of nilfs super block structs
+ * @ns_seg_seq: segment sequence counter
+ * @ns_segnum: index number of the latest full segment.
+ * @ns_nextnum: index number of the full segment index to be used next
+ * @ns_pseg_offset: offset of next partial segment in the current full segment
+ * @ns_cno: next checkpoint number
+ * @ns_ctime: write time of the last segment
+ * @ns_nongc_ctime: write time of the last segment not for cleaner operation
+ * @ns_ndirtyblks: Number of dirty data blocks
+ * @ns_last_segment_lock: lock protecting fields for the latest segment
+ * @ns_last_pseg: start block number of the latest segment
+ * @ns_last_seq: sequence value of the latest segment
+ * @ns_last_cno: checkpoint number of the latest segment
+ * @ns_prot_seq: least sequence number of segments which must not be reclaimed
+ * @ns_free_segments_count: counter of free segments
+ * @ns_segctor_sem: segment constructor semaphore
+ * @ns_dat: DAT file inode
+ * @ns_cpfile: checkpoint file inode
+ * @ns_sufile: segusage file inode
+ * @ns_gc_dat: shadow inode of the DAT file inode for GC
+ * @ns_gc_inodes: dummy inodes to keep live blocks
+ * @ns_gc_inodes_h: hash list to keep dummy inode holding live blocks
+ * @ns_blocksize_bits: bit length of block size
+ * @ns_nsegments: number of segments in filesystem
+ * @ns_blocks_per_segment: number of blocks per segment
+ * @ns_r_segments_percentage: reserved segments percentage
+ * @ns_nrsvsegs: number of reserved segments
+ * @ns_first_data_block: block number of first data block
+ * @ns_inode_size: size of on-disk inode
+ * @ns_first_ino: first not-special inode number
+ * @ns_crc_seed: seed value of CRC32 calculation
+ */
+struct the_nilfs {
+       unsigned long           ns_flags;
+       atomic_t                ns_count;
+
+       struct block_device    *ns_bdev;
+       struct backing_dev_info *ns_bdi;
+       struct nilfs_sb_info   *ns_writer;
+       struct rw_semaphore     ns_sem;
+       struct mutex            ns_writer_mutex;
+       atomic_t                ns_writer_refcount;
+
+       /*
+        * used for
+        * - loading the latest checkpoint exclusively.
+        * - allocating a new full segment.
+        * - protecting s_dirt in the super_block struct
+        *   (see nilfs_write_super) and the following fields.
+        */
+       struct buffer_head     *ns_sbh[2];
+       struct nilfs_super_block *ns_sbp[2];
+       time_t                  ns_sbwtime[2];
+       unsigned                ns_sbsize;
+       unsigned                ns_mount_state;
+       struct list_head        ns_supers;
+
+       /*
+        * Following fields are dedicated to a writable FS-instance.
+        * Except for the period seeking checkpoint, code outside the segment
+        * constructor must lock a segment semaphore while accessing these
+        * fields.
+        * The writable FS-instance is sole during a lifetime of the_nilfs.
+        */
+       u64                     ns_seg_seq;
+       __u64                   ns_segnum;
+       __u64                   ns_nextnum;
+       unsigned long           ns_pseg_offset;
+       __u64                   ns_cno;
+       time_t                  ns_ctime;
+       time_t                  ns_nongc_ctime;
+       atomic_t                ns_ndirtyblks;
+
+       /*
+        * The following fields hold information on the latest partial segment
+        * written to disk with a super root.  These fields are protected by
+        * ns_last_segment_lock.
+        */
+       spinlock_t              ns_last_segment_lock;
+       sector_t                ns_last_pseg;
+       u64                     ns_last_seq;
+       __u64                   ns_last_cno;
+       u64                     ns_prot_seq;
+       unsigned long           ns_free_segments_count;
+
+       struct rw_semaphore     ns_segctor_sem;
+
+       /*
+        * Following fields are lock free except for the period before
+        * the_nilfs is initialized.
+        */
+       struct inode           *ns_dat;
+       struct inode           *ns_cpfile;
+       struct inode           *ns_sufile;
+       struct inode           *ns_gc_dat;
+
+       /* GC inode list and hash table head */
+       struct list_head        ns_gc_inodes;
+       struct hlist_head      *ns_gc_inodes_h;
+
+       /* Disk layout information (static) */
+       unsigned int            ns_blocksize_bits;
+       unsigned long           ns_nsegments;
+       unsigned long           ns_blocks_per_segment;
+       unsigned long           ns_r_segments_percentage;
+       unsigned long           ns_nrsvsegs;
+       unsigned long           ns_first_data_block;
+       int                     ns_inode_size;
+       int                     ns_first_ino;
+       u32                     ns_crc_seed;
+};
+
+#define NILFS_GCINODE_HASH_BITS                8
+#define NILFS_GCINODE_HASH_SIZE                (1<<NILFS_GCINODE_HASH_BITS)
+
+#define THE_NILFS_FNS(bit, name)                                       \
+static inline void set_nilfs_##name(struct the_nilfs *nilfs)           \
+{                                                                      \
+       set_bit(THE_NILFS_##bit, &(nilfs)->ns_flags);                   \
+}                                                                      \
+static inline void clear_nilfs_##name(struct the_nilfs *nilfs)         \
+{                                                                      \
+       clear_bit(THE_NILFS_##bit, &(nilfs)->ns_flags);                 \
+}                                                                      \
+static inline int nilfs_##name(struct the_nilfs *nilfs)                        \
+{                                                                      \
+       return test_bit(THE_NILFS_##bit, &(nilfs)->ns_flags);           \
+}
+
+THE_NILFS_FNS(INIT, init)
+THE_NILFS_FNS(LOADED, loaded)
+THE_NILFS_FNS(DISCONTINUED, discontinued)
+
+/* Minimum interval of periodical update of superblocks (in seconds) */
+#define NILFS_SB_FREQ          10
+#define NILFS_ALTSB_FREQ       60  /* spare superblock */
+
+void nilfs_set_last_segment(struct the_nilfs *, sector_t, u64, __u64);
+struct the_nilfs *alloc_nilfs(struct block_device *);
+void put_nilfs(struct the_nilfs *);
+int init_nilfs(struct the_nilfs *, struct nilfs_sb_info *, char *);
+int load_nilfs(struct the_nilfs *, struct nilfs_sb_info *);
+int nilfs_count_free_blocks(struct the_nilfs *, sector_t *);
+int nilfs_checkpoint_is_mounted(struct the_nilfs *, __u64, int);
+int nilfs_near_disk_full(struct the_nilfs *);
+void nilfs_fall_back_super_block(struct the_nilfs *);
+void nilfs_swap_super_block(struct the_nilfs *);
+
+
+static inline void get_nilfs(struct the_nilfs *nilfs)
+{
+       /* Caller must have at least one reference of the_nilfs. */
+       atomic_inc(&nilfs->ns_count);
+}
+
+static inline struct nilfs_sb_info *nilfs_get_writer(struct the_nilfs *nilfs)
+{
+       if (atomic_inc_and_test(&nilfs->ns_writer_refcount))
+               mutex_lock(&nilfs->ns_writer_mutex);
+       return nilfs->ns_writer;
+}
+
+static inline void nilfs_put_writer(struct the_nilfs *nilfs)
+{
+       if (atomic_add_negative(-1, &nilfs->ns_writer_refcount))
+               mutex_unlock(&nilfs->ns_writer_mutex);
+}
+
+static inline void
+nilfs_attach_writer(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
+{
+       mutex_lock(&nilfs->ns_writer_mutex);
+       nilfs->ns_writer = sbi;
+       mutex_unlock(&nilfs->ns_writer_mutex);
+}
+
+static inline void
+nilfs_detach_writer(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
+{
+       mutex_lock(&nilfs->ns_writer_mutex);
+       if (sbi == nilfs->ns_writer)
+               nilfs->ns_writer = NULL;
+       mutex_unlock(&nilfs->ns_writer_mutex);
+}
+
+static inline void
+nilfs_get_segment_range(struct the_nilfs *nilfs, __u64 segnum,
+                       sector_t *seg_start, sector_t *seg_end)
+{
+       *seg_start = (sector_t)nilfs->ns_blocks_per_segment * segnum;
+       *seg_end = *seg_start + nilfs->ns_blocks_per_segment - 1;
+       if (segnum == 0)
+               *seg_start = nilfs->ns_first_data_block;
+}
+
+static inline sector_t
+nilfs_get_segment_start_blocknr(struct the_nilfs *nilfs, __u64 segnum)
+{
+       return (segnum == 0) ? nilfs->ns_first_data_block :
+               (sector_t)nilfs->ns_blocks_per_segment * segnum;
+}
+
+static inline __u64
+nilfs_get_segnum_of_block(struct the_nilfs *nilfs, sector_t blocknr)
+{
+       sector_t segnum = blocknr;
+
+       sector_div(segnum, nilfs->ns_blocks_per_segment);
+       return segnum;
+}
+
+static inline void
+nilfs_terminate_segment(struct the_nilfs *nilfs, sector_t seg_start,
+                       sector_t seg_end)
+{
+       /* terminate the current full segment (used in case of I/O-error) */
+       nilfs->ns_pseg_offset = seg_end - seg_start + 1;
+}
+
+static inline void nilfs_shift_to_next_segment(struct the_nilfs *nilfs)
+{
+       /* move forward with a full segment */
+       nilfs->ns_segnum = nilfs->ns_nextnum;
+       nilfs->ns_pseg_offset = 0;
+       nilfs->ns_seg_seq++;
+}
+
+static inline __u64 nilfs_last_cno(struct the_nilfs *nilfs)
+{
+       __u64 cno;
+
+       spin_lock(&nilfs->ns_last_segment_lock);
+       cno = nilfs->ns_last_cno;
+       spin_unlock(&nilfs->ns_last_segment_lock);
+       return cno;
+}
+
+static inline int nilfs_segment_is_active(struct the_nilfs *nilfs, __u64 n)
+{
+       return n == nilfs->ns_segnum || n == nilfs->ns_nextnum;
+}
+
+#endif /* _THE_NILFS_H */
index a5887df2cd8adce0f84a28a292a354a19c9fa4b5..8672b953603996c2884b17c0294be2be0a6fe1e2 100644 (file)
@@ -1926,7 +1926,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
                   out->f_path.dentry->d_name.len,
                   out->f_path.dentry->d_name.name);
 
-       inode_double_lock(inode, pipe->inode);
+       mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
 
        ret = ocfs2_rw_lock(inode, 1);
        if (ret < 0) {
@@ -1941,12 +1941,16 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
                goto out_unlock;
        }
 
+       if (pipe->inode)
+               mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
        ret = generic_file_splice_write_nolock(pipe, out, ppos, len, flags);
+       if (pipe->inode)
+               mutex_unlock(&pipe->inode->i_mutex);
 
 out_unlock:
        ocfs2_rw_unlock(inode, 1);
 out:
-       inode_double_unlock(inode, pipe->inode);
+       mutex_unlock(&inode->i_mutex);
 
        mlog_exit(ret);
        return ret;
index b0ae0be4801f821f81c872299c135f55e6fb377c..39e4ad4f59f4ef84fff3e809b1494a1eedb41267 100644 (file)
@@ -204,6 +204,7 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
        struct file *file = vma->vm_file;
        int flags = vma->vm_flags;
        unsigned long ino = 0;
+       unsigned long long pgoff = 0;
        dev_t dev = 0;
        int len;
 
@@ -211,6 +212,7 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
                struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
                dev = inode->i_sb->s_dev;
                ino = inode->i_ino;
+               pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
        }
 
        seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n",
@@ -220,7 +222,7 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
                        flags & VM_WRITE ? 'w' : '-',
                        flags & VM_EXEC ? 'x' : '-',
                        flags & VM_MAYSHARE ? 's' : 'p',
-                       ((loff_t)vma->vm_pgoff) << PAGE_SHIFT,
+                       pgoff,
                        MAJOR(dev), MINOR(dev), ino, &len);
 
        /*
index 863464d5519c935df03a510f9ab03f7e731f14e9..12c20377772d86f33111d7ea2797c9b077dcc979 100644 (file)
@@ -126,6 +126,7 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
        struct file *file;
        dev_t dev = 0;
        int flags, len;
+       unsigned long long pgoff = 0;
 
        flags = vma->vm_flags;
        file = vma->vm_file;
@@ -134,6 +135,7 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
                struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
                dev = inode->i_sb->s_dev;
                ino = inode->i_ino;
+               pgoff = (loff_t)vma->pg_off << PAGE_SHIFT;
        }
 
        seq_printf(m,
@@ -144,7 +146,7 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
                   flags & VM_WRITE ? 'w' : '-',
                   flags & VM_EXEC ? 'x' : '-',
                   flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p',
-                  (unsigned long long) vma->vm_pgoff << PAGE_SHIFT,
+                  pgoff,
                   MAJOR(dev), MINOR(dev), ino, &len);
 
        if (file) {
index a404fb88e4569ff63ef9cc001216519d702c577c..3a6b193d84442176628885c30960cc935d92368e 100644 (file)
@@ -221,22 +221,23 @@ static int ramfs_fill_super(struct super_block * sb, void * data, int silent)
        save_mount_options(sb, data);
 
        fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL);
+       sb->s_fs_info = fsi;
        if (!fsi) {
                err = -ENOMEM;
                goto fail;
        }
-       sb->s_fs_info = fsi;
 
        err = ramfs_parse_options(data, &fsi->mount_opts);
        if (err)
                goto fail;
 
-       sb->s_maxbytes = MAX_LFS_FILESIZE;
-       sb->s_blocksize = PAGE_CACHE_SIZE;
-       sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
-       sb->s_magic = RAMFS_MAGIC;
-       sb->s_op = &ramfs_ops;
-       sb->s_time_gran = 1;
+       sb->s_maxbytes          = MAX_LFS_FILESIZE;
+       sb->s_blocksize         = PAGE_CACHE_SIZE;
+       sb->s_blocksize_bits    = PAGE_CACHE_SHIFT;
+       sb->s_magic             = RAMFS_MAGIC;
+       sb->s_op                = &ramfs_ops;
+       sb->s_time_gran         = 1;
+
        inode = ramfs_get_inode(sb, S_IFDIR | fsi->mount_opts.mode, 0);
        if (!inode) {
                err = -ENOMEM;
@@ -244,14 +245,16 @@ static int ramfs_fill_super(struct super_block * sb, void * data, int silent)
        }
 
        root = d_alloc_root(inode);
+       sb->s_root = root;
        if (!root) {
                err = -ENOMEM;
                goto fail;
        }
-       sb->s_root = root;
+
        return 0;
 fail:
        kfree(fsi);
+       sb->s_fs_info = NULL;
        iput(inode);
        return err;
 }
index 1a17020f9faf3a40c4e52e8bdbf75f3ffa327bce..ce2d6bcc6266b4e663ddc0608354141aca4a75b7 100644 (file)
@@ -1,6 +1,6 @@
 config ROMFS_FS
        tristate "ROM file system support"
-       depends on BLOCK
+       depends on BLOCK || MTD
        ---help---
          This is a very small read-only file system mainly intended for
          initial ram disks of installation disks, but it could be used for
@@ -14,3 +14,49 @@ config ROMFS_FS
 
          If you don't know whether you need it, then you don't need it:
          answer N.
+
+#
+# Select the backing stores to be supported
+#
+choice
+       prompt "RomFS backing stores"
+       depends on ROMFS_FS
+       default ROMFS_BACKED_BY_BLOCK
+       help
+         Select the backing stores to be supported.
+
+config ROMFS_BACKED_BY_BLOCK
+       bool "Block device-backed ROM file system support"
+       depends on BLOCK
+       help
+         This permits ROMFS to use block devices buffered through the page
+         cache as the medium from which to retrieve data.  It does not allow
+         direct mapping of the medium.
+
+         If unsure, answer Y.
+
+config ROMFS_BACKED_BY_MTD
+       bool "MTD-backed ROM file system support"
+       depends on MTD=y || (ROMFS_FS=m && MTD)
+       help
+         This permits ROMFS to use MTD based devices directly, without the
+         intercession of the block layer (which may have been disabled).  It
+         also allows direct mapping of MTD devices through romfs files under
+         NOMMU conditions if the underlying device is directly addressable by
+         the CPU.
+
+         If unsure, answer Y.
+
+config ROMFS_BACKED_BY_BOTH
+       bool "Both the above"
+       depends on BLOCK && (MTD=y || (ROMFS_FS=m && MTD))
+endchoice
+
+
+config ROMFS_ON_BLOCK
+       bool
+       default y if ROMFS_BACKED_BY_BLOCK || ROMFS_BACKED_BY_BOTH
+
+config ROMFS_ON_MTD
+       bool
+       default y if ROMFS_BACKED_BY_MTD || ROMFS_BACKED_BY_BOTH
index c95b21cf49a389b59f858df4465b4d1241b84d7f..420beb7d495cdcbedf917815a85ff905bf5b785f 100644 (file)
@@ -1,7 +1,12 @@
 #
-# Makefile for the linux romfs filesystem routines.
+# Makefile for the linux RomFS filesystem routines.
 #
 
 obj-$(CONFIG_ROMFS_FS) += romfs.o
 
-romfs-objs := inode.o
+romfs-y := storage.o super.o
+
+ifneq ($(CONFIG_MMU),y)
+romfs-$(CONFIG_ROMFS_ON_MTD) += mmap-nommu.o
+endif
+
diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c
deleted file mode 100644 (file)
index 98a232f..0000000
+++ /dev/null
@@ -1,665 +0,0 @@
-/*
- * ROMFS file system, Linux implementation
- *
- * Copyright (C) 1997-1999  Janos Farkas <chexum@shadow.banki.hu>
- *
- * Using parts of the minix filesystem
- * Copyright (C) 1991, 1992  Linus Torvalds
- *
- * and parts of the affs filesystem additionally
- * Copyright (C) 1993  Ray Burr
- * Copyright (C) 1996  Hans-Joachim Widmaier
- *
- * 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.
- *
- * Changes
- *                                     Changed for 2.1.19 modules
- *     Jan 1997                        Initial release
- *     Jun 1997                        2.1.43+ changes
- *                                     Proper page locking in readpage
- *                                     Changed to work with 2.1.45+ fs
- *     Jul 1997                        Fixed follow_link
- *                     2.1.47
- *                                     lookup shouldn't return -ENOENT
- *                                     from Horst von Brand:
- *                                       fail on wrong checksum
- *                                       double unlock_super was possible
- *                                       correct namelen for statfs
- *                                     spotted by Bill Hawes:
- *                                       readlink shouldn't iput()
- *     Jun 1998        2.1.106         from Avery Pennarun: glibc scandir()
- *                                       exposed a problem in readdir
- *                     2.1.107         code-freeze spellchecker run
- *     Aug 1998                        2.1.118+ VFS changes
- *     Sep 1998        2.1.122         another VFS change (follow_link)
- *     Apr 1999        2.2.7           no more EBADF checking in
- *                                       lookup/readdir, use ERR_PTR
- *     Jun 1999        2.3.6           d_alloc_root use changed
- *                     2.3.9           clean up usage of ENOENT/negative
- *                                       dentries in lookup
- *                                     clean up page flags setting
- *                                       (error, uptodate, locking) in
- *                                       in readpage
- *                                     use init_special_inode for
- *                                       fifos/sockets (and streamline) in
- *                                       read_inode, fix _ops table order
- *     Aug 1999        2.3.16          __initfunc() => __init change
- *     Oct 1999        2.3.24          page->owner hack obsoleted
- *     Nov 1999        2.3.27          2.3.25+ page->offset => index change
- */
-
-/* todo:
- *     - see Documentation/filesystems/romfs.txt
- *     - use allocated, not stack memory for file names?
- *     - considering write access...
- *     - network (tftp) files?
- *     - merge back some _op tables
- */
-
-/*
- * Sorry about some optimizations and for some goto's.  I just wanted
- * to squeeze some more bytes out of this code.. :)
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/slab.h>
-#include <linux/romfs_fs.h>
-#include <linux/fs.h>
-#include <linux/init.h>
-#include <linux/pagemap.h>
-#include <linux/smp_lock.h>
-#include <linux/buffer_head.h>
-#include <linux/vfs.h>
-
-#include <asm/uaccess.h>
-
-struct romfs_inode_info {
-       unsigned long i_metasize;       /* size of non-data area */
-       unsigned long i_dataoffset;     /* from the start of fs */
-       struct inode vfs_inode;
-};
-
-static struct inode *romfs_iget(struct super_block *, unsigned long);
-
-/* instead of private superblock data */
-static inline unsigned long romfs_maxsize(struct super_block *sb)
-{
-       return (unsigned long)sb->s_fs_info;
-}
-
-static inline struct romfs_inode_info *ROMFS_I(struct inode *inode)
-{
-       return container_of(inode, struct romfs_inode_info, vfs_inode);
-}
-
-static __u32
-romfs_checksum(void *data, int size)
-{
-       __u32 sum;
-       __be32 *ptr;
-
-       sum = 0; ptr = data;
-       size>>=2;
-       while (size>0) {
-               sum += be32_to_cpu(*ptr++);
-               size--;
-       }
-       return sum;
-}
-
-static const struct super_operations romfs_ops;
-
-static int romfs_fill_super(struct super_block *s, void *data, int silent)
-{
-       struct buffer_head *bh;
-       struct romfs_super_block *rsb;
-       struct inode *root;
-       int sz, ret = -EINVAL;
-
-       /* I would parse the options here, but there are none.. :) */
-
-       sb_set_blocksize(s, ROMBSIZE);
-       s->s_maxbytes = 0xFFFFFFFF;
-
-       bh = sb_bread(s, 0);
-       if (!bh) {
-               /* XXX merge with other printk? */
-                printk ("romfs: unable to read superblock\n");
-               goto outnobh;
-       }
-
-       rsb = (struct romfs_super_block *)bh->b_data;
-       sz = be32_to_cpu(rsb->size);
-       if (rsb->word0 != ROMSB_WORD0 || rsb->word1 != ROMSB_WORD1
-          || sz < ROMFH_SIZE) {
-               if (!silent)
-                       printk ("VFS: Can't find a romfs filesystem on dev "
-                               "%s.\n", s->s_id);
-               goto out;
-       }
-       if (romfs_checksum(rsb, min_t(int, sz, 512))) {
-               printk ("romfs: bad initial checksum on dev "
-                       "%s.\n", s->s_id);
-               goto out;
-       }
-
-       s->s_magic = ROMFS_MAGIC;
-       s->s_fs_info = (void *)(long)sz;
-
-       s->s_flags |= MS_RDONLY;
-
-       /* Find the start of the fs */
-       sz = (ROMFH_SIZE +
-             strnlen(rsb->name, ROMFS_MAXFN) + 1 + ROMFH_PAD)
-            & ROMFH_MASK;
-
-       s->s_op = &romfs_ops;
-       root = romfs_iget(s, sz);
-       if (IS_ERR(root)) {
-               ret = PTR_ERR(root);
-               goto out;
-       }
-
-       ret = -ENOMEM;
-       s->s_root = d_alloc_root(root);
-       if (!s->s_root)
-               goto outiput;
-
-       brelse(bh);
-       return 0;
-
-outiput:
-       iput(root);
-out:
-       brelse(bh);
-outnobh:
-       return ret;
-}
-
-/* That's simple too. */
-
-static int
-romfs_statfs(struct dentry *dentry, struct kstatfs *buf)
-{
-       buf->f_type = ROMFS_MAGIC;
-       buf->f_bsize = ROMBSIZE;
-       buf->f_bfree = buf->f_bavail = buf->f_ffree;
-       buf->f_blocks = (romfs_maxsize(dentry->d_sb)+ROMBSIZE-1)>>ROMBSBITS;
-       buf->f_namelen = ROMFS_MAXFN;
-       return 0;
-}
-
-/* some helper routines */
-
-static int
-romfs_strnlen(struct inode *i, unsigned long offset, unsigned long count)
-{
-       struct buffer_head *bh;
-       unsigned long avail, maxsize, res;
-
-       maxsize = romfs_maxsize(i->i_sb);
-       if (offset >= maxsize)
-               return -1;
-
-       /* strnlen is almost always valid */
-       if (count > maxsize || offset+count > maxsize)
-               count = maxsize-offset;
-
-       bh = sb_bread(i->i_sb, offset>>ROMBSBITS);
-       if (!bh)
-               return -1;              /* error */
-
-       avail = ROMBSIZE - (offset & ROMBMASK);
-       maxsize = min_t(unsigned long, count, avail);
-       res = strnlen(((char *)bh->b_data)+(offset&ROMBMASK), maxsize);
-       brelse(bh);
-
-       if (res < maxsize)
-               return res;             /* found all of it */
-
-       while (res < count) {
-               offset += maxsize;
-
-               bh = sb_bread(i->i_sb, offset>>ROMBSBITS);
-               if (!bh)
-                       return -1;
-               maxsize = min_t(unsigned long, count - res, ROMBSIZE);
-               avail = strnlen(bh->b_data, maxsize);
-               res += avail;
-               brelse(bh);
-               if (avail < maxsize)
-                       return res;
-       }
-       return res;
-}
-
-static int
-romfs_copyfrom(struct inode *i, void *dest, unsigned long offset, unsigned long count)
-{
-       struct buffer_head *bh;
-       unsigned long avail, maxsize, res;
-
-       maxsize = romfs_maxsize(i->i_sb);
-       if (offset >= maxsize || count > maxsize || offset+count>maxsize)
-               return -1;
-
-       bh = sb_bread(i->i_sb, offset>>ROMBSBITS);
-       if (!bh)
-               return -1;              /* error */
-
-       avail = ROMBSIZE - (offset & ROMBMASK);
-       maxsize = min_t(unsigned long, count, avail);
-       memcpy(dest, ((char *)bh->b_data) + (offset & ROMBMASK), maxsize);
-       brelse(bh);
-
-       res = maxsize;                  /* all of it */
-
-       while (res < count) {
-               offset += maxsize;
-               dest += maxsize;
-
-               bh = sb_bread(i->i_sb, offset>>ROMBSBITS);
-               if (!bh)
-                       return -1;
-               maxsize = min_t(unsigned long, count - res, ROMBSIZE);
-               memcpy(dest, bh->b_data, maxsize);
-               brelse(bh);
-               res += maxsize;
-       }
-       return res;
-}
-
-static unsigned char romfs_dtype_table[] = {
-       DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_SOCK, DT_FIFO
-};
-
-static int
-romfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
-{
-       struct inode *i = filp->f_path.dentry->d_inode;
-       struct romfs_inode ri;
-       unsigned long offset, maxoff;
-       int j, ino, nextfh;
-       int stored = 0;
-       char fsname[ROMFS_MAXFN];       /* XXX dynamic? */
-
-       lock_kernel();
-
-       maxoff = romfs_maxsize(i->i_sb);
-
-       offset = filp->f_pos;
-       if (!offset) {
-               offset = i->i_ino & ROMFH_MASK;
-               if (romfs_copyfrom(i, &ri, offset, ROMFH_SIZE) <= 0)
-                       goto out;
-               offset = be32_to_cpu(ri.spec) & ROMFH_MASK;
-       }
-
-       /* Not really failsafe, but we are read-only... */
-       for(;;) {
-               if (!offset || offset >= maxoff) {
-                       offset = maxoff;
-                       filp->f_pos = offset;
-                       goto out;
-               }
-               filp->f_pos = offset;
-
-               /* Fetch inode info */
-               if (romfs_copyfrom(i, &ri, offset, ROMFH_SIZE) <= 0)
-                       goto out;
-
-               j = romfs_strnlen(i, offset+ROMFH_SIZE, sizeof(fsname)-1);
-               if (j < 0)
-                       goto out;
-
-               fsname[j]=0;
-               romfs_copyfrom(i, fsname, offset+ROMFH_SIZE, j);
-
-               ino = offset;
-               nextfh = be32_to_cpu(ri.next);
-               if ((nextfh & ROMFH_TYPE) == ROMFH_HRD)
-                       ino = be32_to_cpu(ri.spec);
-               if (filldir(dirent, fsname, j, offset, ino,
-                           romfs_dtype_table[nextfh & ROMFH_TYPE]) < 0) {
-                       goto out;
-               }
-               stored++;
-               offset = nextfh & ROMFH_MASK;
-       }
-out:
-       unlock_kernel();
-       return stored;
-}
-
-static struct dentry *
-romfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
-{
-       unsigned long offset, maxoff;
-       long res;
-       int fslen;
-       struct inode *inode = NULL;
-       char fsname[ROMFS_MAXFN];       /* XXX dynamic? */
-       struct romfs_inode ri;
-       const char *name;               /* got from dentry */
-       int len;
-
-       res = -EACCES;                  /* placeholder for "no data here" */
-       offset = dir->i_ino & ROMFH_MASK;
-       lock_kernel();
-       if (romfs_copyfrom(dir, &ri, offset, ROMFH_SIZE) <= 0)
-               goto error;
-
-       maxoff = romfs_maxsize(dir->i_sb);
-       offset = be32_to_cpu(ri.spec) & ROMFH_MASK;
-
-       /* OK, now find the file whose name is in "dentry" in the
-        * directory specified by "dir".  */
-
-       name = dentry->d_name.name;
-       len = dentry->d_name.len;
-
-       for(;;) {
-               if (!offset || offset >= maxoff)
-                       goto success; /* negative success */
-               if (romfs_copyfrom(dir, &ri, offset, ROMFH_SIZE) <= 0)
-                       goto error;
-
-               /* try to match the first 16 bytes of name */
-               fslen = romfs_strnlen(dir, offset+ROMFH_SIZE, ROMFH_SIZE);
-               if (len < ROMFH_SIZE) {
-                       if (len == fslen) {
-                               /* both are shorter, and same size */
-                               romfs_copyfrom(dir, fsname, offset+ROMFH_SIZE, len+1);
-                               if (strncmp (name, fsname, len) == 0)
-                                       break;
-                       }
-               } else if (fslen >= ROMFH_SIZE) {
-                       /* both are longer; XXX optimize max size */
-                       fslen = romfs_strnlen(dir, offset+ROMFH_SIZE, sizeof(fsname)-1);
-                       if (len == fslen) {
-                               romfs_copyfrom(dir, fsname, offset+ROMFH_SIZE, len+1);
-                               if (strncmp(name, fsname, len) == 0)
-                                       break;
-                       }
-               }
-               /* next entry */
-               offset = be32_to_cpu(ri.next) & ROMFH_MASK;
-       }
-
-       /* Hard link handling */
-       if ((be32_to_cpu(ri.next) & ROMFH_TYPE) == ROMFH_HRD)
-               offset = be32_to_cpu(ri.spec) & ROMFH_MASK;
-
-       inode = romfs_iget(dir->i_sb, offset);
-       if (IS_ERR(inode)) {
-               res = PTR_ERR(inode);
-               goto error;
-       }
-
-success:
-       d_add(dentry, inode);
-       res = 0;
-error:
-       unlock_kernel();
-       return ERR_PTR(res);
-}
-
-/*
- * Ok, we do readpage, to be able to execute programs.  Unfortunately,
- * we can't use bmap, since we may have looser alignments.
- */
-
-static int
-romfs_readpage(struct file *file, struct page * page)
-{
-       struct inode *inode = page->mapping->host;
-       loff_t offset, size;
-       unsigned long filled;
-       void *buf;
-       int result = -EIO;
-
-       page_cache_get(page);
-       lock_kernel();
-       buf = kmap(page);
-       if (!buf)
-               goto err_out;
-
-       /* 32 bit warning -- but not for us :) */
-       offset = page_offset(page);
-       size = i_size_read(inode);
-       filled = 0;
-       result = 0;
-       if (offset < size) {
-               unsigned long readlen;
-
-               size -= offset;
-               readlen = size > PAGE_SIZE ? PAGE_SIZE : size;
-
-               filled = romfs_copyfrom(inode, buf, ROMFS_I(inode)->i_dataoffset+offset, readlen);
-
-               if (filled != readlen) {
-                       SetPageError(page);
-                       filled = 0;
-                       result = -EIO;
-               }
-       }
-
-       if (filled < PAGE_SIZE)
-               memset(buf + filled, 0, PAGE_SIZE-filled);
-
-       if (!result)
-               SetPageUptodate(page);
-       flush_dcache_page(page);
-
-       unlock_page(page);
-
-       kunmap(page);
-err_out:
-       page_cache_release(page);
-       unlock_kernel();
-
-       return result;
-}
-
-/* Mapping from our types to the kernel */
-
-static const struct address_space_operations romfs_aops = {
-       .readpage = romfs_readpage
-};
-
-static const struct file_operations romfs_dir_operations = {
-       .read           = generic_read_dir,
-       .readdir        = romfs_readdir,
-};
-
-static const struct inode_operations romfs_dir_inode_operations = {
-       .lookup         = romfs_lookup,
-};
-
-static mode_t romfs_modemap[] =
-{
-       0, S_IFDIR+0644, S_IFREG+0644, S_IFLNK+0777,
-       S_IFBLK+0600, S_IFCHR+0600, S_IFSOCK+0644, S_IFIFO+0644
-};
-
-static struct inode *
-romfs_iget(struct super_block *sb, unsigned long ino)
-{
-       int nextfh, ret;
-       struct romfs_inode ri;
-       struct inode *i;
-
-       ino &= ROMFH_MASK;
-       i = iget_locked(sb, ino);
-       if (!i)
-               return ERR_PTR(-ENOMEM);
-       if (!(i->i_state & I_NEW))
-               return i;
-
-       i->i_mode = 0;
-
-       /* Loop for finding the real hard link */
-       for(;;) {
-               if (romfs_copyfrom(i, &ri, ino, ROMFH_SIZE) <= 0) {
-                       printk(KERN_ERR "romfs: read error for inode 0x%lx\n",
-                               ino);
-                       iget_failed(i);
-                       return ERR_PTR(-EIO);
-               }
-               /* XXX: do romfs_checksum here too (with name) */
-
-               nextfh = be32_to_cpu(ri.next);
-               if ((nextfh & ROMFH_TYPE) != ROMFH_HRD)
-                       break;
-
-               ino = be32_to_cpu(ri.spec) & ROMFH_MASK;
-       }
-
-       i->i_nlink = 1;         /* Hard to decide.. */
-       i->i_size = be32_to_cpu(ri.size);
-       i->i_mtime.tv_sec = i->i_atime.tv_sec = i->i_ctime.tv_sec = 0;
-       i->i_mtime.tv_nsec = i->i_atime.tv_nsec = i->i_ctime.tv_nsec = 0;
-
-        /* Precalculate the data offset */
-       ret = romfs_strnlen(i, ino + ROMFH_SIZE, ROMFS_MAXFN);
-       if (ret >= 0)
-               ino = (ROMFH_SIZE + ret + 1 + ROMFH_PAD) & ROMFH_MASK;
-       else
-               ino = 0;
-
-        ROMFS_I(i)->i_metasize = ino;
-        ROMFS_I(i)->i_dataoffset = ino+(i->i_ino&ROMFH_MASK);
-
-        /* Compute permissions */
-        ino = romfs_modemap[nextfh & ROMFH_TYPE];
-       /* only "normal" files have ops */
-       switch (nextfh & ROMFH_TYPE) {
-               case 1:
-                       i->i_size = ROMFS_I(i)->i_metasize;
-                       i->i_op = &romfs_dir_inode_operations;
-                       i->i_fop = &romfs_dir_operations;
-                       if (nextfh & ROMFH_EXEC)
-                               ino |= S_IXUGO;
-                       i->i_mode = ino;
-                       break;
-               case 2:
-                       i->i_fop = &generic_ro_fops;
-                       i->i_data.a_ops = &romfs_aops;
-                       if (nextfh & ROMFH_EXEC)
-                               ino |= S_IXUGO;
-                       i->i_mode = ino;
-                       break;
-               case 3:
-                       i->i_op = &page_symlink_inode_operations;
-                       i->i_data.a_ops = &romfs_aops;
-                       i->i_mode = ino | S_IRWXUGO;
-                       break;
-               default:
-                       /* depending on MBZ for sock/fifos */
-                       nextfh = be32_to_cpu(ri.spec);
-                       init_special_inode(i, ino,
-                                       MKDEV(nextfh>>16,nextfh&0xffff));
-       }
-       unlock_new_inode(i);
-       return i;
-}
-
-static struct kmem_cache * romfs_inode_cachep;
-
-static struct inode *romfs_alloc_inode(struct super_block *sb)
-{
-       struct romfs_inode_info *ei;
-       ei = kmem_cache_alloc(romfs_inode_cachep, GFP_KERNEL);
-       if (!ei)
-               return NULL;
-       return &ei->vfs_inode;
-}
-
-static void romfs_destroy_inode(struct inode *inode)
-{
-       kmem_cache_free(romfs_inode_cachep, ROMFS_I(inode));
-}
-
-static void init_once(void *foo)
-{
-       struct romfs_inode_info *ei = foo;
-
-       inode_init_once(&ei->vfs_inode);
-}
-
-static int init_inodecache(void)
-{
-       romfs_inode_cachep = kmem_cache_create("romfs_inode_cache",
-                                            sizeof(struct romfs_inode_info),
-                                            0, (SLAB_RECLAIM_ACCOUNT|
-                                               SLAB_MEM_SPREAD),
-                                            init_once);
-       if (romfs_inode_cachep == NULL)
-               return -ENOMEM;
-       return 0;
-}
-
-static void destroy_inodecache(void)
-{
-       kmem_cache_destroy(romfs_inode_cachep);
-}
-
-static int romfs_remount(struct super_block *sb, int *flags, char *data)
-{
-       *flags |= MS_RDONLY;
-       return 0;
-}
-
-static const struct super_operations romfs_ops = {
-       .alloc_inode    = romfs_alloc_inode,
-       .destroy_inode  = romfs_destroy_inode,
-       .statfs         = romfs_statfs,
-       .remount_fs     = romfs_remount,
-};
-
-static int romfs_get_sb(struct file_system_type *fs_type,
-       int flags, const char *dev_name, void *data, struct vfsmount *mnt)
-{
-       return get_sb_bdev(fs_type, flags, dev_name, data, romfs_fill_super,
-                          mnt);
-}
-
-static struct file_system_type romfs_fs_type = {
-       .owner          = THIS_MODULE,
-       .name           = "romfs",
-       .get_sb         = romfs_get_sb,
-       .kill_sb        = kill_block_super,
-       .fs_flags       = FS_REQUIRES_DEV,
-};
-
-static int __init init_romfs_fs(void)
-{
-       int err = init_inodecache();
-       if (err)
-               goto out1;
-        err = register_filesystem(&romfs_fs_type);
-       if (err)
-               goto out;
-       return 0;
-out:
-       destroy_inodecache();
-out1:
-       return err;
-}
-
-static void __exit exit_romfs_fs(void)
-{
-       unregister_filesystem(&romfs_fs_type);
-       destroy_inodecache();
-}
-
-/* Yes, works even as a module... :) */
-
-module_init(init_romfs_fs)
-module_exit(exit_romfs_fs)
-MODULE_LICENSE("GPL");
diff --git a/fs/romfs/internal.h b/fs/romfs/internal.h
new file mode 100644 (file)
index 0000000..06044a9
--- /dev/null
@@ -0,0 +1,47 @@
+/* RomFS internal definitions
+ *
+ * Copyright Â© 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/romfs_fs.h>
+
+struct romfs_inode_info {
+       struct inode    vfs_inode;
+       unsigned long   i_metasize;     /* size of non-data area */
+       unsigned long   i_dataoffset;   /* from the start of fs */
+};
+
+static inline size_t romfs_maxsize(struct super_block *sb)
+{
+       return (size_t) (unsigned long) sb->s_fs_info;
+}
+
+static inline struct romfs_inode_info *ROMFS_I(struct inode *inode)
+{
+       return container_of(inode, struct romfs_inode_info, vfs_inode);
+}
+
+/*
+ * mmap-nommu.c
+ */
+#if !defined(CONFIG_MMU) && defined(CONFIG_ROMFS_ON_MTD)
+extern const struct file_operations romfs_ro_fops;
+#else
+#define romfs_ro_fops  generic_ro_fops
+#endif
+
+/*
+ * storage.c
+ */
+extern int romfs_dev_read(struct super_block *sb, unsigned long pos,
+                         void *buf, size_t buflen);
+extern ssize_t romfs_dev_strnlen(struct super_block *sb,
+                                unsigned long pos, size_t maxlen);
+extern int romfs_dev_strncmp(struct super_block *sb, unsigned long pos,
+                            const char *str, size_t size);
diff --git a/fs/romfs/mmap-nommu.c b/fs/romfs/mmap-nommu.c
new file mode 100644 (file)
index 0000000..f0511e8
--- /dev/null
@@ -0,0 +1,75 @@
+/* NOMMU mmap support for RomFS on MTD devices
+ *
+ * Copyright Â© 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/mm.h>
+#include <linux/mtd/super.h>
+#include "internal.h"
+
+/*
+ * try to determine where a shared mapping can be made
+ * - only supported for NOMMU at the moment (MMU can't doesn't copy private
+ *   mappings)
+ * - attempts to map through to the underlying MTD device
+ */
+static unsigned long romfs_get_unmapped_area(struct file *file,
+                                            unsigned long addr,
+                                            unsigned long len,
+                                            unsigned long pgoff,
+                                            unsigned long flags)
+{
+       struct inode *inode = file->f_mapping->host;
+       struct mtd_info *mtd = inode->i_sb->s_mtd;
+       unsigned long isize, offset;
+
+       if (!mtd)
+               goto cant_map_directly;
+
+       isize = i_size_read(inode);
+       offset = pgoff << PAGE_SHIFT;
+       if (offset > isize || len > isize || offset > isize - len)
+               return (unsigned long) -EINVAL;
+
+       /* we need to call down to the MTD layer to do the actual mapping */
+       if (mtd->get_unmapped_area) {
+               if (addr != 0)
+                       return (unsigned long) -EINVAL;
+
+               if (len > mtd->size || pgoff >= (mtd->size >> PAGE_SHIFT))
+                       return (unsigned long) -EINVAL;
+
+               offset += ROMFS_I(inode)->i_dataoffset;
+               if (offset > mtd->size - len)
+                       return (unsigned long) -EINVAL;
+
+               return mtd->get_unmapped_area(mtd, len, offset, flags);
+       }
+
+cant_map_directly:
+       return (unsigned long) -ENOSYS;
+}
+
+/*
+ * permit a R/O mapping to be made directly through onto an MTD device if
+ * possible
+ */
+static int romfs_mmap(struct file *file, struct vm_area_struct *vma)
+{
+       return vma->vm_flags & (VM_SHARED | VM_MAYSHARE) ? 0 : -ENOSYS;
+}
+
+const struct file_operations romfs_ro_fops = {
+       .llseek                 = generic_file_llseek,
+       .read                   = do_sync_read,
+       .aio_read               = generic_file_aio_read,
+       .splice_read            = generic_file_splice_read,
+       .mmap                   = romfs_mmap,
+       .get_unmapped_area      = romfs_get_unmapped_area,
+};
diff --git a/fs/romfs/storage.c b/fs/romfs/storage.c
new file mode 100644 (file)
index 0000000..7e3e1e1
--- /dev/null
@@ -0,0 +1,261 @@
+/* RomFS storage access routines
+ *
+ * Copyright Â© 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.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; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/fs.h>
+#include <linux/mtd/super.h>
+#include <linux/buffer_head.h>
+#include "internal.h"
+
+#if !defined(CONFIG_ROMFS_ON_MTD) && !defined(CONFIG_ROMFS_ON_BLOCK)
+#error no ROMFS backing store interface configured
+#endif
+
+#ifdef CONFIG_ROMFS_ON_MTD
+#define ROMFS_MTD_READ(sb, ...) ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__))
+
+/*
+ * read data from an romfs image on an MTD device
+ */
+static int romfs_mtd_read(struct super_block *sb, unsigned long pos,
+                         void *buf, size_t buflen)
+{
+       size_t rlen;
+       int ret;
+
+       ret = ROMFS_MTD_READ(sb, pos, buflen, &rlen, buf);
+       return (ret < 0 || rlen != buflen) ? -EIO : 0;
+}
+
+/*
+ * determine the length of a string in a romfs image on an MTD device
+ */
+static ssize_t romfs_mtd_strnlen(struct super_block *sb,
+                                unsigned long pos, size_t maxlen)
+{
+       ssize_t n = 0;
+       size_t segment;
+       u_char buf[16], *p;
+       size_t len;
+       int ret;
+
+       /* scan the string up to 16 bytes at a time */
+       while (maxlen > 0) {
+               segment = min_t(size_t, maxlen, 16);
+               ret = ROMFS_MTD_READ(sb, pos, segment, &len, buf);
+               if (ret < 0)
+                       return ret;
+               p = memchr(buf, 0, len);
+               if (p)
+                       return n + (p - buf);
+               maxlen -= len;
+               pos += len;
+               n += len;
+       }
+
+       return n;
+}
+
+/*
+ * compare a string to one in a romfs image on MTD
+ * - return 1 if matched, 0 if differ, -ve if error
+ */
+static int romfs_mtd_strncmp(struct super_block *sb, unsigned long pos,
+                            const char *str, size_t size)
+{
+       u_char buf[16];
+       size_t len, segment;
+       int ret;
+
+       /* scan the string up to 16 bytes at a time */
+       while (size > 0) {
+               segment = min_t(size_t, size, 16);
+               ret = ROMFS_MTD_READ(sb, pos, segment, &len, buf);
+               if (ret < 0)
+                       return ret;
+               if (memcmp(buf, str, len) != 0)
+                       return 0;
+               size -= len;
+               pos += len;
+               str += len;
+       }
+
+       return 1;
+}
+#endif /* CONFIG_ROMFS_ON_MTD */
+
+#ifdef CONFIG_ROMFS_ON_BLOCK
+/*
+ * read data from an romfs image on a block device
+ */
+static int romfs_blk_read(struct super_block *sb, unsigned long pos,
+                         void *buf, size_t buflen)
+{
+       struct buffer_head *bh;
+       unsigned long offset;
+       size_t segment;
+
+       /* copy the string up to blocksize bytes at a time */
+       while (buflen > 0) {
+               offset = pos & (ROMBSIZE - 1);
+               segment = min_t(size_t, buflen, ROMBSIZE - offset);
+               bh = sb_bread(sb, pos >> ROMBSBITS);
+               if (!bh)
+                       return -EIO;
+               memcpy(buf, bh->b_data + offset, segment);
+               brelse(bh);
+               buflen -= segment;
+               pos += segment;
+       }
+
+       return 0;
+}
+
+/*
+ * determine the length of a string in romfs on a block device
+ */
+static ssize_t romfs_blk_strnlen(struct super_block *sb,
+                                unsigned long pos, size_t limit)
+{
+       struct buffer_head *bh;
+       unsigned long offset;
+       ssize_t n = 0;
+       size_t segment;
+       u_char *buf, *p;
+
+       /* scan the string up to blocksize bytes at a time */
+       while (limit > 0) {
+               offset = pos & (ROMBSIZE - 1);
+               segment = min_t(size_t, limit, ROMBSIZE - offset);
+               bh = sb_bread(sb, pos >> ROMBSBITS);
+               if (!bh)
+                       return -EIO;
+               buf = bh->b_data + offset;
+               p = memchr(buf, 0, segment);
+               brelse(bh);
+               if (p)
+                       return n + (p - buf);
+               limit -= segment;
+               pos += segment;
+               n += segment;
+       }
+
+       return n;
+}
+
+/*
+ * compare a string to one in a romfs image on a block device
+ * - return 1 if matched, 0 if differ, -ve if error
+ */
+static int romfs_blk_strncmp(struct super_block *sb, unsigned long pos,
+                            const char *str, size_t size)
+{
+       struct buffer_head *bh;
+       unsigned long offset;
+       size_t segment;
+       bool x;
+
+       /* scan the string up to 16 bytes at a time */
+       while (size > 0) {
+               offset = pos & (ROMBSIZE - 1);
+               segment = min_t(size_t, size, ROMBSIZE - offset);
+               bh = sb_bread(sb, pos >> ROMBSBITS);
+               if (!bh)
+                       return -EIO;
+               x = (memcmp(bh->b_data + offset, str, segment) != 0);
+               brelse(bh);
+               if (x)
+                       return 0;
+               size -= segment;
+               pos += segment;
+               str += segment;
+       }
+
+       return 1;
+}
+#endif /* CONFIG_ROMFS_ON_BLOCK */
+
+/*
+ * read data from the romfs image
+ */
+int romfs_dev_read(struct super_block *sb, unsigned long pos,
+                  void *buf, size_t buflen)
+{
+       size_t limit;
+
+       limit = romfs_maxsize(sb);
+       if (pos >= limit)
+               return -EIO;
+       if (buflen > limit - pos)
+               buflen = limit - pos;
+
+#ifdef CONFIG_ROMFS_ON_MTD
+       if (sb->s_mtd)
+               return romfs_mtd_read(sb, pos, buf, buflen);
+#endif
+#ifdef CONFIG_ROMFS_ON_BLOCK
+       if (sb->s_bdev)
+               return romfs_blk_read(sb, pos, buf, buflen);
+#endif
+       return -EIO;
+}
+
+/*
+ * determine the length of a string in romfs
+ */
+ssize_t romfs_dev_strnlen(struct super_block *sb,
+                         unsigned long pos, size_t maxlen)
+{
+       size_t limit;
+
+       limit = romfs_maxsize(sb);
+       if (pos >= limit)
+               return -EIO;
+       if (maxlen > limit - pos)
+               maxlen = limit - pos;
+
+#ifdef CONFIG_ROMFS_ON_MTD
+       if (sb->s_mtd)
+               return romfs_mtd_strnlen(sb, pos, limit);
+#endif
+#ifdef CONFIG_ROMFS_ON_BLOCK
+       if (sb->s_bdev)
+               return romfs_blk_strnlen(sb, pos, limit);
+#endif
+       return -EIO;
+}
+
+/*
+ * compare a string to one in romfs
+ * - return 1 if matched, 0 if differ, -ve if error
+ */
+int romfs_dev_strncmp(struct super_block *sb, unsigned long pos,
+                     const char *str, size_t size)
+{
+       size_t limit;
+
+       limit = romfs_maxsize(sb);
+       if (pos >= limit)
+               return -EIO;
+       if (size > ROMFS_MAXFN)
+               return -ENAMETOOLONG;
+       if (size > limit - pos)
+               return -EIO;
+
+#ifdef CONFIG_ROMFS_ON_MTD
+       if (sb->s_mtd)
+               return romfs_mtd_strncmp(sb, pos, str, size);
+#endif
+#ifdef CONFIG_ROMFS_ON_BLOCK
+       if (sb->s_bdev)
+               return romfs_blk_strncmp(sb, pos, str, size);
+#endif
+       return -EIO;
+}
diff --git a/fs/romfs/super.c b/fs/romfs/super.c
new file mode 100644 (file)
index 0000000..10ca7d9
--- /dev/null
@@ -0,0 +1,653 @@
+/* Block- or MTD-based romfs
+ *
+ * Copyright Â© 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * Derived from: ROMFS file system, Linux implementation
+ *
+ * Copyright Â© 1997-1999  Janos Farkas <chexum@shadow.banki.hu>
+ *
+ * Using parts of the minix filesystem
+ * Copyright Â© 1991, 1992  Linus Torvalds
+ *
+ * and parts of the affs filesystem additionally
+ * Copyright Â© 1993  Ray Burr
+ * Copyright Â© 1996  Hans-Joachim Widmaier
+ *
+ * Changes
+ *                                     Changed for 2.1.19 modules
+ *     Jan 1997                        Initial release
+ *     Jun 1997                        2.1.43+ changes
+ *                                     Proper page locking in readpage
+ *                                     Changed to work with 2.1.45+ fs
+ *     Jul 1997                        Fixed follow_link
+ *                     2.1.47
+ *                                     lookup shouldn't return -ENOENT
+ *                                     from Horst von Brand:
+ *                                       fail on wrong checksum
+ *                                       double unlock_super was possible
+ *                                       correct namelen for statfs
+ *                                     spotted by Bill Hawes:
+ *                                       readlink shouldn't iput()
+ *     Jun 1998        2.1.106         from Avery Pennarun: glibc scandir()
+ *                                       exposed a problem in readdir
+ *                     2.1.107         code-freeze spellchecker run
+ *     Aug 1998                        2.1.118+ VFS changes
+ *     Sep 1998        2.1.122         another VFS change (follow_link)
+ *     Apr 1999        2.2.7           no more EBADF checking in
+ *                                       lookup/readdir, use ERR_PTR
+ *     Jun 1999        2.3.6           d_alloc_root use changed
+ *                     2.3.9           clean up usage of ENOENT/negative
+ *                                       dentries in lookup
+ *                                     clean up page flags setting
+ *                                       (error, uptodate, locking) in
+ *                                       in readpage
+ *                                     use init_special_inode for
+ *                                       fifos/sockets (and streamline) in
+ *                                       read_inode, fix _ops table order
+ *     Aug 1999        2.3.16          __initfunc() => __init change
+ *     Oct 1999        2.3.24          page->owner hack obsoleted
+ *     Nov 1999        2.3.27          2.3.25+ page->offset => index change
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/parser.h>
+#include <linux/mount.h>
+#include <linux/namei.h>
+#include <linux/statfs.h>
+#include <linux/mtd/super.h>
+#include <linux/ctype.h>
+#include <linux/highmem.h>
+#include <linux/pagemap.h>
+#include <linux/uaccess.h>
+#include "internal.h"
+
+static struct kmem_cache *romfs_inode_cachep;
+
+static const umode_t romfs_modemap[8] = {
+       0,                      /* hard link */
+       S_IFDIR  | 0644,        /* directory */
+       S_IFREG  | 0644,        /* regular file */
+       S_IFLNK  | 0777,        /* symlink */
+       S_IFBLK  | 0600,        /* blockdev */
+       S_IFCHR  | 0600,        /* chardev */
+       S_IFSOCK | 0644,        /* socket */
+       S_IFIFO  | 0644         /* FIFO */
+};
+
+static const unsigned char romfs_dtype_table[] = {
+       DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_SOCK, DT_FIFO
+};
+
+static struct inode *romfs_iget(struct super_block *sb, unsigned long pos);
+
+/*
+ * read a page worth of data from the image
+ */
+static int romfs_readpage(struct file *file, struct page *page)
+{
+       struct inode *inode = page->mapping->host;
+       loff_t offset, size;
+       unsigned long fillsize, pos;
+       void *buf;
+       int ret;
+
+       buf = kmap(page);
+       if (!buf)
+               return -ENOMEM;
+
+       /* 32 bit warning -- but not for us :) */
+       offset = page_offset(page);
+       size = i_size_read(inode);
+       fillsize = 0;
+       ret = 0;
+       if (offset < size) {
+               size -= offset;
+               fillsize = size > PAGE_SIZE ? PAGE_SIZE : size;
+
+               pos = ROMFS_I(inode)->i_dataoffset + offset;
+
+               ret = romfs_dev_read(inode->i_sb, pos, buf, fillsize);
+               if (ret < 0) {
+                       SetPageError(page);
+                       fillsize = 0;
+                       ret = -EIO;
+               }
+       }
+
+       if (fillsize < PAGE_SIZE)
+               memset(buf + fillsize, 0, PAGE_SIZE - fillsize);
+       if (ret == 0)
+               SetPageUptodate(page);
+
+       flush_dcache_page(page);
+       kunmap(page);
+       unlock_page(page);
+       return ret;
+}
+
+static const struct address_space_operations romfs_aops = {
+       .readpage       = romfs_readpage
+};
+
+/*
+ * read the entries from a directory
+ */
+static int romfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
+{
+       struct inode *i = filp->f_dentry->d_inode;
+       struct romfs_inode ri;
+       unsigned long offset, maxoff;
+       int j, ino, nextfh;
+       int stored = 0;
+       char fsname[ROMFS_MAXFN];       /* XXX dynamic? */
+       int ret;
+
+       maxoff = romfs_maxsize(i->i_sb);
+
+       offset = filp->f_pos;
+       if (!offset) {
+               offset = i->i_ino & ROMFH_MASK;
+               ret = romfs_dev_read(i->i_sb, offset, &ri, ROMFH_SIZE);
+               if (ret < 0)
+                       goto out;
+               offset = be32_to_cpu(ri.spec) & ROMFH_MASK;
+       }
+
+       /* Not really failsafe, but we are read-only... */
+       for (;;) {
+               if (!offset || offset >= maxoff) {
+                       offset = maxoff;
+                       filp->f_pos = offset;
+                       goto out;
+               }
+               filp->f_pos = offset;
+
+               /* Fetch inode info */
+               ret = romfs_dev_read(i->i_sb, offset, &ri, ROMFH_SIZE);
+               if (ret < 0)
+                       goto out;
+
+               j = romfs_dev_strnlen(i->i_sb, offset + ROMFH_SIZE,
+                                     sizeof(fsname) - 1);
+               if (j < 0)
+                       goto out;
+
+               ret = romfs_dev_read(i->i_sb, offset + ROMFH_SIZE, fsname, j);
+               if (ret < 0)
+                       goto out;
+               fsname[j] = '\0';
+
+               ino = offset;
+               nextfh = be32_to_cpu(ri.next);
+               if ((nextfh & ROMFH_TYPE) == ROMFH_HRD)
+                       ino = be32_to_cpu(ri.spec);
+               if (filldir(dirent, fsname, j, offset, ino,
+                           romfs_dtype_table[nextfh & ROMFH_TYPE]) < 0)
+                       goto out;
+
+               stored++;
+               offset = nextfh & ROMFH_MASK;
+       }
+
+out:
+       return stored;
+}
+
+/*
+ * look up an entry in a directory
+ */
+static struct dentry *romfs_lookup(struct inode *dir, struct dentry *dentry,
+                                  struct nameidata *nd)
+{
+       unsigned long offset, maxoff;
+       struct inode *inode;
+       struct romfs_inode ri;
+       const char *name;               /* got from dentry */
+       int len, ret;
+
+       offset = dir->i_ino & ROMFH_MASK;
+       ret = romfs_dev_read(dir->i_sb, offset, &ri, ROMFH_SIZE);
+       if (ret < 0)
+               goto error;
+
+       /* search all the file entries in the list starting from the one
+        * pointed to by the directory's special data */
+       maxoff = romfs_maxsize(dir->i_sb);
+       offset = be32_to_cpu(ri.spec) & ROMFH_MASK;
+
+       name = dentry->d_name.name;
+       len = dentry->d_name.len;
+
+       for (;;) {
+               if (!offset || offset >= maxoff)
+                       goto out0;
+
+               ret = romfs_dev_read(dir->i_sb, offset, &ri, sizeof(ri));
+               if (ret < 0)
+                       goto error;
+
+               /* try to match the first 16 bytes of name */
+               ret = romfs_dev_strncmp(dir->i_sb, offset + ROMFH_SIZE, name,
+                                       len);
+               if (ret < 0)
+                       goto error;
+               if (ret == 1)
+                       break;
+
+               /* next entry */
+               offset = be32_to_cpu(ri.next) & ROMFH_MASK;
+       }
+
+       /* Hard link handling */
+       if ((be32_to_cpu(ri.next) & ROMFH_TYPE) == ROMFH_HRD)
+               offset = be32_to_cpu(ri.spec) & ROMFH_MASK;
+
+       inode = romfs_iget(dir->i_sb, offset);
+       if (IS_ERR(inode)) {
+               ret = PTR_ERR(inode);
+               goto error;
+       }
+       goto outi;
+
+       /*
+        * it's a bit funky, _lookup needs to return an error code
+        * (negative) or a NULL, both as a dentry.  ENOENT should not
+        * be returned, instead we need to create a negative dentry by
+        * d_add(dentry, NULL); and return 0 as no error.
+        * (Although as I see, it only matters on writable file
+        * systems).
+        */
+out0:
+       inode = NULL;
+outi:
+       d_add(dentry, inode);
+       ret = 0;
+error:
+       return ERR_PTR(ret);
+}
+
+static const struct file_operations romfs_dir_operations = {
+       .read           = generic_read_dir,
+       .readdir        = romfs_readdir,
+};
+
+static struct inode_operations romfs_dir_inode_operations = {
+       .lookup         = romfs_lookup,
+};
+
+/*
+ * get a romfs inode based on its position in the image (which doubles as the
+ * inode number)
+ */
+static struct inode *romfs_iget(struct super_block *sb, unsigned long pos)
+{
+       struct romfs_inode_info *inode;
+       struct romfs_inode ri;
+       struct inode *i;
+       unsigned long nlen;
+       unsigned nextfh, ret;
+       umode_t mode;
+
+       /* we might have to traverse a chain of "hard link" file entries to get
+        * to the actual file */
+       for (;;) {
+               ret = romfs_dev_read(sb, pos, &ri, sizeof(ri));
+               if (ret < 0)
+                       goto error;
+
+               /* XXX: do romfs_checksum here too (with name) */
+
+               nextfh = be32_to_cpu(ri.next);
+               if ((nextfh & ROMFH_TYPE) != ROMFH_HRD)
+                       break;
+
+               pos = be32_to_cpu(ri.spec) & ROMFH_MASK;
+       }
+
+       /* determine the length of the filename */
+       nlen = romfs_dev_strnlen(sb, pos + ROMFH_SIZE, ROMFS_MAXFN);
+       if (IS_ERR_VALUE(nlen))
+               goto eio;
+
+       /* get an inode for this image position */
+       i = iget_locked(sb, pos);
+       if (!i)
+               return ERR_PTR(-ENOMEM);
+
+       if (!(i->i_state & I_NEW))
+               return i;
+
+       /* precalculate the data offset */
+       inode = ROMFS_I(i);
+       inode->i_metasize = (ROMFH_SIZE + nlen + 1 + ROMFH_PAD) & ROMFH_MASK;
+       inode->i_dataoffset = pos + inode->i_metasize;
+
+       i->i_nlink = 1;         /* Hard to decide.. */
+       i->i_size = be32_to_cpu(ri.size);
+       i->i_mtime.tv_sec = i->i_atime.tv_sec = i->i_ctime.tv_sec = 0;
+       i->i_mtime.tv_nsec = i->i_atime.tv_nsec = i->i_ctime.tv_nsec = 0;
+
+       /* set up mode and ops */
+       mode = romfs_modemap[nextfh & ROMFH_TYPE];
+
+       switch (nextfh & ROMFH_TYPE) {
+       case ROMFH_DIR:
+               i->i_size = ROMFS_I(i)->i_metasize;
+               i->i_op = &romfs_dir_inode_operations;
+               i->i_fop = &romfs_dir_operations;
+               if (nextfh & ROMFH_EXEC)
+                       mode |= S_IXUGO;
+               break;
+       case ROMFH_REG:
+               i->i_fop = &romfs_ro_fops;
+               i->i_data.a_ops = &romfs_aops;
+               if (i->i_sb->s_mtd)
+                       i->i_data.backing_dev_info =
+                               i->i_sb->s_mtd->backing_dev_info;
+               if (nextfh & ROMFH_EXEC)
+                       mode |= S_IXUGO;
+               break;
+       case ROMFH_SYM:
+               i->i_op = &page_symlink_inode_operations;
+               i->i_data.a_ops = &romfs_aops;
+               mode |= S_IRWXUGO;
+               break;
+       default:
+               /* depending on MBZ for sock/fifos */
+               nextfh = be32_to_cpu(ri.spec);
+               init_special_inode(i, mode, MKDEV(nextfh >> 16,
+                                                 nextfh & 0xffff));
+               break;
+       }
+
+       i->i_mode = mode;
+
+       unlock_new_inode(i);
+       return i;
+
+eio:
+       ret = -EIO;
+error:
+       printk(KERN_ERR "ROMFS: read error for inode 0x%lx\n", pos);
+       return ERR_PTR(ret);
+}
+
+/*
+ * allocate a new inode
+ */
+static struct inode *romfs_alloc_inode(struct super_block *sb)
+{
+       struct romfs_inode_info *inode;
+       inode = kmem_cache_alloc(romfs_inode_cachep, GFP_KERNEL);
+       return inode ? &inode->vfs_inode : NULL;
+}
+
+/*
+ * return a spent inode to the slab cache
+ */
+static void romfs_destroy_inode(struct inode *inode)
+{
+       kmem_cache_free(romfs_inode_cachep, ROMFS_I(inode));
+}
+
+/*
+ * get filesystem statistics
+ */
+static int romfs_statfs(struct dentry *dentry, struct kstatfs *buf)
+{
+       struct super_block *sb = dentry->d_sb;
+       u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
+
+       buf->f_type = ROMFS_MAGIC;
+       buf->f_namelen = ROMFS_MAXFN;
+       buf->f_bsize = ROMBSIZE;
+       buf->f_bfree = buf->f_bavail = buf->f_ffree;
+       buf->f_blocks =
+               (romfs_maxsize(dentry->d_sb) + ROMBSIZE - 1) >> ROMBSBITS;
+       buf->f_fsid.val[0] = (u32)id;
+       buf->f_fsid.val[1] = (u32)(id >> 32);
+       return 0;
+}
+
+/*
+ * remounting must involve read-only
+ */
+static int romfs_remount(struct super_block *sb, int *flags, char *data)
+{
+       *flags |= MS_RDONLY;
+       return 0;
+}
+
+static const struct super_operations romfs_super_ops = {
+       .alloc_inode    = romfs_alloc_inode,
+       .destroy_inode  = romfs_destroy_inode,
+       .statfs         = romfs_statfs,
+       .remount_fs     = romfs_remount,
+};
+
+/*
+ * checksum check on part of a romfs filesystem
+ */
+static __u32 romfs_checksum(const void *data, int size)
+{
+       const __be32 *ptr = data;
+       __u32 sum;
+
+       sum = 0;
+       size >>= 2;
+       while (size > 0) {
+               sum += be32_to_cpu(*ptr++);
+               size--;
+       }
+       return sum;
+}
+
+/*
+ * fill in the superblock
+ */
+static int romfs_fill_super(struct super_block *sb, void *data, int silent)
+{
+       struct romfs_super_block *rsb;
+       struct inode *root;
+       unsigned long pos, img_size;
+       const char *storage;
+       size_t len;
+       int ret;
+
+#ifdef CONFIG_BLOCK
+       if (!sb->s_mtd) {
+               sb_set_blocksize(sb, ROMBSIZE);
+       } else {
+               sb->s_blocksize = ROMBSIZE;
+               sb->s_blocksize_bits = blksize_bits(ROMBSIZE);
+       }
+#endif
+
+       sb->s_maxbytes = 0xFFFFFFFF;
+       sb->s_magic = ROMFS_MAGIC;
+       sb->s_flags |= MS_RDONLY | MS_NOATIME;
+       sb->s_op = &romfs_super_ops;
+
+       /* read the image superblock and check it */
+       rsb = kmalloc(512, GFP_KERNEL);
+       if (!rsb)
+               return -ENOMEM;
+
+       sb->s_fs_info = (void *) 512;
+       ret = romfs_dev_read(sb, 0, rsb, 512);
+       if (ret < 0)
+               goto error_rsb;
+
+       img_size = be32_to_cpu(rsb->size);
+
+       if (sb->s_mtd && img_size > sb->s_mtd->size)
+               goto error_rsb_inval;
+
+       sb->s_fs_info = (void *) img_size;
+
+       if (rsb->word0 != ROMSB_WORD0 || rsb->word1 != ROMSB_WORD1 ||
+           img_size < ROMFH_SIZE) {
+               if (!silent)
+                       printk(KERN_WARNING "VFS:"
+                              " Can't find a romfs filesystem on dev %s.\n",
+                              sb->s_id);
+               goto error_rsb_inval;
+       }
+
+       if (romfs_checksum(rsb, min_t(size_t, img_size, 512))) {
+               printk(KERN_ERR "ROMFS: bad initial checksum on dev %s.\n",
+                      sb->s_id);
+               goto error_rsb_inval;
+       }
+
+       storage = sb->s_mtd ? "MTD" : "the block layer";
+
+       len = strnlen(rsb->name, ROMFS_MAXFN);
+       if (!silent)
+               printk(KERN_NOTICE "ROMFS: Mounting image '%*.*s' through %s\n",
+                      (unsigned) len, (unsigned) len, rsb->name, storage);
+
+       kfree(rsb);
+       rsb = NULL;
+
+       /* find the root directory */
+       pos = (ROMFH_SIZE + len + 1 + ROMFH_PAD) & ROMFH_MASK;
+
+       root = romfs_iget(sb, pos);
+       if (!root)
+               goto error;
+
+       sb->s_root = d_alloc_root(root);
+       if (!sb->s_root)
+               goto error_i;
+
+       return 0;
+
+error_i:
+       iput(root);
+error:
+       return -EINVAL;
+error_rsb_inval:
+       ret = -EINVAL;
+error_rsb:
+       return ret;
+}
+
+/*
+ * get a superblock for mounting
+ */
+static int romfs_get_sb(struct file_system_type *fs_type,
+                       int flags, const char *dev_name,
+                       void *data, struct vfsmount *mnt)
+{
+       int ret = -EINVAL;
+
+#ifdef CONFIG_ROMFS_ON_MTD
+       ret = get_sb_mtd(fs_type, flags, dev_name, data, romfs_fill_super,
+                        mnt);
+#endif
+#ifdef CONFIG_ROMFS_ON_BLOCK
+       if (ret == -EINVAL)
+               ret = get_sb_bdev(fs_type, flags, dev_name, data,
+                                 romfs_fill_super, mnt);
+#endif
+       return ret;
+}
+
+/*
+ * destroy a romfs superblock in the appropriate manner
+ */
+static void romfs_kill_sb(struct super_block *sb)
+{
+#ifdef CONFIG_ROMFS_ON_MTD
+       if (sb->s_mtd) {
+               kill_mtd_super(sb);
+               return;
+       }
+#endif
+#ifdef CONFIG_ROMFS_ON_BLOCK
+       if (sb->s_bdev) {
+               kill_block_super(sb);
+               return;
+       }
+#endif
+}
+
+static struct file_system_type romfs_fs_type = {
+       .owner          = THIS_MODULE,
+       .name           = "romfs",
+       .get_sb         = romfs_get_sb,
+       .kill_sb        = romfs_kill_sb,
+       .fs_flags       = FS_REQUIRES_DEV,
+};
+
+/*
+ * inode storage initialiser
+ */
+static void romfs_i_init_once(void *_inode)
+{
+       struct romfs_inode_info *inode = _inode;
+
+       inode_init_once(&inode->vfs_inode);
+}
+
+/*
+ * romfs module initialisation
+ */
+static int __init init_romfs_fs(void)
+{
+       int ret;
+
+       printk(KERN_INFO "ROMFS MTD (C) 2007 Red Hat, Inc.\n");
+
+       romfs_inode_cachep =
+               kmem_cache_create("romfs_i",
+                                 sizeof(struct romfs_inode_info), 0,
+                                 SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD,
+                                 romfs_i_init_once);
+
+       if (!romfs_inode_cachep) {
+               printk(KERN_ERR
+                      "ROMFS error: Failed to initialise inode cache\n");
+               return -ENOMEM;
+       }
+       ret = register_filesystem(&romfs_fs_type);
+       if (ret) {
+               printk(KERN_ERR "ROMFS error: Failed to register filesystem\n");
+               goto error_register;
+       }
+       return 0;
+
+error_register:
+       kmem_cache_destroy(romfs_inode_cachep);
+       return ret;
+}
+
+/*
+ * romfs module removal
+ */
+static void __exit exit_romfs_fs(void)
+{
+       unregister_filesystem(&romfs_fs_type);
+       kmem_cache_destroy(romfs_inode_cachep);
+}
+
+module_init(init_romfs_fs);
+module_exit(exit_romfs_fs);
+
+MODULE_DESCRIPTION("Direct-MTD Capable RomFS");
+MODULE_AUTHOR("Red Hat, Inc.");
+MODULE_LICENSE("GPL"); /* Actually dual-licensed, but it doesn't matter for */
index dd727d43e5b788cead6f13e85944f594791c5e14..c18aa7e03e2b8d33470d6632052a839c3a1845c8 100644 (file)
@@ -737,10 +737,19 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
         * ->write_end. Most of the time, these expect i_mutex to
         * be held. Since this may result in an ABBA deadlock with
         * pipe->inode, we have to order lock acquiry here.
+        *
+        * Outer lock must be inode->i_mutex, as pipe_wait() will
+        * release and reacquire pipe->inode->i_mutex, AND inode must
+        * never be a pipe.
         */
-       inode_double_lock(inode, pipe->inode);
+       WARN_ON(S_ISFIFO(inode->i_mode));
+       mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
+       if (pipe->inode)
+               mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
        ret = __splice_from_pipe(pipe, &sd, actor);
-       inode_double_unlock(inode, pipe->inode);
+       if (pipe->inode)
+               mutex_unlock(&pipe->inode->i_mutex);
+       mutex_unlock(&inode->i_mutex);
 
        return ret;
 }
@@ -831,11 +840,17 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
        };
        ssize_t ret;
 
-       inode_double_lock(inode, pipe->inode);
+       WARN_ON(S_ISFIFO(inode->i_mode));
+       mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
        ret = file_remove_suid(out);
-       if (likely(!ret))
+       if (likely(!ret)) {
+               if (pipe->inode)
+                       mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
                ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
-       inode_double_unlock(inode, pipe->inode);
+               if (pipe->inode)
+                       mutex_unlock(&pipe->inode->i_mutex);
+       }
+       mutex_unlock(&inode->i_mutex);
        if (ret > 0) {
                unsigned long nr_pages;
 
index 69e971d5ddc15dd4d7c51e204e6b483a19aa2016..2b1b8fe5e03765cdb91cc6311176d31a8ea3d054 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/dcache.h>
 #include <linux/exportfs.h>
 #include <linux/zlib.h>
+#include <linux/slab.h>
 
 #include "squashfs_fs.h"
 #include "squashfs_fs_sb.h"
index 77cb4ec919b9a7bf941a3effe524c180343d8dee..786fe7d72790ac5646197224fc2af88222dade0a 100644 (file)
@@ -771,6 +771,46 @@ void kill_litter_super(struct super_block *sb)
 
 EXPORT_SYMBOL(kill_litter_super);
 
+static int ns_test_super(struct super_block *sb, void *data)
+{
+       return sb->s_fs_info == data;
+}
+
+static int ns_set_super(struct super_block *sb, void *data)
+{
+       sb->s_fs_info = data;
+       return set_anon_super(sb, NULL);
+}
+
+int get_sb_ns(struct file_system_type *fs_type, int flags, void *data,
+       int (*fill_super)(struct super_block *, void *, int),
+       struct vfsmount *mnt)
+{
+       struct super_block *sb;
+
+       sb = sget(fs_type, ns_test_super, ns_set_super, data);
+       if (IS_ERR(sb))
+               return PTR_ERR(sb);
+
+       if (!sb->s_root) {
+               int err;
+               sb->s_flags = flags;
+               err = fill_super(sb, data, flags & MS_SILENT ? 1 : 0);
+               if (err) {
+                       up_write(&sb->s_umount);
+                       deactivate_super(sb);
+                       return err;
+               }
+
+               sb->s_flags |= MS_ACTIVE;
+       }
+
+       simple_set_mnt(mnt, sb);
+       return 0;
+}
+
+EXPORT_SYMBOL(get_sb_ns);
+
 #ifdef CONFIG_BLOCK
 static int set_bdev_super(struct super_block *s, void *data)
 {
index f393620890ee4dfd8cb4c2bde0e32dce25390635..af1914462f02b172fb2bb9f37c14fc130e7d8b6c 100644 (file)
@@ -194,29 +194,26 @@ static int make_free_space(struct ubifs_info *c)
 }
 
 /**
- * ubifs_calc_min_idx_lebs - calculate amount of eraseblocks for the index.
+ * ubifs_calc_min_idx_lebs - calculate amount of LEBs for the index.
  * @c: UBIFS file-system description object
  *
- * This function calculates and returns the number of eraseblocks which should
- * be kept for index usage.
+ * This function calculates and returns the number of LEBs which should be kept
+ * for index usage.
  */
 int ubifs_calc_min_idx_lebs(struct ubifs_info *c)
 {
-       int idx_lebs, eff_leb_size = c->leb_size - c->max_idx_node_sz;
+       int idx_lebs;
        long long idx_size;
 
        idx_size = c->old_idx_sz + c->budg_idx_growth + c->budg_uncommitted_idx;
-
        /* And make sure we have thrice the index size of space reserved */
-       idx_size = idx_size + (idx_size << 1);
-
+       idx_size += idx_size << 1;
        /*
         * We do not maintain 'old_idx_size' as 'old_idx_lebs'/'old_idx_bytes'
         * pair, nor similarly the two variables for the new index size, so we
         * have to do this costly 64-bit division on fast-path.
         */
-       idx_size += eff_leb_size - 1;
-       idx_lebs = div_u64(idx_size, eff_leb_size);
+       idx_lebs = div_u64(idx_size + c->idx_leb_size - 1, c->idx_leb_size);
        /*
         * The index head is not available for the in-the-gaps method, so add an
         * extra LEB to compensate.
@@ -310,23 +307,23 @@ static int can_use_rp(struct ubifs_info *c)
  * do_budget_space - reserve flash space for index and data growth.
  * @c: UBIFS file-system description object
  *
- * This function makes sure UBIFS has enough free eraseblocks for index growth
- * and data.
+ * This function makes sure UBIFS has enough free LEBs for index growth and
+ * data.
  *
  * When budgeting index space, UBIFS reserves thrice as many LEBs as the index
  * would take if it was consolidated and written to the flash. This guarantees
  * that the "in-the-gaps" commit method always succeeds and UBIFS will always
  * be able to commit dirty index. So this function basically adds amount of
  * budgeted index space to the size of the current index, multiplies this by 3,
- * and makes sure this does not exceed the amount of free eraseblocks.
+ * and makes sure this does not exceed the amount of free LEBs.
  *
  * Notes about @c->min_idx_lebs and @c->lst.idx_lebs variables:
  * o @c->lst.idx_lebs is the number of LEBs the index currently uses. It might
  *    be large, because UBIFS does not do any index consolidation as long as
  *    there is free space. IOW, the index may take a lot of LEBs, but the LEBs
  *    will contain a lot of dirt.
- * o @c->min_idx_lebs is the the index presumably takes. IOW, the index may be
- *   consolidated to take up to @c->min_idx_lebs LEBs.
+ * o @c->min_idx_lebs is the number of LEBS the index presumably takes. IOW,
+ *    the index may be consolidated to take up to @c->min_idx_lebs LEBs.
  *
  * This function returns zero in case of success, and %-ENOSPC in case of
  * failure.
@@ -695,12 +692,12 @@ long long ubifs_reported_space(const struct ubifs_info *c, long long free)
  * This function calculates amount of free space to report to user-space.
  *
  * Because UBIFS may introduce substantial overhead (the index, node headers,
- * alignment, wastage at the end of eraseblocks, etc), it cannot report real
- * amount of free flash space it has (well, because not all dirty space is
- * reclaimable, UBIFS does not actually know the real amount). If UBIFS did so,
- * it would bread user expectations about what free space is. Users seem to
- * accustomed to assume that if the file-system reports N bytes of free space,
- * they would be able to fit a file of N bytes to the FS. This almost works for
+ * alignment, wastage at the end of LEBs, etc), it cannot report real amount of
+ * free flash space it has (well, because not all dirty space is reclaimable,
+ * UBIFS does not actually know the real amount). If UBIFS did so, it would
+ * bread user expectations about what free space is. Users seem to accustomed
+ * to assume that if the file-system reports N bytes of free space, they would
+ * be able to fit a file of N bytes to the FS. This almost works for
  * traditional file-systems, because they have way less overhead than UBIFS.
  * So, to keep users happy, UBIFS tries to take the overhead into account.
  */
index e975bd82f38b8d31d6a4ae4b25a587b6c5494318..ce2cd834361805448b4102ebea0b67473127260d 100644 (file)
@@ -479,9 +479,9 @@ void dbg_dump_node(const struct ubifs_info *c, const void *node)
                                          "bad or corrupted node)");
                else {
                        for (i = 0; i < nlen && dent->name[i]; i++)
-                               printk("%c", dent->name[i]);
+                               printk(KERN_CONT "%c", dent->name[i]);
                }
-               printk("\n");
+               printk(KERN_CONT "\n");
 
                break;
        }
@@ -1214,7 +1214,7 @@ static int dbg_check_znode(struct ubifs_info *c, struct ubifs_zbranch *zbr)
 
                        /*
                         * Make sure the last key in our znode is less or
-                        * equivalent than the the key in zbranch which goes
+                        * equivalent than the key in the zbranch which goes
                         * after our pointing zbranch.
                         */
                        cmp = keys_cmp(c, max,
index 0ff89fe71e5103c3effe3dfd27dc2bac58b8bfc5..6d34dc7e33e10c87adb4df4f25ab54c6eb5587fc 100644 (file)
@@ -430,6 +430,7 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
        struct ubifs_inode *ui = ubifs_inode(inode);
        pgoff_t index = pos >> PAGE_CACHE_SHIFT;
        int uninitialized_var(err), appending = !!(pos + len > inode->i_size);
+       int skipped_read = 0;
        struct page *page;
 
        ubifs_assert(ubifs_inode(inode)->ui_size == inode->i_size);
@@ -444,7 +445,7 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
 
        if (!PageUptodate(page)) {
                /* The page is not loaded from the flash */
-               if (!(pos & ~PAGE_CACHE_MASK) && len == PAGE_CACHE_SIZE)
+               if (!(pos & ~PAGE_CACHE_MASK) && len == PAGE_CACHE_SIZE) {
                        /*
                         * We change whole page so no need to load it. But we
                         * have to set the @PG_checked flag to make the further
@@ -453,7 +454,8 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
                         * the media.
                         */
                        SetPageChecked(page);
-               else {
+                       skipped_read = 1;
+               } else {
                        err = do_readpage(page);
                        if (err) {
                                unlock_page(page);
@@ -469,6 +471,14 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
        err = allocate_budget(c, page, ui, appending);
        if (unlikely(err)) {
                ubifs_assert(err == -ENOSPC);
+               /*
+                * If we skipped reading the page because we were going to
+                * write all of it, then it is not up to date.
+                */
+               if (skipped_read) {
+                       ClearPageChecked(page);
+                       ClearPageUptodate(page);
+               }
                /*
                 * Budgeting failed which means it would have to force
                 * write-back but didn't, because we set the @fast flag in the
@@ -949,7 +959,7 @@ static int do_writepage(struct page *page, int len)
  * whole index and correct all inode sizes, which is long an unacceptable.
  *
  * To prevent situations like this, UBIFS writes pages back only if they are
- * within last synchronized inode size, i.e. the the size which has been
+ * within the last synchronized inode size, i.e. the size which has been
  * written to the flash media last time. Otherwise, UBIFS forces inode
  * write-back, thus making sure the on-flash inode contains current inode size,
  * and then keeps writing pages back.
index 717d79c97c5e7b148bbf335862b2abbbfafc5699..1d54383d1269b1df2ecfdc8cb7a8e02c917afc74 100644 (file)
@@ -478,7 +478,7 @@ const struct ubifs_lprops *do_find_free_space(struct ubifs_info *c,
  * ubifs_find_free_space - find a data LEB with free space.
  * @c: the UBIFS file-system description object
  * @min_space: minimum amount of required free space
- * @free: contains amount of free space in the LEB on exit
+ * @offs: contains offset of where free space starts on exit
  * @squeeze: whether to try to find space in a non-empty LEB first
  *
  * This function looks for an LEB with at least @min_space bytes of free space.
@@ -490,7 +490,7 @@ const struct ubifs_lprops *do_find_free_space(struct ubifs_info *c,
  * failed to find a LEB with @min_space bytes of free space and other a negative
  * error codes in case of failure.
  */
-int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *free,
+int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *offs,
                          int squeeze)
 {
        const struct ubifs_lprops *lprops;
@@ -558,10 +558,10 @@ int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *free,
                spin_unlock(&c->space_lock);
        }
 
-       *free = lprops->free;
+       *offs = c->leb_size - lprops->free;
        ubifs_release_lprops(c);
 
-       if (*free == c->leb_size) {
+       if (*offs == 0) {
                /*
                 * Ensure that empty LEBs have been unmapped. They may not have
                 * been, for example, because of an unclean unmount.  Also
@@ -573,8 +573,8 @@ int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *free,
                        return err;
        }
 
-       dbg_find("found LEB %d, free %d", lnum, *free);
-       ubifs_assert(*free >= min_space);
+       dbg_find("found LEB %d, free %d", lnum, c->leb_size - *offs);
+       ubifs_assert(*offs <= c->leb_size - min_space);
        return lnum;
 
 out:
index a711d33b3d3e1434f27dc763983200886155e9fd..f0f5f15d384ea311e730ae73f3fe3900b0a0eca9 100644 (file)
@@ -47,7 +47,7 @@
  * have to waste large pieces of free space at the end of LEB B, because nodes
  * from LEB A would not fit. And the worst situation is when all nodes are of
  * maximum size. So dark watermark is the amount of free + dirty space in LEB
- * which are guaranteed to be reclaimable. If LEB has less space, the GC migh
+ * which are guaranteed to be reclaimable. If LEB has less space, the GC might
  * be unable to reclaim it. So, LEBs with free + dirty greater than dark
  * watermark are "good" LEBs from GC's point of few. The other LEBs are not so
  * good, and GC takes extra care when moving them.
 #include <linux/pagemap.h>
 #include "ubifs.h"
 
-/*
- * GC tries to optimize the way it fit nodes to available space, and it sorts
- * nodes a little. The below constants are watermarks which define "large",
- * "medium", and "small" nodes.
- */
-#define MEDIUM_NODE_WM (UBIFS_BLOCK_SIZE / 4)
-#define SMALL_NODE_WM  UBIFS_MAX_DENT_NODE_SZ
-
 /*
  * GC may need to move more than one LEB to make progress. The below constants
  * define "soft" and "hard" limits on the number of LEBs the garbage collector
@@ -116,83 +108,222 @@ static int switch_gc_head(struct ubifs_info *c)
 }
 
 /**
- * joinup - bring data nodes for an inode together.
- * @c: UBIFS file-system description object
- * @sleb: describes scanned LEB
- * @inum: inode number
- * @blk: block number
- * @data: list to which to add data nodes
+ * list_sort - sort a list.
+ * @priv: private data, passed to @cmp
+ * @head: the list to sort
+ * @cmp: the elements comparison function
  *
- * This function looks at the first few nodes in the scanned LEB @sleb and adds
- * them to @data if they are data nodes from @inum and have a larger block
- * number than @blk. This function returns %0 on success and a negative error
- * code on failure.
+ * This function has been implemented by Mark J Roberts <mjr@znex.org>. It
+ * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted
+ * in ascending order.
+ *
+ * The comparison function @cmp is supposed to return a negative value if @a is
+ * than @b, and a positive value if @a is greater than @b. If @a and @b are
+ * equivalent, then it does not matter what this function returns.
  */
-static int joinup(struct ubifs_info *c, struct ubifs_scan_leb *sleb, ino_t inum,
-                 unsigned int blk, struct list_head *data)
+static void list_sort(void *priv, struct list_head *head,
+                     int (*cmp)(void *priv, struct list_head *a,
+                                struct list_head *b))
 {
-       int err, cnt = 6, lnum = sleb->lnum, offs;
-       struct ubifs_scan_node *snod, *tmp;
-       union ubifs_key *key;
+       struct list_head *p, *q, *e, *list, *tail, *oldhead;
+       int insize, nmerges, psize, qsize, i;
+
+       if (list_empty(head))
+               return;
+
+       list = head->next;
+       list_del(head);
+       insize = 1;
+       for (;;) {
+               p = oldhead = list;
+               list = tail = NULL;
+               nmerges = 0;
+
+               while (p) {
+                       nmerges++;
+                       q = p;
+                       psize = 0;
+                       for (i = 0; i < insize; i++) {
+                               psize++;
+                               q = q->next == oldhead ? NULL : q->next;
+                               if (!q)
+                                       break;
+                       }
 
-       list_for_each_entry_safe(snod, tmp, &sleb->nodes, list) {
-               key = &snod->key;
-               if (key_inum(c, key) == inum &&
-                   key_type(c, key) == UBIFS_DATA_KEY &&
-                   key_block(c, key) > blk) {
-                       offs = snod->offs;
-                       err = ubifs_tnc_has_node(c, key, 0, lnum, offs, 0);
-                       if (err < 0)
-                               return err;
-                       list_del(&snod->list);
-                       if (err) {
-                               list_add_tail(&snod->list, data);
-                               blk = key_block(c, key);
-                       } else
-                               kfree(snod);
-                       cnt = 6;
-               } else if (--cnt == 0)
+                       qsize = insize;
+                       while (psize > 0 || (qsize > 0 && q)) {
+                               if (!psize) {
+                                       e = q;
+                                       q = q->next;
+                                       qsize--;
+                                       if (q == oldhead)
+                                               q = NULL;
+                               } else if (!qsize || !q) {
+                                       e = p;
+                                       p = p->next;
+                                       psize--;
+                                       if (p == oldhead)
+                                               p = NULL;
+                               } else if (cmp(priv, p, q) <= 0) {
+                                       e = p;
+                                       p = p->next;
+                                       psize--;
+                                       if (p == oldhead)
+                                               p = NULL;
+                               } else {
+                                       e = q;
+                                       q = q->next;
+                                       qsize--;
+                                       if (q == oldhead)
+                                               q = NULL;
+                               }
+                               if (tail)
+                                       tail->next = e;
+                               else
+                                       list = e;
+                               e->prev = tail;
+                               tail = e;
+                       }
+                       p = q;
+               }
+
+               tail->next = list;
+               list->prev = tail;
+
+               if (nmerges <= 1)
                        break;
+
+               insize *= 2;
        }
-       return 0;
+
+       head->next = list;
+       head->prev = list->prev;
+       list->prev->next = head;
+       list->prev = head;
 }
 
 /**
- * move_nodes - move nodes.
+ * data_nodes_cmp - compare 2 data nodes.
+ * @priv: UBIFS file-system description object
+ * @a: first data node
+ * @a: second data node
+ *
+ * This function compares data nodes @a and @b. Returns %1 if @a has greater
+ * inode or block number, and %-1 otherwise.
+ */
+int data_nodes_cmp(void *priv, struct list_head *a, struct list_head *b)
+{
+       ino_t inuma, inumb;
+       struct ubifs_info *c = priv;
+       struct ubifs_scan_node *sa, *sb;
+
+       cond_resched();
+       sa = list_entry(a, struct ubifs_scan_node, list);
+       sb = list_entry(b, struct ubifs_scan_node, list);
+       ubifs_assert(key_type(c, &sa->key) == UBIFS_DATA_KEY);
+       ubifs_assert(key_type(c, &sb->key) == UBIFS_DATA_KEY);
+
+       inuma = key_inum(c, &sa->key);
+       inumb = key_inum(c, &sb->key);
+
+       if (inuma == inumb) {
+               unsigned int blka = key_block(c, &sa->key);
+               unsigned int blkb = key_block(c, &sb->key);
+
+               if (blka <= blkb)
+                       return -1;
+       } else if (inuma <= inumb)
+               return -1;
+
+       return 1;
+}
+
+/*
+ * nondata_nodes_cmp - compare 2 non-data nodes.
+ * @priv: UBIFS file-system description object
+ * @a: first node
+ * @a: second node
+ *
+ * This function compares nodes @a and @b. It makes sure that inode nodes go
+ * first and sorted by length in descending order. Directory entry nodes go
+ * after inode nodes and are sorted in ascending hash valuer order.
+ */
+int nondata_nodes_cmp(void *priv, struct list_head *a, struct list_head *b)
+{
+       int typea, typeb;
+       ino_t inuma, inumb;
+       struct ubifs_info *c = priv;
+       struct ubifs_scan_node *sa, *sb;
+
+       cond_resched();
+       sa = list_entry(a, struct ubifs_scan_node, list);
+       sb = list_entry(b, struct ubifs_scan_node, list);
+       typea = key_type(c, &sa->key);
+       typeb = key_type(c, &sb->key);
+       ubifs_assert(typea != UBIFS_DATA_KEY && typeb != UBIFS_DATA_KEY);
+
+       /* Inodes go before directory entries */
+       if (typea == UBIFS_INO_KEY) {
+               if (typeb == UBIFS_INO_KEY)
+                       return sb->len - sa->len;
+               return -1;
+       }
+       if (typeb == UBIFS_INO_KEY)
+               return 1;
+
+       ubifs_assert(typea == UBIFS_DENT_KEY && typeb == UBIFS_DENT_KEY);
+       inuma = key_inum(c, &sa->key);
+       inumb = key_inum(c, &sb->key);
+
+       if (inuma == inumb) {
+               uint32_t hasha = key_hash(c, &sa->key);
+               uint32_t hashb = key_hash(c, &sb->key);
+
+               if (hasha <= hashb)
+                       return -1;
+       } else if (inuma <= inumb)
+               return -1;
+
+       return 1;
+}
+
+/**
+ * sort_nodes - sort nodes for GC.
  * @c: UBIFS file-system description object
- * @sleb: describes nodes to move
+ * @sleb: describes nodes to sort and contains the result on exit
+ * @nondata: contains non-data nodes on exit
+ * @min: minimum node size is returned here
  *
- * This function moves valid nodes from data LEB described by @sleb to the GC
- * journal head. The obsolete nodes are dropped.
+ * This function sorts the list of inodes to garbage collect. First of all, it
+ * kills obsolete nodes and separates data and non-data nodes to the
+ * @sleb->nodes and @nondata lists correspondingly.
+ *
+ * Data nodes are then sorted in block number order - this is important for
+ * bulk-read; data nodes with lower inode number go before data nodes with
+ * higher inode number, and data nodes with lower block number go before data
+ * nodes with higher block number;
  *
- * When moving nodes we have to deal with classical bin-packing problem: the
- * space in the current GC journal head LEB and in @c->gc_lnum are the "bins",
- * where the nodes in the @sleb->nodes list are the elements which should be
- * fit optimally to the bins. This function uses the "first fit decreasing"
- * strategy, although it does not really sort the nodes but just split them on
- * 3 classes - large, medium, and small, so they are roughly sorted.
+ * Non-data nodes are sorted as follows.
+ *   o First go inode nodes - they are sorted in descending length order.
+ *   o Then go directory entry nodes - they are sorted in hash order, which
+ *     should supposedly optimize 'readdir()'. Direntry nodes with lower parent
+ *     inode number go before direntry nodes with higher parent inode number,
+ *     and direntry nodes with lower name hash values go before direntry nodes
+ *     with higher name hash values.
  *
- * This function returns zero in case of success, %-EAGAIN if commit is
- * required, and other negative error codes in case of other failures.
+ * This function returns zero in case of success and a negative error code in
+ * case of failure.
  */
-static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb)
+static int sort_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
+                     struct list_head *nondata, int *min)
 {
        struct ubifs_scan_node *snod, *tmp;
-       struct list_head data, large, medium, small;
-       struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf;
-       int avail, err, min = INT_MAX;
-       unsigned int blk = 0;
-       ino_t inum = 0;
 
-       INIT_LIST_HEAD(&data);
-       INIT_LIST_HEAD(&large);
-       INIT_LIST_HEAD(&medium);
-       INIT_LIST_HEAD(&small);
+       *min = INT_MAX;
 
-       while (!list_empty(&sleb->nodes)) {
-               struct list_head *lst = sleb->nodes.next;
-
-               snod = list_entry(lst, struct ubifs_scan_node, list);
+       /* Separate data nodes and non-data nodes */
+       list_for_each_entry_safe(snod, tmp, &sleb->nodes, list) {
+               int err;
 
                ubifs_assert(snod->type != UBIFS_IDX_NODE);
                ubifs_assert(snod->type != UBIFS_REF_NODE);
@@ -201,53 +332,72 @@ static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb)
                err = ubifs_tnc_has_node(c, &snod->key, 0, sleb->lnum,
                                         snod->offs, 0);
                if (err < 0)
-                       goto out;
+                       return err;
 
-               list_del(lst);
                if (!err) {
                        /* The node is obsolete, remove it from the list */
+                       list_del(&snod->list);
                        kfree(snod);
                        continue;
                }
 
-               /*
-                * Sort the list of nodes so that data nodes go first, large
-                * nodes go second, and small nodes go last.
-                */
-               if (key_type(c, &snod->key) == UBIFS_DATA_KEY) {
-                       if (inum != key_inum(c, &snod->key)) {
-                               if (inum) {
-                                       /*
-                                        * Try to move data nodes from the same
-                                        * inode together.
-                                        */
-                                       err = joinup(c, sleb, inum, blk, &data);
-                                       if (err)
-                                               goto out;
-                               }
-                               inum = key_inum(c, &snod->key);
-                               blk = key_block(c, &snod->key);
-                       }
-                       list_add_tail(lst, &data);
-               } else if (snod->len > MEDIUM_NODE_WM)
-                       list_add_tail(lst, &large);
-               else if (snod->len > SMALL_NODE_WM)
-                       list_add_tail(lst, &medium);
-               else
-                       list_add_tail(lst, &small);
-
-               /* And find the smallest node */
-               if (snod->len < min)
-                       min = snod->len;
+               if (snod->len < *min)
+                       *min = snod->len;
+
+               if (key_type(c, &snod->key) != UBIFS_DATA_KEY)
+                       list_move_tail(&snod->list, nondata);
        }
 
-       /*
-        * Join the tree lists so that we'd have one roughly sorted list
-        * ('large' will be the head of the joined list).
-        */
-       list_splice(&data, &large);
-       list_splice(&medium, large.prev);
-       list_splice(&small, large.prev);
+       /* Sort data and non-data nodes */
+       list_sort(c, &sleb->nodes, &data_nodes_cmp);
+       list_sort(c, nondata, &nondata_nodes_cmp);
+       return 0;
+}
+
+/**
+ * move_node - move a node.
+ * @c: UBIFS file-system description object
+ * @sleb: describes the LEB to move nodes from
+ * @snod: the mode to move
+ * @wbuf: write-buffer to move node to
+ *
+ * This function moves node @snod to @wbuf, changes TNC correspondingly, and
+ * destroys @snod. Returns zero in case of success and a negative error code in
+ * case of failure.
+ */
+static int move_node(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
+                    struct ubifs_scan_node *snod, struct ubifs_wbuf *wbuf)
+{
+       int err, new_lnum = wbuf->lnum, new_offs = wbuf->offs + wbuf->used;
+
+       cond_resched();
+       err = ubifs_wbuf_write_nolock(wbuf, snod->node, snod->len);
+       if (err)
+               return err;
+
+       err = ubifs_tnc_replace(c, &snod->key, sleb->lnum,
+                               snod->offs, new_lnum, new_offs,
+                               snod->len);
+       list_del(&snod->list);
+       kfree(snod);
+       return err;
+}
+
+/**
+ * move_nodes - move nodes.
+ * @c: UBIFS file-system description object
+ * @sleb: describes the LEB to move nodes from
+ *
+ * This function moves valid nodes from data LEB described by @sleb to the GC
+ * journal head. This function returns zero in case of success, %-EAGAIN if
+ * commit is required, and other negative error codes in case of other
+ * failures.
+ */
+static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb)
+{
+       int err, min;
+       LIST_HEAD(nondata);
+       struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf;
 
        if (wbuf->lnum == -1) {
                /*
@@ -256,42 +406,59 @@ static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb)
                 */
                err = switch_gc_head(c);
                if (err)
-                       goto out;
+                       return err;
        }
 
+       err = sort_nodes(c, sleb, &nondata, &min);
+       if (err)
+               goto out;
+
        /* Write nodes to their new location. Use the first-fit strategy */
        while (1) {
-               avail = c->leb_size - wbuf->offs - wbuf->used;
-               list_for_each_entry_safe(snod, tmp, &large, list) {
-                       int new_lnum, new_offs;
+               int avail;
+               struct ubifs_scan_node *snod, *tmp;
+
+               /* Move data nodes */
+               list_for_each_entry_safe(snod, tmp, &sleb->nodes, list) {
+                       avail = c->leb_size - wbuf->offs - wbuf->used;
+                       if  (snod->len > avail)
+                               /*
+                                * Do not skip data nodes in order to optimize
+                                * bulk-read.
+                                */
+                               break;
+
+                       err = move_node(c, sleb, snod, wbuf);
+                       if (err)
+                               goto out;
+               }
 
+               /* Move non-data nodes */
+               list_for_each_entry_safe(snod, tmp, &nondata, list) {
+                       avail = c->leb_size - wbuf->offs - wbuf->used;
                        if (avail < min)
                                break;
 
-                       if (snod->len > avail)
-                               /* This node does not fit */
+                       if  (snod->len > avail) {
+                               /*
+                                * Keep going only if this is an inode with
+                                * some data. Otherwise stop and switch the GC
+                                * head. IOW, we assume that data-less inode
+                                * nodes and direntry nodes are roughly of the
+                                * same size.
+                                */
+                               if (key_type(c, &snod->key) == UBIFS_DENT_KEY ||
+                                   snod->len == UBIFS_INO_NODE_SZ)
+                                       break;
                                continue;
+                       }
 
-                       cond_resched();
-
-                       new_lnum = wbuf->lnum;
-                       new_offs = wbuf->offs + wbuf->used;
-                       err = ubifs_wbuf_write_nolock(wbuf, snod->node,
-                                                     snod->len);
+                       err = move_node(c, sleb, snod, wbuf);
                        if (err)
                                goto out;
-                       err = ubifs_tnc_replace(c, &snod->key, sleb->lnum,
-                                               snod->offs, new_lnum, new_offs,
-                                               snod->len);
-                       if (err)
-                               goto out;
-
-                       avail = c->leb_size - wbuf->offs - wbuf->used;
-                       list_del(&snod->list);
-                       kfree(snod);
                }
 
-               if (list_empty(&large))
+               if (list_empty(&sleb->nodes) && list_empty(&nondata))
                        break;
 
                /*
@@ -306,10 +473,7 @@ static int move_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb)
        return 0;
 
 out:
-       list_for_each_entry_safe(snod, tmp, &large, list) {
-               list_del(&snod->list);
-               kfree(snod);
-       }
+       list_splice_tail(&nondata, &sleb->nodes);
        return err;
 }
 
index a11ca0958a238b254cf7e8e29cda17f342cf2fc3..64b5f3a309f54cb9f6caa5a5b8aa79dfa21383e5 100644 (file)
@@ -114,7 +114,7 @@ static inline void zero_trun_node_unused(struct ubifs_trun_node *trun)
  */
 static int reserve_space(struct ubifs_info *c, int jhead, int len)
 {
-       int err = 0, err1, retries = 0, avail, lnum, offs, free, squeeze;
+       int err = 0, err1, retries = 0, avail, lnum, offs, squeeze;
        struct ubifs_wbuf *wbuf = &c->jheads[jhead].wbuf;
 
        /*
@@ -139,10 +139,9 @@ again:
         * Write buffer wasn't seek'ed or there is no enough space - look for an
         * LEB with some empty space.
         */
-       lnum = ubifs_find_free_space(c, len, &free, squeeze);
+       lnum = ubifs_find_free_space(c, len, &offs, squeeze);
        if (lnum >= 0) {
                /* Found an LEB, add it to the journal head */
-               offs = c->leb_size - free;
                err = ubifs_add_bud_to_log(c, jhead, lnum, offs);
                if (err)
                        goto out_return;
@@ -1366,7 +1365,7 @@ out_ro:
  * @host: host inode
  *
  * This function writes the updated version of an extended attribute inode and
- * the host inode tho the journal (to the base head). The host inode is written
+ * the host inode to the journal (to the base head). The host inode is written
  * after the extended attribute inode in order to guarantee that the extended
  * attribute will be flushed when the inode is synchronized by 'fsync()' and
  * consequently, the write-buffer is synchronized. This function returns zero
index efb3430a2581c4b723cafc6f846ed7b5841ed933..5fa27ea031babd737b1b2da019007e97046d9dea 100644 (file)
@@ -381,8 +381,8 @@ static inline ino_t key_inum_flash(const struct ubifs_info *c, const void *k)
  * @c: UBIFS file-system description object
  * @key: the key to get hash from
  */
-static inline int key_hash(const struct ubifs_info *c,
-                          const union ubifs_key *key)
+static inline uint32_t key_hash(const struct ubifs_info *c,
+                               const union ubifs_key *key)
 {
        return key->u32[1] & UBIFS_S_KEY_HASH_MASK;
 }
@@ -392,7 +392,7 @@ static inline int key_hash(const struct ubifs_info *c,
  * @c: UBIFS file-system description object
  * @k: the key to get hash from
  */
-static inline int key_hash_flash(const struct ubifs_info *c, const void *k)
+static inline uint32_t key_hash_flash(const struct ubifs_info *c, const void *k)
 {
        const union ubifs_key *key = k;
 
index 3e0aa7367556903e4f41f416443f92fa8cdab228..56e33772a1ee1a12c3e3abb08e3b2aaa14fe42ee 100644 (file)
@@ -239,7 +239,7 @@ int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs)
        }
 
        /*
-        * Make sure the the amount of space in buds will not exceed
+        * Make sure the amount of space in buds will not exceed the
         * 'c->max_bud_bytes' limit, because we want to guarantee mount time
         * limits.
         *
@@ -367,7 +367,6 @@ static void remove_buds(struct ubifs_info *c)
                                bud->jhead, c->leb_size - bud->start,
                                c->cmt_bud_bytes);
                        rb_erase(p1, &c->buds);
-                       list_del(&bud->list);
                        /*
                         * If the commit does not finish, the recovery will need
                         * to replay the journal, in which case the old buds
@@ -375,7 +374,7 @@ static void remove_buds(struct ubifs_info *c)
                         * commit i.e. do not allow them to be garbage
                         * collected.
                         */
-                       list_add(&bud->list, &c->old_buds);
+                       list_move(&bud->list, &c->old_buds);
                }
        }
        spin_unlock(&c->buds_lock);
index 3216a1f277f8940799e090cf50ff0c6bb566352c..8cbfb82480252d3f3abebf0d3a14beb3cc2a9b4a 100644 (file)
@@ -229,7 +229,7 @@ static int layout_cnodes(struct ubifs_info *c)
                while (offs + len > c->leb_size) {
                        alen = ALIGN(offs, c->min_io_size);
                        upd_ltab(c, lnum, c->leb_size - alen, alen - offs);
-                       dbg_chk_lpt_sz(c, 2, alen - offs);
+                       dbg_chk_lpt_sz(c, 2, c->leb_size - offs);
                        err = alloc_lpt_leb(c, &lnum);
                        if (err)
                                goto no_space;
@@ -272,7 +272,7 @@ static int layout_cnodes(struct ubifs_info *c)
                if (offs + c->lsave_sz > c->leb_size) {
                        alen = ALIGN(offs, c->min_io_size);
                        upd_ltab(c, lnum, c->leb_size - alen, alen - offs);
-                       dbg_chk_lpt_sz(c, 2, alen - offs);
+                       dbg_chk_lpt_sz(c, 2, c->leb_size - offs);
                        err = alloc_lpt_leb(c, &lnum);
                        if (err)
                                goto no_space;
@@ -292,7 +292,7 @@ static int layout_cnodes(struct ubifs_info *c)
                if (offs + c->ltab_sz > c->leb_size) {
                        alen = ALIGN(offs, c->min_io_size);
                        upd_ltab(c, lnum, c->leb_size - alen, alen - offs);
-                       dbg_chk_lpt_sz(c, 2, alen - offs);
+                       dbg_chk_lpt_sz(c, 2, c->leb_size - offs);
                        err = alloc_lpt_leb(c, &lnum);
                        if (err)
                                goto no_space;
@@ -416,14 +416,12 @@ static int write_cnodes(struct ubifs_info *c)
                                                       alen, UBI_SHORTTERM);
                                if (err)
                                        return err;
-                               dbg_chk_lpt_sz(c, 4, alen - wlen);
                        }
-                       dbg_chk_lpt_sz(c, 2, 0);
+                       dbg_chk_lpt_sz(c, 2, c->leb_size - offs);
                        err = realloc_lpt_leb(c, &lnum);
                        if (err)
                                goto no_space;
-                       offs = 0;
-                       from = 0;
+                       offs = from = 0;
                        ubifs_assert(lnum >= c->lpt_first &&
                                     lnum <= c->lpt_last);
                        err = ubifs_leb_unmap(c, lnum);
@@ -477,11 +475,11 @@ static int write_cnodes(struct ubifs_info *c)
                                              UBI_SHORTTERM);
                        if (err)
                                return err;
-                       dbg_chk_lpt_sz(c, 2, alen - wlen);
+                       dbg_chk_lpt_sz(c, 2, c->leb_size - offs);
                        err = realloc_lpt_leb(c, &lnum);
                        if (err)
                                goto no_space;
-                       offs = 0;
+                       offs = from = 0;
                        ubifs_assert(lnum >= c->lpt_first &&
                                     lnum <= c->lpt_last);
                        err = ubifs_leb_unmap(c, lnum);
@@ -504,11 +502,11 @@ static int write_cnodes(struct ubifs_info *c)
                                              UBI_SHORTTERM);
                        if (err)
                                return err;
-                       dbg_chk_lpt_sz(c, 2, alen - wlen);
+                       dbg_chk_lpt_sz(c, 2, c->leb_size - offs);
                        err = realloc_lpt_leb(c, &lnum);
                        if (err)
                                goto no_space;
-                       offs = 0;
+                       offs = from = 0;
                        ubifs_assert(lnum >= c->lpt_first &&
                                     lnum <= c->lpt_last);
                        err = ubifs_leb_unmap(c, lnum);
@@ -1756,10 +1754,16 @@ int dbg_chk_lpt_free_spc(struct ubifs_info *c)
 /**
  * dbg_chk_lpt_sz - check LPT does not write more than LPT size.
  * @c: the UBIFS file-system description object
- * @action: action
+ * @action: what to do
  * @len: length written
  *
  * This function returns %0 on success and a negative error code on failure.
+ * The @action argument may be one of:
+ *   o %0 - LPT debugging checking starts, initialize debugging variables;
+ *   o %1 - wrote an LPT node, increase LPT size by @len bytes;
+ *   o %2 - switched to a different LEB and wasted @len bytes;
+ *   o %3 - check that we've written the right number of bytes.
+ *   o %4 - wasted @len bytes;
  */
 int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
 {
@@ -1917,12 +1921,12 @@ static void dump_lpt_leb(const struct ubifs_info *c, int lnum)
                                       lnum, offs);
                        err = ubifs_unpack_nnode(c, buf, &nnode);
                        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
-                               printk("%d:%d", nnode.nbranch[i].lnum,
+                               printk(KERN_CONT "%d:%d", nnode.nbranch[i].lnum,
                                       nnode.nbranch[i].offs);
                                if (i != UBIFS_LPT_FANOUT - 1)
-                                       printk(", ");
+                                       printk(KERN_CONT ", ");
                        }
-                       printk("\n");
+                       printk(KERN_CONT "\n");
                        break;
                }
                case UBIFS_LPT_LTAB:
index 90acac603e635baf82e05037150c85c818a2c738..10662975d2ef50b6d6b83187baa369a4dc650fae 100644 (file)
@@ -425,59 +425,35 @@ static void clean_buf(const struct ubifs_info *c, void **buf, int lnum,
  * @lnum: LEB number of the LEB from which @buf was read
  * @offs: offset from which @buf was read
  *
- * This function scans @buf for more nodes and returns %0 is a node is found and
- * %1 if no more nodes are found.
+ * This function ensures that the corrupted node at @offs is the last thing
+ * written to a LEB. This function returns %1 if more data is not found and
+ * %0 if more data is found.
  */
 static int no_more_nodes(const struct ubifs_info *c, void *buf, int len,
                        int lnum, int offs)
 {
-       int skip, next_offs = 0;
+       struct ubifs_ch *ch = buf;
+       int skip, dlen = le32_to_cpu(ch->len);
 
-       if (len > UBIFS_DATA_NODE_SZ) {
-               struct ubifs_ch *ch = buf;
-               int dlen = le32_to_cpu(ch->len);
-
-               if (ch->node_type == UBIFS_DATA_NODE && dlen >= UBIFS_CH_SZ &&
-                   dlen <= UBIFS_MAX_DATA_NODE_SZ)
-                       /* The corrupt node looks like a data node */
-                       next_offs = ALIGN(offs + dlen, 8);
-       }
-
-       if (c->min_io_size == 1)
-               skip = 8;
-       else
-               skip = ALIGN(offs + 1, c->min_io_size) - offs;
-
-       offs += skip;
-       buf += skip;
-       len -= skip;
-       while (len > 8) {
-               struct ubifs_ch *ch = buf;
-               uint32_t magic = le32_to_cpu(ch->magic);
-               int ret;
-
-               if (magic == UBIFS_NODE_MAGIC) {
-                       ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
-                       if (ret == SCANNED_A_NODE || ret > 0) {
-                               /*
-                                * There is a small chance this is just data in
-                                * a data node, so check that possibility. e.g.
-                                * this is part of a file that itself contains
-                                * a UBIFS image.
-                                */
-                               if (next_offs && offs + le32_to_cpu(ch->len) <=
-                                   next_offs)
-                                       continue;
-                               dbg_rcvry("unexpected node at %d:%d", lnum,
-                                         offs);
-                               return 0;
-                       }
-               }
-               offs += 8;
-               buf += 8;
-               len -= 8;
+       /* Check for empty space after the corrupt node's common header */
+       skip = ALIGN(offs + UBIFS_CH_SZ, c->min_io_size) - offs;
+       if (is_empty(buf + skip, len - skip))
+               return 1;
+       /*
+        * The area after the common header size is not empty, so the common
+        * header must be intact. Check it.
+        */
+       if (ubifs_check_node(c, buf, lnum, offs, 1, 0) != -EUCLEAN) {
+               dbg_rcvry("unexpected bad common header at %d:%d", lnum, offs);
+               return 0;
        }
-       return 1;
+       /* Now we know the corrupt node's length we can skip over it */
+       skip = ALIGN(offs + dlen, c->min_io_size) - offs;
+       /* After which there should be empty space */
+       if (is_empty(buf + skip, len - skip))
+               return 1;
+       dbg_rcvry("unexpected data at %d:%d", lnum, offs + skip);
+       return 0;
 }
 
 /**
index ce42a7b0ca5a3113b92495ed67a2970a36292a49..11cc80125a49524cef118b97173ed7ff5fb94fd9 100644 (file)
@@ -143,7 +143,7 @@ static int set_bud_lprops(struct ubifs_info *c, struct replay_entry *r)
                dirty -= c->leb_size - lp->free;
                /*
                 * If the replay order was perfect the dirty space would now be
-                * zero. The order is not perfect because the the journal heads
+                * zero. The order is not perfect because the journal heads
                 * race with each other. This is not a problem but is does mean
                 * that the dirty space may temporarily exceed c->leb_size
                 * during the replay.
index e070c643d1bb180b0099c7674f9703d4be0870ce..57085e43320fdaf1925fd293f999978e8373077c 100644 (file)
@@ -193,6 +193,7 @@ static int create_default_filesystem(struct ubifs_info *c)
        if (tmp64 > DEFAULT_MAX_RP_SIZE)
                tmp64 = DEFAULT_MAX_RP_SIZE;
        sup->rp_size = cpu_to_le64(tmp64);
+       sup->ro_compat_version = cpu_to_le32(UBIFS_RO_COMPAT_VERSION);
 
        err = ubifs_write_node(c, sup, UBIFS_SB_NODE_SZ, 0, 0, UBI_LONGTERM);
        kfree(sup);
@@ -532,17 +533,39 @@ int ubifs_read_superblock(struct ubifs_info *c)
        if (IS_ERR(sup))
                return PTR_ERR(sup);
 
+       c->fmt_version = le32_to_cpu(sup->fmt_version);
+       c->ro_compat_version = le32_to_cpu(sup->ro_compat_version);
+
        /*
         * The software supports all previous versions but not future versions,
         * due to the unavailability of time-travelling equipment.
         */
-       c->fmt_version = le32_to_cpu(sup->fmt_version);
        if (c->fmt_version > UBIFS_FORMAT_VERSION) {
-               ubifs_err("on-flash format version is %d, but software only "
-                         "supports up to version %d", c->fmt_version,
-                         UBIFS_FORMAT_VERSION);
-               err = -EINVAL;
-               goto out;
+               struct super_block *sb = c->vfs_sb;
+               int mounting_ro = sb->s_flags & MS_RDONLY;
+
+               ubifs_assert(!c->ro_media || mounting_ro);
+               if (!mounting_ro ||
+                   c->ro_compat_version > UBIFS_RO_COMPAT_VERSION) {
+                       ubifs_err("on-flash format version is w%d/r%d, but "
+                                 "software only supports up to version "
+                                 "w%d/r%d", c->fmt_version,
+                                 c->ro_compat_version, UBIFS_FORMAT_VERSION,
+                                 UBIFS_RO_COMPAT_VERSION);
+                       if (c->ro_compat_version <= UBIFS_RO_COMPAT_VERSION) {
+                               ubifs_msg("only R/O mounting is possible");
+                               err = -EROFS;
+                       } else
+                               err = -EINVAL;
+                       goto out;
+               }
+
+               /*
+                * The FS is mounted R/O, and the media format is
+                * R/O-compatible with the UBIFS implementation, so we can
+                * mount.
+                */
+               c->rw_incompat = 1;
        }
 
        if (c->fmt_version < 3) {
@@ -623,7 +646,6 @@ int ubifs_read_superblock(struct ubifs_info *c)
        c->main_lebs = c->leb_cnt - UBIFS_SB_LEBS - UBIFS_MST_LEBS;
        c->main_lebs -= c->log_lebs + c->lpt_lebs + c->orph_lebs;
        c->main_first = c->leb_cnt - c->main_lebs;
-       c->report_rp_size = ubifs_reported_space(c, c->rp_size);
 
        err = validate_sb(c, sup);
 out:
index e7bab52a14106230c419fb6504326dc0b3d1fb7a..02feb59cefcac356768d8efdf9e69c9c1ded811e 100644 (file)
@@ -206,8 +206,7 @@ static int shrink_tnc_trees(int nr, int age, int *contention)
                 * Move this one to the end of the list to provide some
                 * fairness.
                 */
-               list_del(&c->infos_list);
-               list_add_tail(&c->infos_list, &ubifs_infos);
+               list_move_tail(&c->infos_list, &ubifs_infos);
                mutex_unlock(&c->umount_mutex);
                if (freed >= nr)
                        break;
@@ -263,8 +262,7 @@ static int kick_a_thread(void)
                        }
 
                        if (i == 1) {
-                               list_del(&c->infos_list);
-                               list_add_tail(&c->infos_list, &ubifs_infos);
+                               list_move_tail(&c->infos_list, &ubifs_infos);
                                spin_unlock(&ubifs_infos_lock);
 
                                ubifs_request_bg_commit(c);
index c5c98355459a5fcfab9312b3719e3695c440aadd..faa44f90608a26f885208a7b53ff786dcc371f3a 100644 (file)
@@ -421,8 +421,8 @@ static int ubifs_show_options(struct seq_file *s, struct vfsmount *mnt)
                seq_printf(s, ",no_chk_data_crc");
 
        if (c->mount_opts.override_compr) {
-               seq_printf(s, ",compr=");
-               seq_printf(s, ubifs_compr_name(c->mount_opts.compr_type));
+               seq_printf(s, ",compr=%s",
+                          ubifs_compr_name(c->mount_opts.compr_type));
        }
 
        return 0;
@@ -700,6 +700,8 @@ static int init_constants_sb(struct ubifs_info *c)
        if (err)
                return err;
 
+       /* Initialize effective LEB size used in budgeting calculations */
+       c->idx_leb_size = c->leb_size - c->max_idx_node_sz;
        return 0;
 }
 
@@ -716,6 +718,7 @@ static void init_constants_master(struct ubifs_info *c)
        long long tmp64;
 
        c->min_idx_lebs = ubifs_calc_min_idx_lebs(c);
+       c->report_rp_size = ubifs_reported_space(c, c->rp_size);
 
        /*
         * Calculate total amount of FS blocks. This number is not used
@@ -1201,7 +1204,7 @@ static int mount_ubifs(struct ubifs_info *c)
                        goto out_cbuf;
 
                /* Create background thread */
-               c->bgt = kthread_create(ubifs_bg_thread, c, c->bgt_name);
+               c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name);
                if (IS_ERR(c->bgt)) {
                        err = PTR_ERR(c->bgt);
                        c->bgt = NULL;
@@ -1318,11 +1321,15 @@ static int mount_ubifs(struct ubifs_info *c)
                else {
                        c->need_recovery = 0;
                        ubifs_msg("recovery completed");
-                       /* GC LEB has to be empty and taken at this point */
-                       ubifs_assert(c->lst.taken_empty_lebs == 1);
+                       /*
+                        * GC LEB has to be empty and taken at this point. But
+                        * the journal head LEBs may also be accounted as
+                        * "empty taken" if they are empty.
+                        */
+                       ubifs_assert(c->lst.taken_empty_lebs > 0);
                }
        } else
-               ubifs_assert(c->lst.taken_empty_lebs == 1);
+               ubifs_assert(c->lst.taken_empty_lebs > 0);
 
        err = dbg_check_filesystem(c);
        if (err)
@@ -1344,8 +1351,9 @@ static int mount_ubifs(struct ubifs_info *c)
        x = (long long)c->log_lebs * c->leb_size + c->max_bud_bytes;
        ubifs_msg("journal size:       %lld bytes (%lld KiB, %lld MiB, %d "
                  "LEBs)", x, x >> 10, x >> 20, c->log_lebs + c->max_bud_cnt);
-       ubifs_msg("media format:       %d (latest is %d)",
-                 c->fmt_version, UBIFS_FORMAT_VERSION);
+       ubifs_msg("media format:       w%d/r%d (latest is w%d/r%d)",
+                 c->fmt_version, c->ro_compat_version,
+                 UBIFS_FORMAT_VERSION, UBIFS_RO_COMPAT_VERSION);
        ubifs_msg("default compressor: %s", ubifs_compr_name(c->default_compr));
        ubifs_msg("reserved for root:  %llu bytes (%llu KiB)",
                c->report_rp_size, c->report_rp_size >> 10);
@@ -1485,6 +1493,15 @@ static int ubifs_remount_rw(struct ubifs_info *c)
 {
        int err, lnum;
 
+       if (c->rw_incompat) {
+               ubifs_err("the file-system is not R/W-compatible");
+               ubifs_msg("on-flash format version is w%d/r%d, but software "
+                         "only supports up to version w%d/r%d", c->fmt_version,
+                         c->ro_compat_version, UBIFS_FORMAT_VERSION,
+                         UBIFS_RO_COMPAT_VERSION);
+               return -EROFS;
+       }
+
        mutex_lock(&c->umount_mutex);
        dbg_save_space_info(c);
        c->remounting_rw = 1;
@@ -1554,7 +1571,7 @@ static int ubifs_remount_rw(struct ubifs_info *c)
        ubifs_create_buds_lists(c);
 
        /* Create background thread */
-       c->bgt = kthread_create(ubifs_bg_thread, c, c->bgt_name);
+       c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name);
        if (IS_ERR(c->bgt)) {
                err = PTR_ERR(c->bgt);
                c->bgt = NULL;
@@ -1775,7 +1792,7 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data)
                c->bu.buf = NULL;
        }
 
-       ubifs_assert(c->lst.taken_empty_lebs == 1);
+       ubifs_assert(c->lst.taken_empty_lebs > 0);
        return 0;
 }
 
index fa28a84c6a1b4a9d0f3cf5dfdb9f8fadd36e10da..f249f7b0d656930ff3c364f0579cf43f0fb0b926 100644 (file)
@@ -1252,7 +1252,7 @@ int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key,
         * splitting in the middle of the colliding sequence. Also, when
         * removing the leftmost key, we would have to correct the key of the
         * parent node, which would introduce additional complications. Namely,
-        * if we changed the the leftmost key of the parent znode, the garbage
+        * if we changed the leftmost key of the parent znode, the garbage
         * collector would be unable to find it (GC is doing this when GC'ing
         * indexing LEBs). Although we already have an additional RB-tree where
         * we save such changed znodes (see 'ins_clr_old_idx_znode()') until
index b25fc36cf72f1fa70889dc3749f892e604673e75..3eee07e0c4955b91a0aff3e0be7c5e0c6368dc3e 100644 (file)
 /* UBIFS node magic number (must not have the padding byte first or last) */
 #define UBIFS_NODE_MAGIC  0x06101831
 
-/* UBIFS on-flash format version */
+/*
+ * UBIFS on-flash format version. This version is increased when the on-flash
+ * format is changing. If this happens, UBIFS is will support older versions as
+ * well. But older UBIFS code will not support newer formats. Format changes
+ * will be rare and only when absolutely necessary, e.g. to fix a bug or to add
+ * a new feature.
+ *
+ * UBIFS went into mainline kernel with format version 4. The older formats
+ * were development formats.
+ */
 #define UBIFS_FORMAT_VERSION 4
 
+/*
+ * Read-only compatibility version. If the UBIFS format is changed, older UBIFS
+ * implementations will not be able to mount newer formats in read-write mode.
+ * However, depending on the change, it may be possible to mount newer formats
+ * in R/O mode. This is indicated by the R/O compatibility version which is
+ * stored in the super-block.
+ *
+ * This is needed to support boot-loaders which only need R/O mounting. With
+ * this flag it is possible to do UBIFS format changes without a need to update
+ * boot-loaders.
+ */
+#define UBIFS_RO_COMPAT_VERSION 0
+
 /* Minimum logical eraseblock size in bytes */
 #define UBIFS_MIN_LEB_SZ (15*1024)
 
@@ -53,7 +75,7 @@
 
 /*
  * If compressed data length is less than %UBIFS_MIN_COMPRESS_DIFF bytes
- * shorter than uncompressed data length, UBIFS preferes to leave this data
+ * shorter than uncompressed data length, UBIFS prefers to leave this data
  * node uncompress, because it'll be read faster.
  */
 #define UBIFS_MIN_COMPRESS_DIFF 64
@@ -586,6 +608,7 @@ struct ubifs_pad_node {
  * @padding2: reserved for future, zeroes
  * @time_gran: time granularity in nanoseconds
  * @uuid: UUID generated when the file system image was created
+ * @ro_compat_version: UBIFS R/O compatibility version
  */
 struct ubifs_sb_node {
        struct ubifs_ch ch;
@@ -612,7 +635,8 @@ struct ubifs_sb_node {
        __le64 rp_size;
        __le32 time_gran;
        __u8 uuid[16];
-       __u8 padding2[3972];
+       __le32 ro_compat_version;
+       __u8 padding2[3968];
 } __attribute__ ((packed));
 
 /**
index 039a68bee29accc639034936c64cde4bbece9ad5..0a8341e1408842263ae409611002db8aa604b044 100644 (file)
@@ -934,6 +934,7 @@ struct ubifs_debug_info;
  *          by @commit_sem
  * @cnt_lock: protects @highest_inum and @max_sqnum counters
  * @fmt_version: UBIFS on-flash format version
+ * @ro_compat_version: R/O compatibility version
  * @uuid: UUID from super block
  *
  * @lhead_lnum: log head logical eraseblock number
@@ -966,6 +967,7 @@ struct ubifs_debug_info;
  *                   recovery)
  * @bulk_read: enable bulk-reads
  * @default_compr: default compression algorithm (%UBIFS_COMPR_LZO, etc)
+ * @rw_incompat: the media is not R/W compatible
  *
  * @tnc_mutex: protects the Tree Node Cache (TNC), @zroot, @cnext, @enext, and
  *             @calc_idx_sz
@@ -1015,6 +1017,8 @@ struct ubifs_debug_info;
  * @min_io_shift: number of bits in @min_io_size minus one
  * @leb_size: logical eraseblock size in bytes
  * @half_leb_size: half LEB size
+ * @idx_leb_size: how many bytes of an LEB are effectively available when it is
+ *                used to store indexing nodes (@leb_size - @max_idx_node_sz)
  * @leb_cnt: count of logical eraseblocks
  * @max_leb_cnt: maximum count of logical eraseblocks
  * @old_leb_cnt: count of logical eraseblocks before re-size
@@ -1132,8 +1136,8 @@ struct ubifs_debug_info;
  *             previous commit start
  * @uncat_list: list of un-categorized LEBs
  * @empty_list: list of empty LEBs
- * @freeable_list: list of freeable non-index LEBs (free + dirty == leb_size)
- * @frdi_idx_list: list of freeable index LEBs (free + dirty == leb_size)
+ * @freeable_list: list of freeable non-index LEBs (free + dirty == @leb_size)
+ * @frdi_idx_list: list of freeable index LEBs (free + dirty == @leb_size)
  * @freeable_cnt: number of freeable LEBs in @freeable_list
  *
  * @ltab_lnum: LEB number of LPT's own lprops table
@@ -1177,6 +1181,7 @@ struct ubifs_info {
        unsigned long long cmt_no;
        spinlock_t cnt_lock;
        int fmt_version;
+       int ro_compat_version;
        unsigned char uuid[16];
 
        int lhead_lnum;
@@ -1205,6 +1210,7 @@ struct ubifs_info {
        unsigned int no_chk_data_crc:1;
        unsigned int bulk_read:1;
        unsigned int default_compr:2;
+       unsigned int rw_incompat:1;
 
        struct mutex tnc_mutex;
        struct ubifs_zbranch zroot;
@@ -1253,6 +1259,7 @@ struct ubifs_info {
        int min_io_shift;
        int leb_size;
        int half_leb_size;
+       int idx_leb_size;
        int leb_cnt;
        int max_leb_cnt;
        int old_leb_cnt;
@@ -1500,7 +1507,7 @@ long long ubifs_reported_space(const struct ubifs_info *c, long long free);
 long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs);
 
 /* find.c */
-int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *free,
+int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *offs,
                          int squeeze);
 int ubifs_find_free_leb_for_idx(struct ubifs_info *c);
 int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp,
index aeaf7cd41dc7bbdba97d79573a7febad13a259ee..4db89e98535d25eae5be6c9496b622e1296613f7 100644 (file)
@@ -191,14 +191,12 @@ acpi_evaluate_object(acpi_handle object,
                     struct acpi_object_list *parameter_objects,
                     struct acpi_buffer *return_object_buffer);
 
-#ifdef ACPI_FUTURE_USAGE
 acpi_status
 acpi_evaluate_object_typed(acpi_handle object,
                           acpi_string pathname,
                           struct acpi_object_list *external_params,
                           struct acpi_buffer *return_buffer,
                           acpi_object_type return_type);
-#endif
 
 acpi_status
 acpi_get_object_info(acpi_handle handle, struct acpi_buffer *return_buffer);
index 6617c9f8f2cada78c148907a261c8f4dde5e568e..cb79b7a208e17e4ad66acb6fc7231fc10c8acfc1 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef __LINUX_ATA_H__
 #define __LINUX_ATA_H__
 
+#include <linux/kernel.h>
+#include <linux/string.h>
 #include <linux/types.h>
 #include <asm/byteorder.h>
 
@@ -91,6 +93,7 @@ enum {
        ATA_ID_CFA_POWER        = 160,
        ATA_ID_CFA_KEY_MGMT     = 162,
        ATA_ID_CFA_MODES        = 163,
+       ATA_ID_DATA_SET_MGMT    = 169,
        ATA_ID_ROT_SPEED        = 217,
        ATA_ID_PIO4             = (1 << 1),
 
@@ -248,6 +251,7 @@ enum {
        ATA_CMD_SMART           = 0xB0,
        ATA_CMD_MEDIA_LOCK      = 0xDE,
        ATA_CMD_MEDIA_UNLOCK    = 0xDF,
+       ATA_CMD_DSM             = 0x06,
        /* marked obsolete in the ATA/ATAPI-7 spec */
        ATA_CMD_RESTORE         = 0x10,
 
@@ -321,6 +325,9 @@ enum {
        ATA_SMART_READ_VALUES   = 0xD0,
        ATA_SMART_READ_THRESHOLDS = 0xD1,
 
+       /* feature values for Data Set Management */
+       ATA_DSM_TRIM            = 0x01,
+
        /* password used in LBA Mid / LBA High for executing SMART commands */
        ATA_SMART_LBAM_PASS     = 0x4F,
        ATA_SMART_LBAH_PASS     = 0xC2,
@@ -723,6 +730,14 @@ static inline int ata_id_has_unload(const u16 *id)
        return 0;
 }
 
+static inline int ata_id_has_trim(const u16 *id)
+{
+       if (ata_id_major_version(id) >= 7 &&
+           (id[ATA_ID_DATA_SET_MGMT] & 1))
+               return 1;
+       return 0;
+}
+
 static inline int ata_id_current_chs_valid(const u16 *id)
 {
        /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
@@ -863,6 +878,32 @@ static inline void ata_id_to_hd_driveid(u16 *id)
 #endif
 }
 
+/*
+ * Write up to 'max' LBA Range Entries to the buffer that will cover the
+ * extent from sector to sector + count.  This is used for TRIM and for
+ * ADD LBA(S) TO NV CACHE PINNED SET.
+ */
+static inline unsigned ata_set_lba_range_entries(void *_buffer, unsigned max,
+                                               u64 sector, unsigned long count)
+{
+       __le64 *buffer = _buffer;
+       unsigned i = 0;
+
+       while (i < max) {
+               u64 entry = sector |
+                       ((u64)(count > 0xffff ? 0xffff : count) << 48);
+               buffer[i++] = __cpu_to_le64(entry);
+               if (count <= 0xffff)
+                       break;
+               count -= 0xffff;
+               sector += 0xffff;
+       }
+
+       max = ALIGN(i * 8, 512);
+       memset(buffer + i, 0, max - i * 8);
+       return max;
+}
+
 static inline int is_multi_taskfile(struct ata_taskfile *tf)
 {
        return (tf->command == ATA_CMD_READ_MULTI) ||
index bee52abb8a4dbfd46e53f650d7d7dbca881a9169..0ec2c594868e657ad20cfaffc21227bf7ee2e18b 100644 (file)
@@ -24,8 +24,8 @@ struct dentry;
  */
 enum bdi_state {
        BDI_pdflush,            /* A pdflush thread is working this device */
-       BDI_write_congested,    /* The write queue is getting full */
-       BDI_read_congested,     /* The read queue is getting full */
+       BDI_async_congested,    /* The async (write) queue is getting full */
+       BDI_sync_congested,     /* The sync queue is getting full */
        BDI_unused,             /* Available bits start here */
 };
 
@@ -215,18 +215,18 @@ static inline int bdi_congested(struct backing_dev_info *bdi, int bdi_bits)
 
 static inline int bdi_read_congested(struct backing_dev_info *bdi)
 {
-       return bdi_congested(bdi, 1 << BDI_read_congested);
+       return bdi_congested(bdi, 1 << BDI_sync_congested);
 }
 
 static inline int bdi_write_congested(struct backing_dev_info *bdi)
 {
-       return bdi_congested(bdi, 1 << BDI_write_congested);
+       return bdi_congested(bdi, 1 << BDI_async_congested);
 }
 
 static inline int bdi_rw_congested(struct backing_dev_info *bdi)
 {
-       return bdi_congested(bdi, (1 << BDI_read_congested)|
-                                 (1 << BDI_write_congested));
+       return bdi_congested(bdi, (1 << BDI_sync_congested) |
+                                 (1 << BDI_async_congested));
 }
 
 void clear_bdi_congested(struct backing_dev_info *bdi, int rw);
index b05b1d4d17d2210c67f3ee5ea17b8528e5caf8b6..b900d2c67d29ad2dc490977a4d836a684d26fd04 100644 (file)
@@ -145,20 +145,21 @@ struct bio {
  * bit 2 -- barrier
  *     Insert a serialization point in the IO queue, forcing previously
  *     submitted IO to be completed before this one is issued.
- * bit 3 -- synchronous I/O hint: the block layer will unplug immediately
- *     Note that this does NOT indicate that the IO itself is sync, just
- *     that the block layer will not postpone issue of this IO by plugging.
- * bit 4 -- metadata request
+ * bit 3 -- synchronous I/O hint.
+ * bit 4 -- Unplug the device immediately after submitting this bio.
+ * bit 5 -- metadata request
  *     Used for tracing to differentiate metadata and data IO. May also
  *     get some preferential treatment in the IO scheduler
- * bit 5 -- discard sectors
+ * bit 6 -- discard sectors
  *     Informs the lower level device that this range of sectors is no longer
  *     used by the file system and may thus be freed by the device. Used
  *     for flash based storage.
- * bit 6 -- fail fast device errors
- * bit 7 -- fail fast transport errors
- * bit 8 -- fail fast driver errors
+ * bit 7 -- fail fast device errors
+ * bit 8 -- fail fast transport errors
+ * bit 9 -- fail fast driver errors
  *     Don't want driver retries for any fast fail whatever the reason.
+ * bit 10 -- Tell the IO scheduler not to wait for more requests after this
+       one has been submitted, even if it is a SYNC request.
  */
 #define BIO_RW         0       /* Must match RW in req flags (blkdev.h) */
 #define BIO_RW_AHEAD   1       /* Must match FAILFAST in req flags */
@@ -170,6 +171,7 @@ struct bio {
 #define BIO_RW_FAILFAST_DEV            7
 #define BIO_RW_FAILFAST_TRANSPORT      8
 #define BIO_RW_FAILFAST_DRIVER         9
+#define BIO_RW_NOIDLE  10
 
 #define bio_rw_flagged(bio, flag)      ((bio)->bi_rw & (1 << (flag)))
 
@@ -188,6 +190,7 @@ struct bio {
 #define bio_rw_ahead(bio)      bio_rw_flagged(bio, BIO_RW_AHEAD)
 #define bio_rw_meta(bio)       bio_rw_flagged(bio, BIO_RW_META)
 #define bio_discard(bio)       bio_rw_flagged(bio, BIO_RW_DISCARD)
+#define bio_noidle(bio)                bio_rw_flagged(bio, BIO_RW_NOIDLE)
 
 /*
  * upper 16 bits of bi_rw define the io priority of this bio
index 465d6babc847a2603d4f23a5e842cd7dc07b308e..ba54c834a590b245f486df31def2081bce90dead 100644 (file)
@@ -38,6 +38,10 @@ struct request;
 typedef void (rq_end_io_fn)(struct request *, int);
 
 struct request_list {
+       /*
+        * count[], starved[], and wait[] are indexed by
+        * BLK_RW_SYNC/BLK_RW_ASYNC
+        */
        int count[2];
        int starved[2];
        int elvpriv;
@@ -66,6 +70,11 @@ enum rq_cmd_type_bits {
        REQ_TYPE_ATA_PC,
 };
 
+enum {
+       BLK_RW_ASYNC    = 0,
+       BLK_RW_SYNC     = 1,
+};
+
 /*
  * For request of type REQ_TYPE_LINUX_BLOCK, rq->cmd[0] is the opcode being
  * sent down (similar to how REQ_TYPE_BLOCK_PC means that ->cmd[] holds a
@@ -103,12 +112,12 @@ enum rq_flag_bits {
        __REQ_QUIET,            /* don't worry about errors */
        __REQ_PREEMPT,          /* set for "ide_preempt" requests */
        __REQ_ORDERED_COLOR,    /* is before or after barrier */
-       __REQ_RW_SYNC,          /* request is sync (O_DIRECT) */
+       __REQ_RW_SYNC,          /* request is sync (sync write or read) */
        __REQ_ALLOCED,          /* request came from our alloc pool */
        __REQ_RW_META,          /* metadata io request */
        __REQ_COPY_USER,        /* contains copies of user pages */
        __REQ_INTEGRITY,        /* integrity metadata has been remapped */
-       __REQ_UNPLUG,           /* unplug queue on submission */
+       __REQ_NOIDLE,           /* Don't anticipate more IO after this one */
        __REQ_NR_BITS,          /* stops here */
 };
 
@@ -135,7 +144,7 @@ enum rq_flag_bits {
 #define REQ_RW_META    (1 << __REQ_RW_META)
 #define REQ_COPY_USER  (1 << __REQ_COPY_USER)
 #define REQ_INTEGRITY  (1 << __REQ_INTEGRITY)
-#define REQ_UNPLUG     (1 << __REQ_UNPLUG)
+#define REQ_NOIDLE     (1 << __REQ_NOIDLE)
 
 #define BLK_MAX_CDB    16
 
@@ -438,8 +447,8 @@ struct request_queue
 #define QUEUE_FLAG_CLUSTER     0       /* cluster several segments into 1 */
 #define QUEUE_FLAG_QUEUED      1       /* uses generic tag queueing */
 #define QUEUE_FLAG_STOPPED     2       /* queue is stopped */
-#define        QUEUE_FLAG_READFULL     3       /* read queue has been filled */
-#define QUEUE_FLAG_WRITEFULL   4       /* write queue has been filled */
+#define        QUEUE_FLAG_SYNCFULL     3       /* read queue has been filled */
+#define QUEUE_FLAG_ASYNCFULL   4       /* write queue has been filled */
 #define QUEUE_FLAG_DEAD                5       /* queue being torn down */
 #define QUEUE_FLAG_REENTER     6       /* Re-entrancy avoidance */
 #define QUEUE_FLAG_PLUGGED     7       /* queue is plugged */
@@ -611,32 +620,42 @@ enum {
 #define rq_data_dir(rq)                ((rq)->cmd_flags & 1)
 
 /*
- * We regard a request as sync, if it's a READ or a SYNC write.
+ * We regard a request as sync, if either a read or a sync write
  */
-#define rq_is_sync(rq)         (rq_data_dir((rq)) == READ || (rq)->cmd_flags & REQ_RW_SYNC)
+static inline bool rw_is_sync(unsigned int rw_flags)
+{
+       return !(rw_flags & REQ_RW) || (rw_flags & REQ_RW_SYNC);
+}
+
+static inline bool rq_is_sync(struct request *rq)
+{
+       return rw_is_sync(rq->cmd_flags);
+}
+
 #define rq_is_meta(rq)         ((rq)->cmd_flags & REQ_RW_META)
+#define rq_noidle(rq)          ((rq)->cmd_flags & REQ_NOIDLE)
 
-static inline int blk_queue_full(struct request_queue *q, int rw)
+static inline int blk_queue_full(struct request_queue *q, int sync)
 {
-       if (rw == READ)
-               return test_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
-       return test_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
+       if (sync)
+               return test_bit(QUEUE_FLAG_SYNCFULL, &q->queue_flags);
+       return test_bit(QUEUE_FLAG_ASYNCFULL, &q->queue_flags);
 }
 
-static inline void blk_set_queue_full(struct request_queue *q, int rw)
+static inline void blk_set_queue_full(struct request_queue *q, int sync)
 {
-       if (rw == READ)
-               queue_flag_set(QUEUE_FLAG_READFULL, q);
+       if (sync)
+               queue_flag_set(QUEUE_FLAG_SYNCFULL, q);
        else
-               queue_flag_set(QUEUE_FLAG_WRITEFULL, q);
+               queue_flag_set(QUEUE_FLAG_ASYNCFULL, q);
 }
 
-static inline void blk_clear_queue_full(struct request_queue *q, int rw)
+static inline void blk_clear_queue_full(struct request_queue *q, int sync)
 {
-       if (rw == READ)
-               queue_flag_clear(QUEUE_FLAG_READFULL, q);
+       if (sync)
+               queue_flag_clear(QUEUE_FLAG_SYNCFULL, q);
        else
-               queue_flag_clear(QUEUE_FLAG_WRITEFULL, q);
+               queue_flag_clear(QUEUE_FLAG_ASYNCFULL, q);
 }
 
 
index 6faa7e549de4c28c120a924bfb8015f26abb37ff..cebfdcd3dbddc3e7715b637f58452332586cdfa3 100644 (file)
@@ -114,7 +114,9 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
  * "Define 'is'", Bill Clinton
  * "Define 'if'", Steven Rostedt
  */
-#define if(cond) if (__builtin_constant_p((cond)) ? !!(cond) :         \
+#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
+#define __trace_if(cond) \
+       if (__builtin_constant_p((cond)) ? !!(cond) :                   \
        ({                                                              \
                int ______r;                                            \
                static struct ftrace_branch_data                        \
index d7d090d210317b258f400239fdf42d76bd8db7f6..8083b6a36a384c23ba1917b965328650d09535f3 100644 (file)
@@ -115,7 +115,7 @@ static inline u64 dma_get_mask(struct device *dev)
 {
        if (dev && dev->dma_mask && *dev->dma_mask)
                return *dev->dma_mask;
-       return DMA_32BIT_MASK;
+       return DMA_BIT_MASK(32);
 }
 
 extern u64 dma_get_required_mask(struct device *dev);
index 2f34274689564e3bffb72739ac754081e4ad66f7..e397dc342cdaf1eaf99b022b4523f858d9f3e886 100644 (file)
@@ -34,6 +34,7 @@ struct dmar_drhd_unit {
        u64     reg_base_addr;          /* register base address*/
        struct  pci_dev **devices;      /* target device array  */
        int     devices_cnt;            /* target device count  */
+       u16     segment;                /* PCI domain           */
        u8      ignored:1;              /* ignore drhd          */
        u8      include_all:1;
        struct intel_iommu *iommu;
@@ -44,6 +45,14 @@ extern struct list_head dmar_drhd_units;
 #define for_each_drhd_unit(drhd) \
        list_for_each_entry(drhd, &dmar_drhd_units, list)
 
+#define for_each_active_iommu(i, drhd)                                 \
+       list_for_each_entry(drhd, &dmar_drhd_units, list)               \
+               if (i=drhd->iommu, drhd->ignored) {} else
+
+#define for_each_iommu(i, drhd)                                                \
+       list_for_each_entry(drhd, &dmar_drhd_units, list)               \
+               if (i=drhd->iommu, 0) {} else 
+
 extern int dmar_table_init(void);
 extern int dmar_dev_scope_init(void);
 
@@ -100,6 +109,8 @@ struct irte {
 #ifdef CONFIG_INTR_REMAP
 extern int intr_remapping_enabled;
 extern int enable_intr_remapping(int);
+extern void disable_intr_remapping(void);
+extern int reenable_intr_remapping(int);
 
 extern int get_irte(int irq, struct irte *entry);
 extern int modify_irte(int irq, struct irte *irte_modified);
index 7a204256b1550f889f96a666808e805fe749c186..c59b769f62b0dcb2582e0a3e9592d19b503d8180 100644 (file)
@@ -116,6 +116,7 @@ extern void elv_abort_queue(struct request_queue *);
 extern void elv_completed_request(struct request_queue *, struct request *);
 extern int elv_set_request(struct request_queue *, struct request *, gfp_t);
 extern void elv_put_request(struct request_queue *, struct request *);
+extern void elv_drain_elevator(struct request_queue *);
 
 /*
  * io scheduler registration
index 09d6c5bbdddd50c9ba4248dc30e023c936c2404b..a2ec74bc4812ff3242d22277870fc12ceae755a0 100644 (file)
@@ -5,12 +5,14 @@
 #ifndef __LINUX_FDTABLE_H
 #define __LINUX_FDTABLE_H
 
-#include <asm/atomic.h>
 #include <linux/posix_types.h>
 #include <linux/compiler.h>
 #include <linux/spinlock.h>
 #include <linux/rcupdate.h>
 #include <linux/types.h>
+#include <linux/init.h>
+
+#include <asm/atomic.h>
 
 /*
  * The default fd array needs to be at least BITS_PER_LONG,
index a09e17c8f5fd9137720b008196aa29f45ff17bfb..562d2855cf304c27a5032ae1bf2d1ed2bb231b9a 100644 (file)
@@ -95,8 +95,12 @@ struct inodes_stat_t {
 #define SWRITE 3       /* for ll_rw_block() - wait for buffer lock */
 #define READ_SYNC      (READ | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
 #define READ_META      (READ | (1 << BIO_RW_META))
-#define WRITE_SYNC     (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
-#define SWRITE_SYNC    (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
+#define WRITE_SYNC_PLUG        (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE))
+#define WRITE_SYNC     (WRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG))
+#define WRITE_ODIRECT  (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
+#define SWRITE_SYNC_PLUG       \
+                       (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE))
+#define SWRITE_SYNC    (SWRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG))
 #define WRITE_BARRIER  (WRITE | (1 << BIO_RW_BARRIER))
 #define DISCARD_NOBARRIER (1 << BIO_RW_DISCARD)
 #define DISCARD_BARRIER ((1 << BIO_RW_DISCARD) | (1 << BIO_RW_BARRIER))
@@ -1695,6 +1699,9 @@ struct file_system_type {
        struct lock_class_key i_alloc_sem_key;
 };
 
+extern int get_sb_ns(struct file_system_type *fs_type, int flags, void *data,
+       int (*fill_super)(struct super_block *, void *, int),
+       struct vfsmount *mnt);
 extern int get_sb_bdev(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data,
        int (*fill_super)(struct super_block *, void *, int),
@@ -2337,19 +2344,7 @@ ssize_t simple_transaction_read(struct file *file, char __user *buf,
                                size_t size, loff_t *pos);
 int simple_transaction_release(struct inode *inode, struct file *file);
 
-static inline void simple_transaction_set(struct file *file, size_t n)
-{
-       struct simple_transaction_argresp *ar = file->private_data;
-
-       BUG_ON(n > SIMPLE_TRANSACTION_LIMIT);
-
-       /*
-        * The barrier ensures that ar->size will really remain zero until
-        * ar->data is ready for reading.
-        */
-       smp_mb();
-       ar->size = n;
-}
+void simple_transaction_set(struct file *file, size_t n);
 
 /*
  * simple attribute files
@@ -2396,27 +2391,6 @@ ssize_t simple_attr_read(struct file *file, char __user *buf,
 ssize_t simple_attr_write(struct file *file, const char __user *buf,
                          size_t len, loff_t *ppos);
 
-
-#ifdef CONFIG_SECURITY
-static inline char *alloc_secdata(void)
-{
-       return (char *)get_zeroed_page(GFP_KERNEL);
-}
-
-static inline void free_secdata(void *secdata)
-{
-       free_page((unsigned long)secdata);
-}
-#else
-static inline char *alloc_secdata(void)
-{
-       return (char *)1;
-}
-
-static inline void free_secdata(void *secdata)
-{ }
-#endif /* CONFIG_SECURITY */
-
 struct ctl_table;
 int proc_nr_files(struct ctl_table *table, int write, struct file *filp,
                  void __user *buffer, size_t *lenp, loff_t *ppos);
index 7ef1caf5026962c4e49ab7c8d3b68430645a60a1..f2a78b5e8b5509be63ce810beb661af38f3d9e5b 100644 (file)
@@ -18,7 +18,6 @@
 #define _FSL_DEVICE_H_
 
 #include <linux/types.h>
-#include <linux/phy.h>
 
 /*
  * Some conventions on how we handle peripherals on Freescale chips
  *
  */
 
-struct gianfar_platform_data {
-       /* device specific information */
-       u32     device_flags;
-       char    bus_id[BUS_ID_SIZE];
-       phy_interface_t interface;
-};
-
-struct gianfar_mdio_data {
-       /* board specific information */
-       int     irq[32];
-};
-
-/* Flags in gianfar_platform_data */
-#define FSL_GIANFAR_BRD_HAS_PHY_INTR   0x00000001 /* set or use a timer */
-#define FSL_GIANFAR_BRD_IS_REDUCED     0x00000002 /* Set if RGMII, RMII */
-
-struct fsl_i2c_platform_data {
-       /* device specific information */
-       u32     device_flags;
-};
-
 /* Flags related to I2C device features */
 #define FSL_I2C_DEV_SEPARATE_DFSRR     0x00000001
 #define FSL_I2C_DEV_CLOCK_5200         0x00000002
index bd37078c2d7d7ceb9f9f7b9bd2340724ae29c73d..0d2f7c8a33d6aa2983fd610bac1fb7b4ebc44cca 100644 (file)
@@ -336,6 +336,11 @@ extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,
                         const enum hrtimer_mode mode);
 extern int hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
                        unsigned long range_ns, const enum hrtimer_mode mode);
+extern int
+__hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
+                        unsigned long delta_ns,
+                        const enum hrtimer_mode mode, int wakeup);
+
 extern int hrtimer_cancel(struct hrtimer *timer);
 extern int hrtimer_try_to_cancel(struct hrtimer *timer);
 
diff --git a/include/linux/i2c-algo-sgi.h b/include/linux/i2c-algo-sgi.h
deleted file mode 100644 (file)
index 3b77150..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License version 2 as published by the Free Software Foundation.
- *
- * Copyright (C) 2003 Ladislav Michl <ladis@linux-mips.org>
- */
-
-#ifndef I2C_ALGO_SGI_H
-#define I2C_ALGO_SGI_H 1
-
-#include <linux/i2c.h>
-
-struct i2c_algo_sgi_data {
-       void *data;     /* private data for lowlevel routines */
-       unsigned (*getctrl)(void *data);
-       void (*setctrl)(void *data, unsigned val);
-       unsigned (*rdata)(void *data);
-       void (*wdata)(void *data, unsigned val);
-
-       int xfer_timeout;
-       int ack_timeout;
-};
-
-int i2c_sgi_add_bus(struct i2c_adapter *);
-
-#endif /* I2C_ALGO_SGI_H */
index f27604af83784e9f90698edc5c04713ffc80231e..c9087de5c6c630891ab9f61ef14499114a99e5b9 100644 (file)
 
 #define I2C_DRIVERID_MSP3400    1
 #define I2C_DRIVERID_TUNER      2
-#define I2C_DRIVERID_TEA6420    5      /* audio matrix switch          */
-#define I2C_DRIVERID_TEA6415C   6      /* video matrix switch          */
-#define I2C_DRIVERID_TDA9840    7      /* stereo sound processor       */
-#define I2C_DRIVERID_SAA7111A   8      /* video input processor        */
-#define I2C_DRIVERID_SAA7185B  13      /* video encoder                */
-#define I2C_DRIVERID_SAA7110   22      /* video decoder                */
-#define I2C_DRIVERID_SAA5249   24      /* SAA5249 and compatibles      */
 #define I2C_DRIVERID_TDA7432   27      /* Stereo sound processor       */
 #define I2C_DRIVERID_TVAUDIO    29      /* Generic TV sound driver      */
-#define I2C_DRIVERID_TDA9875    32      /* TV sound decoder chip        */
-#define I2C_DRIVERID_BT819     40     /* video decoder                 */
-#define I2C_DRIVERID_BT856     41     /* video encoder                 */
-#define I2C_DRIVERID_VPX3220   42     /* video decoder+vbi/vtxt        */
-#define I2C_DRIVERID_ADV7175   48     /* ADV 7175/7176 video encoder   */
-#define I2C_DRIVERID_SAA7114   49      /* video decoder                */
-#define I2C_DRIVERID_ADV7170   54      /* video encoder                */
-#define I2C_DRIVERID_SAA7191   57      /* video decoder                */
-#define I2C_DRIVERID_INDYCAM   58      /* SGI IndyCam                  */
-#define I2C_DRIVERID_OVCAMCHIP 61      /* OmniVision CMOS image sens.  */
-#define I2C_DRIVERID_SAA6752HS 67      /* MPEG2 encoder                */
-#define I2C_DRIVERID_TVEEPROM  68      /* TV EEPROM                    */
-#define I2C_DRIVERID_WM8775    69      /* wm8775 audio processor       */
-#define I2C_DRIVERID_CS53L32A  70      /* cs53l32a audio processor     */
-#define I2C_DRIVERID_CX25840   71      /* cx2584x video encoder        */
-#define I2C_DRIVERID_SAA7127   72      /* saa7127 video encoder        */
 #define I2C_DRIVERID_SAA711X   73      /* saa711x video encoders       */
 #define I2C_DRIVERID_INFRARED  75      /* I2C InfraRed on Video boards */
-#define I2C_DRIVERID_TVP5150   76      /* TVP5150 video decoder        */
-#define I2C_DRIVERID_WM8739    77      /* wm8739 audio processor       */
-#define I2C_DRIVERID_UPD64083  78      /* upd64083 video processor     */
-#define I2C_DRIVERID_UPD64031A 79      /* upd64031a video processor    */
-#define I2C_DRIVERID_SAA717X   80      /* saa717x video encoder        */
-#define I2C_DRIVERID_BT866     85      /* Conexant bt866 video encoder */
-#define I2C_DRIVERID_KS0127    86      /* Samsung ks0127 video decoder */
-#define I2C_DRIVERID_TLV320AIC23B 87   /* TI TLV320AIC23B audio codec  */
-#define I2C_DRIVERID_VP27SMPX  93      /* Panasonic VP27s tuner internal MPX */
-#define I2C_DRIVERID_M52790    95      /* Mitsubishi M52790SP/FP AV switch */
-#define I2C_DRIVERID_CS5345    96      /* cs5345 audio processor       */
-#define I2C_DRIVERID_AU8522    97      /* Auvitek au8522       */
-
-#define I2C_DRIVERID_OV7670 1048       /* Omnivision 7670 camera */
 
 /*
  * ---- Adapter types ----------------------------------------------------
@@ -88,6 +51,7 @@
 #define I2C_HW_B_CX2341X       0x010020 /* Conexant CX2341X MPEG encoder cards */
 #define I2C_HW_B_CX23885       0x010022 /* conexant 23885 based tv cards (bus1) */
 #define I2C_HW_B_AU0828                0x010023 /* auvitek au0828 usb bridge */
+#define I2C_HW_B_CX231XX       0x010024 /* Conexant CX231XX USB based cards */
 #define I2C_HW_B_HDPVR         0x010025 /* Hauppauge HD PVR */
 
 /* --- SGI adapters                                                    */
index c86c3b07604c2cf46cd492ef948e826f2d9c58d0..00ee11eb9092994aa7317dcf7d24ec1357a48c09 100644 (file)
@@ -353,8 +353,8 @@ struct i2c_adapter {
        void *algo_data;
 
        /* --- administration stuff. */
-       int (*client_register)(struct i2c_client *);
-       int (*client_unregister)(struct i2c_client *);
+       int (*client_register)(struct i2c_client *) __deprecated;
+       int (*client_unregister)(struct i2c_client *) __deprecated;
 
        /* data fields that are valid for all devices   */
        u8 level;                       /* nesting level for lockdep */
diff --git a/include/linux/i2c/s6000.h b/include/linux/i2c/s6000.h
new file mode 100644 (file)
index 0000000..d9b34bf
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __LINUX_I2C_S6000_H
+#define __LINUX_I2C_S6000_H
+
+struct s6_i2c_platform_data {
+       const char *clock; /* the clock to use */
+       int bus_num; /* the bus number to register */
+};
+
+#endif
+
index 77214ead1a36343ee4267647c00fd9bd9e3d28c8..aa8c531712330cb2f5d845dab291c15fc299a0e3 100644 (file)
@@ -164,6 +164,7 @@ static inline void dmar_writeq(void __iomem *addr, u64 val)
 #define DMA_GCMD_QIE (((u32)1) << 26)
 #define DMA_GCMD_SIRTP (((u32)1) << 24)
 #define DMA_GCMD_IRE (((u32) 1) << 25)
+#define DMA_GCMD_CFI (((u32) 1) << 23)
 
 /* GSTS_REG */
 #define DMA_GSTS_TES (((u32)1) << 31)
@@ -174,6 +175,7 @@ static inline void dmar_writeq(void __iomem *addr, u64 val)
 #define DMA_GSTS_QIES (((u32)1) << 26)
 #define DMA_GSTS_IRTPS (((u32)1) << 24)
 #define DMA_GSTS_IRES (((u32)1) << 25)
+#define DMA_GSTS_CFIS (((u32)1) << 23)
 
 /* CCMD_REG */
 #define DMA_CCMD_ICC (((u64)1) << 63)
@@ -284,6 +286,14 @@ struct iommu_flush {
                unsigned int size_order, u64 type, int non_present_entry_flush);
 };
 
+enum {
+       SR_DMAR_FECTL_REG,
+       SR_DMAR_FEDATA_REG,
+       SR_DMAR_FEADDR_REG,
+       SR_DMAR_FEUADDR_REG,
+       MAX_SR_DMAR_REGS
+};
+
 struct intel_iommu {
        void __iomem    *reg; /* Pointer to hardware regs, virtual addr */
        u64             cap;
@@ -304,6 +314,8 @@ struct intel_iommu {
        struct iommu_flush flush;
 #endif
        struct q_inval  *qi;            /* Queued invalidation info */
+       u32 *iommu_state; /* Store iommu states between suspend and resume.*/
+
 #ifdef CONFIG_INTR_REMAP
        struct ir_table *ir_table;      /* Interrupt remapping info */
 #endif
@@ -322,6 +334,7 @@ extern int alloc_iommu(struct dmar_drhd_unit *drhd);
 extern void free_iommu(struct intel_iommu *iommu);
 extern int dmar_enable_qi(struct intel_iommu *iommu);
 extern void dmar_disable_qi(struct intel_iommu *iommu);
+extern int dmar_reenable_qi(struct intel_iommu *iommu);
 extern void qi_global_iec(struct intel_iommu *iommu);
 
 extern int qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid,
index ce2c07d99fc3a54934d140214cd46a0f7542937b..8a9613d0c67401c2462df62ee9225bed14d00b53 100644 (file)
@@ -299,6 +299,7 @@ extern void softirq_init(void);
 #define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
 extern void raise_softirq_irqoff(unsigned int nr);
 extern void raise_softirq(unsigned int nr);
+extern void wakeup_softirqd(void);
 
 /* This is the worklist that queues up per-cpu softirq work.
  *
index ea330f9e710015c2c8a4b80ebfaec9cd133ffcdd..3bf40e246a8093a59a41d855f53e100dbf978456 100644 (file)
@@ -25,7 +25,7 @@ struct ipc_ids {
 };
 
 struct ipc_namespace {
-       struct kref     kref;
+       atomic_t        count;
        struct ipc_ids  ids[3];
 
        int             sem_ctls[4];
@@ -44,25 +44,57 @@ struct ipc_namespace {
        int             shm_tot;
 
        struct notifier_block ipcns_nb;
+
+       /* The kern_mount of the mqueuefs sb.  We take a ref on it */
+       struct vfsmount *mq_mnt;
+
+       /* # queues in this ns, protected by mq_lock */
+       unsigned int    mq_queues_count;
+
+       /* next fields are set through sysctl */
+       unsigned int    mq_queues_max;   /* initialized to DFLT_QUEUESMAX */
+       unsigned int    mq_msg_max;      /* initialized to DFLT_MSGMAX */
+       unsigned int    mq_msgsize_max;  /* initialized to DFLT_MSGSIZEMAX */
+
 };
 
 extern struct ipc_namespace init_ipc_ns;
 extern atomic_t nr_ipc_ns;
 
-#ifdef CONFIG_SYSVIPC
+extern spinlock_t mq_lock;
+#if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC)
 #define INIT_IPC_NS(ns)                .ns             = &init_ipc_ns,
+#else
+#define INIT_IPC_NS(ns)
+#endif
 
+#ifdef CONFIG_SYSVIPC
 extern int register_ipcns_notifier(struct ipc_namespace *);
 extern int cond_register_ipcns_notifier(struct ipc_namespace *);
 extern void unregister_ipcns_notifier(struct ipc_namespace *);
 extern int ipcns_notify(unsigned long);
-
 #else /* CONFIG_SYSVIPC */
-#define INIT_IPC_NS(ns)
+static inline int register_ipcns_notifier(struct ipc_namespace *ns)
+{ return 0; }
+static inline int cond_register_ipcns_notifier(struct ipc_namespace *ns)
+{ return 0; }
+static inline void unregister_ipcns_notifier(struct ipc_namespace *ns) { }
+static inline int ipcns_notify(unsigned long l) { return 0; }
 #endif /* CONFIG_SYSVIPC */
 
-#if defined(CONFIG_SYSVIPC) && defined(CONFIG_IPC_NS)
-extern void free_ipc_ns(struct kref *kref);
+#ifdef CONFIG_POSIX_MQUEUE
+extern int mq_init_ns(struct ipc_namespace *ns);
+/* default values */
+#define DFLT_QUEUESMAX 256     /* max number of message queues */
+#define DFLT_MSGMAX    10      /* max number of messages in each queue */
+#define HARD_MSGMAX    (131072/sizeof(void *))
+#define DFLT_MSGSIZEMAX 8192   /* max message size */
+#else
+static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; }
+#endif
+
+#if defined(CONFIG_IPC_NS)
+extern void free_ipc_ns(struct ipc_namespace *ns);
 extern struct ipc_namespace *copy_ipcs(unsigned long flags,
                                       struct ipc_namespace *ns);
 extern void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
@@ -72,14 +104,11 @@ extern void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
 static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 {
        if (ns)
-               kref_get(&ns->kref);
+               atomic_inc(&ns->count);
        return ns;
 }
 
-static inline void put_ipc_ns(struct ipc_namespace *ns)
-{
-       kref_put(&ns->kref, free_ipc_ns);
-}
+extern void put_ipc_ns(struct ipc_namespace *ns);
 #else
 static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
                struct ipc_namespace *ns)
@@ -99,4 +128,18 @@ static inline void put_ipc_ns(struct ipc_namespace *ns)
 {
 }
 #endif
+
+#ifdef CONFIG_POSIX_MQUEUE_SYSCTL
+
+struct ctl_table_header;
+extern struct ctl_table_header *mq_register_sysctl_table(void);
+
+#else /* CONFIG_POSIX_MQUEUE_SYSCTL */
+
+static inline struct ctl_table_header *mq_register_sysctl_table(void)
+{
+       return NULL;
+}
+
+#endif /* CONFIG_POSIX_MQUEUE_SYSCTL */
 #endif
index 21d32a142c002b47da72abb18d9761a3e88aee11..e544f466d69a421cf48f2b626b0bf90d1ec22033 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/rbtree.h>
 #include <linux/rcupdate.h>
 #include <linux/sysctl.h>
+#include <linux/rwsem.h>
 #include <asm/atomic.h>
 
 #ifdef __KERNEL__
index 2ec6cc14a1146e584ee7da0f99e9c1d67349ce61..bcd9c07848bef0c4fa9eb8042add0ad59faeb374 100644 (file)
@@ -94,12 +94,16 @@ struct kprobe {
        /* Called after addr is executed, unless... */
        kprobe_post_handler_t post_handler;
 
-       /* ... called if executing addr causes a fault (eg. page fault).
-        * Return 1 if it handled fault, otherwise kernel will see it. */
+       /*
+        * ... called if executing addr causes a fault (eg. page fault).
+        * Return 1 if it handled fault, otherwise kernel will see it.
+        */
        kprobe_fault_handler_t fault_handler;
 
-       /* ... called if breakpoint trap occurs in probe handler.
-        * Return 1 if it handled break, otherwise kernel will see it. */
+       /*
+        * ... called if breakpoint trap occurs in probe handler.
+        * Return 1 if it handled break, otherwise kernel will see it.
+        */
        kprobe_break_handler_t break_handler;
 
        /* Saved opcode (which has been replaced with breakpoint) */
@@ -108,18 +112,28 @@ struct kprobe {
        /* copy of the original instruction */
        struct arch_specific_insn ainsn;
 
-       /* Indicates various status flags.  Protected by kprobe_mutex. */
+       /*
+        * Indicates various status flags.
+        * Protected by kprobe_mutex after this kprobe is registered.
+        */
        u32 flags;
 };
 
 /* Kprobe status flags */
 #define KPROBE_FLAG_GONE       1 /* breakpoint has already gone */
+#define KPROBE_FLAG_DISABLED   2 /* probe is temporarily disabled */
 
+/* Has this kprobe gone ? */
 static inline int kprobe_gone(struct kprobe *p)
 {
        return p->flags & KPROBE_FLAG_GONE;
 }
 
+/* Is this kprobe disabled ? */
+static inline int kprobe_disabled(struct kprobe *p)
+{
+       return p->flags & (KPROBE_FLAG_DISABLED | KPROBE_FLAG_GONE);
+}
 /*
  * Special probe type that uses setjmp-longjmp type tricks to resume
  * execution at a specified entry with a matching prototype corresponding
@@ -279,6 +293,9 @@ void unregister_kretprobes(struct kretprobe **rps, int num);
 void kprobe_flush_task(struct task_struct *tk);
 void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
 
+int disable_kprobe(struct kprobe *kp);
+int enable_kprobe(struct kprobe *kp);
+
 #else /* !CONFIG_KPROBES: */
 
 static inline int kprobes_built_in(void)
@@ -345,5 +362,30 @@ static inline void unregister_kretprobes(struct kretprobe **rps, int num)
 static inline void kprobe_flush_task(struct task_struct *tk)
 {
 }
+static inline int disable_kprobe(struct kprobe *kp)
+{
+       return -ENOSYS;
+}
+static inline int enable_kprobe(struct kprobe *kp)
+{
+       return -ENOSYS;
+}
 #endif /* CONFIG_KPROBES */
+static inline int disable_kretprobe(struct kretprobe *rp)
+{
+       return disable_kprobe(&rp->kp);
+}
+static inline int enable_kretprobe(struct kretprobe *rp)
+{
+       return enable_kprobe(&rp->kp);
+}
+static inline int disable_jprobe(struct jprobe *jp)
+{
+       return disable_kprobe(&jp->kp);
+}
+static inline int enable_jprobe(struct jprobe *jp)
+{
+       return enable_kprobe(&jp->kp);
+}
+
 #endif /* _LINUX_KPROBES_H */
diff --git a/include/linux/leds-bd2802.h b/include/linux/leds-bd2802.h
new file mode 100644 (file)
index 0000000..42f854a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * leds-bd2802.h - RGB LED Driver
+ *
+ * Copyright (C) 2009 Samsung Electronics
+ * Kim Kyuwon <q1.kim@samsung.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.
+ *
+ * Datasheet: http://www.rohm.com/products/databook/driver/pdf/bd2802gu-e.pdf
+ *
+ */
+#ifndef _LEDS_BD2802_H_
+#define _LEDS_BD2802_H_
+
+struct bd2802_led_platform_data{
+       int     reset_gpio;
+       u8      rgb_time;
+};
+
+#define RGB_TIME(slopedown, slopeup, waveform) \
+       ((slopedown) << 6 | (slopeup) << 4 | (waveform))
+
+#endif /* _LEDS_BD2802_H_ */
+
index 24489da701e331b1a4d1810b40afd7209775e265..376fe07732ea9261dc81f3ff7411d49ac9051fb3 100644 (file)
@@ -30,6 +30,7 @@ enum led_brightness {
 struct led_classdev {
        const char              *name;
        int                      brightness;
+       int                      max_brightness;
        int                      flags;
 
        /* Lower 16 bits reflect status */
@@ -140,7 +141,8 @@ struct gpio_led {
        const char *name;
        const char *default_trigger;
        unsigned        gpio;
-       u8              active_low;
+       u8              active_low : 1;
+       u8              retain_state_suspended : 1;
 };
 
 struct gpio_led_platform_data {
diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h
new file mode 100644 (file)
index 0000000..33a0711
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * PWM LED driver data - see drivers/leds/leds-pwm.c
+ */
+#ifndef __LINUX_LEDS_PWM_H
+#define __LINUX_LEDS_PWM_H
+
+struct led_pwm {
+       const char      *name;
+       const char      *default_trigger;
+       unsigned        pwm_id;
+       u8              active_low;
+       unsigned        max_brightness;
+       unsigned        pwm_period_ns;
+};
+
+struct led_pwm_platform_data {
+       int                     num_leds;
+       struct led_pwm  *leds;
+};
+
+#endif
index 7dc5b6cb44cddd8a3dc1aa854cbc646d5ab1f9ba..d39ed1cc5fbf48648880825560d04d1ec1ebba44 100644 (file)
@@ -25,13 +25,13 @@ struct svc_rqst;
 #define NLM_MAXCOOKIELEN       32
 #define NLM_MAXSTRLEN          1024
 
-#define        nlm_granted             __constant_htonl(NLM_LCK_GRANTED)
-#define        nlm_lck_denied          __constant_htonl(NLM_LCK_DENIED)
-#define        nlm_lck_denied_nolocks  __constant_htonl(NLM_LCK_DENIED_NOLOCKS)
-#define        nlm_lck_blocked         __constant_htonl(NLM_LCK_BLOCKED)
-#define        nlm_lck_denied_grace_period     __constant_htonl(NLM_LCK_DENIED_GRACE_PERIOD)
+#define        nlm_granted             cpu_to_be32(NLM_LCK_GRANTED)
+#define        nlm_lck_denied          cpu_to_be32(NLM_LCK_DENIED)
+#define        nlm_lck_denied_nolocks  cpu_to_be32(NLM_LCK_DENIED_NOLOCKS)
+#define        nlm_lck_blocked         cpu_to_be32(NLM_LCK_BLOCKED)
+#define        nlm_lck_denied_grace_period     cpu_to_be32(NLM_LCK_DENIED_GRACE_PERIOD)
 
-#define nlm_drop_reply         __constant_htonl(30000)
+#define nlm_drop_reply         cpu_to_be32(30000)
 
 /* Lock info passed via NLM */
 struct nlm_lock {
index 12bfe09de2b11629993f80f29d9c947f045d494b..7353821341edb76bc1e02e646ed01fe32200768b 100644 (file)
 #include <linux/lockd/xdr.h>
 
 /* error codes new to NLMv4 */
-#define        nlm4_deadlock           __constant_htonl(NLM_DEADLCK)
-#define        nlm4_rofs               __constant_htonl(NLM_ROFS)
-#define        nlm4_stale_fh           __constant_htonl(NLM_STALE_FH)
-#define        nlm4_fbig               __constant_htonl(NLM_FBIG)
-#define        nlm4_failed             __constant_htonl(NLM_FAILED)
+#define        nlm4_deadlock           cpu_to_be32(NLM_DEADLCK)
+#define        nlm4_rofs               cpu_to_be32(NLM_ROFS)
+#define        nlm4_stale_fh           cpu_to_be32(NLM_STALE_FH)
+#define        nlm4_fbig               cpu_to_be32(NLM_FBIG)
+#define        nlm4_failed             cpu_to_be32(NLM_FAILED)
 
 
 
diff --git a/include/linux/mg_disk.h b/include/linux/mg_disk.h
new file mode 100644 (file)
index 0000000..1f76b1e
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ *  include/linux/mg_disk.c
+ *
+ *  Support for the mGine m[g]flash IO mode.
+ *  Based on legacy hd.c
+ *
+ * (c) 2008 mGine Co.,LTD
+ * (c) 2008 unsik Kim <donari75@gmail.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.
+ */
+
+#ifndef __MG_DISK_H__
+#define __MG_DISK_H__
+
+#include <linux/blkdev.h>
+#include <linux/ata.h>
+
+/* name for block device */
+#define MG_DISK_NAME "mgd"
+/* name for platform device */
+#define MG_DEV_NAME "mg_disk"
+
+#define MG_DISK_MAJ 0
+#define MG_DISK_MAX_PART 16
+#define MG_SECTOR_SIZE 512
+#define MG_MAX_SECTS 256
+
+/* Register offsets */
+#define MG_BUFF_OFFSET                 0x8000
+#define MG_STORAGE_BUFFER_SIZE         0x200
+#define MG_REG_OFFSET                  0xC000
+#define MG_REG_FEATURE                 (MG_REG_OFFSET + 2)     /* write case */
+#define MG_REG_ERROR                   (MG_REG_OFFSET + 2)     /* read case */
+#define MG_REG_SECT_CNT                        (MG_REG_OFFSET + 4)
+#define MG_REG_SECT_NUM                        (MG_REG_OFFSET + 6)
+#define MG_REG_CYL_LOW                 (MG_REG_OFFSET + 8)
+#define MG_REG_CYL_HIGH                        (MG_REG_OFFSET + 0xA)
+#define MG_REG_DRV_HEAD                        (MG_REG_OFFSET + 0xC)
+#define MG_REG_COMMAND                 (MG_REG_OFFSET + 0xE)   /* write case */
+#define MG_REG_STATUS                  (MG_REG_OFFSET + 0xE)   /* read  case */
+#define MG_REG_DRV_CTRL                        (MG_REG_OFFSET + 0x10)
+#define MG_REG_BURST_CTRL              (MG_REG_OFFSET + 0x12)
+
+/* "Drive Select/Head Register" bit values */
+#define MG_REG_HEAD_MUST_BE_ON         0xA0 /* These 2 bits are always on */
+#define MG_REG_HEAD_DRIVE_MASTER       (0x00 | MG_REG_HEAD_MUST_BE_ON)
+#define MG_REG_HEAD_DRIVE_SLAVE                (0x10 | MG_REG_HEAD_MUST_BE_ON)
+#define MG_REG_HEAD_LBA_MODE           (0x40 | MG_REG_HEAD_MUST_BE_ON)
+
+
+/* "Device Control Register" bit values */
+#define MG_REG_CTRL_INTR_ENABLE                        0x0
+#define MG_REG_CTRL_INTR_DISABLE               (0x1<<1)
+#define MG_REG_CTRL_RESET                      (0x1<<2)
+#define MG_REG_CTRL_INTR_POLA_ACTIVE_HIGH      0x0
+#define MG_REG_CTRL_INTR_POLA_ACTIVE_LOW       (0x1<<4)
+#define MG_REG_CTRL_DPD_POLA_ACTIVE_LOW                0x0
+#define MG_REG_CTRL_DPD_POLA_ACTIVE_HIGH       (0x1<<5)
+#define MG_REG_CTRL_DPD_DISABLE                        0x0
+#define MG_REG_CTRL_DPD_ENABLE                 (0x1<<6)
+
+/* Status register bit */
+/* error bit in status register */
+#define MG_REG_STATUS_BIT_ERROR                        0x01
+/* corrected error in status register */
+#define MG_REG_STATUS_BIT_CORRECTED_ERROR      0x04
+/* data request bit in status register */
+#define MG_REG_STATUS_BIT_DATA_REQ             0x08
+/* DSC - Drive Seek Complete */
+#define MG_REG_STATUS_BIT_SEEK_DONE            0x10
+/* DWF - Drive Write Fault */
+#define MG_REG_STATUS_BIT_WRITE_FAULT          0x20
+#define MG_REG_STATUS_BIT_READY                        0x40
+#define MG_REG_STATUS_BIT_BUSY                 0x80
+
+/* handy status */
+#define MG_STAT_READY  (MG_REG_STATUS_BIT_READY | MG_REG_STATUS_BIT_SEEK_DONE)
+#define MG_READY_OK(s) (((s) & (MG_STAT_READY | \
+                               (MG_REG_STATUS_BIT_BUSY | \
+                                MG_REG_STATUS_BIT_WRITE_FAULT | \
+                                MG_REG_STATUS_BIT_ERROR))) == MG_STAT_READY)
+
+/* Error register */
+#define MG_REG_ERR_AMNF                0x01
+#define MG_REG_ERR_ABRT                0x04
+#define MG_REG_ERR_IDNF                0x10
+#define MG_REG_ERR_UNC         0x40
+#define MG_REG_ERR_BBK         0x80
+
+/* error code for others */
+#define MG_ERR_NONE            0
+#define MG_ERR_TIMEOUT         0x100
+#define MG_ERR_INIT_STAT       0x101
+#define MG_ERR_TRANSLATION     0x102
+#define MG_ERR_CTRL_RST                0x103
+#define MG_ERR_INV_STAT                0x104
+#define MG_ERR_RSTOUT          0x105
+
+#define MG_MAX_ERRORS  6       /* Max read/write errors */
+
+/* command */
+#define MG_CMD_RD 0x20
+#define MG_CMD_WR 0x30
+#define MG_CMD_SLEEP 0x99
+#define MG_CMD_WAKEUP 0xC3
+#define MG_CMD_ID 0xEC
+#define MG_CMD_WR_CONF 0x3C
+#define MG_CMD_RD_CONF 0x40
+
+/* operation mode */
+#define MG_OP_CASCADE (1 << 0)
+#define MG_OP_CASCADE_SYNC_RD (1 << 1)
+#define MG_OP_CASCADE_SYNC_WR (1 << 2)
+#define MG_OP_INTERLEAVE (1 << 3)
+
+/* synchronous */
+#define MG_BURST_LAT_4 (3 << 4)
+#define MG_BURST_LAT_5 (4 << 4)
+#define MG_BURST_LAT_6 (5 << 4)
+#define MG_BURST_LAT_7 (6 << 4)
+#define MG_BURST_LAT_8 (7 << 4)
+#define MG_BURST_LEN_4 (1 << 1)
+#define MG_BURST_LEN_8 (2 << 1)
+#define MG_BURST_LEN_16 (3 << 1)
+#define MG_BURST_LEN_32 (4 << 1)
+#define MG_BURST_LEN_CONT (0 << 1)
+
+/* timeout value (unit: ms) */
+#define MG_TMAX_CONF_TO_CMD    1
+#define MG_TMAX_WAIT_RD_DRQ    10
+#define MG_TMAX_WAIT_WR_DRQ    500
+#define MG_TMAX_RST_TO_BUSY    10
+#define MG_TMAX_HDRST_TO_RDY   500
+#define MG_TMAX_SWRST_TO_RDY   500
+#define MG_TMAX_RSTOUT         3000
+
+/* device attribution */
+/* use mflash as boot device */
+#define MG_BOOT_DEV            (1 << 0)
+/* use mflash as storage device */
+#define MG_STORAGE_DEV         (1 << 1)
+/* same as MG_STORAGE_DEV, but bootloader already done reset sequence */
+#define MG_STORAGE_DEV_SKIP_RST        (1 << 2)
+
+#define MG_DEV_MASK (MG_BOOT_DEV | MG_STORAGE_DEV | MG_STORAGE_DEV_SKIP_RST)
+
+/* names of GPIO resource */
+#define MG_RST_PIN     "mg_rst"
+/* except MG_BOOT_DEV, reset-out pin should be assigned */
+#define MG_RSTOUT_PIN  "mg_rstout"
+
+/* private driver data */
+struct mg_drv_data {
+       /* disk resource */
+       u32 use_polling;
+
+       /* device attribution */
+       u32 dev_attr;
+
+       /* internally used */
+       struct mg_host *host;
+};
+
+/* main structure for mflash driver */
+struct mg_host {
+       struct device *dev;
+
+       struct request_queue *breq;
+       spinlock_t lock;
+       struct gendisk *gd;
+
+       struct timer_list timer;
+       void (*mg_do_intr) (struct mg_host *);
+
+       u16 id[ATA_ID_WORDS];
+
+       u16 cyls;
+       u16 heads;
+       u16 sectors;
+       u32 n_sectors;
+       u32 nres_sectors;
+
+       void __iomem *dev_base;
+       unsigned int irq;
+       unsigned int rst;
+       unsigned int rstout;
+
+       u32 major;
+       u32 error;
+};
+
+/*
+ * Debugging macro and defines
+ */
+#undef DO_MG_DEBUG
+#ifdef DO_MG_DEBUG
+#  define MG_DBG(fmt, args...) \
+       printk(KERN_DEBUG "%s:%d "fmt, __func__, __LINE__, ##args)
+#else /* CONFIG_MG_DEBUG */
+#  define MG_DBG(fmt, args...) do { } while (0)
+#endif /* CONFIG_MG_DEBUG */
+
+#endif
index 3aa5d77c2cdb0053d3c15c5c5bc48b05b97d93a6..5675b63a0631fd46b54f5e3f6781b4b9b87c6936 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/module.h>
 #include <linux/uio.h>
 #include <linux/notifier.h>
+#include <linux/device.h>
 
 #include <linux/mtd/compatmac.h>
 #include <mtd/mtd-abi.h>
@@ -162,6 +163,20 @@ struct mtd_info {
        /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
        void (*unpoint) (struct mtd_info *mtd, loff_t from, size_t len);
 
+       /* Allow NOMMU mmap() to directly map the device (if not NULL)
+        * - return the address to which the offset maps
+        * - return -ENOSYS to indicate refusal to do the mapping
+        */
+       unsigned long (*get_unmapped_area) (struct mtd_info *mtd,
+                                           unsigned long len,
+                                           unsigned long offset,
+                                           unsigned long flags);
+
+       /* Backing device capabilities for this device
+        * - provides mmap capabilities
+        */
+       struct backing_dev_info *backing_dev_info;
+
 
        int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
        int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
@@ -223,6 +238,7 @@ struct mtd_info {
        void *priv;
 
        struct module *owner;
+       struct device dev;
        int usecount;
 
        /* If the driver is something smart, like UBI, it may need to maintain
@@ -233,6 +249,11 @@ struct mtd_info {
        void (*put_device) (struct mtd_info *mtd);
 };
 
+static inline struct mtd_info *dev_to_mtd(struct device *dev)
+{
+       return dev ? container_of(dev, struct mtd_info, dev) : NULL;
+}
+
 static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd)
 {
        if (mtd->erasesize_shift)
index db5b63da2a7e46d619a746233cf40b4a8397e4c9..7efb9be34662b4aeb905adb246e366b2f9a1a58f 100644 (file)
@@ -43,8 +43,8 @@ extern void nand_wait_ready(struct mtd_info *mtd);
  * is supported now. If you add a chip with bigger oobsize/page
  * adjust this accordingly.
  */
-#define NAND_MAX_OOBSIZE       64
-#define NAND_MAX_PAGESIZE      2048
+#define NAND_MAX_OOBSIZE       128
+#define NAND_MAX_PAGESIZE      4096
 
 /*
  * Constants for hardware specific CLE/ALE/NCE function
index a45dd831b3f8ec0c468edf0890a8217dd80de29b..7535a74083b92bc443231a728bd062497603c576 100644 (file)
@@ -76,4 +76,16 @@ int __devinit of_mtd_parse_partitions(struct device *dev,
                                       struct device_node *node,
                                       struct mtd_partition **pparts);
 
+#ifdef CONFIG_MTD_PARTITIONS
+static inline int mtd_has_partitions(void) { return 1; }
+#else
+static inline int mtd_has_partitions(void) { return 0; }
+#endif
+
+#ifdef CONFIG_MTD_CMDLINE_PARTS
+static inline int mtd_has_cmdlinepart(void) { return 1; }
+#else
+static inline int mtd_has_cmdlinepart(void) { return 0; }
+#endif
+
 #endif
index 54af92c1c70b29c1f0eb9f4369a015714531fa34..214d499718f746d1408a3f5140771ae37bdb25b2 100644 (file)
        NFSERR_FILE_OPEN = 10046,      /*       v4 */
        NFSERR_ADMIN_REVOKED = 10047,  /*       v4 */
        NFSERR_CB_PATH_DOWN = 10048,   /*       v4 */
-       NFSERR_REPLAY_ME = 10049        /*       v4 */
 };
 
 /* NFSv2 file types - beware, these are not the same in NFSv3 */
index b912311a56b14eeac130e3d90ede6fb1d1bc23df..e3f0cbcbd0db8179e6055b59411c2d64550d5db2 100644 (file)
@@ -21,6 +21,7 @@
 #define NFS4_FHSIZE            128
 #define NFS4_MAXPATHLEN                PATH_MAX
 #define NFS4_MAXNAMLEN         NAME_MAX
+#define NFS4_MAX_SESSIONID_LEN 16
 
 #define NFS4_ACCESS_READ        0x0001
 #define NFS4_ACCESS_LOOKUP      0x0002
@@ -38,6 +39,7 @@
 #define NFS4_OPEN_RESULT_CONFIRM 0x0002
 #define NFS4_OPEN_RESULT_LOCKTYPE_POSIX 0x0004
 
+#define NFS4_SHARE_ACCESS_MASK 0x000F
 #define NFS4_SHARE_ACCESS_READ 0x0001
 #define NFS4_SHARE_ACCESS_WRITE        0x0002
 #define NFS4_SHARE_ACCESS_BOTH 0x0003
 #define NFS4_SHARE_DENY_WRITE  0x0002
 #define NFS4_SHARE_DENY_BOTH   0x0003
 
+/* nfs41 */
+#define NFS4_SHARE_WANT_MASK           0xFF00
+#define NFS4_SHARE_WANT_NO_PREFERENCE  0x0000
+#define NFS4_SHARE_WANT_READ_DELEG     0x0100
+#define NFS4_SHARE_WANT_WRITE_DELEG    0x0200
+#define NFS4_SHARE_WANT_ANY_DELEG      0x0300
+#define NFS4_SHARE_WANT_NO_DELEG       0x0400
+#define NFS4_SHARE_WANT_CANCEL         0x0500
+
+#define NFS4_SHARE_WHEN_MASK           0xF0000
+#define NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL       0x10000
+#define NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED         0x20000
+
 #define NFS4_SET_TO_SERVER_TIME        0
 #define NFS4_SET_TO_CLIENT_TIME        1
 
 #define NFS4_ACE_GENERIC_EXECUTE              0x001200A0
 #define NFS4_ACE_MASK_ALL                     0x001F01FF
 
+#define EXCHGID4_FLAG_SUPP_MOVED_REFER         0x00000001
+#define EXCHGID4_FLAG_SUPP_MOVED_MIGR          0x00000002
+#define EXCHGID4_FLAG_USE_NON_PNFS             0x00010000
+#define EXCHGID4_FLAG_USE_PNFS_MDS             0x00020000
+#define EXCHGID4_FLAG_USE_PNFS_DS              0x00040000
+#define EXCHGID4_FLAG_UPD_CONFIRMED_REC_A      0x40000000
+#define EXCHGID4_FLAG_CONFIRMED_R              0x80000000
+/*
+ * Since the validity of these bits depends on whether
+ * they're set in the argument or response, have separate
+ * invalid flag masks for arg (_A) and resp (_R).
+ */
+#define EXCHGID4_FLAG_MASK_A                   0x40070003
+#define EXCHGID4_FLAG_MASK_R                   0x80070003
+
+#define SEQ4_STATUS_CB_PATH_DOWN               0x00000001
+#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING   0x00000002
+#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED    0x00000004
+#define SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED  0x00000008
+#define SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED 0x00000010
+#define SEQ4_STATUS_ADMIN_STATE_REVOKED                0x00000020
+#define SEQ4_STATUS_RECALLABLE_STATE_REVOKED   0x00000040
+#define SEQ4_STATUS_LEASE_MOVED                        0x00000080
+#define SEQ4_STATUS_RESTART_RECLAIM_NEEDED     0x00000100
+
 #define NFS4_MAX_UINT64        (~(u64)0)
 
 enum nfs4_acl_whotype {
@@ -154,6 +194,28 @@ enum nfs_opnum4 {
        OP_VERIFY = 37,
        OP_WRITE = 38,
        OP_RELEASE_LOCKOWNER = 39,
+
+       /* nfs41 */
+       OP_BACKCHANNEL_CTL = 40,
+       OP_BIND_CONN_TO_SESSION = 41,
+       OP_EXCHANGE_ID = 42,
+       OP_CREATE_SESSION = 43,
+       OP_DESTROY_SESSION = 44,
+       OP_FREE_STATEID = 45,
+       OP_GET_DIR_DELEGATION = 46,
+       OP_GETDEVICEINFO = 47,
+       OP_GETDEVICELIST = 48,
+       OP_LAYOUTCOMMIT = 49,
+       OP_LAYOUTGET = 50,
+       OP_LAYOUTRETURN = 51,
+       OP_SECINFO_NO_NAME = 52,
+       OP_SEQUENCE = 53,
+       OP_SET_SSV = 54,
+       OP_TEST_STATEID = 55,
+       OP_WANT_DELEGATION = 56,
+       OP_DESTROY_CLIENTID = 57,
+       OP_RECLAIM_COMPLETE = 58,
+
        OP_ILLEGAL = 10044,
 };
 
@@ -230,7 +292,48 @@ enum nfsstat4 {
        NFS4ERR_DEADLOCK = 10045,
        NFS4ERR_FILE_OPEN = 10046,
        NFS4ERR_ADMIN_REVOKED = 10047,
-       NFS4ERR_CB_PATH_DOWN = 10048
+       NFS4ERR_CB_PATH_DOWN = 10048,
+
+       /* nfs41 */
+       NFS4ERR_BADIOMODE       = 10049,
+       NFS4ERR_BADLAYOUT       = 10050,
+       NFS4ERR_BAD_SESSION_DIGEST = 10051,
+       NFS4ERR_BADSESSION      = 10052,
+       NFS4ERR_BADSLOT         = 10053,
+       NFS4ERR_COMPLETE_ALREADY = 10054,
+       NFS4ERR_CONN_NOT_BOUND_TO_SESSION = 10055,
+       NFS4ERR_DELEG_ALREADY_WANTED = 10056,
+       NFS4ERR_BACK_CHAN_BUSY  = 10057,        /* backchan reqs outstanding */
+       NFS4ERR_LAYOUTTRYLATER  = 10058,
+       NFS4ERR_LAYOUTUNAVAILABLE = 10059,
+       NFS4ERR_NOMATCHING_LAYOUT = 10060,
+       NFS4ERR_RECALLCONFLICT  = 10061,
+       NFS4ERR_UNKNOWN_LAYOUTTYPE = 10062,
+       NFS4ERR_SEQ_MISORDERED = 10063,         /* unexpected seq.id in req */
+       NFS4ERR_SEQUENCE_POS    = 10064,        /* [CB_]SEQ. op not 1st op */
+       NFS4ERR_REQ_TOO_BIG     = 10065,        /* request too big */
+       NFS4ERR_REP_TOO_BIG     = 10066,        /* reply too big */
+       NFS4ERR_REP_TOO_BIG_TO_CACHE = 10067,   /* rep. not all cached */
+       NFS4ERR_RETRY_UNCACHED_REP = 10068,     /* retry & rep. uncached */
+       NFS4ERR_UNSAFE_COMPOUND = 10069,        /* retry/recovery too hard */
+       NFS4ERR_TOO_MANY_OPS    = 10070,        /* too many ops in [CB_]COMP */
+       NFS4ERR_OP_NOT_IN_SESSION = 10071,      /* op needs [CB_]SEQ. op */
+       NFS4ERR_HASH_ALG_UNSUPP = 10072,        /* hash alg. not supp. */
+                                               /* Error 10073 is unused. */
+       NFS4ERR_CLIENTID_BUSY   = 10074,        /* clientid has state */
+       NFS4ERR_PNFS_IO_HOLE    = 10075,        /* IO to _SPARSE file hole */
+       NFS4ERR_SEQ_FALSE_RETRY = 10076,        /* retry not origional */
+       NFS4ERR_BAD_HIGH_SLOT   = 10077,        /* sequence arg bad */
+       NFS4ERR_DEADSESSION     = 10078,        /* persistent session dead */
+       NFS4ERR_ENCR_ALG_UNSUPP = 10079,        /* SSV alg mismatch */
+       NFS4ERR_PNFS_NO_LAYOUT  = 10080,        /* direct I/O with no layout */
+       NFS4ERR_NOT_ONLY_OP     = 10081,        /* bad compound */
+       NFS4ERR_WRONG_CRED      = 10082,        /* permissions:state change */
+       NFS4ERR_WRONG_TYPE      = 10083,        /* current operation mismatch */
+       NFS4ERR_DIRDELEG_UNAVAIL = 10084,       /* no directory delegation */
+       NFS4ERR_REJECT_DELEG    = 10085,        /* on callback */
+       NFS4ERR_RETURNCONFLICT  = 10086,        /* outstanding layoutreturn */
+       NFS4ERR_DELEG_REVOKED   = 10087,        /* deleg./layout revoked */
 };
 
 /*
@@ -265,7 +368,13 @@ enum opentype4 {
 enum createmode4 {
        NFS4_CREATE_UNCHECKED = 0,
        NFS4_CREATE_GUARDED = 1,
-       NFS4_CREATE_EXCLUSIVE = 2
+       NFS4_CREATE_EXCLUSIVE = 2,
+       /*
+        * New to NFSv4.1. If session is persistent,
+        * GUARDED4 MUST be used. Otherwise, use
+        * EXCLUSIVE4_1 instead of EXCLUSIVE4.
+        */
+       NFS4_CREATE_EXCLUSIVE4_1 = 3
 };
 
 enum limit_by4 {
@@ -301,6 +410,8 @@ enum lock_type4 {
 #define FATTR4_WORD0_UNIQUE_HANDLES     (1UL << 9)
 #define FATTR4_WORD0_LEASE_TIME         (1UL << 10)
 #define FATTR4_WORD0_RDATTR_ERROR       (1UL << 11)
+/* Mandatory in NFSv4.1 */
+#define FATTR4_WORD2_SUPPATTR_EXCLCREAT (1UL << 11)
 
 /* Recommended Attributes */
 #define FATTR4_WORD0_ACL                (1UL << 12)
@@ -391,6 +502,29 @@ enum {
        NFSPROC4_CLNT_GETACL,
        NFSPROC4_CLNT_SETACL,
        NFSPROC4_CLNT_FS_LOCATIONS,
+
+       /* nfs41 */
+       NFSPROC4_CLNT_EXCHANGE_ID,
+       NFSPROC4_CLNT_CREATE_SESSION,
+       NFSPROC4_CLNT_DESTROY_SESSION,
+       NFSPROC4_CLNT_SEQUENCE,
+       NFSPROC4_CLNT_GET_LEASE_TIME,
+};
+
+/* nfs41 types */
+struct nfs4_sessionid {
+       unsigned char data[NFS4_MAX_SESSIONID_LEN];
+};
+
+/* Create Session Flags */
+#define SESSION4_PERSIST        0x001
+#define SESSION4_BACK_CHAN      0x002
+#define SESSION4_RDMA           0x004
+
+enum state_protect_how4 {
+       SP4_NONE        = 0,
+       SP4_MACH_CRED   = 1,
+       SP4_SSV         = 2
 };
 
 #endif
index 04b355c801d83fa1f537cb6fa596b3649220f071..5bccaab81056bf1bf17075ee7267c884a38b882a 100644 (file)
@@ -76,4 +76,12 @@ void nfsd_reply_cache_shutdown(void);
 int    nfsd_cache_lookup(struct svc_rqst *, int);
 void   nfsd_cache_update(struct svc_rqst *, int, __be32 *);
 
+#ifdef CONFIG_NFSD_V4
+void   nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp);
+#else  /* CONFIG_NFSD_V4 */
+static inline void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp)
+{
+}
+#endif /* CONFIG_NFSD_V4 */
+
 #endif /* NFSCACHE_H */
index e19f45991b2ea6bffe31d8ea63d5fbe2dce19487..2b49d676d0c9a9e7ef39fd4de53cfbb4d5f32bb2 100644 (file)
@@ -23,7 +23,7 @@
 /*
  * nfsd version
  */
-#define NFSD_SUPPORTED_MINOR_VERSION   0
+#define NFSD_SUPPORTED_MINOR_VERSION   1
 
 /*
  * Flags for nfsd_permission
@@ -53,6 +53,7 @@ typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int);
 extern struct svc_program      nfsd_program;
 extern struct svc_version      nfsd_version2, nfsd_version3,
                                nfsd_version4;
+extern u32                     nfsd_supported_minorversion;
 extern struct mutex            nfsd_mutex;
 extern struct svc_serv         *nfsd_serv;
 
@@ -105,7 +106,7 @@ void                nfsd_close(struct file *);
 __be32                 nfsd_read(struct svc_rqst *, struct svc_fh *, struct file *,
                                loff_t, struct kvec *, int, unsigned long *);
 __be32                 nfsd_write(struct svc_rqst *, struct svc_fh *,struct file *,
-                               loff_t, struct kvec *,int, unsigned long, int *);
+                               loff_t, struct kvec *,int, unsigned long *, int *);
 __be32         nfsd_readlink(struct svc_rqst *, struct svc_fh *,
                                char *, int *);
 __be32         nfsd_symlink(struct svc_rqst *, struct svc_fh *,
@@ -149,6 +150,7 @@ int nfsd_set_posix_acl(struct svc_fh *, int, struct posix_acl *);
 
 enum vers_op {NFSD_SET, NFSD_CLEAR, NFSD_TEST, NFSD_AVAIL };
 int nfsd_vers(int vers, enum vers_op change);
+int nfsd_minorversion(u32 minorversion, enum vers_op change);
 void nfsd_reset_versions(void);
 int nfsd_create_serv(void);
 
@@ -186,78 +188,119 @@ void             nfsd_lockd_shutdown(void);
 /*
  * These macros provide pre-xdr'ed values for faster operation.
  */
-#define        nfs_ok                  __constant_htonl(NFS_OK)
-#define        nfserr_perm             __constant_htonl(NFSERR_PERM)
-#define        nfserr_noent            __constant_htonl(NFSERR_NOENT)
-#define        nfserr_io               __constant_htonl(NFSERR_IO)
-#define        nfserr_nxio             __constant_htonl(NFSERR_NXIO)
-#define        nfserr_eagain           __constant_htonl(NFSERR_EAGAIN)
-#define        nfserr_acces            __constant_htonl(NFSERR_ACCES)
-#define        nfserr_exist            __constant_htonl(NFSERR_EXIST)
-#define        nfserr_xdev             __constant_htonl(NFSERR_XDEV)
-#define        nfserr_nodev            __constant_htonl(NFSERR_NODEV)
-#define        nfserr_notdir           __constant_htonl(NFSERR_NOTDIR)
-#define        nfserr_isdir            __constant_htonl(NFSERR_ISDIR)
-#define        nfserr_inval            __constant_htonl(NFSERR_INVAL)
-#define        nfserr_fbig             __constant_htonl(NFSERR_FBIG)
-#define        nfserr_nospc            __constant_htonl(NFSERR_NOSPC)
-#define        nfserr_rofs             __constant_htonl(NFSERR_ROFS)
-#define        nfserr_mlink            __constant_htonl(NFSERR_MLINK)
-#define        nfserr_opnotsupp        __constant_htonl(NFSERR_OPNOTSUPP)
-#define        nfserr_nametoolong      __constant_htonl(NFSERR_NAMETOOLONG)
-#define        nfserr_notempty         __constant_htonl(NFSERR_NOTEMPTY)
-#define        nfserr_dquot            __constant_htonl(NFSERR_DQUOT)
-#define        nfserr_stale            __constant_htonl(NFSERR_STALE)
-#define        nfserr_remote           __constant_htonl(NFSERR_REMOTE)
-#define        nfserr_wflush           __constant_htonl(NFSERR_WFLUSH)
-#define        nfserr_badhandle        __constant_htonl(NFSERR_BADHANDLE)
-#define        nfserr_notsync          __constant_htonl(NFSERR_NOT_SYNC)
-#define        nfserr_badcookie        __constant_htonl(NFSERR_BAD_COOKIE)
-#define        nfserr_notsupp          __constant_htonl(NFSERR_NOTSUPP)
-#define        nfserr_toosmall         __constant_htonl(NFSERR_TOOSMALL)
-#define        nfserr_serverfault      __constant_htonl(NFSERR_SERVERFAULT)
-#define        nfserr_badtype          __constant_htonl(NFSERR_BADTYPE)
-#define        nfserr_jukebox          __constant_htonl(NFSERR_JUKEBOX)
-#define        nfserr_denied           __constant_htonl(NFSERR_DENIED)
-#define        nfserr_deadlock         __constant_htonl(NFSERR_DEADLOCK)
-#define nfserr_expired          __constant_htonl(NFSERR_EXPIRED)
-#define        nfserr_bad_cookie       __constant_htonl(NFSERR_BAD_COOKIE)
-#define        nfserr_same             __constant_htonl(NFSERR_SAME)
-#define        nfserr_clid_inuse       __constant_htonl(NFSERR_CLID_INUSE)
-#define        nfserr_stale_clientid   __constant_htonl(NFSERR_STALE_CLIENTID)
-#define        nfserr_resource         __constant_htonl(NFSERR_RESOURCE)
-#define        nfserr_moved            __constant_htonl(NFSERR_MOVED)
-#define        nfserr_nofilehandle     __constant_htonl(NFSERR_NOFILEHANDLE)
-#define        nfserr_minor_vers_mismatch      __constant_htonl(NFSERR_MINOR_VERS_MISMATCH)
-#define nfserr_share_denied    __constant_htonl(NFSERR_SHARE_DENIED)
-#define nfserr_stale_stateid   __constant_htonl(NFSERR_STALE_STATEID)
-#define nfserr_old_stateid     __constant_htonl(NFSERR_OLD_STATEID)
-#define nfserr_bad_stateid     __constant_htonl(NFSERR_BAD_STATEID)
-#define nfserr_bad_seqid       __constant_htonl(NFSERR_BAD_SEQID)
-#define        nfserr_symlink          __constant_htonl(NFSERR_SYMLINK)
-#define        nfserr_not_same         __constant_htonl(NFSERR_NOT_SAME)
-#define        nfserr_restorefh        __constant_htonl(NFSERR_RESTOREFH)
-#define        nfserr_attrnotsupp      __constant_htonl(NFSERR_ATTRNOTSUPP)
-#define        nfserr_bad_xdr          __constant_htonl(NFSERR_BAD_XDR)
-#define        nfserr_openmode         __constant_htonl(NFSERR_OPENMODE)
-#define        nfserr_locks_held       __constant_htonl(NFSERR_LOCKS_HELD)
-#define        nfserr_op_illegal       __constant_htonl(NFSERR_OP_ILLEGAL)
-#define        nfserr_grace            __constant_htonl(NFSERR_GRACE)
-#define        nfserr_no_grace         __constant_htonl(NFSERR_NO_GRACE)
-#define        nfserr_reclaim_bad      __constant_htonl(NFSERR_RECLAIM_BAD)
-#define        nfserr_badname          __constant_htonl(NFSERR_BADNAME)
-#define        nfserr_cb_path_down     __constant_htonl(NFSERR_CB_PATH_DOWN)
-#define        nfserr_locked           __constant_htonl(NFSERR_LOCKED)
-#define        nfserr_wrongsec         __constant_htonl(NFSERR_WRONGSEC)
-#define        nfserr_replay_me        __constant_htonl(NFSERR_REPLAY_ME)
+#define        nfs_ok                  cpu_to_be32(NFS_OK)
+#define        nfserr_perm             cpu_to_be32(NFSERR_PERM)
+#define        nfserr_noent            cpu_to_be32(NFSERR_NOENT)
+#define        nfserr_io               cpu_to_be32(NFSERR_IO)
+#define        nfserr_nxio             cpu_to_be32(NFSERR_NXIO)
+#define        nfserr_eagain           cpu_to_be32(NFSERR_EAGAIN)
+#define        nfserr_acces            cpu_to_be32(NFSERR_ACCES)
+#define        nfserr_exist            cpu_to_be32(NFSERR_EXIST)
+#define        nfserr_xdev             cpu_to_be32(NFSERR_XDEV)
+#define        nfserr_nodev            cpu_to_be32(NFSERR_NODEV)
+#define        nfserr_notdir           cpu_to_be32(NFSERR_NOTDIR)
+#define        nfserr_isdir            cpu_to_be32(NFSERR_ISDIR)
+#define        nfserr_inval            cpu_to_be32(NFSERR_INVAL)
+#define        nfserr_fbig             cpu_to_be32(NFSERR_FBIG)
+#define        nfserr_nospc            cpu_to_be32(NFSERR_NOSPC)
+#define        nfserr_rofs             cpu_to_be32(NFSERR_ROFS)
+#define        nfserr_mlink            cpu_to_be32(NFSERR_MLINK)
+#define        nfserr_opnotsupp        cpu_to_be32(NFSERR_OPNOTSUPP)
+#define        nfserr_nametoolong      cpu_to_be32(NFSERR_NAMETOOLONG)
+#define        nfserr_notempty         cpu_to_be32(NFSERR_NOTEMPTY)
+#define        nfserr_dquot            cpu_to_be32(NFSERR_DQUOT)
+#define        nfserr_stale            cpu_to_be32(NFSERR_STALE)
+#define        nfserr_remote           cpu_to_be32(NFSERR_REMOTE)
+#define        nfserr_wflush           cpu_to_be32(NFSERR_WFLUSH)
+#define        nfserr_badhandle        cpu_to_be32(NFSERR_BADHANDLE)
+#define        nfserr_notsync          cpu_to_be32(NFSERR_NOT_SYNC)
+#define        nfserr_badcookie        cpu_to_be32(NFSERR_BAD_COOKIE)
+#define        nfserr_notsupp          cpu_to_be32(NFSERR_NOTSUPP)
+#define        nfserr_toosmall         cpu_to_be32(NFSERR_TOOSMALL)
+#define        nfserr_serverfault      cpu_to_be32(NFSERR_SERVERFAULT)
+#define        nfserr_badtype          cpu_to_be32(NFSERR_BADTYPE)
+#define        nfserr_jukebox          cpu_to_be32(NFSERR_JUKEBOX)
+#define        nfserr_denied           cpu_to_be32(NFSERR_DENIED)
+#define        nfserr_deadlock         cpu_to_be32(NFSERR_DEADLOCK)
+#define nfserr_expired          cpu_to_be32(NFSERR_EXPIRED)
+#define        nfserr_bad_cookie       cpu_to_be32(NFSERR_BAD_COOKIE)
+#define        nfserr_same             cpu_to_be32(NFSERR_SAME)
+#define        nfserr_clid_inuse       cpu_to_be32(NFSERR_CLID_INUSE)
+#define        nfserr_stale_clientid   cpu_to_be32(NFSERR_STALE_CLIENTID)
+#define        nfserr_resource         cpu_to_be32(NFSERR_RESOURCE)
+#define        nfserr_moved            cpu_to_be32(NFSERR_MOVED)
+#define        nfserr_nofilehandle     cpu_to_be32(NFSERR_NOFILEHANDLE)
+#define        nfserr_minor_vers_mismatch      cpu_to_be32(NFSERR_MINOR_VERS_MISMATCH)
+#define nfserr_share_denied    cpu_to_be32(NFSERR_SHARE_DENIED)
+#define nfserr_stale_stateid   cpu_to_be32(NFSERR_STALE_STATEID)
+#define nfserr_old_stateid     cpu_to_be32(NFSERR_OLD_STATEID)
+#define nfserr_bad_stateid     cpu_to_be32(NFSERR_BAD_STATEID)
+#define nfserr_bad_seqid       cpu_to_be32(NFSERR_BAD_SEQID)
+#define        nfserr_symlink          cpu_to_be32(NFSERR_SYMLINK)
+#define        nfserr_not_same         cpu_to_be32(NFSERR_NOT_SAME)
+#define        nfserr_restorefh        cpu_to_be32(NFSERR_RESTOREFH)
+#define        nfserr_attrnotsupp      cpu_to_be32(NFSERR_ATTRNOTSUPP)
+#define        nfserr_bad_xdr          cpu_to_be32(NFSERR_BAD_XDR)
+#define        nfserr_openmode         cpu_to_be32(NFSERR_OPENMODE)
+#define        nfserr_locks_held       cpu_to_be32(NFSERR_LOCKS_HELD)
+#define        nfserr_op_illegal       cpu_to_be32(NFSERR_OP_ILLEGAL)
+#define        nfserr_grace            cpu_to_be32(NFSERR_GRACE)
+#define        nfserr_no_grace         cpu_to_be32(NFSERR_NO_GRACE)
+#define        nfserr_reclaim_bad      cpu_to_be32(NFSERR_RECLAIM_BAD)
+#define        nfserr_badname          cpu_to_be32(NFSERR_BADNAME)
+#define        nfserr_cb_path_down     cpu_to_be32(NFSERR_CB_PATH_DOWN)
+#define        nfserr_locked           cpu_to_be32(NFSERR_LOCKED)
+#define        nfserr_wrongsec         cpu_to_be32(NFSERR_WRONGSEC)
+#define nfserr_badiomode               cpu_to_be32(NFS4ERR_BADIOMODE)
+#define nfserr_badlayout               cpu_to_be32(NFS4ERR_BADLAYOUT)
+#define nfserr_bad_session_digest      cpu_to_be32(NFS4ERR_BAD_SESSION_DIGEST)
+#define nfserr_badsession              cpu_to_be32(NFS4ERR_BADSESSION)
+#define nfserr_badslot                 cpu_to_be32(NFS4ERR_BADSLOT)
+#define nfserr_complete_already                cpu_to_be32(NFS4ERR_COMPLETE_ALREADY)
+#define nfserr_conn_not_bound_to_session cpu_to_be32(NFS4ERR_CONN_NOT_BOUND_TO_SESSION)
+#define nfserr_deleg_already_wanted    cpu_to_be32(NFS4ERR_DELEG_ALREADY_WANTED)
+#define nfserr_back_chan_busy          cpu_to_be32(NFS4ERR_BACK_CHAN_BUSY)
+#define nfserr_layouttrylater          cpu_to_be32(NFS4ERR_LAYOUTTRYLATER)
+#define nfserr_layoutunavailable       cpu_to_be32(NFS4ERR_LAYOUTUNAVAILABLE)
+#define nfserr_nomatching_layout       cpu_to_be32(NFS4ERR_NOMATCHING_LAYOUT)
+#define nfserr_recallconflict          cpu_to_be32(NFS4ERR_RECALLCONFLICT)
+#define nfserr_unknown_layouttype      cpu_to_be32(NFS4ERR_UNKNOWN_LAYOUTTYPE)
+#define nfserr_seq_misordered          cpu_to_be32(NFS4ERR_SEQ_MISORDERED)
+#define nfserr_sequence_pos            cpu_to_be32(NFS4ERR_SEQUENCE_POS)
+#define nfserr_req_too_big             cpu_to_be32(NFS4ERR_REQ_TOO_BIG)
+#define nfserr_rep_too_big             cpu_to_be32(NFS4ERR_REP_TOO_BIG)
+#define nfserr_rep_too_big_to_cache    cpu_to_be32(NFS4ERR_REP_TOO_BIG_TO_CACHE)
+#define nfserr_retry_uncached_rep      cpu_to_be32(NFS4ERR_RETRY_UNCACHED_REP)
+#define nfserr_unsafe_compound         cpu_to_be32(NFS4ERR_UNSAFE_COMPOUND)
+#define nfserr_too_many_ops            cpu_to_be32(NFS4ERR_TOO_MANY_OPS)
+#define nfserr_op_not_in_session       cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION)
+#define nfserr_hash_alg_unsupp         cpu_to_be32(NFS4ERR_HASH_ALG_UNSUPP)
+#define nfserr_clientid_busy           cpu_to_be32(NFS4ERR_CLIENTID_BUSY)
+#define nfserr_pnfs_io_hole            cpu_to_be32(NFS4ERR_PNFS_IO_HOLE)
+#define nfserr_seq_false_retry         cpu_to_be32(NFS4ERR_SEQ_FALSE_RETRY)
+#define nfserr_bad_high_slot           cpu_to_be32(NFS4ERR_BAD_HIGH_SLOT)
+#define nfserr_deadsession             cpu_to_be32(NFS4ERR_DEADSESSION)
+#define nfserr_encr_alg_unsupp         cpu_to_be32(NFS4ERR_ENCR_ALG_UNSUPP)
+#define nfserr_pnfs_no_layout          cpu_to_be32(NFS4ERR_PNFS_NO_LAYOUT)
+#define nfserr_not_only_op             cpu_to_be32(NFS4ERR_NOT_ONLY_OP)
+#define nfserr_wrong_cred              cpu_to_be32(NFS4ERR_WRONG_CRED)
+#define nfserr_wrong_type              cpu_to_be32(NFS4ERR_WRONG_TYPE)
+#define nfserr_dirdeleg_unavail                cpu_to_be32(NFS4ERR_DIRDELEG_UNAVAIL)
+#define nfserr_reject_deleg            cpu_to_be32(NFS4ERR_REJECT_DELEG)
+#define nfserr_returnconflict          cpu_to_be32(NFS4ERR_RETURNCONFLICT)
+#define nfserr_deleg_revoked           cpu_to_be32(NFS4ERR_DELEG_REVOKED)
 
 /* error codes for internal use */
 /* if a request fails due to kmalloc failure, it gets dropped.
  *  Client should resend eventually
  */
-#define        nfserr_dropit           __constant_htonl(30000)
+#define        nfserr_dropit           cpu_to_be32(30000)
 /* end-of-file indicator in readdir */
-#define        nfserr_eof              __constant_htonl(30001)
+#define        nfserr_eof              cpu_to_be32(30001)
+/* replay detected */
+#define        nfserr_replay_me        cpu_to_be32(11001)
+/* nfs41 replay detected */
+#define        nfserr_replay_cache     cpu_to_be32(11002)
 
 /* Check for dir entries '.' and '..' */
 #define isdotent(n, l) (l < 3 && n[0] == '.' && (l == 1 || n[1] == '.'))
@@ -300,7 +343,7 @@ extern struct timeval       nfssvc_boot;
  *    TIME_BACKUP   (unlikely to be supported any time soon)
  *    TIME_CREATE   (unlikely to be supported any time soon)
  */
-#define NFSD_SUPPORTED_ATTRS_WORD0                                                          \
+#define NFSD4_SUPPORTED_ATTRS_WORD0                                                         \
 (FATTR4_WORD0_SUPPORTED_ATTRS   | FATTR4_WORD0_TYPE         | FATTR4_WORD0_FH_EXPIRE_TYPE   \
  | FATTR4_WORD0_CHANGE          | FATTR4_WORD0_SIZE         | FATTR4_WORD0_LINK_SUPPORT     \
  | FATTR4_WORD0_SYMLINK_SUPPORT | FATTR4_WORD0_NAMED_ATTR   | FATTR4_WORD0_FSID             \
@@ -312,7 +355,7 @@ extern struct timeval       nfssvc_boot;
  | FATTR4_WORD0_MAXFILESIZE     | FATTR4_WORD0_MAXLINK      | FATTR4_WORD0_MAXNAME          \
  | FATTR4_WORD0_MAXREAD         | FATTR4_WORD0_MAXWRITE     | FATTR4_WORD0_ACL)
 
-#define NFSD_SUPPORTED_ATTRS_WORD1                                                          \
+#define NFSD4_SUPPORTED_ATTRS_WORD1                                                         \
 (FATTR4_WORD1_MODE              | FATTR4_WORD1_NO_TRUNC     | FATTR4_WORD1_NUMLINKS         \
  | FATTR4_WORD1_OWNER          | FATTR4_WORD1_OWNER_GROUP  | FATTR4_WORD1_RAWDEV           \
  | FATTR4_WORD1_SPACE_AVAIL     | FATTR4_WORD1_SPACE_FREE   | FATTR4_WORD1_SPACE_TOTAL      \
@@ -320,6 +363,35 @@ extern struct timeval      nfssvc_boot;
  | FATTR4_WORD1_TIME_DELTA   | FATTR4_WORD1_TIME_METADATA    \
  | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
 
+#define NFSD4_SUPPORTED_ATTRS_WORD2 0
+
+#define NFSD4_1_SUPPORTED_ATTRS_WORD0 \
+       NFSD4_SUPPORTED_ATTRS_WORD0
+
+#define NFSD4_1_SUPPORTED_ATTRS_WORD1 \
+       NFSD4_SUPPORTED_ATTRS_WORD1
+
+#define NFSD4_1_SUPPORTED_ATTRS_WORD2 \
+       (NFSD4_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SUPPATTR_EXCLCREAT)
+
+static inline u32 nfsd_suppattrs0(u32 minorversion)
+{
+       return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD0
+                           : NFSD4_SUPPORTED_ATTRS_WORD0;
+}
+
+static inline u32 nfsd_suppattrs1(u32 minorversion)
+{
+       return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD1
+                           : NFSD4_SUPPORTED_ATTRS_WORD1;
+}
+
+static inline u32 nfsd_suppattrs2(u32 minorversion)
+{
+       return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD2
+                           : NFSD4_SUPPORTED_ATTRS_WORD2;
+}
+
 /* These will return ERR_INVAL if specified in GETATTR or READDIR. */
 #define NFSD_WRITEONLY_ATTRS_WORD1                                                         \
 (FATTR4_WORD1_TIME_ACCESS_SET   | FATTR4_WORD1_TIME_MODIFY_SET)
@@ -330,6 +402,19 @@ extern struct timeval      nfssvc_boot;
 #define NFSD_WRITEABLE_ATTRS_WORD1                                                          \
 (FATTR4_WORD1_MODE              | FATTR4_WORD1_OWNER         | FATTR4_WORD1_OWNER_GROUP     \
  | FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET)
+#define NFSD_WRITEABLE_ATTRS_WORD2 0
+
+#define NFSD_SUPPATTR_EXCLCREAT_WORD0 \
+       NFSD_WRITEABLE_ATTRS_WORD0
+/*
+ * we currently store the exclusive create verifier in the v_{a,m}time
+ * attributes so the client can't set these at create time using EXCLUSIVE4_1
+ */
+#define NFSD_SUPPATTR_EXCLCREAT_WORD1 \
+       (NFSD_WRITEABLE_ATTRS_WORD1 & \
+        ~(FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET))
+#define NFSD_SUPPATTR_EXCLCREAT_WORD2 \
+       NFSD_WRITEABLE_ATTRS_WORD2
 
 #endif /* CONFIG_NFSD_V4 */
 
index fa317f6c154b168286905d40ca3b9aae9918cf0e..afa19016c4a8fdc90fd1fad4cdeff3179cda7613 100644 (file)
@@ -269,6 +269,13 @@ fh_copy(struct svc_fh *dst, struct svc_fh *src)
        return dst;
 }
 
+static inline void
+fh_copy_shallow(struct knfsd_fh *dst, struct knfsd_fh *src)
+{
+       dst->fh_size = src->fh_size;
+       memcpy(&dst->fh_base, &src->fh_base, src->fh_size);
+}
+
 static __inline__ struct svc_fh *
 fh_init(struct svc_fh *fhp, int maxsize)
 {
index 128298c0362d488e113ab34649dfd3643e319fa3..4d61c873feed3d107d5dfcc3a64564fae252706e 100644 (file)
@@ -66,8 +66,7 @@ struct nfs4_cb_recall {
        u32                     cbr_ident;
        int                     cbr_trunc;
        stateid_t               cbr_stateid;
-       u32                     cbr_fhlen;
-       char                    cbr_fhval[NFS4_FHSIZE];
+       struct knfsd_fh         cbr_fh;
        struct nfs4_delegation  *cbr_dp;
 };
 
@@ -86,8 +85,7 @@ struct nfs4_delegation {
 };
 
 #define dl_stateid      dl_recall.cbr_stateid
-#define dl_fhlen        dl_recall.cbr_fhlen
-#define dl_fhval        dl_recall.cbr_fhval
+#define dl_fh           dl_recall.cbr_fh
 
 /* client delegation callback info */
 struct nfs4_callback {
@@ -101,6 +99,64 @@ struct nfs4_callback {
        struct rpc_clnt *       cb_client;
 };
 
+/* Maximum number of slots per session. 128 is useful for long haul TCP */
+#define NFSD_MAX_SLOTS_PER_SESSION     128
+/* Maximum number of pages per slot cache entry */
+#define NFSD_PAGES_PER_SLOT    1
+/* Maximum number of operations per session compound */
+#define NFSD_MAX_OPS_PER_COMPOUND      16
+
+struct nfsd4_cache_entry {
+       __be32          ce_status;
+       struct kvec     ce_datav; /* encoded NFSv4.1 data in rq_res.head[0] */
+       struct page     *ce_respages[NFSD_PAGES_PER_SLOT + 1];
+       int             ce_cachethis;
+       short           ce_resused;
+       int             ce_opcnt;
+       int             ce_rpchdrlen;
+};
+
+struct nfsd4_slot {
+       bool                            sl_inuse;
+       u32                             sl_seqid;
+       struct nfsd4_cache_entry        sl_cache_entry;
+};
+
+struct nfsd4_session {
+       struct kref             se_ref;
+       struct list_head        se_hash;        /* hash by sessionid */
+       struct list_head        se_perclnt;
+       u32                     se_flags;
+       struct nfs4_client      *se_client;     /* for expire_client */
+       struct nfs4_sessionid   se_sessionid;
+       u32                     se_fmaxreq_sz;
+       u32                     se_fmaxresp_sz;
+       u32                     se_fmaxresp_cached;
+       u32                     se_fmaxops;
+       u32                     se_fnumslots;
+       struct nfsd4_slot       se_slots[];     /* forward channel slots */
+};
+
+static inline void
+nfsd4_put_session(struct nfsd4_session *ses)
+{
+       extern void free_session(struct kref *kref);
+       kref_put(&ses->se_ref, free_session);
+}
+
+static inline void
+nfsd4_get_session(struct nfsd4_session *ses)
+{
+       kref_get(&ses->se_ref);
+}
+
+/* formatted contents of nfs4_sessionid */
+struct nfsd4_sessionid {
+       clientid_t      clientid;
+       u32             sequence;
+       u32             reserved;
+};
+
 #define HEXDIR_LEN     33 /* hex version of 16 byte md5 of cl_name plus '\0' */
 
 /*
@@ -132,6 +188,12 @@ struct nfs4_client {
        struct nfs4_callback    cl_callback;    /* callback info */
        atomic_t                cl_count;       /* ref count */
        u32                     cl_firststate;  /* recovery dir creation */
+
+       /* for nfs41 */
+       struct list_head        cl_sessions;
+       struct nfsd4_slot       cl_slot;        /* create_session slot */
+       u32                     cl_exchange_flags;
+       struct nfs4_sessionid   cl_sessionid;
 };
 
 /* struct nfs4_client_reset
@@ -168,8 +230,7 @@ struct nfs4_replay {
        unsigned int            rp_buflen;
        char                    *rp_buf;
        unsigned                intrp_allocated;
-       int                     rp_openfh_len;
-       char                    rp_openfh[NFS4_FHSIZE];
+       struct knfsd_fh         rp_openfh;
        char                    rp_ibuf[NFSD4_REPLAY_ISIZE];
 };
 
@@ -217,7 +278,7 @@ struct nfs4_stateowner {
 *      share_acces, share_deny on the file.
 */
 struct nfs4_file {
-       struct kref             fi_ref;
+       atomic_t                fi_ref;
        struct list_head        fi_hash;    /* hash by "struct inode *" */
        struct list_head        fi_stateids;
        struct list_head        fi_delegations;
@@ -259,14 +320,13 @@ struct nfs4_stateid {
 };
 
 /* flags for preprocess_seqid_op() */
-#define CHECK_FH                0x00000001
+#define HAS_SESSION             0x00000001
 #define CONFIRM                 0x00000002
 #define OPEN_STATE              0x00000004
 #define LOCK_STATE              0x00000008
 #define RD_STATE               0x00000010
 #define WR_STATE               0x00000020
 #define CLOSE_STATE             0x00000040
-#define DELEG_RET               0x00000080
 
 #define seqid_mutating_err(err)                       \
        (((err) != nfserr_stale_clientid) &&    \
@@ -274,7 +334,9 @@ struct nfs4_stateid {
        ((err) != nfserr_stale_stateid) &&      \
        ((err) != nfserr_bad_stateid))
 
-extern __be32 nfs4_preprocess_stateid_op(struct svc_fh *current_fh,
+struct nfsd4_compound_state;
+
+extern __be32 nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
                stateid_t *stateid, int flags, struct file **filp);
 extern void nfs4_lock_state(void);
 extern void nfs4_unlock_state(void);
@@ -290,7 +352,7 @@ extern void nfsd4_init_recdir(char *recdir_name);
 extern int nfsd4_recdir_load(void);
 extern void nfsd4_shutdown_recdir(void);
 extern int nfs4_client_to_reclaim(const char *name);
-extern int nfs4_has_reclaimed_state(const char *name);
+extern int nfs4_has_reclaimed_state(const char *name, bool use_exchange_id);
 extern void nfsd4_recdir_purge_old(void);
 extern int nfsd4_create_clid_dir(struct nfs4_client *clp);
 extern void nfsd4_remove_clid_dir(struct nfs4_client *clp);
index 7678cfbe9960464d3bc2b3dd3011ff51fb8b863b..2693ef647df6657ae20ca917f3862921e7e53874 100644 (file)
 
 #include <linux/nfs4.h>
 
+/* thread usage wraps very million seconds (approx one fortnight) */
+#define        NFSD_USAGE_WRAP (HZ*1000000)
+
+#ifdef __KERNEL__
+
 struct nfsd_stats {
        unsigned int    rchits;         /* repcache hits */
        unsigned int    rcmisses;       /* repcache hits */
@@ -35,10 +40,6 @@ struct nfsd_stats {
 
 };
 
-/* thread usage wraps very million seconds (approx one fortnight) */
-#define        NFSD_USAGE_WRAP (HZ*1000000)
-
-#ifdef __KERNEL__
 
 extern struct nfsd_stats       nfsdstats;
 extern struct svc_stat         nfsd_svcstats;
index 27bd3e38ec5ad86b290a0f73feb73e973b917749..f80d6013fdc34ef3d19fc5910d3a49768f3c625c 100644 (file)
 #define XDR_LEN(n)                     (((n) + 3) & ~3)
 
 struct nfsd4_compound_state {
-       struct svc_fh current_fh;
-       struct svc_fh save_fh;
-       struct nfs4_stateowner *replay_owner;
-};
+       struct svc_fh           current_fh;
+       struct svc_fh           save_fh;
+       struct nfs4_stateowner  *replay_owner;
+       /* For sessions DRC */
+       struct nfsd4_session    *session;
+       struct nfsd4_slot       *slot;
+       __be32                  *statp;
+       size_t                  iovlen;
+       u32                     minorversion;
+       u32                     status;
+};
+
+static inline bool nfsd4_has_session(struct nfsd4_compound_state *cs)
+{
+       return cs->slot != NULL;
+}
 
 struct nfsd4_change_info {
        u32             atomic;
@@ -90,7 +102,7 @@ struct nfsd4_create {
                        u32 specdata2;
                } dev;    /* NF4BLK, NF4CHR */
        } u;
-       u32             cr_bmval[2];        /* request */
+       u32             cr_bmval[3];        /* request */
        struct iattr    cr_iattr;           /* request */
        struct nfsd4_change_info  cr_cinfo; /* response */
        struct nfs4_acl *cr_acl;
@@ -105,7 +117,7 @@ struct nfsd4_delegreturn {
 };
 
 struct nfsd4_getattr {
-       u32             ga_bmval[2];        /* request */
+       u32             ga_bmval[3];        /* request */
        struct svc_fh   *ga_fhp;            /* response */
 };
 
@@ -206,11 +218,9 @@ struct nfsd4_open {
        stateid_t       op_delegate_stateid; /* request - response */
        u32             op_create;          /* request */
        u32             op_createmode;      /* request */
-       u32             op_bmval[2];        /* request */
-       union {                             /* request */
-               struct iattr    iattr;                      /* UNCHECKED4,GUARDED4 */
-               nfs4_verifier   verf;                                /* EXCLUSIVE4 */
-       } u;
+       u32             op_bmval[3];        /* request */
+       struct iattr    iattr;              /* UNCHECKED4, GUARDED4, EXCLUSIVE4_1 */
+       nfs4_verifier   verf;               /* EXCLUSIVE4 */
        clientid_t      op_clientid;        /* request */
        struct xdr_netobj op_owner;           /* request */
        u32             op_seqid;           /* request */
@@ -224,8 +234,8 @@ struct nfsd4_open {
        struct nfs4_stateowner *op_stateowner; /* used during processing */
        struct nfs4_acl *op_acl;
 };
-#define op_iattr       u.iattr
-#define op_verf                u.verf
+#define op_iattr       iattr
+#define op_verf                verf
 
 struct nfsd4_open_confirm {
        stateid_t       oc_req_stateid          /* request */;
@@ -259,7 +269,7 @@ struct nfsd4_readdir {
        nfs4_verifier   rd_verf;            /* request */
        u32             rd_dircount;        /* request */
        u32             rd_maxcount;        /* request */
-       u32             rd_bmval[2];        /* request */
+       u32             rd_bmval[3];        /* request */
        struct svc_rqst *rd_rqstp;          /* response */
        struct svc_fh * rd_fhp;             /* response */
 
@@ -301,7 +311,7 @@ struct nfsd4_secinfo {
 
 struct nfsd4_setattr {
        stateid_t       sa_stateid;         /* request */
-       u32             sa_bmval[2];        /* request */
+       u32             sa_bmval[3];        /* request */
        struct iattr    sa_iattr;           /* request */
        struct nfs4_acl *sa_acl;
 };
@@ -327,7 +337,7 @@ struct nfsd4_setclientid_confirm {
 
 /* also used for NVERIFY */
 struct nfsd4_verify {
-       u32             ve_bmval[2];        /* request */
+       u32             ve_bmval[3];        /* request */
        u32             ve_attrlen;         /* request */
        char *          ve_attrval;         /* request */
 };
@@ -344,6 +354,54 @@ struct nfsd4_write {
        nfs4_verifier   wr_verifier;        /* response */
 };
 
+struct nfsd4_exchange_id {
+       nfs4_verifier   verifier;
+       struct xdr_netobj clname;
+       u32             flags;
+       clientid_t      clientid;
+       u32             seqid;
+       int             spa_how;
+};
+
+struct nfsd4_channel_attrs {
+       u32             headerpadsz;
+       u32             maxreq_sz;
+       u32             maxresp_sz;
+       u32             maxresp_cached;
+       u32             maxops;
+       u32             maxreqs;
+       u32             nr_rdma_attrs;
+       u32             rdma_attrs;
+};
+
+struct nfsd4_create_session {
+       clientid_t              clientid;
+       struct nfs4_sessionid   sessionid;
+       u32                     seqid;
+       u32                     flags;
+       struct nfsd4_channel_attrs fore_channel;
+       struct nfsd4_channel_attrs back_channel;
+       u32                     callback_prog;
+       u32                     uid;
+       u32                     gid;
+};
+
+struct nfsd4_sequence {
+       struct nfs4_sessionid   sessionid;              /* request/response */
+       u32                     seqid;                  /* request/response */
+       u32                     slotid;                 /* request/response */
+       u32                     maxslots;               /* request/response */
+       u32                     cachethis;              /* request */
+#if 0
+       u32                     target_maxslots;        /* response */
+       u32                     status_flags;           /* response */
+#endif /* not yet */
+};
+
+struct nfsd4_destroy_session {
+       struct nfs4_sessionid   sessionid;
+};
+
 struct nfsd4_op {
        int                                     opnum;
        __be32                                  status;
@@ -378,6 +436,12 @@ struct nfsd4_op {
                struct nfsd4_verify             verify;
                struct nfsd4_write              write;
                struct nfsd4_release_lockowner  release_lockowner;
+
+               /* NFSv4.1 */
+               struct nfsd4_exchange_id        exchange_id;
+               struct nfsd4_create_session     create_session;
+               struct nfsd4_destroy_session    destroy_session;
+               struct nfsd4_sequence           sequence;
        } u;
        struct nfs4_replay *                    replay;
 };
@@ -416,9 +480,22 @@ struct nfsd4_compoundres {
        u32                             taglen;
        char *                          tag;
        u32                             opcnt;
-       __be32 *                        tagp; /* where to encode tag and  opcount */
+       __be32 *                        tagp; /* tag, opcount encode location */
+       struct nfsd4_compound_state     cstate;
 };
 
+static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp)
+{
+       struct nfsd4_compoundargs *args = resp->rqstp->rq_argp;
+       return args->opcnt == 1;
+}
+
+static inline bool nfsd4_not_cached(struct nfsd4_compoundres *resp)
+{
+       return !resp->cstate.slot->sl_cache_entry.ce_cachethis ||
+                       nfsd4_is_solo_sequence(resp);
+}
+
 #define NFS4_SVC_XDRSIZE               sizeof(struct nfsd4_compoundargs)
 
 static inline void
@@ -448,7 +525,23 @@ extern __be32 nfsd4_setclientid(struct svc_rqst *rqstp,
 extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
                struct nfsd4_compound_state *,
                struct nfsd4_setclientid_confirm *setclientid_confirm);
-extern __be32 nfsd4_process_open1(struct nfsd4_open *open);
+extern void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp);
+extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
+               struct nfsd4_sequence *seq);
+extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp,
+               struct nfsd4_compound_state *,
+struct nfsd4_exchange_id *);
+               extern __be32 nfsd4_create_session(struct svc_rqst *,
+               struct nfsd4_compound_state *,
+               struct nfsd4_create_session *);
+extern __be32 nfsd4_sequence(struct svc_rqst *,
+               struct nfsd4_compound_state *,
+               struct nfsd4_sequence *);
+extern __be32 nfsd4_destroy_session(struct svc_rqst *,
+               struct nfsd4_compound_state *,
+               struct nfsd4_destroy_session *);
+extern __be32 nfsd4_process_open1(struct nfsd4_compound_state *,
+               struct nfsd4_open *open);
 extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp,
                struct svc_fh *current_fh, struct nfsd4_open *open);
 extern __be32 nfsd4_open_confirm(struct svc_rqst *rqstp,
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h
new file mode 100644 (file)
index 0000000..79fec6a
--- /dev/null
@@ -0,0 +1,801 @@
+/*
+ * nilfs2_fs.h - NILFS2 on-disk structures and common declarations.
+ *
+ * Copyright (C) 2005-2008 Nippon Telegraph and Telephone 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Written by Koji Sato <koji@osrg.net>
+ *            Ryusuke Konishi <ryusuke@osrg.net>
+ */
+/*
+ *  linux/include/linux/ext2_fs.h
+ *
+ * Copyright (C) 1992, 1993, 1994, 1995
+ * Remy Card (card@masi.ibp.fr)
+ * Laboratoire MASI - Institut Blaise Pascal
+ * Universite Pierre et Marie Curie (Paris VI)
+ *
+ *  from
+ *
+ *  linux/include/linux/minix_fs.h
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ */
+
+#ifndef _LINUX_NILFS_FS_H
+#define _LINUX_NILFS_FS_H
+
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+/*
+ * Inode flags stored in nilfs_inode and on-memory nilfs inode
+ *
+ * We define these flags based on ext2-fs because of the
+ * compatibility reason; to avoid problems in chattr(1)
+ */
+#define NILFS_SECRM_FL         0x00000001 /* Secure deletion */
+#define NILFS_UNRM_FL          0x00000002 /* Undelete */
+#define NILFS_SYNC_FL          0x00000008 /* Synchronous updates */
+#define NILFS_IMMUTABLE_FL     0x00000010 /* Immutable file */
+#define NILFS_APPEND_FL                0x00000020 /* writes to file may only append */
+#define NILFS_NODUMP_FL                0x00000040 /* do not dump file */
+#define NILFS_NOATIME_FL       0x00000080 /* do not update atime */
+/* Reserved for compression usage... */
+#define NILFS_NOTAIL_FL                0x00008000 /* file tail should not be merged */
+#define NILFS_DIRSYNC_FL       0x00010000 /* dirsync behaviour */
+
+#define NILFS_FL_USER_VISIBLE  0x0003DFFF /* User visible flags */
+#define NILFS_FL_USER_MODIFIABLE       0x000380FF /* User modifiable flags */
+
+
+#define NILFS_INODE_BMAP_SIZE  7
+/**
+ * struct nilfs_inode - structure of an inode on disk
+ * @i_blocks: blocks count
+ * @i_size: size in bytes
+ * @i_ctime: creation time (seconds)
+ * @i_mtime: modification time (seconds)
+ * @i_ctime_nsec: creation time (nano seconds)
+ * @i_mtime_nsec: modification time (nano seconds)
+ * @i_uid: user id
+ * @i_gid: group id
+ * @i_mode: file mode
+ * @i_links_count: links count
+ * @i_flags: file flags
+ * @i_bmap: block mapping
+ * @i_xattr: extended attributes
+ * @i_generation: file generation (for NFS)
+ * @i_pad:     padding
+ */
+struct nilfs_inode {
+       __le64  i_blocks;
+       __le64  i_size;
+       __le64  i_ctime;
+       __le64  i_mtime;
+       __le32  i_ctime_nsec;
+       __le32  i_mtime_nsec;
+       __le32  i_uid;
+       __le32  i_gid;
+       __le16  i_mode;
+       __le16  i_links_count;
+       __le32  i_flags;
+       __le64  i_bmap[NILFS_INODE_BMAP_SIZE];
+#define i_device_code  i_bmap[0]
+       __le64  i_xattr;
+       __le32  i_generation;
+       __le32  i_pad;
+};
+
+/**
+ * struct nilfs_super_root - structure of super root
+ * @sr_sum: check sum
+ * @sr_bytes: byte count of the structure
+ * @sr_flags: flags (reserved)
+ * @sr_nongc_ctime: write time of the last segment not for cleaner operation
+ * @sr_dat: DAT file inode
+ * @sr_cpfile: checkpoint file inode
+ * @sr_sufile: segment usage file inode
+ */
+struct nilfs_super_root {
+       __le32 sr_sum;
+       __le16 sr_bytes;
+       __le16 sr_flags;
+       __le64 sr_nongc_ctime;
+       struct nilfs_inode sr_dat;
+       struct nilfs_inode sr_cpfile;
+       struct nilfs_inode sr_sufile;
+};
+
+#define NILFS_SR_MDT_OFFSET(inode_size, i)  \
+       ((unsigned long)&((struct nilfs_super_root *)0)->sr_dat + \
+                       (inode_size) * (i))
+#define NILFS_SR_DAT_OFFSET(inode_size)     NILFS_SR_MDT_OFFSET(inode_size, 0)
+#define NILFS_SR_CPFILE_OFFSET(inode_size)  NILFS_SR_MDT_OFFSET(inode_size, 1)
+#define NILFS_SR_SUFILE_OFFSET(inode_size)  NILFS_SR_MDT_OFFSET(inode_size, 2)
+#define NILFS_SR_BYTES                  (sizeof(struct nilfs_super_root))
+
+/*
+ * Maximal mount counts
+ */
+#define NILFS_DFL_MAX_MNT_COUNT                50      /* 50 mounts */
+
+/*
+ * File system states (sbp->s_state, nilfs->ns_mount_state)
+ */
+#define NILFS_VALID_FS                 0x0001  /* Unmounted cleanly */
+#define NILFS_ERROR_FS                 0x0002  /* Errors detected */
+#define NILFS_RESIZE_FS                        0x0004  /* Resize required */
+
+/*
+ * Mount flags (sbi->s_mount_opt)
+ */
+#define NILFS_MOUNT_ERROR_MODE         0x0070  /* Error mode mask */
+#define NILFS_MOUNT_ERRORS_CONT                0x0010  /* Continue on errors */
+#define NILFS_MOUNT_ERRORS_RO          0x0020  /* Remount fs ro on errors */
+#define NILFS_MOUNT_ERRORS_PANIC       0x0040  /* Panic on errors */
+#define NILFS_MOUNT_SNAPSHOT           0x0080  /* Snapshot flag */
+#define NILFS_MOUNT_BARRIER            0x1000  /* Use block barriers */
+#define NILFS_MOUNT_STRICT_ORDER       0x2000  /* Apply strict in-order
+                                                  semantics also for data */
+
+
+/**
+ * struct nilfs_super_block - structure of super block on disk
+ */
+struct nilfs_super_block {
+       __le32  s_rev_level;            /* Revision level */
+       __le16  s_minor_rev_level;      /* minor revision level */
+       __le16  s_magic;                /* Magic signature */
+
+       __le16  s_bytes;                /* Bytes count of CRC calculation
+                                          for this structure. s_reserved
+                                          is excluded. */
+       __le16  s_flags;                /* flags */
+       __le32  s_crc_seed;             /* Seed value of CRC calculation */
+       __le32  s_sum;                  /* Check sum of super block */
+
+       __le32  s_log_block_size;       /* Block size represented as follows
+                                          blocksize =
+                                              1 << (s_log_block_size + 10) */
+       __le64  s_nsegments;            /* Number of segments in filesystem */
+       __le64  s_dev_size;             /* block device size in bytes */
+       __le64  s_first_data_block;     /* 1st seg disk block number */
+       __le32  s_blocks_per_segment;   /* number of blocks per full segment */
+       __le32  s_r_segments_percentage; /* Reserved segments percentage */
+
+       __le64  s_last_cno;             /* Last checkpoint number */
+       __le64  s_last_pseg;            /* disk block addr pseg written last */
+       __le64  s_last_seq;             /* seq. number of seg written last */
+       __le64  s_free_blocks_count;    /* Free blocks count */
+
+       __le64  s_ctime;                /* Creation time (execution time of
+                                          newfs) */
+       __le64  s_mtime;                /* Mount time */
+       __le64  s_wtime;                /* Write time */
+       __le16  s_mnt_count;            /* Mount count */
+       __le16  s_max_mnt_count;        /* Maximal mount count */
+       __le16  s_state;                /* File system state */
+       __le16  s_errors;               /* Behaviour when detecting errors */
+       __le64  s_lastcheck;            /* time of last check */
+
+       __le32  s_checkinterval;        /* max. time between checks */
+       __le32  s_creator_os;           /* OS */
+       __le16  s_def_resuid;           /* Default uid for reserved blocks */
+       __le16  s_def_resgid;           /* Default gid for reserved blocks */
+       __le32  s_first_ino;            /* First non-reserved inode */
+
+       __le16  s_inode_size;           /* Size of an inode */
+       __le16  s_dat_entry_size;       /* Size of a dat entry */
+       __le16  s_checkpoint_size;      /* Size of a checkpoint */
+       __le16  s_segment_usage_size;   /* Size of a segment usage */
+
+       __u8    s_uuid[16];             /* 128-bit uuid for volume */
+       char    s_volume_name[16];      /* volume name */
+       char    s_last_mounted[64];     /* directory where last mounted */
+
+       __le32  s_c_interval;           /* Commit interval of segment */
+       __le32  s_c_block_max;          /* Threshold of data amount for
+                                          the segment construction */
+       __u32   s_reserved[192];        /* padding to the end of the block */
+};
+
+/*
+ * Codes for operating systems
+ */
+#define NILFS_OS_LINUX         0
+/* Codes from 1 to 4 are reserved to keep compatibility with ext2 creator-OS */
+
+/*
+ * Revision levels
+ */
+#define NILFS_CURRENT_REV      2       /* current major revision */
+#define NILFS_MINOR_REV                0       /* minor revision */
+
+/*
+ * Bytes count of super_block for CRC-calculation
+ */
+#define NILFS_SB_BYTES  \
+       ((long)&((struct nilfs_super_block *)0)->s_reserved)
+
+/*
+ * Special inode number
+ */
+#define NILFS_ROOT_INO         2       /* Root file inode */
+#define NILFS_DAT_INO          3       /* DAT file */
+#define NILFS_CPFILE_INO       4       /* checkpoint file */
+#define NILFS_SUFILE_INO       5       /* segment usage file */
+#define NILFS_IFILE_INO                6       /* ifile */
+#define NILFS_ATIME_INO                7       /* Atime file (reserved) */
+#define NILFS_XATTR_INO                8       /* Xattribute file (reserved) */
+#define NILFS_SKETCH_INO       10      /* Sketch file */
+#define NILFS_USER_INO         11      /* Fisrt user's file inode number */
+
+#define NILFS_SB_OFFSET_BYTES  1024    /* byte offset of nilfs superblock */
+#define NILFS_SUPER_MAGIC      0x3434  /* NILFS filesystem  magic number */
+
+#define NILFS_SEG_MIN_BLOCKS   16      /* Minimum number of blocks in
+                                          a full segment */
+#define NILFS_PSEG_MIN_BLOCKS  2       /* Minimum number of blocks in
+                                          a partial segment */
+#define NILFS_MIN_NRSVSEGS     8       /* Minimum number of reserved
+                                          segments */
+
+/*
+ * bytes offset of secondary super block
+ */
+#define NILFS_SB2_OFFSET_BYTES(devsize)        ((((devsize) >> 12) - 1) << 12)
+
+/*
+ * Maximal count of links to a file
+ */
+#define NILFS_LINK_MAX         32000
+
+/*
+ * Structure of a directory entry
+ *  (Same as ext2)
+ */
+
+#define NILFS_NAME_LEN 255
+
+/*
+ * The new version of the directory entry.  Since V0 structures are
+ * stored in intel byte order, and the name_len field could never be
+ * bigger than 255 chars, it's safe to reclaim the extra byte for the
+ * file_type field.
+ */
+struct nilfs_dir_entry {
+       __le64  inode;                  /* Inode number */
+       __le16  rec_len;                /* Directory entry length */
+       __u8    name_len;               /* Name length */
+       __u8    file_type;
+       char    name[NILFS_NAME_LEN];   /* File name */
+       char    pad;
+};
+
+/*
+ * NILFS directory file types.  Only the low 3 bits are used.  The
+ * other bits are reserved for now.
+ */
+enum {
+       NILFS_FT_UNKNOWN,
+       NILFS_FT_REG_FILE,
+       NILFS_FT_DIR,
+       NILFS_FT_CHRDEV,
+       NILFS_FT_BLKDEV,
+       NILFS_FT_FIFO,
+       NILFS_FT_SOCK,
+       NILFS_FT_SYMLINK,
+       NILFS_FT_MAX
+};
+
+/*
+ * NILFS_DIR_PAD defines the directory entries boundaries
+ *
+ * NOTE: It must be a multiple of 8
+ */
+#define NILFS_DIR_PAD                  8
+#define NILFS_DIR_ROUND                        (NILFS_DIR_PAD - 1)
+#define NILFS_DIR_REC_LEN(name_len)    (((name_len) + 12 + NILFS_DIR_ROUND) & \
+                                       ~NILFS_DIR_ROUND)
+
+
+/**
+ * struct nilfs_finfo - file information
+ * @fi_ino: inode number
+ * @fi_cno: checkpoint number
+ * @fi_nblocks: number of blocks (including intermediate blocks)
+ * @fi_ndatablk: number of file data blocks
+ */
+struct nilfs_finfo {
+       __le64 fi_ino;
+       __le64 fi_cno;
+       __le32 fi_nblocks;
+       __le32 fi_ndatablk;
+       /* array of virtual block numbers */
+};
+
+/**
+ * struct nilfs_binfo_v - information for the block to which a virtual block number is assigned
+ * @bi_vblocknr: virtual block number
+ * @bi_blkoff: block offset
+ */
+struct nilfs_binfo_v {
+       __le64 bi_vblocknr;
+       __le64 bi_blkoff;
+};
+
+/**
+ * struct nilfs_binfo_dat - information for the block which belongs to the DAT file
+ * @bi_blkoff: block offset
+ * @bi_level: level
+ * @bi_pad: padding
+ */
+struct nilfs_binfo_dat {
+       __le64 bi_blkoff;
+       __u8 bi_level;
+       __u8 bi_pad[7];
+};
+
+/**
+ * union nilfs_binfo: block information
+ * @bi_v: nilfs_binfo_v structure
+ * @bi_dat: nilfs_binfo_dat structure
+ */
+union nilfs_binfo {
+       struct nilfs_binfo_v bi_v;
+       struct nilfs_binfo_dat bi_dat;
+};
+
+/**
+ * struct nilfs_segment_summary - segment summary
+ * @ss_datasum: checksum of data
+ * @ss_sumsum: checksum of segment summary
+ * @ss_magic: magic number
+ * @ss_bytes: size of this structure in bytes
+ * @ss_flags: flags
+ * @ss_seq: sequence number
+ * @ss_create: creation timestamp
+ * @ss_next: next segment
+ * @ss_nblocks: number of blocks
+ * @ss_nfinfo: number of finfo structures
+ * @ss_sumbytes: total size of segment summary in bytes
+ * @ss_pad: padding
+ */
+struct nilfs_segment_summary {
+       __le32 ss_datasum;
+       __le32 ss_sumsum;
+       __le32 ss_magic;
+       __le16 ss_bytes;
+       __le16 ss_flags;
+       __le64 ss_seq;
+       __le64 ss_create;
+       __le64 ss_next;
+       __le32 ss_nblocks;
+       __le32 ss_nfinfo;
+       __le32 ss_sumbytes;
+       __le32 ss_pad;
+       /* array of finfo structures */
+};
+
+#define NILFS_SEGSUM_MAGIC     0x1eaffa11  /* segment summary magic number */
+
+/*
+ * Segment summary flags
+ */
+#define NILFS_SS_LOGBGN 0x0001  /* begins a logical segment */
+#define NILFS_SS_LOGEND 0x0002  /* ends a logical segment */
+#define NILFS_SS_SR     0x0004  /* has super root */
+#define NILFS_SS_SYNDT  0x0008  /* includes data only updates */
+#define NILFS_SS_GC     0x0010  /* segment written for cleaner operation */
+
+/**
+ * struct nilfs_palloc_group_desc - block group descriptor
+ * @pg_nfrees: number of free entries in block group
+ */
+struct nilfs_palloc_group_desc {
+       __le32 pg_nfrees;
+};
+
+/**
+ * struct nilfs_dat_entry - disk address translation entry
+ * @dt_blocknr: block number
+ * @dt_start: start checkpoint number
+ * @dt_end: end checkpoint number
+ * @dt_rsv: reserved for future use
+ */
+struct nilfs_dat_entry {
+       __le64 de_blocknr;
+       __le64 de_start;
+       __le64 de_end;
+       __le64 de_rsv;
+};
+
+/**
+ * struct nilfs_dat_group_desc - block group descriptor
+ * @dg_nfrees: number of free virtual block numbers in block group
+ */
+struct nilfs_dat_group_desc {
+       __le32 dg_nfrees;
+};
+
+
+/**
+ * struct nilfs_snapshot_list - snapshot list
+ * @ssl_next: next checkpoint number on snapshot list
+ * @ssl_prev: previous checkpoint number on snapshot list
+ */
+struct nilfs_snapshot_list {
+       __le64 ssl_next;
+       __le64 ssl_prev;
+};
+
+/**
+ * struct nilfs_checkpoint - checkpoint structure
+ * @cp_flags: flags
+ * @cp_checkpoints_count: checkpoints count in a block
+ * @cp_snapshot_list: snapshot list
+ * @cp_cno: checkpoint number
+ * @cp_create: creation timestamp
+ * @cp_nblk_inc: number of blocks incremented by this checkpoint
+ * @cp_inodes_count: inodes count
+ * @cp_blocks_count: blocks count
+ * @cp_ifile_inode: inode of ifile
+ */
+struct nilfs_checkpoint {
+       __le32 cp_flags;
+       __le32 cp_checkpoints_count;
+       struct nilfs_snapshot_list cp_snapshot_list;
+       __le64 cp_cno;
+       __le64 cp_create;
+       __le64 cp_nblk_inc;
+       __le64 cp_inodes_count;
+       __le64 cp_blocks_count;         /* Reserved (might be deleted) */
+
+       /* Do not change the byte offset of ifile inode.
+          To keep the compatibility of the disk format,
+          additional fields should be added behind cp_ifile_inode. */
+       struct nilfs_inode cp_ifile_inode;
+};
+
+/* checkpoint flags */
+enum {
+       NILFS_CHECKPOINT_SNAPSHOT,
+       NILFS_CHECKPOINT_INVALID,
+       NILFS_CHECKPOINT_SKETCH,
+       NILFS_CHECKPOINT_MINOR,
+};
+
+#define NILFS_CHECKPOINT_FNS(flag, name)                               \
+static inline void                                                     \
+nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp)               \
+{                                                                      \
+       cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) |          \
+                                  (1UL << NILFS_CHECKPOINT_##flag));   \
+}                                                                      \
+static inline void                                                     \
+nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp)             \
+{                                                                      \
+       cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) &          \
+                                  ~(1UL << NILFS_CHECKPOINT_##flag));  \
+}                                                                      \
+static inline int                                                      \
+nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp)             \
+{                                                                      \
+       return !!(le32_to_cpu(cp->cp_flags) &                           \
+                 (1UL << NILFS_CHECKPOINT_##flag));                    \
+}
+
+NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot)
+NILFS_CHECKPOINT_FNS(INVALID, invalid)
+NILFS_CHECKPOINT_FNS(MINOR, minor)
+
+/**
+ * struct nilfs_cpinfo - checkpoint information
+ * @ci_flags: flags
+ * @ci_pad: padding
+ * @ci_cno: checkpoint number
+ * @ci_create: creation timestamp
+ * @ci_nblk_inc: number of blocks incremented by this checkpoint
+ * @ci_inodes_count: inodes count
+ * @ci_blocks_count: blocks count
+ * @ci_next: next checkpoint number in snapshot list
+ */
+struct nilfs_cpinfo {
+       __u32 ci_flags;
+       __u32 ci_pad;
+       __u64 ci_cno;
+       __u64 ci_create;
+       __u64 ci_nblk_inc;
+       __u64 ci_inodes_count;
+       __u64 ci_blocks_count;
+       __u64 ci_next;
+};
+
+#define NILFS_CPINFO_FNS(flag, name)                                   \
+static inline int                                                      \
+nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo)                 \
+{                                                                      \
+       return !!(cpinfo->ci_flags & (1UL << NILFS_CHECKPOINT_##flag)); \
+}
+
+NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
+NILFS_CPINFO_FNS(INVALID, invalid)
+NILFS_CPINFO_FNS(MINOR, minor)
+
+
+/**
+ * struct nilfs_cpfile_header - checkpoint file header
+ * @ch_ncheckpoints: number of checkpoints
+ * @ch_nsnapshots: number of snapshots
+ * @ch_snapshot_list: snapshot list
+ */
+struct nilfs_cpfile_header {
+       __le64 ch_ncheckpoints;
+       __le64 ch_nsnapshots;
+       struct nilfs_snapshot_list ch_snapshot_list;
+};
+
+#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET   \
+       ((sizeof(struct nilfs_cpfile_header) +                          \
+         sizeof(struct nilfs_checkpoint) - 1) /                        \
+                       sizeof(struct nilfs_checkpoint))
+
+/**
+ * struct nilfs_segment_usage - segment usage
+ * @su_lastmod: last modified timestamp
+ * @su_nblocks: number of blocks in segment
+ * @su_flags: flags
+ */
+struct nilfs_segment_usage {
+       __le64 su_lastmod;
+       __le32 su_nblocks;
+       __le32 su_flags;
+};
+
+/* segment usage flag */
+enum {
+       NILFS_SEGMENT_USAGE_ACTIVE,
+       NILFS_SEGMENT_USAGE_DIRTY,
+       NILFS_SEGMENT_USAGE_ERROR,
+
+       /* ... */
+};
+
+#define NILFS_SEGMENT_USAGE_FNS(flag, name)                            \
+static inline void                                                     \
+nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su)         \
+{                                                                      \
+       su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) |          \
+                                  (1UL << NILFS_SEGMENT_USAGE_##flag));\
+}                                                                      \
+static inline void                                                     \
+nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su)       \
+{                                                                      \
+       su->su_flags =                                                  \
+               cpu_to_le32(le32_to_cpu(su->su_flags) &                 \
+                           ~(1UL << NILFS_SEGMENT_USAGE_##flag));      \
+}                                                                      \
+static inline int                                                      \
+nilfs_segment_usage_##name(const struct nilfs_segment_usage *su)       \
+{                                                                      \
+       return !!(le32_to_cpu(su->su_flags) &                           \
+                 (1UL << NILFS_SEGMENT_USAGE_##flag));                 \
+}
+
+NILFS_SEGMENT_USAGE_FNS(ACTIVE, active)
+NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty)
+NILFS_SEGMENT_USAGE_FNS(ERROR, error)
+
+static inline void
+nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su)
+{
+       su->su_lastmod = cpu_to_le64(0);
+       su->su_nblocks = cpu_to_le32(0);
+       su->su_flags = cpu_to_le32(0);
+}
+
+static inline int
+nilfs_segment_usage_clean(const struct nilfs_segment_usage *su)
+{
+       return !le32_to_cpu(su->su_flags);
+}
+
+/**
+ * struct nilfs_sufile_header - segment usage file header
+ * @sh_ncleansegs: number of clean segments
+ * @sh_ndirtysegs: number of dirty segments
+ * @sh_last_alloc: last allocated segment number
+ */
+struct nilfs_sufile_header {
+       __le64 sh_ncleansegs;
+       __le64 sh_ndirtysegs;
+       __le64 sh_last_alloc;
+       /* ... */
+};
+
+#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET        \
+       ((sizeof(struct nilfs_sufile_header) +                          \
+         sizeof(struct nilfs_segment_usage) - 1) /                     \
+                        sizeof(struct nilfs_segment_usage))
+
+/**
+ * nilfs_suinfo - segment usage information
+ * @sui_lastmod:
+ * @sui_nblocks:
+ * @sui_flags:
+ */
+struct nilfs_suinfo {
+       __u64 sui_lastmod;
+       __u32 sui_nblocks;
+       __u32 sui_flags;
+};
+
+#define NILFS_SUINFO_FNS(flag, name)                                   \
+static inline int                                                      \
+nilfs_suinfo_##name(const struct nilfs_suinfo *si)                     \
+{                                                                      \
+       return si->sui_flags & (1UL << NILFS_SEGMENT_USAGE_##flag);     \
+}
+
+NILFS_SUINFO_FNS(ACTIVE, active)
+NILFS_SUINFO_FNS(DIRTY, dirty)
+NILFS_SUINFO_FNS(ERROR, error)
+
+static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)
+{
+       return !si->sui_flags;
+}
+
+/* ioctl */
+enum {
+       NILFS_CHECKPOINT,
+       NILFS_SNAPSHOT,
+};
+
+/**
+ * struct nilfs_cpmode -
+ * @cc_cno:
+ * @cc_mode:
+ */
+struct nilfs_cpmode {
+       __u64 cm_cno;
+       __u32 cm_mode;
+       __u32 cm_pad;
+};
+
+/**
+ * struct nilfs_argv - argument vector
+ * @v_base:
+ * @v_nmembs:
+ * @v_size:
+ * @v_flags:
+ * @v_index:
+ */
+struct nilfs_argv {
+       __u64 v_base;
+       __u32 v_nmembs; /* number of members */
+       __u16 v_size;   /* size of members */
+       __u16 v_flags;
+       __u64 v_index;
+};
+
+/**
+ * struct nilfs_period -
+ * @p_start:
+ * @p_end:
+ */
+struct nilfs_period {
+       __u64 p_start;
+       __u64 p_end;
+};
+
+/**
+ * struct nilfs_cpstat -
+ * @cs_cno: checkpoint number
+ * @cs_ncps: number of checkpoints
+ * @cs_nsss: number of snapshots
+ */
+struct nilfs_cpstat {
+       __u64 cs_cno;
+       __u64 cs_ncps;
+       __u64 cs_nsss;
+};
+
+/**
+ * struct nilfs_sustat -
+ * @ss_nsegs: number of segments
+ * @ss_ncleansegs: number of clean segments
+ * @ss_ndirtysegs: number of dirty segments
+ * @ss_ctime: creation time of the last segment
+ * @ss_nongc_ctime: creation time of the last segment not for GC
+ * @ss_prot_seq: least sequence number of segments which must not be reclaimed
+ */
+struct nilfs_sustat {
+       __u64 ss_nsegs;
+       __u64 ss_ncleansegs;
+       __u64 ss_ndirtysegs;
+       __u64 ss_ctime;
+       __u64 ss_nongc_ctime;
+       __u64 ss_prot_seq;
+};
+
+/**
+ * struct nilfs_vinfo - virtual block number information
+ * @vi_vblocknr:
+ * @vi_start:
+ * @vi_end:
+ * @vi_blocknr:
+ */
+struct nilfs_vinfo {
+       __u64 vi_vblocknr;
+       __u64 vi_start;
+       __u64 vi_end;
+       __u64 vi_blocknr;
+};
+
+/**
+ * struct nilfs_vdesc -
+ */
+struct nilfs_vdesc {
+       __u64 vd_ino;
+       __u64 vd_cno;
+       __u64 vd_vblocknr;
+       struct nilfs_period vd_period;
+       __u64 vd_blocknr;
+       __u64 vd_offset;
+       __u32 vd_flags;
+       __u32 vd_pad;
+};
+
+/**
+ * struct nilfs_bdesc -
+ */
+struct nilfs_bdesc {
+       __u64 bd_ino;
+       __u64 bd_oblocknr;
+       __u64 bd_blocknr;
+       __u64 bd_offset;
+       __u32 bd_level;
+       __u32 bd_pad;
+};
+
+#define NILFS_IOCTL_IDENT              'n'
+
+#define NILFS_IOCTL_CHANGE_CPMODE  \
+       _IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode)
+#define NILFS_IOCTL_DELETE_CHECKPOINT  \
+       _IOW(NILFS_IOCTL_IDENT, 0x81, __u64)
+#define NILFS_IOCTL_GET_CPINFO  \
+       _IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv)
+#define NILFS_IOCTL_GET_CPSTAT  \
+       _IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat)
+#define NILFS_IOCTL_GET_SUINFO  \
+       _IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv)
+#define NILFS_IOCTL_GET_SUSTAT  \
+       _IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat)
+#define NILFS_IOCTL_GET_VINFO  \
+       _IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv)
+#define NILFS_IOCTL_GET_BDESCS  \
+       _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv)
+#define NILFS_IOCTL_CLEAN_SEGMENTS  \
+       _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5])
+#define NILFS_IOCTL_SYNC  \
+       _IOR(NILFS_IOCTL_IDENT, 0x8A, __u64)
+#define NILFS_IOCTL_RESIZE  \
+       _IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)
+
+#endif /* _LINUX_NILFS_FS_H */
index ea8c6d84996dc64cfd52004a68c02e4480a1e8d6..cc1767f5cca86026d4ab98a782037d285666a37f 100644 (file)
@@ -228,10 +228,11 @@ extern void parport_pc_release_resources(struct parport *p);
 extern int parport_pc_claim_resources(struct parport *p);
 
 /* PCMCIA code will want to get us to look at a port.  Provide a mechanism. */
-extern struct parport *parport_pc_probe_port (unsigned long base,
-                                             unsigned long base_hi,
-                                             int irq, int dma,
-                                             struct device *dev);
-extern void parport_pc_unregister_port (struct parport *p);
+extern struct parport *parport_pc_probe_port(unsigned long base,
+                                            unsigned long base_hi,
+                                            int irq, int dma,
+                                            struct device *dev,
+                                            int irqflags);
+extern void parport_pc_unregister_port(struct parport *p);
 
 #endif
index 170f8b1f22db1dc7f065e0de8525cb1b80ce4898..ee98cd570885f6f7b8ee8ba61d0546ad929ed872 100644 (file)
 #define PCI_DEVICE_ID_SUN_TOMATILLO    0xa801
 #define PCI_DEVICE_ID_SUN_CASSINI      0xabba
 
+#define PCI_VENDOR_ID_NI               0x1093
+#define PCI_DEVICE_ID_NI_PCI2322       0xd130
+#define PCI_DEVICE_ID_NI_PCI2324       0xd140
+#define PCI_DEVICE_ID_NI_PCI2328       0xd150
+#define PCI_DEVICE_ID_NI_PXI8422_2322  0xd190
+#define PCI_DEVICE_ID_NI_PXI8422_2324  0xd1a0
+#define PCI_DEVICE_ID_NI_PXI8420_2322  0xd1d0
+#define PCI_DEVICE_ID_NI_PXI8420_2324  0xd1e0
+#define PCI_DEVICE_ID_NI_PXI8420_2328  0xd1f0
+#define PCI_DEVICE_ID_NI_PXI8420_23216 0xd1f1
+#define PCI_DEVICE_ID_NI_PCI2322I      0xd250
+#define PCI_DEVICE_ID_NI_PCI2324I      0xd270
+#define PCI_DEVICE_ID_NI_PCI23216      0xd2b0
+#define PCI_DEVICE_ID_NI_PXI8430_2322  0x7080
+#define PCI_DEVICE_ID_NI_PCI8430_2322  0x70db
+#define PCI_DEVICE_ID_NI_PXI8430_2324  0x70dd
+#define PCI_DEVICE_ID_NI_PCI8430_2324  0x70df
+#define PCI_DEVICE_ID_NI_PXI8430_2328  0x70e2
+#define PCI_DEVICE_ID_NI_PCI8430_2328  0x70e4
+#define PCI_DEVICE_ID_NI_PXI8430_23216 0x70e6
+#define PCI_DEVICE_ID_NI_PCI8430_23216 0x70e7
+#define PCI_DEVICE_ID_NI_PXI8432_2322  0x70e8
+#define PCI_DEVICE_ID_NI_PCI8432_2322  0x70ea
+#define PCI_DEVICE_ID_NI_PXI8432_2324  0x70ec
+#define PCI_DEVICE_ID_NI_PCI8432_2324  0x70ee
+
 #define PCI_VENDOR_ID_CMD              0x1095
 #define PCI_DEVICE_ID_CMD_643          0x0643
 #define PCI_DEVICE_ID_CMD_646          0x0646
index 80044a4f3ab9e1c890021fc0ff9dca533c00f71e..bfd92e1e5d2c3ae6d8b8966acf1390e1776828d2 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/cache.h>
 #include <linux/spinlock.h>
 #include <linux/threads.h>
-#include <linux/percpu.h>
 #include <linux/cpumask.h>
 #include <linux/seqlock.h>
 
@@ -108,25 +107,14 @@ struct rcu_data {
        struct rcu_head barrier;
 };
 
-DECLARE_PER_CPU(struct rcu_data, rcu_data);
-DECLARE_PER_CPU(struct rcu_data, rcu_bh_data);
-
 /*
  * Increment the quiescent state counter.
  * The counter is a bit degenerated: We do not need to know
  * how many quiescent states passed, just if there was at least
  * one since the start of the grace period. Thus just a flag.
  */
-static inline void rcu_qsctr_inc(int cpu)
-{
-       struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
-       rdp->passed_quiesc = 1;
-}
-static inline void rcu_bh_qsctr_inc(int cpu)
-{
-       struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu);
-       rdp->passed_quiesc = 1;
-}
+extern void rcu_qsctr_inc(int cpu);
+extern void rcu_bh_qsctr_inc(int cpu);
 
 extern int rcu_pending(int cpu);
 extern int rcu_needs_cpu(int cpu);
index 528343e6da51a7c19cda8797c55cd6640612cb58..15fbb3ca634ddd87214b883586d9f58ce450ead4 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/cache.h>
 #include <linux/spinlock.h>
 #include <linux/threads.h>
-#include <linux/percpu.h>
 #include <linux/cpumask.h>
 #include <linux/seqlock.h>
 #include <linux/lockdep.h>
index 74304b4538d833ec7bcd26be28bdec8f436d73f7..fce522782ffae2609ac4a5ce530e7d4c8a80353c 100644 (file)
 #include <linux/cache.h>
 #include <linux/spinlock.h>
 #include <linux/threads.h>
-#include <linux/percpu.h>
+#include <linux/smp.h>
 #include <linux/cpumask.h>
 #include <linux/seqlock.h>
 
-struct rcu_dyntick_sched {
-       int dynticks;
-       int dynticks_snap;
-       int sched_qs;
-       int sched_qs_snap;
-       int sched_dynticks_snap;
-};
-
-DECLARE_PER_CPU(struct rcu_dyntick_sched, rcu_dyntick_sched);
-
-static inline void rcu_qsctr_inc(int cpu)
-{
-       struct rcu_dyntick_sched *rdssp = &per_cpu(rcu_dyntick_sched, cpu);
-
-       rdssp->sched_qs++;
-}
-#define rcu_bh_qsctr_inc(cpu)
+extern void rcu_qsctr_inc(int cpu);
+static inline void rcu_bh_qsctr_inc(int cpu) { }
 
 /*
  * Someone might want to pass call_rcu_bh as a function pointer.
  * So this needs to just be a rename and not a macro function.
  *  (no parentheses)
  */
-#define call_rcu_bh            call_rcu
+#define call_rcu_bh            call_rcu
 
 /**
  * call_rcu_sched - Queue RCU callback for invocation after sched grace period.
@@ -117,30 +102,12 @@ extern struct rcupreempt_trace *rcupreempt_trace_cpu(int cpu);
 struct softirq_action;
 
 #ifdef CONFIG_NO_HZ
-
-static inline void rcu_enter_nohz(void)
-{
-       static DEFINE_RATELIMIT_STATE(rs, 10 * HZ, 1);
-
-       smp_mb(); /* CPUs seeing ++ must see prior RCU read-side crit sects */
-       __get_cpu_var(rcu_dyntick_sched).dynticks++;
-       WARN_ON_RATELIMIT(__get_cpu_var(rcu_dyntick_sched).dynticks & 0x1, &rs);
-}
-
-static inline void rcu_exit_nohz(void)
-{
-       static DEFINE_RATELIMIT_STATE(rs, 10 * HZ, 1);
-
-       __get_cpu_var(rcu_dyntick_sched).dynticks++;
-       smp_mb(); /* CPUs seeing ++ must see later RCU read-side crit sects */
-       WARN_ON_RATELIMIT(!(__get_cpu_var(rcu_dyntick_sched).dynticks & 0x1),
-                               &rs);
-}
-
-#else /* CONFIG_NO_HZ */
-#define rcu_enter_nohz()       do { } while (0)
-#define rcu_exit_nohz()                do { } while (0)
-#endif /* CONFIG_NO_HZ */
+extern void rcu_enter_nohz(void);
+extern void rcu_exit_nohz(void);
+#else
+# define rcu_enter_nohz()      do { } while (0)
+# define rcu_exit_nohz()       do { } while (0)
+#endif
 
 /*
  * A context switch is a grace period for rcupreempt synchronize_rcu()
index a722fb67bb2d5a2500852c4fd5593f0e91777af0..0cdda00f2b2ae46679bf0a7711a2ebdab9cdac88 100644 (file)
@@ -33,7 +33,6 @@
 #include <linux/cache.h>
 #include <linux/spinlock.h>
 #include <linux/threads.h>
-#include <linux/percpu.h>
 #include <linux/cpumask.h>
 #include <linux/seqlock.h>
 
@@ -236,30 +235,8 @@ struct rcu_state {
 #endif /* #ifdef CONFIG_NO_HZ */
 };
 
-extern struct rcu_state rcu_state;
-DECLARE_PER_CPU(struct rcu_data, rcu_data);
-
-extern struct rcu_state rcu_bh_state;
-DECLARE_PER_CPU(struct rcu_data, rcu_bh_data);
-
-/*
- * Increment the quiescent state counter.
- * The counter is a bit degenerated: We do not need to know
- * how many quiescent states passed, just if there was at least
- * one since the start of the grace period. Thus just a flag.
- */
-static inline void rcu_qsctr_inc(int cpu)
-{
-       struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
-       rdp->passed_quiesc = 1;
-       rdp->passed_quiesc_completed = rdp->completed;
-}
-static inline void rcu_bh_qsctr_inc(int cpu)
-{
-       struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu);
-       rdp->passed_quiesc = 1;
-       rdp->passed_quiesc_completed = rdp->completed;
-}
+extern void rcu_qsctr_inc(int cpu);
+extern void rcu_bh_qsctr_inc(int cpu);
 
 extern int rcu_pending(int cpu);
 extern int rcu_needs_cpu(int cpu);
index 54ed15799a8315fd1738390ef4c5666353ddc435..d5fd6163606fa028f7db538825cc055a051e0d51 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/sched.h>
 #include <linux/key.h>
 #include <linux/xfrm.h>
+#include <linux/gfp.h>
 #include <net/flow.h>
 
 /* Maximum number of letters for an LSM name string */
@@ -2953,5 +2954,28 @@ static inline void securityfs_remove(struct dentry *dentry)
 
 #endif
 
+#ifdef CONFIG_SECURITY
+
+static inline char *alloc_secdata(void)
+{
+       return (char *)get_zeroed_page(GFP_KERNEL);
+}
+
+static inline void free_secdata(void *secdata)
+{
+       free_page((unsigned long)secdata);
+}
+
+#else
+
+static inline char *alloc_secdata(void)
+{
+        return (char *)1;
+}
+
+static inline void free_secdata(void *secdata)
+{ }
+#endif /* CONFIG_SECURITY */
+
 #endif /* ! __LINUX_SECURITY_H */
 
index df9245c7bd3be3b384146434a0494eea946225dd..57a97e52e58d0339d0e3dfd1271e143e865d68a4 100644 (file)
 /* NWPSERIAL */
 #define PORT_NWPSERIAL 85
 
+/* MAX3100 */
+#define PORT_MAX3100    86
+
 #ifdef __KERNEL__
 
 #include <linux/compiler.h>
@@ -277,7 +280,7 @@ struct uart_port {
        struct uart_icount      icount;                 /* statistics */
 
        struct console          *cons;                  /* struct console, if any */
-#ifdef CONFIG_SERIAL_CORE_CONSOLE
+#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)
        unsigned long           sysrq;                  /* sysrq timeout */
 #endif
 
index f4523651fa42c99954c936ca619faef051115205..5ac9b0bcaf9adef1fdfddebd2aff6290a44f7b9f 100644 (file)
@@ -73,8 +73,8 @@ found:
 
                ret = kmem_cache_alloc_notrace(cachep, flags);
 
-               kmemtrace_mark_alloc(KMEMTRACE_TYPE_KMALLOC, _THIS_IP_, ret,
-                                    size, slab_buffer_size(cachep), flags);
+               trace_kmalloc(_THIS_IP_, ret,
+                             size, slab_buffer_size(cachep), flags);
 
                return ret;
        }
@@ -128,9 +128,9 @@ found:
 
                ret = kmem_cache_alloc_node_notrace(cachep, flags, node);
 
-               kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC, _THIS_IP_,
-                                         ret, size, slab_buffer_size(cachep),
-                                         flags, node);
+               trace_kmalloc_node(_THIS_IP_, ret,
+                                  size, slab_buffer_size(cachep),
+                                  flags, node);
 
                return ret;
        }
index a1f90528e70bf5e3e637b95549b4e08e62cbbec2..5046f90c11710178127a20a7bcb8677b4e80d943 100644 (file)
@@ -233,8 +233,7 @@ static __always_inline void *kmalloc_large(size_t size, gfp_t flags)
        unsigned int order = get_order(size);
        void *ret = (void *) __get_free_pages(flags | __GFP_COMP, order);
 
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_KMALLOC, _THIS_IP_, ret,
-                            size, PAGE_SIZE << order, flags);
+       trace_kmalloc(_THIS_IP_, ret, size, PAGE_SIZE << order, flags);
 
        return ret;
 }
@@ -255,9 +254,7 @@ static __always_inline void *kmalloc(size_t size, gfp_t flags)
 
                        ret = kmem_cache_alloc_notrace(s, flags);
 
-                       kmemtrace_mark_alloc(KMEMTRACE_TYPE_KMALLOC,
-                                            _THIS_IP_, ret,
-                                            size, s->size, flags);
+                       trace_kmalloc(_THIS_IP_, ret, size, s->size, flags);
 
                        return ret;
                }
@@ -296,9 +293,8 @@ static __always_inline void *kmalloc_node(size_t size, gfp_t flags, int node)
 
                ret = kmem_cache_alloc_node_notrace(s, flags, node);
 
-               kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC,
-                                         _THIS_IP_, ret,
-                                         size, s->size, flags, node);
+               trace_kmalloc_node(_THIS_IP_, ret,
+                                  size, s->size, flags, node);
 
                return ret;
        }
index 68bb1c501d0deee6ebe3d963222e48f34c212ef8..2cc43fa380cb805ff921b878fd3f3791ff84d9b2 100644 (file)
@@ -204,6 +204,7 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
  *     SPI slaves, and are numbered from zero to num_chipselects.
  *     each slave has a chipselect signal, but it's common that not
  *     every chipselect is connected to a slave.
+ * @dma_alignment: SPI controller constraint on DMA buffers alignment.
  * @setup: updates the device mode and clocking records used by a
  *     device's SPI controller; protocol code may call this.  This
  *     must fail if an unrecognized or unsupported mode is requested.
@@ -239,6 +240,11 @@ struct spi_master {
         */
        u16                     num_chipselect;
 
+       /* some SPI controllers pose alignment requirements on DMAable
+        * buffers; let protocol drivers know about these requirements.
+        */
+       u16                     dma_alignment;
+
        /* setup mode and clock, etc (spi driver may call many times) */
        int                     (*setup)(struct spi_device *spi);
 
index d3a4c0231933c4e3e5885fd46362b15a6ce96a77..2a30775959e9343e187118016cf2ff9bd8214bc9 100644 (file)
  */
 typedef int            (*svc_thread_fn)(void *);
 
+/* statistics for svc_pool structures */
+struct svc_pool_stats {
+       unsigned long   packets;
+       unsigned long   sockets_queued;
+       unsigned long   threads_woken;
+       unsigned long   overloads_avoided;
+       unsigned long   threads_timedout;
+};
+
 /*
  *
  * RPC service thread pool.
@@ -41,6 +50,8 @@ struct svc_pool {
        struct list_head        sp_sockets;     /* pending sockets */
        unsigned int            sp_nrthreads;   /* # of threads in pool */
        struct list_head        sp_all_threads; /* all server threads */
+       int                     sp_nwaking;     /* number of threads woken but not yet active */
+       struct svc_pool_stats   sp_stats;       /* statistics on pool operation */
 } ____cacheline_aligned_in_smp;
 
 /*
@@ -83,6 +94,8 @@ struct svc_serv {
        struct module *         sv_module;      /* optional module to count when
                                                 * adding threads */
        svc_thread_fn           sv_function;    /* main function for threads */
+       unsigned int            sv_drc_max_pages; /* Total pages for DRC */
+       unsigned int            sv_drc_pages_used;/* DRC pages used */
 };
 
 /*
@@ -218,6 +231,7 @@ struct svc_rqst {
        struct svc_cred         rq_cred;        /* auth info */
        void *                  rq_xprt_ctxt;   /* transport specific context ptr */
        struct svc_deferred_req*rq_deferred;    /* deferred request we are replaying */
+       int                     rq_usedeferral; /* use deferral */
 
        size_t                  rq_xprt_hlen;   /* xprt header len */
        struct xdr_buf          rq_arg;
@@ -263,6 +277,7 @@ struct svc_rqst {
                                                 * cache pages */
        wait_queue_head_t       rq_wait;        /* synchronization */
        struct task_struct      *rq_task;       /* service thread */
+       int                     rq_waking;      /* 1 if thread is being woken */
 };
 
 /*
@@ -393,6 +408,7 @@ struct svc_serv *  svc_create_pooled(struct svc_program *, unsigned int,
                        void (*shutdown)(struct svc_serv *),
                        svc_thread_fn, struct module *);
 int               svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
+int               svc_pool_stats_open(struct svc_serv *serv, struct file *file);
 void              svc_destroy(struct svc_serv *);
 int               svc_process(struct svc_rqst *);
 int               svc_register(const struct svc_serv *, const int,
index 49e1eb4544654630fce2a28ff539b97c1b6bb07c..d8910b68e1bdd981cabe3ac8c34150ae85fa0627 100644 (file)
@@ -69,27 +69,27 @@ struct xdr_buf {
  * pre-xdr'ed macros.
  */
 
-#define        xdr_zero        __constant_htonl(0)
-#define        xdr_one         __constant_htonl(1)
-#define        xdr_two         __constant_htonl(2)
-
-#define        rpc_success             __constant_htonl(RPC_SUCCESS)
-#define        rpc_prog_unavail        __constant_htonl(RPC_PROG_UNAVAIL)
-#define        rpc_prog_mismatch       __constant_htonl(RPC_PROG_MISMATCH)
-#define        rpc_proc_unavail        __constant_htonl(RPC_PROC_UNAVAIL)
-#define        rpc_garbage_args        __constant_htonl(RPC_GARBAGE_ARGS)
-#define        rpc_system_err          __constant_htonl(RPC_SYSTEM_ERR)
-#define        rpc_drop_reply          __constant_htonl(RPC_DROP_REPLY)
-
-#define        rpc_auth_ok             __constant_htonl(RPC_AUTH_OK)
-#define        rpc_autherr_badcred     __constant_htonl(RPC_AUTH_BADCRED)
-#define        rpc_autherr_rejectedcred __constant_htonl(RPC_AUTH_REJECTEDCRED)
-#define        rpc_autherr_badverf     __constant_htonl(RPC_AUTH_BADVERF)
-#define        rpc_autherr_rejectedverf __constant_htonl(RPC_AUTH_REJECTEDVERF)
-#define        rpc_autherr_tooweak     __constant_htonl(RPC_AUTH_TOOWEAK)
-#define        rpcsec_gsserr_credproblem       __constant_htonl(RPCSEC_GSS_CREDPROBLEM)
-#define        rpcsec_gsserr_ctxproblem        __constant_htonl(RPCSEC_GSS_CTXPROBLEM)
-#define        rpc_autherr_oldseqnum   __constant_htonl(101)
+#define        xdr_zero        cpu_to_be32(0)
+#define        xdr_one         cpu_to_be32(1)
+#define        xdr_two         cpu_to_be32(2)
+
+#define        rpc_success             cpu_to_be32(RPC_SUCCESS)
+#define        rpc_prog_unavail        cpu_to_be32(RPC_PROG_UNAVAIL)
+#define        rpc_prog_mismatch       cpu_to_be32(RPC_PROG_MISMATCH)
+#define        rpc_proc_unavail        cpu_to_be32(RPC_PROC_UNAVAIL)
+#define        rpc_garbage_args        cpu_to_be32(RPC_GARBAGE_ARGS)
+#define        rpc_system_err          cpu_to_be32(RPC_SYSTEM_ERR)
+#define        rpc_drop_reply          cpu_to_be32(RPC_DROP_REPLY)
+
+#define        rpc_auth_ok             cpu_to_be32(RPC_AUTH_OK)
+#define        rpc_autherr_badcred     cpu_to_be32(RPC_AUTH_BADCRED)
+#define        rpc_autherr_rejectedcred cpu_to_be32(RPC_AUTH_REJECTEDCRED)
+#define        rpc_autherr_badverf     cpu_to_be32(RPC_AUTH_BADVERF)
+#define        rpc_autherr_rejectedverf cpu_to_be32(RPC_AUTH_REJECTEDVERF)
+#define        rpc_autherr_tooweak     cpu_to_be32(RPC_AUTH_TOOWEAK)
+#define        rpcsec_gsserr_credproblem       cpu_to_be32(RPCSEC_GSS_CREDPROBLEM)
+#define        rpcsec_gsserr_ctxproblem        cpu_to_be32(RPCSEC_GSS_CTXPROBLEM)
+#define        rpc_autherr_oldseqnum   cpu_to_be32(101)
 
 /*
  * Miscellaneous XDR helper functions
index 8615d661ab60c042fe8e8b5df420a4fde66a03d3..bcba84ea2d86ae280a2778ebcce9dc617c0b7e9c 100644 (file)
@@ -309,7 +309,8 @@ extern void tty_set_operations(struct tty_driver *driver,
 extern struct tty_driver *tty_find_polling_driver(char *name, int *line);
 
 extern void tty_driver_kref_put(struct tty_driver *driver);
-extern inline struct tty_driver *tty_driver_kref_get(struct tty_driver *d)
+
+static inline struct tty_driver *tty_driver_kref_get(struct tty_driver *d)
 {
        kref_get(&d->kref);
        return d;
index 139d234923cdc5003fa6e53bfa95e67bb8bb673f..ebb2ea6b499598d20c066f2d670381dedc8758c9 100644 (file)
@@ -737,6 +737,11 @@ struct v4l2_input {
 #define V4L2_IN_ST_NO_SIGNAL   0x00000002
 #define V4L2_IN_ST_NO_COLOR    0x00000004
 
+/* field 'status' - sensor orientation */
+/* If sensor is mounted upside down set both bits */
+#define V4L2_IN_ST_HFLIP       0x00000010 /* Frames are flipped horizontally */
+#define V4L2_IN_ST_VFLIP       0x00000020 /* Frames are flipped vertically */
+
 /* field 'status' - analog */
 #define V4L2_IN_ST_NO_H_LOCK   0x00000100  /* No horizontal sync lock */
 #define V4L2_IN_ST_COLOR_KILL  0x00000200  /* Color killer is active */
index 93445477f86a7cdfe8352e15e21fbad77d9f7f0a..9c1ed1fb6ddbb2f9e58d3810f81d9bdfb65f0629 100644 (file)
@@ -168,6 +168,8 @@ void writeback_set_ratelimit(void);
 /* pdflush.c */
 extern int nr_pdflush_threads; /* Global so it can be exported to sysctl
                                   read-only. */
+extern int nr_pdflush_threads_max; /* Global so it can be exported to sysctl */
+extern int nr_pdflush_threads_min; /* Global so it can be exported to sysctl */
 
 
 #endif         /* WRITEBACK_H */
index 6ab854931c0596c9848a71340f359c058c0a2f03..90cf22ada8b4a4a0d2f33b13968883ad365290c6 100644 (file)
    =======
 
    So to specify a complete routing scheme for the msp3400 you will have to
-   specify in the 'input' field of the v4l2_routing struct:
+   specify in the 'input' arg of the s_routing function:
 
    1) which tuner input to use
    2) which SCART input to use
    3) which DSP input to use for each DSP output
 
-   And in the 'output' field of the v4l2_routing struct you specify:
+   And in the 'output' arg of the s_routing function you specify:
 
    1) which SCART input to use for each SCART output
 
index 57db48dd85b8ffd1dfe5d4ee2b8cb56eda765f85..30d9629198ef6170e42450fbfc8255c17dc8c821 100644 (file)
 #define OV772X_FLAG_VFLIP     0x00000001 /* Vertical flip image */
 #define OV772X_FLAG_HFLIP     0x00000002 /* Horizontal flip image */
 
+/*
+ * for Edge ctrl
+ *
+ * strength also control Auto or Manual Edge Control Mode
+ * see also OV772X_MANUAL_EDGE_CTRL
+ */
+struct ov772x_edge_ctrl {
+       unsigned char strength;
+       unsigned char threshold;
+       unsigned char upper;
+       unsigned char lower;
+};
+
+#define OV772X_MANUAL_EDGE_CTRL        0x80 /* un-used bit of strength */
+#define EDGE_STRENGTH_MASK     0x1F
+#define EDGE_THRESHOLD_MASK    0x0F
+#define EDGE_UPPER_MASK                0xFF
+#define EDGE_LOWER_MASK                0xFF
+
+#define OV772X_AUTO_EDGECTRL(u, l)     \
+{                                      \
+       .upper = (u & EDGE_UPPER_MASK), \
+       .lower = (l & EDGE_LOWER_MASK), \
+}
+
+#define OV772X_MANUAL_EDGECTRL(s, t)                                   \
+{                                                                      \
+       .strength  = (s & EDGE_STRENGTH_MASK) | OV772X_MANUAL_EDGE_CTRL,\
+       .threshold = (t & EDGE_THRESHOLD_MASK),                         \
+}
+
+/*
+ * ov772x camera info
+ */
 struct ov772x_camera_info {
        unsigned long          buswidth;
        unsigned long          flags;
        struct soc_camera_link link;
+       struct ov772x_edge_ctrl edgectrl;
 };
 
 #endif /* __OV772X_H__ */
index fff4235adae54c9901502ae973ce2c2aed585880..7a9f76ecbbbd8298339c5f88a92238af144e0a68 100644 (file)
@@ -18,7 +18,7 @@
 #include <linux/vmalloc.h>     /* for vmalloc() */
 #include <linux/mm.h>          /* for vmalloc_to_page() */
 
-#define SAA7146_VERSION_CODE 0x000500  /* 0.5.0 */
+#define SAA7146_VERSION_CODE 0x000600  /* 0.6.0 */
 
 #define saa7146_write(sxy,adr,dat)    writel((dat),(sxy->mem+(adr)))
 #define saa7146_read(sxy,adr)         readl(sxy->mem+(adr))
index 6915aafc875a2f7af22c4743d5a68f7146d63026..1ac8184693f89a6fdd358cb027263d00f545782c 100644 (file)
 #ifndef _TVAUDIO_H
 #define _TVAUDIO_H
 
+#include <media/i2c-addr.h>
+
 /* The tvaudio module accepts the following inputs: */
 #define TVAUDIO_INPUT_TUNER  0
 #define TVAUDIO_INPUT_RADIO  1
 #define TVAUDIO_INPUT_EXTERN 2
 #define TVAUDIO_INPUT_INTERN 3
 
+static inline const unsigned short *tvaudio_addrs(void)
+{
+       static const unsigned short addrs[] = {
+               I2C_ADDR_TDA8425   >> 1,
+               I2C_ADDR_TEA6300   >> 1,
+               I2C_ADDR_TEA6420   >> 1,
+               I2C_ADDR_TDA9840   >> 1,
+               I2C_ADDR_TDA985x_L >> 1,
+               I2C_ADDR_TDA985x_H >> 1,
+               I2C_ADDR_TDA9874   >> 1,
+               I2C_ADDR_PIC16C54  >> 1,
+               I2C_CLIENT_END
+       };
+
+       return addrs;
+}
+
 #endif
index 3a6905615d689e277f1e12e9858b3b5194ffc0e6..c48c24e4d0fa44bb6b2df6f646a1fc37ca737a5d 100644 (file)
@@ -125,7 +125,7 @@ int v4l2_chip_match_host(const struct v4l2_dbg_match *match);
 
 /* ------------------------------------------------------------------------- */
 
-/* Helper function for I2C legacy drivers */
+/* I2C Helper functions */
 
 struct i2c_driver;
 struct i2c_adapter;
@@ -135,21 +135,24 @@ struct v4l2_device;
 struct v4l2_subdev;
 struct v4l2_subdev_ops;
 
-int v4l2_i2c_attach(struct i2c_adapter *adapter, int address, struct i2c_driver *driver,
-               const char *name,
-               int (*probe)(struct i2c_client *, const struct i2c_device_id *));
 
 /* Load an i2c module and return an initialized v4l2_subdev struct.
    Only call request_module if module_name != NULL.
    The client_type argument is the name of the chip that's on the adapter. */
-struct v4l2_subdev *v4l2_i2c_new_subdev(struct i2c_adapter *adapter,
+struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
+               struct i2c_adapter *adapter,
                const char *module_name, const char *client_type, u8 addr);
 /* Probe and load an i2c module and return an initialized v4l2_subdev struct.
    Only call request_module if module_name != NULL.
    The client_type argument is the name of the chip that's on the adapter. */
-struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct i2c_adapter *adapter,
+struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct v4l2_device *v4l2_dev,
+               struct i2c_adapter *adapter,
                const char *module_name, const char *client_type,
                const unsigned short *addrs);
+/* Like v4l2_i2c_new_probed_subdev, except probe for a single address. */
+struct v4l2_subdev *v4l2_i2c_new_probed_subdev_addr(struct v4l2_device *v4l2_dev,
+               struct i2c_adapter *adapter,
+               const char *module_name, const char *client_type, u8 addr);
 /* Initialize an v4l2_subdev with data from an i2c_client struct */
 void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client,
                const struct v4l2_subdev_ops *ops);
@@ -171,139 +174,23 @@ const unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type);
 
 /* ------------------------------------------------------------------------- */
 
-/* Internal ioctls */
-
-/* VIDIOC_INT_DECODE_VBI_LINE */
-struct v4l2_decode_vbi_line {
-       u32 is_second_field;    /* Set to 0 for the first (odd) field,
-                                  set to 1 for the second (even) field. */
-       u8 *p;                  /* Pointer to the sliced VBI data from the decoder.
-                                  On exit points to the start of the payload. */
-       u32 line;               /* Line number of the sliced VBI data (1-23) */
-       u32 type;               /* VBI service type (V4L2_SLICED_*). 0 if no service found */
-};
+/* Note: these remaining ioctls/structs should be removed as well, but they are
+   still used in tuner-simple.c (TUNER_SET_CONFIG), cx18/ivtv (RESET) and
+   v4l2-int-device.h (v4l2_routing). To remove these ioctls some more cleanup
+   is needed in those modules. */
 
+/* s_config */
 struct v4l2_priv_tun_config {
        int tuner;
        void *priv;
 };
-
-/* audio ioctls */
-
-/* v4l device was opened in Radio mode, to be replaced by VIDIOC_INT_S_TUNER_MODE */
-#define AUDC_SET_RADIO        _IO('d',88)
-
-/* tuner ioctls */
-
-/* Sets tuner type and its I2C addr */
-#define TUNER_SET_TYPE_ADDR          _IOW('d', 90, int)
-
-/* Puts tuner on powersaving state, disabling it, except for i2c. To be replaced
-   by VIDIOC_INT_S_STANDBY. */
-#define TUNER_SET_STANDBY            _IOW('d', 91, int)
-
-/* Sets tda9887 specific stuff, like port1, port2 and qss */
 #define TUNER_SET_CONFIG           _IOW('d', 92, struct v4l2_priv_tun_config)
 
-/* Switch the tuner to a specific tuner mode. Replacement of AUDC_SET_RADIO */
-#define VIDIOC_INT_S_TUNER_MODE             _IOW('d', 93, enum v4l2_tuner_type)
-
-/* Generic standby command. Passing -1 (all bits set to 1) will put the whole
-   chip into standby mode, value 0 will make the chip fully active. Specific
-   bits can be used by certain chips to enable/disable specific subsystems.
-   Replacement of TUNER_SET_STANDBY. */
-#define VIDIOC_INT_S_STANDBY        _IOW('d', 94, u32)
-
-/* 100, 101 used by  VIDIOC_DBG_[SG]_REGISTER */
-
-/* Generic reset command. The argument selects which subsystems to reset.
-   Passing 0 will always reset the whole chip. */
 #define VIDIOC_INT_RESET               _IOW ('d', 102, u32)
 
-/* Set the frequency (in Hz) of the audio clock output.
-   Used to slave an audio processor to the video decoder, ensuring that audio
-   and video remain synchronized.
-   Usual values for the frequency are 48000, 44100 or 32000 Hz.
-   If the frequency is not supported, then -EINVAL is returned. */
-#define VIDIOC_INT_AUDIO_CLOCK_FREQ    _IOW ('d', 103, u32)
-
-/* Video decoders that support sliced VBI need to implement this ioctl.
-   Field p of the v4l2_sliced_vbi_line struct is set to the start of the VBI
-   data that was generated by the decoder. The driver then parses the sliced
-   VBI data and sets the other fields in the struct accordingly. The pointer p
-   is updated to point to the start of the payload which can be copied
-   verbatim into the data field of the v4l2_sliced_vbi_data struct. If no
-   valid VBI data was found, then the type field is set to 0 on return. */
-#define VIDIOC_INT_DECODE_VBI_LINE     _IOWR('d', 104, struct v4l2_decode_vbi_line)
-
-/* Used to generate VBI signals on a video signal. v4l2_sliced_vbi_data is
-   filled with the data packets that should be output. Note that if you set
-   the line field to 0, then that VBI signal is disabled. If no
-   valid VBI data was found, then the type field is set to 0 on return. */
-#define VIDIOC_INT_S_VBI_DATA          _IOW ('d', 105, struct v4l2_sliced_vbi_data)
-
-/* Used to obtain the sliced VBI packet from a readback register. Not all
-   video decoders support this. If no data is available because the readback
-   register contains invalid or erroneous data -EIO is returned. Note that
-   you must fill in the 'id' member and the 'field' member (to determine
-   whether CC data from the first or second field should be obtained). */
-#define VIDIOC_INT_G_VBI_DATA          _IOWR('d', 106, struct v4l2_sliced_vbi_data)
-
-/* Sets I2S speed in bps. This is used to provide a standard way to select I2S
-   clock used by driving digital audio streams at some board designs.
-   Usual values for the frequency are 1024000 and 2048000.
-   If the frequency is not supported, then -EINVAL is returned. */
-#define VIDIOC_INT_I2S_CLOCK_FREQ      _IOW ('d', 108, u32)
-
-/* Routing definition, device dependent. It specifies which inputs (if any)
-   should be routed to which outputs (if any). */
 struct v4l2_routing {
        u32 input;
        u32 output;
 };
 
-/* These internal commands should be used to define the inputs and outputs
-   of an audio/video chip. They will replace the v4l2 API commands
-   VIDIOC_S/G_INPUT, VIDIOC_S/G_OUTPUT, VIDIOC_S/G_AUDIO and VIDIOC_S/G_AUDOUT
-   that are meant to be used by the user.
-   The internal commands should be used to switch inputs/outputs
-   because only the driver knows how to map a 'Television' input to the precise
-   input/output routing of an A/D converter, or a DSP, or a video digitizer.
-   These four commands should only be sent directly to an i2c device, they
-   should not be broadcast as the routing is very device specific. */
-#define        VIDIOC_INT_S_AUDIO_ROUTING      _IOW ('d', 109, struct v4l2_routing)
-#define        VIDIOC_INT_G_AUDIO_ROUTING      _IOR ('d', 110, struct v4l2_routing)
-#define        VIDIOC_INT_S_VIDEO_ROUTING      _IOW ('d', 111, struct v4l2_routing)
-#define        VIDIOC_INT_G_VIDEO_ROUTING      _IOR ('d', 112, struct v4l2_routing)
-
-struct v4l2_crystal_freq {
-       u32 freq;       /* frequency in Hz of the crystal */
-       u32 flags;      /* device specific flags */
-};
-
-/* Sets the frequency of the crystal used to generate the clocks.
-   An extra flags field allows device specific configuration regarding
-   clock frequency dividers, etc. If not used, then set flags to 0.
-   If the frequency is not supported, then -EINVAL is returned. */
-#define VIDIOC_INT_S_CRYSTAL_FREQ      _IOW('d', 113, struct v4l2_crystal_freq)
-
-/* Initialize the sensor registors to some sort of reasonable
-   default values. */
-#define VIDIOC_INT_INIT                        _IOW('d', 114, u32)
-
-/* Set v4l2_std_id for video OUTPUT devices. This is ignored by
-   video input devices. */
-#define VIDIOC_INT_S_STD_OUTPUT                _IOW('d', 115, v4l2_std_id)
-
-/* Get v4l2_std_id for video OUTPUT devices. This is ignored by
-   video input devices. */
-#define VIDIOC_INT_G_STD_OUTPUT                _IOW('d', 116, v4l2_std_id)
-
-/* Set GPIO pins. Very simple right now, might need to be extended with
-   a v4l2_gpio struct if a direction is also needed. */
-#define VIDIOC_INT_S_GPIO              _IOW('d', 117, u32)
-
-/* Get input status. Same as the status field in the v4l2_input struct. */
-#define VIDIOC_INT_G_INPUT_STATUS      _IOR('d', 118, u32)
-
 #endif /* V4L2_COMMON_H_ */
diff --git a/include/media/v4l2-i2c-drv-legacy.h b/include/media/v4l2-i2c-drv-legacy.h
deleted file mode 100644 (file)
index e65dd9d..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * v4l2-i2c-drv-legacy.h - contains I2C handling code that's identical
- *                 for all V4L2 I2C drivers. Use this header if the
- *                 I2C driver is used by both legacy drivers and
- *                 drivers converted to the bus-based I2C API.
- *
- * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl>
- *
- * 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.
- */
-
-/* NOTE: the full version of this header is in the v4l-dvb repository
- * and allows v4l i2c drivers to be compiled on older kernels as well.
- * The version of this header as it appears in the kernel is a stripped
- * version (without all the backwards compatibility stuff) and so it
- * looks a bit odd.
- *
- * If you look at the full version then you will understand the reason
- * for introducing this header since you really don't want to have all
- * the tricky backwards compatibility code in each and every i2c driver.
- */
-
-struct v4l2_i2c_driver_data {
-       const char * const name;
-       int driverid;
-       int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
-       int (*probe)(struct i2c_client *client, const struct i2c_device_id *id);
-       int (*remove)(struct i2c_client *client);
-       int (*suspend)(struct i2c_client *client, pm_message_t state);
-       int (*resume)(struct i2c_client *client);
-       int (*legacy_probe)(struct i2c_adapter *adapter);
-       int legacy_class;
-       const struct i2c_device_id *id_table;
-};
-
-static struct v4l2_i2c_driver_data v4l2_i2c_data;
-static const struct i2c_client_address_data addr_data;
-static struct i2c_driver v4l2_i2c_driver_legacy;
-static char v4l2_i2c_drv_name_legacy[32];
-
-static int v4l2_i2c_drv_attach_legacy(struct i2c_adapter *adapter, int address, int kind)
-{
-       return v4l2_i2c_attach(adapter, address, &v4l2_i2c_driver_legacy,
-                       v4l2_i2c_drv_name_legacy, v4l2_i2c_data.probe);
-}
-
-static int v4l2_i2c_drv_probe_legacy(struct i2c_adapter *adapter)
-{
-       if (v4l2_i2c_data.legacy_probe) {
-               if (v4l2_i2c_data.legacy_probe(adapter))
-                       return i2c_probe(adapter, &addr_data, v4l2_i2c_drv_attach_legacy);
-               return 0;
-       }
-       if (adapter->class & v4l2_i2c_data.legacy_class)
-               return i2c_probe(adapter, &addr_data, v4l2_i2c_drv_attach_legacy);
-       return 0;
-}
-
-static int v4l2_i2c_drv_detach_legacy(struct i2c_client *client)
-{
-       int err;
-
-       if (v4l2_i2c_data.remove)
-               v4l2_i2c_data.remove(client);
-
-       err = i2c_detach_client(client);
-       if (err)
-               return err;
-       kfree(client);
-       return 0;
-}
-
-static int v4l2_i2c_drv_suspend_helper(struct i2c_client *client, pm_message_t state)
-{
-       return v4l2_i2c_data.suspend ? v4l2_i2c_data.suspend(client, state) : 0;
-}
-
-static int v4l2_i2c_drv_resume_helper(struct i2c_client *client)
-{
-       return v4l2_i2c_data.resume ? v4l2_i2c_data.resume(client) : 0;
-}
-
-/* ----------------------------------------------------------------------- */
-
-/* i2c implementation */
-static struct i2c_driver v4l2_i2c_driver_legacy = {
-       .driver = {
-               .owner = THIS_MODULE,
-       },
-       .attach_adapter = v4l2_i2c_drv_probe_legacy,
-       .detach_client = v4l2_i2c_drv_detach_legacy,
-       .suspend = v4l2_i2c_drv_suspend_helper,
-       .resume  = v4l2_i2c_drv_resume_helper,
-};
-
-/* ----------------------------------------------------------------------- */
-
-/* i2c implementation */
-static struct i2c_driver v4l2_i2c_driver = {
-       .suspend        = v4l2_i2c_drv_suspend_helper,
-       .resume         = v4l2_i2c_drv_resume_helper,
-};
-
-static int __init v4l2_i2c_drv_init(void)
-{
-       int err;
-
-       strlcpy(v4l2_i2c_drv_name_legacy, v4l2_i2c_data.name, sizeof(v4l2_i2c_drv_name_legacy));
-       strlcat(v4l2_i2c_drv_name_legacy, "'", sizeof(v4l2_i2c_drv_name_legacy));
-
-       if (v4l2_i2c_data.legacy_class == 0)
-               v4l2_i2c_data.legacy_class = I2C_CLASS_TV_ANALOG;
-
-       v4l2_i2c_driver_legacy.driver.name = v4l2_i2c_drv_name_legacy;
-       v4l2_i2c_driver_legacy.id = v4l2_i2c_data.driverid;
-       v4l2_i2c_driver_legacy.command = v4l2_i2c_data.command;
-       err = i2c_add_driver(&v4l2_i2c_driver_legacy);
-
-       if (err)
-               return err;
-       v4l2_i2c_driver.driver.name = v4l2_i2c_data.name;
-       v4l2_i2c_driver.id = v4l2_i2c_data.driverid;
-       v4l2_i2c_driver.command = v4l2_i2c_data.command;
-       v4l2_i2c_driver.probe = v4l2_i2c_data.probe;
-       v4l2_i2c_driver.remove = v4l2_i2c_data.remove;
-       v4l2_i2c_driver.id_table = v4l2_i2c_data.id_table;
-       err = i2c_add_driver(&v4l2_i2c_driver);
-       if (err)
-               i2c_del_driver(&v4l2_i2c_driver_legacy);
-       return err;
-}
-
-static void __exit v4l2_i2c_drv_cleanup(void)
-{
-       i2c_del_driver(&v4l2_i2c_driver_legacy);
-       i2c_del_driver(&v4l2_i2c_driver);
-}
-
-module_init(v4l2_i2c_drv_init);
-module_exit(v4l2_i2c_drv_cleanup);
index efdc8bf27f87cc3aa09ca51e1e41459d1434d485..10a2882c3cbf295277328a9c3ca62cecee5b1054 100644 (file)
 
 struct v4l2_i2c_driver_data {
        const char * const name;
-       int driverid;
        int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
        int (*probe)(struct i2c_client *client, const struct i2c_device_id *id);
        int (*remove)(struct i2c_client *client);
        int (*suspend)(struct i2c_client *client, pm_message_t state);
        int (*resume)(struct i2c_client *client);
-       int (*legacy_probe)(struct i2c_adapter *adapter);
-       int legacy_class;
        const struct i2c_device_id *id_table;
 };
 
@@ -54,12 +51,11 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data;
 static struct i2c_driver v4l2_i2c_driver;
 
 
-/* Bus-based I2C implementation for kernels >= 2.6.22 */
+/* Bus-based I2C implementation for kernels >= 2.6.26 */
 
 static int __init v4l2_i2c_drv_init(void)
 {
        v4l2_i2c_driver.driver.name = v4l2_i2c_data.name;
-       v4l2_i2c_driver.id = v4l2_i2c_data.driverid;
        v4l2_i2c_driver.command = v4l2_i2c_data.command;
        v4l2_i2c_driver.probe = v4l2_i2c_data.probe;
        v4l2_i2c_driver.remove = v4l2_i2c_data.remove;
index 1d181b4ccb0143f3f837ded4ab319616cf63a0b0..17856081c80942d6ec9f4e0e7a0d362d2c4277df 100644 (file)
@@ -27,6 +27,16 @@ struct v4l2_device;
 struct v4l2_subdev;
 struct tuner_setup;
 
+/* decode_vbi_line */
+struct v4l2_decode_vbi_line {
+       u32 is_second_field;    /* Set to 0 for the first (odd) field,
+                                  set to 1 for the second (even) field. */
+       u8 *p;                  /* Pointer to the sliced VBI data from the decoder.
+                                  On exit points to the start of the payload. */
+       u32 line;               /* Line number of the sliced VBI data (1-23) */
+       u32 type;               /* VBI service type (V4L2_SLICED_*). 0 if no service found */
+};
+
 /* Sub-devices are devices that are connected somehow to the main bridge
    device. These devices are usually audio/video muxers/encoders/decoders or
    sensors and webcam controllers.
@@ -68,11 +78,26 @@ struct tuner_setup;
    the use-case it might be better to use subdev-specific ops (currently
    not yet implemented) since ops provide proper type-checking.
  */
+
+/* init: initialize the sensor registors to some sort of reasonable default
+       values. Do not use for new drivers and should be removed in existing
+       drivers.
+
+   load_fw: load firmware.
+
+   reset: generic reset command. The argument selects which subsystems to
+       reset. Passing 0 will always reset the whole chip. Do not use for new
+       drivers without discussing this first on the linux-media mailinglist.
+       There should be no reason normally to reset a device.
+
+   s_gpio: set GPIO pins. Very simple right now, might need to be extended with
+       a direction argument if needed.
+ */
 struct v4l2_subdev_core_ops {
        int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip);
        int (*log_status)(struct v4l2_subdev *sd);
        int (*init)(struct v4l2_subdev *sd, u32 val);
-       int (*s_standby)(struct v4l2_subdev *sd, u32 standby);
+       int (*load_fw)(struct v4l2_subdev *sd);
        int (*reset)(struct v4l2_subdev *sd, u32 val);
        int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
        int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
@@ -82,6 +107,7 @@ struct v4l2_subdev_core_ops {
        int (*s_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
        int (*try_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
        int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm);
+       int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
        long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
 #ifdef CONFIG_VIDEO_ADV_DEBUG
        int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
@@ -89,6 +115,16 @@ struct v4l2_subdev_core_ops {
 #endif
 };
 
+/* s_mode: switch the tuner to a specific tuner mode. Replacement of s_radio.
+
+   s_radio: v4l device was opened in Radio mode, to be replaced by s_mode.
+
+   s_type_addr: sets tuner type and its I2C addr.
+
+   s_config: sets tda9887 specific stuff, like port1, port2 and qss
+
+   s_standby: puts tuner on powersaving state, disabling it, except for i2c.
+ */
 struct v4l2_subdev_tuner_ops {
        int (*s_mode)(struct v4l2_subdev *sd, enum v4l2_tuner_type);
        int (*s_radio)(struct v4l2_subdev *sd);
@@ -96,20 +132,77 @@ struct v4l2_subdev_tuner_ops {
        int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
        int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
        int (*s_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
-       int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
        int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type);
        int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config);
+       int (*s_standby)(struct v4l2_subdev *sd);
 };
 
+/* s_clock_freq: set the frequency (in Hz) of the audio clock output.
+       Used to slave an audio processor to the video decoder, ensuring that
+       audio and video remain synchronized. Usual values for the frequency
+       are 48000, 44100 or 32000 Hz. If the frequency is not supported, then
+       -EINVAL is returned.
+
+   s_i2s_clock_freq: sets I2S speed in bps. This is used to provide a standard
+       way to select I2S clock used by driving digital audio streams at some
+       board designs. Usual values for the frequency are 1024000 and 2048000.
+       If the frequency is not supported, then -EINVAL is returned.
+
+   s_routing: used to define the input and/or output pins of an audio chip,
+       and any additional configuration data.
+       Never attempt to use user-level input IDs (e.g. Composite, S-Video,
+       Tuner) at this level. An i2c device shouldn't know about whether an
+       input pin is connected to a Composite connector, become on another
+       board or platform it might be connected to something else entirely.
+       The calling driver is responsible for mapping a user-level input to
+       the right pins on the i2c device.
+ */
 struct v4l2_subdev_audio_ops {
        int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
        int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
-       int (*s_routing)(struct v4l2_subdev *sd, const struct v4l2_routing *route);
+       int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
 };
 
+/*
+   decode_vbi_line: video decoders that support sliced VBI need to implement
+       this ioctl. Field p of the v4l2_sliced_vbi_line struct is set to the
+       start of the VBI data that was generated by the decoder. The driver
+       then parses the sliced VBI data and sets the other fields in the
+       struct accordingly. The pointer p is updated to point to the start of
+       the payload which can be copied verbatim into the data field of the
+       v4l2_sliced_vbi_data struct. If no valid VBI data was found, then the
+       type field is set to 0 on return.
+
+   s_vbi_data: used to generate VBI signals on a video signal.
+       v4l2_sliced_vbi_data is filled with the data packets that should be
+       output. Note that if you set the line field to 0, then that VBI signal
+       is disabled. If no valid VBI data was found, then the type field is
+       set to 0 on return.
+
+   g_vbi_data: used to obtain the sliced VBI packet from a readback register.
+       Not all video decoders support this. If no data is available because
+       the readback register contains invalid or erroneous data -EIO is
+       returned. Note that you must fill in the 'id' member and the 'field'
+       member (to determine whether CC data from the first or second field
+       should be obtained).
+
+   s_std_output: set v4l2_std_id for video OUTPUT devices. This is ignored by
+       video input devices.
+
+  s_crystal_freq: sets the frequency of the crystal used to generate the
+       clocks in Hz. An extra flags field allows device specific configuration
+       regarding clock frequency dividers, etc. If not used, then set flags
+       to 0. If the frequency is not supported, then -EINVAL is returned.
+
+   g_input_status: get input status. Same as the status field in the v4l2_input
+       struct.
+
+   s_routing: see s_routing in audio_ops, except this version is for video
+       devices.
+ */
 struct v4l2_subdev_video_ops {
-       int (*s_routing)(struct v4l2_subdev *sd, const struct v4l2_routing *route);
-       int (*s_crystal_freq)(struct v4l2_subdev *sd, struct v4l2_crystal_freq *freq);
+       int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
+       int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
        int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
        int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
        int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data);
@@ -163,18 +256,6 @@ static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd)
        return sd->priv;
 }
 
-/* Convert an ioctl-type command to the proper v4l2_subdev_ops function call.
-   This is used by subdev modules that can be called by both old-style ioctl
-   commands and through the v4l2_subdev_ops.
-
-   The ioctl API of the subdev driver can call this function to call the
-   right ops based on the ioctl cmd and arg.
-
-   Once all subdev drivers have been converted and all drivers no longer
-   use the ioctl interface, then this function can be removed.
- */
-int v4l2_subdev_command(struct v4l2_subdev *sd, unsigned cmd, void *arg);
-
 static inline void v4l2_subdev_init(struct v4l2_subdev *sd,
                                        const struct v4l2_subdev_ops *ops)
 {
diff --git a/include/scsi/fc/fc_fip.h b/include/scsi/fc/fc_fip.h
new file mode 100644 (file)
index 0000000..0627a9a
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
+ *
+ * This program is free software; you may 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.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef _FC_FIP_H_
+#define _FC_FIP_H_
+
+/*
+ * This version is based on:
+ * http://www.t11.org/ftp/t11/pub/fc/bb-5/08-543v1.pdf
+ */
+
+/*
+ * The FIP ethertype eventually goes in net/if_ether.h.
+ */
+#ifndef ETH_P_FIP
+#define ETH_P_FIP      0x8914  /* FIP Ethertype */
+#endif
+
+#define FIP_DEF_PRI    128     /* default selection priority */
+#define FIP_DEF_FC_MAP 0x0efc00 /* default FCoE MAP (MAC OUI) value */
+#define FIP_DEF_FKA    8000    /* default FCF keep-alive/advert period (mS) */
+#define FIP_VN_KA_PERIOD 90000 /* required VN_port keep-alive period (mS) */
+#define FIP_FCF_FUZZ   100     /* random time added by FCF (mS) */
+
+/*
+ * Multicast MAC addresses.  T11-adopted.
+ */
+#define FIP_ALL_FCOE_MACS      ((u8[6]) { 1, 0x10, 0x18, 1, 0, 0 })
+#define FIP_ALL_ENODE_MACS     ((u8[6]) { 1, 0x10, 0x18, 1, 0, 1 })
+#define FIP_ALL_FCF_MACS       ((u8[6]) { 1, 0x10, 0x18, 1, 0, 2 })
+
+#define FIP_VER                1               /* version for fip_header */
+
+struct fip_header {
+       __u8    fip_ver;                /* upper 4 bits are the version */
+       __u8    fip_resv1;              /* reserved */
+       __be16  fip_op;                 /* operation code */
+       __u8    fip_resv2;              /* reserved */
+       __u8    fip_subcode;            /* lower 4 bits are sub-code */
+       __be16  fip_dl_len;             /* length of descriptors in words */
+       __be16  fip_flags;              /* header flags */
+} __attribute__((packed));
+
+#define FIP_VER_SHIFT  4
+#define FIP_VER_ENCAPS(v) ((v) << FIP_VER_SHIFT)
+#define FIP_VER_DECAPS(v) ((v) >> FIP_VER_SHIFT)
+#define FIP_BPW                4               /* bytes per word for lengths */
+
+/*
+ * fip_op.
+ */
+enum fip_opcode {
+       FIP_OP_DISC =   1,              /* discovery, advertisement, etc. */
+       FIP_OP_LS =     2,              /* Link Service request or reply */
+       FIP_OP_CTRL =   3,              /* Keep Alive / Link Reset */
+       FIP_OP_VLAN =   4,              /* VLAN discovery */
+       FIP_OP_VENDOR_MIN = 0xfff8,     /* min vendor-specific opcode */
+       FIP_OP_VENDOR_MAX = 0xfffe,     /* max vendor-specific opcode */
+};
+
+/*
+ * Subcodes for FIP_OP_DISC.
+ */
+enum fip_disc_subcode {
+       FIP_SC_SOL =    1,              /* solicitation */
+       FIP_SC_ADV =    2,              /* advertisement */
+};
+
+/*
+ * Subcodes for FIP_OP_LS.
+ */
+enum fip_trans_subcode {
+       FIP_SC_REQ =    1,              /* request */
+       FIP_SC_REP =    2,              /* reply */
+};
+
+/*
+ * Subcodes for FIP_OP_RESET.
+ */
+enum fip_reset_subcode {
+       FIP_SC_KEEP_ALIVE = 1,          /* keep-alive from VN_Port */
+       FIP_SC_CLR_VLINK = 2,           /* clear virtual link from VF_Port */
+};
+
+/*
+ * Subcodes for FIP_OP_VLAN.
+ */
+enum fip_vlan_subcode {
+       FIP_SC_VL_REQ = 1,              /* request */
+       FIP_SC_VL_REP = 2,              /* reply */
+};
+
+/*
+ * flags in header fip_flags.
+ */
+enum fip_flag {
+       FIP_FL_FPMA =   0x8000,         /* supports FPMA fabric-provided MACs */
+       FIP_FL_SPMA =   0x4000,         /* supports SPMA server-provided MACs */
+       FIP_FL_AVAIL =  0x0004,         /* available for FLOGI/ELP */
+       FIP_FL_SOL =    0x0002,         /* this is a solicited message */
+       FIP_FL_FPORT =  0x0001,         /* sent from an F port */
+};
+
+/*
+ * Common descriptor header format.
+ */
+struct fip_desc {
+       __u8    fip_dtype;              /* type - see below */
+       __u8    fip_dlen;               /* length - in 32-bit words */
+};
+
+enum fip_desc_type {
+       FIP_DT_PRI =    1,              /* priority for forwarder selection */
+       FIP_DT_MAC =    2,              /* MAC address */
+       FIP_DT_MAP_OUI = 3,             /* FC-MAP OUI */
+       FIP_DT_NAME =   4,              /* switch name or node name */
+       FIP_DT_FAB =    5,              /* fabric descriptor */
+       FIP_DT_FCOE_SIZE = 6,           /* max FCoE frame size */
+       FIP_DT_FLOGI =  7,              /* FLOGI request or response */
+       FIP_DT_FDISC =  8,              /* FDISC request or response */
+       FIP_DT_LOGO =   9,              /* LOGO request or response */
+       FIP_DT_ELP =    10,             /* ELP request or response */
+       FIP_DT_VN_ID =  11,             /* VN_Node Identifier */
+       FIP_DT_FKA =    12,             /* advertisement keep-alive period */
+       FIP_DT_VENDOR = 13,             /* vendor ID */
+       FIP_DT_VLAN =   14,             /* vlan number */
+       FIP_DT_LIMIT,                   /* max defined desc_type + 1 */
+       FIP_DT_VENDOR_BASE = 128,       /* first vendor-specific desc_type */
+};
+
+/*
+ * FIP_DT_PRI - priority descriptor.
+ */
+struct fip_pri_desc {
+       struct fip_desc fd_desc;
+       __u8            fd_resvd;
+       __u8            fd_pri;         /* FCF priority:  higher is better */
+} __attribute__((packed));
+
+/*
+ * FIP_DT_MAC - MAC address descriptor.
+ */
+struct fip_mac_desc {
+       struct fip_desc fd_desc;
+       __u8            fd_mac[ETH_ALEN];
+} __attribute__((packed));
+
+/*
+ * FIP_DT_MAP - descriptor.
+ */
+struct fip_map_desc {
+       struct fip_desc fd_desc;
+       __u8            fd_resvd[3];
+       __u8            fd_map[3];
+} __attribute__((packed));
+
+/*
+ * FIP_DT_NAME descriptor.
+ */
+struct fip_wwn_desc {
+       struct fip_desc fd_desc;
+       __u8            fd_resvd[2];
+       __be64          fd_wwn;         /* 64-bit WWN, unaligned */
+} __attribute__((packed));
+
+/*
+ * FIP_DT_FAB descriptor.
+ */
+struct fip_fab_desc {
+       struct fip_desc fd_desc;
+       __be16          fd_vfid;        /* virtual fabric ID */
+       __u8            fd_resvd;
+       __u8            fd_map[3];      /* FC-MAP value */
+       __be64          fd_wwn;         /* fabric name, unaligned */
+} __attribute__((packed));
+
+/*
+ * FIP_DT_FCOE_SIZE descriptor.
+ */
+struct fip_size_desc {
+       struct fip_desc fd_desc;
+       __be16          fd_size;
+} __attribute__((packed));
+
+/*
+ * Descriptor that encapsulates an ELS or ILS frame.
+ * The encapsulated frame immediately follows this header, without
+ * SOF, EOF, or CRC.
+ */
+struct fip_encaps {
+       struct fip_desc fd_desc;
+       __u8            fd_resvd[2];
+} __attribute__((packed));
+
+/*
+ * FIP_DT_VN_ID - VN_Node Identifier descriptor.
+ */
+struct fip_vn_desc {
+       struct fip_desc fd_desc;
+       __u8            fd_mac[ETH_ALEN];
+       __u8            fd_resvd;
+       __u8            fd_fc_id[3];
+       __be64          fd_wwpn;        /* port name, unaligned */
+} __attribute__((packed));
+
+/*
+ * FIP_DT_FKA - Advertisement keep-alive period.
+ */
+struct fip_fka_desc {
+       struct fip_desc fd_desc;
+       __u8            fd_resvd[2];
+       __be32          fd_fka_period;  /* adv./keep-alive period in mS */
+} __attribute__((packed));
+
+/*
+ * FIP_DT_VENDOR descriptor.
+ */
+struct fip_vendor_desc {
+       struct fip_desc fd_desc;
+       __u8            fd_resvd[2];
+       __u8            fd_vendor_id[8];
+} __attribute__((packed));
+
+#endif /* _FC_FIP_H_ */
diff --git a/include/scsi/fc_transport_fcoe.h b/include/scsi/fc_transport_fcoe.h
deleted file mode 100644 (file)
index 8dca2af..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef FC_TRANSPORT_FCOE_H
-#define FC_TRANSPORT_FCOE_H
-
-#include <linux/device.h>
-#include <linux/netdevice.h>
-#include <scsi/scsi_host.h>
-#include <scsi/libfc.h>
-
-/**
- * struct fcoe_transport - FCoE transport struct for generic transport
- * for Ethernet devices as well as pure HBAs
- *
- * @name: name for thsi transport
- * @bus: physical bus type (pci_bus_type)
- * @driver: physical bus driver for network device
- * @create: entry create function
- * @destroy: exit destroy function
- * @list: list of transports
- */
-struct fcoe_transport {
-       char *name;
-       unsigned short vendor;
-       unsigned short device;
-       struct bus_type *bus;
-       struct device_driver *driver;
-       int (*create)(struct net_device *device);
-       int (*destroy)(struct net_device *device);
-       bool (*match)(struct net_device *device);
-       struct list_head list;
-       struct list_head devlist;
-       struct mutex devlock;
-};
-
-/**
- * MODULE_ALIAS_FCOE_PCI
- *
- * some care must be taken with this, vendor and device MUST be a hex value
- * preceded with 0x and with letters in lower case (0x12ab, not 0x12AB or 12AB)
- */
-#define MODULE_ALIAS_FCOE_PCI(vendor, device) \
-       MODULE_ALIAS("fcoe-pci-" __stringify(vendor) "-" __stringify(device))
-
-/* exported funcs */
-int fcoe_transport_attach(struct net_device *netdev);
-int fcoe_transport_release(struct net_device *netdev);
-int fcoe_transport_register(struct fcoe_transport *t);
-int fcoe_transport_unregister(struct fcoe_transport *t);
-int fcoe_load_transport_driver(struct net_device *netdev);
-int __init fcoe_transport_init(void);
-int __exit fcoe_transport_exit(void);
-
-/* fcow_sw is the default transport */
-extern struct fcoe_transport fcoe_sw_transport;
-#endif /* FC_TRANSPORT_FCOE_H */
index a70eafaad084a8d978555cfeb63bbe7883e4790b..0303a6a098cc2f8a7124adcf60167a6bf5ad919d 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <linux/timer.h>
 #include <linux/if.h>
+#include <linux/percpu.h>
 
 #include <scsi/scsi_transport.h>
 #include <scsi/scsi_transport_fc.h>
@@ -661,7 +662,8 @@ struct fc_lport {
        unsigned long           boot_time;
 
        struct fc_host_statistics host_stats;
-       struct fcoe_dev_stats   *dev_stats[NR_CPUS];
+       struct fcoe_dev_stats   *dev_stats;
+
        u64                     wwpn;
        u64                     wwnn;
        u8                      retry_count;
@@ -694,11 +696,6 @@ struct fc_lport {
 /*
  * FC_LPORT HELPER FUNCTIONS
  *****************************/
-static inline void *lport_priv(const struct fc_lport *lp)
-{
-       return (void *)(lp + 1);
-}
-
 static inline int fc_lport_test_ready(struct fc_lport *lp)
 {
        return lp->state == LPORT_ST_READY;
@@ -722,6 +719,42 @@ static inline void fc_lport_state_enter(struct fc_lport *lp,
        lp->state = state;
 }
 
+static inline int fc_lport_init_stats(struct fc_lport *lp)
+{
+       /* allocate per cpu stats block */
+       lp->dev_stats = alloc_percpu(struct fcoe_dev_stats);
+       if (!lp->dev_stats)
+               return -ENOMEM;
+       return 0;
+}
+
+static inline void fc_lport_free_stats(struct fc_lport *lp)
+{
+       free_percpu(lp->dev_stats);
+}
+
+static inline struct fcoe_dev_stats *fc_lport_get_stats(struct fc_lport *lp)
+{
+       return per_cpu_ptr(lp->dev_stats, smp_processor_id());
+}
+
+static inline void *lport_priv(const struct fc_lport *lp)
+{
+       return (void *)(lp + 1);
+}
+
+/**
+ * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport
+ * @sht: ptr to the scsi host templ
+ * @priv_size: size of private data after fc_lport
+ *
+ * Returns: ptr to Scsi_Host
+ */
+static inline struct Scsi_Host *
+libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
+{
+       return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size);
+}
 
 /*
  * LOCAL PORT LAYER
index c41f7d0c6efc88e5e324d3752d2c2bfce7f0aed9..666cc131732ee3cfc7715a6568dabcd57a1e42e2 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
+ * Copyright (c) 2008-2009 Cisco Systems, Inc.  All rights reserved.
+ * Copyright (c) 2007-2008 Intel Corporation.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
 #ifndef _LIBFCOE_H
 #define _LIBFCOE_H
 
+#include <linux/etherdevice.h>
+#include <linux/if_ether.h>
 #include <linux/netdevice.h>
 #include <linux/skbuff.h>
+#include <linux/workqueue.h>
 #include <scsi/fc/fc_fcoe.h>
 #include <scsi/libfc.h>
 
 /*
- * this percpu struct for fcoe
+ * FIP tunable parameters.
  */
-struct fcoe_percpu_s {
-       int             cpu;
-       struct task_struct *thread;
-       struct sk_buff_head fcoe_rx_list;
-       struct page *crc_eof_page;
-       int crc_eof_offset;
+#define FCOE_CTLR_START_DELAY  2000    /* mS after first adv. to choose FCF */
+#define FCOE_CTRL_SOL_TOV      2000    /* min. solicitation interval (mS) */
+#define FCOE_CTLR_FCF_LIMIT    20      /* max. number of FCF entries */
+
+/**
+ * enum fip_state - internal state of FCoE controller.
+ * @FIP_ST_DISABLED:   controller has been disabled or not yet enabled.
+ * @FIP_ST_LINK_WAIT:  the physical link is down or unusable.
+ * @FIP_ST_AUTO:       determining whether to use FIP or non-FIP mode.
+ * @FIP_ST_NON_FIP:    non-FIP mode selected.
+ * @FIP_ST_ENABLED:    FIP mode selected.
+ */
+enum fip_state {
+       FIP_ST_DISABLED,
+       FIP_ST_LINK_WAIT,
+       FIP_ST_AUTO,
+       FIP_ST_NON_FIP,
+       FIP_ST_ENABLED,
 };
 
-/*
- * the fcoe sw transport private data
+/**
+ * struct fcoe_ctlr - FCoE Controller and FIP state.
+ * @state:     internal FIP state for network link and FIP or non-FIP mode.
+ * @lp:                &fc_lport: libfc local port.
+ * @sel_fcf:   currently selected FCF, or NULL.
+ * @fcfs:      list of discovered FCFs.
+ * @fcf_count: number of discovered FCF entries.
+ * @sol_time:  time when a multicast solicitation was last sent.
+ * @sel_time:  time after which to select an FCF.
+ * @port_ka_time: time of next port keep-alive.
+ * @ctlr_ka_time: time of next controller keep-alive.
+ * @timer:     timer struct used for all delayed events.
+ * @link_work: &work_struct for doing FCF selection.
+ * @recv_work: &work_struct for receiving FIP frames.
+ * @fip_recv_list: list of received FIP frames.
+ * @user_mfs:  configured maximum FC frame size, including FC header.
+ * @flogi_oxid: exchange ID of most recent fabric login.
+ * @flogi_count: number of FLOGI attempts in AUTO mode.
+ * @link:      current link status for libfc.
+ * @last_link: last link state reported to libfc.
+ * @map_dest:  use the FC_MAP mode for destination MAC addresses.
+ * @dest_addr: MAC address of the selected FC forwarder.
+ * @ctl_src_addr: the native MAC address of our local port.
+ * @data_src_addr: the assigned MAC address for the local port after FLOGI.
+ * @send:      LLD-supplied function to handle sending of FIP Ethernet frames.
+ * @update_mac: LLD-supplied function to handle changes to MAC addresses.
+ * @lock:      lock protecting this structure.
+ *
+ * This structure is used by all FCoE drivers.  It contains information
+ * needed by all FCoE low-level drivers (LLDs) as well as internal state
+ * for FIP, and fields shared with the LLDS.
  */
-struct fcoe_softc {
-       struct list_head list;
+struct fcoe_ctlr {
+       enum fip_state state;
        struct fc_lport *lp;
-       struct net_device *real_dev;
-       struct net_device *phys_dev;            /* device with ethtool_ops */
-       struct packet_type  fcoe_packet_type;
-       struct sk_buff_head fcoe_pending_queue;
-       u8      fcoe_pending_queue_active;
-
+       struct fcoe_fcf *sel_fcf;
+       struct list_head fcfs;
+       u16 fcf_count;
+       unsigned long sol_time;
+       unsigned long sel_time;
+       unsigned long port_ka_time;
+       unsigned long ctlr_ka_time;
+       struct timer_list timer;
+       struct work_struct link_work;
+       struct work_struct recv_work;
+       struct sk_buff_head fip_recv_list;
+       u16 user_mfs;
+       u16 flogi_oxid;
+       u8 flogi_count;
+       u8 link;
+       u8 last_link;
+       u8 map_dest;
        u8 dest_addr[ETH_ALEN];
        u8 ctl_src_addr[ETH_ALEN];
        u8 data_src_addr[ETH_ALEN];
-       /*
-        * fcoe protocol address learning related stuff
-        */
-       u16 flogi_oxid;
-       u8 flogi_progress;
-       u8 address_mode;
-};
-
-static inline struct net_device *fcoe_netdev(
-       const struct fc_lport *lp)
-{
-       return ((struct fcoe_softc *)lport_priv(lp))->real_dev;
-}
-
-static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb)
-{
-       return (struct fcoe_hdr *)skb_network_header(skb);
-}
-
-static inline int skb_fcoe_offset(const struct sk_buff *skb)
-{
-       return skb_network_offset(skb);
-}
-
-static inline struct fc_frame_header *skb_fc_header(const struct sk_buff *skb)
-{
-       return (struct fc_frame_header *)skb_transport_header(skb);
-}
-
-static inline int skb_fc_offset(const struct sk_buff *skb)
-{
-       return skb_transport_offset(skb);
-}
 
-static inline void skb_reset_fc_header(struct sk_buff *skb)
-{
-       skb_reset_network_header(skb);
-       skb_set_transport_header(skb, skb_network_offset(skb) +
-                                sizeof(struct fcoe_hdr));
-}
-
-static inline bool skb_fc_is_data(const struct sk_buff *skb)
-{
-       return skb_fc_header(skb)->fh_r_ctl == FC_RCTL_DD_SOL_DATA;
-}
-
-static inline bool skb_fc_is_cmd(const struct sk_buff *skb)
-{
-       return skb_fc_header(skb)->fh_r_ctl == FC_RCTL_DD_UNSOL_CMD;
-}
+       void (*send)(struct fcoe_ctlr *, struct sk_buff *);
+       void (*update_mac)(struct fcoe_ctlr *, u8 *old, u8 *new);
+       spinlock_t lock;
+};
 
-static inline bool skb_fc_has_exthdr(const struct sk_buff *skb)
-{
-       return (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_VFTH) ||
-           (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_IFRH) ||
-           (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_ENCH);
-}
+/*
+ * struct fcoe_fcf - Fibre-Channel Forwarder.
+ * @list:      list linkage.
+ * @time:      system time (jiffies) when an advertisement was last received.
+ * @switch_name: WWN of switch from advertisement.
+ * @fabric_name: WWN of fabric from advertisement.
+ * @fc_map:    FC_MAP value from advertisement.
+ * @fcf_mac:   Ethernet address of the FCF.
+ * @vfid:      virtual fabric ID.
+ * @pri:       seletion priority, smaller values are better.
+ * @flags:     flags received from advertisement.
+ * @fka_period:        keep-alive period, in jiffies.
+ *
+ * A Fibre-Channel Forwarder (FCF) is the entity on the Ethernet that
+ * passes FCoE frames on to an FC fabric.  This structure represents
+ * one FCF from which advertisements have been received.
+ *
+ * When looking up an FCF, @switch_name, @fabric_name, @fc_map, @vfid, and
+ * @fcf_mac together form the lookup key.
+ */
+struct fcoe_fcf {
+       struct list_head list;
+       unsigned long time;
 
-static inline bool skb_fc_is_roff(const struct sk_buff *skb)
-{
-       return skb_fc_header(skb)->fh_f_ctl[2] & FC_FC_REL_OFF;
-}
+       u64 switch_name;
+       u64 fabric_name;
+       u32 fc_map;
+       u16 vfid;
+       u8 fcf_mac[ETH_ALEN];
 
-static inline u16 skb_fc_oxid(const struct sk_buff *skb)
-{
-       return be16_to_cpu(skb_fc_header(skb)->fh_ox_id);
-}
+       u8 pri;
+       u16 flags;
+       u32 fka_period;
+};
 
-static inline u16 skb_fc_rxid(const struct sk_buff *skb)
-{
-       return be16_to_cpu(skb_fc_header(skb)->fh_rx_id);
-}
+/* FIP API functions */
+void fcoe_ctlr_init(struct fcoe_ctlr *);
+void fcoe_ctlr_destroy(struct fcoe_ctlr *);
+void fcoe_ctlr_link_up(struct fcoe_ctlr *);
+int fcoe_ctlr_link_down(struct fcoe_ctlr *);
+int fcoe_ctlr_els_send(struct fcoe_ctlr *, struct sk_buff *);
+void fcoe_ctlr_recv(struct fcoe_ctlr *, struct sk_buff *);
+int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_frame *fp, u8 *sa);
 
 /* libfcoe funcs */
-int fcoe_reset(struct Scsi_Host *shost);
-u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN],
-                     unsigned int scheme, unsigned int port);
-
-u32 fcoe_fc_crc(struct fc_frame *fp);
-int fcoe_xmit(struct fc_lport *, struct fc_frame *);
-int fcoe_rcv(struct sk_buff *, struct net_device *,
-            struct packet_type *, struct net_device *);
-
-int fcoe_percpu_receive_thread(void *arg);
-void fcoe_clean_pending_queue(struct fc_lport *lp);
-void fcoe_percpu_clean(struct fc_lport *lp);
-void fcoe_watchdog(ulong vp);
-int fcoe_link_ok(struct fc_lport *lp);
-
-struct fc_lport *fcoe_hostlist_lookup(const struct net_device *);
-int fcoe_hostlist_add(const struct fc_lport *);
-int fcoe_hostlist_remove(const struct fc_lport *);
-
-struct Scsi_Host *fcoe_host_alloc(struct scsi_host_template *, int);
+u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int);
 int fcoe_libfc_config(struct fc_lport *, struct libfc_function_template *);
 
-/* fcoe sw hba */
-int __init fcoe_sw_init(void);
-int __exit fcoe_sw_exit(void);
 #endif /* _LIBFCOE_H */
index ad8b7857855adebdac58e643428ead90c5e422c0..28ee69f9cd46d73159c362729ceb1e50c0d3cd10 100644 (file)
@@ -9,65 +9,53 @@
 
 #ifdef __KERNEL__
 
+#include <linux/tracepoint.h>
 #include <linux/types.h>
-#include <linux/marker.h>
-
-enum kmemtrace_type_id {
-       KMEMTRACE_TYPE_KMALLOC = 0,     /* kmalloc() or kfree(). */
-       KMEMTRACE_TYPE_CACHE,           /* kmem_cache_*(). */
-       KMEMTRACE_TYPE_PAGES,           /* __get_free_pages() and friends. */
-};
 
 #ifdef CONFIG_KMEMTRACE
-
 extern void kmemtrace_init(void);
-
-extern void kmemtrace_mark_alloc_node(enum kmemtrace_type_id type_id,
-                                            unsigned long call_site,
-                                            const void *ptr,
-                                            size_t bytes_req,
-                                            size_t bytes_alloc,
-                                            gfp_t gfp_flags,
-                                            int node);
-
-extern void kmemtrace_mark_free(enum kmemtrace_type_id type_id,
-                                      unsigned long call_site,
-                                      const void *ptr);
-
-#else /* CONFIG_KMEMTRACE */
-
+#else
 static inline void kmemtrace_init(void)
 {
 }
-
-static inline void kmemtrace_mark_alloc_node(enum kmemtrace_type_id type_id,
-                                            unsigned long call_site,
-                                            const void *ptr,
-                                            size_t bytes_req,
-                                            size_t bytes_alloc,
-                                            gfp_t gfp_flags,
-                                            int node)
-{
-}
-
-static inline void kmemtrace_mark_free(enum kmemtrace_type_id type_id,
-                                      unsigned long call_site,
-                                      const void *ptr)
-{
-}
-
-#endif /* CONFIG_KMEMTRACE */
-
-static inline void kmemtrace_mark_alloc(enum kmemtrace_type_id type_id,
-                                       unsigned long call_site,
-                                       const void *ptr,
-                                       size_t bytes_req,
-                                       size_t bytes_alloc,
-                                       gfp_t gfp_flags)
-{
-       kmemtrace_mark_alloc_node(type_id, call_site, ptr,
-                                 bytes_req, bytes_alloc, gfp_flags, -1);
-}
+#endif
+
+DECLARE_TRACE(kmalloc,
+             TP_PROTO(unsigned long call_site,
+                     const void *ptr,
+                     size_t bytes_req,
+                     size_t bytes_alloc,
+                     gfp_t gfp_flags),
+             TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags));
+DECLARE_TRACE(kmem_cache_alloc,
+             TP_PROTO(unsigned long call_site,
+                     const void *ptr,
+                     size_t bytes_req,
+                     size_t bytes_alloc,
+                     gfp_t gfp_flags),
+             TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags));
+DECLARE_TRACE(kmalloc_node,
+             TP_PROTO(unsigned long call_site,
+                     const void *ptr,
+                     size_t bytes_req,
+                     size_t bytes_alloc,
+                     gfp_t gfp_flags,
+                     int node),
+             TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node));
+DECLARE_TRACE(kmem_cache_alloc_node,
+             TP_PROTO(unsigned long call_site,
+                     const void *ptr,
+                     size_t bytes_req,
+                     size_t bytes_alloc,
+                     gfp_t gfp_flags,
+                     int node),
+             TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node));
+DECLARE_TRACE(kfree,
+             TP_PROTO(unsigned long call_site, const void *ptr),
+             TP_ARGS(call_site, ptr));
+DECLARE_TRACE(kmem_cache_free,
+             TP_PROTO(unsigned long call_site, const void *ptr),
+             TP_ARGS(call_site, ptr));
 
 #endif /* __KERNEL__ */
 
index 7431d9681e57280b740db748257d168077eb3e1a..befbaf0a92d83c84ec980c56bc1fce45d4f1c0f3 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef _TDFX_H
 #define _TDFX_H
 
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
+
 /* membase0 register offsets */
 #define STATUS         0x00
 #define PCIINIT0       0x04
 #define VIDCFG_PIXFMT_SHIFT             18
 #define DACMODE_2X                     BIT(0)
 
+/* I2C bit locations in the VIDSERPARPORT register */
+#define DDC_ENAB       0x00040000
+#define DDC_SCL_OUT    0x00080000
+#define DDC_SDA_OUT    0x00100000
+#define DDC_SCL_IN     0x00200000
+#define DDC_SDA_IN     0x00400000
+#define I2C_ENAB       0x00800000
+#define I2C_SCL_OUT    0x01000000
+#define I2C_SDA_OUT    0x02000000
+#define I2C_SCL_IN     0x04000000
+#define I2C_SDA_IN     0x08000000
+
 /* VGA rubbish, need to change this for multihead support */
 #define MISC_W         0x3c2
 #define MISC_R         0x3cc
@@ -168,12 +183,23 @@ struct banshee_reg {
        unsigned long miscinit0;
 };
 
+struct tdfx_par;
+
+struct tdfxfb_i2c_chan {
+       struct tdfx_par *par;
+       struct i2c_adapter adapter;
+       struct i2c_algo_bit_data algo;
+};
+
 struct tdfx_par {
        u32 max_pixclock;
        u32 palette[16];
        void __iomem *regbase_virt;
        unsigned long iobase;
        int mtrr_handle;
+#ifdef CONFIG_FB_3DFX_I2C
+       struct tdfxfb_i2c_chan chan[2];
+#endif
 };
 
 #endif /* __KERNEL__ */
index 09c79537ae095b9d76d2970a79fa242e28955da2..f2f9b5362b48eebe3c50ff0d2f91a9130da429c4 100644 (file)
@@ -208,6 +208,12 @@ config POSIX_MQUEUE
 
          If unsure, say Y.
 
+config POSIX_MQUEUE_SYSCTL
+       bool
+       depends on POSIX_MQUEUE
+       depends on SYSCTL
+       default y
+
 config BSD_PROCESS_ACCT
        bool "BSD Process Accounting"
        help
@@ -670,10 +676,10 @@ config UTS_NS
 
 config IPC_NS
        bool "IPC namespace"
-       depends on NAMESPACES && SYSVIPC
+       depends on NAMESPACES && (SYSVIPC || POSIX_MQUEUE)
        help
          In this namespace tasks work with IPC ids which correspond to
-         different IPC objects in different namespaces
+         different IPC objects in different namespaces.
 
 config USER_NS
        bool "User namespace (EXPERIMENTAL)"
@@ -1016,7 +1022,7 @@ source "arch/Kconfig"
 
 config SLOW_WORK
        default n
-       bool "Enable slow work thread pool"
+       bool
        help
          The slow work thread pool provides a number of dynamically allocated
          threads that can be used by the kernel to perform operations that
@@ -1026,6 +1032,8 @@ config SLOW_WORK
          by a series of mkdirs and a create call, all of which have to touch
          disk.
 
+         See Documentation/slow-work.txt.
+
 endmenu                # General setup
 
 config HAVE_GENERIC_DMA_COHERENT
index 65c384395801aa2e9f19ec318735b9dc35c44c42..4e1955ea815dc5ff80c887e17b626e1ccac213e2 100644 (file)
@@ -8,4 +8,5 @@ obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o
 obj_mq-$(CONFIG_COMPAT) += compat_mq.o
 obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y)
 obj-$(CONFIG_IPC_NS) += namespace.o
+obj-$(CONFIG_POSIX_MQUEUE_SYSCTL) += mq_sysctl.o
 
diff --git a/ipc/mq_sysctl.c b/ipc/mq_sysctl.c
new file mode 100644 (file)
index 0000000..89f60ec
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ *  Copyright (C) 2007 IBM Corporation
+ *
+ *  Author: Cedric Le Goater <clg@fr.ibm.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 of the
+ *  License.
+ */
+
+#include <linux/nsproxy.h>
+#include <linux/ipc_namespace.h>
+#include <linux/sysctl.h>
+
+/*
+ * Define the ranges various user-specified maximum values can
+ * be set to.
+ */
+#define MIN_MSGMAX     1               /* min value for msg_max */
+#define MAX_MSGMAX     HARD_MSGMAX     /* max value for msg_max */
+#define MIN_MSGSIZEMAX 128             /* min value for msgsize_max */
+#define MAX_MSGSIZEMAX (8192*128)      /* max value for msgsize_max */
+
+static void *get_mq(ctl_table *table)
+{
+       char *which = table->data;
+       struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
+       which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
+       return which;
+}
+
+#ifdef CONFIG_PROC_SYSCTL
+static int proc_mq_dointvec(ctl_table *table, int write, struct file *filp,
+       void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+       struct ctl_table mq_table;
+       memcpy(&mq_table, table, sizeof(mq_table));
+       mq_table.data = get_mq(table);
+
+       return proc_dointvec(&mq_table, write, filp, buffer, lenp, ppos);
+}
+
+static int proc_mq_dointvec_minmax(ctl_table *table, int write,
+       struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+       struct ctl_table mq_table;
+       memcpy(&mq_table, table, sizeof(mq_table));
+       mq_table.data = get_mq(table);
+
+       return proc_dointvec_minmax(&mq_table, write, filp, buffer,
+                                       lenp, ppos);
+}
+#else
+#define proc_mq_dointvec NULL
+#define proc_mq_dointvec_minmax NULL
+#endif
+
+static int msg_max_limit_min = MIN_MSGMAX;
+static int msg_max_limit_max = MAX_MSGMAX;
+
+static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
+static int msg_maxsize_limit_max = MAX_MSGSIZEMAX;
+
+static ctl_table mq_sysctls[] = {
+       {
+               .procname       = "queues_max",
+               .data           = &init_ipc_ns.mq_queues_max,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_mq_dointvec,
+       },
+       {
+               .procname       = "msg_max",
+               .data           = &init_ipc_ns.mq_msg_max,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_mq_dointvec_minmax,
+               .extra1         = &msg_max_limit_min,
+               .extra2         = &msg_max_limit_max,
+       },
+       {
+               .procname       = "msgsize_max",
+               .data           = &init_ipc_ns.mq_msgsize_max,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_mq_dointvec_minmax,
+               .extra1         = &msg_maxsize_limit_min,
+               .extra2         = &msg_maxsize_limit_max,
+       },
+       { .ctl_name = 0 }
+};
+
+static ctl_table mq_sysctl_dir[] = {
+       {
+               .procname       = "mqueue",
+               .mode           = 0555,
+               .child          = mq_sysctls,
+       },
+       { .ctl_name = 0 }
+};
+
+static ctl_table mq_sysctl_root[] = {
+       {
+               .ctl_name       = CTL_FS,
+               .procname       = "fs",
+               .mode           = 0555,
+               .child          = mq_sysctl_dir,
+       },
+       { .ctl_name = 0 }
+};
+
+struct ctl_table_header *mq_register_sysctl_table(void)
+{
+       return register_sysctl_table(mq_sysctl_root);
+}
index 916785363f0f104ac6820fd27dfeaba71bde2727..e35ba2c3a8d770abd7fa97403616dbd8289d26e3 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/mutex.h>
 #include <linux/nsproxy.h>
 #include <linux/pid.h>
+#include <linux/ipc_namespace.h>
 
 #include <net/sock.h>
 #include "util.h"
 #define STATE_PENDING  1
 #define STATE_READY    2
 
-/* default values */
-#define DFLT_QUEUESMAX 256     /* max number of message queues */
-#define DFLT_MSGMAX    10      /* max number of messages in each queue */
-#define HARD_MSGMAX    (131072/sizeof(void*))
-#define DFLT_MSGSIZEMAX 8192   /* max message size */
-
-/*
- * Define the ranges various user-specified maximum values can
- * be set to.
- */
-#define MIN_MSGMAX     1               /* min value for msg_max */
-#define MAX_MSGMAX     HARD_MSGMAX     /* max value for msg_max */
-#define MIN_MSGSIZEMAX 128             /* min value for msgsize_max */
-#define MAX_MSGSIZEMAX (8192*128)      /* max value for msgsize_max */
-
 struct ext_wait_queue {                /* queue of sleeping tasks */
        struct task_struct *task;
        struct list_head list;
@@ -93,14 +79,7 @@ static const struct file_operations mqueue_file_operations;
 static struct super_operations mqueue_super_ops;
 static void remove_notification(struct mqueue_inode_info *info);
 
-static spinlock_t mq_lock;
 static struct kmem_cache *mqueue_inode_cachep;
-static struct vfsmount *mqueue_mnt;
-
-static unsigned int queues_count;
-static unsigned int queues_max         = DFLT_QUEUESMAX;
-static unsigned int msg_max    = DFLT_MSGMAX;
-static unsigned int msgsize_max = DFLT_MSGSIZEMAX;
 
 static struct ctl_table_header * mq_sysctl_table;
 
@@ -109,8 +88,27 @@ static inline struct mqueue_inode_info *MQUEUE_I(struct inode *inode)
        return container_of(inode, struct mqueue_inode_info, vfs_inode);
 }
 
-static struct inode *mqueue_get_inode(struct super_block *sb, int mode,
-                                                       struct mq_attr *attr)
+/*
+ * This routine should be called with the mq_lock held.
+ */
+static inline struct ipc_namespace *__get_ns_from_inode(struct inode *inode)
+{
+       return get_ipc_ns(inode->i_sb->s_fs_info);
+}
+
+static struct ipc_namespace *get_ns_from_inode(struct inode *inode)
+{
+       struct ipc_namespace *ns;
+
+       spin_lock(&mq_lock);
+       ns = __get_ns_from_inode(inode);
+       spin_unlock(&mq_lock);
+       return ns;
+}
+
+static struct inode *mqueue_get_inode(struct super_block *sb,
+               struct ipc_namespace *ipc_ns, int mode,
+               struct mq_attr *attr)
 {
        struct user_struct *u = current_user();
        struct inode *inode;
@@ -141,8 +139,8 @@ static struct inode *mqueue_get_inode(struct super_block *sb, int mode,
                        info->qsize = 0;
                        info->user = NULL;      /* set when all is ok */
                        memset(&info->attr, 0, sizeof(info->attr));
-                       info->attr.mq_maxmsg = msg_max;
-                       info->attr.mq_msgsize = msgsize_max;
+                       info->attr.mq_maxmsg = ipc_ns->mq_msg_max;
+                       info->attr.mq_msgsize = ipc_ns->mq_msgsize_max;
                        if (attr) {
                                info->attr.mq_maxmsg = attr->mq_maxmsg;
                                info->attr.mq_msgsize = attr->mq_msgsize;
@@ -188,30 +186,38 @@ out_inode:
 static int mqueue_fill_super(struct super_block *sb, void *data, int silent)
 {
        struct inode *inode;
+       struct ipc_namespace *ns = data;
+       int error = 0;
 
        sb->s_blocksize = PAGE_CACHE_SIZE;
        sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
        sb->s_magic = MQUEUE_MAGIC;
        sb->s_op = &mqueue_super_ops;
 
-       inode = mqueue_get_inode(sb, S_IFDIR | S_ISVTX | S_IRWXUGO, NULL);
-       if (!inode)
-               return -ENOMEM;
+       inode = mqueue_get_inode(sb, ns, S_IFDIR | S_ISVTX | S_IRWXUGO,
+                               NULL);
+       if (!inode) {
+               error = -ENOMEM;
+               goto out;
+       }
 
        sb->s_root = d_alloc_root(inode);
        if (!sb->s_root) {
                iput(inode);
-               return -ENOMEM;
+               error = -ENOMEM;
        }
 
-       return 0;
+out:
+       return error;
 }
 
 static int mqueue_get_sb(struct file_system_type *fs_type,
                         int flags, const char *dev_name,
                         void *data, struct vfsmount *mnt)
 {
-       return get_sb_single(fs_type, flags, data, mqueue_fill_super, mnt);
+       if (!(flags & MS_KERNMOUNT))
+               data = current->nsproxy->ipc_ns;
+       return get_sb_ns(fs_type, flags, data, mqueue_fill_super, mnt);
 }
 
 static void init_once(void *foo)
@@ -242,11 +248,13 @@ static void mqueue_delete_inode(struct inode *inode)
        struct user_struct *user;
        unsigned long mq_bytes;
        int i;
+       struct ipc_namespace *ipc_ns;
 
        if (S_ISDIR(inode->i_mode)) {
                clear_inode(inode);
                return;
        }
+       ipc_ns = get_ns_from_inode(inode);
        info = MQUEUE_I(inode);
        spin_lock(&info->lock);
        for (i = 0; i < info->attr.mq_curmsgs; i++)
@@ -262,10 +270,19 @@ static void mqueue_delete_inode(struct inode *inode)
        if (user) {
                spin_lock(&mq_lock);
                user->mq_bytes -= mq_bytes;
-               queues_count--;
+               /*
+                * get_ns_from_inode() ensures that the
+                * (ipc_ns = sb->s_fs_info) is either a valid ipc_ns
+                * to which we now hold a reference, or it is NULL.
+                * We can't put it here under mq_lock, though.
+                */
+               if (ipc_ns)
+                       ipc_ns->mq_queues_count--;
                spin_unlock(&mq_lock);
                free_uid(user);
        }
+       if (ipc_ns)
+               put_ipc_ns(ipc_ns);
 }
 
 static int mqueue_create(struct inode *dir, struct dentry *dentry,
@@ -274,31 +291,41 @@ static int mqueue_create(struct inode *dir, struct dentry *dentry,
        struct inode *inode;
        struct mq_attr *attr = dentry->d_fsdata;
        int error;
+       struct ipc_namespace *ipc_ns;
 
        spin_lock(&mq_lock);
-       if (queues_count >= queues_max && !capable(CAP_SYS_RESOURCE)) {
+       ipc_ns = __get_ns_from_inode(dir);
+       if (!ipc_ns) {
+               error = -EACCES;
+               goto out_unlock;
+       }
+       if (ipc_ns->mq_queues_count >= ipc_ns->mq_queues_max &&
+                       !capable(CAP_SYS_RESOURCE)) {
                error = -ENOSPC;
-               goto out_lock;
+               goto out_unlock;
        }
-       queues_count++;
+       ipc_ns->mq_queues_count++;
        spin_unlock(&mq_lock);
 
-       inode = mqueue_get_inode(dir->i_sb, mode, attr);
+       inode = mqueue_get_inode(dir->i_sb, ipc_ns, mode, attr);
        if (!inode) {
                error = -ENOMEM;
                spin_lock(&mq_lock);
-               queues_count--;
-               goto out_lock;
+               ipc_ns->mq_queues_count--;
+               goto out_unlock;
        }
 
+       put_ipc_ns(ipc_ns);
        dir->i_size += DIRENT_SIZE;
        dir->i_ctime = dir->i_mtime = dir->i_atime = CURRENT_TIME;
 
        d_instantiate(dentry, inode);
        dget(dentry);
        return 0;
-out_lock:
+out_unlock:
        spin_unlock(&mq_lock);
+       if (ipc_ns)
+               put_ipc_ns(ipc_ns);
        return error;
 }
 
@@ -562,7 +589,7 @@ static void remove_notification(struct mqueue_inode_info *info)
        info->notify_owner = NULL;
 }
 
-static int mq_attr_ok(struct mq_attr *attr)
+static int mq_attr_ok(struct ipc_namespace *ipc_ns, struct mq_attr *attr)
 {
        if (attr->mq_maxmsg <= 0 || attr->mq_msgsize <= 0)
                return 0;
@@ -570,8 +597,8 @@ static int mq_attr_ok(struct mq_attr *attr)
                if (attr->mq_maxmsg > HARD_MSGMAX)
                        return 0;
        } else {
-               if (attr->mq_maxmsg > msg_max ||
-                               attr->mq_msgsize > msgsize_max)
+               if (attr->mq_maxmsg > ipc_ns->mq_msg_max ||
+                               attr->mq_msgsize > ipc_ns->mq_msgsize_max)
                        return 0;
        }
        /* check for overflow */
@@ -587,8 +614,9 @@ static int mq_attr_ok(struct mq_attr *attr)
 /*
  * Invoked when creating a new queue via sys_mq_open
  */
-static struct file *do_create(struct dentry *dir, struct dentry *dentry,
-                       int oflag, mode_t mode, struct mq_attr *attr)
+static struct file *do_create(struct ipc_namespace *ipc_ns, struct dentry *dir,
+                       struct dentry *dentry, int oflag, mode_t mode,
+                       struct mq_attr *attr)
 {
        const struct cred *cred = current_cred();
        struct file *result;
@@ -596,14 +624,14 @@ static struct file *do_create(struct dentry *dir, struct dentry *dentry,
 
        if (attr) {
                ret = -EINVAL;
-               if (!mq_attr_ok(attr))
+               if (!mq_attr_ok(ipc_ns, attr))
                        goto out;
                /* store for use during create */
                dentry->d_fsdata = attr;
        }
 
        mode &= ~current_umask();
-       ret = mnt_want_write(mqueue_mnt);
+       ret = mnt_want_write(ipc_ns->mq_mnt);
        if (ret)
                goto out;
        ret = vfs_create(dir->d_inode, dentry, mode, NULL);
@@ -611,24 +639,25 @@ static struct file *do_create(struct dentry *dir, struct dentry *dentry,
        if (ret)
                goto out_drop_write;
 
-       result = dentry_open(dentry, mqueue_mnt, oflag, cred);
+       result = dentry_open(dentry, ipc_ns->mq_mnt, oflag, cred);
        /*
         * dentry_open() took a persistent mnt_want_write(),
         * so we can now drop this one.
         */
-       mnt_drop_write(mqueue_mnt);
+       mnt_drop_write(ipc_ns->mq_mnt);
        return result;
 
 out_drop_write:
-       mnt_drop_write(mqueue_mnt);
+       mnt_drop_write(ipc_ns->mq_mnt);
 out:
        dput(dentry);
-       mntput(mqueue_mnt);
+       mntput(ipc_ns->mq_mnt);
        return ERR_PTR(ret);
 }
 
 /* Opens existing queue */
-static struct file *do_open(struct dentry *dentry, int oflag)
+static struct file *do_open(struct ipc_namespace *ipc_ns,
+                               struct dentry *dentry, int oflag)
 {
        const struct cred *cred = current_cred();
 
@@ -637,17 +666,17 @@ static struct file *do_open(struct dentry *dentry, int oflag)
 
        if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) {
                dput(dentry);
-               mntput(mqueue_mnt);
+               mntput(ipc_ns->mq_mnt);
                return ERR_PTR(-EINVAL);
        }
 
        if (inode_permission(dentry->d_inode, oflag2acc[oflag & O_ACCMODE])) {
                dput(dentry);
-               mntput(mqueue_mnt);
+               mntput(ipc_ns->mq_mnt);
                return ERR_PTR(-EACCES);
        }
 
-       return dentry_open(dentry, mqueue_mnt, oflag, cred);
+       return dentry_open(dentry, ipc_ns->mq_mnt, oflag, cred);
 }
 
 SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
@@ -658,6 +687,7 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
        char *name;
        struct mq_attr attr;
        int fd, error;
+       struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
 
        if (u_attr && copy_from_user(&attr, u_attr, sizeof(struct mq_attr)))
                return -EFAULT;
@@ -671,13 +701,13 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
        if (fd < 0)
                goto out_putname;
 
-       mutex_lock(&mqueue_mnt->mnt_root->d_inode->i_mutex);
-       dentry = lookup_one_len(name, mqueue_mnt->mnt_root, strlen(name));
+       mutex_lock(&ipc_ns->mq_mnt->mnt_root->d_inode->i_mutex);
+       dentry = lookup_one_len(name, ipc_ns->mq_mnt->mnt_root, strlen(name));
        if (IS_ERR(dentry)) {
                error = PTR_ERR(dentry);
                goto out_err;
        }
-       mntget(mqueue_mnt);
+       mntget(ipc_ns->mq_mnt);
 
        if (oflag & O_CREAT) {
                if (dentry->d_inode) {  /* entry already exists */
@@ -685,10 +715,10 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
                        error = -EEXIST;
                        if (oflag & O_EXCL)
                                goto out;
-                       filp = do_open(dentry, oflag);
+                       filp = do_open(ipc_ns, dentry, oflag);
                } else {
-                       filp = do_create(mqueue_mnt->mnt_root, dentry,
-                                               oflag, mode,
+                       filp = do_create(ipc_ns, ipc_ns->mq_mnt->mnt_root,
+                                               dentry, oflag, mode,
                                                u_attr ? &attr : NULL);
                }
        } else {
@@ -696,7 +726,7 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
                if (!dentry->d_inode)
                        goto out;
                audit_inode(name, dentry);
-               filp = do_open(dentry, oflag);
+               filp = do_open(ipc_ns, dentry, oflag);
        }
 
        if (IS_ERR(filp)) {
@@ -709,13 +739,13 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
 
 out:
        dput(dentry);
-       mntput(mqueue_mnt);
+       mntput(ipc_ns->mq_mnt);
 out_putfd:
        put_unused_fd(fd);
 out_err:
        fd = error;
 out_upsem:
-       mutex_unlock(&mqueue_mnt->mnt_root->d_inode->i_mutex);
+       mutex_unlock(&ipc_ns->mq_mnt->mnt_root->d_inode->i_mutex);
 out_putname:
        putname(name);
        return fd;
@@ -727,14 +757,15 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name)
        char *name;
        struct dentry *dentry;
        struct inode *inode = NULL;
+       struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
 
        name = getname(u_name);
        if (IS_ERR(name))
                return PTR_ERR(name);
 
-       mutex_lock_nested(&mqueue_mnt->mnt_root->d_inode->i_mutex,
+       mutex_lock_nested(&ipc_ns->mq_mnt->mnt_root->d_inode->i_mutex,
                        I_MUTEX_PARENT);
-       dentry = lookup_one_len(name, mqueue_mnt->mnt_root, strlen(name));
+       dentry = lookup_one_len(name, ipc_ns->mq_mnt->mnt_root, strlen(name));
        if (IS_ERR(dentry)) {
                err = PTR_ERR(dentry);
                goto out_unlock;
@@ -748,16 +779,16 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name)
        inode = dentry->d_inode;
        if (inode)
                atomic_inc(&inode->i_count);
-       err = mnt_want_write(mqueue_mnt);
+       err = mnt_want_write(ipc_ns->mq_mnt);
        if (err)
                goto out_err;
        err = vfs_unlink(dentry->d_parent->d_inode, dentry);
-       mnt_drop_write(mqueue_mnt);
+       mnt_drop_write(ipc_ns->mq_mnt);
 out_err:
        dput(dentry);
 
 out_unlock:
-       mutex_unlock(&mqueue_mnt->mnt_root->d_inode->i_mutex);
+       mutex_unlock(&ipc_ns->mq_mnt->mnt_root->d_inode->i_mutex);
        putname(name);
        if (inode)
                iput(inode);
@@ -1205,59 +1236,31 @@ static struct file_system_type mqueue_fs_type = {
        .kill_sb = kill_litter_super,
 };
 
-static int msg_max_limit_min = MIN_MSGMAX;
-static int msg_max_limit_max = MAX_MSGMAX;
-
-static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
-static int msg_maxsize_limit_max = MAX_MSGSIZEMAX;
-
-static ctl_table mq_sysctls[] = {
-       {
-               .procname       = "queues_max",
-               .data           = &queues_max,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = &proc_dointvec,
-       },
-       {
-               .procname       = "msg_max",
-               .data           = &msg_max,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = &proc_dointvec_minmax,
-               .extra1         = &msg_max_limit_min,
-               .extra2         = &msg_max_limit_max,
-       },
-       {
-               .procname       = "msgsize_max",
-               .data           = &msgsize_max,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = &proc_dointvec_minmax,
-               .extra1         = &msg_maxsize_limit_min,
-               .extra2         = &msg_maxsize_limit_max,
-       },
-       { .ctl_name = 0 }
-};
+int mq_init_ns(struct ipc_namespace *ns)
+{
+       ns->mq_queues_count  = 0;
+       ns->mq_queues_max    = DFLT_QUEUESMAX;
+       ns->mq_msg_max       = DFLT_MSGMAX;
+       ns->mq_msgsize_max   = DFLT_MSGSIZEMAX;
+
+       ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns);
+       if (IS_ERR(ns->mq_mnt)) {
+               int err = PTR_ERR(ns->mq_mnt);
+               ns->mq_mnt = NULL;
+               return err;
+       }
+       return 0;
+}
 
-static ctl_table mq_sysctl_dir[] = {
-       {
-               .procname       = "mqueue",
-               .mode           = 0555,
-               .child          = mq_sysctls,
-       },
-       { .ctl_name = 0 }
-};
+void mq_clear_sbinfo(struct ipc_namespace *ns)
+{
+       ns->mq_mnt->mnt_sb->s_fs_info = NULL;
+}
 
-static ctl_table mq_sysctl_root[] = {
-       {
-               .ctl_name       = CTL_FS,
-               .procname       = "fs",
-               .mode           = 0555,
-               .child          = mq_sysctl_dir,
-       },
-       { .ctl_name = 0 }
-};
+void mq_put_mnt(struct ipc_namespace *ns)
+{
+       mntput(ns->mq_mnt);
+}
 
 static int __init init_mqueue_fs(void)
 {
@@ -1270,21 +1273,20 @@ static int __init init_mqueue_fs(void)
                return -ENOMEM;
 
        /* ignore failues - they are not fatal */
-       mq_sysctl_table = register_sysctl_table(mq_sysctl_root);
+       mq_sysctl_table = mq_register_sysctl_table();
 
        error = register_filesystem(&mqueue_fs_type);
        if (error)
                goto out_sysctl;
 
-       if (IS_ERR(mqueue_mnt = kern_mount(&mqueue_fs_type))) {
-               error = PTR_ERR(mqueue_mnt);
+       spin_lock_init(&mq_lock);
+
+       init_ipc_ns.mq_mnt = kern_mount_data(&mqueue_fs_type, &init_ipc_ns);
+       if (IS_ERR(init_ipc_ns.mq_mnt)) {
+               error = PTR_ERR(init_ipc_ns.mq_mnt);
                goto out_filesystem;
        }
 
-       /* internal initialization - not common for vfs */
-       queues_count = 0;
-       spin_lock_init(&mq_lock);
-
        return 0;
 
 out_filesystem:
index c82c215693d7c9c54ae93dfa90d7f162085900d5..f095ee26883333fcc69d7c32e907a8f1949e2f3f 100644 (file)
 #include <linux/security.h>
 #include <linux/slab.h>
 #include <linux/ipc.h>
+#include <linux/ipc_namespace.h>
 #include <asm/uaccess.h>
 
 #include "util.h"
 
+DEFINE_SPINLOCK(mq_lock);
+
+/*
+ * The next 2 defines are here bc this is the only file
+ * compiled when either CONFIG_SYSVIPC and CONFIG_POSIX_MQUEUE
+ * and not CONFIG_IPC_NS.
+ */
+struct ipc_namespace init_ipc_ns = {
+       .count          = ATOMIC_INIT(1),
+#ifdef CONFIG_POSIX_MQUEUE
+       .mq_queues_max   = DFLT_QUEUESMAX,
+       .mq_msg_max      = DFLT_MSGMAX,
+       .mq_msgsize_max  = DFLT_MSGSIZEMAX,
+#endif
+};
+
+atomic_t nr_ipc_ns = ATOMIC_INIT(1);
+
 struct msg_msgseg {
        struct msg_msgseg* next;
        /* the next part of the message follows immediately */
index 9171d948751e72c6c0c8fa1b8e60688ba4384a0c..4a5e752a92766d6e578c5c94499bdd71e60cbaf5 100644 (file)
@@ -9,17 +9,26 @@
 #include <linux/rcupdate.h>
 #include <linux/nsproxy.h>
 #include <linux/slab.h>
+#include <linux/fs.h>
+#include <linux/mount.h>
 
 #include "util.h"
 
 static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns)
 {
        struct ipc_namespace *ns;
+       int err;
 
        ns = kmalloc(sizeof(struct ipc_namespace), GFP_KERNEL);
        if (ns == NULL)
                return ERR_PTR(-ENOMEM);
 
+       atomic_set(&ns->count, 1);
+       err = mq_init_ns(ns);
+       if (err) {
+               kfree(ns);
+               return ERR_PTR(err);
+       }
        atomic_inc(&nr_ipc_ns);
 
        sem_init_ns(ns);
@@ -34,7 +43,6 @@ static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns)
        ipcns_notify(IPCNS_CREATED);
        register_ipcns_notifier(ns);
 
-       kref_init(&ns->kref);
        return ns;
 }
 
@@ -84,11 +92,34 @@ void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
        up_write(&ids->rw_mutex);
 }
 
-void free_ipc_ns(struct kref *kref)
+/*
+ * put_ipc_ns - drop a reference to an ipc namespace.
+ * @ns: the namespace to put
+ *
+ * If this is the last task in the namespace exiting, and
+ * it is dropping the refcount to 0, then it can race with
+ * a task in another ipc namespace but in a mounts namespace
+ * which has this ipcns's mqueuefs mounted, doing some action
+ * with one of the mqueuefs files.  That can raise the refcount.
+ * So dropping the refcount, and raising the refcount when
+ * accessing it through the VFS, are protected with mq_lock.
+ *
+ * (Clearly, a task raising the refcount on its own ipc_ns
+ * needn't take mq_lock since it can't race with the last task
+ * in the ipcns exiting).
+ */
+void put_ipc_ns(struct ipc_namespace *ns)
 {
-       struct ipc_namespace *ns;
+       if (atomic_dec_and_lock(&ns->count, &mq_lock)) {
+               mq_clear_sbinfo(ns);
+               spin_unlock(&mq_lock);
+               mq_put_mnt(ns);
+               free_ipc_ns(ns);
+       }
+}
 
-       ns = container_of(kref, struct ipc_namespace, kref);
+void free_ipc_ns(struct ipc_namespace *ns)
+{
        /*
         * Unregistering the hotplug notifier at the beginning guarantees
         * that the ipc namespace won't be freed while we are inside the
index 7585a72e259b7de40ecebcabb5d5c6c0040ad024..b8e4ba92f6d12a6384c4a2fce9859ba064d21810 100644 (file)
@@ -47,15 +47,6 @@ struct ipc_proc_iface {
        int (*show)(struct seq_file *, void *);
 };
 
-struct ipc_namespace init_ipc_ns = {
-       .kref = {
-               .refcount       = ATOMIC_INIT(2),
-       },
-};
-
-atomic_t nr_ipc_ns = ATOMIC_INIT(1);
-
-
 #ifdef CONFIG_MEMORY_HOTPLUG
 
 static void ipc_memory_notifier(struct work_struct *work)
index 3646b45a03c9366d0c1e9b25c950e0edcbaedeef..1187332a89d2e54143b953dc1b63af829b9ee592 100644 (file)
@@ -20,6 +20,15 @@ void shm_init (void);
 
 struct ipc_namespace;
 
+#ifdef CONFIG_POSIX_MQUEUE
+extern void mq_clear_sbinfo(struct ipc_namespace *ns);
+extern void mq_put_mnt(struct ipc_namespace *ns);
+#else
+static inline void mq_clear_sbinfo(struct ipc_namespace *ns) { }
+static inline void mq_put_mnt(struct ipc_namespace *ns) { }
+#endif
+
+#ifdef CONFIG_SYSVIPC
 void sem_init_ns(struct ipc_namespace *ns);
 void msg_init_ns(struct ipc_namespace *ns);
 void shm_init_ns(struct ipc_namespace *ns);
@@ -27,6 +36,15 @@ void shm_init_ns(struct ipc_namespace *ns);
 void sem_exit_ns(struct ipc_namespace *ns);
 void msg_exit_ns(struct ipc_namespace *ns);
 void shm_exit_ns(struct ipc_namespace *ns);
+#else
+static inline void sem_init_ns(struct ipc_namespace *ns) { }
+static inline void msg_init_ns(struct ipc_namespace *ns) { }
+static inline void shm_init_ns(struct ipc_namespace *ns) { }
+
+static inline void sem_exit_ns(struct ipc_namespace *ns) { }
+static inline void msg_exit_ns(struct ipc_namespace *ns) { }
+static inline void shm_exit_ns(struct ipc_namespace *ns) { }
+#endif
 
 /*
  * Structure that holds the parameters needed by the ipc operations
index 6686ed1e4aa3aedd25a613d3ad7282798392f224..32cbf2607cb0dab54f8463196aca522b29a624a5 100644 (file)
@@ -837,8 +837,7 @@ static void exit_notify(struct task_struct *tsk, int group_dead)
         */
        if (tsk->exit_signal != SIGCHLD && !task_detached(tsk) &&
            (tsk->parent_exec_id != tsk->real_parent->self_exec_id ||
-            tsk->self_exec_id != tsk->parent_exec_id) &&
-           !capable(CAP_KILL))
+            tsk->self_exec_id != tsk->parent_exec_id))
                tsk->exit_signal = SIGCHLD;
 
        signal = tracehook_notify_death(tsk, &cookie, group_dead);
index f394d2a42ca3442a048d6c9586ec8bfd6cfe4487..cb8a15c1958318c52c116d08e33003ad2ea0cc98 100644 (file)
@@ -651,14 +651,20 @@ static inline void hrtimer_init_timer_hres(struct hrtimer *timer)
  * and expiry check is done in the hrtimer_interrupt or in the softirq.
  */
 static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer,
-                                           struct hrtimer_clock_base *base)
+                                           struct hrtimer_clock_base *base,
+                                           int wakeup)
 {
        if (base->cpu_base->hres_active && hrtimer_reprogram(timer, base)) {
-               spin_unlock(&base->cpu_base->lock);
-               raise_softirq_irqoff(HRTIMER_SOFTIRQ);
-               spin_lock(&base->cpu_base->lock);
+               if (wakeup) {
+                       spin_unlock(&base->cpu_base->lock);
+                       raise_softirq_irqoff(HRTIMER_SOFTIRQ);
+                       spin_lock(&base->cpu_base->lock);
+               } else
+                       __raise_softirq_irqoff(HRTIMER_SOFTIRQ);
+
                return 1;
        }
+
        return 0;
 }
 
@@ -703,7 +709,8 @@ static inline int hrtimer_is_hres_enabled(void) { return 0; }
 static inline int hrtimer_switch_to_hres(void) { return 0; }
 static inline void hrtimer_force_reprogram(struct hrtimer_cpu_base *base) { }
 static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer,
-                                           struct hrtimer_clock_base *base)
+                                           struct hrtimer_clock_base *base,
+                                           int wakeup)
 {
        return 0;
 }
@@ -886,20 +893,9 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base)
        return 0;
 }
 
-/**
- * hrtimer_start_range_ns - (re)start an hrtimer on the current CPU
- * @timer:     the timer to be added
- * @tim:       expiry time
- * @delta_ns:  "slack" range for the timer
- * @mode:      expiry mode: absolute (HRTIMER_ABS) or relative (HRTIMER_REL)
- *
- * Returns:
- *  0 on success
- *  1 when the timer was active
- */
-int
-hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, unsigned long delta_ns,
-                       const enum hrtimer_mode mode)
+int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
+               unsigned long delta_ns, const enum hrtimer_mode mode,
+               int wakeup)
 {
        struct hrtimer_clock_base *base, *new_base;
        unsigned long flags;
@@ -940,12 +936,29 @@ hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, unsigned long delta_n
         * XXX send_remote_softirq() ?
         */
        if (leftmost && new_base->cpu_base == &__get_cpu_var(hrtimer_bases))
-               hrtimer_enqueue_reprogram(timer, new_base);
+               hrtimer_enqueue_reprogram(timer, new_base, wakeup);
 
        unlock_hrtimer_base(timer, &flags);
 
        return ret;
 }
+
+/**
+ * hrtimer_start_range_ns - (re)start an hrtimer on the current CPU
+ * @timer:     the timer to be added
+ * @tim:       expiry time
+ * @delta_ns:  "slack" range for the timer
+ * @mode:      expiry mode: absolute (HRTIMER_ABS) or relative (HRTIMER_REL)
+ *
+ * Returns:
+ *  0 on success
+ *  1 when the timer was active
+ */
+int hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
+               unsigned long delta_ns, const enum hrtimer_mode mode)
+{
+       return __hrtimer_start_range_ns(timer, tim, delta_ns, mode, 1);
+}
 EXPORT_SYMBOL_GPL(hrtimer_start_range_ns);
 
 /**
@@ -961,7 +974,7 @@ EXPORT_SYMBOL_GPL(hrtimer_start_range_ns);
 int
 hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode)
 {
-       return hrtimer_start_range_ns(timer, tim, 0, mode);
+       return __hrtimer_start_range_ns(timer, tim, 0, mode, 1);
 }
 EXPORT_SYMBOL_GPL(hrtimer_start);
 
index 5016bfb682b9c54393d017ee1a070515191c05c9..a5e74ddee0e2f3a9937e46e95eae61e9b44b8746 100644 (file)
@@ -68,7 +68,7 @@ static struct hlist_head kprobe_table[KPROBE_TABLE_SIZE];
 static struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE];
 
 /* NOTE: change this value only with kprobe_mutex held */
-static bool kprobe_enabled;
+static bool kprobes_all_disarmed;
 
 static DEFINE_MUTEX(kprobe_mutex);     /* Protects kprobe_table */
 static DEFINE_PER_CPU(struct kprobe *, kprobe_instance) = NULL;
@@ -328,7 +328,7 @@ static int __kprobes aggr_pre_handler(struct kprobe *p, struct pt_regs *regs)
        struct kprobe *kp;
 
        list_for_each_entry_rcu(kp, &p->list, list) {
-               if (kp->pre_handler && !kprobe_gone(kp)) {
+               if (kp->pre_handler && likely(!kprobe_disabled(kp))) {
                        set_kprobe_instance(kp);
                        if (kp->pre_handler(kp, regs))
                                return 1;
@@ -344,7 +344,7 @@ static void __kprobes aggr_post_handler(struct kprobe *p, struct pt_regs *regs,
        struct kprobe *kp;
 
        list_for_each_entry_rcu(kp, &p->list, list) {
-               if (kp->post_handler && !kprobe_gone(kp)) {
+               if (kp->post_handler && likely(!kprobe_disabled(kp))) {
                        set_kprobe_instance(kp);
                        kp->post_handler(kp, regs, flags);
                        reset_kprobe_instance();
@@ -518,20 +518,28 @@ static inline void copy_kprobe(struct kprobe *old_p, struct kprobe *p)
 }
 
 /*
-* Add the new probe to old_p->list. Fail if this is the
+* Add the new probe to ap->list. Fail if this is the
 * second jprobe at the address - two jprobes can't coexist
 */
-static int __kprobes add_new_kprobe(struct kprobe *old_p, struct kprobe *p)
+static int __kprobes add_new_kprobe(struct kprobe *ap, struct kprobe *p)
 {
+       BUG_ON(kprobe_gone(ap) || kprobe_gone(p));
        if (p->break_handler) {
-               if (old_p->break_handler)
+               if (ap->break_handler)
                        return -EEXIST;
-               list_add_tail_rcu(&p->list, &old_p->list);
-               old_p->break_handler = aggr_break_handler;
+               list_add_tail_rcu(&p->list, &ap->list);
+               ap->break_handler = aggr_break_handler;
        } else
-               list_add_rcu(&p->list, &old_p->list);
-       if (p->post_handler && !old_p->post_handler)
-               old_p->post_handler = aggr_post_handler;
+               list_add_rcu(&p->list, &ap->list);
+       if (p->post_handler && !ap->post_handler)
+               ap->post_handler = aggr_post_handler;
+
+       if (kprobe_disabled(ap) && !kprobe_disabled(p)) {
+               ap->flags &= ~KPROBE_FLAG_DISABLED;
+               if (!kprobes_all_disarmed)
+                       /* Arm the breakpoint again. */
+                       arch_arm_kprobe(ap);
+       }
        return 0;
 }
 
@@ -544,6 +552,7 @@ static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p)
        copy_kprobe(p, ap);
        flush_insn_slot(ap);
        ap->addr = p->addr;
+       ap->flags = p->flags;
        ap->pre_handler = aggr_pre_handler;
        ap->fault_handler = aggr_fault_handler;
        /* We don't care the kprobe which has gone. */
@@ -566,44 +575,59 @@ static int __kprobes register_aggr_kprobe(struct kprobe *old_p,
                                          struct kprobe *p)
 {
        int ret = 0;
-       struct kprobe *ap;
+       struct kprobe *ap = old_p;
 
-       if (kprobe_gone(old_p)) {
+       if (old_p->pre_handler != aggr_pre_handler) {
+               /* If old_p is not an aggr_probe, create new aggr_kprobe. */
+               ap = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
+               if (!ap)
+                       return -ENOMEM;
+               add_aggr_kprobe(ap, old_p);
+       }
+
+       if (kprobe_gone(ap)) {
                /*
                 * Attempting to insert new probe at the same location that
                 * had a probe in the module vaddr area which already
                 * freed. So, the instruction slot has already been
                 * released. We need a new slot for the new probe.
                 */
-               ret = arch_prepare_kprobe(old_p);
+               ret = arch_prepare_kprobe(ap);
                if (ret)
+                       /*
+                        * Even if fail to allocate new slot, don't need to
+                        * free aggr_probe. It will be used next time, or
+                        * freed by unregister_kprobe.
+                        */
                        return ret;
-       }
-       if (old_p->pre_handler == aggr_pre_handler) {
-               copy_kprobe(old_p, p);
-               ret = add_new_kprobe(old_p, p);
-               ap = old_p;
-       } else {
-               ap = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
-               if (!ap) {
-                       if (kprobe_gone(old_p))
-                               arch_remove_kprobe(old_p);
-                       return -ENOMEM;
-               }
-               add_aggr_kprobe(ap, old_p);
-               copy_kprobe(ap, p);
-               ret = add_new_kprobe(ap, p);
-       }
-       if (kprobe_gone(old_p)) {
+
                /*
-                * If the old_p has gone, its breakpoint has been disarmed.
-                * We have to arm it again after preparing real kprobes.
+                * Clear gone flag to prevent allocating new slot again, and
+                * set disabled flag because it is not armed yet.
                 */
-               ap->flags &= ~KPROBE_FLAG_GONE;
-               if (kprobe_enabled)
-                       arch_arm_kprobe(ap);
+               ap->flags = (ap->flags & ~KPROBE_FLAG_GONE)
+                           | KPROBE_FLAG_DISABLED;
        }
-       return ret;
+
+       copy_kprobe(ap, p);
+       return add_new_kprobe(ap, p);
+}
+
+/* Try to disable aggr_kprobe, and return 1 if succeeded.*/
+static int __kprobes try_to_disable_aggr_kprobe(struct kprobe *p)
+{
+       struct kprobe *kp;
+
+       list_for_each_entry_rcu(kp, &p->list, list) {
+               if (!kprobe_disabled(kp))
+                       /*
+                        * There is an active probe on the list.
+                        * We can't disable aggr_kprobe.
+                        */
+                       return 0;
+       }
+       p->flags |= KPROBE_FLAG_DISABLED;
+       return 1;
 }
 
 static int __kprobes in_kprobes_functions(unsigned long addr)
@@ -664,7 +688,9 @@ int __kprobes register_kprobe(struct kprobe *p)
                return -EINVAL;
        }
 
-       p->flags = 0;
+       /* User can pass only KPROBE_FLAG_DISABLED to register_kprobe */
+       p->flags &= KPROBE_FLAG_DISABLED;
+
        /*
         * Check if are we probing a module.
         */
@@ -709,7 +735,7 @@ int __kprobes register_kprobe(struct kprobe *p)
        hlist_add_head_rcu(&p->hlist,
                       &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]);
 
-       if (kprobe_enabled)
+       if (!kprobes_all_disarmed && !kprobe_disabled(p))
                arch_arm_kprobe(p);
 
 out_unlock_text:
@@ -722,26 +748,39 @@ out:
 
        return ret;
 }
+EXPORT_SYMBOL_GPL(register_kprobe);
 
-/*
- * Unregister a kprobe without a scheduler synchronization.
- */
-static int __kprobes __unregister_kprobe_top(struct kprobe *p)
+/* Check passed kprobe is valid and return kprobe in kprobe_table. */
+static struct kprobe * __kprobes __get_valid_kprobe(struct kprobe *p)
 {
        struct kprobe *old_p, *list_p;
 
        old_p = get_kprobe(p->addr);
        if (unlikely(!old_p))
-               return -EINVAL;
+               return NULL;
 
        if (p != old_p) {
                list_for_each_entry_rcu(list_p, &old_p->list, list)
                        if (list_p == p)
                        /* kprobe p is a valid probe */
-                               goto valid_p;
-               return -EINVAL;
+                               goto valid;
+               return NULL;
        }
-valid_p:
+valid:
+       return old_p;
+}
+
+/*
+ * Unregister a kprobe without a scheduler synchronization.
+ */
+static int __kprobes __unregister_kprobe_top(struct kprobe *p)
+{
+       struct kprobe *old_p, *list_p;
+
+       old_p = __get_valid_kprobe(p);
+       if (old_p == NULL)
+               return -EINVAL;
+
        if (old_p == p ||
            (old_p->pre_handler == aggr_pre_handler &&
             list_is_singular(&old_p->list))) {
@@ -750,7 +789,7 @@ valid_p:
                 * enabled and not gone - otherwise, the breakpoint would
                 * already have been removed. We save on flushing icache.
                 */
-               if (kprobe_enabled && !kprobe_gone(old_p)) {
+               if (!kprobes_all_disarmed && !kprobe_disabled(old_p)) {
                        mutex_lock(&text_mutex);
                        arch_disarm_kprobe(p);
                        mutex_unlock(&text_mutex);
@@ -768,6 +807,11 @@ valid_p:
                }
 noclean:
                list_del_rcu(&p->list);
+               if (!kprobe_disabled(old_p)) {
+                       try_to_disable_aggr_kprobe(old_p);
+                       if (!kprobes_all_disarmed && kprobe_disabled(old_p))
+                               arch_disarm_kprobe(old_p);
+               }
        }
        return 0;
 }
@@ -803,11 +847,13 @@ int __kprobes register_kprobes(struct kprobe **kps, int num)
        }
        return ret;
 }
+EXPORT_SYMBOL_GPL(register_kprobes);
 
 void __kprobes unregister_kprobe(struct kprobe *p)
 {
        unregister_kprobes(&p, 1);
 }
+EXPORT_SYMBOL_GPL(unregister_kprobe);
 
 void __kprobes unregister_kprobes(struct kprobe **kps, int num)
 {
@@ -826,6 +872,7 @@ void __kprobes unregister_kprobes(struct kprobe **kps, int num)
                if (kps[i]->addr)
                        __unregister_kprobe_bottom(kps[i]);
 }
+EXPORT_SYMBOL_GPL(unregister_kprobes);
 
 static struct notifier_block kprobe_exceptions_nb = {
        .notifier_call = kprobe_exceptions_notify,
@@ -865,16 +912,19 @@ int __kprobes register_jprobes(struct jprobe **jps, int num)
        }
        return ret;
 }
+EXPORT_SYMBOL_GPL(register_jprobes);
 
 int __kprobes register_jprobe(struct jprobe *jp)
 {
        return register_jprobes(&jp, 1);
 }
+EXPORT_SYMBOL_GPL(register_jprobe);
 
 void __kprobes unregister_jprobe(struct jprobe *jp)
 {
        unregister_jprobes(&jp, 1);
 }
+EXPORT_SYMBOL_GPL(unregister_jprobe);
 
 void __kprobes unregister_jprobes(struct jprobe **jps, int num)
 {
@@ -894,6 +944,7 @@ void __kprobes unregister_jprobes(struct jprobe **jps, int num)
                        __unregister_kprobe_bottom(&jps[i]->kp);
        }
 }
+EXPORT_SYMBOL_GPL(unregister_jprobes);
 
 #ifdef CONFIG_KRETPROBES
 /*
@@ -987,6 +1038,7 @@ int __kprobes register_kretprobe(struct kretprobe *rp)
                free_rp_inst(rp);
        return ret;
 }
+EXPORT_SYMBOL_GPL(register_kretprobe);
 
 int __kprobes register_kretprobes(struct kretprobe **rps, int num)
 {
@@ -1004,11 +1056,13 @@ int __kprobes register_kretprobes(struct kretprobe **rps, int num)
        }
        return ret;
 }
+EXPORT_SYMBOL_GPL(register_kretprobes);
 
 void __kprobes unregister_kretprobe(struct kretprobe *rp)
 {
        unregister_kretprobes(&rp, 1);
 }
+EXPORT_SYMBOL_GPL(unregister_kretprobe);
 
 void __kprobes unregister_kretprobes(struct kretprobe **rps, int num)
 {
@@ -1030,24 +1084,30 @@ void __kprobes unregister_kretprobes(struct kretprobe **rps, int num)
                }
        }
 }
+EXPORT_SYMBOL_GPL(unregister_kretprobes);
 
 #else /* CONFIG_KRETPROBES */
 int __kprobes register_kretprobe(struct kretprobe *rp)
 {
        return -ENOSYS;
 }
+EXPORT_SYMBOL_GPL(register_kretprobe);
 
 int __kprobes register_kretprobes(struct kretprobe **rps, int num)
 {
        return -ENOSYS;
 }
+EXPORT_SYMBOL_GPL(register_kretprobes);
+
 void __kprobes unregister_kretprobe(struct kretprobe *rp)
 {
 }
+EXPORT_SYMBOL_GPL(unregister_kretprobe);
 
 void __kprobes unregister_kretprobes(struct kretprobe **rps, int num)
 {
 }
+EXPORT_SYMBOL_GPL(unregister_kretprobes);
 
 static int __kprobes pre_handler_kretprobe(struct kprobe *p,
                                           struct pt_regs *regs)
@@ -1061,6 +1121,7 @@ static int __kprobes pre_handler_kretprobe(struct kprobe *p,
 static void __kprobes kill_kprobe(struct kprobe *p)
 {
        struct kprobe *kp;
+
        p->flags |= KPROBE_FLAG_GONE;
        if (p->pre_handler == aggr_pre_handler) {
                /*
@@ -1173,8 +1234,8 @@ static int __init init_kprobes(void)
                }
        }
 
-       /* By default, kprobes are enabled */
-       kprobe_enabled = true;
+       /* By default, kprobes are armed */
+       kprobes_all_disarmed = false;
 
        err = arch_init_kprobes();
        if (!err)
@@ -1202,12 +1263,18 @@ static void __kprobes report_probe(struct seq_file *pi, struct kprobe *p,
        else
                kprobe_type = "k";
        if (sym)
-               seq_printf(pi, "%p  %s  %s+0x%x  %s %s\n", p->addr, kprobe_type,
-                       sym, offset, (modname ? modname : " "),
-                       (kprobe_gone(p) ? "[GONE]" : ""));
+               seq_printf(pi, "%p  %s  %s+0x%x  %s %s%s\n",
+                       p->addr, kprobe_type, sym, offset,
+                       (modname ? modname : " "),
+                       (kprobe_gone(p) ? "[GONE]" : ""),
+                       ((kprobe_disabled(p) && !kprobe_gone(p)) ?
+                        "[DISABLED]" : ""));
        else
-               seq_printf(pi, "%p  %s  %p %s\n", p->addr, kprobe_type, p->addr,
-                       (kprobe_gone(p) ? "[GONE]" : ""));
+               seq_printf(pi, "%p  %s  %p %s%s\n",
+                       p->addr, kprobe_type, p->addr,
+                       (kprobe_gone(p) ? "[GONE]" : ""),
+                       ((kprobe_disabled(p) && !kprobe_gone(p)) ?
+                        "[DISABLED]" : ""));
 }
 
 static void __kprobes *kprobe_seq_start(struct seq_file *f, loff_t *pos)
@@ -1272,7 +1339,72 @@ static struct file_operations debugfs_kprobes_operations = {
        .release        = seq_release,
 };
 
-static void __kprobes enable_all_kprobes(void)
+/* Disable one kprobe */
+int __kprobes disable_kprobe(struct kprobe *kp)
+{
+       int ret = 0;
+       struct kprobe *p;
+
+       mutex_lock(&kprobe_mutex);
+
+       /* Check whether specified probe is valid. */
+       p = __get_valid_kprobe(kp);
+       if (unlikely(p == NULL)) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       /* If the probe is already disabled (or gone), just return */
+       if (kprobe_disabled(kp))
+               goto out;
+
+       kp->flags |= KPROBE_FLAG_DISABLED;
+       if (p != kp)
+               /* When kp != p, p is always enabled. */
+               try_to_disable_aggr_kprobe(p);
+
+       if (!kprobes_all_disarmed && kprobe_disabled(p))
+               arch_disarm_kprobe(p);
+out:
+       mutex_unlock(&kprobe_mutex);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(disable_kprobe);
+
+/* Enable one kprobe */
+int __kprobes enable_kprobe(struct kprobe *kp)
+{
+       int ret = 0;
+       struct kprobe *p;
+
+       mutex_lock(&kprobe_mutex);
+
+       /* Check whether specified probe is valid. */
+       p = __get_valid_kprobe(kp);
+       if (unlikely(p == NULL)) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if (kprobe_gone(kp)) {
+               /* This kprobe has gone, we couldn't enable it. */
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if (!kprobes_all_disarmed && kprobe_disabled(p))
+               arch_arm_kprobe(p);
+
+       p->flags &= ~KPROBE_FLAG_DISABLED;
+       if (p != kp)
+               kp->flags &= ~KPROBE_FLAG_DISABLED;
+out:
+       mutex_unlock(&kprobe_mutex);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(enable_kprobe);
+
+static void __kprobes arm_all_kprobes(void)
 {
        struct hlist_head *head;
        struct hlist_node *node;
@@ -1281,20 +1413,20 @@ static void __kprobes enable_all_kprobes(void)
 
        mutex_lock(&kprobe_mutex);
 
-       /* If kprobes are already enabled, just return */
-       if (kprobe_enabled)
+       /* If kprobes are armed, just return */
+       if (!kprobes_all_disarmed)
                goto already_enabled;
 
        mutex_lock(&text_mutex);
        for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
                head = &kprobe_table[i];
                hlist_for_each_entry_rcu(p, node, head, hlist)
-                       if (!kprobe_gone(p))
+                       if (!kprobe_disabled(p))
                                arch_arm_kprobe(p);
        }
        mutex_unlock(&text_mutex);
 
-       kprobe_enabled = true;
+       kprobes_all_disarmed = false;
        printk(KERN_INFO "Kprobes globally enabled\n");
 
 already_enabled:
@@ -1302,7 +1434,7 @@ already_enabled:
        return;
 }
 
-static void __kprobes disable_all_kprobes(void)
+static void __kprobes disarm_all_kprobes(void)
 {
        struct hlist_head *head;
        struct hlist_node *node;
@@ -1311,17 +1443,17 @@ static void __kprobes disable_all_kprobes(void)
 
        mutex_lock(&kprobe_mutex);
 
-       /* If kprobes are already disabled, just return */
-       if (!kprobe_enabled)
+       /* If kprobes are already disarmed, just return */
+       if (kprobes_all_disarmed)
                goto already_disabled;
 
-       kprobe_enabled = false;
+       kprobes_all_disarmed = true;
        printk(KERN_INFO "Kprobes globally disabled\n");
        mutex_lock(&text_mutex);
        for (i = 0; i < KPROBE_TABLE_SIZE; i++) {
                head = &kprobe_table[i];
                hlist_for_each_entry_rcu(p, node, head, hlist) {
-                       if (!arch_trampoline_kprobe(p) && !kprobe_gone(p))
+                       if (!arch_trampoline_kprobe(p) && !kprobe_disabled(p))
                                arch_disarm_kprobe(p);
                }
        }
@@ -1347,7 +1479,7 @@ static ssize_t read_enabled_file_bool(struct file *file,
 {
        char buf[3];
 
-       if (kprobe_enabled)
+       if (!kprobes_all_disarmed)
                buf[0] = '1';
        else
                buf[0] = '0';
@@ -1370,12 +1502,12 @@ static ssize_t write_enabled_file_bool(struct file *file,
        case 'y':
        case 'Y':
        case '1':
-               enable_all_kprobes();
+               arm_all_kprobes();
                break;
        case 'n':
        case 'N':
        case '0':
-               disable_all_kprobes();
+               disarm_all_kprobes();
                break;
        }
 
@@ -1418,16 +1550,5 @@ late_initcall(debugfs_kprobe_init);
 
 module_init(init_kprobes);
 
-EXPORT_SYMBOL_GPL(register_kprobe);
-EXPORT_SYMBOL_GPL(unregister_kprobe);
-EXPORT_SYMBOL_GPL(register_kprobes);
-EXPORT_SYMBOL_GPL(unregister_kprobes);
-EXPORT_SYMBOL_GPL(register_jprobe);
-EXPORT_SYMBOL_GPL(unregister_jprobe);
-EXPORT_SYMBOL_GPL(register_jprobes);
-EXPORT_SYMBOL_GPL(unregister_jprobes);
+/* defined in arch/.../kernel/kprobes.c */
 EXPORT_SYMBOL_GPL(jprobe_return);
-EXPORT_SYMBOL_GPL(register_kretprobe);
-EXPORT_SYMBOL_GPL(unregister_kretprobe);
-EXPORT_SYMBOL_GPL(register_kretprobes);
-EXPORT_SYMBOL_GPL(unregister_kretprobes);
index 81b5f33970b8b8c64e07414679a6ab5822fa44fe..b0f011866969acb7f187c3474e53551723d0486a 100644 (file)
@@ -793,6 +793,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
 
                printk("BUG: MAX_LOCKDEP_KEYS too low!\n");
                printk("turning off the locking correctness validator.\n");
+               dump_stack();
                return NULL;
        }
        class = lock_classes + nr_lock_classes++;
@@ -856,6 +857,7 @@ static struct lock_list *alloc_list_entry(void)
 
                printk("BUG: MAX_LOCKDEP_ENTRIES too low!\n");
                printk("turning off the locking correctness validator.\n");
+               dump_stack();
                return NULL;
        }
        return list_entries + nr_list_entries++;
@@ -1682,6 +1684,7 @@ cache_hit:
 
                printk("BUG: MAX_LOCKDEP_CHAINS too low!\n");
                printk("turning off the locking correctness validator.\n");
+               dump_stack();
                return 0;
        }
        chain = lock_chains + nr_lock_chains++;
@@ -2541,6 +2544,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
                debug_locks_off();
                printk("BUG: MAX_LOCKDEP_SUBCLASSES too low!\n");
                printk("turning off the locking correctness validator.\n");
+               dump_stack();
                return 0;
        }
 
@@ -2637,6 +2641,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
                debug_locks_off();
                printk("BUG: MAX_LOCK_DEPTH too low!\n");
                printk("turning off the locking correctness validator.\n");
+               dump_stack();
                return 0;
        }
 
index c268a771595c46cde09a5ac5bcf3d001082de6bf..05f014efa32c54ca48a17f166ff40fda87f78a3f 100644 (file)
@@ -1952,9 +1952,6 @@ static noinline struct module *load_module(void __user *umod,
                if (strstarts(secstrings+sechdrs[i].sh_name, ".exit"))
                        sechdrs[i].sh_flags &= ~(unsigned long)SHF_ALLOC;
 #endif
-               /* Don't keep __versions around; it's just for loading. */
-               if (strcmp(secstrings + sechdrs[i].sh_name, "__versions") == 0)
-                       sechdrs[i].sh_flags &= ~(unsigned long)SHF_ALLOC;
        }
 
        modindex = find_sec(hdr, sechdrs, secstrings,
index 654c640a6b9c137b6a44c1e57159fbdeeac48b61..0f2b0b3113044d02ad8c4e1240845b40302f8bc2 100644 (file)
@@ -65,6 +65,7 @@ static struct rcu_ctrlblk rcu_ctrlblk = {
        .lock = __SPIN_LOCK_UNLOCKED(&rcu_ctrlblk.lock),
        .cpumask = CPU_BITS_NONE,
 };
+
 static struct rcu_ctrlblk rcu_bh_ctrlblk = {
        .cur = -300,
        .completed = -300,
@@ -73,8 +74,26 @@ static struct rcu_ctrlblk rcu_bh_ctrlblk = {
        .cpumask = CPU_BITS_NONE,
 };
 
-DEFINE_PER_CPU(struct rcu_data, rcu_data) = { 0L };
-DEFINE_PER_CPU(struct rcu_data, rcu_bh_data) = { 0L };
+static DEFINE_PER_CPU(struct rcu_data, rcu_data);
+static DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);
+
+/*
+ * Increment the quiescent state counter.
+ * The counter is a bit degenerated: We do not need to know
+ * how many quiescent states passed, just if there was at least
+ * one since the start of the grace period. Thus just a flag.
+ */
+void rcu_qsctr_inc(int cpu)
+{
+       struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
+       rdp->passed_quiesc = 1;
+}
+
+void rcu_bh_qsctr_inc(int cpu)
+{
+       struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu);
+       rdp->passed_quiesc = 1;
+}
 
 static int blimit = 10;
 static int qhimark = 10000;
index 5d59e850fb71f6f58b854cdbd0a1f1792f59c8ad..ce97a4df64d3539edc785ff9db119c3ba3edbe07 100644 (file)
@@ -147,7 +147,51 @@ struct rcu_ctrlblk {
        wait_queue_head_t sched_wq;     /* Place for rcu_sched to sleep. */
 };
 
+struct rcu_dyntick_sched {
+       int dynticks;
+       int dynticks_snap;
+       int sched_qs;
+       int sched_qs_snap;
+       int sched_dynticks_snap;
+};
+
+static DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_dyntick_sched, rcu_dyntick_sched) = {
+       .dynticks = 1,
+};
+
+void rcu_qsctr_inc(int cpu)
+{
+       struct rcu_dyntick_sched *rdssp = &per_cpu(rcu_dyntick_sched, cpu);
+
+       rdssp->sched_qs++;
+}
+
+#ifdef CONFIG_NO_HZ
+
+void rcu_enter_nohz(void)
+{
+       static DEFINE_RATELIMIT_STATE(rs, 10 * HZ, 1);
+
+       smp_mb(); /* CPUs seeing ++ must see prior RCU read-side crit sects */
+       __get_cpu_var(rcu_dyntick_sched).dynticks++;
+       WARN_ON_RATELIMIT(__get_cpu_var(rcu_dyntick_sched).dynticks & 0x1, &rs);
+}
+
+void rcu_exit_nohz(void)
+{
+       static DEFINE_RATELIMIT_STATE(rs, 10 * HZ, 1);
+
+       __get_cpu_var(rcu_dyntick_sched).dynticks++;
+       smp_mb(); /* CPUs seeing ++ must see later RCU read-side crit sects */
+       WARN_ON_RATELIMIT(!(__get_cpu_var(rcu_dyntick_sched).dynticks & 0x1),
+                               &rs);
+}
+
+#endif /* CONFIG_NO_HZ */
+
+
 static DEFINE_PER_CPU(struct rcu_data, rcu_data);
+
 static struct rcu_ctrlblk rcu_ctrlblk = {
        .fliplock = __SPIN_LOCK_UNLOCKED(rcu_ctrlblk.fliplock),
        .completed = 0,
@@ -427,10 +471,6 @@ static void __rcu_advance_callbacks(struct rcu_data *rdp)
        }
 }
 
-DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_dyntick_sched, rcu_dyntick_sched) = {
-       .dynticks = 1,
-};
-
 #ifdef CONFIG_NO_HZ
 static DEFINE_PER_CPU(int, rcu_update_flag);
 
index 97ce31579ec0664682e1b2efb792cd77e7c0030e..7f3266922572b150cb62e6e50b321b6bee88fd94 100644 (file)
@@ -78,6 +78,26 @@ DEFINE_PER_CPU(struct rcu_data, rcu_data);
 struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh_state);
 DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);
 
+/*
+ * Increment the quiescent state counter.
+ * The counter is a bit degenerated: We do not need to know
+ * how many quiescent states passed, just if there was at least
+ * one since the start of the grace period. Thus just a flag.
+ */
+void rcu_qsctr_inc(int cpu)
+{
+       struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
+       rdp->passed_quiesc = 1;
+       rdp->passed_quiesc_completed = rdp->completed;
+}
+
+void rcu_bh_qsctr_inc(int cpu)
+{
+       struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu);
+       rdp->passed_quiesc = 1;
+       rdp->passed_quiesc_completed = rdp->completed;
+}
+
 #ifdef CONFIG_NO_HZ
 DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = {
        .dynticks_nesting = 1,
diff --git a/kernel/rcutree.h b/kernel/rcutree.h
new file mode 100644 (file)
index 0000000..5e872bb
--- /dev/null
@@ -0,0 +1,10 @@
+
+/*
+ * RCU implementation internal declarations:
+ */
+extern struct rcu_state rcu_state;
+DECLARE_PER_CPU(struct rcu_data, rcu_data);
+
+extern struct rcu_state rcu_bh_state;
+DECLARE_PER_CPU(struct rcu_data, rcu_bh_data);
+
index d6db3e837826cbf5b7c795bfae2b01c75176e1c4..4ee954f6a8d59df349f22d6728ef3ec0af2ef5c6 100644 (file)
@@ -43,6 +43,8 @@
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 
+#include "rcutree.h"
+
 static void print_one_rcu_data(struct seq_file *m, struct rcu_data *rdp)
 {
        if (!rdp->beenonline)
index bec249885e174c398c5e71aef05194579c9418dc..6cc1fd5d5072b69638c562d7e01697d4c9870684 100644 (file)
@@ -231,13 +231,20 @@ static void start_rt_bandwidth(struct rt_bandwidth *rt_b)
 
        spin_lock(&rt_b->rt_runtime_lock);
        for (;;) {
+               unsigned long delta;
+               ktime_t soft, hard;
+
                if (hrtimer_active(&rt_b->rt_period_timer))
                        break;
 
                now = hrtimer_cb_get_time(&rt_b->rt_period_timer);
                hrtimer_forward(&rt_b->rt_period_timer, now, rt_b->rt_period);
-               hrtimer_start_expires(&rt_b->rt_period_timer,
-                               HRTIMER_MODE_ABS);
+
+               soft = hrtimer_get_softexpires(&rt_b->rt_period_timer);
+               hard = hrtimer_get_expires(&rt_b->rt_period_timer);
+               delta = ktime_to_ns(ktime_sub(hard, soft));
+               __hrtimer_start_range_ns(&rt_b->rt_period_timer, soft, delta,
+                               HRTIMER_MODE_ABS, 0);
        }
        spin_unlock(&rt_b->rt_runtime_lock);
 }
@@ -1146,7 +1153,8 @@ static __init void init_hrtick(void)
  */
 static void hrtick_start(struct rq *rq, u64 delay)
 {
-       hrtimer_start(&rq->hrtick_timer, ns_to_ktime(delay), HRTIMER_MODE_REL);
+       __hrtimer_start_range_ns(&rq->hrtick_timer, ns_to_ktime(delay), 0,
+                       HRTIMER_MODE_REL, 0);
 }
 
 static inline void init_hrtick(void)
index d105a82543d001029218240da411abf4893b587f..2fecefacdc5bc56917c13369420625a919e73c14 100644 (file)
@@ -65,7 +65,7 @@ char *softirq_to_name[NR_SOFTIRQS] = {
  * to the pending events, so lets the scheduler to balance
  * the softirq load for us.
  */
-static inline void wakeup_softirqd(void)
+void wakeup_softirqd(void)
 {
        /* Interrupts are disabled: no need to stop preemption */
        struct task_struct *tsk = __get_cpu_var(ksoftirqd);
index 82350f8f04f61a276cfaedbd0ca7fb5e1ffea378..72eb1a41dcabef2a7d46ab7199cae10edcc3aa5c 100644 (file)
@@ -97,10 +97,11 @@ static int neg_one = -1;
 #endif
 
 static int zero;
-static int one = 1;
-static int two = 2;
+static int __maybe_unused one = 1;
+static int __maybe_unused two = 2;
 static unsigned long one_ul = 1;
 static int one_hundred = 100;
+static int one_thousand = 1000;
 
 /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
 static int maxolduid = 65535;
@@ -1026,6 +1027,28 @@ static struct ctl_table vm_table[] = {
                .mode           = 0444 /* read-only*/,
                .proc_handler   = &proc_dointvec,
        },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "nr_pdflush_threads_min",
+               .data           = &nr_pdflush_threads_min,
+               .maxlen         = sizeof nr_pdflush_threads_min,
+               .mode           = 0644 /* read-write */,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &one,
+               .extra2         = &nr_pdflush_threads_max,
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "nr_pdflush_threads_max",
+               .data           = &nr_pdflush_threads_max,
+               .maxlen         = sizeof nr_pdflush_threads_max,
+               .mode           = 0644 /* read-write */,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &nr_pdflush_threads_min,
+               .extra2         = &one_thousand,
+       },
        {
                .ctl_name       = VM_SWAPPINESS,
                .procname       = "swappiness",
index ae201b3eda89b684732cf90de3c6d38085eff829..5011f4d91e375c2895cdc074299caafdf058ca38 100644 (file)
@@ -6,14 +6,16 @@
  * Copyright (C) 2008 Frederic Weisbecker <fweisbec@gmail.com>
  */
 
-#include <linux/dcache.h>
+#include <linux/tracepoint.h>
+#include <linux/seq_file.h>
 #include <linux/debugfs.h>
+#include <linux/dcache.h>
 #include <linux/fs.h>
-#include <linux/seq_file.h>
+
 #include <trace/kmemtrace.h>
 
-#include "trace.h"
 #include "trace_output.h"
+#include "trace.h"
 
 /* Select an alternative, minimalistic output than the original one */
 #define TRACE_KMEM_OPT_MINIMAL 0x1
@@ -25,14 +27,156 @@ static struct tracer_opt kmem_opts[] = {
 };
 
 static struct tracer_flags kmem_tracer_flags = {
-       .val = 0,
-       .opts = kmem_opts
+       .val                    = 0,
+       .opts                   = kmem_opts
 };
 
-
-static bool kmem_tracing_enabled __read_mostly;
 static struct trace_array *kmemtrace_array;
 
+/* Trace allocations */
+static inline void kmemtrace_alloc(enum kmemtrace_type_id type_id,
+                                  unsigned long call_site,
+                                  const void *ptr,
+                                  size_t bytes_req,
+                                  size_t bytes_alloc,
+                                  gfp_t gfp_flags,
+                                  int node)
+{
+       struct trace_array *tr = kmemtrace_array;
+       struct kmemtrace_alloc_entry *entry;
+       struct ring_buffer_event *event;
+
+       event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry));
+       if (!event)
+               return;
+
+       entry = ring_buffer_event_data(event);
+       tracing_generic_entry_update(&entry->ent, 0, 0);
+
+       entry->ent.type         = TRACE_KMEM_ALLOC;
+       entry->type_id          = type_id;
+       entry->call_site        = call_site;
+       entry->ptr              = ptr;
+       entry->bytes_req        = bytes_req;
+       entry->bytes_alloc      = bytes_alloc;
+       entry->gfp_flags        = gfp_flags;
+       entry->node             = node;
+
+       ring_buffer_unlock_commit(tr->buffer, event);
+
+       trace_wake_up();
+}
+
+static inline void kmemtrace_free(enum kmemtrace_type_id type_id,
+                                 unsigned long call_site,
+                                 const void *ptr)
+{
+       struct trace_array *tr = kmemtrace_array;
+       struct kmemtrace_free_entry *entry;
+       struct ring_buffer_event *event;
+
+       event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry));
+       if (!event)
+               return;
+       entry   = ring_buffer_event_data(event);
+       tracing_generic_entry_update(&entry->ent, 0, 0);
+
+       entry->ent.type         = TRACE_KMEM_FREE;
+       entry->type_id          = type_id;
+       entry->call_site        = call_site;
+       entry->ptr              = ptr;
+
+       ring_buffer_unlock_commit(tr->buffer, event);
+
+       trace_wake_up();
+}
+
+static void kmemtrace_kmalloc(unsigned long call_site,
+                             const void *ptr,
+                             size_t bytes_req,
+                             size_t bytes_alloc,
+                             gfp_t gfp_flags)
+{
+       kmemtrace_alloc(KMEMTRACE_TYPE_KMALLOC, call_site, ptr,
+                       bytes_req, bytes_alloc, gfp_flags, -1);
+}
+
+static void kmemtrace_kmem_cache_alloc(unsigned long call_site,
+                                      const void *ptr,
+                                      size_t bytes_req,
+                                      size_t bytes_alloc,
+                                      gfp_t gfp_flags)
+{
+       kmemtrace_alloc(KMEMTRACE_TYPE_CACHE, call_site, ptr,
+                       bytes_req, bytes_alloc, gfp_flags, -1);
+}
+
+static void kmemtrace_kmalloc_node(unsigned long call_site,
+                                  const void *ptr,
+                                  size_t bytes_req,
+                                  size_t bytes_alloc,
+                                  gfp_t gfp_flags,
+                                  int node)
+{
+       kmemtrace_alloc(KMEMTRACE_TYPE_KMALLOC, call_site, ptr,
+                       bytes_req, bytes_alloc, gfp_flags, node);
+}
+
+static void kmemtrace_kmem_cache_alloc_node(unsigned long call_site,
+                                           const void *ptr,
+                                           size_t bytes_req,
+                                           size_t bytes_alloc,
+                                           gfp_t gfp_flags,
+                                           int node)
+{
+       kmemtrace_alloc(KMEMTRACE_TYPE_CACHE, call_site, ptr,
+                       bytes_req, bytes_alloc, gfp_flags, node);
+}
+
+static void kmemtrace_kfree(unsigned long call_site, const void *ptr)
+{
+       kmemtrace_free(KMEMTRACE_TYPE_KMALLOC, call_site, ptr);
+}
+
+static void kmemtrace_kmem_cache_free(unsigned long call_site, const void *ptr)
+{
+       kmemtrace_free(KMEMTRACE_TYPE_CACHE, call_site, ptr);
+}
+
+static int kmemtrace_start_probes(void)
+{
+       int err;
+
+       err = register_trace_kmalloc(kmemtrace_kmalloc);
+       if (err)
+               return err;
+       err = register_trace_kmem_cache_alloc(kmemtrace_kmem_cache_alloc);
+       if (err)
+               return err;
+       err = register_trace_kmalloc_node(kmemtrace_kmalloc_node);
+       if (err)
+               return err;
+       err = register_trace_kmem_cache_alloc_node(kmemtrace_kmem_cache_alloc_node);
+       if (err)
+               return err;
+       err = register_trace_kfree(kmemtrace_kfree);
+       if (err)
+               return err;
+       err = register_trace_kmem_cache_free(kmemtrace_kmem_cache_free);
+
+       return err;
+}
+
+static void kmemtrace_stop_probes(void)
+{
+       unregister_trace_kmalloc(kmemtrace_kmalloc);
+       unregister_trace_kmem_cache_alloc(kmemtrace_kmem_cache_alloc);
+       unregister_trace_kmalloc_node(kmemtrace_kmalloc_node);
+       unregister_trace_kmem_cache_alloc_node(kmemtrace_kmem_cache_alloc_node);
+       unregister_trace_kfree(kmemtrace_kfree);
+       unregister_trace_kmem_cache_free(kmemtrace_kmem_cache_free);
+}
+
 static int kmem_trace_init(struct trace_array *tr)
 {
        int cpu;
@@ -41,14 +185,14 @@ static int kmem_trace_init(struct trace_array *tr)
        for_each_cpu_mask(cpu, cpu_possible_map)
                tracing_reset(tr, cpu);
 
-       kmem_tracing_enabled = true;
+       kmemtrace_start_probes();
 
        return 0;
 }
 
 static void kmem_trace_reset(struct trace_array *tr)
 {
-       kmem_tracing_enabled = false;
+       kmemtrace_stop_probes();
 }
 
 static void kmemtrace_headers(struct seq_file *s)
@@ -66,47 +210,84 @@ static void kmemtrace_headers(struct seq_file *s)
 }
 
 /*
- * The two following functions give the original output from kmemtrace,
- * or something close to....perhaps they need some missing things
+ * The following functions give the original output from kmemtrace,
+ * plus the origin CPU, since reordering occurs in-kernel now.
  */
+
+#define KMEMTRACE_USER_ALLOC   0
+#define KMEMTRACE_USER_FREE    1
+
+struct kmemtrace_user_event {
+       u8                      event_id;
+       u8                      type_id;
+       u16                     event_size;
+       u32                     cpu;
+       u64                     timestamp;
+       unsigned long           call_site;
+       unsigned long           ptr;
+};
+
+struct kmemtrace_user_event_alloc {
+       size_t                  bytes_req;
+       size_t                  bytes_alloc;
+       unsigned                gfp_flags;
+       int                     node;
+};
+
 static enum print_line_t
-kmemtrace_print_alloc_original(struct trace_iterator *iter,
-                               struct kmemtrace_alloc_entry *entry)
+kmemtrace_print_alloc_user(struct trace_iterator *iter,
+                          struct kmemtrace_alloc_entry *entry)
 {
+       struct kmemtrace_user_event_alloc *ev_alloc;
        struct trace_seq *s = &iter->seq;
-       int ret;
+       struct kmemtrace_user_event *ev;
+
+       ev = trace_seq_reserve(s, sizeof(*ev));
+       if (!ev)
+               return TRACE_TYPE_PARTIAL_LINE;
 
-       /* Taken from the old linux/kmemtrace.h */
-       ret = trace_seq_printf(s, "type_id %d call_site %lu ptr %lu "
-         "bytes_req %lu bytes_alloc %lu gfp_flags %lu node %d\n",
-          entry->type_id, entry->call_site, (unsigned long) entry->ptr,
-          (unsigned long) entry->bytes_req, (unsigned long) entry->bytes_alloc,
-          (unsigned long) entry->gfp_flags, entry->node);
+       ev->event_id            = KMEMTRACE_USER_ALLOC;
+       ev->type_id             = entry->type_id;
+       ev->event_size          = sizeof(*ev) + sizeof(*ev_alloc);
+       ev->cpu                 = iter->cpu;
+       ev->timestamp           = iter->ts;
+       ev->call_site           = entry->call_site;
+       ev->ptr                 = (unsigned long)entry->ptr;
 
-       if (!ret)
+       ev_alloc = trace_seq_reserve(s, sizeof(*ev_alloc));
+       if (!ev_alloc)
                return TRACE_TYPE_PARTIAL_LINE;
 
+       ev_alloc->bytes_req     = entry->bytes_req;
+       ev_alloc->bytes_alloc   = entry->bytes_alloc;
+       ev_alloc->gfp_flags     = entry->gfp_flags;
+       ev_alloc->node          = entry->node;
+
        return TRACE_TYPE_HANDLED;
 }
 
 static enum print_line_t
-kmemtrace_print_free_original(struct trace_iterator *iter,
-                               struct kmemtrace_free_entry *entry)
+kmemtrace_print_free_user(struct trace_iterator *iter,
+                         struct kmemtrace_free_entry *entry)
 {
        struct trace_seq *s = &iter->seq;
-       int ret;
+       struct kmemtrace_user_event *ev;
 
-       /* Taken from the old linux/kmemtrace.h */
-       ret = trace_seq_printf(s, "type_id %d call_site %lu ptr %lu\n",
-          entry->type_id, entry->call_site, (unsigned long) entry->ptr);
-
-       if (!ret)
+       ev = trace_seq_reserve(s, sizeof(*ev));
+       if (!ev)
                return TRACE_TYPE_PARTIAL_LINE;
 
+       ev->event_id            = KMEMTRACE_USER_FREE;
+       ev->type_id             = entry->type_id;
+       ev->event_size          = sizeof(*ev);
+       ev->cpu                 = iter->cpu;
+       ev->timestamp           = iter->ts;
+       ev->call_site           = entry->call_site;
+       ev->ptr                 = (unsigned long)entry->ptr;
+
        return TRACE_TYPE_HANDLED;
 }
 
-
 /* The two other following provide a more minimalistic output */
 static enum print_line_t
 kmemtrace_print_alloc_compress(struct trace_iterator *iter,
@@ -178,7 +359,7 @@ kmemtrace_print_alloc_compress(struct trace_iterator *iter,
 
 static enum print_line_t
 kmemtrace_print_free_compress(struct trace_iterator *iter,
-                               struct kmemtrace_free_entry *entry)
+                             struct kmemtrace_free_entry *entry)
 {
        struct trace_seq *s = &iter->seq;
        int ret;
@@ -239,20 +420,22 @@ static enum print_line_t kmemtrace_print_line(struct trace_iterator *iter)
        switch (entry->type) {
        case TRACE_KMEM_ALLOC: {
                struct kmemtrace_alloc_entry *field;
+
                trace_assign_type(field, entry);
                if (kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL)
                        return kmemtrace_print_alloc_compress(iter, field);
                else
-                       return kmemtrace_print_alloc_original(iter, field);
+                       return kmemtrace_print_alloc_user(iter, field);
        }
 
        case TRACE_KMEM_FREE: {
                struct kmemtrace_free_entry *field;
+
                trace_assign_type(field, entry);
                if (kmem_tracer_flags.val & TRACE_KMEM_OPT_MINIMAL)
                        return kmemtrace_print_free_compress(iter, field);
                else
-                       return kmemtrace_print_free_original(iter, field);
+                       return kmemtrace_print_free_user(iter, field);
        }
 
        default:
@@ -260,70 +443,13 @@ static enum print_line_t kmemtrace_print_line(struct trace_iterator *iter)
        }
 }
 
-/* Trace allocations */
-void kmemtrace_mark_alloc_node(enum kmemtrace_type_id type_id,
-                            unsigned long call_site,
-                            const void *ptr,
-                            size_t bytes_req,
-                            size_t bytes_alloc,
-                            gfp_t gfp_flags,
-                            int node)
-{
-       struct ring_buffer_event *event;
-       struct kmemtrace_alloc_entry *entry;
-       struct trace_array *tr = kmemtrace_array;
-
-       if (!kmem_tracing_enabled)
-               return;
-
-       event = trace_buffer_lock_reserve(tr, TRACE_KMEM_ALLOC,
-                                         sizeof(*entry), 0, 0);
-       if (!event)
-               return;
-       entry   = ring_buffer_event_data(event);
-
-       entry->call_site = call_site;
-       entry->ptr = ptr;
-       entry->bytes_req = bytes_req;
-       entry->bytes_alloc = bytes_alloc;
-       entry->gfp_flags = gfp_flags;
-       entry->node     =       node;
-
-       trace_buffer_unlock_commit(tr, event, 0, 0);
-}
-EXPORT_SYMBOL(kmemtrace_mark_alloc_node);
-
-void kmemtrace_mark_free(enum kmemtrace_type_id type_id,
-                      unsigned long call_site,
-                      const void *ptr)
-{
-       struct ring_buffer_event *event;
-       struct kmemtrace_free_entry *entry;
-       struct trace_array *tr = kmemtrace_array;
-
-       if (!kmem_tracing_enabled)
-               return;
-
-       event = trace_buffer_lock_reserve(tr, TRACE_KMEM_FREE,
-                                         sizeof(*entry), 0, 0);
-       if (!event)
-               return;
-       entry   = ring_buffer_event_data(event);
-       entry->type_id  = type_id;
-       entry->call_site = call_site;
-       entry->ptr = ptr;
-
-       trace_buffer_unlock_commit(tr, event, 0, 0);
-}
-EXPORT_SYMBOL(kmemtrace_mark_free);
-
 static struct tracer kmem_tracer __read_mostly = {
-       .name           = "kmemtrace",
-       .init           = kmem_trace_init,
-       .reset          = kmem_trace_reset,
-       .print_line     = kmemtrace_print_line,
-       .print_header = kmemtrace_headers,
-       .flags          = &kmem_tracer_flags
+       .name                   = "kmemtrace",
+       .init                   = kmem_trace_init,
+       .reset                  = kmem_trace_reset,
+       .print_line             = kmemtrace_print_line,
+       .print_header           = kmemtrace_headers,
+       .flags                  = &kmem_tracer_flags
 };
 
 void kmemtrace_init(void)
@@ -335,5 +461,4 @@ static int __init init_kmem_tracer(void)
 {
        return register_tracer(&kmem_tracer);
 }
-
 device_initcall(init_kmem_tracer);
index cb0ce3fc36d31d5312c1c2952f2584fa2a62c3da..cbc168f1e43db4e78e41a990cd5b0265cf9a96d4 100644 (file)
@@ -182,6 +182,12 @@ struct trace_power {
        struct power_trace      state_data;
 };
 
+enum kmemtrace_type_id {
+       KMEMTRACE_TYPE_KMALLOC = 0,     /* kmalloc() or kfree(). */
+       KMEMTRACE_TYPE_CACHE,           /* kmem_cache_*(). */
+       KMEMTRACE_TYPE_PAGES,           /* __get_free_pages() and friends. */
+};
+
 struct kmemtrace_alloc_entry {
        struct trace_entry      ent;
        enum kmemtrace_type_id type_id;
index 5d3ddb5fcfd9760937d337086bb608cb3be8c5e3..708e2a86d87be8b8cc19cff2dd4671293eabb555 100644 (file)
@@ -50,6 +50,7 @@
 #endif /* !STATIC */
 
 #include <linux/decompress/mm.h>
+#include <linux/slab.h>
 
 #ifndef INT_MAX
 #define INT_MAX 0x7fffffff
index 839a329b4fc43e5d6e40ce912fdfe3ed6bfc4834..e36b296fc9f8e5819ca461ab99b4f476b73328ba 100644 (file)
@@ -23,6 +23,7 @@
 #endif /* STATIC */
 
 #include <linux/decompress/mm.h>
+#include <linux/slab.h>
 
 #define INBUF_LEN (16*1024)
 
index 546f2f4c157e7ce166e13007d9ec68447c5f6346..32123a1340e6bdb2125004def332daa5499c02f7 100644 (file)
@@ -34,6 +34,7 @@
 #endif /* STATIC */
 
 #include <linux/decompress/mm.h>
+#include <linux/slab.h>
 
 #define        MIN(a, b) (((a) < (b)) ? (a) : (b))
 
index 32e2bd3b11424ca7b0d7905930d3ea9b6adf14ff..2b0b5a7d2ced165b1e2b83e2df888c237349f23f 100644 (file)
@@ -549,7 +549,7 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size,
        dma_addr_t dev_addr;
        void *ret;
        int order = get_order(size);
-       u64 dma_mask = DMA_32BIT_MASK;
+       u64 dma_mask = DMA_BIT_MASK(32);
 
        if (hwdev && hwdev->coherent_dma_mask)
                dma_mask = hwdev->coherent_dma_mask;
index 139d5b7b6621471ccb88c2ea3dd6b0fe66b15618..dfdee6a47359eb9f529733091b6553091a80eebc 100644 (file)
@@ -31,7 +31,7 @@ static void percpu_depopulate(void *__pdata, int cpu)
  * @__pdata: per-cpu data to depopulate
  * @mask: depopulate per-cpu data for cpu's selected through mask bits
  */
-static void __percpu_depopulate_mask(void *__pdata, cpumask_t *mask)
+static void __percpu_depopulate_mask(void *__pdata, const cpumask_t *mask)
 {
        int cpu;
        for_each_cpu_mask_nr(cpu, *mask)
index be68c956a66079930475aa2b25eea170d4bd1dc7..493b468a503541fd65b64872eece6fb7228e36fa 100644 (file)
@@ -284,12 +284,12 @@ static wait_queue_head_t congestion_wqh[2] = {
        };
 
 
-void clear_bdi_congested(struct backing_dev_info *bdi, int rw)
+void clear_bdi_congested(struct backing_dev_info *bdi, int sync)
 {
        enum bdi_state bit;
-       wait_queue_head_t *wqh = &congestion_wqh[rw];
+       wait_queue_head_t *wqh = &congestion_wqh[sync];
 
-       bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
+       bit = sync ? BDI_sync_congested : BDI_async_congested;
        clear_bit(bit, &bdi->state);
        smp_mb__after_clear_bit();
        if (waitqueue_active(wqh))
@@ -297,11 +297,11 @@ void clear_bdi_congested(struct backing_dev_info *bdi, int rw)
 }
 EXPORT_SYMBOL(clear_bdi_congested);
 
-void set_bdi_congested(struct backing_dev_info *bdi, int rw)
+void set_bdi_congested(struct backing_dev_info *bdi, int sync)
 {
        enum bdi_state bit;
 
-       bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
+       bit = sync ? BDI_sync_congested : BDI_async_congested;
        set_bit(bit, &bdi->state);
 }
 EXPORT_SYMBOL(set_bdi_congested);
index 7c6ea6493f804cfaf1d85c88c4f2e8a634ddf002..9339de5f0a915dc0526e276eddbcc5fb918fb13d 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/fault-inject.h>
+#include <linux/gfp.h>
 
 static struct {
        struct fault_attr attr;
index 118905e3d7886f795875b376c70d23e4bfc4c038..f2caf96993f851050a90b88d449ff13084da1c58 100644 (file)
@@ -57,6 +57,14 @@ static DEFINE_SPINLOCK(pdflush_lock);
  */
 int nr_pdflush_threads = 0;
 
+/*
+ * The max/min number of pdflush threads. R/W by sysctl at
+ * /proc/sys/vm/nr_pdflush_threads_max/min
+ */
+int nr_pdflush_threads_max __read_mostly = MAX_PDFLUSH_THREADS;
+int nr_pdflush_threads_min __read_mostly = MIN_PDFLUSH_THREADS;
+
+
 /*
  * The time at which the pdflush thread pool last went empty
  */
@@ -68,7 +76,7 @@ static unsigned long last_empty_jifs;
  * Thread pool management algorithm:
  * 
  * - The minimum and maximum number of pdflush instances are bound
- *   by MIN_PDFLUSH_THREADS and MAX_PDFLUSH_THREADS.
+ *   by nr_pdflush_threads_min and nr_pdflush_threads_max.
  * 
  * - If there have been no idle pdflush instances for 1 second, create
  *   a new one.
@@ -98,7 +106,6 @@ static int __pdflush(struct pdflush_work *my_work)
        INIT_LIST_HEAD(&my_work->list);
 
        spin_lock_irq(&pdflush_lock);
-       nr_pdflush_threads++;
        for ( ; ; ) {
                struct pdflush_work *pdf;
 
@@ -126,20 +133,25 @@ static int __pdflush(struct pdflush_work *my_work)
 
                (*my_work->fn)(my_work->arg0);
 
+               spin_lock_irq(&pdflush_lock);
+
                /*
                 * Thread creation: For how long have there been zero
                 * available threads?
+                *
+                * To throttle creation, we reset last_empty_jifs.
                 */
                if (time_after(jiffies, last_empty_jifs + 1 * HZ)) {
-                       /* unlocked list_empty() test is OK here */
-                       if (list_empty(&pdflush_list)) {
-                               /* unlocked test is OK here */
-                               if (nr_pdflush_threads < MAX_PDFLUSH_THREADS)
-                                       start_one_pdflush_thread();
+                       if (list_empty(&pdflush_list) &&
+                           nr_pdflush_threads < nr_pdflush_threads_max) {
+                               last_empty_jifs = jiffies;
+                               nr_pdflush_threads++;
+                               spin_unlock_irq(&pdflush_lock);
+                               start_one_pdflush_thread();
+                               spin_lock_irq(&pdflush_lock);
                        }
                }
 
-               spin_lock_irq(&pdflush_lock);
                my_work->fn = NULL;
 
                /*
@@ -148,7 +160,7 @@ static int __pdflush(struct pdflush_work *my_work)
                 */
                if (list_empty(&pdflush_list))
                        continue;
-               if (nr_pdflush_threads <= MIN_PDFLUSH_THREADS)
+               if (nr_pdflush_threads <= nr_pdflush_threads_min)
                        continue;
                pdf = list_entry(pdflush_list.prev, struct pdflush_work, list);
                if (time_after(jiffies, pdf->when_i_went_to_sleep + 1 * HZ)) {
@@ -236,14 +248,27 @@ int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0)
 
 static void start_one_pdflush_thread(void)
 {
-       kthread_run(pdflush, NULL, "pdflush");
+       struct task_struct *k;
+
+       k = kthread_run(pdflush, NULL, "pdflush");
+       if (unlikely(IS_ERR(k))) {
+               spin_lock_irq(&pdflush_lock);
+               nr_pdflush_threads--;
+               spin_unlock_irq(&pdflush_lock);
+       }
 }
 
 static int __init pdflush_init(void)
 {
        int i;
 
-       for (i = 0; i < MIN_PDFLUSH_THREADS; i++)
+       /*
+        * Pre-set nr_pdflush_threads...  If we fail to create,
+        * the count will be decremented.
+        */
+       nr_pdflush_threads = nr_pdflush_threads_min;
+
+       for (i = 0; i < nr_pdflush_threads_min; i++)
                start_one_pdflush_thread();
        return 0;
 }
index 4fc1761c6dc8c88dfc988e54216d734cebde450f..9a90b00d2f9140e2aaa67ecb949e33d89431e9c5 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3565,8 +3565,8 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
 {
        void *ret = __cache_alloc(cachep, flags, __builtin_return_address(0));
 
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_CACHE, _RET_IP_, ret,
-                            obj_size(cachep), cachep->buffer_size, flags);
+       trace_kmem_cache_alloc(_RET_IP_, ret,
+                              obj_size(cachep), cachep->buffer_size, flags);
 
        return ret;
 }
@@ -3627,9 +3627,9 @@ void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
        void *ret = __cache_alloc_node(cachep, flags, nodeid,
                                       __builtin_return_address(0));
 
-       kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_CACHE, _RET_IP_, ret,
-                                 obj_size(cachep), cachep->buffer_size,
-                                 flags, nodeid);
+       trace_kmem_cache_alloc_node(_RET_IP_, ret,
+                                   obj_size(cachep), cachep->buffer_size,
+                                   flags, nodeid);
 
        return ret;
 }
@@ -3657,9 +3657,8 @@ __do_kmalloc_node(size_t size, gfp_t flags, int node, void *caller)
                return cachep;
        ret = kmem_cache_alloc_node_notrace(cachep, flags, node);
 
-       kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC,
-                                 (unsigned long) caller, ret,
-                                 size, cachep->buffer_size, flags, node);
+       trace_kmalloc_node((unsigned long) caller, ret,
+                          size, cachep->buffer_size, flags, node);
 
        return ret;
 }
@@ -3709,9 +3708,8 @@ static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,
                return cachep;
        ret = __cache_alloc(cachep, flags, caller);
 
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_KMALLOC,
-                            (unsigned long) caller, ret,
-                            size, cachep->buffer_size, flags);
+       trace_kmalloc((unsigned long) caller, ret,
+                     size, cachep->buffer_size, flags);
 
        return ret;
 }
@@ -3757,7 +3755,7 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp)
        __cache_free(cachep, objp);
        local_irq_restore(flags);
 
-       kmemtrace_mark_free(KMEMTRACE_TYPE_CACHE, _RET_IP_, objp);
+       trace_kmem_cache_free(_RET_IP_, objp);
 }
 EXPORT_SYMBOL(kmem_cache_free);
 
@@ -3775,6 +3773,8 @@ void kfree(const void *objp)
        struct kmem_cache *c;
        unsigned long flags;
 
+       trace_kfree(_RET_IP_, objp);
+
        if (unlikely(ZERO_OR_NULL_PTR(objp)))
                return;
        local_irq_save(flags);
@@ -3784,8 +3784,6 @@ void kfree(const void *objp)
        debug_check_no_obj_freed(objp, obj_size(c));
        __cache_free(c, (void *)objp);
        local_irq_restore(flags);
-
-       kmemtrace_mark_free(KMEMTRACE_TYPE_KMALLOC, _RET_IP_, objp);
 }
 EXPORT_SYMBOL(kfree);
 
index 4dd6516447f2258ac44c1a2baa024c6be38194d2..a2d4ab32198d85b9773926c27ba7fdd07adfbfe7 100644 (file)
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -490,9 +490,8 @@ void *__kmalloc_node(size_t size, gfp_t gfp, int node)
                *m = size;
                ret = (void *)m + align;
 
-               kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC,
-                                         _RET_IP_, ret,
-                                         size, size + align, gfp, node);
+               trace_kmalloc_node(_RET_IP_, ret,
+                                  size, size + align, gfp, node);
        } else {
                unsigned int order = get_order(size);
 
@@ -503,9 +502,8 @@ void *__kmalloc_node(size_t size, gfp_t gfp, int node)
                        page->private = size;
                }
 
-               kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC,
-                                         _RET_IP_, ret,
-                                         size, PAGE_SIZE << order, gfp, node);
+               trace_kmalloc_node(_RET_IP_, ret,
+                                  size, PAGE_SIZE << order, gfp, node);
        }
 
        return ret;
@@ -516,6 +514,8 @@ void kfree(const void *block)
 {
        struct slob_page *sp;
 
+       trace_kfree(_RET_IP_, block);
+
        if (unlikely(ZERO_OR_NULL_PTR(block)))
                return;
 
@@ -526,8 +526,6 @@ void kfree(const void *block)
                slob_free(m, *m + align);
        } else
                put_page(&sp->page);
-
-       kmemtrace_mark_free(KMEMTRACE_TYPE_KMALLOC, _RET_IP_, block);
 }
 EXPORT_SYMBOL(kfree);
 
@@ -599,16 +597,14 @@ void *kmem_cache_alloc_node(struct kmem_cache *c, gfp_t flags, int node)
 
        if (c->size < PAGE_SIZE) {
                b = slob_alloc(c->size, flags, c->align, node);
-               kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_CACHE,
-                                         _RET_IP_, b, c->size,
-                                         SLOB_UNITS(c->size) * SLOB_UNIT,
-                                         flags, node);
+               trace_kmem_cache_alloc_node(_RET_IP_, b, c->size,
+                                           SLOB_UNITS(c->size) * SLOB_UNIT,
+                                           flags, node);
        } else {
                b = slob_new_pages(flags, get_order(c->size), node);
-               kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_CACHE,
-                                         _RET_IP_, b, c->size,
-                                         PAGE_SIZE << get_order(c->size),
-                                         flags, node);
+               trace_kmem_cache_alloc_node(_RET_IP_, b, c->size,
+                                           PAGE_SIZE << get_order(c->size),
+                                           flags, node);
        }
 
        if (c->ctor)
@@ -646,7 +642,7 @@ void kmem_cache_free(struct kmem_cache *c, void *b)
                __kmem_cache_free(b, c->size);
        }
 
-       kmemtrace_mark_free(KMEMTRACE_TYPE_CACHE, _RET_IP_, b);
+       trace_kmem_cache_free(_RET_IP_, b);
 }
 EXPORT_SYMBOL(kmem_cache_free);
 
index 7aaa121d0ea9eda5cd2acddbf3707de9536da241..7ab54ecbd3f3a5abe50eba2c0a5dc035bf4d5efc 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1621,8 +1621,7 @@ void *kmem_cache_alloc(struct kmem_cache *s, gfp_t gfpflags)
 {
        void *ret = slab_alloc(s, gfpflags, -1, _RET_IP_);
 
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_CACHE, _RET_IP_, ret,
-                            s->objsize, s->size, gfpflags);
+       trace_kmem_cache_alloc(_RET_IP_, ret, s->objsize, s->size, gfpflags);
 
        return ret;
 }
@@ -1641,8 +1640,8 @@ void *kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node)
 {
        void *ret = slab_alloc(s, gfpflags, node, _RET_IP_);
 
-       kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_CACHE, _RET_IP_, ret,
-                                 s->objsize, s->size, gfpflags, node);
+       trace_kmem_cache_alloc_node(_RET_IP_, ret,
+                                   s->objsize, s->size, gfpflags, node);
 
        return ret;
 }
@@ -1767,7 +1766,7 @@ void kmem_cache_free(struct kmem_cache *s, void *x)
 
        slab_free(s, page, x, _RET_IP_);
 
-       kmemtrace_mark_free(KMEMTRACE_TYPE_CACHE, _RET_IP_, x);
+       trace_kmem_cache_free(_RET_IP_, x);
 }
 EXPORT_SYMBOL(kmem_cache_free);
 
@@ -2702,8 +2701,7 @@ void *__kmalloc(size_t size, gfp_t flags)
 
        ret = slab_alloc(s, flags, -1, _RET_IP_);
 
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_KMALLOC, _RET_IP_, ret,
-                            size, s->size, flags);
+       trace_kmalloc(_RET_IP_, ret, size, s->size, flags);
 
        return ret;
 }
@@ -2729,10 +2727,9 @@ void *__kmalloc_node(size_t size, gfp_t flags, int node)
        if (unlikely(size > SLUB_MAX_SIZE)) {
                ret = kmalloc_large_node(size, flags, node);
 
-               kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC,
-                                         _RET_IP_, ret,
-                                         size, PAGE_SIZE << get_order(size),
-                                         flags, node);
+               trace_kmalloc_node(_RET_IP_, ret,
+                                  size, PAGE_SIZE << get_order(size),
+                                  flags, node);
 
                return ret;
        }
@@ -2744,8 +2741,7 @@ void *__kmalloc_node(size_t size, gfp_t flags, int node)
 
        ret = slab_alloc(s, flags, node, _RET_IP_);
 
-       kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC, _RET_IP_, ret,
-                                 size, s->size, flags, node);
+       trace_kmalloc_node(_RET_IP_, ret, size, s->size, flags, node);
 
        return ret;
 }
@@ -2796,6 +2792,8 @@ void kfree(const void *x)
        struct page *page;
        void *object = (void *)x;
 
+       trace_kfree(_RET_IP_, x);
+
        if (unlikely(ZERO_OR_NULL_PTR(x)))
                return;
 
@@ -2806,8 +2804,6 @@ void kfree(const void *x)
                return;
        }
        slab_free(page->slab, page, object, _RET_IP_);
-
-       kmemtrace_mark_free(KMEMTRACE_TYPE_KMALLOC, _RET_IP_, x);
 }
 EXPORT_SYMBOL(kfree);
 
@@ -3290,8 +3286,7 @@ void *__kmalloc_track_caller(size_t size, gfp_t gfpflags, unsigned long caller)
        ret = slab_alloc(s, gfpflags, -1, caller);
 
        /* Honor the call site pointer we recieved. */
-       kmemtrace_mark_alloc(KMEMTRACE_TYPE_KMALLOC, caller, ret, size,
-                            s->size, gfpflags);
+       trace_kmalloc(caller, ret, size, s->size, gfpflags);
 
        return ret;
 }
@@ -3313,8 +3308,7 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t gfpflags,
        ret = slab_alloc(s, gfpflags, node, caller);
 
        /* Honor the call site pointer we recieved. */
-       kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KMALLOC, caller, ret,
-                                 size, s->size, gfpflags, node);
+       trace_kmalloc_node(caller, ret, size, s->size, gfpflags, node);
 
        return ret;
 }
index 7c122e49f769ccea98ae105746e0238acc1652ce..2599e83eea17a9c9673c26507541b12581e952f0 100644 (file)
--- a/mm/util.c
+++ b/mm/util.c
@@ -4,6 +4,7 @@
 #include <linux/module.h>
 #include <linux/err.h>
 #include <linux/sched.h>
+#include <linux/tracepoint.h>
 #include <asm/uaccess.h>
 
 /**
@@ -236,3 +237,18 @@ int __attribute__((weak)) get_user_pages_fast(unsigned long start,
        return ret;
 }
 EXPORT_SYMBOL_GPL(get_user_pages_fast);
+
+/* Tracepoints definitions. */
+DEFINE_TRACE(kmalloc);
+DEFINE_TRACE(kmem_cache_alloc);
+DEFINE_TRACE(kmalloc_node);
+DEFINE_TRACE(kmem_cache_alloc_node);
+DEFINE_TRACE(kfree);
+DEFINE_TRACE(kmem_cache_free);
+
+EXPORT_TRACEPOINT_SYMBOL(kmalloc);
+EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);
+EXPORT_TRACEPOINT_SYMBOL(kmalloc_node);
+EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node);
+EXPORT_TRACEPOINT_SYMBOL(kfree);
+EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free);
index f1611a1e06a724b155ce6b4768f605fb78d1bc0c..539e6064e6d4224fb08cac728c2fa71d2bd6e4df 100644 (file)
@@ -215,3 +215,5 @@ struct net_device *alloc_fddidev(int sizeof_priv)
        return alloc_netdev(sizeof_priv, "fddi%d", fddi_setup);
 }
 EXPORT_SYMBOL(alloc_fddidev);
+
+MODULE_LICENSE("GPL");
index 0af823cf7f1fb7561b481a814ed99ede1941ddba..5ee5a031bc93a85b453139eaa7581067dcf541d3 100644 (file)
@@ -72,6 +72,7 @@ int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb)
 #endif
 
        skb->protocol = htons(ETH_P_IPV6);
+       skb->local_df = 1;
 
        return x->outer_mode->output2(x, skb);
 }
index 91d0c0254ffe7113e98e90a24bd7a824424e9a7f..791d71a36a93dfec5166fe05e2e0cb394cfa904b 100644 (file)
@@ -493,8 +493,7 @@ static struct socket *sock_alloc(void)
        inode->i_uid = current_fsuid();
        inode->i_gid = current_fsgid();
 
-       get_cpu_var(sockets_in_use)++;
-       put_cpu_var(sockets_in_use);
+       percpu_add(sockets_in_use, 1);
        return sock;
 }
 
@@ -536,8 +535,7 @@ void sock_release(struct socket *sock)
        if (sock->fasync_list)
                printk(KERN_ERR "sock_release: fasync list not empty!\n");
 
-       get_cpu_var(sockets_in_use)--;
-       put_cpu_var(sockets_in_use);
+       percpu_sub(sockets_in_use, 1);
        if (!sock->file) {
                iput(SOCK_INODE(sock));
                return;
index 9b49a6ab8ded04a55401aa8198022f38a4059a5d..8847add6ca164a7aea722b96978c44abb5ba7158 100644 (file)
@@ -1008,6 +1008,8 @@ svc_process(struct svc_rqst *rqstp)
        rqstp->rq_res.tail[0].iov_len = 0;
        /* Will be turned off only in gss privacy case: */
        rqstp->rq_splice_ok = 1;
+       /* Will be turned off only when NFSv4 Sessions are used */
+       rqstp->rq_usedeferral = 1;
 
        /* Setup reply header */
        rqstp->rq_xprt->xpt_ops->xpo_prep_reply_hdr(rqstp);
@@ -1078,7 +1080,6 @@ svc_process(struct svc_rqst *rqstp)
        procp = versp->vs_proc + proc;
        if (proc >= versp->vs_nproc || !procp->pc_func)
                goto err_bad_proc;
-       rqstp->rq_server   = serv;
        rqstp->rq_procinfo = procp;
 
        /* Syntactic check complete */
index 2819ee093f365210c21c3895858221e5c4a3b656..c200d92e57e4990c98d5f95ebff026104d5fdedc 100644 (file)
@@ -14,6 +14,8 @@
 
 #define RPCDBG_FACILITY        RPCDBG_SVCXPRT
 
+#define SVC_MAX_WAKING 5
+
 static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt);
 static int svc_deferred_recv(struct svc_rqst *rqstp);
 static struct cache_deferred_req *svc_defer(struct cache_req *req);
@@ -301,6 +303,7 @@ void svc_xprt_enqueue(struct svc_xprt *xprt)
        struct svc_pool *pool;
        struct svc_rqst *rqstp;
        int cpu;
+       int thread_avail;
 
        if (!(xprt->xpt_flags &
              ((1<<XPT_CONN)|(1<<XPT_DATA)|(1<<XPT_CLOSE)|(1<<XPT_DEFERRED))))
@@ -312,18 +315,14 @@ void svc_xprt_enqueue(struct svc_xprt *xprt)
 
        spin_lock_bh(&pool->sp_lock);
 
-       if (!list_empty(&pool->sp_threads) &&
-           !list_empty(&pool->sp_sockets))
-               printk(KERN_ERR
-                      "svc_xprt_enqueue: "
-                      "threads and transports both waiting??\n");
-
        if (test_bit(XPT_DEAD, &xprt->xpt_flags)) {
                /* Don't enqueue dead transports */
                dprintk("svc: transport %p is dead, not enqueued\n", xprt);
                goto out_unlock;
        }
 
+       pool->sp_stats.packets++;
+
        /* Mark transport as busy. It will remain in this state until
         * the provider calls svc_xprt_received. We update XPT_BUSY
         * atomically because it also guards against trying to enqueue
@@ -356,7 +355,15 @@ void svc_xprt_enqueue(struct svc_xprt *xprt)
        }
 
  process:
-       if (!list_empty(&pool->sp_threads)) {
+       /* Work out whether threads are available */
+       thread_avail = !list_empty(&pool->sp_threads);  /* threads are asleep */
+       if (pool->sp_nwaking >= SVC_MAX_WAKING) {
+               /* too many threads are runnable and trying to wake up */
+               thread_avail = 0;
+               pool->sp_stats.overloads_avoided++;
+       }
+
+       if (thread_avail) {
                rqstp = list_entry(pool->sp_threads.next,
                                   struct svc_rqst,
                                   rq_list);
@@ -371,11 +378,15 @@ void svc_xprt_enqueue(struct svc_xprt *xprt)
                svc_xprt_get(xprt);
                rqstp->rq_reserved = serv->sv_max_mesg;
                atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved);
+               rqstp->rq_waking = 1;
+               pool->sp_nwaking++;
+               pool->sp_stats.threads_woken++;
                BUG_ON(xprt->xpt_pool != pool);
                wake_up(&rqstp->rq_wait);
        } else {
                dprintk("svc: transport %p put into queue\n", xprt);
                list_add_tail(&xprt->xpt_ready, &pool->sp_sockets);
+               pool->sp_stats.sockets_queued++;
                BUG_ON(xprt->xpt_pool != pool);
        }
 
@@ -588,6 +599,7 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
        int                     pages;
        struct xdr_buf          *arg;
        DECLARE_WAITQUEUE(wait, current);
+       long                    time_left;
 
        dprintk("svc: server %p waiting for data (to = %ld)\n",
                rqstp, timeout);
@@ -636,6 +648,11 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
                return -EINTR;
 
        spin_lock_bh(&pool->sp_lock);
+       if (rqstp->rq_waking) {
+               rqstp->rq_waking = 0;
+               pool->sp_nwaking--;
+               BUG_ON(pool->sp_nwaking < 0);
+       }
        xprt = svc_xprt_dequeue(pool);
        if (xprt) {
                rqstp->rq_xprt = xprt;
@@ -668,12 +685,14 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
                add_wait_queue(&rqstp->rq_wait, &wait);
                spin_unlock_bh(&pool->sp_lock);
 
-               schedule_timeout(timeout);
+               time_left = schedule_timeout(timeout);
 
                try_to_freeze();
 
                spin_lock_bh(&pool->sp_lock);
                remove_wait_queue(&rqstp->rq_wait, &wait);
+               if (!time_left)
+                       pool->sp_stats.threads_timedout++;
 
                xprt = rqstp->rq_xprt;
                if (!xprt) {
@@ -958,7 +977,7 @@ static struct cache_deferred_req *svc_defer(struct cache_req *req)
        struct svc_rqst *rqstp = container_of(req, struct svc_rqst, rq_chandle);
        struct svc_deferred_req *dr;
 
-       if (rqstp->rq_arg.page_len)
+       if (rqstp->rq_arg.page_len || !rqstp->rq_usedeferral)
                return NULL; /* if more than a page, give up FIXME */
        if (rqstp->rq_deferred) {
                dr = rqstp->rq_deferred;
@@ -1112,3 +1131,93 @@ int svc_xprt_names(struct svc_serv *serv, char *buf, int buflen)
        return totlen;
 }
 EXPORT_SYMBOL_GPL(svc_xprt_names);
+
+
+/*----------------------------------------------------------------------------*/
+
+static void *svc_pool_stats_start(struct seq_file *m, loff_t *pos)
+{
+       unsigned int pidx = (unsigned int)*pos;
+       struct svc_serv *serv = m->private;
+
+       dprintk("svc_pool_stats_start, *pidx=%u\n", pidx);
+
+       lock_kernel();
+       /* bump up the pseudo refcount while traversing */
+       svc_get(serv);
+       unlock_kernel();
+
+       if (!pidx)
+               return SEQ_START_TOKEN;
+       return (pidx > serv->sv_nrpools ? NULL : &serv->sv_pools[pidx-1]);
+}
+
+static void *svc_pool_stats_next(struct seq_file *m, void *p, loff_t *pos)
+{
+       struct svc_pool *pool = p;
+       struct svc_serv *serv = m->private;
+
+       dprintk("svc_pool_stats_next, *pos=%llu\n", *pos);
+
+       if (p == SEQ_START_TOKEN) {
+               pool = &serv->sv_pools[0];
+       } else {
+               unsigned int pidx = (pool - &serv->sv_pools[0]);
+               if (pidx < serv->sv_nrpools-1)
+                       pool = &serv->sv_pools[pidx+1];
+               else
+                       pool = NULL;
+       }
+       ++*pos;
+       return pool;
+}
+
+static void svc_pool_stats_stop(struct seq_file *m, void *p)
+{
+       struct svc_serv *serv = m->private;
+
+       lock_kernel();
+       /* this function really, really should have been called svc_put() */
+       svc_destroy(serv);
+       unlock_kernel();
+}
+
+static int svc_pool_stats_show(struct seq_file *m, void *p)
+{
+       struct svc_pool *pool = p;
+
+       if (p == SEQ_START_TOKEN) {
+               seq_puts(m, "# pool packets-arrived sockets-enqueued threads-woken overloads-avoided threads-timedout\n");
+               return 0;
+       }
+
+       seq_printf(m, "%u %lu %lu %lu %lu %lu\n",
+               pool->sp_id,
+               pool->sp_stats.packets,
+               pool->sp_stats.sockets_queued,
+               pool->sp_stats.threads_woken,
+               pool->sp_stats.overloads_avoided,
+               pool->sp_stats.threads_timedout);
+
+       return 0;
+}
+
+static const struct seq_operations svc_pool_stats_seq_ops = {
+       .start  = svc_pool_stats_start,
+       .next   = svc_pool_stats_next,
+       .stop   = svc_pool_stats_stop,
+       .show   = svc_pool_stats_show,
+};
+
+int svc_pool_stats_open(struct svc_serv *serv, struct file *file)
+{
+       int err;
+
+       err = seq_open(file, &svc_pool_stats_seq_ops);
+       if (!err)
+               ((struct seq_file *) file->private_data)->private = serv;
+       return err;
+}
+EXPORT_SYMBOL(svc_pool_stats_open);
+
+/*----------------------------------------------------------------------------*/
index 9d504234af4a664f5f116171b9d6e02825d1ac4f..af3198814c154756daa50f2c58819272795df95c 100644 (file)
@@ -345,7 +345,6 @@ static void svc_sock_setbufsize(struct socket *sock, unsigned int snd,
        lock_sock(sock->sk);
        sock->sk->sk_sndbuf = snd * 2;
        sock->sk->sk_rcvbuf = rcv * 2;
-       sock->sk->sk_userlocks |= SOCK_SNDBUF_LOCK|SOCK_RCVBUF_LOCK;
        release_sock(sock->sk);
 #endif
 }
@@ -797,23 +796,6 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp)
                test_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags),
                test_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags));
 
-       if (test_and_clear_bit(XPT_CHNGBUF, &svsk->sk_xprt.xpt_flags))
-               /* sndbuf needs to have room for one request
-                * per thread, otherwise we can stall even when the
-                * network isn't a bottleneck.
-                *
-                * We count all threads rather than threads in a
-                * particular pool, which provides an upper bound
-                * on the number of threads which will access the socket.
-                *
-                * rcvbuf just needs to be able to hold a few requests.
-                * Normally they will be removed from the queue
-                * as soon a a complete request arrives.
-                */
-               svc_sock_setbufsize(svsk->sk_sock,
-                                   (serv->sv_nrthreads+3) * serv->sv_max_mesg,
-                                   3 * serv->sv_max_mesg);
-
        clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
 
        /* Receive data. If we haven't got the record length yet, get
@@ -1061,15 +1043,6 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv)
 
                tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF;
 
-               /* initialise setting must have enough space to
-                * receive and respond to one request.
-                * svc_tcp_recvfrom will re-adjust if necessary
-                */
-               svc_sock_setbufsize(svsk->sk_sock,
-                                   3 * svsk->sk_xprt.xpt_server->sv_max_mesg,
-                                   3 * svsk->sk_xprt.xpt_server->sv_max_mesg);
-
-               set_bit(XPT_CHNGBUF, &svsk->sk_xprt.xpt_flags);
                set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
                if (sk->sk_state != TCP_ESTABLISHED)
                        set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
@@ -1139,8 +1112,14 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
        /* Initialize the socket */
        if (sock->type == SOCK_DGRAM)
                svc_udp_init(svsk, serv);
-       else
+       else {
+               /* initialise setting must have enough space to
+                * receive and respond to one request.
+                */
+               svc_sock_setbufsize(svsk->sk_sock, 4 * serv->sv_max_mesg,
+                                       4 * serv->sv_max_mesg);
                svc_tcp_init(svsk, serv);
+       }
 
        dprintk("svc: svc_setup_socket created %p (inet %p)\n",
                                svsk, svsk->sk_sk);
index 92cea656ad2162e07fef90ef71fb08d3cfe01878..a0affd9cfca8ba6dba57c349d1f7e799c474c8cc 100644 (file)
@@ -1252,15 +1252,12 @@ static int tomoyo_write_domain_policy(struct tomoyo_io_buffer *head)
        struct tomoyo_domain_info *domain = head->write_var1;
        bool is_delete = false;
        bool is_select = false;
-       bool is_undelete = false;
        unsigned int profile;
 
        if (tomoyo_str_starts(&data, TOMOYO_KEYWORD_DELETE))
                is_delete = true;
        else if (tomoyo_str_starts(&data, TOMOYO_KEYWORD_SELECT))
                is_select = true;
-       else if (tomoyo_str_starts(&data, TOMOYO_KEYWORD_UNDELETE))
-               is_undelete = true;
        if (is_select && tomoyo_is_select_one(head, data))
                return 0;
        /* Don't allow updating policies by non manager programs. */
@@ -1274,9 +1271,7 @@ static int tomoyo_write_domain_policy(struct tomoyo_io_buffer *head)
                        down_read(&tomoyo_domain_list_lock);
                        domain = tomoyo_find_domain(data);
                        up_read(&tomoyo_domain_list_lock);
-               } else if (is_undelete)
-                       domain = tomoyo_undelete_domain(data);
-               else
+               } else
                        domain = tomoyo_find_or_assign_new_domain(data, 0);
                head->write_var1 = domain;
                return 0;
index 26a76d67aa1c21b8f21b4eae22ca1dc091d1a43d..e77e6a6de0f2188f402bf7643f382eaf9f2fdf8a 100644 (file)
@@ -88,10 +88,7 @@ struct tomoyo_domain_info {
        /* Name of this domain. Never NULL.          */
        const struct tomoyo_path_info *domainname;
        u8 profile;        /* Profile number to use. */
-       u8 is_deleted;     /* Delete flag.
-                             0 = active.
-                             1 = deleted but undeletable.
-                             255 = deleted and no longer undeletable. */
+       bool is_deleted;   /* Delete flag.           */
        bool quota_warned; /* Quota warnning flag.   */
        /* DOMAIN_FLAGS_*. Use tomoyo_set_domain_flag() to modify. */
        u8 flags;
@@ -144,7 +141,6 @@ struct tomoyo_double_path_acl_record {
 #define TOMOYO_KEYWORD_NO_INITIALIZE_DOMAIN      "no_initialize_domain "
 #define TOMOYO_KEYWORD_NO_KEEP_DOMAIN            "no_keep_domain "
 #define TOMOYO_KEYWORD_SELECT                    "select "
-#define TOMOYO_KEYWORD_UNDELETE                  "undelete "
 #define TOMOYO_KEYWORD_USE_PROFILE               "use_profile "
 #define TOMOYO_KEYWORD_IGNORE_GLOBAL_ALLOW_READ  "ignore_global_allow_read"
 /* A domain definition starts with <kernel>. */
@@ -267,8 +263,6 @@ struct tomoyo_domain_info *tomoyo_find_domain(const char *domainname);
 struct tomoyo_domain_info *tomoyo_find_or_assign_new_domain(const char *
                                                            domainname,
                                                            const u8 profile);
-/* Undelete a domain. */
-struct tomoyo_domain_info *tomoyo_undelete_domain(const char *domainname);
 /* Check mode for specified functionality. */
 unsigned int tomoyo_check_flags(const struct tomoyo_domain_info *domain,
                                const u8 index);
index 093a756030bd460ac5182483fef46d6ae8241bb6..2f2b449ffd2d9acb99da207b64fd1b5b4d85d5ce 100644 (file)
@@ -551,9 +551,7 @@ int tomoyo_write_alias_policy(char *data, const bool is_delete)
        return tomoyo_update_alias_entry(data, cp, is_delete);
 }
 
-/* Domain create/delete/undelete handler. */
-
-/* #define TOMOYO_DEBUG_DOMAIN_UNDELETE */
+/* Domain create/delete handler. */
 
 /**
  * tomoyo_delete_domain - Delete a domain.
@@ -571,41 +569,15 @@ int tomoyo_delete_domain(char *domainname)
        tomoyo_fill_path_info(&name);
        /***** EXCLUSIVE SECTION START *****/
        down_write(&tomoyo_domain_list_lock);
-#ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE
-       printk(KERN_DEBUG "tomoyo_delete_domain %s\n", domainname);
-       list_for_each_entry(domain, &tomoyo_domain_list, list) {
-               if (tomoyo_pathcmp(domain->domainname, &name))
-                       continue;
-               printk(KERN_DEBUG "List: %p %u\n", domain, domain->is_deleted);
-       }
-#endif
        /* Is there an active domain? */
        list_for_each_entry(domain, &tomoyo_domain_list, list) {
-               struct tomoyo_domain_info *domain2;
                /* Never delete tomoyo_kernel_domain */
                if (domain == &tomoyo_kernel_domain)
                        continue;
                if (domain->is_deleted ||
                    tomoyo_pathcmp(domain->domainname, &name))
                        continue;
-               /* Mark already deleted domains as non undeletable. */
-               list_for_each_entry(domain2, &tomoyo_domain_list, list) {
-                       if (!domain2->is_deleted ||
-                           tomoyo_pathcmp(domain2->domainname, &name))
-                               continue;
-#ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE
-                       if (domain2->is_deleted != 255)
-                               printk(KERN_DEBUG
-                                      "Marked %p as non undeletable\n",
-                                      domain2);
-#endif
-                       domain2->is_deleted = 255;
-               }
-               /* Delete and mark active domain as undeletable. */
-               domain->is_deleted = 1;
-#ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE
-               printk(KERN_DEBUG "Marked %p as undeletable\n", domain);
-#endif
+               domain->is_deleted = true;
                break;
        }
        up_write(&tomoyo_domain_list_lock);
@@ -613,58 +585,6 @@ int tomoyo_delete_domain(char *domainname)
        return 0;
 }
 
-/**
- * tomoyo_undelete_domain - Undelete a domain.
- *
- * @domainname: The name of domain.
- *
- * Returns pointer to "struct tomoyo_domain_info" on success, NULL otherwise.
- */
-struct tomoyo_domain_info *tomoyo_undelete_domain(const char *domainname)
-{
-       struct tomoyo_domain_info *domain;
-       struct tomoyo_domain_info *candidate_domain = NULL;
-       struct tomoyo_path_info name;
-
-       name.name = domainname;
-       tomoyo_fill_path_info(&name);
-       /***** EXCLUSIVE SECTION START *****/
-       down_write(&tomoyo_domain_list_lock);
-#ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE
-       printk(KERN_DEBUG "tomoyo_undelete_domain %s\n", domainname);
-       list_for_each_entry(domain, &tomoyo_domain_list, list) {
-               if (tomoyo_pathcmp(domain->domainname, &name))
-                       continue;
-               printk(KERN_DEBUG "List: %p %u\n", domain, domain->is_deleted);
-       }
-#endif
-       list_for_each_entry(domain, &tomoyo_domain_list, list) {
-               if (tomoyo_pathcmp(&name, domain->domainname))
-                       continue;
-               if (!domain->is_deleted) {
-                       /* This domain is active. I can't undelete. */
-                       candidate_domain = NULL;
-#ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE
-                       printk(KERN_DEBUG "%p is active. I can't undelete.\n",
-                              domain);
-#endif
-                       break;
-               }
-               /* Is this domain undeletable? */
-               if (domain->is_deleted == 1)
-                       candidate_domain = domain;
-       }
-       if (candidate_domain) {
-               candidate_domain->is_deleted = 0;
-#ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE
-               printk(KERN_DEBUG "%p was undeleted.\n", candidate_domain);
-#endif
-       }
-       up_write(&tomoyo_domain_list_lock);
-       /***** EXCLUSIVE SECTION END *****/
-       return candidate_domain;
-}
-
 /**
  * tomoyo_find_or_assign_new_domain - Create a domain.
  *
@@ -711,10 +631,6 @@ struct tomoyo_domain_info *tomoyo_find_or_assign_new_domain(const char *
                /***** CRITICAL SECTION END *****/
                if (flag)
                        continue;
-#ifdef TOMOYO_DEBUG_DOMAIN_UNDELETE
-               printk(KERN_DEBUG "Reusing %p %s\n", domain,
-                      domain->domainname->name);
-#endif
                list_for_each_entry(ptr, &domain->acl_info_list, list) {
                        ptr->type |= TOMOYO_ACL_DELETED;
                }
@@ -722,7 +638,7 @@ struct tomoyo_domain_info *tomoyo_find_or_assign_new_domain(const char *
                domain->profile = profile;
                domain->quota_warned = false;
                mb(); /* Avoid out-of-order execution. */
-               domain->is_deleted = 0;
+               domain->is_deleted = false;
                goto out;
        }
        /* No memory reusable. Create using new memory. */
index 7793d2a511cebf0b31a7c9cb717aa94969aa4ad2..0afd1a8226fb9cbe842dac631bd59b6bdc4a1e2d 100644 (file)
@@ -238,6 +238,8 @@ static inline void pxa_ac97_cold_pxa3xx(void)
 
 bool pxa2xx_ac97_try_warm_reset(struct snd_ac97 *ac97)
 {
+       unsigned long gsr;
+
 #ifdef CONFIG_PXA25x
        if (cpu_is_pxa25x())
                pxa_ac97_warm_pxa25x();
@@ -254,10 +256,10 @@ bool pxa2xx_ac97_try_warm_reset(struct snd_ac97 *ac97)
        else
 #endif
                BUG();
-
-       if (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR))) {
+       gsr = GSR | gsr_bits;
+       if (!(gsr & (GSR_PCR | GSR_SCR))) {
                printk(KERN_INFO "%s: warm reset timeout (GSR=%#lx)\n",
-                                __func__, gsr_bits);
+                                __func__, gsr);
 
                return false;
        }
@@ -268,6 +270,8 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_try_warm_reset);
 
 bool pxa2xx_ac97_try_cold_reset(struct snd_ac97 *ac97)
 {
+       unsigned long gsr;
+
 #ifdef CONFIG_PXA25x
        if (cpu_is_pxa25x())
                pxa_ac97_cold_pxa25x();
@@ -285,9 +289,10 @@ bool pxa2xx_ac97_try_cold_reset(struct snd_ac97 *ac97)
 #endif
                BUG();
 
-       if (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR))) {
+       gsr = GSR | gsr_bits;
+       if (!(gsr & (GSR_PCR | GSR_SCR))) {
                printk(KERN_INFO "%s: cold reset timeout (GSR=%#lx)\n",
-                                __func__, gsr_bits);
+                                __func__, gsr);
 
                return false;
        }
index 28b3c7f7cfe63fba02a91d81be644d96ffcc9f7a..f2f41c8542211143cc56e83328092d1bcb27a2bf 100644 (file)
@@ -165,7 +165,7 @@ static struct snd_pcm_hardware atmel_abdac_hw = {
        .buffer_bytes_max       = 64 * 4096,
        .period_bytes_min       = 4096,
        .period_bytes_max       = 4096,
-       .periods_min            = 4,
+       .periods_min            = 6,
        .periods_max            = 64,
 };
 
@@ -502,7 +502,7 @@ static int __devinit atmel_abdac_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, card);
 
        dev_info(&pdev->dev, "Atmel ABDAC at 0x%p using %s\n",
-                       dac->regs, dac->dma.chan->dev->device.bus_id);
+                       dac->regs, dev_name(&dac->dma.chan->dev->device));
 
        return retval;
 
index dd72e00e5ae1c6209bf6a4ab0230ad53b85a0d50..0c0f8771656ac7d3e2725d81d4d918ad4e47a987 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Driver for the Atmel AC97C controller
+ * Driver for Atmel AC97C
  *
  * Copyright (C) 2005-2009 Atmel Corporation
  *
@@ -10,6 +10,7 @@
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/bitmap.h>
+#include <linux/device.h>
 #include <linux/dmaengine.h>
 #include <linux/dma-mapping.h>
 #include <linux/init.h>
@@ -65,6 +66,7 @@ struct atmel_ac97c {
        /* Serialize access to opened variable */
        spinlock_t                      lock;
        void __iomem                    *regs;
+       int                             irq;
        int                             opened;
        int                             reset_pin;
 };
@@ -150,10 +152,10 @@ static struct snd_pcm_hardware atmel_ac97c_hw = {
        .rate_max               = 48000,
        .channels_min           = 1,
        .channels_max           = 2,
-       .buffer_bytes_max       = 64 * 4096,
+       .buffer_bytes_max       = 2 * 2 * 64 * 2048,
        .period_bytes_min       = 4096,
        .period_bytes_max       = 4096,
-       .periods_min            = 4,
+       .periods_min            = 6,
        .periods_max            = 64,
 };
 
@@ -297,9 +299,11 @@ static int atmel_ac97c_playback_prepare(struct snd_pcm_substream *substream)
 {
        struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
        struct snd_pcm_runtime *runtime = substream->runtime;
-       unsigned long word = 0;
+       unsigned long word = ac97c_readl(chip, OCA);
        int retval;
 
+       word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
+
        /* assign channels to AC97C channel A */
        switch (runtime->channels) {
        case 1:
@@ -312,7 +316,6 @@ static int atmel_ac97c_playback_prepare(struct snd_pcm_substream *substream)
        default:
                /* TODO: support more than two channels */
                return -EINVAL;
-               break;
        }
        ac97c_writel(chip, OCA, word);
 
@@ -324,13 +327,25 @@ static int atmel_ac97c_playback_prepare(struct snd_pcm_substream *substream)
                word |= AC97C_CMR_CEM_LITTLE;
                break;
        case SNDRV_PCM_FORMAT_S16_BE: /* fall through */
-       default:
                word &= ~(AC97C_CMR_CEM_LITTLE);
                break;
+       default:
+               word = ac97c_readl(chip, OCA);
+               word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
+               ac97c_writel(chip, OCA, word);
+               return -EINVAL;
        }
 
+       /* Enable underrun interrupt on channel A */
+       word |= AC97C_CSR_UNRUN;
+
        ac97c_writel(chip, CAMR, word);
 
+       /* Enable channel A event interrupt */
+       word = ac97c_readl(chip, IMR);
+       word |= AC97C_SR_CAEVT;
+       ac97c_writel(chip, IER, word);
+
        /* set variable rate if needed */
        if (runtime->rate != 48000) {
                word = ac97c_readl(chip, MR);
@@ -359,9 +374,11 @@ static int atmel_ac97c_capture_prepare(struct snd_pcm_substream *substream)
 {
        struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
        struct snd_pcm_runtime *runtime = substream->runtime;
-       unsigned long word = 0;
+       unsigned long word = ac97c_readl(chip, ICA);
        int retval;
 
+       word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
+
        /* assign channels to AC97C channel A */
        switch (runtime->channels) {
        case 1:
@@ -374,7 +391,6 @@ static int atmel_ac97c_capture_prepare(struct snd_pcm_substream *substream)
        default:
                /* TODO: support more than two channels */
                return -EINVAL;
-               break;
        }
        ac97c_writel(chip, ICA, word);
 
@@ -386,13 +402,25 @@ static int atmel_ac97c_capture_prepare(struct snd_pcm_substream *substream)
                word |= AC97C_CMR_CEM_LITTLE;
                break;
        case SNDRV_PCM_FORMAT_S16_BE: /* fall through */
-       default:
                word &= ~(AC97C_CMR_CEM_LITTLE);
                break;
+       default:
+               word = ac97c_readl(chip, ICA);
+               word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
+               ac97c_writel(chip, ICA, word);
+               return -EINVAL;
        }
 
+       /* Enable overrun interrupt on channel A */
+       word |= AC97C_CSR_OVRUN;
+
        ac97c_writel(chip, CAMR, word);
 
+       /* Enable channel A event interrupt */
+       word = ac97c_readl(chip, IMR);
+       word |= AC97C_SR_CAEVT;
+       ac97c_writel(chip, IER, word);
+
        /* set variable rate if needed */
        if (runtime->rate != 48000) {
                word = ac97c_readl(chip, MR);
@@ -543,6 +571,43 @@ static struct snd_pcm_ops atmel_ac97_capture_ops = {
        .pointer        = atmel_ac97c_capture_pointer,
 };
 
+static irqreturn_t atmel_ac97c_interrupt(int irq, void *dev)
+{
+       struct atmel_ac97c      *chip  = (struct atmel_ac97c *)dev;
+       irqreturn_t             retval = IRQ_NONE;
+       u32                     sr     = ac97c_readl(chip, SR);
+       u32                     casr   = ac97c_readl(chip, CASR);
+       u32                     cosr   = ac97c_readl(chip, COSR);
+
+       if (sr & AC97C_SR_CAEVT) {
+               dev_info(&chip->pdev->dev, "channel A event%s%s%s%s%s%s\n",
+                               casr & AC97C_CSR_OVRUN   ? " OVRUN"   : "",
+                               casr & AC97C_CSR_RXRDY   ? " RXRDY"   : "",
+                               casr & AC97C_CSR_UNRUN   ? " UNRUN"   : "",
+                               casr & AC97C_CSR_TXEMPTY ? " TXEMPTY" : "",
+                               casr & AC97C_CSR_TXRDY   ? " TXRDY"   : "",
+                               !casr                    ? " NONE"    : "");
+               retval = IRQ_HANDLED;
+       }
+
+       if (sr & AC97C_SR_COEVT) {
+               dev_info(&chip->pdev->dev, "codec channel event%s%s%s%s%s\n",
+                               cosr & AC97C_CSR_OVRUN   ? " OVRUN"   : "",
+                               cosr & AC97C_CSR_RXRDY   ? " RXRDY"   : "",
+                               cosr & AC97C_CSR_TXEMPTY ? " TXEMPTY" : "",
+                               cosr & AC97C_CSR_TXRDY   ? " TXRDY"   : "",
+                               !cosr                    ? " NONE"    : "");
+               retval = IRQ_HANDLED;
+       }
+
+       if (retval == IRQ_NONE) {
+               dev_err(&chip->pdev->dev, "spurious interrupt sr 0x%08x "
+                               "casr 0x%08x cosr 0x%08x\n", sr, casr, cosr);
+       }
+
+       return retval;
+}
+
 static int __devinit atmel_ac97c_pcm_new(struct atmel_ac97c *chip)
 {
        struct snd_pcm          *pcm;
@@ -665,17 +730,17 @@ static bool filter(struct dma_chan *chan, void *slave)
 
 static void atmel_ac97c_reset(struct atmel_ac97c *chip)
 {
-       ac97c_writel(chip, MR, AC97C_MR_WRST);
+       ac97c_writel(chip, MR,   0);
+       ac97c_writel(chip, MR,   AC97C_MR_ENA);
+       ac97c_writel(chip, CAMR, 0);
+       ac97c_writel(chip, COMR, 0);
 
        if (gpio_is_valid(chip->reset_pin)) {
                gpio_set_value(chip->reset_pin, 0);
                /* AC97 v2.2 specifications says minimum 1 us. */
-               udelay(10);
+               udelay(2);
                gpio_set_value(chip->reset_pin, 1);
        }
-
-       udelay(1);
-       ac97c_writel(chip, MR, AC97C_MR_ENA);
 }
 
 static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
@@ -690,6 +755,7 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
                .read   = atmel_ac97c_read,
        };
        int                             retval;
+       int                             irq;
 
        regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!regs) {
@@ -703,6 +769,12 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
                return -ENXIO;
        }
 
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               dev_dbg(&pdev->dev, "could not get irq\n");
+               return -ENXIO;
+       }
+
        pclk = clk_get(&pdev->dev, "pclk");
        if (IS_ERR(pclk)) {
                dev_dbg(&pdev->dev, "no peripheral clock\n");
@@ -719,6 +791,13 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
 
        chip = get_chip(card);
 
+       retval = request_irq(irq, atmel_ac97c_interrupt, 0, "AC97C", chip);
+       if (retval) {
+               dev_dbg(&pdev->dev, "unable to request irq %d\n", irq);
+               goto err_request_irq;
+       }
+       chip->irq = irq;
+
        spin_lock_init(&chip->lock);
 
        strcpy(card->driver, "Atmel AC97C");
@@ -747,14 +826,18 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
 
        snd_card_set_dev(card, &pdev->dev);
 
+       atmel_ac97c_reset(chip);
+
+       /* Enable overrun interrupt from codec channel */
+       ac97c_writel(chip, COMR, AC97C_CSR_OVRUN);
+       ac97c_writel(chip, IER, ac97c_readl(chip, IMR) | AC97C_SR_COEVT);
+
        retval = snd_ac97_bus(card, 0, &ops, chip, &chip->ac97_bus);
        if (retval) {
                dev_dbg(&pdev->dev, "could not register on ac97 bus\n");
                goto err_ac97_bus;
        }
 
-       atmel_ac97c_reset(chip);
-
        retval = atmel_ac97c_mixer_new(chip);
        if (retval) {
                dev_dbg(&pdev->dev, "could not register ac97 mixer\n");
@@ -773,7 +856,7 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
                chip->dma.rx_chan = dma_request_channel(mask, filter, dws);
 
                dev_info(&chip->pdev->dev, "using %s for DMA RX\n",
-                                       chip->dma.rx_chan->dev->device.bus_id);
+                               dev_name(&chip->dma.rx_chan->dev->device));
                set_bit(DMA_RX_CHAN_PRESENT, &chip->flags);
        }
 
@@ -789,7 +872,7 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
                chip->dma.tx_chan = dma_request_channel(mask, filter, dws);
 
                dev_info(&chip->pdev->dev, "using %s for DMA TX\n",
-                                       chip->dma.tx_chan->dev->device.bus_id);
+                               dev_name(&chip->dma.tx_chan->dev->device));
                set_bit(DMA_TX_CHAN_PRESENT, &chip->flags);
        }
 
@@ -809,7 +892,7 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
        retval = snd_card_register(card);
        if (retval) {
                dev_dbg(&pdev->dev, "could not register sound card\n");
-               goto err_ac97_bus;
+               goto err_dma;
        }
 
        platform_set_drvdata(pdev, card);
@@ -836,6 +919,8 @@ err_ac97_bus:
 
        iounmap(chip->regs);
 err_ioremap:
+       free_irq(irq, chip);
+err_request_irq:
        snd_card_free(card);
 err_snd_card_new:
        clk_disable(pclk);
@@ -884,9 +969,14 @@ static int __devexit atmel_ac97c_remove(struct platform_device *pdev)
        if (gpio_is_valid(chip->reset_pin))
                gpio_free(chip->reset_pin);
 
+       ac97c_writel(chip, CAMR, 0);
+       ac97c_writel(chip, COMR, 0);
+       ac97c_writel(chip, MR,   0);
+
        clk_disable(chip->pclk);
        clk_put(chip->pclk);
        iounmap(chip->regs);
+       free_irq(chip->irq, chip);
 
        if (test_bit(DMA_RX_CHAN_PRESENT, &chip->flags))
                dma_release_channel(chip->dma.rx_chan);
index c17bd5825980bfd9ea01361a2a5c7044940b1298..ecbba5021c80c5776333cd8b72ab9aa9ccb20c1e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Register definitions for the Atmel AC97C controller
+ * Register definitions for Atmel AC97C
  *
  * Copyright (C) 2005-2009 Atmel Corporation
  *
 #define AC97C_CATHR            0x24
 #define AC97C_CASR             0x28
 #define AC97C_CAMR             0x2c
-#define AC97C_CBRHR            0x30
-#define AC97C_CBTHR            0x34
-#define AC97C_CBSR             0x38
-#define AC97C_CBMR             0x3c
 #define AC97C_CORHR            0x40
 #define AC97C_COTHR            0x44
 #define AC97C_COSR             0x48
 #define AC97C_MR_VRA           (1 << 2)
 
 #define AC97C_CSR_TXRDY                (1 << 0)
+#define AC97C_CSR_TXEMPTY      (1 << 1)
 #define AC97C_CSR_UNRUN                (1 << 2)
 #define AC97C_CSR_RXRDY                (1 << 4)
+#define AC97C_CSR_OVRUN                (1 << 5)
 #define AC97C_CSR_ENDTX                (1 << 10)
 #define AC97C_CSR_ENDRX                (1 << 14)
 
 #define AC97C_CMR_DMAEN                (1 << 22)
 
 #define AC97C_SR_CAEVT         (1 << 3)
+#define AC97C_SR_COEVT         (1 << 2)
+#define AC97C_SR_WKUP          (1 << 1)
+#define AC97C_SR_SOF           (1 << 0)
 
+#define AC97C_CH_MASK(slot)                                            \
+       (0x7 << (3 * (AC97_SLOT_##slot - 3)))
 #define AC97C_CH_ASSIGN(slot, channel)                                 \
        (AC97C_CHANNEL_##channel << (3 * (AC97_SLOT_##slot - 3)))
 #define AC97C_CHANNEL_NONE     0x0
 #define AC97C_CHANNEL_A                0x1
-#define AC97C_CHANNEL_B                0x2
 
 #endif /* __SOUND_ATMEL_AC97C_H */
index e570649184e206920061463e5d3c4272119051d8..5dcd8a526970002bb1113d6cd16f9c9b2cc30f27 100644 (file)
@@ -703,19 +703,27 @@ static int snd_mixer_oss_put_volume1(struct snd_mixer_oss_file *fmixer,
        if (left || right) {
                if (slot->present & SNDRV_MIXER_OSS_PRESENT_PSWITCH)
                        snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_PSWITCH], left, right, 0);
+               if (slot->present & SNDRV_MIXER_OSS_PRESENT_CSWITCH)
+                       snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_CSWITCH], left, right, 0);
                if (slot->present & SNDRV_MIXER_OSS_PRESENT_GSWITCH)
                        snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_GSWITCH], left, right, 0);
                if (slot->present & SNDRV_MIXER_OSS_PRESENT_PROUTE)
                        snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_PROUTE], left, right, 1);
+               if (slot->present & SNDRV_MIXER_OSS_PRESENT_CROUTE)
+                       snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_CROUTE], left, right, 1);
                if (slot->present & SNDRV_MIXER_OSS_PRESENT_GROUTE)
                        snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_GROUTE], left, right, 1);
        } else {
                if (slot->present & SNDRV_MIXER_OSS_PRESENT_PSWITCH) {
                        snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_PSWITCH], left, right, 0);
+               } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_CSWITCH) {
+                       snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_CSWITCH], left, right, 0);
                } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_GSWITCH) {
                        snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_GSWITCH], left, right, 0);
                } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_PROUTE) {
                        snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_PROUTE], left, right, 1);
+               } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_CROUTE) {
+                       snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_CROUTE], left, right, 1);
                } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_GROUTE) {
                        snd_mixer_oss_put_volume1_sw(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_GROUTE], left, right, 1);
                }
index ef95279da7a3a47a7bcfe5b21674e6c0f063ce7d..0481a55334b9aca8cc8717a9c5161502d80a16ad 100644 (file)
@@ -481,6 +481,7 @@ OPL3SA2_DOUBLE_TLV("Master Playback Volume", 0, 0x07, 0x08, 0, 0, 15, 1,
 OPL3SA2_SINGLE("Mic Playback Switch", 0, 0x09, 7, 1, 1),
 OPL3SA2_SINGLE_TLV("Mic Playback Volume", 0, 0x09, 0, 31, 1,
                   db_scale_5bit_12db_max),
+OPL3SA2_SINGLE("ZV Port Switch", 0, 0x02, 0, 1, 0),
 };
 
 static struct snd_kcontrol_new snd_opl3sa2_tone_controls[] = {
index d1f242bd0ac544584ad9c7f4349261c7c7f37588..8f5098f92c370f81c937f8159827736b34c9742d 100644 (file)
@@ -909,8 +909,8 @@ snd_ad1889_create(struct snd_card *card,
                return err;
 
        /* check PCI availability (32bit DMA) */
-       if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) {
                printk(KERN_ERR PFX "error setting 32-bit DMA mask.\n");
                pci_disable_device(pci);
                return -ENXIO;
index 4edf270a7809c3b20fa5997caf23acd42bb72968..c551006e292054088e5deeaae5baf277403e883a 100644 (file)
@@ -2186,8 +2186,8 @@ static int __devinit snd_ali_create(struct snd_card *card,
        if (err < 0)
                return err;
        /* check, if we can restrict PCI DMA transfers to 31 bits */
-       if (pci_set_dma_mask(pci, DMA_31BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_31BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(31)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(31)) < 0) {
                snd_printk(KERN_ERR "architecture does not support "
                           "31bit PCI busmaster DMA\n");
                pci_disable_device(pci);
index 009b4c8225a5b976f6f2437c70c8664bfeb81daf..3aa35af7ca9170746d4a5e972a7ff01261bddc71 100644 (file)
@@ -689,8 +689,8 @@ static int __devinit snd_als300_create(struct snd_card *card,
        if ((err = pci_enable_device(pci)) < 0)
                return err;
 
-       if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
-               pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 ||
+               pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) {
                printk(KERN_ERR "error setting 28bit DMA mask\n");
                pci_disable_device(pci);
                return -ENXIO;
index 542a0c65a92c52cc39fa3371020eb6dae5cb7940..3dbacde1a5afd45475ec79cdccf7f95a3d085f2a 100644 (file)
@@ -872,8 +872,8 @@ static int __devinit snd_card_als4000_probe(struct pci_dev *pci,
                return err;
        }
        /* check, if we can restrict PCI DMA transfers to 24 bits */
-       if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) {
                snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index 9ec122383eefbab4492fe9d180e6737f7b4f9ed0..7b72c88e449d24748ac043bb650a69b91f3dafa7 100644 (file)
@@ -151,8 +151,8 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip)
        // check PCI availability (DMA).
        if ((err = pci_enable_device(pci)) < 0)
                return err;
-       if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) {
                printk(KERN_ERR "error to set DMA mask\n");
                pci_disable_device(pci);
                return -ENXIO;
index 8eea29fc42fe8b7d56769ba9d40de84f38fc400f..4d34bb0d99d327120dde4bf5bea211f98a30105a 100644 (file)
@@ -279,8 +279,8 @@ static int __devinit snd_aw2_create(struct snd_card *card,
        pci_set_master(pci);
 
        /* check PCI availability (32bit DMA) */
-       if ((pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) ||
-           (pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0)) {
+       if ((pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0) ||
+           (pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0)) {
                printk(KERN_ERR "aw2: Impossible to set 32bit mask DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index e9e9b5821d41f1c4287b96a1115a11a928b534e4..f290bc56178f783726f98f5a4ad460492dee672d 100644 (file)
@@ -2125,8 +2125,8 @@ snd_azf3328_create(struct snd_card *card,
        chip->irq = -1;
 
        /* check if we can restrict PCI DMA transfers to 24 bits */
-       if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) {
                snd_printk(KERN_ERR "architecture does not support "
                                        "24bit PCI busmaster DMA\n"
                );
index df757575798a8db40d80fc982cd380dd89eff4e1..bfac30f7929f3094b0f95c343f2659cd0381a4a0 100644 (file)
@@ -1589,8 +1589,8 @@ static int __devinit snd_ca0106_create(int dev, struct snd_card *card,
        err = pci_enable_device(pci);
        if (err < 0)
                return err;
-       if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) {
                printk(KERN_ERR "error to set 32bit mask DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index c89ed1f5bc2bd5e6f29f357944de60aca751bae0..05f56e04849b8e083e05def751b3d17bdb2e96a3 100644 (file)
@@ -285,8 +285,8 @@ static int __devinit snd_cs5535audio_create(struct snd_card *card,
        if ((err = pci_enable_device(pci)) < 0)
                return err;
 
-       if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) < 0) {
                printk(KERN_WARNING "unable to get 32bit dma\n");
                err = -ENXIO;
                goto pcifail;
index 31542adc6b7e34a34d2ef6dca5758cb1992ad8af..1970f0e70f37ddcb7a19efaa00e912ae94f2521b 100644 (file)
@@ -897,8 +897,8 @@ static int __devinit snd_emu10k1x_create(struct snd_card *card,
 
        if ((err = pci_enable_device(pci)) < 0)
                return err;
-       if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) {
                snd_printk(KERN_ERR "error to set 28bit mask DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index dd63b132fb8efc0a3070976a2eca838e4812e550..fbd2ac09aa34a667ef0220e9ac51bbd4a7072890 100644 (file)
@@ -1608,8 +1608,8 @@ static int __devinit snd_es1938_create(struct snd_card *card,
        if ((err = pci_enable_device(pci)) < 0)
                return err;
         /* check, if we can restrict PCI DMA transfers to 24 bits */
-       if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) {
                snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n");
                pci_disable_device(pci);
                 return -ENXIO;
index dc97e8116141645d9d399cf8eee503979c267784..a11f453a6b6d697614943024696de4b5019d6339 100644 (file)
@@ -2539,8 +2539,8 @@ static int __devinit snd_es1968_create(struct snd_card *card,
        if ((err = pci_enable_device(pci)) < 0)
                return err;
        /* check, if we can restrict PCI DMA transfers to 28 bits */
-       if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) {
                snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index 5bb48ee8b6c63eebfd05047c36ce7942d61e60c6..38ad3f7b040f49d699ddb4641fe1d479a209619c 100644 (file)
@@ -3256,7 +3256,7 @@ static const char *ad1884_slave_vols[] = {
        "Mic Playback Volume",
        "CD Playback Volume",
        "Internal Mic Playback Volume",
-       "Docking Mic Playback Volume"
+       "Docking Mic Playback Volume",
        /* "Beep Playback Volume", */
        "IEC958 Playback Volume",
        NULL
index 82097790f6f322a62e83b757e53451a0684b96f7..f35e58a2d9212a2e4870d6fefdf6f311835b6762 100644 (file)
@@ -8764,6 +8764,10 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
        {}
 };
 
+static hda_nid_t alc883_slave_dig_outs[] = {
+       ALC1200_DIGOUT_NID, 0,
+};
+
 static hda_nid_t alc1200_slave_dig_outs[] = {
        ALC883_DIGOUT_NID, 0,
 };
@@ -8809,6 +8813,7 @@ static struct alc_config_preset alc883_presets[] = {
                .dac_nids = alc883_dac_nids,
                .dig_out_nid = ALC883_DIGOUT_NID,
                .dig_in_nid = ALC883_DIGIN_NID,
+               .slave_dig_outs = alc883_slave_dig_outs,
                .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
                .channel_mode = alc883_3ST_6ch_intel_modes,
                .need_dac_fix = 1,
index b5e108aa8f635b56df364d240d3fc33187cbe7ac..61996a2f45dfdb02f9fda284ea9256356b5a7903 100644 (file)
@@ -4413,6 +4413,24 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
                if (spec->num_pwrs > 0)
                        stac92xx_pin_sense(codec, event->nid);
                stac92xx_report_jack(codec, event->nid);
+
+               switch (codec->subsystem_id) {
+               case 0x103c308f:
+                       if (event->nid == 0xb) {
+                               int pin = AC_PINCTL_IN_EN;
+
+                               if (get_pin_presence(codec, 0xa)
+                                               && get_pin_presence(codec, 0xb))
+                                       pin |= AC_PINCTL_VREF_80;
+                               if (!get_pin_presence(codec, 0xb))
+                                       pin |= AC_PINCTL_VREF_80;
+
+                               /* toggle VREF state based on mic + hp pin
+                                * status
+                                */
+                               stac92xx_auto_set_pinctl(codec, 0x0a, pin);
+                       }
+               }
                break;
        case STAC_VREF_EVENT:
                data = snd_hda_codec_read(codec, codec->afg, 0,
@@ -4895,6 +4913,7 @@ again:
        switch (codec->vendor_id) {
        case 0x111d7604:
        case 0x111d7605:
+       case 0x111d76d5:
                if (spec->board_config == STAC_92HD83XXX_PWR_REF)
                        break;
                spec->num_pwrs = 0;
@@ -5707,6 +5726,7 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = {
        { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
        { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
        { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},
+       { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx},
        { .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx},
        { .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
        { .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
index 3dd63f1cda5363ac6823c5423323eccebe66a239..0d0cdbdb44867e88d12e6c7cb088ac7b13a37a94 100644 (file)
@@ -2533,8 +2533,8 @@ static int __devinit snd_ice1712_create(struct snd_card *card,
        if (err < 0)
                return err;
        /* check, if we can restrict PCI DMA transfers to 28 bits */
-       if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) {
                snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index 70141548f251236879c6d23765c318648cabca56..75283fbb4b3fd1723d62a73baf663c14f37f41d3 100644 (file)
@@ -2530,8 +2530,8 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci,
                return -EIO;
 
        /* check, if we can restrict PCI DMA transfers to 28 bits */
-       if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) {
                snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index c1eb84a14c4264f0c35728675cba420d927daf1a..82bc5b9e7629db8537e66af68624feb14e0d17e1 100644 (file)
@@ -1291,7 +1291,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci,
        pci_set_master(pci);
 
        /* check if we can restrict PCI DMA transfers to 32 bits */
-       if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0) {
                snd_printk(KERN_ERR "architecture does not support 32bit PCI busmaster DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index 80e064a3efff94d1c37c81276d15b7d95c9b5533..833e9c7b27c7bce4b66d52b7a45ca1455ca6f912 100644 (file)
@@ -1449,7 +1449,7 @@ static int __devinit pcxhr_probe(struct pci_dev *pci,
        pci_set_master(pci);
 
        /* check if we can restrict PCI DMA transfers to 32 bits */
-       if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) < 0) {
                snd_printk(KERN_ERR "architecture does not support "
                           "32bit PCI busmaster DMA\n");
                pci_disable_device(pci);
index baf6d8e3dabc3e703f21337c79f5c25fceb6926c..1a5ff06110725ef407e1d82f83b05ceddfc70b01 100644 (file)
@@ -1300,7 +1300,7 @@ static int __devinit sis_chip_create(struct snd_card *card,
        if (rc)
                goto error_out;
 
-       if (pci_set_dma_mask(pci, DMA_30BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(30)) < 0) {
                printk(KERN_ERR "sis7019: architecture does not support "
                                        "30-bit PCI busmaster DMA");
                goto error_out_enabled;
index d989215f35563cbbe3b4cfde16cc3256391d3ba5..7dc60ad4772e33b76027efe35265991ffa3ea8ef 100644 (file)
@@ -1264,8 +1264,8 @@ static int __devinit snd_sonicvibes_create(struct snd_card *card,
        if ((err = pci_enable_device(pci)) < 0)
                return err;
        /* check, if we can restrict PCI DMA transfers to 24 bits */
-        if (pci_set_dma_mask(pci, DMA_24BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_24BIT_MASK) < 0) {
+        if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) {
                snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n");
                pci_disable_device(pci);
                 return -ENXIO;
index a9da9c184660cf25d8c1748ceba8b4475e83167e..6d943f6f6b7042aabda0095f284adfb9033bdbf7 100644 (file)
@@ -3559,8 +3559,8 @@ int __devinit snd_trident_create(struct snd_card *card,
        if ((err = pci_enable_device(pci)) < 0)
                return err;
        /* check, if we can restrict PCI DMA transfers to 30 bits */
-       if (pci_set_dma_mask(pci, DMA_30BIT_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, DMA_30BIT_MASK) < 0) {
+       if (pci_set_dma_mask(pci, DMA_BIT_MASK(30)) < 0 ||
+           pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(30)) < 0) {
                snd_printk(KERN_ERR "architecture does not support 30bit PCI busmaster DMA\n");
                pci_disable_device(pci);
                return -ENXIO;
index 5a929069dce980453a67d526450b9cf877fb9d09..a2b69b8cff43f73d48674f894e1bd74884d68a7b 100644 (file)
@@ -51,7 +51,7 @@ static struct platform_device *device;
 /*
  */
 
-static int __init snd_pmac_probe(struct platform_device *devptr)
+static int __devinit snd_pmac_probe(struct platform_device *devptr)
 {
        struct snd_card *card;
        struct snd_pmac *chip;
index 8cfed1a5dcbea6cfd80ec1c15fb3756cc236760d..cf0dfb7ca22146baba398d3f9d0c70a3e1b4ce22 100644 (file)
@@ -413,7 +413,7 @@ static void bf5xx_pcm_free_dma_buffers(struct snd_pcm *pcm)
                sport_done(sport_handle);
 }
 
-static u64 bf5xx_pcm_dmamask = DMA_32BIT_MASK;
+static u64 bf5xx_pcm_dmamask = DMA_BIT_MASK(32);
 
 int bf5xx_pcm_ac97_new(struct snd_card *card, struct snd_soc_dai *dai,
        struct snd_pcm *pcm)
@@ -424,7 +424,7 @@ int bf5xx_pcm_ac97_new(struct snd_card *card, struct snd_soc_dai *dai,
        if (!card->dev->dma_mask)
                card->dev->dma_mask = &bf5xx_pcm_dmamask;
        if (!card->dev->coherent_dma_mask)
-               card->dev->coherent_dma_mask = DMA_32BIT_MASK;
+               card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
 
        if (dai->playback.channels_min) {
                ret = bf5xx_pcm_preallocate_dma_buffer(pcm,
index 1318c4f627b7c52f9a90829b0dd10498aa6cdd1b..62fbb8459569a6d78690bbf7b100a3aa47ea745a 100644 (file)
@@ -245,7 +245,7 @@ static void bf5xx_pcm_free_dma_buffers(struct snd_pcm *pcm)
                sport_done(sport_handle);
 }
 
-static u64 bf5xx_pcm_dmamask = DMA_32BIT_MASK;
+static u64 bf5xx_pcm_dmamask = DMA_BIT_MASK(32);
 
 int bf5xx_pcm_i2s_new(struct snd_card *card, struct snd_soc_dai *dai,
        struct snd_pcm *pcm)
@@ -256,7 +256,7 @@ int bf5xx_pcm_i2s_new(struct snd_card *card, struct snd_soc_dai *dai,
        if (!card->dev->dma_mask)
                card->dev->dma_mask = &bf5xx_pcm_dmamask;
        if (!card->dev->coherent_dma_mask)
-               card->dev->coherent_dma_mask = DMA_32BIT_MASK;
+               card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
 
        if (dai->playback.channels_min) {
                ret = bf5xx_pcm_preallocate_dma_buffer(pcm,
index 1f63d387a2f49e366b0cfe95ff539615dd6a5795..dd3380202766cf0ff8d1aec6ea9193317f458fa1 100644 (file)
@@ -659,7 +659,8 @@ static int ak4535_remove(struct platform_device *pdev)
        snd_soc_free_pcms(socdev);
        snd_soc_dapm_free(socdev);
 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
-       i2c_unregister_device(codec->control_data);
+       if (codec->control_data)
+               i2c_unregister_device(codec->control_data);
        i2c_del_driver(&ak4535_i2c_driver);
 #endif
        kfree(codec->private_data);
index 97738e2ece042220df2c9c81b3c7d3961d32b52a..921b205de28ab51ef5239dd7e07fe01cfaac2066 100644 (file)
@@ -122,6 +122,9 @@ struct twl4030_priv {
        unsigned int bypass_state;
        unsigned int codec_powered;
        unsigned int codec_muted;
+
+       struct snd_pcm_substream *master_substream;
+       struct snd_pcm_substream *slave_substream;
 };
 
 /*
@@ -1217,6 +1220,52 @@ static int twl4030_set_bias_level(struct snd_soc_codec *codec,
        return 0;
 }
 
+static int twl4030_startup(struct snd_pcm_substream *substream,
+                          struct snd_soc_dai *dai)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_device *socdev = rtd->socdev;
+       struct snd_soc_codec *codec = socdev->card->codec;
+       struct twl4030_priv *twl4030 = codec->private_data;
+
+       /* If we already have a playback or capture going then constrain
+        * this substream to match it.
+        */
+       if (twl4030->master_substream) {
+               struct snd_pcm_runtime *master_runtime;
+               master_runtime = twl4030->master_substream->runtime;
+
+               snd_pcm_hw_constraint_minmax(substream->runtime,
+                                            SNDRV_PCM_HW_PARAM_RATE,
+                                            master_runtime->rate,
+                                            master_runtime->rate);
+
+               snd_pcm_hw_constraint_minmax(substream->runtime,
+                                            SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
+                                            master_runtime->sample_bits,
+                                            master_runtime->sample_bits);
+
+               twl4030->slave_substream = substream;
+       } else
+               twl4030->master_substream = substream;
+
+       return 0;
+}
+
+static void twl4030_shutdown(struct snd_pcm_substream *substream,
+                            struct snd_soc_dai *dai)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_device *socdev = rtd->socdev;
+       struct snd_soc_codec *codec = socdev->card->codec;
+       struct twl4030_priv *twl4030 = codec->private_data;
+
+       if (twl4030->master_substream == substream)
+               twl4030->master_substream = twl4030->slave_substream;
+
+       twl4030->slave_substream = NULL;
+}
+
 static int twl4030_hw_params(struct snd_pcm_substream *substream,
                           struct snd_pcm_hw_params *params,
                           struct snd_soc_dai *dai)
@@ -1224,8 +1273,13 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream,
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_device *socdev = rtd->socdev;
        struct snd_soc_codec *codec = socdev->card->codec;
+       struct twl4030_priv *twl4030 = codec->private_data;
        u8 mode, old_mode, format, old_format;
 
+       if (substream == twl4030->slave_substream)
+               /* Ignoring hw_params for slave substream */
+               return 0;
+
        /* bit rate */
        old_mode = twl4030_read_reg_cache(codec,
                        TWL4030_REG_CODEC_MODE) & ~TWL4030_CODECPDZ;
@@ -1259,6 +1313,9 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream,
        case 48000:
                mode |= TWL4030_APLL_RATE_48000;
                break;
+       case 96000:
+               mode |= TWL4030_APLL_RATE_96000;
+               break;
        default:
                printk(KERN_ERR "TWL4030 hw params: unknown rate %d\n",
                        params_rate(params));
@@ -1384,6 +1441,8 @@ static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai,
 #define TWL4030_FORMATS         (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FORMAT_S24_LE)
 
 static struct snd_soc_dai_ops twl4030_dai_ops = {
+       .startup        = twl4030_startup,
+       .shutdown       = twl4030_shutdown,
        .hw_params      = twl4030_hw_params,
        .set_sysclk     = twl4030_set_dai_sysclk,
        .set_fmt        = twl4030_set_dai_fmt,
@@ -1395,7 +1454,7 @@ struct snd_soc_dai twl4030_dai = {
                .stream_name = "Playback",
                .channels_min = 2,
                .channels_max = 2,
-               .rates = TWL4030_RATES,
+               .rates = TWL4030_RATES | SNDRV_PCM_RATE_96000,
                .formats = TWL4030_FORMATS,},
        .capture = {
                .stream_name = "Capture",
index 33dbb144dad1d8a4858726949691008a63c589a3..cb63765db1df13a898b6c4380d7afdbf3c50af79 100644 (file)
 #define TWL4030_APLL_RATE_32000                0x80
 #define TWL4030_APLL_RATE_44100                0x90
 #define TWL4030_APLL_RATE_48000                0xA0
+#define TWL4030_APLL_RATE_96000                0xE0
 #define TWL4030_SEL_16K                        0x04
 #define TWL4030_CODECPDZ               0x02
 #define TWL4030_OPT_MODE               0x01
index 3265817c5c26ece6465d12683f5ccc739eb69d24..6e23a81dba782f7a88e59bc51c35bae35f46450c 100644 (file)
@@ -317,6 +317,41 @@ static int wm9705_reset(struct snd_soc_codec *codec)
        return -EIO;
 }
 
+#ifdef CONFIG_PM
+static int wm9705_soc_suspend(struct platform_device *pdev)
+{
+       struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+       struct snd_soc_codec *codec = socdev->card->codec;
+
+       soc_ac97_ops.write(codec->ac97, AC97_POWERDOWN, 0xffff);
+
+       return 0;
+}
+
+static int wm9705_soc_resume(struct platform_device *pdev)
+{
+       struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+       struct snd_soc_codec *codec = socdev->card->codec;
+       int i, ret;
+       u16 *cache = codec->reg_cache;
+
+       ret = wm9705_reset(codec);
+       if (ret < 0) {
+               printk(KERN_ERR "could not reset AC97 codec\n");
+               return ret;
+       }
+
+       for (i = 2; i < ARRAY_SIZE(wm9705_reg) << 1; i += 2) {
+               soc_ac97_ops.write(codec->ac97, i, cache[i>>1]);
+       }
+
+       return 0;
+}
+#else
+#define wm9705_soc_suspend NULL
+#define wm9705_soc_resume NULL
+#endif
+
 static int wm9705_soc_probe(struct platform_device *pdev)
 {
        struct snd_soc_device *socdev = platform_get_drvdata(pdev);
@@ -407,6 +442,8 @@ static int wm9705_soc_remove(struct platform_device *pdev)
 struct snd_soc_codec_device soc_codec_dev_wm9705 = {
        .probe =        wm9705_soc_probe,
        .remove =       wm9705_soc_remove,
+       .suspend =      wm9705_soc_suspend,
+       .resume =       wm9705_soc_resume,
 };
 EXPORT_SYMBOL_GPL(soc_codec_dev_wm9705);
 
index b3eb8570cd7bf4a4073082fffdc9f3dbb71d9521..b1a3a278819fe6fa16a1a14d38b02221a05517e2 100644 (file)
@@ -300,7 +300,7 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
        if (!card->dev->coherent_dma_mask)
                card->dev->coherent_dma_mask = fsl_dma_dmamask;
 
-       ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, pcm->dev,
+       ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
                fsl_dma_hardware.buffer_bytes_max,
                &pcm->streams[0].substream->dma_buffer);
        if (ret) {
@@ -310,7 +310,7 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
                return -ENOMEM;
        }
 
-       ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, pcm->dev,
+       ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
                fsl_dma_hardware.buffer_bytes_max,
                &pcm->streams[1].substream->dma_buffer);
        if (ret) {
@@ -418,7 +418,7 @@ static int fsl_dma_open(struct snd_pcm_substream *substream)
                return -EBUSY;
        }
 
-       dma_private = dma_alloc_coherent(substream->pcm->dev,
+       dma_private = dma_alloc_coherent(substream->pcm->card->dev,
                sizeof(struct fsl_dma_private), &ld_buf_phys, GFP_KERNEL);
        if (!dma_private) {
                dev_err(substream->pcm->card->dev,
@@ -445,7 +445,7 @@ static int fsl_dma_open(struct snd_pcm_substream *substream)
                dev_err(substream->pcm->card->dev,
                        "can't register ISR for IRQ %u (ret=%i)\n",
                        dma_private->irq, ret);
-               dma_free_coherent(substream->pcm->dev,
+               dma_free_coherent(substream->pcm->card->dev,
                        sizeof(struct fsl_dma_private),
                        dma_private, dma_private->ld_buf_phys);
                return ret;
@@ -697,6 +697,23 @@ static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream)
        else
                position = in_be32(&dma_channel->dar);
 
+       /*
+        * When capture is started, the SSI immediately starts to fill its FIFO.
+        * This means that the DMA controller is not started until the FIFO is
+        * full.  However, ALSA calls this function before that happens, when
+        * MR.DAR is still zero.  In this case, just return zero to indicate
+        * that nothing has been received yet.
+        */
+       if (!position)
+               return 0;
+
+       if ((position < dma_private->dma_buf_phys) ||
+           (position > dma_private->dma_buf_end)) {
+               dev_err(substream->pcm->card->dev,
+                       "dma pointer is out of range, halting stream\n");
+               return SNDRV_PCM_POS_XRUN;
+       }
+
        frames = bytes_to_frames(runtime, position - dma_private->dma_buf_phys);
 
        /*
@@ -761,13 +778,13 @@ static int fsl_dma_close(struct snd_pcm_substream *substream)
                        free_irq(dma_private->irq, dma_private);
 
                if (dma_private->ld_buf_phys) {
-                       dma_unmap_single(substream->pcm->dev,
+                       dma_unmap_single(substream->pcm->card->dev,
                                dma_private->ld_buf_phys,
                                sizeof(dma_private->link), DMA_TO_DEVICE);
                }
 
                /* Deallocate the fsl_dma_private structure */
-               dma_free_coherent(substream->pcm->dev,
+               dma_free_coherent(substream->pcm->card->dev,
                        sizeof(struct fsl_dma_private),
                        dma_private, dma_private->ld_buf_phys);
                substream->runtime->private_data = NULL;
index 169bca295b7831f263739042aa1ed3645d59c99a..3711d8454d96b893117c77941d8bd6794e0890db 100644 (file)
         SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE)
 #endif
 
+/* SIER bitflag of interrupts to enable */
+#define SIER_FLAGS (CCSR_SSI_SIER_TFRC_EN | CCSR_SSI_SIER_TDMAE | \
+                   CCSR_SSI_SIER_TIE | CCSR_SSI_SIER_TUE0_EN | \
+                   CCSR_SSI_SIER_TUE1_EN | CCSR_SSI_SIER_RFRC_EN | \
+                   CCSR_SSI_SIER_RDMAE | CCSR_SSI_SIER_RIE | \
+                   CCSR_SSI_SIER_ROE0_EN | CCSR_SSI_SIER_ROE1_EN)
+
 /**
  * fsl_ssi_private: per-SSI private data
  *
@@ -140,7 +147,7 @@ static irqreturn_t fsl_ssi_isr(int irq, void *dev_id)
           were interrupted for.  We mask it with the Interrupt Enable register
           so that we only check for events that we're interested in.
         */
-       sisr = in_be32(&ssi->sisr) & in_be32(&ssi->sier);
+       sisr = in_be32(&ssi->sisr) & SIER_FLAGS;
 
        if (sisr & CCSR_SSI_SISR_RFRC) {
                ssi_private->stats.rfrc++;
@@ -324,12 +331,7 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream,
                 */
 
                /* 4. Enable the interrupts and DMA requests */
-               out_be32(&ssi->sier,
-                        CCSR_SSI_SIER_TFRC_EN | CCSR_SSI_SIER_TDMAE |
-                        CCSR_SSI_SIER_TIE | CCSR_SSI_SIER_TUE0_EN |
-                        CCSR_SSI_SIER_TUE1_EN | CCSR_SSI_SIER_RFRC_EN |
-                        CCSR_SSI_SIER_RDMAE | CCSR_SSI_SIER_RIE |
-                        CCSR_SSI_SIER_ROE0_EN | CCSR_SSI_SIER_ROE1_EN);
+               out_be32(&ssi->sier, SIER_FLAGS);
 
                /*
                 * Set the watermark for transmit FIFI 0 and receive FIFO 0. We
@@ -466,28 +468,12 @@ static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
        case SNDRV_PCM_TRIGGER_START:
                clrbits32(&ssi->scr, CCSR_SSI_SCR_SSIEN);
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                        setbits32(&ssi->scr,
                                CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE);
-               } else {
-                       long timeout = jiffies + 10;
-
+               else
                        setbits32(&ssi->scr,
                                CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_RE);
-
-                       /* Wait until the SSI has filled its FIFO. Without this
-                        * delay, ALSA complains about overruns.  When the FIFO
-                        * is full, the DMA controller initiates its first
-                        * transfer.  Until then, however, the DMA's DAR
-                        * register is zero, which translates to an
-                        * out-of-bounds pointer.  This makes ALSA think an
-                        * overrun has occurred.
-                        */
-                       while (!(in_be32(&ssi->sisr) & CCSR_SSI_SISR_RFF0) &&
-                              (jiffies < timeout));
-                       if (!(in_be32(&ssi->sisr) & CCSR_SSI_SISR_RFF0))
-                               return -EIO;
-               }
                break;
 
        case SNDRV_PCM_TRIGGER_STOP:
@@ -606,39 +592,52 @@ static struct snd_soc_dai fsl_ssi_dai_template = {
        .ops = &fsl_ssi_dai_ops,
 };
 
+/* Show the statistics of a flag only if its interrupt is enabled.  The
+ * compiler will optimze this code to a no-op if the interrupt is not
+ * enabled.
+ */
+#define SIER_SHOW(flag, name) \
+       do { \
+               if (SIER_FLAGS & CCSR_SSI_SIER_##flag) \
+                       length += sprintf(buf + length, #name "=%u\n", \
+                               ssi_private->stats.name); \
+       } while (0)
+
+
 /**
  * fsl_sysfs_ssi_show: display SSI statistics
  *
- * Display the statistics for the current SSI device.
+ * Display the statistics for the current SSI device.  To avoid confusion,
+ * we only show those counts that are enabled.
  */
 static ssize_t fsl_sysfs_ssi_show(struct device *dev,
        struct device_attribute *attr, char *buf)
 {
        struct fsl_ssi_private *ssi_private =
-       container_of(attr, struct fsl_ssi_private, dev_attr);
-       ssize_t length;
-
-       length = sprintf(buf, "rfrc=%u", ssi_private->stats.rfrc);
-       length += sprintf(buf + length, "\ttfrc=%u", ssi_private->stats.tfrc);
-       length += sprintf(buf + length, "\tcmdau=%u", ssi_private->stats.cmdau);
-       length += sprintf(buf + length, "\tcmddu=%u", ssi_private->stats.cmddu);
-       length += sprintf(buf + length, "\trxt=%u", ssi_private->stats.rxt);
-       length += sprintf(buf + length, "\trdr1=%u", ssi_private->stats.rdr1);
-       length += sprintf(buf + length, "\trdr0=%u", ssi_private->stats.rdr0);
-       length += sprintf(buf + length, "\ttde1=%u", ssi_private->stats.tde1);
-       length += sprintf(buf + length, "\ttde0=%u", ssi_private->stats.tde0);
-       length += sprintf(buf + length, "\troe1=%u", ssi_private->stats.roe1);
-       length += sprintf(buf + length, "\troe0=%u", ssi_private->stats.roe0);
-       length += sprintf(buf + length, "\ttue1=%u", ssi_private->stats.tue1);
-       length += sprintf(buf + length, "\ttue0=%u", ssi_private->stats.tue0);
-       length += sprintf(buf + length, "\ttfs=%u", ssi_private->stats.tfs);
-       length += sprintf(buf + length, "\trfs=%u", ssi_private->stats.rfs);
-       length += sprintf(buf + length, "\ttls=%u", ssi_private->stats.tls);
-       length += sprintf(buf + length, "\trls=%u", ssi_private->stats.rls);
-       length += sprintf(buf + length, "\trff1=%u", ssi_private->stats.rff1);
-       length += sprintf(buf + length, "\trff0=%u", ssi_private->stats.rff0);
-       length += sprintf(buf + length, "\ttfe1=%u", ssi_private->stats.tfe1);
-       length += sprintf(buf + length, "\ttfe0=%u\n", ssi_private->stats.tfe0);
+               container_of(attr, struct fsl_ssi_private, dev_attr);
+       ssize_t length = 0;
+
+       SIER_SHOW(RFRC_EN, rfrc);
+       SIER_SHOW(TFRC_EN, tfrc);
+       SIER_SHOW(CMDAU_EN, cmdau);
+       SIER_SHOW(CMDDU_EN, cmddu);
+       SIER_SHOW(RXT_EN, rxt);
+       SIER_SHOW(RDR1_EN, rdr1);
+       SIER_SHOW(RDR0_EN, rdr0);
+       SIER_SHOW(TDE1_EN, tde1);
+       SIER_SHOW(TDE0_EN, tde0);
+       SIER_SHOW(ROE1_EN, roe1);
+       SIER_SHOW(ROE0_EN, roe0);
+       SIER_SHOW(TUE1_EN, tue1);
+       SIER_SHOW(TUE0_EN, tue0);
+       SIER_SHOW(TFS_EN, tfs);
+       SIER_SHOW(RFS_EN, rfs);
+       SIER_SHOW(TLS_EN, tls);
+       SIER_SHOW(RLS_EN, rls);
+       SIER_SHOW(RFF1_EN, rff1);
+       SIER_SHOW(RFF0_EN, rff0);
+       SIER_SHOW(TFE1_EN, tfe1);
+       SIER_SHOW(TFE0_EN, tfe0);
 
        return length;
 }
index d6882be33452ae3c6b63140b984d392e0f2e3f61..9c09b94f0cf8d4d547b8255adb9574ec32de0f4b 100644 (file)
@@ -146,6 +146,17 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
        struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
        int err = 0;
 
+       if (cpu_is_omap343x() && mcbsp_data->bus_id == 1) {
+               /*
+                * McBSP2 in OMAP3 has 1024 * 32-bit internal audio buffer.
+                * Set constraint for minimum buffer size to the same than FIFO
+                * size in order to avoid underruns in playback startup because
+                * HW is keeping the DMA request active until FIFO is filled.
+                */
+               snd_pcm_hw_constraint_minmax(substream->runtime,
+                       SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 4096, UINT_MAX);
+       }
+
        if (!cpu_dai->active)
                err = omap_mcbsp_request(mcbsp_data->bus_id);
 
index 8e1431cb46bbcb20008c6597e512b7eb71e41545..1bdbb04271830a33fe948a847b6983525ad9f1dd 100644 (file)
@@ -327,7 +327,7 @@ int omap_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
        if (!card->dev->dma_mask)
                card->dev->dma_mask = &omap_pcm_dmamask;
        if (!card->dev->coherent_dma_mask)
-               card->dev->coherent_dma_mask = DMA_32BIT_MASK;
+               card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
 
        if (dai->playback.channels_min) {
                ret = omap_pcm_preallocate_dma_buffer(pcm,
index 5998ab366e833d8763780643ede4d66d6ca142f0..ad8a10fe629826d22b96fe7efbb52f8a885237e7 100644 (file)
@@ -116,6 +116,16 @@ config SND_SOC_ZYLONITE
          Say Y if you want to add support for SoC audio on the
          Marvell Zylonite reference platform.
 
+config SND_PXA2XX_SOC_MAGICIAN
+       tristate "SoC Audio support for HTC Magician"
+       depends on SND_PXA2XX_SOC && MACH_MAGICIAN
+       select SND_PXA2XX_SOC_I2S
+       select SND_PXA_SOC_SSP
+       select SND_SOC_UDA1380
+       help
+         Say Y if you want to add support for SoC audio on the
+         HTC Magician.
+
 config SND_PXA2XX_SOC_MIOA701
         tristate "SoC Audio support for MIO A701"
         depends on SND_PXA2XX_SOC && MACH_MIOA701
index 8ed881c5e5cc9aaad0ffc4394c6198b7365f1331..4b90c3ccae4510209dc7f99f8b802ec299778278 100644 (file)
@@ -20,6 +20,7 @@ snd-soc-spitz-objs := spitz.o
 snd-soc-em-x270-objs := em-x270.o
 snd-soc-palm27x-objs := palm27x.o
 snd-soc-zylonite-objs := zylonite.o
+snd-soc-magician-objs := magician.o
 snd-soc-mioa701-objs := mioa701_wm9713.o
 
 obj-$(CONFIG_SND_PXA2XX_SOC_CORGI) += snd-soc-corgi.o
@@ -31,5 +32,6 @@ obj-$(CONFIG_SND_PXA2XX_SOC_E800) += snd-soc-e800.o
 obj-$(CONFIG_SND_PXA2XX_SOC_SPITZ) += snd-soc-spitz.o
 obj-$(CONFIG_SND_PXA2XX_SOC_EM_X270) += snd-soc-em-x270.o
 obj-$(CONFIG_SND_PXA2XX_SOC_PALM27X) += snd-soc-palm27x.o
+obj-$(CONFIG_SND_PXA2XX_SOC_MAGICIAN) += snd-soc-magician.o
 obj-$(CONFIG_SND_PXA2XX_SOC_MIOA701) += snd-soc-mioa701.o
 obj-$(CONFIG_SND_SOC_ZYLONITE) += snd-soc-zylonite.o
diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c
new file mode 100644 (file)
index 0000000..f7c4544
--- /dev/null
@@ -0,0 +1,560 @@
+/*
+ * SoC audio for HTC Magician
+ *
+ * Copyright (c) 2006 Philipp Zabel <philipp.zabel@gmail.com>
+ *
+ * based on spitz.c,
+ * Authors: Liam Girdwood <lrg@slimlogic.co.uk>
+ *          Richard Purdie <richard@openedhand.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;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/timer.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/gpio.h>
+
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/soc-dapm.h>
+
+#include <mach/pxa-regs.h>
+#include <mach/hardware.h>
+#include <mach/magician.h>
+#include <asm/mach-types.h>
+#include "../codecs/uda1380.h"
+#include "pxa2xx-pcm.h"
+#include "pxa2xx-i2s.h"
+#include "pxa-ssp.h"
+
+#define MAGICIAN_MIC       0
+#define MAGICIAN_MIC_EXT   1
+
+static int magician_hp_switch;
+static int magician_spk_switch = 1;
+static int magician_in_sel = MAGICIAN_MIC;
+
+static void magician_ext_control(struct snd_soc_codec *codec)
+{
+       if (magician_spk_switch)
+               snd_soc_dapm_enable_pin(codec, "Speaker");
+       else
+               snd_soc_dapm_disable_pin(codec, "Speaker");
+       if (magician_hp_switch)
+               snd_soc_dapm_enable_pin(codec, "Headphone Jack");
+       else
+               snd_soc_dapm_disable_pin(codec, "Headphone Jack");
+
+       switch (magician_in_sel) {
+       case MAGICIAN_MIC:
+               snd_soc_dapm_disable_pin(codec, "Headset Mic");
+               snd_soc_dapm_enable_pin(codec, "Call Mic");
+               break;
+       case MAGICIAN_MIC_EXT:
+               snd_soc_dapm_disable_pin(codec, "Call Mic");
+               snd_soc_dapm_enable_pin(codec, "Headset Mic");
+               break;
+       }
+
+       snd_soc_dapm_sync(codec);
+}
+
+static int magician_startup(struct snd_pcm_substream *substream)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_codec *codec = rtd->socdev->card->codec;
+
+       /* check the jack status at stream startup */
+       magician_ext_control(codec);
+
+       return 0;
+}
+
+/*
+ * Magician uses SSP port for playback.
+ */
+static int magician_playback_hw_params(struct snd_pcm_substream *substream,
+                                      struct snd_pcm_hw_params *params)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+       struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+       unsigned int acps, acds, width, rate;
+       unsigned int div4 = PXA_SSP_CLK_SCDB_4;
+       int ret = 0;
+
+       rate = params_rate(params);
+       width = snd_pcm_format_physical_width(params_format(params));
+
+       /*
+        * rate = SSPSCLK / (2 * width(16 or 32))
+        * SSPSCLK = (ACPS / ACDS) / SSPSCLKDIV(div4 or div1)
+        */
+       switch (params_rate(params)) {
+       case 8000:
+               /* off by a factor of 2: bug in the PXA27x audio clock? */
+               acps = 32842000;
+               switch (width) {
+               case 16:
+                       /* 513156 Hz ~= _2_ * 8000 Hz * 32 (+0.23%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_16;
+                       break;
+               case 32:
+                       /* 1026312 Hz ~= _2_ * 8000 Hz * 64 (+0.23%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_8;
+               }
+               break;
+       case 11025:
+               acps = 5622000;
+               switch (width) {
+               case 16:
+                       /* 351375 Hz ~= 11025 Hz * 32 (-0.41%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_4;
+                       break;
+               case 32:
+                       /* 702750 Hz ~= 11025 Hz * 64 (-0.41%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_2;
+               }
+               break;
+       case 22050:
+               acps = 5622000;
+               switch (width) {
+               case 16:
+                       /* 702750 Hz ~= 22050 Hz * 32 (-0.41%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_2;
+                       break;
+               case 32:
+                       /* 1405500 Hz ~= 22050 Hz * 64 (-0.41%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_1;
+               }
+               break;
+       case 44100:
+               acps = 5622000;
+               switch (width) {
+               case 16:
+                       /* 1405500 Hz ~= 44100 Hz * 32 (-0.41%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_2;
+                       break;
+               case 32:
+                       /* 2811000 Hz ~= 44100 Hz * 64 (-0.41%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_1;
+               }
+               break;
+       case 48000:
+               acps = 12235000;
+               switch (width) {
+               case 16:
+                       /* 1529375 Hz ~= 48000 Hz * 32 (-0.44%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_2;
+                       break;
+               case 32:
+                       /* 3058750 Hz ~= 48000 Hz * 64 (-0.44%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_1;
+               }
+               break;
+       case 96000:
+               acps = 12235000;
+               switch (width) {
+               case 16:
+                       /* 3058750 Hz ~= 96000 Hz * 32 (-0.44%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_1;
+                       break;
+               case 32:
+                       /* 6117500 Hz ~= 96000 Hz * 64 (-0.44%) */
+                       acds = PXA_SSP_CLK_AUDIO_DIV_2;
+                       div4 = PXA_SSP_CLK_SCDB_1;
+                       break;
+               }
+               break;
+       }
+
+       /* set codec DAI configuration */
+       ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_MSB |
+                       SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
+       if (ret < 0)
+               return ret;
+
+       /* set cpu DAI configuration */
+       ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_DSP_A |
+                       SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_CBS_CFS);
+       if (ret < 0)
+               return ret;
+
+       ret = snd_soc_dai_set_tdm_slot(cpu_dai, 1, 1);
+       if (ret < 0)
+               return ret;
+
+       /* set audio clock as clock source */
+       ret = snd_soc_dai_set_sysclk(cpu_dai, PXA_SSP_CLK_AUDIO, 0,
+                       SND_SOC_CLOCK_OUT);
+       if (ret < 0)
+               return ret;
+
+       /* set the SSP audio system clock ACDS divider */
+       ret = snd_soc_dai_set_clkdiv(cpu_dai,
+                       PXA_SSP_AUDIO_DIV_ACDS, acds);
+       if (ret < 0)
+               return ret;
+
+       /* set the SSP audio system clock SCDB divider4 */
+       ret = snd_soc_dai_set_clkdiv(cpu_dai,
+                       PXA_SSP_AUDIO_DIV_SCDB, div4);
+       if (ret < 0)
+               return ret;
+
+       /* set SSP audio pll clock */
+       ret = snd_soc_dai_set_pll(cpu_dai, 0, 0, acps);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+/*
+ * Magician uses I2S for capture.
+ */
+static int magician_capture_hw_params(struct snd_pcm_substream *substream,
+                                     struct snd_pcm_hw_params *params)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+       struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+       int ret = 0;
+
+       /* set codec DAI configuration */
+       ret = snd_soc_dai_set_fmt(codec_dai,
+                       SND_SOC_DAIFMT_MSB | SND_SOC_DAIFMT_NB_NF |
+                       SND_SOC_DAIFMT_CBS_CFS);
+       if (ret < 0)
+               return ret;
+
+       /* set cpu DAI configuration */
+       ret = snd_soc_dai_set_fmt(cpu_dai,
+                       SND_SOC_DAIFMT_MSB | SND_SOC_DAIFMT_NB_NF |
+                       SND_SOC_DAIFMT_CBS_CFS);
+       if (ret < 0)
+               return ret;
+
+       /* set the I2S system clock as output */
+       ret = snd_soc_dai_set_sysclk(cpu_dai, PXA2XX_I2S_SYSCLK, 0,
+                       SND_SOC_CLOCK_OUT);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+
+static struct snd_soc_ops magician_capture_ops = {
+       .startup = magician_startup,
+       .hw_params = magician_capture_hw_params,
+};
+
+static struct snd_soc_ops magician_playback_ops = {
+       .startup = magician_startup,
+       .hw_params = magician_playback_hw_params,
+};
+
+static int magician_get_hp(struct snd_kcontrol *kcontrol,
+                            struct snd_ctl_elem_value *ucontrol)
+{
+       ucontrol->value.integer.value[0] = magician_hp_switch;
+       return 0;
+}
+
+static int magician_set_hp(struct snd_kcontrol *kcontrol,
+                            struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+
+       if (magician_hp_switch == ucontrol->value.integer.value[0])
+               return 0;
+
+       magician_hp_switch = ucontrol->value.integer.value[0];
+       magician_ext_control(codec);
+       return 1;
+}
+
+static int magician_get_spk(struct snd_kcontrol *kcontrol,
+                           struct snd_ctl_elem_value *ucontrol)
+{
+       ucontrol->value.integer.value[0] = magician_spk_switch;
+       return 0;
+}
+
+static int magician_set_spk(struct snd_kcontrol *kcontrol,
+                           struct snd_ctl_elem_value *ucontrol)
+{
+       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+
+       if (magician_spk_switch == ucontrol->value.integer.value[0])
+               return 0;
+
+       magician_spk_switch = ucontrol->value.integer.value[0];
+       magician_ext_control(codec);
+       return 1;
+}
+
+static int magician_get_input(struct snd_kcontrol *kcontrol,
+                             struct snd_ctl_elem_value *ucontrol)
+{
+       ucontrol->value.integer.value[0] = magician_in_sel;
+       return 0;
+}
+
+static int magician_set_input(struct snd_kcontrol *kcontrol,
+                             struct snd_ctl_elem_value *ucontrol)
+{
+       if (magician_in_sel == ucontrol->value.integer.value[0])
+               return 0;
+
+       magician_in_sel = ucontrol->value.integer.value[0];
+
+       switch (magician_in_sel) {
+       case MAGICIAN_MIC:
+               gpio_set_value(EGPIO_MAGICIAN_IN_SEL1, 1);
+               break;
+       case MAGICIAN_MIC_EXT:
+               gpio_set_value(EGPIO_MAGICIAN_IN_SEL1, 0);
+       }
+
+       return 1;
+}
+
+static int magician_spk_power(struct snd_soc_dapm_widget *w,
+                               struct snd_kcontrol *k, int event)
+{
+       gpio_set_value(EGPIO_MAGICIAN_SPK_POWER, SND_SOC_DAPM_EVENT_ON(event));
+       return 0;
+}
+
+static int magician_hp_power(struct snd_soc_dapm_widget *w,
+                               struct snd_kcontrol *k, int event)
+{
+       gpio_set_value(EGPIO_MAGICIAN_EP_POWER, SND_SOC_DAPM_EVENT_ON(event));
+       return 0;
+}
+
+static int magician_mic_bias(struct snd_soc_dapm_widget *w,
+                               struct snd_kcontrol *k, int event)
+{
+       gpio_set_value(EGPIO_MAGICIAN_MIC_POWER, SND_SOC_DAPM_EVENT_ON(event));
+       return 0;
+}
+
+/* magician machine dapm widgets */
+static const struct snd_soc_dapm_widget uda1380_dapm_widgets[] = {
+       SND_SOC_DAPM_HP("Headphone Jack", magician_hp_power),
+       SND_SOC_DAPM_SPK("Speaker", magician_spk_power),
+       SND_SOC_DAPM_MIC("Call Mic", magician_mic_bias),
+       SND_SOC_DAPM_MIC("Headset Mic", magician_mic_bias),
+};
+
+/* magician machine audio_map */
+static const struct snd_soc_dapm_route audio_map[] = {
+
+       /* Headphone connected to VOUTL, VOUTR */
+       {"Headphone Jack", NULL, "VOUTL"},
+       {"Headphone Jack", NULL, "VOUTR"},
+
+       /* Speaker connected to VOUTL, VOUTR */
+       {"Speaker", NULL, "VOUTL"},
+       {"Speaker", NULL, "VOUTR"},
+
+       /* Mics are connected to VINM */
+       {"VINM", NULL, "Headset Mic"},
+       {"VINM", NULL, "Call Mic"},
+};
+
+static const char *input_select[] = {"Call Mic", "Headset Mic"};
+static const struct soc_enum magician_in_sel_enum =
+       SOC_ENUM_SINGLE_EXT(2, input_select);
+
+static const struct snd_kcontrol_new uda1380_magician_controls[] = {
+       SOC_SINGLE_BOOL_EXT("Headphone Switch",
+                       (unsigned long)&magician_hp_switch,
+                       magician_get_hp, magician_set_hp),
+       SOC_SINGLE_BOOL_EXT("Speaker Switch",
+                       (unsigned long)&magician_spk_switch,
+                       magician_get_spk, magician_set_spk),
+       SOC_ENUM_EXT("Input Select", magician_in_sel_enum,
+                       magician_get_input, magician_set_input),
+};
+
+/*
+ * Logic for a uda1380 as connected on a HTC Magician
+ */
+static int magician_uda1380_init(struct snd_soc_codec *codec)
+{
+       int err;
+
+       /* NC codec pins */
+       snd_soc_dapm_nc_pin(codec, "VOUTLHP");
+       snd_soc_dapm_nc_pin(codec, "VOUTRHP");
+
+       /* FIXME: is anything connected here? */
+       snd_soc_dapm_nc_pin(codec, "VINL");
+       snd_soc_dapm_nc_pin(codec, "VINR");
+
+       /* Add magician specific controls */
+       err = snd_soc_add_controls(codec, uda1380_magician_controls,
+                               ARRAY_SIZE(uda1380_magician_controls));
+       if (err < 0)
+               return err;
+
+       /* Add magician specific widgets */
+       snd_soc_dapm_new_controls(codec, uda1380_dapm_widgets,
+                                 ARRAY_SIZE(uda1380_dapm_widgets));
+
+       /* Set up magician specific audio path interconnects */
+       snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
+
+       snd_soc_dapm_sync(codec);
+       return 0;
+}
+
+/* magician digital audio interface glue - connects codec <--> CPU */
+static struct snd_soc_dai_link magician_dai[] = {
+{
+       .name = "uda1380",
+       .stream_name = "UDA1380 Playback",
+       .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP1],
+       .codec_dai = &uda1380_dai[UDA1380_DAI_PLAYBACK],
+       .init = magician_uda1380_init,
+       .ops = &magician_playback_ops,
+},
+{
+       .name = "uda1380",
+       .stream_name = "UDA1380 Capture",
+       .cpu_dai = &pxa_i2s_dai,
+       .codec_dai = &uda1380_dai[UDA1380_DAI_CAPTURE],
+       .ops = &magician_capture_ops,
+}
+};
+
+/* magician audio machine driver */
+static struct snd_soc_card snd_soc_card_magician = {
+       .name = "Magician",
+       .dai_link = magician_dai,
+       .num_links = ARRAY_SIZE(magician_dai),
+       .platform = &pxa2xx_soc_platform,
+};
+
+/* magician audio private data */
+static struct uda1380_setup_data magician_uda1380_setup = {
+       .i2c_address = 0x18,
+       .dac_clk = UDA1380_DAC_CLK_WSPLL,
+};
+
+/* magician audio subsystem */
+static struct snd_soc_device magician_snd_devdata = {
+       .card = &snd_soc_card_magician,
+       .codec_dev = &soc_codec_dev_uda1380,
+       .codec_data = &magician_uda1380_setup,
+};
+
+static struct platform_device *magician_snd_device;
+
+static int __init magician_init(void)
+{
+       int ret;
+
+       if (!machine_is_magician())
+               return -ENODEV;
+
+       ret = gpio_request(EGPIO_MAGICIAN_CODEC_POWER, "CODEC_POWER");
+       if (ret)
+               goto err_request_power;
+       ret = gpio_request(EGPIO_MAGICIAN_CODEC_RESET, "CODEC_RESET");
+       if (ret)
+               goto err_request_reset;
+       ret = gpio_request(EGPIO_MAGICIAN_SPK_POWER, "SPK_POWER");
+       if (ret)
+               goto err_request_spk;
+       ret = gpio_request(EGPIO_MAGICIAN_EP_POWER, "EP_POWER");
+       if (ret)
+               goto err_request_ep;
+       ret = gpio_request(EGPIO_MAGICIAN_MIC_POWER, "MIC_POWER");
+       if (ret)
+               goto err_request_mic;
+       ret = gpio_request(EGPIO_MAGICIAN_IN_SEL0, "IN_SEL0");
+       if (ret)
+               goto err_request_in_sel0;
+       ret = gpio_request(EGPIO_MAGICIAN_IN_SEL1, "IN_SEL1");
+       if (ret)
+               goto err_request_in_sel1;
+
+       gpio_set_value(EGPIO_MAGICIAN_CODEC_POWER, 1);
+       gpio_set_value(EGPIO_MAGICIAN_IN_SEL0, 0);
+
+       /* we may need to have the clock running here - pH5 */
+       gpio_set_value(EGPIO_MAGICIAN_CODEC_RESET, 1);
+       udelay(5);
+       gpio_set_value(EGPIO_MAGICIAN_CODEC_RESET, 0);
+
+       magician_snd_device = platform_device_alloc("soc-audio", -1);
+       if (!magician_snd_device) {
+               ret = -ENOMEM;
+               goto err_pdev;
+       }
+
+       platform_set_drvdata(magician_snd_device, &magician_snd_devdata);
+       magician_snd_devdata.dev = &magician_snd_device->dev;
+       ret = platform_device_add(magician_snd_device);
+       if (ret) {
+               platform_device_put(magician_snd_device);
+               goto err_pdev;
+       }
+
+       return 0;
+
+err_pdev:
+       gpio_free(EGPIO_MAGICIAN_IN_SEL1);
+err_request_in_sel1:
+       gpio_free(EGPIO_MAGICIAN_IN_SEL0);
+err_request_in_sel0:
+       gpio_free(EGPIO_MAGICIAN_MIC_POWER);
+err_request_mic:
+       gpio_free(EGPIO_MAGICIAN_EP_POWER);
+err_request_ep:
+       gpio_free(EGPIO_MAGICIAN_SPK_POWER);
+err_request_spk:
+       gpio_free(EGPIO_MAGICIAN_CODEC_RESET);
+err_request_reset:
+       gpio_free(EGPIO_MAGICIAN_CODEC_POWER);
+err_request_power:
+       return ret;
+}
+
+static void __exit magician_exit(void)
+{
+       platform_device_unregister(magician_snd_device);
+
+       gpio_set_value(EGPIO_MAGICIAN_SPK_POWER, 0);
+       gpio_set_value(EGPIO_MAGICIAN_EP_POWER, 0);
+       gpio_set_value(EGPIO_MAGICIAN_MIC_POWER, 0);
+       gpio_set_value(EGPIO_MAGICIAN_CODEC_POWER, 0);
+
+       gpio_free(EGPIO_MAGICIAN_IN_SEL1);
+       gpio_free(EGPIO_MAGICIAN_IN_SEL0);
+       gpio_free(EGPIO_MAGICIAN_MIC_POWER);
+       gpio_free(EGPIO_MAGICIAN_EP_POWER);
+       gpio_free(EGPIO_MAGICIAN_SPK_POWER);
+       gpio_free(EGPIO_MAGICIAN_CODEC_RESET);
+       gpio_free(EGPIO_MAGICIAN_CODEC_POWER);
+}
+
+module_init(magician_init);
+module_exit(magician_exit);
+
+MODULE_AUTHOR("Philipp Zabel");
+MODULE_DESCRIPTION("ALSA SoC Magician");
+MODULE_LICENSE("GPL");
index 7acd3febf8b007bfc7f87035cd071f3e95c22a20..308a657928d234630f321c470ca5611a465c7c46 100644 (file)
@@ -627,12 +627,18 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
        u32 sscr0;
        u32 sspsp;
        int width = snd_pcm_format_physical_width(params_format(params));
+       int ttsa = ssp_read_reg(ssp, SSTSA) & 0xf;
 
        /* select correct DMA params */
        if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
                dma = 1; /* capture DMA offset is 1,3 */
-       if (chn == 2)
-               dma += 2; /* stereo DMA offset is 2, mono is 0 */
+       /* Network mode with one active slot (ttsa == 1) can be used
+        * to force 16-bit frame width on the wire (for S16_LE), even
+        * with two channels. Use 16-bit DMA transfers for this case.
+        */
+       if (((chn == 2) && (ttsa != 1)) || (width == 32))
+               dma += 2; /* 32-bit DMA offset is 2, 16-bit is 0 */
+
        cpu_dai->dma_data = ssp_dma_params[cpu_dai->id][dma];
 
        dev_dbg(&ssp->pdev->dev, "pxa_ssp_hw_params: dma %d\n", dma);
@@ -712,7 +718,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
        /* When we use a network mode, we always require TDM slots
         * - complain loudly and fail if they've not been set up yet.
         */
-       if ((sscr0 & SSCR0_MOD) && !(ssp_read_reg(ssp, SSTSA) & 0xf)) {
+       if ((sscr0 & SSCR0_MOD) && !ttsa) {
                dev_err(&ssp->pdev->dev, "No TDM timeslot configured\n");
                return -EINVAL;
        }
index 53b9fb127a6d7f1b05121b7fe3979022d5c9acf2..d38e39575f510a6519b0b115189848012dc7a73a 100644 (file)
@@ -81,7 +81,7 @@ static struct snd_pcm_ops pxa2xx_pcm_ops = {
        .mmap           = pxa2xx_pcm_mmap,
 };
 
-static u64 pxa2xx_pcm_dmamask = DMA_32BIT_MASK;
+static u64 pxa2xx_pcm_dmamask = DMA_BIT_MASK(32);
 
 static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
        struct snd_pcm *pcm)
@@ -91,7 +91,7 @@ static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
        if (!card->dev->dma_mask)
                card->dev->dma_mask = &pxa2xx_pcm_dmamask;
        if (!card->dev->coherent_dma_mask)
-               card->dev->coherent_dma_mask = DMA_32BIT_MASK;
+               card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
 
        if (dai->playback.channels_min) {
                ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
index a9d68fa2b34a337b8d3ac853a0b2467612cb290f..169ddad31575e9601e3e703074a75c1fca398533 100644 (file)
@@ -419,7 +419,7 @@ static void s3c24xx_pcm_free_dma_buffers(struct snd_pcm *pcm)
        }
 }
 
-static u64 s3c24xx_pcm_dmamask = DMA_32BIT_MASK;
+static u64 s3c24xx_pcm_dmamask = DMA_BIT_MASK(32);
 
 static int s3c24xx_pcm_new(struct snd_card *card,
        struct snd_soc_dai *dai, struct snd_pcm *pcm)
index 6e710f705a749d5c3162c87cd47793ac68db006f..99712f652d0d4f42ba4e4ff49d772b2727debdaa 100644 (file)
@@ -98,7 +98,7 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec)
        int err;
 
        codec->ac97->dev.bus = &ac97_bus_type;
-       codec->ac97->dev.parent = NULL;
+       codec->ac97->dev.parent = codec->card->dev;
        codec->ac97->dev.release = soc_ac97_device_release;
 
        dev_set_name(&codec->ac97->dev, "%d-%d:%s",
@@ -767,11 +767,21 @@ static int soc_resume(struct platform_device *pdev)
 {
        struct snd_soc_device *socdev = platform_get_drvdata(pdev);
        struct snd_soc_card *card = socdev->card;
+       struct snd_soc_dai *cpu_dai = card->dai_link[0].cpu_dai;
 
-       dev_dbg(socdev->dev, "scheduling resume work\n");
-
-       if (!schedule_work(&card->deferred_resume_work))
-               dev_err(socdev->dev, "resume work item may be lost\n");
+       /* AC97 devices might have other drivers hanging off them so
+        * need to resume immediately.  Other drivers don't have that
+        * problem and may take a substantial amount of time to resume
+        * due to I/O costs and anti-pop so handle them out of line.
+        */
+       if (cpu_dai->ac97_control) {
+               dev_dbg(socdev->dev, "Resuming AC97 immediately\n");
+               soc_resume_deferred(&card->deferred_resume_work);
+       } else {
+               dev_dbg(socdev->dev, "Scheduling resume work\n");
+               if (!schedule_work(&card->deferred_resume_work))
+                       dev_err(socdev->dev, "resume work item may be lost\n");
+       }
 
        return 0;
 }
index c2db0f959681da6608e0906a580db3240000d45f..823296d7d5781cbebb7d2ff4ab37cb8ecfefe74c 100644 (file)
@@ -121,6 +121,7 @@ struct audioformat {
        unsigned char attributes;       /* corresponding attributes of cs endpoint */
        unsigned char endpoint;         /* endpoint */
        unsigned char ep_attr;          /* endpoint attributes */
+       unsigned char datainterval;     /* log_2 of data packet interval */
        unsigned int maxpacksize;       /* max. packet size */
        unsigned int rates;             /* rate bitmasks */
        unsigned int rate_min, rate_max;        /* min/max rates */
@@ -170,7 +171,6 @@ struct snd_usb_substream {
        unsigned int curframesize;      /* current packet size in frames (for capture) */
        unsigned int fill_max: 1;       /* fill max packet size always */
        unsigned int fmt_type;          /* USB audio format type (1-3) */
-       unsigned int packs_per_ms;      /* packets per millisecond (for playback) */
 
        unsigned int running: 1;        /* running status */
 
@@ -607,9 +607,7 @@ static int prepare_playback_urb(struct snd_usb_substream *subs,
                                break;
                        }
                }
-               /* finish at the frame boundary at/after the period boundary */
-               if (period_elapsed &&
-                   (i & (subs->packs_per_ms - 1)) == subs->packs_per_ms - 1)
+               if (period_elapsed) /* finish at the period boundary */
                        break;
        }
        if (subs->hwptr_done + offs > runtime->buffer_size) {
@@ -1067,7 +1065,6 @@ static int init_substream_urbs(struct snd_usb_substream *subs, unsigned int peri
                packs_per_ms = 8 >> subs->datainterval;
        else
                packs_per_ms = 1;
-       subs->packs_per_ms = packs_per_ms;
 
        if (is_playback) {
                urb_packs = max(nrpacks, 1);
@@ -1087,18 +1084,17 @@ static int init_substream_urbs(struct snd_usb_substream *subs, unsigned int peri
                        minsize -= minsize >> 3;
                minsize = max(minsize, 1u);
                total_packs = (period_bytes + minsize - 1) / minsize;
-               /* round up to multiple of packs_per_ms */
-               total_packs = (total_packs + packs_per_ms - 1)
-                               & ~(packs_per_ms - 1);
                /* we need at least two URBs for queueing */
-               if (total_packs < 2 * packs_per_ms) {
-                       total_packs = 2 * packs_per_ms;
+               if (total_packs < 2) {
+                       total_packs = 2;
                } else {
                        /* and we don't want too long a queue either */
                        maxpacks = max(MAX_QUEUE * packs_per_ms, urb_packs * 2);
                        total_packs = min(total_packs, maxpacks);
                }
        } else {
+               while (urb_packs > 1 && urb_packs * maxsize >= period_bytes)
+                       urb_packs >>= 1;
                total_packs = MAX_URBS * urb_packs;
        }
        subs->nurbs = (total_packs + urb_packs - 1) / urb_packs;
@@ -1350,12 +1346,7 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
                subs->datapipe = usb_sndisocpipe(dev, ep);
        else
                subs->datapipe = usb_rcvisocpipe(dev, ep);
-       if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH &&
-           get_endpoint(alts, 0)->bInterval >= 1 &&
-           get_endpoint(alts, 0)->bInterval <= 4)
-               subs->datainterval = get_endpoint(alts, 0)->bInterval - 1;
-       else
-               subs->datainterval = 0;
+       subs->datainterval = fmt->datainterval;
        subs->syncpipe = subs->syncinterval = 0;
        subs->maxpacksize = fmt->maxpacksize;
        subs->fill_max = 0;
@@ -1568,11 +1559,15 @@ static struct snd_pcm_hardware snd_usb_hardware =
 #define hwc_debug(fmt, args...) /**/
 #endif
 
-static int hw_check_valid_format(struct snd_pcm_hw_params *params, struct audioformat *fp)
+static int hw_check_valid_format(struct snd_usb_substream *subs,
+                                struct snd_pcm_hw_params *params,
+                                struct audioformat *fp)
 {
        struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
        struct snd_interval *ct = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
        struct snd_mask *fmts = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
+       struct snd_interval *pt = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME);
+       unsigned int ptime;
 
        /* check the format */
        if (!snd_mask_test(fmts, fp->format)) {
@@ -1593,6 +1588,14 @@ static int hw_check_valid_format(struct snd_pcm_hw_params *params, struct audiof
                hwc_debug("   > check: rate_max %d < min %d\n", fp->rate_max, it->min);
                return 0;
        }
+       /* check whether the period time is >= the data packet interval */
+       if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH) {
+               ptime = 125 * (1 << fp->datainterval);
+               if (ptime > pt->max || (ptime == pt->max && pt->openmax)) {
+                       hwc_debug("   > check: ptime %u > max %u\n", ptime, pt->max);
+                       return 0;
+               }
+       }
        return 1;
 }
 
@@ -1611,7 +1614,7 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params,
        list_for_each(p, &subs->fmt_list) {
                struct audioformat *fp;
                fp = list_entry(p, struct audioformat, list);
-               if (!hw_check_valid_format(params, fp))
+               if (!hw_check_valid_format(subs, params, fp))
                        continue;
                if (changed++) {
                        if (rmin > fp->rate_min)
@@ -1665,7 +1668,7 @@ static int hw_rule_channels(struct snd_pcm_hw_params *params,
        list_for_each(p, &subs->fmt_list) {
                struct audioformat *fp;
                fp = list_entry(p, struct audioformat, list);
-               if (!hw_check_valid_format(params, fp))
+               if (!hw_check_valid_format(subs, params, fp))
                        continue;
                if (changed++) {
                        if (rmin > fp->channels)
@@ -1718,7 +1721,7 @@ static int hw_rule_format(struct snd_pcm_hw_params *params,
        list_for_each(p, &subs->fmt_list) {
                struct audioformat *fp;
                fp = list_entry(p, struct audioformat, list);
-               if (!hw_check_valid_format(params, fp))
+               if (!hw_check_valid_format(subs, params, fp))
                        continue;
                fbits |= (1ULL << fp->format);
        }
@@ -1736,95 +1739,42 @@ static int hw_rule_format(struct snd_pcm_hw_params *params,
        return changed;
 }
 
-#define MAX_MASK       64
-
-/*
- * check whether the registered audio formats need special hw-constraints
- */
-static int check_hw_params_convention(struct snd_usb_substream *subs)
+static int hw_rule_period_time(struct snd_pcm_hw_params *params,
+                              struct snd_pcm_hw_rule *rule)
 {
-       int i;
-       u32 *channels;
-       u32 *rates;
-       u32 cmaster, rmaster;
-       u32 rate_min = 0, rate_max = 0;
-       struct list_head *p;
-       int err = 1;
-
-       channels = kcalloc(MAX_MASK, sizeof(u32), GFP_KERNEL);
-       rates = kcalloc(MAX_MASK, sizeof(u32), GFP_KERNEL);
-       if (!channels || !rates) {
-               err = -ENOMEM;
-               goto __out;
-       }
+       struct snd_usb_substream *subs = rule->private;
+       struct audioformat *fp;
+       struct snd_interval *it;
+       unsigned char min_datainterval;
+       unsigned int pmin;
+       int changed;
 
-       list_for_each(p, &subs->fmt_list) {
-               struct audioformat *f;
-               f = list_entry(p, struct audioformat, list);
-               /* unconventional channels? */
-               if (f->channels > 32)
-                       goto __out;
-               /* continuous rate min/max matches? */
-               if (f->rates & SNDRV_PCM_RATE_CONTINUOUS) {
-                       if (rate_min && f->rate_min != rate_min)
-                               goto __out;
-                       if (rate_max && f->rate_max != rate_max)
-                               goto __out;
-                       rate_min = f->rate_min;
-                       rate_max = f->rate_max;
-               }
-               /* combination of continuous rates and fixed rates? */
-               if (rates[f->format] & SNDRV_PCM_RATE_CONTINUOUS) {
-                       if (f->rates != rates[f->format])
-                               goto __out;
-               }
-               if (f->rates & SNDRV_PCM_RATE_CONTINUOUS) {
-                       if (rates[f->format] && rates[f->format] != f->rates)
-                               goto __out;
-               }
-               channels[f->format] |= 1 << (f->channels - 1);
-               rates[f->format] |= f->rates;
-               /* needs knot? */
-               if (f->rates & SNDRV_PCM_RATE_KNOT)
-                       goto __out;
-       }
-       /* check whether channels and rates match for all formats */
-       cmaster = rmaster = 0;
-       for (i = 0; i < MAX_MASK; i++) {
-               if (cmaster != channels[i] && cmaster && channels[i])
-                       goto __out;
-               if (rmaster != rates[i] && rmaster && rates[i])
-                       goto __out;
-               if (channels[i])
-                       cmaster = channels[i];
-               if (rates[i])
-                       rmaster = rates[i];
-       }
-       /* check whether channels match for all distinct rates */
-       memset(channels, 0, MAX_MASK * sizeof(u32));
-       list_for_each(p, &subs->fmt_list) {
-               struct audioformat *f;
-               f = list_entry(p, struct audioformat, list);
-               if (f->rates & SNDRV_PCM_RATE_CONTINUOUS)
+       it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME);
+       hwc_debug("hw_rule_period_time: (%u,%u)\n", it->min, it->max);
+       min_datainterval = 0xff;
+       list_for_each_entry(fp, &subs->fmt_list, list) {
+               if (!hw_check_valid_format(subs, params, fp))
                        continue;
-               for (i = 0; i < 32; i++) {
-                       if (f->rates & (1 << i))
-                               channels[i] |= 1 << (f->channels - 1);
-               }
+               min_datainterval = min(min_datainterval, fp->datainterval);
        }
-       cmaster = 0;
-       for (i = 0; i < 32; i++) {
-               if (cmaster != channels[i] && cmaster && channels[i])
-                       goto __out;
-               if (channels[i])
-                       cmaster = channels[i];
+       if (min_datainterval == 0xff) {
+               hwc_debug("  --> get emtpy\n");
+               it->empty = 1;
+               return -EINVAL;
        }
-       err = 0;
-
- __out:
-       kfree(channels);
-       kfree(rates);
-       return err;
+       pmin = 125 * (1 << min_datainterval);
+       changed = 0;
+       if (it->min < pmin) {
+               it->min = pmin;
+               it->openmin = 0;
+               changed = 1;
+       }
+       if (snd_interval_checkempty(it)) {
+               it->empty = 1;
+               return -EINVAL;
+       }
+       hwc_debug("  --> (%u,%u) (changed = %d)\n", it->min, it->max, changed);
+       return changed;
 }
 
 /*
@@ -1872,6 +1822,8 @@ static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime,
 static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substream *subs)
 {
        struct list_head *p;
+       unsigned int pt, ptmin;
+       int param_period_time_if_needed;
        int err;
 
        runtime->hw.formats = subs->formats;
@@ -1881,6 +1833,7 @@ static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substre
        runtime->hw.channels_min = 256;
        runtime->hw.channels_max = 0;
        runtime->hw.rates = 0;
+       ptmin = UINT_MAX;
        /* check min/max rates and channels */
        list_for_each(p, &subs->fmt_list) {
                struct audioformat *fp;
@@ -1899,42 +1852,54 @@ static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substre
                        runtime->hw.period_bytes_min = runtime->hw.period_bytes_max =
                                fp->frame_size;
                }
+               pt = 125 * (1 << fp->datainterval);
+               ptmin = min(ptmin, pt);
        }
 
-       /* set the period time minimum 1ms */
-       /* FIXME: high-speed mode allows 125us minimum period, but many parts
-        * in the current code assume the 1ms period.
-        */
+       param_period_time_if_needed = SNDRV_PCM_HW_PARAM_PERIOD_TIME;
+       if (snd_usb_get_speed(subs->dev) != USB_SPEED_HIGH)
+               /* full speed devices have fixed data packet interval */
+               ptmin = 1000;
+       if (ptmin == 1000)
+               /* if period time doesn't go below 1 ms, no rules needed */
+               param_period_time_if_needed = -1;
        snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_TIME,
-                                    1000,
-                                    /*(nrpacks * MAX_URBS) * 1000*/ UINT_MAX);
-
-       err = check_hw_params_convention(subs);
-       if (err < 0)
+                                    ptmin, UINT_MAX);
+
+       if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
+                                      hw_rule_rate, subs,
+                                      SNDRV_PCM_HW_PARAM_FORMAT,
+                                      SNDRV_PCM_HW_PARAM_CHANNELS,
+                                      param_period_time_if_needed,
+                                      -1)) < 0)
                return err;
-       else if (err) {
-               hwc_debug("setting extra hw constraints...\n");
-               if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
-                                              hw_rule_rate, subs,
-                                              SNDRV_PCM_HW_PARAM_FORMAT,
-                                              SNDRV_PCM_HW_PARAM_CHANNELS,
-                                              -1)) < 0)
-                       return err;
-               if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
-                                              hw_rule_channels, subs,
-                                              SNDRV_PCM_HW_PARAM_FORMAT,
-                                              SNDRV_PCM_HW_PARAM_RATE,
-                                              -1)) < 0)
-                       return err;
-               if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
-                                              hw_rule_format, subs,
-                                              SNDRV_PCM_HW_PARAM_RATE,
-                                              SNDRV_PCM_HW_PARAM_CHANNELS,
-                                              -1)) < 0)
-                       return err;
-               if ((err = snd_usb_pcm_check_knot(runtime, subs)) < 0)
+       if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
+                                      hw_rule_channels, subs,
+                                      SNDRV_PCM_HW_PARAM_FORMAT,
+                                      SNDRV_PCM_HW_PARAM_RATE,
+                                      param_period_time_if_needed,
+                                      -1)) < 0)
+               return err;
+       if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
+                                      hw_rule_format, subs,
+                                      SNDRV_PCM_HW_PARAM_RATE,
+                                      SNDRV_PCM_HW_PARAM_CHANNELS,
+                                      param_period_time_if_needed,
+                                      -1)) < 0)
+               return err;
+       if (param_period_time_if_needed >= 0) {
+               err = snd_pcm_hw_rule_add(runtime, 0,
+                                         SNDRV_PCM_HW_PARAM_PERIOD_TIME,
+                                         hw_rule_period_time, subs,
+                                         SNDRV_PCM_HW_PARAM_FORMAT,
+                                         SNDRV_PCM_HW_PARAM_CHANNELS,
+                                         SNDRV_PCM_HW_PARAM_RATE,
+                                         -1);
+               if (err < 0)
                        return err;
        }
+       if ((err = snd_usb_pcm_check_knot(runtime, subs)) < 0)
+               return err;
        return 0;
 }
 
@@ -2147,7 +2112,8 @@ static void proc_dump_substream_formats(struct snd_usb_substream *subs, struct s
                fp = list_entry(p, struct audioformat, list);
                snd_iprintf(buffer, "  Interface %d\n", fp->iface);
                snd_iprintf(buffer, "    Altset %d\n", fp->altsetting);
-               snd_iprintf(buffer, "    Format: %#x\n", fp->format);
+               snd_iprintf(buffer, "    Format: %#x (%d bits)\n",
+                           fp->format, snd_pcm_format_width(fp->format));
                snd_iprintf(buffer, "    Channels: %d\n", fp->channels);
                snd_iprintf(buffer, "    Endpoint: %d %s (%s)\n",
                            fp->endpoint & USB_ENDPOINT_NUMBER_MASK,
@@ -2166,6 +2132,9 @@ static void proc_dump_substream_formats(struct snd_usb_substream *subs, struct s
                        }
                        snd_iprintf(buffer, "\n");
                }
+               if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH)
+                       snd_iprintf(buffer, "    Data packet interval: %d us\n",
+                                   125 * (1 << fp->datainterval));
                // snd_iprintf(buffer, "    Max Packet Size = %d\n", fp->maxpacksize);
                // snd_iprintf(buffer, "    EP Attribute = %#x\n", fp->attributes);
        }
@@ -2659,6 +2628,17 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp
        return 0;
 }
 
+static unsigned char parse_datainterval(struct snd_usb_audio *chip,
+                                       struct usb_host_interface *alts)
+{
+       if (snd_usb_get_speed(chip->dev) == USB_SPEED_HIGH &&
+           get_endpoint(alts, 0)->bInterval >= 1 &&
+           get_endpoint(alts, 0)->bInterval <= 4)
+               return get_endpoint(alts, 0)->bInterval - 1;
+       else
+               return 0;
+}
+
 static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip,
                                         int iface, int altno);
 static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
@@ -2764,6 +2744,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
                fp->altset_idx = i;
                fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
                fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
+               fp->datainterval = parse_datainterval(chip, alts);
                fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
                if (snd_usb_get_speed(dev) == USB_SPEED_HIGH)
                        fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1)
@@ -2955,6 +2936,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
                return -EINVAL;
        }
        alts = &iface->altsetting[fp->altset_idx];
+       fp->datainterval = parse_datainterval(chip, alts);
        fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
        usb_set_interface(chip->dev, fp->iface, 0);
        init_usb_pitch(chip->dev, fp->iface, alts, fp);
@@ -3049,6 +3031,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip,
        fp->iface = altsd->bInterfaceNumber;
        fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
        fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
+       fp->datainterval = 0;
        fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
 
        switch (fp->maxpacksize) {
@@ -3116,6 +3099,7 @@ static int create_ua1000_quirk(struct snd_usb_audio *chip,
        fp->iface = altsd->bInterfaceNumber;
        fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
        fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
+       fp->datainterval = parse_datainterval(chip, alts);
        fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
        fp->rate_max = fp->rate_min = combine_triple(&alts->extra[8]);
 
@@ -3168,6 +3152,7 @@ static int create_ua101_quirk(struct snd_usb_audio *chip,
        fp->iface = altsd->bInterfaceNumber;
        fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
        fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
+       fp->datainterval = parse_datainterval(chip, alts);
        fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
        fp->rate_max = fp->rate_min = combine_triple(&alts->extra[15]);